Selaa lähdekoodia

搞定能源统计相关功能

wukai 4 kuukautta sitten
vanhempi
commit
580e736955
19 muutettua tiedostoa jossa 377 lisäystä ja 156 poistoa
  1. 79 0
      jjt-admin/src/test/java/com/jjt/data/EnergyTest.java
  2. 22 19
      jjt-admin/src/test/java/com/jjt/data/PrintingTest.java
  3. 0 50
      jjt-admin/src/test/java/com/jjt/task/EnergyTest.java
  4. 46 19
      jjt-biz/src/main/java/com/jjt/calc/domain/TwinCalcDayYhj.java
  5. 17 10
      jjt-biz/src/main/java/com/jjt/calc/mapper/TwinCalcHourEnergyMapper.java
  6. 6 0
      jjt-biz/src/main/java/com/jjt/calc/mapper/TwinCalcHourYhjMapper.java
  7. 4 0
      jjt-biz/src/main/java/com/jjt/calc/service/ITwinCalcHourEnergyService.java
  8. 12 0
      jjt-biz/src/main/java/com/jjt/calc/service/ITwinCalcHourYhjService.java
  9. 1 3
      jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcDayYhjServiceImpl.java
  10. 83 31
      jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcHourEnergyServiceImpl.java
  11. 41 0
      jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcHourYhjServiceImpl.java
  12. 1 2
      jjt-biz/src/main/java/com/jjt/task/EnergyTask.java
  13. 11 1
      jjt-biz/src/main/java/com/jjt/utils/InitService.java
  14. 31 13
      jjt-biz/src/main/java/com/jjt/ws/domain/TwinWorkshopCalc.java
  15. 4 2
      jjt-biz/src/main/java/com/jjt/ws/service/ITwinWorkshopCalcService.java
  16. 8 5
      jjt-biz/src/main/java/com/jjt/ws/service/impl/TwinWorkshopCalcServiceImpl.java
  17. 3 0
      jjt-biz/src/main/resources/mapper/calc/TwinCalcHourEnergyMapper.xml
  18. 3 0
      jjt-biz/src/main/resources/mapper/calc/TwinCalcHourYhjMapper.xml
  19. 5 1
      jjt-biz/src/main/resources/mapper/ws/TwinWorkshopCalcMapper.xml

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

@@ -0,0 +1,79 @@
+package com.jjt.data;
+
+import com.jjt.JjtApplication;
+import com.jjt.calc.service.ITwinCalcHourEnergyService;
+import com.jjt.common.utils.DateUtils;
+import com.jjt.utils.IotService;
+import com.jjt.utils.Tools;
+import com.jjt.ws.service.ITwinWorkshopCalcService;
+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 javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+/**
+ * 印花机
+ */
+@SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class EnergyTest {
+    @Resource
+    private IotService iotService;
+    @Resource
+    private SqlSessionFactory factory;
+    @Resource
+    private ITwinWorkshopEnergyService energyService;
+    @Resource
+    private ITwinCalcHourEnergyService calcHourEnergyService;
+    @Resource
+    private ITwinWorkshopCalcService calcService;
+
+    public static void main(String[] args) {
+        String st = "2025-03-04";
+        LocalDate localDate = LocalDate.parse(st);
+        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN);
+        LocalDateTime end = start.plusHours(1);
+        LocalDateTime stop = Tools.currWholeTime();
+        while (!end.isAfter(stop)) {
+            int i = start.getHour();
+            System.err.println(DateUtils.parseTimeToStr(start) + "\t" + i + DateUtils.parseTimeToStr(end));
+//            calcHourEnergyService.calcEnergy(start, end);
+//            if (i == 6) {
+//                calcService.calc(start.toLocalDate().minusDays(1));
+//            }
+            start = end;
+            end = end.plusHours(1);
+        }
+    }
+
+    @Test
+    void test() {
+        iotService.setToken();
+        String st = "2025-03-04";
+        LocalDate localDate = LocalDate.parse(st);
+        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(1);
+        LocalDateTime end = start.plusHours(1);
+        LocalDateTime stop = Tools.currWholeTime();
+        while (!end.isAfter(stop)) {
+            int i = start.getHour();
+            System.err.println(DateUtils.parseTimeToStr(start) + "\t" + i + DateUtils.parseTimeToStr(end));
+            calcHourEnergyService.calcEnergy(start, end);
+            if (i == 6) {
+                calcService.calc(start.toLocalDate().minusDays(1));
+            }
+            start = end;
+            end = end.plusHours(1);
+        }
+    }
+
+    @Test
+    void day() {
+        String st = "2025-03-07";
+        LocalDate localDate = LocalDate.parse(st);
+        calcService.calc(localDate);
+    }
+}

