package com.poteviohealth.ym.ipos.controller.feign; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.Lists; import com.poteviohealth.cgp.common.controller.BaseFeignController; import com.poteviohealth.cgp.common.integrated.ipos.model.*; import com.poteviohealth.cgp.common.integrated.order.model.PayBefor; import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO; import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive; import com.poteviohealth.cgp.common.model.VaultsResponse; import com.poteviohealth.cgp.common.utils.CgpTool; import com.poteviohealth.cgp.common.utils.DateUtils; import com.poteviohealth.ym.ipos.model.payment.PaymentRecords; import com.poteviohealth.ym.ipos.model.split.SplitRecords; import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail; import com.poteviohealth.ym.ipos.service.*; import com.poteviohealth.ym.ipos.utils.YmUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.List; /** * 第三方支付 * @author Qin */ @Controller @RequestMapping("/ipos/feign") @Api(tags = {"第三方-支付相关接口"}) @Log4j2 public class IposFeignController extends BaseFeignController { @Resource private IPaymentRecordsService paymentRecordsService; @Resource private IPaymentService paymentService; @Resource private ISplitRecordsService splitRecordsService; @Resource private ISplitRecordsDetailService splitRecordsDetailService; @Resource private ISplitService splitService; @ApiOperation(value = "第三方支付信息") @RequestMapping(value = "/returnPay", method = RequestMethod.POST) @ResponseBody public VaultsResponse returnPay(@RequestBody PayBefor payBefor){ PaymentRecords pr = new PaymentRecords(); pr.setPayId(CgpTool.generateKey()); pr.setPaySn(payBefor.getPaySn()); pr.setTxAmt(payBefor.getPrice()); pr.setOpenid(payBefor.getOpenid()); pr.setAppId(payBefor.getAppId()); pr.setOperatorId(payBefor.getOperatorId()); pr.setPlanSplitDate(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd")); paymentRecordsService.save(pr); return paymentService.unifiedOrder(pr); } @ApiOperation(value = "退款信息") @RequestMapping(value = "/barcodeReverse", method = RequestMethod.POST) @ResponseBody public VaultsResponse barcodeReverse(@RequestBody RefundReceive refundReceive){ return paymentService.barcodeReverse(refundReceive); } @ApiOperation(value = "退款信息查询") @RequestMapping(value = "/refundQuery", method = RequestMethod.POST) @ResponseBody public VaultsResponse> refundQuery(@RequestBody List list){ List returnList = Lists.newArrayList(); for (RefundQuery refundQuery : list) { VaultsResponse vaultsResponse = paymentService.barcodeRefundQuery(refundQuery.getTransactionId(),refundQuery.getOperatorId().toString()); if(vaultsResponse.validate()){ if(YmUtil.SUCCESS.equals(vaultsResponse.getData().toString())){ returnList.add(refundQuery.getSn()); } } } return VaultsResponse.success(returnList); } @ApiOperation(value = "分账信息") @RequestMapping(value = "/splitOrder", method = RequestMethod.POST) @ResponseBody public VaultsResponse> splitOrder(@RequestBody List list) { /** * 分成顺序:平台自留->供应价/结算价->区域运营商分成->团长分成->站长分成->平台运营商 * 手续费:0.3%(由第三方提供) * 分账金额=(总价-手续费) * 分账 = 分账金额*99%;平台自留: 分账金额*1% * 可分账 = 分账-供应价(结算价) * 区域运营商分账 = 可分账 * 分账比例 * 剩余分账 = 可分账 - 区域运营商分账 * 团长分账 = 剩余分账 * 分账比例 * 站长分账 = 剩余分账 * 分账比例 * 平台运营商分账 = 可分账 - 区域运营商分账 -团长分账 -站长分账 */ log.info(JSON.toJSONString(list)); BigDecimal proportion = new BigDecimal(0.01); List returnList = Lists.newArrayList(); for (SplitInfo splitInfo : list) { //List splitRecordsList = Lists.newArrayList(); PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId()); if(pr == null){ continue; } List details = Lists.newArrayList(); SplitRecords records = new SplitRecords(); records.setOperatorId(splitInfo.getOperatorId()); records.setSplitId(CgpTool.generateKey()); records.setPayId(splitInfo.getPayId()); records.setPaySn(splitInfo.getPaySn()); records.setSumPrice(splitInfo.getSumPrice()); //手续费 BigDecimal chargeAmount = new BigDecimal(pr.getChargeAmount()); BigDecimal ptAmount = BigDecimal.ZERO; BigDecimal tzAmount = BigDecimal.ZERO; BigDecimal stationAmount = BigDecimal.ZERO; BigDecimal ptyysAmount = BigDecimal.ZERO; BigDecimal supplierOneAmount = BigDecimal.ZERO; BigDecimal supplierTwoAmount = BigDecimal.ZERO; BigDecimal supplierAmount = BigDecimal.ZERO; /** * 0.平台自留金额 */ //平台自留 SplitRecordsDetail pt = new SplitRecordsDetail(); pt.setSplitId(records.getSplitId()); pt.setSourceId(0); for (SplitDetail detail : splitInfo.getDetails()) { SplitPay sp = new SplitPay(); sp.setOrderId(detail.getOrderId()); sp.setSplitId(records.getSplitId()); //总分账金额 支付价-手续费 BigDecimal sumPrice = new BigDecimal(detail.getPrice()).subtract(chargeAmount); //平台自留=总分账金额*1% BigDecimal ptDecimal = sumPrice.multiply(proportion).setScale(0, RoundingMode.HALF_UP); //可分金额=总分账金额-平台自留 BigDecimal price = sumPrice.subtract(ptDecimal); detail.setPrice(price.longValue()); //平台自留金额 ptAmount = ptAmount.add(ptDecimal); returnList.add(sp); /** * 2.供应价/结算价 的分账(包含区域运营商/一级供应商/二级供应商/服务站) */ //一级供应商 if(StringUtils.isNotEmpty(detail.getSupplierOneMerchantId()) && detail.getBelong().equals(1)){ SplitRecordsDetail supplierOne = new SplitRecordsDetail(); supplierOne.setSplitId(records.getSplitId()); supplierOne.setSourceId(3); supplierOne.setMerchantId(detail.getSupplierOneMerchantId()); for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getSupplierOneMerchantId())){ supplierOne = splitRecordsDetail; break; } } detail.setPrice(detail.getPrice()-detail.getConsignmentPrice()); supplierOneAmount = supplierOneAmount.add(new BigDecimal(detail.getConsignmentPrice())); if (supplierOneAmount.compareTo(BigDecimal.ZERO) == 1) { supplierOne.setDivAmt(supplierOneAmount.toString()); details.add(supplierOne); } }else if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getBelong().equals(2)){ //二级供应商 SplitRecordsDetail supplierTwo = new SplitRecordsDetail(); supplierTwo.setSplitId(records.getSplitId()); supplierTwo.setSourceId(4); supplierTwo.setMerchantId(detail.getServiceStationMerchantId()); boolean is_have = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getServiceStationMerchantId())){ supplierTwo = splitRecordsDetail; is_have = true; break; } } detail.setPrice(detail.getPrice() - detail.getConsignmentPrice()); supplierTwoAmount = supplierTwoAmount.add(new BigDecimal(detail.getConsignmentPrice())); if (supplierTwoAmount.compareTo(BigDecimal.ZERO) == 1) { supplierTwo.setDivAmt(supplierTwoAmount.toString()); if(!is_have){ details.add(supplierTwo); } } }else if(detail.getBelong().equals(0)){ //服务站 if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getOrderType().equals(2)){ SplitRecordsDetail serviceStation = new SplitRecordsDetail(); serviceStation.setSplitId(records.getSplitId()); serviceStation.setSourceId(5); serviceStation.setMerchantId(detail.getServiceStationMerchantId()); boolean is_have = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getServiceStationMerchantId())){ serviceStation = splitRecordsDetail; is_have=true; break; } } stationAmount = stationAmount.add(new BigDecimal(detail.getSettlementPrice())); detail.setPrice(detail.getPrice() - detail.getSettlementPrice()); if (stationAmount.compareTo(BigDecimal.ZERO) == 1) { serviceStation.setDivAmt(stationAmount.toString()); if(!is_have){ details.add(serviceStation); } } }else if(StringUtils.isNotEmpty(detail.getSupplierMerchantId()) && detail.getOrderType().equals(1)){ //供应商 boolean is_have = false; SplitRecordsDetail supplier = new SplitRecordsDetail(); supplier.setSplitId(records.getSplitId()); supplier.setSourceId(2); supplier.setMerchantId(detail.getSupplierMerchantId()); for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getSupplierMerchantId())){ supplier = splitRecordsDetail; is_have =true; break; } } supplierAmount = supplierAmount.add(new BigDecimal(detail.getSettlementPrice())); detail.setPrice(detail.getPrice()-detail.getSettlementPrice()); if (supplierAmount.compareTo(BigDecimal.ZERO) == 1) { supplier.setDivAmt(supplierAmount.toString()); if(!is_have){ details.add(supplier); } } } } /** * 3.分成 */ //区域运营商 log.info("detail.getSupplierMoney()==="+detail.getSupplierMoney()); if(detail.getSupplierMoney()!= null && detail.getSupplierMoney()>0L){ SplitRecordsDetail supplier = new SplitRecordsDetail(); supplier.setSplitId(records.getSplitId()); supplier.setSourceId(2); supplier.setMerchantId(detail.getSupplierMerchantId()); boolean is_have = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getSupplierMerchantId())){ supplier = splitRecordsDetail; is_have =true; break; } } supplierAmount = supplierAmount.add(new BigDecimal(detail.getSupplierMoney())); detail.setPrice(detail.getPrice()-detail.getSupplierMoney()); if (supplierAmount.compareTo(BigDecimal.ZERO) == 1) { supplier.setDivAmt(supplierAmount.toString()); if(!is_have){ details.add(supplier); } } } //团长 if(detail.getGroupCommissionMoney() != null && detail.getGroupCommissionMoney()>0L &&StringUtils.isNotBlank(detail.getGroupLeaderMerchantId())){ SplitRecordsDetail tz = new SplitRecordsDetail(); tz.setSplitId(records.getSplitId()); tz.setSourceId(6); tz.setMerchantId(detail.getGroupLeaderMerchantId()); boolean is_have = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getGroupLeaderMerchantId())){ tz = splitRecordsDetail; is_have =true; break; } } tzAmount = tzAmount.add(new BigDecimal(detail.getGroupCommissionMoney())); detail.setPrice(detail.getPrice()-detail.getGroupCommissionMoney()); if (tzAmount.compareTo(BigDecimal.ZERO) == 1) { tz.setDivAmt(tzAmount.toString()); if(!is_have){ details.add(tz); } } } //站长 if(detail.getStationmasterCommissionMoney() != null && detail.getStationmasterCommissionMoney()>0L&&StringUtils.isNotBlank(detail.getStationmasterMerchantId())){ SplitRecordsDetail station = new SplitRecordsDetail(); station.setSplitId(records.getSplitId()); station.setSourceId(5); station.setMerchantId(detail.getStationmasterMerchantId()); Boolean is_have = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getMerchantId().equals(detail.getStationmasterMerchantId())){ station = splitRecordsDetail; is_have =true; break; } } stationAmount = stationAmount.add(new BigDecimal(detail.getStationmasterCommissionMoney())); detail.setPrice(detail.getPrice()-detail.getStationmasterCommissionMoney()); if (stationAmount.compareTo(BigDecimal.ZERO) == 1) { station.setDivAmt(stationAmount.toString()); if(!is_have){ details.add(station); } } } if(detail.getPrice()>0L){ ptyysAmount = ptyysAmount.add(new BigDecimal(detail.getPrice())); } } pt.setDivAmt(String.valueOf(ptAmount.longValue())); details.add(pt); //平台运营商 SplitRecordsDetail ptyys = new SplitRecordsDetail(); ptyys.setSplitId(records.getSplitId()); ptyys.setSourceId(1); ptyys.setMerchantId(splitInfo.getOperatorMerchantId()); ptyys.setDivAmt(ptyysAmount.toString()); details.add(ptyys); /*VaultsResponse vaultsResponse = splitService.delayConfirm(records,details); if(!vaultsResponse.validate()){ records.setComment(vaultsResponse.getMessage()); }*/ records.setStatus(2); splitRecordsService.save(records); splitRecordsDetailService.saveBatch(details); } return VaultsResponse.success(returnList); } @ApiOperation(value = "延时交易确认查询") @RequestMapping(value = "/delayConfirmQuery", method = RequestMethod.POST) @ResponseBody public VaultsResponse> delayConfirmQuery(@RequestBody List list){ for (DelayConfirmQuery dcfq : list) { VaultsResponse vaultsResponse = splitService.delayConfirmQuery(dcfq.getSplitId().toString(),dcfq.getOperatorId().toString()); if(vaultsResponse.validate()){ dcfq.setStatus(1); } SplitRecords splitRecords = new SplitRecords(); splitRecords.setStatus(1); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("split_id",dcfq.getSplitId()); splitRecordsService.update(splitRecords,queryWrapper); } return VaultsResponse.success(list); } }