فهرست منبع

调整作业隔离节点和解除隔离节点的作业进度

车车 3 ماه پیش
والد
کامیت
2630f71fd4

+ 14 - 3
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workflowworknode/vo/WorkflowWorkNodeRespVO.java

@@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknod
 
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknodeuser.vo.WorkflowWorkNodeUserRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkPointRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkTicketKeyRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkTicketLockRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkTicketRespVO;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -134,13 +136,13 @@ public class WorkflowWorkNodeRespVO {
     @ExcelProperty("endTime")
     private LocalDateTime endTime;
 
+    @Schema(description = "任务进度(1取设备 /解除共锁 2上锁/取设备解锁 3共锁/还设备)")
+    private String nodeProgress;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
-    @Schema(description = "节点人员数据")
-    private List<WorkflowWorkNodeUserRespVO> nodeUserList;
-
     @Schema(description = "负责人", example = "7919")
     private String workerUserName;
 
@@ -165,4 +167,13 @@ public class WorkflowWorkNodeRespVO {
     @Schema(description = "节点的lock数据")
     private List<WorkflowWorkTicketLockRespVO> locks;
 
+    @Schema(description = "节点key数据")
+    private List<WorkflowWorkTicketKeyRespVO> keys;
+
+    @Schema(description = "节点人员数据")
+    private List<WorkflowWorkNodeUserRespVO> nodeUserList;
+
+    @Schema(description = "节点ticket数据")
+    private WorkflowWorkTicketRespVO ticketVO;
+
 }

+ 12 - 4
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/workdesign/workhandle/WorkflowWorkTicketController.java

@@ -4,14 +4,12 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.*;
 import cn.iocoder.yudao.module.iscs.service.workdesign.WorkflowWorkHandleService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -76,4 +74,14 @@ public class WorkflowWorkTicketController {
         return success(workflowWorkHandleService.updateLockBack(vo));
     }
 
+
+    // 硬件获取作业票
+    @GetMapping("/getWorkTicketByNodeId")
+    @Operation(summary = "获得作业票通过nodeId")
+    @Parameter(name = "nodeId", description = "编号", required = true, example = "1024")
+    public CommonResult<WorkflowWorkTicketRespVO> getWorkTicketByNodeId(@RequestParam("nodeId") Long nodeId) {
+        WorkflowWorkTicketRespVO workTicketByNodeId = workflowWorkHandleService.getWorkTicketByNodeId(nodeId);
+        return success(workTicketByNodeId);
+    }
+
 }

+ 4 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/workdesign/WorkflowWorkNodeDO.java

@@ -156,5 +156,9 @@ public class WorkflowWorkNodeDO extends BaseDO {
      * 结束时间
      */
     private LocalDateTime endTime;
+    /**
+     * 任务进度(1取设备 /解除共锁 2上锁/取设备解锁 3共锁/还设备)
+     */
+    private String nodeProgress;
 
 }

+ 3 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkHandleService.java

@@ -28,4 +28,7 @@ public interface WorkflowWorkHandleService {
 
     BackDataVO updateLockBack(KeyBackVO vo);
 
+    WorkflowWorkTicketRespVO getWorkTicketByNodeId(Long nodeId);
+
+
 }

+ 65 - 8
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkHandleServiceImpl.java

@@ -1,11 +1,13 @@
 package cn.iocoder.yudao.module.iscs.service.workdesign;
 
 import cn.hutool.core.lang.Assert;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.ApprovalNodeReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.*;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.key.KeyDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.lock.LockDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.*;
+import cn.iocoder.yudao.module.iscs.enums.WorkTypeEnum;
 import cn.iocoder.yudao.module.iscs.service.key.KeyService;
 import cn.iocoder.yudao.module.iscs.service.lock.LockService;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
@@ -55,14 +57,22 @@ public class WorkflowWorkHandleServiceImpl implements WorkflowWorkHandleService
     @Autowired
     private WorkflowWorkPointService workflowWorkPointService;
 
