Эх сурвалжийг харах

解决染整实际开机数据

wukai 1 сар өмнө
parent
commit
061e7ad9f7

+ 2 - 0
jjt-admin/src/test/java/com/jjt/data/EnergyTest.java

@@ -10,6 +10,7 @@ import com.jjt.ws.service.ITwinWorkshopEnergyService;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
 
 import javax.annotation.Resource;
 import java.time.LocalDate;
@@ -20,6 +21,7 @@ import java.time.LocalTime;
  * 印花机
  */
 @SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("devp")
 public class EnergyTest {
     @Resource
     private IotService iotService;

+ 0 - 14
jjt-biz/src/main/java/com/jjt/biz/service/IApiYrService.java

@@ -26,20 +26,6 @@ public interface IApiYrService {
     List<YrProdEfficiencyVO> eff();
 
     /**
-     * 获取生产趋势
-     *
-     * @return 结果
-     */
-    List<YrProdTradeVO> prodTrade();
-
-    /**
-     * 获取能耗趋势
-     *
-     * @return 结果
-     */
-    List<YrEnergyTradeVO> energyTrade();
-
-    /**
      * 模拟数据定时任务
      */
     void mock();

+ 5 - 34
jjt-biz/src/main/java/com/jjt/biz/service/impl/ApiAllServiceImpl.java

@@ -273,9 +273,9 @@ public class ApiAllServiceImpl implements IApiAllService {
                 }
 
             }
-            rz.setPrice(rz.getPrice().setScale(0, RoundingMode.HALF_UP));
+            rz.setPrice(rz.getPrice().setScale(2, RoundingMode.HALF_UP));
             if (vo.getJb().getPrice() != null) {
-                vo.getJb().setPrice(vo.getJb().getPrice().setScale(0, RoundingMode.HALF_UP));
+                vo.getJb().setPrice(vo.getJb().getPrice().setScale(2, RoundingMode.HALF_UP));
             }
             vo.setRz(rz);
             list.add(vo);
@@ -284,38 +284,6 @@ public class ApiAllServiceImpl implements IApiAllService {
     }
 
 
-    private List<ProdTradeVO> mockProd() {
-        List<ProdTradeVO> list = new ArrayList<>();
-        LocalDate end = LocalDate.now().minusDays(1);
-        LocalDate start = end.minusDays(6);
-        do {
-            ProdTradeVO vo = new ProdTradeVO();
-            vo.setDate(week(start));
-            vo.setTips(start.toString());
-            vo.mock();
-            list.add(vo);
-            start = start.plusDays(1);
-        } while (!start.isAfter(end));
-        return list;
-
-    }
-
-    private List<EnergyTradeVO> mockEnergy() {
-        List<EnergyTradeVO> list = new ArrayList<>();
-        LocalDate end = LocalDate.now().minusDays(1);
-        LocalDate start = end.minusDays(30);
-        do {
-            EnergyTradeVO vo = new EnergyTradeVO();
-            vo.setDate(start.getDayOfMonth() + "");
-            vo.setTips(start.toString());
-            vo.mock();
-            list.add(vo);
-            start = start.plusDays(1);
-        } while (!start.isAfter(end));
-        return list;
-
-    }
-
     /**
      * 获取周几
      *
@@ -352,6 +320,9 @@ public class ApiAllServiceImpl implements IApiAllService {
         rz.setYield(rzVO.getStatus().getLength());
         rz.setOpenLine(rzVO.getStatus().getOpenProd());
         rz.setYieldMax(BigDecimal.valueOf(200000));
+        rz.setOpenNum(rzVO.getStatus().getOpen());
+        rz.setTotalNum(rzVO.getStatus().getTotal());
+        rz.setOpenRatio(rzVO.getStatus().getRatio());
         vo.setCurrYield(currYieldVO);
         vo.setProdTrade(prodTrade());
         vo.setEnergyTrade(energyTrade());

+ 38 - 81
jjt-biz/src/main/java/com/jjt/biz/service/impl/ApiYrServiceImpl.java

@@ -18,14 +18,13 @@ import com.jjt.inventory.domain.TwinCalcHourBpOut;
 import com.jjt.inventory.service.ITwinCalcHourBpOutService;
 import com.jjt.rz.domain.TwinCalcHourRz;
 import com.jjt.rz.service.ITwinCalcHourRzService;
-import com.jjt.rz.service.ITwinDeviceRzService;
-import com.jjt.rz.service.ITwinDeviceTypeService;
 import com.jjt.rz.vo.CompareVO;
 import com.jjt.ws.domain.TwinRzCalcMonth;
 import com.jjt.ws.domain.TwinWorkshop;
 import com.jjt.ws.domain.TwinWorkshopEnergy;
 import com.jjt.ws.service.ITwinRzCalcMonthService;
 import com.jjt.ws.service.ITwinWorkshopService;
+import javafx.util.Pair;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -59,17 +58,17 @@ public class ApiYrServiceImpl implements IApiYrService {
     @Resource
     private ITwinCalcDayYhjService calcDayYhjService;
     @Resource
-    private ITwinDeviceRzService rzService;
-    @Resource
     private ITwinCalcHourRzService hourRzService;
     @Resource
-    private ITwinDeviceTypeService typeService;
+    private ITwinCalcHourRzService rzService;
     @Resource
     ITwinCalcHourBpOutService bpOutService;
     @Resource
     private ITwinCalcHourEnergyService energyService;
     @Resource
     private ITwinWorkshopService wsService;
+    @Resource
+    private ITwinCalcHourYhjService yhjService;
 
     /**
      * 获取产线状态
@@ -98,21 +97,11 @@ public class ApiYrServiceImpl implements IApiYrService {
             arr[i] = vo;
         }
         YrProdEfficiencyVO line0 = new YrProdEfficiencyVO(0);
-//        for (int i = 1; i < 9; i++) {
-//            YrProdEfficiencyVO vo = arr[i];
-//            line0.setEffA(line0.getEffA().add(vo.getEffA()));
-//            line0.setEffB(line0.getEffB().add(vo.getEffB()));
-//            line0.setTimeA(line0.getTimeA().add(vo.getTimeA()));
-//            line0.setTimeB(line0.getTimeB().add(vo.getTimeB()));
-//            line0.setLengthA(line0.getLengthA().add(vo.getLengthA()));
-//            line0.setLengthB(line0.getLengthB().add(vo.getLengthB()));
-//            line0.setWeightA(line0.getWeightA().add(vo.getWeightA()));
-//            line0.setWeightB(line0.getWeightB().add(vo.getWeightB()));
-//            line0.setWeight(line0.getWeight().add(vo.getWeight()));
-//            line0.setLength(line0.getLength().add(vo.getLength()));
-//
-//        }
-
+        //处理设备开机数量
+        Map<Integer, Pair<Integer, Integer>> deviceStatus = rzService.curr();
+        AtomicInteger total = new AtomicInteger();
+        AtomicInteger open = new AtomicInteger();
+        //处理印花机运行数据
         List<TwinCalcHourYhj> calcList = redisCache.getCacheObject(CacheConstants.YHJ_TODAY);
         Map<Integer, Map<String, Integer>> sumByDeviceAndTeam = calcList.stream()
                 .collect(Collectors.groupingBy(
@@ -124,6 +113,8 @@ public class ApiYrServiceImpl implements IApiYrService {
                 ));
         AtomicInteger openTimes = new AtomicInteger(0);
         sumByDeviceAndTeam.forEach((deviceId, teamMap) -> {
+            Pair<Integer, Integer> pair = deviceStatus.get(deviceId);
+
             Integer lengthA = teamMap.get("A");
             Integer lengthB = teamMap.get("B");
             if (lengthB == null) {
@@ -131,10 +122,21 @@ public class ApiYrServiceImpl implements IApiYrService {
             }
             Integer length = lengthA + lengthB;
             YrProdEfficiencyVO vo = arr[deviceId];
+            if (pair != null) {
+                vo.setTotal(pair.getKey());
+                vo.setOpen(pair.getValue());
+                vo.setRatio(BigDecimal.valueOf(pair.getValue()).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(pair.getKey()), 2, RoundingMode.HALF_UP));
+
+                total.addAndGet(pair.getKey());
+                // 将当前设备的开机数量累加到总开机数量中
+                open.addAndGet(pair.getValue());
+            } else {
+                vo.setTotal(1);
+                vo.setOpen(0);
+            }
             if (length > 0) {
                 openTimes.incrementAndGet();
             } else {
-                vo.setOpen(0);
                 vo.setRatio(BigDecimal.ZERO);
                 vo.setTimeA(BigDecimal.ZERO);
                 vo.setTimeB(BigDecimal.ZERO);
@@ -165,7 +167,9 @@ public class ApiYrServiceImpl implements IApiYrService {
 
         line0.setEffA(line0.getEffA().divide(BigDecimal.valueOf(8), 2, RoundingMode.HALF_UP));
         line0.setEffB(line0.getEffB().divide(BigDecimal.valueOf(8), 2, RoundingMode.HALF_UP));
-
+        line0.setTotal(total.get());
+        line0.setOpen(open.get());
+        line0.setRatio(BigDecimal.valueOf(open.get()).multiply(BigDecimal.valueOf(100)).divide(BigDecimal.valueOf(total.get()), 2, RoundingMode.HALF_UP));
         list.add(line0);
         for (int i = 1; i < 9; i++) {
             YrProdEfficiencyVO vo = arr[i];
@@ -175,26 +179,6 @@ public class ApiYrServiceImpl implements IApiYrService {
     }
 
     /**
-     * 获取生产趋势
-     *
-     * @return 结果
-     */
-    @Override
-    public List<YrProdTradeVO> prodTrade() {
-        return mockProd();
-    }
-
-    /**
-     * 获取能耗趋势
-     *
-     * @return 结果
-     */
-    @Override
-    public List<YrEnergyTradeVO> energyTrade() {
-        return mockEnergy();
-    }
-
-    /**
      * 获取能耗趋势
      *
      * @return 结果
@@ -246,9 +230,9 @@ public class ApiYrServiceImpl implements IApiYrService {
             if (eff.getLine() == 0) {
                 status.setWeight(eff.getWeight().setScale(0, RoundingMode.HALF_UP));
                 status.setLength(eff.getLength().setScale(0, RoundingMode.HALF_UP));
-                Random random = new Random();
-                BigDecimal baiPi = eff.getLength().multiply(BigDecimal.valueOf(0.5 + random.nextDouble())).setScale(0, RoundingMode.HALF_UP);
-                status.setBaiPei(baiPi);
+                status.setTotal(eff.getTotal());
+                status.setOpen(eff.getOpen());
+                status.setRatio(eff.getRatio().setScale(2, RoundingMode.HALF_UP));
             } else {
                 if (eff.getLength().compareTo(BigDecimal.ZERO) > 0) {
                     open++;
@@ -277,46 +261,19 @@ public class ApiYrServiceImpl implements IApiYrService {
         TwinCalcDayYhj yhj = new TwinCalcDayYhj();
         yhj.setParams(params);
         List<TwinCalcDayYhj> yhjList = calcDayYhjService.selectTwinCalcDayYhjList(yhj);
-        calcMonth.setParams(params);
         vo.setProdTrade(prodTrade(list, yhjList));
-        vo.setEnergyTrade(energyTrade(list));
-        redisCache.setCacheObject(CacheConstants.RZ_MOCK, vo);
-    }
-
-    private List<YrProdTradeVO> mockProd() {
-        List<YrProdTradeVO> list = new ArrayList<>();
-        LocalDate end = LocalDate.now().minusDays(1);
-        LocalDate start = end.minusDays(30);
-        do {
-            YrProdTradeVO vo = new YrProdTradeVO();
-            vo.setDate(start.getDayOfMonth() + "");
-            vo.setTips(start.toString());
-            vo.mock();
-            list.add(vo);
-            start = start.plusDays(1);
-        } while (!start.isAfter(end));
-        return list;
-
-    }
-
-    private List<YrEnergyTradeVO> mockEnergy() {
-        List<YrEnergyTradeVO> list = new ArrayList<>();
-        LocalDate end = LocalDate.now().minusDays(1);
-        LocalDate start = end.minusDays(30);
-        do {
-            YrEnergyTradeVO vo = new YrEnergyTradeVO();
-            vo.setDate(start.getDayOfMonth() + "");
-            vo.setTips(start.toString());
-            vo.mock();
-            list.add(vo);
-            start = start.plusDays(1);
-        } while (!start.isAfter(end));
-        return list;
+        List<YrEnergyTradeVO> energyList = energyTrade(list);
+        vo.setEnergyTrade(energyList);
 
+        List<YrEnergyTradeVO.Line> lines = energyList.get(energyList.size() - 1).getLine();
+        for (int i = 0; i < lines.size(); i++) {
+            if (i < effList.size()) {
+                effList.get(i).setEnergy(lines.get(i).getPrice());
+            }
+        }
+        redisCache.setCacheObject(CacheConstants.RZ_MOCK, vo);
     }
 
-    @Resource
-    private ITwinCalcHourYhjService yhjService;
 
     /**
      * 工艺对比

+ 1 - 1
jjt-biz/src/main/java/com/jjt/biz/vo/YrEnergyTradeVO.java

@@ -32,7 +32,7 @@ public class YrEnergyTradeVO {
         BigDecimal[] avg = Tools.balancedRandomSplit(8);
         this.line = new ArrayList<>();
         Line line = new Line(0);
-        line.setPrice(isNull(price));
+        line.setPrice(isNull(price).setScale(2, RoundingMode.HALF_UP));
         line.setElectricity(isNull(d));
         line.setSteam(isNull(stream));
         line.setWater(isNull(water));

+ 2 - 0
jjt-biz/src/main/java/com/jjt/biz/vo/YrProdLineStatusVO.java

@@ -29,6 +29,8 @@ public class YrProdLineStatusVO {
     private BigDecimal length;
     @ApiModelProperty("重量")
     private BigDecimal weight;
+    @ApiModelProperty("开机率")
+    private BigDecimal ratio;
 
     public void mock() {
         Random random = new Random();

+ 0 - 5
jjt-biz/src/main/java/com/jjt/calc/service/ITwinCalcHourYhjService.java

@@ -74,11 +74,6 @@ public interface ITwinCalcHourYhjService {
     void last();
 
     /**
-     * 获取当前数据
-     */
-    void curr();
-
-    /**
      * 统计当日数据
      */
     void today();

+ 0 - 9
jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcHourYhjServiceImpl.java

@@ -151,14 +151,6 @@ public class TwinCalcHourYhjServiceImpl implements ITwinCalcHourYhjService {
     }
 
     /**
-     * 获取当前数据
-     */
-    @Override
-    public void curr() {
-
-    }
-
-    /**
      * 统计当日数据
      */
     @Override
@@ -179,7 +171,6 @@ public class TwinCalcHourYhjServiceImpl implements ITwinCalcHourYhjService {
         List<TwinCalcHourYhj> calcList = process(start, LocalDateTime.now());
         hourList.addAll(calcList);
         hourList.forEach(TwinCalcHourYhj::setTeam);
-
         redisCache.setCacheObject(CacheConstants.YHJ_TODAY, hourList);
     }
 

+ 10 - 0
jjt-biz/src/main/java/com/jjt/rz/service/ITwinCalcHourRzService.java

@@ -1,10 +1,12 @@
 package com.jjt.rz.service;
 
 import com.jjt.rz.domain.TwinCalcHourRz;
+import javafx.util.Pair;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 染整线小时工艺参数Service接口
@@ -67,6 +69,13 @@ public interface ITwinCalcHourRzService {
     void last();
 
     /**
+     * 获取当前状态
+     *
+     * @return 结果
+     */
+    Map<Integer, Pair<Integer, Integer>> curr();
+
+    /**
      * 按小时获取数据
      *
      * @param start 开始时间
@@ -81,6 +90,7 @@ public interface ITwinCalcHourRzService {
      * @param hour 时间
      */
     void deleteTwinCalcHourRz(LocalDate date, int hour);
+
     /**
      * 补录数据至当前时间
      */

+ 59 - 31
jjt-biz/src/main/java/com/jjt/rz/service/impl/TwinCalcHourRzServiceImpl.java

@@ -4,7 +4,7 @@ import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson2.JSON;
-import com.jjt.calc.domain.TwinCalcHourYhj;
+import com.jjt.common.core.redis.RedisCache;
 import com.jjt.common.utils.DateUtils;
 import com.jjt.common.utils.StringUtils;
 import com.jjt.rz.domain.TwinCalcHourRz;
@@ -30,6 +30,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneOffset;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 染整线小时工艺参数Service业务层处理
@@ -50,6 +51,8 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     private ITwinDeviceTypeService typeService;
     @Resource
     private SqlSessionFactory factory;
+    @Resource
+    private RedisCache redisCache;
 
 
     /**
@@ -132,6 +135,22 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     }
 
     /**
+     * 获取当前开机状态
+     */
+    @Override
+    public Map<Integer, Pair<Integer, Integer>> curr() {
+        List<TwinDeviceRz> devices = rzService.selectTwinDeviceRzList(new TwinDeviceRz());
+        process(devices, null, null);
+        Map<String, List<TwinDeviceRz>> lineMap = devices.stream().collect(Collectors.groupingBy(TwinDeviceRz::getLine));
+        Map<Integer, Pair<Integer, Integer>> map = new HashMap<>();
+        lineMap.forEach((line, list) -> {
+            long onlineCount = list.stream().filter(TwinDeviceRz::getOnline).count();
+            map.put(Integer.parseInt(line), new Pair<>(list.size() + 1, (int) onlineCount + 1));
+        });
+        return map;
+    }
+
+    /**
      * 按小时获取数据
      *
      * @param start 开始时间
@@ -141,15 +160,43 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     public void hour(LocalDateTime start, LocalDateTime end) {
         // 将开始时间转换为Date类型,用于后续查询
         Date date = Date.from(start.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
-        // 将开始和结束时间转换为毫秒,用于后续查询
-        Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
-        Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
+
 
         // 删除已存在的小时级计算结果,避免重复计算
         deleteTwinCalcHourRz(start.toLocalDate(), start.getHour());
 
         // 获取设备列表
         List<TwinDeviceRz> list = rzService.selectTwinDeviceRzList(new TwinDeviceRz());
+        process(list, start, end);
+
+        // 构建最终结果列表
+        List<TwinCalcHourRz> rzList = new ArrayList<>();
+        list.forEach(item -> {
+            TwinCalcHourRz calc = new TwinCalcHourRz();
+            calc.setDeviceId(item.getDeviceId());
+            calc.setDataDate(date);
+            calc.setHour(start.getHour());
+            if (item.getOnline()) {
+                calc.setOnline("Y");
+            } else {
+                calc.setOnline("N");
+            }
+            calc.setData(JSON.toJSONString(item.getParams()));
+            rzList.add(calc);
+        });
+
+        // 批量插入计算结果
+        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+            if (rzList.size() > 0) {
+                TwinCalcHourRzMapper mapper = sqlSession.getMapper(TwinCalcHourRzMapper.class);
+                rzList.forEach(mapper::insertTwinCalcHourRz);
+                sqlSession.commit();
+            }
+        }
+    }
+
+    private void process(List<TwinDeviceRz> list, LocalDateTime start, LocalDateTime end) {
+        boolean flag = start != null && end != null;
         // 获取设备类型列表
         List<TwinDeviceType> typeList = typeService.selectTwinDeviceTypeAll();
         // 使用设备类型ID作为键,设备类型作为值,创建设备类型映射
@@ -211,8 +258,14 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
         });
 
         // 构建查询SQL
-        String sql = "select last %s from root.tl.suxi where time>%s and time <=%s";
-        sql = String.format(sql, String.join(",", strList), startTime, endTime);
+        String sql = "select last %s from root.tl.suxi";
+        sql = String.format(sql, String.join(",", strList));
+        if (flag) {
+            // 将开始和结束时间转换为毫秒,用于后续查询
+            Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
+            Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
+            sql += String.format(" where time>%s and time <=%s", startTime, endTime);
+        }
 
         // 执行查询并处理结果
         JSONObject jsonObject = iotService.query(sql);
@@ -274,31 +327,6 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
                 }
             }
         }
-
-        // 构建最终结果列表
-        List<TwinCalcHourRz> rzList = new ArrayList<>();
-        list.forEach(item -> {
-            TwinCalcHourRz calc = new TwinCalcHourRz();
-            calc.setDeviceId(item.getDeviceId());
-            calc.setDataDate(date);
-            calc.setHour(start.getHour());
-            if (item.getOnline()) {
-                calc.setOnline("Y");
-            } else {
-                calc.setOnline("N");
-            }
-            calc.setData(JSON.toJSONString(item.getParams()));
-            rzList.add(calc);
-        });
-
-        // 批量插入计算结果
-        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
-            if (rzList.size() > 0) {
-                TwinCalcHourRzMapper mapper = sqlSession.getMapper(TwinCalcHourRzMapper.class);
-                rzList.forEach(mapper::insertTwinCalcHourRz);
-                sqlSession.commit();
-            }
-        }
     }
 
 

+ 1 - 1
jjt-biz/src/main/java/com/jjt/task/IndexTask.java

@@ -4,6 +4,7 @@ import com.jjt.biz.service.IApiAllService;
 import com.jjt.biz.service.IApiService;
 import com.jjt.biz.service.IApiYrService;
 import com.jjt.calc.service.ITwinCalcHourYhjService;
+import com.jjt.rz.service.ITwinCalcHourRzService;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -30,7 +31,6 @@ public class IndexTask {
      */
     public void curr() {
         apiService.curr();
-        yhjService.curr();
     }
 
     /**

+ 4 - 0
jjt-common/src/main/java/com/jjt/common/constant/CacheConstants.java

@@ -70,6 +70,10 @@ public class CacheConstants {
      * 染整演示数据
      */
     public static final String RZ_MOCK = TWIN + "rzMock";
+    /**
+     * 设备运行状态
+     */
+    public static final String RZ_DEVICE_STATUS = TWIN + "rzDeviceStatus";
     public static final String ALL_MOCK = TWIN + "allMock";
 
     /**