Kaynağa Gözat

merge branch 'feat-20220721-eidcert' into master

Qutong 2 yıl önce
ebeveyn
işleme
9f27f6f101
56 değiştirilmiş dosya ile 2058 ekleme ve 1517 silme
  1. 48 0
      db/v2.0/220720.sql
  2. 6 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/UserDTO.java
  3. 93 4
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
  4. 2 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDeptSubController.java
  5. 3 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDictController.java
  6. 36 43
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
  7. 72 47
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserSignCertController.java
  8. 79 101
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java
  9. 9 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java
  10. 8 4
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/MonitoringIndicator.java
  11. 7 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java
  12. 130 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysUserExtRecord.java
  13. 6 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysUserSub.java
  14. 10 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackage.java
  15. 6 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackageSettleNote.java
  16. 3 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ExecSettlementDTO.java
  17. 3 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ScorePackageSettleNoteDTO.java
  18. 6 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/SettleConfigDTO.java
  19. 7 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/UserSignCertDTO.java
  20. 26 30
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/SettleAmountMonitorInput.java
  21. 22 35
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageSettleInput.java
  22. 3 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageSettleOutput.java
  23. 6 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigBaseInfoModel.java
  24. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigUserInfoModel.java
  25. 6 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/vo/SysUserSubVO.java
  26. 1 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigChannelEnum.java
  27. 1 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java
  28. 25 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/MemberCertState.java
  29. 71 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectLocation.java
  30. 2 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectTypeEnum.java
  31. 14 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserExtRecordMapper.java
  32. 1 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmScorePackageMapper.java
  33. 78 63
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java
  34. 22 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/MonitoringIndicatorService.java
  35. 16 6
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptSubService.java
  36. 28 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserExtRecordService.java
  37. 12 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java
  38. 18 12
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPayOffService.java
  39. 10 4
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageService.java
  40. 27 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/SysUserSignCertService.java
  41. 31 30
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java
  42. 390 187
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/SysUserSignCertServiceImpl.java
  43. 106 10
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/MonitoringIndicatorServiceImpl.java
  44. 51 71
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/PartyAServiceImpl.java
  45. 42 10
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptSubServiceImpl.java
  46. 64 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserExtRecordServiceImpl.java
  47. 55 7
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java
  48. 43 41
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java
  49. 25 25
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java
  50. 184 659
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java
  51. 16 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageServiceImpl.java
  52. 85 74
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageSettleNoteServiceImpl.java
  53. 4 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmSettlementServiceImpl.java
  54. 9 14
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskServiceImpl.java
  55. 12 12
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptSubMapper.xml
  56. 3 2
      hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/Test.java

+ 48 - 0
db/v2.0/220720.sql

@@ -0,0 +1,48 @@
+create table sys_user_ext_record
+(
+    id                   int auto_increment comment '主键id'
+        primary key,
+    user_id              int              not null comment '用户id',
+    dept_id              int              not null comment '部门id',
+    real_name            varchar(30)      null comment '用户姓名',
+    phone                varchar(20)      null comment '手机号',
+    id_card_number       varchar(32)      null comment '身份证号',
+    bank_card_number     varchar(19)      null comment '银行卡号',
+    bank_phone           varchar(11)      null comment '银行预留手机号',
+    id_card_front_url    varchar(255)     null comment '身份证照片-正面',
+    id_card_back_url     varchar(255)     null comment '身份证照片-反面',
+    id_card_front_base64 longtext         null comment '身份证照片-正面base64',
+    id_card_back_base64  longtext         null comment '身份证照片-反面base64',
+    best_frame_url       varchar(255)     null comment '最佳帧照片url',
+    best_frame_base64    longtext         null comment '最佳帧照片base64',
+    etoken               varchar(40)      null comment 'etoken',
+    remark               varchar(255)     null comment '备注',
+    del_flag             char default '0' null comment '删除标记',
+    create_time          datetime         null comment '创建时间',
+    create_user          int              null comment '创建人',
+    update_time          datetime         null comment '更新时间',
+    update_user          int              null comment '更新人'
+)
+    comment '用户认证相关的扩展信息';
+
+
+-- deptSub表新增字段
+alter table sys_dept_sub
+    add subject_location varchar(64) null comment '税源地' after subject_channel;
+
+-- userSub表新增字段
+alter table sys_user_sub
+    add subject_location varchar(64) null comment '税源地' after gig_channel;
+
+-- 结算表新增字段
+alter table wm_score_package_settle_note
+    add subject_location varchar(64) null comment '税源地';
+
+-- 积分包表新增字段
+alter table wm_score_package
+    add subject_location varchar(64) null comment '税源地';
+
+-- 平台限额表新增字段
+alter table monitoring_indicator
+    add subject_location varchar(64) null comment '税源地';
+

+ 6 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/UserDTO.java

@@ -24,6 +24,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import rx.Subscription;
 
 import java.util.List;
 
@@ -62,6 +63,11 @@ public class UserDTO extends SysUser {
 
 	private String subType;
 
+	/**
+	 * 税源地
+	 */
+	private String subjectLocation;
+
 	/**
 	 * 认证状态
 	 */

+ 93 - 4
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -31,6 +31,7 @@ import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.SysCertResultRecord;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserExtRecord;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaAgent;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaDistribution;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEnt;
@@ -58,6 +59,7 @@ import com.qunzhixinxi.hnqz.admin.entity.input.WmWkAlbumApiInput;
 import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.UserSignResultEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.SysCertResultRecordMapper;
@@ -66,6 +68,7 @@ import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
 import com.qunzhixinxi.hnqz.admin.service.SysDictItemService;
 import com.qunzhixinxi.hnqz.admin.service.SysFileService;
 import com.qunzhixinxi.hnqz.admin.service.SysPublicParamService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserExtRecordService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.admin.service.WmAdRecordService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaAgentService;
@@ -124,9 +127,11 @@ import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.ResponseEntity;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.imageio.ImageIO;
@@ -207,6 +212,7 @@ public class ApiController {
 	private final WmUserSignDetailService wmUserSignDetailService;
 	private final WmAdRecordService adRecordService;
 	private final SysUserSignCertService sysUserSignCertService;
+	private final SysUserExtRecordService sysUserExtRecordService;
 
 	@SysLog("通过任务类型获取表单配置")
 	@ApiOperation(value = "任务类型表单配置-通过任务类型获取表单配置", notes = "根据任务类型获取表单配置")
@@ -741,23 +747,34 @@ public class ApiController {
 //				}
 				List<String> subTypeList = subList.stream()
 						.map(SysDeptSub::getSubjectType)
+						.distinct()
 						.collect(Collectors.toList());
 				mapOne.put("subList", subTypeList);
 
+				// 税源地
+				List<SubjectLocation> subjectLocationList = subList.stream()
+						.map(SysDeptSub::getSubjectLocation)
+						.sorted(Comparator.comparing(SubjectLocation::getSort))
+						.collect(Collectors.toList());
+				mapOne.put("subjectLocationList", subjectLocationList);
+
 				// 查询配置了任务类型模板的任务类型
 				mapOne.put("hasTaskTypeTemplate", wmDeptTaskTypeTemplateService.listTaskTypeByDeptId(sysU.getDeptId()));
 
-				// 结算通道
-
+				// 税源地和channel对应关系
 				Map<String, Integer> collect = sysDeptSubService.list(Wrappers.<SysDeptSub>lambdaQuery().eq(SysDeptSub::getDeptId, sysU.getDeptId()))
 						.stream()
-						.collect(Collectors.toMap(SysDeptSub::getSubjectType, SysDeptSub::getSubjectChannel));
+						.collect(Collectors.toMap(sysDeptSub -> sysDeptSub.getSubjectLocation().name(), SysDeptSub::getSubjectChannel));
 				mapOne.put("subjectTypeAndChannel", collect);
 
+
 				// 认证服务信息回显
-				List<SysUserSubVO> userSignCertList = sysUserSignCertService.listUserSignCertForApi(sysU.getUserId());
+				List<SysUserSubVO> userSignCertList = sysUserSignCertService.listUserSignCertForApi(sysU.getUserId(), sysU.getDeptId());
 				mapOne.put("certList", userSignCertList);
 
+				// 查询是否已认证过E证通
+				mapOne.put("existEidResult", sysUserExtRecordService.existUserExtRecord());
+
 				// 获取发起认证的令牌
 				String randomStr;
 
@@ -3954,5 +3971,77 @@ public class ApiController {
 		return R.failed(adRecordService.save(record));
 	}
 
+	/**
+	 * 获取e-token
+	 * <p>
+	 * 每人每天最多获取5次
+	 *
+	 * @return e-token
+	 */
+	@GetMapping(value = "/eid")
+	public R<?> getEidToken(@RequestParam(value = "idCard") String idCard,
+							@RequestParam(value = "realName") String realName,
+							@RequestParam(value = "endType") String endType){
+
+
+		String tokenUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/eid?idCard={idCard}&realName={realName}&endType={endType}";
+
+		ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(tokenUrl, String.class, idCard,realName, endType);
+
+		log.info("获取e-token:{}", tokenResult.getBody());
+
+		cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+		return R.builder().code(jsonObject.getInt("code")).msg(jsonObject.getStr("msg")).data(jsonObject.getStr("data")).build();
+
+
+	}
+
+
+	/**
+	 * 获取合身视频结果
+	 *
+	 * @param token e-token
+	 * @return 合身视频结果
+	 */
+	@GetMapping(value = "/eid/result")
+	public R<?> getEidResult(@RequestParam(value = "token") String token,
+							 @RequestParam(value = "endType") String endType){
+
+
+		String tokenUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/eid/result?token={token}&endType={endType}";
+
+		ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(tokenUrl, String.class, token, endType);
+
+		log.info("获取e-token认证结果:{}", tokenResult.getBody());
+
+		cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+		if (CommonConstants.SUCCESS.equals(jsonObject.getInt("code"))) {
+			cn.hutool.json.JSONObject data = jsonObject.getJSONObject("data");
+			if (data != null) {
+				if (CommonConstants.SUCCESS.equals(data.getInt("compareCode"))) {
+					// 认证成功,则保存
+					SysUserExtRecord userExtRecord = new SysUserExtRecord();
+					userExtRecord.setRealName(data.getStr("realName"));
+					userExtRecord.setIdCardNumber(data.getStr("idCard"));
+					userExtRecord.setBestFrameBase64(data.getStr("bestFrameBase64"));
+					userExtRecord.setBestFrameUrl(data.getStr("bestFrameUrl"));
+					userExtRecord.setIdCardFrontBase64(data.getStr("idCardFrontBase64"));
+					userExtRecord.setIdCardBackBase64(data.getStr("idCardBackBase64"));
+					userExtRecord.setIdCardFrontUrl(data.getStr("idCardFrontUrl"));
+					userExtRecord.setIdCardBackUrl(data.getStr("idCardBackUrl"));
+					userExtRecord.setEtoken(data.getStr("etoken"));
+					sysUserExtRecordService.saveUserExtRecord(userExtRecord);
+				}
+			}
+		}
+
+		return R.builder().code(jsonObject.getInt("code")).msg(jsonObject.getStr("msg")).data(jsonObject.getObj("data")).build();
+
+
+	}
+
+
 
 }

+ 2 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysDeptSubController.java

@@ -89,8 +89,8 @@ public class SysDeptSubController {
 	@PostMapping("/save-settle-config")
 	public R<?> saveSettleConfig(@Valid @RequestBody SettleConfigDTO settleConfigDTO) {
 		for (SettleConfigDTO.DeptSub deptSub : settleConfigDTO.getSubList()) {
-			if (StrUtil.isBlank(deptSub.getSubjectType()) || deptSub.getLimitAmount() == null
-					|| ArrayUtil.isEmpty(deptSub.getSubjectInvoiceCategory())) {
+			if (deptSub.getLimitAmount() == null || ArrayUtil.isEmpty(deptSub.getSubjectInvoiceCategory())
+					|| deptSub.getSubjectLocation() == null) {
 				return R.failed("必填参数为空");
 			}
 		}

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

@@ -83,7 +83,9 @@ public class SysDictController {
 	 */
 	@GetMapping("/page")
 	public R<IPage> getDictPage(Page page, SysDict sysDict) {
-		return R.ok(sysDictService.page(page, Wrappers.query(sysDict)));
+
+		return R.ok(sysDictService.page(page, Wrappers.<SysDict>lambdaQuery().eq(StrUtil.isNotBlank(sysDict.getSystem()), SysDict::getSystem, sysDict.getSystem())
+				.like(StrUtil.isNotBlank(sysDict.getType()), SysDict::getType, sysDict.getType())));
 	}
 
 	/**

+ 36 - 43
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -49,6 +49,7 @@ import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.YeeCertStatus;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
@@ -1434,14 +1435,15 @@ public class SysUserController {
 	 */
 	@GetMapping("/selectUserList")
 	public R selectUserList(Page page, UserDTO userDTO) {
-		if (StrUtil.isNotBlank(userDTO.getSubType())) {
-			String[] gigTypeArr = Stream.of(GigTypeEnum.values())
-					.map(GigTypeEnum::getCode)
-					.map(String::valueOf)
+
+		userDTO.setSubType(null);
+		if (StrUtil.isNotBlank(userDTO.getSubjectLocation())) {
+			String[] locationArr = Stream.of(SubjectLocation.values())
+					.map(SubjectLocation::getType)
 					.toArray(String[]::new);
-			if (!ArrayUtil.containsAny(userDTO.getSubType().split(StrUtil.COMMA), gigTypeArr)) {
-				// 只接收已有的渠道类型值
-				userDTO.setSubType(null);
+			if (!ArrayUtil.containsAny(userDTO.getSubjectLocation().split(StrUtil.COMMA), locationArr)) {
+				// 只接收已有的税源地类型值
+				userDTO.setSubjectLocation(null);
 			}
 		}
 
@@ -1451,9 +1453,13 @@ public class SysUserController {
 		Set<Integer> deptIds = userVosPage.getRecords().stream().map(UserVO::getDeptId).collect(Collectors.toSet());
 
 		if (CollUtil.isNotEmpty(deptIds)) {
-			Map<Integer, Map<String, Integer>> coll = sysDeptSubService.list(Wrappers.<SysDeptSub>lambdaQuery().in(SysDeptSub::getDeptId, deptIds))
+			// 税源地
+			Map<Integer, Map<String, Integer>> coll = sysDeptSubService.list(Wrappers.<SysDeptSub>lambdaQuery()
+					.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
+					.in(SysDeptSub::getDeptId, deptIds))
 					.stream()
-					.collect(Collectors.groupingBy(SysDeptSub::getDeptId, Collectors.toMap(SysDeptSub::getSubjectType, SysDeptSub::getSubjectChannel)));
+					.collect(Collectors.groupingBy(SysDeptSub::getDeptId,
+							Collectors.toMap(sysDeptSub -> sysDeptSub.getSubjectLocation().name(), SysDeptSub::getSubjectChannel)));
 
 			userVosPage.getRecords().forEach(item -> {
 				if ("0".equals(userDTO.getSubType())) {
@@ -1477,6 +1483,7 @@ public class SysUserController {
 			if (CollUtil.isNotEmpty(subList)) {
 				// 查询当前用户认证渠道
 				List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+						.eq(SysUserSub::getDeptId, userVO.getDeptId())
 						.eq(SysUserSub::getUserId, userVO.getUserId()));
 
 				if (CollUtil.isNotEmpty(userSubList)) {
@@ -1497,12 +1504,6 @@ public class SysUserController {
 							case OLADING:
 								userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
 								break;
-							case JIN_YUAN:
-								userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
-								break;
-							case XIN_TAI_ZI:
-								userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
-								break;
 							default:
 						}
 						certList.add(userSubVO);
@@ -1510,8 +1511,8 @@ public class SysUserController {
 					userVO.setCertList(certList);
 
 					// 不同渠道认证名称,封装成中文名称数组格式
-					Map<GigTypeEnum, String> certStatusMap = userSubList.stream()
-							.collect(Collectors.toMap(SysUserSub::getGigType,
+					Map<SubjectLocation, String> certStatusMap = userSubList.stream()
+							.collect(Collectors.toMap(SysUserSub::getSubjectLocation,
 									sysUserSub -> {
 										String certStatuName = "";
 										switch (sysUserSub.getGigType()) {
@@ -1527,42 +1528,34 @@ public class SysUserController {
 											case OLADING:
 												certStatuName = OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).getMessage();
 												break;
-											case JIN_YUAN:
-												certStatuName = OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).getMessage();
-												break;
-											case XIN_TAI_ZI:
-												certStatuName = OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).getMessage();
-												break;
 											default:
 												certStatuName = "";
 										}
 										return certStatuName;
 									}));
-					List<String> subTypeList = subList.stream().map(SysDeptSub::getSubjectType).collect(Collectors.toList());
+					// 该企业配置的所有税源地
+					List<SubjectLocation> subjectLocationList = subList.stream().map(SysDeptSub::getSubjectLocation).collect(Collectors.toList());
+
 					List<String> certStatusNameList = new ArrayList<>();
-					if (subTypeList.contains(String.valueOf(GigTypeEnum.REN_LI_JIA.getCode()))) {
-						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.REN_LI_JIA)) ?
-								RenlijiaCertStatus.CER_STATUS_4.getMessage() : certStatusMap.get(GigTypeEnum.REN_LI_JIA));
-					}
-					if (subTypeList.contains(String.valueOf(GigTypeEnum.TAX_HELPOR.getCode()))) {
-						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.TAX_HELPOR)) ?
-								TaxHelperCertStatus.UN_CERT.getDesc() : certStatusMap.get(GigTypeEnum.TAX_HELPOR));
+					if (subjectLocationList.contains(SubjectLocation.REN_LI_JIA)) {
+						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(SubjectLocation.REN_LI_JIA)) ?
+								RenlijiaCertStatus.CER_STATUS_4.getMessage() : certStatusMap.get(SubjectLocation.REN_LI_JIA));
 					}
-					if (subTypeList.contains(String.valueOf(GigTypeEnum.YEE.getCode()))) {
-						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.YEE)) ?
-								YeeCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.YEE));
+					if (subjectLocationList.contains(SubjectLocation.LUO_SHU_YUN)) {
+						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(SubjectLocation.LUO_SHU_YUN)) ?
+								TaxHelperCertStatus.UN_CERT.getDesc() : certStatusMap.get(SubjectLocation.LUO_SHU_YUN));
 					}
-					if (subTypeList.contains(String.valueOf(GigTypeEnum.OLADING.getCode()))) {
-						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.OLADING)) ?
-								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.OLADING));
+					if (subjectLocationList.contains(SubjectLocation.FEI_YI)) {
+						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(SubjectLocation.FEI_YI)) ?
+								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(SubjectLocation.FEI_YI));
 					}
