ZhongmeiRequestApiComponents.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package com.ydtech.modules.order.components;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.serializer.SerializerFeature;
  4. import com.ydtech.config.properties.ZhongmeiApiConfigurationProperties;
  5. import com.ydtech.constants.InsuranceEnum;
  6. import com.ydtech.exception.SystemException;
  7. import com.ydtech.modules.order.entity.api.zhongmei.BaseRequest;
  8. import com.ydtech.modules.order.entity.api.zhongmei.BaseResponse;
  9. import com.ydtech.modules.order.entity.api.zhongmei.constants.TransCode;
  10. import com.ydtech.modules.order.entity.api.zhongmei.request.*;
  11. import com.ydtech.modules.order.entity.api.zhongmei.response.*;
  12. import com.ydtech.modules.order.utils.AESUtilsWithDataBase;
  13. import com.ydtech.modules.order.utils.InsuranceLog;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.springframework.http.HttpEntity;
  17. import org.springframework.http.HttpHeaders;
  18. import org.springframework.http.MediaType;
  19. import org.springframework.http.ResponseEntity;
  20. import org.springframework.stereotype.Component;
  21. import org.springframework.util.ObjectUtils;
  22. import org.springframework.web.client.RestTemplate;
  23. import java.util.List;
  24. /**
  25. * @author wenks
  26. * @version 0.0.2
  27. * @description 中煤 APi 请求
  28. * @date 2023/4/21 9:08
  29. */
  30. @Slf4j
  31. @Component
  32. public class ZhongmeiRequestApiComponents {
  33. private final ZhongmeiApiConfigurationProperties properties;
  34. private final RestTemplate restTemplate;
  35. public ZhongmeiRequestApiComponents(ZhongmeiApiConfigurationProperties zmApiConfigurationProperties, RestTemplate restTemplate) {
  36. this.properties = zmApiConfigurationProperties;
  37. this.restTemplate = restTemplate;
  38. }
  39. /**
  40. * 加密请求
  41. *
  42. * @param q 请求参数
  43. * @param url 请求url
  44. * @param tClass 响应类型
  45. * @param <Q> Request 请求体
  46. * @param <S> Response 响应体
  47. * @return <S>
  48. */
  49. private <Q extends BaseRequest, S extends BaseResponse> S post(Q q, String url, Class<S> tClass) {
  50. HttpHeaders httpHeaders = new HttpHeaders();
  51. httpHeaders.setContentType(MediaType.APPLICATION_JSON);
  52. String jsonString = JSON.toJSONString(q, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
  53. InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> URl: {} \n---------> 请求参数:{}", url, jsonString);
  54. // 加密
  55. String sessionKey = properties.getSessionKey();
  56. String s = AESUtilsWithDataBase.encryptECBPK5Hex(jsonString, sessionKey);
  57. InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> 加密后的参数:{}", s);
  58. HttpEntity<String> httpEntity = new HttpEntity<>(s, httpHeaders);
  59. ResponseEntity<String> response = restTemplate.postForEntity(url, httpEntity, String.class);
  60. String body = response.getBody();
  61. S t = AESUtilsWithDataBase.decryptMessage(body, tClass, "响应参数", sessionKey);
  62. if (ObjectUtils.isEmpty(t)) {
  63. throw new SystemException("请求失败");
  64. }
  65. return t;
  66. }
  67. /**
  68. * @param <Q> Request 请求体
  69. * @param <S> Response 响应体
  70. * @param request 请求内容
  71. * @param tClass 响应类型
  72. * @param verify 结果是否需要验证
  73. * @return 响应内容
  74. */
  75. private <Q extends BaseRequest, S extends BaseResponse> S request(Q request, Class<S> tClass, boolean verify, String domain, String urlInterface) {
  76. String url = domain;
  77. if (StringUtils.isNotEmpty(urlInterface)) {
  78. url = url + urlInterface + ".do";
  79. } else {
  80. url = url + request.getHead().getTransCode() + ".do";
  81. }
  82. S response = post(request, url, tClass);
  83. if (verify) {
  84. validationResults(response);
  85. }
  86. return response;
  87. }
  88. /**
  89. * @param <Q> Request 请求体
  90. * @param <S> Response 响应体
  91. * 常规
  92. */
  93. private <Q extends BaseRequest, S extends BaseResponse> S routineRequest(Q request, Class<S> tClass, boolean verify, String urlInterface) {
  94. return request(request, tClass, verify, properties.getUrl(), urlInterface);
  95. }
  96. /**
  97. * @param <Q> Request 请求体
  98. * @param <S> Response 响应体
  99. * 影像
  100. */
  101. private <Q extends BaseRequest, S extends BaseResponse> void imageRequest(Q request, Class<S> tClass, boolean verify) {
  102. request(request, tClass, verify, properties.getUrl(), "");
  103. }
  104. /**
  105. * @param <Q> Request 请求体
  106. * @param <S> Response 响应体
  107. * 短信
  108. */
  109. private <Q extends BaseRequest, S extends BaseResponse> S smsRequest(Q request, Class<S> tClass, boolean verify) {
  110. return request(request, tClass, verify, properties.getSmsUrl(), "");
  111. }
  112. /**
  113. * 车型查询 传入必要车辆信息,返回车型列表给用户选择
  114. */
  115. public List<ModelsQueryResponse.SimpleStadarCarDTO> modelQuery(ModelsQueryRequest request, Class<ModelsQueryResponse> tClass) {
  116. return routineRequest(request, tClass, true, "").getSimpleStadarCar();
  117. }
  118. /**
  119. * 报价 传入必要投保方案信息,返回投保单保费及车船税
  120. */
  121. public QuotedPriceResponse quotedPrice(QuotedPriceRequest request, Class<QuotedPriceResponse> tClass) {
  122. return routineRequest(request, tClass, true, "");
  123. }
  124. /**
  125. * 提交核保 传入投保单必要信息,对投保单进行审核
  126. */
  127. public SubmitResponse submit(SubmitRequest request, Class<SubmitResponse> tClass) {
  128. request.setCallbackUrl(properties.getCallbackDomain() + properties.getCallbackUrl());
  129. request.setPageUrl(properties.getPageUrl());
  130. request.setPassMsgUrl(properties.getCallbackDomain() + properties.getPassMsgUrl());
  131. return routineRequest(request, tClass, false, "");
  132. }
  133. /**
  134. * 上传影像 传入订单信息,查询是否生成保单成功
  135. */
  136. public void uploadImage(UploadImageRequest request, Class<UploadImageResponse> tClass) {
  137. imageRequest(request, tClass, true);
  138. }
  139. /**
  140. * 缴费查询
  141. */
  142. public OrderStatusResponse orderStatus(OrderStatusRequest request, Class<OrderStatusResponse> tClass) {
  143. return routineRequest(request, tClass, true, "");
  144. }
  145. /**
  146. * 核保状态查询 传入单号查询该单核保状态
  147. */
  148. public SubmitStatusQueryResponse submitStatus(SubmitStatusQueryRequest request, Class<SubmitStatusQueryResponse> tClass) {
  149. return routineRequest(request, tClass, true, TransCode.SUBMIT_STATUS);
  150. }
  151. /**
  152. * 非车可投保产品查询
  153. * @param request
  154. * @param tClass
  155. * @return
  156. */
  157. public RideAccidentQueryResponse rideAccidentQuery(RideAccidentQueryRequest request, Class<RideAccidentQueryResponse> tClass) {
  158. return routineRequest(request, tClass, true, TransCode.Ride_Accident_Query);
  159. }
  160. /**
  161. * 电子保单下载 传入单号相关信息下载电子保单
  162. */
  163. public InsurancePolicyPrintResponse insurancePolicyPrint(InsurancePolicyPrintRequest request, Class<InsurancePolicyPrintResponse> tClass) {
  164. return routineRequest(request, tClass, true, "");
  165. }
  166. /**
  167. * 校验发短信接口 校验此单是否需要发送短信
  168. */
  169. public CheckSMScodeResponse checkSMScode(CheckSMScodeRequest request, Class<CheckSMScodeResponse> tClass) {
  170. return smsRequest(request, tClass, true);
  171. }
  172. /**
  173. * 验证校验码正确 录入校验码校验是否正确
  174. */
  175. public ValidSMScodeResponse checkSMScode(ValidSMScodeRequest request, Class<ValidSMScodeResponse> tClass) {
  176. return smsRequest(request, tClass, true);
  177. }
  178. public <T extends BaseResponse> void validationResults(T t) {
  179. if ("-1".equals(t.getHead().getReturnCode())) {
  180. if(StringUtils.isNotEmpty(t.getHead().getReturnMessage())&& t.getHead().getReturnMessage().contains("平台返回") && t.getHead().getReturnMessage().contains("重复投保")){
  181. }else{
  182. throw new SystemException(t.getHead().getReturnMessage());
  183. }
  184. }
  185. }
  186. }