分账重构

This commit is contained in:
seesaw
2024-08-16 18:00:08 +08:00
parent 201da3b318
commit fc45e8b84e
57 changed files with 3535 additions and 93 deletions

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.member.dal.dataobject.rechargelog;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 负款补充 DO
*
* @author 管理员
*/
@TableName("member_recharge_log")
@KeySequence("member_recharge_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RechargeLogDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 充值
*/
private BigDecimal money;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
}

View File

@ -31,6 +31,11 @@ public class RefundLogDO {
*/
private BigDecimal money;
/**
* 剩余退款
*/
private BigDecimal leftMoney;
/**
* 创建时间
*/

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.member.dal.mysql.rechargelog;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.member.dal.dataobject.rechargelog.RechargeLogDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 负款补充 Mapper
*
* @author 管理员
*/
@Mapper
public interface RechargeLogMapper extends BaseMapperX<RechargeLogDO> {
}

View File

@ -20,11 +20,11 @@ public enum TimePeriodEnum {
/**
* 早上时间段
*/
MORNING("05:00:00","10:59:59","2",5,10),
MORNING("00:00:00","9:59:59","2",0,9),
/**
* 中午时间段
*/
MIDDAY("11:00:00","15:59:59","3",11,15),
MIDDAY("10:00:00","15:59:59","3",10,15),
/**
* 晚上时间段
*/

View File

@ -15,11 +15,13 @@ import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.FaceVo;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO;
import cn.iocoder.yudao.module.member.dal.dataobject.rechargelog.RechargeLogDO;
import cn.iocoder.yudao.module.member.dal.dataobject.refund.RefundDO;
import cn.iocoder.yudao.module.member.dal.dataobject.refundlog.RefundLogDO;
import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper;
import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.rechargelog.RechargeLogMapper;
import cn.iocoder.yudao.module.member.dal.mysql.refund.IntegralRefundMapper;
import cn.iocoder.yudao.module.member.dal.mysql.refundlog.RefundLogMapper;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
@ -40,9 +42,7 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -71,6 +71,9 @@ public class CardServiceImpl implements CardService {
@Resource
private RefundLogMapper refundLogMapper;
@Resource
private RechargeLogMapper rechargeLogMapper;
@Override
public Long createCard(CardSaveReqVO createReqVO) {
// 插入
@ -341,16 +344,23 @@ public class CardServiceImpl implements CardService {
BigDecimal dishWxAmount = dishOrderDO.getWxAmount();
BigDecimal dishCashAmount = dishOrderDO.getCashAmount();
BigDecimal dishGiftAmount = dishOrderDO.getGiftAmount();
BigDecimal newMoney = money;
if(oldMoney.compareTo(BigDecimal.ZERO)<0){
newMoney = cardDO.getMoney();
}
if (cardDO.getMoney().compareTo(BigDecimal.ZERO) <= 0) {
cardDO.setWxAmount(BigDecimal.ZERO);
cardDO.setGiftAmount(BigDecimal.ZERO);
cardDO.setCashAmount(BigDecimal.ZERO);
} else {
if (money.compareTo(dishGiftAmount) <= 0) {
cardDO.setGiftAmount(giftAmount.add(money).setScale(2, BigDecimal.ROUND_HALF_UP));
if (newMoney.compareTo(dishGiftAmount) <= 0) {
cardDO.setGiftAmount(giftAmount.add(newMoney).setScale(2, BigDecimal.ROUND_HALF_UP));
} else {
cardDO.setGiftAmount(giftAmount.add(dishGiftAmount).setScale(2, BigDecimal.ROUND_HALF_UP));
BigDecimal money1 = money.subtract(dishGiftAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal money1 = newMoney.subtract(dishGiftAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
if (money1.compareTo(dishCashAmount) <= 0) {
cardDO.setCashAmount(cashAmount.add(money1).setScale(2, BigDecimal.ROUND_HALF_UP));
@ -377,6 +387,7 @@ public class CardServiceImpl implements CardService {
BigDecimal newPayAmount = dishOrderDO.getPayAmount().subtract(money);
if (newPayAmount.compareTo(BigDecimal.ZERO) > 0) {
dishOrderDO.setPayAmount(newPayAmount);
rechargeLog(distribute(dishOrderDO, money).get("wx"));
} else {
handleOtherMoney(dishOrderDO,money);
dishOrderDO.setPayAmount(BigDecimal.ZERO);
@ -391,56 +402,39 @@ public class CardServiceImpl implements CardService {
//查找其余未支付订单
List<DishOrderDO> dishOrderDOS = dishOrderMapper.selectList(Wrappers.<DishOrderDO>lambdaQuery().eq(DishOrderDO::getOrderStatus, DishOrderDO.TOCOMPLETE)
.ne(DishOrderDO::getId, dishOrderDO.getId()));
if (CollectionUtil.isNotEmpty(dishOrderDOS)){
//判断多出的金额来自哪一部分
BigDecimal payAmount = dishOrderDO.getPayAmount();
BigDecimal giftAmount = dishOrderDO.getGiftAmount();
BigDecimal cashAmount = dishOrderDO.getCashAmount();
BigDecimal wxAmount = dishOrderDO.getWxAmount();
//判断多出的金额来自哪一部分
BigDecimal payAmount = dishOrderDO.getPayAmount();
//可用金额
BigDecimal gift = BigDecimal.ZERO;
BigDecimal cash = BigDecimal.ZERO;
BigDecimal wx = BigDecimal.ZERO;
Map<String, BigDecimal> distribute = distribute(dishOrderDO, money);
//开始微信金额
BigDecimal wxStart = distribute.get("wx");
//可用金额
BigDecimal gift = distribute.get("gift");
BigDecimal cash = distribute.get("cash");
BigDecimal wx = distribute.get("wx");
//分配退款金额
if(money.compareTo(giftAmount)<=0){
gift = money;
}else {
gift = giftAmount;
BigDecimal left = money.subtract(giftAmount);
if(left.compareTo(cashAmount)<=0){
cash = left;
//去除该订单已支付的
if(payAmount.compareTo(gift)<=0){
gift = gift.subtract(payAmount);
}else {
BigDecimal left = payAmount.subtract(gift);
gift = BigDecimal.ZERO;
if(left.compareTo(cash)<=0){
cash = cash.subtract(left);
}else{
BigDecimal left1 = left.subtract(cash);
cash = BigDecimal.ZERO;
if(left1.compareTo(wx)<=0){
wx = wx.subtract(left1);
}else {
cash = cashAmount;
BigDecimal left1 = left.subtract(cashAmount);
if(left1.compareTo(wxAmount)<=0){
wx = left1;
}else {
wx = wxAmount;
}
}
}
//去除该订单已支付的
if(payAmount.compareTo(gift)<=0){
gift = gift.subtract(payAmount);
}else {
BigDecimal left = payAmount.subtract(gift);
gift = BigDecimal.ZERO;
if(left.compareTo(cash)<=0){
cash = cash.subtract(left);
}else{
BigDecimal left1 = left.subtract(cash);
cash = BigDecimal.ZERO;
if(left1.compareTo(wx)<=0){
wx = wx.subtract(left1);
}else {
wx= BigDecimal.ZERO;
}
wx= BigDecimal.ZERO;
}
}
}
if (CollectionUtil.isNotEmpty(dishOrderDOS)){
//待修改的订单
ArrayList<DishOrderDO> update = new ArrayList<>();
@ -504,9 +498,48 @@ public class CardServiceImpl implements CardService {
dishOrderMapper.updateBatch(update);
}
}
rechargeLog(wxStart.subtract(wx));
}
//退款金额记录
public void refundLog(DishOrderDO dishOrderDO,BigDecimal money){
BigDecimal wx = distribute(dishOrderDO, money).get("wx");
List<RefundLogDO> refundLogDOS = refundLogMapper.selectList(Wrappers.<RefundLogDO>lambdaQuery()
.apply("TO_DAYS(NOW())-TO_DAYS(create_time) = 0"));
if(CollectionUtil.isNotEmpty(refundLogDOS)){
RefundLogDO refundLogDO = refundLogDOS.get(0);
refundLogDO.setMoney(refundLogDO.getMoney().add(wx));
refundLogDO.setLeftMoney(refundLogDO.getLeftMoney().add(wx));
refundLogMapper.updateById(refundLogDO);
}else {
RefundLogDO refundLogDO = new RefundLogDO();
refundLogDO.setMoney(wx);
refundLogDO.setLeftMoney(wx);
refundLogDO.setCreateTime(LocalDateTime.now());
refundLogMapper.insert(refundLogDO);
}
}
//补充金额记录
public void rechargeLog(BigDecimal money){
List<RechargeLogDO> rechargeLogDOList = rechargeLogMapper.selectList(Wrappers.<RechargeLogDO>lambdaQuery()
.apply("TO_DAYS(NOW())-TO_DAYS(create_time) = 0"));
if(CollectionUtil.isNotEmpty(rechargeLogDOList)){
RechargeLogDO rechargeLogDO = rechargeLogDOList.get(0);
rechargeLogDO.setMoney(rechargeLogDO.getMoney().add(money));
rechargeLogMapper.updateById(rechargeLogDO);
}else {
RechargeLogDO rechargeLogDO = new RechargeLogDO();
rechargeLogDO.setMoney(money);
rechargeLogDO.setCreateTime(LocalDateTime.now());
rechargeLogMapper.insert(rechargeLogDO);
}
}
//分配金额
public Map<String,BigDecimal> distribute(DishOrderDO dishOrderDO,BigDecimal money){
HashMap<String, BigDecimal> map = new HashMap<>();
BigDecimal giftAmount = dishOrderDO.getGiftAmount();
BigDecimal cashAmount = dishOrderDO.getCashAmount();
BigDecimal wxAmount = dishOrderDO.getWxAmount();
@ -534,21 +567,16 @@ public class CardServiceImpl implements CardService {
}
}
}
map.put("gift",gift);
map.put("cash",cash);
map.put("wx",wx);
List<RefundLogDO> refundLogDOS = refundLogMapper.selectList(Wrappers.<RefundLogDO>lambdaQuery()
.apply("TO_DAYS(NOW())-TO_DAYS(create_time) = 0"));
if(CollectionUtil.isNotEmpty(refundLogDOS)){
RefundLogDO refundLogDO = refundLogDOS.get(0);
refundLogDO.setMoney(refundLogDO.getMoney().add(wx));
refundLogMapper.updateById(refundLogDO);
}else {
RefundLogDO refundLogDO = new RefundLogDO();
refundLogDO.setMoney(wx);
refundLogDO.setCreateTime(LocalDateTime.now());
refundLogMapper.insert(refundLogDO);
}
return map;
}
public BigDecimal checkOrder(Long userId) {
LambdaQueryWrapper<DishOrderDO> wrapper = new LambdaQueryWrapper<>();
@ -615,12 +643,15 @@ public class CardServiceImpl implements CardService {
}
void handleOrderWx(Long userId, BigDecimal money, BigDecimal giftAmount) {
BigDecimal wxMoney = money;
BigDecimal giftMoney = BigDecimal.ZERO;
if (giftAmount != null) {
wxMoney = money.subtract(giftMoney);
giftMoney = giftAmount;
}
//开始的微信金额
BigDecimal wxStart = wxMoney;
//已审核的订单
List<Long> refundOrder = getRefundOrder();
@ -660,11 +691,14 @@ public class CardServiceImpl implements CardService {
}
dishOrderDO.setWxAmount(dishOrderDO.getWxAmount().add(wxMoney));
dishOrderDO.setGiftAmount(dishOrderDO.getGiftAmount().add(giftMoney));
wxMoney =BigDecimal.ZERO;
updateList.add(dishOrderDO);
break;
}
}
}
rechargeLog(wxStart.subtract(wxMoney));
if(CollectionUtil.isNotEmpty(updateList)){
dishOrderMapper.updateBatch(updateList);
}