-					if (subTypeList.contains(String.valueOf(GigTypeEnum.JIN_YUAN.getCode()))) {
-						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.JIN_YUAN)) ?
-								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.JIN_YUAN));
+					if (subjectLocationList.contains(SubjectLocation.JIN_YUAN)) {
+						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(SubjectLocation.JIN_YUAN)) ?
+								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(SubjectLocation.JIN_YUAN));
 					}
-					if (subTypeList.contains(String.valueOf(GigTypeEnum.XIN_TAI_ZI.getCode()))) {
-						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.XIN_TAI_ZI)) ?
-								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.XIN_TAI_ZI));
+					if (subjectLocationList.contains(SubjectLocation.XIN_TAI_ZI)) {
+						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(SubjectLocation.XIN_TAI_ZI)) ?
+								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(SubjectLocation.XIN_TAI_ZI));
 					}
 					userVO.setCertStatusArr(certStatusNameList.toArray(new String[0]));
 				}

+ 72 - 47
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserSignCertController.java

@@ -5,12 +5,18 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserExtRecord;
 import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
+import com.qunzhixinxi.hnqz.admin.service.SysUserExtRecordService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
 import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
@@ -27,6 +33,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -50,6 +57,8 @@ public class SysUserSignCertController {
 
 	private final SysUserService sysUserService;
 
+	private final SysUserSubService sysUserSubService;
+
 	private final RedisTemplate<String, Object> redisTemplate;
 
 	/**
@@ -64,7 +73,7 @@ public class SysUserSignCertController {
 		if (userSignCertDTO.getUserId() == null) {
 			return R.failed("userId不能为空");
 		}
-		if (StrUtil.isBlank(userSignCertDTO.getBankPhone()) || !Validator.isMobile(userSignCertDTO.getBankPhone())) {
+		if (StrUtil.isNotBlank(userSignCertDTO.getBankPhone()) && !Validator.isMobile(userSignCertDTO.getBankPhone())) {
 			return R.failed("银行预留手机号不正确");
 		}
 		if (StrUtil.length(userSignCertDTO.getBankCardNumber()) < 16 || StrUtil.length(userSignCertDTO.getBankCardNumber()) > 19) {
@@ -90,10 +99,10 @@ public class SysUserSignCertController {
 		if (userSignCertDTO.getUserId() == null) {
 			return R.failed("userId不能为空");
 		}
-		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
-			return R.failed("认证渠道不能为空");
+		if (userSignCertDTO.getSubjectLocation() == null) {
+			return R.failed("税源地不能为空");
 		}
-		if (StrUtil.isBlank(userSignCertDTO.getBankPhone()) || !Validator.isMobile(userSignCertDTO.getBankPhone())) {
+		if (StrUtil.isNotBlank(userSignCertDTO.getBankPhone()) && !Validator.isMobile(userSignCertDTO.getBankPhone())) {
 			return R.failed("银行预留手机号不正确");
 		}
 		if (StrUtil.length(userSignCertDTO.getBankCardNumber()) < 16 || StrUtil.length(userSignCertDTO.getBankCardNumber()) > 19) {
@@ -102,10 +111,30 @@ public class SysUserSignCertController {
 		if (StrUtil.isNotBlank(userSignCertDTO.getIdCardNumber()) && !Validator.isCitizenId(userSignCertDTO.getIdCardNumber())) {
 			return R.failed("身份证号不正确");
 		}
+
 		sysUserSignCertService.saveBaseInfo(userSignCertDTO);
+
 		return R.ok();
 	}
 
+	/**
+	 * 签约/增员
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@SysLog("签约/增员")
+	@PostMapping("/sign")
+	public R<?> toSign(@RequestBody UserSignCertDTO userSignCertDTO) {
+		if (userSignCertDTO.getUserId() == null) {
+			return R.failed("userId不能为空");
+		}
+		if (userSignCertDTO.getSubjectLocation() == null) {
+			return R.failed("税源地不能为空");
+		}
+		return sysUserSignCertService.toSign(userSignCertDTO);
+	}
+
 	/**
 	 * 签协议
 	 *
@@ -118,17 +147,13 @@ public class SysUserSignCertController {
 		if (userSignCertDTO.getUserId() == null) {
 			return R.failed("userId不能为空");
 		}
-		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
-			return R.failed("认证渠道不能为空");
-		}
-		if (!userSignCertDTO.getGigTypeList().contains(GigTypeEnum.REN_LI_JIA) && StrUtil.isBlank(userSignCertDTO.getAgreementUrl())) {
-			// 除人力家外,其他都做校验
+		if (StrUtil.isBlank(userSignCertDTO.getAgreementUrl())) {
 			return R.failed("协议不能为空");
 		}
-		List<SysUserSub> userSubList = sysUserSignCertService.listUserSignCert(userSignCertDTO.getUserId(), userSignCertDTO.getGigTypeList());
-		if (CollUtil.isEmpty(userSubList)) {
-			return R.failed("数据异常");
+		if (userSignCertDTO.getSubjectLocation() == null) {
+			return R.failed("税源地不能为空");
 		}
+
 		sysUserSignCertService.signAgreement(userSignCertDTO);
 
 		return R.ok();
@@ -140,23 +165,21 @@ public class SysUserSignCertController {
 	 * @param userSignCertDTO
 	 * @return
 	 */
+	@Deprecated
 	@SysLog("人身验证")
 	@PostMapping("/personal-identity-verification")
 	public R<?> personalIdentityVerification(@RequestBody UserSignCertDTO userSignCertDTO) {
 		if (userSignCertDTO.getUserId() == null) {
 			return R.failed("userId不能为空");
 		}
+		if (userSignCertDTO.getSubjectLocation() == null) {
+			return R.failed("税源地不能为空");
+		}
 		if (!StrUtil.isAllNotBlank(userSignCertDTO.getIdCardFrontUrl(), userSignCertDTO.getIdCardBackUrl(),
 				userSignCertDTO.getCertVideo1Url(), userSignCertDTO.getCertVideo2Url())) {
 			return R.failed("身份证或视频信息不能为空");
 		}
-		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
-			return R.failed("认证渠道不能为空");
-		}
-		List<SysUserSub> userSubList = sysUserSignCertService.listUserSignCert(userSignCertDTO.getUserId(), userSignCertDTO.getGigTypeList());
-		if (CollUtil.isEmpty(userSubList)) {
-			return R.failed("数据异常");
-		}
+
 		sysUserSignCertService.personalIdentityVerification(userSignCertDTO);
 
 		return R.ok();
@@ -189,34 +212,37 @@ public class SysUserSignCertController {
 		if (userSignCertDTO.getUserId() == null) {
 			return R.failed("userId不能为空");
 		}
-		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
-			return R.failed("认证渠道不能为空");
+		if (userSignCertDTO.getSubjectLocation() == null) {
+			return R.failed("税源地不能为空");
+		}
+
+		SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+		if (sysUser == null) {
+			return R.failed("用户不存在");
 		}
-		List<SysUserSub> userSubList = sysUserSignCertService.listUserSignCert(userSignCertDTO.getUserId(), userSignCertDTO.getGigTypeList());
-		if (CollUtil.isEmpty(userSubList)) {
-			return R.failed("数据异常");
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getDeptId, sysUser.getDeptId())
+				.eq(SysUserSub::getUserId, sysUser.getUserId())
+				.eq(SysUserSub::getSubjectLocation, userSignCertDTO.getSubjectLocation()));
+		if (userSub == null) {
+			return R.failed("用户userSub不存在");
 		}
-		for (SysUserSub userSub : userSubList) {
-			if (userSignCertDTO.getGigTypeList().contains(GigTypeEnum.REN_LI_JIA)) {
-				// 人力家不校验
-				continue;
-			}
+		if (!userSignCertDTO.getSubjectLocation().equals(SubjectLocation.REN_LI_JIA)) {
 			if (StrUtil.isBlank(userSub.getAgreementUrl())) {
 				return R.failed("协议不能为空");
 			}
-			if (!StrUtil.isAllNotBlank(userSub.getIdCardBackUrl(), userSub.getIdCardFrontUrl(),
-					userSub.getCertVideo1Url(), userSub.getCertVideo2Url())) {
-				return R.failed("身份证或视频信息不能为空");
-			}
+//			if (!StrUtil.isAllNotBlank(userSub.getIdCardBackUrl(), userSub.getIdCardFrontUrl(),
+//					userSub.getCertVideo1Url(), userSub.getCertVideo2Url())) {
+//				return R.failed("身份证或视频信息不能为空");
+//			}
 		}
 
 		// 过滤出阿拉钉的渠道
-		Collection<GigTypeEnum> oladingTypeList =
-				CollUtil.intersection(userSignCertDTO.getGigTypeList(),
-						CollUtil.toList(GigTypeEnum.OLADING, GigTypeEnum.JIN_YUAN, GigTypeEnum.XIN_TAI_ZI));
-		if (!oladingTypeList.isEmpty()) {
-			List<GigTypeEnum> sortedList = oladingTypeList.stream()
-					.sorted(Comparator.comparing(GigTypeEnum::getCode))
+		Collection<SubjectLocation> oladingList =
+				CollUtil.intersection(CollUtil.toList(userSignCertDTO.getSubjectLocation()), SubjectLocation.getByGigType(GigTypeEnum.OLADING));
+		if (!oladingList.isEmpty()) {
+			List<SubjectLocation> sortedList = oladingList.stream()
+					.sorted(Comparator.comparing(SubjectLocation::getSort))
 					.collect(Collectors.toList());
 			// 选择的渠道的阿拉钉的部分记录到redis
 			String redisKey = CacheConstants.OLADING_CERT_SEND_CHANNEL + userSignCertDTO.getUserId();
@@ -246,9 +272,7 @@ public class SysUserSignCertController {
 		if (StrUtil.isBlank(userSignCertDTO.getBankCardNumber())) {
 			return R.failed("银行卡号不能为空");
 		}
-		sysUserSignCertService.bindCardVerification(userSignCertDTO);
-
-		return R.ok();
+		return sysUserSignCertService.bindCardVerification(userSignCertDTO);
 	}
 
 	/**
@@ -263,12 +287,13 @@ public class SysUserSignCertController {
 		if (userSignCertDTO.getUserId() == null) {
 			return R.failed("userId不能为空");
 		}
-		if (CollUtil.isEmpty(userSignCertDTO.getGigTypeList())) {
-			return R.failed("认证渠道不能为空");
+		if (StrUtil.isBlank(userSignCertDTO.getBankPhone())) {
+			return R.failed("银行预留手机号不能为空");
 		}
-		sysUserSignCertService.bindCardConfirm(userSignCertDTO);
-
-		return R.ok();
+		if (StrUtil.isBlank(userSignCertDTO.getBankCardNumber())) {
+			return R.failed("银行卡号不能为空");
+		}
+		return sysUserSignCertService.bindCardConfirm(userSignCertDTO);
 	}
 
 	/**

+ 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 input 积分包id
+	 * @return 待提交的信息
 	 */
 	@ApiOperation(value = "结算", notes = "结算")
 	@SysLog("结算")
 	@PostMapping("/settleById")
-	public R settleById(@RequestBody WmScorePackageSettleInput input) {
+	public R<?> settleById(@RequestBody WmScorePackageSettleInput input) {
 
-		return wmPayOffService.settleById(input);
+		if (input == null || StrUtil.isBlank(input.getId())) {
+			return R.failed("积分包id缺失");
+		}
+
+		return wmPayOffService.settleById(input.getId());
 	}
 
 
@@ -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 (StringUtils.isEmpty(input.getSubType())) {
-			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.isBlank(input.getId()) || StrUtil.isBlank(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()) || StringUtils.isEmpty(input.getSubType())
-					|| 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);

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

@@ -44,6 +44,7 @@ import com.qunzhixinxi.hnqz.admin.entity.model.excel.BatchPackageExcelModel;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
@@ -2595,6 +2596,14 @@ public class WmScorePackageController {
 				return R.failed("积分包分值必须大于0");
 			}
 		}
+
+		if (StrUtil.isNotBlank(wmScorePackage.getSubjectLocation())){
+			SubjectLocation location = Enum.valueOf(SubjectLocation.class, wmScorePackage.getSubjectLocation());
+			wmScorePackage.setLocation(location);
+			wmScorePackage.setSubType(String.valueOf(location.getGigType().getCode()));
+		}
+
+
 		return wmScorePackageService.addWmScorePackage(wmScorePackage);
 	}
 

+ 8 - 4
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,5 +66,8 @@ public class MonitoringIndicator extends Model<MonitoringIndicator> {
 	 */
 	private BigDecimal yaoyiLimitAmount;
 
-	private String subType;
+	/**
+	 * 税源地
+	 */
+	private SubjectLocation subjectLocation;
 }

+ 7 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java

@@ -3,14 +3,13 @@ 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.SubjectTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
-import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -55,6 +54,12 @@ public class SysDeptSub extends Model<SysDeptSub> {
 	@ApiModelProperty(value = "结算通道")
 	private Integer subjectChannel;
 
+	/**
+	 * 税源地
+	 */
+	@ApiModelProperty(value = "税源地")
+	private SubjectLocation subjectLocation;
+
 	@ApiModelProperty(value = "限额")
 	private BigDecimal limitAmount;
 

+ 130 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysUserExtRecord.java

@@ -0,0 +1,130 @@
+package com.qunzhixinxi.hnqz.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户认证相关的扩展信息实体
+ *
+ * @author lixuesong
+ * @date 2022年07月20日 18:36
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_user_ext_record")
+public class SysUserExtRecord extends Model<SysUserExtRecord> {
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    private Integer userId;
+
+    /**
+     * 部门id
+     */
+    private Integer deptId;
+
+    /**
+     * 用户姓名
+     */
+    private String realName;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    private String idCardNumber;
+
+    /**
+     * 银行卡号
+     */
+    private String bankCardNumber;
+
+    /**
+     * 银行预留手机号
+     */
+    private String bankPhone;
+
+    /**
+     * 身份证照片-正面
+     */
+    private String idCardFrontUrl;
+
+    /**
+     * 身份证照片-反面
+     */
+    private String idCardBackUrl;
+
+    /**
+     * 身份证照片-正面base64
+     */
+    private String idCardFrontBase64;
+
+    /**
+     * 身份证照片-反面base64
+     */
+    private String idCardBackBase64;
+
+    /**
+     * 最佳帧照片url
+     */
+    private String bestFrameUrl;
+
+    /**
+     * 最佳帧照片base64
+     */
+    private String bestFrameBase64;
+
+	/**
+	 * etoken
+	 */
+	private String etoken;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标记
+     */
+    private String delFlag;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 创建人
+     */
+    private Integer createUser;
+
+    /**
+     * 更新时间
+
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 更新人
+     */
+    private Integer updateUser;
+
+}

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysUserSub.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
@@ -50,6 +51,11 @@ public class SysUserSub extends Model<SysUserSub> {
 	 */
 	private GigChannelEnum gigChannel;
 
+	/**
+	 * 税源地
+	 */
+	private SubjectLocation subjectLocation;
+
 	/**
 	 * 回调状态
 	 */

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

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -462,6 +463,15 @@ public class WmScorePackage extends Model<WmScorePackage> {
 	@ApiModelProperty(value = "结算渠道")
 	private String subType;
 
+	/**
+	 * 税源地
+	 */
+	@TableField(exist = false)
+	private String subjectLocation;
+
+	@TableField(value = "sub_location")
+	private SubjectLocation location;
+
 	/**
 	 * 数据来源类型(0:手动上传,1:系统对接)
 	 */

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackageSettleNote.java

@@ -22,6 +22,7 @@ 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.CategoryEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -165,6 +166,11 @@ public class WmScorePackageSettleNote extends Model<WmScorePackageSettleNote> {
 	 */
 	private String subType;
 
+	/**
+	 * 税源地
+	 */
+	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;

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/SettleConfigDTO.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.entity.dto;
 
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
@@ -46,6 +47,11 @@ public class SettleConfigDTO implements Serializable {
 		 */
 		private Integer subjectChannel;
 
+		/**
+		 * 税源地
+		 */
+		private SubjectLocation subjectLocation;
+
 		/**
 		 * 限额
 		 */

+ 7 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/UserSignCertDTO.java

@@ -1,6 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.entity.dto;
 
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -65,8 +66,14 @@ public class UserSignCertDTO implements Serializable {
 	/**
 	 * 零工认证渠道
 	 */
+	@Deprecated
 	private List<GigTypeEnum> gigTypeList;
 
+	/**
+	 * 税源地
+	 */
+	private SubjectLocation subjectLocation;
+
 	/**
 	 * 验证码
 	 */

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

@@ -1,16 +1,18 @@
 package com.qunzhixinxi.hnqz.admin.entity.input;
 
+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 {
@@ -18,43 +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;
 
-	public static SettleAmountMonitorInput fromIdCard(List<String> idCard, List<Integer> ids, String subType) {
-		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;
-
-		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) {
-		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;
+	}
 
-		return input;
+	public SettleAmountMonitorInput(Set<Integer> userIds, List<Integer> settleNoteIds, SubjectLocation location) {
+		this();
+		this.userIds = userIds;
+		this.settleNoteIds = settleNoteIds;
+		this.location = location;
 	}
 }

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

@@ -1,31 +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.common.ding.enums.DingEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 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;
 
@@ -61,43 +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;
 
-	/**
-	 * @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 "";
-	}
+	// 税源地
+	private SubjectLocation subjectLocation;
+
 }

+ 3 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageSettleOutput.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.entity.input;
 
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -55,6 +56,8 @@ public class WmScorePackageSettleOutput {
 
 	private String subType;
 
+	private SubjectLocation subjectLocation;
+
 	/**
 	 * 积分包来源, 0->手动, 1->线上
 	 */

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigBaseInfoModel.java

@@ -2,6 +2,7 @@ package com.qunzhixinxi.hnqz.admin.entity.model;
 
 import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -27,6 +28,11 @@ public class GigBaseInfoModel implements Serializable {
 	 */
 	private GigChannelEnum gigChannel;
 
+	/**
+	 * 税源地
+	 */
+	private SubjectLocation gigLocation;
+
 	/**
 	 * 绑卡操作类型(captcha-获取验证码)
 	 */

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/GigUserInfoModel.java

@@ -98,6 +98,21 @@ public class GigUserInfoModel implements Serializable {
 	 */
 	private String certVideo2;
 
+	/**
+	 * 身份证照片-正面base64
+	 */
+	private String idCardFrontBase64;
+
+	/**
+	 * 身份证照片-反面base64
+	 */
+	private String idCardBackBase64;
+
+	/**
+	 * 最佳帧照片url
+	 */
+	private String bestFrameBase64;
+
 	/**
 	 * 协议签名
 	 */

+ 6 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/vo/SysUserSubVO.java

@@ -3,6 +3,7 @@ package com.qunzhixinxi.hnqz.admin.entity.vo;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import lombok.Data;
 
 import java.time.LocalDateTime;
@@ -41,6 +42,11 @@ public class SysUserSubVO {
 	 */
 	private GigChannelEnum gigChannel;
 
+	/**
+	 * 税源地
+	 */
+	private SubjectLocation subjectLocation;
+
 	/**
 	 * 回调状态
 	 */

+ 1 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigChannelEnum.java

@@ -17,9 +17,7 @@ public enum GigChannelEnum {
 	// 渠道
 	DEFAULT(0, "默认渠道"),
 	CICC(1, "中金"),
-	PINGAN(2, "平安银行"),
-	JIN_YUAN(31, "金园数科"),
-	XIN_TAI_ZI(32, "河南薪泰梓");
+	PING_AN_BANK(2, "平安银行");
 
 	@EnumValue
 	private int code;

+ 1 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java

@@ -18,9 +18,7 @@ public enum GigTypeEnum {
 	REN_LI_JIA(0, "人力家", "人力家"),
 	TAX_HELPOR(1, "税邦云", "税邦云"),
 	OLADING(2, "钉灵工", "钉灵工-海南飞亿"),
-	YEE(3, "易联数科", "易联数科"),
-	JIN_YUAN(4, "钉灵工", "金园数科"),
-	XIN_TAI_ZI(5, "钉灵工", "钉灵工-河南薪泰梓");
+	YEE(3, "易联数科", "易联数科");
 
 	@EnumValue
 	private int code;

+ 25 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/MemberCertState.java

@@ -0,0 +1,25 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+// 会员认证信息
+@Getter
+@AllArgsConstructor
+public enum MemberCertState {
+
+
+	UN_CERT("UN_CERT", "未认证"),
+	SIGNED("SIGNED", "已签约"),
+	BOUND("BOUND", "已绑卡"),
+	AGREEMENT("AGREEMENT", "已签协议"),
+	CHECKED("CHECKED", "已合身"),
+	CERT("CERT", "已认证");
+
+	@EnumValue
+	private final String state;
+
+	private final String message;
+
+}

+ 71 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectLocation.java

@@ -0,0 +1,71 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 税源地
+ */
+@Getter
+@AllArgsConstructor
+public enum SubjectLocation {
+
+	// 仁励家通道
+	REN_LI_JIA("REN_LI_JIA", GigTypeEnum.REN_LI_JIA, "仁励家", 0),
+
+	// 税邦云通道
+	ZHONG_YING("ZHONG_YING", GigTypeEnum.TAX_HELPOR, "湖南众盈", 1),
+	LUO_SHU_YUN("LUO_SHU_YUN", GigTypeEnum.TAX_HELPOR, "永州罗数云", 2),
+
+	// 钉零工通道
+	FEI_YI("FEI_YI", GigTypeEnum.OLADING, "海南飞亿", 3),
+	JIN_YUAN("JIN_YUAN", GigTypeEnum.OLADING, "金园数科", 4),
+	XIN_TAI_ZI("XIN_TAI_ZI", GigTypeEnum.OLADING, "河南薪泰梓", 5),
+
+	// 易联
+	YI_LIAN("YI_LIAN", GigTypeEnum.YEE, "易联数科", 6);
+
+	@EnumValue
+	private final String type;
+
+	private final GigTypeEnum gigType;
+
+	private final String description;
+
+	private final Integer sort;
+
+	/**
+	 * 根据gigType获取枚举
+	 *
+	 * @param gigType
+	 * @return
+	 */
+	public static List<SubjectLocation> getByGigType(GigTypeEnum gigType) {
+		List<SubjectLocation> list = new ArrayList<>();
+		for (SubjectLocation subjectLocation : SubjectLocation.values()) {
+			if (subjectLocation.gigType.equals(gigType)) {
+				list.add(subjectLocation);
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * 根据type获取枚举
+	 *
+	 * @param type
+	 * @return
+	 */
+	public static SubjectLocation resolve(String type) {
+		for (SubjectLocation subjectLocation: SubjectLocation.values()){
+			if (subjectLocation.type.equals(type)){
+				return subjectLocation;
+			}
+		}
+		return null;
+	}
+}

+ 2 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectTypeEnum.java

@@ -14,8 +14,8 @@ public enum SubjectTypeEnum {
 	TYPE_SHUIBANGYUN("1", "税邦云"),
 	TYPE_OLADING("2", "自由职家"),
 	TYPE_YEE("3", "易联数科"),
-	TYPE_JIN_YUAN("4", "金园数科"),
-	TYPE_XIN_TAI_ZI("5", "薪泰梓"),
+//	TYPE_JIN_YUAN("4", "金园数科"),
+//	TYPE_XIN_TAI_ZI("5", "薪泰梓"),
 
 
 	ENABLE_FLAG_FALSE("0", "无效"),

+ 14 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserExtRecordMapper.java

@@ -0,0 +1,14 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserExtRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* 用户认证相关的扩展信息Mapper
+*/
+@Mapper
+public interface SysUserExtRecordMapper extends BaseMapper<SysUserExtRecord> {
+
+
+}

+ 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);
 
 	/**
 	 * 结算包结算列表

+ 78 - 63
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java

@@ -20,6 +20,7 @@ import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
 import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
@@ -118,10 +119,10 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 						switch (gigTypeEnum) {
 							case TAX_HELPOR:
 								this.taxHelperHandler(user, dept, subjectResult);
-								// 本次结果存入redis
-								log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(subjectTypes));
-								redisTemplate.opsForValue().set(CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId(),
-										JSONUtil.toJsonStr(subjectTypes), 1, TimeUnit.MINUTES);
+//								// 本次结果存入redis
+//								log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(subjectTypes));
+//								redisTemplate.opsForValue().set(CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId(),
+//										JSONUtil.toJsonStr(subjectTypes), 1, TimeUnit.MINUTES);
 								break;
 							case REN_LI_JIA:
 								// TODO
@@ -164,12 +165,13 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
 				.eq(SysUserSub::getUserId, user.getUserId())
 				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.LUO_SHU_YUN)
+				.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR)
 				.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
 				.set(SysUserSub::getUpdateTime, now)
 				.set(SysUserSub::getUpdateUser, 0)
-				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
-		updateWrapper.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR);
-		updateWrapper.set(SysUserSub::getCertStatus, taxHelperCertStatus.getCode());
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult))
+				.set(SysUserSub::getCertStatus, taxHelperCertStatus.getCode());
 
 		// 如果认证失败了, 置空身份证和合身视频
 		if (TaxHelperCertStatus.UNCHECKED_BIND.equals(taxHelperCertStatus)){
@@ -180,27 +182,36 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		}
 
 
-		if (TAXHELPER_SUCCESS_CODE.equals(code)) {
-			// 成功并且是换绑卡的情况,则更新银行卡号
-			String cacheKeyPrefix = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD,
-					user.getUserId(), GigTypeEnum.TAX_HELPOR.name());
-			UserSignCertDTO userSignCertDTO = (UserSignCertDTO) redisTemplate.opsForValue().get(cacheKeyPrefix);
-			if (userSignCertDTO != null) {
-				if (StrUtil.isNotBlank(userSignCertDTO.getBankCardNumber())) {
-					updateWrapper.set(SysUserSub::getBankCardNumber, userSignCertDTO.getBankCardNumber());
-					updateWrapper.set(SysUserSub::getBankPhone, userSignCertDTO.getBankPhone());
-					// 更新user表银行卡
-					SysUser sysUser = new SysUser();
-					sysUser.setUserId(user.getUserId());
-					sysUser.setBankCardNumber(userSignCertDTO.getBankCardNumber());
-					sysUser.setBankPhone(userSignCertDTO.getBankPhone());
-					sysUserService.updateById(sysUser);
-				}
-				// redis删除银行卡号
-				redisTemplate.delete(cacheKeyPrefix);
-			}
-		}
+//		if (TAXHELPER_SUCCESS_CODE.equals(code)) {
+//			// 成功并且是换绑卡的情况,则更新银行卡号
+//			String cacheKeyPrefix = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD,
+//					user.getUserId(), GigTypeEnum.TAX_HELPOR.name());
+//			UserSignCertDTO userSignCertDTO = (UserSignCertDTO) redisTemplate.opsForValue().get(cacheKeyPrefix);
+//			if (userSignCertDTO != null) {
+//				if (StrUtil.isNotBlank(userSignCertDTO.getBankCardNumber())) {
+//					updateWrapper.set(SysUserSub::getBankCardNumber, userSignCertDTO.getBankCardNumber());
+//					updateWrapper.set(SysUserSub::getBankPhone, userSignCertDTO.getBankPhone());
+//					// 更新user表银行卡
+//					SysUser sysUser = new SysUser();
+//					sysUser.setUserId(user.getUserId());
+//					sysUser.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+//					sysUser.setBankPhone(userSignCertDTO.getBankPhone());
+//					sysUserService.updateById(sysUser);
+//				}
+//				// redis删除银行卡号
+//				redisTemplate.delete(cacheKeyPrefix);
+//			}
+//		}
 		sysUserSubService.update(updateWrapper);
+
+		// 结果放到redis
+		Map<String, Map<String, String>> resultMap = new HashMap<>(1);
+		Map<String, String> subMap = new HashMap<>(1);
+		subMap.put("certStatus", certStatus);
+		resultMap.put("LUO_SHU_YUN", subMap);
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId();
+		log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(resultMap));
+		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(resultMap), 1, TimeUnit.MINUTES);
 	}
 
 	/**
@@ -219,12 +230,14 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
 				.eq(SysUserSub::getDeptId, dept.getDeptId())
 				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.YI_LIAN)
 				.eq(SysUserSub::getGigType, GigTypeEnum.YEE));
 		// 拼接更新条件
 		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
 				.eq(SysUserSub::getUserId, user.getUserId())
 				.eq(SysUserSub::getDeptId, dept.getDeptId())
 				.eq(SysUserSub::getGigType, GigTypeEnum.YEE)
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.YI_LIAN)
 				.set(SysUserSub::getUpdateTime, now)
 				.set(SysUserSub::getUpdateUser, 0)
 				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
@@ -249,7 +262,7 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 			// 结果放到redis
 			String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
 			Map<String, Object> result = MapUtil.newHashMap(1);
-			result.put("YEE", subMap);
+			result.put("YI_LIAN", subMap);
 			redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
 		}
 		// 已认证,则设置回调状态
@@ -281,21 +294,21 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		// 根据选择的渠道,分别更新并查询认证状态
 		Map<String, Map<String, String>> certResultMap = new LinkedHashMap<>(3);
 		gigTypeArray.forEach(o -> certResultMap.put(String.valueOf(o),
-				this.oladingChannelHandler(user, dept, subjectResult, Enum.valueOf(GigTypeEnum.class, String.valueOf(o)))));
+				this.oladingChannelHandler(user, dept, subjectResult, Enum.valueOf(SubjectLocation.class, String.valueOf(o)))));
 
 		// 结果放到redis
 		Map<String, Map<String, String>> resultMap = new HashMap<>(3);
 		if (gigTypeArray.size() > 1) {
 			// 同时发起的情况,且是前一个渠道(按照redis存的渠道顺序发送)的状态已返回,则刷新状态到redis
-			List<GigTypeEnum> gigTypeEnumList = gigTypeArray.stream()
-					.map(o -> Enum.valueOf(GigTypeEnum.class, String.valueOf(o)))
+			List<SubjectLocation> subjectLocationList = gigTypeArray.stream()
+					.map(o -> Enum.valueOf(SubjectLocation.class, String.valueOf(o)))
 					.collect(Collectors.toList());
 			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, user.getUserId())
 					.eq(SysUserSub::getDeptId, dept.getDeptId())
-					.in(SysUserSub::getGigType, gigTypeEnumList));
+					.in(SysUserSub::getSubjectLocation, subjectLocationList));
 			Map<String, Map<String, String>> dbResultMap = subList.stream()
-					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getSubjectLocation().name(),
 							sysUserSub -> MapUtil.builder("certStatus",
 									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
 			resultMap.putAll(dbResultMap);
@@ -308,30 +321,30 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(resultMap), 1, TimeUnit.MINUTES);
 
 		// 处理同时发起时阿拉丁多个渠道的情况(补发)
-		if (gigTypeArray.size() > 1) {
-			String firstChannel = String.valueOf(gigTypeArray.get(0));
-			// 查询阿拉丁第一个渠道的认证状态
-			Map<String, String> certStatusMap = resultMap.get(firstChannel);
-			// 查询阿拉钉第一个未签约的渠道
-			String toSendChannel = "";
-			for (Map.Entry<String, Map<String, String>> entry : resultMap.entrySet()) {
-				if (OladingCertStatus.UN_SIGNED.name().equals(entry.getValue().get("certStatus"))) {
-					toSendChannel = entry.getKey();
-					break;
-				}
-			}
-			// 校验需要补发的渠道,是否为第一个
-			if (StrUtil.isNotBlank(toSendChannel) && !StrUtil.equals(firstChannel, toSendChannel)) {
-				// 如果阿拉丁第一个渠道是已认证的,则补发下一个阿拉丁的渠道(由于阿拉钉同一人不同渠道的回调只有一次,所以这里出现多个渠道需要依次补发)
-				if (CollUtil.isNotEmpty(certStatusMap) && OladingCertStatus.CERT.name().equals(certStatusMap.get("certStatus"))) {
-					log.info("=============================补发阿拉钉另一渠道MQ:{}==================================", toSendChannel);
-					UserSignCertDTO reCertDTO = new UserSignCertDTO();
-					reCertDTO.setUserId(user.getUserId());
-					reCertDTO.setGigTypeList(Collections.singletonList(Enum.valueOf(GigTypeEnum.class, toSendChannel)));
-					sysUserSignCertService.batchChannelCert(reCertDTO);
-				}
-			}
-		}
+//		if (gigTypeArray.size() > 1) {
+//			String firstChannel = String.valueOf(gigTypeArray.get(0));
+//			// 查询阿拉丁第一个渠道的认证状态
+//			Map<String, String> certStatusMap = resultMap.get(firstChannel);
+//			// 查询阿拉钉第一个未签约的渠道
+//			String toSendChannel = "";
+//			for (Map.Entry<String, Map<String, String>> entry : resultMap.entrySet()) {
+//				if (OladingCertStatus.UN_SIGNED.name().equals(entry.getValue().get("certStatus"))) {
+//					toSendChannel = entry.getKey();
+//					break;
+//				}
+//			}
+//			// 校验需要补发的渠道,是否为第一个
+//			if (StrUtil.isNotBlank(toSendChannel) && !StrUtil.equals(firstChannel, toSendChannel)) {
+//				// 如果阿拉丁第一个渠道是已认证的,则补发下一个阿拉丁的渠道(由于阿拉钉同一人不同渠道的回调只有一次,所以这里出现多个渠道需要依次补发)
+//				if (CollUtil.isNotEmpty(certStatusMap) && OladingCertStatus.CERT.name().equals(certStatusMap.get("certStatus"))) {
+//					log.info("=============================补发阿拉钉另一渠道MQ:{}==================================", toSendChannel);
+//					UserSignCertDTO reCertDTO = new UserSignCertDTO();
+//					reCertDTO.setUserId(user.getUserId());
+//					reCertDTO.setGigTypeList(Collections.singletonList(Enum.valueOf(GigTypeEnum.class, toSendChannel)));
+//					sysUserSignCertService.batchChannelCert(reCertDTO);
+//				}
+//			}
+//		}
 	}
 
 	/**
@@ -340,10 +353,10 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 	 * @param user
 	 * @param dept
 	 * @param subjectResult
-	 * @param gigType
+	 * @param subjectLocation
 	 * @return
 	 */
-	private Map<String, String> oladingChannelHandler(SysUser user, SysDept dept, JSONObject subjectResult, GigTypeEnum gigType) {
+	private Map<String, String> oladingChannelHandler(SysUser user, SysDept dept, JSONObject subjectResult, SubjectLocation subjectLocation) {
 		String certStatus = subjectResult.getStr("certStatus");
 		String uploadTaxPayerAgreementStatus = subjectResult.getStr("uploadTaxPayerAgreementStatus");
 		LocalDateTime now = LocalDateTime.now();
@@ -355,7 +368,8 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 				.eq(SysUserSub::getDeptId, dept.getDeptId())
 				.eq(SysUserSub::getUserId, user.getUserId())
 				.eq(SysUserSub::getCallbackStatus, GigCallBackStatus.IN_PROGRESS)
-				.eq(SysUserSub::getGigType, gigType));
+				.eq(SysUserSub::getGigType, subjectLocation.getGigType())
+				.eq(SysUserSub::getSubjectLocation, subjectLocation));
 		if (userSub == null) {
 			return certStatusMap;
 		}
@@ -364,7 +378,8 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
 				.eq(SysUserSub::getUserId, user.getUserId())
 				.eq(SysUserSub::getDeptId, dept.getDeptId())
-				.eq(SysUserSub::getGigType, gigType)
+				.eq(SysUserSub::getGigType, subjectLocation.getGigType())
+				.eq(SysUserSub::getSubjectLocation, subjectLocation)
 				.set(SysUserSub::getUpdateTime, now)
 				.set(SysUserSub::getUpdateUser, 0)
 				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
@@ -374,18 +389,18 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 			// 如果是已上传协议成功,则设置为已认证,否则还是已签约
 			if (OladingCommonRequest.UploadTaxpayerAgreementStatus.SUCCESS.name().equals(uploadTaxPayerAgreementStatus)) {
 				updateWrapper.set(SysUserSub::getCertStatus, Integer.parseInt(OladingCertStatus.CERT.getCode()));
+				updateWrapper.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED);
 				certStatusMap.put("certStatus", OladingCertStatus.CERT.name());
 			} else {
 				updateWrapper.set(SysUserSub::getCertStatus, Integer.parseInt(OladingCertStatus.SIGNED.getCode()));
 				certStatusMap.put("certStatus", OladingCertStatus.SIGNED.name());
 			}
-			updateWrapper.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED);
 		}
 		// 如果是签约中,则判断'阿拉丁签约方法'状态
 		if (OladingCommonRequest.SignUpStatus.SIGNING.name().equals(certStatus)) {
 			JSONObject stageResult = subjectResult.getJSONObject("stageResult");
 			JSONObject oladingSignUpResult = stageResult.getJSONObject("阿拉丁签约方法");
-			if (oladingSignUpResult == null || StrUtil.equals("1005", oladingSignUpResult.getStr("code"))) {
+			if (oladingSignUpResult != null && StrUtil.equals("1005", oladingSignUpResult.getStr("code"))) {
 				updateWrapper.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED);
 			}
 		}

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

@@ -19,6 +19,12 @@ 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;
 
 /**
  * 风险监控
@@ -28,5 +34,20 @@ import com.qunzhixinxi.hnqz.admin.entity.MonitoringIndicator;
  */
 public interface MonitoringIndicatorService extends IService<MonitoringIndicator> {
 
-	MonitoringIndicator getBySubType(String subType);
+	/**
+	 * 获取税源地限额
+	 *
+	 * @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);
 }

+ 28 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserExtRecordService.java

@@ -0,0 +1,28 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserExtRecord;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+
+/**
+* 用户认证相关的扩展信息服务
+*/
+public interface SysUserExtRecordService extends IService<SysUserExtRecord> {
+
+	/**
+	 * 保存E证通认证结果
+	 *
+	 * @param userExtRecord
+	 */
+	void saveUserExtRecord(SysUserExtRecord userExtRecord);
+
+	/**
+	 * 查询E证通是否认证过
+	 *
+	 * @return
+	 */
+	boolean existUserExtRecord();
+}

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

+ 27 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/SysUserSignCertService.java

@@ -4,8 +4,11 @@ import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
 import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
 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.List;
+import java.util.Map;
 
 /**
  * 用户签约认证服务
@@ -36,9 +39,20 @@ public interface SysUserSignCertService {
 	 * 查询用户签约认证信息
 	 *
 	 * @param userId
+	 * @param deptId
 	 * @return
 	 */
-	List<SysUserSubVO> listUserSignCertForApi(Integer userId);
+	List<SysUserSubVO> listUserSignCertForApi(Integer userId, Integer deptId);
+
+	/**
+	 * 查询用户认证状态
+	 *
+	 * @param idCard
+	 * @param enterprisCode
+	 * @param subjectChannel
+	 * @return
+	 */
+	Map<String, Object> listCertInfo(String idCard, String enterprisCode, List<SubjectLocation> subjectChannel);
 
 	/**
 	 * 保存用户基础信息
@@ -74,13 +88,23 @@ public interface SysUserSignCertService {
 	 * 税邦云发送绑卡验证码
 	 *
 	 * @param userSignCertDTO
+	 * @return
 	 */
-    void bindCardVerification(UserSignCertDTO userSignCertDTO);
+    R<?> bindCardVerification(UserSignCertDTO userSignCertDTO);
 
 	/**
 	 * 绑卡确认
 	 *
 	 * @param userSignCertDTO
+	 * @return
+	 */
+	R<Object> bindCardConfirm(UserSignCertDTO userSignCertDTO);
+
+	/**
+	 * 签约/增员
+	 *
+	 * @param userSignCertDTO
+	 * @return
 	 */
-	void bindCardConfirm(UserSignCertDTO userSignCertDTO);
+	R<?> toSign(UserSignCertDTO userSignCertDTO);
 }

+ 31 - 30
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java

@@ -15,6 +15,7 @@ import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageSettleNoteService;
@@ -280,18 +281,18 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 		// 查询redis是否有同时发起的标记,查询出对应的状态放到redis
 		String oladingRedisKey = CacheConstants.OLADING_CERT_SEND_CHANNEL + userSub.getUserId();
-		String gigTypeJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
-		if (JSONUtil.isJsonArray(gigTypeJson)) {
-			JSONArray gigTypeArray = JSONUtil.parseArray(gigTypeJson);
-			List<GigTypeEnum> gigTypeEnumList = gigTypeArray.stream()
-					.map(o -> Enum.valueOf(GigTypeEnum.class, String.valueOf(o)))
+		String subjectLocationJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
+		if (JSONUtil.isJsonArray(subjectLocationJson)) {
+			JSONArray subjectLocationArray = JSONUtil.parseArray(subjectLocationJson);
+			List<SubjectLocation> subjectLocationList = subjectLocationArray.stream()
+					.map(o -> Enum.valueOf(SubjectLocation.class, String.valueOf(o)))
 					.collect(Collectors.toList());
 			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, userSub.getUserId())
 					.eq(SysUserSub::getDeptId, userSub.getDeptId())
-					.in(SysUserSub::getGigType, gigTypeEnumList));
+					.in(SysUserSub::getSubjectLocation, subjectLocationList));
 			Map<String, Map<String, String>> dbResultMap = subList.stream()
-					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getSubjectLocation().name(),
 							sysUserSub -> MapUtil.builder("certStatus",
 									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
 			result.putAll(dbResultMap);
@@ -301,13 +302,13 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
 
 		// 如果成功,则发送证照上传MQ
-		if (OladingCommonRequest.SignUpStatus.SIGN.equals(signUpCertStatus)) {
-			log.info("=============================发送证照上传MQ==================================");
-			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
-			userSignCertDTO.setUserId(userSub.getUserId());
-			userSignCertDTO.setGigTypeList(Collections.singletonList(userSub.getGigType()));
-			sysUserSignCertService.batchChannelCert(userSignCertDTO);
-		}
+//		if (OladingCommonRequest.SignUpStatus.SIGN.equals(signUpCertStatus)) {
+//			log.info("=============================发送证照上传MQ==================================");
+//			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
+//			userSignCertDTO.setUserId(userSub.getUserId());
+//			userSignCertDTO.setGigTypeList(Collections.singletonList(userSub.getGigType()));
+//			sysUserSignCertService.batchChannelCert(userSignCertDTO);
+//		}
 	}
 
 	/**
@@ -356,18 +357,18 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 		// 查询redis是否有同时发起的标记,查询出对应的状态放到redis
 		String oladingRedisKey = CacheConstants.OLADING_CERT_SEND_CHANNEL + userSub.getUserId();
-		String gigTypeJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
-		if (JSONUtil.isJsonArray(gigTypeJson)) {
-			JSONArray gigTypeArray = JSONUtil.parseArray(gigTypeJson);
-			List<GigTypeEnum> gigTypeEnumList = gigTypeArray.stream()
-					.map(o -> Enum.valueOf(GigTypeEnum.class, String.valueOf(o)))
+		String subjectLocationJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
+		if (JSONUtil.isJsonArray(subjectLocationJson)) {
+			JSONArray subjectLocationArray = JSONUtil.parseArray(subjectLocationJson);
+			List<SubjectLocation> subjectLocationList = subjectLocationArray.stream()
+					.map(o -> Enum.valueOf(SubjectLocation.class, String.valueOf(o)))
 					.collect(Collectors.toList());
 			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, userSub.getUserId())
 					.eq(SysUserSub::getDeptId, userSub.getDeptId())
-					.in(SysUserSub::getGigType, gigTypeEnumList));
+					.in(SysUserSub::getSubjectLocation, subjectLocationList));
 			Map<String, Map<String, String>> dbResultMap = subList.stream()
-					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getSubjectLocation().name(),
 							sysUserSub -> MapUtil.builder("certStatus",
 									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
 			result.putAll(dbResultMap);
@@ -382,7 +383,7 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 			log.info("=============================发送协议上传MQ==================================");
 			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
 			userSignCertDTO.setUserId(userSub.getUserId());
-			userSignCertDTO.setGigTypeList(Collections.singletonList(userSub.getGigType()));
+			userSignCertDTO.setSubjectLocation(userSub.getSubjectLocation());
 			sysUserSignCertService.batchChannelCert(userSignCertDTO);
 		}
 	}
@@ -431,18 +432,18 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 		// 查询redis是否有同时发起的标记,查询出对应的状态放到redis
 		String oladingRedisKey = CacheConstants.OLADING_CERT_SEND_CHANNEL + userSub.getUserId();
-		String gigTypeJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
-		if (JSONUtil.isJsonArray(gigTypeJson)) {
-			JSONArray gigTypeArray = JSONUtil.parseArray(gigTypeJson);
-			List<GigTypeEnum> gigTypeEnumList = gigTypeArray.stream()
-					.map(o -> Enum.valueOf(GigTypeEnum.class, String.valueOf(o)))
+		String subjectLocationJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
+		if (JSONUtil.isJsonArray(subjectLocationJson)) {
+			JSONArray subjectLocationArray = JSONUtil.parseArray(subjectLocationJson);
+			List<SubjectLocation> subjectLocationList = subjectLocationArray.stream()
+					.map(o -> Enum.valueOf(SubjectLocation.class, String.valueOf(o)))
 					.collect(Collectors.toList());
 			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, userSub.getUserId())
 					.eq(SysUserSub::getDeptId, userSub.getDeptId())
-					.in(SysUserSub::getGigType, gigTypeEnumList));
+					.in(SysUserSub::getSubjectLocation, subjectLocationList));
 			Map<String, Map<String, String>> dbResultMap = subList.stream()
-					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getSubjectLocation().name(),
 							sysUserSub -> MapUtil.builder("certStatus",
 									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
 			result.putAll(dbResultMap);
@@ -456,7 +457,7 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 			log.info("=============================发送核身视频上传MQ==================================");
 			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
 			userSignCertDTO.setUserId(userSub.getUserId());
-			userSignCertDTO.setGigTypeList(Collections.singletonList(userSub.getGigType()));
+			userSignCertDTO.setSubjectLocation(userSub.getSubjectLocation());
 			userSignCertDTO.setUploadFaceID(true);
 			sysUserSignCertService.batchChannelCert(userSignCertDTO);
 		}

+ 390 - 187
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/SysUserSignCertServiceImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -15,12 +17,14 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.config.TaxNotifyConfig;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserExtRecord;
 import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
 import com.qunzhixinxi.hnqz.admin.entity.model.GigBaseInfoModel;
 import com.qunzhixinxi.hnqz.admin.entity.model.GigInfoModel;
 import com.qunzhixinxi.hnqz.admin.entity.model.GigUserInfoModel;
 import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
@@ -30,14 +34,18 @@ import com.qunzhixinxi.hnqz.admin.enums.MemberType;
 import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.PayChannel;
 import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.YeeCertStatus;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserExtRecordService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
 import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import com.qunzhixinxi.hnqz.common.core.entity.BaseMap;
+import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.rabbitmq.client.RabbitMqClient;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
@@ -79,6 +87,8 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 
 	private final SysDeptService sysDeptService;
 
+	private final SysUserExtRecordService sysUserExtRecordService;
+
 	private final RabbitMqClient rabbitMqClient;
 
 	private final UpmsConfig upmsConfig;
@@ -87,6 +97,21 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 
 	private final RedisTemplate redisTemplate;
 
+	/**
+	 * 查询会员认证结果接口url
+	 */
+	private static final String GIG_CERT_STATE = "/gig/v2/operation/cert/state";
+
+	/**
+	 * 签约接口url
+	 */
+	private static final String GIG_CERT_ACTION_SIGN_UP = "/gig/v2/operation/cert/action/sign-up";
+
+	/**
+	 * 税邦云绑卡url
+	 */
+	private static final String GIG_CERT_ACTION_BANK_CARD = "/gig/v2/operation/cert/action/bank-card";
+
 	/**
 	 * 查询用户签约认证信息
 	 *
@@ -107,6 +132,7 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	 * @param gigTypeList
 	 * @return
 	 */
+	@Deprecated
 	@Override
 	public List<SysUserSub> listUserSignCert(Integer userId, List<GigTypeEnum> gigTypeList) {
 		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
@@ -119,11 +145,13 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	 * 查询用户签约认证信息
 	 *
 	 * @param userId
+	 * @param deptId
 	 * @return
 	 */
 	@Override
-	public List<SysUserSubVO> listUserSignCertForApi(Integer userId) {
+	public List<SysUserSubVO> listUserSignCertForApi(Integer userId, Integer deptId) {
 		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getDeptId, deptId)
 				.eq(SysUserSub::getUserId, userId));
 		if (CollUtil.isNotEmpty(userSubList)) {
 			List<SysUserSubVO> resultList = new ArrayList<>();
@@ -142,14 +170,6 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					case OLADING:
 						userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
 						break;
-					case JIN_YUAN:
-						// 渠道是金园,则展示阿拉钉的状态
-						userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
-						break;
-					case XIN_TAI_ZI:
-						// 渠道是河南薪泰梓,则展示阿拉钉的状态
-						userSubVO.setCertStatus(OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name());
-						break;
 					default:
 				}
 
@@ -160,6 +180,32 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 		return new ArrayList<>();
 	}
 
+	/**
+	 * 查询用户认证状态
+	 *
+	 * @param idCard 身份证号
+	 * @param enterprisCode 税号
+	 * @param subjectChannel 渠道类型
+	 * @return
+	 */
+	@Override
+	public Map<String, Object> listCertInfo(String idCard, String enterprisCode, List<SubjectLocation> subjectChannel) {
+		Map<String, Object> params = new HashMap<>(3);
+		params.put("idCard", idCard);
+		params.put("enterprisCode", enterprisCode);
+		params.put("subjectChannel", subjectChannel);
+		String postResult = HttpUtil.post(upmsConfig.getGigServiceUrl() + GIG_CERT_STATE, JSONUtil.toJsonStr(params));
+		log.info("查询用户认证状态返回:{}", postResult);
+		if (JSONUtil.isJsonObj(postResult)) {
+			JSONObject jsonResult = JSONUtil.parseObj(postResult);
+			if (CommonConstants.SUCCESS.equals(jsonResult.getInt("code"))) {
+				return jsonResult.getJSONObject("data");
+			}
+		}
+
+		return null;
+	}
+
 	/**
 	 * 保存用户基础信息
 	 *
@@ -181,52 +227,160 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 			updateUser.setIdCardNumber(userSignCertDTO.getIdCardNumber());
 			updateUser.setBankPhone(userSignCertDTO.getBankPhone());
 			updateUser.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+			updateUser.setUpdateTime(LocalDateTime.now());
 			sysUserService.updateById(updateUser);
 		}
 		// 更新用户签约认证主体信息
-		userSignCertDTO.getGigTypeList().forEach(gigType -> {
-			// 税邦云单独设置渠道类型
-			GigChannelEnum gigChannel;
-			if (GigTypeEnum.TAX_HELPOR.equals(gigType)) {
-				// 读取用户所认证的企业的结算渠道
-				SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
-						.eq(SysDeptSub::getDeptId, queryUser.getDeptId())
-						.eq(SysDeptSub::getSubjectType, GigTypeEnum.TAX_HELPOR.getCode())
-						.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode()));
-				if (deptSub != null) {
-					gigChannel = GigChannelEnum.resolve(Integer.parseInt(deptSub.getSubjectType()));
-				} else {
-					gigChannel = GigChannelEnum.DEFAULT;
-				}
+		// 税邦云单独设置渠道类型
+		SubjectLocation subjectLocation = userSignCertDTO.getSubjectLocation();
+		GigChannelEnum gigChannel;
+		if (GigTypeEnum.TAX_HELPOR.equals(subjectLocation.getGigType())) {
+			// 读取用户所认证的企业的结算渠道
+			SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+					.eq(SysDeptSub::getDeptId, queryUser.getDeptId())
+					.eq(SysDeptSub::getSubjectType, subjectLocation.getGigType().getCode())
+					.eq(SysDeptSub::getSubjectLocation, subjectLocation)
+					.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode()));
+			if (deptSub != null) {
+				gigChannel = GigChannelEnum.resolve(Integer.parseInt(deptSub.getSubjectType()));
 			} else {
 				gigChannel = GigChannelEnum.DEFAULT;
 			}
-			SysUserSub queryUserSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
-					.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
-					.eq(SysUserSub::getGigType, gigType));
-			if (queryUserSub != null) {
-				SysUserSub updateUserSub = new SysUserSub();
-				updateUserSub.setId(queryUserSub.getId());
-				updateUserSub.setCallbackStatus(GigCallBackStatus.NOT_SUBMIT);
-				updateUserSub.setGigChannel(gigChannel);
-				updateUserSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
-				updateUserSub.setUpdateTime(LocalDateTime.now());
-				updateUserSub.setUpdateUser(operateUserId);
-				sysUserSubService.updateById(updateUserSub);
-			} else {
-				SysUserSub userSub = new SysUserSub();
-				userSub.setUserId(userSignCertDTO.getUserId());
-				userSub.setDeptId(queryUser.getDeptId());
-				userSub.setGigType(gigType);
-				userSub.setGigChannel(gigChannel);
-				userSub.setCallbackStatus(GigCallBackStatus.NOT_SUBMIT);
-				userSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
-				userSub.setBankPhone(userSignCertDTO.getBankPhone());
-				userSub.setCreateUser(operateUserId);
-				userSub.setCreateTime(LocalDateTime.now());
-				sysUserSubService.save(userSub);
+		} else {
+			gigChannel = GigChannelEnum.DEFAULT;
+		}
+		SysUserSub queryUserSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
+				.eq(SysUserSub::getDeptId, queryUser.getDeptId())
+				.eq(SysUserSub::getGigType, subjectLocation.getGigType())
+				.eq(SysUserSub::getSubjectLocation, subjectLocation));
+		if (queryUserSub != null) {
+			SysUserSub updateUserSub = new SysUserSub();
+			updateUserSub.setId(queryUserSub.getId());
+			updateUserSub.setCallbackStatus(GigCallBackStatus.NOT_SUBMIT);
+			updateUserSub.setGigChannel(gigChannel);
+			updateUserSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+			updateUserSub.setUpdateTime(LocalDateTime.now());
+			updateUserSub.setUpdateUser(operateUserId);
+			sysUserSubService.updateById(updateUserSub);
+		} else {
+			SysUserSub userSub = new SysUserSub();
+			userSub.setUserId(userSignCertDTO.getUserId());
+			userSub.setDeptId(queryUser.getDeptId());
+			userSub.setGigType(subjectLocation.getGigType());
+			userSub.setGigChannel(gigChannel);
+			userSub.setSubjectLocation(userSignCertDTO.getSubjectLocation());
+			userSub.setCallbackStatus(GigCallBackStatus.NOT_SUBMIT);
+			userSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+			userSub.setBankPhone(userSignCertDTO.getBankPhone());
+			userSub.setCreateUser(operateUserId);
+			userSub.setCreateTime(LocalDateTime.now());
+			sysUserSubService.save(userSub);
+		}
+	}
+
+	/**
+	 * 签约/增员
+	 *
+	 * @param userSignCertDTO
+	 * @return
+	 */
+	@Override
+	public R<?> toSign(UserSignCertDTO userSignCertDTO) {
+		Integer userId = userSignCertDTO.getUserId();
+
+		// 根据用户id查询用户信息
+		SysUser sysUser = sysUserService.getById(userId);
+		if (sysUser == null) {
+			return R.failed("用户不存在");
+		}
+
+		// 查询userSub
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getDeptId, sysUser.getDeptId())
+				.eq(SysUserSub::getUserId, userId)
+				.eq(SysUserSub::getSubjectLocation, userSignCertDTO.getSubjectLocation()));
+		if (userSub == null) {
+			return R.failed("用户sub数据不存在");
+		}
+		// 判断是否已签约/增员
+		if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.TAX_HELPOR)) {
+			if (userSub.getCertStatus() > TaxHelperCertStatus.UN_CERT.getCode()) {
+				return R.ok();
+			}
+		} else if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.OLADING)) {
+			if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(userSub.getCertStatus()))
+					|| OladingCertStatus.SIGNING.getCode().equals(String.valueOf(userSub.getCertStatus()))
+					|| OladingCertStatus.CERT.getCode().equals(String.valueOf(userSub.getCertStatus()))) {
+				return R.ok(MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(userSub.getCertStatus()))).build());
+			}
+		}
+
+		// 查询dept
+		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+
+		// 发起签约/增员
+		Map<String, Object> params = new HashMap<>();
+		params.put("enterpriseCode", dept.getTaxCode());
+		params.put("subjectLocation", userSub.getSubjectLocation().name());
+		params.put("subjectChannel", userSub.getGigChannel().name());
+		params.put("realName", sysUser.getRealname());
+		params.put("phone", sysUser.getUsername());
+		params.put("bankPhone", userSub.getBankPhone());
+		params.put("bankCard", userSub.getBankCardNumber());
+		params.put("idCard", sysUser.getIdCardNumber());
+		params.put("endType", "CSO");
+		params.put("email", "service@yaoyi.net");
+		params.put("address", "北京市房山区");
+
+		String postResult = HttpUtil.post(upmsConfig.getGigServiceUrl() + GIG_CERT_ACTION_SIGN_UP, JSONUtil.toJsonStr(params));
+		log.info("签约/增员,req={}, resp={}", JSONUtil.toJsonStr(params), postResult);
+
+		String message = "增员/签约失败";
+		int certStatus = 0;
+		boolean successFlag = false;
+		String requestId = null;
+		if (JSONUtil.isJsonObj(postResult)) {
+			JSONObject jsonResult = JSONUtil.parseObj(postResult);
+			if (jsonResult.getInt("code") == 0) {
+				JSONObject data = jsonResult.getJSONObject("data");
+				if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.TAX_HELPOR)) {
+					if ("2000".equals(data.getStr("code"))) {
+						successFlag = true;
+						certStatus = TaxHelperCertStatus.ADD_MEMBER.getCode();
+					}
+					message = data.getStr("message");
+				} else if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.OLADING)) {
+					if ("0".equals(data.getStr("code"))) {
+						successFlag = true;
+						certStatus = Integer.parseInt(OladingCertStatus.SIGNING.getCode());
+						requestId = data.getStr("requestId");
+					} else if ("1004".equals(data.getStr("code"))) {
+						successFlag = true;
+						certStatus = Integer.parseInt(OladingCertStatus.SIGNING.getCode());
+					}
+					message = data.getStr("message");
+				}
+			}
+		}
+
+		// 修改userSub状态
+		SysUserSub updateUserSub = new SysUserSub();
+		updateUserSub.setId(userSub.getId());
+		updateUserSub.setCertStatus(certStatus);
+		updateUserSub.setCertRemark("签约/增员:" + message);
+		updateUserSub.setRequestId(requestId);
+		updateUserSub.setUpdateUser(SecurityUtils.getUser().getId());
+		updateUserSub.setUpdateTime(LocalDateTime.now());
+		sysUserSubService.updateById(updateUserSub);
+
+		if (successFlag) {
+			if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.OLADING)) {
+				return R.ok(MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(certStatus))).build());
 			}
