瀏覽代碼

feat(check): 添加设备恢复使用时重新生成保养任务功能

- 为CheckJobService添加generateJobsForSb方法,支持为指定设备重新生成保养任务
- 在设备状态变更为使用中时,自动调用重新生成保养任务功能
- 优化设备停用清理保养任务逻辑,排除存在审核中/进行中报修单的设备
- 新增RepairApplicationFormMapper的selectSbIdsWithStatus查询方法
- 添加计算保养任务结束日期的辅助方法
- 修复维修完成后更新设备状态的日志记录方式
dazhaxie 1 周之前
父節點
當前提交
fc4b45f8cf

+ 11 - 0
platform-dao/src/main/java/com/platform/dao/mapper/repair/RepairApplicationFormMapper.java

@@ -36,4 +36,15 @@ public interface RepairApplicationFormMapper extends MyMapper<RepairApplicationF
      * @return
      */
     String selectNoById(Object id);
+
+    /**
+     * 统计指定设备ID列表中存在指定状态报修单的数量
+     * 用于判断设备是否正在走维修/审核流程
+     *
+     * @param sbIds  设备ID列表
+     * @param status 报修单状态列表
+     * @return 存在进行中工单的设备ID列表
+     */
+    List<String> selectSbIdsWithStatus(@org.apache.ibatis.annotations.Param("sbIds") List<String> sbIds,
+                                       @org.apache.ibatis.annotations.Param("status") List<Integer> status);
 }

+ 20 - 0
platform-dao/src/main/resources/mapper/repair/RepairApplicationFormMapper.xml

@@ -146,4 +146,24 @@
         from t_repair_application_form
         where id = #{id,jdbcType=VARCHAR}
     </select>
+
+    <!-- 查询存在指定状态报修单的设备ID(用于排除审核中工单的设备) -->
+    <select id="selectSbIdsWithStatus" resultType="java.lang.String">
+        SELECT DISTINCT application.sb_id
+        FROM t_repair_application_form application
+        <where>
+            <if test="sbIds != null and sbIds.size > 0">
+                AND application.sb_id IN
+                <foreach item="item" index="index" collection="sbIds" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="status != null and status.size > 0">
+                AND application.status IN
+                <foreach item="item" index="index" collection="status" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
 </mapper>

+ 6 - 0
platform-service/src/main/java/com/platform/service/check/CheckJobService.java

