太空舱订单逻辑处理

This commit is contained in:
qjq
2024-11-01 10:15:20 +08:00
parent 75d5f513d5
commit 3ed04be004
10 changed files with 190 additions and 40 deletions

View File

@ -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, "超市营业统计不存在");
}

View File

@ -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;
}

View File

@ -36,7 +36,7 @@ public class AppSpaceCapsuleController {
@GetMapping("/page")
@Operation(summary = "获得太空舱分页")
public CommonResult<PageResult<SpaceCapsuleRespVO>> getSpaceCapsulePage(@Valid SpaceCapsulePageReqVO pageReqVO) {
PageResult<SpaceCapsuleDO> pageResult = spaceCapsuleService.getSpaceCapsulePageApp(pageReqVO);
PageResult<SpaceCapsuleDO> pageResult = spaceCapsuleService.getSpaceCapsulePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, SpaceCapsuleRespVO.class));
}

View File

@ -26,23 +26,4 @@ public interface SpaceCapsuleMapper extends BaseMapperX<SpaceCapsuleDO> {
.likeIfPresent(SpaceCapsuleDO::getSpaceName, reqVO.getSpaceName())
.orderByDesc(SpaceCapsuleDO::getId));
}
/**
* 小程序过滤故障 ===>Status为2
* @param reqVO
* @return
*/
default PageResult<SpaceCapsuleDO> selectPageApp(SpaceCapsulePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SpaceCapsuleDO>()
.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));
}
}

View File

@ -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", "钱包支付");
/**
* 编码
*
* 参考 <a href="https://www.pingxx.com/api/支付渠道属性值.html">支付渠道属性值</a>
*/
private final String code;
/**
* 名字
*/
private final String name;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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) {
// 校验存在

View File

@ -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<SpaceCapsuleDO> getSpaceCapsulePage(SpaceCapsulePageReqVO pageReqVO);
/**
* 过滤掉故障的
* @param pageReqVO
* @return
*/
PageResult<SpaceCapsuleDO> getSpaceCapsulePageApp(SpaceCapsulePageReqVO pageReqVO);
}

View File

@ -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<SpaceCapsuleDO> getSpaceCapsulePageApp(SpaceCapsulePageReqVO pageReqVO) {
return spaceCapsuleMapper.selectPageApp(pageReqVO);
}
}