瀏覽代碼

Merge branch 'feat-20220718-oladinghenan'

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java
lixuesong 3 年之前
父節點
當前提交
96547c4aa2

+ 2 - 0
db/v2.0/220719.sql

@@ -0,0 +1,2 @@
+alter table sys_dept_sub
+    modify subject_invoice_category varchar(64) null comment '税邦云用户类型对应的发票类目';

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

@@ -116,8 +116,8 @@ public interface CacheConstants {
 	String OLADING_NOTIFY_KEY = "OLADING:NOTIFY:KEY:";
 
 	/**
-	 * 自由职家同时发起两个渠道记录key
+	 * 发起阿拉丁认证渠道记录key
 	 */
-	String OLADING_SEND_BOTH_CHANNEL = "OLADING:SEND:BOTH:CHANNEL:";
+	String OLADING_CERT_SEND_CHANNEL = "OLADING:CERT:SEND:CHANNEL:";
 
 }

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

@@ -20,6 +20,7 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.bean.BeanUtil;
@@ -80,6 +81,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author hnqz
@@ -1432,9 +1434,15 @@ public class SysUserController {
 	 */
 	@GetMapping("/selectUserList")
 	public R selectUserList(Page page, UserDTO userDTO) {
-		if (!"0".equals(userDTO.getSubType()) && !"1".equals(userDTO.getSubType())
-				&& !"2".equals(userDTO.getSubType()) && !"3".equals(userDTO.getSubType())) {
-			userDTO.setSubType(null);
+		if (StrUtil.isNotBlank(userDTO.getSubType())) {
+			String[] gigTypeArr = Stream.of(GigTypeEnum.values())
+					.map(GigTypeEnum::getCode)
+					.map(String::valueOf)
+					.toArray(String[]::new);
+			if (!ArrayUtil.containsAny(userDTO.getSubType().split(StrUtil.COMMA), gigTypeArr)) {
+				// 只接收已有的渠道类型值
+				userDTO.setSubType(null);
+			}
 		}
 
 		IPage<UserVO> userVosPage = userService.selectUserList(page, userDTO);
@@ -1492,6 +1500,9 @@ public class SysUserController {
 							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);
@@ -1519,6 +1530,9 @@ public class SysUserController {
 											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 = "";
 										}
@@ -1546,6 +1560,10 @@ public class SysUserController {
 						certStatusNameList.add(StrUtil.isBlank(certStatusMap.get(GigTypeEnum.JIN_YUAN)) ?
 								OladingCertStatus.UN_SIGNED.getMessage() : certStatusMap.get(GigTypeEnum.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));
+					}
 					userVO.setCertStatusArr(certStatusNameList.toArray(new String[0]));
 				}
 			}

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

@@ -27,8 +27,12 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 用户签约认证
@@ -205,6 +209,20 @@ public class SysUserSignCertController {
 				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))
+					.collect(Collectors.toList());
+			// 选择的渠道的阿拉钉的部分记录到redis
+			String redisKey = CacheConstants.OLADING_CERT_SEND_CHANNEL + userSignCertDTO.getUserId();
+			redisTemplate.opsForValue().set(redisKey, JSONUtil.toJsonStr(sortedList), 24, TimeUnit.HOURS);
+		}
+
 		sysUserSignCertService.batchChannelCert(userSignCertDTO);
 
 		return R.ok();