-		});
+			return R.ok();
+		}
+		return R.failed(message);
 	}
 
 	/**
@@ -237,11 +391,13 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void signAgreement(UserSignCertDTO userSignCertDTO) {
+		SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
 
 		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.lambdaUpdate();
 		updateWrapper.eq(SysUserSub::getUserId, userSignCertDTO.getUserId());
-		if (CollUtil.isNotEmpty(userSignCertDTO.getGigTypeList())) {
-			updateWrapper.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList());
+		updateWrapper.eq(SysUserSub::getDeptId, sysUser.getDeptId());
+		if (userSignCertDTO.getSubjectLocation() != null) {
+			updateWrapper.eq(SysUserSub::getSubjectLocation, userSignCertDTO.getSubjectLocation());
 		}
 		updateWrapper.set(SysUserSub::getAgreementUrl, userSignCertDTO.getAgreementUrl());
 		updateWrapper.set(SysUserSub::getUpdateUser, SecurityUtils.getUser().getId());
@@ -261,8 +417,8 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 
 		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.lambdaUpdate();
 		updateWrapper.eq(SysUserSub::getUserId, userSignCertDTO.getUserId());
-		if (CollUtil.isNotEmpty(userSignCertDTO.getGigTypeList())) {
-			updateWrapper.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList());
+		if (userSignCertDTO.getSubjectLocation() != null) {
+			updateWrapper.eq(SysUserSub::getSubjectLocation, userSignCertDTO.getSubjectLocation());
 		}
 		if (StrUtil.isNotBlank(userSignCertDTO.getAgreementUrl())) {
 			updateWrapper.set(SysUserSub::getAgreementUrl, userSignCertDTO.getAgreementUrl());
@@ -292,28 +448,33 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 		if (sysUser == null) {
 			return false;
 		}
+		// 查询认证数据
+		SysUserExtRecord userExtRecord = sysUserExtRecordService.getOne(Wrappers.<SysUserExtRecord>lambdaQuery()
+				.eq(SysUserExtRecord::getUserId, userId)
+				.eq(SysUserExtRecord::getDelFlag, DelEnum.NOT_DEL.val()));
+		if (userExtRecord == null) {
+			return false;
+		}
 		// 查询dept
 		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
 		// 查询当前用户关联的userSub
 		LambdaQueryWrapper<SysUserSub> userSubWrapper = Wrappers.lambdaQuery();
 		userSubWrapper.eq(SysUserSub::getUserId, userId);
-		userSubWrapper.eq(SysUserSub::getDeptId, dept.getDeptId());
-		if (CollUtil.isNotEmpty(userSignCertDTO.getGigTypeList())) {
-			userSubWrapper.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList());
-		}
+		userSubWrapper.eq(SysUserSub::getDeptId, sysUser.getDeptId());
+		userSubWrapper.eq(SysUserSub::getSubjectLocation, userSignCertDTO.getSubjectLocation());
 		List<SysUserSub> userSubList = sysUserSubService.list(userSubWrapper);
 
 		if (CollUtil.isNotEmpty(userSubList)) {
 			// 过滤出阿拉钉的渠道
-			Collection<GigTypeEnum> oladingTypeList =
-					CollUtil.intersection(userSignCertDTO.getGigTypeList(),
-							CollUtil.toList(GigTypeEnum.OLADING, GigTypeEnum.JIN_YUAN, GigTypeEnum.XIN_TAI_ZI)).stream()
-							.sorted(Comparator.comparing(GigTypeEnum::getCode))
+			Collection<SubjectLocation> oladingList =
+					CollUtil.intersection(CollUtil.toList(userSignCertDTO.getSubjectLocation()),
+							SubjectLocation.getByGigType(GigTypeEnum.OLADING)).stream()
+							.sorted(Comparator.comparing(SubjectLocation::getSort))
 							.collect(Collectors.toList());
 
 			// 封装请求数据
 			userSubList.stream()
-					.sorted(Comparator.comparing(sysUserSub -> sysUserSub.getGigType().getCode()))
+					.sorted(Comparator.comparing(sysUserSub -> sysUserSub.getSubjectLocation().getSort()))
 					.filter(sysUserSub -> {
 				// 过滤掉认证成功的数据
 				if (GigTypeEnum.TAX_HELPOR.equals(sysUserSub.getGigType())
@@ -325,10 +486,6 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return true;
 				} else if (GigTypeEnum.OLADING.equals(sysUserSub.getGigType())) {
 					return true;
-				} else if (GigTypeEnum.JIN_YUAN.equals(sysUserSub.getGigType())) {
-					return true;
-				} else if (GigTypeEnum.XIN_TAI_ZI.equals(sysUserSub.getGigType())) {
-					return true;
 				} else if (GigTypeEnum.REN_LI_JIA.equals(sysUserSub.getGigType())
 						&& RenlijiaCertStatus.CER_STATUS_1.getCode() != sysUserSub.getCertStatus()) {
 					return true;
@@ -337,7 +494,7 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 			}).forEach(userSub -> {
 
 				// 发起前置判断
-				if (!this.preSignCert(sysUser, userSub, userSignCertDTO, oladingTypeList)) {
+				if (!this.preSignCert(sysUser, userSub, userSignCertDTO, oladingList)) {
 					// false直接返回,不发送mq
 					log.info("本次不发起认证,userSubId={}", userSub.getId());
 					return;
@@ -349,12 +506,15 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 				// 是否需要传核身视频,阿拉丁、易联默认都要传
 				boolean uploadFaceID = userSignCertDTO.getUploadFaceID() != null && userSignCertDTO.getUploadFaceID();
 				// 封装请求参数
-				GigInfoModel infoModel = this.buildChannelCertModel(sysUser, userSub, dept.getTaxCode(), requestId, uploadFaceID);
+				GigInfoModel infoModel = this.buildChannelCertModel(sysUser, userSub, userExtRecord, dept.getTaxCode(), requestId, uploadFaceID);
 				// 更新为进行中状态
 				SysUserSub updateUserSub = new SysUserSub();
 				updateUserSub.setId(userSub.getId());
 				updateUserSub.setRequestId(requestId);
 				updateUserSub.setCallbackStatus(GigCallBackStatus.IN_PROGRESS);
+				updateUserSub.setUpdateTime(LocalDateTime.now());
+				HnqzUser hnqzUser = SecurityUtils.getUser();
+				updateUserSub.setUpdateUser(hnqzUser != null ? hnqzUser.getId() : 0);
 				sysUserSubService.updateById(updateUserSub);
 				// 发送mq
 				BaseMap gigInfo = new BaseMap();
@@ -373,61 +533,15 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	 * @param sysUser 用户信息
 	 * @param userSub userSub信息
 	 * @param userSignCertDTO 发起参数
-	 * @param oladingTypeList 阿拉钉渠道类型list
+	 * @param locationList 阿拉钉税源地list
 	 */
