Explorar o código

feat: 个人承接积分值-任务复审

李学松 %!s(int64=2) %!d(string=hai) anos
pai
achega
aad9f97414

+ 6 - 0
db/v2.0/230515.sql

@@ -0,0 +1,6 @@
+alter table wm_task
+    add review_task_count int default 0 not null comment '复审次数记录';
+
+alter table wm_task
+    add dept_review_task_count int default 0 not null comment '企业复审次数记录';
+

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

@@ -158,4 +158,9 @@ public interface CacheConstants {
 	 */
 	String EID_RESULT_KEY = "EID:RESULT:KEY:";
 
+	/**
+	 * 任务复审key
+	 */
+	String TASK_REVIEW_KEY = "TASK:REVIEW:KEY:";
+
 }

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

@@ -1201,6 +1201,31 @@ public class WmTaskController {
 		return R.ok(taskIPage);
 	}
 
+	/**
+	 * 个人承接积分值-任务复审
+	 *
+	 * @param wmTask 任务审核信息
+	 * @return 审核结果
+	 */
+	@SysLog("个人承接积分值-任务复审")
+	@PostMapping("/review-task")
+	public R<?> reviewTask(@RequestBody WmTask wmTask) {
+		if (!StrUtil.isAllNotBlank(wmTask.getId(), wmTask.getTaskStatus(), wmTask.getTaskStatusInfo())) {
+			return R.failed("必填参数为空");
+		}
+		if (!CollUtil.toList(TaskStatusEnum.APPROVED.val(), TaskStatusEnum.FAIL_APPROVED.val()).contains(wmTask.getTaskStatus())) {
+			return R.failed("taskStatus不正确");
+		}
+
+		String cacheKey = CacheConstants.TASK_REVIEW_KEY + wmTask.getId();
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(cacheKey, JSONUtil.toJsonStr(wmTask), 3, TimeUnit.SECONDS);
+		if (Boolean.FALSE.equals(absent)) {
+			return R.failed("正在处理");
+		}
+
+		return R.ok(wmTaskService.reviewTask(wmTask.getId(), wmTask.getTaskStatus(), wmTask.getTaskStatusInfo()));
+	}
+
 	/**
 	 * 任务审核
 	 *

+ 10 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmTask.java

@@ -250,6 +250,16 @@ public class WmTask extends Model<WmTask> {
 
 	private String taskFrom;
 
+	/**
+	 * 复审次数记录
+	 */
+	private Integer reviewTaskCount;
+
+	/**
+	 * 企业复审次数记录
+	 */
+	private Integer deptReviewTaskCount;
+
 	/**
 	 * 任务用户用户名
 	 */

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

@@ -199,4 +199,14 @@ public interface WmTaskService extends IService<WmTask> {
 	 * @return 会议任务个数
 	 */
 	Long countMeetingTask(List<String> taskTypeList, String taskUserId, LocalDateTime startTime, LocalDateTime endTime);
+
+	/**
+	 * 个人包-任务复审
+	 *
+	 * @param id             任务id
+	 * @param taskStatus     审核状态(3-通过,4-不通过)
+	 * @param taskStatusInfo 审批说明
+	 * @return 复审结果
+	 */
+	Boolean reviewTask(String id, String taskStatus, String taskStatusInfo);
 }

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

@@ -17,6 +17,7 @@
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.map.MapUtil;
@@ -36,6 +37,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.MonitoringIndicator;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaPharmacy;
@@ -77,6 +79,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmScorePackageStatusService;
 import com.qunzhixinxi.hnqz.admin.service.WmScoreTaskTypeService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
 import com.qunzhixinxi.hnqz.admin.util.RegUtils;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.data.datascope.DataScope;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
@@ -85,13 +88,22 @@ import com.qunzhixinxi.hnqz.common.taxhelper.enums.InvoiceInfo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.IOException;
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -136,6 +148,8 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 	private WmDaHospitalService wmDaHospitalService;
 	private WmDaPharmacyService wmDaPharmacyService;
 	private WmDaDistributionService wmDaDistributionService;