+ 22 - 19
jjt-admin/src/test/java/com/jjt/data/PrintingTest.java

@@ -73,25 +73,28 @@ public class PrintingTest {
     @Test
     void t2() {
         iotService.setToken();
-        String st = "2025-03-02";
-        String ed = "2025-03-06";
-        LocalDate localDate = LocalDate.parse(st);
-        LocalDate endDate = LocalDate.parse(ed);
-        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN);
-        LocalDateTime end = LocalDateTime.of(endDate, LocalTime.MIN).plusHours(23);
-        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);
-            calcHourYhjService.calc(start, start.plusHours(1));
-//            if (i == 6) {
-//                dayService.day(start.toLocalDate());
-//            }
-            start = start.plusHours(1);
-        } while (!start.isAfter(end));
+
+        calcHourYhjService.calc2Curr();
+
+//        String st = "2025-03-02";
+//        String ed = "2025-03-06";
+//        LocalDate localDate = LocalDate.parse(st);
+//        LocalDate endDate = LocalDate.parse(ed);
+//        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN);
+//        LocalDateTime end = LocalDateTime.of(endDate, LocalTime.MIN).plusHours(23);
+//        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);
+//            calcHourYhjService.calc(start, start.plusHours(1));
+////            if (i == 6) {
+////                dayService.day(start.toLocalDate());
+////            }
+//            start = start.plusHours(1);
+//        } while (!start.isAfter(end));
 //        calcHourYhjService.calc();
 
     }

+ 0 - 50
jjt-admin/src/test/java/com/jjt/task/EnergyTest.java

@@ -1,50 +0,0 @@
-package com.jjt.task;
-
-import com.jjt.JjtApplication;
-import com.jjt.calc.service.ITwinCalcHourEnergyService;
-import com.jjt.common.utils.DateUtils;
-import com.jjt.ws.service.ITwinWorkshopCalcService;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import javax.annotation.Resource;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-
-/**
- * DataProcess$
- *
- * @author wukai
- * @date 2024/5/7 11:49
- */
-@SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-public class EnergyTest {
-    @Resource
-    private ITwinCalcHourEnergyService energyService;
-    @Resource
-    private ITwinWorkshopCalcService wsCalcService;
-
-    @Test
-    public void last() {
-        String date = "2025-02-12";
-        LocalDate localDate = LocalDate.parse(date);
-        LocalDateTime ldt = LocalDateTime.of(localDate, LocalTime.MIN);
-        for (int i = 0; i < 24; i++) {
-            LocalDateTime tt = ldt.plusHours(i);
-            System.err.println(tt.toLocalDate().toString() + tt.getHour());
-            energyService.calcEnergy(tt, tt.plusHours(1));
-//            calcHourService.calc(tt.toLocalDate().toString(), tt.getHour());
-        }
-
-//        calcHourService.last();
-    }
-
-    @Test
-    public void calc() {
-        String date = "2025-02-11";
-        LocalDate localDate = LocalDate.parse(date);
-        wsCalcService.calc(DateUtils.toDate(localDate));
-    }
-}
-

+ 46 - 19
jjt-biz/src/main/java/com/jjt/calc/domain/TwinCalcDayYhj.java

@@ -1,16 +1,15 @@
 package com.jjt.calc.domain;
 
-import java.math.BigDecimal;
-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.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 印花机日统计数据对象 TWIN_CALC_DAY_YHJ
@@ -20,63 +19,91 @@ import com.jjt.common.core.domain.BaseEntity;
  */
 @ApiModel(value = "TwinCalcDayYhj", description = "印花机日统计数据")
 @Data