-	private boolean preSignCert(SysUser sysUser, SysUserSub userSub, UserSignCertDTO userSignCertDTO, Collection<GigTypeEnum> oladingTypeList) {
+	private boolean preSignCert(SysUser sysUser, SysUserSub userSub, UserSignCertDTO userSignCertDTO, Collection<SubjectLocation> locationList) {
 		// 校验是否有进行中的
 		if (GigCallBackStatus.IN_PROGRESS.equals(userSub.getCallbackStatus())) {
 			return false;
 		}
 
 		switch (userSub.getGigType()) {
-			case XIN_TAI_ZI:
-				// 钉灵工-河南薪泰梓
-				// 发起认证前,金园数科,转换对应关系为 阿拉钉-金园数科
-				userSub.setGigType(GigTypeEnum.OLADING);
-				userSub.setGigChannel(GigChannelEnum.XIN_TAI_ZI);
-
-				// 如果需要传核身视频,则返回true
-				if (userSignCertDTO.getUploadFaceID() != null && userSignCertDTO.getUploadFaceID()) {
-					return true;
-				}
-
-				// 已认证不发起
-				if (OladingCertStatus.CERT.getCode().equals(String.valueOf(userSub.getCertStatus()))) {
-					return false;
-				}
-
-				// 如果同时包含阿拉钉多个渠道,则只选第一个发起
-				if (oladingTypeList.size() > 1 && !oladingTypeList.stream().findFirst().get().equals(GigTypeEnum.XIN_TAI_ZI)) {
-					// 同时选择了阿拉钉金园数科、海南飞亿、河南薪泰梓渠道的两个及以上,则先发起第一个,完成之后再依次发起其他的
-					return false;
-				}
-
-				return true;
-			case JIN_YUAN:
-				// 钉灵工-金园数科
-				// 发起认证前,金园数科,转换对应关系为 阿拉钉-金园数科
-				userSub.setGigType(GigTypeEnum.OLADING);
-				userSub.setGigChannel(GigChannelEnum.JIN_YUAN);
-
-				// 如果需要传核身视频,则返回true
-				if (userSignCertDTO.getUploadFaceID() != null && userSignCertDTO.getUploadFaceID()) {
-					return true;
-				}
-
-				// 已认证不发起
-				if (OladingCertStatus.CERT.getCode().equals(String.valueOf(userSub.getCertStatus()))) {
-					return false;
-				}
-
-				// 如果同时包含阿拉钉多个渠道,则只选第一个发起
-				if (oladingTypeList.size() > 1 && !oladingTypeList.stream().findFirst().get().equals(GigTypeEnum.JIN_YUAN)) {
-					// 同时选择了阿拉钉金园数科、海南飞亿、河南薪泰梓渠道的两个及以上,则先发起第一个,完成之后再依次发起其他的
-					return false;
-				}
-
-				return true;
 			case OLADING:
 				// 阿拉钉-海南飞亿
 				// 如果需要传核身视频,则返回true
@@ -440,8 +554,8 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return false;
 				}
 
-				// 如果同时包含阿拉钉多个渠道,则只选第一个发起
-				if (oladingTypeList.size() > 1 && !oladingTypeList.stream().findFirst().get().equals(GigTypeEnum.OLADING)) {
+				// 如果同时包含阿拉钉多个渠道,则只选第一个发起,其余不发起
+				if (locationList.size() > 1 && !locationList.stream().findFirst().get().equals(userSub.getSubjectLocation())) {
 					// 同时选择了阿拉钉金园数科、海南飞亿、河南薪泰梓渠道的两个及以上,则先发起第一个,完成之后再依次发起其他的
 					return false;
 				}
@@ -538,17 +652,20 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	 *
 	 * @param sysUser
 	 * @param userSub
+	 * @param userExtRecord
 	 * @param entCode
 	 * @param requestId
 	 * @param uploadFaceID
 	 * @return
 	 */
-	private GigInfoModel buildChannelCertModel(SysUser sysUser, SysUserSub userSub, String entCode, String requestId, boolean uploadFaceID) {
+	private GigInfoModel buildChannelCertModel(SysUser sysUser, SysUserSub userSub, SysUserExtRecord userExtRecord,
+											   String entCode, String requestId, boolean uploadFaceID) {
 		// 基础信息
 		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
 		baseInfoModel.setRequestId(requestId);
 		baseInfoModel.setGigType(userSub.getGigType());
 		baseInfoModel.setGigChannel(userSub.getGigChannel());
+		baseInfoModel.setGigLocation(userSub.getSubjectLocation());
 		// 用户信息
 		GigUserInfoModel userInfoModel = new GigUserInfoModel();
 		userInfoModel.setUserId(sysUser.getUserId());
@@ -580,6 +697,9 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 		userInfoModel.setSignImageUrl(StrUtil.isBlank(userSub.getAgreementUrl())
 				? null : userSub.getAgreementUrl().startsWith("https")
 				? userSub.getAgreementUrl() : upmsConfig.getClientUrl() + userSub.getAgreementUrl());
+		userInfoModel.setIdCardBackBase64(userExtRecord.getIdCardBackBase64());
+		userInfoModel.setIdCardFrontBase64(userExtRecord.getIdCardFrontBase64());
+		userInfoModel.setBestFrameBase64(userExtRecord.getBestFrameBase64());
 
 		GigInfoModel infoModel = new GigInfoModel();
 		infoModel.setBaseInfo(baseInfoModel);
@@ -592,42 +712,74 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	 * 税邦云发送绑卡验证码
 	 *
 	 * @param userSignCertDTO
+	 * @return
 	 */
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void bindCardVerification(UserSignCertDTO userSignCertDTO) {
+	public R<?> bindCardVerification(UserSignCertDTO userSignCertDTO) {
+		// 查询user
+		SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+		// 查询userSub
 		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
 				.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
-				.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR));
+				.eq(SysUserSub::getDeptId, sysUser.getDeptId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.LUO_SHU_YUN));
 		if (userSub == null) {
-			throw new RuntimeException("数据异常");
+			return R.failed("用户sub数据不存在");
 		}
-		// 查询user
-		SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+
 		// 查询dept
 		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
-		// 基础信息
-		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
-		baseInfoModel.setGigType(userSub.getGigType());
-		baseInfoModel.setGigChannel(userSub.getGigChannel());
-		baseInfoModel.setBankCardOpt("captcha");
-		baseInfoModel.setNotifyUrl(taxNotifyConfig.getNotifyUrl());
-		// 用户信息
-		GigUserInfoModel userInfoModel = new GigUserInfoModel();
-		userInfoModel.setName(sysUser.getRealname());
-		userInfoModel.setUsername(sysUser.getUsername());
-		userInfoModel.setEntCode(dept.getTaxCode());
-		userInfoModel.setIdCard(sysUser.getIdCardNumber());
-		userInfoModel.setBankPhone(userSignCertDTO.getBankPhone());
-		userInfoModel.setBankCard(userSignCertDTO.getBankCardNumber());
 
-		GigInfoModel infoModel = new GigInfoModel();
-		infoModel.setBaseInfo(baseInfoModel);
-		infoModel.setUserInfo(userInfoModel);
-		BaseMap gigInfo = new BaseMap();
-		gigInfo.put(userSub.getGigType().name(), infoModel);
-		// 发送mq
-		rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_BANK_CARD_QUEUE, JSONUtil.toJsonStr(gigInfo));
+		// 发送绑卡验证码
+		Map<String, Object> params = new HashMap<>();
+		params.put("enterpriseCode", dept.getTaxCode());
+		params.put("subjectLocation", userSub.getSubjectLocation().name());
+		params.put("realName", sysUser.getRealname());
+		params.put("bankCard", userSignCertDTO.getBankCardNumber());
+		params.put("idCard", sysUser.getIdCardNumber());
+		params.put("bankPhone", userSignCertDTO.getBankPhone());
+		params.put("endType", "CSO");
+		params.put("bankCardStep", "CAPTCHA");
+
+		String postResult = HttpUtil.post(upmsConfig.getGigServiceUrl() + GIG_CERT_ACTION_BANK_CARD, JSONUtil.toJsonStr(params));
+		log.info("税邦云发送绑卡验证码: req={}, resp={}", JSONUtil.toJsonStr(params), postResult);
+
+		if (JSONUtil.isJsonObj(postResult)) {
+			JSONObject jsonResult = JSONUtil.parseObj(postResult);
+			if (jsonResult.getInt("code") == 0) {
+				JSONObject data = jsonResult.getJSONObject("data");
+				if ("2000".equals(data.getStr("code"))) {
+					return R.ok();
+				}
+				return R.failed(data.getStr("message"));
+			}
+		}
+
+		return R.failed("发送绑卡验证码失败");
+
+//		// 基础信息
+//		GigBaseInfoModel baseInfoModel = new GigBaseInfoModel();
+//		baseInfoModel.setGigType(userSub.getGigType());
+//		baseInfoModel.setGigChannel(userSub.getGigChannel());
+//		baseInfoModel.setBankCardOpt("captcha");
+//		baseInfoModel.setNotifyUrl(taxNotifyConfig.getNotifyUrl());
+//		// 用户信息
+//		GigUserInfoModel userInfoModel = new GigUserInfoModel();
+//		userInfoModel.setName(sysUser.getRealname());
+//		userInfoModel.setUsername(sysUser.getUsername());
+//		userInfoModel.setEntCode(dept.getTaxCode());
+//		userInfoModel.setIdCard(sysUser.getIdCardNumber());
+//		userInfoModel.setBankPhone(userSignCertDTO.getBankPhone());
+//		userInfoModel.setBankCard(userSignCertDTO.getBankCardNumber());
+//
+//		GigInfoModel infoModel = new GigInfoModel();
+//		infoModel.setBaseInfo(baseInfoModel);
+//		infoModel.setUserInfo(userInfoModel);
+//		BaseMap gigInfo = new BaseMap();
+//		gigInfo.put(userSub.getGigType().name(), infoModel);
+//		// 发送mq
+//		rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_BANK_CARD_QUEUE, JSONUtil.toJsonStr(gigInfo));
 
 	}
 
@@ -635,55 +787,106 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	 * 绑卡确认
 	 *
 	 * @param userSignCertDTO
+	 * @return
 	 */
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void bindCardConfirm(UserSignCertDTO userSignCertDTO) {
-		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+	public R<Object> bindCardConfirm(UserSignCertDTO userSignCertDTO) {
+
+		// 查询user
+		SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+		// 查询userSub
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
 				.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
-				.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList()));
-		if (CollUtil.isEmpty(userSubList)) {
-			throw new RuntimeException("数据异常");
+				.eq(SysUserSub::getDeptId, sysUser.getDeptId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.LUO_SHU_YUN));
+		if (userSub == null) {
+			return R.failed("用户sub数据不存在");
 		}
-		BaseMap gigInfo = new BaseMap();
-		userSubList.stream()
-				// 人力家暂过滤掉
-				.filter(sysUserSub -> !GigTypeEnum.REN_LI_JIA.equals(sysUserSub.getGigType()))
-				.forEach(userSub -> {
-					// 新银行卡号缓存到redis
-					String cacheKey = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD, userSub.getUserId(), userSub.getGigType().name());
-					redisTemplate.opsForValue().set(cacheKey, userSignCertDTO);
-
-					// 查询user
-					SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
-					// 查询dept
-					SysDept dept = sysDeptService.getById(sysUser.getDeptId());
-					// 封装请求数据
-					if (GigTypeEnum.TAX_HELPOR.equals(userSub.getGigType())) {
-						userSub.setBankPhone(userSignCertDTO.getBankPhone());
-						userSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
-						gigInfo.put(userSub.getGigType().name(),
-								this.buildTaxHelperBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber(), userSignCertDTO.getVerifyCode()));
-					} else if (GigTypeEnum.YEE.equals(userSub.getGigType())) {
-						gigInfo.put(userSub.getGigType().name(),
-								this.buildYeeBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber()));
-					} else if (GigTypeEnum.OLADING.equals(userSub.getGigType())) {
-						gigInfo.put(userSub.getGigType().name(),
-								this.buildOladingBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber()));
-					}
-					// 更新为进行中状态
-					SysUserSub updateUserSub = new SysUserSub();
-					updateUserSub.setId(userSub.getId());
-					updateUserSub.setCallbackStatus(GigCallBackStatus.IN_PROGRESS);
-					updateUserSub.setUpdateTime(LocalDateTime.now());
-					updateUserSub.setUpdateUser(0);
-					sysUserSubService.updateById(updateUserSub);
-				});
-
-		if (CollUtil.isNotEmpty(gigInfo)) {
-			// 发送mq
-			rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_BANK_CARD_QUEUE, JSONUtil.toJsonStr(gigInfo));
+
+		// 查询dept
+		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+
+		// 税邦云中金绑卡操作
+		Map<String, Object> params = new HashMap<>();
+		params.put("enterpriseCode", dept.getTaxCode());
+		params.put("subjectLocation", userSub.getSubjectLocation().name());
+		params.put("realName", sysUser.getRealname());
+		params.put("bankCard", userSignCertDTO.getBankCardNumber());
+		params.put("idCard", sysUser.getIdCardNumber());
+		params.put("endType", "CSO");
+		params.put("bankCardStep", "BOUND");
+		params.put("captcha", userSignCertDTO.getVerifyCode());
+
+		String postResult = HttpUtil.post(upmsConfig.getGigServiceUrl() + GIG_CERT_ACTION_BANK_CARD, JSONUtil.toJsonStr(params));
+		log.info("税邦云中金绑卡操作: req={}, resp={}", JSONUtil.toJsonStr(params), postResult);
+
+		if (JSONUtil.isJsonObj(postResult)) {
+			JSONObject jsonResult = JSONUtil.parseObj(postResult);
+			if (jsonResult.getInt("code") == 0) {
+				JSONObject data = jsonResult.getJSONObject("data");
+				if ("2000".equals(data.getStr("code"))) {
+					// 保存手机号和银行卡号
+					SysUser updateUser = new SysUser();
+					updateUser.setUserId(sysUser.getUserId());
+					updateUser.setBankPhone(userSignCertDTO.getBankPhone());
+					updateUser.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+					updateUser.setUpdateTime(LocalDateTime.now());
+					sysUserService.updateById(updateUser);
+
+					return R.ok();
+				}
+				return R.failed(data.getStr("message"));
+			}
 		}
