IposFeignController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package com.poteviohealth.ym.ipos.controller.feign;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.google.common.collect.Lists;
  4. import com.poteviohealth.cgp.common.controller.BaseFeignController;
  5. import com.poteviohealth.cgp.common.integrated.ipos.model.*;
  6. import com.poteviohealth.cgp.common.integrated.order.model.PayBefor;
  7. import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
  8. import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
  9. import com.poteviohealth.cgp.common.model.VaultsResponse;
  10. import com.poteviohealth.cgp.common.utils.CgpTool;
  11. import com.poteviohealth.cgp.common.utils.DateUtils;
  12. import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
  13. import com.poteviohealth.ym.ipos.model.split.SplitRecords;
  14. import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
  15. import com.poteviohealth.ym.ipos.service.*;
  16. import com.poteviohealth.ym.ipos.utils.YmUtil;
  17. import io.swagger.annotations.Api;
  18. import io.swagger.annotations.ApiOperation;
  19. import jodd.util.StringUtil;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.apache.commons.lang3.time.DateFormatUtils;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Controller;
  24. import org.springframework.web.bind.annotation.RequestBody;
  25. import org.springframework.web.bind.annotation.RequestMapping;
  26. import org.springframework.web.bind.annotation.RequestMethod;
  27. import org.springframework.web.bind.annotation.ResponseBody;
  28. import javax.annotation.Resource;
  29. import java.math.BigDecimal;
  30. import java.util.Date;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.stream.Collectors;
  34. /**
  35. * 第三方支付
  36. * @author Qin
  37. */
  38. @Controller
  39. @RequestMapping("/ipos/feign")
  40. @Api(tags = {"第三方-支付相关接口"})
  41. public class IposFeignController extends BaseFeignController {
  42. @Resource
  43. private IPaymentRecordsService paymentRecordsService;
  44. @Resource
  45. private IPaymentService paymentService;
  46. @Resource
  47. private ISplitRecordsService splitRecordsService;
  48. @Resource
  49. private ISplitRecordsDetailService splitRecordsDetailService;
  50. @Resource
  51. private ISplitService splitService;
  52. @Value("${pay.field.split}")
  53. private String split;
  54. @ApiOperation(value = "第三方支付信息")
  55. @RequestMapping(value = "/returnPay", method = RequestMethod.POST)
  56. @ResponseBody
  57. public VaultsResponse<PayInfoAppOutDTO> returnPay(@RequestBody PayBefor payBefor){
  58. PaymentRecords pr = new PaymentRecords();
  59. pr.setPayId(CgpTool.generateKey());
  60. pr.setPaySn(payBefor.getPaySn());
  61. pr.setTxAmt(payBefor.getPrice());
  62. pr.setOpenid(payBefor.getOpenid());
  63. pr.setAppId(payBefor.getAppId());
  64. pr.setOperatorId(payBefor.getOperatorId());
  65. pr.setPlanSplitDate(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd"));
  66. paymentRecordsService.save(pr);
  67. return paymentService.unifiedOrder(pr);
  68. }
  69. @ApiOperation(value = "退款信息")
  70. @RequestMapping(value = "/barcodeReverse", method = RequestMethod.POST)
  71. @ResponseBody
  72. public VaultsResponse barcodeReverse(@RequestBody RefundReceive refundReceive){
  73. return paymentService.barcodeReverse(refundReceive);
  74. }
  75. @ApiOperation(value = "退款信息查询")
  76. @RequestMapping(value = "/refundQuery", method = RequestMethod.POST)
  77. @ResponseBody
  78. public VaultsResponse<List<String>> refundQuery(@RequestBody List<RefundQuery> list){
  79. List<String> returnList = Lists.newArrayList();
  80. for (RefundQuery refundQuery : list) {
  81. VaultsResponse vaultsResponse = paymentService.barcodeRefundQuery(refundQuery.getTransactionId(),refundQuery.getOperatorId().toString());
  82. if(vaultsResponse.validate()){
  83. if(YmUtil.SUCCESS.equals(vaultsResponse.getData().toString())){
  84. returnList.add(refundQuery.getSn());
  85. }
  86. }
  87. }
  88. return VaultsResponse.success(returnList);
  89. }
  90. @ApiOperation(value = "分账信息")
  91. @RequestMapping(value = "/splitOrder", method = RequestMethod.POST)
  92. @ResponseBody
  93. public VaultsResponse<List<SplitPay>> splitOrder(@RequestBody List<SplitInfo> list) {
  94. List<SplitPay> returnList = Lists.newArrayList();
  95. for (SplitInfo splitInfo : list) {
  96. //List<SplitRecords> splitRecordsList = Lists.newArrayList();
  97. PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId());
  98. if(pr == null){
  99. continue;
  100. }
  101. List<SplitRecordsDetail> details = Lists.newArrayList();
  102. SplitRecords records = new SplitRecords();
  103. records.setOperatorId(splitInfo.getOperatorId());
  104. records.setSplitId(CgpTool.generateKey());
  105. records.setPayId(splitInfo.getPayId());
  106. records.setPaySn(splitInfo.getPaySn());
  107. records.setSumPrice(splitInfo.getSumPrice());
  108. //平台分成
  109. SplitRecordsDetail pt = new SplitRecordsDetail();
  110. pt.setSplitId(records.getSplitId());
  111. pt.setSourceId(0);
  112. BigDecimal chargeAmount = new BigDecimal(pr.getChargeAmount());
  113. BigDecimal ptAmount = BigDecimal.ZERO;
  114. BigDecimal tzAmount = BigDecimal.ZERO;
  115. BigDecimal ptyysAmount = BigDecimal.ZERO;
  116. BigDecimal supplierOneAmount = BigDecimal.ZERO;
  117. BigDecimal supplierTwoAmount = BigDecimal.ZERO;
  118. BigDecimal supplierAmount = BigDecimal.ZERO;
  119. //团长分成
  120. SplitRecordsDetail tz = new SplitRecordsDetail();
  121. tz.setSplitId(records.getSplitId());
  122. tz.setSourceId(3);
  123. for (SplitDetail detail : splitInfo.getDetails()) {
  124. SplitPay sp = new SplitPay();
  125. sp.setOrderId(detail.getOrderId());
  126. sp.setSplitId(records.getSplitId());
  127. //运算价格
  128. BigDecimal price = new BigDecimal(detail.getPrice()).subtract(chargeAmount);
  129. //平台金额
  130. BigDecimal ptDecimal = new BigDecimal(split).multiply(price).setScale(0,BigDecimal.ROUND_DOWN);
  131. BigDecimal valDecimal = new BigDecimal("1");
  132. if(ptDecimal.longValue() > 0){
  133. valDecimal = new BigDecimal(ptDecimal.longValue());
  134. }
  135. price = price.subtract(valDecimal);
  136. ptAmount = ptAmount.add(valDecimal);
  137. detail.setPrice(price.longValue());
  138. returnList.add(sp);
  139. }
  140. pt.setDivAmt(String.valueOf(ptAmount.longValue()));
  141. details.add(pt);
  142. //一级供应商
  143. Map<String, List<SplitDetail>> oneMaps = splitInfo.getDetails().stream().filter(s -> StringUtils.isNotEmpty(s.getSupplierOneMerchantId()) && s.getBelong().equals(1)).collect(Collectors.groupingBy(SplitDetail::getSupplierOneMerchantId));
  144. for (String s : oneMaps.keySet()) {
  145. SplitRecordsDetail supplierOne = new SplitRecordsDetail();
  146. supplierOne.setSplitId(records.getSplitId());
  147. supplierOne.setSourceId(2);
  148. supplierOne.setMerchantId(s);
  149. for (SplitDetail detail : oneMaps.get(s)) {
  150. supplierOneAmount = supplierOneAmount.add(new BigDecimal(detail.getConsignmentPrice()));
  151. detail.setPrice(new BigDecimal(detail.getPrice()).subtract(new BigDecimal(detail.getConsignmentPrice())).longValue());
  152. }
  153. if (supplierOneAmount.compareTo(BigDecimal.ZERO) == 1) {
  154. supplierOne.setDivAmt(String.valueOf(supplierOneAmount.longValue()));
  155. details.add(supplierOne);
  156. }
  157. }
  158. //二级供应商
  159. Map<String, List<SplitDetail>> twoMaps = splitInfo.getDetails().stream().filter(s -> StringUtils.isNotEmpty(s.getServiceStationMerchantId()) && s.getBelong().equals(2)).collect(Collectors.groupingBy(SplitDetail::getServiceStationMerchantId));
  160. for (String s : twoMaps.keySet()) {
  161. SplitRecordsDetail supplierTwo = new SplitRecordsDetail();
  162. supplierTwo.setSplitId(records.getSplitId());
  163. supplierTwo.setSourceId(2);
  164. supplierTwo.setMerchantId(s);
  165. for (SplitDetail detail : twoMaps.get(s)) {
  166. supplierTwoAmount = supplierTwoAmount.add(new BigDecimal(detail.getConsignmentPrice()));
  167. detail.setPrice(detail.getPrice() - detail.getConsignmentPrice());
  168. }
  169. if (supplierTwoAmount.compareTo(BigDecimal.ZERO) == 1) {
  170. supplierTwo.setDivAmt(String.valueOf(supplierTwoAmount.longValue()));
  171. details.add(supplierTwo);
  172. }
  173. }
  174. //供应商
  175. Map<String, List<SplitDetail>> maps = splitInfo.getDetails().stream().filter(s -> StringUtils.isNotEmpty(s.getSupplierMerchantId()) && s.getBelong().equals(0)).collect(Collectors.groupingBy(SplitDetail::getSupplierMerchantId));
  176. for (String s : maps.keySet()) {
  177. SplitRecordsDetail supplier = new SplitRecordsDetail();
  178. supplier.setSplitId(records.getSplitId());
  179. supplier.setSourceId(2);
  180. supplier.setMerchantId(s);
  181. for (SplitDetail detail : maps.get(s)) {
  182. supplierAmount = supplierAmount.add(new BigDecimal(detail.getSettlementPrice()));
  183. detail.setPrice(new BigDecimal(detail.getPrice()).subtract(new BigDecimal(detail.getSettlementPrice())).longValue());
  184. // detail.setPrice(detail.getPrice() - detail.getSettlementPrice());
  185. }
  186. if (supplierAmount.compareTo(BigDecimal.ZERO) == 1) {
  187. supplier.setDivAmt(String.valueOf(supplierAmount.longValue()));
  188. details.add(supplier);
  189. }
  190. }
  191. for (SplitDetail detail : splitInfo.getDetails()) {
  192. //团长金额
  193. if (StringUtil.isNotEmpty(detail.getGroupLeaderMerchantId())) {
  194. tz.setMerchantId(detail.getGroupLeaderMerchantId());
  195. BigDecimal tbd = detail.getGroupCommission().multiply(new BigDecimal(detail.getPrice()));
  196. detail.setPrice(detail.getPrice()-tbd.longValue());
  197. tzAmount = tzAmount.add(tbd);
  198. }
  199. }
  200. if (tzAmount.compareTo(BigDecimal.ZERO) == 1) {
  201. tz.setDivAmt(String.valueOf(tzAmount.longValue()));
  202. details.add(tz);
  203. }
  204. //平台运营商
  205. SplitRecordsDetail ptyys = new SplitRecordsDetail();
  206. ptyys.setSplitId(records.getSplitId());
  207. ptyys.setSourceId(1);
  208. for (SplitDetail detail : splitInfo.getDetails()) {
  209. ptyysAmount = ptyysAmount.add(new BigDecimal(detail.getPrice()));
  210. }
  211. ptyys.setMerchantId(splitInfo.getOperatorMerchantId());
  212. ptyys.setDivAmt(String.valueOf(ptyysAmount.longValue()));
  213. details.add(ptyys);
  214. VaultsResponse vaultsResponse = splitService.delayConfirm(records,details);
  215. if(!vaultsResponse.validate()){
  216. records.setComment(vaultsResponse.getMessage());
  217. }
  218. records.setStatus(2);
  219. //splitRecordsList.add(records);
  220. splitRecordsService.save(records);
  221. splitRecordsDetailService.saveBatch(details);
  222. }
  223. return VaultsResponse.success(returnList);
  224. }
  225. @ApiOperation(value = "延时交易确认查询")
  226. @RequestMapping(value = "/delayConfirmQuery", method = RequestMethod.POST)
  227. @ResponseBody
  228. public VaultsResponse<List<DelayConfirmQuery>> delayConfirmQuery(@RequestBody List<DelayConfirmQuery> list){
  229. for (DelayConfirmQuery dcfq : list) {
  230. VaultsResponse vaultsResponse = splitService.delayConfirmQuery(dcfq.getSplitId().toString(),dcfq.getOperatorId().toString());
  231. if(vaultsResponse.validate()){
  232. dcfq.setStatus(1);
  233. }
  234. SplitRecords splitRecords = new SplitRecords();
  235. splitRecords.setStatus(1);
  236. QueryWrapper<SplitRecords> queryWrapper = new QueryWrapper<>();
  237. queryWrapper.eq("split_id",dcfq.getSplitId());
  238. splitRecordsService.update(splitRecords,queryWrapper);
  239. }
  240. return VaultsResponse.success(list);
  241. }
  242. }