소스 검색

Merge branch 'feat-20240205-hechuang'

lixuesong 1 년 전
부모
커밋
3072a5d23f

+ 5 - 0
db/v2.0/20240205.sql

@@ -0,0 +1,5 @@
+alter table sys_dept_sub
+    modify subject_location varchar(64) null comment '税源地';
+
+alter table sys_user_sub
+    modify subject_location varchar(64) null comment '税源地';

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

@@ -172,6 +172,11 @@ public interface CacheConstants {
 	 */
 	String OLADING_CERT_SEND_CHANNEL = "OLADING:CERT:SEND:CHANNEL:";
 
+	/**
+	 * 发起合创众盈认证渠道记录key
+	 */
+	String HE_CHUANG_CERT_SEND_CHANNEL = "HE:CHUANG:CERT:SEND:CHANNEL:";
+
 	/**
 	 * E证通获取认证结果key
 	 */

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java

@@ -84,6 +84,21 @@ public class GigThirdApiController {
 
 	private final RedisTemplate redisTemplate;
 
+	/**
+	 * 薪事易结算异步通知回调
+	 *
+	 * @param body 请求参数
+	 * @param headers 请求头
+	 * @return
+	 */
+	@Inner(value = false)
+	@SysLog("薪事易结算异步通知回调")
+	@PostMapping("/xinshiyi/pay-notify")
+	public String xinShiYiSettleNotifyRequest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
+		log.info("福建企赋结算请求方法参数:body={}, headers={}", body, headers);
+
+		return "OK";
+	}
 
 	/**
 	 * 福建企赋结算异步通知回调

+ 12 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserSignCertController.java

@@ -316,6 +316,18 @@ public class SysUserSignCertController {
 			redisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(sortedList), 24, TimeUnit.HOURS);
 		}
 
+		// 过滤出合创众盈的渠道
+		Collection<SubjectLocation> hechuangList =
+				CollUtil.intersection(CollUtil.toList(userSignCertDTO.getSubjectLocation()), SubjectLocation.getByGigType(GigTypeEnum.HE_CHUANG));
+		if (!hechuangList.isEmpty()) {
+			List<SubjectLocation> sortedList = hechuangList.stream()
+					.sorted(Comparator.comparing(SubjectLocation::getSort))
+					.collect(Collectors.toList());
+			// 选择的渠道的阿拉钉的部分记录到redis
+			String redisKey = CacheConstants.HE_CHUANG_CERT_SEND_CHANNEL + userSignCertDTO.getUserId();
+			redisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(sortedList), 24, TimeUnit.HOURS);
+		}
+
 		sysUserSignCertService.batchChannelCert(userSignCertDTO);
 
 		return R.ok();

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java

@@ -28,9 +28,14 @@ public enum GigTypeEnum {
 	QI_FU(9, "福建企赋", "福建企赋", ZhongYiYunCertStatus.class),
 	SHEN_ZHEN_REN_CAI(10, "深圳人才", "深圳人才", OladingCertStatus.class),
 	YI_MA(11, "易马财税", "易马财税", ZhengQiZhiXingCertStatus.class),
+	XIN_SHI_YI(12, "薪事易", "薪事易", XinShiYiCertStatus.class),
 
+	HE_CHUANG(13, "合创众盈", "合创众盈", OladingCertStatus.class),
 	MAH_SETTLE(99, "MAH结算", "MAH结算", null);
 
+	/**
+	 * 对应原有subjectType值
+	 */
 	@EnumValue
 	private int code;
 
@@ -70,6 +75,7 @@ public enum GigTypeEnum {
 				break;
 			case OLADING:
 			case SHEN_ZHEN_REN_CAI:
+			case HE_CHUANG:
 				certStatusStr = OladingCertStatus.resolve(String.valueOf(certStatus)).name();
 				break;
 			case ZHENG_QI_ZHI_XING:
@@ -91,6 +97,9 @@ public enum GigTypeEnum {
 			case QI_FU:
 				certStatusStr = ZhongYiYunCertStatus.resolve(certStatus).name();
 				break;
+			case XIN_SHI_YI:
+				certStatusStr = XinShiYiCertStatus.resolve(certStatus).name();
+				break;
 			default:
 		}
 
@@ -118,6 +127,7 @@ public enum GigTypeEnum {
 				break;
 			case OLADING:
 			case SHEN_ZHEN_REN_CAI:
+			case HE_CHUANG:
 				certStatusStr = OladingCertStatus.resolve(String.valueOf(certStatus)).getMessage();
 				break;
 			case ZHENG_QI_ZHI_XING:
@@ -139,6 +149,9 @@ public enum GigTypeEnum {
 			case QI_FU:
 				certStatusStr = ZhongYiYunCertStatus.resolve(certStatus).getMessage();
 				break;
+			case XIN_SHI_YI:
+				certStatusStr = XinShiYiCertStatus.resolve(certStatus).getMessage();
+				break;
 			default:
 		}
 

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

@@ -54,6 +54,12 @@ public enum SubjectLocation {
 	// 正启之星
 	YI_MA("YI_MA",  GigTypeEnum.YI_MA, "易马财税", 16, "yi_ma_invoice"),
 
+	XIN_SHI_YI("XIN_SHI_YI", GigTypeEnum.XIN_SHI_YI, "薪事易-海南飞亿", 17, "xinshiyi_invoice"),
+
+
+	// 合创众盈
+	HE_CHUANG_ZHONG_ZHI("HE_CHUANG_ZHONG_ZHI", GigTypeEnum.HE_CHUANG, "合创众盈-天津中智", 18, "hechuang_zhongzhi_invoice"),
+	HE_CHUANG_REN_CAI_YUN("HE_CHUANG_REN_CAI_YUN", GigTypeEnum.HE_CHUANG, "合创众盈-福州人才云", 19, "hechuang_rencaiyun_invoice"),
 
 	MAH_SETTLE("MAH_SETTLE", GigTypeEnum.MAH_SETTLE, "MAH结算", 99, "");
 

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

@@ -23,6 +23,8 @@ public enum SubjectTypeEnum {
 	TYPE_SHEN_ZHEN_REN_CAI("10", "深圳人才"),
 	TYPE_YI_MA("11", "易马财税"),
 
+	TYPE_HE_CHUANG("13", "合创众盈"),
+
 	ENABLE_FLAG_FALSE("0", "无效"),
 	ENABLE_FLAG_TRUE("1", "有效"),
 

+ 37 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/XinShiYiCertStatus.java

@@ -0,0 +1,37 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 薪事易认证状态
+ *
+ * @author lixuesong
+ * @date 2024/02/04
+ */
+@Getter
+@AllArgsConstructor
+public enum XinShiYiCertStatus {
+	UN_SIGN(0, "未签约"),
+	CERT(1, "已认证"),
+	SIGN(2, "已签约");
+
+	private final int code;
+
+	private final String message;
+
+	/**
+	 * 根据枚举编码获取枚举对象
+	 *
+	 * @param code 枚举编码
+	 * @return 如果存在返回枚举,否则返回 {@code null}
+	 */
+	public static XinShiYiCertStatus resolve(final int code) {
+		for (XinShiYiCertStatus certStatus : XinShiYiCertStatus.values()) {
+			if (certStatus.getCode() == code) {
+				return certStatus;
+			}
+		}
+		return UN_SIGN;
+	}
+}

+ 98 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java

@@ -121,7 +121,7 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 								this.taxHelperHandler(user, dept, subjectResult);
 								break;
 							case REN_LI_JIA:
-								// TODO
+								// 无需处理
 								break;
 							case OLADING:
 								this.oladingHandler(user, dept, subjectResult);
@@ -153,6 +153,11 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 							case YI_MA:
 								this.zhengQiZhiXingHandler(user, dept, subjectResult, GigTypeEnum.YI_MA);
 								break;
+							case XIN_SHI_YI:
+								this.xinShiYiHandler(user, dept, subjectResult);
+							case HE_CHUANG:
+								this.heChuangHandler(user, dept, subjectResult);
+								break;
 							default:
 						}
 					});
@@ -169,6 +174,49 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
         });
     }
 
