From 81850f6fd251753f63c42d4f41e03f85b4f4e26c Mon Sep 17 00:00:00 2001 From: qjq <1766193529@qq.com> Date: Fri, 1 Nov 2024 11:54:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=AA=E7=A9=BA=E8=88=B1=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=861?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/OrderSpaceCapsulePageReqVO.java | 13 +++++- .../vo/OrderSpaceCapsuleRespVO.java | 15 ++++++- .../vo/OrderSpaceCapsuleSaveReqVO.java | 15 ++++++- .../OrderSpaceCapsuleDO.java | 8 ++++ .../OrderSpaceCapsuleServiceImpl.java | 41 ++++++++++++++++--- 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java index a2040031..be53b6e2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsulePageReqVO.java @@ -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; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java index a7675300..cd93f9ed 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleRespVO.java @@ -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; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java index 834b5be8..01da56d7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/orderspacecapsule/vo/OrderSpaceCapsuleSaveReqVO.java @@ -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; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/orderspacecapsule/OrderSpaceCapsuleDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/orderspacecapsule/OrderSpaceCapsuleDO.java index c13d10d8..ce28ac6f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/orderspacecapsule/OrderSpaceCapsuleDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/orderspacecapsule/OrderSpaceCapsuleDO.java @@ -85,5 +85,13 @@ public class OrderSpaceCapsuleDO extends BaseDO { * 支付方式 */ private String payMethods; + /** + * 套餐数量 + */ + private Integer comboNum; + /** + * 退款金额 + */ + private BigDecimal refundMoney; } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java index 0e9da5f4..b509f85a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/orderspacecapsule/OrderSpaceCapsuleServiceImpl.java @@ -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);