浏览代码

Merge remote-tracking branch 'origin/master'

lipenghui 3 天之前
父节点
当前提交
a364a289cf

+ 69 - 71
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java

@@ -394,13 +394,33 @@ public class IotOpeationFillController {
      * 处理累计逻辑(优化后:批量查询历史数据)
      */
     private void processSummationLogic(List<IotOpeationFillSaveReqVO> allFillData) {
-        // 1. 提前过滤+非空校验(流式操作简化)
+
+        // 前置空校验:避免无效流式处理
+        if (allFillData == null || allFillData.isEmpty()) {
+            return;
+        }
+
+        // 1. 合并过滤逻辑:一次性过滤出累计数据,按sumId分组(避免两次流式过滤)
+        Map<Long, List<IotOpeationFillSaveReqVO>> sumDataGroup = allFillData.stream()
+                .filter(fill -> 1 == fill.getIsSum())
+                .collect(Collectors.groupingBy(IotOpeationFillSaveReqVO::getSumId));
+
+        // 拆分出两类累计数据(空集合安全处理)
+        List<IotOpeationFillSaveReqVO> sumDataList = sumDataGroup.getOrDefault(1L, Collections.emptyList());
+        List<IotOpeationFillSaveReqVO> sumDataList1 = sumDataGroup.getOrDefault(0L, Collections.emptyList());
+
+
+        /*// 1. 提前过滤+非空校验(流式操作简化)RH,RY的累计属性
         List<IotOpeationFillSaveReqVO> sumDataList = allFillData.stream()
                 .filter(fill -> 1 == fill.getIsSum())
+                .filter(fill -> 1 == fill.getSumId())
                 .collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(sumDataList)) {
-            return;
-        }
+        //瑞都累计属性
+        List<IotOpeationFillSaveReqVO> sumDataList1 = allFillData.stream()
+                .filter(fill -> 1 == fill.getIsSum())
+                .filter(fill -> 0 == fill.getSumId())
+                .collect(Collectors.toList());*/
+
 
         // 2. 构建unSumData的索引(设备ID + 模型ID),避免嵌套循环
         // 键:deviceId_modelId,值:该维度下的fillContent数值
@@ -419,15 +439,30 @@ public class IotOpeationFillController {
                 ));
 
         // 3. 批量构建查询条件(简化流式操作)
-        List<IotDeviceRunLogDO> queryLogs = sumDataList.stream()
-                .map(fill -> {
-                    IotDeviceRunLogDO queryLog = new IotDeviceRunLogDO();
-                    queryLog.setDeviceId(fill.getDeviceId());
-                    queryLog.setPointName(fill.getPointName());
-                    queryLog.setCreateTime(LocalDateTime.of(fill.getCreateTime(), LocalTime.MIDNIGHT));
-                    return queryLog;
-                })
-                .collect(Collectors.toList());
+        List<IotDeviceRunLogDO> queryLogs = new ArrayList<>();
+        if(!sumDataList.isEmpty()){
+            queryLogs = sumDataList.stream()
+                    .map(fill -> {
+                        IotDeviceRunLogDO queryLog = new IotDeviceRunLogDO();
+                        queryLog.setDeviceId(fill.getDeviceId());
+                        queryLog.setPointName(fill.getPointName());
+                        queryLog.setCreateTime(LocalDateTime.of(fill.getCreateTime(), LocalTime.MIDNIGHT));
+                        return queryLog;
+                    })
+                    .collect(Collectors.toList());
+        }
+        if(!sumDataList1.isEmpty()){
+            queryLogs = sumDataList1.stream()
+                    .map(fill -> {
+                        IotDeviceRunLogDO queryLog = new IotDeviceRunLogDO();
+                        queryLog.setDeviceId(fill.getDeviceId());
+                        queryLog.setPointName(fill.getPointName());
+                        queryLog.setCreateTime(LocalDateTime.of(fill.getCreateTime(), LocalTime.MIDNIGHT));
+                        return queryLog;
+                    })
+                    .collect(Collectors.toList());
+        }
+
 
         // 4. 批量查询历史最大数据(原逻辑保留,1次数据库交互)
         List<IotDeviceRunLogDO> maxFillDataList = iotOpeationFillService.batchQueryMaxReportData(queryLogs);
@@ -453,9 +488,12 @@ public class IotOpeationFillController {
                 String historyKey = fill.getDeviceId() + "_" + fill.getPointName();
                 BigDecimal maxHistory = maxDataMap.getOrDefault(historyKey, BigDecimal.ZERO);
 
-                // 累计计算(简化逻辑,消除冗余判空)
+                fill.setTotalRunTime(new BigDecimal(fill.getFillContent()));
+
+                //RH,RY累计等于历史最大值+当日填写值
                 BigDecimal total = maxHistory.add(currentValue);
                 fill.setTotalRunTime(total);
+
             } catch (NumberFormatException e) {
                 // 补充日志,便于问题排查
                 log.warn("累计数据处理失败:defaultValue转换异常,fillId={}, defaultValue={}",
@@ -465,67 +503,27 @@ public class IotOpeationFillController {
                 log.error("累计数据处理异常:fillId={}", fill.getId(), e);
             }
         });
-    }
-   /* private void processSummationLogic(List<IotOpeationFillSaveReqVO> allFillData) {
-        // 筛选需要累计的数据(不变)
-        List<IotOpeationFillSaveReqVO> sumDataList = allFillData.stream()
-                .filter(fill -> 1 == fill.getIsSum())
-                .collect(Collectors.toList());
-
-        List<IotOpeationFillSaveReqVO> unSumDataList = allFillData.stream()
-                .filter(fill -> 0 == fill.getIsSum()&&fill.getSumId() == null)
-                .collect(Collectors.toList());
-
-        if (CollectionUtils.isEmpty(sumDataList)) {
-            return;
-        }
-
-        // 1. 批量构建查询条件(避免循环查询)
-        List<IotDeviceRunLogDO> queryLogs = sumDataList.stream()
-                .map(fill -> {
-                    IotDeviceRunLogDO queryLog = new IotDeviceRunLogDO();
-                    queryLog.setDeviceId(fill.getDeviceId());
-                    queryLog.setPointName(fill.getPointName());
-                    queryLog.setCreateTime(LocalDateTime.of(fill.getCreateTime(), LocalTime.MIDNIGHT));
-                    return queryLog;
-                })
-                .collect(Collectors.toList());
-
-        // 2. 批量查询历史最大数据(1次数据库交互)
-        List<IotDeviceRunLogDO> maxFillDataList = iotOpeationFillService.batchQueryMaxReportData(queryLogs);
-
-
-        Map<String, BigDecimal> maxDataMap = maxFillDataList.stream()
-                .filter(data -> data.getTotalRunTime() != null)
-                .collect(Collectors.toMap(
-                        data -> data.getDeviceId() + "_" + data.getPointName(), // 设备+测点唯一标识
-                        IotDeviceRunLogDO::getTotalRunTime,
-                        (v1, v2) -> v1 // 解决key重复问题,保留第一个值(根据业务调整)
-                ));
-
-        // 3. 并行处理累计计算(CPU密集型,并行提速)
-        sumDataList.forEach(fill -> {
+        sumDataList1.forEach(fill->{
             try {
-                BigDecimal total = BigDecimal.ZERO;
-                for (IotOpeationFillSaveReqVO targetFill : unSumDataList) {
-                    if(targetFill.getModelId()==Long.parseLong(fill.getDefaultValue())&& targetFill.getDeviceId().equals(fill.getDeviceId())){
-                        BigDecimal currentValue = new BigDecimal(targetFill.getFillContent());
-                        // 累加:从缓存获取历史最大值
-                        String key = fill.getDeviceId() + "_" + fill.getPointName();
-                        BigDecimal maxHistory = maxDataMap.getOrDefault(key, BigDecimal.ZERO);
-                        if(maxHistory!=null) {
-                            total = maxHistory.add(currentValue);
-                        }else{
-                            total = fill.getTotalRunTime().add(new BigDecimal(fill.getFillContent()));
-                        }
-                    }
-                }
-                fill.setTotalRunTime(total);
+                // 提前解析defaultValue(模型ID),避免循环内重复解析
+                Long modelId = Long.parseLong(fill.getDefaultValue());
+                // 构建索引键:deviceId_modelId
+                String unSumKey = fill.getDeviceId() + "_" + modelId;
+                // 从索引获取目标数值(O(1)查询)
+                BigDecimal currentValue = unSumDataIndex.getOrDefault(unSumKey, BigDecimal.ZERO);
+                fill.setTotalRunTime(currentValue);
+
             } catch (NumberFormatException e) {
-                //log.warn("DefaultValue转换失败: {}", fill.getDefaultValue());
+                // 补充日志,便于问题排查
+                log.warn("累计数据处理失败:defaultValue转换异常,fillId={}, defaultValue={}",
+                        fill.getId(), fill.getDefaultValue(), e);
+            } catch (Exception e) {
+                // 兜底异常处理,避免单条数据失败导致整体中断
+                log.error("累计数据处理异常:fillId={}", fill.getId(), e);
             }
         });
-    }*/
+    }
+
 
 
 

