package com.poteviohealth.ym.ipos.controller.feign; 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.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.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.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%(由第三方提供) * 分账总金额 = 支付金额-手续费 * 平台自留金额 = 分账总金额 * 平台自留分成比例 * 可分账金额 = 分账总金额 - 平台自留金额 * 应分账金额 = 可分账金额 - 供应商成本价 * 平台运营商分成金额 = 应分账金额 * 平台运营商分成比例 * 区域运营商分成金额 = 应分账金额 * 区域运营商分成比例 * 剩余分成金额 = 应分账金额 - 平台运营商分成金额 - 区域运营商分成金额 * 团长分成金额 = 剩余分成金额 * 团长分成比例 * 站长分成金额 = 剩余分成金额 * 站长分成比例 * 剩余未分账部分则归属到平台自留金额中 */ List returnList = Lists.newArrayList(); for (SplitInfo splitInfo : list) { PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId()); if(pr == null){ continue; } Long id = CgpTool.generateKey(); List details = Lists.newArrayList(); SplitRecords records = new SplitRecords(); records.setOperatorId(splitInfo.getOperatorId()); records.setSplitId(id); records.setPayId(splitInfo.getPayId()); records.setPaySn(splitInfo.getPaySn()); records.setSumPrice(splitInfo.getSumPrice()); //平台自留金额 SplitRecordsDetail pt = new SplitRecordsDetail(); pt.setSplitId(id); pt.setSourceId(0); pt.setDivAmt(String.valueOf(splitInfo.getSelfCommissionMoney())); details.add(pt); //平台运营商 if(splitInfo.getIsSplitOperator() && splitInfo.getOperatorCommissionMoney() >0L){ SplitRecordsDetail ptyys = new SplitRecordsDetail(); ptyys.setSplitId(id); ptyys.setSourceId(1); ptyys.setMerchantId(splitInfo.getOperatorMerchantId()); ptyys.setDivAmt(splitInfo.getOperatorCommissionMoney().toString()); details.add(ptyys); } SplitDetail detail = splitInfo.getDetails().get(0); //区域运营商 if(detail.getIsSplitSupplier() && detail.getSupplierMoney() >0L){ SplitRecordsDetail supplier = new SplitRecordsDetail(); supplier.setSplitId(id); supplier.setSourceId(2); supplier.setMerchantId(detail.getSupplierMerchantId()); supplier.setDivAmt(detail.getSupplierMoney().toString()); details.add(supplier); } //供应商 if(detail.getBelong().equals(1)){ //一级供应商 if(detail.getIsSplitSupplierOne() && detail.getConsignmentPrice() >0L){ SplitRecordsDetail supplierOne = new SplitRecordsDetail(); supplierOne.setSplitId(id); supplierOne.setSourceId(3); supplierOne.setMerchantId(detail.getSupplierOneMerchantId()); supplierOne.setDivAmt(detail.getConsignmentPrice().toString()); details.add(supplierOne); } }else if(detail.getBelong().equals(2)){ //二级供应商 if(detail.getIsSplitServiceStation() && detail.getConsignmentPrice() >0L){ SplitRecordsDetail supplierTwo = new SplitRecordsDetail(); supplierTwo.setSplitId(id); supplierTwo.setSourceId(4); supplierTwo.setMerchantId(detail.getServiceStationMerchantId()); supplierTwo.setDivAmt(detail.getConsignmentPrice().toString()); details.add(supplierTwo); } }else{ //服务商 if(detail.getOrderType().equals(2) && !detail.getServiceStationId().equals(detail.getStationId())){ if(detail.getIsSplitServiceStation() && detail.getSettlementPrice() >0L){ SplitRecordsDetail serviceStation = new SplitRecordsDetail(); serviceStation.setSplitId(id); serviceStation.setSourceId(5); serviceStation.setMerchantId(detail.getServiceStationMerchantId()); serviceStation.setDivAmt(detail.getSettlementPrice().toString()); details.add(serviceStation); } }else{ //供应商 SplitRecordsDetail supplier = new SplitRecordsDetail(); supplier.setSplitId(id); supplier.setSourceId(2); supplier.setMerchantId(detail.getSupplierMerchantId()); supplier.setDivAmt(detail.getSettlementPrice().toString()); Boolean isHave = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getSourceId().equals(2) && supplier.getMerchantId().equals(splitRecordsDetail.getMerchantId())){ Long val = Long.parseLong(splitRecordsDetail.getDivAmt())+detail.getSettlementPrice(); splitRecordsDetail.setDivAmt(val.toString()); isHave = true; break; } } if(!isHave && detail.getSettlementPrice() >0L){ details.add(supplier); } } } //团长 if(detail.getIsSplitGroupLeader() && detail.getGroupCommissionMoney() >0L){ SplitRecordsDetail tz = new SplitRecordsDetail(); tz.setSplitId(id); tz.setSourceId(6); tz.setMerchantId(detail.getGroupLeaderMerchantId()); tz.setDivAmt(detail.getGroupCommissionMoney().toString()); details.add(tz); } //站长 if(detail.getIsSplitStation() && detail.getStationmasterCommissionMoney()>0L){ SplitRecordsDetail station = new SplitRecordsDetail(); station.setSplitId(id); station.setSourceId(5); station.setMerchantId(detail.getStationmasterMerchantId()); station.setDivAmt(detail.getStationmasterCommissionMoney().toString()); Boolean isHave = false; for (SplitRecordsDetail splitRecordsDetail : details) { if(splitRecordsDetail.getSourceId().equals(5) && station.getMerchantId().equals(splitRecordsDetail.getMerchantId())){ Long val = Long.parseLong(splitRecordsDetail.getDivAmt())+detail.getStationmasterCommissionMoney(); splitRecordsDetail.setDivAmt(val.toString()); isHave = true; break; } } if(!isHave){ details.add(station); } } VaultsResponse vaultsResponse = splitService.delayConfirm(records,details); if(!vaultsResponse.validate()){ records.setComment(vaultsResponse.getMessage()); records.setStatus(3); }else{ records.setStatus(2); //回写 SplitPay sp = new SplitPay(); sp.setOrderId(detail.getOrderId()); sp.setSplitId(id); returnList.add(sp); } 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); } }