@@ -173,6 +173,12 @@ public interface CheckJobService extends IBaseService<CheckJob, CheckJobDTO> {
     void generateJobNew();
 
     /**
+     * 为指定设备重新生成保养任务(设备恢复使用时调用)
+     * @param sbId 设备ID
+     */
+    void generateJobsForSb(String sbId);
+
+    /**
      * 定制化初始化任务
      */
     void initJobNew();

+ 133 - 5
platform-service/src/main/java/com/platform/service/check/impl/CheckJobServiceImpl.java

@@ -30,6 +30,7 @@ import com.platform.dao.entity.upms.SysConfig;
 import com.platform.dao.entity.upms.SysFile;
 import com.platform.dao.enums.*;
 import com.platform.dao.mapper.check.*;
+import com.platform.dao.mapper.repair.RepairApplicationFormMapper;
 import com.platform.dao.mapper.sb.SbInfoMapper;
 import com.platform.dao.mapper.sb.SbPositionMapper;
 import com.platform.dao.mapper.upms.SysFileMapper;
@@ -115,6 +116,8 @@ public class CheckJobServiceImpl extends BaseServiceImpl<CheckJobMapper, CheckJo
     private SbPositionMapper sbPositionMapper;
     @Autowired
     private CheckRequirementMapper requirementMapper;
+    @Autowired
+    private RepairApplicationFormMapper repairApplicationFormMapper;
 
     @Value("${upload.root-dir}")
     private String UPLOAD_ROOT_FOLDER;
@@ -269,11 +272,37 @@ public class CheckJobServiceImpl extends BaseServiceImpl<CheckJobMapper, CheckJo
         List<CheckJobVO> list = mapper.selectList(dto);
 
         if (list.size() > 0) {
-            List<String> ids = list.stream().map(CheckJobVO::getId).collect(Collectors.toList());
-            Weekend<CheckJob> weekend = new Weekend<>(CheckJob.class);
-            WeekendCriteria<CheckJob, Object> weekendCriteria = weekend.weekendCriteria();
-            weekendCriteria.andIn(CheckJob::getId, ids);
-            mapper.deleteByExample(weekend);
+            Set<String> allNotInUseSbIds = list.stream()
+                    .map(CheckJobVO::getSbId)
+                    .collect(Collectors.toSet());
+
+            // 排除存在审核中/进行中报修单的设备(避免误删流程中的设备保养任务)
+            // 状态:PROCESSING(2)、WAIT_SUBMIT(3)、NOT_ACCEPTANCE(4)、REBACK(5)
+            List<Integer> activeStatusList = Arrays.asList(
+                    RepairApplicationFormStatusEnum.PROCESSING.getValue(),
+                    RepairApplicationFormStatusEnum.WAIT_SUBMIT.getValue(),
+                    RepairApplicationFormStatusEnum.NOT_ACCEPTANCE.getValue(),
+                    RepairApplicationFormStatusEnum.REBACK.getValue());
+            List<String> sbIdsInProgress = repairApplicationFormMapper.selectSbIdsWithStatus(
+                    new ArrayList<>(allNotInUseSbIds), activeStatusList);
+
+            Set<String> protectedSbIds = new HashSet<>(sbIdsInProgress);
+            log.info("设备停用清理保养任务:非在用设备 {} 台,其中 {} 台有审核中/进行中工单,将保留其保养任务",
+                    allNotInUseSbIds.size(), protectedSbIds.size());
+
+            // 过滤掉有进行中工单的设备
+            List<CheckJobVO> toDeleteList = list.stream()
+                    .filter(job -> !protectedSbIds.contains(job.getSbId()))
+                    .collect(Collectors.toList());
+
+            if (toDeleteList.size() > 0) {
+                List<String> ids = toDeleteList.stream().map(CheckJobVO::getId).collect(Collectors.toList());
+                Weekend<CheckJob> weekend = new Weekend<>(CheckJob.class);
+                WeekendCriteria<CheckJob, Object> weekendCriteria = weekend.weekendCriteria();
+                weekendCriteria.andIn(CheckJob::getId, ids);
+                mapper.deleteByExample(weekend);
+                log.info("已删除 {} 条停用设备的保养任务", ids.size());
+            }
         }
     }
 
