From de40c5a7d03ffe9bcdb2aabe82e03aef98e94eb8 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期四, 03 四月 2025 18:07:41 +0800 Subject: [PATCH] 订单部分 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 172 insertions(+), 4 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java index 6f7c2b4..173f41c 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java @@ -27,6 +27,7 @@ import com.ruoyi.order.mapper.OrderMapper; import com.ruoyi.order.model.Order; import com.ruoyi.order.model.OrderGood; +import com.ruoyi.order.service.OrderGoodService; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.util.ExpressDeliveryUtil; import com.ruoyi.order.util.payment.PaymentUtil; @@ -37,7 +38,10 @@ import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; +import com.ruoyi.other.api.vo.GetSeckillActivityInfo; +import com.ruoyi.system.api.domain.SysConfig; import com.ruoyi.system.api.domain.SysUser; +import com.ruoyi.system.api.feignClient.SysConfigClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; import lombok.SneakyThrows; @@ -98,6 +102,14 @@ @Resource private GoodsClient goodsClient; + @Resource + private SeckillActivityInfoClient seckillActivityInfoClient; + @Resource + private SysConfigClient sysConfigClient; + @Resource + private GoodsShopClient goodsShopClient; + @Resource + private OrderGoodService orderGoodService; @Resource private RedisTemplate redisTemplate; @@ -622,16 +634,172 @@ //用户信息 Long userid = tokenService.getLoginUserApplet().getUserid(); AppUser appUser = appUserClient.getAppUserById(userid); - //商品信息 + //获取商品信息 Goods good = goodsClient.getGoodsById(goodId).getData(); - if (null == good) { + if (null == good||good.getDelFlag()==1||good.getStatus()==0) { //商品不存在 + throw new ServiceException("商品不存在"); } - //店铺信息 + //查询店铺信息 - //计算价格信息 + GoodsShop shop = goodsShopClient.getGoodsShop(goodId).getData(); + System.out.println(shop); + if (null == shop){ + //门店不存在 + throw new ServiceException("该商品门店不存在"); + } + //插入基础信息 + confirmOrderVo.setGoodId(goodId); + confirmOrderVo.setGoodName(good.getName()); + confirmOrderVo.setHomePicture(good.getHomePagePicture()); + confirmOrderVo.setNumber(1); + confirmOrderVo.setShopId(shop.getShopId()); + confirmOrderVo.setShopName(shop.getShopName()); + confirmOrderVo.setPurchaseLimitNum(good.getPurchaseLimit()); + confirmOrderVo.setOriginalPrice(good.getOriginalPrice()); + //todo 实时计算用户可用积分 + + confirmOrderVo.setResidualPoint(appUser.getAvailablePoint()); + //插入价格 + confirmOrderVo.setCash(good.getSellingPrice()); + confirmOrderVo.setPoint(good.getIntegral()); + + //计算活动价格信息 + Price price = getPrice(goodId, 1); + if (null != price) { + confirmOrderVo.setCash(price.getCash()); + confirmOrderVo.setOrderPoint(price.getPoint()); + confirmOrderVo.setEndTimeStamp(price.getEndTimeStamp()); + } + //判断是否是积分支付 + if (type == 1) {//现金 + confirmOrderVo.setOrderMoney(confirmOrderVo.getCash()); + //计算积分抵扣的金额 将积分转为金额,去掉小数 + BigDecimal deduction=getCashByPoint(confirmOrderVo.getResidualPoint()); + confirmOrderVo.setDeduction(deduction); + }else {//积分 + confirmOrderVo.setOrderPoint(good.getIntegral()); + } + //限购检查 + //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) + if(null == good.getPurchaseLimit() || -1 == good.getPurchaseLimit()){ + confirmOrderVo.setIsPurchaseLimit(false); + confirmOrderVo.setPurchaseLimitNum(-1); + }else{ + //todo 查当前用户的订单 + List<Order> orders = this.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); + List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); + int sum = 0; + if(!orderIds.isEmpty()){ + //关于该商品的订单 + List<OrderGood> orderGoodList = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().in(OrderGood::getOrderId, orderIds) + .eq(OrderGood::getGoodsId, good.getId()).eq(OrderGood::getDelFlag, 0)); + sum = orderGoodList.stream().mapToInt(OrderGood::getNum).sum(); + } + confirmOrderVo.setIsPurchaseLimit((1 + sum) > good.getPurchaseLimit()); + confirmOrderVo.setPurchaseLimitNum(good.getPurchaseLimit() - sum); + } return confirmOrderVo; } + /** + * 根据商品的价格配置体系获取商品当前的价格 + * @param goodsId + * @param type 1普通商品,2秒杀商品 + * @return + */ + public Price getPrice( Integer goodsId, Integer type){ + //判断是否有在秒杀活动时间中 + Price price = new Price(); + GetSeckillActivityInfo getSeckillActivityInfo = new GetSeckillActivityInfo(); + getSeckillActivityInfo.setGoodsId(goodsId); + GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(getSeckillActivityInfo).getData(); + //没有秒杀活动或者添加的普通商品则使用秒杀活动价格 + if(null == goodsSeckill || type == 1){ + return null; + } + //秒杀活动价格 + price.setCash(goodsSeckill.getSellingPrice()); + //计算对应积分 + price.setPoint(getPoint(price.getCash())); + price.setEndTimeStamp(goodsSeckill.getEndTime()); + return price; + } + /** + * 获取现金对应积分 + */ + public Integer getPoint(BigDecimal cash){ + if (cash == null || cash.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException("金额不能为null或负数"); + } + // 获取积分兑换比例配置 + R<SysConfig> info = sysConfigClient.getInfo(6L); + if (info == null || info.getData() == null) { + throw new RuntimeException("获取积分兑换比例配置失败"); + } + String configValue = info.getData().getConfigValue(); + if (StringUtils.isBlank(configValue)) { + throw new RuntimeException("积分兑换比例配置值为空"); + } + try { + // 使用BigDecimal处理比例,避免精度问题 + BigDecimal ratio = new BigDecimal(configValue.trim()); + if (ratio.compareTo(BigDecimal.ZERO) <= 0) { + throw new RuntimeException("积分兑换比例必须大于0"); + } + + // 计算积分并四舍五入取整 + return cash.multiply(ratio).intValue(); + + } catch (NumberFormatException e) { + throw new RuntimeException("积分兑换比例配置值格式错误", e); + } catch (ArithmeticException e) { + throw new RuntimeException("积分计算结果溢出", e); + } + + } + + /** + * 获取积分对应金额 + */ + public BigDecimal getCashByPoint(Integer point){ + // 参数校验 + if (point == null || point < 0) { + throw new IllegalArgumentException("积分值不能为null或负数"); + } + + // 特殊情况:0积分直接返回0金额 + if (point == 0) { + return BigDecimal.ZERO.setScale(2); + } + + // 获取积分兑换比例配置 + R<SysConfig> info = sysConfigClient.getInfo(6L); + if (info == null || info.getData() == null) { + throw new RuntimeException("获取积分兑换比例配置失败"); + } + + String configValue = info.getData().getConfigValue(); // 示例:"100" 表示 100积分=1元 + if (StringUtils.isBlank(configValue)) { + throw new RuntimeException("积分兑换比例配置值为空"); + } + + try { + // 解析兑换比例(转换为BigDecimal保证精度) + BigDecimal exchangeRate = new BigDecimal(configValue.trim()); + if (exchangeRate.compareTo(BigDecimal.ZERO) <= 0) { + throw new RuntimeException("积分兑换比例必须为正数"); + } + + // 高精度计算(积分/比例) + return new BigDecimal(point) + .divide(exchangeRate, 2, RoundingMode.HALF_UP); + + } catch (NumberFormatException e) { + throw new RuntimeException("积分兑换比例配置值格式错误,应为数字", e); + } catch (ArithmeticException e) { + throw new RuntimeException("积分计算错误", e); + } + } } -- Gitblit v1.7.1