IposFeignController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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.ym.ipos.model.payment.PaymentRecords;
  12. import com.poteviohealth.ym.ipos.model.split.SplitRecords;
  13. import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
  14. import com.poteviohealth.ym.ipos.service.*;
  15. import com.poteviohealth.ym.ipos.utils.YmUtil;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiOperation;
  18. import lombok.extern.log4j.Log4j2;
  19. import org.springframework.stereotype.Controller;
  20. import org.springframework.web.bind.annotation.RequestBody;
  21. import org.springframework.web.bind.annotation.RequestMapping;
  22. import org.springframework.web.bind.annotation.RequestMethod;
  23. import org.springframework.web.bind.annotation.ResponseBody;
  24. import javax.annotation.Resource;
  25. import java.util.List;
  26. /**
  27. * 第三方支付
  28. * @author Qin
  29. */
  30. @Controller
  31. @RequestMapping("/ipos/feign")
  32. @Api(tags = {"第三方-支付相关接口"})
  33. @Log4j2
  34. public class IposFeignController extends BaseFeignController {
  35. @Resource
  36. private IPaymentRecordsService paymentRecordsService;
  37. @Resource
  38. private IPaymentService paymentService;
  39. @Resource
  40. private ISplitRecordsService splitRecordsService;
  41. @Resource
  42. private ISplitRecordsDetailService splitRecordsDetailService;
  43. @Resource
  44. private ISplitService splitService;
  45. @ApiOperation(value = "第三方支付信息")
  46. @RequestMapping(value = "/returnPay", method = RequestMethod.POST)
  47. @ResponseBody
  48. public VaultsResponse<PayInfoAppOutDTO> returnPay(@RequestBody PayBefor payBefor){
  49. PaymentRecords pr = new PaymentRecords();
  50. pr.setPayId(CgpTool.generateKey());
  51. pr.setPaySn(payBefor.getPaySn());
  52. pr.setTxAmt(payBefor.getPrice());
  53. pr.setOpenid(payBefor.getOpenid());
  54. pr.setAppId(payBefor.getAppId());
  55. pr.setOperatorId(payBefor.getOperatorId());
  56. //pr.setPlanSplitDate(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd"));
  57. paymentRecordsService.save(pr);
  58. return paymentService.unifiedOrder(pr);
  59. }
  60. @ApiOperation(value = "退款信息")
  61. @RequestMapping(value = "/barcodeReverse", method = RequestMethod.POST)
  62. @ResponseBody
  63. public VaultsResponse barcodeReverse(@RequestBody RefundReceive refundReceive){
  64. return paymentService.barcodeReverse(refundReceive);
  65. }
  66. @ApiOperation(value = "退款信息查询")
  67. @RequestMapping(value = "/refundQuery", method = RequestMethod.POST)
  68. @ResponseBody
  69. public VaultsResponse<List<String>> refundQuery(@RequestBody List<RefundQuery> list){
  70. List<String> returnList = Lists.newArrayList();
  71. for (RefundQuery refundQuery : list) {
  72. VaultsResponse vaultsResponse = paymentService.barcodeRefundQuery(refundQuery.getTransactionId(),refundQuery.getOperatorId().toString());
  73. if(vaultsResponse.validate()){
  74. if(YmUtil.SUCCESS.equals(vaultsResponse.getData().toString())){
  75. returnList.add(refundQuery.getSn());
  76. }
  77. }
  78. }
  79. return VaultsResponse.success(returnList);
  80. }
  81. @ApiOperation(value = "分账信息")
  82. @RequestMapping(value = "/splitOrder", method = RequestMethod.POST)
  83. @ResponseBody
  84. public VaultsResponse<List<SplitPay>> splitOrder(@RequestBody List<SplitInfo> list) {
  85. /**
  86. * 分成顺序:平台自留->供应价/结算价->平台运营商分成->区域运营商分成->团长分成/站长分成
  87. * 手续费:0.3%(由第三方提供)
  88. * 分账总金额 = 支付金额-手续费
  89. * 平台自留金额 = 分账总金额 * 平台自留分成比例
  90. * 可分账金额 = 分账总金额 - 平台自留金额
  91. * 应分账金额 = 可分账金额 - 供应商成本价
  92. * 平台运营商分成金额 = 应分账金额 * 平台运营商分成比例
  93. * 区域运营商分成金额 = 应分账金额 * 区域运营商分成比例
  94. * 剩余分成金额 = 应分账金额 - 平台运营商分成金额 - 区域运营商分成金额
  95. * 团长分成金额 = 剩余分成金额 * 团长分成比例
  96. * 站长分成金额 = 剩余分成金额 * 站长分成比例
  97. * 剩余未分账部分则归属到平台自留金额中
  98. */
  99. List<SplitPay> returnList = Lists.newArrayList();
  100. for (SplitInfo splitInfo : list) {
  101. PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId());
  102. if(pr == null){
  103. continue;
  104. }
  105. Long id = CgpTool.generateKey();
  106. List<SplitRecordsDetail> details = Lists.newArrayList();
  107. SplitRecords records = new SplitRecords();
  108. records.setOperatorId(splitInfo.getOperatorId());
  109. records.setSplitId(id);
  110. records.setPayId(splitInfo.getPayId());
  111. records.setPaySn(splitInfo.getPaySn());
  112. records.setSumPrice(splitInfo.getSumPrice());
  113. //平台自留金额
  114. SplitRecordsDetail pt = new SplitRecordsDetail();
  115. pt.setSplitId(id);
  116. pt.setSourceId(0);
  117. pt.setDivAmt(String.valueOf(splitInfo.getSelfCommissionMoney()));
  118. details.add(pt);
  119. //平台运营商
  120. if(splitInfo.getIsSplitOperator() && splitInfo.getOperatorCommissionMoney() >0L){
  121. SplitRecordsDetail ptyys = new SplitRecordsDetail();
  122. ptyys.setSplitId(id);
  123. ptyys.setSourceId(1);
  124. ptyys.setMerchantId(splitInfo.getOperatorMerchantId());
  125. ptyys.setDivAmt(splitInfo.getOperatorCommissionMoney().toString());
  126. details.add(ptyys);
  127. }
  128. SplitDetail detail = splitInfo.getDetails().get(0);
  129. //区域运营商
  130. if(detail.getIsSplitSupplier() && detail.getSupplierMoney() >0L){
  131. SplitRecordsDetail supplier = new SplitRecordsDetail();
  132. supplier.setSplitId(id);
  133. supplier.setSourceId(2);
  134. supplier.setMerchantId(detail.getSupplierMerchantId());
  135. supplier.setDivAmt(detail.getSupplierMoney().toString());
  136. details.add(supplier);
  137. }
  138. //供应商
  139. if(detail.getBelong().equals(1)){
  140. //一级供应商
  141. if(detail.getIsSplitSupplierOne() && detail.getConsignmentPrice() >0L){
  142. SplitRecordsDetail supplierOne = new SplitRecordsDetail();
  143. supplierOne.setSplitId(id);
  144. supplierOne.setSourceId(3);
  145. supplierOne.setMerchantId(detail.getSupplierOneMerchantId());
  146. supplierOne.setDivAmt(detail.getConsignmentPrice().toString());
  147. details.add(supplierOne);
  148. }
  149. }else if(detail.getBelong().equals(2)){
  150. //二级供应商
  151. if(detail.getIsSplitServiceStation() && detail.getConsignmentPrice() >0L){
  152. SplitRecordsDetail supplierTwo = new SplitRecordsDetail();
  153. supplierTwo.setSplitId(id);
  154. supplierTwo.setSourceId(4);
  155. supplierTwo.setMerchantId(detail.getServiceStationMerchantId());
  156. supplierTwo.setDivAmt(detail.getConsignmentPrice().toString());
  157. details.add(supplierTwo);
  158. }
  159. }else{
  160. //服务商
  161. if(detail.getOrderType().equals(2) && !detail.getServiceStationId().equals(detail.getStationId())){
  162. if(detail.getIsSplitServiceStation() && detail.getSettlementPrice() >0L){
  163. SplitRecordsDetail serviceStation = new SplitRecordsDetail();
  164. serviceStation.setSplitId(id);
  165. serviceStation.setSourceId(5);
  166. serviceStation.setMerchantId(detail.getServiceStationMerchantId());
  167. serviceStation.setDivAmt(detail.getSettlementPrice().toString());
  168. details.add(serviceStation);
  169. }
  170. }else{
  171. //供应商
  172. SplitRecordsDetail supplier = new SplitRecordsDetail();
  173. supplier.setSplitId(id);
  174. supplier.setSourceId(2);
  175. supplier.setMerchantId(detail.getSupplierMerchantId());
  176. supplier.setDivAmt(detail.getSettlementPrice().toString());
  177. Boolean isHave = false;
  178. for (SplitRecordsDetail splitRecordsDetail : details) {
  179. if(splitRecordsDetail.getSourceId().equals(2) && supplier.getMerchantId().equals(splitRecordsDetail.getMerchantId())){
  180. Long val = Long.parseLong(splitRecordsDetail.getDivAmt())+detail.getSettlementPrice();
  181. splitRecordsDetail.setDivAmt(val.toString());
  182. isHave = true;
  183. break;
  184. }
  185. }
  186. if(!isHave && detail.getSettlementPrice() >0L){
  187. details.add(supplier);
  188. }
  189. }
  190. }
  191. //团长
  192. if(detail.getIsSplitGroupLeader() && detail.getGroupCommissionMoney() >0L){
  193. SplitRecordsDetail tz = new SplitRecordsDetail();
  194. tz.setSplitId(id);
  195. tz.setSourceId(6);
  196. tz.setMerchantId(detail.getGroupLeaderMerchantId());
  197. tz.setDivAmt(detail.getGroupCommissionMoney().toString());
  198. details.add(tz);
  199. }
  200. //站长
  201. if(detail.getIsSplitStation() && detail.getStationmasterCommissionMoney()>0L){
  202. SplitRecordsDetail station = new SplitRecordsDetail();
  203. station.setSplitId(id);
  204. station.setSourceId(5);
  205. station.setMerchantId(detail.getStationmasterMerchantId());
  206. station.setDivAmt(detail.getStationmasterCommissionMoney().toString());
  207. Boolean isHave = false;
  208. for (SplitRecordsDetail splitRecordsDetail : details) {
  209. if(splitRecordsDetail.getSourceId().equals(5) && station.getMerchantId().equals(splitRecordsDetail.getMerchantId())){
  210. Long val = Long.parseLong(splitRecordsDetail.getDivAmt())+detail.getStationmasterCommissionMoney();
  211. splitRecordsDetail.setDivAmt(val.toString());
  212. isHave = true;
  213. break;
  214. }
  215. }
  216. if(!isHave){
  217. details.add(station);
  218. }
  219. }
  220. VaultsResponse vaultsResponse = splitService.delayConfirm(records,details);
  221. if(!vaultsResponse.validate()){
  222. records.setComment(vaultsResponse.getMessage());
  223. records.setStatus(3);
  224. }else{
  225. records.setStatus(2);
  226. //回写
  227. SplitPay sp = new SplitPay();
  228. sp.setOrderId(detail.getOrderId());
  229. sp.setSplitId(id);
  230. returnList.add(sp);
  231. }
  232. splitRecordsService.save(records);
  233. splitRecordsDetailService.saveBatch(details);
  234. }
  235. return VaultsResponse.success(returnList);
  236. }
  237. @ApiOperation(value = "延时交易确认查询")
  238. @RequestMapping(value = "/delayConfirmQuery", method = RequestMethod.POST)
  239. @ResponseBody
  240. public VaultsResponse<List<DelayConfirmQuery>> delayConfirmQuery(@RequestBody List<DelayConfirmQuery> list){
  241. for (DelayConfirmQuery dcfq : list) {
  242. VaultsResponse vaultsResponse = splitService.delayConfirmQuery(dcfq.getSplitId().toString(),dcfq.getOperatorId().toString());
  243. if(vaultsResponse.validate()){
  244. dcfq.setStatus(1);
  245. }
  246. SplitRecords splitRecords = new SplitRecords();
  247. splitRecords.setStatus(1);
  248. QueryWrapper<SplitRecords> queryWrapper = new QueryWrapper<>();
  249. queryWrapper.eq("split_id",dcfq.getSplitId());
  250. splitRecordsService.update(splitRecords,queryWrapper);
  251. }
  252. return VaultsResponse.success(list);
  253. }
  254. }