瀏覽代碼

feat: 快速批量任务审核-审核功能

李学松 2 年之前
父節點
當前提交
ed76a31ead

+ 5 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/CacheConstants.java

@@ -163,4 +163,9 @@ public interface CacheConstants {
 	 */
 	String TASK_REVIEW_KEY = "TASK:REVIEW:KEY:";
 
+	/**
+	 * 任务审核key
+	 */
+	String TASK_APPROVAL_KEY = "TASK:APPROVAL:KEY:";
+
 }

+ 26 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskController.java

@@ -1497,6 +1497,32 @@ public class WmTaskController {
 		return R.ok(wmTaskService.reviewTask(wmTask.getId(), wmTask.getTaskStatus(), wmTask.getTaskStatusInfo()));
 	}
 
+	/**
+	 * 快速批量任务审核
+	 *
+	 * @param wmTask 任务审核信息
+	 * @return 审核结果
+	 */
+	@SysLog("快速批量任务审核")
+	@PostMapping("/batch-approval-task")
+	public R<?> batchApprovalTask(@RequestBody WmTask wmTask) {
+		if (!StrUtil.isAllNotBlank(wmTask.getId(), wmTask.getTaskStatus())) {
+			return R.failed("必填参数为空");
+		}
+		List<String> sortedIdList = StrUtil.split(wmTask.getId(), StrUtil.COMMA)
+				.stream()
+				.sorted(Comparator.comparingInt(Integer::parseInt))
+				.collect(Collectors.toList());
+
+		String cacheKey = CacheConstants.TASK_APPROVAL_KEY + String.join(StrUtil.COMMA, sortedIdList);
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(cacheKey, JSONUtil.toJsonStr(wmTask), 3, TimeUnit.SECONDS);
+		if (Boolean.FALSE.equals(absent)) {
+			return R.failed("正在处理");
+		}
+
+		return R.ok(wmTaskService.batchApprovalTask(sortedIdList, wmTask.getTaskStatus(), wmTask.getTaskStatusInfo()));
+	}
+
 	/**
 	 * 任务审核
 	 *

+ 10 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskService.java

@@ -209,4 +209,14 @@ public interface WmTaskService extends IService<WmTask> {
 	 * @return 复审结果
 	 */
 	Boolean reviewTask(String id, String taskStatus, String taskStatusInfo);
+
+	/**
+	 * 快速批量任务审核
+	 *
+	 * @param idList         任务id列表
+	 * @param taskStatus     审核状态(3-通过,4-不通过)
+	 * @param taskStatusInfo 审批说明
+	 * @return 审核结果
+	 */
+	Boolean batchApprovalTask(List<String> idList, String taskStatus, String taskStatusInfo);
 }

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

@@ -119,6 +119,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -2624,6 +2625,140 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 		return Boolean.TRUE;
 	}
 
