Browse Source

feat: 拆包需求

李学松 2 năm trước cách đây
mục cha
commit
a4d9a6dc4f

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -40,6 +40,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.enums.TargetType;
 import com.qunzhixinxi.hnqz.admin.api.vo.WmScorePackageVO;
 import com.qunzhixinxi.hnqz.admin.entity.*;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UnpackDTO;
 import com.qunzhixinxi.hnqz.admin.entity.model.excel.BatchPackageExcelModel;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
@@ -61,6 +62,7 @@ import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -3175,5 +3177,16 @@ public class WmScorePackageController {
 		return Integer.parseInt(model.getScore());
 	}
 
+	/**
+	 * 拆包
+	 *
+	 * @param unpackDTO 拆包参数
+	 * @return 拆包结果
+	 */
+	@PostMapping("/unpack")
+	public R<?> unpack(@Validated @RequestBody UnpackDTO unpackDTO) {
+		wmScorePackageService.unpack(unpackDTO);
+		return R.ok();
+	}
 
 }

+ 56 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/UnpackDTO.java

@@ -0,0 +1,56 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 拆包DTO
+ *
+ * @author snows
+ * @date 2023/5/31 10:31
+ */
+@Data
+public class UnpackDTO implements Serializable {
+	private static final long serialVersionUID = -3581313016062588900L;
+
+	/**
+	 * 积分包id
+	 */
+	@NotBlank(message = "积分包id必填")
+	private String scorePackageId;
+
+	/**
+	 * 预拆包积分值
+	 */
+	@NotNull(message = "预拆包积分值必填")
+	private Integer newPackageScore;
+
+	/**
+	 * 原积分包剩余积分包值
+	 */
+	@NotNull(message = "原积分包剩余积分包值必填")
+	private Integer remainPackageScore;
+
+	/**
+	 * 已选任务积分值
+	 */
+	@NotNull(message = "已选任务积分值必填")
+	private Integer selectTaskScore;
+
+	/**
+	 * 剩余任务积分值
+	 */
+	@NotNull(message = "剩余任务积分值必填")
+	private Integer remainTaskScore;
+
+	/**
+	 * 已选任务id列表
+	 */
+	@NotEmpty(message = "已选任务id列表必填")
+	private List<String> selectTaskIds;
+}

+ 8 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageService.java

@@ -26,6 +26,7 @@ import com.qunzhixinxi.hnqz.admin.api.vo.WmScorePackageVO;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEntDrugtable;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmTask;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UnpackDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiOutput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleOutput;
@@ -186,4 +187,11 @@ public interface WmScorePackageService extends IService<WmScorePackage> {
 	 * @param pkg 基本包
 	 */
 	void checkPkgToSettle(WmScorePackage pkg);
+
+	/**
+	 * 拆包
+	 *
+	 * @param unpackDTO 拆包参数
+	 */
+	void unpack(UnpackDTO unpackDTO);
 }

+ 120 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageServiceImpl.java

@@ -40,13 +40,17 @@ import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.api.vo.WmScorePackageVO;
 import com.qunzhixinxi.hnqz.admin.entity.*;
+import com.qunzhixinxi.hnqz.admin.entity.dto.UnpackDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiOutput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleOutput;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
+import com.qunzhixinxi.hnqz.admin.enums.PackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ReportEnum;
+import com.qunzhixinxi.hnqz.admin.enums.ScorePackageStatusEnum;
+import com.qunzhixinxi.hnqz.admin.enums.TaskStatusEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.common.core.util.R;
@@ -2484,4 +2488,120 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 		}
 		;
 	}
