太空舱订单逻辑处理1

This commit is contained in:
qjq
2024-11-01 11:54:55 +08:00
parent 3ed04be004
commit 81850f6fd2
5 changed files with 83 additions and 9 deletions

View File

@ -6,6 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -60,5 +62,14 @@ public class OrderSpaceCapsulePageReqVO extends PageParam {
@Schema(description = "支付方式")
private String payMethods;
/**
* 套餐数量
*/
@Schema(description = "套餐数量")
private Integer comboNum;
/**
* 退款金额
*/
@Schema(description = "退款金额")
private BigDecimal refundMoney;
}

View File

@ -9,6 +9,8 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 太空舱订单 Response VO")
@Data
@ExcelIgnoreUnannotated
@ -73,5 +75,16 @@ public class OrderSpaceCapsuleRespVO {
@Schema(description = "支付方式", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("支付方式")
private String payMethods;
/**
* 套餐数量
*/
@Schema(description = "套餐数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("套餐数量")
private Integer comboNum;
/**
* 退款金额
*/
@Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("退款金额")
private BigDecimal refundMoney;
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo;
import cn.hutool.core.date.DatePattern;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -8,6 +9,8 @@ import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 太空舱订单新增/修改 Request VO")
@Data
public class OrderSpaceCapsuleSaveReqVO {
@ -61,5 +64,15 @@ public class OrderSpaceCapsuleSaveReqVO {
@Schema(description = "支付方式", requiredMode = Schema.RequiredMode.REQUIRED)
private String payMethods;
/**
* 套餐数量
*/
@Schema(description = "套餐数量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "套餐数量不能为空")
private Integer comboNum;
/**
* 退款金额
*/
@Schema(description = "退款金额")
private BigDecimal refundMoney;
}

View File

@ -85,5 +85,13 @@ public class OrderSpaceCapsuleDO extends BaseDO {
* 支付方式
*/
private String payMethods;
/**
* 套餐数量
*/
private Integer comboNum;
/**
* 退款金额
*/
private BigDecimal refundMoney;
}

View File

@ -20,6 +20,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -59,6 +61,9 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService {
BigDecimal initialMoney = user.getMoney();
// 设置变动前的余额
orderSpaceCapsule.setStartMoney(initialMoney);
//获取订单总金额
BigDecimal multiply = orderSpaceCapsule.getComboPrice().multiply(BigDecimal.valueOf(orderSpaceCapsule.getComboNum()));
orderSpaceCapsule.setMoney(multiply);
// 扣除余额
deductionService.deduct(orderSpaceCapsule.getUserId(), orderSpaceCapsule.getMoney(), CostTypeEnum.SHOPPING.getCode());
// 设置变动后的余额
@ -92,9 +97,10 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService {
if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_APPOINTMENT.getCode())){
// TODO: 预约逻辑待完成
}else if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_REFUNDED.getCode())){
handleRefund(updateObj);
handleRefund(updateObj,currentStatus);
updateObj.setStatus(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_REFUNDED.getCode());
updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FREE_TIME.getCode());
updateObj.setOrderEndTime(LocalDateTime.now());
}else if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_DONE.getCode())){
updateObj.setOrderEndTime(LocalDateTime.now());
updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FREE_TIME.getCode());
@ -105,17 +111,40 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService {
// 更新数据库
orderSpaceCapsuleMapper.updateById(updateObj);
}
// 处理退款逻辑
private void handleRefund(OrderSpaceCapsuleDO updateObj) {
private void handleRefund(OrderSpaceCapsuleDO updateObj, Integer currentStatus) {
MemberUserDO user = userService.getUser(updateObj.getUserId());
BigDecimal startMoney = user.getMoney();
// 退款金额计算
BigDecimal refundAmount = calculateRefundAmount(updateObj, currentStatus);
updateObj.setRefundMoney(refundAmount);
// 进行余额退款
deductionService.reduction(updateObj.getUserId(), updateObj.getMoney(), BigDecimal.ZERO, updateObj.getMoney(), BigDecimal.ZERO);
deductionService.reduction(updateObj.getUserId(), refundAmount, BigDecimal.ZERO, refundAmount, BigDecimal.ZERO);
// 设置变动后的余额
updateObj.setEndMoney(startMoney.add(updateObj.getMoney()));
updateObj.setEndMoney(startMoney.add(refundAmount));
}
// 计算退款金额
private BigDecimal calculateRefundAmount(OrderSpaceCapsuleDO updateObj, Integer currentStatus) {
// 未使用退款
if (currentStatus.equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_UNUSED.getCode())) {
return updateObj.getMoney(); // 未使用,全额退款
}
// 已使用中途退款
if (currentStatus.equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_IN_USE.getCode())) {
int comboMinutes = updateObj.getComboMinutes() * updateObj.getComboNum();
BigDecimal comboPrice = updateObj.getMoney();
LocalDateTime orderStartTime = updateObj.getOrderStartTime();
LocalDateTime now = LocalDateTime.now();
// 计算已使用时间和剩余时间
long minutesUsed = Duration.between(orderStartTime, now).toMinutes();
int remainingMinutes = Math.toIntExact(comboMinutes - minutesUsed);
// 计算每分钟的价格
BigDecimal pricePerMinute = comboPrice.divide(BigDecimal.valueOf(comboMinutes), 2, RoundingMode.HALF_UP);
// 计算剩余价格并向下取整
return pricePerMinute.multiply(BigDecimal.valueOf(remainingMinutes)).setScale(0, RoundingMode.FLOOR);
}
return BigDecimal.ZERO; // 默认情况下,无退款
}
// 更新太空舱状态
private void updateSpaceCapsuleStatus(SpaceCapsuleDO spaceCapsule, Integer newStatus) {
spaceCapsule.setStatus(newStatus);