IposFeignController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. package com.poteviohealth.ym.ipos.controller.feign;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.google.common.collect.Lists;
  5. import com.poteviohealth.cgp.common.controller.BaseFeignController;
  6. import com.poteviohealth.cgp.common.integrated.ipos.model.*;
  7. import com.poteviohealth.cgp.common.integrated.order.model.PayBefor;
  8. import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
  9. import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
  10. import com.poteviohealth.cgp.common.model.VaultsResponse;
  11. import com.poteviohealth.cgp.common.utils.CgpTool;
  12. import com.poteviohealth.cgp.common.utils.DateUtils;
  13. import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
  14. import com.poteviohealth.ym.ipos.model.split.SplitRecords;
  15. import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
  16. import com.poteviohealth.ym.ipos.service.*;
  17. import com.poteviohealth.ym.ipos.utils.YmUtil;
  18. import io.swagger.annotations.Api;
  19. import io.swagger.annotations.ApiOperation;
  20. import lombok.extern.log4j.Log4j2;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.apache.commons.lang3.time.DateFormatUtils;
  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.math.RoundingMode;
  31. import java.util.Date;
  32. import java.util.List;
  33. /**
  34. * 第三方支付
  35. * @author Qin
  36. */
  37. @Controller
  38. @RequestMapping("/ipos/feign")
  39. @Api(tags = {"第三方-支付相关接口"})
  40. @Log4j2
  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. @ApiOperation(value = "第三方支付信息")
  53. @RequestMapping(value = "/returnPay", method = RequestMethod.POST)
  54. @ResponseBody
  55. public VaultsResponse<PayInfoAppOutDTO> returnPay(@RequestBody PayBefor payBefor){
  56. PaymentRecords pr = new PaymentRecords();
  57. pr.setPayId(CgpTool.generateKey());
  58. pr.setPaySn(payBefor.getPaySn());
  59. pr.setTxAmt(payBefor.getPrice());
  60. pr.setOpenid(payBefor.getOpenid());
  61. pr.setAppId(payBefor.getAppId());
  62. pr.setOperatorId(payBefor.getOperatorId());
  63. pr.setPlanSplitDate(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd"));
  64. paymentRecordsService.save(pr);
  65. return paymentService.unifiedOrder(pr);
  66. }
  67. @ApiOperation(value = "退款信息")
  68. @RequestMapping(value = "/barcodeReverse", method = RequestMethod.POST)
  69. @ResponseBody
  70. public VaultsResponse barcodeReverse(@RequestBody RefundReceive refundReceive){
  71. return paymentService.barcodeReverse(refundReceive);
  72. }
  73. @ApiOperation(value = "退款信息查询")
  74. @RequestMapping(value = "/refundQuery", method = RequestMethod.POST)
  75. @ResponseBody
  76. public VaultsResponse<List<String>> refundQuery(@RequestBody List<RefundQuery> list){
  77. List<String> returnList = Lists.newArrayList();
  78. for (RefundQuery refundQuery : list) {
  79. VaultsResponse vaultsResponse = paymentService.barcodeRefundQuery(refundQuery.getTransactionId(),refundQuery.getOperatorId().toString());
  80. if(vaultsResponse.validate()){
  81. if(YmUtil.SUCCESS.equals(vaultsResponse.getData().toString())){
  82. returnList.add(refundQuery.getSn());
  83. }
  84. }
  85. }
  86. return VaultsResponse.success(returnList);
  87. }
  88. @ApiOperation(value = "分账信息")
  89. @RequestMapping(value = "/splitOrder", method = RequestMethod.POST)
  90. @ResponseBody
  91. public VaultsResponse<List<SplitPay>> splitOrder(@RequestBody List<SplitInfo> list) {
  92. /**
  93. * 分成顺序:平台自留->供应价/结算价->区域运营商分成->团长分成->站长分成->平台运营商
  94. * 手续费:0.3%(由第三方提供)
  95. * 分账金额=(总价-手续费)
  96. * 分账 = 分账金额*99%;平台自留: 分账金额*1%
  97. * 可分账 = 分账-供应价(结算价)
  98. * 区域运营商分账 = 可分账 * 分账比例
  99. * 剩余分账 = 可分账 - 区域运营商分账
  100. * 团长分账 = 剩余分账 * 分账比例
  101. * 站长分账 = 剩余分账 * 分账比例
  102. * 平台运营商分账 = 可分账 - 区域运营商分账 -团长分账 -站长分账
  103. */
  104. log.info(JSON.toJSONString(list));
  105. BigDecimal proportion = new BigDecimal(0.01);
  106. List<SplitPay> returnList = Lists.newArrayList();
  107. for (SplitInfo splitInfo : list) {
  108. //List<SplitRecords> splitRecordsList = Lists.newArrayList();
  109. PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId());
  110. if(pr == null){
  111. continue;
  112. }
  113. List<SplitRecordsDetail> details = Lists.newArrayList();
  114. SplitRecords records = new SplitRecords();
  115. records.setOperatorId(splitInfo.getOperatorId());
  116. records.setSplitId(CgpTool.generateKey());
  117. records.setPayId(splitInfo.getPayId());
  118. records.setPaySn(splitInfo.getPaySn());
  119. records.setSumPrice(splitInfo.getSumPrice());
  120. //手续费
  121. BigDecimal chargeAmount = new BigDecimal(pr.getChargeAmount());
  122. BigDecimal ptAmount = BigDecimal.ZERO;
  123. BigDecimal tzAmount = BigDecimal.ZERO;
  124. BigDecimal stationAmount = BigDecimal.ZERO;
  125. BigDecimal ptyysAmount = BigDecimal.ZERO;
  126. BigDecimal supplierOneAmount = BigDecimal.ZERO;
  127. BigDecimal supplierTwoAmount = BigDecimal.ZERO;
  128. BigDecimal supplierAmount = BigDecimal.ZERO;
  129. /**
  130. * 0.平台自留金额
  131. */
  132. //平台自留
  133. SplitRecordsDetail pt = new SplitRecordsDetail();
  134. pt.setSplitId(records.getSplitId());
  135. pt.setSourceId(0);
  136. for (SplitDetail detail : splitInfo.getDetails()) {
  137. SplitPay sp = new SplitPay();
  138. sp.setOrderId(detail.getOrderId());
  139. sp.setSplitId(records.getSplitId());
  140. //总分账金额 支付价-手续费
  141. BigDecimal sumPrice = new BigDecimal(detail.getPrice()).subtract(chargeAmount);
  142. //平台自留=总分账金额*1%
  143. BigDecimal ptDecimal = sumPrice.multiply(proportion).setScale(0, RoundingMode.HALF_UP);
  144. //可分金额=总分账金额-平台自留
  145. BigDecimal price = sumPrice.subtract(ptDecimal);
  146. detail.setPrice(price.longValue());
  147. //平台自留金额
  148. ptAmount = ptAmount.add(ptDecimal);
  149. returnList.add(sp);
  150. /**
  151. * 2.供应价/结算价 的分账(包含区域运营商/一级供应商/二级供应商/服务站)
  152. */
  153. //一级供应商
  154. if(StringUtils.isNotEmpty(detail.getSupplierOneMerchantId()) && detail.getBelong().equals(1)){
  155. SplitRecordsDetail supplierOne = new SplitRecordsDetail();
  156. supplierOne.setSplitId(records.getSplitId());
  157. supplierOne.setSourceId(3);
  158. supplierOne.setMerchantId(detail.getSupplierOneMerchantId());
  159. for (SplitRecordsDetail splitRecordsDetail : details) {
  160. if(splitRecordsDetail.getMerchantId().equals(detail.getSupplierOneMerchantId())){
  161. supplierOne = splitRecordsDetail;
  162. break;
  163. }
  164. }
  165. detail.setPrice(detail.getPrice()-detail.getConsignmentPrice());
  166. supplierOneAmount = supplierOneAmount.add(new BigDecimal(detail.getConsignmentPrice()));
  167. if (supplierOneAmount.compareTo(BigDecimal.ZERO) == 1) {
  168. supplierOne.setDivAmt(supplierOneAmount.toString());
  169. details.add(supplierOne);
  170. }
  171. }else if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getBelong().equals(2)){
  172. //二级供应商
  173. SplitRecordsDetail supplierTwo = new SplitRecordsDetail();
  174. supplierTwo.setSplitId(records.getSplitId());
  175. supplierTwo.setSourceId(4);
  176. supplierTwo.setMerchantId(detail.getServiceStationMerchantId());
  177. boolean is_have = false;
  178. for (SplitRecordsDetail splitRecordsDetail : details) {
  179. if(splitRecordsDetail.getMerchantId().equals(detail.getServiceStationMerchantId())){
  180. supplierTwo = splitRecordsDetail;
  181. is_have = true;
  182. break;
  183. }
  184. }
  185. detail.setPrice(detail.getPrice() - detail.getConsignmentPrice());
  186. supplierTwoAmount = supplierTwoAmount.add(new BigDecimal(detail.getConsignmentPrice()));
  187. if (supplierTwoAmount.compareTo(BigDecimal.ZERO) == 1) {
  188. supplierTwo.setDivAmt(supplierTwoAmount.toString());
  189. if(!is_have){
  190. details.add(supplierTwo);
  191. }
  192. }
  193. }else if(detail.getBelong().equals(0)){
  194. //服务站
  195. if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getOrderType().equals(2)){
  196. SplitRecordsDetail serviceStation = new SplitRecordsDetail();
  197. serviceStation.setSplitId(records.getSplitId());
  198. serviceStation.setSourceId(5);
  199. serviceStation.setMerchantId(detail.getServiceStationMerchantId());
  200. boolean is_have = false;
  201. for (SplitRecordsDetail splitRecordsDetail : details) {
  202. if(splitRecordsDetail.getMerchantId().equals(detail.getServiceStationMerchantId())){
  203. serviceStation = splitRecordsDetail;
  204. is_have=true;
  205. break;
  206. }
  207. }
  208. stationAmount = stationAmount.add(new BigDecimal(detail.getSettlementPrice()));
  209. detail.setPrice(detail.getPrice() - detail.getSettlementPrice());
  210. if (stationAmount.compareTo(BigDecimal.ZERO) == 1) {
  211. serviceStation.setDivAmt(stationAmount.toString());
  212. if(!is_have){
  213. details.add(serviceStation);
  214. }
  215. }
  216. }else if(StringUtils.isNotEmpty(detail.getSupplierMerchantId()) && detail.getOrderType().equals(1)){
  217. //供应商
  218. boolean is_have = false;
  219. SplitRecordsDetail supplier = new SplitRecordsDetail();
  220. supplier.setSplitId(records.getSplitId());
  221. supplier.setSourceId(2);
  222. supplier.setMerchantId(detail.getSupplierMerchantId());
  223. for (SplitRecordsDetail splitRecordsDetail : details) {
  224. if(splitRecordsDetail.getMerchantId().equals(detail.getSupplierMerchantId())){
  225. supplier = splitRecordsDetail;
  226. is_have =true;
  227. break;
  228. }
  229. }
  230. supplierAmount = supplierAmount.add(new BigDecimal(detail.getSettlementPrice()));
  231. detail.setPrice(detail.getPrice()-detail.getSettlementPrice());
  232. if (supplierAmount.compareTo(BigDecimal.ZERO) == 1) {
  233. supplier.setDivAmt(supplierAmount.toString());
  234. if(!is_have){
  235. details.add(supplier);
  236. }
  237. }
  238. }
  239. }
  240. /**
  241. * 3.分成
  242. */
  243. //区域运营商
  244. log.info("detail.getSupplierMoney()==="+detail.getSupplierMoney());
  245. if(detail.getSupplierMoney()!= null && detail.getSupplierMoney()>0L){
  246. SplitRecordsDetail supplier = new SplitRecordsDetail();
  247. supplier.setSplitId(records.getSplitId());
  248. supplier.setSourceId(2);
  249. supplier.setMerchantId(detail.getSupplierMerchantId());
  250. boolean is_have = false;
  251. for (SplitRecordsDetail splitRecordsDetail : details) {
  252. if(splitRecordsDetail.getMerchantId().equals(detail.getSupplierMerchantId())){
  253. supplier = splitRecordsDetail;
  254. is_have =true;
  255. break;
  256. }
  257. }
  258. supplierAmount = supplierAmount.add(new BigDecimal(detail.getSupplierMoney()));
  259. detail.setPrice(detail.getPrice()-detail.getSupplierMoney());
  260. if (supplierAmount.compareTo(BigDecimal.ZERO) == 1) {
  261. supplier.setDivAmt(supplierAmount.toString());
  262. if(!is_have){
  263. details.add(supplier);
  264. }
  265. }
  266. }
  267. //团长
  268. if(detail.getGroupCommissionMoney() != null && detail.getGroupCommissionMoney()>0L &&StringUtils.isNotBlank(detail.getGroupLeaderMerchantId())){
  269. SplitRecordsDetail tz = new SplitRecordsDetail();
  270. tz.setSplitId(records.getSplitId());
  271. tz.setSourceId(6);
  272. tz.setMerchantId(detail.getGroupLeaderMerchantId());
  273. boolean is_have = false;
  274. for (SplitRecordsDetail splitRecordsDetail : details) {
  275. if(splitRecordsDetail.getMerchantId().equals(detail.getGroupLeaderMerchantId())){
  276. tz = splitRecordsDetail;
  277. is_have =true;
  278. break;
  279. }
  280. }
  281. tzAmount = tzAmount.add(new BigDecimal(detail.getGroupCommissionMoney()));
  282. detail.setPrice(detail.getPrice()-detail.getGroupCommissionMoney());
  283. if (tzAmount.compareTo(BigDecimal.ZERO) == 1) {
  284. tz.setDivAmt(tzAmount.toString());
  285. if(!is_have){
  286. details.add(tz);
  287. }
  288. }
  289. }
  290. //站长
  291. if(detail.getStationmasterCommissionMoney() != null && detail.getStationmasterCommissionMoney()>0L&&StringUtils.isNotBlank(detail.getStationmasterMerchantId())){
  292. SplitRecordsDetail station = new SplitRecordsDetail();
  293. station.setSplitId(records.getSplitId());
  294. station.setSourceId(5);
  295. station.setMerchantId(detail.getStationmasterMerchantId());
  296. Boolean is_have = false;
  297. for (SplitRecordsDetail splitRecordsDetail : details) {
  298. if(splitRecordsDetail.getMerchantId().equals(detail.getStationmasterMerchantId())){
  299. station = splitRecordsDetail;
  300. is_have =true;
  301. break;
  302. }
  303. }
  304. stationAmount = stationAmount.add(new BigDecimal(detail.getStationmasterCommissionMoney()));
  305. detail.setPrice(detail.getPrice()-detail.getStationmasterCommissionMoney());
  306. if (stationAmount.compareTo(BigDecimal.ZERO) == 1) {
  307. station.setDivAmt(stationAmount.toString());
  308. if(!is_have){
  309. details.add(station);
  310. }
  311. }
  312. }
  313. if(detail.getPrice()>0L){
  314. ptyysAmount = ptyysAmount.add(new BigDecimal(detail.getPrice()));
  315. }
  316. }
  317. pt.setDivAmt(String.valueOf(ptAmount.longValue()));
  318. details.add(pt);
  319. //平台运营商
  320. SplitRecordsDetail ptyys = new SplitRecordsDetail();
  321. ptyys.setSplitId(records.getSplitId());
  322. ptyys.setSourceId(1);
  323. ptyys.setMerchantId(splitInfo.getOperatorMerchantId());
  324. ptyys.setDivAmt(ptyysAmount.toString());
  325. details.add(ptyys);
  326. /*VaultsResponse vaultsResponse = splitService.delayConfirm(records,details);
  327. if(!vaultsResponse.validate()){
  328. records.setComment(vaultsResponse.getMessage());
  329. }*/
  330. records.setStatus(2);
  331. splitRecordsService.save(records);
  332. splitRecordsDetailService.saveBatch(details);
  333. }
  334. return VaultsResponse.success(returnList);
  335. }
  336. @ApiOperation(value = "延时交易确认查询")
  337. @RequestMapping(value = "/delayConfirmQuery", method = RequestMethod.POST)
  338. @ResponseBody
  339. public VaultsResponse<List<DelayConfirmQuery>> delayConfirmQuery(@RequestBody List<DelayConfirmQuery> list){
  340. for (DelayConfirmQuery dcfq : list) {
  341. VaultsResponse vaultsResponse = splitService.delayConfirmQuery(dcfq.getSplitId().toString(),dcfq.getOperatorId().toString());
  342. if(vaultsResponse.validate()){
  343. dcfq.setStatus(1);
  344. }
  345. SplitRecords splitRecords = new SplitRecords();
  346. splitRecords.setStatus(1);
  347. QueryWrapper<SplitRecords> queryWrapper = new QueryWrapper<>();
  348. queryWrapper.eq("split_id",dcfq.getSplitId());
  349. splitRecordsService.update(splitRecords,queryWrapper);
  350. }
  351. return VaultsResponse.success(list);
  352. }
  353. }