+
+	/**
+	 * 拆包
+	 *
+	 * @param unpackDTO 拆包参数
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void unpack(UnpackDTO unpackDTO) {
+		// 原积分包
+		WmScorePackage scorePackage = this.getById(unpackDTO.getScorePackageId());
+		if (scorePackage == null) {
+			throw new RuntimeException("原积分包不存在");
+		}
+		if (!PackageTypeEnum.TYPE1_SCOTE_PACKAGE.val().equals(scorePackage.getPackageType1())
+				|| !PackageTypeEnum.TYPE2_TASK_PACKAGE.val().equals(scorePackage.getPackageType2())) {
+			throw new RuntimeException("不支持该积分包类型");
+		}
+		// 业务校验1
+		if (!ScorePackageStatusEnum.TO_BE_SETTLED.val().equals(scorePackage.getScorePackageStatus())) {
+			throw new RuntimeException("只有“已完成待结算”的积分包可以拆包");
+		}
+		// 业务校验2
+		if (unpackDTO.getNewPackageScore().compareTo(scorePackage.getScore()) >= 0) {
+			throw new RuntimeException("“预拆包分值”不能大于“原积分包值”");
+		}
+		// 原审核通过的任务列表
+		QueryWrapper<WmTask> queryWrapper = Wrappers.query();
+		queryWrapper.eq("task_status", TaskStatusEnum.APPROVED.val());
+		queryWrapper.eq("score_package_id", unpackDTO.getScorePackageId());
+		queryWrapper.eq("del_flag", DelEnum.NOT_DEL.val());
+		queryWrapper.eq("real_flag", "0");
+		queryWrapper.orderByDesc("lookinto_date");
+		List<WmTask> taskList = wmTaskMapper.selectList(queryWrapper);
+
+		Set<String> taskIds = taskList.stream().map(WmTask::getId).collect(Collectors.toSet());
+		// 校验已选择的任务是否都在原任务中
+		if (!CollUtil.containsAll(taskIds, unpackDTO.getSelectTaskIds())) {
+			throw new RuntimeException("已选择的任务不在原任务中");
+		}
+		// 已选择的任务
+		List<WmTask> selectTaskList = wmTaskMapper.selectBatchIds(unpackDTO.getSelectTaskIds());
+		// 校验已选择的任务分值
+		int selectTaskScore = selectTaskList.stream().mapToInt(WmTask::getScore).sum();
+		if (!unpackDTO.getSelectTaskScore().equals(selectTaskScore)) {
+			throw new RuntimeException("已选任务分值不正确");
+		}
+		// 业务校验3
+		if (selectTaskScore < unpackDTO.getNewPackageScore()) {
+			throw new RuntimeException("已选任务分值大于预拆包分值,才能拆包");
+		}
+
+		// 剩余任务
+		List<WmTask> remainTaskList = taskList.stream()
+				.filter(task -> !unpackDTO.getSelectTaskIds().contains(task.getId())).collect(Collectors.toList());
+		// 剩余任务分值
+		int remainTaskScore = remainTaskList.stream().mapToInt(WmTask::getScore).sum();
+		if (!unpackDTO.getRemainTaskScore().equals(remainTaskScore)) {
+			throw new RuntimeException("剩余任务分值不正确");
+		}
+
+		// 拆包后的原积分包包值:
+		// 剩余任务分值 > 剩余积分包值,取剩余积分包值
+		// 剩余任务分值 < 剩余积分包值,取剩任务分值
+		int remainPackageScore;
+		int tempRemainPackageScore = scorePackage.getScore() - unpackDTO.getNewPackageScore();
+		if (remainTaskScore > tempRemainPackageScore) {
+			remainPackageScore = tempRemainPackageScore;
+		} else {
+			remainPackageScore = remainTaskScore;
+		}
+		if (!unpackDTO.getRemainPackageScore().equals(remainPackageScore)) {
+			throw new RuntimeException("剩余积分包值不正确");
+		}
+
+
+		LocalDateTime now = LocalDateTime.now();
+		Integer operatorId = SecurityUtils.getUser().getId();
+		// 创建新包
+		WmScorePackage newScorePackage = BeanUtil.copyProperties(scorePackage, WmScorePackage.class);
+		newScorePackage.setId(null);
+		newScorePackage.setUpdateTime(null);
+		newScorePackage.setUpdateUser(null);
+		newScorePackage.setCreateTime(now);
+		newScorePackage.setCreateUser(operatorId);
+		newScorePackage.setReceiveDate(now);
+		newScorePackage.setScore(unpackDTO.getNewPackageScore());
+		newScorePackage.setScorePackageName(String.format("%s-1", scorePackage.getScorePackageName(), "1"));
+		this.save(newScorePackage);
+
+		// 原领包记录
+		WmScorePackageStatus oldScorePackageStatus = wmScorePackageStatusService.getOne(Wrappers.<WmScorePackageStatus>lambdaQuery()
+				.eq(WmScorePackageStatus::getPackageId, unpackDTO.getScorePackageId())
+				.eq(WmScorePackageStatus::getStatus, PackageStatusEnum.APPROVED.val()));
+		// 创建新领包记录
+		WmScorePackageStatus newScorePackageStatus = BeanUtil.copyProperties(oldScorePackageStatus, WmScorePackageStatus.class);
+		newScorePackageStatus.setPackageId(newScorePackage.getId());
+		newScorePackageStatus.setUserScore(String.valueOf(newScorePackage.getScore()));
+		newScorePackageStatus.setTaskNum(newScorePackage.getTaskNum());
+		newScorePackageStatus.setCreateTime(now);
+		newScorePackageStatus.setCreateUser(operatorId);
+		newScorePackageStatus.setUpdateUser(null);
+		newScorePackageStatus.setUpdateTime(null);
+		wmScorePackageStatusService.save(newScorePackageStatus);
+
+		// 任务关联到新积分包
+		selectTaskList.forEach(wmTask -> {
+			WmTask updateTask = new WmTask();
+			updateTask.setId(wmTask.getId());
+			updateTask.setScorePackageId(newScorePackage.getId());
+			updateTask.setUpdateUser(String.valueOf(operatorId));
+			updateTask.setUpdateTime(now);
+//			updateTask.set
+		});
+		// TODO
+	}
 }