Explorar o código

feat: 福建企赋结算回调

lixuesong hai 1 ano
pai
achega
85b034ed61

+ 10 - 0
db/v2.0/230725.sql

@@ -0,0 +1,10 @@
+create table qifu_input_record
+(
+    id           int auto_increment comment '主键id'
+        primary key,
+    req_msg_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 '福建企赋回调异步通知记录';

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

@@ -137,6 +137,11 @@ public interface CacheConstants {
 	 */
 	String HUI_QI_YUN_NOTIFY_KEY = "HUI:QI:YUN:NOTIFY:KEY:";
 
+	/**
+	 * 福建企赋异步结果回调key
+	 */
+	String QI_FU_NOTIFY_KEY = "QI:FU:NOTIFY:KEY:";
+
 	/**
 	 * 众蚁云签约异步结果回调key
 	 */

+ 41 - 7
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java

@@ -9,14 +9,9 @@ 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.dto.OladingCommonRequest;
-import com.qunzhixinxi.hnqz.admin.entity.HuiqiyunInputRecord;
-import com.qunzhixinxi.hnqz.admin.entity.LingcaiaiInputRecord;
-import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
-import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
-import com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord;
-import com.qunzhixinxi.hnqz.admin.entity.ZhongyiyunInputRecord;
-import com.qunzhixinxi.hnqz.admin.entity.ZhongzhiInputRecord;
+import com.qunzhixinxi.hnqz.admin.entity.*;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
+import com.qunzhixinxi.hnqz.admin.mapper.QifuInputRecordMapper;
 import com.qunzhixinxi.hnqz.admin.service.HuiqiyunInputRecordService;
 import com.qunzhixinxi.hnqz.admin.service.LingcaiaiInputRecordService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
@@ -73,10 +68,49 @@ public class GigThirdApiController {
 
 	private final ZhongzhiInputRecordService zhongzhiInputRecordService;
 
+	private final QifuInputRecordMapper qifuInputRecordMapper;
+
 	private final SysDeptSubService sysDeptSubService;
 
 	private final RedisTemplate redisTemplate;
 
+
+	/**
+	 * 福建企赋异步通知回调
+	 *
+	 * @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);
+
+		// 请求body json
+		JSONObject bodyJson = JSONUtil.parseObj(body);
+
+
+		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";
+		}
+
+		// 请求记录到数据库
+		QifuInputRecord record = new QifuInputRecord();
+		record.setReqMsgId(reqMsgId);
+		record.setReqBody(body);
+		qifuInputRecordMapper.insert(record);
+
+		gigThirdApiService.qifuNotify(reqMsgId, bodyJson, record.getId());
+
+		return "SUCCESS";
+	}
+
 	/**
 	 * 中智回调异步通知记录
 	 *

+ 45 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/QifuInputRecord.java

@@ -0,0 +1,45 @@
+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 java.time.LocalDateTime;
+
+/**
+ * 福建企赋回调异步通知记录
+ * @TableName qifu_input_record
+ */
+@TableName(value ="qifu_input_record")
+@Data
+public class QifuInputRecord extends Model<QifuInputRecord> {
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     *  报文流水号
+     */
+    private String reqMsgId;
+
+    /**
+     * 请求body
+     */
+    private String reqBody;
+
+	/**
+	 * 解密后的body
+	 */
+	private String decryptBody;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 19 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/QifuInputRecordMapper.java

@@ -0,0 +1,19 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.entity.QifuInputRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author lixuesong
+* @description 针对表【qifu_input_record(汇企云回调异步通知记录)】的数据库操作Mapper
+* @createDate 2022-12-09 13:02:08
+*/
+@Mapper
+public interface QifuInputRecordMapper extends BaseMapper<QifuInputRecord> {
+
+}
+
+
+
+

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

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

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

@@ -14,11 +14,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 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.HuiqiyunInputRecord;
-import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
-import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
-import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
-import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
+import com.qunzhixinxi.hnqz.admin.entity.*;
 import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
@@ -27,6 +23,7 @@ import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ZhongYiYunCertStatus;
 import com.qunzhixinxi.hnqz.admin.event.OladingFinishTaskEvent;
+import com.qunzhixinxi.hnqz.admin.mapper.QifuInputRecordMapper;
 import com.qunzhixinxi.hnqz.admin.service.HuiqiyunInputRecordService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
@@ -87,6 +84,107 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 	private final HuiqiyunInputRecordService huiqiyunInputRecordService;
 
+	private final QifuInputRecordMapper qifuInputRecordMapper;
+
+	/**
+	 * 福建企赋回调业务处理
+	 *
+	 * @param reqMsgId 报文流水号
+	 * @param reqBody 请求总的body
+	 * @param inputId 记录id
+	 * @return 结果
+	 */
+	@Override
+	public boolean qifuNotify(String reqMsgId, JSONObject reqBody, Integer inputId) {
+
+		// 查询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不存在");
+			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");
+
+		int yaoyiStatus;
+		if (totalSuccessNum.equals(totalNum)) {
+			// 批次成功笔数=批次总笔数,则认为是成功
+			yaoyiStatus = 1;
+		} else {
+			yaoyiStatus = 2;
+		}
+
+		// 根据orderNo查询结算单
+		List<WmScorePackageSettleNote> settleNoteList = scorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+				.eq(WmScorePackageSettleNote::getStreamId, batchNo));
+		if (CollUtil.isEmpty(settleNoteList)) {
+			log.warn("订单batchNo={}对应结算单不存在", batchNo);
+			return false;
+		}
+
+		// 修改结算状态
+		List<WmScorePackageSettleNote> updateList = settleNoteList.stream().map(note -> {
+			WmScorePackageSettleNote updateEntity = new WmScorePackageSettleNote();
+			updateEntity.setId(note.getId());
+			updateEntity.setSettleNoteStatus(yaoyiStatus);
+			if (yaoyiStatus == 1){
+				updateEntity.setNotifyTime(LocalDateTime.now());
+			}
+			updateEntity.setUpdateTime(LocalDateTime.now());
+			return updateEntity;
+		}).collect(Collectors.toList());
+
+		scorePackageSettleNoteService.updateBatchById(updateList);
+
+		WmScorePackageSettleNote tmp = settleNoteList.get(0);
+		WmScorePackage scorePackage = scorePackageService.getById(tmp.getPackageId());
+
+		// 遥领不修改
+		if (!"1611890566".equals(scorePackage.getSendPackageDeptId())) {
+			// 更新积分包状态
+			log.info("更新积分包状态:{}", tmp);
+			WmScorePackage wmScorePackage = new WmScorePackage();
+			wmScorePackage.setId(tmp.getPackageId());
+			wmScorePackage.setSettleStatus(yaoyiStatus);
+			wmScorePackage.setUpdateTime(LocalDateTime.now());
+			scorePackageService.updateById(wmScorePackage);
+		}
+
+		redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + tmp.getId());
+
+		return true;
+	}
+
 	/**
 	 * 中智结算回调业务处理
 	 *