+    @Transactional
     @Override
     public Boolean insertWorkTicket(WorkHandleSaveReqVO vo) {
-        Assert.notNull(vo.getNodeId(), "nodeId不可为空");
+        Long nodeId = vo.getNodeId();
+        Assert.notNull(nodeId, "nodeId不可为空");
         // 检查是否重复下发作业
-        List<WorkflowWorkTicketDO> list = ticketService.list(Wrappers.<WorkflowWorkTicketDO>lambdaQuery().eq(WorkflowWorkTicketDO::getNodeId, vo.getNodeId()));
-        Assert.isTrue(list.isEmpty(), "切勿重复下发作业");
+        WorkflowWorkTicketDO ticketDO = ticketService.getOne(Wrappers.<WorkflowWorkTicketDO>lambdaQuery().eq(WorkflowWorkTicketDO::getNodeId, vo.getNodeId()));
+        if (ticketDO != null) {
+            // 删除之前的数据覆盖
+            ticketService.remove(Wrappers.<WorkflowWorkTicketDO>lambdaQuery().eq(WorkflowWorkTicketDO::getNodeId, nodeId));
+            keyService.remove(Wrappers.<WorkflowWorkTicketKeyDO>lambdaQuery().eq(WorkflowWorkTicketKeyDO::getNodeId, nodeId));
+            lockService.remove(Wrappers.<WorkflowWorkTicketLockDO>lambdaQuery().eq(WorkflowWorkTicketLockDO::getNodeId, nodeId));
+        }
+        // Assert.isTrue(list.isEmpty(), "切勿重复下发作业");
         WorkflowWorkNodeDO nodeDO = workflowWorkNodeService.getById(vo.getNodeId());
-
+        Assert.notNull(nodeDO, "任务nodeId = " + nodeId + "不存在");
         LocalDateTime now = LocalDateTime.now();
         Long ticketId = 0L;
         if (StringUtils.isNotBlank(vo.getTicketContent())) {
@@ -104,9 +114,38 @@ public class WorkflowWorkHandleServiceImpl implements WorkflowWorkHandleService
             }
             lockService.saveBatch(lockDOList);
         }
+
+        // 如果是隔离任务检查是不是取锁完成
+        if (nodeDO.getType().equals(WorkTypeEnum.ISOLATION.value)) {
+            // 1.检查钥匙有没有取
+            // 2.检查挂锁和点位是不是数量相等
+            Integer pointCount = (int) pointService.count(Wrappers.<WorkflowWorkPointDO>lambdaQuery()
+                    .eq(WorkflowWorkPointDO::getNodeId, nodeId));
+            if (!vo.getKeyNfcList().isEmpty() && !vo.getLockNfcList().isEmpty() && pointCount.equals(vo.getLockNfcList().size())) {
+                // 这样就算隔离的第一步骤完成,更新进度
+                workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
+                        .eq(WorkflowWorkNodeDO::getNodeProgress, "2"));
+            }
+        }
+
+        // 如果是解除隔离任务检查是不是取锁完成
+        if (nodeDO.getType().equals(WorkTypeEnum.RELEASEISOLATION.value)) {
+            // 1.检查钥匙有没有取
+            if (!vo.getKeyNfcList().isEmpty()) {
+                // 这样就算解除隔离的第二步骤完成,更新进度
+                workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
+                        .eq(WorkflowWorkNodeDO::getNodeProgress, "3"));
+            }
+        }
+
         return true;
     }
 
+    /**
+     * 点位上锁(归还钥匙)
+     * @param keyBackVO
+     * @return
+     */
     @Transactional
     @Override
     public BackDataVO updatePointLock(KeyBackVO keyBackVO) {
@@ -174,6 +213,10 @@ public class WorkflowWorkHandleServiceImpl implements WorkflowWorkHandleService
                                 .eq(WorkflowWorkNodeUserDO::getType, "jtlocker")
                                 .set(WorkflowWorkNodeUserDO::getStatus, "1")
                                 .set(WorkflowWorkNodeUserDO::getLockTime, now));
+                        // 更新nodeProgress
+                        workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
+                                .eq(WorkflowWorkNodeDO::getId, nodeDO.getId())
+                                .set(WorkflowWorkNodeDO::getNodeProgress, "3"));
                     }
 
                     // 帮助归还钥匙
@@ -256,13 +299,13 @@ public class WorkflowWorkHandleServiceImpl implements WorkflowWorkHandleService
         AdminUserDO adminUserDO = adminUserService.getOne(Wrappers.<AdminUserDO>lambdaQuery()
                 .eq(AdminUserDO::getCardNfc, vo.getCardNfc()));
         Assert.notNull(adminUserDO, "共锁失败,工卡未录入!");
