@@ -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;//费用类型 |
@@ -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; | |||
} | |||
} |
@@ -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"; | |||
@@ -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()); |
@@ -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()); | |||
} | |||
} | |||
@@ -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, ""); | |||
} | |||
} | |||
@@ -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()); | |||
} | |||
} | |||