太空舱订单逻辑处理1
This commit is contained in:
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -85,5 +85,13 @@ public class OrderSpaceCapsuleDO extends BaseDO {
|
||||
* 支付方式
|
||||
*/
|
||||
private String payMethods;
|
||||
/**
|
||||
* 套餐数量
|
||||
*/
|
||||
private Integer comboNum;
|
||||
/**
|
||||
* 退款金额
|
||||
*/
|
||||
private BigDecimal refundMoney;
|
||||
|
||||
}
|
@ -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);
|
||||
|
Reference in New Issue
Block a user