SplitServiceImpl.java 16 KB

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