master
tianxinlei 2026-05-27 09:28:05 +08:00
parent 9dfb999323
commit ed9a44911b
5 changed files with 128 additions and 65 deletions

View File

@ -1,5 +1,6 @@
package com.zcloud.safetyDutyList.web.tasklist; package com.zcloud.safetyDutyList.web.tasklist;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response; import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse; import com.alibaba.cola.dto.SingleResponse;
@ -42,17 +43,17 @@ public class TaskDetailController {
return taskListService.addTaskDetail(cmd); return taskListService.addTaskDetail(cmd);
} }
@ApiOperation("新增任务") @ApiOperation("批量保存任务")
@PostMapping("/saveBatch") @PostMapping("/saveBatch")
public SingleResponse add(@Validated @RequestBody List<TaskDetailSaveCmd> cmds) { public MultiResponse<TaskDetailCO> addBatch(@Validated @RequestBody List<TaskDetailSaveBatchCmd> cmds) {
return taskListService.addTaskDetailBatch(cmds); return taskListService.addTaskDetailBatch(cmds);
} }
@ApiOperation("编辑任务") // @ApiOperation("编辑任务")
@PostMapping("/edit") // @PostMapping("/edit")
public SingleResponse<TaskDetailCO> edit(@Validated @RequestBody TaskDetailEditCmd cmd) { // public SingleResponse<TaskDetailCO> edit(@Validated @RequestBody TaskDetailEditCmd cmd) {
return taskListService.editTaskDetail(cmd); // return taskListService.editTaskDetail(cmd);
} // }
@ApiOperation("获取任务详情") @ApiOperation("获取任务详情")
@GetMapping("/{detailId}") @GetMapping("/{detailId}")

View File

@ -3,81 +3,105 @@ package com.zcloud.safetyDutyList.command.tasklist;
import com.alibaba.cola.exception.BizException; import com.alibaba.cola.exception.BizException;
import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum; import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum;
import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskDetailGateway; 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.domain.model.tasklist.TaskDetailE;
import com.zcloud.safetyDutyList.dto.clientobject.tasklist.TaskDetailCO; 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 lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
* <p>
*
* 1.
* 2. 100
* 3.
* 4.
*/
@Component @Component
@AllArgsConstructor @AllArgsConstructor
public class TaskDetailSaveBatchExe { public class TaskDetailSaveBatchExe {
private final TaskDetailGateway taskDetailGateway; private final TaskDetailGateway taskDetailGateway;
private final TaskListGateway taskListGateway;
public Boolean execute(List<TaskDetailSaveCmd> cmds) {
@Transactional(rollbackFor = Exception.class)
public List<TaskDetailCO> execute(List<TaskDetailSaveBatchCmd> cmds) {
if (cmds == null || cmds.isEmpty()) { if (cmds == null || cmds.isEmpty()) {
throw new BizException("参数不能为空"); throw new BizException("参数不能为空");
} }
// 获取当前已有列表 // 获取已存在的任务详情列表
List<TaskDetailE> existDetails = taskDetailGateway.listByTaskListId(cmds.get(0).getTaskListId()); String taskListId = cmds.get(0).getTaskListId();
if (existDetails == null || existDetails.isEmpty()) { List<TaskDetailE> existDetails = taskDetailGateway.listByTaskListId(taskListId);
throw new BizException("清单不存在");
Map<Long, TaskDetailE> existDetailMap = existDetails.stream()
.collect(Collectors.toMap(TaskDetailE::getId, Function.identity(), (o, n) -> o));
// 获取要删除的ID
List<Long> cmdIds = cmds.stream()
.map(TaskDetailSaveBatchCmd::getId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
List<Long> toDeleteIds = existDetails.stream()
.map(TaskDetailE::getId)
.filter(id -> !cmdIds.contains(id))
.collect(Collectors.toList());
BigDecimal totalScore = BigDecimal.ZERO;
List<TaskDetailE> toAdd = new ArrayList<>();
List<TaskDetailE> 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 remainScore = existDetails.stream()
// BigDecimal totalScore = existDetails.stream() .filter(d -> !cmdIds.contains(d.getId()) && !toDeleteIds.contains(d.getId()))
// .map(TaskDetailE::getTaskScore) .map(TaskDetailE::getTaskScore)
// .filter(s -> s != null) .filter(Objects::nonNull)
// .reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
// totalScore = totalScore.add(remainScore);
// 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);
// }
List<TaskDetailE> detailEList = new ArrayList <>(); if (totalScore.compareTo(new BigDecimal("100")) > 0) {
for (TaskDetailSaveCmd cmd : cmds) { throw new BizException("当前清单总分不能超过100");
TaskDetailE detailE = new TaskDetailE();
BeanUtils.copyProperties(cmd, detailE);
detailE.init();
detailE.setTaskStatus(TaskStatusEnum.IN_PROGRESS.getCode());
detailE.setFeedbackStatus(1);
detailEList.add(detailE);
} }
boolean res = taskDetailGateway.batchAdd(detailEList); for (Long deleteId : toDeleteIds) {
if (!res) { taskDetailGateway.deleteById(deleteId);
throw new BizException("保存失败");
} }
return true; if (!toAdd.isEmpty()) {
taskDetailGateway.batchAdd(toAdd);
}
for (TaskDetailE detailE : toUpdate) {
taskDetailGateway.update(detailE);
}
List<TaskDetailE> latestDetails = taskDetailGateway.listByTaskListId(taskListId);
return latestDetails.stream().map(detailE -> {
TaskDetailCO co = new TaskDetailCO();
BeanUtils.copyProperties(detailE, co);
return co;
}).collect(Collectors.toList());
} }
} }

View File

@ -125,9 +125,9 @@ public class TaskListServiceImpl implements TaskListServiceI {
} }
@Override @Override
public SingleResponse addTaskDetailBatch(List <TaskDetailSaveCmd> cmds) { public MultiResponse<TaskDetailCO> addTaskDetailBatch(List<TaskDetailSaveBatchCmd> cmds) {
taskDetailSaveBatchExe.execute(cmds); List<TaskDetailCO> coList = taskDetailSaveBatchExe.execute(cmds);
return SingleResponse.buildSuccess(); return MultiResponse.of(coList);
} }
@Override @Override

View File

@ -100,12 +100,12 @@ public interface TaskListServiceI {
SingleResponse<TaskDetailCO> addTaskDetail(TaskDetailSaveCmd cmd); SingleResponse<TaskDetailCO> addTaskDetail(TaskDetailSaveCmd cmd);
/** /**
* 100 * idid
* *
* @param cmds * @param cmds
* @return * @return
*/ */
SingleResponse<TaskDetailCO> addTaskDetailBatch(List<TaskDetailSaveCmd> cmds); MultiResponse<TaskDetailCO> addTaskDetailBatch(List<TaskDetailSaveBatchCmd> cmds);
/** /**
* 100 * 100

View File

@ -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;
/**
*
* <p>
* 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;
}