Forráskód Böngészése

feat:适配税源地结算

shc 3 éve
szülő
commit
74c0a5aa10
22 módosított fájl, 646 hozzáadás és 1003 törlés
  1. 79 101
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java
  2. 5 6
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/MonitoringIndicator.java
  3. 3 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ExecSettlementDTO.java
  4. 3 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ScorePackageSettleNoteDTO.java
  5. 25 34
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/SettleAmountMonitorInput.java
  6. 19 38
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageSettleInput.java
  7. 1 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmScorePackageMapper.java
  8. 21 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/MonitoringIndicatorService.java
  9. 16 6
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptSubService.java
  10. 12 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java
  11. 18 12
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPayOffService.java
  12. 10 4
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageService.java
  13. 101 15
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/MonitoringIndicatorServiceImpl.java
  14. 42 77
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/PartyAServiceImpl.java
  15. 35 6
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptSubServiceImpl.java
  16. 44 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java
  17. 167 653
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java
  18. 15 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageServiceImpl.java
  19. 15 17
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageSettleNoteServiceImpl.java
  20. 8 14
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java
  21. 4 7
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptSubMapper.xml
  22. 3 2
      hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/Test.java

+ 79 - 101
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java

@@ -1,7 +1,8 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
@@ -44,6 +45,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -67,13 +69,14 @@ public class WmPayOffController {
 
 	/**
 	 * 财务回退操作
+	 *
 	 * @param input 操作参数
 	 * @return 回退结果
 	 */
 	@ApiOperation(value = "结算回退", notes = "提交结算")
 	@SysLog("提交结算")
 	@PostMapping("/settleBack")
-	public R settleBack(@RequestBody WmScorePackageSettleInput input) {
+	public R<?> settleBack(@RequestBody WmScorePackageSettleInput input) {
 		if (StringUtils.isEmpty(input.getId())) {
 			return R.failed("数据异常");
 		}
@@ -113,13 +116,13 @@ public class WmPayOffController {
 	/**
 	 * 业务提交结算信息到财务
 	 *
-	 * @param input 输入信息
+	 * @param input 结算信息
 	 * @return 提交结果
 	 */
 	@ApiOperation(value = "提交结算", notes = "提交结算")
 	@SysLog("提交结算")
 	@PostMapping("/settleSubmit")
-	public R settleSubmit(@RequestBody @Valid WmScorePackageSettleInput input) {
+	public R<?> settleSubmit(@RequestBody @Valid WmScorePackageSettleInput input) {
 
 		//1、验证令牌是否合法【令牌的对比和删除必须保证原子性】
 		HnqzUser finaAdmin = SecurityUtils.getUser();
@@ -135,80 +138,66 @@ public class WmPayOffController {
 			return R.failed("提交 TOKEN 不正确,请刷新页面重试");
 		}
 
+		if (input.getSubjectLocation() == null) {
+			return R.failed("人员结算渠道不存在,不能结算");
+		}
+
 		return wmPayOffService.settleSubmit(input);
 	}
 
+	/**
+	 * 业务保存结算记录
+	 *
+	 * @param input 结算信息
+	 * @return 提交结果
+	 */
 	@ApiOperation(value = "保存结算", notes = "保存结算")
 	@SysLog("保存结算")
 	@PostMapping("/settleSave")
-	public R settleSave(@RequestBody WmScorePackageSettleInput input) {
-		if (CollectionUtils.isEmpty(input.getNotes())) {
-			return R.failed("数据异常");
-		}
+	public R<?> settleSave(@RequestBody WmScorePackageSettleInput input) {
 
-		if (StringUtils.isEmpty(input.getId())) {
-			return R.failed("数据异常");
-		}
-		if (null == input.getInvoiceCategory()) {
-			return R.failed("数据异常");
+		if (CollectionUtils.isEmpty(input.getNotes()) || StringUtils.isEmpty(input.getId()) || null == input.getInvoiceCategory() || input.getSubjectLocation() == null) {
+
+			return R.failed("数据异常或人员结算渠道不存在,不能结算");
 		}
 
 		return wmPayOffService.settleSave(input);
 	}
 
+
 	/**
-	 * 弃用
+	 * 重新结算
 	 *
-	 * @Modify: start
-	 * @Version: v2021.4.16
-	 * @Author: ryz
-	 * @Date: 2021/4/28
+	 * @param input 结算信息
+	 * @return 提交结果
 	 */
-	@Deprecated
-	@ApiOperation(value = "结算", notes = "结算")
-	@SysLog("结算")
-	@PostMapping("/settleIssue")
-	public R settleIssue(@RequestBody WmScorePackageSettleInput input) {
-		if (StringUtils.isEmpty(input.getId())) {
-			return R.failed("数据异常");
-		}
-		if (CollectionUtils.isEmpty(input.getNotes())) {
-			return R.failed("数据异常");
-		}
-		if (null == input.getInvoiceCategory()) {
-			return R.failed("数据异常");
-		}
-		if (StringUtils.isEmpty(input.getScorePackageName())) {
-			return R.failed("数据异常");
-		}
-
-		return wmPayOffService.settleIssue(input);
-	}
-
 	@ApiOperation(value = "重新结算", notes = "重新结算")
 	@SysLog("重新结算")
 	@PostMapping("/settleReIssue")
-	public R settleReIssue(@RequestBody WmScorePackageSettleInput input) {
+	public R<?> settleReIssue(@RequestBody WmScorePackageSettleInput input) {
 		if (StringUtils.isEmpty(input.getId())) {
 			return R.failed("数据异常");
 		}
 
-//		return wmPayOffService.settleReIssue(input);
 		return wmPayOffService.settleReIssueBySubType(input);
 	}
 
 	/**
-	 * 发起结算
+	 * 业务展示结算信息
 	 *
-	 * @param input 提交参数
-	 * @return 提交结果
+	 * @param pkgId 积分包id
+	 * @return 待提交的信息
 	 */
 	@ApiOperation(value = "结算", notes = "结算")
 	@SysLog("结算")
 	@PostMapping("/settleById")
-	public R settleById(@RequestBody WmScorePackageSettleInput input) {
+	public R<?> settleById(@RequestBody String pkgId) {
+
+		if (StrUtil.isBlank(pkgId)) {
+			return R.failed("积分包id缺失");
+		}
 
-		return wmPayOffService.settleById(input);
+		return wmPayOffService.settleById(pkgId);
 	}
 
 
@@ -217,49 +206,48 @@ public class WmPayOffController {
 	 *
 	 * @param page  分页信息
 	 * @param input 参数
-	 * @return
+	 * @return 分页结果
 	 */
 	@ApiOperation(value = "分页查询结算", notes = "分页查询结算")
 	@SysLog("分页查询结算")
 	@GetMapping("/listPackageSettleList")
-	public R listPackageSettleList(Page page, WmScorePackageSettleInput input) {
+	public R<?> listPackageSettleList(Page<WmScorePackageSettleOutput> page, WmScorePackageSettleInput input) {
 
-		input.setSendPackageDeptId(SecurityUtils.getUser().getDeptId() + "");
+		input.setSendPackageDeptId(String.valueOf(SecurityUtils.getUser().getDeptId()));
 		input.setPackageFinishStatus("1");
 		input.setTypeid("4");
 		input.setSettleFlag("1");
-		IPage<WmScorePackageSettleOutput> outputList = wmScorePackageService.listPackageSettleList(page, input);
-		return R.ok(outputList);
+		return R.ok(wmScorePackageService.listPackageSettleList(page, input));
 	}
 
 	/**
 	 * 结算包结算导出
 	 *
-	 * @param input
-	 * @return
+	 * @param input 输入参数
+	 * @return excel模型
 	 */
 	@ApiOperation(value = "积分包结算导出", notes = "积分包结算导出")
 	@ResponseExcel(name = "exportPackageSettle", sheet = "积分包结算数据")
 	@SysLog("积分包结算导出")
 	@GetMapping("/exportPackageSettle")
 	public List<WmScorePackageSettleExcelModel> exportPackageSettle(WmScorePackageSettleInput input) {
-		input.setSendPackageDeptId(SecurityUtils.getUser().getDeptId() + "");
+		input.setSendPackageDeptId(String.valueOf(SecurityUtils.getUser().getDeptId()));
 		input.setPackageFinishStatus("1");
 		input.setTypeid("4");
 		input.setSettleFlag("1");
 		List<WmScorePackageSettleOutput> list = wmScorePackageService.listAllPackageSettle(input);
 		List<WmScorePackageSettleExcelModel> exportList = new ArrayList<>();
 		if (CollectionUtil.isEmpty(list)) {
-			return new ArrayList<>();
+			return Collections.emptyList();
 		}
 
 		// 获取发票类目信息
 		List<SysDictItem> invoiceCategoryList = dictItemService.list(Wrappers.<SysDictItem>lambdaQuery().in(SysDictItem::getType, "renlijia_invoice", "olading_invoice", "yee_invoice", "tax_helper_invoice"));
 		Map<String, Map<String, String>> collect = invoiceCategoryList.stream().collect(Collectors.groupingBy(SysDictItem::getType, Collectors.toMap(SysDictItem::getValue, SysDictItem::getLabel)));
-		Map<String,String> renlijiaInvoice = collect.get("renlijia_invoice");
-		Map<String,String> oladingInvoice = collect.get("olading_invoice");
-		Map<String,String> yeeInvoice = collect.get("yee_invoice");
-		Map<String,String> taxHelperInvoice = collect.get("tax_helper_invoice");
+		Map<String, String> renlijiaInvoice = collect.get("renlijia_invoice");
+		Map<String, String> oladingInvoice = collect.get("olading_invoice");
+		Map<String, String> yeeInvoice = collect.get("yee_invoice");
+		Map<String, String> taxHelperInvoice = collect.get("tax_helper_invoice");
 
 
 		// 转换为导出实体
@@ -310,47 +298,33 @@ public class WmPayOffController {
 	@ApiOperation(value = "结算", notes = "结算")
 	@SysLog("结算")
 	@PostMapping("/saveSettleInfo")
-	public R saveSettleInfo(@RequestBody List<WmScorePackage> wsList) {
+	public R<?> saveSettleInfo(@RequestBody List<WmScorePackage> wsList) {
+
 		if (CollectionUtils.isEmpty(wsList)) {
 			return R.failed("请选择数据");
-		} else {
-			for (WmScorePackage wmScorePackage : wsList) {
-				if (StringUtils.isEmpty(wmScorePackage.getId())) {
-					return R.failed("数据异常,请联系管理员:" + wmScorePackage.getScoreName());
-				}
-			}
 		}
-		try {
-			return wmPayOffService.saveSettleInfo(wsList);
-		} catch (Exception e) {
-			e.printStackTrace();
-			return R.failed();
+
+		Optional<WmScorePackage> any = wsList.stream().filter(ws -> StringUtils.isEmpty(ws.getId())).findAny();
+
+		if (any.isPresent()){
+			return R.failed("数据异常,请联系管理员:" + any.get().getScoreName());
 		}
+
+		return wmPayOffService.saveSettleInfo(wsList);
 	}
 
 	/**
 	 * 结算
-	 * @param input
-	 * @return
+	 *
+	 * @param input 结算信息
+	 * @return 结算操作结果
 	 */
 	@ApiOperation(value = "结算-自由选择渠道", notes = "结算-自由选择渠道")
 	@SysLog("结算-自由选择渠道")
 	@PostMapping("/settleIssueBySubType")
-	public R settleIssueBySubType(@RequestBody WmScorePackageSettleInput input) {
-		if (StringUtils.isEmpty(input.getId())) {
-			return R.failed("数据异常");
-		}
-		if (input.getSubjectLocation() == null) {
-			return R.failed("数据异常");
-		}
-		if (CollectionUtils.isEmpty(input.getNotes())) {
-			return R.failed("数据异常");
-		}
-		if (null == input.getInvoiceCategory()) {
-			return R.failed("数据异常");
-		}
+	public R<?> settleIssueBySubType(@RequestBody WmScorePackageSettleInput input) {
 
-		if (StringUtils.isEmpty(input.getScorePackageName())) {
+		if (StrUtil.isAllNotBlank(input.getId(),input.getScorePackageName() ) || input.getSubjectLocation() == null || CollUtil.isEmpty(input.getNotes()) || null == input.getInvoiceCategory()){
 			return R.failed("数据异常");
 		}
 
@@ -360,49 +334,53 @@ public class WmPayOffController {
 	/**
 	 * 批量财务结算
 	 *
-	 * @param inputList
-	 * @return
+	 * @param inputList 批量结算
+	 * @return 结算操作结果
 	 */
 	@SysLog("批量财务结算")
 	@PostMapping("/batch-financial-settle")
+	@SuppressWarnings("all")
 	public R<?> batchFinancialSettle(@RequestBody List<WmScorePackageSettleInput> inputList) {
+
 		if (CollectionUtil.isEmpty(inputList)) {
 			return R.failed("数据异常");
 		}
+
 		List<Map<String, String>> msgList = new ArrayList<>();
+
 		for (WmScorePackageSettleInput input : inputList) {
-			if (StringUtils.isEmpty(input.getId()) || null == input.getSubjectLocation()
-					|| null == input.getInvoiceCategory() || StringUtils.isEmpty(input.getScorePackageName())) {
+
+			if (StringUtils.isEmpty(input.getId()) || null == input.getSubjectLocation() || null == input.getInvoiceCategory() || StringUtils.isEmpty(input.getScorePackageName())) {
 				return R.failed("数据异常");
 			}
+
 			// 查询结算详情(用于拼接notes数据)
-			R queryR = wmPayOffService.settleById(input);
+			R<?> queryR = wmPayOffService.settleById(input.getId());
 
 			if (queryR.getCode() == 0) {
 				Map<String, Object> queryData = (Map<String, Object>) queryR.getData();
 				List<WmScorePackageSettleNote> notes = (List<WmScorePackageSettleNote>) queryData.get("notes");
 				input.setNotes(notes);
 				// 调用单个结算
-				R settleR = wmPayOffService.settleIssueBySubType(input);
-				boolean failFlag = false;
+				R<?> settleR = wmPayOffService.settleIssueBySubType(input);
+				boolean failFlag;
 				if (settleR.getCode() == 0) {
 					// 结算成功,不进行页面提示
-					for (WmScorePackageSettleNote note : notes) {
-						if (!DingEnum.NOTE_STATUS_SUBMIT.getType().equals(note.getSettleNoteStatus())) {
-							failFlag = true;
-						}
-					}
+					Optional<WmScorePackageSettleNote> any = notes.stream().filter(note -> !DingEnum.NOTE_STATUS_SUBMIT.getType().equals(note.getSettleNoteStatus())).findAny();
+					failFlag = any.isPresent();
 				} else {
 					failFlag = true;
 				}
+
 				if (failFlag) {
-					Map<String, String> msgMap = new HashMap<>();
+					Map<String, String> msgMap = new HashMap<>(2);
 					msgMap.put("packageName", input.getScorePackageName());
 					msgMap.put("reason", settleR.getMsg());
 					msgList.add(msgMap);
 				}
+
 			} else {
-				Map<String, String> msgMap = new HashMap<>();
+				Map<String, String> msgMap = new HashMap<>(2);
 				msgMap.put("packageName", input.getScorePackageName());
 				msgMap.put("reason", queryR.getMsg());
 				msgList.add(msgMap);

+ 5 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/MonitoringIndicator.java

@@ -20,10 +20,12 @@ package com.qunzhixinxi.hnqz.admin.entity;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 import java.math.BigDecimal;
 import java.io.Serializable;
@@ -36,18 +38,17 @@ import java.time.LocalDateTime;
  * @date 2021-04-19 16:08:29
  */
 @Data
+@ToString
 @TableName("monitoring_indicator")
 @EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "风险监控")
 public class MonitoringIndicator extends Model<MonitoringIndicator> {
 
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 *
+	 * id
 	 */
 	@TableId
-	@ApiModelProperty(value = "")
 	private Integer id;
 	/**
 	 * 报警金额
@@ -65,10 +66,8 @@ public class MonitoringIndicator extends Model<MonitoringIndicator> {
 	 */
 	private BigDecimal yaoyiLimitAmount;
 
-	private String subType;
-
 	/**
 	 * 税源地
 	 */
-	private String subjectLocation;
+	private SubjectLocation subjectLocation;
 }

+ 3 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ExecSettlementDTO.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.entity.dto;
 
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -42,10 +43,9 @@ public class ExecSettlementDTO implements Serializable {
 	 */
 	private String amount;
 
-
 	/**
-	 * 结算方式:0-人力家 1-税邦云
+	 * 税源地
 	 */
-	private String subjectType;
+	private SubjectLocation location;
 
 }

+ 3 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ScorePackageSettleNoteDTO.java

@@ -1,6 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.entity.dto;
 
 import com.qunzhixinxi.hnqz.admin.enums.ChannelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -30,8 +31,8 @@ public class ScorePackageSettleNoteDTO implements Serializable {
 	// 结算记录id
 	private Integer settleNoteId;
 
-	// 结算渠道
-	private ChannelEnum channel;
+	// 税源地
+	private SubjectLocation location;
 
 	// 发票类型
 	private Integer invoiceType;

+ 25 - 34
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/SettleAmountMonitorInput.java

@@ -4,14 +4,15 @@ import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
 import java.util.List;
+import java.util.Set;
 
 /**
- * @Version: 2021.4.16
- * @Author: ryz
- * @Date: 2021/4/22
+ * 结算监控输入
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-07-27 16:53
  */
 @Data
 public class SettleAmountMonitorInput {
@@ -19,47 +20,37 @@ public class SettleAmountMonitorInput {
 	/**
 	 * 身份证号
 	 */
-	private List<String> idCard;
+	private List<String> idCards;
 
-	private List<Integer> ids;
+	private List<Integer> settleNoteIds;
 
-	private List<String> userIds;
+	private Set<Integer> userIds;
 
 	private LocalDate startTime;
 
 	private LocalDate endTime;
 
-	private String subType;
+	private SubjectLocation location;
 
-	private SubjectLocation subjectLocation;
-
-	public static SettleAmountMonitorInput fromIdCard(List<String> idCard, List<Integer> ids, String subType, SubjectLocation subjectLocation) {
-		SettleAmountMonitorInput input = new SettleAmountMonitorInput();
-
-		input.idCard = idCard;
-		input.ids = ids;
-
-		LocalDate now = LocalDate.now();
-		input.startTime = now.withDayOfMonth(1);
-		input.endTime = now.plusMonths(1L).withDayOfMonth(1);
-		input.subType = subType;
-		input.subjectLocation = subjectLocation;
-
-		return input;
+	private SettleAmountMonitorInput() {
+		LocalDate date = LocalDate.now();
+		this.startTime = date.withDayOfMonth(1);
+		this.endTime = date.plusMonths(1L).withDayOfMonth(1);
 	}
 
-	public static SettleAmountMonitorInput fromUserId(List<String> userIds, List<Integer> ids, String subType, SubjectLocation subjectLocation) {
-		SettleAmountMonitorInput input = new SettleAmountMonitorInput();
 
-		input.userIds = userIds;
-		input.ids = ids;
+	public SettleAmountMonitorInput(List<String> idCards, List<Integer> settleNoteIds, SubjectLocation location) {
+		this();
+		this.idCards = idCards;
+		this.settleNoteIds = settleNoteIds;
+		this.location = location;
 
-		LocalDate now = LocalDate.now();
-		input.startTime = now.withDayOfMonth(1);
-		input.endTime = now.plusMonths(1L).withDayOfMonth(1);
-		input.subType = subType;
-		input.subjectLocation = subjectLocation;
+	}
 
-		return input;
+	public SettleAmountMonitorInput(Set<Integer> userIds, List<Integer> settleNoteIds, SubjectLocation location) {
+		this();
+		this.userIds = userIds;
+		this.settleNoteIds = settleNoteIds;
+		this.location = location;
 	}
 }

+ 19 - 38
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageSettleInput.java

@@ -1,32 +1,35 @@
 package com.qunzhixinxi.hnqz.admin.entity.input;
 
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
-import com.qunzhixinxi.hnqz.admin.enums.CategoryEnum;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
-import com.qunzhixinxi.hnqz.common.ding.enums.DingEnum;
 import lombok.Data;
+import lombok.ToString;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
 
 /**
+ * 积分包结算输入信息
  *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-07-27 15:07
  */
 @Data
-public class WmScorePackageSettleInput {
+@ToString
+public class WmScorePackageSettleInput implements Serializable {
 
-	/**
-	 * packageId
-	 */
+	private static final long serialVersionUID = -4460944815143863772L;
+
+	// 积分包id
 	@NotBlank(message = "积分包信息必填")
 	private String id;
 
-	/**
-	 * 发票类目
-	 */
+	// 发票类目
 	@NotNull(message = "发票类目必填")
 	private Integer invoiceCategory;
 
@@ -62,48 +65,26 @@ public class WmScorePackageSettleInput {
 	private String belongDate;
 
 	private Integer score;
+
+	// 已提交
 	private Integer ytj;
+
+	// 已审核
 	private Integer ysh;
+
+	// 待审核
 	private Integer dsh;
 
 	@NotEmpty(message = "结算信息必填")
 	private List<WmScorePackageSettleNote> notes;
 
-	/**
-	 * @Modify: start
-	 * @Version: 2021.4.16
-	 * @Author: ryz
-	 * @Date: 2021/4/22
-	 */
 	private String realName;
 
 	private String description;
 
 	private String subType;
 
-	/**
-	 * 税源地
-	 */
+	// 税源地
 	private SubjectLocation subjectLocation;
 
-	/**
-	 * @Modify: start
-	 * @Version: 2021.4.16
-	 * @Author: ryz
-	 * @Date: 2021/4/22
-	 */
-	public String toCategoryName() {
-
-		if (CategoryEnum.CATEGORY_1.getCode().equals(invoiceCategory)) {
-			return CategoryEnum.CATEGORY_1.getDesc();
-		} else if (CategoryEnum.CATEGORY_2.getCode().equals(invoiceCategory)) {
-			return CategoryEnum.CATEGORY_2.getDesc();
-		} else if (CategoryEnum.CATEGORY_3.getCode().equals(invoiceCategory)) {
-			return CategoryEnum.CATEGORY_3.getDesc();
-		} else if (CategoryEnum.CATEGORY_4.getCode().equals(invoiceCategory)) {
-			return CategoryEnum.CATEGORY_4.getDesc();
-		}
-
-		return "";
-	}
 }

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

@@ -134,7 +134,7 @@ public interface WmScorePackageMapper extends DataScopeMapper<WmScorePackage> {
 
 	IPage<WmScorePackageApiOutput> getPackageListForReceive(Page page,@Param("query")WmScorePackage wmScorePackage);
 
-	IPage<WmScorePackageSettleOutput> listPackageSettleList(Page page, @Param("query")WmScorePackageSettleInput input);
+	Page<WmScorePackageSettleOutput> listPackageSettleList(Page<WmScorePackageSettleOutput> page, @Param("query")WmScorePackageSettleInput input);
 
 	/**
 	 * 结算包结算列表

+ 21 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/MonitoringIndicatorService.java

@@ -19,8 +19,13 @@ package com.qunzhixinxi.hnqz.admin.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qunzhixinxi.hnqz.admin.entity.MonitoringIndicator;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 风险监控
  *
@@ -29,5 +34,20 @@ import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
  */
 public interface MonitoringIndicatorService extends IService<MonitoringIndicator> {
 
-	MonitoringIndicator getBySubType(String subType, SubjectLocation subjectLocation);
+	/**
+	 * 获取税源地限额
+	 *
+	 * @param subjectLocation 税源地
+	 * @return 限额信息
+	 */
+	MonitoringIndicator locationLimit(SubjectLocation subjectLocation);
+
+	/**
+	 * 结算校验
+	 *
+	 * @param notes    结算记录
+	 * @param location 税源地
+	 * @return 总结算额
+	 */
+	BigDecimal settleMonitoringIndicator(Collection<WmScorePackageSettleNote> notes, SubjectLocation location);
 }

+ 16 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptSubService.java

@@ -22,9 +22,11 @@ import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
 import com.qunzhixinxi.hnqz.admin.entity.input.DeptSubLimitAmountInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
 import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 部门管理
@@ -34,18 +36,26 @@ import java.util.List;
  */
 public interface SysDeptSubService extends IService<SysDeptSub> {
 
-	R updateSubLimitAmount(DeptSubLimitAmountInput input);
+	R<?> updateSubLimitAmount(DeptSubLimitAmountInput input);
 
-	List<SettleAmountMonitorOutput> getSettleAmountMonitor(SettleAmountMonitorInput input);
-
-	List<SettleAmountMonitorOutput> getDeptAmountMonitor(SettleAmountMonitorInput input);
+	List<SettleAmountMonitorOutput> getSettleAmountMonitor(List<String> idCards, List<Integer> settleNoteIds, SubjectLocation location);
+	List<SettleAmountMonitorOutput> getYaoyiAmountMonitor(List<String> idCards, List<Integer> settleNoteIds, SubjectLocation location);
+	List<SettleAmountMonitorOutput> getDeptAmountMonitor(Set<Integer> userIds, List<Integer> settleNoteIds, SubjectLocation location);
 
 	/**
 	 * 结算管理配置
 	 *
-	 * @param input
+	 * @param input 参数
 	 */
 	void saveSettleConfig(DeptSubLimitAmountInput input);
 
-	List<SettleAmountMonitorOutput> getYaoyiAmountMonitor(SettleAmountMonitorInput yaoyiMonitorInput);
+
+	/**
+	 * 获取税源地的配置信息
+	 *
+	 * @param deptId   部门id
+	 * @param location 税源地
+	 * @return 税源地记录
+	 */
+	SysDeptSub getDeptSub(Integer deptId, SubjectLocation location);
 }

+ 12 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -30,8 +30,11 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
+import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -125,6 +128,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 人力家认证
+	 *
 	 * @param sysUser
 	 * @param sysDept
 	 * @return
@@ -142,4 +146,12 @@ public interface SysUserService extends IService<SysUser> {
 	 * @return 结果
 	 */
 	Map<String, String> batchByExcel(Map<String, List<CommonUserDTO>> commonUserDTOListMap);
+
+	/**
+	 * 结算时校验用户信息
+	 *
+	 * @param userIds         用户id集合
+	 * @param subjectLocation 税源地
+	 */
+	void checkUserInfoToSettle(Collection<Integer> userIds, SubjectLocation subjectLocation);
 }

+ 18 - 12
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPayOffService.java

@@ -17,17 +17,20 @@ import java.util.List;
  */
 public interface WmPayOffService extends IService<WmPayOff> {
 
-	R saveSettleInfo(List<WmScorePackage> wsList) throws Exception;
+	/**
+	 * 保存结算信息
+	 * @param wsList 积分包列表
+	 * @return 结算申请结果
+	 */
+	R<?> saveSettleInfo(List<WmScorePackage> wsList);
 
 	/**
 	 * 获取结算信息
 	 *
-	 * @param input 参数
+	 * @param pkgId 参数
 	 * @return 结算信息
 	 */
-	R settleById(WmScorePackageSettleInput input);
-
-	R settleIssue(WmScorePackageSettleInput input);
+	R<?> settleById(String pkgId);
 
 	/**
 	 * 业务保存操作
@@ -35,9 +38,7 @@ public interface WmPayOffService extends IService<WmPayOff> {
 	 * @param input 提交信息
 	 * @return 保存结果
 	 */
-	R settleSave(WmScorePackageSettleInput input);
-
-	R settleReIssue(WmScorePackageSettleInput input);
+	R<?> settleSave(WmScorePackageSettleInput input);
 
 	/**
 	 * 业务提交结算信息到财务
@@ -45,7 +46,7 @@ public interface WmPayOffService extends IService<WmPayOff> {
 	 * @param input 输入信息
 	 * @return 提交结果
 	 */
-	R settleSubmit(WmScorePackageSettleInput input);
+	R<?> settleSubmit(WmScorePackageSettleInput input);
 
 	/**
 	 * 财务回退操作
@@ -53,7 +54,7 @@ public interface WmPayOffService extends IService<WmPayOff> {
 	 * @param input 提交参数
 	 * @return 操作结果
 	 */
-	R settleBack(WmScorePackageSettleInput input);
+	R<?> settleBack(WmScorePackageSettleInput input);
 
 	/**
 	 * 提交结算
@@ -61,7 +62,12 @@ public interface WmPayOffService extends IService<WmPayOff> {
 	 * @param input 提交结算信息
 	 * @return 提交结果
 	 */
-	R settleIssueBySubType(WmScorePackageSettleInput input);
+	R<?> settleIssueBySubType(WmScorePackageSettleInput input);
 
-	R settleReIssueBySubType(WmScorePackageSettleInput input);
+	/**
+	 * 重新结算
+	 * @param input 结算信息
+	 * @return 提交结果
+	 */
+	R<?> settleReIssueBySubType(WmScorePackageSettleInput input);
 }

+ 10 - 4
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageService.java

@@ -128,11 +128,11 @@ public interface WmScorePackageService extends IService<WmScorePackage> {
 	/**
 	 * 积分包结算列表(分页)
 	 *
-	 * @param page
-	 * @param input
-	 * @return
+	 * @param page 分页信息
+	 * @param input 分页参数
+	 * @return 分页结果
 	 */
-	IPage<WmScorePackageSettleOutput> listPackageSettleList(Page page, WmScorePackageSettleInput input);
+	Page<WmScorePackageSettleOutput> listPackageSettleList(Page<WmScorePackageSettleOutput> page, WmScorePackageSettleInput input);
 
 	/**
 	 * 积分包结算列表
@@ -172,4 +172,10 @@ public interface WmScorePackageService extends IService<WmScorePackage> {
 	Future<WmScorePackage> buildScorePackage(WmScorePackage wmScorePackage, Integer packageType1, Integer packageType2);
 
 	void getReportOpt(WmScorePackage wmScorePackage);
+
+	/**
+	 * 校验积分包是否可以结算
+	 * @param pkg 基本包
+	 */
+	void checkPkgToSettle(WmScorePackage pkg);
 }

+ 101 - 15
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/MonitoringIndicatorServiceImpl.java

@@ -19,13 +19,29 @@ package com.qunzhixinxi.hnqz.admin.service.impl;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.entity.MonitoringIndicator;
+import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
+import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.MonitoringIndicatorMapper;
 import com.qunzhixinxi.hnqz.admin.service.MonitoringIndicatorService;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import static com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants.MONITORING_INDICATOR;
 
 /**
@@ -34,28 +50,98 @@ import static com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants.MONITORING_
  * @author ryz
  * @date 2021-04-19 16:08:29
  */
+@Slf4j
 @Service
+@AllArgsConstructor
 public class MonitoringIndicatorServiceImpl extends ServiceImpl<MonitoringIndicatorMapper, MonitoringIndicator> implements MonitoringIndicatorService {
 
+	private final SysDeptSubService sysDeptSubService;
+
 	/**
-	 * 查询平台限额
+	 * 获取税源地限额
 	 *
-	 * @param subType 渠道类型
 	 * @param subjectLocation 税源地
-	 * @return
+	 * @return 限额信息
+	 */
+	@Override
+	public MonitoringIndicator locationLimit(SubjectLocation subjectLocation) {
+		MonitoringIndicator one = this.getOne(Wrappers.<MonitoringIndicator>lambdaQuery().eq(MonitoringIndicator::getSubjectLocation, subjectLocation));
+
+		if (one == null) {
+			throw new RuntimeException("风控信息不存在");
+		}
+
+		log.info("风控信息:{}", one);
+		return one;
+	}
+
+	/**
+	 * 结算校验
+	 *
+	 * @param notes    结算记录
+	 * @param location 税源地
+	 * @return 总结算额
 	 */
-	// @Cacheable(value = MONITORING_INDICATOR)
 	@Override
-	public MonitoringIndicator getBySubType(String subType, SubjectLocation subjectLocation) {
-
-		return this.getOne(Wrappers.<MonitoringIndicator>lambdaQuery()
-				.eq(MonitoringIndicator::getSubType, subType)
-				.eq(MonitoringIndicator::getSubjectLocation, subjectLocation));
-		// if(SubjectTypeEnum.TYPE_RENLIJIA.getCode().equals(subType)){
-		// 	return baseMapper.selectById(1);
-		// }else if(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode().equals(subType)){
-		// 	return baseMapper.selectById(2);
-		// }
-		// return null;
+	public BigDecimal settleMonitoringIndicator(Collection<WmScorePackageSettleNote> notes, SubjectLocation location) {
+		// 结算渠道
+		SysDeptSub sysDeptSub = sysDeptSubService.getDeptSub(SecurityUtils.getUser().getDeptId(), location);
+
+		// 校验当月结算额度
+		List<String> idCards = notes.stream().map(WmScorePackageSettleNote::getIdCardNumber).collect(Collectors.toList());
+		List<Integer> noteIds = notes.stream().map(WmScorePackageSettleNote::getId).filter(Objects::nonNull).collect(Collectors.toList());
+		Set<Integer> userIds = notes.stream().map(WmScorePackageSettleNote::getUserId).map(Integer::valueOf).collect(Collectors.toSet());
+
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(idCards, noteIds, location);
+		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(idCards, noteIds, location);
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(userIds, noteIds, location);
+
+		// 限额
+		MonitoringIndicator monitoringIndicator = this.locationLimit(location);
+
+		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
+		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
+		BigDecimal yaoyiLimitAmount = monitoringIndicator.getYaoyiLimitAmount();
+
+		BigDecimal total = BigDecimal.ZERO;
+		for (WmScorePackageSettleNote note : notes) {
+			total = total.add(note.getSettleAmount());
+			BigDecimal monitorAmount = note.getSettleAmount();
+			BigDecimal deptMonitorAmount = note.getSettleAmount();
+			BigDecimal yaoyiMonitorAmount = note.getSettleAmount();
+			SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
+					.equals(note.getIdCardNumber())).findFirst().orElse(null);
+
+			SettleAmountMonitorOutput deptMonitorOutput = deptAmountMonitor.stream().filter(item -> item.getUserId()
+					.equals(note.getUserId())).findFirst().orElse(null);
+
+			SettleAmountMonitorOutput yaoyiMonitorOutput = yaoyiAmountMonitor.stream().filter(item -> item.getIdCardNumber()
+					.equals(note.getIdCardNumber())).findFirst().orElse(null);
+
+			if (null != monitorOutput) {
+				monitorAmount = monitorAmount.add(monitorOutput.getTotalAmount());
+			}
+
+			if (null != deptMonitorOutput) {
+				deptMonitorAmount = deptMonitorAmount.add(deptMonitorOutput.getTotalAmount());
+			}
+
+			if (null != yaoyiMonitorOutput) {
+				yaoyiMonitorAmount = yaoyiMonitorAmount.add(yaoyiMonitorOutput.getTotalAmount());
+			}
+
+			if (null != deptLimit && deptMonitorAmount.compareTo(deptLimit) > 0) {
+				throw new RuntimeException(note.getRealName() + ":超过当月限额");
+			}
+
+			if (null != monitoringLimit && monitorAmount.compareTo(monitoringLimit) > 0) {
+				throw new RuntimeException(note.getRealName() + ":超过结算渠道限额");
+			}
+			if (null != yaoyiLimitAmount && yaoyiMonitorAmount.compareTo(yaoyiLimitAmount) > 0) {
+				throw new RuntimeException(note.getRealName() + ":超过平台限额");
+			}
+		}
+
+		return total;
 	}
 }

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

@@ -36,7 +36,6 @@ import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperBindingCardCodeDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperTokenDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.TaxHelperUserAgreementDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.Record;
-import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleBatch;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleInfo;
 import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
@@ -65,7 +64,6 @@ import com.qunzhixinxi.hnqz.admin.service.WmScorePackageStatusService;
 import com.qunzhixinxi.hnqz.admin.service.WmScoreTaskTypeService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskContentService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
-import com.qunzhixinxi.hnqz.common.ding.config.DingConfig;
 import com.qunzhixinxi.hnqz.common.ding.enums.DingEnum;
 import com.qunzhixinxi.hnqz.common.taxhelper.common.CommonConstants;
 import com.qunzhixinxi.hnqz.common.taxhelper.config.TaxHelperConfig;
@@ -82,7 +80,6 @@ import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperBindingCard
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperGetUserAgreementRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperH5BizTokenRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperSettlementRequest;
-import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequest;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.request.TaxHelperUserAgreementAuthorizationRequestV2;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.response.TaxHelperResponse;
 import com.qunzhixinxi.hnqz.common.taxhelper.enums.TaxHelperCertStatus;
@@ -106,10 +103,10 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 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;
 
 /**
@@ -192,7 +189,7 @@ public class PartyAServiceImpl implements PartyAService {
 
 	private final MonitoringIndicatorService monitoringIndicatorService;
 
-	private final RedisTemplate redisTemplate;
+	private final RedisTemplate<String, Object> redisTemplate;
 
 	private final UserAgreementSignatureRecordMapper userAgreementSignatureRecordMapper;
 
@@ -231,7 +228,7 @@ public class PartyAServiceImpl implements PartyAService {
 		query.setSubjectLocation(SubjectLocation.LUO_SHU_YUN);
 		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, String.valueOf(taxHelperAddMemberDTO.getType()));
+		info = checkoutDeptSubInfo(deptSub, SubjectLocation.LUO_SHU_YUN.getGigType(), String.valueOf(taxHelperAddMemberDTO.getType()));
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -312,7 +309,7 @@ public class PartyAServiceImpl implements PartyAService {
 		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
 		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		info = checkoutDeptSubInfo(deptSub, SubjectLocation.LUO_SHU_YUN.getGigType(), null);
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -429,7 +426,7 @@ public class PartyAServiceImpl implements PartyAService {
 		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
 		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		info = checkoutDeptSubInfo(deptSub, SubjectLocation.LUO_SHU_YUN.getGigType(), null);
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -498,7 +495,7 @@ public class PartyAServiceImpl implements PartyAService {
 		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
 		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		info = checkoutDeptSubInfo(deptSub, SubjectLocation.LUO_SHU_YUN.getGigType(), null);
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -583,7 +580,7 @@ public class PartyAServiceImpl implements PartyAService {
 		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
 		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		info = checkoutDeptSubInfo(deptSub, SubjectLocation.LUO_SHU_YUN.getGigType(), null);
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -653,7 +650,7 @@ public class PartyAServiceImpl implements PartyAService {
 		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
 		query.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.query(query));
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		info = checkoutDeptSubInfo(deptSub, SubjectLocation.LUO_SHU_YUN.getGigType(), null);
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -760,7 +757,8 @@ public class PartyAServiceImpl implements PartyAService {
 		//已分派待申领
 		scorePackage.setScorePackageStatus(ScorePackageStatusEnum.UNCLAIMED.val());
 		scorePackage.setDescription(scorePackageDTO.getDescription());
-		scorePackage.setSubType(scorePackageDTO.getChannel().val());
+		scorePackage.setSubjectLocation(SubjectLocation.LUO_SHU_YUN);
+		scorePackage.setSubType(String.valueOf(SubjectLocation.LUO_SHU_YUN.getGigType().getCode()));
 
 		// 获取企业发包人
 		List<SysUser> userList = userService.list(Wrappers.<SysUser>query().eq("dept_id", scorePackageDTO.getDeptId()));
@@ -1160,29 +1158,15 @@ public class PartyAServiceImpl implements PartyAService {
 		}
 
 		// 设置税源地
-		SubjectLocation subjectLocation = SubjectLocation.LUO_SHU_YUN;
-		if (scorePackageSettleNoteDTO.getChannel().equals(ChannelEnum.TAX_HELPER)) {
-			subjectLocation = SubjectLocation.LUO_SHU_YUN;
-		} else if (scorePackageSettleNoteDTO.getChannel().equals(ChannelEnum.DING)) {
-			subjectLocation = SubjectLocation.REN_LI_JIA;
-		}
-
-		String subType = String.valueOf(subjectLocation.getGigType().getCode());
+		SubjectLocation location = scorePackageSettleNoteDTO.getLocation();
+		String subType = String.valueOf(scorePackageSettleNoteDTO.getLocation().getGigType().getCode());
 
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, scorePackageSettleNoteDTO
-				.getChannel()
-				.val(), subjectLocation);
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
 
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(userIds, ids, scorePackageSettleNoteDTO
-				.getChannel()
-				.val(), subjectLocation);
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(idCard, ids, location);
+		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(idCard, ids, location);
+		Set<Integer> collect = userIds.stream().map(Integer::valueOf).collect(Collectors.toSet());
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(collect, ids, location);
 
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, scorePackageSettleNoteDTO
-				.getChannel()
-				.val(), subjectLocation);
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(member.getIdCardNumber())).findFirst().orElse(null);
@@ -1193,12 +1177,10 @@ public class PartyAServiceImpl implements PartyAService {
 		SettleAmountMonitorOutput yaoyiMonitorOutput = yaoyiAmountMonitor.stream().filter(item -> item.getIdCardNumber()
 				.equals(member.getIdCardNumber())).findFirst().orElse(null);
 
-		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.getBySubType(subType, subjectLocation);
-		SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
-				.eq(SysDeptSub::getDeptId, dept.getDeptId())
-				.eq(SysDeptSub::getSubjectType, note.getSubType())
-				.eq(SysDeptSub::getSubjectLocation, note.getSubjectLocation())
-		);
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
+
+		SysDeptSub sysDeptSub = sysDeptSubService.getDeptSub(dept.getDeptId(), location);
 		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
 		BigDecimal yaoyiMonitoringLimit = monitoringIndicator.getYaoyiLimitAmount();
@@ -1240,6 +1222,7 @@ public class PartyAServiceImpl implements PartyAService {
 			updateEntity = new WmScorePackageSettleNote();
 			updateEntity.setId(note.getId());
 			updateEntity.setSubType(subType);
+			updateEntity.setSubjectLocation(location);
 			updateEntity.setInvoiceType(note.getInvoiceType());
 			updateEntity.setCategoryName(scorePackageSettleNoteDTO.getInvoiceCategory());
 			updateEntity.setSettleAmount(note.getSettleAmount());
@@ -1320,13 +1303,9 @@ public class PartyAServiceImpl implements PartyAService {
 		}
 
 		// 获取并校验结算信息
-		SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
-				.eq(SysDeptSub::getDeptId, execSettlementDTO.getDeptId())
-				.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
-				.eq(SysDeptSub::getSubjectLocation, SubjectLocation.LUO_SHU_YUN)
-		);
+		SysDeptSub deptSub = sysDeptSubService.getDeptSub(execSettlementDTO.getDeptId(), execSettlementDTO.getLocation());
 
-		info = checkoutDeptSubInfo(deptSub, ChannelEnum.TAX_HELPER, null);
+		info = checkoutDeptSubInfo(deptSub, execSettlementDTO.getLocation().getGigType(), null);
 		if (StringUtils.isNotEmpty(info)) {
 			return getResultMap("4000", info);
 		}
@@ -1360,30 +1339,24 @@ public class PartyAServiceImpl implements PartyAService {
 			tmp = tmp.add(note.getSettleAmount());
 		}
 		String errInfo = checkoutSettleLimit(member, noteList.stream().mapToInt(WmScorePackageSettleNote::getId).boxed()
-				.collect(Collectors.toList()), deptSub.getLimitAmount(), tmp);
+				.collect(Collectors.toList()), deptSub.getLimitAmount(), tmp, execSettlementDTO.getLocation());
 		if (StringUtils.isNotEmpty(errInfo)) {
 			log.error(errInfo);
 			return getResultMap("4000", errInfo);
 		}
 
-		log.info("结算渠道: {} ", execSettlementDTO.getSubjectType());
+		log.info("结算税源地: {} ", execSettlementDTO.getLocation());
 		Map<String, String> result = null;
-		if (SubjectTypeEnum.TYPE_RENLIJIA.getCode().equals(execSettlementDTO.getSubjectType())) {
-			DingConfig config = new DingConfig();
-			config.setAppId(deptSub.getAppId());
-			config.setAppSecret(deptSub.getAppSecret());
-			config.setQueryUrl(deptSub.getQueryUrl());
-			String subjectName = deptSub.getSubjectName();
-			// settleByRenLiJia(note, config, wmScorePackage, subjectName);
 
-		} else {
+		if (GigTypeEnum.TAX_HELPOR.equals(execSettlementDTO.getLocation().getGigType())){
 			String taxCode = sysDept.getTaxCode();
 			TaxHelperConfig config = new TaxHelperConfig();
 			config.setAppId(deptSub.getAppId());
 			config.setAppSecrete(deptSub.getAppSecret());
 			config.setQueryUrl(deptSub.getQueryUrl());
 			result = settleByTaxHelper(noteList, config, member, taxCode);
-			// result = settleByTaxHelper();
+		} else {
+			result = getResultMap("4000", "税源地错误");
 		}
 
 		return result;
@@ -1396,23 +1369,16 @@ public class PartyAServiceImpl implements PartyAService {
 	 * @param noteIds      结算记录id
 	 * @param limitAmount  限制金额
 	 * @param settleAmount 本次上传证据链累计金额
+	 * @param location     税源地
 	 * @return 校验错误信息,如果没有错误返回{@code null}
 	 */
-	private String checkoutSettleLimit(SysUser user, List<Integer> noteIds, BigDecimal limitAmount, BigDecimal settleAmount) {
+	private String checkoutSettleLimit(SysUser user, List<Integer> noteIds, BigDecimal limitAmount, BigDecimal settleAmount, SubjectLocation location) {
 
 		String info = null;
 
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
-				.getIdCardNumber()), noteIds, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
-
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(Collections.singletonList(String
-				.valueOf(user.getUserId())), noteIds, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
-
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
-				.getIdCardNumber()), noteIds, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(Collections.singletonList(user.getIdCardNumber()), noteIds, location);
+		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(Collections.singletonList(user.getIdCardNumber()), noteIds, location);
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(Collections.singleton(user.getUserId()), noteIds, location);
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
@@ -1423,8 +1389,7 @@ public class PartyAServiceImpl implements PartyAService {
 		SettleAmountMonitorOutput yaoyiMonitorOutput = yaoyiAmountMonitor.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
 
-		MonitoringIndicator monitoringIndicator =
-				monitoringIndicatorService.getBySubType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
 		BigDecimal yaoyiMonitoringLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitorAmount = settleAmount;
@@ -1743,10 +1708,10 @@ public class PartyAServiceImpl implements PartyAService {
 	 * 校验部门结算信息
 	 *
 	 * @param deptSub 部门结算信息
-	 * @param channel 渠道
+	 * @param gigTypeEnum 渠道
 	 * @return 校验结果
 	 */
-	private String checkoutDeptSubInfo(SysDeptSub deptSub, ChannelEnum channel, String subjectUserType) {
+	private String checkoutDeptSubInfo(SysDeptSub deptSub, GigTypeEnum gigTypeEnum, String subjectUserType) {
 
 		// 校验用户是否存在
 		if (deptSub == null) {
@@ -1761,24 +1726,24 @@ public class PartyAServiceImpl implements PartyAService {
 		}
 
 		// 校验配置属性
-		switch (channel) {
-			case DING:
+		switch (gigTypeEnum) {
+			case REN_LI_JIA:
 				if (StringUtils.isEmpty(deptSub.getAppId()) || StringUtils.isEmpty(deptSub.getAppSecret())
 						|| StringUtils.isEmpty(deptSub.getRsaPublicKey()) || StringUtils.isEmpty(deptSub.getQueryUrl())) {
-					log.error("部门{}结算信息配置不全,请联系要易管理员", channel.type());
+					log.error("部门{}结算信息配置不全,请联系要易管理员", gigTypeEnum.getDesc());
 					return "部门结算信息配置不全,请联系要易管理员";
 				}
 				break;
-			case TAX_HELPER:
+			case TAX_HELPOR:
 				if (StringUtils.isEmpty(deptSub.getAppId()) || StringUtils.isEmpty(deptSub.getAppSecret())
 						|| StringUtils.isEmpty(deptSub.getQueryUrl()) || StringUtils.isEmpty(deptSub.getSubjectUserType())) {
-					log.error("部门{}结算信息配置不全,请联系要易管理员", channel.type());
+					log.error("部门{}结算信息配置不全,请联系要易管理员",  gigTypeEnum.getDesc());
 					return "部门结算信息配置不全,请联系要易管理员";
 				}
 
 				if (StringUtils.isNotEmpty(subjectUserType)) {
 					if (!deptSub.getSubjectUserType().equals(subjectUserType)) {
-						log.error("部门{}传入用户结算类型:{}与系统设置不匹配,请联系要易管理员", channel.type(), subjectUserType);
+						log.error("部门{}传入用户结算类型:{}与系统设置不匹配,请联系要易管理员",  gigTypeEnum.getDesc(), subjectUserType);
 						return "传入用户结算类型+" + subjectUserType + "+与系统设置不匹配,请联系要易管理员";
 					}
 				}

+ 35 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptSubServiceImpl.java

@@ -27,6 +27,7 @@ import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
 import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptSubMapper;
@@ -34,12 +35,15 @@ import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 部门管理
@@ -72,19 +76,44 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 	}
 
 	@Override
-	public List<SettleAmountMonitorOutput> getSettleAmountMonitor(SettleAmountMonitorInput input) {
+	public List<SettleAmountMonitorOutput> getSettleAmountMonitor(List<String> idCards, List<Integer> settleNoteIds, SubjectLocation location) {
+		SettleAmountMonitorInput monitorInput = new SettleAmountMonitorInput(idCards, settleNoteIds, location);
+		return sysDeptSubMapper.getSettleAmountMonitor(monitorInput);
+	}
 
-		return sysDeptSubMapper.getSettleAmountMonitor(input);
+	@Override
+	public List<SettleAmountMonitorOutput> getYaoyiAmountMonitor(List<String> idCards, List<Integer> settleNoteIds, SubjectLocation location) {
+		SettleAmountMonitorInput monitorInput = new SettleAmountMonitorInput(idCards, settleNoteIds, location);
+		return sysDeptSubMapper.getYaoyiAmountMonitor(monitorInput);
 	}
 
 	@Override
-	public List<SettleAmountMonitorOutput> getDeptAmountMonitor(SettleAmountMonitorInput input) {
-		return sysDeptSubMapper.getDeptAmountMonitor(input);
+	public List<SettleAmountMonitorOutput> getDeptAmountMonitor(Set<Integer> userIds, List<Integer> settleNoteIds, SubjectLocation location) {
+		SettleAmountMonitorInput monitorInput = new SettleAmountMonitorInput(userIds, settleNoteIds, location);
+		return sysDeptSubMapper.getDeptAmountMonitor(monitorInput);
 	}
 
+	/**
+	 * 获取税源地的配置信息
+	 *
+	 * @param deptId   部门id
+	 * @param location 税源地
+	 * @return 税源地记录
+	 */
 	@Override
-	public List<SettleAmountMonitorOutput> getYaoyiAmountMonitor(SettleAmountMonitorInput yaoyiMonitorInput) {
-		return sysDeptSubMapper.getYaoyiAmountMonitor(yaoyiMonitorInput);
+	public SysDeptSub getDeptSub(Integer deptId, SubjectLocation location) {
+		// 结算渠道
+		SysDeptSub sysDeptSub = this.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+				.eq(SysDeptSub::getDeptId, deptId)
+				.eq(SysDeptSub::getSubjectLocation, location)
+				.eq(SysDeptSub::getEnableFlag,SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
+		);
+
+		if (null == sysDeptSub || StringUtils.isBlank(sysDeptSub.getAppId())) {
+			throw new RuntimeException("企业结算信息不存在");
+		}
+
+		return sysDeptSub;
 	}
 
 	/**

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

@@ -42,6 +42,7 @@ import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.entity.SysCertResultRecord;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
 import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 import com.qunzhixinxi.hnqz.admin.entity.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.admin.entity.output.UserCertificationOutput;
@@ -187,6 +188,47 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		return errorMap;
 	}
 
+	/**
+	 * 结算时校验用户信息
+	 *
+	 * @param userIds         用户id集合
+	 * @param subjectLocation 结算税源地
+	 */
+	@Override
+	public void checkUserInfoToSettle(Collection<Integer> userIds, SubjectLocation subjectLocation) {
+
+		for (Integer userId : userIds) {
+			SysUser user = this.getById(userId);
+			if (StrUtil.isBlank(user.getIdCardNumber())) {
+				throw new RuntimeException(user.getRealname() + "身份信息缺失,不能发起结算");
+			}
+
+			// 获取结算零工
+			SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery().eq(SysUserSub::getSubjectLocation, subjectLocation).eq(SysUserSub::getUserId, user.getUserId()));
+
+			if (userSub == null) {
+				throw new RuntimeException(user.getRealname() + "人员认证信息不存在,不能结算");
+			}
+
+			switch (subjectLocation.getGigType()) {
+				case REN_LI_JIA:
+				case OLADING:
+					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
+						throw new RuntimeException(user.getRealname() + "未认证,不能发起结算");
+					}
+					break;
+				case TAX_HELPOR:
+					if (!Objects.equals(userSub.getCertStatus(), TaxHelperCertStatus.CERT.getCode())) {
+						throw new RuntimeException(user.getRealname() + "人员未认证或未绑卡,不能结算");
+					}
+					break;
+				default:
+					throw new RuntimeException(user.getRealname() + "人员结算渠道不存在,不能结算");
+			}
+		}
+
+	}
+
 	/**
 	 * 封装错误信息
 	 *
@@ -684,7 +726,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		if (StringUtils.isNotEmpty(sysUser.getIdCardNumber())) {
 			// 获取更新操作的用户角色
 			List<Integer> roles = sysUserRoleService.list(Wrappers.<SysUserRole>lambdaQuery()
-					.eq(SysUserRole::getUserId, sysUser.getUserId()))
+							.eq(SysUserRole::getUserId, sysUser.getUserId()))
 					.stream().mapToInt(SysUserRole::getRoleId).boxed().collect(Collectors.toList());
 			// 如果角色中包含全职和兼职就需要校验身份证年龄
 			if (roles.contains(5) || roles.contains(6)) {
@@ -780,7 +822,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		if (StringUtils.isNotEmpty(sysUser.getIdCardNumber())) {
 			// 获取更新操作的用户角色
 			List<Integer> roles = sysUserRoleService.list(Wrappers.<SysUserRole>lambdaQuery()
-					.eq(SysUserRole::getUserId, sysUser.getUserId()))
+							.eq(SysUserRole::getUserId, sysUser.getUserId()))
 					.stream().mapToInt(SysUserRole::getRoleId).boxed().collect(Collectors.toList());
 			// 如果角色中包含全职和兼职就需要校验身份证年龄
 			if (roles.contains(5) || roles.contains(6)) {

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 167 - 653
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java


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

@@ -1420,8 +1420,8 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 	 * @return
 	 */
 	@Override
-	public IPage<WmScorePackageSettleOutput> listPackageSettleList(Page page, WmScorePackageSettleInput input) {
-		IPage<WmScorePackageSettleOutput> settleListPage = wmScorePackageMapper.listPackageSettleList(page, input);
+	public Page<WmScorePackageSettleOutput> listPackageSettleList(Page<WmScorePackageSettleOutput> page, WmScorePackageSettleInput input) {
+		Page<WmScorePackageSettleOutput> settleListPage = wmScorePackageMapper.listPackageSettleList(page, input);
 		List<WmScorePackageSettleOutput> settleList = settleListPage.getRecords();
 		for (WmScorePackageSettleOutput ouPut : settleList) {
 			WmScorePackageStatus statusQuery = new WmScorePackageStatus();
@@ -2307,4 +2307,17 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 		wmScorePackage.setReportOpt(opt);
 
 	}
+
+	/**
+	 * 校验积分包是否可以结算
+	 *
+	 * @param pkg 基本包
+	 */
+	@Override
+	public void checkPkgToSettle(WmScorePackage pkg) {
+		if (!"0".equals(pkg.getSettleFlag())) {
+			throw new RuntimeException("结算状态异常,请勿重复结算");
+		}
+		;
+	}
 }

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

@@ -180,6 +180,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 	public R saveSettleInfo(WmScorePackageSettleNote note) {
 
 		SysUser user = sysUserService.getById(note.getUserId());
+		SubjectLocation location = note.getSubjectLocation();
 
 		if (StringUtils.isEmpty(user.getIdCardNumber())) {
 			return R.failed(user.getRealname() + "未认证,不能发起结算");
@@ -203,7 +204,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		SysDeptSub condition = new SysDeptSub();
 		condition.setDeptId(user.getDeptId());
 		condition.setSubjectType(subType);
-		condition.setSubjectLocation(note.getSubjectLocation());
+		condition.setSubjectLocation(location);
 		condition.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.query(condition));
 
@@ -219,14 +220,12 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		if (null != note.getId()) {
 			ids.add(note.getId());
 		}
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, subType, note.getSubjectLocation());
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
 
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(userIds, ids, subType, note.getSubjectLocation());
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
 
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, subType, note.getSubjectLocation());
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(Collections.singletonList(user.getIdCardNumber()), ids, location);
+		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(Collections.singletonList(user.getIdCardNumber()), ids, location);
+		Set<Integer> collect = userIds.stream().map(Integer::valueOf).collect(Collectors.toSet());
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(collect, ids, location);
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
@@ -237,7 +236,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		SettleAmountMonitorOutput yaoyiMonitorOutput = yaoyiAmountMonitor.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
 
-		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.getBySubType(subType, note.getSubjectLocation());
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
 		BigDecimal yaoyiLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
@@ -315,6 +315,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 	public R subSettleInfo(WmScorePackageSettleNote note) {
 
 		SysUser user = sysUserService.getById(note.getUserId());
+		SubjectLocation location = note.getSubjectLocation();
 
 		if (StringUtils.isEmpty(user.getIdCardNumber())) {
 			return R.failed(user.getRealname() + "未认证,不能发起结算");
@@ -354,14 +355,10 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		if (null != note.getId()) {
 			ids.add(note.getId());
 		}
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, subType, note.getSubjectLocation());
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
-
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(userIds, ids, subType, note.getSubjectLocation());
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
-
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, subType, note.getSubjectLocation());
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(Collections.singletonList(user.getIdCardNumber()), ids, location);
+		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(Collections.singletonList(user.getIdCardNumber()), ids, location);
+		Set<Integer> collect = userIds.stream().map(Integer::valueOf).collect(Collectors.toSet());
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(collect, ids, location);
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
@@ -372,7 +369,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		SettleAmountMonitorOutput yaoyiMonitorOutput = yaoyiAmountMonitor.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
 
-		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.getBySubType(subType, note.getSubjectLocation());
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
 		BigDecimal yaoyiLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();

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

@@ -2183,7 +2183,7 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 				}
 				preUserSettleAmountMap.put(user, tmp);
 
-				errorInfo = checkoutSettleLimit(user, sysDeptSub.getLimitAmount(), tmp);
+				errorInfo = checkoutSettleLimit(user, sysDeptSub.getLimitAmount(), tmp, scorePackage.getSubjectLocation() );
 				if (StringUtils.isNotEmpty(errorInfo)) {
 					log.error(errorInfo);
 					errorMap(errorMap, errorInfo, commonEvidenceDTO.getId());
@@ -2218,21 +2218,18 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 	 * @param settleAmount 本次上传证据链累计金额
 	 * @return 校验错误信息,如果没有错误返回{@code null}
 	 */
-	private String checkoutSettleLimit(SysUser user, BigDecimal limitAmount, BigDecimal settleAmount) {
+	private String checkoutSettleLimit(SysUser user, BigDecimal limitAmount, BigDecimal settleAmount, SubjectLocation location) {
 
 		String info = null;
 
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
-				.getIdCardNumber()), null, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
 
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(Collections.singletonList(String
-				.valueOf(user.getUserId())), null, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
+		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(Collections.singletonList(user.getIdCardNumber()), null, location);
+		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(Collections.singletonList(user.getIdCardNumber()), null, location);
+		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(Collections.singleton(user.getUserId()), null, location);
+
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
-				.getIdCardNumber()), null, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
@@ -2243,9 +2240,6 @@ public class WmTaskServiceImpl extends ServiceImpl<WmTaskMapper, WmTask> impleme
 		SettleAmountMonitorOutput yaoyiMonitorOutput = yaoyiAmountMonitor.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
 
-
-		MonitoringIndicator monitoringIndicator =
-				monitoringIndicatorService.getBySubType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode(), SubjectLocation.LUO_SHU_YUN);
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
 		BigDecimal yaoyiMonitoringLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitorAmount = settleAmount;

+ 4 - 7
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptSubMapper.xml

@@ -17,11 +17,10 @@
 
 	<select id="getSettleAmountMonitor" resultType="com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput">
 		SELECT
-			t.id_card_number,
-			sum(t.settle_amount) AS totalAmount
+		t.id_card_number,
+		sum(t.settle_amount) AS totalAmount
 		FROM wm_score_package_settle_note t
-		WHERE t.sub_type = #{query.subType,jdbcType=VARCHAR}
-	    AND t.subject_location = #{query.subjectLocation, jdbcType=VARCHAR}
+		WHERE t.subject_location = #{query.subjectLocation, jdbcType=VARCHAR}
 		AND t.create_time &gt; #{query.startTime,jdbcType=TIMESTAMP}
 		AND t.create_time &lt; #{query.endTime,jdbcType=TIMESTAMP}
 		AND t.id_card_number IN
@@ -42,8 +41,7 @@
 		t.user_id,
 		sum(t.settle_amount) AS totalAmount
 		FROM wm_score_package_settle_note t
-		WHERE t.sub_type = #{query.subType,jdbcType=VARCHAR}
-		AND t.subject_location = #{query.subjectLocation, jdbcType=VARCHAR}
+		WHERE t.subject_location = #{query.subjectLocation, jdbcType=VARCHAR}
 		AND t.create_time &gt; #{query.startTime,jdbcType=TIMESTAMP}
 		AND t.create_time &lt; #{query.endTime,jdbcType=TIMESTAMP}
 		AND t.user_id IN
@@ -64,7 +62,6 @@
 		sum(t.settle_amount) AS totalAmount
 		FROM wm_score_package_settle_note t
 		WHERE t.create_time &gt; #{query.startTime,jdbcType=TIMESTAMP}
-		AND t.subject_location = #{query.subjectLocation, jdbcType=VARCHAR}
 		AND t.create_time &lt; #{query.endTime,jdbcType=TIMESTAMP}
 		AND t.id_card_number IN
 		<foreach item="item" index="index" collection="query.idCard" open="(" separator="," close=")">

+ 3 - 2
hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/Test.java

@@ -12,6 +12,7 @@ import com.qunzhixinxi.hnqz.admin.entity.input.Record;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleBatch;
 import com.qunzhixinxi.hnqz.admin.entity.input.TaskSettleInfo;
 import com.qunzhixinxi.hnqz.admin.enums.ChannelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.util.AESUtils;
 import com.qunzhixinxi.hnqz.admin.util.RSAUtils;
 import org.apache.commons.lang3.RandomStringUtils;
@@ -210,7 +211,7 @@ public class Test {
 		ScorePackageSettleNoteDTO scorePackageSettleNoteDTO = new ScorePackageSettleNoteDTO();
 		scorePackageSettleNoteDTO.setPackageId(1689);
 		scorePackageSettleNoteDTO.setAmount("110.45");
-		scorePackageSettleNoteDTO.setChannel(ChannelEnum.TAX_HELPER);
+		scorePackageSettleNoteDTO.setLocation(SubjectLocation.LUO_SHU_YUN);
 		scorePackageSettleNoteDTO.setSettleNoteId(458);
 		scorePackageSettleNoteDTO.setTaskId(152972);
 		scorePackageSettleNoteDTO.setInvoiceType(12);
@@ -247,7 +248,7 @@ public class Test {
 		execSettlementDTO.setAmount("210.90");
 		execSettlementDTO.setPackageId(1689);
 		execSettlementDTO.setDeptId(1611890620);
-		execSettlementDTO.setSubjectType("1");
+		execSettlementDTO.setLocation(SubjectLocation.LUO_SHU_YUN);
 		execSettlementDTO.setMobile("15715700008");
 		SettlementDTO settlementDTO1 = new SettlementDTO();
 		settlementDTO1.setAmount("100.45");

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott