提交
This commit is contained in:
parent
c1ac775e19
commit
2d4eab011a
|
@ -303,17 +303,6 @@ public interface TransactionBillService
|
||||||
*/
|
*/
|
||||||
TransactionBillVO selectLastOne(TransactionBillQuery query);
|
TransactionBillVO selectLastOne(TransactionBillQuery query);
|
||||||
|
|
||||||
/**
|
|
||||||
* 修复订单数据
|
|
||||||
*/
|
|
||||||
int fix(Long billId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修复所有订单数据
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int fixAll();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 收取商户查看用户手机号的价格
|
* 收取商户查看用户手机号的价格
|
||||||
* @param bill
|
* @param bill
|
||||||
|
|
|
@ -9,7 +9,6 @@ import com.ruoyi.common.domain.vo.LongDecimalVO;
|
||||||
import com.ruoyi.common.enums.ServiceCode;
|
import com.ruoyi.common.enums.ServiceCode;
|
||||||
import com.ruoyi.common.enums.WithdrawServiceType;
|
import com.ruoyi.common.enums.WithdrawServiceType;
|
||||||
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
import com.ruoyi.common.pay.wx.service.WxPayService;
|
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
import com.ruoyi.common.utils.ServiceUtil;
|
import com.ruoyi.common.utils.ServiceUtil;
|
||||||
import com.ruoyi.common.utils.SnowFlakeUtil;
|
import com.ruoyi.common.utils.SnowFlakeUtil;
|
||||||
|
@ -27,7 +26,6 @@ import com.ruoyi.ss.bonus.domain.Bonus;
|
||||||
import com.ruoyi.ss.bonus.domain.BonusVO;
|
import com.ruoyi.ss.bonus.domain.BonusVO;
|
||||||
import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType;
|
import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType;
|
||||||
import com.ruoyi.ss.bonus.domain.enums.BonusStatus;
|
import com.ruoyi.ss.bonus.domain.enums.BonusStatus;
|
||||||
import com.ruoyi.ss.bonus.service.BonusConverter;
|
|
||||||
import com.ruoyi.ss.bonus.service.BonusService;
|
import com.ruoyi.ss.bonus.service.BonusService;
|
||||||
import com.ruoyi.ss.channelWithdraw.domain.ChannelWithdrawVO;
|
import com.ruoyi.ss.channelWithdraw.domain.ChannelWithdrawVO;
|
||||||
import com.ruoyi.ss.channelWithdraw.service.ChannelWithdrawService;
|
import com.ruoyi.ss.channelWithdraw.service.ChannelWithdrawService;
|
||||||
|
@ -45,8 +43,6 @@ import com.ruoyi.ss.receiveBill.domain.ReceiveBill;
|
||||||
import com.ruoyi.ss.receiveBill.domain.enums.ReceiveBillStatus;
|
import com.ruoyi.ss.receiveBill.domain.enums.ReceiveBillStatus;
|
||||||
import com.ruoyi.ss.receiveBill.domain.enums.ReceiveBillType;
|
import com.ruoyi.ss.receiveBill.domain.enums.ReceiveBillType;
|
||||||
import com.ruoyi.ss.receiveBill.service.ReceiveBillService;
|
import com.ruoyi.ss.receiveBill.service.ReceiveBillService;
|
||||||
import com.ruoyi.ss.record.time.service.IRecordTimeService;
|
|
||||||
import com.ruoyi.ss.record.time.service.RecordTimeConverter;
|
|
||||||
import com.ruoyi.ss.recordBalance.domain.enums.RecordBalanceBstType;
|
import com.ruoyi.ss.recordBalance.domain.enums.RecordBalanceBstType;
|
||||||
import com.ruoyi.ss.risk.service.RiskService;
|
import com.ruoyi.ss.risk.service.RiskService;
|
||||||
import com.ruoyi.ss.store.domain.StoreVo;
|
import com.ruoyi.ss.store.domain.StoreVo;
|
||||||
|
@ -66,7 +62,10 @@ import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO;
|
||||||
import com.ruoyi.ss.transactionBill.domain.vo.TransactionDailyAmountVO;
|
import com.ruoyi.ss.transactionBill.domain.vo.TransactionDailyAmountVO;
|
||||||
import com.ruoyi.ss.transactionBill.domain.vo.UserWithdrawServiceVO;
|
import com.ruoyi.ss.transactionBill.domain.vo.UserWithdrawServiceVO;
|
||||||
import com.ruoyi.ss.transactionBill.mapper.TransactionBillMapper;
|
import com.ruoyi.ss.transactionBill.mapper.TransactionBillMapper;
|
||||||
import com.ruoyi.ss.transactionBill.service.*;
|
import com.ruoyi.ss.transactionBill.service.TransactionAssembler;
|
||||||
|
import com.ruoyi.ss.transactionBill.service.TransactionBillService;
|
||||||
|
import com.ruoyi.ss.transactionBill.service.TransactionBillValidator;
|
||||||
|
import com.ruoyi.ss.transactionBill.service.WithdrawValidator;
|
||||||
import com.ruoyi.ss.transfer.domain.TransferVO;
|
import com.ruoyi.ss.transfer.domain.TransferVO;
|
||||||
import com.ruoyi.ss.transfer.interfaces.AfterTransfer;
|
import com.ruoyi.ss.transfer.interfaces.AfterTransfer;
|
||||||
import com.ruoyi.ss.transfer.service.TransferConverter;
|
import com.ruoyi.ss.transfer.service.TransferConverter;
|
||||||
|
@ -78,7 +77,6 @@ import com.ruoyi.system.service.ISysConfigService;
|
||||||
import com.ruoyi.task.bill.BillDelayedManager;
|
import com.ruoyi.task.bill.BillDelayedManager;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
|
@ -112,9 +110,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
@Autowired
|
@Autowired
|
||||||
private DeviceService deviceService;
|
private DeviceService deviceService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private WxPayService wxPayService;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserService userService;
|
||||||
|
|
||||||
|
@ -134,18 +129,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
@Autowired
|
@Autowired
|
||||||
private ScheduledExecutorService scheduledExecutorService;
|
private ScheduledExecutorService scheduledExecutorService;
|
||||||
|
|
||||||
@Value("${sm.withdraw.password.enable}")
|
|
||||||
private Boolean smWithdrawPasswordEnable; // 是否开启提现密码
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TransactionTemplate transactionTemplate;
|
private TransactionTemplate transactionTemplate;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IRecordTimeService recordTimeService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RecordTimeConverter recordTimeConverter;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PayBillService payBillService;
|
private PayBillService payBillService;
|
||||||
|
|
||||||
|
@ -158,15 +144,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISysConfigService sysConfigService;
|
private ISysConfigService sysConfigService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private TransactionBillConverter transactionBillConverter;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private WithdrawValidator withdrawValidator;
|
private WithdrawValidator withdrawValidator;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private BonusConverter bonusConverter;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private BonusService bonusService;
|
private BonusService bonusService;
|
||||||
|
|
||||||
|
@ -304,33 +284,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int fix(Long billId) {
|
|
||||||
TransactionBillVO bill = selectSmTransactionBillByBillId(billId);
|
|
||||||
return fix(bill);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int fixAll() {
|
|
||||||
TransactionBillQuery query = new TransactionBillQuery();
|
|
||||||
query.setStatusList(TransactionBillStatus.payedOrder());
|
|
||||||
query.setVersion(1);
|
|
||||||
List<TransactionBillVO> list = selectSmTransactionBillList(query);
|
|
||||||
if (CollectionUtils.isEmptyElement(list)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TransactionBillVO bill : list) {
|
|
||||||
try {
|
|
||||||
this.fix(bill);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("修复订单数据失败:{}, {}", bill.getBillNo(), e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int receiveMchShowMobileAmount(TransactionBillVO bill) {
|
public int receiveMchShowMobileAmount(TransactionBillVO bill) {
|
||||||
ServiceUtil.assertion(bill == null, "订单不存在");
|
ServiceUtil.assertion(bill == null, "订单不存在");
|
||||||
|
@ -414,36 +367,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
return transactionBillMapper.selectCountGroupBy(query, groupBy);
|
return transactionBillMapper.selectCountGroupBy(query, groupBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int fix(TransactionBillVO bill) {
|
|
||||||
return 0;
|
|
||||||
// if (bill == null || bill.getBillId() == null) {
|
|
||||||
// log.warn("修复订单数据失败:订单不存在或订单ID为空");
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
// // 仅可以修复旧订单
|
|
||||||
// ServiceUtil.assertion(bill.getVersion() == null || bill.getVersion() != 1, "该订单版本无法修复");
|
|
||||||
// ServiceUtil.assertion(!TransactionBillStatus.payedOrder().contains(bill.getStatus()), "订单未支付,无法修复");
|
|
||||||
//
|
|
||||||
// // 获取订单分成数据,判断是否已有分成数据
|
|
||||||
// BonusQuery query = new BonusQuery();
|
|
||||||
// query.setBillId(bill.getBillId());
|
|
||||||
// int bonusCount = bonusService.selectCount(query);
|
|
||||||
// ServiceUtil.assertion(bonusCount > 0, "订单已存在分成数据,无法重复修复");
|
|
||||||
//
|
|
||||||
// // 根据订单生成新的分成数据
|
|
||||||
// List<Bonus> bonusList = bonusConverter.toPo(bill);
|
|
||||||
// ServiceUtil.assertion(CollectionUtils.isEmptyElement(bonusList), "订单生成分成数据失败");
|
|
||||||
//
|
|
||||||
// // 插入数据
|
|
||||||
// Integer result = transactionTemplate.execute(status -> {
|
|
||||||
// int insert = bonusService.batchInsert(bonusList);
|
|
||||||
// ServiceUtil.assertion(insert != bonusList.size(), "订单分成数据插入失败");
|
|
||||||
// return insert;
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// return result == null ? 0 : result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 转换为订单所需的数据
|
// 转换为订单所需的数据
|
||||||
private TransactionBill parseToOrder(RechargeBO bo) {
|
private TransactionBill parseToOrder(RechargeBO bo) {
|
||||||
// 校验
|
// 校验
|
||||||
|
@ -994,60 +917,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
return transactionBillMapper.updateSmTransactionBill(data);
|
return transactionBillMapper.updateSmTransactionBill(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Override
|
|
||||||
// public DoPayVO payDeposit(RechargePayDepositBO bo) {
|
|
||||||
// // 校验
|
|
||||||
// ServiceUtil.assertion(transactionBillValidator.prePayDeposit(bo));
|
|
||||||
// // 锁
|
|
||||||
// Long lockKey = bo.getOrder().getBillId();
|
|
||||||
// ServiceUtil.assertion(!redisLock.lock(RedisLockKey.PREPAY_DEPOSIT, lockKey), "当前订单押金正在支付,请稍后重试");
|
|
||||||
// try {
|
|
||||||
// // 创建支付订单并发起支付
|
|
||||||
// return payBillService.createPayBill(payBillConverter.toPoByRechargeDeposit(bo));
|
|
||||||
// } finally {
|
|
||||||
// redisLock.unlock(RedisLockKey.PREPAY_DEPOSIT, lockKey);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// private int endTimingUse(EndUseBO bo) {
|
|
||||||
// if (bo == null) {
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
// TransactionBillVO order = bo.getOrder();
|
|
||||||
// DeviceVO device = bo.getDevice();
|
|
||||||
// ServiceUtil.assertion(order == null, "订单不存在");
|
|
||||||
// ServiceUtil.assertion(!TransactionBillStatus.SUCCESS_DEPOSIT.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
|
|
||||||
// ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
|
|
||||||
// ServiceUtil.assertion(device == null, "设备不存在");
|
|
||||||
//
|
|
||||||
// LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
|
|
||||||
//
|
|
||||||
// // 结束使用的电量:若蓝牙传过来的值为空或者小于当前电量,则使用当前电量,否则使用蓝牙传输的电量
|
|
||||||
// BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
|
|
||||||
//
|
|
||||||
// // 计算金额
|
|
||||||
// BigDecimal money = this.calcTimingAmount(order, endTime, totalEle);
|
|
||||||
//
|
|
||||||
// Integer result = transactionTemplate.execute(status -> {
|
|
||||||
// // 修改订单信息
|
|
||||||
// TransactionBill data = new TransactionBill();
|
|
||||||
// data.setSuitEndEle(totalEle);
|
|
||||||
// data.setSuitEndTime(endTime);
|
|
||||||
// data.setStatus(TransactionBillStatus.UNPAID.getStatus());
|
|
||||||
// data.setMoney(money);
|
|
||||||
// TransactionBillQuery query = new TransactionBillQuery();
|
|
||||||
// query.setStatus(TransactionBillStatus.SUCCESS_DEPOSIT.getStatus());
|
|
||||||
// query.setBillId(order.getBillId());
|
|
||||||
// query.setIsFinished(false);
|
|
||||||
// int update = this.updateByQuery(data, query);
|
|
||||||
// ServiceUtil.assertion(update != 1, "修改订单状态失败,请刷新后重试");
|
|
||||||
//
|
|
||||||
// return update;
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// return result == null ? 0 : result;
|
|
||||||
// }
|
|
||||||
|
|
||||||
private BigDecimal calcTotalEle(DeviceVO device, BigDecimal totalEle) {
|
private BigDecimal calcTotalEle(DeviceVO device, BigDecimal totalEle) {
|
||||||
if (totalEle == null || totalEle.compareTo(device.getTotalElectriQuantity()) < 0) {
|
if (totalEle == null || totalEle.compareTo(device.getTotalElectriQuantity()) < 0) {
|
||||||
return device.getTotalElectriQuantity();
|
return device.getTotalElectriQuantity();
|
||||||
|
@ -1186,40 +1055,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
return transactionBillMapper.selectSumOfMoney(query);
|
return transactionBillMapper.selectSumOfMoney(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int endUseSingle(EndUseBO bo) {
|
|
||||||
if (bo == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
TransactionBillVO order = bo.getOrder();
|
|
||||||
DeviceVO device = bo.getDevice();
|
|
||||||
ServiceUtil.assertion(order == null, "订单不存在");
|
|
||||||
ServiceUtil.assertion(order.getIsFinished() != null && order.getIsFinished(), "当前订单已结束,无法操作");
|
|
||||||
// ServiceUtil.assertion(!TransactionBillStatus.SUCCESS.getStatus().equals(order.getStatus()), "当前订单状态不允许结束");
|
|
||||||
ServiceUtil.assertion(device == null, "设备不存在");
|
|
||||||
|
|
||||||
LocalDateTime endTime = LocalDateTime.now(); // 结束使用的时间
|
|
||||||
|
|
||||||
// 结束使用的电量:若蓝牙传过来的值为空或者小于当前电量,则使用当前电量,否则使用蓝牙传输的电量(谁大用谁)
|
|
||||||
BigDecimal totalEle = this.calcTotalEle(device, bo.getTotalEle());
|
|
||||||
|
|
||||||
Integer result = transactionTemplate.execute(status -> {
|
|
||||||
// 修改结束使用的时间
|
|
||||||
TransactionBill data = new TransactionBill();
|
|
||||||
data.setSuitEndTime(endTime);
|
|
||||||
data.setSuitEndEle(totalEle);
|
|
||||||
TransactionBillQuery query = new TransactionBillQuery();
|
|
||||||
query.setBillId(order.getBillId());
|
|
||||||
query.setStatus(TransactionBillStatus.SUCCESS.getStatus());
|
|
||||||
query.setIsFinished(false);
|
|
||||||
int update = this.updateByQuery(data, query);
|
|
||||||
ServiceUtil.assertion(update != 1, "修改订单信息失败,请重试:" + order.getBillNo());
|
|
||||||
|
|
||||||
return update;
|
|
||||||
});
|
|
||||||
|
|
||||||
return result == null ? 0 : result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算退款金额
|
* 计算退款金额
|
||||||
*/
|
*/
|
||||||
|
@ -1308,12 +1143,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
|
|
||||||
// 计算分时段计量金额
|
// 计算分时段计量金额
|
||||||
private BigDecimal calcTimingCountAmount(TransactionBillVO order) {
|
private BigDecimal calcTimingCountAmount(TransactionBillVO order) {
|
||||||
//---旧的
|
|
||||||
// BigDecimal startEle = order.getSuitStartEle() == null ? BigDecimal.ZERO : order.getSuitStartEle(); // 起始电量
|
|
||||||
// BigDecimal usedEle = totalEle == null ? BigDecimal.ZERO : totalEle.subtract(startEle); // 本次用电量
|
|
||||||
// return calcTimingCountAmount(order.getSuitGearAmount(), order.getSuitGearTime(), order.getSuitStartTime(), endTime, usedEle);
|
|
||||||
// 旧的 ---
|
|
||||||
|
|
||||||
BillEleRecordQuery query = new BillEleRecordQuery();
|
BillEleRecordQuery query = new BillEleRecordQuery();
|
||||||
query.setBillId(order.getBillId());
|
query.setBillId(order.getBillId());
|
||||||
BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query);
|
BigDecimal amount = billEleRecordService.selectSumOfTotalPrice(query);
|
||||||
|
@ -1321,76 +1150,8 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
return BigDecimal.ZERO;
|
return BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
return amount;
|
return amount;
|
||||||
|
|
||||||
// 查询订单电量记录
|
|
||||||
// BillEleRecordQuery query = new BillEleRecordQuery();
|
|
||||||
// query.setBillId(order.getBillId());
|
|
||||||
// List<BillEleRecordVO> recordList = billEleRecordService.selectBillEleRecordList(query);
|
|
||||||
|
|
||||||
// // 拟创建新的记录
|
|
||||||
// LocalDateTime now = LocalDateTime.now();
|
|
||||||
// DeviceVO device = deviceService.selectById(order.getDeviceId());
|
|
||||||
// deviceService.pullDeviceInfo(device, null);
|
|
||||||
// BillEleRecord newRecord = billEleRecordConverter.toPo(order, device, now, now);
|
|
||||||
// recordList.add((BillEleRecordVO) newRecord);
|
|
||||||
//
|
|
||||||
// // 记录根据记录时间排序
|
|
||||||
// recordList.sort(Comparator.comparing(BillEleRecordVO::getRecordTime));
|
|
||||||
//
|
|
||||||
// // 计算每个记录的金额
|
|
||||||
// BigDecimal lastEle = order.getSuitStartEle();
|
|
||||||
// BigDecimal totalPrice = BigDecimal.ZERO;
|
|
||||||
// for (BillEleRecordVO record : recordList) {
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// totalPrice.add(record.getPrice() * )
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算分时段计量金额
|
|
||||||
private BigDecimal calcTimingCountAmount(List<BigDecimal> suitGearAmount, List<Integer> suitGearTime, LocalDateTime startTime, LocalDateTime endTime, BigDecimal usedEle) {
|
|
||||||
if (startTime == null) {
|
|
||||||
startTime = LocalDateTime.now();
|
|
||||||
}
|
|
||||||
BigDecimal total = BigDecimal.ZERO;
|
|
||||||
|
|
||||||
// 计算每小时平均用电量
|
|
||||||
Duration betweenAvg = Duration.between(startTime, endTime);
|
|
||||||
long minutes = betweenAvg.toMinutes();
|
|
||||||
if (minutes == 0) {
|
|
||||||
minutes = 1;
|
|
||||||
}
|
|
||||||
BigDecimal avgEle = usedEle.divide(BigDecimal.valueOf(minutes), 6, RoundingMode.HALF_UP); // 平均每分钟的用电量 4.6
|
|
||||||
|
|
||||||
// 初始时间
|
|
||||||
LocalDateTime time = startTime ;
|
|
||||||
|
|
||||||
// 计算每分钟的金额
|
|
||||||
while(endTime.isAfter(time)) {
|
|
||||||
int hour = time.getHour();
|
|
||||||
BigDecimal minuteAmount = suitGearAmount.get(suitGearTime.get(hour)).multiply(avgEle);
|
|
||||||
total = total.add(minuteAmount);
|
|
||||||
|
|
||||||
time = time.plusMinutes(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试总用电量
|
|
||||||
// public static void main(String[] args) {
|
|
||||||
// List<BigDecimal> suitGearAmount = Arrays.asList(new BigDecimal(0.22), new BigDecimal("0.39"), new BigDecimal("0.59"), new BigDecimal("0.89"));
|
|
||||||
// List<Integer> suitGearTime = Arrays.stream("1,1,1,1,1,1,1,2,2,2,1,0,0,0,1,2,3,3,3,2,2,2,2,1".split(",")).map(Integer::parseInt).collect(Collectors.toList());
|
|
||||||
// LocalDateTime startTime = DateUtils.toLocalDateTime("2024-12-19 12:45:31");
|
|
||||||
// LocalDateTime endTime = DateUtils.toLocalDateTime("2024-12-20 14:58:35");
|
|
||||||
// BigDecimal usedEle = new BigDecimal(13.8); // 总用电量 13.8
|
|
||||||
//
|
|
||||||
// TransactionBillServiceImpl service = new TransactionBillServiceImpl();
|
|
||||||
// BigDecimal total = service.calcTimingCountAmount(suitGearAmount, suitGearTime, startTime, endTime, usedEle);
|
|
||||||
// System.out.println(total);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 计算分时段计时金额
|
// 计算分时段计时金额
|
||||||
private BigDecimal calcTimingTimeAmount(TransactionBillVO order, LocalDateTime endTime) {
|
private BigDecimal calcTimingTimeAmount(TransactionBillVO order, LocalDateTime endTime) {
|
||||||
// 订单不存在 或者 开始时间为空,则表示未开始使用,返回0
|
// 订单不存在 或者 开始时间为空,则表示未开始使用,返回0
|
||||||
|
@ -1623,11 +1384,10 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
ServiceUtil.assertion(CollectionUtils.isEmptyElement(bonusList), "订单编号为%s的订单没有收益信息,无法退款", bill.getBillNo());
|
ServiceUtil.assertion(CollectionUtils.isEmptyElement(bonusList), "订单编号为%s的订单没有收益信息,无法退款", bill.getBillNo());
|
||||||
|
|
||||||
Integer result = transactionTemplate.execute(status -> {
|
Integer result = transactionTemplate.execute(status -> {
|
||||||
// 分成方余额按照比例扣减
|
// 分成方按照比例扣减余额
|
||||||
// 按比例计算退款金额
|
|
||||||
BigDecimal refundAmount = dto.getRefundAmount(); // 总退款金额
|
BigDecimal refundAmount = dto.getRefundAmount(); // 总退款金额
|
||||||
int updateRefundBonus = this.updateRefundBonus(bonusList, refundAmount, bill.getMoney());
|
int updateRefundBonus = this.updateRefundBonus(bonusList, refundAmount, bill.getMoney());
|
||||||
ServiceUtil.assertion(updateRefundBonus != bonusList.size(), "商户余额更新失败");
|
ServiceUtil.assertion(updateRefundBonus == 0 || updateRefundBonus > bonusList.size(), "商户余额更新失败");
|
||||||
|
|
||||||
// 发起退款
|
// 发起退款
|
||||||
PayBillRefundDTO refundDto = new PayBillRefundDTO();
|
PayBillRefundDTO refundDto = new PayBillRefundDTO();
|
||||||
|
@ -1654,22 +1414,32 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME 构建退款列表
|
// 构建退款列表
|
||||||
// FIXME 多次退款有问题,比如商户已经退款0.3元,剩余0.2元,第二次退款的时候,还是给商户分配了0.3元的退款,此时退款会失败。
|
List<Bonus> refundList = new ArrayList<>();
|
||||||
// FIXME 需要重新考虑一下退款金额的分配规则。
|
|
||||||
List<Bonus> refundList = new ArrayList<>(); // 退款的列表
|
|
||||||
BigDecimal dividedAmount = BigDecimal.ZERO; // 已分配金额
|
BigDecimal dividedAmount = BigDecimal.ZERO; // 已分配金额
|
||||||
|
|
||||||
for (BonusVO bonus : bonusList) {
|
for (BonusVO bonus : bonusList) {
|
||||||
if (bonus == null) {
|
if (bonus == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 计算扣减金额 = 退款金额 * 分配金额 / 总金额
|
|
||||||
BigDecimal bonusRefundAmount = refundAmount.multiply(bonus.getAmount()).divide(billAmount, 2, RoundingMode.HALF_UP);
|
// 计算该分成记录的可退金额 = 分配金额 - 已退金额
|
||||||
|
BigDecimal availableRefund = bonus.getAmount().subtract(bonus.getRefundAmount() == null ? BigDecimal.ZERO : bonus.getRefundAmount());
|
||||||
|
if (availableRefund.compareTo(BigDecimal.ZERO) <= 0) {
|
||||||
|
continue; // 跳过已无可退金额的记录
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按原始比例计算本次应退金额 = 本次退款总额 * (原始分配金额/订单总额)
|
||||||
|
BigDecimal proportion = bonus.getAmount().divide(billAmount, 6, RoundingMode.HALF_UP);
|
||||||
|
BigDecimal shouldRefund = refundAmount.multiply(proportion).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
// 实际退款金额取可退金额与应退金额的较小值
|
||||||
|
BigDecimal actualRefund = shouldRefund.min(availableRefund);
|
||||||
|
|
||||||
Bonus refundBonus = new Bonus();
|
Bonus refundBonus = new Bonus();
|
||||||
refundBonus.setId(bonus.getId());
|
refundBonus.setId(bonus.getId());
|
||||||
refundBonus.setStatus(bonus.getStatus());
|
refundBonus.setStatus(bonus.getStatus());
|
||||||
refundBonus.setRefundAmount(bonusRefundAmount);
|
refundBonus.setRefundAmount(actualRefund);
|
||||||
refundBonus.setArrivalId(bonus.getArrivalId());
|
refundBonus.setArrivalId(bonus.getArrivalId());
|
||||||
refundBonus.setArrivalType(bonus.getArrivalType());
|
refundBonus.setArrivalType(bonus.getArrivalType());
|
||||||
refundBonus.setBillNo(bonus.getBillNo());
|
refundBonus.setBillNo(bonus.getBillNo());
|
||||||
|
@ -1677,60 +1447,110 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
refundBonus.setToBalance(bonus.getToBalance());
|
refundBonus.setToBalance(bonus.getToBalance());
|
||||||
refundList.add(refundBonus);
|
refundList.add(refundBonus);
|
||||||
|
|
||||||
dividedAmount = dividedAmount.add(bonusRefundAmount);
|
dividedAmount = dividedAmount.add(actualRefund);
|
||||||
}
|
}
|
||||||
// 若存在误差,则平台吃掉误差
|
|
||||||
if (dividedAmount.compareTo(refundAmount) != 0) {
|
|
||||||
Bonus platform = refundList.stream().filter(bonus -> bonus.getArrivalType().equals(BonusArrivalType.PLATFORM.getType())).findFirst().orElse(null);
|
|
||||||
ServiceUtil.assertion(platform == null, "平台不存在");
|
|
||||||
|
|
||||||
BigDecimal subtract = refundAmount.subtract(dividedAmount); // 误差值
|
// 处理误差
|
||||||
platform.setRefundAmount(platform.getRefundAmount().add(subtract));
|
handleRefundAmountDiff(refundList, bonusList, dividedAmount, refundAmount);
|
||||||
}
|
|
||||||
|
|
||||||
// 校验金额
|
// 校验金额
|
||||||
for (Bonus bonus : refundList) {
|
for (Bonus bonus : refundList) {
|
||||||
ServiceUtil.assertion(bonus.getRefundAmount().compareTo(BigDecimal.ZERO) < 0, "退款金额不允许小于0");
|
ServiceUtil.assertion(bonus.getRefundAmount().compareTo(BigDecimal.ZERO) < 0, "退款金额不允许小于0");
|
||||||
}
|
}
|
||||||
BigDecimal sum = refundList.stream().map(Bonus::getRefundAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
BigDecimal sum = CollectionUtils.sumDecimal(refundList, Bonus::getRefundAmount);
|
||||||
ServiceUtil.assertion(sum.compareTo(refundAmount) != 0, "退款金额分配出错");
|
ServiceUtil.assertion(sum.compareTo(refundAmount) != 0, "退款金额分配出错");
|
||||||
|
|
||||||
|
// 执行退款逻辑
|
||||||
|
return executeRefund(refundList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理退款金额分配的误差
|
||||||
|
* @param refundList 退款列表
|
||||||
|
* @param bonusList 原始分成列表
|
||||||
|
* @param dividedAmount 已分配金额
|
||||||
|
* @param refundAmount 需要退款总金额
|
||||||
|
*/
|
||||||
|
private void handleRefundAmountDiff(List<Bonus> refundList, List<BonusVO> bonusList, BigDecimal dividedAmount, BigDecimal refundAmount) {
|
||||||
|
if (dividedAmount.compareTo(refundAmount) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 误差值
|
||||||
|
BigDecimal diff = refundAmount.subtract(dividedAmount);
|
||||||
|
|
||||||
|
// 多个分成方共同承担误差
|
||||||
|
BigDecimal remainingDiff = diff;
|
||||||
|
for (Bonus refundBonus : refundList) {
|
||||||
|
// 获取原始分成记录
|
||||||
|
BonusVO originalBonus = bonusList.stream()
|
||||||
|
.filter(b -> b.getId().equals(refundBonus.getId()))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
|
if (originalBonus == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算当前分成方的剩余可退金额
|
||||||
|
BigDecimal availableRefund = originalBonus.getAmount()
|
||||||
|
.subtract(originalBonus.getRefundAmount() == null ? BigDecimal.ZERO : originalBonus.getRefundAmount())
|
||||||
|
.subtract(refundBonus.getRefundAmount());
|
||||||
|
|
||||||
|
// 如果剩余可退金额足够承担误差
|
||||||
|
if (availableRefund.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
// 取可用退款金额与剩余误差中的较小值
|
||||||
|
BigDecimal adjustAmount = availableRefund.min(remainingDiff);
|
||||||
|
refundBonus.setRefundAmount(refundBonus.getRefundAmount().add(adjustAmount));
|
||||||
|
remainingDiff = remainingDiff.subtract(adjustAmount);
|
||||||
|
|
||||||
|
// 如果误差已经分配完毕,则退出
|
||||||
|
if (remainingDiff.compareTo(BigDecimal.ZERO) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果仍然无法完全分配误差,抛出异常
|
||||||
|
if (remainingDiff.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
throw new ServiceException("退款金额分配出错:无法处理误差金额");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行分成退款
|
||||||
|
private int executeRefund(List<Bonus> refundList) {
|
||||||
Integer result = transactionTemplate.execute(status -> {
|
Integer result = transactionTemplate.execute(status -> {
|
||||||
int update = 0;
|
int update = 0;
|
||||||
|
|
||||||
for (Bonus bonus : refundList) {
|
for (Bonus bonus : refundList) {
|
||||||
// 根据分成状态来决定是否扣减用户余额(给用户加余额前需要判断分成状态是否为待分成)
|
|
||||||
if (BonusStatus.WAIT_DIVIDE.getStatus().equals(bonus.getStatus())) {
|
if (BonusStatus.WAIT_DIVIDE.getStatus().equals(bonus.getStatus())) {
|
||||||
// 待分成,扣减待分成金额,加上退款金额
|
|
||||||
int refund = bonusService.refundWhenWaitDivide(bonus.getId(), bonus.getRefundAmount());
|
int refund = bonusService.refundWhenWaitDivide(bonus.getId(), bonus.getRefundAmount());
|
||||||
ServiceUtil.assertion(refund != 1, "可退款金额不足");
|
ServiceUtil.assertion(refund != 1, "可退款金额不足");
|
||||||
} else if (BonusStatus.DIVIDEND.getStatus().equals(bonus.getStatus())) {
|
} else if (BonusStatus.DIVIDEND.getStatus().equals(bonus.getStatus())) {
|
||||||
// 已分成,扣减已分成金额,加上退款金额
|
|
||||||
int refund = bonusService.refundWhenDividend(bonus.getId(), bonus.getRefundAmount());
|
int refund = bonusService.refundWhenDividend(bonus.getId(), bonus.getRefundAmount());
|
||||||
ServiceUtil.assertion(refund != 1, "可退款金额不足");
|
ServiceUtil.assertion(refund != 1, "可退款金额不足");
|
||||||
|
|
||||||
// 扣减分成方余额
|
|
||||||
ServiceUtil.assertion(bonus.getToBalance() == null, "数据异常,请联系管理员处理");
|
|
||||||
if (bonus.getToBalance() != null && bonus.getToBalance()) {
|
if (bonus.getToBalance() != null && bonus.getToBalance()) {
|
||||||
if (BonusArrivalType.userList().contains(bonus.getArrivalType())) {
|
if (BonusArrivalType.userList().contains(bonus.getArrivalType())) {
|
||||||
userService.subtractBalance(bonus.getArrivalId(), bonus.getRefundAmount(), String.format("订单退款:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId());
|
userService.subtractBalance(
|
||||||
|
bonus.getArrivalId(),
|
||||||
|
bonus.getRefundAmount(),
|
||||||
|
String.format("订单退款:%s", bonus.getBillNo()),
|
||||||
|
RecordBalanceBstType.RECHARGE,
|
||||||
|
bonus.getBillId()
|
||||||
|
);
|
||||||
} else if (BonusArrivalType.deptList().contains(bonus.getArrivalType())) {
|
} else if (BonusArrivalType.deptList().contains(bonus.getArrivalType())) {
|
||||||
// deptService.subtractBalance(bonus.getArrivalId(), bonus.getRefundAmount(), String.format("订单退款:%s", bonus.getBillNo()), RecordBalanceBstType.RECHARGE, bonus.getBillId());
|
// deptService相关逻辑暂时不处理
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
update++;
|
update++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return update;
|
return update;
|
||||||
});
|
});
|
||||||
|
|
||||||
return result == null ? 0 : result;
|
return result == null ? 0 : result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int updateByQuery(TransactionBill data, TransactionBillQuery query) {
|
public int updateByQuery(TransactionBill data, TransactionBillQuery query) {
|
||||||
if (query == null) {
|
if (query == null) {
|
||||||
|
@ -1809,33 +1629,6 @@ public class TransactionBillServiceImpl implements TransactionBillService, After
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 结束使用订单
|
|
||||||
// @Override
|
|
||||||
// public int endUse(EndUseBO bo) {
|
|
||||||
// if (bo == null) {
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return this.endSmartUse(bo);
|
|
||||||
|
|
||||||
// 智能订单
|
|
||||||
// if (SuitFeeMode.SMART.getMode().equals(bill.getSuitFeeMode())) {
|
|
||||||
// // 单次智能
|
|
||||||
//// if (SuitFeeType.singleList().contains(bill.getSuitFeeType())) {
|
|
||||||
//// }
|
|
||||||
//// // 分时段智能
|
|
||||||
//// else if (SuitFeeType.timingList().contains(bill.getSuitFeeType())){
|
|
||||||
//// return this.endTimingUse(bo);
|
|
||||||
//// }
|
|
||||||
// }
|
|
||||||
// // 单次订单
|
|
||||||
// else if (SuitFeeMode.SINGLE.getMode().equals(bill.getSuitFeeMode())) {
|
|
||||||
// return this.endUseSingle(bo);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> List<TransactionAmountVO<T>> selectCommonSumOfMoney(TransactionBillQuery query, String groupBy) {
|
public <T> List<TransactionAmountVO<T>> selectCommonSumOfMoney(TransactionBillQuery query, String groupBy) {
|
||||||
return transactionBillMapper.selectCommonSumOfMoney(query, groupBy);
|
return transactionBillMapper.selectCommonSumOfMoney(query, groupBy);
|
||||||
|
|
|
@ -180,19 +180,4 @@ public class SmTransactionBillController extends BaseController
|
||||||
return error("暂不支持该订单类型");
|
return error("暂不支持该订单类型");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修复订单数据
|
|
||||||
@PutMapping("/{billId}/fix")
|
|
||||||
@Log(title = "修复订单数据", businessType = BusinessType.UPDATE)
|
|
||||||
@PreAuthorize("@ss.hasPermi('system:bill:fix')")
|
|
||||||
public AjaxResult fix(@PathVariable Long billId) {
|
|
||||||
return toAjax(transactionBillService.fix(billId));
|
|
||||||
}
|
|
||||||
|
|
||||||
@PutMapping("/fixAll")
|
|
||||||
@Log(title = "修复所有订单数据", businessType = BusinessType.UPDATE)
|
|
||||||
@PreAuthorize("@ss.hasPermi('system:bill:fix')")
|
|
||||||
public AjaxResult fixAll() {
|
|
||||||
return toAjax(transactionBillService.fixAll());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user