puzhibing
2023-06-24 36695821ea10197d7758babc7bc2b5dfb66dd88e
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/CashWithdrawalServiceImpl.java
@@ -61,10 +61,10 @@
    @Override
    public ResultUtil withdrawCash(Integer driverId, Integer type, Integer bankId, Double money) throws Exception {
        Driver driver = driverService.selectById(driverId);
        if(type == 1 && null == driver.getBalance() || driver.getBalance() < money){
        if(type == 1 && (null == driver.getBalance() || driver.getBalance().compareTo(money) < 0)){
            return ResultUtil.error("余额不足");
        }
        if(type == 2 && null == driver.getCommission() || driver.getCommission() < money){
        if(type == 2 && (null == driver.getCommission() || driver.getCommission().compareTo(money) < 0)){
            return ResultUtil.error("收入余额不足");
        }
        if(ToolUtil.isEmpty(driver.getMerchantNumber())){
@@ -104,7 +104,30 @@
        if(type == 1){//余额提现,调用分账接口 -->确认收货--->提现
            fenzhang(driver, money, cashWithdrawal, 1);
            List<RechargeRecord> rechargeRecords = rechargeRecordService.selectList(new EntityWrapper<RechargeRecord>().eq("type", 2)
                    .eq("userId", driver.getId()).eq("payType", 1).eq("payStatus", 2).gt("surplusDividedAmount", 0));
            for (RechargeRecord rechargeRecord : rechargeRecords) {
                Double surplusDividedAmount = rechargeRecord.getSurplusDividedAmount();
                if(surplusDividedAmount.compareTo(money) >= 0){//够分账
                    ResultUtil fenzhang = fenzhang(driver, rechargeRecord, cashWithdrawal, 3, money);
                    if(fenzhang.getCode() == 10000){
                        rechargeRecord.setSurplusDividedAmount(rechargeRecord.getSurplusDividedAmount() - money);
                        rechargeRecordService.updateById(rechargeRecord);
                        break;
                    }else{
                        return fenzhang;
                    }
                }else{
                    ResultUtil fenzhang = fenzhang(driver, rechargeRecord, cashWithdrawal, 3, surplusDividedAmount);
                    if(fenzhang.getCode() == 10000){
                        rechargeRecord.setSurplusDividedAmount(0D);
                        rechargeRecordService.updateById(rechargeRecord);
                        money -= surplusDividedAmount;
                    }else{
                        return fenzhang;
                    }
                }
            }
        }else{//佣金提现,直接提现到银行卡
            Withdraw withdraw = new Withdraw();
            withdraw.setUserId(driver.getMerchantNumber());
@@ -164,11 +187,14 @@
                divisionRecord.setUserId(driver.getId());
                divisionRecord.setOrderId(rechargeRecord.getId().longValue());
                divisionRecord.setSourceType(payType == 1 ? 3 : 2);
                divisionRecord.setAmount(surplusDividedAmount);
                divisionRecord.setAmount(amount);
                divisionRecord.setMerchantNumber(driver.getMerchantNumber());
                divisionRecord.setState(1);
                divisionRecord.setCreateTime(new Date());
                divisionRecordService.insert(divisionRecord);
                rechargeRecord.setSurplusDividedAmount(rechargeRecord.getSurplusDividedAmount() - amount);
                rechargeRecordService.updateById(rechargeRecord);
                Complete complete = new Complete();
                complete.setOriginalMerOrderId(rechargeRecord.getOrderNumber());
@@ -208,9 +234,9 @@
                        }, 15000);
                    }
                }else{
                    System.err.println("司机提现分账异常:" + execute.getMsg());
                    System.err.println("司机提现分账处理异常 :" + execute.getMsg());
                    return ResultUtil.error("司机提现分账处理异常 :" + execute.getMsg());
                }
                break;
            }else{//不够分账
                DivisionRecord divisionRecord = new DivisionRecord();
                divisionRecord.setUserType(1);
@@ -222,6 +248,9 @@
                divisionRecord.setState(1);
                divisionRecord.setCreateTime(new Date());
                divisionRecordService.insert(divisionRecord);
                rechargeRecord.setSurplusDividedAmount(0D);
                rechargeRecordService.updateById(rechargeRecord);
                Complete complete = new Complete();
                complete.setOriginalMerOrderId(rechargeRecord.getOrderNumber());
@@ -260,8 +289,8 @@
                        }, 15000);
                    }
                }else{
                    System.err.println("司机提现分账异常:" + execute.getMsg());
                    break;
                    System.err.println("司机提现分账处理异常 :" + execute.getMsg());
                    return ResultUtil.error("司机提现分账处理异常 :" + execute.getMsg());
                }
                amount -= surplusDividedAmount;
            }
@@ -270,6 +299,65 @@
    }
    public ResultUtil fenzhang(Driver driver, RechargeRecord rechargeRecord, CashWithdrawal cashWithdrawal, Integer sourceType, Double amount){
        DivisionRecord divisionRecord = new DivisionRecord();
        divisionRecord.setUserType(1);
        divisionRecord.setUserId(driver.getId());
        divisionRecord.setOrderId(rechargeRecord.getId().longValue());
        divisionRecord.setSourceType(sourceType);
        divisionRecord.setAmount(amount);
        divisionRecord.setMerchantNumber(driver.getMerchantNumber());
        divisionRecord.setState(1);
        divisionRecord.setCreateTime(new Date());
        divisionRecordService.insert(divisionRecord);
        Complete complete = new Complete();
        complete.setOriginalMerOrderId(rechargeRecord.getOrderNumber());
        complete.setNotifyUrl(callbackPath + "/base/driver/withdrawCashFZCallback");
        complete.setParameter1(divisionRecord.getId().toString());
        //分账方列表
        List<PamentOrderUser> splitList = new ArrayList<>();
        PamentOrderUser pamentOrderUser = new PamentOrderUser();
        pamentOrderUser.setSplitUserId(driver.getMerchantNumber());
        pamentOrderUser.setSplitAmount(String.valueOf(Double.valueOf(amount * 100).intValue()));
        pamentOrderUser.setSplitType("1");
        splitList.add(pamentOrderUser);
        complete.setSplitList(splitList);
        TrhRequest<Complete> request = new TrhRequest();
        InterfaceResponse execute = request.execute(complete, Complete.SERVICE_CODE);//分账操作
        if("0000".equals(execute.getCode())){
            JSONObject jsonObject = JSON.parseObject(execute.getResult());
            Integer status = jsonObject.getInteger("status");//0:待处理 1:成功 2:失败
            String merOrderId = jsonObject.getString("merOrderId");
            if(2 == status){
                System.err.println("司机提现分账失败:" + execute.getMsg());
                return ResultUtil.error("司机提现分账失败 :" + execute.getMsg());
            }
            if(1 == status){
                divisionRecord.setMerOrderId(merOrderId);
                divisionRecord.setPayTime(new Date());
                divisionRecord.setState(2);
                divisionRecordService.updateById(divisionRecord);
                //间隔10秒开始调用确认收货后开始提现
                new Timer().schedule(new TimerTask() {//确认收货和提现
                    @Override
                    public void run() {
                        confirmReceipt(driver, rechargeRecord, divisionRecord, cashWithdrawal);
                    }
                }, 15000);
            }
        }else{
            System.err.println("司机提现分账处理异常 :" + execute.getMsg());
            return ResultUtil.error("司机提现分账处理异常 :" + execute.getMsg());
        }
        return ResultUtil.success();
    }
    /**
     * 分账后的确认收货和提现操作
     * @param driver