+
+		return R.failed("发送绑卡验证码失败");
+
+//		List<SysUserSub> userSubList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
+//				.eq(SysUserSub::getUserId, userSignCertDTO.getUserId())
+//				.in(SysUserSub::getGigType, userSignCertDTO.getGigTypeList()));
+//		if (CollUtil.isEmpty(userSubList)) {
+//			throw new RuntimeException("数据异常");
+//		}
+//		BaseMap gigInfo = new BaseMap();
+//		userSubList.stream()
+//				// 人力家暂过滤掉
+//				.filter(sysUserSub -> !GigTypeEnum.REN_LI_JIA.equals(sysUserSub.getGigType()))
+//				.forEach(userSub -> {
+//					// 新银行卡号缓存到redis
+//					String cacheKey = String.format("%s_%s_%s", CacheConstants.BIND_CARD_CONFIRM_NEW_BANK_CARD, userSub.getUserId(), userSub.getGigType().name());
+//					redisTemplate.opsForValue().set(cacheKey, userSignCertDTO);
+//
+//					// 查询user
+//					SysUser sysUser = sysUserService.getById(userSignCertDTO.getUserId());
+//					// 查询dept
+//					SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+//					// 封装请求数据
+//					if (GigTypeEnum.TAX_HELPOR.equals(userSub.getGigType())) {
+//						userSub.setBankPhone(userSignCertDTO.getBankPhone());
+//						userSub.setBankCardNumber(userSignCertDTO.getBankCardNumber());
+//						gigInfo.put(userSub.getGigType().name(),
+//								this.buildTaxHelperBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber(), userSignCertDTO.getVerifyCode()));
+//					} else if (GigTypeEnum.YEE.equals(userSub.getGigType())) {
+//						gigInfo.put(userSub.getGigType().name(),
+//								this.buildYeeBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber()));
+//					} else if (GigTypeEnum.OLADING.equals(userSub.getGigType())) {
+//						gigInfo.put(userSub.getGigType().name(),
+//								this.buildOladingBindCardConfirmModel(sysUser, userSub, dept.getTaxCode(), userSignCertDTO.getBankCardNumber()));
+//					}
+//					// 更新为进行中状态
+//					SysUserSub updateUserSub = new SysUserSub();
+//					updateUserSub.setId(userSub.getId());
+//					updateUserSub.setCallbackStatus(GigCallBackStatus.IN_PROGRESS);
+//					updateUserSub.setUpdateTime(LocalDateTime.now());
+//					updateUserSub.setUpdateUser(0);
+//					sysUserSubService.updateById(updateUserSub);
+//				});
+//
+//		if (CollUtil.isNotEmpty(gigInfo)) {
+//			// 发送mq
+//			rabbitMqClient.sendMessage(MqConstants.DIRECT_MODE_GIG_BANK_CARD_QUEUE, JSONUtil.toJsonStr(gigInfo));
+//		}
 	}
 
 	/**

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

@@ -19,12 +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;
 
 /**
@@ -33,19 +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 {
 
-	// @Cacheable(value = MONITORING_INDICATOR)
+	private final SysDeptSubService sysDeptSubService;
+
+	/**
+	 * 获取税源地限额
+	 *
+	 * @param subjectLocation 税源地
+	 * @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 总结算额
+	 */
 	@Override