-public class TwinCalcDayYhj extends BaseEntity{
+public class TwinCalcDayYhj 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 time;
 
-    /** 设备ID */
+    /**
+     * 设备ID
+     */
     @ApiModelProperty("设备ID")
     @Excel(name = "设备ID")
     private Long deviceId;
 
-    /** 自然天统计长度 */
+    /**
+     * 自然天统计长度
+     */
     @ApiModelProperty("自然天统计长度")
     @Excel(name = "自然天统计长度")
     private Integer dayLength;
 
-    /** 自然天统计重量 */
+    /**
+     * 自然天统计重量
+     */
     @ApiModelProperty("自然天统计重量")
     @Excel(name = "自然天统计重量")
     private BigDecimal dayWeight;
 
-    /** 总米长 */
+    /**
+     * 总米长
+     */
     @ApiModelProperty("总米长")
     @Excel(name = "总米长")
     private Integer length;
 
-    /** 总重量 */
+    /**
+     * 总重量
+     */
     @ApiModelProperty("总重量")
     @Excel(name = "总重量")
     private BigDecimal weight;
 
-    /** A班米长 */
+    /**
+     * A班米长
+     */
     @ApiModelProperty("A班米长")
     @Excel(name = "A班米长")
     private Integer lengthA;
 
-    /** A班重量 */
+    /**
+     * A班重量
+     */
     @ApiModelProperty("A班重量")
     @Excel(name = "A班重量")
     private BigDecimal weightA;
 
-    /** B班米长 */
+    /**
+     * B班米长
+     */
     @ApiModelProperty("B班米长")
     @Excel(name = "B班米长")
     private Integer lengthB;
 
-    /** B班重量 */
+    /**
+     * B班重量
+     */
     @ApiModelProperty("B班重量")
     @Excel(name = "B班重量")
     private BigDecimal weightB;
 
+    public void setLength(Integer lengthA, Integer lengthB) {
+        this.lengthA = lengthA == null ? 0 : lengthA;
+        this.lengthB = lengthB == null ? 0 : lengthB;
+        this.length = this.lengthA + this.lengthB;
+    }
+
 }

+ 17 - 10
jjt-biz/src/main/java/com/jjt/calc/mapper/TwinCalcHourEnergyMapper.java

@@ -1,20 +1,20 @@
 package com.jjt.calc.mapper;
 
-import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jjt.calc.domain.TwinCalcHourEnergy;
 
+import java.util.List;
+
 /**
  * 能源1小时统计数据Mapper接口
- * 
+ *
  * @author wukai
  * @date 2025-01-18
  */
