From 10c425c1d333956a65b841365186868e061d0565 Mon Sep 17 00:00:00 2001 From: tianxinlei Date: Thu, 18 Jun 2026 17:49:06 +0800 Subject: [PATCH] =?UTF-8?q?6-18=20-=20bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/init.sql | 3 + .../job/SendTodoMessageJob.java | 53 ++++++++++++ .../web/tasklist/TaskListController.java | 6 -- .../web/tasklist/TaskListIssueController.java | 6 ++ .../command/tasklist/FeedbackAddExe.java | 6 +- .../command/tasklist/SendTodoMessageExe.java | 86 +++++++++++++++++++ .../tasklist/TaskDetailSaveBatchExe.java | 7 ++ .../command/tasklist/TaskListCloseExe.java | 71 --------------- .../tasklist/TaskListIssueCloseExe.java | 73 ++++++++++++++++ .../command/tasklist/TaskListIssueExe.java | 26 ++++-- .../command/tasklist/TaskListUpdateExe.java | 8 ++ .../service/tasklist/TaskListServiceImpl.java | 20 ++++- .../api/tasklist/TaskListServiceI.java | 11 ++- .../tasklist/TaskListIssueCO.java | 6 ++ .../dto/tasklist/FeedbackAddCmd.java | 3 + ...stCloseCmd.java => TaskIssueCloseCmd.java} | 2 +- .../dto/tasklist/TaskListIssueCmd.java | 9 +- .../tasklist/TaskListIssueGateway.java | 3 + .../domain/model/tasklist/TaskListIssueE.java | 3 + .../tasklist/TaskListIssueGatewayImpl.java | 7 ++ .../dataobject/tasklist/TaskListIssueDO.java | 6 ++ 21 files changed, 320 insertions(+), 95 deletions(-) create mode 100644 web-adapter/src/main/java/com/zcloud/safetyDutyList/job/SendTodoMessageJob.java create mode 100644 web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/SendTodoMessageExe.java delete mode 100644 web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListCloseExe.java create mode 100644 web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueCloseExe.java rename web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/{TaskListCloseCmd.java => TaskIssueCloseCmd.java} (91%) diff --git a/docs/init.sql b/docs/init.sql index 3cce0b1..85ef8da 100644 --- a/docs/init.sql +++ b/docs/init.sql @@ -71,6 +71,9 @@ CREATE TABLE `safety_accountability_task_list_issue` ( `execute_user_id` bigint DEFAULT NULL COMMENT '执行人员ID', `issue_status` tinyint DEFAULT '0' COMMENT '下发状态:0-未下发 1-已下发', `issue_time` datetime DEFAULT NULL COMMENT '下发时间', + `issue_corp_id` bigint DEFAULT NULL COMMENT '下发公司ID', + `issue_department_id` bigint DEFAULT NULL COMMENT '下发部门ID', + `issue_user_id` bigint DEFAULT NULL COMMENT '下发人员ID', `period_start_time` datetime DEFAULT NULL COMMENT '执行周期开始时间', `period_end_time` datetime DEFAULT NULL COMMENT '执行周期结束时间', `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1-进行中 2-已完成 3-已关闭', diff --git a/web-adapter/src/main/java/com/zcloud/safetyDutyList/job/SendTodoMessageJob.java b/web-adapter/src/main/java/com/zcloud/safetyDutyList/job/SendTodoMessageJob.java new file mode 100644 index 0000000..68ab4ab --- /dev/null +++ b/web-adapter/src/main/java/com/zcloud/safetyDutyList/job/SendTodoMessageJob.java @@ -0,0 +1,53 @@ +package com.zcloud.safetyDutyList.job; + +import com.jjb.saas.framework.job.Job; +import com.jjb.saas.framework.job.annotation.JobRegister; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import com.zcloud.safetyDutyList.api.tasklist.TaskListServiceI; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 安全责任清单 - 定时任务:反馈异常检测 + *

+ * 执行周期:每月1日0时(cron = "0 0 0 1 * ?") + *

+ * 业务场景: + * 每个任务都有对应的反馈周期(每月/每季度/每半年/每年),任务负责人需要按照周期提交反馈。 + * 如果在某个周期内没有提交任何反馈,则判定为反馈异常,需要记录到反馈异常表中。 + *

+ * 调用层级:Job → TaskListServiceI → TaskListServiceImpl → FeedbackExceptionCheckExe → Gateway + *

+ * 遵循COLA架构规范,Job仅负责调度入口,业务逻辑由Exe执行器处理。 + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class SendTodoMessageJob implements Job { + + /** 安全责任清单服务接口,用于调用定时任务业务方法 */ + private final TaskListServiceI taskListService; + + /** + * 定时任务入口方法 + *

+ * 由XXL-Job调度框架调用,执行反馈异常检测逻辑。 + * 执行成功返回SUCCESS,异常时返回FAIL及错误信息。 + */ + @Override + @JobRegister(cron = "0 0 8 1 * ?", jobDesc = "安全责任清单-发送待办消息", triggerStatus = 1) + @XxlJob("com.zcloud.safetyDutyList.job.SendTodoMessageJob") + public ReturnT execute(String param) { + log.info("【安全责任清单】开始执行发送待办消息定时任务"); + try { + taskListService.sendTodoMessage(); + log.info("【安全责任清单】发送待办消息任务执行完成"); + } catch (Exception e) { + log.error("【安全责任清单】发送待办消息定时任务执行异常", e); + return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage()); + } + return ReturnT.SUCCESS; + } +} diff --git a/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListController.java b/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListController.java index f1f525b..d616c90 100644 --- a/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListController.java +++ b/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListController.java @@ -57,12 +57,6 @@ public class TaskListController { return taskListService.switchFlag(cmd); } - @ApiOperation("关闭清单") - @PostMapping("/close") - public SingleResponse close(@Validated @RequestBody TaskListCloseCmd cmd) { - return taskListService.close(cmd); - } - @ApiOperation("任务下发") @PostMapping("/issue") public SingleResponse issue(@Validated @RequestBody TaskListIssueCmd cmd) { diff --git a/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListIssueController.java b/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListIssueController.java index d8c95d4..1decf25 100644 --- a/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListIssueController.java +++ b/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskListIssueController.java @@ -36,4 +36,10 @@ public class TaskListIssueController { public SingleResponse getByTaskIssueId(@PathVariable String taskIssueId) { return taskListService.getIssueByTaskIssueId(taskIssueId); } + + @ApiOperation("关闭任务 - 清单下发记录详情") + @GetMapping("close/{taskIssueId}") + public SingleResponse closeTaskIssueId(@PathVariable String taskIssueId) { + return taskListService.close(taskIssueId); + } } diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/FeedbackAddExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/FeedbackAddExe.java index 701575b..e5d0fd2 100644 --- a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/FeedbackAddExe.java +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/FeedbackAddExe.java @@ -52,7 +52,11 @@ public class FeedbackAddExe { } FeedbackE feedbackE = new FeedbackE(); - feedbackE.init(); + if (StringUtil.isNotBlank(cmd.getFeedbackId())) { + feedbackE.setFeedbackId(cmd.getFeedbackId()); + }else { + feedbackE.init(); + } feedbackE.setTaskDetailId(executionE.getTaskDetailId()); feedbackE.setTaskExecutionId(executionE.getTaskExecutionId()); feedbackE.setTaskListId(executionE.getTaskListId()); diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/SendTodoMessageExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/SendTodoMessageExe.java new file mode 100644 index 0000000..e154615 --- /dev/null +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/SendTodoMessageExe.java @@ -0,0 +1,86 @@ +package com.zcloud.safetyDutyList.command.tasklist; + +import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum; +import com.zcloud.safetyDutyList.domain.gateway.tasklist.*; +import com.zcloud.safetyDutyList.domain.model.tasklist.*; +import com.zcloud.safetyDutyList.domain.util.FeedbackCycleUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 定时任务2:反馈异常检测 + *

+ * 执行周期:每月1日0时 + *

+ * 实现逻辑: + * 1. 获取所有 task_status=1 的任务执行记录,获取其反馈周期类型 feedback_cycle_type + * 2. 根据反馈周期类型判断上一阶段是否有反馈记录,无记录则判定为异常 + * 判定规则: + * feedback_cycle_type=1(每月):每个月都需要反馈至少一次 + * feedback_cycle_type=2(每季度):每个季度(自然月划分)都需要反馈至少一次 + * feedback_cycle_type=3(每半年):每半年(以自然月6月划分)都需要反馈至少一次 + * feedback_cycle_type=4(年):一年内必须反馈至少一次 + */ +@Slf4j +@Component +@AllArgsConstructor +public class SendTodoMessageExe { + private final TaskListIssueGateway taskListIssueGateway; + private final TaskExecutionGateway taskExecutionGateway; + private final TaskDetailGateway taskDetailGateway; + private final FeedbackGateway feedbackGateway; + + @Scheduled(cron = "0 0 0 1 * ?") + @Transactional(rollbackFor = Exception.class) + public void execute() { + log.info("【定时任务3】开始发送待办消息..."); + List issuedList = taskListIssueGateway.listIssuedWithPeriod(); + if (issuedList == null || issuedList.isEmpty()) { + log.info("【定时任务3】无下发记录需要发送待办"); + return; + } + + for (TaskListIssueE issueE : issuedList) { + List executionList = taskExecutionGateway.listByTaskIssueId(issueE.getTaskIssueId()); + if (executionList == null) continue; + + for (TaskExecutionE executionE : executionList) { + + // 不是进行中就返回 + if (!TaskStatusEnum.IN_PROGRESS.getCode().equals(executionE.getTaskStatus())) continue; + + + // 获取任务详情 + TaskDetailE detailE = taskDetailGateway.getByTaskDetailId(executionE.getTaskDetailId()); + if (detailE == null || detailE.getFeedbackCycleType() == null) continue; + + // 反馈周期枚举: 1(每月) 2(每季度) 3(每半年) 4(年) + Integer feedbackCycleType = detailE.getFeedbackCycleType(); + + // 首周期判断:如果当前仍处于清单的首个反馈周期内,跳过检测 + if (!FeedbackCycleUtil.isFirstCycle(feedbackCycleType, issueE.getPeriodStartTime())) { + continue; + } + + String currentCycleFlag = FeedbackCycleUtil.generatePeriodFlag(feedbackCycleType, LocalDateTime.now()); + + // 检查阶段内是否有反馈记录 + List feedbackList = feedbackGateway.listByTaskExecutionIdAndPeriodFlag( + executionE.getTaskExecutionId(), currentCycleFlag); + if (feedbackList != null && !feedbackList.isEmpty()) { + // 周期内存在反馈 + continue; + } + + // todo 发送待办消息 + } + } + log.info("【定时任务3】待办消息发送完成"); + } +} diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskDetailSaveBatchExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskDetailSaveBatchExe.java index b4e68ef..7e436bd 100644 --- a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskDetailSaveBatchExe.java +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskDetailSaveBatchExe.java @@ -2,6 +2,7 @@ package com.zcloud.safetyDutyList.command.tasklist; import com.alibaba.cola.exception.BizException; import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskDetailGateway; +import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListIssueGateway; import com.zcloud.safetyDutyList.domain.model.tasklist.TaskDetailE; import com.zcloud.safetyDutyList.dto.clientobject.tasklist.TaskDetailCO; import com.zcloud.safetyDutyList.dto.tasklist.TaskDetailSaveBatchCmd; @@ -26,6 +27,7 @@ import java.util.stream.Collectors; public class TaskDetailSaveBatchExe { private final TaskDetailGateway taskDetailGateway; private final TaskDetailRepository taskDetailRepository; + private final TaskListIssueGateway taskListIssueGateway; @Transactional(rollbackFor = Exception.class) public List execute(List cmds) { @@ -35,6 +37,11 @@ public class TaskDetailSaveBatchExe { // 获取已存在的任务详情列表 String taskListId = cmds.get(0).getTaskListId(); + + if (taskListIssueGateway.isIssued(taskListId)) { + throw new BizException("清单已下发,禁止修改"); + } + List existDetails = taskDetailGateway.listByTaskListId(taskListId); Map existDetailMap = existDetails.stream() diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListCloseExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListCloseExe.java deleted file mode 100644 index d8705e3..0000000 --- a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListCloseExe.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.zcloud.safetyDutyList.command.tasklist; - -import com.alibaba.cola.exception.BizException; -import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum; -import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskExecutionGateway; -import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListGateway; -import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListIssueGateway; -import com.zcloud.safetyDutyList.domain.model.tasklist.TaskExecutionE; -import com.zcloud.safetyDutyList.domain.model.tasklist.TaskListE; -import com.zcloud.safetyDutyList.domain.model.tasklist.TaskListIssueE; -import com.zcloud.safetyDutyList.dto.tasklist.TaskListCloseCmd; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 清单关闭执行器 - *

- * 处理关闭清单模板的业务逻辑: - * 1. 校验清单是否存在 - * 2. 将清单模板状态更新为已关闭 - * 3. 同时关闭该清单下所有进行中的下发记录 - * 4. 同时关闭所有下发记录下进行中的任务执行记录 - */ -@Component -@AllArgsConstructor -public class TaskListCloseExe { - private final TaskListGateway taskListGateway; - private final TaskListIssueGateway taskListIssueGateway; - private final TaskExecutionGateway taskExecutionGateway; - - @Transactional(rollbackFor = Exception.class) - public void execute(TaskListCloseCmd cmd) { - // 1. 关闭清单模板 - TaskListE listE = taskListGateway.getByTaskListId(cmd.getTaskListId()); - if (listE == null) { - throw new BizException("清单不存在"); - } - listE.setStatus(TaskStatusEnum.CLOSED.getCode()); - boolean res = taskListGateway.update(listE); - if (!res) { - throw new BizException("关闭清单失败"); - } - - // 2. 关闭该清单下所有进行中的下发记录 - List issueList = taskListIssueGateway.listByTaskListId(cmd.getTaskListId()); - if (issueList != null) { - for (TaskListIssueE issueE : issueList) { - if (TaskStatusEnum.IN_PROGRESS.getCode().equals(issueE.getStatus())) { - issueE.setStatus(TaskStatusEnum.CLOSED.getCode()); - issueE.setCloseTime(LocalDateTime.now()); - taskListIssueGateway.update(issueE); - } - - // 3. 关闭该下发记录下所有进行中的任务执行记录 - List executionList = taskExecutionGateway.listByTaskIssueId(issueE.getTaskIssueId()); - if (executionList != null) { - for (TaskExecutionE executionE : executionList) { - if (TaskStatusEnum.IN_PROGRESS.getCode().equals(executionE.getTaskStatus())) { - executionE.setTaskStatus(TaskStatusEnum.CLOSED.getCode()); - taskExecutionGateway.update(executionE); - } - } - } - } - } - } -} diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueCloseExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueCloseExe.java new file mode 100644 index 0000000..16a6931 --- /dev/null +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueCloseExe.java @@ -0,0 +1,73 @@ +package com.zcloud.safetyDutyList.command.tasklist; + +import com.alibaba.cola.exception.BizException; +import com.jjb.saas.framework.auth.model.SSOUser; +import com.jjb.saas.framework.auth.utils.AuthContext; +import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum; +import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskExecutionGateway; +import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListGateway; +import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListIssueGateway; +import com.zcloud.safetyDutyList.domain.model.tasklist.TaskExecutionE; +import com.zcloud.safetyDutyList.domain.model.tasklist.TaskListIssueE; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +/** + * 清单关闭执行器 + *

+ * 处理关闭清单模板的业务逻辑: + * 1. 校验清单是否存在 + * 2. 将清单模板状态更新为已关闭 + * 3. 同时关闭该清单下所有进行中的下发记录 + * 4. 同时关闭所有下发记录下进行中的任务执行记录 + */ +@Component +@AllArgsConstructor +public class TaskListIssueCloseExe { + private final TaskListGateway taskListGateway; + private final TaskListIssueGateway taskListIssueGateway; + private final TaskExecutionGateway taskExecutionGateway; + + @Transactional(rollbackFor = Exception.class) + public void execute(String taskIssueId) { + // 1. 关闭清单模板 + TaskListIssueE issueE = taskListIssueGateway.getByTaskIssueId(taskIssueId); + if (issueE == null) { + throw new BizException("清单下发记录不存在"); + } + + SSOUser ssoUser = AuthContext.getCurrentUser(); + if (ssoUser == null) { + throw new BizException("用户未登录"); + } + if (issueE.getIssueUserId() == null) { + throw new BizException("清单下发记录未指定下发人"); + } + if (!Objects.equals(issueE.getIssueUserId(), ssoUser.getUserId())) { + throw new BizException("用户无权限关闭该清单下发记录"); + } + + issueE.setStatus(TaskStatusEnum.CLOSED.getCode()); + issueE.setCloseTime(LocalDateTime.now()); + boolean res = taskListIssueGateway.update(issueE); + if (!res) { + throw new BizException("关闭清单下发记录失败"); + } + + // 3. 关闭该下发记录下所有进行中的任务执行记录 + List executionList = taskExecutionGateway.listByTaskIssueId(issueE.getTaskIssueId()); + if (executionList != null) { + for (TaskExecutionE executionE : executionList) { + if (TaskStatusEnum.IN_PROGRESS.getCode().equals(executionE.getTaskStatus())) { + executionE.setTaskStatus(TaskStatusEnum.CLOSED.getCode()); + taskExecutionGateway.update(executionE); + } + } + } + } +} diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueExe.java index 58840cb..f81bd92 100644 --- a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueExe.java +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListIssueExe.java @@ -1,6 +1,8 @@ package com.zcloud.safetyDutyList.command.tasklist; import com.alibaba.cola.exception.BizException; +import com.jjb.saas.framework.auth.model.SSOUser; +import com.jjb.saas.framework.auth.utils.AuthContext; import com.zcloud.safetyDutyList.domain.enums.SwitchFlagEnum; import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum; import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskDetailGateway; @@ -39,6 +41,12 @@ public class TaskListIssueExe { @Transactional(rollbackFor = Exception.class) public void execute(TaskListIssueCmd cmd) { + + SSOUser ssoUser = AuthContext.getCurrentUser(); + if (ssoUser == null) { + throw new BizException("用户未登录"); + } + TaskListE taskListE = taskListGateway.getInfoByTaskListId(cmd.getTaskListId()); if (taskListE == null) { throw new BizException("任务清单不存在"); @@ -53,12 +61,15 @@ public class TaskListIssueExe { } // 1. 处理周期时间 - LocalDateTime startTime = cmd.getPeriodStartTime() - .withDayOfMonth(1) - .with(LocalTime.MIN); - LocalDateTime endTime = cmd.getPeriodEndTime() - .withDayOfMonth(cmd.getPeriodEndTime().toLocalDate().lengthOfMonth()) - .with(LocalTime.of(23, 59, 59)); + LocalDateTime startTime = cmd.getPeriodStartTime().atDay(1).atStartOfDay(); + LocalDateTime endTime = cmd.getPeriodEndTime().atEndOfMonth().atTime(23, 59, 59); + +// LocalDateTime startTime = cmd.getPeriodStartTime() +// .withDayOfMonth(1) +// .with(LocalTime.MIN); +// LocalDateTime endTime = cmd.getPeriodEndTime() +// .withDayOfMonth(cmd.getPeriodEndTime().toLocalDate().lengthOfMonth()) +// .with(LocalTime.of(23, 59, 59)); // 2. 创建清单下发记录 TaskListIssueE issueE = new TaskListIssueE(); @@ -69,6 +80,9 @@ public class TaskListIssueExe { issueE.setExecuteUserId(cmd.getExecuteUserId()); issueE.setIssueStatus(1); issueE.setIssueTime(LocalDateTime.now()); + issueE.setIssueCorpId(ssoUser.getTenantId()); + issueE.setIssueDepartmentId(ssoUser.getOrgId()); + issueE.setIssueUserId(ssoUser.getUserId()); issueE.setPeriodStartTime(startTime); issueE.setPeriodEndTime(endTime); issueE.setStatus(TaskStatusEnum.IN_PROGRESS.getCode()); diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListUpdateExe.java b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListUpdateExe.java index 24b72ee..590a416 100644 --- a/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/command/tasklist/TaskListUpdateExe.java @@ -4,6 +4,7 @@ import com.alibaba.cola.exception.BizException; import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum; import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskDetailGateway; import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListGateway; +import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListIssueGateway; import com.zcloud.safetyDutyList.domain.model.tasklist.TaskDetailE; import com.zcloud.safetyDutyList.domain.model.tasklist.TaskListE; import com.zcloud.safetyDutyList.dto.clientobject.tasklist.TaskListCO; @@ -33,6 +34,7 @@ import java.util.List; @AllArgsConstructor public class TaskListUpdateExe { private final TaskListGateway taskListGateway; + private final TaskListIssueGateway taskListIssueGateway; @Transactional(rollbackFor = Exception.class) public Boolean execute(TaskListUpdateCmd cmd) { @@ -40,6 +42,12 @@ public class TaskListUpdateExe { if (existE == null) { throw new BizException("任务清单不存在"); } + + // 已经下发的任务,禁止修改 + if (taskListIssueGateway.isIssued(existE.getTaskListId())) { + throw new BizException("任务清单已下发,禁止修改"); + } + BeanUtils.copyProperties(cmd, existE); boolean res = taskListGateway.update(existE); if (!res) { diff --git a/web-app/src/main/java/com/zcloud/safetyDutyList/service/tasklist/TaskListServiceImpl.java b/web-app/src/main/java/com/zcloud/safetyDutyList/service/tasklist/TaskListServiceImpl.java index f449427..acd922c 100644 --- a/web-app/src/main/java/com/zcloud/safetyDutyList/service/tasklist/TaskListServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/safetyDutyList/service/tasklist/TaskListServiceImpl.java @@ -35,8 +35,8 @@ public class TaskListServiceImpl implements TaskListServiceI { private final TaskListRemoveExe taskListRemoveExe; /** 清单开关切换执行器 */ private final TaskListSwitchExe taskListSwitchExe; - /** 清单关闭执行器 */ - private final TaskListCloseExe taskListCloseExe; + /** 清单下发关闭执行器 */ + private final TaskListIssueCloseExe taskListIssueCloseExe; /** 清单下发执行器 */ private final TaskListIssueExe taskListIssueExe; /** 任务详情保存执行器 */ @@ -71,6 +71,8 @@ public class TaskListServiceImpl implements TaskListServiceI { private final TaskListStatusUpdateExe taskListStatusUpdateExe; /** 反馈异常检测执行器(定时任务2) */ private final FeedbackExceptionCheckExe feedbackExceptionCheckExe; + /** 发送代办执行器 */ + private final SendTodoMessageExe sendTodoMessageExe; @Override public PageResponse listPage(TaskListPageQry qry) { @@ -113,8 +115,8 @@ public class TaskListServiceImpl implements TaskListServiceI { } @Override - public SingleResponse close(TaskListCloseCmd cmd) { - taskListCloseExe.execute(cmd); + public SingleResponse close(String taskIssueId) { + taskListIssueCloseExe.execute(taskIssueId); return SingleResponse.buildSuccess(); } @@ -261,4 +263,14 @@ public class TaskListServiceImpl implements TaskListServiceI { public void checkFeedbackException() { feedbackExceptionCheckExe.execute(); } + + /** + * 定时任务2:反馈异常检测 + *

+ * 委派给FeedbackExceptionCheckExe执行器处理 + */ + @Override + public void sendTodoMessage() { + sendTodoMessageExe.execute(); + } } diff --git a/web-client/src/main/java/com/zcloud/safetyDutyList/api/tasklist/TaskListServiceI.java b/web-client/src/main/java/com/zcloud/safetyDutyList/api/tasklist/TaskListServiceI.java index 0deb7b7..69f74da 100644 --- a/web-client/src/main/java/com/zcloud/safetyDutyList/api/tasklist/TaskListServiceI.java +++ b/web-client/src/main/java/com/zcloud/safetyDutyList/api/tasklist/TaskListServiceI.java @@ -78,10 +78,9 @@ public interface TaskListServiceI { /** * 关闭任务清单(同时关闭关联的所有任务详情) * - * @param cmd 关闭命令 * @return 操作结果 */ - SingleResponse close(TaskListCloseCmd cmd); + SingleResponse close(String taskIssueId); /** * 任务清单下发(指定执行企业和执行人,设置周期起止时间) @@ -283,4 +282,12 @@ public interface TaskListServiceI { * 若无反馈则创建反馈异常记录。由FeedbackExceptionCheckJob定时任务调用。 */ void checkFeedbackException(); + + /** + * 定时任务3:发送待办消息 + *

+ * 获取所有进行中的任务,根据反馈周期类型判断上一阶段是否有反馈记录, + * 若无反馈则创建反馈异常记录。由FeedbackExceptionCheckJob定时任务调用。 + */ + void sendTodoMessage(); } diff --git a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/clientobject/tasklist/TaskListIssueCO.java b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/clientobject/tasklist/TaskListIssueCO.java index cd0cac7..200c7c3 100644 --- a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/clientobject/tasklist/TaskListIssueCO.java +++ b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/clientobject/tasklist/TaskListIssueCO.java @@ -46,6 +46,12 @@ public class TaskListIssueCO extends ClientObject { @ApiModelProperty(value = "下发时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime issueTime; + @ApiModelProperty(value = "下发公司") + private Long issueCorpId; + @ApiModelProperty(value = "下发部门") + private Long issueDepartmentId; + @ApiModelProperty(value = "下发人员") + private Long issueUserId; @ApiModelProperty(value = "执行周期开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime periodStartTime; diff --git a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/FeedbackAddCmd.java b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/FeedbackAddCmd.java index 9ec9da6..ffd4f4f 100644 --- a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/FeedbackAddCmd.java +++ b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/FeedbackAddCmd.java @@ -25,6 +25,9 @@ public class FeedbackAddCmd implements Serializable { @NotEmpty(message = "任务执行ID不能为空") private String taskExecutionId; + @ApiModelProperty(value = "反馈ID", required = true) + private String feedbackId; + @ApiModelProperty(value = "反馈内容", required = true) @NotEmpty(message = "反馈内容不能为空") private String feedbackContent; diff --git a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListCloseCmd.java b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskIssueCloseCmd.java similarity index 91% rename from web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListCloseCmd.java rename to web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskIssueCloseCmd.java index c317d76..7212ae2 100644 --- a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListCloseCmd.java +++ b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskIssueCloseCmd.java @@ -16,7 +16,7 @@ import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor -public class TaskListCloseCmd implements Serializable { +public class TaskIssueCloseCmd implements Serializable { @ApiModelProperty(value = "清单业务ID", required = true) @NotEmpty(message = "清单业务ID不能为空") private String taskListId; diff --git a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListIssueCmd.java b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListIssueCmd.java index 879d5eb..30ca246 100644 --- a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListIssueCmd.java +++ b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskListIssueCmd.java @@ -10,6 +10,7 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.time.LocalDateTime; +import java.time.YearMonth; /** * 安全责任清单下发命令 @@ -38,11 +39,11 @@ public class TaskListIssueCmd implements Serializable { @ApiModelProperty(value = "执行周期开始时间", required = true) @NotNull(message = "执行周期开始时间不能为空") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime periodStartTime; + @JsonFormat(pattern = "yyyy-MM") + private YearMonth periodStartTime; @ApiModelProperty(value = "执行周期结束时间", required = true) @NotNull(message = "执行周期结束时间不能为空") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime periodEndTime; + @JsonFormat(pattern = "yyyy-MM") + private YearMonth periodEndTime; } diff --git a/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/gateway/tasklist/TaskListIssueGateway.java b/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/gateway/tasklist/TaskListIssueGateway.java index 44a7483..86d082e 100644 --- a/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/gateway/tasklist/TaskListIssueGateway.java +++ b/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/gateway/tasklist/TaskListIssueGateway.java @@ -22,4 +22,7 @@ public interface TaskListIssueGateway { List listExpiredInProgress(); List listIssuedWithPeriod(); + + // 清单是否下发 + Boolean isIssued(String taskListId); } diff --git a/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/model/tasklist/TaskListIssueE.java b/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/model/tasklist/TaskListIssueE.java index fd15d65..ebc1826 100644 --- a/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/model/tasklist/TaskListIssueE.java +++ b/web-domain/src/main/java/com/zcloud/safetyDutyList/domain/model/tasklist/TaskListIssueE.java @@ -25,6 +25,9 @@ public class TaskListIssueE extends BaseE { private Long executeUserId; private Integer issueStatus; private LocalDateTime issueTime; + private Long issueCorpId; + private Long issueDepartmentId; + private Long issueUserId; private LocalDateTime periodStartTime; private LocalDateTime periodEndTime; private Integer status; diff --git a/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/gatewayimpl/tasklist/TaskListIssueGatewayImpl.java b/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/gatewayimpl/tasklist/TaskListIssueGatewayImpl.java index d1be39c..fdfed31 100644 --- a/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/gatewayimpl/tasklist/TaskListIssueGatewayImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/gatewayimpl/tasklist/TaskListIssueGatewayImpl.java @@ -94,4 +94,11 @@ public class TaskListIssueGatewayImpl implements TaskListIssueGateway { } return eList; } + + // 清单是否下发 + @Override + public Boolean isIssued(String taskListId){ + List taskListIssueDOList = taskListIssueRepository.listByTaskListId(taskListId); + return taskListIssueDOList != null && taskListIssueDOList.size() > 0; + } } diff --git a/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/persistence/dataobject/tasklist/TaskListIssueDO.java b/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/persistence/dataobject/tasklist/TaskListIssueDO.java index 21e2346..cc00fa1 100644 --- a/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/persistence/dataobject/tasklist/TaskListIssueDO.java +++ b/web-infrastructure/src/main/java/com/zcloud/safetyDutyList/persistence/dataobject/tasklist/TaskListIssueDO.java @@ -33,6 +33,12 @@ public class TaskListIssueDO extends BaseDO { private Integer issueStatus; @ApiModelProperty(value = "下发时间") private LocalDateTime issueTime; + @ApiModelProperty(value = "下发公司") + private Long issueCorpId; + @ApiModelProperty(value = "下发部门") + private Long issueDepartmentId; + @ApiModelProperty(value = "下发人员") + private Long issueUserId; @ApiModelProperty(value = "执行周期开始时间") private LocalDateTime periodStartTime; @ApiModelProperty(value = "执行周期结束时间")