فهرست منبع

添加更新作业票进度接口

Frankensteinly 1 سال پیش
والد
کامیت
43605f476e

+ 11 - 0
ktg-iscs/src/main/java/com/ktg/iscs/controller/IsJobTicketController.java

@@ -10,6 +10,7 @@ import com.ktg.iscs.domain.IsJobTicket;
 import com.ktg.iscs.domain.dto.ticket.AddJobTicketDTO;
 import com.ktg.iscs.domain.dto.ticket.PageTicketDTO;
 import com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO;
+import com.ktg.iscs.domain.vo.ticket.JobTicketUpdateProgressReqVO;
 import com.ktg.iscs.domain.vo.ticket.PageTicketVO;
 import com.ktg.iscs.service.IIsJobTicketService;
 import io.swagger.annotations.Api;
@@ -21,6 +22,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -114,4 +116,13 @@ public class IsJobTicketController extends BaseController
     {
         return CommonResult.success(isJobTicketService.deleteIsJobTicketByTicketIds(ticketIds));
     }
+
+    /**
+     * 更新工作票进度
+     */
+    @ApiOperation("更新作业票进度")
+    @PostMapping("/updateProgress")
+    public CommonResult<Boolean> updateTicketProgress(@RequestBody @Valid JobTicketUpdateProgressReqVO reqVO) {
+        return CommonResult.success(isJobTicketService.updateTicketProgress(reqVO));
+    }
 }

+ 18 - 0
ktg-iscs/src/main/java/com/ktg/iscs/domain/constant/ErrorCodeConstants.java

@@ -0,0 +1,18 @@
+package com.ktg.iscs.domain.constant;
+
+import com.ktg.common.exception.ErrorCode;
+
+public interface ErrorCodeConstants {
+    /**********************************  作业票  **********************************/
+    ErrorCode JOB_TICKET_NOT_EXISTS = new ErrorCode(1_005_001_001, "作业票不存在!");
+    ErrorCode JOB_TICKET_STATUS_NOT_PERMITTED = new ErrorCode(1_005_001_002, "作业票当前状态您无法操作!");
+    ErrorCode JOB_TICKET_STATUS_FINISHED = new ErrorCode(1_005_001_003, "作业票已结束!");
+
+
+    /**********************************  作业票用户  **********************************/
+    ErrorCode JOB_TICKET_USER_NOT_EXISTS = new ErrorCode(1_006_001_001, "没有作业票关联人员!");
+    ErrorCode JOB_TICKET_USER_NOT_INCLUDED = new ErrorCode(1_006_001_002, "该作业票您未参与!");
+    ErrorCode JOB_TICKET_USER_WAIT_TO_LOCK = new ErrorCode(1_006_001_003, "请等待上锁!");
+    ErrorCode JOB_TICKET_USER_JOB_IS_DONE = new ErrorCode(1_006_001_004, "您已完成该作业票,无需继续操作!");
+    ErrorCode JOB_TICKET_USER_WAIT_COLOCKERS = new ErrorCode(1_006_001_005, "请等待共锁人解锁!");
+}

+ 26 - 0
ktg-iscs/src/main/java/com/ktg/iscs/domain/enums/JobStatusEnum.java

@@ -0,0 +1,26 @@
+package com.ktg.iscs.domain.enums;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public enum JobStatusEnum {
+    /**
+     * 上锁人包含0-5,共锁人包含0、4、5
+     */
+    NOT_STARTED(0, "未开始"),
+    ACQUIRE_LOCK(1, "取锁具"),
+    ACQUIRE_KEY(2, "取钥匙"),
+    READY_TO_LOCK(3, "待上锁"),
+    READY_TO_UNLOCK(4, "已上锁"),
+    UNLOCKED(5, "已解锁");
+
+    /**
+     * 状态编号
+     */
+    public final Integer status;
+
+    /**
+     * 描述
+     */
+    public final String desc;
+}