+ 4 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/stat/IotReportOrderController.java

@@ -5,14 +5,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.AllOrderResp;
-import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.OrderVo;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
-import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -20,7 +19,6 @@ import com.google.common.collect.ImmutableMap;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
-import org.apache.xmlbeans.impl.xb.xsdschema.All;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -46,6 +44,7 @@ public class IotReportOrderController {
     private final IotMaintainMapper iotMaintainMapper;
     private final IotInspectOrderMapper iotInspectOrderMapper;
     private final IotOpeationFillMapper iotOpeationFillMapper;
+    private final IotMainWorkOrderMapper iotMainWorkOrderMapper;
     private final DeptUtil deptUtil;
     private final DeptService deptService;
     private final DeptApi deptApi;
@@ -57,7 +56,8 @@ public class IotReportOrderController {
         List<AllOrderResp> maintains = iotMaintainMapper.selectStatusNumber(pageReqVO);
         List<AllOrderResp> inspects = iotInspectOrderMapper.selectStatusNumber(pageReqVO);
         List<AllOrderResp> operations = iotOpeationFillMapper.selectStatusNumber(pageReqVO);
-        return CommonResult.success(ImmutableMap.of("wx", maintains, "xj", inspects, "yx", operations));
+        List<AllOrderResp> workOrders = iotMainWorkOrderMapper.selectStatusNumber(pageReqVO);
+        return CommonResult.success(ImmutableMap.of("wx", maintains, "xj", inspects, "yx", operations, "by", workOrders));
     }
 
 

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorder/IotMainWorkOrderMapper.java

@@ -5,6 +5,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.AllOrderResp;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.MapKey;
@@ -108,4 +110,7 @@ public interface IotMainWorkOrderMapper extends BaseMapperX<IotMainWorkOrderDO>
     IPage<IotMainWorkOrderRespVO> sortedMainWorkOrders(IPage<IotMainWorkOrderDO> page, @Param("reqVO") IotMainWorkOrderPageReqVO reqVO,
                                               @Param("alarmWorkOrderIds") Collection<Long> alarmWorkOrderIds,
                                                        @Param("deptIds") Collection<Long> deptIds, @Param("eligibleWorkOrderIds") Collection<Long> eligibleWorkOrderIds);
+
+
+    List<AllOrderResp> selectStatusNumber(@Param("reqVO") IotMaintainPageReqVO pageReqVO);
 }

+ 22 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMainWorkOrderMapper.xml

@@ -75,4 +75,26 @@
         mwo.id DESC;
     </select>
 
+    <select id="selectStatusNumber" parameterType="cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainPageReqVO"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.stat.vo.AllOrderResp">
+        SELECT status, COUNT(status) AS num FROM rq_iot_main_work_order a
+        <where>
+            a.deleted = 0
+            <if test="reqVO.createTime[0] != null">
+                AND a.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND a.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.deptIds != null and reqVO.deptIds.size &gt; 0">
+                AND a.dept_id IN
+                <foreach collection="reqVO.deptIds" index="index" item="key" open="(" separator="," close=")">
+                    #{key}
+                </foreach>
+            </if>
+        </where>
+
+        GROUP BY status
+    </select>
+
 </mapper>