瀏覽代碼

好了 解决预测分析BUG

wukai 3 月之前
父節點
當前提交
607015f012

+ 39 - 27
jjt-biz/src/main/java/com/jjt/calc/controller/TwinCalcStopController.java

@@ -53,19 +53,7 @@ public class TwinCalcStopController extends BaseController {
     @ApiOperation("故障停机统计")
     @GetMapping("/gz-stop")
     public AjaxResult gzStop(TwinCalcStop twinCalcStop) {
-        Date d;
-        if (twinCalcStop.getRemark() != null && !twinCalcStop.getRemark().isEmpty()) {
-            try {
-                int days = Integer.parseInt(twinCalcStop.getRemark());
-                d = new Date(System.currentTimeMillis() - (long) days * 24 * 60 * 60 * 1000);
-            } catch (NumberFormatException e) {
-                // 如果转换失败,则使用默认的90天
-                d = new Date(System.currentTimeMillis() - 90L * 24 * 60 * 60 * 1000);
-            }
-        } else {
-            d = new Date(System.currentTimeMillis() - 90L * 24 * 60 * 60 * 1000);
-        }
-        twinCalcStop.setWorkDay(d);
+        processStopData(twinCalcStop);
         List<StopDetail> list = twinCalcStopService.selectTwinCalcStopDetailList(twinCalcStop);
         List<StopVO> resultList = new ArrayList<>();
 
@@ -112,19 +100,7 @@ public class TwinCalcStopController extends BaseController {
     @ApiOperation("断纱停机统计")
     @GetMapping("/ds-stop")
     public AjaxResult dsStop(TwinCalcStop twinCalcStop) {
-        Date d;
-        if (twinCalcStop.getRemark() != null && !twinCalcStop.getRemark().isEmpty()) {
-            try {
-                int days = Integer.parseInt(twinCalcStop.getRemark());
-                d = new Date(System.currentTimeMillis() - (long) days * 24 * 60 * 60 * 1000);
-            } catch (NumberFormatException e) {
-                // 如果转换失败,则使用默认的90天
-                d = new Date(System.currentTimeMillis() - 90L * 24 * 60 * 60 * 1000);
-            }
-        } else {
-            d = new Date(System.currentTimeMillis() - 90L * 24 * 60 * 60 * 1000);
-        }
-        twinCalcStop.setWorkDay(d);
+        processStopData(twinCalcStop);
         List<StopDetail> list = twinCalcStopService.selectTwinCalcStopDetailList(twinCalcStop);
         List<StopVO> resultList = new ArrayList<>();
 
@@ -162,7 +138,7 @@ public class TwinCalcStopController extends BaseController {
         Map<String, Object> statistics = new HashMap<>();
         statistics.put("totalDevices", resultList.size());
         statistics.put("trendCounts", trendCounts);
-        resultList.get(0).setAdditionalInfo(statistics);
+//        resultList.get(0).setAdditionalInfo(statistics);
 
         resultList.sort(Comparator.comparing(StopVO::getDeviceId));
         return success(resultList).put("statistics", statistics);
@@ -321,4 +297,40 @@ public class TwinCalcStopController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(twinCalcStopService.deleteTwinCalcStopByIds(ids));
     }
+
+    /**
+     * 处理停机数据查询条件
+     * @param twinCalcStop 停机查询条件
+     */
+    private void processStopData(TwinCalcStop twinCalcStop) {
+        // 根据 remark 判断是按天还是按月查询
+        String periodType = twinCalcStop.getRemark(); // "day" 或 "month"
+        Date queryDate = twinCalcStop.getDataDate(); // 查询的日期
+
+        Calendar cal = Calendar.getInstance();
+
+        if ("month".equals(periodType)) {
+            // 按月查询,设置为当月第一天
+            if (queryDate != null) {
+                cal.setTime(queryDate);
+            }
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+        } else {
+            // 按天查询或其他情况,默认查询最近90天或指定日期
+            if (queryDate != null) {
+                cal.setTime(queryDate);
+            } else {
+                cal.add(Calendar.DAY_OF_MONTH, -90);
+            }
+        }
+
+        twinCalcStop.setWorkDay(cal.getTime());
+        // 将 periodType 存储到 params 中供 service 使用
+        Map<String, Object> params = twinCalcStop.getParams();
+        if (params == null) {
+            params = new HashMap<>();
+            twinCalcStop.setParams(params);
+        }
+        params.put("periodType", periodType != null ? periodType : "day");
+    }
 }

+ 22 - 13
jjt-biz/src/main/java/com/jjt/calc/mapper/TwinCalcStopMapper.java

@@ -1,21 +1,21 @@
 package com.jjt.calc.mapper;
 
+import java.util.Date;
 import java.util.List;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jjt.calc.domain.TwinCalcStop;
 import com.jjt.calc.vo.StopDetail;
 
 /**
  * 停机数据统计Mapper接口
- *
+ * 
  * @author wukai
  * @date 2025-01-18
  */
-public interface TwinCalcStopMapper extends BaseMapper<TwinCalcStop>
+public interface TwinCalcStopMapper 
 {
     /**
      * 查询停机数据统计
-     *
+     * 
      * @param id 停机数据统计主键
      * @return 停机数据统计
      */
@@ -23,7 +23,7 @@ public interface TwinCalcStopMapper extends BaseMapper<TwinCalcStop>
 
     /**
      * 查询停机数据统计列表
-     *
+     * 
      * @param twinCalcStop 停机数据统计
      * @return 停机数据统计集合
      */
@@ -31,7 +31,7 @@ public interface TwinCalcStopMapper extends BaseMapper<TwinCalcStop>
 
     /**
      * 新增停机数据统计
-     *
+     * 
      * @param twinCalcStop 停机数据统计
      * @return 结果
      */
@@ -39,7 +39,7 @@ public interface TwinCalcStopMapper extends BaseMapper<TwinCalcStop>
 
     /**
      * 修改停机数据统计
-     *
+     * 
      * @param twinCalcStop 停机数据统计
      * @return 结果
      */
@@ -47,7 +47,7 @@ public interface TwinCalcStopMapper extends BaseMapper<TwinCalcStop>
 
     /**
      * 删除停机数据统计
-     *
+     * 
      * @param id 停机数据统计主键
      * @return 结果
      */
@@ -55,16 +55,25 @@ public interface TwinCalcStopMapper extends BaseMapper<TwinCalcStop>
 
     /**
      * 批量删除停机数据统计
-     *
-     * @param ids 需要删除的数据主键集合
+     * 
+     * @param ids 需要删除的数据主键数组
      * @return 结果
      */
     public int deleteTwinCalcStopByIds(Long[] ids);
+    
     /**
      * 查询统计次数详情
-     *
+     * 
      * @param twinCalcStop 查询条件
      * @return 停机详情列表
      */
-    List<StopDetail> selectTwinCalcStopDetailList(TwinCalcStop twinCalcStop);
-}
+    public List<StopDetail> selectTwinCalcStopDetailList(TwinCalcStop twinCalcStop);
+    
+    /**
+     * 按月查询统计次数详情
+     * 
+     * @param twinCalcStop 查询条件
+     * @return 停机详情列表
+     */
+    public List<StopDetail> selectTwinCalcStopDetailListByMonth(TwinCalcStop twinCalcStop);
+}

+ 198 - 1
jjt-biz/src/main/java/com/jjt/calc/service/impl/TwinCalcStopServiceImpl.java

@@ -14,6 +14,7 @@ import com.jjt.common.utils.DateUtils;
 import com.jjt.common.utils.StringUtils;
 import com.jjt.common.utils.bean.BeanUtils;
 import com.jjt.system.service.ISysConfigService;
+import com.jjt.biz.mapper.TwinDeviceMapper;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -42,6 +43,8 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
     private SqlSessionFactory factory;
     @Resource
     private ITwinCalcHourService calcHourService;
+    @Resource
+    private TwinDeviceMapper twinDeviceMapper;
 
     /**
      * 查询停机数据统计
@@ -307,6 +310,200 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
      */
     @Override
     public List<StopDetail> selectTwinCalcStopDetailList(TwinCalcStop twinCalcStop) {
-        return twinCalcStopMapper.selectTwinCalcStopDetailList(twinCalcStop);
+        String periodType = "day";
+        if (twinCalcStop.getParams() != null && twinCalcStop.getParams().get("periodType") != null) {
+            periodType = (String) twinCalcStop.getParams().get("periodType");
+        }
+
+        Date queryDate = twinCalcStop.getDataDate();
+        if ("month".equals(periodType)) {
+            // 按月查询,返回当月所有日期的数据
+            return selectMonthlyStopDetailList(twinCalcStop);
+        } else {
+            // 按天查询,返回24小时的数据
+            return selectDailyStopDetailList(twinCalcStop);
+        }
+    }
+
+    /**
+     * 查询月度停机详情列表(按日统计)
+     *
+     * @param twinCalcStop 查询条件
+     * @return 停机详情列表
+     */
+    private List<StopDetail> selectMonthlyStopDetailList(TwinCalcStop twinCalcStop) {
+        // 获取当月第一天和最后一天
+        Calendar cal = Calendar.getInstance();
+        if (twinCalcStop.getDataDate() != null) {
+            cal.setTime(twinCalcStop.getDataDate());
+        }
+        cal.set(Calendar.DAY_OF_MONTH, 1);
+        Date firstDay = cal.getTime();
+        
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        Date lastDay = cal.getTime();
+        
+        // 结束日期为当前时间减去31小时
+        Calendar endCal = Calendar.getInstance();
+        endCal.add(Calendar.HOUR_OF_DAY, -31);
+        Date endDate = endCal.getTime();
+        
+        // 取 endDate 和 lastDay 中较早的日期作为实际结束日期
+        Date actualEndDate = endDate.before(lastDay) ? endDate : lastDay;
+        
+        // 设置查询条件
+        twinCalcStop.setWorkDay(firstDay);
+        Map<String, Object> params = twinCalcStop.getParams();
+        if (params == null) {
+            params = new HashMap<>();
+            twinCalcStop.setParams(params);
+        }
+        params.put("endDate", actualEndDate);
+        
+        // 查询数据库中的实际数据
+        List<StopDetail> actualList = twinCalcStopMapper.selectTwinCalcStopDetailListByMonth(twinCalcStop);
+        
+        // 获取所有涉及的设备
+        Set<Long> deviceIds = actualList.stream().map(StopDetail::getDeviceId).collect(Collectors.toSet());
+        Map<Long, String> deviceNames = new HashMap<>();
+        if (!deviceIds.isEmpty()) {
+            // 这里可以查询设备名称,简化处理,从实际数据中获取
+            for (StopDetail detail : actualList) {
+                deviceNames.put(detail.getDeviceId(), detail.getDeviceName());
+            }
+        }
+        
+        // 如果没有任何设备数据,直接返回空列表
+        if (deviceIds.isEmpty()) {
+            return new ArrayList<>();
+        }
+        
+        // 构建完整的日期列表(从当月第一天到实际结束日期)
+        List<Date> dateList = new ArrayList<>();
+        Calendar dateCal = Calendar.getInstance();
+        dateCal.setTime(firstDay);
+        
+        while (!dateCal.getTime().after(actualEndDate)) {
+            dateList.add(dateCal.getTime());
+            dateCal.add(Calendar.DAY_OF_MONTH, 1);
+        }
+        
+        // 构建完整的结果列表,没有数据的日期补0
+        List<StopDetail> resultList = new ArrayList<>();
+        for (Long deviceId : deviceIds) {
+            String deviceName = deviceNames.get(deviceId);
+            Map<Date, StopDetail> dateMap = actualList.stream()
+                    .filter(d -> d.getDeviceId().equals(deviceId))
+                    .collect(Collectors.toMap(StopDetail::getDate, d -> d));
+            
+            // 如果该设备在整个月内没有任何数据记录,则不加入结果列表
+            if (dateMap.isEmpty()) {
+                continue;
+            }
+            
+            for (Date date : dateList) {
+                StopDetail detail;
+                if (dateMap.containsKey(date)) {
+                    detail = dateMap.get(date);
+                } else {
+                    detail = new StopDetail();
+                    detail.setDeviceId(deviceId);
+                    detail.setDeviceName(deviceName);
+                    detail.setDate(date);
+                    detail.setTimes(0);
+                }
+                resultList.add(detail);
+            }
+        }
+        
+        return resultList;
+    }
+
+    /**
+     * 查询日停机详情列表(按时统计)
+     *
+     * @param twinCalcStop 查询条件
+     * @return 停机详情列表
+     */
+    private List<StopDetail> selectDailyStopDetailList(TwinCalcStop twinCalcStop) {
+        // 如果没有指定日期,则使用workDay字段
+        Date queryDate = twinCalcStop.getDataDate() != null ? twinCalcStop.getDataDate() : twinCalcStop.getWorkDay();
+        if (queryDate == null) {
+            // 默认查询最近90天
+            Calendar cal = Calendar.getInstance();
+            cal.add(Calendar.DAY_OF_MONTH, -90);
+            queryDate = cal.getTime();
+        }
+        
+        twinCalcStop.setWorkDay(queryDate);
+        
+        // 查询数据库中的实际数据
+        List<StopDetail> actualList = twinCalcStopMapper.selectTwinCalcStopDetailList(twinCalcStop);
+        
+        // 获取所有涉及的设备
+        Set<Long> deviceIds = actualList.stream().map(StopDetail::getDeviceId).collect(Collectors.toSet());
+        Map<Long, String> deviceNames = new HashMap<>();
+        if (!deviceIds.isEmpty()) {
+            for (StopDetail detail : actualList) {
+                deviceNames.put(detail.getDeviceId(), detail.getDeviceName());
+            }
+        }
+        
+        // 如果没有任何设备数据,直接返回空列表
+        if (deviceIds.isEmpty()) {
+            return new ArrayList<>();
+        }
+        
+        // 构建完整的结果列表,没有数据的小时补0(从7点到第二天7点,共24小时)
+        List<StopDetail> resultList = new ArrayList<>();
+        for (Long deviceId : deviceIds) {
+            String deviceName = deviceNames.get(deviceId);
+            // 构建该设备的时间点映射
+            Map<String, StopDetail> hourMap = new HashMap<>();
+            actualList.stream()
+                .filter(d -> d.getDeviceId().equals(deviceId))
+                .forEach(d -> {
+                    // 使用date和hour组合作为key
+                    Calendar cal = Calendar.getInstance();
+                    cal.setTime(d.getDate());
+                    String key = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, d.getDate()) + "-" + d.getHour();
+                    hourMap.put(key, d);
+                });
+            
+            // 如果该设备在24小时内没有任何数据记录,则不加入结果列表
+            if (hourMap.isEmpty()) {
+                continue;
+            }
+            
+            // 构建从7点到第二天7点的24小时数据
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(queryDate);
+            cal.set(Calendar.HOUR_OF_DAY, 7);  // 起始时间为当天7点
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            
+            for (int i = 0; i < 24; i++) {
+                // 构造key查找是否有数据
+                String key = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, cal.getTime()) + "-" + cal.get(Calendar.HOUR_OF_DAY);
+                
+                StopDetail detail;
+                if (hourMap.containsKey(key)) {
+                    detail = hourMap.get(key);
+                } else {
+                    detail = new StopDetail();
+                    detail.setDeviceId(deviceId);
+                    detail.setDeviceName(deviceName);
+                    detail.setDate(cal.getTime());
+                    detail.setHour(cal.get(Calendar.HOUR_OF_DAY));
+                    detail.setTimes(0);
+                }
+                resultList.add(detail);
+                
+                cal.add(Calendar.HOUR_OF_DAY, 1);  // 增加1小时
+            }
+        }
+        
+        return resultList;
     }
 }

