Explorar el Código

feat: 结算报告审批-批量审批

李学松 hace 2 años
padre
commit
482d07fdf8

+ 39 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmReportController.java

@@ -47,6 +47,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -248,6 +249,44 @@ public class WmReportController {
 		return wmReportService.approvalReport(wmReport1,taskIds,approvalOpinion,approvalInfo);
 	}
 
+	/**
+	 * 快速批量任务审核
+	 *
+	 * @return 审核结果
+	 * @param1 reportId        报告id
+	 * @param1 taskIds         任务id 多个逗号分隔
+	 * @param1 approvalOpinion 审核状态(1-通过,2-不通过)
+	 * @param1 approvalInfo    审批说明
+	 */
+	@SysLog("快速批量任务审核")
+	@PostMapping("/batch-approval-task")
+	public R<?> batchApprovalTask(@RequestBody Map<String, String> requestMap) {
+		String reportId = requestMap.get("reportId");
+		String taskIds = requestMap.get("taskIds");
+		String approvalOpinion = requestMap.get("approvalOpinion");
+		String approvalInfo = requestMap.get("approvalInfo");
+
+		if (!StrUtil.isAllNotBlank(reportId, taskIds, approvalOpinion)) {
+			return R.failed("必填参数为空");
+		}
+		if (!CollUtil.toList("1", "2").contains(approvalOpinion)) {
+			return R.failed("approvalOpinion不正确");
+		}
+
+		List<String> sortedIdList = StrUtil.split(taskIds, 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(requestMap), 3, TimeUnit.SECONDS);
+		if (Boolean.FALSE.equals(absent)) {
+			return R.failed("正在处理");
+		}
+
+		return R.ok(wmReportService.batchApprovalTask(reportId, sortedIdList, approvalOpinion, approvalInfo));
+	}
+
 	/**
 	 * 结算报告审批-任务复审
 	 *

+ 11 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmReportService.java

@@ -50,6 +50,17 @@ public interface WmReportService extends IService<WmReport> {
 	 */
 	Boolean reviewTask(String reportId, String taskId, String approvalOpinion, String approvalInfo);
 
