Sfoglia il codice sorgente

feat: 福建企赋结算回调2

lixuesong 1 anno fa
parent
commit
44cfffaa9d

+ 3 - 2
db/v2.0/230725.sql

@@ -2,9 +2,10 @@ create table qifu_input_record
 (
     id           int auto_increment comment '主键id'
         primary key,
-    req_msg_id   varchar(64)                        null comment '报文流水号',
+    req_type     varchar(20)                        not null comment '请求业务类型',
+    req_id       varchar(64)                        null comment '请求序号',
     req_body     text                               null comment '请求body',
     decrypt_body text                               null comment '解密后的body',
     create_time  datetime default CURRENT_TIMESTAMP null comment '创建时间'
 )
-    comment '福建企赋回调异步通知记录';
+    comment '福建企赋回调异步通知记录';

+ 93 - 17
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java

@@ -83,39 +83,115 @@ public class GigThirdApiController {
 
 
 	/**
-	 * 福建企赋异步通知回调
+	 * 福建企赋结算异步通知回调
 	 *
 	 * @param body
 	 * @param headers
 	 * @return
 	 */
 	@Inner(value = false)
-	@SysLog("福建企赋异步通知回调")
-	@PostMapping("/qifu")
-	public String qiFuRequest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
-		log.info("福建企赋请求方法参数:body={}, headers={}", body, headers);
+	@SysLog("福建企赋结算异步通知回调")
+	@PostMapping("/qifu/pay-notify")
+	public String qiFuSettleNotifyRequest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
+		log.info("福建企赋结算请求方法参数:body={}, headers={}", body, headers);
 
 		// 请求body json
 		JSONObject bodyJson = JSONUtil.parseObj(body);
 
+		// 请求序号
+		String reqId = bodyJson.getStr("reqId");
 
-		String reqMsgId = bodyJson.getStr("reqMsgId");
-		String redisKey = String.format("%s_%s", CacheConstants.QI_FU_NOTIFY_KEY, reqMsgId);
-		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, reqMsgId, 30, TimeUnit.MINUTES);
-		if (!absent) {
-			log.warn("存在在途操作reqMsgId={}", reqMsgId);
-			return "FAIL";
+		String redisKey = String.format("%s_%s", CacheConstants.ZHONG_YI_YUN_SETTLE_NOTIFY_KEY, reqId);
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, reqId, 30, TimeUnit.MINUTES);
+		if (Boolean.FALSE.equals(absent)) {
+			log.warn("存在在途操作reqId={}", reqId);
+			return "fail";
 		}
 
 		// 请求记录到数据库
-		QifuInputRecord record = new QifuInputRecord();
-		record.setReqMsgId(reqMsgId);
-		record.setReqBody(body);
-		qifuInputRecordMapper.insert(record);
+		QifuInputRecord inputRecord = new QifuInputRecord();
+		inputRecord.setReqId(reqId);
+		inputRecord.setReqType(QifuInputRecord.ReqType.SETTLE_NOTIFY.getType());
+		inputRecord.setReqBody(body);
+		inputRecord.setDecryptBody(body);
+		qifuInputRecordMapper.insert(inputRecord);
 
-		gigThirdApiService.qifuNotify(reqMsgId, bodyJson, record.getId());
+		// 业务处理
+		gigThirdApiService.qiFuSettleNotify(bodyJson);
 
