浏览代码

梁整线统计参数对比解决,差米长,电和油

wukai 1 月之前
父节点
当前提交
77b64fb052

+ 178 - 7
jjt-admin/src/test/java/com/jjt/task/RzTest.java

@@ -1,19 +1,30 @@
 package com.jjt.task;
 
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson2.JSON;
 import com.jjt.JjtApplication;
-import com.jjt.calc.service.ITwinCalcDayYhjService;
-import com.jjt.calc.service.ITwinCalcHourYhjService;
+import com.jjt.biz.service.IApiYrService;
+import com.jjt.biz.vo.YrCompareBackReq;
+import com.jjt.rz.domain.TwinCalcHourRz;
+import com.jjt.rz.domain.TwinDeviceRz;
+import com.jjt.rz.domain.TwinDeviceTypeData;
+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.utils.IotService;
-import com.jjt.ws.service.ITwinWorkshopCalcService;
+import javafx.util.Pair;
 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;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.ZoneOffset;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * DataProcess$
@@ -24,15 +35,175 @@ import java.time.LocalTime;
 @SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 public class RzTest {
     @Resource
-    private ITwinCalcDayYhjService dayService;
-    @Resource
     private IotService iotService;
     @Resource
     private ITwinDeviceRzService rzService;
+    @Resource
+    private ITwinCalcHourRzService hourRzService;
+    @Resource
+    private ITwinDeviceTypeService typeService;
 
+    /**
+     * 2	RZ	4节定型机	root.tl.suxi.dingxingji4**
+     * 3	RZ	双棍烫光机	root.tl.suxi.sgtgj**
+     * 4	RZ	高梳机	root.tl.suxi.gaoShu**
+     * 5	RZ	两棍刷毛机	root.tl.suxi.lgsmj**
+     * 6	RZ	6节定型机	root.tl.suxi.dingxingji6**
+     * 7	RZ	起毛机	root.tl.suxi.qiMaoJi**
+     * 8	RZ	烘固机	root.tl.suxi.hongGuJi**
+     * 9	RZ	烫剪机	root.tl.suxi.tangJianJi**
+     */
     @Test
-    public void test() {
+    public void curr() {
         iotService.setToken();
+        List<TwinDeviceRz> list = rzService.selectTwinDeviceRzList(new TwinDeviceRz());
+        List<String> strList = new ArrayList<>();
+        Map<String, TwinDeviceRz> rzMap = new HashMap<>();
+        list.forEach(item -> {
+            String str = item.getDeviceCode() + ".Capacity_data_1";
+            String mapId = item.getDevicePath() + ".Capacity_data_1";
+            item.setOnline(false);
+            rzMap.put(mapId, item);
+            strList.add(str);
+        });
+        String sql = "select last %s from root.tl.suxi";
+        sql = String.format(sql, String.join(",", strList));
+        iotService.query(sql);
+        JSONObject jsonObject = iotService.query(sql);
+        JSONObject data = jsonObject.getJSONObject("data");
+        System.err.println(data);
+        JSONArray values = data.getJSONArray("values");
+        JSONArray columnNames = data.getJSONArray("columnNames");
+        JSONArray timestamps = data.getJSONArray("timestamps");
+        for (int i = 0; i < values.size(); i++) {
+            JSONArray da = values.getJSONArray(i);
+            String type = da.getStr(0);
+            TwinDeviceRz rz = rzMap.get(type);
+            if (rz != null) {
+                if (rz.getTypeId() == 3 || rz.getTypeId() == 5 || rz.getTypeId() == 9) {
+                    //双棍烫光和两棍刷毛需要按照机器状态来判断是否开机
+                    //=1 设备故障停机  ,=2 人工停机 ,=3是缺布/断布停机 ,=4满布停机,=5设备上电待机中  =6设备自动运行中,=7设备过站中
+                    if (da.getStr(1).equals("6")) {
+                        rz.setOnline(true);
+                    }
+                } else {
+                    //其他类型只需要有值就表示开机
+                    rz.setOnline(true);
+                }
+            }
+//            da.getStr(1);
+//            da.getStr(2);
+//            for (int j = 0; j < da.size(); j++) {
+//
+//            }
+        }
+        // 按 line 分组并统计数量
+//        Map<String, Long> deviceCountByLine = list.stream()
+//                .collect(Collectors.groupingBy(TwinDeviceRz::getLine, Collectors.counting()));
+        // 按 line 分组,分别统计总数量和 online 为 true 的数量
+        Map<String, Pair<Integer, Integer>> deviceCountByLine = list.stream()
+                .collect(Collectors.groupingBy(
+                        TwinDeviceRz::getLine,
+                        Collectors.collectingAndThen(
+                                Collectors.partitioningBy(TwinDeviceRz::getOnline),
+                                map -> {
+                                    int total = map.get(true).size() + map.get(false).size();
+                                    int open = map.get(true).size();
+                                    return new Pair<>(total, open);
+                                }
+                        )
+                ));
+        // 打印结果
+        deviceCountByLine.forEach((line, count) ->
+                System.out.println("Line: " + line + ", Device Count: " + count.getKey() + ",online:" + count.getValue()));
+
+        list.forEach(item -> {
+            if (item.getLine().equals("8")) {
+                System.err.println("device:" + item.getDeviceName() + ",online:" + item.getOnline());
+            }
+        });
+    }
+
+    @Test
+    public void hour() {
+        iotService.setToken();
+        String st = "2025-05-30";
+        String ed = "2025-06-03";
+        LocalDate localDate = LocalDate.parse(st);
+        LocalDate endDate = LocalDate.parse(ed);
+        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(7);
+        LocalDateTime end = LocalDateTime.of(endDate.plusDays(1), LocalTime.MIN).plusHours(6);
+        LocalDateTime curr = LocalDateTime.now();
+        if (end.isAfter(curr)) {
+            end = curr.minusHours(1);
+        }
+        do {
+            int i = start.getHour();
+            System.err.println(start.toLocalDate().toString() + "\t" + i);
+            hourRzService.hour(start, start.plusHours(1));
+            start = start.plusHours(1);
+        } while (!start.isAfter(end));
+    }
+
+    @Test
+    public void data() {
+        List<TwinDeviceTypeData> all = typeService.selectTwinDeviceTypeDataAll();
+        Map<Long, TwinDeviceTypeData> dataMap = all.stream()
+                .collect(Collectors.toMap(
+                        TwinDeviceTypeData::getDataId,
+                        item -> item,
+                        (existing, replacement) -> existing
+                ));
+        String st = "2025-06-03";
+        LocalDate localDate = LocalDate.parse(st);
+        Date date = Date.from(localDate.atStartOfDay(ZoneOffset.of("+8")).toInstant());
+        TwinCalcHourRz search = new TwinCalcHourRz();
+        search.setDataDate(date);
+        search.setHour(19);
+        List<TwinDeviceRz> deviceList = rzService.selectTwinDeviceRzList(new TwinDeviceRz());
+        List<TwinCalcHourRz> list = hourRzService.selectTwinCalcHourRzList(search);
+        list.forEach(item -> {
+            System.err.println(item.getData());
+            TreeMap<String, String> map = JSON.parseObject(item.getData(), TreeMap.class);
+            TreeMap<String, String> treeMap = new TreeMap<>();
+            map.forEach((id, value) -> {
+                TwinDeviceTypeData data = dataMap.get(Long.parseLong(id));
+                if (data != null) {
+                    treeMap.put(data.getDataName(), value);
+                }
+            });
+
+            item.setPara(treeMap);
+            treeMap.forEach((name, value) -> {
+                System.err.println(name + "\t" + value);
+            });
+        });
+    }
+
+    @Resource
+    private IApiYrService apiYrService;
+
+    @Test
+    public void test() {
+        String ed = "2025-06-03";
+        LocalDate ld = LocalDate.parse(ed);
+        LocalDateTime start = LocalDateTime.of(ld, LocalTime.MIN).plusHours(18);
+        LocalDateTime end = LocalDateTime.of(ld, LocalTime.MIN).plusHours(19);
+
+        List<YrCompareBackReq> list = new ArrayList<>();
+        YrCompareBackReq req = new YrCompareBackReq();
+        req.setLine(8);
+        req.setStart(start);
+        req.setEnd(end);
+        list.add(req);
+        req = new YrCompareBackReq();
+        req.setLine(7);
+        req.setStart(start);
+        req.setEnd(end);
+        list.add(req);
+
+        List<CompareVo> vos = apiYrService.compare(list);
+        System.err.println(vos.size());
     }
 }
 

+ 10 - 3
jjt-admin/src/test/java/com/jjt/task/YhjTaskTest.java

@@ -21,7 +21,7 @@ import java.time.LocalTime;
  * @date 2024/5/7 11:49
  */
 @SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-//@ActiveProfiles("devp")
+@ActiveProfiles("devp")
 public class YhjTaskTest {
     @Resource
     private ITwinCalcDayYhjService dayService;
@@ -34,8 +34,8 @@ public class YhjTaskTest {
     private ITwinWorkshopCalcService wsCalcService;
 
     @Test
-    public void calc() {
-        String st = "2025-05-28";
+    public void energe() {
+        String st = "2025-05-30";
         LocalDate localDate = LocalDate.parse(st);
         wsCalcService.calc(localDate);
     }
@@ -55,6 +55,13 @@ public class YhjTaskTest {
     }
 
     @Test
+    public void day(){
+        String st = "2025-05-30";
+        LocalDate localDate = LocalDate.parse(st);
+        dayService.day(localDate);
+    }
+
+    @Test
     public void test() {
         iotService.setToken();
         String st = "2025-05-28";

+ 12 - 1
jjt-biz/src/main/java/com/jjt/biz/controller/ApiYrController.java

@@ -2,6 +2,7 @@ package com.jjt.biz.controller;
 
 import cn.hutool.json.JSONUtil;
 import com.jjt.biz.service.IApiYrService;
+import com.jjt.biz.vo.YrCompareBackReq;
 import com.jjt.biz.vo.YrCompareReq;
 import com.jjt.biz.vo.YrTwinVO;
 import com.jjt.common.constant.CacheConstants;
@@ -18,6 +19,7 @@ import javax.annotation.Resource;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.List;
 
 /**
  * swagger 用户测试方法
@@ -44,7 +46,7 @@ public class ApiYrController extends BaseController {
         return R.ok(vo);
     }
 
-    @ApiOperation("染整线AI比对")
+    @ApiOperation("染整线AI比对")
     @RequestMapping("/api/yr/compare")
     @CrossOrigin(origins = "*")
     @ResponseBody
@@ -53,4 +55,13 @@ public class ApiYrController extends BaseController {
         return R.ok(JSONUtil.parseArray(str));
     }
 
+    @ApiOperation("后台工艺比对")
+    @RequestMapping("/api/yr/compare/back")
+    @CrossOrigin(origins = "*")
+    @ResponseBody
+    public R<?> compareBack(@RequestBody List<YrCompareBackReq> list)  {
+        return R.ok( service.compare(list));
+    }
+
+
 }

+ 10 - 4
jjt-biz/src/main/java/com/jjt/biz/service/IApiYrService.java

@@ -1,9 +1,7 @@
 package com.jjt.biz.service;
 
-import com.jjt.biz.vo.YrEnergyTradeVO;
-import com.jjt.biz.vo.YrProdEfficiencyVO;
-import com.jjt.biz.vo.YrProdLineStatusVO;
-import com.jjt.biz.vo.YrProdTradeVO;
+import com.jjt.biz.vo.*;
+import com.jjt.rz.vo.CompareVo;
 
 import java.util.List;
 
@@ -45,4 +43,12 @@ public interface IApiYrService {
      * 模拟数据定时任务
      */
     void mock();
+
+    /**
+     * 工艺对比
+     *
+     * @param list 输入参数
+     * @return 结果集
+     */
+    List<CompareVo> compare(List<YrCompareBackReq> list);
 }

+ 143 - 16
jjt-biz/src/main/java/com/jjt/biz/service/impl/ApiYrServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jjt.biz.service.impl;
 
+import com.alibaba.fastjson2.JSON;
 import com.jjt.biz.service.IApiYrService;
 import com.jjt.biz.vo.*;
 import com.jjt.calc.domain.TwinCalcDayYhj;
@@ -8,6 +9,12 @@ import com.jjt.calc.service.ITwinCalcDayYhjService;
 import com.jjt.common.constant.CacheConstants;
 import com.jjt.common.core.redis.RedisCache;
 import com.jjt.common.utils.DateUtils;
+import com.jjt.rz.domain.TwinCalcHourRz;
+import com.jjt.rz.domain.TwinDeviceTypeData;
+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.service.ITwinRzCalcMonthService;
 import lombok.extern.slf4j.Slf4j;
@@ -17,6 +24,8 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -36,6 +45,12 @@ public class ApiYrServiceImpl implements IApiYrService {
     private ITwinRzCalcMonthService rzCalcMonthService;
     @Resource
     private ITwinCalcDayYhjService calcDayYhjService;
+    @Resource
+    private ITwinDeviceRzService rzService;
+    @Resource
+    private ITwinCalcHourRzService hourRzService;
+    @Resource
+    private ITwinDeviceTypeService typeService;
 
     /**
      * 获取产线状态
@@ -237,7 +252,6 @@ public class ApiYrServiceImpl implements IApiYrService {
         redisCache.setCacheObject(CacheConstants.RZ_MOCK, vo);
     }
 
-
     private List<YrProdTradeVO> mockProd() {
         List<YrProdTradeVO> list = new ArrayList<>();
         LocalDate end = LocalDate.now().minusDays(1);
@@ -271,23 +285,136 @@ public class ApiYrServiceImpl implements IApiYrService {
     }
 
     /**
-     * 获取周几
+     * 工艺对比
      *
-     * @param date
-     * @return
+     * @param reqs 输入参数
+     * @return 结果集
      */
-    private String week(LocalDate date) {
-        String[] weeks = {"一", "二", "三", "四", "五", "六", "日"};
-        return "周" + weeks[date.getDayOfWeek().getValue() - 1];
-    }
+    @Override
+    public List<CompareVo> compare(List<YrCompareBackReq> reqs) {
+        List<CompareVo> result = new ArrayList<>();
+        List<TwinDeviceTypeData> all = typeService.selectTwinDeviceTypeDataAll();
+        Map<Long, TwinDeviceTypeData> dataMap = all.stream()
+                .collect(Collectors.toMap(
+                        TwinDeviceTypeData::getDataId,
+                        item -> item,
+                        (existing, replacement) -> existing
+                ));
+        for (YrCompareBackReq req : reqs) {
+            CompareVo vo = new CompareVo();
+            vo.setLine(req.getLine());
+            vo.setStart(req.getStart());
+            vo.setEnd(req.getEnd());
+            vo.setYh(10);
+            CompareVo.Qz qz = vo.getQz();
+            CompareVo.Hz hz = vo.getHz();
+            LocalDateTime ldt = req.getEnd().minusHours(1);
+            Date date = Date.from(ldt.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
+            TwinCalcHourRz search = new TwinCalcHourRz();
+            search.setDataDate(date);
+            search.setHour(ldt.getHour());
+            search.setLine(req.getLine());
+            List<TwinCalcHourRz> list = hourRzService.selectTwinCalcHourRzList(search);
+            list.forEach(item -> {
+                TreeMap<String, String> map = JSON.parseObject(item.getData(), TreeMap.class);
+                TreeMap<String, String> treeMap = new TreeMap<>();
+                treeMap.put("device", item.getDeviceName());
+                map.forEach((id, value) -> {
+                    TwinDeviceTypeData data = dataMap.get(Long.parseLong(id));
+                    if (data != null) {
+                        treeMap.put(data.getDataName(), value);
+                    }
+                });
 
-    public static void main(String[] args) {
-        int day = 7;
-        LocalDate end = LocalDate.now().minusDays(1);
-        LocalDate start = end.minusDays(day - 1);
-        do {
-            System.err.println(start + "\t" + start.getDayOfWeek().getValue());
-            start = start.plusDays(1);
-        } while (!start.isAfter(end));
+                if (item.getWsName().equals("Forward")) {
+                    //前整
+                    switch (item.getTypeId()) {
+                        case 2:
+                            //四节定型机
+                            if ("Y".equals(item.getOnline())) {
+                                qz.setDx(qz.getDx() + 1);
+                            }
+                            qz.addDxPara(treeMap);
+                            break;
+                        case 3:
+                            //双棍烫光机
+                            if ("Y".equals(item.getOnline())) {
+                                qz.setTg(qz.getTg() + 1);
+                            }
+                            qz.addTgPara(treeMap);
+                            break;
+                        case 4:
+                            //高梳机
+                            if ("Y".equals(item.getOnline())) {
+                                qz.setGs(qz.getGs() + 1);
+                            }
+                            qz.addGsPara(treeMap);
+                            break;
+                        case 5:
+                            //双棍刷毛
+                            if ("Y".equals(item.getOnline())) {
+                                qz.setSm(qz.getSm() + 1);
+                            }
+                            qz.addSmPara(treeMap);
+                            break;
+                        default:
+                            break;
+                    }
+                } else if (item.getWsName().equals("Back")) {
+                    //后整
+                    switch (item.getTypeId()) {
+                        case 6:
+                            //六节定型机
+                            if ("Y".equals(item.getOnline())) {
+                                hz.setDx(hz.getDx() + 1);
+                            }
+                            hz.addDxPara(treeMap);
+                            break;
+                        case 3:
+                            //双棍烫光机
+                            if ("Y".equals(item.getOnline())) {
+                                hz.setTg(hz.getTg() + 1);
+                            }
+                            hz.addTgPara(treeMap);
+                            break;
+                        case 4:
+                            //高梳机
+                            if ("Y".equals(item.getOnline())) {
+                                hz.setGs(hz.getGs() + 1);
+                            }
+                            hz.addGsPara(treeMap);
+                            break;
+                        case 5:
+                            //双棍刷毛
+                            if ("Y".equals(item.getOnline())) {
+                                hz.setSm(hz.getSm() + 1);
+                            }
+                            hz.addSmPara(treeMap);
+                            break;
+                        case 7:
+                            //起毛机
+                            if ("Y".equals(item.getOnline())) {
+                                hz.setQm(hz.getQm() + 1);
+                            }
+                            hz.addQmPara(treeMap);
+                            break;
+                        case 9:
+                            //烫剪机
+                            if ("Y".equals(item.getOnline())) {
+                                hz.setTj(hz.getTj() + 1);
+                            }
+                            hz.addTjPara(treeMap);
+                            break;
+                        default:
+                            break;
+                    }
+                }
+//
+
+            });
+            result.add(vo);
+        }
+        return result;
     }
+
 }

+ 27 - 0
jjt-biz/src/main/java/com/jjt/biz/vo/YrCompareBackReq.java

@@ -0,0 +1,27 @@
+package com.jjt.biz.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 印染AI工艺对比
+ *
+ * @author wukai
+ * @date 2024/5/8 15:50
+ */
+@ApiModel(value = "YrCompareBackReq", description = "印染AI工艺对比")
+@Data
+public class YrCompareBackReq {
+    @ApiModelProperty("对比产线")
+    private Integer line;
+    @ApiModelProperty("开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime start;
+    @ApiModelProperty("结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime end;
+}

+ 26 - 26
jjt-biz/src/main/java/com/jjt/rz/controller/TwinCalcHourRzController.java

@@ -25,12 +25,12 @@ import com.jjt.common.utils.poi.ExcelUtil;
 import com.jjt.common.core.page.TableDataInfo;
 
 /**
- * 染整线1小时数Controller
+ * 染整线小时工艺参数Controller
  *
  * @author wukai
- * @date 2025-05-21
+ * @date 2025-06-03
  */
-@Api(tags="染整线1小时数")
+@Api(tags="染整线小时工艺参数")
 @RestController
 @RequestMapping("/rz/hour")
 public class TwinCalcHourRzController extends BaseController{
@@ -38,10 +38,10 @@ public class TwinCalcHourRzController extends BaseController{
     private ITwinCalcHourRzService twinCalcHourRzService;
 
     /**
-     * 查询染整线1小时数列表
+     * 查询染整线小时工艺参数列表
      */
-    @ApiOperation("查询染整线1小时数列表")
-    @PreAuthorize("@ss.hasPermi('rz:hour:list')")
+    @ApiOperation("查询染整线小时工艺参数列表")
+    //@PreAuthorize("@ss.hasPermi('rz:hourData:list')")
     @GetMapping("/list")
     public TableDataInfo list(TwinCalcHourRz twinCalcHourRz)
     {
@@ -51,24 +51,24 @@ public class TwinCalcHourRzController extends BaseController{
     }
 
     /**
-     * 导出染整线1小时数列表
+     * 导出染整线小时工艺参数列表
      */
-    @ApiOperation("导出染整线1小时数列表")
-    @PreAuthorize("@ss.hasPermi('rz:hour:export')")
-    @Log(title = "染整线1小时数", businessType = BusinessType.EXPORT)
+    @ApiOperation("导出染整线小时工艺参数列表")
+    //@PreAuthorize("@ss.hasPermi('rz:hourData:export')")
+    @Log(title = "染整线小时工艺参数", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, TwinCalcHourRz twinCalcHourRz)
     {
         List<TwinCalcHourRz> list = twinCalcHourRzService.selectTwinCalcHourRzList(twinCalcHourRz);
         ExcelUtil<TwinCalcHourRz> util = new ExcelUtil<TwinCalcHourRz>(TwinCalcHourRz.class);
-        util.exportExcel(response, list, "染整线1小时数数据");
+        util.exportExcel(response, list, "染整线小时工艺参数数据");
     }
 
     /**
-     * 获取染整线1小时数详细信息
+     * 获取染整线小时工艺参数详细信息
      */
-    @ApiOperation("获取染整线1小时数详细信息")
-    @PreAuthorize("@ss.hasPermi('rz:hour:query')")
+    @ApiOperation("获取染整线小时工艺参数详细信息")
+    //@PreAuthorize("@ss.hasPermi('rz:hourData:query')")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -76,11 +76,11 @@ public class TwinCalcHourRzController extends BaseController{
     }
 
     /**
-     * 新增染整线1小时数
+     * 新增染整线小时工艺参
      */
-    @ApiOperation("新增染整线1小时数")
-    @PreAuthorize("@ss.hasPermi('rz:hour:add')")
-    @Log(title = "染整线1小时数", businessType = BusinessType.INSERT)
+    @ApiOperation("新增染整线小时工艺参数")
+    //@PreAuthorize("@ss.hasPermi('rz:hourData:add')")
+    @Log(title = "染整线小时工艺参数", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody TwinCalcHourRz twinCalcHourRz)
     {
@@ -88,11 +88,11 @@ public class TwinCalcHourRzController extends BaseController{
     }
 
     /**
-     * 修改染整线1小时数
+     * 修改染整线小时工艺参
      */
-    @ApiOperation("修改染整线1小时数")
-    @PreAuthorize("@ss.hasPermi('rz:hour:edit')")
-    @Log(title = "染整线1小时数", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改染整线小时工艺参数")
+    //@PreAuthorize("@ss.hasPermi('rz:hourData:edit')")
+    @Log(title = "染整线小时工艺参数", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody TwinCalcHourRz twinCalcHourRz)
     {
@@ -100,11 +100,11 @@ public class TwinCalcHourRzController extends BaseController{
     }
 
     /**
-     * 删除染整线1小时数
+     * 删除染整线小时工艺参
      */
-    @ApiOperation("删除染整线1小时数")
-    @PreAuthorize("@ss.hasPermi('rz:hour:remove')")
-    @Log(title = "染整线1小时数", businessType = BusinessType.DELETE)
+    @ApiOperation("删除染整线小时工艺参数")
+    //@PreAuthorize("@ss.hasPermi('rz:hourData:remove')")
+    @Log(title = "染整线小时工艺参数", businessType = BusinessType.DELETE)
 	@DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)
     {

+ 61 - 21
jjt-biz/src/main/java/com/jjt/rz/domain/TwinCalcHourRz.java

@@ -1,79 +1,119 @@
 package com.jjt.rz.domain;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jjt.common.annotation.Excel;
+import com.jjt.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.jjt.common.annotation.Excel;
-import com.jjt.common.core.domain.BaseEntity;
+
+import java.util.Date;
+import java.util.TreeMap;
 
 /**
- * 染整线1小时数对象 TWIN_CALC_HOUR_RZ
+ * 染整线小时工艺参数对象 TWIN_CALC_HOUR_RZ
  *
  * @author wukai
- * @date 2025-05-21
+ * @date 2025-06-03
  */
-@ApiModel(value = "TwinCalcHourRz", description = "染整线1小时数")
+@ApiModel(value = "TwinCalcHourRz", description = "染整线小时工艺参数")
 @Data
-public class TwinCalcHourRz extends BaseEntity{
+public class TwinCalcHourRz extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** ID */
+    /**
+     * ID
+     */
     @ApiModelProperty("ID")
     @TableId
     private Long id;
 
-    /** 日期 */
+    /**
+     * 日期
+     */
     @ApiModelProperty("日期")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date dataDate;
 
-    /** 小时;0-23 */
+    /**
+     * 小时;0-23
+     */
     @ApiModelProperty("小时;0-23")
     @Excel(name = "小时;0-23")
-    private Long hour;
+    private Integer hour;
 
-    /** 数据时间 */
+    /**
+     * 数据时间
+     */
     @ApiModelProperty("数据时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "数据时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date dataTime;
 
-    /** 设备ID */
+    /**
+     * 设备ID
+     */
     @ApiModelProperty("设备ID")
     @Excel(name = "设备ID")
     private Long deviceId;
 
-    /** 数据 */
+    /**
+     * 数据
+     */
     @ApiModelProperty("数据")
     @Excel(name = "数据")
     private String data;
 
-    /** 创建人 */
+    /**
+     * 在线状态
+     */
+    @ApiModelProperty("在线状态")
+    @Excel(name = "在线状态")
+    private String online;
+
+    /**
+     * 创建人
+     */
     @ApiModelProperty("创建人")
     @Excel(name = "创建人")
     private String createdBy;
 
-    /** 创建时间 */
+    /**
+     * 创建时间
+     */
     @ApiModelProperty("创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createdTime;
 
-    /** 更新人 */
+    /**
+     * 更新人
+     */
     @ApiModelProperty("更新人")
     @Excel(name = "更新人")
     private String updatedBy;
 
-    /** 更新时间 */
+    /**
+     * 更新时间
+     */
     @ApiModelProperty("更新时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date updatedTime;
 
+    @ApiModelProperty("车间")
+    private String wsName;
+
+    @ApiModelProperty("产线编号")
+    private Integer line;
+
+    @ApiModelProperty("设备类型")
+    private Integer typeId;
+
+    @ApiModelProperty("设备名称")
+    private String deviceName;
+    private TreeMap<String, String> para;
+
 }

+ 44 - 19
jjt-biz/src/main/java/com/jjt/rz/domain/TwinDeviceRz.java

@@ -1,15 +1,14 @@
 package com.jjt.rz.domain;
 
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jjt.common.annotation.Excel;
+import com.jjt.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.jjt.common.annotation.Excel;
-import com.jjt.common.core.domain.BaseEntity;
+
+import java.util.Date;
 
 /**
  * 染整线设备管理对象 TWIN_DEVICE_RZ
@@ -19,69 +18,95 @@ import com.jjt.common.core.domain.BaseEntity;
  */
 @ApiModel(value = "TwinDeviceRz", description = "染整线设备管理")
 @Data
-public class TwinDeviceRz extends BaseEntity{
+public class TwinDeviceRz extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** ID */
+    /**
+     * ID
+     */
     @ApiModelProperty("ID")
     @TableId
     private Long deviceId;
 
-    /** 车间 */
+    /**
+     * 车间
+     */
     @ApiModelProperty("车间")
     @Excel(name = "车间")
     private String wsName;
 
-    /** 产线编号 */
+    /**
+     * 产线编号
+     */
     @ApiModelProperty("产线编号")
     @Excel(name = "产线编号")
     private String line;
 
-    /** 设备类型 */
+    /**
+     * 设备类型
+     */
     @ApiModelProperty("设备类型")
     @Excel(name = "设备类型")
     private Long typeId;
 
-    /** 设备类型名称 */
+    /**
+     * 设备类型名称
+     */
     @ApiModelProperty("设备类型名称")
     @Excel(name = "设备类型名称")
     private String typeName;
 
-    /** 设备编码 */
+    /**
+     * 设备编码
+     */
     @ApiModelProperty("设备编码")
     @Excel(name = "设备编码")
     private String deviceCode;
 
-    /** 设备名称 */
+    /**
+     * 设备名称
+     */
     @ApiModelProperty("设备名称")
     @Excel(name = "设备名称")
     private String deviceName;
 
-    /** 设备路径 */
+    /**
+     * 设备路径
+     */
     @ApiModelProperty("设备路径")
     @Excel(name = "设备路径")
     private String devicePath;
 
-    /** 创建人 */
+    /**
+     * 创建人
+     */
     @ApiModelProperty("创建人")
     @Excel(name = "创建人")
     private String createdBy;
 
-    /** 创建时间 */
+    /**
+     * 创建时间
+     */
     @ApiModelProperty("创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createdTime;
 
-    /** 更新人 */
+    /**
+     * 更新人
+     */
     @ApiModelProperty("更新人")
     @Excel(name = "更新人")
     private String updatedBy;
 
-    /** 更新时间 */
+    /**
+     * 更新时间
+     */
     @ApiModelProperty("更新时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date updatedTime;
 
+    @ApiModelProperty("是否在线")
+    private Boolean online;
 }

+ 34 - 25
jjt-biz/src/main/java/com/jjt/rz/mapper/TwinCalcHourRzMapper.java

@@ -1,62 +1,71 @@
 package com.jjt.rz.mapper;
 
-import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jjt.rz.domain.TwinCalcHourRz;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
- * 染整线1小时数据Mapper接口
- * 
+ * 染整线小时工艺参数Mapper接口
+ *
  * @author wukai
- * @date 2025-05-21
+ * @date 2025-06-03
  */
-public interface TwinCalcHourRzMapper extends BaseMapper<TwinCalcHourRz>
-{
+public interface TwinCalcHourRzMapper extends BaseMapper<TwinCalcHourRz> {
     /**
-     * 查询染整线1小时数
-     * 
-     * @param id 染整线1小时数主键
-     * @return 染整线1小时数
+     * 查询染整线小时工艺参
+     *
+     * @param id 染整线小时工艺参数主键
+     * @return 染整线小时工艺参
      */
     public TwinCalcHourRz selectTwinCalcHourRzById(Long id);
 
     /**
-     * 查询染整线1小时数列表
-     * 
-     * @param twinCalcHourRz 染整线1小时数
-     * @return 染整线1小时数集合
+     * 查询染整线小时工艺参数列表
+     *
+     * @param twinCalcHourRz 染整线小时工艺参
+     * @return 染整线小时工艺参数集合
      */
     public List<TwinCalcHourRz> selectTwinCalcHourRzList(TwinCalcHourRz twinCalcHourRz);
 
     /**
-     * 新增染整线1小时数
-     * 
-     * @param twinCalcHourRz 染整线1小时数
+     * 新增染整线小时工艺参
+     *
+     * @param twinCalcHourRz 染整线小时工艺参
      * @return 结果
      */
     public int insertTwinCalcHourRz(TwinCalcHourRz twinCalcHourRz);
 
     /**
-     * 修改染整线1小时数
-     * 
-     * @param twinCalcHourRz 染整线1小时数
+     * 修改染整线小时工艺参
+     *
+     * @param twinCalcHourRz 染整线小时工艺参
      * @return 结果
      */
     public int updateTwinCalcHourRz(TwinCalcHourRz twinCalcHourRz);
 
     /**
-     * 删除染整线1小时数
-     * 
-     * @param id 染整线1小时数主键
+     * 删除染整线小时工艺参
+     *
+     * @param id 染整线小时工艺参数主键
      * @return 结果
      */
     public int deleteTwinCalcHourRzById(Long id);
 
     /**
-     * 批量删除染整线1小时数
-     * 
+     * 批量删除染整线小时工艺参
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */
     public int deleteTwinCalcHourRzByIds(Long[] ids);
+
+    /**
+     * 删除指定日期指定小时数据
+     *
+     * @param date 日期
+     * @param hour 小时
+     */
+    void deleteTwinCalcHourRz(@Param("date") String date, @Param("hour") int hour);
 }

+ 36 - 17
jjt-biz/src/main/java/com/jjt/rz/service/ITwinCalcHourRzService.java

@@ -1,60 +1,79 @@
 package com.jjt.rz.service;
 
-import java.util.List;
 import com.jjt.rz.domain.TwinCalcHourRz;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
- * 染整线1小时数据Service接口
+ * 染整线小时工艺参数Service接口
  *
  * @author wukai
- * @date 2025-05-21
+ * @date 2025-06-03
  */
 public interface ITwinCalcHourRzService {
     /**
-     * 查询染整线1小时数
+     * 查询染整线小时工艺参
      *
-     * @param id 染整线1小时数主键
-     * @return 染整线1小时数
+     * @param id 染整线小时工艺参数主键
+     * @return 染整线小时工艺参
      */
     public TwinCalcHourRz selectTwinCalcHourRzById(Long id);
 
     /**
-     * 查询染整线1小时数列表
+     * 查询染整线小时工艺参数列表
      *
-     * @param twinCalcHourRz 染整线1小时数
-     * @return 染整线1小时数集合
+     * @param twinCalcHourRz 染整线小时工艺参
+     * @return 染整线小时工艺参数集合
      */
     public List<TwinCalcHourRz> selectTwinCalcHourRzList(TwinCalcHourRz twinCalcHourRz);
 
     /**
-     * 新增染整线1小时数
+     * 新增染整线小时工艺参
      *
-     * @param twinCalcHourRz 染整线1小时数
+     * @param twinCalcHourRz 染整线小时工艺参
      * @return 结果
      */
     public int insertTwinCalcHourRz(TwinCalcHourRz twinCalcHourRz);
 
     /**
-     * 修改染整线1小时数
+     * 修改染整线小时工艺参
      *
-     * @param twinCalcHourRz 染整线1小时数
+     * @param twinCalcHourRz 染整线小时工艺参
      * @return 结果
      */
     public int updateTwinCalcHourRz(TwinCalcHourRz twinCalcHourRz);
 
     /**
-     * 批量删除染整线1小时数
+     * 批量删除染整线小时工艺参
      *
-     * @param ids 需要删除的染整线1小时数主键集合
+     * @param ids 需要删除的染整线小时工艺参数主键集合
      * @return 结果
      */
     public int deleteTwinCalcHourRzByIds(Long[] ids);
 
     /**
-     * 删除染整线1小时数信息
+     * 删除染整线小时工艺参数信息
      *
-     * @param id 染整线1小时数主键
+     * @param id 染整线小时工艺参数主键
      * @return 结果
      */
     public int deleteTwinCalcHourRzById(Long id);
+
+    /**
+     * 按小时获取数据
+     *
+     * @param start 开始时间
+     * @param end   结束时间
+     */
+    void hour(LocalDateTime start, LocalDateTime end);
+
+    /**
+     * 按日期和时间删除数据
+     *
+     * @param date 日期
+     * @param hour 时间
+     */
+    void deleteTwinCalcHourRz(LocalDate date, int hour);
 }

+ 17 - 1
jjt-biz/src/main/java/com/jjt/rz/service/ITwinDeviceTypeService.java

@@ -1,7 +1,9 @@
 package com.jjt.rz.service;
 
-import java.util.List;
 import com.jjt.rz.domain.TwinDeviceType;
+import com.jjt.rz.domain.TwinDeviceTypeData;
+
+import java.util.List;
 
 /**
  * 设备类型管理Service接口
@@ -27,6 +29,20 @@ public interface ITwinDeviceTypeService {
     public List<TwinDeviceType> selectTwinDeviceTypeList(TwinDeviceType twinDeviceType);
 
     /**
+     * 查询所有设备类型
+     *
+     * @return 设备类型管理集合
+     */
+     List<TwinDeviceType> selectTwinDeviceTypeAll();
+
+    /**
+     * 查询所有设备数据列表
+     *
+     * @return 设备数据集合
+     */
+     List<TwinDeviceTypeData> selectTwinDeviceTypeDataAll();
+
+    /**
      * 新增设备类型管理
      *
      * @param twinDeviceType 设备类型管理

+ 156 - 20
jjt-biz/src/main/java/com/jjt/rz/service/impl/TwinCalcHourRzServiceImpl.java

@@ -1,28 +1,52 @@
 package com.jjt.rz.service.impl;
 
-import java.util.List;
-import org.springframework.stereotype.Service;
-import com.jjt.rz.mapper.TwinCalcHourRzMapper;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson2.JSON;
 import com.jjt.rz.domain.TwinCalcHourRz;
+import com.jjt.rz.domain.TwinDeviceRz;
+import com.jjt.rz.domain.TwinDeviceType;
+import com.jjt.rz.mapper.TwinCalcHourRzMapper;
 import com.jjt.rz.service.ITwinCalcHourRzService;
+import com.jjt.rz.service.ITwinDeviceRzService;
+import com.jjt.rz.service.ITwinDeviceTypeService;
+import com.jjt.utils.IotService;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.*;
 
 /**
- * 染整线1小时数据Service业务层处理
+ * 染整线小时工艺参数Service业务层处理
  *
  * @author wukai
- * @date 2025-05-21
+ * @date 2025-06-03
  */
 @Service
 public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     @Resource
     private TwinCalcHourRzMapper twinCalcHourRzMapper;
+    @Resource
+    private IotService iotService;
+    @Resource
+    private ITwinDeviceRzService rzService;
+    @Resource
+    private ITwinDeviceTypeService typeService;
+    @Resource
+    private SqlSessionFactory factory;
+
 
     /**
-     * 查询染整线1小时数据
+     * 查询染整线小时工艺参
      *
-     * @param id 染整线1小时数据主键
-     * @return 染整线1小时数据
+     * @param id 染整线小时工艺参数主键
+     * @return 染整线小时工艺参
      */
     @Override
     public TwinCalcHourRz selectTwinCalcHourRzById(Long id) {
@@ -30,10 +54,10 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     }
 
     /**
-     * 查询染整线1小时数列表
+     * 查询染整线小时工艺参数列表
      *
-     * @param twinCalcHourRz 染整线1小时数
-     * @return 染整线1小时数
+     * @param twinCalcHourRz 染整线小时工艺参
+     * @return 染整线小时工艺参
      */
     @Override
     public List<TwinCalcHourRz> selectTwinCalcHourRzList(TwinCalcHourRz twinCalcHourRz) {
@@ -41,20 +65,20 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     }
 
     /**
-     * 新增染整线1小时数
+     * 新增染整线小时工艺参
      *
-     * @param twinCalcHourRz 染整线1小时数
+     * @param twinCalcHourRz 染整线小时工艺参
      * @return 结果
      */
     @Override
     public int insertTwinCalcHourRz(TwinCalcHourRz twinCalcHourRz) {
-            return twinCalcHourRzMapper.insertTwinCalcHourRz(twinCalcHourRz);
+        return twinCalcHourRzMapper.insertTwinCalcHourRz(twinCalcHourRz);
     }
 
     /**
-     * 修改染整线1小时数
+     * 修改染整线小时工艺参
      *
-     * @param twinCalcHourRz 染整线1小时数
+     * @param twinCalcHourRz 染整线小时工艺参
      * @return 结果
      */
     @Override
@@ -63,9 +87,9 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     }
 
     /**
-     * 批量删除染整线1小时数
+     * 批量删除染整线小时工艺参
      *
-     * @param ids 需要删除的染整线1小时数主键
+     * @param ids 需要删除的染整线小时工艺参数主键
      * @return 结果
      */
     @Override
@@ -74,13 +98,125 @@ public class TwinCalcHourRzServiceImpl implements ITwinCalcHourRzService {
     }
 
     /**
-     * 删除染整线1小时数信息
+     * 删除染整线小时工艺参数信息
      *
-     * @param id 染整线1小时数主键
+     * @param id 染整线小时工艺参数主键
      * @return 结果
      */
     @Override
     public int deleteTwinCalcHourRzById(Long id) {
         return twinCalcHourRzMapper.deleteTwinCalcHourRzById(id);
     }
+
+    /**
+     * 按小时获取数据
+     *
+     * @param start 开始时间
+     * @param end   结束时间
+     */
+    @Override
+    public void hour(LocalDateTime start, LocalDateTime end) {
+        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());
+        List<TwinDeviceType> typeList = typeService.selectTwinDeviceTypeAll();
+        Map<Long, TwinDeviceType> typeMap = new HashMap<>(16);
+        Map<String, Long> dataMap = new HashMap<>(16);
+        typeList.forEach(item -> typeMap.put(item.getTypeId(), item));
+        List<String> strList = new ArrayList<>();
+        Map<String, TwinDeviceRz> rzMap = new HashMap<>(16);
+        //查询状态结尾部分
+        String statusSuffix = ".Capacity_data_1";
+        list.forEach(item -> {
+            String str = item.getDeviceCode() + statusSuffix;
+            String mapId = item.getDevicePath() + statusSuffix;
+            item.setOnline(false);
+            rzMap.put(mapId, item);
+            strList.add(str);
+
+            TwinDeviceType type = typeMap.get(item.getTypeId());
+            type.getTwinDeviceTypeDataList().forEach(item1 -> {
+                String suffix1 = "." + item1.getDataCode();
+                String mapId1 = item.getDevicePath() + suffix1;
+                strList.add(item.getDeviceCode() + suffix1);
+                rzMap.put(mapId1, item);
+                //devicePath+suffix1当key ,dataId当value
+                String key = item.getDevicePath() + suffix1;
+                dataMap.put(key, item1.getDataId());
+            });
+        });
+        String sql = "select last %s from root.tl.suxi where time>%s and time <=%s";
+        sql = String.format(sql, String.join(",", strList), startTime, endTime);
+        iotService.query(sql);
+        JSONObject jsonObject = iotService.query(sql);
+        JSONObject data = jsonObject.getJSONObject("data");
+        JSONArray values = data.getJSONArray("values");
+        JSONArray columnNames = data.getJSONArray("columnNames");
+        JSONArray timestamps = data.getJSONArray("timestamps");
+        for (int i = 0; i < values.size(); i++) {
+            JSONArray da = values.getJSONArray(i);
+            String type = da.getStr(0);
+            String value = da.getStr(1);
+            TwinDeviceRz rz = rzMap.get(type);
+            if (rz != null) {
+                Map<String, Object> params = rz.getParams();
+                if (params == null) {
+                    params = new HashMap<>();
+                }
+                //判断状态
+                if (type.contains(statusSuffix)) {
+                    if (rz.getTypeId() == 3 || rz.getTypeId() == 5 || rz.getTypeId() == 9) {
+                        //双棍烫光和两棍刷毛需要按照机器状态来判断是否开机
+                        //=1 设备故障停机  ,=2 人工停机 ,=3是缺布/断布停机 ,=4满布停机,=5设备上电待机中  =6设备自动运行中,=7设备过站中
+                        if (value.equals("6")) {
+                            rz.setOnline(true);
+                        }
+                    } else {
+                        //其他类型只需要有值就表示开机
+                        rz.setOnline(true);
+                    }
+                } else {
+                    //工艺参数数据获取
+                    String key = String.valueOf(dataMap.get(type));
+                    params.put(key, value);
+                    rz.setParams(params);
+                }
+            }
+        }
+        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();
+            }
+        }
+    }
+
+    /**
+     * 按日期和时间删除数据
+     *
+     * @param date 日期
+     * @param hour 时间
+     */
+    @Override
+    public void deleteTwinCalcHourRz(LocalDate date, int hour) {
+        twinCalcHourRzMapper.deleteTwinCalcHourRz(date.toString(), hour);
+    }
 }

+ 60 - 38
jjt-biz/src/main/java/com/jjt/rz/service/impl/TwinDeviceTypeServiceImpl.java

@@ -1,16 +1,16 @@
 package com.jjt.rz.service.impl;
 
-import java.util.List;
-import org.springframework.stereotype.Service;
-    import java.util.ArrayList;
-
-    import com.jjt.common.utils.StringUtils;
-    import org.springframework.transaction.annotation.Transactional;
-    import com.jjt.rz.domain.TwinDeviceTypeData;
-import com.jjt.rz.mapper.TwinDeviceTypeMapper;
+import com.jjt.common.utils.StringUtils;
 import com.jjt.rz.domain.TwinDeviceType;
+import com.jjt.rz.domain.TwinDeviceTypeData;
+import com.jjt.rz.mapper.TwinDeviceTypeMapper;
 import com.jjt.rz.service.ITwinDeviceTypeService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 设备类型管理Service业务层处理
@@ -46,17 +46,41 @@ public class TwinDeviceTypeServiceImpl implements ITwinDeviceTypeService {
     }
 
     /**
+     * 查询所有设备类型
+     *
+     * @return 设备类型管理集合
+     */
+    @Override
+    public List<TwinDeviceType> selectTwinDeviceTypeAll() {
+        List<TwinDeviceType> typeList = selectTwinDeviceTypeList(new TwinDeviceType());
+        return typeList;
+    }
+
+    /**
+     * 查询所有设备数据列表
+     *
+     * @return 设备数据集合
+     */
+    @Override
+    public List<TwinDeviceTypeData> selectTwinDeviceTypeDataAll() {
+        List<TwinDeviceType> typeList = selectTwinDeviceTypeList(new TwinDeviceType());
+        List<TwinDeviceTypeData> list = new ArrayList<>();
+        typeList.forEach(item -> list.addAll(item.getTwinDeviceTypeDataList()));
+        return list;
+    }
+
+    /**
      * 新增设备类型管理
      *
      * @param twinDeviceType 设备类型管理
      * @return 结果
      */
-        @Transactional
+    @Transactional
     @Override
     public int insertTwinDeviceType(TwinDeviceType twinDeviceType) {
-            int rows = twinDeviceTypeMapper.insertTwinDeviceType(twinDeviceType);
-            insertTwinDeviceTypeData(twinDeviceType);
-            return rows;
+        int rows = twinDeviceTypeMapper.insertTwinDeviceType(twinDeviceType);
+        insertTwinDeviceTypeData(twinDeviceType);
+        return rows;
     }
 
     /**
@@ -65,12 +89,11 @@ public class TwinDeviceTypeServiceImpl implements ITwinDeviceTypeService {
      * @param twinDeviceType 设备类型管理
      * @return 结果
      */
-        @Transactional
+    @Transactional
     @Override
     public int updateTwinDeviceType(TwinDeviceType twinDeviceType) {
-                twinDeviceTypeMapper.deleteTwinDeviceTypeDataByTypeId(twinDeviceType.getTypeId())
-            ;
-            insertTwinDeviceTypeData(twinDeviceType);
+        twinDeviceTypeMapper.deleteTwinDeviceTypeDataByTypeId(twinDeviceType.getTypeId());
+        insertTwinDeviceTypeData(twinDeviceType);
         return twinDeviceTypeMapper.updateTwinDeviceType(twinDeviceType);
     }
 
@@ -80,10 +103,10 @@ public class TwinDeviceTypeServiceImpl implements ITwinDeviceTypeService {
      * @param typeIds 需要删除的设备类型管理主键
      * @return 结果
      */
-        @Transactional
+    @Transactional
     @Override
     public int deleteTwinDeviceTypeByTypeIds(Long[] typeIds) {
-                twinDeviceTypeMapper.deleteTwinDeviceTypeDataByTypeIds(typeIds);
+        twinDeviceTypeMapper.deleteTwinDeviceTypeDataByTypeIds(typeIds);
         return twinDeviceTypeMapper.deleteTwinDeviceTypeByTypeIds(typeIds);
     }
 
@@ -93,31 +116,30 @@ public class TwinDeviceTypeServiceImpl implements ITwinDeviceTypeService {
      * @param typeId 设备类型管理主键
      * @return 结果
      */
-        @Transactional
+    @Transactional
     @Override
     public int deleteTwinDeviceTypeByTypeId(Long typeId) {
-                twinDeviceTypeMapper.deleteTwinDeviceTypeDataByTypeId(typeId);
+        twinDeviceTypeMapper.deleteTwinDeviceTypeDataByTypeId(typeId);
         return twinDeviceTypeMapper.deleteTwinDeviceTypeByTypeId(typeId);
     }
 
-        /**
-         * 新增设备类型数据管理信息
-         *
-         * @param twinDeviceType 设备类型管理对象
-         */
-        public void insertTwinDeviceTypeData(TwinDeviceType twinDeviceType) {
-            List<TwinDeviceTypeData> twinDeviceTypeDataList = twinDeviceType.getTwinDeviceTypeDataList();
-            Long typeId = twinDeviceType.getTypeId();
-            if (StringUtils.isNotNull(twinDeviceTypeDataList)) {
-                List<TwinDeviceTypeData> list = new ArrayList<TwinDeviceTypeData>();
-                for (TwinDeviceTypeData twinDeviceTypeData :twinDeviceTypeDataList)
-                {
-                    twinDeviceTypeData.setTypeId(typeId);
-                    list.add(twinDeviceTypeData);
-                }
-                if (list.size() > 0) {
-                        twinDeviceTypeMapper.batchTwinDeviceTypeData(list);
-                }
+    /**
+     * 新增设备类型数据管理信息
+     *
+     * @param twinDeviceType 设备类型管理对象
+     */
+    public void insertTwinDeviceTypeData(TwinDeviceType twinDeviceType) {
+        List<TwinDeviceTypeData> twinDeviceTypeDataList = twinDeviceType.getTwinDeviceTypeDataList();
+        Long typeId = twinDeviceType.getTypeId();
+        if (StringUtils.isNotNull(twinDeviceTypeDataList)) {
+            List<TwinDeviceTypeData> list = new ArrayList<TwinDeviceTypeData>();
+            for (TwinDeviceTypeData twinDeviceTypeData : twinDeviceTypeDataList) {
+                twinDeviceTypeData.setTypeId(typeId);
+                list.add(twinDeviceTypeData);
+            }
+            if (list.size() > 0) {
+                twinDeviceTypeMapper.batchTwinDeviceTypeData(list);
             }
         }
+    }
 }

+ 176 - 0
jjt-biz/src/main/java/com/jjt/rz/vo/CompareVo.java

@@ -0,0 +1,176 @@
+package com.jjt.rz.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TreeMap;
+
+/**
+ * 工艺比对视图
+ *
+ * @author wukai
+ * @date 2025/6/3 23:47
+ */
+@ApiModel(value = "CompareVo", description = "工艺比对视图")
+@Data
+public class CompareVo {
+    @ApiModelProperty("产线")
+    private Integer line;
+    @ApiModelProperty("开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime start;
+    @ApiModelProperty("结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime end;
+    @ApiModelProperty("前整车间")
+    private Qz qz;
+    @ApiModelProperty("后整车间")
+    private Hz hz;
+    @ApiModelProperty("印花")
+    private Integer yh;
+    @ApiModelProperty("电")
+    private BigDecimal elect;
+    @ApiModelProperty("热油")
+    private BigDecimal oil;
+    @ApiModelProperty("产能")
+    private Integer length;
+
+    @Data
+    public static class Qz {
+        @ApiModelProperty("定型次数")
+        private Integer dx;
+        @ApiModelProperty("定型参数")
+        private List<TreeMap<String, String>> dxPara;
+        @ApiModelProperty("高梳次数")
+        private Integer gs;
+        @ApiModelProperty("高梳参数")
+        private List<TreeMap<String, String>> gsPara;
+        @ApiModelProperty("双棍烫光次数")
+        private Integer tg;
+        @ApiModelProperty("双棍烫光参数")
+        private List<TreeMap<String, String>> tgPara;
+        @ApiModelProperty("双棍刷毛次数")
+        private Integer sm;
+        @ApiModelProperty("双棍刷毛参数")
+        private List<TreeMap<String, String>> smPara;
+        @ApiModelProperty("电")
+        private BigDecimal elect;
+        @ApiModelProperty("热油")
+        private BigDecimal oil;
+
+        public Qz() {
+            this.elect = BigDecimal.ZERO;
+            this.oil = BigDecimal.ZERO;
+            this.dx = 0;
+            this.gs = 0;
+            this.tg = 0;
+            this.sm = 0;
+            this.dxPara = new ArrayList<>();
+            this.gsPara = new ArrayList<>();
+            this.tgPara = new ArrayList<>();
+            this.smPara = new ArrayList<>();
+        }
+
+        public void addDxPara(TreeMap<String, String> treeMap) {
+            this.dxPara.add(treeMap);
+        }
+
+        public void addGsPara(TreeMap<String, String> treeMap) {
+            this.gsPara.add(treeMap);
+        }
+
+        public void addTgPara(TreeMap<String, String> treeMap) {
+            this.tgPara.add(treeMap);
+        }
+
+        public void addSmPara(TreeMap<String, String> treeMap) {
+            this.smPara.add(treeMap);
+        }
+    }
+
+    @Data
+    public static class Hz {
+        @ApiModelProperty("定型次数")
+        private Integer dx;
+        @ApiModelProperty("定型参数")
+        private List<TreeMap<String, String>> dxPara;
+        @ApiModelProperty("高梳次数")
+        private Integer gs;
+        @ApiModelProperty("高梳参数")
+        private List<TreeMap<String, String>> gsPara;
+        @ApiModelProperty("双棍烫光次数")
+        private Integer tg;
+        @ApiModelProperty("双棍烫光参数")
+        private List<TreeMap<String, String>> tgPara;
+        @ApiModelProperty("双棍刷毛次数")
+        private Integer sm;
+        @ApiModelProperty("双棍刷毛参数")
+        private List<TreeMap<String, String>> smPara;
+        @ApiModelProperty("起毛次数")
+        private Integer qm;
+        @ApiModelProperty("起毛参数")
+        private List<TreeMap<String, String>> qmPara;
+        @ApiModelProperty("烫剪次数")
+        private Integer tj;
+        @ApiModelProperty("烫剪参数")
+        private List<TreeMap<String, String>> tjPara;
+        @ApiModelProperty("电")
+        private BigDecimal elect;
+        @ApiModelProperty("热油")
+        private BigDecimal oil;
+
+        public Hz() {
+            this.elect = BigDecimal.ZERO;
+            this.oil = BigDecimal.ZERO;
+            this.dx = 0;
+            this.gs = 0;
+            this.tg = 0;
+            this.sm = 0;
+            this.qm = 0;
+            this.tj = 0;
+            this.dxPara = new ArrayList<>();
+            this.gsPara = new ArrayList<>();
+            this.tgPara = new ArrayList<>();
+            this.smPara = new ArrayList<>();
+            this.qmPara = new ArrayList<>();
+            this.tjPara = new ArrayList<>();
+        }
+
+        public void addDxPara(TreeMap<String, String> treeMap) {
+            this.dxPara.add(treeMap);
+        }
+
+        public void addGsPara(TreeMap<String, String> treeMap) {
+            this.gsPara.add(treeMap);
+        }
+
+        public void addTgPara(TreeMap<String, String> treeMap) {
+            this.tgPara.add(treeMap);
+        }
+
+        public void addSmPara(TreeMap<String, String> treeMap) {
+            this.smPara.add(treeMap);
+        }
+
+        public void addQmPara(TreeMap<String, String> treeMap) {
+            this.qmPara.add(treeMap);
+        }
+
+        public void addTjPara(TreeMap<String, String> treeMap) {
+            this.tjPara.add(treeMap);
+        }
+    }
+
+    public CompareVo() {
+        this.qz = new Qz();
+        this.hz = new Hz();
+
+
+    }
+}

+ 70 - 33
jjt-biz/src/main/resources/mapper/rz/TwinCalcHourRzMapper.xml

@@ -1,49 +1,75 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.jjt.rz.mapper.TwinCalcHourRzMapper">
-    
+
     <resultMap type="TwinCalcHourRz" id="TwinCalcHourRzResult">
-        <result property="id"    column="ID"    />
-        <result property="dataDate"    column="DATA_DATE"    />
-        <result property="hour"    column="HOUR"    />
-        <result property="dataTime"    column="DATA_TIME"    />
-        <result property="deviceId"    column="DEVICE_ID"    />
-        <result property="data"    column="DATA"    />
-        <result property="createdBy"    column="CREATED_BY"    />
-        <result property="createdTime"    column="CREATED_TIME"    />
-        <result property="updatedBy"    column="UPDATED_BY"    />
-        <result property="updatedTime"    column="UPDATED_TIME"    />
-        <result property="remark"    column="REMARK"    />
+        <result property="id" column="ID"/>
+        <result property="dataDate" column="DATA_DATE"/>
+        <result property="hour" column="HOUR"/>
+        <result property="dataTime" column="DATA_TIME"/>
+        <result property="deviceId" column="DEVICE_ID"/>
+        <result property="data" column="DATA"/>
+        <result property="online" column="ONLINE"/>
+        <result property="createdBy" column="CREATED_BY"/>
+        <result property="createdTime" column="CREATED_TIME"/>
+        <result property="updatedBy" column="UPDATED_BY"/>
+        <result property="updatedTime" column="UPDATED_TIME"/>
+        <result property="remark" column="REMARK"/>
+        <result property="line" column="LINE"/>
+        <result property="deviceName" column="DEVICE_NAME"/>
+        <result property="wsName" column="WS_NAME"/>
+        <result property="typeId" column="TYPE_ID"/>
     </resultMap>
 
     <sql id="selectTwinCalcHourRzVo">
-        select ID, DATA_DATE, HOUR, DATA_TIME, DEVICE_ID, DATA, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, REMARK from TWIN_CALC_HOUR_RZ
+        select *
+        from (select a.ID,
+                     a.DATA_DATE,
+                     a.HOUR,
+                     a.DATA_TIME,
+                     a.DEVICE_ID,
+                     a.DATA,
+                     a.ONLINE,
+                     a.CREATED_BY,
+                     a.CREATED_TIME,
+                     a.UPDATED_BY,
+                     a.UPDATED_TIME,
+                     a.REMARK,
+                     b.DEVICE_NAME,
+                     b.line,
+                     b.WS_NAME,
+                     b.TYPE_ID
+              from TWIN_CALC_HOUR_RZ a,
+                   TWIN_DEVICE_RZ b
+              where a.device_id = b.device_id) a
     </sql>
 
     <select id="selectTwinCalcHourRzList" parameterType="TwinCalcHourRz" resultMap="TwinCalcHourRzResult">
         <include refid="selectTwinCalcHourRzVo"/>
-        <where>  
-            <if test="dataDate != null "> and DATA_DATE = #{dataDate}</if>
-            <if test="hour != null "> and HOUR = #{hour}</if>
-            <if test="dataTime != null "> and DATA_TIME = #{dataTime}</if>
-            <if test="deviceId != null "> and DEVICE_ID = #{deviceId}</if>
-            <if test="data != null  and data != ''"> and DATA = #{data}</if>
-            <if test="createdBy != null  and createdBy != ''"> and CREATED_BY = #{createdBy}</if>
-            <if test="createdTime != null "> and CREATED_TIME = #{createdTime}</if>
-            <if test="updatedBy != null  and updatedBy != ''"> and UPDATED_BY = #{updatedBy}</if>
-            <if test="updatedTime != null "> and UPDATED_TIME = #{updatedTime}</if>
-            <if test="remark != null  and remark != ''"> and REMARK = #{remark}</if>
+        <where>
+            <if test="dataDate != null ">and DATA_DATE = #{dataDate}</if>
+            <if test="hour != null ">and HOUR = #{hour}</if>
+            <if test="dataTime != null ">and DATA_TIME = #{dataTime}</if>
+            <if test="deviceId != null ">and DEVICE_ID = #{deviceId}</if>
+            <if test="data != null  and data != ''">and DATA = #{data}</if>
+            <if test="online != null ">and ONLINE = #{online}</if>
+            <if test="createdBy != null  and createdBy != ''">and CREATED_BY = #{createdBy}</if>
+            <if test="createdTime != null ">and CREATED_TIME = #{createdTime}</if>
+            <if test="updatedBy != null  and updatedBy != ''">and UPDATED_BY = #{updatedBy}</if>
+            <if test="updatedTime != null ">and UPDATED_TIME = #{updatedTime}</if>
+            <if test="remark != null  and remark != ''">and REMARK = #{remark}</if>
+            <if test="line != null">and line = #{line}</if>
         </where>
     </select>
-    
+
     <select id="selectTwinCalcHourRzById" parameterType="Long" resultMap="TwinCalcHourRzResult">
         <include refid="selectTwinCalcHourRzVo"/>
         where ID = #{id}
     </select>
 
-    <insert id="insertTwinCalcHourRz" parameterType="TwinCalcHourRz" useGeneratedKeys="true" keyProperty="id">
+    <insert id="insertTwinCalcHourRz" parameterType="TwinCalcHourRz">
         insert into TWIN_CALC_HOUR_RZ
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="dataDate != null">DATA_DATE,</if>
@@ -51,24 +77,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="dataTime != null">DATA_TIME,</if>
             <if test="deviceId != null">DEVICE_ID,</if>
             <if test="data != null">DATA,</if>
+            <if test="online != null">ONLINE,</if>
             <if test="createdBy != null">CREATED_BY,</if>
             <if test="createdTime != null">CREATED_TIME,</if>
             <if test="updatedBy != null">UPDATED_BY,</if>
             <if test="updatedTime != null">UPDATED_TIME,</if>
             <if test="remark != null">REMARK,</if>
-         </trim>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="dataDate != null">#{dataDate},</if>
             <if test="hour != null">#{hour},</if>
             <if test="dataTime != null">#{dataTime},</if>
             <if test="deviceId != null">#{deviceId},</if>
             <if test="data != null">#{data},</if>
+            <if test="online != null">#{online},</if>
             <if test="createdBy != null">#{createdBy},</if>
             <if test="createdTime != null">#{createdTime},</if>
             <if test="updatedBy != null">#{updatedBy},</if>
             <if test="updatedTime != null">#{updatedTime},</if>
             <if test="remark != null">#{remark},</if>
-         </trim>
+        </trim>
     </insert>
 
     <update id="updateTwinCalcHourRz" parameterType="TwinCalcHourRz">
@@ -79,6 +107,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="dataTime != null">DATA_TIME = #{dataTime},</if>
             <if test="deviceId != null">DEVICE_ID = #{deviceId},</if>
             <if test="data != null">DATA = #{data},</if>
+            <if test="online != null">ONLINE = #{online},</if>
             <if test="createdBy != null">CREATED_BY = #{createdBy},</if>
             <if test="createdTime != null">CREATED_TIME = #{createdTime},</if>
             <if test="updatedBy != null">UPDATED_BY = #{updatedBy},</if>
@@ -89,13 +118,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </update>
 
     <delete id="deleteTwinCalcHourRzById" parameterType="Long">
-        delete from TWIN_CALC_HOUR_RZ where ID = #{id}
+        delete
+        from TWIN_CALC_HOUR_RZ
+        where ID = #{id}
     </delete>
 
     <delete id="deleteTwinCalcHourRzByIds" parameterType="String">
-        delete from TWIN_CALC_HOUR_RZ where ID in 
+        delete from TWIN_CALC_HOUR_RZ where ID in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
-</mapper>
+    <delete id="deleteTwinCalcHourRz">
+        delete
+        from TWIN_CALC_HOUR_RZ
+        where DATA_DATE = #{date}
+          and HOUR = #{hour}
+    </delete>
+</mapper>

+ 1 - 1
jjt-biz/src/main/resources/mapper/rz/TwinDeviceTypeMapper.xml

@@ -37,7 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select TYPE_ID, TYPE_GROUP, TYPE_NAME, TYPE_MATCH, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, REMARK from TWIN_DEVICE_TYPE
     </sql>
 
-    <select id="selectTwinDeviceTypeList" parameterType="TwinDeviceType" resultMap="TwinDeviceTypeResult">
+    <select id="selectTwinDeviceTypeList" parameterType="TwinDeviceType" resultMap="TwinDeviceTypeTwinDeviceTypeDataResult">
         <include refid="selectTwinDeviceTypeVo"/>
         <where>
             <if test="typeGroup != null  and typeGroup != ''"> and TYPE_GROUP = #{typeGroup}</if>