+	/**
+	 * 快速批量任务审核
+	 *
+	 * @param idList         任务id列表
+	 * @param taskStatus     审核状态(3-通过,4-不通过)
+	 * @param taskStatusInfo 审批说明
+	 * @return 审核结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean batchApprovalTask(List<String> idList, String taskStatus, String taskStatusInfo) {
+		LocalDateTime now = LocalDateTime.now();
+		Integer operatorId = SecurityUtils.getUser().getId();
+
+		// 批量查询任务
+		List<WmTask> wmTasks = this.listByIds(idList);
+		Map<String, WmTask> taskMap = wmTasks.stream().collect(Collectors.toMap(WmTask::getId, Function.identity()));
+		// 批量查询积分包
+		List<WmScorePackage> scorePackages = wmScorePackageService.listByIds(wmTasks.stream().map(WmTask::getScorePackageId).collect(Collectors.toSet()));
+		Map<String, WmScorePackage> scorePackageMap = scorePackages.stream().collect(Collectors.toMap(WmScorePackage::getId, Function.identity()));
+
+		idList.forEach(id -> {
+			// 查询这条任务
+			WmTask queryTask = taskMap.get(id);
+			if (queryTask == null) {
+				throw new RuntimeException("任务不存在");
+			}
+			if (CollUtil.toList(TaskStatusEnum.APPROVED.val(), TaskStatusEnum.FAIL_APPROVED.val()).contains(queryTask.getTaskStatus())) {
+				throw new RuntimeException("存在已审核的任务");
+			}
+			if (queryTask.getReviewTaskCount() > 0) {
+				throw new RuntimeException("存在已复审的任务");
+			}
+			if (queryTask.getReportDrugId() != null || queryTask.getReportOneId() != null || queryTask.getReportSecondId() != null) {
+				throw new RuntimeException("已生成报告");
+			}
+
+			// 查询积分包
+			String scorePackageId = queryTask.getScorePackageId();
+			WmScorePackage wmScorePackage = scorePackageMap.get(scorePackageId);
+			if (!StrUtil.equals(ScorePackageStatusEnum.IN_PROGRESS.val(), wmScorePackage.getScorePackageStatus())) {
+				throw new RuntimeException("积分包状态不支持审核");
+			}
+
+			// STEP1:更新task状态
+			LambdaUpdateWrapper<WmTask> taskUpdateWrapper = Wrappers.<WmTask>lambdaUpdate()
+					.eq(WmTask::getId, id)
+					.eq(queryTask.getUpdateTime() != null, WmTask::getUpdateTime, queryTask.getUpdateTime())
+					.eq(queryTask.getUpdateUser() != null, WmTask::getUpdateUser, queryTask.getUpdateUser())
+					.set(WmTask::getTaskStatus, taskStatus)
+					.set(WmTask::getRealFlag, "0")
+					.set(WmTask::getTaskStatusInfo, taskStatusInfo)
+					.set(WmTask::getUpdateTime, now)
+					.set(WmTask::getUpdateUser, operatorId);
+			log.info("task更新参数:条件id={},updateTime={},updateUser={},更新项taskStatus={},realFlag={},taskStatusInfo={},updateTime={},updateUser={}",
+					id, queryTask.getUpdateTime(), queryTask.getUpdateUser(), taskStatus, "0", taskStatusInfo, now, operatorId);
+			boolean taskUpdate = this.update(taskUpdateWrapper);
+			if (!taskUpdate) {
+				throw new RuntimeException("操作失败,请重试");
+			}
+
+			// 查询积分包下审核通过和审核中的任务
+			List<WmTask> wmTaskList = wmTaskMapper.selectList(Wrappers.<WmTask>lambdaQuery()
+					.eq(WmTask::getScorePackageId, scorePackageId)
+					.ne(WmTask::getTaskStatus, TaskStatusEnum.FAIL_APPROVED.val())
+					.eq(WmTask::getRealFlag, "0"));
+			int totalCount = wmTaskList.stream().map(WmTask::getScore).reduce(0, Integer::sum);
+			// 标记任务总积分 是否超过积分包的值
+			boolean taskAddFlag = totalCount >= wmScorePackage.getScore();
+			String taskAddFlagStr = taskAddFlag ? "0" : "1";
+			// 查询领包记录
+			List<WmScorePackageStatus> packageStatusList = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
+					.eq(WmScorePackageStatus::getStatus, PackageStatusEnum.APPROVED.val())
+					.eq(WmScorePackageStatus::getPackageId, wmScorePackage.getId()));
+			if (CollUtil.isNotEmpty(packageStatusList)) {
+				// STEP2:修改领包记录状态
+				packageStatusList.forEach(packageStatus -> {
+					LambdaUpdateWrapper<WmScorePackageStatus> updateWrapper = Wrappers.<WmScorePackageStatus>lambdaUpdate()
+							.eq(WmScorePackageStatus::getId, packageStatus.getId())
+							.eq(packageStatus.getUpdateTime() != null, WmScorePackageStatus::getUpdateTime, packageStatus.getUpdateTime())
+							.eq(packageStatus.getUpdateUser() != null, WmScorePackageStatus::getUpdateUser, packageStatus.getUpdateUser())
+							.set(WmScorePackageStatus::getTaskAddFlag, taskAddFlagStr)
+							.set(WmScorePackageStatus::getUpdateTime, now)
+							.set(WmScorePackageStatus::getUpdateUser, operatorId);
+					log.info("pacakgeStatus更新参数:条件id={},updateTime={},updateUser={},更新项taskAddFlag={},updateTime={},updateUser={}",
+							packageStatus.getId(), packageStatus.getUpdateTime(), packageStatus.getUpdateUser(), taskAddFlagStr, now, operatorId);
+					boolean pacakgeStatusUpdate = wmScorePackageStatusService.update(updateWrapper);
+					if (!pacakgeStatusUpdate) {
+						throw new RuntimeException("操作失败,请重试");
+					}
+				});
+			}
+
+			// STEP3:修改积分包状态
+			String packageFinishStatus = totalCount >= wmScorePackage.getScore() ?
+					PackageFinishStatusEnum.NOT_COMPLETE.val() : PackageFinishStatusEnum.COMPLETED.val();
+			LambdaUpdateWrapper<WmScorePackage> scorePackageUpdateWrapper = Wrappers.<WmScorePackage>lambdaUpdate()
+					.eq(WmScorePackage::getId, scorePackageId)
+					.eq(wmScorePackage.getUpdateTime() != null, WmScorePackage::getUpdateTime, wmScorePackage.getUpdateTime())
+					.eq(wmScorePackage.getUpdateUser() != null, WmScorePackage::getUpdateUser, wmScorePackage.getUpdateUser())
+					.set(WmScorePackage::getPackageFinishStatus, packageFinishStatus)
+					.set(WmScorePackage::getTaskAddFlag, taskAddFlagStr)
+					.set(WmScorePackage::getUpdateUser, wmScorePackage.getUpdateUser())
+					.set(WmScorePackage::getUpdateTime, now);
+			if (taskAddFlag) {
+				// 任务总积分超过积分包的值
+				// 积分包完成时间
+				scorePackageUpdateWrapper.set(WmScorePackage::getPackageFinishTime, now);
+				// 积分包状态:有关联积分包,则设置为‘已完成待审批’;没有关联积分包,则直接设置为‘已完成待结算’
+				scorePackageUpdateWrapper.set(WmScorePackage::getScorePackageStatus, StringUtils.isNotBlank(wmScorePackage.getRelationScoreId()) ?
+						ScorePackageStatusEnum.TO_BE_APPROVAL.val() : ScorePackageStatusEnum.TO_BE_SETTLED.val());
+			} else {
+				// 任务总积分小于积分包的值
+				scorePackageUpdateWrapper.set(WmScorePackage::getScorePackageStatus, ScorePackageStatusEnum.IN_PROGRESS.val());
+			}
+			log.info("scorePackage更新参数:条件id={},updateTime={},updateUser={},更新项packageFinishStatus={},taskAddFlag={},updateTime={},updateUser={}",
+					scorePackageId, wmScorePackage.getUpdateTime(), wmScorePackage.getUpdateUser(), packageFinishStatus, taskAddFlagStr, now, operatorId);
+			boolean packageUpdate = wmScorePackageService.update(scorePackageUpdateWrapper);
+			if (!packageUpdate) {
+				throw new RuntimeException("操作失败,请重试");
+			}
+
+			// STEP4: 如果是源头积分包,则判断是否审核入库调查信息
+			if (StringUtils.isBlank(wmScorePackage.getRelationScoreId())) {
+				this.task15_30_16_18(queryTask, taskStatus, taskStatusInfo);
+			}
+
+			// 移除图片缓存
+			this.removePicCache(queryTask);
+		});
+
+		return Boolean.TRUE;
+	}
+
 	/**
 	 * 更新调查信息数据
 	 *