SplitServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package com.poteviohealth.ym.ipos.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.TypeReference;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.google.common.collect.Lists;
  7. import com.poteviohealth.cgp.common.filter.TokenContext;
  8. import com.poteviohealth.cgp.common.integrated.LongParams;
  9. import com.poteviohealth.cgp.common.integrated.order.OrderFeignClient;
  10. import com.poteviohealth.cgp.common.model.VaultsResponse;
  11. import com.poteviohealth.cgp.common.utils.CgpTool;
  12. import com.poteviohealth.ym.ipos.common.Basic;
  13. import com.poteviohealth.ym.ipos.model.BasicConfiguration;
  14. import com.poteviohealth.ym.ipos.model.back.BaseBack;
  15. import com.poteviohealth.ym.ipos.model.payment.PayRefundQuery;
  16. import com.poteviohealth.ym.ipos.model.split.*;
  17. import com.poteviohealth.ym.ipos.model.split.back.*;
  18. import com.poteviohealth.ym.ipos.model.split.detail.*;
  19. import com.poteviohealth.ym.ipos.model.split.dto.WithdrawDto;
  20. import com.poteviohealth.ym.ipos.service.ISplitRecordsDetailService;
  21. import com.poteviohealth.ym.ipos.service.ISplitRecordsService;
  22. import com.poteviohealth.ym.ipos.service.ISplitService;
  23. import com.poteviohealth.ym.ipos.service.ISplitWithdrawService;
  24. import com.poteviohealth.ym.ipos.utils.YmUtil;
  25. import lombok.extern.log4j.Log4j2;
  26. import org.apache.commons.lang.StringUtils;
  27. import org.springframework.beans.factory.annotation.Value;
  28. import org.springframework.stereotype.Service;
  29. import javax.annotation.Resource;
  30. import java.util.Date;
  31. import java.util.List;
  32. import java.util.stream.Collectors;
  33. /**
  34. * 分账
  35. * @author Qin
  36. */
  37. @Service
  38. @Log4j2
  39. public class SplitServiceImpl implements ISplitService {
  40. @Value("${pay.field.url}")
  41. private String url;
  42. @Resource
  43. private ISplitRecordsService splitRecordsService;
  44. @Resource
  45. private ISplitRecordsDetailService splitRecordsDetailService;
  46. @Resource
  47. private ISplitWithdrawService splitWithdrawService;
  48. @Resource
  49. private OrderFeignClient orderFeignClient;
  50. @Override
  51. public VaultsResponse delayConfirm(SplitRecords records, List<SplitRecordsDetail> details) {
  52. BasicConfiguration basicConfig = Basic.getSystemParameter(records.getOperatorId());
  53. PayConfirm payConfirm = new PayConfirm();
  54. payConfirm.setPos_id(basicConfig.getCode());
  55. payConfirm.setSystem_id(basicConfig.getSystemId());
  56. payConfirm.setIsspid(basicConfig.getPid());
  57. payConfirm.setPos_seq(records.getSplitId().toString());
  58. payConfirm.setStore_id(records.getOperatorId().toString());
  59. PayConfirmDetail detail = new PayConfirmDetail();
  60. detail.setOrg_pos_seq(records.getPayId().toString());
  61. detail.setNotify_url(url+"/delayConfirmNotify");
  62. ExtendParamsConfirm extendParamsConfirm = new ExtendParamsConfirm();
  63. SplitInfoConfirm splitInfoConfirm = new SplitInfoConfirm();
  64. List<SplitListConfirm> list = Lists.newArrayList();
  65. String amt = "";
  66. for (SplitRecordsDetail recordsDetail : details) {
  67. if(recordsDetail.getSourceId().equals(0)){
  68. amt = recordsDetail.getDivAmt();
  69. continue;
  70. }
  71. SplitListConfirm slc = new SplitListConfirm();
  72. slc.setMerchant_id(recordsDetail.getMerchantId());
  73. slc.setDiv_amt(recordsDetail.getDivAmt());
  74. if(!slc.getDiv_amt().equals("0")){
  75. list.add(slc);
  76. }
  77. }
  78. splitInfoConfirm.setKeep_amt(amt);
  79. splitInfoConfirm.setSplit_list(list);
  80. extendParamsConfirm.setSplit_info(splitInfoConfirm);
  81. detail.setExtend_params(extendParamsConfirm);
  82. payConfirm.setDelay_confirm_request(detail);
  83. PayConfirmBack back = null;
  84. try {
  85. back = (PayConfirmBack) YmUtil.resultBack(payConfirm,new PayConfirmBack());
  86. } catch (IllegalAccessException e) {
  87. e.printStackTrace();
  88. return VaultsResponse.failed(e.getMessage());
  89. }
  90. if(YmUtil.SUCCESS.equals(back.getResult().getId()) || YmUtil.FAIL.equals(back.getResult().getId())){
  91. return VaultsResponse.success(back.getResult().getId());
  92. }
  93. return VaultsResponse.failed(back.getResult().getComment());
  94. }
  95. @Override
  96. public VaultsResponse delayConfirmQuery(String splitId,String operatorId) {
  97. BasicConfiguration basicConfig = Basic.getSystemParameter(Integer.parseInt(operatorId));
  98. PayConfirmQuery paymentQuery = new PayConfirmQuery();
  99. paymentQuery.setPos_id(basicConfig.getCode());
  100. paymentQuery.setSystem_id(basicConfig.getSystemId());
  101. paymentQuery.setIsspid(basicConfig.getPid());
  102. paymentQuery.setStore_id(operatorId);
  103. DelayConfirmQueryRequest detail = new DelayConfirmQueryRequest();
  104. detail.setOrg_pos_seq(splitId);
  105. paymentQuery.setDelay_confirmquery_request(detail);
  106. PayConfirmQueryBack back = null;
  107. try {
  108. back = (PayConfirmQueryBack) YmUtil.resultBack(paymentQuery,new PayConfirmQueryBack());
  109. } catch (IllegalAccessException e) {
  110. e.printStackTrace();
  111. return VaultsResponse.failed(e.getMessage());
  112. }
  113. if(YmUtil.FAIL.equals(back.getResult().getId()) || YmUtil.SUCCESS.equals(back.getResult().getId())){
  114. return VaultsResponse.success(back.getRefund_status());
  115. }
  116. return VaultsResponse.failed(back.getResult().getComment());
  117. }
  118. @Override
  119. public VaultsResponse delayConfirmRefund(Long splitId) {
  120. QueryWrapper queryWrapper = new QueryWrapper<>();
  121. queryWrapper.eq("split_id",splitId);
  122. SplitRecords splitRecords = splitRecordsService.getOne(queryWrapper);
  123. BasicConfiguration basicConfig = Basic.getSystemParameter(splitRecords.getOperatorId());
  124. List<SplitRecordsDetail> list = splitRecordsDetailService.list(queryWrapper);
  125. PayConfirmRefund payConfirmRefund = new PayConfirmRefund();
  126. payConfirmRefund.setPos_id(basicConfig.getCode());
  127. payConfirmRefund.setSystem_id(basicConfig.getSystemId());
  128. payConfirmRefund.setIsspid(basicConfig.getPid());
  129. payConfirmRefund.setStore_id(splitRecords.getOperatorId().toString());
  130. PayConfirmDetail detail = new PayConfirmDetail();
  131. detail.setOrg_pos_seq(splitId.toString());
  132. detail.setNotify_url(url+"/delayConfirmNotify");
  133. ExtendParamsConfirm extendParamsConfirm = new ExtendParamsConfirm();
  134. SplitInfoConfirm splitInfoConfirm = new SplitInfoConfirm();
  135. List<SplitListConfirm> split_list = Lists.newArrayList();
  136. for (SplitRecordsDetail recordsDetail : list) {
  137. if(recordsDetail.getSourceId().equals(0)){
  138. splitInfoConfirm.setKeep_amt(recordsDetail.getDivAmt());
  139. }else{
  140. SplitListConfirm listConfirm = new SplitListConfirm();
  141. listConfirm.setMerchant_id(recordsDetail.getMerchantId());
  142. listConfirm.setDiv_amt(recordsDetail.getDivAmt());
  143. split_list.add(listConfirm);
  144. }
  145. }
  146. splitInfoConfirm.setSplit_list(split_list);
  147. extendParamsConfirm.setSplit_info(splitInfoConfirm);
  148. detail.setExtend_params(extendParamsConfirm);
  149. payConfirmRefund.setDelay_confirmrefund_request(detail);
  150. BaseBack back = null;
  151. try {
  152. back = (BaseBack) YmUtil.resultBack(payConfirmRefund,new BaseBack());
  153. } catch (IllegalAccessException e) {
  154. e.printStackTrace();
  155. return VaultsResponse.failed(e.getMessage());
  156. }
  157. if(YmUtil.FAIL.equals(back.getResult().getId()) || YmUtil.SUCCESS.equals(back.getResult().getId())){
  158. return VaultsResponse.success();
  159. }
  160. return VaultsResponse.failed(back.getResult().getComment());
  161. }
  162. @Override
  163. public BaseBack delayRefundQuery(PayRefundQuery payRefundQuery) {
  164. return null;
  165. }
  166. @Override
  167. public VaultsResponse<SettlementQueryBack> merchantSettlementQuery(SettlementQueryDetail detail) {
  168. SettlementQuery settlementQuery = new SettlementQuery();
  169. BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
  170. settlementQuery.setSystem_id(basicConfig.getSystemId());
  171. settlementQuery.setIsspid(basicConfig.getPid());
  172. settlementQuery.setMerchant_settlementquery_request(detail);
  173. SettlementQueryBack back = null;
  174. try {
  175. String val = (String) YmUtil.resultBack(settlementQuery,new SettlementQueryBack());
  176. JSONObject jsonObject = new JSONObject(JSON.parseObject(val));
  177. if(val.contains("list")){
  178. List<SettlementQueryList> list = jsonObject.getJSONArray("list").stream().map(item -> JSON.parseObject(item.toString(), new TypeReference<SettlementQueryList>() {})).collect(Collectors.toList());
  179. jsonObject.put("list",list);
  180. }
  181. back = JSONObject.toJavaObject(jsonObject, SettlementQueryBack.class);
  182. } catch (IllegalAccessException e) {
  183. e.printStackTrace();
  184. return VaultsResponse.failed(e.getMessage());
  185. }
  186. if(YmUtil.FAIL.equals(back.getResult().getId()) || YmUtil.SUCCESS.equals(back.getResult().getId())){
  187. return VaultsResponse.success(back);
  188. }
  189. return VaultsResponse.failed(back.getResult().getComment());
  190. }
  191. @Override
  192. public VaultsResponse<AccountBalanceBack> accountBalanceQuery(String merchantId) {
  193. BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
  194. AccountBalance accountBalance = new AccountBalance();
  195. accountBalance.setMerchant_id(merchantId);
  196. accountBalance.setSystem_id(basicConfig.getSystemId());
  197. accountBalance.setIsspid(basicConfig.getPid());
  198. AccountBalanceBack back = null;
  199. try {
  200. String val = (String) YmUtil.resultBack(accountBalance,new AccountBalanceBack());
  201. JSONObject jsonObject = new JSONObject(JSON.parseObject(val));
  202. if(val.contains("list")){
  203. List<AccountBalanceList> list = jsonObject.getJSONArray("list").stream().map(item -> JSON.parseObject(item.toString(), new TypeReference<AccountBalanceList>() {})).collect(Collectors.toList());
  204. jsonObject.put("list",list);
  205. }
  206. back = JSONObject.toJavaObject(jsonObject, AccountBalanceBack.class);
  207. } catch (IllegalAccessException e) {
  208. e.printStackTrace();
  209. return VaultsResponse.failed(e.getMessage());
  210. }
  211. if(YmUtil.FAIL.equals(back.getResult().getId()) || YmUtil.SUCCESS.equals(back.getResult().getId())){
  212. return VaultsResponse.success(back);
  213. }
  214. return VaultsResponse.failed(back.getResult().getComment());
  215. }
  216. @Override
  217. public VaultsResponse<WithdrawBack> withdraw(WithdrawDto dto) {
  218. Long withdrawId = CgpTool.generateKey();
  219. BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
  220. Withdraw withdraw = new Withdraw();
  221. withdraw.setSystem_id(basicConfig.getSystemId());
  222. withdraw.setIsspid(basicConfig.getPid());
  223. withdraw.setPos_seq(withdrawId.toString());
  224. WithdrawDetail detail = new WithdrawDetail();
  225. detail.setMerchant_id(dto.getMerchantId());
  226. detail.setAmount(dto.getAmount());
  227. withdraw.setMerchant_withdraw_request(detail);
  228. WithdrawBack back = null;
  229. try {
  230. back = (WithdrawBack) YmUtil.resultBack(withdraw,new WithdrawBack());
  231. } catch (IllegalAccessException e) {
  232. e.printStackTrace();
  233. return VaultsResponse.failed(e.getMessage());
  234. }
  235. SplitWithdraw splitWithdraw = new SplitWithdraw();
  236. splitWithdraw.setOperatorId(TokenContext.cureOperatorId());
  237. splitWithdraw.setWithdrawId(withdrawId);
  238. splitWithdraw.setWithdrawSeq(back.getWithdraw_seq());
  239. splitWithdraw.setMerchantId(dto.getMerchantId());
  240. splitWithdraw.setAmount(dto.getAmount());
  241. splitWithdraw.setTransDate(new Date());
  242. splitWithdraw.setTransStatus(back.getTrans_status());
  243. splitWithdraw.setAcctStatus(StringUtils.isEmpty(back.getAcct_status())?back.getTrans_status():back.getAcct_status());
  244. splitWithdraw.setErrorMsg(back.getError_msg());
  245. splitWithdrawService.save(splitWithdraw);
  246. if(YmUtil.FAIL.equals(back.getResult().getId()) || YmUtil.SUCCESS.equals(back.getResult().getId())){
  247. return VaultsResponse.success(back);
  248. }
  249. return VaultsResponse.failed(back.getResult().getComment());
  250. }
  251. @Override
  252. public VaultsResponse<WithdrawBack> withdrawQuery(String withdrawSeq) {
  253. BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
  254. WithdrawQuery withdraw = new WithdrawQuery();
  255. withdraw.setSystem_id(basicConfig.getSystemId());
  256. withdraw.setIsspid(basicConfig.getPid());
  257. WithdrawQueryDetail detail = new WithdrawQueryDetail();
  258. detail.setWithdraw_seq(withdrawSeq);
  259. withdraw.setMerchant_withdrawquery_request(detail);
  260. WithdrawBack back = null;
  261. try {
  262. back = (WithdrawBack) YmUtil.resultBack(withdraw,new WithdrawBack());
  263. } catch (IllegalAccessException e) {
  264. e.printStackTrace();
  265. return VaultsResponse.failed(e.getMessage());
  266. }
  267. QueryWrapper<SplitWithdraw> queryWrapper = new QueryWrapper<>();
  268. queryWrapper.eq("withdraw_seq",withdrawSeq);
  269. SplitWithdraw splitWithdraw = new SplitWithdraw();
  270. splitWithdraw.setTransStatus(back.getTrans_status());
  271. splitWithdraw.setAcctStatus(back.getAcct_status());
  272. splitWithdrawService.update(splitWithdraw,queryWrapper);
  273. if(YmUtil.FAIL.equals(back.getResult().getId()) || YmUtil.SUCCESS.equals(back.getResult().getId())){
  274. return VaultsResponse.success(back);
  275. }
  276. return VaultsResponse.failed(back.getResult().getComment());
  277. }
  278. @Override
  279. public String delayConfirmNotify(DelayConfirmNotification delayConfirmNotification) {
  280. try{
  281. QueryWrapper<SplitRecords> queryWrapper = new QueryWrapper<>();
  282. queryWrapper.eq("split_id",delayConfirmNotification.getSplit_seq());
  283. List<SplitRecords> list = splitRecordsService.list(queryWrapper);
  284. for (SplitRecords splitRecords : list) {
  285. splitRecords.setType(delayConfirmNotification.getType());
  286. splitRecords.setErrorDesc(delayConfirmNotification.getError_desc());
  287. splitRecords.setTradeState(delayConfirmNotification.getTrade_state());
  288. if(splitRecords.getTradeState().equals("s")){
  289. splitRecords.setStatus(1);
  290. }
  291. QueryWrapper<SplitRecordsDetail> queryWrapper2 = new QueryWrapper<>();
  292. queryWrapper2.eq("split_id",splitRecords.getSplitId());
  293. List<SplitRecordsDetail> list2 = splitRecordsDetailService.list(queryWrapper2);
  294. for (SplitRecordsDetail detail : list2) {
  295. for (SplitConfirmDetail confirmDetail : delayConfirmNotification.getSplit_detail()) {
  296. if(detail.getMerchantId().equals(confirmDetail.getMerchant_id())){
  297. detail.setAmount(confirmDetail.getAmount());
  298. detail.setSellerAccount(confirmDetail.getSeller_account());
  299. detail.setTradeState(confirmDetail.getTrade_state());
  300. detail.setType(confirmDetail.getType());
  301. detail.setMchType(confirmDetail.getMch_type());
  302. }
  303. }
  304. }
  305. splitRecordsDetailService.updateBatchById(list2);
  306. if(splitRecords.getStatus().equals(1)){
  307. LongParams params = new LongParams();
  308. params.setOperatorId(splitRecords.getOperatorId());
  309. params.setId(splitRecords.getSplitId());
  310. orderFeignClient.changeOrderDelayConfirm(params);
  311. }
  312. }
  313. splitRecordsService.updateBatchById(list);
  314. }catch (Exception e){
  315. e.printStackTrace();
  316. return "fail";
  317. }
  318. return "success";
  319. }
  320. }