From 19756ee7e3c8282e53e20016d6ce7bb86780ac55 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Sat, 8 Nov 2025 00:46:34 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A0=8D=E4=BB=B7=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/common/constant/CommonConstant.java | 6 +- .../activity/ShopActivityCutprice.java | 3 + .../service/ShopActivityCutpriceService.java | 8 + .../impl/ShopActivityCutpriceServiceImpl.java | 183 +++++++++++++----- 4 files changed, 154 insertions(+), 46 deletions(-) diff --git a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java index d5f40048..58e7f635 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java +++ b/mall-common/src/main/java/com/suisung/mall/common/constant/CommonConstant.java @@ -137,10 +137,14 @@ public class CommonConstant { //3-开业(活动)筹备中; public final static Integer Store_Biz_State_PreActivity = 3; - //用户砍价订单状态:1-砍价已完成下单;2-砍价未下单已取消;3-砍价助力进行中;4-砍价过期失效;6-砍价助力已完成待下单; + //用户砍价订单状态:1-砍价已完成下单; public static final Integer CutPrice_Order_State_Finished = 1; + //2-砍价未下单已取消; public static final Integer CutPrice_Order_State_Canceled = 2; + //3-砍价助力进行中; public static final Integer CutPrice_Order_State_ING = 3; + //4-砍价过期失效; public static final Integer CutPrice_Order_State_Expired = 4; + //6-砍价助力已完成待下单; public static final Integer CutPrice_Order_State_CutFinished = 6; } diff --git a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java index a385fb36..4c349501 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java +++ b/mall-common/src/main/java/com/suisung/mall/common/modules/activity/ShopActivityCutprice.java @@ -66,4 +66,7 @@ public class ShopActivityCutprice implements Serializable { @ApiModelProperty(value = "乐观锁") private Integer version; + @ApiModelProperty(value = "更新时间") + private Date updated_at; + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java index 9f3b2260..8956404d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/ShopActivityCutpriceService.java @@ -49,4 +49,12 @@ public interface ShopActivityCutpriceService extends IBaseService checkCutPriceExpiredAndStock(ShopStoreActivityBase shopStoreActivityBase); + /** + * 修改某个砍价订单状态 + * + * @param ac_id 活动自增Id + * @param state 状态 + * @return + */ + Boolean updateCutPriceState(Integer ac_id, Integer state); } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java index 50e8cbb1..70fed059 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/activity/service/impl/ShopActivityCutpriceServiceImpl.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.StateCode; @@ -259,6 +260,7 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl check_result = checkCutPriceExpiredAndStock(activityBase); + if (!check_result.getFirst()) { + throw new ApiException(check_result.getSecond()); + } cutprice_row = new ShopActivityCutprice(); @@ -378,87 +384,114 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 0 && cut_num >= num) { - throw new ApiException(I18nUtil._("今日帮砍次数已用完!")); + return CommonResult.failed(I18nUtil._("今日帮砍次数已用完!")); } } - BigDecimal ac_sale_price = cutprice_row.getAc_sale_price(); - BigDecimal ac_mix_limit_price = cutprice_row.getAc_mix_limit_price(); + BigDecimal ac_sale_price = shopActivityCutprice.getAc_sale_price(); + BigDecimal ac_mix_limit_price = shopActivityCutprice.getAc_mix_limit_price(); + + // 检查价格数据是否完整 + if (ac_sale_price == null || ac_mix_limit_price == null) { + return CommonResult.failed(I18nUtil._("价格数据异常!")); + } // 检查是否已达到最低价 - if (ac_sale_price == null || ac_mix_limit_price == null) { - throw new ApiException(I18nUtil._("价格数据异常!")); + if (NumberUtil.isLessOrEqual(ac_sale_price, ac_mix_limit_price)) { + return CommonResult.failed(I18nUtil._("已达到最低价!")); } - if (ObjectUtil.compare(ac_sale_price, ac_mix_limit_price) <= 0) { - throw new ApiException(I18nUtil._("已达到最低价!")); - } - Integer activity_id = cutprice_row.getActivity_id(); - ShopStoreActivityBase storeActivityBase = shopStoreActivityBaseService.get(activity_id); - if (storeActivityBase == null) { - throw new ApiException(I18nUtil._("未找到活动信息!")); - } - - // 检查活动是否有效 - if (!shopStoreActivityBaseService.isActivityTimeValid(Convert.toMap(String.class, Object.class, storeActivityBase))) { - throw new ApiException(I18nUtil._("该活动不存在或已过期!")); - } - - // 检查是否已经帮过好友砍了价? + // 检查是否已经帮过好友砍了价 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", user_id).eq("ac_id", ac_id); long ach_num = shopActivityCutpriceHistoryService.count(queryWrapper); if (ach_num > 0) { - throw new ApiException(I18nUtil._("已经帮过好友砍了价!")); + return CommonResult.failed(I18nUtil._("已经帮好友砍过价!")); } // 计算砍价金额 - BigDecimal cut_price = shopStoreActivityBaseService.getCutDownPrice(storeActivityBase, cutprice_row); + BigDecimal cut_price = shopStoreActivityBaseService.getCutDownPrice(shopStoreActivityBase, shopActivityCutprice); if (cut_price == null || cut_price.compareTo(BigDecimal.ZERO) <= 0) { - throw new ApiException(I18nUtil._("砍价失败!")); + return CommonResult.failed(I18nUtil._("砍价失败!")); } // 获取商品ID - String str_activity_rule = storeActivityBase.getActivity_rule(); + String str_activity_rule = shopStoreActivityBase.getActivity_rule(); if (StrUtil.isBlank(str_activity_rule)) { - throw new ApiException(I18nUtil._("活动规则数据异常!")); + return CommonResult.failed(I18nUtil._("活动规则数据异常!")); } JSONObject activity_rule = JSONUtil.parseObj(str_activity_rule); Long item_id = activity_rule.get("item_id", Long.class); if (item_id == null) { - throw new ApiException(I18nUtil._("未找到商品信息!")); + return CommonResult.failed(I18nUtil._("未找到商品信息!")); } // 创建砍价历史记录 @@ -476,14 +509,14 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl checkCutPriceExpiredAndStock(ShopStoreActivityBase shopStoreActivityBase) { - - boolean isActivityTimeValid = shopStoreActivityBaseService.isActivityTimeValid(shopStoreActivityBase.getActivity_starttime(), shopStoreActivityBase.getActivity_endtime(), new Date()); - if (!isActivityTimeValid) { - return Pair.of(false, I18nUtil._("该活动已过期,下次早点来。")); + // 参数校验 + if (shopStoreActivityBase == null) { + return Pair.of(false, I18nUtil._("活动信息不能为空")); } + // 检查活动是否过期 + boolean isActivityTimeValid = shopStoreActivityBaseService.isActivityTimeValid( + shopStoreActivityBase.getActivity_starttime(), + shopStoreActivityBase.getActivity_endtime(), + new Date() + ); + if (!isActivityTimeValid) { + return Pair.of(false, I18nUtil._("该活动已过期,下次早点来!")); + } - return null; + // 检查活动商品库存 + Integer productCount = shopStoreActivityBase.getProduct_count(); + if (CheckUtil.isEmpty(productCount) || productCount <= 0) { + return Pair.of(false, I18nUtil._("活动商品库存不足,请稍后再来。")); + } + + // 查询已占用库存的砍价订单数量 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("activity_id", shopStoreActivityBase.getActivity_id()) + .in("state", Arrays.asList( + CommonConstant.CutPrice_Order_State_Finished, + CommonConstant.CutPrice_Order_State_CutFinished, + CommonConstant.CutPrice_Order_State_ING + )); + long recordCount = count(queryWrapper); + + // 判断库存是否充足(当已占用库存大于等于总库存时,表示库存不足) + if (recordCount >= productCount) { + return Pair.of(false, I18nUtil._("活动商品库存不足,请稍后再来。")); + } + + // 所有检查通过 + return Pair.of(true, ""); + } + + + /** + * 修改某个砍价订单状态 + * + * @param ac_id 活动自增Id + * @param state 状态 + * @return + */ + @Override + public Boolean updateCutPriceState(Integer ac_id, Integer state) { + // 参数校验 + if (ac_id == null || ac_id <= 0) { + return false; + } + if (state == null) { + return false; + } + + try { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("ac_id", ac_id); + updateWrapper.set("state", state); + return update(updateWrapper); + } catch (Exception e) { + log.error("更新砍价订单状态失败,ac_id={}, state={}", ac_id, state, e); + throw new ApiException(I18nUtil._("更新砍价订单状态失败")); + } }