-	public MonitoringIndicator getBySubType(String subType) {
-
-		return this.getOne(Wrappers.<MonitoringIndicator>lambdaQuery().eq(MonitoringIndicator::getSubType, subType));
-		// 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;
 	}
 }

+ 51 - 71
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;
@@ -48,6 +47,7 @@ import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageFinishStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ScorePackageStatusEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.SysCertResultRecordMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.UserAgreementSignatureRecordMapper;
@@ -64,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;
@@ -81,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;
@@ -105,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;
 
 /**
@@ -191,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;
 
@@ -227,9 +225,10 @@ public class PartyAServiceImpl implements PartyAService {
 		SysDeptSub query = new SysDeptSub();
 		query.setDeptId(dept.getDeptId());
 		query.setSubjectType(SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
+		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);
 		}
@@ -310,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);
 		}
@@ -427,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);
 		}
@@ -496,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);
 		}
@@ -581,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);
 		}
@@ -651,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);
 		}
@@ -758,7 +757,8 @@ public class PartyAServiceImpl implements PartyAService {
 		//已分派待申领
 		scorePackage.setScorePackageStatus(ScorePackageStatusEnum.UNCLAIMED.val());
 		scorePackage.setDescription(scorePackageDTO.getDescription());
-		scorePackage.setSubType(scorePackageDTO.getChannel().val());
+		scorePackage.setLocation(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()));
@@ -1051,6 +1051,7 @@ public class PartyAServiceImpl implements PartyAService {
 
 					note.setUserId(String.valueOf(user.getUserId()));
 					note.setSubType("1");
+					note.setSubjectLocation(SubjectLocation.LUO_SHU_YUN);
 
 					Map<String, Object> saveMap = new HashMap<>(3);
 					saveMap.put("task", task);
@@ -1156,20 +1157,16 @@ public class PartyAServiceImpl implements PartyAService {
 			return getResultMap("4000", "结算金额不正确");
 		}
 
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, scorePackageSettleNoteDTO
-				.getChannel()
-				.val());
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
+		// 设置税源地
+		SubjectLocation location = scorePackageSettleNoteDTO.getLocation();
+		String subType = String.valueOf(scorePackageSettleNoteDTO.getLocation().getGigType().getCode());
 
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(userIds, ids, scorePackageSettleNoteDTO
-				.getChannel()
-				.val());
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
 
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, scorePackageSettleNoteDTO
-				.getChannel()
-				.val());
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
+		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);
+
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(member.getIdCardNumber())).findFirst().orElse(null);
@@ -1180,11 +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(note.getSubType());
-		SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
-				.eq(SysDeptSub::getDeptId, dept.getDeptId())
-				.eq(SysDeptSub::getSubjectType, note.getSubType())
-		);
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
+
+		SysDeptSub sysDeptSub = sysDeptSubService.getDeptSub(dept.getDeptId(), location);
 		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
 		BigDecimal yaoyiMonitoringLimit = monitoringIndicator.getYaoyiLimitAmount();
@@ -1225,7 +1221,8 @@ public class PartyAServiceImpl implements PartyAService {
 			}
 			updateEntity = new WmScorePackageSettleNote();
 			updateEntity.setId(note.getId());
-			updateEntity.setSubType(note.getSubType());
+			updateEntity.setSubType(subType);
+			updateEntity.setSubjectLocation(location);
 			updateEntity.setInvoiceType(note.getInvoiceType());
 			updateEntity.setCategoryName(scorePackageSettleNoteDTO.getInvoiceCategory());
 			updateEntity.setSettleAmount(note.getSettleAmount());
@@ -1252,7 +1249,7 @@ public class PartyAServiceImpl implements PartyAService {
 			}
 		} else {
 			WmScorePackageSettleNote entity = new WmScorePackageSettleNote();
-			entity.setSubType(note.getSubType());
+			entity.setSubType(subType);
 			entity.setInvoiceType(note.getInvoiceType());
 			entity.setCategoryName(note.toCategoryName());
 			entity.setSettleAmount(note.getSettleAmount());
@@ -1306,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::getSubjectType, execSettlementDTO.getSubjectType())
-		);
+		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);
 		}
@@ -1346,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;
@@ -1382,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());
-		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);
-
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(Collections.singletonList(user
-				.getIdCardNumber()), noteIds, SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode());
-		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);
@@ -1409,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());
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
 		BigDecimal yaoyiMonitoringLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitorAmount = settleAmount;
@@ -1575,7 +1554,8 @@ public class PartyAServiceImpl implements PartyAService {
 		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
 				.eq(SysUserSub::getUserId, updateUser.getUserId())
 				.eq(SysUserSub::getDeptId, updateUser.getDeptId())
-				.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR));
+				.eq(SysUserSub::getGigType, GigTypeEnum.TAX_HELPOR)
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.LUO_SHU_YUN));
 		LocalDateTime now = LocalDateTime.now();
 
 		Integer certStatus = response.success() ? TaxHelperCertStatus.ADD_MEMBER.getCode() : TaxHelperCertStatus.UN_CERT.getCode();
@@ -1733,10 +1713,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) {
@@ -1751,24 +1731,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 + "+与系统设置不匹配,请联系要易管理员";
 					}
 				}

+ 42 - 10
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;
 	}
 
 	/**
@@ -97,7 +126,8 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 	public void saveSettleConfig(DeptSubLimitAmountInput input) {
 		// 更新结算主体
 		String[] subTypeArr = input.getSubList().stream()
-				.map(SysDeptSub::getSubjectType)
+				.map(sysDeptSub -> sysDeptSub.getSubjectLocation().getGigType().name())
+				.distinct()
 				.toArray(String[]::new);
 		SysDept dept = sysDeptMapper.selectById(input.getDeptId());
 		if (dept.getLevel() == 2) {
@@ -119,7 +149,6 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 		sysDeptMapper.update(null, Wrappers.<SysDept>lambdaUpdate()
 				.eq(SysDept::getDeptId, input.getDeptId())
 				.set(SysDept::getSubjectType, subTypeArr));
-		// 更新/保存deptSub
 		// 先设置所有deptSub为无效
 		SysDeptSub deptSubWhere = new SysDeptSub();
 		deptSubWhere.setDeptId(input.getDeptId());
@@ -127,15 +156,17 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 				.eq(SysDeptSub::getDeptId, input.getDeptId())
 				.set(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_FALSE.getCode()));
 
+		// 更新/保存deptSub
 		input.getSubList().forEach(sysDeptSub -> {
 			SysDeptSub queryDeptSub = sysDeptSubMapper.selectOne(Wrappers.<SysDeptSub>lambdaQuery()
 					.eq(SysDeptSub::getDeptId, input.getDeptId())
-					.eq(SysDeptSub::getSubjectType, sysDeptSub.getSubjectType()));
+					.eq(SysDeptSub::getSubjectLocation, sysDeptSub.getSubjectLocation()));
 			if (queryDeptSub != null) {
 				// 更新
 				SysDeptSub updateDeptSub = new SysDeptSub();
 				updateDeptSub.setSubId(queryDeptSub.getSubId());
 				updateDeptSub.setSubjectChannel(sysDeptSub.getSubjectChannel() == null ? 0 : sysDeptSub.getSubjectChannel());
+				updateDeptSub.setSubjectLocation(sysDeptSub.getSubjectLocation());
 				updateDeptSub.setSubjectInvoiceCategory(sysDeptSub.getSubjectInvoiceCategory());
 				updateDeptSub.setLimitAmount(sysDeptSub.getLimitAmount());
 				updateDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
@@ -145,8 +176,9 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 				// 新增
 				SysDeptSub insertDeptSub = new SysDeptSub();
 				insertDeptSub.setDeptId(input.getDeptId());
-				insertDeptSub.setSubjectType(sysDeptSub.getSubjectType());
+				insertDeptSub.setSubjectType(String.valueOf(sysDeptSub.getSubjectLocation().getGigType().getCode()));
 				insertDeptSub.setSubjectChannel(sysDeptSub.getSubjectChannel() == null ? 0 : sysDeptSub.getSubjectChannel());
+				insertDeptSub.setSubjectLocation(sysDeptSub.getSubjectLocation());
 				insertDeptSub.setSubjectInvoiceCategory(sysDeptSub.getSubjectInvoiceCategory());
 				insertDeptSub.setLimitAmount(sysDeptSub.getLimitAmount());
 				insertDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());

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

@@ -0,0 +1,64 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.entity.SysUserExtRecord;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.mapper.SysUserExtRecordMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysUserExtRecordService;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户认证相关的扩展信息服务
+ */
+@Service
+public class SysUserExtRecordServiceImpl extends ServiceImpl<SysUserExtRecordMapper, SysUserExtRecord>
+		implements SysUserExtRecordService {
+
+	/**
+	 * 保存E证通认证结果
+	 *
+	 * @param userExtRecord
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void saveUserExtRecord(SysUserExtRecord userExtRecord) {
+		HnqzUser hnqzUser = SecurityUtils.getUser();
+
+		// 作废已有数据
+		this.update(Wrappers.<SysUserExtRecord>lambdaUpdate()
+				.eq(SysUserExtRecord::getUserId, hnqzUser.getId())
+				.eq(SysUserExtRecord::getDelFlag, DelEnum.NOT_DEL.val())
+				.set(SysUserExtRecord::getDelFlag, DelEnum.DELETED.val()));
+		// 新增一条数据
+		SysUserExtRecord insertExtRecord = BeanUtil.copyProperties(userExtRecord, SysUserExtRecord.class);
+		insertExtRecord.setUserId(hnqzUser.getId());
+		insertExtRecord.setDeptId(hnqzUser.getDeptId());
+		insertExtRecord.setCreateTime(LocalDateTime.now());
+		insertExtRecord.setCreateUser(hnqzUser.getId());
+		this.save(insertExtRecord);
+	}
+
+	/**
+	 * 查询E证通是否认证过
+	 *
+	 * @return
+	 */
+	@Override
+	public boolean existUserExtRecord() {
+		Integer userId = SecurityUtils.getUser().getId();
+		int count = this.count(Wrappers.<SysUserExtRecord>lambdaQuery()
+				.eq(SysUserExtRecord::getUserId, userId)
+				.eq(SysUserExtRecord::getDelFlag, DelEnum.NOT_DEL.val()));
+
+		return count > 0;
+	}
+
+}

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

