Răsfoiți Sursa

完成日统计

wukai 1 an în urmă
părinte
comite
123e3cedec
19 a modificat fișierele cu 544 adăugiri și 397 ștergeri
  1. 13 10
      ruoyi-admin/src/main/java/com/ruoyi/biz/controller/ApiController.java
  2. 98 267
      ruoyi-admin/src/main/java/com/ruoyi/biz/domain/TwinCalcDay.java
  3. 10 0
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/ITwinCalcAlarmsService.java
  4. 20 10
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/ITwinCalcHourService.java
  5. 10 0
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/ITwinCalcStopService.java
  6. 27 17
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/ApiServiceImpl.java
  7. 2 0
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TaskServiceImpl.java
  8. 18 4
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcAlarmsServiceImpl.java
  9. 128 10
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcDayServiceImpl.java
  10. 39 26
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcHourServiceImpl.java
  11. 18 4
      ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcStopServiceImpl.java
  12. 59 8
      ruoyi-admin/src/main/java/com/ruoyi/biz/tools/Tools.java
  13. 2 2
      ruoyi-admin/src/main/resources/application.yml
  14. 3 0
      ruoyi-admin/src/main/resources/mapper/biz/TwinCalcAlarmsMapper.xml
  15. 6 1
      ruoyi-admin/src/main/resources/mapper/biz/TwinCalcDayMapper.xml
  16. 40 33
      ruoyi-admin/src/main/resources/mapper/biz/TwinCalcHourMapper.xml
  17. 3 0
      ruoyi-admin/src/main/resources/mapper/biz/TwinCalcStopMapper.xml
  18. 36 0
      ruoyi-admin/src/test/java/com/jjt/CalcDayTest.java
  19. 12 5
      ruoyi-admin/src/test/java/com/jjt/Test.java

+ 13 - 10
ruoyi-admin/src/main/java/com/ruoyi/biz/controller/ApiController.java

@@ -72,8 +72,11 @@ public class ApiController extends BaseController {
     @GetMapping("/device/online")
     @CrossOrigin(origins = "*")
     public R<List<String>> online() {
+        TwinDevice searchDevice = new TwinDevice();
+        searchDevice.setOnline("1");
+        List<TwinDevice> list = deviceService.selectTwinDeviceList(searchDevice);
         List<String> devices = new ArrayList<>();
-        deviceService.selectTwinDeviceList(new TwinDevice()).forEach(d -> devices.add(d.getDeviceCode()));
+        list.forEach(d -> devices.add(d.getDeviceCode()));
         return R.ok(devices);
     }
 
@@ -122,15 +125,15 @@ public class ApiController extends BaseController {
             throw new RuntimeException(e);
         }
         if (week != null) {
-            List<TwinCalc2hr> list = calc2hrService.selectWeekData(info);
-            List<Map<String, Object>> alarms = new ArrayList<>();
-            list.forEach(calc2hr -> {
-                Map<String, Object> temp = new HashMap<>(16);
-                temp.put("time", DateUtils.parseDateToStr(calc2hr.getDataDate()));
-                temp.put("value", calc2hr.getAlarm());
-                alarms.add(temp);
-            });
-            result.put("alarms", alarms);
+//            List<TwinCalc2hr> list = calc2hrService.selectWeekData(info);
+//            List<Map<String, Object>> alarms = new ArrayList<>();
+//            list.forEach(calc2hr -> {
+//                Map<String, Object> temp = new HashMap<>(16);
+//                temp.put("time", DateUtils.parseDateToStr(calc2hr.getDataDate()));
+//                temp.put("value", calc2hr.getAlarm());
+//                alarms.add(temp);
+//            });
+//            result.put("alarms", alarms);
         }
         return R.ok(result);
     }

+ 98 - 267
ruoyi-admin/src/main/java/com/ruoyi/biz/domain/TwinCalcDay.java

@@ -7,11 +7,13 @@ import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 日统计数据对象 twin_calc_day
@@ -20,7 +22,36 @@ import java.util.Date;
  * @date 2024-05-22
  */
 @ApiModel(value = "ITwinCalcDay", description = "日统计数据")