-		return "SUCCESS";
+		return "success";
+	}
+
+	/**
+	 * 福建企赋签约异步通知回调
+	 *
+	 * @param body
+	 * @param headers
+	 * @return
+	 */
+	@Inner(value = false)
+	@SysLog("福建企赋签约异步通知回调")
+	@PostMapping("/qifu/sign-notify")
+	public String qiFuSignNotifyRequest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
+		log.info("福建企赋签约请求方法参数:body={}, headers={}", body, headers);
+
+		// 请求body json
+		JSONObject bodyJson = JSONUtil.parseObj(body);
+
+		// 请求序号
+		String reqId = bodyJson.getStr("reqId");
+
+		String redisKey = String.format("%s_%s", CacheConstants.ZHONG_YI_YUN_SIGN_NOTIFY_KEY, reqId);
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, reqId, 30, TimeUnit.MINUTES);
+		if (Boolean.FALSE.equals(absent)) {
+			log.warn("存在在途操作reqId={}", reqId);
+			return "fail";
+		}
+
+		JSONObject newBodyJson = null;
+		try {
+			String merId = bodyJson.getStr("merId");
+			String bankCard = bodyJson.getStr("bankCard");
+			String idCard = bodyJson.getStr("idCard");
+			String mobile = bodyJson.getStr("mobile");
+			String name = bodyJson.getStr("name");
+			String remark3 = bodyJson.getStr("remark3");
+
+			// 查询deptSub获取desKey
+			SysDeptSub deptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+					.likeRight(SysDeptSub::getAppId, merId)
+					.eq(SysDeptSub::getEnableFlag, "1")
+					.eq(SysDeptSub::getSubjectLocation, SubjectLocation.ZHONG_YI_YUN));
+			if (deptSub == null || StrUtil.isBlank(deptSub.getAppId())) {
+				log.warn("未配置众蚁云deptSub merId={}", merId);
+				return "fail";
+			}
+
+			String desKey = StrUtil.split(deptSub.getAppId(), "|").get(2);
+
+			newBodyJson = BeanUtil.copyProperties(bodyJson, JSONObject.class);
+			newBodyJson.set("bankCard", ZhongyiyunUtils.decrypt(bankCard, desKey));
+			newBodyJson.set("idCard", ZhongyiyunUtils.decrypt(idCard, desKey));
+			newBodyJson.set("mobile", ZhongyiyunUtils.decrypt(mobile, desKey));
+			newBodyJson.set("name", ZhongyiyunUtils.decrypt(name, desKey));
+			newBodyJson.set("remark3", ZhongyiyunUtils.decrypt(remark3, desKey));
+		} catch (Exception e) {
+			log.error("众蚁云签约回调参数异常", e);
+			return "fail";
+		} finally {
+			// 请求记录到数据库
+			QifuInputRecord inputRecord = new QifuInputRecord();
+			inputRecord.setReqId(reqId);
+			inputRecord.setReqType(QifuInputRecord.ReqType.SIGN_NOTIFY.getType());
+			inputRecord.setReqBody(body);
+			inputRecord.setDecryptBody(JSONUtil.toJsonStr(newBodyJson));
+			qifuInputRecordMapper.insert(inputRecord);
+		}
+
+		// 业务处理
+		gigThirdApiService.qiFuSignNotify(newBodyJson);
+
+		return "success";
 	}
 
 	/**

+ 33 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/QifuInputRecord.java

@@ -1,12 +1,16 @@
 package com.qunzhixinxi.hnqz.admin.entity;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 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.AllArgsConstructor;
 import lombok.Data;
+import lombok.Getter;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * 福建企赋回调异步通知记录
@@ -24,22 +28,45 @@ public class QifuInputRecord extends Model<QifuInputRecord> {
     private Integer id;
 
     /**
-     *  报文流水号
+     * 请求业务类型
      */
-    private String reqMsgId;
+    private String reqType;
+
+    /**
+     * 请求序号
+     */
+    private String reqId;
 
     /**
      * 请求body
      */
     private String reqBody;
 
-	/**
-	 * 解密后的body
-	 */
-	private String decryptBody;
+    /**
+     * 解密后的body
+     */
+    private String decryptBody;
 
     /**
      * 创建时间
      */
     private LocalDateTime createTime;
+
+    @Getter
+    @AllArgsConstructor
+    public enum ReqType {
+        SIGN_NOTIFY("SIGN_NOTIFY", "签约回调"),
+        SETTLE_NOTIFY("SETTLE_NOTIFY", "结算回调");
+
+        /**
+         * 请求类型
+         */
+        @EnumValue
+        private final String type;
+
+        /**
+         * 描述
+         */
+        private final String desc;
+    }
 }

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