@@ -28,6 +28,7 @@ import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.nacos.common.utils.Md5Utils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -41,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;
@@ -50,6 +52,7 @@ import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
 import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.*;
@@ -185,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() + "人员结算渠道不存在,不能结算");
+			}
+		}
+
+	}
+
 	/**
 	 * 封装错误信息
 	 *
@@ -682,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)) {
@@ -778,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)) {
@@ -993,15 +1037,19 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 	public IPage selectUserList(Page page, UserDTO userDTO) {
 
 		// 认证状态查询条件
-//		if (StrUtil.isNotBlank(userDTO.getSubType()) && userDTO.getCertStatus() != null) {
-		if (StrUtil.isNotBlank(userDTO.getSubType()) && userDTO.getCertType() != null) {
-			List<SysUserSub> userSubList = sysUserSubMapper.selectList(Wrappers.<SysUserSub>lambdaQuery()
-					.eq(SysUserSub::getGigType, GigTypeEnum.resolve(Integer.parseInt(userDTO.getSubType())))
-					.eq(SysUserSub::getCertStatus, userDTO.getCertType()));
+		if (StrUtil.isNotBlank(userDTO.getSubjectLocation()) && userDTO.getCertType() != null) {
+			LambdaQueryWrapper<SysUserSub> queryWrapper = Wrappers.<SysUserSub>lambdaQuery()
+					.eq(SysUserSub::getSubjectLocation, SubjectLocation.resolve(userDTO.getSubjectLocation()))
+					.eq(SysUserSub::getCertStatus, userDTO.getCertType());
+			if (userDTO.getDeptId() != null) {
+				queryWrapper.eq(SysUserSub::getDeptId, userDTO.getDeptId());
+			}
+			List<SysUserSub> userSubList = sysUserSubMapper.selectList(queryWrapper);
 			if (CollUtil.isNotEmpty(userSubList)) {
 				Set<Integer> certUserIdSet = userSubList.stream().map(SysUserSub::getUserId).collect(Collectors.toSet());
 				userDTO.setUserIdList(CollUtil.newArrayList(certUserIdSet));
 			} else {
+				// 设置为不允许查到
 				userDTO.setUserIdList(CollUtil.newArrayList(-1));
 			}
 			userDTO.setCertStatus(null);

+ 43 - 41
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java

@@ -248,25 +248,27 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 
 		IPage<WmDaAgent> wmDaAgentIPage = wmDaAgentMapper.selectWmManagementPage(page, wmDaAgent);
 
-		// wmDaAgentIPage.getRecords().forEach(agent ->{
-		//
-		// 	Map<String, Integer> collect = sysDeptSubMapper.selectList(Wrappers.<SysDeptSub>lambdaQuery().eq(SysDeptSub::getDeptId, agent.getDeptId()))
-		// 			.stream().collect(Collectors.toMap(SysDeptSub::getSubjectType, SysDeptSub::getSubjectChannel));
-		//
-		// 	agent.setSubjectTypeAndChannel(collect);
-		//
-		// });
-
-		wmDaAgentIPage.getRecords().forEach(agent -> {
-			SysDeptSub sysDeptSub = new SysDeptSub();
-			sysDeptSub.setDeptId(Integer.valueOf(agent.getDeptId()));
-			sysDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-			List<SysDeptSub> subList = sysDeptSubMapper.selectList(Wrappers.query(sysDeptSub));
-			if (CollUtil.isNotEmpty(subList)) {
-				String[] subTypeArr = subList.stream().map(SysDeptSub::getSubjectType).toArray(String[]::new);
-				agent.setSubjectType(subTypeArr);
-			}
-		});
+		 wmDaAgentIPage.getRecords().forEach(agent ->{
+
+		 	Map<String, Integer> collect = sysDeptSubMapper.selectList(Wrappers.<SysDeptSub>lambdaQuery()
+					.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
+					.eq(SysDeptSub::getDeptId, agent.getDeptId()))
+		 			.stream().collect(Collectors.toMap(sysDeptSub -> sysDeptSub.getSubjectLocation().name(), SysDeptSub::getSubjectChannel));
+			agent.setSubjectType(collect.keySet().toArray(collect.keySet().toArray(new String[0])));
+		 	agent.setSubjectTypeAndChannel(collect);
+
+		 });
+
+//		wmDaAgentIPage.getRecords().forEach(agent -> {
+//			SysDeptSub sysDeptSub = new SysDeptSub();
+//			sysDeptSub.setDeptId(Integer.valueOf(agent.getDeptId()));
+//			sysDeptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//			List<SysDeptSub> subList = sysDeptSubMapper.selectList(Wrappers.query(sysDeptSub));
+//			if (CollUtil.isNotEmpty(subList)) {
+//				String[] subTypeArr = subList.stream().map(SysDeptSub::getSubjectType).distinct().toArray(String[]::new);
+//				agent.setSubjectType(subTypeArr);
+//			}
+//		});
 
 		return wmDaAgentIPage;
 	}
@@ -554,28 +556,28 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 					.eq(SysDeptSub::getDeptId,sysDept.getDeptId())
 					.set(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_FALSE.getCode()));
 
-			if (CollUtil.isNotEmpty(wmDaAgent.getSubjectTypeAndChannel())) {
-				for (Map.Entry<String, Integer> entry : wmDaAgent.getSubjectTypeAndChannel().entrySet()) {
-					SysDeptSub condition = new SysDeptSub();
-					condition.setDeptId(sysDept.getDeptId());
-					condition.setSubjectType(entry.getKey());
-					condition.setSubjectChannel(entry.getValue());
-					SysDeptSub existSub = sysDeptSubMapper.selectOne(Wrappers.query(condition));
-					if (null != existSub) {
-						existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-						existSub.setUpdateTime(LocalDateTime.now());
-						sysDeptSubMapper.updateById(existSub);
-					} else {
-						existSub = new SysDeptSub();
-						existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-						existSub.setDeptId(sysDept.getDeptId());
-						existSub.setSubjectType(entry.getKey());
-						existSub.setSubjectChannel(entry.getValue());
-						existSub.setUpdateTime(LocalDateTime.now());
-						sysDeptSubMapper.insert(existSub);
-					}
-				}
-			}
+//			if (CollUtil.isNotEmpty(wmDaAgent.getSubjectTypeAndChannel())) {
+//				for (Map.Entry<String, Integer> entry : wmDaAgent.getSubjectTypeAndChannel().entrySet()) {
+//					SysDeptSub condition = new SysDeptSub();
+//					condition.setDeptId(sysDept.getDeptId());
+//					condition.setSubjectType(entry.getKey());
+//					condition.setSubjectChannel(entry.getValue());
+//					SysDeptSub existSub = sysDeptSubMapper.selectOne(Wrappers.query(condition));
+//					if (null != existSub) {
+//						existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//						existSub.setUpdateTime(LocalDateTime.now());
+//						sysDeptSubMapper.updateById(existSub);
+//					} else {
+//						existSub = new SysDeptSub();
+//						existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//						existSub.setDeptId(sysDept.getDeptId());
+//						existSub.setSubjectType(entry.getKey());
+//						existSub.setSubjectChannel(entry.getValue());
+//						existSub.setUpdateTime(LocalDateTime.now());
+//						sysDeptSubMapper.insert(existSub);
+//					}
+//				}
+//			}
 
 		}
 		/**

+ 25 - 25
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java

@@ -83,19 +83,19 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 			 */
 			if(sysDeptService.saveDept(sysDept) > 0){
 
-				Map<String, Integer> subjectTypeAndChannel = entity.getSubjectTypeAndChannel();
-				if (CollUtil.isNotEmpty(subjectTypeAndChannel)) {
-					for (Map.Entry<String, Integer> entry : subjectTypeAndChannel.entrySet()) {
-						SysDeptSub deptSub = new SysDeptSub();
-						deptSub.setDeptId(sysDept.getDeptId());
-						deptSub.setSubjectChannel(entry.getValue());
-						deptSub.setSubjectType(entry.getKey());
-						deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-						deptSub.setUpdateTime(sysDept.getCreateTime());
-						sysDeptSubMapper.insert(deptSub);
-
-					}
-				}
+//				Map<String, Integer> subjectTypeAndChannel = entity.getSubjectTypeAndChannel();
+//				if (CollUtil.isNotEmpty(subjectTypeAndChannel)) {
+//					for (Map.Entry<String, Integer> entry : subjectTypeAndChannel.entrySet()) {
+//						SysDeptSub deptSub = new SysDeptSub();
+//						deptSub.setDeptId(sysDept.getDeptId());
+//						deptSub.setSubjectChannel(entry.getValue());
+//						deptSub.setSubjectType(entry.getKey());
+//						deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//						deptSub.setUpdateTime(sysDept.getCreateTime());
+//						sysDeptSubMapper.insert(deptSub);
+//
+//					}
+//				}
 				return true;
 			}
 			return  false;
@@ -158,17 +158,17 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 			sysDeptRelationService.saveBatch(newList);
 
 			// 创建结算渠道和通道
-			if (CollUtil.isNotEmpty(entity.getSubjectTypeAndChannel())) {
-				for (Map.Entry<String, Integer> entry : entity.getSubjectTypeAndChannel().entrySet()) {
-					SysDeptSub deptSub = new SysDeptSub();
-					deptSub.setDeptId(sysDept.getDeptId());
-					deptSub.setSubjectType(entry.getKey());
-					deptSub.setSubjectChannel(entry.getValue());
-					deptSub.setUpdateTime(LocalDateTime.now());
-					deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-					sysDeptSubMapper.insert(deptSub);
-				}
-			}
+//			if (CollUtil.isNotEmpty(entity.getSubjectTypeAndChannel())) {
+//				for (Map.Entry<String, Integer> entry : entity.getSubjectTypeAndChannel().entrySet()) {
+//					SysDeptSub deptSub = new SysDeptSub();
+//					deptSub.setDeptId(sysDept.getDeptId());
+//					deptSub.setSubjectType(entry.getKey());
+//					deptSub.setSubjectChannel(entry.getValue());
+//					deptSub.setUpdateTime(LocalDateTime.now());
+//					deptSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//					sysDeptSubMapper.insert(deptSub);
+//				}
+//			}
 
 			return true;
 		}
@@ -211,7 +211,7 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 						.eq(SysDeptSub::getDeptId, ent.getDeptId())
 						.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode()))
 						.stream()
-						.collect(Collectors.toMap(SysDeptSub::getSubjectType, SysDeptSub::getSubjectChannel));
+						.collect(Collectors.toMap(sysDeptSub -> sysDeptSub.getSubjectLocation().name(), SysDeptSub::getSubjectChannel));
 				ent.setSubjectType(collect.keySet().toArray(new String[0]));
 				ent.setSubjectTypeAndChannel(collect);
 		});

Dosya farkı çok büyük olduğundan ihmal edildi
+ 184 - 659
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java


+ 16 - 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();
@@ -1457,6 +1457,7 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 				if (StringUtils.isBlank(ouPut.getSettleStatus())) {
 					ouPut.setSettleStatus(String.valueOf(settleNote.getSettleNoteStatus()));
 				}
+				ouPut.setSubjectLocation(settleNote.getSubjectLocation());
 			}
 			if (PackageTypeEnum.TYPE1_HCP_PACKAGE.val().equals(ouPut.getPackageType1())) {
 				// 如果是患者教育,则转换积分值 '分'->'元'
@@ -2307,4 +2308,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("结算状态异常,请勿重复结算");
+		}
+		;
+	}
 }

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

@@ -37,6 +37,7 @@ import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
 import com.qunzhixinxi.hnqz.admin.entity.output.WmTaskSettleNoteOutput;
 import com.qunzhixinxi.hnqz.admin.enums.ChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.SysUserSubMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmScorePackageMapper;
@@ -166,6 +167,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 					.divide(new BigDecimal(wmScorePackage.getTaskNum()), 2, BigDecimal.ROUND_HALF_UP);
 			query.setSettleAmount(amount);
 			query.setSubType(wmScorePackage.getSubType());
+			query.setSubjectLocation(wmScorePackage.getLocation());
 		}
 		query.setRealName(user.getRealname());
 		query.setIdCardNumber(user.getIdCardNumber());
@@ -178,24 +180,31 @@ 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() + "未认证,不能发起结算");
 		}
-		if ("0".equals(note.getSubType())) {
-			if (!Objects.equals(user.getRljCertStatus(), DingEnum.CER_STATUS_1.getType())) {
-				return R.failed(user.getRealname() + "未认证,不能发起结算");
-			}
+
+		if (note.getSubjectLocation() == null) {
+			return R.failed(user.getRealname() + "人员结算渠道不存在,不能结算");
 		}
-		if ("1".equals(note.getSubType())) {
-			if (!Objects.equals(user.getCertStatus(), TaxHelperCertStatus.CERT.getCode())) {
-				return R.failed(user.getRealname() + "人员未认证或未绑卡,不能结算");
-			}
+
+		String subType = String.valueOf(note.getSubjectLocation().getGigType().getCode());
+
+		SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getSubjectLocation, note.getSubjectLocation())
+				.eq(SysUserSub::getDeptId, user.getDeptId())
+				.eq(SysUserSub::getUserId, user.getUserId())
+		);
+		if (userSub == null) {
+			return R.failed(user.getRealname() + "人员认证信息不存在,不能结算");
 		}
 
 		SysDeptSub condition = new SysDeptSub();
 		condition.setDeptId(user.getDeptId());