@@ -2621,6 +2650,105 @@ public class CheckJobServiceImpl extends BaseServiceImpl<CheckJobMapper, CheckJo
          */
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void generateJobsForSb(String sbId) {
+        if (StringUtils.isBlank(sbId)) {
+            return;
+        }
+        log.info("开始为设备 {} 重新生成保养任务", sbId);
+
+        // 查询该设备关联的所有启用保养标准
+        Weekend<CheckStandard> standardWeekend = new Weekend<>(CheckStandard.class);
+        standardWeekend.weekendCriteria()
+                .andEqualTo(CheckStandard::getSbId, sbId)
+                .andEqualTo(CheckStandard::getEnable, 1);
+        List<CheckStandard> standardList = standardMapper.selectByExample(standardWeekend);
+
+        if (CollectionUtils.isEmpty(standardList)) {
+            log.info("设备 {} 没有启用的保养标准,跳过生成", sbId);
+            return;
+        }
+
+        List<CheckJob> jobList = new ArrayList<>();
+        int generatedCount = 0;
+
+        for (CheckStandard standard : standardList) {
+            // 查询该标准是否已有未完成的任务
+            Weekend<CheckJob> jobWeekend = new Weekend<>(CheckJob.class);
+            jobWeekend.weekendCriteria()
+                    .andEqualTo(CheckJob::getSbId, sbId)
+                    .andEqualTo(CheckJob::getStandardId, standard.getId())
+                    .andNotEqualTo(CheckJob::getStatus, CheckJobStatusEnum.FINISHED.getValue());
+            List<CheckJob> existingJobs = mapper.selectByExample(jobWeekend);
+
+            if (!CollectionUtils.isEmpty(existingJobs)) {
+                log.debug("保养标准 {} 设备 {} 已有待执行任务,跳过", standard.getId(), sbId);
+                continue;
+            }
+
+            // 生成新的保养任务
+            CheckJob checkJob = new CheckJob();
+            checkJob.setId(IdGeneratorUtils.getObjectId());
+            checkJob.setName(standard.getName());
+            checkJob.setType(standard.getType() != null ? standard.getType() : 2);
+            checkJob.setSbId(sbId);
+            checkJob.setStandardId(standard.getId());
+            checkJob.setRequirement(standard.getRequirement());
+            checkJob.setRemark(standard.getRemark());
+            checkJob.setStatus(CheckJobStatusEnum.NOT_EXECUTE.getValue());
+            checkJob.setReceiveOvertime(false);
+            checkJob.setSbStatus(SbInfoStatusEnum.IN_USE.getValue());
+            checkJob.setStandardHours(standard.getStandardHours());
+            checkJob.setRealHours(standard.getRealHours());
+            checkJob.setCreatedTime(LocalDateTime.now());
+            checkJob.setUpdateTime(LocalDateTime.now());
+
+            // 设置开始时间和结束时间
+            LocalDate startDate = LocalDate.now();
+            checkJob.setStartTime(startDate);
+            if (standard.getPeriod() != null && standard.getPeriodType() != null) {
+                LocalDate endDate = calculateEndDate(startDate, standard.getPeriod(), standard.getPeriodType());
+                checkJob.setEndTime(endDate);
+            } else {
+                checkJob.setEndTime(startDate.plusDays(7));
+            }
+
+            jobList.add(checkJob);
+            generatedCount++;
+        }
+
+        if (!CollectionUtils.isEmpty(jobList)) {
+            mapper.insertListforComplex(jobList);
+            log.info("为设备 {} 生成了 {} 条新的保养任务", sbId, generatedCount);
+        } else {
+            log.info("设备 {} 无需生成新任务", sbId);
+        }
+    }
+
+    /**
+     * 计算结束日期
+     */
+    private LocalDate calculateEndDate(LocalDate startDate, Integer period, Integer periodType) {
+        if (period == null || periodType == null) {
+            return startDate.plusDays(7);
+        }
+        switch (periodType) {
+            case CommonConstants.DAY:
+                return startDate.plusDays(period);
+            case CommonConstants.WEEK:
+                return startDate.plusWeeks(period);
+            case CommonConstants.MONTH:
+                return startDate.plusMonths(period);
+            case CommonConstants.SEASON:
+                return startDate.plusMonths(period * 3L);
+            case CommonConstants.YEAR:
+                return startDate.plusYears(period);
+            default:
+                return startDate.plusDays(period);
+        }
+    }
+
     /**
      * 下载PDF文件
      * 

+ 7 - 4
platform-service/src/main/java/com/platform/service/repair/impl/RepairApplicationFormServiceImpl.java

@@ -837,10 +837,13 @@ public class RepairApplicationFormServiceImpl
         this.saveRepairFile(dto);
         super.modModelByPrimaryKey(applicationForm);
 
-        // 更新设备状态为使用中
-        SbInfo sbInfo = sbInfoService.getModelById(applicationForm.getSbId());
-        sbInfo.setStatus(SbInfoStatusEnum.IN_USE.getValue());
-        sbInfoService.modModelByPrimaryKey(sbInfo);
+        // 更新设备状态为使用中(走带状态变更日志的链路)
+        SbInfoDTO sbInfoDTO = new SbInfoDTO();
+        sbInfoDTO.setId(applicationForm.getSbId());
+        sbInfoDTO.setStatus(SbInfoStatusEnum.IN_USE.getValue());
+        sbInfoDTO.setChangeReason("维修完成恢复使用");
+        sbInfoDTO.setActualUser(applicationForm.getRepairUserName());
+        sbInfoService.updateStatus(sbInfoDTO);
     }
 
     /**

+ 56 - 42
platform-service/src/main/java/com/platform/service/sb/impl/SbInfoServiceImpl.java

@@ -57,6 +57,7 @@ import com.platform.dao.vo.sb.SbInfoScreenVO;
 import com.platform.dao.vo.sb.SbInfoVO;
 import com.platform.service.base.impl.BaseServiceImpl;
 import com.platform.service.business.ActivitiBusinessService;
+import com.platform.service.check.CheckJobService;
 import com.platform.service.check.CheckStandardService;
 import com.platform.service.event.WorkplaceBacklogEvent;
 import com.platform.service.part.PartInfoService;
@@ -118,6 +119,7 @@ public class SbInfoServiceImpl extends BaseServiceImpl<SbInfoMapper, SbInfo, SbI
     private final ActivitiBusinessService activitiBusinessService;
     private final CheckStandardMapper checkStandardMapper;
     private final CheckJobMapper checkJobMapper;
+    private final CheckJobService checkJobService;
     private final CheckStandardSpareMapper checkStandardSpareMapper;
 
     private final String useArea = "5e64ac691c527828b2114da0";
@@ -619,21 +621,21 @@ public class SbInfoServiceImpl extends BaseServiceImpl<SbInfoMapper, SbInfo, SbI
             actualUser = sysUserMapper.selectByPrimaryKey(userInfo.getUserId()).getRealName();
         }
         LocalDateTime now = LocalDateTime.now();
-        SbStatusLog log = new SbStatusLog();
-        log.setSbId(model.getId());
-        log.setActualUser(actualUser);
-        log.setId(IdGeneratorUtils.getObjectId());
-        log.setChangeReason(model.getChangeReason());
-        log.setAfterStatus(model.getStatus());
-        log.setPreStatus(old.getStatus());
-        log.setChangeTime(now);
-        log.setChangeUserId(userInfo.getUserId());
-        log.setCreatedTime(now);
-        log.setCreatedUserId(userInfo.getUserId());
-        log.setUpdateTime(now);
-        log.setUpdateUserId(userInfo.getUserId());
-        log.setRemark("");
-        sbStatusLogMapper.insert(log);
+        SbStatusLog log1 = new SbStatusLog();
+        log1.setSbId(model.getId());
+        log1.setActualUser(actualUser);
+        log1.setId(IdGeneratorUtils.getObjectId());
+        log1.setChangeReason(model.getChangeReason());
+        log1.setAfterStatus(model.getStatus());
+        log1.setPreStatus(old.getStatus());
+        log1.setChangeTime(now);
+        log1.setChangeUserId(userInfo.getUserId());
+        log1.setCreatedTime(now);
+        log1.setCreatedUserId(userInfo.getUserId());
+        log1.setUpdateTime(now);
+        log1.setUpdateUserId(userInfo.getUserId());
+        log1.setRemark("");
+        sbStatusLogMapper.insert(log1);
 
         // 新增停机记录
         if (model.getStatus() != null && model.getStatus().equals(SbInfoStatusEnum.IN_STOP.getValue())) {
@@ -669,6 +671,13 @@ public class SbInfoServiceImpl extends BaseServiceImpl<SbInfoMapper, SbInfo, SbI
             stopLog.setUpdateTime(now);
             stopLog.setUpdateUserId(userInfo.getUserId());
             sbStopLogMapper.updateByPrimaryKey(stopLog);
+
+            // 设备恢复使用时,自动重新生成保养任务
+            try {
+                checkJobService.generateJobsForSb(model.getId());
+            } catch (Exception e) {
+                log.error("设备 {} 恢复使用时生成保养任务失败", model.getId(), e);
+            }
         }
     }
 
@@ -689,21 +698,21 @@ public class SbInfoServiceImpl extends BaseServiceImpl<SbInfoMapper, SbInfo, SbI
             actualUser = sysUserMapper.selectByPrimaryKey(userId).getRealName();
         }
         LocalDateTime now = LocalDateTime.now();
-        SbStatusLog log = new SbStatusLog();
-        log.setSbId(model.getId());
-        log.setId(IdGeneratorUtils.getObjectId());
-        log.setChangeReason(model.getChangeReason());
-        log.setActualUser(actualUser);
-        log.setAfterStatus(model.getStatus());
-        log.setPreStatus(old.getStatus());
-        log.setChangeTime(now);
-        log.setChangeUserId(userId);
-        log.setCreatedTime(now);
-        log.setCreatedUserId(userId);
-        log.setUpdateTime(now);
-        log.setUpdateUserId(userId);
-        log.setRemark("");
-        sbStatusLogMapper.insert(log);
+        SbStatusLog log1 = new SbStatusLog();
+        log1.setSbId(model.getId());
+        log1.setId(IdGeneratorUtils.getObjectId());
+        log1.setChangeReason(model.getChangeReason());
+        log1.setActualUser(actualUser);
+        log1.setAfterStatus(model.getStatus());
+        log1.setPreStatus(old.getStatus());
+        log1.setChangeTime(now);
+        log1.setChangeUserId(userId);
+        log1.setCreatedTime(now);
+        log1.setCreatedUserId(userId);
+        log1.setUpdateTime(now);
+        log1.setUpdateUserId(userId);
+        log1.setRemark("");
+        sbStatusLogMapper.insert(log1);
 
         // 新增停机记录
         if (model.getStatus() != null && model.getStatus().equals(SbInfoStatusEnum.IN_STOP.getValue())) {
@@ -726,19 +735,24 @@ public class SbInfoServiceImpl extends BaseServiceImpl<SbInfoMapper, SbInfo, SbI
             Weekend<SbStopLog> weekend = new Weekend<>(SbStopLog.class);
             weekend.weekendCriteria().andEqualTo(SbStopLog::getSbId, model.getId()).andEqualTo(SbStopLog::getStatus, 0);
             SbStopLog stopLog = sbStopLogMapper.selectOneByExample(weekend);
-            // 创建新的记录,直接跳过,不记录了
-            if (stopLog == null) {
-                return;
+            if (stopLog != null) {
+                stopLog.setStartUserId(actualUser);
+                stopLog.setStartTime(now);
+                stopLog.setStartReason(model.getChangeReason());
+                stopLog.setStatus(1);
+                stopLog.setStopDuration(
+                        new BigDecimal(DateUtils.getDurationMinutes(stopLog.getStopTime(), stopLog.getStartTime())));
+                stopLog.setUpdateTime(now);
+                stopLog.setUpdateUserId(userId);
+                sbStopLogMapper.updateByPrimaryKey(stopLog);
+            }
+
+            // 设备恢复使用时,自动重新生成保养任务
+            try {
+                checkJobService.generateJobsForSb(model.getId());
+            } catch (Exception e) {
+                log.error("设备 {} 恢复使用时生成保养任务失败", model.getId(), e);
             }
-            stopLog.setStartUserId(actualUser);
-            stopLog.setStartTime(now);
-            stopLog.setStartReason(model.getChangeReason());
-            stopLog.setStatus(1);
-            stopLog.setStopDuration(
-                    new BigDecimal(DateUtils.getDurationMinutes(stopLog.getStopTime(), stopLog.getStartTime())));
-            stopLog.setUpdateTime(now);
-            stopLog.setUpdateUserId(userId);
-            sbStopLogMapper.updateByPrimaryKey(stopLog);
         }
     }