-        WorkflowWorkNodeDO byId = workflowWorkNodeService.getById(vo.getNodeId());
+        WorkflowWorkNodeDO nodeDO = workflowWorkNodeService.getById(vo.getNodeId());
         Long fatherNodeId = 0L;
-        if (StringUtils.isNotBlank(byId.getIsolationNodeUuid())) {
+        if (StringUtils.isNotBlank(nodeDO.getIsolationNodeUuid())) {
             // 如果是解除节点的查询操作,则查询对应隔离节点的数据
             WorkflowWorkNodeDO one = workflowWorkNodeService.getOne(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
-                    .eq(WorkflowWorkNodeDO::getWorkId, byId.getWorkId())
-                    .eq(WorkflowWorkNodeDO::getUuid, byId.getIsolationNodeUuid()));
+                    .eq(WorkflowWorkNodeDO::getWorkId, nodeDO.getWorkId())
+                    .eq(WorkflowWorkNodeDO::getUuid, nodeDO.getIsolationNodeUuid()));
             fatherNodeId = one.getId();
         }
         // 检查是否是需要的共锁人
@@ -276,6 +319,10 @@ public class WorkflowWorkHandleServiceImpl implements WorkflowWorkHandleService
                 .eq(WorkflowWorkNodeUserDO::getId, nodeUserDO.getId())
                 .set(WorkflowWorkNodeUserDO::getUnlockTime, now)
                 .set(WorkflowWorkNodeUserDO::getStatus, "2"));
+        // 更新nodeProgress
+        workflowWorkNodeService.update(Wrappers.<WorkflowWorkNodeDO>lambdaUpdate()
+                .eq(WorkflowWorkNodeDO::getId, nodeDO.getId())
+                .set(WorkflowWorkNodeDO::getNodeProgress, "2"));
         return true;
     }
 
@@ -549,5 +596,15 @@ public class WorkflowWorkHandleServiceImpl implements WorkflowWorkHandleService
         return backDataVO;
     }
 
+    @Override
+    public WorkflowWorkTicketRespVO getWorkTicketByNodeId(Long nodeId) {
+        // 开始查询
+        WorkflowWorkNodeDO nodeDO = workflowWorkNodeService.getById(nodeId);
+        Assert.notNull(nodeDO, "任务不存在");
+        WorkflowWorkTicketDO ticketDO = ticketService.getOne(Wrappers.<WorkflowWorkTicketDO>lambdaQuery().eq(WorkflowWorkTicketDO::getNodeId, nodeId));
+        WorkflowWorkTicketRespVO bean = BeanUtils.toBean(ticketDO, WorkflowWorkTicketRespVO.class);
+        return bean;
+    }
+
 
 }

+ 17 - 1
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/workdesign/WorkflowWorkServiceImpl.java

@@ -12,7 +12,9 @@ import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknode.vo.WorkflowWorkNodeRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workflowworknodeuser.vo.WorkflowWorkNodeUserRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkPointRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkTicketKeyRespVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkTicketLockRespVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.workdesign.workhandle.vo.WorkflowWorkTicketRespVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.workdesign.*;
 import cn.iocoder.yudao.module.iscs.dal.mysql.workdesign.WorkflowWorkMapper;
 import cn.iocoder.yudao.module.iscs.utils.MonthTimeUtil;
@@ -61,6 +63,8 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
     private WorkflowWorkTicketLockService workflowWorkTicketLockService;
     @Resource
     private WorkflowWorkTicketKeyService workflowWorkTicketKeyService;
+    @Resource
+    private WorkflowWorkTicketService workflowWorkTicketService;
 
     @Transactional
     @Override
@@ -327,7 +331,13 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
             phone = "(" + user.getMobile() + ")";
         }
         bean.setInitiatorName(workflowWorkDO.getInitiatorName() + phone);
