From 3ed04be0040e5be4603354ec4c1b0730cadaa449 Mon Sep 17 00:00:00 2001 From: qjq <1766193529@qq.com> Date: Fri, 1 Nov 2024 10:15:20 +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=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/enums/ErrorCodeConstants.java | 1 + .../vo/OrderSpaceCapsuleSaveReqVO.java | 3 - .../AppSpaceCapsuleController.java | 2 +- .../spacecapsule/SpaceCapsuleMapper.java | 19 ---- .../module/member/enums/PayMethodsEnum.java | 45 ++++++++++ .../module/member/enums/SpaceCapsuleEnum.java | 23 +++++ .../member/enums/SpaceCapsuleOrderEnum.java | 29 ++++++ .../OrderSpaceCapsuleServiceImpl.java | 88 +++++++++++++++++-- .../spacecapsule/SpaceCapsuleService.java | 8 +- .../spacecapsule/SpaceCapsuleServiceImpl.java | 12 +-- 10 files changed, 190 insertions(+), 40 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/PayMethodsEnum.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleEnum.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleOrderEnum.java diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index e989b2b1..b458abb9 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -120,6 +120,7 @@ public interface ErrorCodeConstants { ErrorCode COMBO_NOT_EXISTS = new ErrorCode(1_004_015_001, "套餐不存在"); //========== 用户余额明细 1-004-016-000 ============= ErrorCode ORDER_SPACE_CAPSULE_NOT_EXISTS = new ErrorCode(1_004_016_001, "太空舱订单不存在"); + ErrorCode ORDER_SPACE_CAPSULE_ERREO = new ErrorCode(1_004_016_002, "太空舱订单状态非法"); ErrorCode STORE_BUSINESS_NOT_EXISTS = new ErrorCode(1_004_017_001, "超市营业统计不存在"); } 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 024fd068..834b5be8 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 @@ -54,15 +54,12 @@ public class OrderSpaceCapsuleSaveReqVO { private Long userId; @Schema(description = "消费前的余额", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "消费前的余额不能为空") private BigDecimal startMoney; @Schema(description = "消费后的余额", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "消费后的余额不能为空") private BigDecimal endMoney; @Schema(description = "支付方式", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "支付方式不能为空") private String payMethods; } \ 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/app/spacecapsule/AppSpaceCapsuleController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/spacecapsule/AppSpaceCapsuleController.java index 7c3eadc5..177d2155 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/spacecapsule/AppSpaceCapsuleController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/spacecapsule/AppSpaceCapsuleController.java @@ -36,7 +36,7 @@ public class AppSpaceCapsuleController { @GetMapping("/page") @Operation(summary = "获得太空舱分页") public CommonResult> getSpaceCapsulePage(@Valid SpaceCapsulePageReqVO pageReqVO) { - PageResult pageResult = spaceCapsuleService.getSpaceCapsulePageApp(pageReqVO); + PageResult pageResult = spaceCapsuleService.getSpaceCapsulePage(pageReqVO); return success(BeanUtils.toBean(pageResult, SpaceCapsuleRespVO.class)); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/spacecapsule/SpaceCapsuleMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/spacecapsule/SpaceCapsuleMapper.java index 240954ff..477e2fdf 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/spacecapsule/SpaceCapsuleMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/spacecapsule/SpaceCapsuleMapper.java @@ -26,23 +26,4 @@ public interface SpaceCapsuleMapper extends BaseMapperX { .likeIfPresent(SpaceCapsuleDO::getSpaceName, reqVO.getSpaceName()) .orderByDesc(SpaceCapsuleDO::getId)); } - - /** - * 小程序过滤故障 ===>Status为2 - * @param reqVO - * @return - */ - default PageResult selectPageApp(SpaceCapsulePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(SpaceCapsuleDO::getPayNum, reqVO.getPayNum()) - .eqIfPresent(SpaceCapsuleDO::getMachineNum, reqVO.getMachineNum()) - .eqIfPresent(SpaceCapsuleDO::getStatus, reqVO.getStatus()) - .eqIfPresent(SpaceCapsuleDO::getCarteenId, reqVO.getCarteenId()) - .betweenIfPresent(SpaceCapsuleDO::getCreateTime, reqVO.getCreateTime()) - .eqIfPresent(SpaceCapsuleDO::getRemark, reqVO.getRemark()) - .likeIfPresent(SpaceCapsuleDO::getSpaceName, reqVO.getSpaceName()) - .ne(SpaceCapsuleDO::getStatus, 2) - .orderByDesc(SpaceCapsuleDO::getId)); - } - } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/PayMethodsEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/PayMethodsEnum.java new file mode 100644 index 00000000..d1395dee --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/PayMethodsEnum.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.member.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付渠道的编码的枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum PayMethodsEnum { + + WX_PUB("wx_pub", "微信 JSAPI 支付"), // 公众号网页 + WX_LITE("wx_lite", "微信小程序支付"), + WX_APP("wx_app", "微信 App 支付"), + WX_NATIVE("wx_native", "微信 Native 支付"), + WX_WAP("wx_wap", "微信 Wap 网站支付"), // H5 网页 + WX_BAR("wx_bar", "微信付款码支付"), + + ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付" ), + ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付"), + ALIPAY_APP("alipay_app", "支付宝App 支付"), + ALIPAY_QR("alipay_qr", "支付宝扫码支付"), + ALIPAY_BAR("alipay_bar", "支付宝条码支付"), + MOCK("mock", "模拟支付" ), + + WALLET("wallet", "钱包支付"); + + /** + * 编码 + * + * 参考 支付渠道属性值 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + + + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleEnum.java new file mode 100644 index 00000000..08d53506 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleEnum.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.member.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum SpaceCapsuleEnum { + //0使用中1空闲2故障3已预约 + SPACE_CAPSULE_ENUM_IN_USE(0,"使用中"), + SPACE_CAPSULE_ENUM_FREE_TIME(1,"空闲"), + SPACE_CAPSULE_ENUM_FAULT(2,"故障"), + SPACE_CAPSULE_ENUM_APPOINTMENT(3,"已预约"); + /** + * 编码 + */ + private final Integer code; + /** + * 类型 + */ + private final String name; + + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleOrderEnum.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleOrderEnum.java new file mode 100644 index 00000000..831825d9 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/enums/SpaceCapsuleOrderEnum.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.member.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum SpaceCapsuleOrderEnum { + + //0未使用1使用中2已完成3已退款 + SPACE_CAPSULE_ORDER_ENUM_UNUSED(0,"未使用"), + SPACE_CAPSULE_ORDER_ENUM_IN_USE(1,"使用中"), + SPACE_CAPSULE_ORDER_ENUM_DONE(2,"已完成"), + SPACE_CAPSULE_ORDER_ENUM_REFUNDED(3,"已退款"), + SPACE_CAPSULE_ORDER_ENUM_APPOINTMENT(4,"已预约"), + ; + + /** + * 编码 + */ + private final Integer code; + /** + * 类型 + */ + private final String name; + + + +} 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 747d38ab..0e9da5f4 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 @@ -4,14 +4,26 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsulePageReqVO; import cn.iocoder.yudao.module.member.controller.admin.orderspacecapsule.vo.OrderSpaceCapsuleSaveReqVO; import cn.iocoder.yudao.module.member.dal.dataobject.orderspacecapsule.OrderSpaceCapsuleDO; +import cn.iocoder.yudao.module.member.dal.dataobject.spacecapsule.SpaceCapsuleDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.orderspacecapsule.OrderSpaceCapsuleMapper; +import cn.iocoder.yudao.module.member.enums.CostTypeEnum; +import cn.iocoder.yudao.module.member.enums.PayMethodsEnum; +import cn.iocoder.yudao.module.member.enums.SpaceCapsuleEnum; +import cn.iocoder.yudao.module.member.enums.SpaceCapsuleOrderEnum; +import cn.iocoder.yudao.module.member.service.amount.DeductionService; +import cn.iocoder.yudao.module.member.service.spacecapsule.SpaceCapsuleService; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +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.time.LocalDateTime; +import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.ORDER_SPACE_CAPSULE_ERREO; import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.ORDER_SPACE_CAPSULE_NOT_EXISTS; /** @@ -25,25 +37,91 @@ public class OrderSpaceCapsuleServiceImpl implements OrderSpaceCapsuleService { @Resource private OrderSpaceCapsuleMapper orderSpaceCapsuleMapper; + @Resource + private DeductionService deductionService; + @Resource + private SpaceCapsuleService spaceCapsuleService; + @Resource + private MemberUserService userService; @Override + @Transactional(rollbackFor = Exception.class) public Long createOrderSpaceCapsule(OrderSpaceCapsuleSaveReqVO createReqVO) { - // 插入 + // 插入对象转换 OrderSpaceCapsuleDO orderSpaceCapsule = BeanUtils.toBean(createReqVO, OrderSpaceCapsuleDO.class); + + // 校验状态是否为未使用 + if (!SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_UNUSED.getCode().equals(orderSpaceCapsule.getStatus())) { + throw exception(ORDER_SPACE_CAPSULE_ERREO); + } + // 获取用户信息及余额 + MemberUserDO user = userService.getUser(orderSpaceCapsule.getUserId()); + BigDecimal initialMoney = user.getMoney(); + // 设置变动前的余额 + orderSpaceCapsule.setStartMoney(initialMoney); + // 扣除余额 + deductionService.deduct(orderSpaceCapsule.getUserId(), orderSpaceCapsule.getMoney(), CostTypeEnum.SHOPPING.getCode()); + // 设置变动后的余额 + orderSpaceCapsule.setEndMoney(initialMoney.subtract(orderSpaceCapsule.getMoney())); + // 设置支付方式 + orderSpaceCapsule.setPayMethods(PayMethodsEnum.WX_LITE.getName()); + // 插入订单数据 orderSpaceCapsuleMapper.insert(orderSpaceCapsule); - // 返回 + // 返回订单 ID return orderSpaceCapsule.getId(); } - @Override + @Transactional(rollbackFor = Exception.class) public void updateOrderSpaceCapsule(OrderSpaceCapsuleSaveReqVO updateReqVO) { // 校验存在 validateOrderSpaceCapsuleExists(updateReqVO.getId()); // 更新 OrderSpaceCapsuleDO updateObj = BeanUtils.toBean(updateReqVO, OrderSpaceCapsuleDO.class); + // 校验状态是否为不可用 + if (updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_UNUSED.getCode())) { + throw exception(ORDER_SPACE_CAPSULE_ERREO); + } + // 判断是否需要更新状态 + Integer currentStatus = orderSpaceCapsuleMapper.selectById(updateObj.getId()).getStatus(); + if (currentStatus.equals(updateObj.getStatus())) { + return; // 状态一致,无需更新 + } + // 获取太空舱信息 + SpaceCapsuleDO spaceCapsule = spaceCapsuleService.getSpaceCapsule(updateObj.getSpaceCapsuleId()); + // 根据新状态处理逻辑 + 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); + updateObj.setStatus(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_REFUNDED.getCode()); + updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_FREE_TIME.getCode()); + }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()); + }else if(updateObj.getStatus().equals(SpaceCapsuleOrderEnum.SPACE_CAPSULE_ORDER_ENUM_IN_USE.getCode())){ + updateObj.setOrderStartTime(LocalDateTime.now()); + updateSpaceCapsuleStatus(spaceCapsule, SpaceCapsuleEnum.SPACE_CAPSULE_ENUM_IN_USE.getCode()); + } + // 更新数据库 orderSpaceCapsuleMapper.updateById(updateObj); } + // 处理退款逻辑 + private void handleRefund(OrderSpaceCapsuleDO updateObj) { + MemberUserDO user = userService.getUser(updateObj.getUserId()); + BigDecimal startMoney = user.getMoney(); + // 进行余额退款 + deductionService.reduction(updateObj.getUserId(), updateObj.getMoney(), BigDecimal.ZERO, updateObj.getMoney(), BigDecimal.ZERO); + // 设置变动后的余额 + updateObj.setEndMoney(startMoney.add(updateObj.getMoney())); + } + + // 更新太空舱状态 + private void updateSpaceCapsuleStatus(SpaceCapsuleDO spaceCapsule, Integer newStatus) { + spaceCapsule.setStatus(newStatus); + spaceCapsuleService.updateSpaceCapsule(spaceCapsule); + } + @Override public void deleteOrderSpaceCapsule(Long id) { // 校验存在 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java index d3a43d5a..f1a4e650 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleService.java @@ -28,6 +28,7 @@ public interface SpaceCapsuleService { * @param updateReqVO 更新信息 */ void updateSpaceCapsule(@Valid SpaceCapsuleSaveReqVO updateReqVO); + void updateSpaceCapsule( SpaceCapsuleDO spaceCapsuleDO); /** * 删除太空舱 @@ -52,11 +53,4 @@ public interface SpaceCapsuleService { */ PageResult getSpaceCapsulePage(SpaceCapsulePageReqVO pageReqVO); - /** - * 过滤掉故障的 - * @param pageReqVO - * @return - */ - PageResult getSpaceCapsulePageApp(SpaceCapsulePageReqVO pageReqVO); - } \ 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/spacecapsule/SpaceCapsuleServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java index 914670c8..ccb54b21 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/spacecapsule/SpaceCapsuleServiceImpl.java @@ -42,6 +42,13 @@ public class SpaceCapsuleServiceImpl implements SpaceCapsuleService { spaceCapsuleMapper.updateById(updateObj); } + @Override + public void updateSpaceCapsule(SpaceCapsuleDO spaceCapsuleDO) { + // 校验存在 + validateSpaceCapsuleExists(spaceCapsuleDO.getId()); + spaceCapsuleMapper.updateById(spaceCapsuleDO); + } + @Override public void deleteSpaceCapsule(Long id) { // 校验存在 @@ -66,9 +73,4 @@ public class SpaceCapsuleServiceImpl implements SpaceCapsuleService { return spaceCapsuleMapper.selectPage(pageReqVO); } - @Override - public PageResult getSpaceCapsulePageApp(SpaceCapsulePageReqVO pageReqVO) { - return spaceCapsuleMapper.selectPageApp(pageReqVO); - } - } \ No newline at end of file