Browse Source

pms 查询保养项的累计运行时长 累计公里数 逻辑调整

zhangcl 1 month ago
parent
commit
0b9e49a71d

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

@@ -11,7 +11,10 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.ThingsModelDTO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceallotlog.vo.IotDeviceAllotSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonRelationSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.vo.*;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSimpleRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotProductClassifyDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.YfDeviceDO;
@@ -46,8 +49,6 @@ import javax.annotation.security.PermitAll;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.sql.Timestamp;
-import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -102,7 +103,7 @@ public class IotDeviceController {
 
     @PostMapping("/saveDeviceAllot")
     @Operation(summary = "设备调拨")
-    @PreAuthorize("@ss.hasPermission('rq:iot-device:create')")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-allot-log:create')")
     public CommonResult<Long> saveDeviceAllot(@Valid @RequestBody List<IotDeviceAllotSaveReqVO> reqVOS) {
         return success(iotDeviceAllotLogService.saveDeviceAllot(reqVOS));
     }

+ 41 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicerunlog/IotDeviceRunLogService.java

@@ -9,6 +9,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDevice
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -74,11 +76,49 @@ public interface IotDeviceRunLogService {
         List<IotDeviceRunLogRespVO> list = distinctDevices(ids);
         // 删除集合中的NULL元素
         list.removeIf(deviceLog -> isAllFieldsNull(deviceLog));
-        return CollectionUtils.convertMap(list, IotDeviceRunLogRespVO::getDeviceId);
+        // 暂时将查询出的2条记录设置为1条
+        // device_id	total_run_time	total_mileage	point_name				point_code
+        // 136			2444.00			0.00			台上发动机累计运转时长	    sc
+        // 136			0.00			16510.00		底盘发动机累计公里数	    gls
+        // 按 deviceId 分组并合并数据
+        Map<Long, IotDeviceRunLogRespVO> mergedMap = new HashMap<>();
+        for (IotDeviceRunLogRespVO log : list) {
+            Long deviceId = log.getDeviceId();
+            // 跳过无效设备ID
+            if (deviceId == null) continue;
+
+            if (mergedMap.containsKey(deviceId)) {
+                // 合并已有记录
+                IotDeviceRunLogRespVO existing = mergedMap.get(deviceId);
+                mergeLogRecords(existing, log);
+            } else {
+                // 首次遇到该设备ID,直接放入Map
+                mergedMap.put(deviceId, log);
+            }
+        }
+        List<IotDeviceRunLogRespVO> mergedList = new ArrayList<>(mergedMap.values());
+        return CollectionUtils.convertMap(mergedList, IotDeviceRunLogRespVO::getDeviceId);
     }
 
     // 检查是否所有字段都为NULL的辅助方法
     default boolean isAllFieldsNull(IotDeviceRunLogRespVO deviceLog) {
         return ObjectUtil.isEmpty(deviceLog.getDeviceId());
     }
+
+    default void mergeLogRecords(IotDeviceRunLogRespVO target, IotDeviceRunLogRespVO source) {
+        // 累加数值字段(假设类型为BigDecimal)
+        if (target.getTotalRunTime() != null && source.getTotalRunTime() != null) {
+            target.setTotalRunTime(target.getTotalRunTime().add(source.getTotalRunTime()));
+        } else if (source.getTotalRunTime() != null) {
+            target.setTotalRunTime(source.getTotalRunTime());
+        }
+
+        if (target.getTotalMileage() != null && source.getTotalMileage() != null) {
+            target.setTotalMileage(target.getTotalMileage().add(source.getTotalMileage()));
+        } else if (source.getTotalMileage() != null) {
+            target.setTotalMileage(source.getTotalMileage());
+        }
+        // 非数值字段保持target的原始值(即第一条记录的值)
+        // 不需要额外操作
+    }
 }

+ 11 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceRunLogMapper.xml

@@ -10,16 +10,22 @@
      -->
     <select id="distinctDevices"
             resultType="cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO">
-        SELECT device_id, MAX(total_run_time) AS total_run_time, MAX(total_mileage) AS total_mileage
-        FROM rq_iot_device_run_log
-        WHERE deleted = 0
+        SELECT drl.device_id,
+        MAX(CASE WHEN mta.`code` = 'sc' THEN drl.total_run_time ELSE 0 END) AS total_run_time,
+        MAX(CASE WHEN mta.`code` = 'gls' THEN drl.total_run_time ELSE 0 END) AS total_mileage,
+        MAX(drl.point_name) point_name,
+        mta.`code`	point_code
+        FROM rq_iot_device_run_log drl
+        LEFT JOIN rq_iot_model_template_attrs mta ON (mta.`name` = drl.point_name AND (mta.`code` ='sc' OR mta.`code`='gls'))
+        WHERE drl.deleted = 0
         <if test="deviceIds != null and deviceIds.size &gt; 0">
-            AND device_id IN
+            AND drl.device_id IN
             <foreach collection="deviceIds" index="index" item="key" open="(" separator="," close=")">
                 #{key}
             </foreach>
         </if>
-        GROUP BY device_id
+        AND (mta.`code` = 'sc' OR mta.`code` = 'gls')
+        GROUP BY drl.device_id, mta.`code`
     </select>
 
 </mapper>