+	/**
+	 * 结算报告审批-快速批量任务审核
+	 *
+	 * @param reportId        报告id
+	 * @param taskIdList      任务id列表
+	 * @param approvalOpinion 审核状态(1-通过,2-不通过)
+	 * @param approvalInfo    审批说明
+	 * @return 审核结果
+	 */
+	Boolean batchApprovalTask(String reportId, List<String> taskIdList, String approvalOpinion, String approvalInfo);
+
 	R approvalReport(WmReport wmReport, List<String> taskIds, String approvalOpinion, String approvalInfo);
 
 	/**

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

@@ -56,6 +56,7 @@ import com.qunzhixinxi.hnqz.admin.entity.dto.WmDeptTaskTypeConfigJsonDTO;
 import com.qunzhixinxi.hnqz.admin.entity.vo.WmTaskVO;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
+import com.qunzhixinxi.hnqz.admin.enums.PackageFinishStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ReportEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ScorePackageStatusEnum;
@@ -523,6 +524,226 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 		return Boolean.TRUE;
 	}
 
+	/**
+	 * 结算报告审批-快速批量任务审核
+	 *
+	 * @param reportId        报告id
+	 * @param taskIdList      任务id列表
+	 * @param approvalOpinion 审核状态(1-通过,2-不通过)
+	 * @param approvalInfo    审批说明
+	 * @return 审核结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean batchApprovalTask(String reportId, List<String> taskIdList, String approvalOpinion, String approvalInfo) {
+		LocalDateTime now = LocalDateTime.now();
+		Integer operatorId = SecurityUtils.getUser().getId();
+
+		WmReport queryReport = this.getById(reportId);
+		if(queryReport == null){
+			throw new RuntimeException("未查询到报告信息");
+		}
+		if (!CollUtil.toList(ReportEnum.REPORT_STATUS_PART_APPROVAL.getType(), ReportEnum.REPORT_STATUS_APPROVAL.getType()).contains(queryReport.getReportStatus())) {
+			throw new RuntimeException("报告状态不支持审核");
+		}
+
+		// 批量查询任务
+		List<WmTask> wmTasks = wmTaskService.listByIds(taskIdList);
+		Map<String, WmTask> taskMap = wmTasks.stream().collect(Collectors.toMap(WmTask::getId, Function.identity()));
+
+		Set<String> scorePackageIds = wmTasks.stream().map(WmTask::getScorePackageId).collect(Collectors.toSet());
+		if (scorePackageIds.size() > 1) {
+			throw new RuntimeException("只能处理同一个积分包下的任务");
+		}
+
+		// 批量查询积分包
+		List<WmScorePackage> taskScorePackages = wmScorePackageService.listByIds(scorePackageIds);
+		Map<String, WmScorePackage> scorePackageMap = taskScorePackages.stream().collect(Collectors.toMap(WmScorePackage::getId, Function.identity()));
+
+		// 查询企业对应的积分包
+		Integer reportScorePackageId = queryReport.getScoreId();
+		WmScorePackage reportScorePackage = wmScorePackageService.getById(reportScorePackageId);
+
+		taskIdList.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.getReportDrugId() != null || queryTask.getReportOneId() != null || queryTask.getReportSecondId() != null) {
+				throw new RuntimeException("已生成报告");
+			}
+
+			WmScorePackage taskScorePackage = scorePackageMap.get(queryTask.getScorePackageId());
+			if (!StrUtil.equals(ScorePackageStatusEnum.IN_PROGRESS.val(), taskScorePackage.getScorePackageStatus())
+					|| !StrUtil.equals(ScorePackageStatusEnum.TO_BE_APPROVAL.val(), taskScorePackage.getScorePackageStatus())) {
+				throw new RuntimeException("积分包状态不支持审核");
+			}
+
+			// STEP1: 更新任务企业审核状态
+			LambdaUpdateWrapper<WmTask> updateTaskWrapper = new LambdaUpdateWrapper<>();
+			updateTaskWrapper.eq(WmTask::getId, id);
+			updateTaskWrapper.eq(queryTask.getUpdateTime() != null, WmTask::getUpdateTime, queryTask.getUpdateTime());
+			updateTaskWrapper.eq(queryTask.getUpdateUser() != null, WmTask::getUpdateUser, queryTask.getUpdateUser());
+			List<Integer> roles = SecurityUtils.getRoles();
+			if (roles.contains(3)) {
+				// 药企
+				updateTaskWrapper.set(WmTask::getReportDrugApprovalStatus, ReportEnum.REPORT_STATUS_SETTLE.getType());
+				updateTaskWrapper.set(WmTask::getReportDrugApprovalOpinion, approvalOpinion);
+				updateTaskWrapper.set(WmTask::getReportDrugApprovalInfo, approvalInfo);
+				if ("1".equals(reportScorePackage.getTypeid())) {
+					updateTaskWrapper.set(WmTask::getReportOneApprovalStatus, ReportEnum.REPORT_STATUS_SETTLE.getType());
+					updateTaskWrapper.set(WmTask::getReportOneApprovalOpinion, approvalOpinion);
+					updateTaskWrapper.set(WmTask::getReportOneApprovalInfo, approvalInfo);
+				}
+			} else if (roles.contains(4)) {
+				//一级代理商类型
+				updateTaskWrapper.set(WmTask::getReportOneApprovalStatus, ReportEnum.REPORT_STATUS_SETTLE.getType());
+				updateTaskWrapper.set(WmTask::getReportOneApprovalOpinion, approvalOpinion);
+				updateTaskWrapper.set(WmTask::getReportOneApprovalInfo, approvalInfo);
+				if ("2".equals(reportScorePackage.getTypeid())) {
+					updateTaskWrapper.set(WmTask::getReportSecondApprovalStatus, ReportEnum.REPORT_STATUS_SETTLE.getType());
+					updateTaskWrapper.set(WmTask::getReportSecondApprovalOpinion, approvalOpinion);
+					updateTaskWrapper.set(WmTask::getReportSecondApprovalInfo, approvalInfo);
+				}
+			}
+			// 审核不通过状态同步
+			if ("2".equals(approvalOpinion)) {
+				updateTaskWrapper.set(WmTask::getTaskStatus, TaskStatusEnum.FAIL_APPROVED.val());
+			}
+			updateTaskWrapper.set(WmTask::getRealFlag, "0");
+			updateTaskWrapper.set(WmTask::getUpdateTime, now);
+			updateTaskWrapper.set(WmTask::getUpdateUser, operatorId);
+			log.info("task更新参数:条件id={},updateTime={},updateUser={},更新项approvalOpinion={},approvalInfo={},realFlag={},updateTime={},updateUser={}",
+					id, queryTask.getUpdateTime(), queryTask.getUpdateUser(), approvalOpinion, approvalInfo, 0, now, operatorId);
+			boolean updateTask = wmTaskService.update(updateTaskWrapper);
+			if (!updateTask) {
+				throw new RuntimeException("操作失败,请重试");
+			}
+
+		});
+
+		WmTask taskSelect = new WmTask();
+		if ("0".equals(reportScorePackage.getTypeid())) {//药企
+			taskSelect.setReportDrugId(Integer.valueOf(reportId));
+			taskSelect.setReportDrugApprovalStatus(ReportEnum.REPORT_STATUS_APPROVAL.getType());
+		} else if ("1".equals(reportScorePackage.getTypeid())) {//一级代理商类型
+			taskSelect.setReportOneId(Integer.valueOf(reportId));
+			taskSelect.setReportOneApprovalStatus(ReportEnum.REPORT_STATUS_APPROVAL.getType());
+		} else if ("2".equals(reportScorePackage.getTypeid())) {//二级代理商类型
+			taskSelect.setReportSecondId(Integer.valueOf(reportId));
+			taskSelect.setReportSecondApprovalStatus(ReportEnum.REPORT_STATUS_APPROVAL.getType());
+		}
+		// 查询提交给企业的待审核的任务
+		int toApproveTaskCount = wmTaskMapper.selectCount(Wrappers.lambdaQuery(taskSelect));
+
+		// STEP2: 更新报告状态
+		LambdaUpdateWrapper<WmReport> updateWrapper = new LambdaUpdateWrapper<>();
+		updateWrapper.eq(WmReport::getId, Integer.valueOf(reportId));
+		updateWrapper.eq(queryReport.getUpdateTime() != null, WmReport::getUpdateTime, queryReport.getUpdateTime());
+		updateWrapper.eq(queryReport.getUpdatePeople() != null, WmReport::getUpdatePeople, queryReport.getUpdatePeople());
+		// 待审核任务数为空 则说明提交给企业的任务都已审核,否则是部分审核
+		String reportStatus = toApproveTaskCount <= 0 ?
+				ReportEnum.REPORT_STATUS_SETTLE.getType() : ReportEnum.REPORT_STATUS_PART_APPROVAL.getType();
+		updateWrapper.set(WmReport::getReportStatus, reportStatus);
+		updateWrapper.set(WmReport::getUpdatePeople, operatorId);
+		updateWrapper.set(WmReport::getUpdateTime, now);
+		log.info("report更新参数:条件id={},updateTime={},updatePeople={},更新项reportStatus={},updatePeople={},updateTime={}",
+				reportId, queryReport.getUpdateTime(), queryReport.getUpdatePeople(), reportStatus, operatorId, now);
+		boolean updateReport = this.update(updateWrapper);
+		if (!updateReport) {
+			throw new RuntimeException("操作失败,请重试");
+		}
+
+		taskScorePackages.forEach(taskScorePackage -> {
+			String taskScorePackageId= taskScorePackage.getId();
+			// 查询已提交的任务(除去审核不通过的任务)
+			List<WmTask> submitedTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
+					.eq(WmTask::getScorePackageId, taskScorePackageId)
+					.ne(WmTask::getTaskStatus, TaskStatusEnum.FAIL_APPROVED.val())
+					.eq(WmTask::getRealFlag, "0"));
+			// 统计判断任务累计积分是否达到积分包的预设值
+			int totalTaskScore = submitedTaskList.stream().mapToInt(WmTask::getScore).sum();
+
+			// STEP3: 更新领包记录
+			List<WmScorePackageStatus> packageStatusList = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
+					.eq(WmScorePackageStatus::getStatus, PackageStatusEnum.APPROVED.val())
+					.eq(WmScorePackageStatus::getPackageId, taskScorePackageId));
+			if (CollUtil.isNotEmpty(packageStatusList)) {
+				String taskAddFlagStr = totalTaskScore >= taskScorePackage.getScore() ? "0" : "1";
+				// 修改领包记录状态
+				packageStatusList.forEach(packageStatus -> {
+					LambdaUpdateWrapper<WmScorePackageStatus> updateStatusWrapper = 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(updateStatusWrapper);
+					if (!pacakgeStatusUpdate) {
+						throw new RuntimeException("操作失败,请重试");
+					}
+				});
+			}
+
+			// STEP4: 更新积分包状态
+			if ("2".equals(approvalOpinion)) {
+				// 审核不通过,则释放积分值,从而直接可以重新做任务
+				String scorePackageStatus = totalTaskScore >= taskScorePackage.getScore() ?
+						ScorePackageStatusEnum.TO_BE_SETTLED.val() : ScorePackageStatusEnum.IN_PROGRESS.val();
+				String taskAddFlagStr = totalTaskScore >= taskScorePackage.getScore() ? "0" : "1";
+				// 更新积分包
+				log.info("scorePackage更新参数:条件id={},updateTime={},updateUser={},更新项scorePackageStatus={},taskAddFlag={},updateTime={},updateUser={}",
+						taskScorePackageId, taskScorePackage.getUpdateTime(), taskScorePackage.getUpdateUser(), scorePackageStatus, taskAddFlagStr, now, operatorId);
+				boolean updateScorePackage = wmScorePackageService.update(Wrappers.<WmScorePackage>lambdaUpdate()
+						.eq(WmScorePackage::getId, taskScorePackageId)
+						.eq(taskScorePackage.getUpdateTime() != null, WmScorePackage::getUpdateTime, taskScorePackage.getUpdateTime())
+						.eq(taskScorePackage.getUpdateUser() != null, WmScorePackage::getUpdateUser, taskScorePackage.getUpdateUser())
+						.set(WmScorePackage::getScorePackageStatus, scorePackageStatus)
+						.set(WmScorePackage::getTaskAddFlag, taskAddFlagStr)
+						.set(WmScorePackage::getUpdateTime, now)
+						.set(WmScorePackage::getUpdateUser, operatorId));
+				if (!updateScorePackage) {
+					throw new RuntimeException("操作失败,请重试");
+				}
+			} else if ("1".equals(approvalOpinion)) {
+				// 审核通过,则判断企业审核通过积分值是否达到积分包的预设值
+				List<WmTask> approvalTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
+						.eq(WmTask::getScorePackageId, taskScorePackageId)
+						.eq(WmTask::getTaskStatus, TaskStatusEnum.APPROVED.val())
+						.eq(WmTask::getRealFlag, "0")
+						.and(wrapper -> wrapper.eq(WmTask::getReportDrugApprovalOpinion, "1")
+								.or().eq(WmTask::getReportOneApprovalOpinion, "1")));
+				int totalScore = approvalTaskList.stream().mapToInt(WmTask::getScore).sum();
+				String scorePackageStatus = totalScore >= taskScorePackage.getScore() ?
+						ScorePackageStatusEnum.TO_BE_SETTLED.val() : ScorePackageStatusEnum.IN_PROGRESS.val();
+				String taskAddFlagStr = totalScore >= taskScorePackage.getScore() ? "0" : "1";
+				// 更新积分包
+				log.info("scorePackage更新参数:条件id={},updateTime={},updateUser={},更新项scorePackageStatus={},taskAddFlag={},updateTime={},updateUser={}",
+						taskScorePackageId, taskScorePackage.getUpdateTime(), taskScorePackage.getUpdateUser(), scorePackageStatus, taskAddFlagStr, now, operatorId);
+				boolean updateScorePackage = wmScorePackageService.update(Wrappers.<WmScorePackage>lambdaUpdate()
+						.eq(WmScorePackage::getId, taskScorePackageId)
+						.eq(taskScorePackage.getUpdateTime() != null, WmScorePackage::getUpdateTime, taskScorePackage.getUpdateTime())
+						.eq(taskScorePackage.getUpdateUser() != null, WmScorePackage::getUpdateUser, taskScorePackage.getUpdateUser())
+						.set(WmScorePackage::getScorePackageStatus, scorePackageStatus)
+						.set(WmScorePackage::getTaskAddFlag, taskAddFlagStr)
+						.set(WmScorePackage::getUpdateTime, now)
+						.set(WmScorePackage::getUpdateUser, operatorId));
+				if (!updateScorePackage) {
+					throw new RuntimeException("操作失败,请重试");
+				}
+			}
+		});
+
+		return Boolean.TRUE;
+	}
+
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public R approvalReport(WmReport wmReport, List<String> taskIds, String approvalOpinion, String approvalInfo) {