BizHandlerFactory.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package com.hr.externelSystem;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.fastjson2.JSON;
  4. import com.hr.dto.AggregateQueryDTO;
  5. import com.hr.dto.ApiLogDto;
  6. import com.hr.param.AggregateRequest;
  7. import com.hr.repository.domain.*;
  8. import com.hr.repository.jpa.IpLogRepository;
  9. import com.hr.repository.jpa.IpOrderRepository;
  10. import com.hr.util.SnowflakeIdWorker;
  11. import com.hr.vo.CallbackResponseVO;
  12. import com.timevale.esign.paas.tech.util.AesUtil;
  13. import com.yy.basedevelop.common.data.BaseReturnDto;
  14. import com.yy.basedevelop.common.util.ruoyi.exception.ServiceException;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.apache.http.HttpStatus;
  18. import org.apache.poi.ss.formula.functions.T;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Component;
  21. import java.time.LocalDateTime;
  22. import java.util.List;
  23. @Component
  24. @Slf4j
  25. public class BizHandlerFactory {
  26. @Autowired
  27. private List<BizHandler> handlers;
  28. @Autowired
  29. private IpOrderRepository ipOrderRepository;
  30. @Autowired
  31. private IpLogRepository ipLogRepository;
  32. public BizHandler getHandler(String interfaceCode){
  33. for (BizHandler handler : handlers) {
  34. if (handler.getType().getServiceCode().equals(interfaceCode)){
  35. return handler;
  36. }
  37. }
  38. throw new ServiceException("找不到接口服务:" + interfaceCode);
  39. }
  40. /**
  41. * 接口平台分发数据
  42. * @param req
  43. * @param dto
  44. * @return
  45. */
  46. public BaseReturnDto<Object> dispatch(AggregateRequest req, AggregateQueryDTO dto) {
  47. IpInterfacePO ipInterfacePO = dto.getIpInterfacePO();
  48. BizHandler handler = getHandler(ipInterfacePO.getInterfaceNo());
  49. IpOrderPO ipOrderPO = new IpOrderPO();
  50. IpLogPO ipLogPO = new IpLogPO();
  51. String data = req.getData();
  52. try {
  53. ApiLogDto logDto = new ApiLogDto();
  54. IpTokenPO ipTokenPO = dto.getIpTokenPO();
  55. String decrypt = AesUtil.decrypt(data, ipTokenPO.getSecret());
  56. Class requestClass = handler.getRequestClass();
  57. Object o = JSON.parseObject(decrypt, requestClass);
  58. wrapOrder(req, dto, ipOrderPO, ipInterfacePO,ipLogPO);
  59. ipOrderPO.setStatus("handle");
  60. ipOrderRepository.save(ipOrderPO);
  61. ipLogRepository.save(ipLogPO);
  62. Object handle = handler.handle(o, ipInterfacePO,logDto);
  63. ipLogPO.setSystemResponse(JSON.toJSONString(handle));
  64. String errorMessage = logDto.getErrorMessage();
  65. if(StringUtils.isEmpty(errorMessage)){
  66. ipOrderPO.setStatus("success");
  67. ipLogPO.setStatus("success");
  68. }else{
  69. ipOrderPO.setStatus("fail");
  70. ipLogPO.setStatus("fail");
  71. }
  72. ipOrderPO.setInterfaceId(ipInterfacePO.getId());
  73. ipOrderPO.setUpdateTime(LocalDateTime.now());
  74. ipOrderPO.setBusinessNo(logDto.getBusinessNo());
  75. ipLogPO.setUrl(logDto.getUrl());
  76. ipLogPO.setRequestParam(logDto.getRequestParam());
  77. ipLogPO.setUpdateTime(LocalDateTime.now());
  78. ipLogPO.setResponseResult(logDto.getResponseParam());
  79. ipLogPO.setHttpStatus(logDto.getHttpStatus());
  80. ipLogPO.setMsg(logDto.getErrorMessage());
  81. ipOrderRepository.save(ipOrderPO);
  82. ipLogRepository.save(ipLogPO);
  83. return BaseReturnDto.success(handle);
  84. } catch (Exception e) {
  85. log.error("数据解密失败",JSON.toJSONString(req),e);
  86. }
  87. return BaseReturnDto.error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "数据处理失败");
  88. }
  89. private void wrapOrder(AggregateRequest req, AggregateQueryDTO dto, IpOrderPO ipOrderPO, IpInterfacePO ipInterfacePO, IpLogPO ipLogPO) {
  90. IpTokenInterfacePO ipTokenInterfacePO = dto.getIpTokenInterfacePO();
  91. ipOrderPO.setId(SnowflakeIdWorker.nextId());
  92. ipOrderPO.setInterfaceName(ipInterfacePO.getInterfaceName());
  93. ipOrderPO.setAccNo(req.getAccountNo());
  94. ipOrderPO.setToken(req.getToken());
  95. ipOrderPO.setRefId(0L);
  96. ipOrderPO.setIsCallback(ipTokenInterfacePO.getIsCallback());
  97. ipOrderPO.setCallbackNum(ipTokenInterfacePO.getCallbackNum());
  98. ipOrderPO.setCallbackUrl(ipTokenInterfacePO.getCallbackUrl());
  99. ipOrderPO.setAddTime(LocalDateTime.now());
  100. ipOrderPO.setManufacturer(ipInterfacePO.getManufacturer());
  101. ipLogPO.setId(SnowflakeIdWorker.nextId());
  102. ipLogPO.setOid(ipOrderPO.getId());
  103. ipLogPO.setAddTime(LocalDateTime.now());
  104. ipLogPO.setExecuteType("request");
  105. ipLogPO.setStatus("handle");
  106. }
  107. private void wrapCallBackOrder(IpOrderPO ipOrder, CallbackResponseVO callback, LocalDateTime callDateTime, JSONObject json) {
  108. IpLogPO ipLog = new IpLogPO();
  109. IpOrderPO ipOrderPO = new IpOrderPO();
  110. ipOrderPO.setId(SnowflakeIdWorker.nextId());
  111. ipOrderPO.setInterfaceName(ipOrder.getInterfaceName());
  112. ipOrderPO.setAccNo(ipOrder.getAccNo());
  113. ipOrderPO.setInterfaceId(ipOrder.getInterfaceId());
  114. ipOrderPO.setRefId(ipOrder.getId());
  115. ipOrderPO.setCallbackUrl(ipOrder.getCallbackUrl());
  116. ipOrderPO.setAddTime(callDateTime);
  117. ipOrderPO.setUpdateTime(LocalDateTime.now());
  118. ipOrderPO.setManufacturer(ipOrder.getManufacturer());
  119. ipOrderPO.setStatus(callback.getStatus() ? "success" : "fail");
  120. ipOrderPO.setCallbackStatus(callback.getStatus() ? "success" : "fail");
  121. ipLog.setId(SnowflakeIdWorker.nextId());
  122. ipLog.setOid(ipOrderPO.getId());
  123. ipLog.setAddTime(callDateTime);
  124. ipLog.setRequestParam(json.toJSONString());
  125. ipLog.setExecuteType("callback");
  126. ipLog.setStatus(callback.getStatus() ? "success" : "fail");
  127. ipLog.setUpdateTime(LocalDateTime.now());
  128. ipLog.setResponseResult(callback.getResponseParam());
  129. ipOrderRepository.save(ipOrderPO);
  130. ipLogRepository.save(ipLog);
  131. }
  132. public Boolean doCallBack(String interfaceNo, String businessNo, JSONObject json) {
  133. IpOrderPO ipOrderPO = ipOrderRepository.findByBusinessNo(businessNo);
  134. if(ipOrderPO == null){
  135. log.error("找不到对应的业务编码");
  136. return false;
  137. }
  138. String callbackStatus = ipOrderPO.getCallbackStatus();
  139. if("success".equals(callbackStatus)){
  140. log.info("当前业务回调已处理,已忽略");
  141. return true;
  142. }
  143. Boolean isCallback = ipOrderPO.getIsCallback();
  144. if(!isCallback){
  145. log.info("当前业务未设置回调,已忽略");
  146. return true;
  147. }
  148. BizHandler handler = getHandler(interfaceNo);
  149. Boolean callbackResult = false;
  150. ipOrderPO.setCallbackStatus("handle");
  151. for (int i = 0; i < ipOrderPO.getCallbackNum(); i++) {
  152. LocalDateTime callDateTime = LocalDateTime.now();
  153. CallbackResponseVO result = handler.doCallBack(ipOrderPO, json);
  154. // 记录调用记录
  155. wrapCallBackOrder(ipOrderPO,result,callDateTime,json);
  156. if(result.getStatus()){
  157. callbackResult = true;
  158. break;
  159. }
  160. }
  161. ipOrderPO.setCallbackStatus(callbackResult ? "success" : "fail");
  162. return callbackResult;
  163. }
  164. }