@@ -263,6 +281,9 @@ public class SysUserSignCertController {
 	public R<?> getSignCertResult(@PathVariable("userId") Integer userId) {
 		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userId;
 		String response = (String) redisTemplate.opsForValue().get(key);
+
+		log.info("查询签约认证结果:key={}, value={}", key,  response);
+
 		if (response == null) {
 			return R.failed("没有结果");
 		}

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

@@ -8,6 +8,7 @@ import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 import java.time.LocalDateTime;
 
@@ -18,6 +19,7 @@ import java.time.LocalDateTime;
  * @date 2022年03月01日 18:17
  */
 @Data
+@ToString
 @EqualsAndHashCode(callSuper = true)
 @TableName("sys_user_sub")
 public class SysUserSub extends Model<SysUserSub> {

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

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

+ 53 - 39
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java

@@ -3,6 +3,7 @@ package com.qunzhixinxi.hnqz.admin.mq;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -39,6 +40,7 @@ import org.springframework.messaging.handler.annotation.Header;
 import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -92,8 +94,6 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 					resMap.put("res", JSONUtil.toJsonStr(subjectTypes));
 					return resMap;
 				}
-				// 加redis锁 TODO
-//				redisTemplate.opsForValue().setIfAbsent()
 
 				List<SysDept> deptList = sysDeptService.list(Wrappers.<SysDept>lambdaQuery()
 						.eq(SysDept::getTaxCode, entpriseCode)
@@ -119,6 +119,7 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 							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);
 								break;
@@ -129,7 +130,7 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 								this.oladingHandler(user, dept, subjectResult);
 								break;
 							case YEE:
-//								yeeHandler(user, dept, subjectResult);
+								this.yeeHandler(user, dept, subjectResult);
 								break;
 							default:
 						}
@@ -257,11 +258,6 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		}
 
 		sysUserSubService.update(updateWrapper);
-		// 如果是核身视频回调,则同步该账号的自由职家渠道认证状态 TODO
-	}
-
-	private void renlijiaHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
-		// TODO
 	}
 
 	/**
@@ -273,51 +269,68 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 	 */
 	private void oladingHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
 
-		// 处理阿拉钉-海南飞亿
-		Map<String, String> o1Map = this.oladingChannelHandler(user, dept, subjectResult, GigTypeEnum.OLADING);
+		// 查询redis是否有同时发起的标记
+		String oladingRedisKey = CacheConstants.OLADING_CERT_SEND_CHANNEL + user.getUserId();
+		String gigTypeJson = (String) redisTemplate.opsForValue().get(oladingRedisKey);
+		if (JSONUtil.isJsonArray(gigTypeJson)) {
+			log.info("redis同时发起的标记:key={}, value={}", oladingRedisKey, gigTypeJson);
+		}
 
-		// 处理阿拉钉-金园数科
-		Map<String, String> o2Map = this.oladingChannelHandler(user, dept, subjectResult, GigTypeEnum.JIN_YUAN);
+		JSONArray gigTypeArray = JSONUtil.parseArray(gigTypeJson);
 
-		// 查询redis是否有同时发起的标记
-		String redisKey = CacheConstants.OLADING_SEND_BOTH_CHANNEL + user.getUserId();
-		Object userId = redisTemplate.opsForValue().get(redisKey);
+		// 根据选择的渠道,分别更新并查询认证状态
+		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)))));
 
 		// 结果放到redis
-		Map<String, Object> resultMap = new HashMap<>();
-		if (userId != null) {
-			// 同时发起的情况,且是金园数科的状态已返回,则返回两个渠道状态
+		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)))
+					.collect(Collectors.toList());
 			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, user.getUserId())
 					.eq(SysUserSub::getDeptId, dept.getDeptId())
-					.in(SysUserSub::getGigType, GigTypeEnum.OLADING, GigTypeEnum.JIN_YUAN));
-			Map<String, Map<String, String>> resultMap2 = subList.stream()
+					.in(SysUserSub::getGigType, gigTypeEnumList));
+			Map<String, Map<String, String>> dbResultMap = subList.stream()
 					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
 							sysUserSub -> MapUtil.builder("certStatus",
 									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
-			resultMap.putAll(resultMap2);
-			// 删除同时发起的redis key
-//			redisTemplate.delete(redisKey);
+			resultMap.putAll(dbResultMap);
 		} else {
-			if (CollUtil.isNotEmpty(o1Map)) {
-				resultMap.put(GigTypeEnum.OLADING.name(), o1Map);
-			}
-			if (CollUtil.isNotEmpty(o2Map)) {
-				resultMap.put(GigTypeEnum.JIN_YUAN.name(), o2Map);
-			}
+			// 只有一个渠道的情况
+			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);
 