+	private final RedisTemplate redisTemplate;
+	private final UpmsConfig upmsConfig;
 
 	@Autowired
 	public void setWmDaHospitalService(WmDaHospitalService wmDaHospitalService) {
@@ -2485,4 +2499,216 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 	public Long countMeetingTask(List<String> taskTypeList, String taskUserId, LocalDateTime startTime, LocalDateTime endTime) {
 		return wmTaskMapper.countMeetingTask(taskTypeList, taskUserId, startTime, endTime);
 	}
+
+	/**
+	 * 个人承接积分值-任务复审
+	 *
+	 * @param id             任务id
+	 * @param taskStatus     审核状态(3-通过,4-不通过)
+	 * @param taskStatusInfo 审批说明
+	 * @return 复审结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean reviewTask(String id, String taskStatus, String taskStatusInfo) {
+		LocalDateTime now = LocalDateTime.now();
+		boolean approved = TaskStatusEnum.APPROVED.val().equals(taskStatus);
+		// 查询这条任务
+		WmTask queryTask = this.getById(id);
+		if (queryTask == null) {
+			throw new RuntimeException("任务不存在");
+		}
+		if (queryTask.getReviewTaskCount() > 0) {
+			throw new RuntimeException("不能重复审核");
+		}
+
+		// STEP1:更新task状态
+		String realFlag = approved ? CommonConstants.STATUS_NORMAL : CommonConstants.STATUS_DEL;
+		LambdaUpdateWrapper<WmTask> taskUpdateWrapper = Wrappers.<WmTask>lambdaUpdate()
+				.eq(WmTask::getId, id)
+				.eq(WmTask::getUpdateTime, queryTask.getUpdateTime())
+				.set(WmTask::getTaskStatus, taskStatus)
+				.set(WmTask::getRealFlag, realFlag)
+				.set(WmTask::getTaskStatusInfo, taskStatusInfo)
+				.set(WmTask::getReviewTaskCount, 1)
+				.set(WmTask::getUpdateTime, now);
+		log.info("task更新参数:条件id={},updateTime={},更新项taskStatus={},realFlag={},taskStatusInfo={},updateTime={}",
+				id, queryTask.getUpdateTime(), taskStatus, realFlag, taskStatusInfo, now);
+		boolean taskUpdate = this.update(taskUpdateWrapper);
+		if (!taskUpdate) {
+			throw new RuntimeException("操作失败,请重试");
+		}
+
+		// 查询积分包
+		String scorePackageId = queryTask.getScorePackageId();
+		WmScorePackage wmScorePackage = wmScorePackageMapper.selectById(scorePackageId);
+		// 查询积分包下审核通过和审核中的任务
+		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(WmScorePackageStatus::getUpdateTime, packageStatus.getUpdateTime())
+						.set(WmScorePackageStatus::getTaskAddFlag, taskAddFlagStr)
+						.set(WmScorePackageStatus::getUpdateTime, now);
+				log.info("pacakgeStatus更新参数:条件id={},updateTime={},更新项taskAddFlag={},updateTime={}",
+						packageStatus.getId(), packageStatus.getUpdateTime(), taskAddFlagStr, now);
+				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, wmScorePackage.getUpdateTime())
+				// 积分包完成状态
+				.set(WmScorePackage::getPackageFinishStatus, packageFinishStatus)
+				// 是否可以做任务:已完成不可以做任务
+				.set(WmScorePackage::getTaskAddFlag, taskAddFlagStr);
+		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={},更新项packageFinishStatus={},taskAddFlag={}",
+				scorePackageId, wmScorePackage.getUpdateTime(), packageFinishStatus, taskAddFlagStr);
+		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;
+	}
+
+	/**
+	 * 更新调查信息数据
+	 *
+	 * @param task 任务信息
+	 * @param taskStatus 审核状态
+	 * @param taskStatusInfo 审批说明
+	 */
+	private void task15_30_16_18(WmTask task, String taskStatus, String taskStatusInfo) {
+		if (!StrUtil.equals(taskStatus, TaskStatusEnum.FAIL_APPROVED.val())) {
+			// 复审不通过,则回退调查信息数据 TODO
+
+			return;
+		}
+		// 调查信息审核(15、30-医院 16-商业公司 18-药店)
+		String approvalOpinion = taskStatus.equals(TaskStatusEnum.APPROVED.val()) ? "1" : "2";
+		if ("15".equals(task.getTaskTypeId()) || "30".equals(task.getTaskTypeId())) {
+			Map<String, Object> data = (Map<String, Object>) wmDaHospitalService.approvalHospital(task.getId()).getData();
+			WmTask _wmTask = (WmTask) data.get("wmTask");
+			Map<String, String> paramMap = BeanUtil.toBean(data.get("newinfo"), Map.class);
+			paramMap.put("approvalInfo", taskStatusInfo);
+			paramMap.put("approvalOpinion", approvalOpinion);
+			paramMap.put("compareResult", _wmTask.getCompareResult());
+			paramMap.put("taskId", task.getId());
+			wmDaHospitalService.updateByApproval(paramMap);
+		} else if ("16".equals(task.getTaskTypeId())) {
+			Map<String, Object> data = (Map<String, Object>) wmDaDistributionService.approvalDistribution(task.getId()).getData();
+			WmTask _wmTask = (WmTask) data.get("wmTask");
+			Map<String, String> paramMap = BeanUtil.toBean(data.get("newinfo"), Map.class);
+			paramMap.put("approvalInfo", taskStatusInfo);
+			paramMap.put("approvalOpinion", approvalOpinion);
+			paramMap.put("compareResult", _wmTask.getCompareResult());
+			paramMap.put("taskId", task.getId());
+			wmDaDistributionService.updateByApproval(paramMap);
+		} else if ("18".equals(task.getTaskTypeId())) {
+			Map<String, Object> data = (Map<String, Object>) wmDaPharmacyService.approvalPharmacy(task.getId()).getData();
+			WmTask _wmTask = (WmTask) data.get("_wmTask");
+			WmDaPharmacy info = (WmDaPharmacy) data.get("info");
+			Map<String, String> paramMap = MapUtil.newHashMap(4);
+			paramMap.put("infoId", info.getId());
+			paramMap.put("approvalInfo", taskStatusInfo);
+			paramMap.put("approvalOpinion", approvalOpinion);
+			paramMap.put("compareResult", _wmTask.getCompareResult());
+			paramMap.put("taskId", task.getId());
+			wmDaPharmacyService.updateByapproval(paramMap);
+		}
+	}
+
+	/**
+	 * 移除图片缓存
+	 *
+	 * @param t 任务对象
+	 */
+	private void removePicCache(WmTask t) {
+		String userId = t.getTaskUserId();
+
+		WmTaskContent content = wmTaskContentMapper.selectById(t.getTaskContentId());
+
+		if (content == null) {
+			return;
+		}
+
+		Field[] fields = content.getClass().getDeclaredFields();
+		for (Field field : fields) {
+
+			field.setAccessible(true);
+
+			try {
+				String fieldVal = (String) field.get(content);
+
+				if (fieldVal.startsWith("/admin/sys-file/wmkj")) {
+
+					List<String> split = StrUtil.split(fieldVal, StrUtil.COMMA);
+
+					List<String> IMG_EXT_NAME = Arrays.asList("png", "jpg", "gif", "jpeg", "tif", "bmp");
+
+					split.forEach(item -> {
+						List<String> temp = StrUtil.split(item, StrUtil.DOT);
+						String extName = temp.get(temp.size() - 1);
+
+						if (IMG_EXT_NAME.contains(extName.toLowerCase())) {
+							// 文件md5
+							try {
+								log.info("图片地址:{}", upmsConfig.getClientUrl() + item);
+								byte[] bytes = IOUtils.toByteArray(new URI(upmsConfig.getClientUrl() + item));
+								MessageDigest md5 = MessageDigest.getInstance("MD5");
+								byte[] digest = md5.digest(bytes);
+								String hash = new BigInteger(1, digest).toString(16);
+								log.info("图片md5:{}", hash);
+								String key = String.format("%s:%s", userId, hash);
+								log.info("key:{}", key);
+								redisTemplate.delete(key);
+							} catch (IOException | URISyntaxException | NoSuchAlgorithmException e) {
+								e.printStackTrace();
+							}
+						}
+					});
+				}
+			} catch (Exception ignored) {
+				log.error("", ignored);
+			}
+		}
+	}
 }