+ 21 - 0
ktg-iscs/src/main/java/com/ktg/iscs/domain/enums/JobUserEnum.java

@@ -0,0 +1,21 @@
+package com.ktg.iscs.domain.enums;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public enum JobUserEnum {
+    JTDRAWER("jtdrawer", "作业管理员"),
+    JTLOCKER("jtlocker", "作业负责人"),
+    JTCOLOCKER("jtcolocker", "作业参与人"),
+    JTGUARD("jtguard", "作业观察员");
+
+    /**
+     * 角色role key
+     */
+    public final String key;
+
+    /**
+     * 描述
+     */
+    public final String desc;
+}

+ 2 - 2
ktg-iscs/src/main/java/com/ktg/iscs/domain/enums/TicketStatusEnum.java

@@ -13,10 +13,10 @@ public enum TicketStatusEnum {
     /**
      * 状态编号
      */
-    private final String status;
+    public final String status;
 
     /**
      * 描述
      */
-    private final String desc;
+    public final String desc;
 }

+ 15 - 0
ktg-iscs/src/main/java/com/ktg/iscs/domain/vo/ticket/JobTicketUpdateProgressReqVO.java

@@ -0,0 +1,15 @@
+package com.ktg.iscs.domain.vo.ticket;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+public class JobTicketUpdateProgressReqVO {
+    @ApiModelProperty(value = "用户ID")
+    @NotNull(message = "用户ID不能为空")
+    public Long userId;
+
+    @ApiModelProperty(value = "工作票编号")
+    @NotNull(message = "工作票编号不能为空")
+    public Long ticketId;
+}

+ 5 - 0
ktg-iscs/src/main/java/com/ktg/iscs/mapper/IsJobTicketUserMapper.java

@@ -1,6 +1,7 @@
 package com.ktg.iscs.mapper;
 
 import com.ktg.common.mapper.BaseMapperX;
+import com.ktg.common.query.LambdaQueryWrapperX;
 import com.ktg.iscs.domain.IsJobTicketUser;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -62,4 +63,8 @@ public interface IsJobTicketUserMapper extends BaseMapperX<IsJobTicketUser>
      * @return 结果
      */
     int deleteIsJobTicketUserByRecordIds(Long[] recordIds);
+
+    default List<IsJobTicketUser> selectIsJobTicketUserListByTicketId(Long ticketId) {
+        return selectList(new LambdaQueryWrapperX<IsJobTicketUser>().eq(IsJobTicketUser::getTicketId, ticketId));
+    }
 }

+ 3 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/IIsJobTicketService.java

@@ -6,6 +6,7 @@ import com.ktg.iscs.domain.IsJobTicket;
 import com.ktg.iscs.domain.dto.ticket.AddJobTicketDTO;
 import com.ktg.iscs.domain.dto.ticket.PageTicketDTO;
 import com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO;
+import com.ktg.iscs.domain.vo.ticket.JobTicketUpdateProgressReqVO;
 import com.ktg.iscs.domain.vo.ticket.PageTicketVO;
 
 import java.util.List;
@@ -73,4 +74,6 @@ public interface IIsJobTicketService extends IService<IsJobTicket>
      * @return
      */
     Page<PageTicketVO> getIsJobTicketPage(Page<IsJobTicket> page, PageTicketDTO dto);
+
+    Boolean updateTicketProgress(JobTicketUpdateProgressReqVO reqVO);
 }

+ 5 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/IIsJobTicketUserService.java

@@ -60,4 +60,9 @@ public interface IIsJobTicketUserService extends IService<IsJobTicketUser>
      * @return 结果
      */
     int deleteIsJobTicketUserByRecordId(Long recordId);
+
+    /**
+     * 根据作业票ID查询作业票用户列表
+     */
+    List<IsJobTicketUser> selectIsJobTicketUserListByTicketId(Long ticketId);
 }

+ 142 - 2
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/IsJobTicketServiceImpl.java