-		// 处理同时发起时另一个渠道需要的补发情况
-		Object userId2 = redisTemplate.opsForValue().get(redisKey);
-		if (userId2 != null && CollUtil.isNotEmpty(o1Map) && OladingCertStatus.CERT.name().equals(o1Map.get("certStatus"))) {
-			// 如果同一人同时存在海南飞亿、金园数科的渠道,则补发一次(由于阿拉钉同一人不同渠道的回调只有一次,所以这里需要补发)
-			log.info("=============================补发阿拉钉另一渠道MQ4==================================");
-			UserSignCertDTO reCertDTO = new UserSignCertDTO();
-			reCertDTO.setUserId(user.getUserId());
-			reCertDTO.setGigTypeList(Collections.singletonList(GigTypeEnum.JIN_YUAN));
-			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);
+				}
+			}
 		}
 	}
 
@@ -335,6 +348,7 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		String uploadTaxPayerAgreementStatus = subjectResult.getStr("uploadTaxPayerAgreementStatus");
 		LocalDateTime now = LocalDateTime.now();
 		Map<String, String> certStatusMap = new HashMap<>();
+		certStatusMap.put("certStatus", OladingCertStatus.UN_SIGNED.name());
 
 		// 查询当前认证状态
 		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
@@ -343,7 +357,7 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 				.eq(SysUserSub::getCallbackStatus, GigCallBackStatus.IN_PROGRESS)
 				.eq(SysUserSub::getGigType, gigType));
 		if (userSub == null) {
-			return null;
+			return certStatusMap;
 		}
 
 		// 拼接更新条件

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

@@ -2,6 +2,7 @@ package com.qunzhixinxi.hnqz.admin.service.gig.impl;
 
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -276,19 +277,27 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
 		Map<String, Object> result = MapUtil.newHashMap(2);
 		result.put(userSub.getGigType().name(), new HashMap<>(subMap));
-		// 查询redis是否有同时发起的标记
-		String redisKey = CacheConstants.OLADING_SEND_BOTH_CHANNEL + userSub.getUserId();
-		Object userId = redisTemplate.opsForValue().get(redisKey);
-		if (userId != null && GigTypeEnum.OLADING.equals(userSub.getGigType())) {
-			// 将金园数科的状态,补充进来
-			SysUserSub feiyiSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+
+		// 查询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)))
+					.collect(Collectors.toList());
+			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, userSub.getUserId())
 					.eq(SysUserSub::getDeptId, userSub.getDeptId())
-					.eq(SysUserSub::getGigType, GigTypeEnum.JIN_YUAN));
-			result.put(GigTypeEnum.JIN_YUAN.name(),
-					MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(feiyiSub.getCertStatus())).name()).build());
+					.in(SysUserSub::getGigType, gigTypeEnumList));
+			Map<String, Map<String, String>> dbResultMap = subList.stream()
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+							sysUserSub -> MapUtil.builder("certStatus",
+									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
+			result.putAll(dbResultMap);
 		}
 
+		log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(result));
 		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
 
 		// 如果成功,则发送证照上传MQ
@@ -344,21 +353,30 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
 		Map<String, Object> result = MapUtil.newHashMap(2);
 		result.put(userSub.getGigType().name(), new HashMap<>(subMap));
-		// 查询redis是否有同时发起的标记
-		String redisKey = CacheConstants.OLADING_SEND_BOTH_CHANNEL + userSub.getUserId();
-		Object userId = redisTemplate.opsForValue().get(redisKey);
-		if (userId != null && GigTypeEnum.OLADING.equals(userSub.getGigType())) {
-			// 将金园数科的状态,补充进来
-			SysUserSub feiyiSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+
+		// 查询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)))
+					.collect(Collectors.toList());
+			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, userSub.getUserId())
 					.eq(SysUserSub::getDeptId, userSub.getDeptId())