-		condition.setSubjectType(note.getSubType());
+		condition.setSubjectType(subType);
+		condition.setSubjectLocation(location);
 		condition.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.query(condition));
 
@@ -211,14 +220,12 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		if (null != note.getId()) {
 			ids.add(note.getId());
 		}
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, note.getSubType());
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
 
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(userIds, ids, note.getSubType());
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
 
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, note.getSubType());
-		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);
@@ -229,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(note.getSubType());
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
 		BigDecimal yaoyiLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
@@ -265,7 +273,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		if (null == note.getId()) {
 
 			WmScorePackageSettleNote entity = new WmScorePackageSettleNote();
-			entity.setSubType(note.getSubType());
+			entity.setSubType(subType);
+			entity.setSubjectLocation(note.getSubjectLocation());
 			entity.setInvoiceType(note.getInvoiceType());
 			entity.setCategoryName(note.toCategoryName());
 			entity.setSettleAmount(note.getSettleAmount());
@@ -289,7 +298,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			}
 			WmScorePackageSettleNote updateEntity = new WmScorePackageSettleNote();
 			updateEntity.setId(note.getId());
-			updateEntity.setSubType(note.getSubType());
+			updateEntity.setSubType(subType);
+			updateEntity.setSubjectLocation(note.getSubjectLocation());
 			updateEntity.setInvoiceType(note.getInvoiceType());
 			updateEntity.setCategoryName(note.getCategoryName());
 			updateEntity.setSettleAmount(note.getSettleAmount());
@@ -305,24 +315,31 @@ 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() + "未认证,不能发起结算");
 		}
-		if ("0".equals(note.getSubType())) {
-			if (!Objects.equals(user.getRljCertStatus(), DingEnum.CER_STATUS_1.getType())) {
-				return R.failed(user.getRealname() + "未认证,不能发起结算");
-			}
+
+		if (note.getSubjectLocation() == null) {
+			return R.failed(user.getRealname() + "人员结算渠道不存在,不能结算");
 		}
-		if ("1".equals(note.getSubType())) {
-			if (!Objects.equals(user.getCertStatus(), TaxHelperCertStatus.CERT.getCode())) {
-				return R.failed(user.getRealname() + "人员未认证或未绑卡,不能结算");
-			}
+
+		String subType = String.valueOf(note.getSubjectLocation().getGigType().getCode());
+
+		SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getSubjectLocation, note.getSubjectLocation())
+				.eq(SysUserSub::getDeptId, user.getDeptId())
+				.eq(SysUserSub::getUserId, user.getUserId())
+		);
+		if (userSub == null) {
+			return R.failed(user.getRealname() + "人员认证信息不存在,不能结算");
 		}
 
 		SysDeptSub condition = new SysDeptSub();
 		condition.setDeptId(user.getDeptId());
-		condition.setSubjectType(note.getSubType());
+		condition.setSubjectType(subType);
+		condition.setSubjectLocation(note.getSubjectLocation());
 		condition.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.query(condition));
 
@@ -338,14 +355,10 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		if (null != note.getId()) {
 			ids.add(note.getId());
 		}
-		SettleAmountMonitorInput monitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, note.getSubType());
-		List<SettleAmountMonitorOutput> monitorOutputList = sysDeptSubService.getSettleAmountMonitor(monitorInput);
-
-		SettleAmountMonitorInput deptMonitorInput = SettleAmountMonitorInput.fromUserId(userIds, ids, note.getSubType());
-		List<SettleAmountMonitorOutput> deptAmountMonitor = sysDeptSubService.getDeptAmountMonitor(deptMonitorInput);
-
-		SettleAmountMonitorInput yaoyiMonitorInput = SettleAmountMonitorInput.fromIdCard(idCard, ids, note.getSubType());
-		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);
@@ -356,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(note.getSubType());
+		// 限额
+		MonitoringIndicator monitoringIndicator = monitoringIndicatorService.locationLimit(location);
 		BigDecimal deptLimit = sysDeptSub.getLimitAmount();
 		BigDecimal yaoyiLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
@@ -398,7 +412,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			}
 			updateEntity = new WmScorePackageSettleNote();
 			updateEntity.setId(note.getId());
-			updateEntity.setSubType(note.getSubType());
+			updateEntity.setSubType(subType);
+			updateEntity.setSubjectLocation(note.getSubjectLocation());
 			updateEntity.setInvoiceType(note.getInvoiceType());
 			updateEntity.setCategoryName(note.toCategoryName());
 			updateEntity.setSettleAmount(note.getSettleAmount());
@@ -415,7 +430,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			return R.ok();
 		} else {
 			WmScorePackageSettleNote entity = new WmScorePackageSettleNote();
-			entity.setSubType(note.getSubType());
+			entity.setSubType(subType);
+			entity.setSubjectLocation(note.getSubjectLocation());
 			entity.setInvoiceType(note.getInvoiceType());
 			entity.setCategoryName(note.toCategoryName());
 			entity.setSettleAmount(note.getSettleAmount());
@@ -487,12 +503,22 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			return R.failed("数据异常,不能结算");
 		}
 
+		SysUser sysUser = sysUserService.getById(note.getUserId());
+
+		if (input.getSubjectLocation() == null) {
+			return R.failed(sysUser.getRealname() + "人员结算渠道不存在,不能结算");
+		}
+
+		// 获取结算零工
+		GigTypeEnum gigTypeEnum = input.getSubjectLocation().getGigType();
+		String subType = String.valueOf(input.getSubjectLocation().getGigType().getCode());
+
 		/**
 		 * 结算配置信息
 		 */
 		SysDeptSub condition = new SysDeptSub();
 		condition.setDeptId(sysDept.getDeptId());
-		condition.setSubjectType(note.getSubType());
+		condition.setSubjectType(subType);
 		condition.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
 		SysDeptSub sysDeptSub = sysDeptSubService.getOne(Wrappers.query(condition));
 
@@ -500,16 +526,9 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			return R.failed("机构appId未维护");
 		}
 
-		SysUser sysUser = sysUserService.getById(note.getUserId());
-
-		// 获取结算零工
-		GigTypeEnum gigTypeEnum = GigTypeEnum.resolve(Integer.parseInt(note.getSubType()));
-
-		if (gigTypeEnum == null) {
-			return R.failed(sysUser.getRealname() + "人员结算渠道不存在,不能结算");
-		}
-
-		SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery().eq(SysUserSub::getGigType, gigTypeEnum)
+		SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getSubjectLocation, input.getSubjectLocation())
+				.eq(SysUserSub::getDeptId, sysUser.getDeptId())
 				.eq(SysUserSub::getUserId, sysUser.getUserId())
 		);
 
@@ -523,8 +542,6 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 		switch (gigTypeEnum) {
 			case REN_LI_JIA:
-			case JIN_YUAN:
-			case XIN_TAI_ZI:
 			case OLADING:
 				if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 					return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
@@ -555,9 +572,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 		}
 		// 自由职家
-		else if (SubjectTypeEnum.TYPE_OLADING.getCode().equals(note.getSubType())
-				|| SubjectTypeEnum.TYPE_JIN_YUAN.getCode().equals(note.getSubType())
-			|| SubjectTypeEnum.TYPE_XIN_TAI_ZI.getCode().equals(note.getSubType())
+		else if (SubjectTypeEnum.TYPE_OLADING.getCode().equals(subType)
 		) {
 			String taxCode = sysDept.getTaxCode();
 			return settleByOlading(note, wmScorePackage, sysUser, taxCode);
@@ -592,7 +607,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		List<SysDeptSub> subList = sysDeptSubService.list(Wrappers.query(condition));
 		Map<String, SysDeptSub> subMap = new HashMap<>();
 
-		subList.forEach(item -> subMap.put(item.getSubjectType(), item));
+		subList.forEach(item -> subMap.put(item.getSubjectLocation().name(), item));
 
 		String[] ids = input.getIdStr().split(",");
 		List<WmScorePackageSettleNote> noteList = new ArrayList<>(ids.length);
@@ -612,7 +627,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			/**
 			 * 结算配置信息
 			 */
-			SysDeptSub sysDeptSub = subMap.get(note.getSubType());
+			SysDeptSub sysDeptSub = subMap.get(note.getSubjectLocation().name());
 
 			if (null == sysDeptSub || StringUtils.isEmpty(sysDeptSub.getAppId())) {
 				return R.failed("机构appId未维护");
@@ -620,14 +635,17 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 			SysUser sysUser = sysUserService.getById(note.getUserId());
 
-			// 获取结算零工
-			GigTypeEnum gigTypeEnum = GigTypeEnum.resolve(Integer.parseInt(note.getSubType()));
-
-			if (gigTypeEnum == null) {
+			if (input.getSubjectLocation() == null) {
 				return R.failed(sysUser.getRealname() + "人员结算渠道不存在,不能结算");
 			}
 
-			SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery().eq(SysUserSub::getGigType, gigTypeEnum)
+			// 获取结算零工
+			GigTypeEnum gigTypeEnum = input.getSubjectLocation().getGigType();
+			String subType = String.valueOf(input.getSubjectLocation().getGigType().getCode());
+
+			SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery()
+					.eq(SysUserSub::getSubjectLocation, input.getSubjectLocation())
+					.eq(SysUserSub::getDeptId, sysUser.getDeptId())
 					.eq(SysUserSub::getUserId, sysUser.getUserId())
 			);
 
@@ -641,8 +659,6 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 			switch (gigTypeEnum) {
 				case REN_LI_JIA:
-				case XIN_TAI_ZI:
-				case JIN_YUAN:
 				case OLADING:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
@@ -663,7 +679,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			log.info("结算明细noteId: {} 开始结算-----------", note.getId());
 			log.info("结算渠道: {} ", note.getSubType());
 
-			if (SubjectTypeEnum.TYPE_RENLIJIA.getCode().equals(input.getSubType())) {
+			if (SubjectTypeEnum.TYPE_RENLIJIA.getCode().equals(subType)) {
 				DingConfig config = new DingConfig();
 				config.setAppId(sysDeptSub.getAppId());
 				config.setAppSecret(sysDeptSub.getAppSecret());
@@ -673,8 +689,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 			}
 			// 自由职家
-			else if (SubjectTypeEnum.TYPE_OLADING.getCode().equals(note.getSubType()) || SubjectTypeEnum.TYPE_JIN_YUAN.getCode().equals(note.getSubType())
-				|| SubjectTypeEnum.TYPE_XIN_TAI_ZI.getCode().equals(note.getSubType())) {
+			else if (SubjectTypeEnum.TYPE_OLADING.getCode().equals(subType)) {
 				oladingNoteList.add(note);
 			}
 			// 税邦云
@@ -801,16 +816,14 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 				params.put("taskDescription", "根据要求,执行、并完成学术推广活动,并以在线平台工具采集、记录活动内容");
 				params.put("acceptanceStandard", "完成不同任务获得不同任务积分,根据不同任务给与0~30000积分,每个积分兑换0.8~1.2元,按次数结算");
 
-				GigTypeEnum gigTypeEnum = GigTypeEnum.resolve(Integer.parseInt(note.getSubType()));
-
-				if (GigTypeEnum.JIN_YUAN.equals(gigTypeEnum)) {
+				if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
 					params.put("channel", "JIN_YUAN");
 					params.put("taxMode", "GENERAL");
 					params.put("transactionModel", "SUPERVISE");
 				}
 				// 海南飞亿 和 河南薪泰梓
 				else {
-					params.put("channel", GigTypeEnum.OLADING.equals(gigTypeEnum) ? "DEFAULT" : "XIN_TAI_ZI");
+					params.put("channel", SubjectLocation.FEI_YI.equals(note.getSubjectLocation()) ? "DEFAULT" : "XIN_TAI_ZI");
 					params.put("taxMode", "SPECIAL");
 					params.put("transactionModel", "CHANNEL");
 				}
@@ -1070,16 +1083,14 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			params.put("acceptanceStandard", "完成不同任务获得不同任务积分,根据不同任务给与0~30000积分,每个积分兑换0.8~1.2元,按次数结算");
 
 
-			GigTypeEnum gigTypeEnum = GigTypeEnum.resolve(Integer.parseInt(note.getSubType()));
-
-			if (GigTypeEnum.JIN_YUAN.equals(gigTypeEnum)) {
+			if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
 				params.put("channel", "JIN_YUAN");
 				params.put("taxMode", "GENERAL");
 				params.put("transactionModel", "SUPERVISE");
 			}
 			// 海南飞亿 和 河南薪泰梓
 			else {
-				params.put("channel", GigTypeEnum.OLADING.equals(gigTypeEnum) ? "DEFAULT" : "XIN_TAI_ZI");
+				params.put("channel", SubjectLocation.FEI_YI.equals(note.getSubjectLocation()) ? "DEFAULT" : "XIN_TAI_ZI");
 				params.put("taxMode", "SPECIAL");
 				params.put("transactionModel", "CHANNEL");
 			}

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

@@ -13,6 +13,7 @@ import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.mapper.WmSettleAccountReceiveMapper;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.common.ding.entity.*;
@@ -200,7 +201,8 @@ public class WmSettlementServiceImpl implements WmSettlementService {
 	private void updateUserSub(EmployCheckNotifyDataItem item, SysUser updateUser) {
 		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
 				.eq(SysUserSub::getUserId, updateUser.getUserId())
-				.eq(SysUserSub::getGigType, GigTypeEnum.REN_LI_JIA));
+				.eq(SysUserSub::getGigType, GigTypeEnum.REN_LI_JIA)
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.REN_LI_JIA));
 		LocalDateTime now = LocalDateTime.now();
 
 		if (userSub != null) {
@@ -220,6 +222,7 @@ public class WmSettlementServiceImpl implements WmSettlementService {
 			saveUserSub.setUserId(updateUser.getUserId());
 			saveUserSub.setGigType(GigTypeEnum.REN_LI_JIA);
 			saveUserSub.setGigChannel(GigChannelEnum.DEFAULT);
+			saveUserSub.setSubjectLocation(SubjectLocation.REN_LI_JIA);
 			saveUserSub.setCertRemark(item.getRemark());
 			saveUserSub.setCertStatus(item.getStatus());
 			saveUserSub.setCallbackStatus(GigCallBackStatus.RETURNED);

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

@@ -57,6 +57,7 @@ import com.qunzhixinxi.hnqz.admin.enums.PackageFinishStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ScorePackageStatusEnum;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.TaskStatusEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.WmReportMapper;
@@ -2182,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.getLocation() );
 				if (StringUtils.isNotEmpty(errorInfo)) {
 					log.error(errorInfo);
 					errorMap(errorMap, errorInfo, commonEvidenceDTO.getId());
@@ -2217,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());
-		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);
+		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());
-		List<SettleAmountMonitorOutput> yaoyiAmountMonitor = sysDeptSubService.getYaoyiAmountMonitor(yaoyiMonitorInput);
 
 		SettleAmountMonitorOutput monitorOutput = monitorOutputList.stream().filter(item -> item.getIdCardNumber()
 				.equals(user.getIdCardNumber())).findFirst().orElse(null);
@@ -2242,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());
 		BigDecimal monitoringLimit = monitoringIndicator.getLimitAmount();
 		BigDecimal yaoyiMonitoringLimit = monitoringIndicator.getYaoyiLimitAmount();
 		BigDecimal monitorAmount = settleAmount;

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

@@ -17,19 +17,19 @@
 
 	<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}
+		WHERE t.subject_location = #{query.location, 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
-		<foreach item="item" index="index" collection="query.idCard" open="(" separator="," close=")">
+		<foreach item="item" index="index" collection="query.idCards" open="(" separator="," close=")">
 			#{item}
 		</foreach>
-		<if test="query.ids != null and query.ids.size()>0">
+		<if test="query.settleNoteIds != null and query.settleNoteIds.size()>0">
 			AND t.id NOT IN
-			<foreach item="item" index="index" collection="query.ids" open="(" separator="," close=")">
+			<foreach item="item" index="index" collection="query.settleNoteIds" open="(" separator="," close=")">
 				#{item}
 			</foreach>
 		</if>
@@ -41,16 +41,16 @@
 		t.user_id,
 		sum(t.settle_amount) AS totalAmount
 		FROM wm_score_package_settle_note t
-		WHERE t.sub_type = #{query.subType,jdbcType=VARCHAR}
+		WHERE t.subject_location = #{query.location, 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
 		<foreach item="item" index="index" collection="query.userIds" open="(" separator="," close=")">
 			#{item}
 		</foreach>
-		<if test="query.ids != null and query.ids.size()>0">
+		<if test="query.settleNoteIds != null and query.settleNoteIds.size()>0">
 			AND t.id NOT IN
-			<foreach item="item" index="index" collection="query.ids" open="(" separator="," close=")">
+			<foreach item="item" index="index" collection="query.settleNoteIds" open="(" separator="," close=")">
 				#{item}
 			</foreach>
 		</if>
@@ -64,12 +64,12 @@
 		WHERE t.create_time &gt; #{query.startTime,jdbcType=TIMESTAMP}
 		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=")">
+		<foreach item="item" index="index" collection="query.idCards" open="(" separator="," close=")">
 			#{item}
 		</foreach>
-		<if test="query.ids != null and query.ids.size()>0">
+		<if test="query.settleNoteIds != null and query.settleNoteIds.size()>0">
 			AND t.id NOT IN
-			<foreach item="item" index="index" collection="query.ids" open="(" separator="," close=")">
+			<foreach item="item" index="index" collection="query.settleNoteIds" open="(" separator="," close=")">
 				#{item}
 			</foreach>
 		</if>

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

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor