diff --git a/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskDetailController.java b/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskDetailController.java index 0053401..eef041f 100644 --- a/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskDetailController.java +++ b/web-adapter/src/main/java/com/zcloud/safetyDutyList/web/tasklist/TaskDetailController.java @@ -1,5 +1,6 @@ package com.zcloud.safetyDutyList.web.tasklist; +import com.alibaba.cola.dto.MultiResponse; import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.Response; import com.alibaba.cola.dto.SingleResponse; @@ -42,17 +43,17 @@ public class TaskDetailController { return taskListService.addTaskDetail(cmd); } - @ApiOperation("新增任务") + @ApiOperation("批量保存任务") @PostMapping("/saveBatch") - public SingleResponse add(@Validated @RequestBody List cmds) { + public MultiResponse addBatch(@Validated @RequestBody List cmds) { return taskListService.addTaskDetailBatch(cmds); } - @ApiOperation("编辑任务") - @PostMapping("/edit") - public SingleResponse edit(@Validated @RequestBody TaskDetailEditCmd cmd) { - return taskListService.editTaskDetail(cmd); - } +// @ApiOperation("编辑任务") +// @PostMapping("/edit") +// public SingleResponse edit(@Validated @RequestBody TaskDetailEditCmd cmd) { +// return taskListService.editTaskDetail(cmd); +// } @ApiOperation("获取任务详情") @GetMapping("/{detailId}") 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 bdbf082..13915c0 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 @@ -3,81 +3,105 @@ 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.TaskDetailGateway; -import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListGateway; import com.zcloud.safetyDutyList.domain.model.tasklist.TaskDetailE; import com.zcloud.safetyDutyList.dto.clientobject.tasklist.TaskDetailCO; -import com.zcloud.safetyDutyList.dto.tasklist.TaskDetailSaveCmd; +import com.zcloud.safetyDutyList.dto.tasklist.TaskDetailSaveBatchCmd; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; -/** - * 任务详情保存执行器 - *

- * 处理新增任务详情的业务逻辑: - * 1. 查询该清单下已有任务详情,计算总分 - * 2. 校验新增后清单总分不超过100分 - * 3. 创建任务详情实体并保存 - * 4. 返回新增后的任务详情信息 - */ @Component @AllArgsConstructor public class TaskDetailSaveBatchExe { private final TaskDetailGateway taskDetailGateway; - private final TaskListGateway taskListGateway; - - public Boolean execute(List cmds) { + @Transactional(rollbackFor = Exception.class) + public List execute(List cmds) { if (cmds == null || cmds.isEmpty()) { - throw new BizException("参数不能为空"); + throw new BizException("参数不能为空"); } - // 获取当前已有列表 - List existDetails = taskDetailGateway.listByTaskListId(cmds.get(0).getTaskListId()); - if (existDetails == null || existDetails.isEmpty()) { - throw new BizException("清单不存在"); + // 获取已存在的任务详情列表 + String taskListId = cmds.get(0).getTaskListId(); + List existDetails = taskDetailGateway.listByTaskListId(taskListId); + + Map existDetailMap = existDetails.stream() + .collect(Collectors.toMap(TaskDetailE::getId, Function.identity(), (o, n) -> o)); + + // 获取要删除的ID + List cmdIds = cmds.stream() + .map(TaskDetailSaveBatchCmd::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + List toDeleteIds = existDetails.stream() + .map(TaskDetailE::getId) + .filter(id -> !cmdIds.contains(id)) + .collect(Collectors.toList()); + + BigDecimal totalScore = BigDecimal.ZERO; + List toAdd = new ArrayList<>(); + List toUpdate = new ArrayList<>(); + + for (TaskDetailSaveBatchCmd cmd : cmds) { + if (cmd.getId() == null) { + TaskDetailE detailE = new TaskDetailE(); + BeanUtils.copyProperties(cmd, detailE); + detailE.init(); + detailE.setTaskStatus(TaskStatusEnum.IN_PROGRESS.getCode()); + detailE.setFeedbackStatus(1); + toAdd.add(detailE); + } else { + TaskDetailE existDetail = existDetailMap.get(cmd.getId()); + if (existDetail == null) { + throw new BizException("任务详情不存在,id=" + cmd.getId()); + } + existDetail.setExecuteContent(cmd.getExecuteContent()); + existDetail.setFeedbackCycleType(cmd.getFeedbackCycleType()); + existDetail.setTaskScore(cmd.getTaskScore()); + toUpdate.add(existDetail); + } + if (cmd.getTaskScore() != null) { + totalScore = totalScore.add(cmd.getTaskScore()); + } } - // 当前的分值 -// BigDecimal totalScore = existDetails.stream() -// .map(TaskDetailE::getTaskScore) -// .filter(s -> s != null) -// .reduce(BigDecimal.ZERO, BigDecimal::add); -// -// BigDecimal cmdScore = cmds.stream() -// .map(TaskDetailSaveCmd::getTaskScore) -// .filter(s -> s != null) -// .reduce(BigDecimal.ZERO, BigDecimal::add); -// -// BigDecimal diff = new BigDecimal("100").subtract(totalScore); -// -// if (cmdScore != null) { -// totalScore = totalScore.add(cmdScore); -// } -// if (totalScore.compareTo(new BigDecimal("100")) > 0) { -// throw new BizException("当前清单总分不能超过100,任务可设最大分值:" + diff); -// } + BigDecimal remainScore = existDetails.stream() + .filter(d -> !cmdIds.contains(d.getId()) && !toDeleteIds.contains(d.getId())) + .map(TaskDetailE::getTaskScore) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + totalScore = totalScore.add(remainScore); - List detailEList = new ArrayList <>(); - for (TaskDetailSaveCmd cmd : cmds) { - TaskDetailE detailE = new TaskDetailE(); - BeanUtils.copyProperties(cmd, detailE); - detailE.init(); - detailE.setTaskStatus(TaskStatusEnum.IN_PROGRESS.getCode()); - detailE.setFeedbackStatus(1); - - detailEList.add(detailE); + if (totalScore.compareTo(new BigDecimal("100")) > 0) { + throw new BizException("当前清单总分不能超过100"); } - boolean res = taskDetailGateway.batchAdd(detailEList); - if (!res) { - throw new BizException("保存失败"); + for (Long deleteId : toDeleteIds) { + taskDetailGateway.deleteById(deleteId); } - return true; + if (!toAdd.isEmpty()) { + taskDetailGateway.batchAdd(toAdd); + } + + for (TaskDetailE detailE : toUpdate) { + taskDetailGateway.update(detailE); + } + + List latestDetails = taskDetailGateway.listByTaskListId(taskListId); + return latestDetails.stream().map(detailE -> { + TaskDetailCO co = new TaskDetailCO(); + BeanUtils.copyProperties(detailE, co); + return co; + }).collect(Collectors.toList()); } } 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 9b9d217..cea208f 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 @@ -125,9 +125,9 @@ public class TaskListServiceImpl implements TaskListServiceI { } @Override - public SingleResponse addTaskDetailBatch(List cmds) { - taskDetailSaveBatchExe.execute(cmds); - return SingleResponse.buildSuccess(); + public MultiResponse addTaskDetailBatch(List cmds) { + List coList = taskDetailSaveBatchExe.execute(cmds); + return MultiResponse.of(coList); } @Override 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 20716f0..d6052b3 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 @@ -100,12 +100,12 @@ public interface TaskListServiceI { SingleResponse addTaskDetail(TaskDetailSaveCmd cmd); /** - * 新增任务详情(校验清单总分不超过100) + * 批量保存任务详情(id为空新增,id非空更新,数据库有但传参无则删除) * - * @param cmds 任务保存命令 - * @return 新增后的任务详情 + * @param cmds 任务保存命令列表 + * @return 保存后的任务详情列表 */ - SingleResponse addTaskDetailBatch(List cmds); + MultiResponse addTaskDetailBatch(List cmds); /** * 编辑任务详情(校验清单总分不超过100) diff --git a/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskDetailSaveBatchCmd.java b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskDetailSaveBatchCmd.java new file mode 100644 index 0000000..2aacca4 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/safetyDutyList/dto/tasklist/TaskDetailSaveBatchCmd.java @@ -0,0 +1,38 @@ +package com.zcloud.safetyDutyList.dto.tasklist; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 任务详情保存命令 + *

+ * 用于新增任务详情,包含所属清单ID、执行内容、反馈周期类型、任务分值等字段 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TaskDetailSaveBatchCmd implements Serializable { + @ApiModelProperty(value = "主键ID", required = true) + private Long id; + + @ApiModelProperty(value = "清单表主键ID", required = true) + @NotEmpty(message = "清单ID不能为空") + private String taskListId; + + @ApiModelProperty(value = "执行内容") + private String executeContent; + + @ApiModelProperty(value = "反馈周期类型:1-每月 2-季度 3-半年 4-年", required = true) + @NotNull(message = "反馈周期不能为空") + private Integer feedbackCycleType; + + @ApiModelProperty(value = "任务分值") + private BigDecimal taskScore; +}