zhibing.pu
2024-08-10 b0923c5e054f33283e0cea737e871e55caa6f7ef
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementRecordServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.SettlementRecordMapper;
@@ -25,6 +26,7 @@
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author zhibing.pu
@@ -64,11 +66,26 @@
    @Override
    public QuerySettlementAmount querySettlementAmount(Integer language, Integer driverId) {
        QuerySettlementAmount querySettlementAmount = new QuerySettlementAmount();
        SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
        if(null != settlementRecord){
            querySettlementAmount.setType(settlementRecord.getType());
            querySettlementAmount.setAmount(settlementRecord.getPayMoney());
            List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("settlementRecordId", settlementRecord.getId()).orderBy("createTime desc"));
        SettlementAllocation settlementAllocation = settlementAllocationService.selectOne(null);
        if(null != settlementAllocation) {
            JSONObject jsonObject = JSON.parseObject(settlementAllocation.getContent());
            Double maxPrice = jsonObject.getDouble("maxPrice");
            Integer type = jsonObject.getInteger("type");
            querySettlementAmount.setType(null != maxPrice ? 1 : type);
            List<SettlementRecord> settlementRecords = this.selectList(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
            double sum = settlementRecords.stream().mapToDouble(SettlementRecord::getPayMoney).sum();
            List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driverId).isNull("settlementRecordId"));
            double sum1 = settlementDetailList.stream().mapToDouble(SettlementDetail::getPrice).sum();
            querySettlementAmount.setAmount(new BigDecimal(sum).add(new BigDecimal(sum1)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            List<Integer> collect = settlementRecords.stream().map(SettlementRecord::getId).collect(Collectors.toList());
            Wrapper<SettlementDetail> wrapper = new EntityWrapper<SettlementDetail>();
            if(collect.size() > 0){
                wrapper.in("settlementRecordId", collect).or().isNull("settlementRecordId");
            }else{
                wrapper.isNull("settlementRecordId");
            }
            settlementDetailList = settlementDetailService.selectList(wrapper.orderBy("createTime desc"));
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            List<QuerySettlementAmountDetails> list = new ArrayList<>();
            settlementDetailList.forEach(s -> {
@@ -97,15 +114,46 @@
    @Override
    public ResultUtil paymentSettlementAmount(Integer driverId, Integer payType, Integer bankCardId, Integer language) throws Exception {
        Driver driver1 = driverService.selectById(driverId);
        SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
        if(null == settlementRecord){
        QuerySettlementAmount querySettlementAmount = querySettlementAmount(language, driverId);
        if(querySettlementAmount.getAmount() == 0){
            return ResultUtil.error(language == 1 ? "暂无需支付" : language == 2 ? "No payment is required" : "Aucun paiement n’est requis");
        }
        Double payMoney = settlementRecord.getPayMoney();
        Double payMoney = 0D;
        //主动生成结算主数据
        SettlementAllocation settlementAllocation = settlementAllocationService.selectOne(null);
        if(null == settlementAllocation){
            JSONObject jsonObject = JSON.parseObject(settlementAllocation.getContent());
            Double maxPrice = jsonObject.getDouble("maxPrice");
            Integer type = jsonObject.getInteger("type");
            List<SettlementDetail> settlementDetails = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driverId).isNull("settlementRecordId"));
            double sum = settlementDetails.stream().mapToDouble(SettlementDetail::getPrice).sum();
            if(sum > 0){
                SettlementRecord settlementRecord = new SettlementRecord();
                settlementRecord.setDay(new Date());
                settlementRecord.setDriverId(driverId);
                settlementRecord.setType(null != maxPrice ? 1 : type);
                settlementRecord.setPaymentStatus(1);
                settlementRecord.setPayMoney(new BigDecimal(sum).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
                settlementRecord.setInsertTime(new Date());
                this.insert(settlementRecord);
                settlementDetails.forEach(s -> {
                    s.setSettlementRecordId(settlementRecord.getId());
                });
                settlementDetailService.updateBatchById(settlementDetails);
            }
        }
        List<SettlementRecord> settlementRecords = this.selectList(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
        payMoney = settlementRecords.stream().mapToDouble(SettlementRecord::getPayMoney).sum();
        if(payMoney == 0){
            return ResultUtil.error(language == 1 ? "暂无需支付" : language == 2 ? "No payment is required" : "Aucun paiement n’est requis");
        }
        ResultUtil resultUtil = ResultUtil.success("");
        if(payType == 1){//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + language + payType + settlementRecord.getId();
            String merchantTransactionId = sdf.format(new Date()) + language + payType + driver1;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(driver1.getPhone()));
            checkoutRequest.setCustomerEmail(driver1.getEmail());
@@ -115,7 +163,7 @@
            checkoutRequest.setRequestAmount(payMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Settlement cost");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/querySettlementAmount");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/paymentSettlementAmountCallback");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
@@ -129,7 +177,7 @@
        if(payType == 2){//银行卡支付
            BankCard bankCard = bankCardService.selectById(bankCardId);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + language + payType + settlementRecord.getId();
            String merchantTransactionId = sdf.format(new Date()) + language + payType + driver1;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
            checkoutRequest.setCustomerEmail(driver1.getEmail());
@@ -139,7 +187,7 @@
            checkoutRequest.setRequestAmount(payMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Settlement cost");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/querySettlementAmount");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/paymentSettlementAmountCallback");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
@@ -160,49 +208,72 @@
            //活动余额小于结算金额
            if(null != laveActivityMoney && 0 < laveActivityMoney && laveActivityMoney.compareTo(payMoney) < 0){
                driver1.setLaveActivityMoney(0D);
                BigDecimal m = new BigDecimal(payMoney).subtract(new BigDecimal(laveActivityMoney)).setScale(2, RoundingMode.HALF_EVEN);
                driver1.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(m).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                settlementRecord.setPayMoney(laveActivityMoney);
                settlementRecord.setPaymentStatus(2);
                settlementRecord.setPayType(payType);
                settlementRecord.setBalanceType(1);
                settlementRecord.setPayTime(new Date());
                this.updateById(settlementRecord);
                balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, laveActivityMoney, settlementRecord.getType() + 2);
                balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 2, m.doubleValue(), settlementRecord.getType() + 2);
                SettlementRecord settlementRecord1 = new SettlementRecord();
                BeanUtils.copyProperties(settlementRecord, settlementRecord1);
                settlementRecord1.setId(null);
                settlementRecord1.setPayMoney(m.doubleValue());
                settlementRecord1.setBalanceType(2);
                this.insert(settlementRecord1);
                for (SettlementRecord settlementRecord : settlementRecords) {
                    Double payMoney1 = settlementRecord.getPayMoney();
                    if(laveActivityMoney >= payMoney1){
                        settlementRecord.setPayMoney(payMoney1);
                        settlementRecord.setPaymentStatus(2);
                        settlementRecord.setPayType(payType);
                        settlementRecord.setBalanceType(1);
                        settlementRecord.setPayTime(new Date());
                        this.updateById(settlementRecord);
                        balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, payMoney1, settlementRecord.getType() + 2);
                        laveActivityMoney = new BigDecimal(laveActivityMoney).subtract(new BigDecimal(payMoney1)).doubleValue();
                    }else{
                        Double m = payMoney1;
                        if(laveActivityMoney > 0){
                            settlementRecord.setPayMoney(laveActivityMoney);
                            settlementRecord.setPaymentStatus(2);
                            settlementRecord.setPayType(payType);
                            settlementRecord.setBalanceType(1);
                            settlementRecord.setPayTime(new Date());
                            this.updateById(settlementRecord);
                            balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, laveActivityMoney, settlementRecord.getType() + 2);
                            laveActivityMoney = 0D;
                            m = new BigDecimal(payMoney1).subtract(new BigDecimal(laveActivityMoney)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                        }
                        SettlementRecord settlementRecord1 = new SettlementRecord();
                        BeanUtils.copyProperties(settlementRecord, settlementRecord1);
                        settlementRecord1.setId(null);
                        settlementRecord1.setPayMoney(m.doubleValue());
                        settlementRecord1.setBalanceType(2);
                        this.insert(settlementRecord1);
                        balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 2, m.doubleValue(), settlementRecord.getType() + 2);
                        laveBusinessMoney = new BigDecimal(laveBusinessMoney).subtract(new BigDecimal(m)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                    }
                }
                driver1.setLaveBusinessMoney(laveBusinessMoney);
            }
            //活动余额大于结算金额
            if(null != laveActivityMoney && 0 < laveActivityMoney && laveActivityMoney.compareTo(payMoney) >= 0){
                driver1.setLaveActivityMoney(new BigDecimal(laveActivityMoney).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                settlementRecord.setPaymentStatus(2);
                settlementRecord.setPayType(payType);
                settlementRecord.setBalanceType(1);
                settlementRecord.setPayTime(new Date());
                this.updateById(settlementRecord);
                balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, payMoney, settlementRecord.getType() + 2);
                for (SettlementRecord settlementRecord : settlementRecords) {
                    settlementRecord.setPaymentStatus(2);
                    settlementRecord.setPayType(payType);
                    settlementRecord.setBalanceType(1);
                    settlementRecord.setPayTime(new Date());
                    this.updateById(settlementRecord);
                    balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, payMoney, settlementRecord.getType() + 2);
                }
            }
            if(null == laveActivityMoney || 0 == laveActivityMoney){
                driver1.setLaveActivityMoney(0D);
                driver1.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                settlementRecord.setPaymentStatus(2);
                settlementRecord.setPayType(payType);
                settlementRecord.setBalanceType(2);
                settlementRecord.setPayTime(new Date());
                this.updateById(settlementRecord);
                balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 2, payMoney, settlementRecord.getType() + 2);
                for (SettlementRecord settlementRecord : settlementRecords) {
                    settlementRecord.setPaymentStatus(2);
                    settlementRecord.setPayType(payType);
                    settlementRecord.setBalanceType(1);
                    settlementRecord.setPayTime(new Date());
                    this.updateById(settlementRecord);
                    balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 2, payMoney, settlementRecord.getType() + 2);
                }
            }
            
            driver1.setBalance(new BigDecimal(driver1.getBalance()).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            //添加交易明细
            transactionDetailsService.saveData(driverId, "线下结算", payMoney, 2, 1, 2, null, null);
            transactionDetailsService.saveData(driverId, "支付结算费用", payMoney, 2, 1, 2, null, null);
            driverService.updateById(driver1);
            return ResultUtil.success("");
        }