-					.eq(SysUserSub::getGigType, GigTypeEnum.JIN_YUAN));
-			result.put(GigTypeEnum.JIN_YUAN.name(),
-					MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(feiyiSub.getCertStatus())).name()).build());
+					.in(SysUserSub::getGigType, gigTypeEnumList));
+			Map<String, Map<String, String>> dbResultMap = subList.stream()
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+							sysUserSub -> MapUtil.builder("certStatus",
+									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
+			result.putAll(dbResultMap);
 		}
 
+		log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(result));
 		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
 
+
 		// 如果成功,则发送协议上传MQ
 		if (OladingCommonRequest.UploadIdCardImageStatus.IDENTIFY_SUCCESS.equals(uploadIdCertStatus)) {
 			log.info("=============================发送协议上传MQ==================================");
@@ -410,19 +428,27 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + userSub.getUserId();
 		Map<String, Object> result = MapUtil.newHashMap(2);
 		result.put(userSub.getGigType().name(), new HashMap<>(subMap));
-		// 查询redis是否有同时发起的标记
-		String redisKey = CacheConstants.OLADING_SEND_BOTH_CHANNEL + userSub.getUserId();
-		Object userId = redisTemplate.opsForValue().get(redisKey);
-		if (userId != null && GigTypeEnum.JIN_YUAN.equals(userSub.getGigType())) {
-			// 将海南飞亿的状态,补充进来
-			SysUserSub feiyiSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+
+		// 查询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)))
+					.collect(Collectors.toList());
+			List<SysUserSub> subList = sysUserSubService.list(Wrappers.<SysUserSub>lambdaQuery()
 					.eq(SysUserSub::getUserId, userSub.getUserId())
 					.eq(SysUserSub::getDeptId, userSub.getDeptId())
-					.eq(SysUserSub::getGigType, GigTypeEnum.OLADING));
-			result.put(GigTypeEnum.OLADING.name(),
-					MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(feiyiSub.getCertStatus())).name()).build());
+					.in(SysUserSub::getGigType, gigTypeEnumList));
+			Map<String, Map<String, String>> dbResultMap = subList.stream()
+					.collect(Collectors.toMap(sysUserSub -> sysUserSub.getGigType().name(),
+							sysUserSub -> MapUtil.builder("certStatus",
+									OladingCertStatus.resolve(String.valueOf(sysUserSub.getCertStatus())).name()).build()));
+			result.putAll(dbResultMap);
 		}
 
+		log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(result));
 		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(result), 1, TimeUnit.MINUTES);
 
 		if (OladingCommonRequest.UploadTaxpayerAgreementStatus.SUCCESS.equals(agreementStatus)) {

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

@@ -51,7 +51,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -145,6 +146,10 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 						// 渠道是金园,则展示阿拉钉的状态
 						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:
 				}
 
@@ -299,8 +304,17 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 		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))
+							.collect(Collectors.toList());
+
 			// 封装请求数据