-public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy>
-{
+public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy> {
     /**
      * 查询能源1小时统计数据
-     * 
+     *
      * @param autoId 能源1小时统计数据主键
      * @return 能源1小时统计数据
      */
@@ -22,7 +22,7 @@ public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy>
 
     /**
      * 查询能源1小时统计数据列表
-     * 
+     *
      * @param twinCalcHourEnergy 能源1小时统计数据
      * @return 能源1小时统计数据集合
      */
@@ -30,7 +30,7 @@ public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy>
 
     /**
      * 新增能源1小时统计数据
-     * 
+     *
      * @param twinCalcHourEnergy 能源1小时统计数据
      * @return 结果
      */
@@ -38,7 +38,7 @@ public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy>
 
     /**
      * 修改能源1小时统计数据
-     * 
+     *
      * @param twinCalcHourEnergy 能源1小时统计数据
      * @return 结果
      */
@@ -46,7 +46,7 @@ public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy>
 
     /**
      * 删除能源1小时统计数据
-     * 
+     *
      * @param autoId 能源1小时统计数据主键
      * @return 结果
      */
@@ -54,9 +54,16 @@ public interface TwinCalcHourEnergyMapper extends BaseMapper<TwinCalcHourEnergy>
 
     /**
      * 批量删除能源1小时统计数据
-     * 
+     *
      * @param autoIds 需要删除的数据主键集合
      * @return 结果
      */
     public int deleteTwinCalcHourEnergyByAutoIds(Long[] autoIds);
+
+    /**
+     * 获取最后一条记录
+     *
+     * @return 结果
+     */
+    TwinCalcHourEnergy lastRecord();
 }

+ 6 - 0
jjt-biz/src/main/java/com/jjt/calc/mapper/TwinCalcHourYhjMapper.java

@@ -69,4 +69,10 @@ public interface TwinCalcHourYhjMapper extends BaseMapper<TwinCalcHourYhj> {
      * @param hour 小时
      */
     void deleteTwinCalcHourYhj(@Param("date") Date date, @Param("hour") int hour);
+
+    /**
+     * 查询数据库最后一条记录
+     * @return 结果
+     */
+    TwinCalcHourYhj lastRecord();
 }

+ 4 - 0
jjt-biz/src/main/java/com/jjt/calc/service/ITwinCalcHourEnergyService.java

@@ -80,4 +80,8 @@ public interface ITwinCalcHourEnergyService {
      * @return 结果
      */
     List<TwinCalcHourEnergy> selectTwinEmpCalcListByDate(Date parseDate);
+    /**
+     * 从数据库最后一个时间段统计至上一个时段
+     */
+    void calc2Curr();
 }

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

@@ -72,4 +72,16 @@ public interface ITwinCalcHourYhjService {
      * @param end   结束时间
      */
     void calc(LocalDateTime start, LocalDateTime end);
+
+    /**
+     * 查询数据库最后一条记录
+     *
+     * @return 结果
+     */
+    TwinCalcHourYhj lastRecord();
+
+    /**
+     * 补录数据至当前时间
+     */
+    void calc2Curr();
 }

+ 1 - 3
jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcDayYhjServiceImpl.java

@@ -129,9 +129,7 @@ public class TwinCalcDayYhjServiceImpl implements ITwinCalcDayYhjService {
             TwinCalcDayYhj calc = new TwinCalcDayYhj();
             calc.setDeviceId(deviceId);
             calc.setTime(DateUtils.toDate(localDate));
-            calc.setLengthA(calcTeam.get("A"));
-            calc.setLengthB(calcTeam.get("B"));
-            calc.setLength(calcTeam.get("A") + calcTeam.get("B"));
+            calc.setLength(calcTeam.get("A"), calcTeam.get("B"));
             resultMap.put(deviceId, calc);
         }
 

+ 83 - 31
jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcHourEnergyServiceImpl.java

@@ -6,12 +6,14 @@ import com.jjt.calc.domain.TwinCalcHourEnergy;
 import com.jjt.calc.mapper.TwinCalcHourEnergyMapper;
 import com.jjt.calc.service.ITwinCalcHourEnergyService;
 import com.jjt.common.utils.DateUtils;
+import com.jjt.common.utils.StringUtils;
 import com.jjt.utils.IotService;
 import com.jjt.utils.Tools;
-import com.jjt.ws.domain.TwinWorkshop;
 import com.jjt.ws.domain.TwinWorkshopEnergy;
-import com.jjt.ws.service.ITwinWorkshopService;
+import com.jjt.ws.service.ITwinWorkshopCalcService;
+import com.jjt.ws.service.ITwinWorkshopEnergyService;
 import javafx.util.Pair;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -21,8 +23,10 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.ZoneOffset;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 能源1小时统计数据Service业务层处理
@@ -31,6 +35,7 @@ import java.util.*;
  * @date 2025-01-18
  */
 @Service
+@Slf4j
 public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService {
     @Resource
     private TwinCalcHourEnergyMapper twinCalcHourEnergyMapper;
@@ -39,7 +44,9 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
     @Resource
     private SqlSessionFactory factory;
     @Resource
-    private ITwinWorkshopService workshopService;
+    private ITwinWorkshopEnergyService energyService;
+    @Resource
+    private ITwinWorkshopCalcService calcService;
 
     /**
      * 查询能源1小时统计数据
@@ -119,33 +126,48 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
         int period = start.getHour();
         Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
         Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
-        String baseSql = "select %s from %s where time>%s and time <=%s";
-        TwinWorkshop ws = workshopService.selectTwinWorkshopByWsCode("WS_01");
-        List<TwinWorkshopEnergy> energyList = ws.getTwinWorkshopEnergyList();
-        List<TwinCalcHourEnergy> list = new ArrayList<>();
-        for (TwinWorkshopEnergy energy : energyList) {
-            String sql = String.format(baseSql, energy.getEnergyCode(), energy.getEnergyPath(), startTime, endTime);
-            JSONObject jsonObject = iotService.query(sql);
-            JSONObject data = jsonObject.getJSONObject("data");
-            JSONArray values = data.getJSONArray("values");
-            if (values.size() == 0) {
-                continue;
+        List<TwinWorkshopEnergy> energyList = energyService.selectTwinWorkshopEnergyList(new TwinWorkshopEnergy());
+        // 转换为 Map<String, TwinWorkshopEnergy>,使用 能源ID 属性作为键
+        Map<Long, TwinWorkshopEnergy> energyMap = energyList.stream().collect(Collectors.toMap(TwinWorkshopEnergy::getEnergyId, obj -> obj));
+        List<String> fieldList = new ArrayList<>();
+        energyList.forEach(energy -> {
+            String field = energy.getEnergyPath() + " AS " + energy.getEnergyId();
+            fieldList.add(field);
+        });
+
+        String sql = "select %s from root.tl.suxi where time>%s and time <=%s";
+        sql = String.format(sql, String.join(",", fieldList), 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");
+
+        List<TwinCalcHourEnergy> calcHourEnergyList = new ArrayList<>();
+        if (values.size() == 1) {
+            JSONArray da = values.getJSONArray(0);
+            for (int i = 0; i < da.size(); i++) {
+                Long id = columnNames.getLong(i);
+                String v = da.getStr(i);
+                if (StringUtils.isNotEmpty(v)) {
+                    BigDecimal value = new BigDecimal(v);
+                    TwinCalcHourEnergy calc = new TwinCalcHourEnergy();
+                    TwinWorkshopEnergy energy = energyMap.get(id);
+                    value = value.multiply(energy.getCoefficient());
+                    calc.setEnergyId(id);
+                    calc.setDataDate(date);
+                    calc.setHour(period);
+                    calc.setDataValue(value);
+                    calcHourEnergyList.add(calc);
+                }
             }
-            JSONArray first = values.getJSONArray(0);
-            JSONArray last = values.getJSONArray(values.size() - 1);
-            int res = last.getInt(0) - first.getInt(0);
-            TwinCalcHourEnergy calcEnergy = new TwinCalcHourEnergy();
-            calcEnergy.setEnergyId(energy.getEnergyId());
-            BigDecimal dataV = BigDecimal.valueOf(res).multiply(energy.getCoefficient());
-            calcEnergy.setDataValue(dataV);
-            calcEnergy.setDataDate(date);
-            calcEnergy.setHour(period);
-            list.add(calcEnergy);
         }
-        if (list.size() > 0) {
-            try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+            if (calcHourEnergyList.size() > 0) {
                 TwinCalcHourEnergyMapper mapper = sqlSession.getMapper(TwinCalcHourEnergyMapper.class);
-                list.forEach(mapper::insertTwinCalcHourEnergy);
+                calcHourEnergyList.forEach(mapper::insertTwinCalcHourEnergy);
                 sqlSession.commit();
             }
         }
@@ -157,9 +179,6 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
     @Override
     public void calcLastEnergy() {
         LocalDateTime ldt = Tools.currWholeTime();
-        //上一个小时
-        ldt = ldt.minusHours(1);
-        //这里不需要向前取一秒了
         LocalDateTime start = ldt;
         LocalDateTime end = ldt.plusHours(1);
         calcEnergy(start, end);
@@ -180,9 +199,42 @@ public class TwinCalcHourEnergyServiceImpl implements ITwinCalcHourEnergyService
         Date eTime = pair.getValue();
         TwinCalcHourEnergy hour = new TwinCalcHourEnergy();
         Map<String, Object> params = new HashMap<>(16);
-        params.put("sTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,sTime));
+        params.put("sTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, sTime));
         params.put("eTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, eTime));
         hour.setParams(params);
         return selectTwinCalcHourEnergyList(hour);
     }
+
+    /**
+     * 从数据库最后一个时间段统计至上一个时段
+     */
+    @Override
+    public void calc2Curr() {
+        TwinCalcHourEnergy lastHour = lastRecord();
+        LocalDate localDate = DateUtils.toLocalDate(lastHour.getDataDate());
+        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(lastHour.getHour() + 1);
+        LocalDateTime end = start.plusHours(1);
+
+        LocalDateTime stop = Tools.currWholeTime();
+        while (!end.isAfter(stop)) {
+            calcEnergy(start, end);
+            log.info("补录数据===========start:{},end:{},stop:{}", start, end, stop);
+            if (end.getHour() == 7) {
+                //跨天,统计前一天的总数据
+                log.info("----------------{},{}", start, end);
+                calcService.calc(start.toLocalDate().minusDays(1));
+            }
+            start = end;
+            end = end.plusHours(1);
+        }
+    }
+
+    /**
+     * 获取最后一条记录
+     *
+     * @return 结果
+     */
+    private TwinCalcHourEnergy lastRecord() {
+       return twinCalcHourEnergyMapper.lastRecord();
+    }
 }

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

@@ -6,17 +6,21 @@ import com.jjt.biz.domain.TwinDeviceYhj;
 import com.jjt.biz.service.ITwinDeviceYhjService;
 import com.jjt.calc.domain.TwinCalcHourYhj;
 import com.jjt.calc.mapper.TwinCalcHourYhjMapper;
+import com.jjt.calc.service.ITwinCalcDayYhjService;
 import com.jjt.calc.service.ITwinCalcHourYhjService;
 import com.jjt.common.utils.DateUtils;
 import com.jjt.utils.IotService;
 import com.jjt.utils.Tools;
+import lombok.extern.slf4j.Slf4j;
 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.LocalTime;
 import java.time.ZoneOffset;
 import java.util.*;
 
@@ -27,6 +31,7 @@ import java.util.*;
  * @date 2025-03-06
  */
 @Service
+@Slf4j
 public class TwinCalcHourYhjServiceImpl implements ITwinCalcHourYhjService {
     @Resource
     private TwinCalcHourYhjMapper twinCalcHourYhjMapper;
@@ -36,6 +41,8 @@ public class TwinCalcHourYhjServiceImpl implements ITwinCalcHourYhjService {
     private SqlSessionFactory factory;
     @Resource
     private ITwinDeviceYhjService yhjService;
+    @Resource
+    private ITwinCalcDayYhjService dayYhjService;
 
     /**
      * 查询印花机1小时统计数据
@@ -213,6 +220,40 @@ public class TwinCalcHourYhjServiceImpl implements ITwinCalcHourYhjService {
     }
 
     /**
+     * 查询数据库最后一条记录
+     *
+     * @return 结果
+     */
+    @Override
+    public TwinCalcHourYhj lastRecord() {
+        return twinCalcHourYhjMapper.lastRecord();
+    }
+
+    /**
+     * 补录数据至当前时间
+     */
+    @Override
+    public void calc2Curr() {
+        TwinCalcHourYhj last = lastRecord();
+        LocalDate localDate = DateUtils.toLocalDate(last.getDataDate());
+        LocalDateTime start = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(last.getHour() + 1);
+        LocalDateTime end = start.plusHours(1);
+
+        LocalDateTime stop = Tools.currWholeTime();
+        while (!end.isAfter(stop)) {
+            calc(start, end);
+            log.info("补录数据===========start:{},end:{},stop:{}", start, end, stop);
+            if (end.getHour() == 7) {
+                //跨天,统计前一天的总数据
+                log.info("----------------{},{}", start, end);
+                dayYhjService.day(start.toLocalDate().minusDays(1));
+            }
+            start = end;
+            end = end.plusHours(1);
+        }
+    }
+
+    /**
      * 按时间和小时删除数据
      *
      * @param date 时间

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

@@ -1,7 +1,6 @@
 package com.jjt.task;
 
 import com.jjt.calc.service.ITwinCalcHourEnergyService;
-import com.jjt.common.utils.DateUtils;
 import com.jjt.ws.service.ITwinWorkshopCalcService;
 import org.springframework.stereotype.Component;
 
@@ -30,7 +29,7 @@ public class EnergyTask {
      */
     public void calc() {
         LocalDate localDate = LocalDate.now().minusDays(1);
-        wsCalcService.calc(DateUtils.toDate(localDate));
+        wsCalcService.calc(localDate);
     }
 
 }

+ 11 - 1
jjt-biz/src/main/java/com/jjt/utils/InitService.java

@@ -1,7 +1,9 @@
 package com.jjt.utils;
 
 import com.jjt.biz.service.IApiService;
+import com.jjt.calc.service.ITwinCalcHourEnergyService;
 import com.jjt.calc.service.ITwinCalcHourService;
+import com.jjt.calc.service.ITwinCalcHourYhjService;
 import com.jjt.order.service.ITwinOrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.env.Environment;
@@ -29,6 +31,10 @@ public class InitService {
     private IotService iotService;
     @Resource
     private ITwinOrderService orderService;
+    @Resource
+    private ITwinCalcHourYhjService twinCalcHourYhjService;
+    @Resource
+    private ITwinCalcHourEnergyService twinCalcHourEnergyService;
 
     @PostConstruct
     public void init() {
@@ -43,8 +49,12 @@ public class InitService {
         if (prod) {
             //设置iotToken
             iotService.setToken();
-            //补录数据至当前时间
+            //补录印花线数据
+            twinCalcHourYhjService.calc2Curr();
+            //补录经编车间数据至当前时间
             twinCalcHourService.calc2Curr();
+            //补录能耗数据至当前时间
+            twinCalcHourEnergyService.calc2Curr();
             //当前数据
             apiService.curr();
             //当天统计

+ 31 - 13
jjt-biz/src/main/java/com/jjt/ws/domain/TwinWorkshopCalc.java

@@ -1,16 +1,15 @@
 package com.jjt.ws.domain;
 
-import java.math.BigDecimal;
-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.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 能源统计对象 TWIN_WORKSHOP_CALC
@@ -20,33 +19,52 @@ import com.jjt.common.core.domain.BaseEntity;
  */
 @ApiModel(value = "TwinWorkshopCalc", description = "能源统计")
 @Data
-public class TwinWorkshopCalc extends BaseEntity{
+public class TwinWorkshopCalc extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 统计ID */
+    /**
+     * 统计ID
+     */
     @ApiModelProperty("统计ID")
     @TableId
     private Long calcId;
 
-    /** 日期 */
+    /**
+     * 日期
+     */
     @ApiModelProperty("日期")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date dataDate;
 
-    /** 车间ID */
+    /**
+     * 车间ID
+     */
     @ApiModelProperty("车间ID")
     @Excel(name = "车间ID")
     private Long wsId;
 
-    /** A班统计 */
+    @ApiModelProperty("总计")
+    @Excel(name = "总计")
+    private BigDecimal totalValue;
+    /**
+     * A班统计
+     */
     @ApiModelProperty("A班统计")
     @Excel(name = "A班统计")
     private BigDecimal aValue;
 
-    /** B班统计 */
+    /**
+     * B班统计
+     */
     @ApiModelProperty("B班统计")
     @Excel(name = "B班统计")
     private BigDecimal bValue;
 
+    public void setValue(BigDecimal aValue, BigDecimal bValue) {
+        this.aValue = aValue == null ? BigDecimal.ZERO : aValue;
+        this.bValue = bValue == null ? BigDecimal.ZERO : bValue;
+        this.totalValue = this.aValue.add(this.bValue);
+    }
+
 }

+ 4 - 2
jjt-biz/src/main/java/com/jjt/ws/service/ITwinWorkshopCalcService.java

@@ -2,6 +2,7 @@ package com.jjt.ws.service;
 
 import com.jjt.ws.domain.TwinWorkshopCalc;
 
+import java.time.LocalDate;
 import java.util.Date;
 import java.util.List;
 
@@ -63,10 +64,11 @@ public interface ITwinWorkshopCalcService {
     /**
      * 能源日统计
      *
-     * @param date 日期
+     * @param localDate 日期
      * @return 结果
      */
-    int calc(Date date);
+    int calc(LocalDate localDate);
+
     /**
      * 根据日期查询
      *

+ 8 - 5
jjt-biz/src/main/java/com/jjt/ws/service/impl/TwinWorkshopCalcServiceImpl.java

@@ -2,6 +2,7 @@ package com.jjt.ws.service.impl;
 
 import com.jjt.calc.domain.TwinCalcHourEnergy;
 import com.jjt.calc.service.ITwinCalcHourEnergyService;
+import com.jjt.common.utils.DateUtils;
 import com.jjt.ws.domain.TwinWorkshop;
 import com.jjt.ws.domain.TwinWorkshopCalc;
 import com.jjt.ws.domain.TwinWorkshopEnergy;
@@ -15,6 +16,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -104,15 +106,17 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
     /**
      * 能源日统计
      *
-     * @param date 日期
+     * @param localDate 日期
      * @return 结果
      */
     @Override
-    public int calc(Date date) {
+    public int calc(LocalDate localDate) {
+        Date date = DateUtils.toDate(localDate);
         //先删除
         twinWorkshopCalcMapper.deleteTwinWorkshopCalcByDate(date);
         List<TwinWorkshopCalc> calcList = new ArrayList<>();
         List<TwinWorkshop> wsList = wsService.selectTwinWorkshopList(new TwinWorkshop());
+        //存储能源ID和车间ID关系
         Map<Long, Long> wsMap = new HashMap<>(16);
         wsList.forEach(ws -> {
             List<TwinWorkshopEnergy> list = wsService.selectTwinWorkshopByWsId(ws.getWsId()).getTwinWorkshopEnergyList();
@@ -125,15 +129,14 @@ public class TwinWorkshopCalcServiceImpl implements ITwinWorkshopCalcService {
             obj.setWsId(wsMap.get(obj.getEnergyId()));
         });
         //先按ID分组
-        Map<Long, List<TwinCalcHourEnergy>> calcMap = energyList.stream().collect(Collectors.groupingBy(o -> o.getWsId(), LinkedHashMap::new, Collectors.toList()));
+        Map<Long, List<TwinCalcHourEnergy>> calcMap = energyList.stream().collect(Collectors.groupingBy(TwinCalcHourEnergy::getWsId, LinkedHashMap::new, Collectors.toList()));
         for (Long wsId : calcMap.keySet()) {
             //按班组统计
             Map<String, BigDecimal> resultMap = calcMap.get(wsId).stream().collect(Collectors.groupingBy(TwinCalcHourEnergy::getTeam, Collectors.reducing(BigDecimal.ZERO, TwinCalcHourEnergy::getDataValue, BigDecimal::add)));
             TwinWorkshopCalc calc = new TwinWorkshopCalc();
             calc.setWsId(wsId);
             calc.setDataDate(date);
-            calc.setAValue(resultMap.get("A"));
-            calc.setBValue(resultMap.get("B"));
+            calc.setValue(resultMap.get("A"), resultMap.get("B"));
             calcList.add(calc);
 
         }

+ 3 - 0
jjt-biz/src/main/resources/mapper/calc/TwinCalcHourEnergyMapper.xml

@@ -35,6 +35,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectTwinCalcHourEnergyVo"/>
         where AUTO_ID = #{autoId}
     </select>
+    <select id="lastRecord" resultType="com.jjt.calc.domain.TwinCalcHourEnergy">
+        select top 1 * from TWIN_CALC_HOUR_ENERGY order by id desc
+    </select>
 
     <insert id="insertTwinCalcHourEnergy" parameterType="TwinCalcHourEnergy">
         insert into TWIN_CALC_HOUR_ENERGY

+ 3 - 0
jjt-biz/src/main/resources/mapper/calc/TwinCalcHourYhjMapper.xml

@@ -40,6 +40,9 @@
         <include refid="selectTwinCalcHourYhjVo"/>
         where ID = #{id}
     </select>
+    <select id="lastRecord" resultType="com.jjt.calc.domain.TwinCalcHourYhj">
+        select top 1 * from TWIN_CALC_HOUR_YHJ order by id desc
+    </select>
 
     <insert id="insertTwinCalcHourYhj" parameterType="TwinCalcHourYhj">
         insert into TWIN_CALC_HOUR_YHJ

+ 5 - 1
jjt-biz/src/main/resources/mapper/ws/TwinWorkshopCalcMapper.xml

@@ -8,12 +8,13 @@
         <result property="calcId" column="CALC_ID"/>
         <result property="dataDate" column="DATA_DATE"/>
         <result property="wsId" column="WS_ID"/>
+        <result property="totalValue" column="TOTAL_VALUE"/>
         <result property="aValue" column="A_VALUE"/>
         <result property="bValue" column="B_VALUE"/>
     </resultMap>
 
     <sql id="selectTwinWorkshopCalcVo">
-        select CALC_ID, DATA_DATE, WS_ID, A_VALUE, B_VALUE
+        select CALC_ID, DATA_DATE, WS_ID, TOTAL_VALUE, A_VALUE, B_VALUE
         from TWIN_WORKSHOP_CALC
     </sql>
 
@@ -42,12 +43,14 @@
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="dataDate != null">DATA_DATE,</if>
             <if test="wsId != null">WS_ID,</if>
+            <if test="totalValue != null">TOTAL_VALUE,</if>
             <if test="aValue != null">A_VALUE,</if>
             <if test="bValue != null">B_VALUE,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="dataDate != null">#{dataDate},</if>
             <if test="wsId != null">#{wsId},</if>
+            <if test="totalValue != null">#{totalValue},</if>
             <if test="aValue != null">#{aValue},</if>
             <if test="bValue != null">#{bValue},</if>
         </trim>
@@ -58,6 +61,7 @@
         <trim prefix="SET" suffixOverrides=",">
             <if test="dataDate != null">DATA_DATE = #{dataDate},</if>
             <if test="wsId != null">WS_ID = #{wsId},</if>
+            <if test="totalValue != null">TOTAL_VALUE=#{totalValue},</if>
             <if test="aValue != null">A_VALUE = #{aValue},</if>
             <if test="bValue != null">B_VALUE = #{bValue},</if>
         </trim>