+ 4 - 2
jjt-biz/src/main/java/com/jjt/calc/vo/StopDetail.java

@@ -21,8 +21,10 @@ public class StopDetail {
     @ApiModelProperty("设备名称")
     private String deviceName;
     @ApiModelProperty("时间")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date date;
     @ApiModelProperty("停机次数")
     private Integer times;
-}
+    @ApiModelProperty("小时")
+    private Integer hour;
+}

+ 26 - 6
jjt-biz/src/main/resources/mapper/calc/TwinCalcStopMapper.xml

@@ -68,15 +68,35 @@
         <include refid="selectTwinCalcStopVo"/>
         where ID = #{id}
     </select>
+
     <select id="selectTwinCalcStopDetailList" resultType="com.jjt.calc.vo.StopDetail">
         SELECT A.*, B.DEVICE_NAME
+        FROM (SELECT WORK_DAY as date, DEVICE_ID, STOP_TYPE, HOUR as hour, COUNT(*) TIMES
+        FROM TWIN_CALC_STOP
+        WHERE STOP_TYPE = #{stopType}
+        AND WORK_DAY = #{workDay}
+        <if test="deviceId != null ">and DEVICE_ID = #{deviceId}</if>
+        <if test="params != null and params.endDate != null">
+            AND WORK_DAY &lt;= #{params.endDate}
+        </if>
+        GROUP BY WORK_DAY, DEVICE_ID, STOP_TYPE, HOUR) A,
+        TWIN_DEVICE B
+        WHERE A.DEVICE_ID = B.DEVICE_ID
+        ORDER BY date,hour, DEVICE_ID, STOP_TYPE
+    </select>
+
+    <select id="selectTwinCalcStopDetailListByMonth" resultType="com.jjt.calc.vo.StopDetail">
+        SELECT A.*, B.DEVICE_NAME
         FROM (SELECT WORK_DAY as date, DEVICE_ID, STOP_TYPE, COUNT(*) TIMES
-              FROM TWIN_CALC_STOP
-              WHERE STOP_TYPE = #{stopType}
-                AND WORK_DAY >= #{workDay}
-                <if test="deviceId != null ">and DEVICE_ID = #{deviceId}</if>
-              GROUP BY WORK_DAY, DEVICE_ID, STOP_TYPE) A,
-             TWIN_DEVICE B
+        FROM TWIN_CALC_STOP
+        WHERE STOP_TYPE = #{stopType}
+        AND WORK_DAY >= #{workDay}
+        <if test="deviceId != null ">and DEVICE_ID = #{deviceId}</if>
+        <if test="params != null and params.endDate != null">
+            AND WORK_DAY &lt;= #{params.endDate}
+        </if>
+        GROUP BY WORK_DAY, DEVICE_ID, STOP_TYPE) A,
+        TWIN_DEVICE B
         WHERE A.DEVICE_ID = B.DEVICE_ID
         ORDER BY date, DEVICE_ID, STOP_TYPE
     </select>