This commit is contained in:
zt
2025-02-24 11:47:19 +08:00
parent 315191ee73
commit ad3fc57a67
9 changed files with 260 additions and 13 deletions

View File

@ -147,4 +147,12 @@ public class OrderController {
orderService.abnormalHandle(orderId,mobile);
return CommonResult.success(true);
}
@GetMapping("/orderTransfer")
@Operation(summary = "转让订单")
public CommonResult<Boolean> orderTransfer(Long orderId,String mobile){
orderService.orderTransfer(orderId,mobile);
return CommonResult.success(true);
}
}

View File

@ -104,4 +104,11 @@ public class OrderDetailsRespVO {
* 补贴金额
*/
private BigDecimal subsidyAmount;
private String transferState;
private LocalDateTime transferTime;
}

View File

@ -110,5 +110,19 @@ public class AppOrderController {
return CommonResult.success(true);
}
@GetMapping("/abnormalHandle")
@Operation(summary = "异常订单指定用户扣款")
public CommonResult<Boolean> abnormalHandle(Long orderId,String mobile){
orderService.abnormalHandle(orderId,mobile);
return CommonResult.success(true);
}
@GetMapping("/orderTransfer")
@Operation(summary = "转让订单")
public CommonResult<Boolean> orderTransfer(Long orderId,String mobile){
orderService.orderTransfer(orderId,mobile);
return CommonResult.success(true);
}
}

View File

@ -4,14 +4,10 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 会员订单 DO
@ -114,4 +110,8 @@ public class DishOrderDO extends BaseDO {
* 补贴金额
*/
private BigDecimal subsidyAmount;
private String transferState;
private LocalDateTime transferTime;
}

View File

