|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|