+	/**
+	 * 众蚁云结果处理
+	 *
+	 * @param user          用户
+	 * @param dept          部门
+	 * @param subjectResult 结果
+	 */
+	private void xinShiYiHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		String code = subjectResult.getStr("code");
+		String certStatus = subjectResult.getStr("certStatus");
+		LocalDateTime now = LocalDateTime.now();
+		XinShiYiCertStatus certStatusEnum = Enum.valueOf(XinShiYiCertStatus.class, certStatus);
+
+		// 拼接更新条件
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
+				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.XIN_SHI_YI)
+				.eq(SysUserSub::getGigType, GigTypeEnum.XIN_SHI_YI)
+				.set(SysUserSub::getUpdateTime, now)
+				.set(SysUserSub::getUpdateUser, 0)
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
+
+		if (XinShiYiCertStatus.SIGN.equals(certStatusEnum)) {
+			// 已签约 即对应这里的已认证
+			updateWrapper.set(SysUserSub::getCertStatus, XinShiYiCertStatus.CERT.getCode());
+			updateWrapper.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED);
+		} else {
+			updateWrapper.set(SysUserSub::getCertStatus, certStatusEnum.getCode());
+		}
+
+		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(SubjectLocation.XIN_SHI_YI.getType(), 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);
+	}
+
 	/**
 	 * 福建企赋结果处理
 	 *
@@ -565,6 +613,55 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		sysUserSubService.update(updateWrapper);
 	}
 
+	/**
+	 * 合创众盈数据处理(这里只保存mq回调结果,实际业务处理放到阿拉丁直接回调接口里了)
+	 *
+	 * @param user
+	 * @param dept
+	 * @param subjectResult
+	 */
+	private void heChuangHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+
+		// 查询redis是否有同时发起的标记
+		String oladingRedisKey = CacheConstants.HE_CHUANG_CERT_SEND_CHANNEL + user.getUserId();
+		String gigTypeJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
+		if (JSONUtil.isJsonArray(gigTypeJson)) {
+			log.info("redis同时发起的标记:key={}, value={}", oladingRedisKey, gigTypeJson);
+		}
+
+		JSONArray gigTypeArray = JSONUtil.parseArray(gigTypeJson);
+
+		// 根据选择的渠道,分别更新并查询认证状态
+		Map<String, Map<String, String>> certResultMap = new LinkedHashMap<>(3);
+		gigTypeArray.forEach(o -> certResultMap.put(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<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::getSubjectLocation, subjectLocationList));
+			Map<String, Map<String, String>> dbResultMap = subList.stream()
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getSubjectLocation().name(),
+							sysUserSub -> MapUtil.builder("certStatus",
+									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
+			resultMap.putAll(dbResultMap);
+		} else {
+			// 只有一个渠道的情况
+			resultMap.putAll(certResultMap);
+		}
+		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);
+	}
+
+
 	/**
 	 * 自由职家数据处理(这里只保存mq回调结果,实际业务处理放到阿拉丁直接回调接口里了)
 	 *

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

@@ -349,6 +349,7 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 				}
 			case OLADING:
 			case SHEN_ZHEN_REN_CAI:
+			case HE_CHUANG:
 				// 自由职家
 				if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(userSub.getCertStatus()))
 						|| OladingCertStatus.SIGNING.getCode().equals(String.valueOf(userSub.getCertStatus()))
@@ -449,6 +450,12 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 				}
 				this.updateUserCertStatus(userSub.getId(), "内部状态对其", ZhongYiYunCertStatus.SIGN.getCode(), null);
 				return R.ok();
+			case XIN_SHI_YI:
+				if (userSub.getCertStatus() > XinShiYiCertStatus.UN_SIGN.getCode()) {
+					return R.ok();
+				}
+				this.updateUserCertStatus(userSub.getId(), "内部状态对其", XinShiYiCertStatus.SIGN.getCode(), null);
+				return R.ok();
 			default:
 				message = "不支持该税源地操作";
 		}
@@ -680,6 +687,10 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return true;
 				} else if (GigTypeEnum.YI_MA.equals(sysUserSub.getGigType())) {
 					return true;
+				} else if (GigTypeEnum.XIN_SHI_YI.equals(sysUserSub.getGigType())) {
+					return true;
+				} else if (GigTypeEnum.HE_CHUANG.equals(sysUserSub.getGigType())) {
+					return true;
 				}
 				return false;
 			}).forEach(userSub -> {

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

@@ -197,6 +197,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 				case QI_FU:
 				case SHEN_ZHEN_REN_CAI:
 				case YI_MA:
+				case XIN_SHI_YI:
+				case HE_CHUANG:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						throw new RuntimeException(user.getRealname() + "未认证,不能发起结算");
 					}

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

@@ -806,6 +806,10 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 		else if (SubjectTypeEnum.TYPE_YI_MA.getCode().equals(subType)){
 			return this.settleByYiMa(input, wmScorePackage, taxCode, operator);
 		}
+		// 合创众盈
+		else if (SubjectTypeEnum.TYPE_HE_CHUANG.getCode().equals(subType)) {
+			return settleByOlading(input, wmScorePackage, taxCode, operator);
+		}
 		// 税邦云
 		else {
 			log.info("税邦云结算开始-获取会员所属企业的统一社会信用代码:{} ", taxCode);

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

@@ -656,6 +656,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			case QI_FU:
 			case SHEN_ZHEN_REN_CAI:
 			case YI_MA:
+			case XIN_SHI_YI:
+			case HE_CHUANG:
 				if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 					return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
 				}
@@ -725,7 +727,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			String taxCode = sysDept.getTaxCode();
 			return this.settleByQiFu(note, wmScorePackage, sysUser, taxCode, sysDeptSub.getPathNo());
 		}
-		// 自由职家
+		// 深圳人才
 		else if (SubjectTypeEnum.TYPE_SHEN_ZHEN_REN_CAI.getCode().equals(subType)) {
 			String taxCode = sysDept.getTaxCode();
 			return settleByOlading(note, wmScorePackage, sysUser, taxCode);
@@ -735,6 +737,11 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			String taxCode = sysDept.getTaxCode();
 			return this.settleByYiMa(note, wmScorePackage, sysUser, taxCode);
 		}
+		// 合创众盈
+		else if (SubjectTypeEnum.TYPE_HE_CHUANG.getCode().equals(subType)) {
+			String taxCode = sysDept.getTaxCode();
+			return settleByOlading(note, wmScorePackage, sysUser, taxCode);
+		}
 		// 税邦云
 		else {
 			String taxCode = sysDept.getTaxCode();
@@ -772,6 +779,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		List<WmScorePackageSettleNote> oladingNoteList = new ArrayList<>(ids.length);
 		List<WmScorePackageSettleNote> fuJianQiFuNoteList = new ArrayList<>(ids.length);
 		List<WmScorePackageSettleNote> shenZhenRenCaiNoteList = new ArrayList<>(ids.length);
+		List<WmScorePackageSettleNote> hechuangNoteList = new ArrayList<>(ids.length);
 		List<WmScorePackageSettleNote> zhengQiZhiXingNoteList = new ArrayList<>(ids.length);
 		List<WmScorePackageSettleNote> huiQiYunNoteList = new ArrayList<>(ids.length);
 		List<WmScorePackageSettleNote> zhongZhiNoteList = new ArrayList<>(ids.length);
@@ -838,6 +846,8 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 				case QI_FU:
 				case SHEN_ZHEN_REN_CAI:
 				case YI_MA:
+				case XIN_SHI_YI:
+				case HE_CHUANG:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
 					}
@@ -906,6 +916,10 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			else if (SubjectTypeEnum.TYPE_YI_MA.getCode().equals(subType)) {
 				yiMaNoteList.add(note);
 			}
+			// 合创众盈
+			else if (SubjectTypeEnum.TYPE_HE_CHUANG.getCode().equals(subType)) {
+				hechuangNoteList.add(note);
+			}
 			// 税邦云
 			else {
 				noteList.add(note);
@@ -1005,8 +1019,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			} else {
 				return R.failed("未配置企业的统一社会信用代码");
 			}
-			SysDeptSub sysDeptSub = subMap.get(SubjectLocation.QI_FU.name());
-			return this.batchSettleByQiFu(shenZhenRenCaiNoteList, taxCode, sysDeptSub.getPathNo());
+			return this.batchSettleByOlading(shenZhenRenCaiNoteList, taxCode);
 		}
 
 		// 易马
@@ -1019,6 +1032,16 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			return this.batchSettleByYiMa(yiMaNoteList, taxCode);
 		}
 
+		// 合创众盈
+		if (CollectionUtils.isNotEmpty(hechuangNoteList)) {
+			if (StringUtils.isNotEmpty(taxCode)) {
+				log.info("合创众盈结算开始-获取会员所属企业的统一社会信用代码:{} ", taxCode);
+			} else {
+				return R.failed("未配置企业的统一社会信用代码");
+			}
+			return this.batchSettleByOlading(hechuangNoteList, taxCode);
+		}
+
 		return R.ok();
 	}