فهرست منبع

feat: 正启之星结算回调

lixuesong 2 سال پیش
والد
کامیت
d01be409e1

+ 18 - 0
db/v2.0/220909.sql

@@ -0,0 +1,18 @@
+-- 正启之星请求记录表
+create table xinbada_input_record
+(
+    id                 int auto_increment comment '主键id'
+        primary key,
+    signature          varchar(128)                        not null comment '签名',
+    action_name        varchar(32)                         not null comment '通知类型',
+    req_body           text                                not null comment '请求body内容',
+    order_uuid         varchar(64)                         null comment '订单编号唯一',
+    order_status       int                                 null comment '订单状态',
+    order_no           varchar(32)                         null comment '',
+    customer_user_uuid varchar(64)                         null comment '',
+    server_user_uuid   varchar(64)                         null comment '',
+    public_key         varchar(2048)                       null comment '请求公钥',
+    private_key        varchar(2048)                       null comment '请求时私钥',
+    create_time        timestamp default CURRENT_TIMESTAMP not null comment '创建时间'
+)
+    comment '正启之星请求记录';

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

@@ -115,6 +115,11 @@ public interface CacheConstants {
 	 */
 	String OLADING_NOTIFY_KEY = "OLADING:NOTIFY:KEY:";
 
+	/**
+	 * 正启之星异步结果回调key
+	 */
+	String ZHEGN_QI_ZHI_XING_NOTIFY_KEY = "ZHEGN:QI:ZHI:XING:NOTIFY:KEY:";
+
 	/**
 	 * 发起阿拉丁认证渠道记录key
 	 */

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

@@ -1,10 +1,13 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
 import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
+import com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord;
+import com.qunzhixinxi.hnqz.admin.service.XinbadaInputRecordService;
 import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
 import com.qunzhixinxi.hnqz.admin.service.gig.OladingInputRecordService;
 import com.qunzhixinxi.hnqz.admin.util.HMACSignProvider;
@@ -13,13 +16,21 @@ import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -38,6 +49,8 @@ public class GigThirdApiController {
 
 	private final OladingInputRecordService oladingInputRecordService;
 
+	private final XinbadaInputRecordService xinbadaInputRecordService;
+
 	private final RedisTemplate redisTemplate;
 
 	private static final HMACSignProvider hMACSignProvide = new HMACSignProvider();
@@ -52,6 +65,83 @@ public class GigThirdApiController {
 	 */
 	private static final String ALGORITHM_TYPE = "HmacSHA256";
 
+	/**
+	 * 正启之星异步通知回调
+	 *
+	 * 接口用于接收批量订单创建结果通知和下发结果通知。
+	 * 请注意回调请求头默认的”Content-Type”: “application/octet-stream”
+	 * 企业需要给我方响应。通知超时时间10秒,如果没有收到正确响应视为通知失败,失败后重试3次,每次间隔10分钟。
+	 *
+	 * @param body 请求body
+	 * @param headers 请求头
+	 */
+	@Inner(value = false)
+	@SysLog("正启之星异步通知回调")
+	@PostMapping("/xinbada")
+	public Map<String, Object> xinbadaRequest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
+
+		log.info("正启之星请求方法参数:body={}, headers={}", body, headers);
+
+		// 	签名
+		String signature = Objects.requireNonNull(headers.get("signature")).get(0);
+		// 通知类型(order_check_result_notify:订单校验结果通知,order_call_back_notification:订单下发回调通知,task_redispatch_notification:单笔重试回调通知)
+		String actionName = Objects.requireNonNull(headers.get("action_name")).get(0);
+
+		// 请求body json
+		JSONObject bodyJson = JSONUtil.parseObj(body);
+		Integer orderStatus = bodyJson.getInt("order_status");
+		String orderUuid = bodyJson.getStr("order_uuid");
+		String orderNo = bodyJson.getStr("order_no");
+		String customerUserUuid = bodyJson.getStr("customer_user_uuid");
+		String serverUserUuid = bodyJson.getStr("server_user_uuid");
+
+		Map<String, Object> successResult = new HashMap<>();
+		if (!StrUtil.isAllNotBlank(signature, actionName, orderNo) || orderStatus == null) {
+			log.warn("必传参数为空");
+			successResult.put("resp_code", 400);
+			successResult.put("resp_message", "必传参数为空");
+			successResult.put("success", "false");
+			return successResult;
+		}
+
+		String redisKey = String.format("%s_%s_%s", CacheConstants.ZHEGN_QI_ZHI_XING_NOTIFY_KEY, actionName, orderNo);
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, orderNo, 30, TimeUnit.MINUTES);
+		if (!absent) {
+			log.warn("存在在途操作orderNo={}", orderNo);
+			successResult.put("resp_code", 400);
+			successResult.put("resp_message", "存在在途操作");
+			successResult.put("success", "false");
+			return successResult;
+		}
+
+		// 请求记录到数据库
+		XinbadaInputRecord xinbadaInputRecord = new XinbadaInputRecord();
+		xinbadaInputRecord.setActionName(actionName);
+		xinbadaInputRecord.setSignature(signature);
+		xinbadaInputRecord.setReqBody(body);
+		xinbadaInputRecord.setCreateTime(LocalDateTime.now());
+		// body中的部分字段
+		xinbadaInputRecord.setOrderStatus(orderStatus);
+		xinbadaInputRecord.setOrderUuid(orderUuid);
+		xinbadaInputRecord.setOrderNo(orderNo);
+		xinbadaInputRecord.setCustomerUserUuid(customerUserUuid);
+		xinbadaInputRecord.setServerUserUuid(serverUserUuid);
+		xinbadaInputRecordService.save(xinbadaInputRecord);
+
+		try {
+			gigThirdApiService.xinbadaNotify(actionName, orderNo, orderStatus);
+
+		} catch (Exception e) {
+			log.error("response返回异常", e);
+		}
+
+		successResult.put("resp_code", 200);
+		successResult.put("resp_message", "SUCCESS");
+		successResult.put("success", "true");
+
+		return successResult;
+	}
+
 	/**
 	 * 自由职家统一请求地址
 	 *

+ 83 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/XinbadaInputRecord.java

@@ -0,0 +1,83 @@
+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;
+
+/**
+ * 正启之星请求记录
+ *
+ * @TableName xinbada_input_record
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName(value = "xinbada_input_record")
+public class XinbadaInputRecord extends Model<XinbadaInputRecord> {
+
+	/**
+	 * 主键id
+	 */
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+
+	/**
+	 * 签名
+	 */
+	private String signature;
+
+	/**
+	 * 通知类型
+	 */
+	private String actionName;
+
+	/**
+	 * 请求body内容
+	 */
+	private String reqBody;
+
+	/**
+	 * 订单编号唯一
+	 */
+	private String orderUuid;
+
+	/**
+	 * 订单状态
+	 */
+	private Integer orderStatus;
+
+	/**
+	 *
+	 */
+	private String orderNo;
+
+	/**
+	 *
+	 */
+	private String customerUserUuid;
+
+	/**
+	 *
+	 */
+	private String serverUserUuid;
+
+	/**
+	 * 请求公钥
+	 */
+	private String publicKey;
+
+	/**
+	 * 请求时私钥
+	 */
+	private String privateKey;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+}