@@ -25,7 +25,7 @@ public enum GigTypeEnum {
 	HUI_QI_YUN(6, "汇企云", "汇企云", HuiQiYunCertStatus.class),
 	ZHONG_YI_YUN(7, "众蚁云", "众蚁云", ZhongYiYunCertStatus.class),
 	ZHONG_ZHI(8, "中智", "中智", ZhongZhiCertStatus.class),
-	QI_FU(9, "福建企赋", "福建企赋", QiFuCertStatus.class),
+	QI_FU(9, "福建企赋", "福建企赋", ZhongYiYunCertStatus.class),
 	SHEN_ZHEN_REN_CAI(10, "深圳人才", "深圳人才", OladingCertStatus.class),
 
 	MAH_SETTLE(99, "MAH结算", "MAH结算", null);
@@ -87,7 +87,7 @@ public enum GigTypeEnum {
 				certStatusStr = ZhongZhiCertStatus.resolve(certStatus).name();
 				break;
 			case QI_FU:
-				certStatusStr = QiFuCertStatus.resolve(certStatus).name();
+				certStatusStr = ZhongYiYunCertStatus.resolve(certStatus).name();
 				break;
 			default:
 		}
@@ -134,7 +134,7 @@ public enum GigTypeEnum {
 				certStatusStr = ZhongZhiCertStatus.resolve(certStatus).getMessage();
 				break;
 			case QI_FU:
-				certStatusStr = QiFuCertStatus.resolve(certStatus).getMessage();
+				certStatusStr = ZhongYiYunCertStatus.resolve(certStatus).getMessage();
 				break;
 			default:
 		}

+ 0 - 39
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/QiFuCertStatus.java

@@ -1,39 +0,0 @@
-package com.qunzhixinxi.hnqz.admin.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author: lixuesong
- * @createTime: 2022/11/30 14:47
- * @description: 汇企云认证状态
- */
-@Getter
-@AllArgsConstructor
-public enum QiFuCertStatus {
-
-	// 签约状态
-	UN_SIGN(0, "未签约"),
-	CERT(1, "已认证"),
-	SIGN(2, "已签约");
-
-	private final int code;
-
-	private final String message;
-
-	/**
-	 * 根据枚举编码获取枚举对象
-	 *
-	 * @param code 枚举编码
-	 * @return 如果存在返回枚举,否则返回 {@code null}
-	 */
-	public static QiFuCertStatus resolve(final int code) {
-		for (QiFuCertStatus certStatus : QiFuCertStatus.values()) {
-			if (certStatus.getCode() == code) {
-				return certStatus;
-			}
-		}
-		return UN_SIGN;
-
-	}
-}

+ 9 - 12
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java

@@ -177,27 +177,24 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 		String code = subjectResult.getStr("code");
 		String certStatus = subjectResult.getStr("certStatus");
 		LocalDateTime now = LocalDateTime.now();
-		QiFuCertStatus qiFuCertStatus = Enum.valueOf(QiFuCertStatus.class, certStatus);
+		ZhongYiYunCertStatus zhongYiYunCertStatus = Enum.valueOf(ZhongYiYunCertStatus.class, certStatus);
 
 		// 拼接更新条件
 		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
 				.eq(SysUserSub::getUserId, user.getUserId())
 				.eq(SysUserSub::getDeptId, dept.getDeptId())
-				.eq(SysUserSub::getSubjectLocation, SubjectLocation.HUI_QI_YUN)
-				.eq(SysUserSub::getGigType, GigTypeEnum.HUI_QI_YUN)
-				.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.QI_FU)
+				.eq(SysUserSub::getGigType, GigTypeEnum.QI_FU)
 				.set(SysUserSub::getUpdateTime, now)
-				.set(SysUserSub::getCallbackTime, now)
 				.set(SysUserSub::getUpdateUser, 0)
 				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
 
-		if (HUI_QI_YUN_SUCCESS_CODE.equals(code)) {
-			if (QiFuCertStatus.SIGN.equals(qiFuCertStatus)) {
-				// 汇企云已签约 即对应这里的已认证
-				updateWrapper.set(SysUserSub::getCertStatus, HuiQiYunCertStatus.CERT.getCode());
-			} else {
-				updateWrapper.set(SysUserSub::getCertStatus, qiFuCertStatus.getCode());
-			}
+		if (ZhongYiYunCertStatus.SIGN.equals(zhongYiYunCertStatus)) {
+			// 众蚁云已签约 即对应这里的已认证
+			updateWrapper.set(SysUserSub::getCertStatus, ZhongYiYunCertStatus.CERT.getCode());
+			updateWrapper.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED);
+		} else {
+			updateWrapper.set(SysUserSub::getCertStatus, zhongYiYunCertStatus.getCode());
 		}
 
 		sysUserSubService.update(updateWrapper);

