Selaa lähdekoodia

渠道通知抽取到core

master
chenchaod 1 kuukausi sitten
vanhempi
commit
2b567e0db1

+ 0
- 1
gly-base-core/src/main/java/cn/com/taiji/core/entity/issue/IssueProductPay.java Näytä tiedosto

@@ -33,7 +33,6 @@ public class IssueProductPay extends StringPropertyUUIDEntity {
@Column(name = "FEE_CATEGORY")
@Enumerated(EnumType.STRING)
private FeeCategory feeCategory;//费用类别
@NotBlank
@Size(max = 20)
@Column(name = "FEE_TYPE")
private String feeType;//费用类型

+ 138
- 0
gly-base-core/src/main/java/cn/com/taiji/core/manager/tools/issue/QdCallUtil.java Näytä tiedosto

@@ -0,0 +1,138 @@
package cn.com.taiji.core.manager.tools.issue;

import cn.com.taiji.common.manager.net.http.ServiceHandleException;
import cn.com.taiji.common.manager.net.http.binclient.ApiRequestException;
import cn.com.taiji.common.pub.CommonAbstract;
import cn.com.taiji.common.pub.json.JsonTools;
import cn.com.taiji.core.entity.dict.issue.OrderType;
import cn.com.taiji.core.entity.issue.IssueOrderChannelNotice;
import cn.com.taiji.core.entity.issue.IssueOrderinfo;
import cn.com.taiji.core.manager.comm.client.feign.FeignClientManager;
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeRequest;
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse;
import cn.com.taiji.core.model.comm.protocol.SignJsonResponse;
import cn.com.taiji.core.model.comm.protocol.ats.model.CallbackModel;
import cn.com.taiji.core.model.comm.protocol.ats.notice.AtsChannelNoticeRequest;
import cn.com.taiji.core.model.comm.protocol.ats.notice.AtsChannelNoticeResponse;
import cn.com.taiji.core.model.comm.protocol.ifmw.GetKeyRequest;
import cn.com.taiji.core.model.comm.protocol.ifmw.GetKeyResponse;
import cn.com.taiji.core.repo.jpa.issue.IssueOrderChannelNoticeRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;

/**
* @Author:ChenChao
* @Date:2025/6/24 18:01
* @Filename:CommenUtil
* @description:
*/
@Component
public class QdCallUtil extends CommonAbstract {

@Autowired
protected IssueOrderChannelNoticeRepo issueOrderChannelNoticeRepo;
@Autowired
private FeignClientManager feignClientManager;

//需要异步执行,不影响主业务,减少耗时,在自己业务中异步执行
public AtsChannelNoticeResponse callBackQd(IssueOrderinfo order, String msg) {
//通知内容
CallbackModel callbackModel = new CallbackModel();
callbackModel.setOrderNo(order.getOrderNo())
.setOrderStep(order.getOrderStep().getCode())
.setOrderStatus(order.getOrderStatus().getCode())
.setMsg(msg)
.setCardId(order.getCardId())
.setObuId(order.getObuId())
.setPlateNum(order.getVehiclePlate())
.setPlateColor(order.getVehiclePlateColor());
//异步执行,不影响主业务,减少耗时
// executor.execute(() -> {
//获取密钥
GetKeyRequest keyRequest = new GetKeyRequest();
keyRequest.setAgencyId(order.getAgencyId());
GetKeyResponse keyResponse = null;
try {
keyResponse = jsonPostRepeat(keyRequest, 3, null, null);
} catch (Exception e) {
logger.error("通知渠道,获取密钥异常:{}", e.getMessage());
//回调结果入库
saveCallBackResult(order, callbackModel, "", "获取密钥失败");
return null;
}
//通知请求参数
AtsChannelNoticeRequest req = new AtsChannelNoticeRequest();
req.setCallbackModel(callbackModel);
req.setAppId(keyResponse.getAppId());
req.setKey(keyResponse.getKey());
req.setSingKey(keyResponse.getSingKey());
req.setUrl(order.getReturnUrl());
String exceMsg = "";//异常信息
AtsChannelNoticeResponse response = null;//响应体
try {
response = jsonPostRepeat(req, 3, null, null);
} catch (Exception e) {
exceMsg = e.getMessage();
logger.error("通知渠道异常:{}", exceMsg);
} finally {
//回调结果入库
saveCallBackResult(order, callbackModel, response == null ? "" : response.toJson(), exceMsg);
}
return response;
// }
// );
}

private void saveCallBackResult(IssueOrderinfo order, CallbackModel callbackModel, String response, String exceMsg) {
IssueOrderChannelNotice quDaoCallBackResult = new IssueOrderChannelNotice();
quDaoCallBackResult.setOrderNo(order.getOrderNo());
quDaoCallBackResult.setReqUrl(order.getReturnUrl());
quDaoCallBackResult.setType(OrderType.ISSUE);
quDaoCallBackResult.setReqJson(callbackModel.toJson());
quDaoCallBackResult.setRespJson(response);
quDaoCallBackResult.setExceptionMsg(exceMsg);
issueOrderChannelNoticeRepo.persist(quDaoCallBackResult);
}


private <RS extends AbstractSignTypeResponse> RS jsonPostRepeat(AbstractSignTypeRequest<RS> req, int repeat,
String ifCode, String accessToken) throws ServiceHandleException {

for (int i = 0; i < repeat; i++) {
try {
return feignClientManager.jsonPost(req, req.getResponseType(), ifCode, accessToken);
} catch (IOException e) {
logger.error("第 {} 次执行Exception:{}", i + 1, e.getMessage());
} catch (ApiRequestException e) {
if (e.getErrCode() == 707) {
// 707压住异常
try {
return req.getResponseType().getDeclaredConstructor().newInstance();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
logger.error("接口调用异常", e);
SignJsonResponse jsonRes = toJsonResponse(e);
assert jsonRes != null;
Integer statusCode = jsonRes.getStatusCode();
if (statusCode.equals(801)) {
statusCode = 704;
}
throw new ServiceHandleException(jsonRes.getErrorMsg(), statusCode);
}
}
return null;
}

private SignJsonResponse toJsonResponse(ApiRequestException e) {
String responseJson = e.getMessage().substring(0, e.getMessage().length() - 4);
try {
return JsonTools.json2Object(responseJson, SignJsonResponse.class);
} catch (IOException e1) {
logger.error("转换json出错 json:\n{} \n exception:{}", responseJson, e1.getMessage());
}
return null;
}
}

+ 2
- 1
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/config/AppConfig.java Näytä tiedosto

@@ -28,7 +28,8 @@ import java.util.concurrent.ThreadPoolExecutor;
basePackages = {"cn.com.taiji." + AppConfig.APP_NAME + ".repo.jpa", "cn.com.taiji.core.repo.jpa"},
repositoryFactoryBeanClass = MyJpaRespositoryFactoryBean.class)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan(value = {"cn.com.taiji.core.manager.comm.client.feign","cn.com.taiji.core.manager.tools.minio"})
@ComponentScan(value = {"cn.com.taiji.core.manager.comm.client.feign","cn.com.taiji.core.manager.tools.minio",
"cn.com.taiji.core.manager.tools.issue"})
public class AppConfig extends AbstractManager {
public static final String APP_NAME = "ias";


+ 14
- 59
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/AbstractOrderManager.java Näytä tiedosto

@@ -12,10 +12,13 @@ import cn.com.taiji.core.entity.dict.issue.OrderPayStatus;
import cn.com.taiji.core.entity.dict.issue.OrderType;
import cn.com.taiji.core.entity.dict.issue.TransactionBizType;
import cn.com.taiji.core.entity.dict.pay.PayChannelType;
import cn.com.taiji.core.entity.dict.pay.TradeState;
import cn.com.taiji.core.entity.dict.pay.TradeType;
import cn.com.taiji.core.entity.issue.*;
import cn.com.taiji.core.entity.user.AccountInfo;
import cn.com.taiji.core.entity.user.Staff;
import cn.com.taiji.core.manager.tools.MyTimeTools;
import cn.com.taiji.core.manager.tools.issue.QdCallUtil;
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeRequest;
import cn.com.taiji.core.model.comm.protocol.ats.model.CallbackModel;
import cn.com.taiji.core.model.comm.protocol.ats.notice.AtsChannelNoticeRequest;
@@ -87,6 +90,8 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>>

@Autowired
protected IssueOrderChannelNoticeRepo issueOrderChannelNoticeRepo;
@Autowired
protected QdCallUtil qdCallUtil;


public AbstractOrderManager(DataType dataType) {
@@ -134,62 +139,12 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>>
jsonPostRepeat(req);
}

protected void callBackQd(IssueOrderinfo order, String msg) {
//通知内容
CallbackModel callbackModel = new CallbackModel();
callbackModel.setOrderNo(order.getOrderNo())
.setOrderStep(order.getOrderStep().getCode())
.setOrderStatus(order.getOrderStatus().getCode())
.setMsg(msg)
.setCardId(order.getCardId())
.setObuId(order.getObuId())
.setPlateNum(order.getVehiclePlate())
.setPlateColor(order.getVehiclePlateColor());
//异步执行,不影响主业务,减少耗时
//异步通知渠道
protected void asyCallBackQd(IssueOrderinfo order, String msg) {
executor.execute(() -> {
//获取密钥
GetKeyRequest keyRequest = new GetKeyRequest();
keyRequest.setAgencyId(order.getAgencyId());
GetKeyResponse keyResponse = null;
try {
keyResponse = jsonPostRepeat(keyRequest);
} catch (Exception e) {
logger.error("通知渠道,获取密钥异常:{}", e.getMessage());
//回调结果入库
saveCallBackResult(order, callbackModel, "", "获取密钥失败");
return;
}
//通知请求参数
AtsChannelNoticeRequest req = new AtsChannelNoticeRequest();
req.setCallbackModel(callbackModel);
req.setAppId(keyResponse.getAppId());
req.setKey(keyResponse.getKey());
req.setSingKey(keyResponse.getSingKey());
req.setUrl(order.getReturnUrl());
String exceMsg = "";//异常信息
AtsChannelNoticeResponse response = null;//响应体
try {
response = jsonPostRepeat(req);
} catch (Exception e) {
exceMsg = e.getMessage();
logger.error("通知渠道异常:{}", exceMsg);
} finally {
//回调结果入库
saveCallBackResult(order, callbackModel, response == null ? "" : response.toJson(), exceMsg);
}
}
);
}
qdCallUtil.callBackQd(order, msg);
});

private void saveCallBackResult(IssueOrderinfo order, CallbackModel callbackModel, String response, String exceMsg) {
IssueOrderChannelNotice quDaoCallBackResult = new IssueOrderChannelNotice();
quDaoCallBackResult.setOrderNo(order.getOrderNo());
quDaoCallBackResult.setReqUrl(order.getReturnUrl());
quDaoCallBackResult.setType(OrderType.ISSUE);
quDaoCallBackResult.setReqJson(callbackModel.toJson());
quDaoCallBackResult.setRespJson(response);
quDaoCallBackResult.setExceptionMsg(exceMsg);
issueOrderChannelNoticeRepo.persist(quDaoCallBackResult);
}

protected void checkElecFence(Double latitude, Double longitude, QtkServiceHall serviceHall) throws ServiceHandleException {
@@ -320,16 +275,16 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>>
AtsQueryPayResultV3Request v3Request = new AtsQueryPayResultV3Request();
v3Request.setCreateType(payConfig.getWxServiceType());
v3Request.setExternalOrderNo(pay.getExternalOrderNo());
// v3Request.setTradeType(TradeType.valueOf(payConfig.getPayProductType()));
v3Request.setTradeType(TradeType.valueOf(payConfig.getPayProductType()));
v3Request.setMchid(payConfig.getWxMchId());
v3Request.setApiV3Key(payConfig.getWxApiv3key());
v3Request.setPrivateKey(payConfig.getWxPrivatekey());
v3Request.setPublicKeyId(payConfig.getWxPublicKeyId());
v3Request.setPublicKey(payConfig.getWxPublicKey());
v3Request.setSerialNo(payConfig.getWxSerialNo());
// v3Request.setSubMchId("payConfig.get");
v3Request.setSubMchid(payConfig.getWxSubMchId());
AtsQueryPayResultV3Response res = jsonPostRepeat(v3Request);
if (OrderPayStatus.SUCCESS.equals(res.getTradeState())) {
if (TradeState.SUCCESS.equals(res.getTradeState())) {
pay.setPayStatus(OrderPayStatus.SUCCESS);
pay.setPayTime(MyTimeTools.strToTime(res.getSuccessTime(), TimeTools.ISO_LOCAL_DATE_TIME));
pay.setUpdateTime(LocalDateTime.now());
@@ -346,9 +301,9 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>>
v2Request.setAppId(payConfig.getWxAppId());
v2Request.setMchId(payConfig.getWxMchId());
// v2Request.setSubAppId(payConfig.gets);
// v2Request.setSubMchId(payConfig.get);
v2Request.setSubMchId(payConfig.getWxSubMchId());
AtsQueryPayResultV2Response res = jsonPostRepeat(v2Request);
if (OrderPayStatus.SUCCESS.equals(res.getTradeState())) {
if (TradeState.SUCCESS.equals(res.getTradeState())) {
pay.setPayStatus(OrderPayStatus.SUCCESS);
pay.setPayTime(MyTimeTools.strToTime(res.getTimeEnd(), TimeTools.yyyyMMddHHmmss));
pay.setUpdateTime(LocalDateTime.now());

+ 1
- 2
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/OrderInitManager.java Näytä tiedosto

@@ -23,7 +23,6 @@ import cn.com.taiji.core.model.comm.protocol.ods.oqs.issue.OqsIssueOrderQueryReq
import cn.com.taiji.core.model.comm.protocol.ods.oqs.issue.OqsIssueOrderQueryResponse;
import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder;
import cn.com.taiji.core.repo.jpa.basic.QtkAgencyRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueOrderPayRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueProductPayRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueProductPromotionRepo;
import cn.com.taiji.ias.dict.DataType;
@@ -187,7 +186,7 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> {
transactionManager.persistTransaction(ISSUE_ORDER_SYNC, oldOrder.getOrderNo(), "老订单");
//回调接口通知渠道
if (SourceType.CHANNEL.equals(oldOrder.getOrderSource())) {
callBackQd(oldOrder, ext.getCancelReason());
asyCallBackQd(oldOrder, ext.getCancelReason());
}
}


+ 1
- 1
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/SignQueryManager.java Näytä tiedosto

@@ -169,7 +169,7 @@ public class SignQueryManager extends AbstractOrderManager<SignQueryRequest> {
IssueOrderinfo order = (IssueOrderinfo) dataStream.get(ORDER);
if (SourceType.CHANNEL.equals(order.getOrderSource())&& IssueOrderStep.WAITING_ACTIVE.equals(order.getOrderStep())){
order.setOrderStep(IssueOrderStep.ORDER_SIGNED);//这里设置5只是为了通知渠道完成签约,数据库保存的是待激活
callBackQd(order, "");
asyCallBackQd(order, "");
}
}


+ 1
- 1
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/VehicleUploadManager.java Näytä tiedosto

@@ -117,7 +117,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ
dataStream.put(ORDER_EXT, ext);
//回调通知渠道
if (SourceType.CHANNEL.equals(order.getOrderSource())) {
callBackQd(order, ext.getCancelReason());
asyCallBackQd(order, ext.getCancelReason());
}
}


Loading…
Peruuta
Tallenna