@ -21,6 +21,11 @@ public interface DeductionService {
*/
void abnormalOrderDeduct(DishOrderDO dishOrderDO);
/**
* 订单转让处理
*/
void orderTransferHandle(DishOrderDO dishOrderDO,Long transferUserId);
/**
* 现金提现
*/

View File

@ -18,16 +18,17 @@ import cn.iocoder.yudao.module.member.service.group.MemberGroupService;
import cn.iocoder.yudao.module.member.service.holiday.HolidayService;
import cn.iocoder.yudao.module.member.service.money.MoneyService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import cn.iocoder.yudao.module.member.util.MemberTimeUtils;
import com.sun.istack.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.Arrays;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.CASH_AMOUNT_NOT_ALLOW;
@ -279,7 +280,7 @@ public class DeductionServiceImpl implements DeductionService {
} else {
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
//扣除具体金额
if (judge(userId)) { //微信->现金
if (judge(userId, MemberTimeUtils.Time2StringDate(dishOrderDO.getCreateTime()))) { //微信->现金
if (total.compareTo(wxAmount) <= 0) {
user.setWxAmount(wxAmount.subtract(total));
dishOrderDO.setWxAmount(total);
@ -348,6 +349,191 @@ public class DeductionServiceImpl implements DeductionService {
updateRedis(userId, name, newMoney);
}
@Override
public void orderTransferHandle(DishOrderDO dishOrderDO, Long transferUserId) {
//退款处理
if (dishOrderDO.getOrderStatus().equals(DishOrderDO.INCOMPLETE)) {
dishOrderDO.setUserId(transferUserId);
} else if (dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)) {
transferRefund(dishOrderDO);
transferDeduct(dishOrderDO, transferUserId);
} else if (dishOrderDO.getOrderStatus().equals(DishOrderDO.TOCOMPLETE)) {
transferRefund(dishOrderDO);
transferDeduct(dishOrderDO, transferUserId);
}
}
void transferRefund(DishOrderDO dishOrderDO) {
//退款
BigDecimal wxNewMoney;
BigDecimal cashNewMoney;
BigDecimal newMoney;
String name;
Long userId = dishOrderDO.getUserId();
BigDecimal total = dishOrderDO.getTotalMoney().subtract(dishOrderDO.getPayAmount());
synchronized (getUserLock(userId)) {
MemberUserDO user = userService.getUser(userId);
//用户当前金额
BigDecimal userMoney = user.getMoney();
BigDecimal cashAmount = user.getCashAmount();
user.setCashAmount(cashAmount.add(total));
user.setMoney(userMoney.add(total));
userService.updateById(user);
wxNewMoney = user.getWxAmount();
newMoney = user.getMoney();
cashNewMoney = user.getCashAmount();
name = user.getNickname();
}
CardDO cardDO = new CardDO();
cardDO.setUserId(userId);
cardDO.setFlag(CardDO.ADD);
cardDO.setChangeMoney(total);
cardDO.setType(CostTypeEnum.REFUND.getCode());
cardDO.setWxAmount(wxNewMoney);
cardDO.setCashAmount(cashNewMoney);
cardDO.setCarteenId(dishOrderDO.getStoreId());
cardDO.setMoney(newMoney);
cardService.insertOne(cardDO);
StatisticsVo statisticsVo = new StatisticsVo();
statisticsVo.setCarteenId(dishOrderDO.getStoreId());
statisticsVo.setTotalMoney(total.negate());
statisticsVo.setOrderSum(-1);
statisticsVo.setReduceMoney(dishOrderDO.getReductionAmount().negate());
statisticsVo.setTime(dishOrderDO.getCreateTime());
statisticsVo.setOrderId(dishOrderDO.getId());
statisticsVo.setSubsidyPurse(dishOrderDO.getSubsidyAmount().negate());
businessService.updateStatistics(statisticsVo);
//更新redis
updateRedis(userId, name, newMoney);
}
void transferDeduct(DishOrderDO dishOrderDO, Long userId) {
//扣款
BigDecimal wxNewMoney;
BigDecimal cashNewMoney;
BigDecimal newMoney;
String name;
synchronized (getUserLock(userId)) {
MemberUserDO user = userService.getUser(userId);
dishOrderDO.setUserId(userId);
//新的总价
BigDecimal total = dishOrderDO.getTotalMoney().add(dishOrderDO.getReductionAmount()).add(dishOrderDO.getSubsidyAmount());
//计算减免价格
BigDecimal reductionAmount = BigDecimal.ZERO;
//补贴
BigDecimal subsidyAmount = BigDecimal.ZERO;
if (total.compareTo(BigDecimal.ZERO) > 0) {
subsidyAmount = userService.getReductionAmount(userId, total, dishOrderDO.getCreateTime());
}
dishOrderDO.setSubsidyAmount(subsidyAmount);
dishOrderDO.setReductionAmount(BigDecimal.ZERO);
dishOrderDO.setReductionState(reductionAmount.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
//计算减免后的总价
reductionAmount = reductionAmount.add(subsidyAmount);
if (total.compareTo(reductionAmount) < 0) {
total = BigDecimal.ZERO;
} else {
total = total.subtract(reductionAmount);
}
dishOrderDO.setTotalMoney(total);
//微信
BigDecimal wxAmount = user.getWxAmount();
//现金
BigDecimal cashAmount = user.getCashAmount();
//当前金额
BigDecimal money = user.getMoney();
//待支付金额 最大退款金额
dishOrderDO.setRefundAmount(total);
if (money.compareTo(BigDecimal.ZERO) <= 0) {
dishOrderDO.setPayAmount(total);
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
} else {
if (total.compareTo(money) > 0) {
dishOrderDO.setPayAmount(total.subtract(money));
dishOrderDO.setRefundAmount(money);
}
}
//扣除金额
user.setMoney(money.subtract(total));
if (total.compareTo(money) > 0) {
dishOrderDO.setOrderStatus(DishOrderDO.TOCOMPLETE);
dishOrderDO.setWxAmount(wxAmount);
dishOrderDO.setCashAmount(cashAmount);
user.setWxAmount(BigDecimal.ZERO);
user.setCashAmount(BigDecimal.ZERO);
} else {
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
//扣除具体金额
if (judge(userId, MemberTimeUtils.Time2StringDate(dishOrderDO.getCreateTime()))) { //微信->现金
if (total.compareTo(wxAmount) <= 0) {
user.setWxAmount(wxAmount.subtract(total));
dishOrderDO.setWxAmount(total);
} else {
user.setWxAmount(BigDecimal.ZERO);
dishOrderDO.setWxAmount(wxAmount);
BigDecimal total1 = total.subtract(wxAmount);
user.setCashAmount(cashAmount.subtract(total1));
dishOrderDO.setCashAmount(total1);
}
} else { //现金->微信
if (total.compareTo(cashAmount) <= 0) {
user.setCashAmount(cashAmount.subtract(total));
dishOrderDO.setCashAmount(total);
} else {
user.setCashAmount(BigDecimal.ZERO);
dishOrderDO.setCashAmount(cashAmount);
BigDecimal total1 = total.subtract(cashAmount);
user.setWxAmount(wxAmount.subtract(total1));
dishOrderDO.setWxAmount(total1);
}
}
}
//修改
userService.updateById(user);
wxNewMoney = user.getWxAmount();
cashNewMoney = user.getCashAmount();
newMoney = user.getMoney();
name = user.getNickname();
}
//记录消费记录
CardDO cardDO = new CardDO();
cardDO.setType(TimePeriodEnum.getTimePeriod(dishOrderDO.getCreateTime()));
cardDO.setUserId(userId);
cardDO.setChangeMoney(dishOrderDO.getTotalMoney());
cardDO.setFlag(CardDO.MINUS);
cardDO.setCashAmount(cashNewMoney);
cardDO.setWxAmount(wxNewMoney);
cardDO.setCarteenId(dishOrderDO.getStoreId());
cardDO.setMoney(newMoney);
cardService.insertOne(cardDO);
//更新营业数据
if (dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)) {
StatisticsVo statisticsVo = new StatisticsVo();
statisticsVo.setCarteenId(dishOrderDO.getStoreId());
statisticsVo.setTotalMoney(dishOrderDO.getTotalMoney());
statisticsVo.setOrderSum(1);
statisticsVo.setReduceMoney(dishOrderDO.getReductionAmount());
statisticsVo.setTime(dishOrderDO.getCreateTime());
statisticsVo.setOrderId(dishOrderDO.getId());
statisticsVo.setSubsidyPurse(dishOrderDO.getSubsidyAmount());
businessService.updateStatistics(statisticsVo);
}
//更新redis
updateRedis(userId, name, newMoney);
}
@Override
public void cashDraw(Long userId, BigDecimal money, String type, Long storeId) {
@ -356,7 +542,7 @@ public class DeductionServiceImpl implements DeductionService {
BigDecimal newMoney;
String name;
if(judgeDraw(userId)){
if (judgeDraw(userId)) {
throw exception(CASH_AMOUNT_NOT_ALLOW);
}

View File

@ -130,5 +130,5 @@ public interface OrderService {
void abnormalHandle(Long orderId,String mobile);
void orderTransfer(Long orderId,String mobile);
}

View File

@ -573,14 +573,34 @@ public class OrderServiceImpl implements OrderService {
dishOrderDO.setUserId(memberUserDOS.get(0).getId());
DiningPlatesDO diningPlatesDO = diningPlatesService.getDiningPlatesByNum(dishOrderDO.getDiningPlatesNum(), dishOrderDO.getStoreId());
if(dishOrderDO.getOrderStatus().equals("3")){
if(dishOrderDO.getTotalMoney().compareTo(BigDecimal.ZERO)>0){
//扣费处理
deductionService.abnormalOrderDeduct(dishOrderDO);
diningPlatesService.updateBind(Collections.singletonList(diningPlatesDO.getId()));
}else {
diningPlatesDO.setUserId(dishOrderDO.getUserId());
diningPlatesService.updateById(diningPlatesDO);
dishOrderDO.setOrderStatus(DishOrderDO.INCOMPLETE);
}
dishOrderMapper.updateById(dishOrderDO);
}
@Override
public void orderTransfer(Long orderId, String mobile) {
List<MemberUserDO> memberUserDOS = memberUserMapper.selectList(new LambdaQueryWrapperX<MemberUserDO>()
.eq(MemberUserDO::getMobile, mobile));
if(CollectionUtil.isEmpty(memberUserDOS)){
throw exception(USER_NOT_EXISTS);
}
DishOrderDO dishOrderDO = dishOrderMapper.selectById(orderId);
if(dishOrderDO == null){
throw exception(ORDER_NOT_EXISTS);
}
MemberUserDO memberUserDO = memberUserDOS.get(0);
//扣费处理
deductionService.orderTransferHandle(dishOrderDO,memberUserDO.getId());
dishOrderDO.setTransferState("1");
dishOrderDO.setTransferTime(LocalDateTime.now());
dishOrderMapper.updateById(dishOrderDO);
}
}

View File

@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.member.util;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import org.aspectj.apache.bcel.generic.RET;
import java.time.LocalDate;
import java.time.LocalDateTime;
@ -115,4 +114,12 @@ public class MemberTimeUtils {
return time.format(formatter);
}
public static String Time2StringDate(LocalDateTime time) {
// 定义日期字符串格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 将字符串解析为LocalDate对象
return time.format(formatter);
}
}