+@Data
+@NoArgsConstructor
 public class TwinCalcDay extends BaseEntity {
+    public TwinCalcDay(Date date) {
+        this.time = date;
+        this.length = BigDecimal.ZERO;
+        this.weight = BigDecimal.ZERO;
+        this.kwh = BigDecimal.ZERO;
+
+        this.lengthA = BigDecimal.ZERO;
+        this.weightA = BigDecimal.ZERO;
+        this.kwhA = BigDecimal.ZERO;
+
+        this.lengthB = BigDecimal.ZERO;
+        this.weightB = BigDecimal.ZERO;
+        this.kwhB = BigDecimal.ZERO;
+
+        this.alarm = 0L;
+        this.openTimeA = BigDecimal.ZERO;
+        this.openTimeB = BigDecimal.ZERO;
+        this.closeTimeA = BigDecimal.ZERO;
+        this.closeTimeB = BigDecimal.ZERO;
+        this.stop1A = 0L;
+        this.stop1B = 0L;
+        this.stop2A = 0L;
+        this.stop2B = 0L;
+        this.stop3A = 0L;
+        this.stop3B = 0L;
+    }
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -35,7 +66,12 @@ public class TwinCalcDay extends BaseEntity {
     @Excel(name = "时间", width = 30, dateFormat = "yyyy-MM-dd")
     @ApiModelProperty("时间")
     private Date time;
-
+    /**
+     * 设备ID
+     */
+    @Excel(name = "设备ID")
+    @ApiModelProperty("设备ID")
+    private Long deviceId;
     /**
      * 总米长
      */
@@ -244,271 +280,66 @@ public class TwinCalcDay extends BaseEntity {
         this.efficiency = Tools.calcPercent(totalOpenTime, totalCloseTime);
     }
 
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setTime(Date time) {
-        this.time = time;
-    }
-
-    public Date getTime() {
-        return time;
-    }
-
-    public void setLength(BigDecimal length) {
-        this.length = length;
-    }
-
-    public BigDecimal getLength() {
-        return length;
-    }
-
-    public void setWeight(BigDecimal weight) {
-        this.weight = weight;
-    }
-
-    public BigDecimal getWeight() {
-        return weight;
-    }
-
-    public void setEfficiency(BigDecimal efficiency) {
-        this.efficiency = efficiency;
-    }
-
-    public BigDecimal getEfficiency() {
-        return efficiency;
-    }
-
-    public void setKwh(BigDecimal kwh) {
-        this.kwh = kwh;
-    }
-
-    public BigDecimal getKwh() {
-        return kwh;
-    }
-
-    public void setAlarm(Long alarm) {
-        this.alarm = alarm;
-    }
-
-    public Long getAlarm() {
-        return alarm;
-    }
-
-    public void setLengthA(BigDecimal lengthA) {
-        this.lengthA = lengthA;
-    }
-
-    public BigDecimal getLengthA() {
-        return lengthA;
-    }
-
-    public void setWeightA(BigDecimal weightA) {
-        this.weightA = weightA;
-    }
-
-    public BigDecimal getWeightA() {
-        return weightA;
-    }
-
-    public void setEfficiencyA(BigDecimal efficiencyA) {
-        this.efficiencyA = efficiencyA;
-    }
-
-    public BigDecimal getEfficiencyA() {
-        return efficiencyA;
-    }
-
-    public void setOpenTimeA(BigDecimal openTimeA) {
-        this.openTimeA = openTimeA;
-    }
-
-    public BigDecimal getOpenTimeA() {
-        return openTimeA;
-    }
-
-    public void setCloseTimeA(BigDecimal closeTimeA) {
-        this.closeTimeA = closeTimeA;
-    }
-
-    public BigDecimal getCloseTimeA() {
-        return closeTimeA;
-    }
-
-    public void setKwhA(BigDecimal kwhA) {
-        this.kwhA = kwhA;
-    }
-
-    public BigDecimal getKwhA() {
-        return kwhA;
-    }
-
-    public void setStop1A(Long stop1A) {
-        this.stop1A = stop1A;
-    }
-
-    public Long getStop1A() {
-        return stop1A;
-    }
-
-    public void setStop2A(Long stop2A) {
-        this.stop2A = stop2A;
-    }
-
-    public Long getStop2A() {
-        return stop2A;
-    }
-
-    public void setStop3A(Long stop3A) {
-        this.stop3A = stop3A;
-    }
-
-    public Long getStop3A() {
-        return stop3A;
-    }
-
-    public void setLengthB(BigDecimal lengthB) {
-        this.lengthB = lengthB;
-    }
-
-    public BigDecimal getLengthB() {
-        return lengthB;
-    }
-
-    public void setWeightB(BigDecimal weightB) {
-        this.weightB = weightB;
-    }
-
-    public BigDecimal getWeightB() {
-        return weightB;
-    }
-
-    public void setEfficiencyB(BigDecimal efficiencyB) {
-        this.efficiencyB = efficiencyB;
-    }
-
-    public BigDecimal getEfficiencyB() {
-        return efficiencyB;
-    }
-
-    public void setOpenTimeB(BigDecimal openTimeB) {
-        this.openTimeB = openTimeB;
-    }
-
-    public BigDecimal getOpenTimeB() {
-        return openTimeB;
-    }
-
-    public void setCloseTimeB(BigDecimal closeTimeB) {
-        this.closeTimeB = closeTimeB;
-    }
-
-    public BigDecimal getCloseTimeB() {
-        return closeTimeB;
-    }
-
-    public void setKwhB(BigDecimal kwhB) {
-        this.kwhB = kwhB;
-    }
-
-    public BigDecimal getKwhB() {
-        return kwhB;
-    }
-
-    public void setStop1B(Long stop1B) {
-        this.stop1B = stop1B;
-    }
-
-    public Long getStop1B() {
-        return stop1B;
-    }
-
-    public void setStop2B(Long stop2B) {
-        this.stop2B = stop2B;
-    }
-
-    public Long getStop2B() {
-        return stop2B;
-    }
-
-    public void setStop3B(Long stop3B) {
-        this.stop3B = stop3B;
-    }
-
-    public Long getStop3B() {
-        return stop3B;
-    }
-
-    public void setCreatedBy(String createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setUpdatedBy(String updatedBy) {
-        this.updatedBy = updatedBy;
-    }
-
-    public String getUpdatedBy() {
-        return updatedBy;
-    }
-
-    public void setUpdatedTime(Date updatedTime) {
-        this.updatedTime = updatedTime;
-    }
-
-    public Date getUpdatedTime() {
-        return updatedTime;
+    /**
+     * 计算产量数据
+     *
+     * @param hours 1小时统计数据
+     */
+    public void calcHours(List<TwinCalcHour> hours) {
+        hours.forEach(hour -> {
+            this.length = length.add(hour.getLength());
+            this.weight = weight.add(hour.getWeight());
+            this.kwh = kwh.add(hour.getKwh());
+
+            if (hour.getHour() >= 7 && hour.getHour() < 19) {
+                //A班
+                this.lengthA = lengthA.add(hour.getLength());
+                this.weightA = weightA.add(hour.getWeight());
+                this.kwhA = kwhA.add(hour.getKwh());
+            } else {
+                //B班
+                this.lengthB = lengthB.add(hour.getLength());
+                this.weightB = weightB.add(hour.getWeight());
+                this.kwhB = kwhB.add(hour.getKwh());
+            }
+        });
     }
 
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
-                .append("id", getId())
-                .append("time", getTime())
-                .append("length", getLength())
-                .append("weight", getWeight())
-                .append("efficiency", getEfficiency())
-                .append("kwh", getKwh())
-                .append("alarm", getAlarm())
-                .append("lengthA", getLengthA())
-                .append("weightA", getWeightA())
-                .append("efficiencyA", getEfficiencyA())
-                .append("openTimeA", getOpenTimeA())
-                .append("closeTimeA", getCloseTimeA())
-                .append("kwhA", getKwhA())
-                .append("stop1A", getStop1A())
-                .append("stop2A", getStop2A())
-                .append("stop3A", getStop3A())
-                .append("lengthB", getLengthB())
-                .append("weightB", getWeightB())
-                .append("efficiencyB", getEfficiencyB())
-                .append("openTimeB", getOpenTimeB())
-                .append("closeTimeB", getCloseTimeB())
-                .append("kwhB", getKwhB())
-                .append("stop1B", getStop1B())
-                .append("stop2B", getStop2B())
-                .append("stop3B", getStop3B())
-                .append("createdBy", getCreatedBy())
-                .append("createdTime", getCreatedTime())
-                .append("updatedBy", getUpdatedBy())
-                .append("updatedTime", getUpdatedTime())
-                .append("remark", getRemark())
-                .toString();
+    /**
+     * 计算天统计数据
+     *
+     * @param days 天数据
+     */
+    public void calcDays(List<TwinCalcDay> days) {
+        days.forEach(day -> {
+            this.weight = weight.add(day.getWeight());
+            this.weightA = weightA.add(day.getWeightA());
+            this.weightB = weightA.add(day.getWeightB());
+
+            this.kwh = kwh.add(day.getKwh());
+            this.kwhA = kwhA.add(day.getKwh());
+            this.kwhB = kwhB.add(day.getKwh());
+
+            this.stop1A += day.getStop1A();
+            this.stop1B += day.getStop1B();
+            this.stop2A += day.getStop2A();
+            this.stop2B += day.getStop2B();
+            this.stop3A += day.getStop3A();
+            this.stop3B += day.getStop3B();
+
+            this.alarm += day.getAlarm();
+
+            this.closeTimeA = closeTimeA.add(day.getCloseTimeA());
+            this.closeTimeB = closeTimeB.add(day.getCloseTimeB());
+            this.openTimeA = openTimeA.add(day.getOpenTimeA());
+            this.openTimeB = openTimeB.add(day.getOpenTimeB());
+        });
+        BigDecimal teamTimeA = this.openTimeA.add(this.closeTimeA);
+        BigDecimal teamTimeB = this.openTimeB.add(this.closeTimeB);
+        BigDecimal totalTeamTime = teamTimeA.add(teamTimeB);
+        BigDecimal totalOpenTime = this.openTimeA.add(openTimeB);
+        this.efficiencyA = openTimeA.divide(teamTimeA, 2, RoundingMode.HALF_UP);
+        this.efficiencyB = openTimeB.divide(teamTimeB, 2, RoundingMode.HALF_UP);
+        this.efficiency = totalOpenTime.divide(totalTeamTime, 2, RoundingMode.HALF_UP);
     }
 }

+ 10 - 0
ruoyi-admin/src/main/java/com/ruoyi/biz/service/ITwinCalcAlarmsService.java

@@ -4,6 +4,7 @@ import com.ruoyi.biz.domain.TwinCalcAlarms;
 import com.ruoyi.biz.domain.TwinDevice;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -68,4 +69,13 @@ public interface ITwinCalcAlarmsService {
      * @param deviceList 设备列表
      */
     void process(LocalDateTime startTime, List<TwinDevice> deviceList);
+
+    /**
+     * 按开始和结束时间查询数据
+     *
+     * @param sTime 开始时间
+     * @param eTime 结束时间
+     * @return 查询列表
+     */
+    List<TwinCalcAlarms> selectTwinCalcAlarmsListByDate(Date sTime, Date eTime);
 }

+ 20 - 10
ruoyi-admin/src/main/java/com/ruoyi/biz/service/ITwinCalcHourService.java

@@ -1,19 +1,20 @@
 package com.ruoyi.biz.service;
 
-import java.util.List;
 import com.ruoyi.biz.domain.TwinCalcHour;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * 1小时统计数据Service接口
- * 
+ *
  * @author ruoyi
  * @date 2024-06-28
  */
-public interface ITwinCalcHourService 
-{
+public interface ITwinCalcHourService {
     /**
      * 查询1小时统计数据
-     * 
+     *
      * @param id 1小时统计数据主键
      * @return 1小时统计数据
      */
@@ -21,7 +22,7 @@ public interface ITwinCalcHourService
 
     /**
      * 查询1小时统计数据列表
-     * 
+     *
      * @param twinCalcHour 1小时统计数据
      * @return 1小时统计数据集合
      */
@@ -29,7 +30,7 @@ public interface ITwinCalcHourService
 
     /**
      * 新增1小时统计数据
-     * 
+     *
      * @param twinCalcHour 1小时统计数据
      * @return 结果
      */
@@ -37,7 +38,7 @@ public interface ITwinCalcHourService
 
     /**
      * 修改1小时统计数据
-     * 
+     *
      * @param twinCalcHour 1小时统计数据
      * @return 结果
      */
@@ -45,7 +46,7 @@ public interface ITwinCalcHourService
 
     /**
      * 批量删除1小时统计数据
-     * 
+     *
      * @param ids 需要删除的1小时统计数据主键集合
      * @return 结果
      */
@@ -53,9 +54,18 @@ public interface ITwinCalcHourService
 
     /**
      * 删除1小时统计数据信息
-     * 
+     *
      * @param id 1小时统计数据主键
      * @return 结果
      */
     public int deleteTwinCalcHourById(Long id);
+
+    /**
+     * 按开始和结束时间查询数据
+     *
+     * @param sTime 开始时间
+     * @param eTime 结束时间
+     * @return 查询列表
+     */
+    List<TwinCalcHour> selectTwinCalcHourListByDate(Date sTime, Date eTime);
 }

+ 10 - 0
ruoyi-admin/src/main/java/com/ruoyi/biz/service/ITwinCalcStopService.java

@@ -4,6 +4,7 @@ import com.ruoyi.biz.domain.TwinCalcStop;
 import com.ruoyi.biz.domain.TwinDevice;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -68,4 +69,13 @@ public interface ITwinCalcStopService {
      * @param deviceList 设备列表
      */
     void process(LocalDateTime startTime, List<TwinDevice> deviceList);
+
+    /**
+     * 按开始和结束时间查询数据
+     *
+     * @param sTime 开始时间
+     * @param eTime 结束时间
+     * @return 查询列表
+     */
+    List<TwinCalcStop> selectTwinCalcStopListByDate(Date sTime, Date eTime);
 }

+ 27 - 17
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/ApiServiceImpl.java

@@ -55,26 +55,36 @@ public class ApiServiceImpl implements IApiService {
     @Override
 
     public void indexCalc() {
-        TwinCalc2hr calc2hr = calc2hrService.calcToday();
+        List<WeekData> weekDataList = new ArrayList<>();
         IndexData indexData = new IndexData();
-        IndexEfficiency efficiency = new IndexEfficiency(calc2hr);
+        IndexEfficiency efficiency = new IndexEfficiency();
+        efficiency.setAEfficiency(52.7f);
+        efficiency.setBEfficiency(52.7f);
+        efficiency.setTotalLength(1f);
+        efficiency.setALength(1f);
+        efficiency.setBLength(1f);
+        efficiency.setTotalWeight(1f);
+        efficiency.setAWeight(1f);
+        efficiency.setBWeight(1f);
+        efficiency.setATime(1f);
+        efficiency.setBTime(1f);
         indexData.setEfficiency(efficiency);
+
         /*
-         *获取前面6天的数据,加上当天数据
+         *获取前面7天的数据
          */
-        LocalDate localDate = LocalDate.now().minusDays(6);
+        LocalDate localDate = LocalDate.now().minusDays(7);
         Date date = Date.from(localDate.atStartOfDay(ZoneOffset.of("+8")).toInstant());
         List<TwinCalcDay> list = twinCalcDayService.selectTwinCalcDayListByTime(date);
-        TwinCalcDay today = new TwinCalcDay();
-        today.convert(calc2hr);
-        list.add(today);
-        List<WeekData> weekDataList = new ArrayList<>();
-        list.forEach(day -> {
+        Map<Date, List<TwinCalcDay>> stopDeviceGroup = list.stream().collect(Collectors.groupingBy(TwinCalcDay::getTime, LinkedHashMap::new, Collectors.toList()));
+        for (Map.Entry<Date, List<TwinCalcDay>> entry : stopDeviceGroup.entrySet()) {
+            TwinCalcDay day = new TwinCalcDay(entry.getKey());
+            List<TwinCalcDay> days = entry.getValue();
+            day.calcDays(days);
             WeekData weekData = new WeekData();
             weekData.convert(day);
             weekDataList.add(weekData);
-
-        });
+        }
         indexData.setWeekData(weekDataList);
         CacheUtils.put(Constants.IOT_TOKEN, Constants.INDEX_CALC, indexData);
     }
@@ -93,7 +103,9 @@ public class ApiServiceImpl implements IApiService {
         List<FormulaDetail> formulaDetail = new ArrayList<>();
         int stop1 = 0, stop2 = 0, stop6 = 0, stop8 = 0;
         iotService.getToken();
-        List<TwinDevice> list = deviceService.selectTwinDeviceList(new TwinDevice());
+        TwinDevice searchDevice = new TwinDevice();
+        searchDevice.setOnline("1");
+        List<TwinDevice> list = deviceService.selectTwinDeviceList(searchDevice);
         Map<String, Long> panMap = new HashMap<>(16);
         panHeadInfoService.selectTwinPanHeadInfoList(new TwinPanHeadInfo()).forEach(pan -> {
             String key = pan.getDeviceId() + "_" + pan.getPhNum();
@@ -190,9 +202,6 @@ public class ApiServiceImpl implements IApiService {
                     }
 
                     panPercent[i] = BigDecimal.valueOf(curr[i] * 100).divide(BigDecimal.valueOf(max[i]), 2, RoundingMode.HALF_UP).floatValue();
-//                    if (panPercent[i] < 20) {
-//                        stop8++;
-//                    }
                     if (panPercent[i] > 100) {
                         panPercent[i] = 100;
                     }
@@ -239,11 +248,12 @@ public class ApiServiceImpl implements IApiService {
 
     @PostConstruct
     public void init() {
+        String flag = "false";
         String bl = env.getProperty("data.bl");
-        if (bl != null && "false".equals(bl)) {
+        if (bl != null && flag.equals(bl)) {
             return;
         }
-        taskService.calc2Curr();
+//        taskService.calc2Curr();
         indexCalc();
         indexAlarms();
     }

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TaskServiceImpl.java

@@ -200,6 +200,8 @@ public class TaskServiceImpl implements ITaskService {
         dbProcess(endTime, calcHours, stopList, alarmsList, panList);
         stopService.process(ldt, list);
         alarmsService.process(ldt, list);
+//        Date s_time = Date.from(ldt.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
+//        Date e_time=Date.
         log.info("总共消耗:{}ms", d.getTime() - s.getTime());
 
     }

+ 18 - 4
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcAlarmsServiceImpl.java

@@ -14,10 +14,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -182,4 +179,21 @@ public class TwinCalcAlarmsServiceImpl implements ITwinCalcAlarmsService {
             });
         });
     }
+
+    /**
+     * 按开始和结束时间查询数据
+     *
+     * @param sTime 开始时间
+     * @param eTime 结束时间
+     * @return 查询列表
+     */
+    @Override
+    public List<TwinCalcAlarms> selectTwinCalcAlarmsListByDate(Date sTime, Date eTime) {
+        TwinCalcAlarms alarms = new TwinCalcAlarms();
+        Map<String, Object> params = new HashMap<>(16);
+        params.put("sTime", sTime);
+        params.put("eTime", eTime);
+        alarms.setParams(params);
+        return selectTwinCalcAlarmsList(alarms);
+    }
 }

+ 128 - 10
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcDayServiceImpl.java

@@ -1,18 +1,30 @@
 package com.ruoyi.biz.service.impl;
 
-import com.ruoyi.biz.domain.TwinCalc2hr;
+import com.ruoyi.biz.domain.TwinCalcAlarms;
 import com.ruoyi.biz.domain.TwinCalcDay;
+import com.ruoyi.biz.domain.TwinCalcHour;
+import com.ruoyi.biz.domain.TwinCalcStop;
 import com.ruoyi.biz.mapper.TwinCalcDayMapper;
-import com.ruoyi.biz.service.ITwinCalc2hrService;
+import com.ruoyi.biz.service.ITwinCalcAlarmsService;
 import com.ruoyi.biz.service.ITwinCalcDayService;
+import com.ruoyi.biz.service.ITwinCalcHourService;
+import com.ruoyi.biz.service.ITwinCalcStopService;
+import com.ruoyi.biz.tools.Tools;
 import com.ruoyi.common.core.text.Convert;
+import javafx.util.Pair;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.ZoneOffset;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
 
 /**
  * 日统计数据Service业务层处理
@@ -25,7 +37,11 @@ public class TwinCalcDayServiceImpl implements ITwinCalcDayService {
     @Resource
     private TwinCalcDayMapper twinCalcDayMapper;
     @Resource
-    private ITwinCalc2hrService calc2hrService;
+    private ITwinCalcHourService hourService;
+    @Resource
+    private ITwinCalcStopService stopService;
+    @Resource
+    private ITwinCalcAlarmsService alarmsService;
 
     /**
      * 查询日统计数据
@@ -114,7 +130,7 @@ public class TwinCalcDayServiceImpl implements ITwinCalcDayService {
     }
 
     /**
-     * 按日期统计数据入库
+     * 按日期统计数据入库,统计是从当天的7点至第二天的7点(不含)
      *
      * @param localDate 指定日期
      */
@@ -122,13 +138,115 @@ public class TwinCalcDayServiceImpl implements ITwinCalcDayService {
     public void calc4date(LocalDate localDate) {
         Date date = Date.from(localDate.atStartOfDay(ZoneOffset.of("+8")).toInstant());
         twinCalcDayMapper.delete4date(date);
-        TwinCalc2hr calc = calc2hrService.calc4date(date);
-        if (calc != null) {
-            TwinCalcDay day = new TwinCalcDay();
-            day.convert(calc);
+        //计算统计时间
+        Pair<Date, Date> pair = Tools.calcDay(localDate);
+        Date sTime = pair.getKey();
+        Date eTime = pair.getValue();
+        List<TwinCalcHour> hourList = hourService.selectTwinCalcHourListByDate(sTime, eTime);
+        List<TwinCalcStop> stopList = stopService.selectTwinCalcStopListByDate(sTime, eTime);
+        List<TwinCalcAlarms> alarmsList = alarmsService.selectTwinCalcAlarmsListByDate(sTime, eTime);
+        Pair<Date, Date> teamPair = Tools.teamA(localDate);
+
+        Map<Long, List<TwinCalcHour>> stopDeviceGroup = hourList.stream().collect(Collectors.groupingBy(TwinCalcHour::getDeviceId));
+        for (Map.Entry<Long, List<TwinCalcHour>> entry : stopDeviceGroup.entrySet()) {
+            List<TwinCalcHour> hours = entry.getValue();
+            TwinCalcDay day = new TwinCalcDay(date);
+            day.setDeviceId(entry.getKey());
+            //计算产量数据
+            day.calcHours(hours);
+            //计算停机数据
+            List<TwinCalcStop> stops = stopList.stream().filter(s -> s.getDeviceId().equals(entry.getKey())).collect(Collectors.toList());
+            AtomicLong closeA = new AtomicLong(0L);
+            AtomicLong closeB = new AtomicLong(0L);
+            //A班停机计数
+            BiConsumer<Integer, Integer> updateDayA = (type, count) -> {
+                switch (type) {
+                    case 1:
+                        day.setStop1A(day.getStop1A() + count);
+                        break;
+                    case 2:
+                        day.setStop2A(day.getStop2A() + count);
+                        break;
+                    case 3:
+                        day.setStop3A(day.getStop3A() + count);
+                        break;
+                    default:
+                }
+            };
+
+            BiConsumer<Integer, Integer> updateDayB = (type, count) -> {
+                switch (type) {
+                    case 1:
+                        day.setStop1B(day.getStop1B() + count);
+                        break;
+                    case 2:
+                        day.setStop2B(day.getStop2B() + count);
+                        break;
+                    case 3:
+                        day.setStop3B(day.getStop3B() + count);
+                        break;
+                    default:
+                }
+            };
+
+            stops.stream().peek(stop -> {
+                // 调整停止时间
+                if (stop.getEndTime().compareTo(eTime) > 0) {
+                    stop.setEndTime(eTime);
+                }
+                //调整开始时间
+                if (stop.getStartTime().compareTo(sTime) < 0) {
+                    stop.setStartTime(sTime);
+                }
+            }).forEach(stop -> {
+                //计算停机时间
+                long stopTime = (stop.getEndTime().getTime() - stop.getStartTime().getTime()) / 1000;
+                if (!stop.getStartTime().after(teamPair.getValue()) && !stop.getEndTime().before(teamPair.getKey())) {
+                    // A班
+                    updateStopCounters(stopTime, stop.getStopType(), closeA, updateDayA);
+                } else {
+                    // B班
+                    updateStopCounters(stopTime, stop.getStopType(), closeB, updateDayB);
+                }
+            });
+
+            //计算稼动率
+            //AB班排班时间,要乘以设备总数
+            long teamTimeA = 12L * 60 * 60;
+            long teamTimeB = 12L * 60 * 60;
+            long totalTeamTime = teamTimeA + teamTimeB;
+
+            long openTimeA = teamTimeA - closeA.get();
+            long openTimeB = teamTimeB - closeB.get();
+            long totalOpenTime = openTimeA + openTimeB;
+            BigDecimal ea = BigDecimal.valueOf(openTimeA).divide(BigDecimal.valueOf(teamTimeA), 2, RoundingMode.HALF_UP);
+            BigDecimal eb = BigDecimal.valueOf(openTimeB).divide(BigDecimal.valueOf(teamTimeB), 2, RoundingMode.HALF_UP);
+            BigDecimal ee = BigDecimal.valueOf(totalOpenTime).divide(BigDecimal.valueOf(totalTeamTime), 2, RoundingMode.HALF_UP);
+            day.setOpenTimeA(BigDecimal.valueOf(openTimeA));
+            day.setOpenTimeB(BigDecimal.valueOf(openTimeB));
+            day.setCloseTimeA(BigDecimal.valueOf(closeA.get()));
+            day.setCloseTimeB(BigDecimal.valueOf(closeB.get()));
+            day.setEfficiencyA(ea);
+            day.setEfficiencyB(eb);
+            day.setEfficiency(ee);
+            List<TwinCalcAlarms> alarms = alarmsList.stream().filter(a -> a.getDeviceId().equals(entry.getKey())).collect(Collectors.toList());
+            day.setAlarm((long) alarms.size());
             insertTwinCalcDay(day);
-        } else {
-            System.err.println(localDate);
         }
+
+    }
+
+    /**
+     * 用于更新停机时间计数器和事件计数
+     *
+     * @param stopTime            停机时间
+     * @param stopType            停机类型
+     * @param totalTimeCounter    停机总时间
+     * @param eventCounterUpdater 抽象方法
+     */
+    private void updateStopCounters(long stopTime, int stopType, AtomicLong
+            totalTimeCounter, BiConsumer<Integer, Integer> eventCounterUpdater) {
+        totalTimeCounter.addAndGet(stopTime);
+        eventCounterUpdater.accept(stopType, 1);
     }
 }

+ 39 - 26
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcHourServiceImpl.java

@@ -1,94 +1,107 @@
 package com.ruoyi.biz.service.impl;
 
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.biz.mapper.TwinCalcHourMapper;
 import com.ruoyi.biz.domain.TwinCalcHour;
+import com.ruoyi.biz.mapper.TwinCalcHourMapper;
 import com.ruoyi.biz.service.ITwinCalcHourService;
 import com.ruoyi.common.core.text.Convert;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 1小时统计数据Service业务层处理
- * 
+ *
  * @author ruoyi
  * @date 2024-06-28
  */
 @Service
-public class TwinCalcHourServiceImpl implements ITwinCalcHourService 
-{
-    @Autowired
+public class TwinCalcHourServiceImpl implements ITwinCalcHourService {
+    @Resource
     private TwinCalcHourMapper twinCalcHourMapper;
 
     /**
      * 查询1小时统计数据
-     * 
+     *
      * @param id 1小时统计数据主键
      * @return 1小时统计数据
      */
     @Override
-    public TwinCalcHour selectTwinCalcHourById(Long id)
-    {
+    public TwinCalcHour selectTwinCalcHourById(Long id) {
         return twinCalcHourMapper.selectTwinCalcHourById(id);
     }
 
     /**
      * 查询1小时统计数据列表
-     * 
+     *
      * @param twinCalcHour 1小时统计数据
      * @return 1小时统计数据
      */
     @Override
-    public List<TwinCalcHour> selectTwinCalcHourList(TwinCalcHour twinCalcHour)
-    {
+    public List<TwinCalcHour> selectTwinCalcHourList(TwinCalcHour twinCalcHour) {
         return twinCalcHourMapper.selectTwinCalcHourList(twinCalcHour);
     }
 
     /**
      * 新增1小时统计数据
-     * 
+     *
      * @param twinCalcHour 1小时统计数据
      * @return 结果
      */
     @Override
-    public int insertTwinCalcHour(TwinCalcHour twinCalcHour)
-    {
+    public int insertTwinCalcHour(TwinCalcHour twinCalcHour) {
         return twinCalcHourMapper.insertTwinCalcHour(twinCalcHour);
     }
 
     /**
      * 修改1小时统计数据
-     * 
+     *
      * @param twinCalcHour 1小时统计数据
      * @return 结果
      */
     @Override
-    public int updateTwinCalcHour(TwinCalcHour twinCalcHour)
-    {
+    public int updateTwinCalcHour(TwinCalcHour twinCalcHour) {
         return twinCalcHourMapper.updateTwinCalcHour(twinCalcHour);
     }
 
     /**
      * 批量删除1小时统计数据
-     * 
+     *
      * @param ids 需要删除的1小时统计数据主键
      * @return 结果
      */
     @Override
-    public int deleteTwinCalcHourByIds(String ids)
-    {
+    public int deleteTwinCalcHourByIds(String ids) {
         return twinCalcHourMapper.deleteTwinCalcHourByIds(Convert.toStrArray(ids));
     }
 
     /**
      * 删除1小时统计数据信息
-     * 
+     *
      * @param id 1小时统计数据主键
      * @return 结果
      */
     @Override
-    public int deleteTwinCalcHourById(Long id)
-    {
+    public int deleteTwinCalcHourById(Long id) {
         return twinCalcHourMapper.deleteTwinCalcHourById(id);
     }
+
+    /**
+     * 按开始和结束时间查询数据
+     *
+     * @param sTime 开始时间
+     * @param eTime 结束时间
+     */
+    @Override
+    public List<TwinCalcHour> selectTwinCalcHourListByDate(Date sTime, Date eTime) {
+        TwinCalcHour hour = new TwinCalcHour();
+        Map<String, Object> params = new HashMap<>(16);
+        params.put("sTime", sTime);
+        params.put("eTime", eTime);
+        hour.setParams(params);
+        return selectTwinCalcHourList(hour);
+    }
 }

+ 18 - 4
ruoyi-admin/src/main/java/com/ruoyi/biz/service/impl/TwinCalcStopServiceImpl.java

@@ -14,10 +14,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -184,4 +181,21 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
             });
         });
     }
+
+    /**
+     * 按开始和结束时间查询数据
+     *
+     * @param sTime 开始时间
+     * @param eTime 结束时间
+     * @return 查询列表
+     */
+    @Override
+    public List<TwinCalcStop> selectTwinCalcStopListByDate(Date sTime, Date eTime) {
+        TwinCalcStop stop = new TwinCalcStop();
+        Map<String, Object> params = new HashMap<>(16);
+        params.put("sTime", sTime);
+        params.put("eTime", eTime);
+        stop.setParams(params);
+        return selectTwinCalcStopList(stop);
+    }
 }

+ 59 - 8
ruoyi-admin/src/main/java/com/ruoyi/biz/tools/Tools.java

@@ -1,17 +1,12 @@
 package com.ruoyi.biz.tools;
 
 import cn.hutool.json.JSONArray;
+import javafx.util.Pair;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneOffset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.time.*;
+import java.util.*;
 
 /**
  * Tool$
@@ -180,4 +175,60 @@ public class Tools {
         return result;
     }
 
+    /**
+     * 获取统计时间 当天7天至第二天7点(不含)
+     *
+     * @param date 字符串类型的时间
+     * @return 开始结束时间对
+     */
+    public static Pair<Date, Date> calcDay(String date) {
+        LocalDate localDate = LocalDate.parse(date);
+        return calcDay(localDate);
+    }
+
+    /**
+     * 获取统计时间 当天7天至第二天7点(不含)
+     *
+     * @param localDate 日期
+     * @return 开始结束时间对
+     */
+    public static Pair<Date, Date> calcDay(LocalDate localDate) {
+        LocalDateTime ldt = LocalDateTime.of(localDate, LocalTime.MIN);
+        LocalDateTime start = ldt.plusHours(7);
+        LocalDateTime end = start.plusHours(23);
+        Date sTime = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
+        Date eTime = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
+        return new Pair<>(sTime, eTime);
+    }
+
+    /**
+     * 获取A班开始结束时间
+     *
+     * @param localDate 日期
+     * @return A班时间
+     */
+    public static Pair<Date, Date> teamA(LocalDate localDate) {
+        LocalDateTime ldt = LocalDateTime.of(localDate, LocalTime.MIN);
+        LocalDateTime start = ldt.plusHours(7);
+        LocalDateTime end = start.plusHours(11).minusSeconds(1);
+        Date sTime = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
+        Date eTime = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
+        return new Pair<>(sTime, eTime);
+    }
+
+    /**
+     * 获取B班开始结束时间
+     *
+     * @param localDate 日期
+     * @return A班时间
+     */
+    public static Pair<Date, Date> teamB(LocalDate localDate) {
+        LocalDateTime ldt = LocalDateTime.of(localDate, LocalTime.MIN);
+        LocalDateTime start = ldt.plusHours(19);
+        LocalDateTime end = start.plusHours(11).minusSeconds(1);
+        Date sTime = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
+        Date eTime = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
+        return new Pair<>(sTime, eTime);
+    }
+
 }

+ 2 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -11,8 +11,8 @@ excel:
   total: D:\SYSTEM\Desktop\temp\excel\total.xlsx
   formula: D:\SYSTEM\Desktop\temp\excel\formula.xlsx
 #数据补录
-data:
-  bl: false
+#data:
+#  bl: false
 # 项目相关配置
 ruoyi:
   # 名称

+ 3 - 0
ruoyi-admin/src/main/resources/mapper/biz/TwinCalcAlarmsMapper.xml

@@ -48,6 +48,9 @@
             <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="params.sTime != null and params.eTime != null">
+                and DATE_ADD(data_date, INTERVAL `HOUR` HOUR) between #{params.sTime} and #{params.eTime}
+            </if>
         </where>
     </select>
 

+ 6 - 1
ruoyi-admin/src/main/resources/mapper/biz/TwinCalcDayMapper.xml

@@ -7,6 +7,7 @@
     <resultMap type="TwinCalcDay" id="TwinCalcDayResult">
         <result property="id" column="ID"/>
         <result property="time" column="TIME"/>
+        <result property="deviceId" column="DEVICE_ID"/>
         <result property="length" column="LENGTH"/>
         <result property="weight" column="WEIGHT"/>
         <result property="efficiency" column="EFFICIENCY"/>
@@ -38,7 +39,7 @@
     </resultMap>
 
     <sql id="selectTwinCalcDayVo">
-        select ID, TIME, LENGTH, WEIGHT, EFFICIENCY, KWH, ALARM, LENGTH_A, WEIGHT_A, EFFICIENCY_A, OPEN_TIME_A, CLOSE_TIME_A, KWH_A, STOP1_A, STOP2_A, STOP3_A, LENGTH_B, WEIGHT_B, EFFICIENCY_B, OPEN_TIME_B, CLOSE_TIME_B, KWH_B, STOP1_B, STOP2_B, STOP3_B, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, REMARK
+        select ID, TIME, DEVICE_ID, LENGTH, WEIGHT, EFFICIENCY, KWH, ALARM, LENGTH_A, WEIGHT_A, EFFICIENCY_A, OPEN_TIME_A, CLOSE_TIME_A, KWH_A, STOP1_A, STOP2_A, STOP3_A, LENGTH_B, WEIGHT_B, EFFICIENCY_B, OPEN_TIME_B, CLOSE_TIME_B, KWH_B, STOP1_B, STOP2_B, STOP3_B, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, REMARK
         from twin_calc_day
     </sql>
 
@@ -46,6 +47,7 @@
         <include refid="selectTwinCalcDayVo"/>
         <where>
             <if test="time != null ">and TIME = #{time}</if>
+            <if test="deviceId != null ">and DEVICE_ID = #{deviceId}</if>
             <if test="length != null ">and LENGTH = #{length}</if>
             <if test="weight != null ">and WEIGHT = #{weight}</if>
             <if test="efficiency != null ">and EFFICIENCY = #{efficiency}</if>
@@ -91,6 +93,7 @@
         insert into twin_calc_day
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="time != null">TIME,</if>
+            <if test="deviceId != null ">DEVICE_ID,</if>
             <if test="length != null">LENGTH,</if>
             <if test="weight != null">WEIGHT,</if>
             <if test="efficiency != null">EFFICIENCY,</if>
@@ -122,6 +125,7 @@
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="time != null">#{time},</if>
+            <if test="deviceId != null ">#{deviceId},</if>
             <if test="length != null">#{length},</if>
             <if test="weight != null">#{weight},</if>
             <if test="efficiency != null">#{efficiency},</if>
@@ -157,6 +161,7 @@
         update twin_calc_day
         <trim prefix="SET" suffixOverrides=",">
             <if test="time != null">TIME = #{time},</if>
+            <if test="deviceId != null ">DEVICE_ID = #{deviceId},</if>
             <if test="length != null">LENGTH = #{length},</if>
             <if test="weight != null">WEIGHT = #{weight},</if>
             <if test="efficiency != null">EFFICIENCY = #{efficiency},</if>

+ 40 - 33
ruoyi-admin/src/main/resources/mapper/biz/TwinCalcHourMapper.xml

@@ -1,46 +1,51 @@
 <?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.ruoyi.biz.mapper.TwinCalcHourMapper">
 
     <resultMap type="TwinCalcHour" id="TwinCalcHourResult">
-        <result property="id"    column="ID"    />
-        <result property="dataDate"    column="DATA_DATE"    />
-        <result property="hour"    column="HOUR"    />
-        <result property="deviceId"    column="DEVICE_ID"    />
-        <result property="kwh"    column="KWH"    />
-        <result property="weight"    column="WEIGHT"    />
-        <result property="length"    column="LENGTH"    />
-        <result property="openTime"    column="OPEN_TIME"    />
-        <result property="closeTime"    column="CLOSE_TIME"    />
-        <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="time" column="TIME"/>
+        <result property="deviceId" column="DEVICE_ID"/>
+        <result property="kwh" column="KWH"/>
+        <result property="weight" column="WEIGHT"/>
+        <result property="length" column="LENGTH"/>
+        <result property="openTime" column="OPEN_TIME"/>
+        <result property="closeTime" column="CLOSE_TIME"/>
+        <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"/>
     </resultMap>
 
     <sql id="selectTwinCalcHourVo">
-        select ID, DATA_DATE, HOUR, DEVICE_ID, KWH, WEIGHT, LENGTH, OPEN_TIME, CLOSE_TIME, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, REMARK from twin_calc_hour
+        select ID, DATA_DATE, HOUR, DEVICE_ID, KWH, WEIGHT, LENGTH, OPEN_TIME, CLOSE_TIME, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME, REMARK
+        from twin_calc_hour
     </sql>
 
     <select id="selectTwinCalcHourList" parameterType="TwinCalcHour" resultMap="TwinCalcHourResult">
         <include refid="selectTwinCalcHourVo"/>
         <where>
-            <if test="dataDate != null "> and DATA_DATE = #{dataDate}</if>
-            <if test="hour != null"> and HOUR = #{hour}</if>
-            <if test="deviceId != null "> and DEVICE_ID = #{deviceId}</if>
-            <if test="kwh != null "> and KWH = #{kwh}</if>
-            <if test="weight != null "> and WEIGHT = #{weight}</if>
-            <if test="length != null "> and LENGTH = #{length}</if>
-            <if test="openTime != null "> and OPEN_TIME = #{openTime}</if>
-            <if test="closeTime != null "> and CLOSE_TIME = #{closeTime}</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="dataDate != null ">and DATA_DATE = #{dataDate}</if>
+            <if test="hour != null">and HOUR = #{hour}</if>
+            <if test="deviceId != null ">and DEVICE_ID = #{deviceId}</if>
+            <if test="kwh != null ">and KWH = #{kwh}</if>
+            <if test="weight != null ">and WEIGHT = #{weight}</if>
+            <if test="length != null ">and LENGTH = #{length}</if>
+            <if test="openTime != null ">and OPEN_TIME = #{openTime}</if>
+            <if test="closeTime != null ">and CLOSE_TIME = #{closeTime}</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="params.sTime != null and params.eTime != null">
+                and DATE_ADD(data_date, INTERVAL `HOUR` HOUR) between #{params.sTime} and #{params.eTime}
+            </if>
         </where>
     </select>
 
@@ -65,7 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <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>
@@ -80,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updatedBy != null">#{updatedBy},</if>
             <if test="updatedTime != null">#{updatedTime},</if>
             <if test="remark != null">#{remark},</if>
-         </trim>
+        </trim>
     </insert>
 
     <update id="updateTwinCalcHour" parameterType="TwinCalcHour">
@@ -104,7 +109,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </update>
 
     <delete id="deleteTwinCalcHourById" parameterType="Long">
-        delete from twin_calc_hour where ID = #{id}
+        delete
+        from twin_calc_hour
+        where ID = #{id}
     </delete>
 
     <delete id="deleteTwinCalcHourByIds" parameterType="String">

+ 3 - 0
ruoyi-admin/src/main/resources/mapper/biz/TwinCalcStopMapper.xml

@@ -48,6 +48,9 @@
             <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="params.sTime != null and params.eTime != null">
+                and DATE_ADD(data_date, INTERVAL `HOUR` HOUR) between #{params.sTime} and #{params.eTime}
+            </if>
         </where>
         order by START_TIME
     </select>

+ 36 - 0
ruoyi-admin/src/test/java/com/jjt/CalcDayTest.java

@@ -0,0 +1,36 @@
+package com.jjt;
+
+import com.ruoyi.RuoYiApplication;
+import com.ruoyi.biz.service.ITwinCalcDayService;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+
+/**
+ * DataProcess$
+ *
+ * @author wukai
+ * @date 2024/5/7 11:49
+ */
+@SpringBootTest(classes = RuoYiApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CalcDayTest {
+    @Resource
+    private JdbcTemplate jdbcTemplate;
+    @Resource
+    private ITwinCalcDayService dayService;
+
+    public static void main(String[] args) {
+    }
+
+    @Test
+    void test() {
+        LocalDate localDate = LocalDate.parse("2024-07-01");
+        dayService.calc4date(localDate);
+        localDate = LocalDate.parse("2024-07-02");
+        dayService.calc4date(localDate);
+    }
+
+}

+ 12 - 5
ruoyi-admin/src/test/java/com/jjt/Test.java

@@ -11,7 +11,9 @@ import cn.hutool.json.JSONUtil;
 import com.ruoyi.biz.tools.Tools;
 import com.ruoyi.common.utils.DateUtils;
 
-import java.time.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Date;
 
 /**
@@ -22,10 +24,15 @@ import java.util.Date;
  */
 public class Test {
     public static void main(String[] args) {
-        LocalDateTime local
-                = LocalDateTime.parse("2018-12-03T00:00:00");
+        LocalDateTime local = LocalDateTime.parse("2024-07-03T00:00:00");
+        LocalDateTime start = local.plusHours(7);
+        LocalDateTime end = start.plusHours(24).minusSeconds(1);
+        System.err.println(start);
+        System.err.println(end);
+        while (start.plusHours(1).isBefore(end)) {
 
-        test("2024-06-06", 8L);
+        }
+//        test("2024-06-06", 8L);
     }
 
     public static void test(String date, Long lastPeriod) {
@@ -46,7 +53,7 @@ public class Test {
         while (!end.isAfter(stop)) {
             start = start.minusSeconds(1);
 
-            System.err.println(start+"\t"+end);
+            System.err.println(start + "\t" + end);
             start = end;
             end = end.plusHours(2);
         }