+ 17 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/XinbadaInputRecordMapper.java

@@ -0,0 +1,17 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author lixuesong
+ * @description 针对表【xinbada_input_record(正启之星请求记录)】的数据库操作Mapper
+ * @createDate 2022-09-09 14:09:31
+ * @Entity com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord
+ */
+@Mapper
+public interface XinbadaInputRecordMapper extends BaseMapper<XinbadaInputRecord> {
+
+
+}

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/XinbadaInputRecordService.java

@@ -0,0 +1,13 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord;
+
+/**
+ * @author lixuesong
+ * @description 针对表【xinbada_input_record(正启之星请求记录)】的数据库操作Service
+ * @createDate 2022-09-09 14:09:31
+ */
+public interface XinbadaInputRecordService extends IService<XinbadaInputRecord> {
+
+}

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

@@ -10,6 +10,15 @@ import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
  */
 public interface GigThirdApiService {
 
+	/**
+	 * 正启之星回调业务处理
+	 *
+	 * @param actionName
+	 * @param orderNo
+	 * @param orderStatus
+	 */
+	void xinbadaNotify(String actionName, String orderNo, Integer orderStatus);
+
 	/**
 	 * 自由职家回调业务处理
 	 *

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

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.service.gig.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONArray;
@@ -36,6 +37,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author lixuesong
@@ -52,6 +54,65 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 	private final WmScorePackageSettleNoteService scorePackageSettleNoteService;
 	private final WmScorePackageService scorePackageService;
 
+	/**
+	 * 正启之星回调业务处理
+	 *
+	 * @param actionName 通知类型 order_check_result_notify:订单校验结果通知,order_call_back_notification:订单下发回调通知,task_redispatch_notification:单笔重试回调通知
+	 * @param orderNo 订单no
+	 * @param orderStatus
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void xinbadaNotify(String actionName, String orderNo, Integer orderStatus) {
+
+		switch (actionName) {
+			// 订单下发回调通知
+			case "order_call_back_notification":
+
+				// 订单状态转换为
+				int yaoyiStatus;
+				switch (orderStatus){
+					case 50:
+						yaoyiStatus = 1;
+						break;
+					default:
+						yaoyiStatus = 2;
+						break;
+				}
+
+				// 根据orderNo查询结算单
+				List<WmScorePackageSettleNote> settleNoteList = scorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+						.eq(WmScorePackageSettleNote::getSettleNo, orderNo));
+				if (CollUtil.isEmpty(settleNoteList)) {
+					log.warn("订单号orderNo={}对应结算单不存在", orderNo);
+					return;
+				}
+
+				// 修改结算状态
+				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);
+				redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + tmp.getId());
+
+				break;
+			default:
+				log.warn("通知类型暂不处理actionName={}", actionName);
+				break;
+		}
+
+	}
+
 	/**
 	 * 自由职家回调业务处理
 	 *

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

@@ -0,0 +1,18 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord;
+import com.qunzhixinxi.hnqz.admin.mapper.XinbadaInputRecordMapper;
+import com.qunzhixinxi.hnqz.admin.service.XinbadaInputRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author lixuesong
+ * @description 针对表【xinbada_input_record(正启之星请求记录)】的数据库操作Service实现
+ * @createDate 2022-09-09 14:09:31
+ */
+@Service
+public class XinbadaInputRecordServiceImpl extends ServiceImpl<XinbadaInputRecordMapper, XinbadaInputRecord>
+		implements XinbadaInputRecordService {
+
+}