| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- 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<PayInfoAppOutDTO> 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<List<String>> refundQuery(@RequestBody List<RefundQuery> list){
- List<String> 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<List<SplitPay>> splitOrder(@RequestBody List<SplitInfo> list) {
- /**
- * 分成顺序:平台自留->供应价/结算价->区域运营商分成->团长分成->站长分成->平台运营商
- * 手续费:0.3%(由第三方提供)
- * 分账金额=(总价-手续费)
- * 分账 = 分账金额*99%;平台自留: 分账金额*1%
- * 可分账 = 分账-供应价(结算价)
- * 区域运营商分账 = 可分账 * 分账比例
- * 剩余分账 = 可分账 - 区域运营商分账
- * 团长分账 = 剩余分账 * 分账比例
- * 站长分账 = 剩余分账 * 分账比例
- * 平台运营商分账 = 可分账 - 区域运营商分账 -团长分账 -站长分账
- */
- log.info(JSON.toJSONString(list));
- BigDecimal proportion = new BigDecimal(0.01);
- List<SplitPay> returnList = Lists.newArrayList();
- for (SplitInfo splitInfo : list) {
- //List<SplitRecords> splitRecordsList = Lists.newArrayList();
- PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId());
- if(pr == null){
- continue;
- }
- List<SplitRecordsDetail> 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<List<DelayConfirmQuery>> delayConfirmQuery(@RequestBody List<DelayConfirmQuery> 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<SplitRecords> queryWrapper = new QueryWrapper<>();
- queryWrapper.eq("split_id",dcfq.getSplitId());
- splitRecordsService.update(splitRecords,queryWrapper);
- }
- return VaultsResponse.success(list);
- }
- }
|