From d0c88e9f82a73e225ec04f3f8b533cf1d97028bc Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 17 八月 2023 11:49:21 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/SuperSaveDriving
---
driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/CashWithdrawalServiceImpl.java | 242 ++++++++++++++++++++++++++++++++++-------------
1 files changed, 173 insertions(+), 69 deletions(-)
diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/CashWithdrawalServiceImpl.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/CashWithdrawalServiceImpl.java
index 5500602..40fcfa2 100644
--- a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/CashWithdrawalServiceImpl.java
+++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/service/impl/CashWithdrawalServiceImpl.java
@@ -17,6 +17,8 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -61,10 +63,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())){
@@ -74,7 +76,7 @@
CashWithdrawal cashWithdrawal = new CashWithdrawal();
cashWithdrawal.setType(2);
cashWithdrawal.setUserDriverId(driverId);
- cashWithdrawal.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
+ cashWithdrawal.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(5));
cashWithdrawal.setBusinessType(type == 2 ? 11 : 12);
cashWithdrawal.setBankId(bankId);
cashWithdrawal.setAmount(money);
@@ -84,19 +86,19 @@
//增加记录
AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
- accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
+ accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(5));
accountChangeDetail.setUserType(2);
accountChangeDetail.setUserId(driver.getId());
accountChangeDetail.setType(1);
accountChangeDetail.setChangeType(type == 1 ? 4 : 6);
if(type == 1){
- accountChangeDetail.setOldData(driver.getBalance() + driver.getBackgroundBalance());
- driver.setBalance(driver.getBalance() - money);
- accountChangeDetail.setNewData(driver.getBalance() + driver.getBackgroundBalance());
+ accountChangeDetail.setOldData(new BigDecimal(driver.getBalance()).add(new BigDecimal(driver.getBackgroundBalance())).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+ driver.setBalance(new BigDecimal(driver.getBalance()).subtract(new BigDecimal(money)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+ accountChangeDetail.setNewData(new BigDecimal(driver.getBalance()).add(new BigDecimal(driver.getBackgroundBalance())).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
}else{
- accountChangeDetail.setOldData(driver.getCommission() + driver.getCouponBalance());
- driver.setCommission(driver.getCommission() - money);
- accountChangeDetail.setNewData(driver.getCouponBalance() + driver.getCommission());
+ accountChangeDetail.setOldData(new BigDecimal(driver.getCouponBalance()).add(new BigDecimal(driver.getCommission())).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+ driver.setCommission(new BigDecimal(driver.getCommission()).subtract(new BigDecimal(money)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
+ accountChangeDetail.setNewData(new BigDecimal(driver.getCouponBalance()).add(new BigDecimal(driver.getCommission())).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
}
accountChangeDetail.setExplain(type == 1 ? "账户余额提现" : "佣金余额提现");
driverService.updateById(driver);
@@ -104,32 +106,61 @@
if(type == 1){//余额提现,调用分账接口 -->确认收货--->提现
- fenzhang(driver, money, cashWithdrawal, 1);
- }else{//佣金提现,直接提现到银行卡
- Withdraw withdraw = new Withdraw();
- withdraw.setUserId(driver.getMerchantNumber());
- withdraw.setAmount(String.valueOf(Double.valueOf(money * 100).intValue()));
- withdraw.setOrderName("账户余额提现");
- withdraw.setRemark("账户余额提现");
- withdraw.setNotifyUrl(callbackPath + "/base/driver/withdrawCashCallback");
- withdraw.setParameter1(cashWithdrawal.getId().toString());
- TrhRequest<Withdraw> request1 = new TrhRequest();
- InterfaceResponse execute = request1.execute(withdraw, Withdraw.SERVICE_CODE);//结算(提现)
- if("0000".equals(execute.getCode())){
- JSONObject jsonObject1 = JSON.parseObject(execute.getResult());
- String merOrderId1 = jsonObject1.getString("merOrderId");
- Integer status = jsonObject1.getInteger("status");//0:待处理;1:成功;2:失败
- if(1 == status){
- cashWithdrawal.setOrderNumber(merOrderId1);
- cashWithdrawal.setState(2);
- this.updateById(cashWithdrawal);
+ 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;
+ }
}
- if(2 == status){
- System.err.println("结算接口异常【提现】:" + jsonObject1.getString("statusMsg"));
- }
- }else{
- System.err.println("结算接口异常【提现】:" + execute.getMsg());
}
+ }else{//佣金提现,直接提现到银行卡
+ Double finalMoney = money;
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
+ Withdraw withdraw = new Withdraw();
+ withdraw.setUserId(driver.getMerchantNumber());
+ withdraw.setAmount(new BigDecimal(finalMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
+ withdraw.setOrderName("账户余额提现");
+ withdraw.setRemark("账户余额提现");
+ withdraw.setNotifyUrl(callbackPath + "/base/driver/withdrawCashCallback");
+ withdraw.setParameter1(cashWithdrawal.getId().toString());
+ TrhRequest<Withdraw> request1 = new TrhRequest();
+ InterfaceResponse execute = request1.execute(withdraw, Withdraw.SERVICE_CODE);//结算(提现)
+ if("0000".equals(execute.getCode())){
+ JSONObject jsonObject1 = JSON.parseObject(execute.getResult());
+ String merOrderId1 = jsonObject1.getString("merOrderId");
+ Integer status = jsonObject1.getInteger("status");//0:待处理;1:成功;2:失败
+ if(1 == status){
+ cashWithdrawal.setOrderNumber(merOrderId1);
+ cashWithdrawal.setState(2);
+ CashWithdrawalServiceImpl.this.updateById(cashWithdrawal);
+ }
+ if(2 == status){
+ System.err.println("结算接口异常【提现】:" + jsonObject1.getString("statusMsg"));
+ }
+ }else{
+ System.err.println("结算接口异常【提现】:" + execute.getMsg());
+ }
+ }
+ }, 60000);
}
return ResultUtil.success();
}
@@ -164,11 +195,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());
@@ -179,7 +213,7 @@
List<PamentOrderUser> splitList = new ArrayList<>();
PamentOrderUser pamentOrderUser = new PamentOrderUser();
pamentOrderUser.setSplitUserId(driver.getMerchantNumber());
- pamentOrderUser.setSplitAmount(String.valueOf(Double.valueOf(amount * 100).intValue()));
+ pamentOrderUser.setSplitAmount(new BigDecimal(amount).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
pamentOrderUser.setSplitType("1");
splitList.add(pamentOrderUser);
complete.setSplitList(splitList);
@@ -205,12 +239,12 @@
public void run() {
confirmReceipt(driver, rechargeRecord, divisionRecord, cashWithdrawal);
}
- }, 15000);
+ }, 60000);
}
}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);
@@ -223,6 +257,9 @@
divisionRecord.setCreateTime(new Date());
divisionRecordService.insert(divisionRecord);
+ rechargeRecord.setSurplusDividedAmount(0D);
+ rechargeRecordService.updateById(rechargeRecord);
+
Complete complete = new Complete();
complete.setOriginalMerOrderId(rechargeRecord.getOrderNumber());
complete.setNotifyUrl(callbackPath + "/base/driver/withdrawCashFZCallback");
@@ -231,7 +268,7 @@
List<PamentOrderUser> splitList = new ArrayList<>();
PamentOrderUser pamentOrderUser = new PamentOrderUser();
pamentOrderUser.setSplitUserId(driver.getMerchantNumber());
- pamentOrderUser.setSplitAmount(String.valueOf(Double.valueOf(surplusDividedAmount * 100).intValue()));
+ pamentOrderUser.setSplitAmount(new BigDecimal(surplusDividedAmount).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
pamentOrderUser.setSplitType("1");
splitList.add(pamentOrderUser);
complete.setSplitList(splitList);
@@ -257,17 +294,76 @@
public void run() {
confirmReceipt(driver, rechargeRecord, divisionRecord, cashWithdrawal);
}
- }, 15000);
+ }, 60000);
}
}else{
- System.err.println("司机提现分账异常:" + execute.getMsg());
- break;
+ System.err.println("司机提现分账处理异常 :" + execute.getMsg());
+ return ResultUtil.error("司机提现分账处理异常 :" + execute.getMsg());
}
amount -= surplusDividedAmount;
}
}
return ResultUtil.success();
}
+
+
+
+ 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(new BigDecimal(amount).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
+ 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);
+ }
+ }, 60000);
+ }
+ }else{
+ System.err.println("司机提现分账处理异常 :" + execute.getMsg());
+ return ResultUtil.error("司机提现分账处理异常 :" + execute.getMsg());
+ }
+ return ResultUtil.success();
+ }
+
+
/**
@@ -281,11 +377,11 @@
Receive receive = new Receive();
receive.setOriginalMerOrderId(rechargeRecord.getOrderNumber());
receive.setAsynMerOrderId(divisionRecord.getMerOrderId());
- receive.setRcvAmount(String.valueOf(Double.valueOf(divisionRecord.getAmount() * 100).intValue()));
+ receive.setRcvAmount(new BigDecimal(divisionRecord.getAmount()).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
List<ReceiveUser> splitList = new ArrayList<>();
ReceiveUser receiveUser = new ReceiveUser();
receiveUser.setSplitUserId(driver.getMerchantNumber());
- receiveUser.setRcvSplitAmount(String.valueOf(Double.valueOf(divisionRecord.getAmount() * 100).intValue()));
+ receiveUser.setRcvSplitAmount(new BigDecimal(divisionRecord.getAmount()).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
splitList.add(receiveUser);
receive.setSplitList(splitList);
TrhRequest<Receive> request = new TrhRequest();
@@ -294,30 +390,35 @@
JSONObject jsonObject = JSON.parseObject(execute1.getResult());
String merOrderId = jsonObject.getString("merOrderId");
if(ToolUtil.isNotEmpty(merOrderId)){
- Withdraw withdraw = new Withdraw();
- withdraw.setUserId(driver.getMerchantNumber());
- withdraw.setAmount(String.valueOf(Double.valueOf(divisionRecord.getAmount() * 100).intValue()));
- withdraw.setOrderName("账户余额提现");
- withdraw.setRemark("账户余额提现");
- withdraw.setNotifyUrl(callbackPath + "/base/driver/withdrawCashCallback");
- withdraw.setParameter1(cashWithdrawal.getId().toString());
- TrhRequest<Withdraw> request1 = new TrhRequest();
- InterfaceResponse execute = request1.execute(withdraw, Withdraw.SERVICE_CODE);//结算(提现)
- if("0000".equals(execute.getCode())){
- JSONObject jsonObject1 = JSON.parseObject(execute.getResult());
- String merOrderId1 = jsonObject1.getString("merOrderId");
- Integer status = jsonObject1.getInteger("status");//0:待处理;1:成功;2:失败
- if(1 == status){
- cashWithdrawal.setOrderNumber(merOrderId1);
- cashWithdrawal.setState(2);
- this.updateById(cashWithdrawal);
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
+ Withdraw withdraw = new Withdraw();
+ withdraw.setUserId(driver.getMerchantNumber());
+ withdraw.setAmount(new BigDecimal(divisionRecord.getAmount()).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
+ withdraw.setOrderName("账户余额提现");
+ withdraw.setRemark("账户余额提现");
+ withdraw.setNotifyUrl(callbackPath + "/base/driver/withdrawCashCallback");
+ withdraw.setParameter1(cashWithdrawal.getId().toString());
+ TrhRequest<Withdraw> request1 = new TrhRequest();
+ InterfaceResponse execute = request1.execute(withdraw, Withdraw.SERVICE_CODE);//结算(提现)
+ if("0000".equals(execute.getCode())){
+ JSONObject jsonObject1 = JSON.parseObject(execute.getResult());
+ String merOrderId1 = jsonObject1.getString("merOrderId");
+ Integer status = jsonObject1.getInteger("status");//0:待处理;1:成功;2:失败
+ if(1 == status){
+ cashWithdrawal.setOrderNumber(merOrderId1);
+ cashWithdrawal.setState(2);
+ CashWithdrawalServiceImpl.this.updateById(cashWithdrawal);
+ }
+ if(2 == status){
+ System.err.println("结算接口异常【提现】:" + jsonObject1.getString("statusMsg"));
+ }
+ }else{
+ System.err.println("结算接口异常【提现】:" + execute.getMsg());
+ }
}
- if(2 == status){
- System.err.println("结算接口异常【提现】:" + jsonObject1.getString("statusMsg"));
- }
- }else{
- System.err.println("结算接口异常【提现】:" + execute.getMsg());
- }
+ }, 60000);
}
}else{
System.err.println("分账确认收货异常【提现】:" + execute1.getMsg());
@@ -346,6 +447,9 @@
String parameter1 = jsonObject.getString("parameter1");
String parameter2 = jsonObject.getString("parameter2");
DivisionRecord divisionRecord = divisionRecordService.selectById(parameter1);
+ if(divisionRecord.getState() == 2){
+ return;
+ }
divisionRecord.setMerOrderId(merOrderId);
divisionRecord.setPayTime(new Date());
divisionRecord.setState(2);
@@ -361,7 +465,7 @@
public void run() {
confirmReceipt(driver, rechargeRecord, divisionRecord, cashWithdrawal);
}
- }, 15000);
+ }, 60000);
}
}else{
System.err.println("司机提现分账异常:" + interfaceResponse.getMsg());
--
Gitblit v1.7.1