@@ -7,18 +7,24 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ktg.common.core.text.Convert;
 import com.ktg.common.utils.DateUtils;
 import com.ktg.common.utils.bean.BeanUtils;
-import com.ktg.iscs.domain.*;
+import com.ktg.iscs.domain.IsJobTicket;
+import com.ktg.iscs.domain.IsJobTicketPoints;
+import com.ktg.iscs.domain.IsJobTicketUser;
 import com.ktg.iscs.domain.dto.ticket.AddJobTicketDTO;
 import com.ktg.iscs.domain.dto.ticket.AddTicketUserDTO;
 import com.ktg.iscs.domain.dto.ticket.PageTicketDTO;
+import com.ktg.iscs.domain.enums.JobStatusEnum;
+import com.ktg.iscs.domain.enums.TicketStatusEnum;
 import com.ktg.iscs.domain.vo.points.PointDetailVO;
 import com.ktg.iscs.domain.vo.ticket.JobTicketDetailVO;
+import com.ktg.iscs.domain.vo.ticket.JobTicketUpdateProgressReqVO;
 import com.ktg.iscs.domain.vo.ticket.PageTicketVO;
 import com.ktg.iscs.mapper.IsJobTicketMapper;
 import com.ktg.iscs.service.IIsIsolationPointService;
 import com.ktg.iscs.service.IIsJobTicketPointsService;
 import com.ktg.iscs.service.IIsJobTicketService;
 import com.ktg.iscs.service.IIsJobTicketUserService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -29,6 +35,12 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static com.ktg.iscs.domain.constant.ErrorCodeConstants.*;
+import static com.ktg.iscs.domain.enums.JobUserEnum.JTCOLOCKER;
+import static com.ktg.iscs.domain.enums.JobUserEnum.JTLOCKER;
+import static com.ktg.iscs.domain.enums.TicketStatusEnum.*;
+import static com.ktg.system.strategy.ServiceExceptionUtil.exception;
+
 /**
  * 作业票Service业务层处理
  *
@@ -36,6 +48,7 @@ import java.util.stream.Collectors;
  * @date 2024-10-18
  */
 @Service
