Browse Source

✨ feat(mes): 新增维修工单编码唯一性校验及设备编号字段

新增维修工单编码的唯一性校验逻辑,确保在创建和更新维修工单时编码不重复。同时,新增设备编号字段以便于关联设备信息,提升维修工单管理的准确性和完整性。
YunaiV 4 months ago
parent
commit
fd3a556d2d

+ 3 - 0
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/vo/MesDvRepairPageReqVO.java

@@ -23,6 +23,9 @@ public class MesDvRepairPageReqVO extends PageParam {
     @Schema(description = "维修工单名称", example = "注塑机维修")
     private String name;
 
+    @Schema(description = "设备编号", example = "1")
+    private Long machineryId;
+
     @Schema(description = "维修结果", example = "1")
     private Integer result;
 

+ 5 - 0
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/repair/MesDvRepairMapper.java

@@ -19,12 +19,17 @@ public interface MesDvRepairMapper extends BaseMapperX<MesDvRepairDO> {
         return selectPage(reqVO, new LambdaQueryWrapperX<MesDvRepairDO>()
                 .likeIfPresent(MesDvRepairDO::getCode, reqVO.getCode())
                 .likeIfPresent(MesDvRepairDO::getName, reqVO.getName())
+                .eqIfPresent(MesDvRepairDO::getMachineryId, reqVO.getMachineryId())
                 .eqIfPresent(MesDvRepairDO::getResult, reqVO.getResult())
                 .eqIfPresent(MesDvRepairDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(MesDvRepairDO::getRequireDate, reqVO.getRequireDate())
                 .orderByDesc(MesDvRepairDO::getId));
     }
 
+    default MesDvRepairDO selectByCode(String code) {
+        return selectOne(MesDvRepairDO::getCode, code);
+    }
+
     default Long selectCountByMachineryId(Long machineryId) {
         return selectCount(MesDvRepairDO::getMachineryId, machineryId);
     }

+ 1 - 0
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java

@@ -178,6 +178,7 @@ public interface ErrorCodeConstants {
     // ========== MES 设备管理-维修工单(1-040-303-000) ==========
     ErrorCode DV_REPAIR_NOT_EXISTS = new ErrorCode(1_040_303_000, "维修工单不存在");
     ErrorCode DV_REPAIR_NOT_DRAFT = new ErrorCode(1_040_303_001, "维修工单已确认,不允许修改或删除");
+    ErrorCode DV_REPAIR_CODE_DUPLICATE = new ErrorCode(1_040_303_002, "维修工单编码已存在");
     // ========== MES 设备管理-维修工单行(1-040-303-100) ==========
     ErrorCode DV_REPAIR_LINE_NOT_EXISTS = new ErrorCode(1_040_303_100, "维修工单行不存在");
 

+ 7 - 0
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairLineService.java

@@ -52,4 +52,11 @@ public interface MesDvRepairLineService {
      */
     PageResult<MesDvRepairLineDO> getRepairLinePage(MesDvRepairLinePageReqVO pageReqVO);
 
+    /**
+     * 根据维修工单编号删除所有行
+     *
+     * @param repairId 维修工单编号
+     */
+    void deleteByRepairId(Long repairId);
+
 }

+ 5 - 0
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairLineServiceImpl.java

@@ -99,4 +99,9 @@ public class MesDvRepairLineServiceImpl implements MesDvRepairLineService {
         return repairLineMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public void deleteByRepairId(Long repairId) {
+        repairLineMapper.deleteByRepairId(repairId);
+    }
+
 }

+ 33 - 8
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairServiceImpl.java

@@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.dv.repair.MesDvRepairDO;
-import cn.iocoder.yudao.module.mes.dal.mysql.dv.repair.MesDvRepairLineMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.dv.repair.MesDvRepairMapper;
 import cn.iocoder.yudao.module.mes.enums.dv.MesDvRepairResultEnum;
 import cn.iocoder.yudao.module.mes.enums.dv.MesDvRepairStatusEnum;
@@ -16,6 +15,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
+import java.time.LocalDateTime;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 
@@ -30,15 +31,19 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
 
     @Resource
     private MesDvRepairMapper repairMapper;
+
     @Resource
-    private MesDvRepairLineMapper repairLineMapper;
+    private MesDvRepairLineService repairLineService;
     @Resource
     private MesDvMachineryService machineryService;
 
     @Override
     public Long createRepair(MesDvRepairSaveReqVO createReqVO) {
-        // 1. 校验关联数据
+        // TODO @AI:抽成 validateXXSaveData(vo);
+        // 1.1 校验关联数据
         validateRepairRelation(createReqVO);
+        // 1.2 校验编码唯一
+        validateCodeUnique(null, createReqVO.getCode());
 
         // 2. 插入
         MesDvRepairDO repair = BeanUtils.toBean(createReqVO, MesDvRepairDO.class);
@@ -51,8 +56,11 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
     public void updateRepair(MesDvRepairSaveReqVO updateReqVO) {
         // 1.1 校验存在,且状态为草稿
         validateRepairDraft(updateReqVO.getId());
+        // TODO @AI:抽成 validateXXSaveData(vo);
         // 1.2 校验关联数据
         validateRepairRelation(updateReqVO);
+        // 1.3 校验编码唯一
+        validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
 
         // 2. 更新
         MesDvRepairDO updateObj = BeanUtils.toBean(updateReqVO, MesDvRepairDO.class);
@@ -68,7 +76,7 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
         // 删除
         repairMapper.deleteById(id);
         // 级联删除子表
-        repairLineMapper.deleteByRepairId(id);
+        repairLineService.deleteByRepairId(id);
     }
 
     private void validateRepairRelation(MesDvRepairSaveReqVO reqVO) {
@@ -76,6 +84,20 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
         machineryService.validateMachineryExists(reqVO.getMachineryId());
     }
 
+    private void validateCodeUnique(Long id, String code) {
+        if (code == null) {
+            return;
+        }
+        MesDvRepairDO repair = repairMapper.selectByCode(code);
+        // TODO @AI:参考别的模块,notEquals
+        if (repair == null) {
+            return;
+        }
+        if (id == null || !id.equals(repair.getId())) {
+            throw exception(DV_REPAIR_CODE_DUPLICATE);
+        }
+    }
+
     @Override
     public void validateRepairExists(Long id) {
         if (repairMapper.selectById(id) == null) {
@@ -95,6 +117,7 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
      * @return 维修工单
      */
     public MesDvRepairDO validateRepairDraft(Long id) {
+        // TODO @AI:复用 validateRepairExists 方法
         MesDvRepairDO repair = repairMapper.selectById(id);
         if (repair == null) {
             throw exception(DV_REPAIR_NOT_EXISTS);
@@ -120,10 +143,11 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
         // 1. 校验存在,且状态为草稿
         validateRepairDraft(id);
 
-        // 2. 更新状态为已确认,结果为通过
+        // 2. 更新状态为已确认,结果为通过,自动设置验收日期
         repairMapper.updateById(new MesDvRepairDO().setId(id)
                 .setStatus(MesDvRepairStatusEnum.CONFIRMED.getStatus())
-                .setResult(MesDvRepairResultEnum.PASS.getResult()));
+                .setResult(MesDvRepairResultEnum.PASS.getResult())
+                .setConfirmDate(LocalDateTime.now()));
     }
 
     @Override
@@ -131,10 +155,11 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
         // 1. 校验存在,且状态为草稿
         validateRepairDraft(id);
 
-        // 2. 更新状态为已确认,结果为不通过
+        // 2. 更新状态为已确认,结果为不通过,自动设置验收日期
         repairMapper.updateById(new MesDvRepairDO().setId(id)
                 .setStatus(MesDvRepairStatusEnum.CONFIRMED.getStatus())
-                .setResult(MesDvRepairResultEnum.FAIL.getResult()));
+                .setResult(MesDvRepairResultEnum.FAIL.getResult())
+                .setConfirmDate(LocalDateTime.now()));
     }
 
 }