-        // 获取人员信息
+        // 1.作业票信息
+        WorkflowWorkTicketDO ticketDO = workflowWorkTicketService.getOne(Wrappers.<WorkflowWorkTicketDO>lambdaQuery()
+                .eq(WorkflowWorkTicketDO::getNodeId, nodeId));
+        bean.setTicketVO(BeanUtils.toBean(ticketDO, WorkflowWorkTicketRespVO.class));
+
+        // ----------------------------- 以下逻辑nodeId变更,兼容解除隔离任务-----------------------------------
+        // 2.获取人员信息
         if (StringUtils.isNotBlank(byId.getIsolationNodeUuid())) {
             // 如果是解除节点的查询操作,则查询对应隔离节点的数据
             WorkflowWorkNodeDO one = workflowWorkNodeService.getOne(Wrappers.<WorkflowWorkNodeDO>lambdaQuery()
@@ -360,6 +370,12 @@ public class WorkflowWorkServiceImpl extends ServiceImpl<WorkflowWorkMapper, Wor
         List<WorkflowWorkTicketLockDO> locks = workflowWorkTicketLockService.list(Wrappers.<WorkflowWorkTicketLockDO>lambdaQuery()
                 .in(WorkflowWorkTicketLockDO::getNodeId, nodeId));
         bean.setLocks(BeanUtils.toBean(locks, WorkflowWorkTicketLockRespVO.class));
+
+        // 5.节点的钥匙信息
+        List<WorkflowWorkTicketKeyDO> keys = workflowWorkTicketKeyService.list(Wrappers.<WorkflowWorkTicketKeyDO>lambdaQuery()
+                .in(WorkflowWorkTicketKeyDO::getNodeId, nodeId));
+        bean.setKeys(BeanUtils.toBean(keys, WorkflowWorkTicketKeyRespVO.class));
+
         return bean;
     }
 

+ 5 - 5
yudao-module-iscs/src/main/resources/mapper/workdesign/WorkflowWorkMapper.xml

@@ -41,7 +41,7 @@
             -- 条件2:关联表中上锁人ID匹配
             OR work_node.lock_person = #{vo.loginUserId}
             -- 条件3:关联表中公锁人ID匹配
-            OR JSON_CONTAINS(CAST(work_node.isolation_points AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
+            OR JSON_CONTAINS(CAST(work_node.colock_persons AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
             <if test="vo.key != null and vo.key.trim != ''">
                 AND (ww.name like concat('%',#{vo.key},'%')
                         OR ww.order_no like concat('%',#{vo.key},'%')
@@ -85,7 +85,7 @@
             -- 条件2:关联表中上锁人ID匹配
             OR work_node.lock_person = #{vo.loginUserId}
             -- 条件3:关联表中公锁人ID匹配
-            OR JSON_CONTAINS(CAST(work_node.isolation_points AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
+            OR JSON_CONTAINS(CAST(work_node.colock_persons AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
             <if test="vo.key != null and vo.key.trim != ''">
                 AND (ww.name like concat('%',#{vo.key},'%')
                 OR ww.order_no like concat('%',#{vo.key},'%')
@@ -112,7 +112,7 @@
             -- 条件2:关联表中上锁人ID匹配
             OR work_node.lock_person = #{vo.loginUserId}
             -- 条件3:关联表中公锁人ID匹配
-            OR JSON_CONTAINS(CAST(work_node.isolation_points AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
+            OR JSON_CONTAINS(CAST(work_node.colock_persons AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
         </where>
     </select>
     <select id="getMyCompletedCount" resultType="java.lang.Long">
@@ -130,7 +130,7 @@
             -- 条件2:关联表中上锁人ID匹配
             OR work_node.lock_person = #{vo.loginUserId}
             -- 条件3:关联表中公锁人ID匹配
-            OR JSON_CONTAINS(CAST(work_node.isolation_points AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
+            OR JSON_CONTAINS(CAST(work_node.colock_persons AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
         </where>
 
     </select>
@@ -203,7 +203,7 @@
             -- 条件2:关联表中上锁人ID匹配
             OR work_node.lock_person = #{vo.loginUserId}
             -- 条件3:关联表中公锁人ID匹配
-            OR JSON_CONTAINS(CAST(work_node.isolation_points AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
+            OR JSON_CONTAINS(CAST(work_node.colock_persons AS JSON), CAST(#{vo.loginUserId} AS JSON), '$') )
             )
             -- 我的创建
             OR ww.creator = #{vo.loginUserId} )