Przeglądaj źródła

Merge branch 'hotfix-settlelimit-20210714' of googol/YY_BE_2 into master

屈桐 4 lat temu
rodzic
commit
e39528ba55

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

@@ -84,6 +84,7 @@ import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -92,6 +93,7 @@ import java.util.Objects;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -785,7 +787,7 @@ public class PartyAServiceImpl implements PartyAService {
 					boolean absent = redisTemplate.opsForValue()
 							.setIfAbsent(record.getTemp3().trim(), record.getTemp3());
 
-					if (!absent){
+					if (!absent) {
 						log.error("证据链不能重复上传:{}", record.getTemp3());
 						errorList.add(taskSettleInfo);
 						continue out;
@@ -1088,7 +1090,7 @@ public class PartyAServiceImpl implements PartyAService {
 		}
 
 		List<SettlementDTO> settlementDTOList = new ArrayList<>();
-		for (ExecSettlementDTO settlementDTO : execSettlementDTOList){
+		for (ExecSettlementDTO settlementDTO : execSettlementDTOList) {
 			List<SettlementDTO> tempList = settlementDTO.getSettlementDTOList();
 			if (CollectionUtils.isEmpty(tempList)) {
 				return getResultMap("4000", "结算内容为空");
@@ -1110,6 +1112,18 @@ public class PartyAServiceImpl implements PartyAService {
 			return note;
 		}).collect(Collectors.toList());
 
+		// 校验限额
+		BigDecimal tmp = new BigDecimal("0.0");
+		for (WmScorePackageSettleNote note : noteList) {
+			tmp = tmp.add(note.getSettleAmount());
+		}
+		String errInfo = checkoutSettleLimit(member,noteList.stream().mapToInt(WmScorePackageSettleNote::getId).boxed()
+				.collect(Collectors.toList()), deptSub.getLimitAmount(), tmp);
+		if (StringUtils.isNotEmpty(errInfo)) {
+			log.error(errInfo);
+			return getResultMap("4000", errInfo);
+		}
+
 		log.info("结算渠道: {} ", execSettlementDTO.getSubjectType());
 		Map<String, String> result = null;
 		if (SubjectTypeEnum.TYPE_RENLIJIA.getCode().equals(execSettlementDTO.getSubjectType())) {
@@ -1132,6 +1146,57 @@ public class PartyAServiceImpl implements PartyAService {
 		return result;
 	}
 
+	/**
+	 * 校验结算限制
+	 *
+	 * @param user         被校验者
+	 * @param noteIds 	   结算记录id
+	 * @param limitAmount  限制金额
+	 * @param settleAmount 本次上传证据链累计金额
+	 * @return 校验错误信息,如果没有错误返回{@code null}
+	 */
+	private String checkoutSettleLimit(SysUser user, List<Integer> noteIds ,BigDecimal limitAmount, BigDecimal settleAmount) {
+
+		String info = null;
+
+		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
+				.getIdCardNumber()), noteIds, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
+
+		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(Collections.singletonList(String
+				.valueOf(user.getUserId())), noteIds, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
+
+		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
+				.equals(user.getIdCardNumber())).findFirst().orElse(null);
+
+		SettleAmountMonitorOutput deptMonitorOutput = deptAmountMonitor.stream().filter(item -> item.getUserId()
+				.equals(String.valueOf(user.getUserId()))).findFirst().orElse(null);
+
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.getBySubType(SubjectTypeEnum.TYPE_SHUIBANGYUN
+				.getCode());
+		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
+		BigDecimal monitorAmount = settleAmount;
+		BigDecimal deptMonitorAmount = settleAmount;
+		if (null != monitorOutput) {
+			monitorAmount = monitorAmount.add(monitorOutput.getTotalAmount());
+		}
+		if (null != deptMonitorOutput) {
+			deptMonitorAmount = deptMonitorAmount.add(deptMonitorOutput.getTotalAmount());
+		}
+		if (null != limitAmount) {
+			if (deptMonitorAmount.compareTo(limitAmount) > 0) {
+				info = "超过当月限额";
+			}
+		}
+		if (null != monitoringLimit) {
+			if (monitorAmount.compareTo(monitoringLimit) > 0) {
+				info = "超过结算渠道限额";
+			}
+		}
+		return info;
+	}
+
 	/**
 	 * 税帮云结算
 	 *

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

@@ -35,6 +35,8 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.entity.*;
 import com.qunzhixinxi.hnqz.admin.entity.dto.CommonEvidenceDTO;
+import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
+import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
 import com.qunzhixinxi.hnqz.admin.enums.*;
 import com.qunzhixinxi.hnqz.admin.mapper.WmReportMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmScorePackageMapper;
@@ -63,7 +65,9 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -80,6 +84,8 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 	private final WmTaskMapper wmTaskMapper;
 	private final WmReportMapper wmReportMapper;
 	private final SysDeptService sysDeptService;
+	private final SysDeptSubService sysDeptSubService;
+	private final MonitoringIndicatorService monitoringIndicatorService;
 	private final WmScorePackageService wmScorePackageService;
 	private final WmScorePackageMapper wmScorePackageMapper;
 	private final WmTaskContentMapper wmTaskContentMapper;
@@ -1791,12 +1797,23 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 			errorMap(errorMap, info, String.join(";", idList));
 
 		} else {
+			//校验创建人结算信息税邦云信息是否配置完全
+			SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+					.eq(SysDeptSub::getDeptId, creator.getDeptId())
+					.eq(SysDeptSub::getSubjectType, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode())
+					.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
+			);
+			if (null == sysDeptSub || StringUtils.isBlank(sysDeptSub.getAppId())) {
+				List<String> idList = sourceList.stream().map(CommonEvidenceDTO::getId).collect(Collectors.toList());
+				errorMap(errorMap, "人员所在机构未配置结算信息", String.join(";", idList));
+			}
 
 			// 校验证据链信息,并封装正确的
 			List<CommonEvidenceDTO> evidenceDTOS = sourceList;
 			int outCapacity = evidenceDTOS.size() - scorePackage.getTaskNum();
-			AtomicInteger index = new AtomicInteger(0);
-			evidenceDTOS.stream().forEach(commonEvidenceDTO -> {
+			ConcurrentHashMap<SysUser, Integer> indexMap = new ConcurrentHashMap(sourceList.size());
+			ConcurrentHashMap<SysUser, BigDecimal> preUserSettleAmountMap = new ConcurrentHashMap(sourceList.size());
+			evidenceDTOS.forEach(commonEvidenceDTO -> {
 				// 校验结算用户是否存在
 				SysUser user = userService.getOne(Wrappers.<SysUser>lambdaQuery()
 						.eq(SysUser::getUsername, commonEvidenceDTO.getUsername())
@@ -1810,29 +1827,28 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 					return;
 				}
 
-				if (outCapacity > 0) {
-					if (index.getAndIncrement() >= outCapacity) {
-						log.error("超出设定任务数");
-						errorMap(errorMap, "超出设定任务数", commonEvidenceDTO.getId());
-						return;
-					}
-				} else {
-					// 校验任务数
-					List<WmTask> wmTasks = wmTaskMapper.selectList(Wrappers.<WmTask>lambdaQuery()
-							.eq(WmTask::getScorePackageId, scorePackage.getId())
-							.eq(WmTask::getTaskUserId, user.getUserId())
-							.eq(WmTask::getDelFlag, DelEnum.NOT_DEL.val())
-							.eq(WmTask::getEnableFlag, EnableEnum.ENABLE.val())
-							// 审核通过
-							.eq(WmTask::getTaskStatus, "3")
-					);
-					if (CollectionUtils.isNotEmpty(wmTasks) && (scorePackage.getTaskNum() - wmTasks.size() <= index.getAndIncrement())) {
-						log.error("超出设定任务数");
-						errorMap(errorMap, "超出设定任务数", commonEvidenceDTO.getId());
-						return;
-					}
+				// 校验任务数
+				int index = 1;
+				if (indexMap.containsKey(user)) {
+					index = indexMap.get(user) + 1;
+				}
+				indexMap.put(user, index);
+				List<WmTask> wmTasks = wmTaskMapper.selectList(Wrappers.<WmTask>lambdaQuery()
+						.eq(WmTask::getScorePackageId, scorePackage.getId())
+						.eq(WmTask::getTaskUserId, user.getUserId())
+						.eq(WmTask::getDelFlag, DelEnum.NOT_DEL.val())
+						.eq(WmTask::getEnableFlag, EnableEnum.ENABLE.val())
+						// 审核通过
+						.eq(WmTask::getTaskStatus, "3")
+				);
+
+				if (scorePackage.getTaskNum() - wmTasks.size() < index ){
+					log.error("超出设定任务数");
+					errorMap(errorMap, "超出设定任务数", commonEvidenceDTO.getId());
+					return;
 				}
 
+
 				// 校验用户是否存在领包记录
 				WmScorePackageStatus scorePackageStatus =
 						wmScorePackageStatusService.getOne(Wrappers.<WmScorePackageStatus>lambdaQuery()
@@ -1865,6 +1881,20 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 					return;
 				}
 
+				// 校验结算限制
+				BigDecimal tmp = commonEvidenceDTO.getAmount();
+				if (preUserSettleAmountMap.containsKey(user)) {
+					tmp = tmp.add(preUserSettleAmountMap.get(user));
+				}
+				preUserSettleAmountMap.put(user, tmp);
+
+				errorInfo = checkoutSettleLimit(user, sysDeptSub.getLimitAmount(), tmp);
+				if (StringUtils.isNotEmpty(errorInfo)) {
+					log.error(errorInfo);
+					errorMap(errorMap, errorInfo, commonEvidenceDTO.getId());
+					return;
+				}
+
 				// 获取发票类目
 				InvoiceInfo invoiceInfo = InvoiceInfo.resolveByCategory(commonEvidenceDTO.getInvoiceCategory());
 
@@ -1885,6 +1915,56 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 		}
 	}
 
+	/**
+	 * 校验结算限制
+	 *
+	 * @param user         被校验者
+	 * @param limitAmount  限制金额
+	 * @param settleAmount 本次上传证据链累计金额
+	 * @return 校验错误信息,如果没有错误返回{@code null}
+	 */
+	private String checkoutSettleLimit(SysUser user, BigDecimal limitAmount, BigDecimal settleAmount) {
+
+		String info = null;
+
+		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
+				.getIdCardNumber()), null, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
+
+		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(Collections.singletonList(String
+				.valueOf(user.getUserId())), null, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
+
+		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
+				.equals(user.getIdCardNumber())).findFirst().orElse(null);
+
+		SettleAmountMonitorOutput deptMonitorOutput = deptAmountMonitor.stream().filter(item -> item.getUserId()
+				.equals(String.valueOf(user.getUserId()))).findFirst().orElse(null);
+
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.getBySubType(SubjectTypeEnum.TYPE_SHUIBANGYUN
+				.getCode());
+		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
+		BigDecimal monitorAmount = settleAmount;
+		BigDecimal deptMonitorAmount = settleAmount;
+		if (null != monitorOutput) {
+			monitorAmount = monitorAmount.add(monitorOutput.getTotalAmount());
+		}
+		if (null != deptMonitorOutput) {
+			deptMonitorAmount = deptMonitorAmount.add(deptMonitorOutput.getTotalAmount());
+		}
+		if (null != limitAmount) {
+			if (deptMonitorAmount.compareTo(limitAmount) > 0) {
+				info = "超过当月限额";
+			}
+		}
+		if (null != monitoringLimit) {
+			if (monitorAmount.compareTo(monitoringLimit) > 0) {
+				info = "超过结算渠道限额";
+			}
+		}
+		return info;
+	}
+
 	/**
 	 * 积分包信息校验
 	 *