+@Slf4j
 public class IsJobTicketServiceImpl extends ServiceImpl<IsJobTicketMapper, IsJobTicket> implements IIsJobTicketService
 {
     @Autowired
@@ -47,7 +60,6 @@ public class IsJobTicketServiceImpl extends ServiceImpl<IsJobTicketMapper, IsJob
     @Autowired
     private IIsIsolationPointService iIsIsolationPointService;
 
-
     /**
      * 查询作业票
      *
@@ -248,4 +260,132 @@ public class IsJobTicketServiceImpl extends ServiceImpl<IsJobTicketMapper, IsJob
     public Page<PageTicketVO> getIsJobTicketPage(Page<IsJobTicket> page, PageTicketDTO dto) {
         return isJobTicketMapper.getIsJobTicketPage(page, dto);
     }
+
+    @Override
+    @Transactional
+    public Boolean updateTicketProgress(JobTicketUpdateProgressReqVO reqVO) {
+        IsJobTicket isJobTicket = isJobTicketMapper.selectIsJobTicketByTicketId(reqVO.ticketId);
+        if (isJobTicket == null) {
+            log.error("Job ticket not exists, ticketId: {}, userId : {}", reqVO.ticketId, reqVO.userId);
+            throw exception(JOB_TICKET_NOT_EXISTS);
+        }
+
+        List<IsJobTicketUser> jobUserList = iIsJobTicketUserService.selectIsJobTicketUserListByTicketId(reqVO.ticketId);
+        if (jobUserList.isEmpty()) {
+            log.error("Job ticket user not exists, ticketId: {}, userId : {}", reqVO.ticketId, reqVO.userId);
+            throw exception(JOB_TICKET_USER_NOT_EXISTS);
+        }
+
+        // 可能身兼数职
+        List<IsJobTicketUser> matchList = jobUserList.stream().filter(jobUser -> Objects.equals(jobUser.getUserId(), reqVO.userId)).collect(Collectors.toList());
+        if (matchList.isEmpty()) {
+            log.error("Job ticket user not included, ticketId: {}, userId : {}", reqVO.ticketId, reqVO.userId);
+            throw exception(JOB_TICKET_USER_NOT_INCLUDED);
+        } else {
+            handleTicketStatus(isJobTicket, matchList, reqVO.ticketId, reqVO.userId);
+        }
+        return true;
+    }
+
+    /**
+     * 处理工作票状态
+     * @param isJobTicket 工作票
+     * @param jobUserList 在工作票中的所有人
+     */
+    private void handleTicketStatus(IsJobTicket isJobTicket, List<IsJobTicketUser> jobUserList, Long ticketId, Long userId) {
+        List<IsJobTicketUser> matchUserList = jobUserList.stream().filter(jobUser -> Objects.equals(jobUser.getUserId(), userId)).collect(Collectors.toList());
+        if (Objects.equals(isJobTicket.getTicketStatus(), FINISHED.status)) {
+            log.warn("Job ticket status is finished, cannot update progress, ticketId: {}, userId : {}", ticketId, userId);
+            throw exception(JOB_TICKET_STATUS_FINISHED);
+        }
+        if (matchUserList.stream().anyMatch(user -> Objects.equals(user.getUserRole(), JTLOCKER.key))) {
+            if (Objects.equals(isJobTicket.getTicketStatus(), NOT_STARTED.status)
+                    || Objects.equals(isJobTicket.getTicketStatus(), READY_TO_LOCK.status)
+                    || Objects.equals(isJobTicket.getTicketStatus(), READY_TO_UNLOCK.status)) {
+                handleJobStatus(isJobTicket, matchUserList, userId, true);
+            } else if (Objects.equals(isJobTicket.getTicketStatus(), PROCESSING.status)) {
+                // 同时为上锁人、共锁人
+                if (matchUserList.stream().anyMatch(user -> Objects.equals(user.getUserRole(), JTCOLOCKER.key))) {
+                    handleJobStatus(isJobTicket, jobUserList, userId, false);
+                } else {
+                    log.warn("Job ticket status is processing, cannot update progress, ticketId: {}, userId : {}", ticketId, userId);
+                    throw exception(JOB_TICKET_STATUS_NOT_PERMITTED);
+                }
+            }
+        } else if (matchUserList.stream().anyMatch(user -> Objects.equals(user.getUserRole(), JTCOLOCKER.key))) {
+            if (Objects.equals(isJobTicket.getTicketStatus(), NOT_STARTED.status)
+                    || Objects.equals(isJobTicket.getTicketStatus(), READY_TO_LOCK.status)
+                    || Objects.equals(isJobTicket.getTicketStatus(), READY_TO_UNLOCK.status)) {
+                log.warn("Job ticket status is processing, cannot update progress, ticketId: {}, userId : {}", ticketId, userId);
+                throw exception(JOB_TICKET_STATUS_NOT_PERMITTED);
+            } else if (Objects.equals(isJobTicket.getTicketStatus(), PROCESSING.status)) {
+                handleJobStatus(isJobTicket, jobUserList, userId, false);
+            }
+        }
+    }
+
+    /**
+     * 处理工作票相关人员作业状态
+     *
+     * @param isJobTicket 工作票
+     * @param jobUserList 在工作票中的所有人
+     * @param isLocker true:上锁人 false:共锁人
+     */
+    private void handleJobStatus(IsJobTicket isJobTicket, List<IsJobTicketUser> jobUserList, Long userId, boolean isLocker) {
+        List<IsJobTicketUser> matchUserList = jobUserList.stream()
+                .filter(jobUser -> Objects.equals(jobUser.getUserId(), userId)).collect(Collectors.toList());
+
+        if (isLocker) {
+            matchUserList.stream().filter(user -> Objects.equals(user.getUserRole(), JTLOCKER.key)).findFirst().ifPresent(jobUser -> {
+                if (Objects.equals(jobUser.getJobStatus(), JobStatusEnum.NOT_STARTED.status)
+                        || Objects.equals(jobUser.getJobStatus(), JobStatusEnum.ACQUIRE_LOCK.status)
+                        || Objects.equals(jobUser.getJobStatus(), JobStatusEnum.ACQUIRE_KEY.status)
+                        || Objects.equals(jobUser.getJobStatus(), JobStatusEnum.READY_TO_LOCK.status)) {
+                    jobUser.setJobStatus(jobUser.getJobStatus() + 1);
+                } else if (Objects.equals(jobUser.getJobStatus(), JobStatusEnum.READY_TO_UNLOCK.status)) {
+                    // 检查所有人
+                    if (checkJobStatus(isJobTicket, jobUserList)) {
+                        jobUser.setJobStatus(JobStatusEnum.UNLOCKED.status);
+                    } else {
+                        throw exception(JOB_TICKET_USER_WAIT_COLOCKERS);
+                    }
+                } else if (Objects.equals(jobUser.getJobStatus(), JobStatusEnum.UNLOCKED.status)) {
+                    // 任务已完成,更新
+                    jobUser.setJobStatus(JobStatusEnum.UNLOCKED.status);
+                    isJobTicket.setTicketStatus(FINISHED.status);
+                }
+            });
+        } else {
+            matchUserList.stream().filter(user -> Objects.equals(user.getUserRole(), JTCOLOCKER.key)).findFirst().ifPresent(jobUser -> {
+                if (Objects.equals(jobUser.getJobStatus(), JobStatusEnum.NOT_STARTED.status)) {
+                    if (Objects.equals(isJobTicket.getTicketStatus(), PROCESSING.status)) {
+                        jobUser.setJobStatus(JobStatusEnum.READY_TO_UNLOCK.status);
+                    } else if (Objects.equals(isJobTicket.getTicketStatus(), READY_TO_LOCK.status)) {
+                        jobUser.setJobStatus(JobStatusEnum.READY_TO_LOCK.status);
+                        checkJobStatus(isJobTicket, jobUserList);
+                    } else if (Objects.equals(isJobTicket.getTicketStatus(), NOT_STARTED.status)
+                            || Objects.equals(isJobTicket.getTicketStatus(), READY_TO_LOCK.status)) {
+                        // 等上锁人上锁
+                        throw exception(JOB_TICKET_USER_WAIT_TO_LOCK);
+                    } else {
+                        // 作业票本人Job部分已完成
+                        throw exception(JOB_TICKET_USER_JOB_IS_DONE);
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 根据关联人作业状态更新工作票状态
+     */
+    private Boolean checkJobStatus(IsJobTicket isJobTicket, List<IsJobTicketUser> jobUserList) {
+        List<IsJobTicketUser> coLockerList = jobUserList.stream()
+                .filter(jobUser -> Objects.equals(jobUser.getUserRole(), JTCOLOCKER.key)).collect(Collectors.toList());
+        boolean isCoLockerDone = coLockerList.stream().allMatch(jobUser -> Objects.equals(jobUser.getJobStatus(), JobStatusEnum.UNLOCKED.status));
+        if (isCoLockerDone) {
+            isJobTicket.setTicketStatus(TicketStatusEnum.READY_TO_UNLOCK.status);
+        }
+        return isCoLockerDone;
+    }
 }

+ 5 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/IsJobTicketUserServiceImpl.java

@@ -99,4 +99,9 @@ public class IsJobTicketUserServiceImpl extends ServiceImpl<IsJobTicketUserMappe
     {
         return isJobTicketUserMapper.deleteIsJobTicketUserByRecordId(recordId);
     }
+
+    @Override
+    public List<IsJobTicketUser> selectIsJobTicketUserListByTicketId(Long ticketId) {
+        return isJobTicketUserMapper.selectIsJobTicketUserListByTicketId(ticketId);
+    }
 }