Selaa lähdekoodia

Merge branch 'master' into feat-20230505-batchapprove

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskController.java
李学松 2 vuotta sitten
vanhempi
commit
3c9dab7465
17 muutettua tiedostoa jossa 644 lisäystä ja 57 poistoa
  1. 6 0
      db/v2.0/230515.sql
  2. 5 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/CacheConstants.java
  3. 15 12
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmDeptTaskTypeConfigController.java
  4. 41 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmReportController.java
  5. 3 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java
  6. 25 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskController.java
  7. 10 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmTask.java
  8. 2 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmScorePackageMapper.java
  9. 11 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmReportService.java
  10. 10 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskService.java
  11. 48 34
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDeptTaskTypeConfigServiceImpl.java
  12. 1 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java
  13. 209 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmReportServiceImpl.java
  14. 2 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageSettleNoteServiceImpl.java
  15. 240 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java
  16. 9 3
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmScorePackageMapper.xml
  17. 7 1
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskMapper.xml

+ 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:";
+
 }

+ 15 - 12
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmDeptTaskTypeConfigController.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -29,6 +30,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * 部门任务类型配置控制层
@@ -93,23 +95,24 @@ public class WmDeptTaskTypeConfigController {
 			});
 		}
 		// 查询上级的deptId
-		SysDeptRelation ancestorDeptRelation = sysDeptRelationService.getOne(Wrappers.<SysDeptRelation>lambdaQuery()
+		List<SysDeptRelation> ancestorDeptRelations = sysDeptRelationService.list(Wrappers.<SysDeptRelation>lambdaQuery()
 				.eq(SysDeptRelation::getDescendant, deptId)
 				.ne(SysDeptRelation::getAncestor, deptId)
 				.ne(SysDeptRelation::getAncestor, 1));
 		// 上级dept对应任务类型配置
-		if (ancestorDeptRelation != null) {
-			WmDeptTaskTypeConfig ancestorDeptTaskTypeConfig = wmDeptTaskTypeConfigService.getOne(Wrappers.<WmDeptTaskTypeConfig>lambdaQuery()
-					.eq(WmDeptTaskTypeConfig::getDeptId, ancestorDeptRelation.getAncestor()));
-			if (ancestorDeptTaskTypeConfig != null) {
+		if (CollUtil.isNotEmpty(ancestorDeptRelations)) {
+			List<Integer> ancestorIds = ancestorDeptRelations.stream().mapToInt(SysDeptRelation::getAncestor).boxed().collect(Collectors.toList());
+			List<WmDeptTaskTypeConfig> ancestorDeptTaskTypeConfigs = wmDeptTaskTypeConfigService.list(Wrappers.<WmDeptTaskTypeConfig>lambdaQuery().eq(WmDeptTaskTypeConfig::getDeptId, ancestorIds));
+			if (CollUtil.isNotEmpty(ancestorDeptTaskTypeConfigs)) {
 				List<WmDeptTaskTypeConfigJsonDTO> ancestorConfigJsonDTOList =
-						JSON.parseArray(ancestorDeptTaskTypeConfig.getTaskTypeJson(), WmDeptTaskTypeConfigJsonDTO.class);
-				ancestorConfigJsonDTOList.stream()
-						.forEach(configJsonDTO -> {
-							if (configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower()) {
-								configed.set(true);
-							}
-						});
+						ancestorDeptTaskTypeConfigs.stream()
+								.flatMap(config -> JSON.parseArray(config.getTaskTypeJson(), WmDeptTaskTypeConfigJsonDTO.class).stream()).collect(Collectors.toList());
+
+				ancestorConfigJsonDTOList.forEach(configJsonDTO -> {
+					if (configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower()) {
+						configed.set(true);
+					}
+				});
 			}
 		}
 		resultMap.put("config", configed.get());

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

@@ -18,14 +18,18 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.csp.sentinel.util.StringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmTask;
 import com.qunzhixinxi.hnqz.admin.entity.vo.WmTaskVO;
+import com.qunzhixinxi.hnqz.admin.enums.TaskStatusEnum;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
@@ -35,6 +39,7 @@ import com.qunzhixinxi.hnqz.admin.entity.WmReport;
 import com.qunzhixinxi.hnqz.admin.service.WmReportService;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.access.prepost.PreAuthorize;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -43,7 +48,9 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 
@@ -63,6 +70,7 @@ public class WmReportController {
 	private final WmScorePackageService wmScorePackageService;
 	private final WmTaskService wmTaskService;
 	private final WmTaskTypeService wmTaskTypeService;
+	private final RedisTemplate redisTemplate;
 	/**
 	 * 分页查询
 	 * @param page 分页对象
@@ -240,6 +248,39 @@ public class WmReportController {
 		return wmReportService.approvalReport(wmReport1,taskIds,approvalOpinion,approvalInfo);
 	}
 
+	/**
+	 * 结算报告审批-任务复审
+	 *
+	 * @param1 reportId        报告id
+	 * @param1 taskId          任务id
+	 * @param1 approvalOpinion 审核状态(1-通过,2-不通过)
+	 * @param1 approvalInfo    审批说明
+	 * @return 复审结果
+	 */
+	@SysLog("结算报告审批-任务复审")
+	@PostMapping("/review-task")
+	public R<?> reviewTask(@RequestBody Map<String, String> requestMap) {
+		String reportId = requestMap.get("reportId");
+		String taskId = requestMap.get("taskId");
+		String approvalOpinion = requestMap.get("approvalOpinion");
+		String approvalInfo = requestMap.get("approvalInfo");
+
+		if (!StrUtil.isAllNotBlank(reportId, taskId, approvalOpinion)) {
+			return R.failed("必填参数为空");
+		}
+		if (!CollUtil.toList("1", "2").contains(approvalOpinion)) {
+			return R.failed("approvalOpinion不正确");
+		}
+
+		String cacheKey = CacheConstants.TASK_REVIEW_KEY + taskId;
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(cacheKey, JSONUtil.toJsonStr(requestMap), 3, TimeUnit.SECONDS);
+		if (Boolean.FALSE.equals(absent)) {
+			return R.failed("正在处理");
+		}
+
+		return R.ok(wmReportService.reviewTask(reportId, taskId, approvalOpinion, approvalInfo));
+	}
+
 	/**
 	 * 结算报告--审批
 	 * reportStatus 1:待提交,2:已提交待审批 3:已部分审批  4:已退回 5:已审批待结单 6:已结单

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

@@ -2560,7 +2560,8 @@ public class WmScorePackageController {
 								 @RequestParam(value = "monthStart", required = false) String monthStart,
 								 @RequestParam(value = "monthEnd", required = false) String monthEnd,
 								 @RequestParam(value = "acceptUser", required = false) String acceptUser,
-								 @RequestParam(value = "relationScoreId", required = false) String relationScoreId
+								 @RequestParam(value = "relationScoreId", required = false) String relationScoreId,
+								 @RequestParam(value = "toApproval", required = false) Boolean toApproval
 	) {
 
 		Integer sendDeptId = SecurityUtils.getUser().getDeptId();
@@ -2614,7 +2615,7 @@ public class WmScorePackageController {
 //		if (StrUtil.isNotBlank(acceptUser) || StrUtil.isNotBlank(relationScoreId)) {
 			// 带有接单对象acceptUser模糊查询的查询
 			wmScorePackagePage = wmScorePackageMapper.listScorePackage(new Page<>(current, size),
-					queryWrapper.orderByDesc("p.create_time"), acceptUser, relationScoreId);
+					queryWrapper.orderByDesc("p.create_time"), acceptUser, relationScoreId, toApproval);
 //		} else {
 //			wmScorePackagePage = wmScorePackageMapper.selectPage(new Page<>(current, size), queryWrapper
 //					.orderByDesc("p.create_time"));
@@ -2655,7 +2656,6 @@ public class WmScorePackageController {
 	 * 积分包列表(结算包管理列表、无团队限制)
 	 *
 	 * @param packageType1 多个逗号分隔
-	 * @param acceptUser 接单对象,模糊查询
 	 */
 	@ApiOperation(value = "分页查询", notes = "分页查询")
 	@GetMapping("/page-settle-package")

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

@@ -1472,6 +1472,31 @@ public class WmTaskController {
 		return R.ok(resultList);
 	}
 
+	/**
+	 * 个人承接积分值-任务复审
+	 *
+	 * @param wmTask 任务审核信息
+	 * @return 审核结果
+	 */
+	@SysLog("个人承接积分值-任务复审")
+	@PostMapping("/review-task")
+	public R<?> reviewTask(@RequestBody WmTask wmTask) {
+		if (!StrUtil.isAllNotBlank(wmTask.getId(), wmTask.getTaskStatus())) {
+			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

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

+ 2 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmScorePackageMapper.java

@@ -179,5 +179,6 @@ public interface WmScorePackageMapper extends DataScopeMapper<WmScorePackage> {
 	 * @return
 	 */
 	Page<WmScorePackage> listScorePackage(Page<WmScorePackage> page, @Param(Constants.WRAPPER) QueryWrapper<WmScorePackage> queryWrapper,
-										  @Param("acceptUser") String acceptUser, @Param("relationScoreId") String relationScoreId);
+										  @Param("acceptUser") String acceptUser, @Param("relationScoreId") String relationScoreId,
+										  @Param("toApproval") Boolean toApproval);
 }

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

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

+ 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);
 }

+ 48 - 34
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDeptTaskTypeConfigServiceImpl.java

@@ -1,6 +1,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.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
@@ -342,22 +343,27 @@ public class WmDeptTaskTypeConfigServiceImpl extends ServiceImpl<WmDeptTaskTypeC
 					.collect(Collectors.toList());
 		}
 		// 查询上级
-		SysDeptRelation ancestorDeptRelation = sysDeptRelationMapper.selectOne(Wrappers.<SysDeptRelation>lambdaQuery()
+		List<SysDeptRelation> relationList = sysDeptRelationMapper.selectList(Wrappers.<SysDeptRelation>lambdaQuery()
 				.eq(SysDeptRelation::getDescendant, deptId)
 				.ne(SysDeptRelation::getAncestor, deptId)
 				.ne(SysDeptRelation::getAncestor, 1));
-		List<String> ancestorConfigTaskTypeIdList = null;
-		if (ancestorDeptRelation != null) {
-			// 上级企业配置
-			WmDeptTaskTypeConfig ancestorDeptTaskTypeConfig = this.getOne(Wrappers.<WmDeptTaskTypeConfig>lambdaQuery()
-					.eq(WmDeptTaskTypeConfig::getDeptId, ancestorDeptRelation.getAncestor()));
-			if (ancestorDeptTaskTypeConfig != null) {
-				List<WmDeptTaskTypeConfigJsonDTO> ancestorConfigJsonDTOList = JSON.parseArray(ancestorDeptTaskTypeConfig.getTaskTypeJson(), WmDeptTaskTypeConfigJsonDTO.class);
-				ancestorConfigTaskTypeIdList = ancestorConfigJsonDTOList.stream()
-						.filter(configJsonDTO -> configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower())
-						.map(WmDeptTaskTypeConfigJsonDTO::getTaskTypeName)
-						.collect(Collectors.toList());
-			}
+		List<String> ancestorConfigTaskTypeIdList = new ArrayList<>();
+		if (CollUtil.isNotEmpty(relationList)) {
+			relationList.forEach(relation -> {
+				// 上级企业配置
+				WmDeptTaskTypeConfig ancestorDeptTaskTypeConfig = this.getOne(Wrappers.<WmDeptTaskTypeConfig>lambdaQuery()
+						.eq(WmDeptTaskTypeConfig::getDeptId, relation.getAncestor()));
+				if (ancestorDeptTaskTypeConfig != null) {
+					List<WmDeptTaskTypeConfigJsonDTO> ancestorConfigJsonDTOList = JSON.parseArray(ancestorDeptTaskTypeConfig.getTaskTypeJson(), WmDeptTaskTypeConfigJsonDTO.class);
+					List<String> collect = ancestorConfigJsonDTOList.stream()
+							.filter(configJsonDTO -> configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower())
+							.map(WmDeptTaskTypeConfigJsonDTO::getTaskTypeName)
+							.collect(Collectors.toList());
+					if (CollUtil.isNotEmpty(collect)) {
+						ancestorConfigTaskTypeIdList.addAll(collect);
+					}
+				}
+			});
 		}
 		if (CollectionUtil.isEmpty(configTaskTypeIdList) && CollectionUtil.isEmpty(ancestorConfigTaskTypeIdList)) {
 			return new ArrayList<>();
@@ -447,32 +453,40 @@ public class WmDeptTaskTypeConfigServiceImpl extends ServiceImpl<WmDeptTaskTypeC
 		}
 
 		// 查询上级的deptId
-		SysDeptRelation ancestorDeptRelation = sysDeptRelationMapper.selectOne(Wrappers.<SysDeptRelation>lambdaQuery()
+		List<SysDeptRelation> relationList = sysDeptRelationMapper.selectList(Wrappers.<SysDeptRelation>lambdaQuery()
 				.eq(SysDeptRelation::getDescendant, deptId)
 				.ne(SysDeptRelation::getAncestor, deptId)
 				.ne(SysDeptRelation::getAncestor, 1));
 		// 上级dept对应任务类型配置
-		List<WmDeptTaskTypeConfigJsonDTO> filterAncestorConfigList = null;
-		if (ancestorDeptRelation != null) {
-			WmDeptTaskTypeConfig ancestorDeptTaskTypeConfig = this.getOne(Wrappers.<WmDeptTaskTypeConfig>lambdaQuery()
-					.eq(WmDeptTaskTypeConfig::getDeptId, ancestorDeptRelation.getAncestor()));
-			if (ancestorDeptTaskTypeConfig != null) {
-				List<WmDeptTaskTypeConfigJsonDTO> ancestorConfigJsonDTOList =
-						JSON.parseArray(ancestorDeptTaskTypeConfig.getTaskTypeJson(), WmDeptTaskTypeConfigJsonDTO.class);
-				// 转换为key value形式
-				if (StringUtils.isNotBlank(taskTypeName)) {
-					filterAncestorConfigList = ancestorConfigJsonDTOList.stream()
-							.filter(configJsonDTO -> configJsonDTO.getTaskTypeName().equals(taskTypeName)
-									&& configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower()
-									&& (configJsonDTO.getYydbStatusSelect() || configJsonDTO.getZbdbStatusSelect()))
-							.collect(Collectors.toList());
-				} else {
-					filterAncestorConfigList = ancestorConfigJsonDTOList.stream()
-							.filter(configJsonDTO -> configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower()
-									&& (configJsonDTO.getYydbStatusSelect() || configJsonDTO.getZbdbStatusSelect()))
-							.collect(Collectors.toList());
+		List<WmDeptTaskTypeConfigJsonDTO> filterAncestorConfigList = new ArrayList<>();
+		if (CollUtil.isNotEmpty(relationList)) {
+			relationList.forEach(relation -> {
+				WmDeptTaskTypeConfig ancestorDeptTaskTypeConfig = this.getOne(Wrappers.<WmDeptTaskTypeConfig>lambdaQuery()
+						.eq(WmDeptTaskTypeConfig::getDeptId, relation.getAncestor()));
+				if (ancestorDeptTaskTypeConfig != null) {
+					List<WmDeptTaskTypeConfigJsonDTO> ancestorConfigJsonDTOList =
+							JSON.parseArray(ancestorDeptTaskTypeConfig.getTaskTypeJson(), WmDeptTaskTypeConfigJsonDTO.class);
+					// 转换为key value形式
+					if (StringUtils.isNotBlank(taskTypeName)) {
+						List<WmDeptTaskTypeConfigJsonDTO> collect = ancestorConfigJsonDTOList.stream()
+								.filter(configJsonDTO -> configJsonDTO.getTaskTypeName().equals(taskTypeName)
+										&& configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower()
+										&& (configJsonDTO.getYydbStatusSelect() || configJsonDTO.getZbdbStatusSelect()))
+								.collect(Collectors.toList());
+						if (CollUtil.isNotEmpty(collect)) {
+							filterAncestorConfigList.addAll(collect);
+						}
+					} else {
+						List<WmDeptTaskTypeConfigJsonDTO> collect = ancestorConfigJsonDTOList.stream()
+								.filter(configJsonDTO -> configJsonDTO.getQualifiedTask() && configJsonDTO.getAssociateLower()
+										&& (configJsonDTO.getYydbStatusSelect() || configJsonDTO.getZbdbStatusSelect()))
+								.collect(Collectors.toList());
+						if (CollUtil.isNotEmpty(collect)) {
+							filterAncestorConfigList.addAll(collect);
+						}
+					}
 				}
-			}
+			});
 		}
 		// 任务配置为空,则直接返回空page
 		if (CollectionUtil.isEmpty(filterConfigJsonDTOList) && CollectionUtil.isEmpty(filterAncestorConfigList)) {

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java

@@ -1094,7 +1094,7 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 				params.put("subjectLocation", input.getSubjectLocation().getType());
 				params.put("notes", pathNo[0]);
 				params.put("pathNo", pathNo[0]);
-
+				params.put("notifyUrl", String.format("%s/admin/gig-third-api/huiqiyun", upmsConfig.getClientUrl()));
 
 				if (SubjectLocation.JIN_YUAN.equals(input.getSubjectLocation())) {
 					params.put("taxMode", "GENERAL");

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

@@ -45,6 +45,7 @@ import com.qunzhixinxi.hnqz.admin.entity.WmTaskType;
 import com.qunzhixinxi.hnqz.admin.entity.dto.WmDeptTaskTypeConfigJsonDTO;
 import com.qunzhixinxi.hnqz.admin.entity.vo.WmTaskVO;
 import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
+import com.qunzhixinxi.hnqz.admin.enums.PackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ReportEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ScorePackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.TaskStatusEnum;
@@ -81,6 +82,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -288,6 +290,204 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 		wmTaskService.update(updateWrapper);
 	}
 
+	/**
+	 * 结算报告审批-任务复审
+	 *
+	 * @param reportId        报告id
+	 * @param taskId          任务id
+	 * @param approvalOpinion 审核状态(1-通过,2-不通过)
+	 * @param approvalInfo    审批说明
+	 * @return 复审结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean reviewTask(String reportId, String taskId, String approvalOpinion, String approvalInfo) {
+		WmReport queryReport = this.getById(reportId);
+		if(queryReport == null){
+			throw new RuntimeException("未查询到报告信息");
+		}
+		if (!CollUtil.toList(ReportEnum.REPORT_STATUS_SETTLE.getType(), ReportEnum.REPORT_STATUS_PART_APPROVAL.getType()).contains(queryReport.getReportStatus())) {
+			throw new RuntimeException("报告状态不支持复审");
+		}
+
+		// 查询任务
+		WmTask queryTask = wmTaskService.getById(taskId);
+
+		if (queryTask.getDeptReviewTaskCount() > 0) {
+			throw new RuntimeException("不能重复审核");
+		}
+
+		LocalDateTime now = LocalDateTime.now();
+		Integer operatorId = SecurityUtils.getUser().getId();
+
+		// 查询企业对应的积分包
+		Integer reportScorePackageId = queryReport.getScoreId();
+		WmScorePackage reportScorePackage = wmScorePackageService.getById(reportScorePackageId);
+		// 查询任务对应的积分包
+		String taskScorePackageId = queryTask.getScorePackageId();
+		WmScorePackage taskScorePackage = wmScorePackageService.getById(taskScorePackageId);
+		if (!CollUtil.toList(ScorePackageStatusEnum.TO_BE_SETTLED.val(), ScorePackageStatusEnum.TO_BE_APPROVAL.val(), ScorePackageStatusEnum.IN_PROGRESS.val())
+				.contains(taskScorePackage.getScorePackageStatus())) {
+			throw new RuntimeException("任务积分包状态不支持复审");
+		}
+
+		// STEP1: 更新任务企业审核状态
+		LambdaUpdateWrapper<WmTask> updateTaskWrapper = new LambdaUpdateWrapper<>();
+		updateTaskWrapper.eq(WmTask::getId, taskId);
+		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);
+			}
+		}
+		// 审核状态同步
+		String taskStatus = "1".equals(approvalOpinion) ?
+				TaskStatusEnum.APPROVED.val() : TaskStatusEnum.FAIL_APPROVED.val();
+		updateTaskWrapper.set(WmTask::getTaskStatus, taskStatus);
+		updateTaskWrapper.set(WmTask::getRealFlag, "0");
+		updateTaskWrapper.set(WmTask::getDeptReviewTaskCount, 1);
+		updateTaskWrapper.set(WmTask::getUpdateTime, now);
+		updateTaskWrapper.set(WmTask::getUpdateUser, operatorId);
+		log.info("task更新参数:条件id={},updateTime={},updateUser={},更新项approvalOpinion={},approvalInfo={},taskStatus={},realFlag={},deptReviewTaskCount={},updateTime={},updateUser={}",
+				taskId, queryTask.getUpdateTime(), queryTask.getUpdateUser(), approvalOpinion, approvalInfo, taskStatus, "0", 1, 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)
+				.eq(WmTask::getScorePackageId, taskScorePackageId));
+
+		// 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("操作失败,请重试");
+		}
+
+		// 查询已提交的任务(除去审核不通过的任务)
+		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 >= reportScorePackage.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 >= reportScorePackage.getScore() ?
+					ScorePackageStatusEnum.TO_BE_SETTLED.val() : ScorePackageStatusEnum.IN_PROGRESS.val();
+			String taskAddFlagStr = totalTaskScore >= reportScorePackage.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 >= reportScorePackage.getScore() ?
+					ScorePackageStatusEnum.TO_BE_SETTLED.val() : ScorePackageStatusEnum.IN_PROGRESS.val();
+			String taskAddFlagStr = totalScore >= reportScorePackage.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)
@@ -542,6 +742,8 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 		}
 		List<WmTask> taskList=pages.getRecords();
 		if(!taskList.isEmpty()){
+			List<WmScorePackage> taskScorePackages = wmScorePackageService.listByIds(taskList.stream().map(WmTask::getScorePackageId).collect(Collectors.toSet()));
+			Map<String, WmScorePackage> scorePackageMap = taskScorePackages.stream().collect(Collectors.toMap(WmScorePackage::getId, Function.identity()));
 			List<Map> resList =taskList.stream().map(wmtask -> {
 				Map map = JSON.parseObject(JSON.toJSONString(wmtask), Map.class);
 				map.put("reportNo",wmReport.getReportNo());
@@ -550,7 +752,12 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 					map.put("reportApprovalOpinion",wmtask.getReportDrugApprovalOpinion());
 				}else if("1".equals(scorePackage.getTypeid())){//一级代理商类型
 //					map.put("reportApprovalOpinion",wmtask.getReportOneApprovalOpinion());
-					map.put("reportApprovalOpinion",wmtask.getReportDrugApprovalOpinion());
+					if (StrUtil.isNotBlank(wmtask.getReportDrugApprovalOpinion())) {
+						map.put("reportApprovalOpinion", wmtask.getReportDrugApprovalOpinion());
+					} else {
+						// 解决一级代理商自己给自己发包的情况
+						map.put("reportApprovalOpinion", wmtask.getReportOneApprovalOpinion());
+					}
 				}else if("2".equals(scorePackage.getTypeid())){//二级代理商类型
 //					map.put("reportApprovalOpinion",wmtask.getReportSecondApprovalOpinion());
 					map.put("reportApprovalOpinion",wmtask.getReportOneApprovalOpinion());
@@ -562,6 +769,7 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 						map.put("taskUsername", user.getRealname());
 					}
 				}
+				map.put("scorePackageStatus", scorePackageMap.getOrDefault(wmtask.getScorePackageId(), new WmScorePackage()).getScorePackageStatus());
 				return map;
 			}).collect(Collectors.toList());
 

+ 2 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageSettleNoteServiceImpl.java

@@ -1387,6 +1387,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 				params.put("subjectLocation", note.getSubjectLocation());
 				params.put("notes", pathNo[0]);
 				params.put("pathNo", pathNo[0]);
+				params.put("notifyUrl", String.format("%s/admin/gig-third-api/huiqiyun", upmsConfig.getClientUrl()));
 
 				if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
 					params.put("taxMode", "GENERAL");
@@ -2560,7 +2561,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			params.put("subjectLocation", note.getSubjectLocation().getType());
 			params.put("notes", pathNo[0]);
 			params.put("pathNo", pathNo[0]);
-
+			params.put("notifyUrl", String.format("%s/admin/gig-third-api/huiqiyun", upmsConfig.getClientUrl()));
 
 			if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
 				params.put("taxMode", "GENERAL");

+ 240 - 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,230 @@ 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();
+		Integer operatorId = SecurityUtils.getUser().getId();
+		// 查询这条任务
+		WmTask queryTask = this.getById(id);
+		if (queryTask == null) {
+			throw new RuntimeException("任务不存在");
+		}
+		if (queryTask.getReviewTaskCount() > 0) {
+			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("已生成报告");
+		}
+
+		// 查询积分包
+		String scorePackageId = queryTask.getScorePackageId();
+		WmScorePackage wmScorePackage = wmScorePackageMapper.selectById(scorePackageId);
+		if (!CollUtil.toList(ScorePackageStatusEnum.TO_BE_SETTLED.val(), ScorePackageStatusEnum.TO_BE_APPROVAL.val(), ScorePackageStatusEnum.IN_PROGRESS.val())
+				.contains(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::getReviewTaskCount, 1)
+				.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;
+	}
+
+	/**
+	 * 更新调查信息数据
+	 *
+	 * @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())) {
+			// 复审不通过,暂不进行回退操作
+			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);
+			}
+		}
+	}
 }

+ 9 - 3
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmScorePackageMapper.xml

@@ -1613,7 +1613,7 @@
 
 	<!-- 积分包列表查询 -->
 	<select id="listScorePackage" resultType="com.qunzhixinxi.hnqz.admin.entity.WmScorePackage">
-		SELECT p.*
+		SELECT distinct p.*
 		FROM wm_score_package p
 			<if test="acceptUser != null">
 				 LEFT JOIN wm_score_package_status ps on ps.package_id = p.id and ps.status = 2
@@ -1622,12 +1622,18 @@
 			<if test="relationScoreId != null">
 				LEFT JOIN wm_score_package p2 on p2.id = p.relation_score_id
 			</if>
+			<if test="toApproval != null and toApproval == true">
+				LEFT JOIN wm_task t on t.score_package_id = p.id
+			</if>
 		<where>
 			<if test="acceptUser != null">
-				u.realname LIKE CONCAT('%',#{acceptUser},'%')
+				AND u.realname LIKE CONCAT('%',#{acceptUser},'%')
 			</if>
 			<if test="relationScoreId != null">
-				p2.score_package_name LIKE CONCAT('%',#{relationScoreId},'%')
+				AND p2.score_package_name LIKE CONCAT('%',#{relationScoreId},'%')
+			</if>
+			<if test="toApproval != null and toApproval == true">
+				AND t.task_status = 2
 			</if>
 
 			<if test="ew != null">

+ 7 - 1
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmTaskMapper.xml

@@ -73,6 +73,8 @@
 		<result property="reportDrugApprovalInfo" column="report_drug_approval_info"/>
 		<result property="taskStatusInfo" column="task_status_info"/>
 		<result property="taskFrom" column="task_from"/>
+		<result property="reviewTaskCount" column="review_task_count"/>
+		<result property="deptReviewTaskCount" column="dept_review_task_count"/>
 
 	</resultMap>
 
@@ -970,7 +972,11 @@
 		t.submit_status AS submit_status,
 		t.share_img_url AS share_img_url,
 		t.plat_audit_status AS plat_audit_status,
-		t.task_info_img AS task_info_img
+		t.task_info_img AS task_info_img,
+		t.review_task_count,
+		t.report_drug_id,
+		t.report_one_id,
+		t.report_second_id
 		FROM wm_task t
 		left join sys_user u on  u.user_id=t.task_user_id
 		left join sys_dept d on d.dept_id=t.dept_id