-			userSubList.stream().filter(sysUserSub -> {
+			userSubList.stream()
+					.sorted(Comparator.comparing(sysUserSub -> sysUserSub.getGigType().getCode()))
+					.filter(sysUserSub -> {
 				// 过滤掉认证成功的数据
 				if (GigTypeEnum.TAX_HELPOR.equals(sysUserSub.getGigType())
 						&& TaxHelperCertStatus.CHECKED_UNBIND.getCode() != sysUserSub.getCertStatus()
@@ -308,12 +322,12 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return true;
 				} else if (GigTypeEnum.YEE.equals(sysUserSub.getGigType())
 						&& !YeeCertStatus.SIGNED.getCode().equals(String.valueOf(sysUserSub.getCertStatus()))) {
-					// 易联并且渠道是默认
 					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()) {
@@ -321,14 +335,16 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 				}
 				return false;
 			}).forEach(userSub -> {
-				// 请求流水号
-				String requestId = RandomStringUtils.randomAlphabetic(16);
 
 				// 发起前置判断
-				if (!this.preSignCert(sysUser, userSub, userSignCertDTO, requestId)) {
+				if (!this.preSignCert(sysUser, userSub, userSignCertDTO, oladingTypeList)) {
 					// false直接返回,不发送mq
+					log.info("本次不发起认证,userSubId={}", userSub.getId());
 					return;
+
 				}
+				// 请求流水号
+				String requestId = RandomStringUtils.randomAlphabetic(16);
 
 				// 是否需要传核身视频,阿拉丁、易联默认都要传
 				boolean uploadFaceID = userSignCertDTO.getUploadFaceID() != null && userSignCertDTO.getUploadFaceID();
@@ -354,20 +370,43 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 	/**
 	 * 签约认证前的前置判断
 	 *
-	 * @param sysUser
-	 * @param userSub
-	 * @param userSignCertDTO
-	 * @param requestId
+	 * @param sysUser 用户信息
+	 * @param userSub userSub信息
+	 * @param userSignCertDTO 发起参数
+	 * @param oladingTypeList 阿拉钉渠道类型list
 	 */
-	private boolean preSignCert(SysUser sysUser, SysUserSub userSub, UserSignCertDTO userSignCertDTO, String requestId) {
+	private boolean preSignCert(SysUser sysUser, SysUserSub userSub, UserSignCertDTO userSignCertDTO, Collection<GigTypeEnum> oladingTypeList) {
 		// 校验是否有进行中的
 		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);
@@ -382,18 +421,9 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return false;
 				}
 
-				// 如果存在相同手机号、身份证、姓名信息的用户,并且是认证过,则不发起,直接返回签约认证状态
-//				if (this.checkExistCerted(sysUser, userSub)) {
-//					// 直接返回,不发起
-//					return false;
-//				}
-
-				// 如果同时包含阿拉钉金园数科、海南飞亿,则只选海南飞亿发起
-				if (userSignCertDTO.getGigTypeList().containsAll(CollUtil.toList(GigTypeEnum.OLADING, GigTypeEnum.JIN_YUAN))) {
-					// 记录同时选择了阿拉钉金园数科、海南飞亿渠道,用来标记其在海南飞亿认证完后需要被发起
-					// 即,同时选择了阿拉钉金园数科、海南飞亿渠道,则先发起海南飞亿认证,完成之后再发起金园数科认证
-					String redisKey = CacheConstants.OLADING_SEND_BOTH_CHANNEL + sysUser.getUserId();
-					redisTemplate.opsForValue().set(redisKey, sysUser.getUserId());
+				// 如果同时包含阿拉钉多个渠道,则只选第一个发起
+				if (oladingTypeList.size() > 1 && !oladingTypeList.stream().findFirst().get().equals(GigTypeEnum.JIN_YUAN)) {
+					// 同时选择了阿拉钉金园数科、海南飞亿、河南薪泰梓渠道的两个及以上,则先发起第一个,完成之后再依次发起其他的
 					return false;
 				}
 
@@ -410,11 +440,12 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return false;
 				}
 
-				// 如果存在相同手机号、身份证、姓名信息的用户,并且是认证过,则不发起,直接返回签约认证状态
-//				if (this.checkExistCerted(sysUser, userSub)) {
-//					// 直接返回,不发起
-//					return false;
-//				}
+				// 如果同时包含阿拉钉多个渠道,则只选第一个发起
+				if (oladingTypeList.size() > 1 && !oladingTypeList.stream().findFirst().get().equals(GigTypeEnum.OLADING)) {
+					// 同时选择了阿拉钉金园数科、海南飞亿、河南薪泰梓渠道的两个及以上,则先发起第一个,完成之后再依次发起其他的
+					return false;
+				}
+
 				return true;
 			case REN_LI_JIA:
 				// 人力家直接调用原有发短信接口