From f6e39da335d66712fe35625e638372d317300fe3 Mon Sep 17 00:00:00 2001 From: fangjiakai <450850793@qq.com> Date: Thu, 9 Apr 2026 09:47:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(workflow):=20=E6=B7=BB=E5=8A=A0=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=92=A4=E5=9B=9E=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 EightworkInfoWithdrawCmd 命令类用于撤回请求参数 - 实现 EightworkInfoWithdrawExe 执行器处理撤回业务逻辑 - 在 EightworkInfoDO 和相关模型中添加 lockFlag 字段控制撤回权限 - 添加 withdraw 接口到 EightworkInfoController 和服务层 - 实现物理删除 task_log 记录的批量删除功能 - 添加盲板工作类型筛选查询条件 - 修改菜单枚举配置支持新的作业类型路径 - 实现 CAS 乐观锁机制防止并发冲突 --- .../web/EightworkInfoController.java | 12 +- .../command/EightworkInfoSaveDraftExe.java | 2 + .../command/EightworkInfoWithdrawExe.java | 139 ++++++++++++++++++ .../eightwork/command/TaskLogAddExe.java | 3 + .../eightwork/command/TaskLogUpdateExe.java | 64 ++++++++ .../service/EightworkInfoServiceImpl.java | 22 +++ .../eightwork/api/EightworkInfoServiceI.java | 8 + .../eightwork/dto/EightworkInfoPageQry.java | 5 +- .../dto/EightworkInfoWithdrawCmd.java | 23 +++ .../dto/clientobject/EightworkInfoCO.java | 3 + .../domain/model/EightworkInfoE.java | 2 + .../domain/model/enums/MenuEnum.java | 19 +-- .../dataobject/EightworkInfoDO.java | 3 + .../persistence/mapper/TaskLogMapper.java | 8 + .../repository/EightworkInfoRepository.java | 12 ++ .../repository/TaskLogRepository.java | 8 + .../impl/EightworkInfoRepositoryImpl.java | 11 ++ .../impl/TaskLogRepositoryImpl.java | 6 + .../resources/mapper/EightworkInfoMapper.xml | 3 + .../main/resources/mapper/TaskLogMapper.xml | 7 + 20 files changed, 348 insertions(+), 12 deletions(-) create mode 100644 web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoWithdrawExe.java create mode 100644 web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoWithdrawCmd.java diff --git a/web-adapter/src/main/java/com/zcloud/eightwork/web/EightworkInfoController.java b/web-adapter/src/main/java/com/zcloud/eightwork/web/EightworkInfoController.java index 9faa676..f963381 100644 --- a/web-adapter/src/main/java/com/zcloud/eightwork/web/EightworkInfoController.java +++ b/web-adapter/src/main/java/com/zcloud/eightwork/web/EightworkInfoController.java @@ -5,6 +5,7 @@ import com.zcloud.eightwork.api.EightworkInfoServiceI; import com.zcloud.eightwork.dto.EightworkInfoAddCmd; import com.zcloud.eightwork.dto.EightworkInfoPageQry; import com.zcloud.eightwork.dto.EightworkInfoUpdateCmd; +import com.zcloud.eightwork.dto.EightworkInfoWithdrawCmd; import com.zcloud.eightwork.dto.ForceTerminateCmd; import com.zcloud.eightwork.dto.clientobject.StatisticsByWorkTypeCO; import com.zcloud.eightwork.dto.clientobject.EightworkInfoCO; @@ -45,8 +46,8 @@ public class EightworkInfoController { @ApiOperation("分页") @PostMapping("/list") public PageResponse page(@RequestBody EightworkInfoPageQry qry) { - qry.setEqDepartmentId(AuthContext.getOrgId()); - qry.setEqCreateId(AuthContext.getUserId()); +// qry.setEqDepartmentId(AuthContext.getOrgId()); +// qry.setEqCreateId(AuthContext.getUserId()); return eightworkInfoService.listPage(qry); } @@ -83,6 +84,13 @@ public class EightworkInfoController { return SingleResponse.buildSuccess(); } + @ApiOperation("撤回作业到暂存") + @PostMapping("/withdraw") + public Response withdraw(@Validated @RequestBody EightworkInfoWithdrawCmd cmd) { + eightworkInfoService.withdraw(cmd.getId(), cmd.getReason()); + return SingleResponse.buildSuccess(); + } + @ApiOperation("强制终止工作流") @PostMapping("/forceTerminate") public Response forceTerminate(@RequestBody ForceTerminateCmd cmd) { diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoSaveDraftExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoSaveDraftExe.java index 611a94b..bf28bca 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoSaveDraftExe.java +++ b/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoSaveDraftExe.java @@ -152,6 +152,7 @@ public class EightworkInfoSaveDraftExe { eightworkInfo.setStatus(DRAFT_STATUS); eightworkInfo.setInfo(cmd.getInfo().toJSONString()); eightworkInfo.setDepartmentId(cmd.getDepartmentId()); + eightworkInfo.setLockFlag(2); // 设置为未锁定(可撤回) eightworkInfoRepository.save(eightworkInfo); log.info("主表创建成功: workId={}", eightworkInfo.getWorkId()); @@ -222,6 +223,7 @@ public class EightworkInfoSaveDraftExe { existingInfo.setGasFlag(cmd.getGasFlag()); existingInfo.setInfo(cmd.getInfo().toJSONString()); existingInfo.setDepartmentId(cmd.getDepartmentId()); + existingInfo.setLockFlag(2); // 设置为未锁定(可撤回) } /** diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoWithdrawExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoWithdrawExe.java new file mode 100644 index 0000000..f8f58b2 --- /dev/null +++ b/web-app/src/main/java/com/zcloud/eightwork/command/EightworkInfoWithdrawExe.java @@ -0,0 +1,139 @@ +package com.zcloud.eightwork.command; + +import com.alibaba.cola.exception.BizException; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zcloud.eightwork.domain.gateway.TaskLogGateway; +import com.zcloud.eightwork.domain.model.TaskLogE; +import com.zcloud.eightwork.domain.model.enums.TaskLogStatus; +import com.zcloud.eightwork.dto.EightworkInfoWithdrawCmd; +import com.zcloud.eightwork.persistence.dataobject.EightworkInfoDO; +import com.zcloud.eightwork.persistence.dataobject.TaskLogDO; +import com.zcloud.eightwork.persistence.repository.EightworkInfoRepository; +import com.zcloud.eightwork.persistence.repository.MeasuresLogsRepository; +import com.zcloud.eightwork.persistence.repository.TaskLogRepository; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 撤回作业执行器 + * 将作业撤回到暂存状态 + * + * @Author fangjiakai + * @Date 2026-04-07 + */ +@Slf4j +@Component +@AllArgsConstructor +public class EightworkInfoWithdrawExe { + + private static final Integer LOCK_FLAG_LOCKED = 1; // 锁定不可撤回 + private static final Integer LOCK_FLAG_UNLOCKED = 2; // 未锁定可撤回 + private static final Integer DRAFT_STATUS = 0; // 暂存状态 + private static final Long APPLY_STEP_ID = 1L; // 申请步骤ID + + private final EightworkInfoRepository eightworkInfoRepository; + private final TaskLogRepository taskLogRepository; + private final TaskLogGateway taskLogGateway; + private final MeasuresLogsRepository measuresLogsRepository; + + @Transactional(rollbackFor = Exception.class) + public void execute(EightworkInfoWithdrawCmd cmd) { + log.info("开始撤回作业: id={}, reason={}", cmd.getId(), cmd.getReason()); + + // 1. 查询作业记录(加锁,确保并发安全) + EightworkInfoDO infoDO = eightworkInfoRepository.getById(cmd.getId()); + if (infoDO == null) { + throw new BizException("作业记录不存在"); + } + + // 记录当前状态,用于并发检测 + Integer currentStatus = infoDO.getStatus(); + Integer currentLockFlag = infoDO.getLockFlag(); + + // 2. 检查是否可以撤回(未锁定) + if (LOCK_FLAG_LOCKED.equals(currentLockFlag)) { + throw new BizException("作业已进行审批流程,无法撤回"); + } + + // 3. 检查当前状态是否允许撤回 + if (!TaskLogStatus.APPROVED.equalsCode(currentStatus)) { + throw new BizException("只能撤回进行中的作业"); + } + + String workId = infoDO.getWorkId(); + + // 4. 检查是否满足撤回条件:除申请外无完成流程 + List logs = taskLogGateway.listAllByWorkId(workId); + boolean canWithdraw = checkCanWithdraw(logs); + if (!canWithdraw) { + throw new BizException("作业已有审批流程进行,无法撤回"); + } + + // 5. 再次检查状态(防止在检查期间状态被修改) + EightworkInfoDO latestInfo = eightworkInfoRepository.getById(cmd.getId()); + if (!latestInfo.getStatus().equals(currentStatus) || + !latestInfo.getLockFlag().equals(currentLockFlag)) { + log.warn("撤回失败:作业状态已被修改 originalStatus={}, originalLockFlag={}, currentStatus={}, currentLockFlag={}", + currentStatus, currentLockFlag, latestInfo.getStatus(), latestInfo.getLockFlag()); + throw new BizException("操作失败:作业状态已被修改,请刷新后重试"); + } + + // 6. 撤回操作 + // 6.1 更新主表状态为暂存 + latestInfo.setStatus(DRAFT_STATUS); + latestInfo.setLockFlag(LOCK_FLAG_UNLOCKED); + eightworkInfoRepository.updateById(latestInfo); + + // 6.2 删除除申请外的其他 task_log 记录(物理删除) + List toDeleteIds = logs.stream() + .filter(taskLog -> !taskLog.getStepId().equals(APPLY_STEP_ID)) + .map(TaskLogE::getId) + .collect(Collectors.toList()); + if (!toDeleteIds.isEmpty()) { + taskLogRepository.physicalDeleteByIds(toDeleteIds); + log.info("已物理删除 {} 条非申请步骤记录", toDeleteIds.size()); + } + + // 6.3 将申请步骤状态改为未开始 + TaskLogE applyLog = logs.stream() + .filter(taskLog -> taskLog.getStepId().equals(APPLY_STEP_ID)) + .findFirst() + .orElse(null); + if (applyLog != null) { + // 无论申请步骤当前是什么状态(进行中或通过),都改为未开始 + TaskLogDO updateLog = new TaskLogDO(); + updateLog.setId(applyLog.getId()); + updateLog.setStatus(TaskLogStatus.IN_PROGRESS.getCode()); + taskLogRepository.updateById(updateLog); + log.info("申请步骤状态已改为未开始"); + } + + log.info("作业撤回成功: workId={}, id={}", workId, cmd.getId()); + } + + /** + * 检查是否可以撤回 + * 条件:除申请外再无完成流程(只有申请步骤在进行中,其他步骤都是未开始状态) + */ + private boolean checkCanWithdraw(List logs) { + for (TaskLogE taskLog : logs) { + // 跳过申请步骤 + if (APPLY_STEP_ID.equals(taskLog.getStepId())) { + continue; + } + + // 如果其他步骤是完成状态,说明已有审批流程进行 + if (TaskLogStatus.APPROVED.equalsCode(taskLog.getStatus())) { + log.info("不可撤回: stepId={}, stepName={}, status={}", + taskLog.getStepId(), taskLog.getStepName(), taskLog.getStatus()); + return false; + } + } + return true; + } +} diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java index 51730a6..f41f37d 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java +++ b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogAddExe.java @@ -363,6 +363,9 @@ public class TaskLogAddExe { ); handleInfoStep(eightworkInfo,cmd.getSignLogs()); + // 设置初始锁定标识为未锁定(可撤回) + eightworkInfo.setLockFlag(2); + eightworkInfoRepository.save(eightworkInfo); return eightworkInfo.getWorkId(); } diff --git a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java index 8e714bb..bc19871 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/eightwork/command/TaskLogUpdateExe.java @@ -138,6 +138,18 @@ public class TaskLogUpdateExe { * 强制终止状态码 */ private static final Integer FORCE_TERMINATE_STATUS = 998; + /** + * 锁定标识:锁定不可撤回 + */ + private static final Integer LOCK_FLAG_LOCKED = 1; + /** + * 锁定标识:未锁定可撤回 + */ + private static final Integer LOCK_FLAG_UNLOCKED = 2; + /** + * 申请步骤ID + */ + private static final Long APPLY_STEP_ID = 1L; @Transactional(rollbackFor = Exception.class) public void nextStep(TaskLogNextCmd cmd) { @@ -251,6 +263,12 @@ public class TaskLogUpdateExe { log.info("附件步骤已保存附件: filePath={}", cmd.getFilePath()); } + // 非申请步骤完成时,更新主表 lockFlag 为锁定状态(不可撤回) + if (!APPLY_STEP_ID.equals(currentLog.getStepId()) && + TaskLogStatus.APPROVED.equalsCode(cmd.getStatus())) { + updateLockFlagToLocked(cmd.getWorkId()); + } + // 发送待办完成事件 sendTodoCompleteEvent(currentLog.getId()); @@ -760,6 +778,52 @@ public class TaskLogUpdateExe { log.info("已保存关闭原因: workId={}, closeReason={}", workId, closeReason); } + /** + * 更新主表 lockFlag 为锁定状态 + * 当非申请步骤完成时调用,表示作业已进入审批流程,不可撤回 + * 使用状态检查防止并发问题 + */ + private void updateLockFlagToLocked(String workId) { + // 使用查询构建器,确保获取最新状态 + EightworkInfoDO infoDO = eightworkInfoRepository.getOne( + new LambdaQueryWrapper() + .eq(EightworkInfoDO::getWorkId, workId) + .select(EightworkInfoDO::getId, EightworkInfoDO::getLockFlag, + EightworkInfoDO::getStatus, EightworkInfoDO::getWorkId)); + + if (infoDO == null) { + log.warn("未找到作业信息,无法更新锁定标识: workId={}", workId); + return; + } + + // 检查当前状态,确保作业未被撤回 + if (!TaskLogStatus.APPROVED.equalsCode(infoDO.getStatus())) { + log.info("作业状态已变更(可能已被撤回),跳过锁定: workId={}, status={}", + workId, infoDO.getStatus()); + return; + } + + // 如果已经是锁定状态,跳过 + if (LOCK_FLAG_LOCKED.equals(infoDO.getLockFlag())) { + return; + } + + infoDO.setLockFlag(LOCK_FLAG_LOCKED); + + // 使用 CAS 方式更新(防止并发) + boolean updated = eightworkInfoRepository.updateLockFlagToLocked( + infoDO.getId(), + LOCK_FLAG_UNLOCKED, // 期望的当前值(未锁定) + LOCK_FLAG_LOCKED, // 新值(锁定) + TaskLogStatus.APPROVED.getCode()); // 期望的当前状态 + + if (updated) { + log.info("作业已锁定,不可撤回: workId={}", workId); + } else { + log.info("锁定失败:作业状态可能已被修改(可能已被撤回): workId={}", workId); + } + } + /** * 处理打回工作流 * status为2时打回到申请步骤,删除后续流程,允许修改后重新提交 diff --git a/web-app/src/main/java/com/zcloud/eightwork/service/EightworkInfoServiceImpl.java b/web-app/src/main/java/com/zcloud/eightwork/service/EightworkInfoServiceImpl.java index 9c1f578..dba8581 100644 --- a/web-app/src/main/java/com/zcloud/eightwork/service/EightworkInfoServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/eightwork/service/EightworkInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.zcloud.eightwork.api.TaskLogServiceI; import com.zcloud.eightwork.command.EightworkInfoAddExe; import com.zcloud.eightwork.command.EightworkInfoRemoveExe; import com.zcloud.eightwork.command.EightworkInfoUpdateExe; +import com.zcloud.eightwork.command.EightworkInfoWithdrawExe; import com.zcloud.eightwork.command.query.EightworkInfoQueryExe; import com.zcloud.eightwork.domain.gateway.TaskLogGateway; import com.zcloud.eightwork.domain.model.TaskLogE; @@ -44,6 +45,7 @@ public class EightworkInfoServiceImpl implements EightworkInfoServiceI { private final TaskLogServiceI taskLogService; private final TaskLogGateway taskLogGateway; private final EightworkInfoRepository eightworkInfoRepository; + private final EightworkInfoWithdrawExe eightworkInfoWithdrawExe; @Override public EightworkInfoCO queryById(Long id) { @@ -135,6 +137,26 @@ public class EightworkInfoServiceImpl implements EightworkInfoServiceI { log.info("工作流已强制终止: workId={}, stepId={}, closeReason={}", workId, currentLog.getStepId(), closeReason); } + /** + * 撤回作业到暂存状态 + * + * @param id 主表ID + * @param reason 撤回原因 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void withdraw(Long id, String reason) { + log.info("撤回作业: id={}, reason={}", id, reason); + + com.zcloud.eightwork.dto.EightworkInfoWithdrawCmd cmd = new com.zcloud.eightwork.dto.EightworkInfoWithdrawCmd(); + cmd.setId(id); + cmd.setReason(reason); + + eightworkInfoWithdrawExe.execute(cmd); + + log.info("作业已撤回: id={}", id); + } + @Override public List statisticsByWorkType(EightworkInfoPageQry qry){ return eightworkInfoQueryExe.statisticsByWorkType(qry); diff --git a/web-client/src/main/java/com/zcloud/eightwork/api/EightworkInfoServiceI.java b/web-client/src/main/java/com/zcloud/eightwork/api/EightworkInfoServiceI.java index 68b6284..2de294a 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/api/EightworkInfoServiceI.java +++ b/web-client/src/main/java/com/zcloud/eightwork/api/EightworkInfoServiceI.java @@ -38,5 +38,13 @@ public interface EightworkInfoServiceI { void forceTerminate(Long id, String closeReason); List statisticsByWorkType(EightworkInfoPageQry qry); + + /** + * 撤回作业到暂存状态 + * + * @param id 主表ID + * @param reason 撤回原因 + */ + void withdraw(Long id, String reason); } diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoPageQry.java b/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoPageQry.java index 019cbbd..103cc20 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoPageQry.java +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoPageQry.java @@ -62,6 +62,9 @@ public class EightworkInfoPageQry extends PageQuery { private Integer eqIsInnerWork; private String likeLimitedSpaceNameAndCode; - + /** + * 盲板工作类型筛选(精确查询) + */ + private String eqBlindboardWorkType; } diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoWithdrawCmd.java b/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoWithdrawCmd.java new file mode 100644 index 0000000..65f8d83 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/EightworkInfoWithdrawCmd.java @@ -0,0 +1,23 @@ +package com.zcloud.eightwork.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 撤回作业命令 + * + * @Author fangjiakai + * @Date 2026-04-07 + */ +@Data +public class EightworkInfoWithdrawCmd { + + @ApiModelProperty(value = "主表ID", required = true) + @NotNull(message = "主表ID不能为空") + private Long id; + + @ApiModelProperty(value = "撤回原因") + private String reason; +} diff --git a/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/EightworkInfoCO.java b/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/EightworkInfoCO.java index 88c6822..3088465 100644 --- a/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/EightworkInfoCO.java +++ b/web-client/src/main/java/com/zcloud/eightwork/dto/clientobject/EightworkInfoCO.java @@ -53,6 +53,9 @@ public class EightworkInfoCO extends ClientObject { //状态 @ApiModelProperty(value = "状态") private Integer status; + //锁定标识 1锁定不可撤回 2未锁定可撤回 + @ApiModelProperty(value = "锁定标识 1锁定不可撤回 2未锁定可撤回") + private Integer lockFlag; //详细信息 @ApiModelProperty(value = "详细信息") private JSONObject info; diff --git a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/EightworkInfoE.java b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/EightworkInfoE.java index c42d230..19db1e7 100644 --- a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/EightworkInfoE.java +++ b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/EightworkInfoE.java @@ -37,6 +37,8 @@ public class EightworkInfoE extends BaseE { private String currentStep; //状态 private Integer status; + //锁定标识 1锁定不可撤回 2未锁定可撤回 + private Integer lockFlag; //详细信息 private String info; } diff --git a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/enums/MenuEnum.java b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/enums/MenuEnum.java index 8ac4761..e569727 100644 --- a/web-domain/src/main/java/com/zcloud/eightwork/domain/model/enums/MenuEnum.java +++ b/web-domain/src/main/java/com/zcloud/eightwork/domain/model/enums/MenuEnum.java @@ -14,15 +14,16 @@ import java.util.stream.Collectors; @Getter public enum MenuEnum { - FIREWORK_LIST("/hidden/container/branchCompany/average/ledger/list", "hidden-tz-fgs"), - SPACEWORK_LIST("/hidden/container/branchCompany/average/ignore/list", "hidden-hl-fgs"), - HIDDEN_QR_FGS("/hidden/container/branchCompany/average/confirm/list", "hidden-qr-fgs"), - HIDDEN_YS_FGS("/hidden/container/branchCompany/average/acceptance/list", "hidden-ys-fgs"), - HIDDEN_YQ_FGS("/hidden/container/branchCompany/average/postponement/list", "hidden-yq-fgs"), - HIDDEN_ZG_FGS("/hidden/container/branchCompany/average/rectification/list", "hidden-zg-fgs"), - HIDDEN_TSCZ_FGS("/hidden/container/branchCompany/average/specialDisposal/list", "hidden-tscz-fgs"), - HIDDEN_YHQRR_FGS("/hidden/container/branchCompany/average/confirmUser", "hidden-yhqrr-fgs") - ; + HOT_WORK("/eightwork/container/enterprise/hotWork/homework/list", "hotwork-list"), + BLINDBOARD_WORK("/eightwork/container/enterprise/blindBoardWork/homework/list", "blindboardwork-list"), + BREAKGROUND_WORK("/eightwork/container/enterprise/digWork/homework/list", "digwork-list"), + CONFINEDSPACE("/eightwork/container/enterprise/confinedSpaceWork/ledger/list", "confinedspacework-ledger-list"), + CONFINEDSPACE_WORK("/eightwork/container/enterprise/confinedSpaceWork/homework/list", "confinedspacework-list"), + CUTROAD_WORK("/eightwork/container/enterprise/cutWork/homework/list", "cutwork-list"), + ELECTRICITY_WORK("/eightwork/container/enterprise/electricWork/homework/list", "electricwork-list"), + HIGH_WORK("/eightwork/container/enterprise/highPlaceWork/homework/list", "highplacework-list"), + HOISTING("/eightwork/container/enterprise/liftingWork/homework/list", "liftingwork-list"); + private final String path; private final String menuKey; diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/EightworkInfoDO.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/EightworkInfoDO.java index 105f80f..afb6c3b 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/EightworkInfoDO.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/dataobject/EightworkInfoDO.java @@ -58,6 +58,9 @@ public class EightworkInfoDO extends BaseDO { //状态 @ApiModelProperty(value = "状态") private Integer status; + //锁定标识 1锁定不可撤回 2未锁定可撤回 + @ApiModelProperty(value = "锁定标识 1锁定不可撤回 2未锁定可撤回") + private Integer lockFlag; //详细信息 @ApiModelProperty(value = "详细信息") private String info; diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/mapper/TaskLogMapper.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/mapper/TaskLogMapper.java index 69ce332..5112282 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/mapper/TaskLogMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/mapper/TaskLogMapper.java @@ -35,5 +35,13 @@ public interface TaskLogMapper extends BaseMapper { * @return 删除的记录数 */ int physicalDeleteByWorkId(@Param("workId") String workId); + + /** + * 物理删除指定 ID 列表的记录 + * + * @param ids ID 列表 + * @return 删除的记录数 + */ + int physicalDeleteByIds(@Param("ids") List ids); } diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/EightworkInfoRepository.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/EightworkInfoRepository.java index c166764..cfe0176 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/EightworkInfoRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/EightworkInfoRepository.java @@ -24,5 +24,17 @@ public interface EightworkInfoRepository extends BaseRepository Long countByWorkType(String workType); List statisticsByWorkType(Map params); + + /** + * 使用 CAS 方式更新 lockFlag(乐观锁) + * 只有当 lockFlag 和 status 都匹配时才更新 + * + * @param id 主表ID + * @param expectedLockFlag 期望的当前 lockFlag 值 + * @param newLockFlag 新的 lockFlag 值 + * @param expectedStatus 期望的当前 status 值 + * @return 是否更新成功(true=成功,false=状态不匹配更新失败) + */ + boolean updateLockFlagToLocked(Long id, Integer expectedLockFlag, Integer newLockFlag, Integer expectedStatus); } diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java index de23cb3..ac44349 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/TaskLogRepository.java @@ -34,5 +34,13 @@ public interface TaskLogRepository extends BaseRepository { * @return 删除的记录数 */ int physicalDeleteByWorkId(String workId); + + /** + * 物理删除指定 ID 列表的记录 + * + * @param ids ID 列表 + * @return 删除的记录数 + */ + int physicalDeleteByIds(List ids); } diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/EightworkInfoRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/EightworkInfoRepositoryImpl.java index e74255e..4a33f4f 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/EightworkInfoRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/EightworkInfoRepositoryImpl.java @@ -72,4 +72,15 @@ public class EightworkInfoRepositoryImpl extends BaseRepositoryImpl statisticsByWorkType(Map params){ return eightworkInfoMapper.statisticsByWorkType(params); } + + @Override + public boolean updateLockFlagToLocked(Long id, Integer expectedLockFlag, Integer newLockFlag, Integer expectedStatus) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(EightworkInfoDO::getId, id) + .eq(EightworkInfoDO::getLockFlag, expectedLockFlag) // CAS:期望的当前值 + .eq(EightworkInfoDO::getStatus, expectedStatus) // CAS:期望的状态 + .set(EightworkInfoDO::getLockFlag, newLockFlag); // 新值 + + return update(updateWrapper); + } } diff --git a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java index d233fd1..57c86a2 100644 --- a/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/eightwork/persistence/repository/impl/TaskLogRepositoryImpl.java @@ -68,5 +68,11 @@ public class TaskLogRepositoryImpl extends BaseRepositoryImpl ids) { + // 使用 Mapper 中定义的物理删除 SQL + return taskLogMapper.physicalDeleteByIds(ids); + } } diff --git a/web-infrastructure/src/main/resources/mapper/EightworkInfoMapper.xml b/web-infrastructure/src/main/resources/mapper/EightworkInfoMapper.xml index cd09095..bde59fd 100644 --- a/web-infrastructure/src/main/resources/mapper/EightworkInfoMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/EightworkInfoMapper.xml @@ -72,6 +72,9 @@ and t.info->>'$.workContent' like concat('%', #{params.likeCreateName}, '%') + + and t.info->>'$.blindboardWorkType' = #{params.eqBlindboardWorkType} + and t.info->>'$.workStartTime' >= #{params.geWorkStartTime} diff --git a/web-infrastructure/src/main/resources/mapper/TaskLogMapper.xml b/web-infrastructure/src/main/resources/mapper/TaskLogMapper.xml index 30f790c..5d0107e 100644 --- a/web-infrastructure/src/main/resources/mapper/TaskLogMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/TaskLogMapper.xml @@ -64,5 +64,12 @@ DELETE FROM task_log WHERE work_id = #{workId} + + + DELETE FROM task_log WHERE id IN + + #{id} + +