+ 12 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/GigThirdApiService.java

@@ -15,14 +15,20 @@ import java.util.List;
 public interface GigThirdApiService {
 
 	/**
-	 * 福建企赋回调业务处理
+	 * 福建企赋结算回调业务处理
 	 *
-	 * @param reqMsgId 报文流水号
-	 * @param reqBody 请求总的body
-	 * @param inputId 记录id
-	 * @return 结果
+	 * @param bodyJson
+	 * @return
+	 */
+	boolean qiFuSettleNotify(JSONObject bodyJson);
+
+	/**
+	 * 福建企赋签约回调业务处理
+	 *
+	 * @param newBodyJson
+	 * @return
 	 */
-	boolean qifuNotify(String reqMsgId, JSONObject reqBody, Integer inputId);
+	boolean qiFuSignNotify(JSONObject newBodyJson);
 
 	/**
 	 * 中智结算回调业务处理

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

@@ -89,80 +89,50 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 	private final HuiqiyunInputRecordService huiqiyunInputRecordService;
 
-	private final QifuInputRecordMapper qifuInputRecordMapper;
-
 	/**
-	 * 福建企赋回调业务处理
+	 * 福建企赋结算回调业务处理
 	 *
-	 * @param reqMsgId 报文流水号
-	 * @param reqBody 请求总的body
-	 * @param inputId 记录id
-	 * @return 结果
+	 * @param bodyJson
+	 * @return
 	 */
 	@Override
-	public boolean qifuNotify(String reqMsgId, JSONObject reqBody, Integer inputId) {
+	public boolean qiFuSettleNotify(JSONObject bodyJson) {
+		String reqId = bodyJson.getStr("reqId");
+		String state = bodyJson.getStr("state");
 
-		// 查询privateKey
-		List<SysDeptSub> deptSubList = sysDeptSubService.list(Wrappers.<SysDeptSub>lambdaQuery()
-				.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
-				.eq(SysDeptSub::getSubjectLocation, SubjectLocation.QI_FU)
-				.isNotNull(SysDeptSub::getAppSecret));
-		if (CollUtil.isEmpty(deptSubList)) {
-			log.warn("汇企云privateKey不存在");
+		// 根据orderNo查询结算单
+		List<WmScorePackageSettleNote> settleNoteList = scorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+				.eq(WmScorePackageSettleNote::getStreamId, reqId));
+		if (CollUtil.isEmpty(settleNoteList)) {
+			log.warn("订单reqId={}对应结算单不存在", reqId);
 			return false;
 		}
 
-		// 解密body
-		Map<String, Object> decryptData = this.decryptData(reqBody, deptSubList.get(0).getAppSecret());
-		log.info("汇企云解密后body={}", decryptData);
-
-		// 保存解密后的body
-		QifuInputRecord inputRecord = new QifuInputRecord();
-		inputRecord.setId(inputId);
-		inputRecord.setDecryptBody(JSONUtil.toJsonStr(decryptData));
-		qifuInputRecordMapper.updateById(inputRecord);
-
-		// 内层body
-		String bodyStr = (String) decryptData.get("body");
-		JSONObject bodyJson = JSONUtil.parseObj(bodyStr);
-
-		// 批次出款流水号
-		String batchNo = bodyJson.getStr("batchNo");
-		// 批次成功总笔数
-		Integer totalSuccessNum = bodyJson.getInt("totalSuccessNum");
-		// 批次成功总金额
-		String totalSuccessAmt = bodyJson.getStr("totalSuccessAmt");
-		// 批次失败总笔数
-		Integer totalFailNum = bodyJson.getInt("totalFailNum");
-		// 批次失败总金额
-		String totalFailAmt = bodyJson.getStr("totalFailAmt");
-		// 批次请求总笔数
-		Integer totalNum = bodyJson.getInt("totalNum");
-		// 批次请求总金额
-		String totalAmt = bodyJson.getStr("totalAmt");
+		WmScorePackageSettleNote tmp = settleNoteList.get(0);
 
-		int yaoyiStatus;
-		if (totalSuccessNum.equals(totalNum)) {
-			// 批次成功笔数=批次总笔数,则认为是成功
+		int yaoyiStatus = 0;
+		// 	state取值:
+		// 	SETSUCC结算成功;
+		//	SETFAIL:结算失败;
+		//	TICREF:已退票
+		if ("SETSUCC".equals(state)) {
+			// 对应要易结算成功状态
 			yaoyiStatus = 1;
-		} else {
+		} else if ("SETFAIL".equals(state)) {
 			yaoyiStatus = 2;
-		}
-
-		// 根据orderNo查询结算单
-		List<WmScorePackageSettleNote> settleNoteList = scorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
-				.eq(WmScorePackageSettleNote::getStreamId, batchNo));
-		if (CollUtil.isEmpty(settleNoteList)) {
-			log.warn("订单batchNo={}对应结算单不存在", batchNo);
+		} else {
+			log.warn("当前结算state不处理");
+			redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + tmp.getId());
 			return false;
 		}
 
 		// 修改结算状态
+		final int finalYaoyiStatus = yaoyiStatus;
 		List<WmScorePackageSettleNote> updateList = settleNoteList.stream().map(note -> {
 			WmScorePackageSettleNote updateEntity = new WmScorePackageSettleNote();
 			updateEntity.setId(note.getId());
-			updateEntity.setSettleNoteStatus(yaoyiStatus);
-			if (yaoyiStatus == 1){
+			updateEntity.setSettleNoteStatus(finalYaoyiStatus);
+			if (finalYaoyiStatus == 1){
 				updateEntity.setNotifyTime(LocalDateTime.now());
 			}
 			updateEntity.setUpdateTime(LocalDateTime.now());
@@ -171,7 +141,6 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 		scorePackageSettleNoteService.updateBatchById(updateList);
 
-		WmScorePackageSettleNote tmp = settleNoteList.get(0);
 		WmScorePackage scorePackage = scorePackageService.getById(tmp.getPackageId());
 
 		// 遥领不修改
@@ -190,6 +159,60 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 		return true;
 	}
 
+	/**
+	 * 福建企赋签约回调业务处理
+	 *
+	 * @param newBodyJson
+	 * @return
+	 */
+	@Override
+	public boolean qiFuSignNotify(JSONObject newBodyJson) {
+
+		String idCard = newBodyJson.getStr("idCard");
+		String mobile = newBodyJson.getStr("mobile");
+		String name = newBodyJson.getStr("name");
+		String state = newBodyJson.getStr("state");
+		String resMsg = newBodyJson.getStr("resMsg");
+
+		// 查询当前用户
+		SysUser sysUser = sysUserService.getOne(Wrappers.<SysUser>lambdaQuery()
+				.eq(SysUser::getRealname, name)
+				.eq(SysUser::getIdCardNumber, idCard)
+				.eq(SysUser::getUsername, mobile)
+				.eq(SysUser::getDelFlag, DelEnum.NOT_DEL.val()));
+		if (sysUser == null) {
+			log.warn("用户不存在name={},idCard={},mobile={}", name, idCard, mobile);
+			return false;
+		}
+
+		// 查询对应userSub数据
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getUserId, sysUser.getUserId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.QI_FU));
+		if (userSub == null) {
+			log.warn("没有查到对应userSub数据 userId={}", sysUser.getUserId());
+			return false;
+		}
+
+		// 更新userSub
+		SysUserSub updateUserSub = new SysUserSub();
+		updateUserSub.setId(userSub.getId());
+		if ("SIGN".equals(state)) {
+			// 已签约对应要易已认证
+			updateUserSub.setCertStatus(ZhongYiYunCertStatus.CERT.getCode());
+		}
+		updateUserSub.setCertRemark(String.format("%s;%s", userSub.getCertRemark(), String.format("签约回调:%s;", resMsg)));
+		updateUserSub.setFailReason(String.format("签约回调:%s;", resMsg));
+		updateUserSub.setCallbackStatus(GigCallBackStatus.RETURNED);
+		LocalDateTime now = LocalDateTime.now();
+		updateUserSub.setUpdateTime(now);
+		updateUserSub.setCallbackTime(now);
+		updateUserSub.setUpdateUser(0);
+		sysUserSubService.updateById(updateUserSub);
+
+		return true;
+	}
+
 	/**
 	 * 中智结算回调业务处理
 	 *