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 8d7460be..6c97c0f4 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 @@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.api.StateCode; +import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.domain.UserDto; import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.exception.ApiUserException; @@ -33,6 +34,7 @@ import com.suisung.mall.shop.activity.service.ShopActivityGroupbookingHistorySer import com.suisung.mall.shop.activity.service.ShopActivityGroupbookingService; import com.suisung.mall.shop.base.service.AccountBaseConfigService; import com.suisung.mall.shop.store.service.ShopStoreActivityBaseService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.data.util.Pair; @@ -55,6 +57,7 @@ import static com.suisung.mall.common.utils.ContextUtil.getCurrentUser; * @author Xinze * @since 2021-07-12 */ +@Slf4j @Service public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl implements ShopActivityCutpriceService { @@ -320,6 +323,20 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl 第一个值表示是否可以下单,第二个值是相关信息或错误信息 */ @Override public Pair canDoOrderCutPriceActivity(Integer activity_id, Integer order_user_id) { - QueryWrapper params = new QueryWrapper<>(); - params.eq("activity_id", activity_id); - ShopStoreActivityBase storeActivityBase = shopStoreActivityBaseService.getOne(params); - if (storeActivityBase == null) { - return Pair.of(false, I18nUtil._("该活动不存在!")); - } + try { + // 参数校验 + if (activity_id == null || activity_id <= 0) { + return Pair.of(false, I18nUtil._("活动ID无效。")); + } - if (!shopStoreActivityBaseService.isActivityTimeValid(storeActivityBase.getActivity_starttime(), storeActivityBase.getActivity_endtime())) { - return Pair.of(false, I18nUtil._("该活动已过期!")); - } + if (order_user_id == null || order_user_id <= 0) { + return Pair.of(false, I18nUtil._("用户ID无效。")); + } - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("activity_id", activity_id); - queryWrapper.eq("user_id", order_user_id); - queryWrapper.orderByDesc("ac_id"); - ShopActivityCutprice shopActivityCutprice = getOne(queryWrapper); - if (shopActivityCutprice == null) { - return Pair.of(false, I18nUtil._("未找到用户发起的砍价活动!")); - } + // 1. 检查活动是否存在 + QueryWrapper params = new QueryWrapper<>(); + params.eq("activity_id", activity_id); + ShopStoreActivityBase storeActivityBase = shopStoreActivityBaseService.getOne(params); + if (storeActivityBase == null) { + return Pair.of(false, I18nUtil._("抱歉,系统未找到活动记录。")); + } - return null; + // 2. 检查活动是否在有效期内 + if (!shopStoreActivityBaseService.isActivityTimeValid(storeActivityBase.getActivity_starttime(), storeActivityBase.getActivity_endtime())) { + return Pair.of(false, I18nUtil._("该活动已过期,请检查。")); + } + + // 3. 检查用户是否有发起的砍价记录 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("activity_id", activity_id); + queryWrapper.eq("user_id", order_user_id); + queryWrapper.orderByDesc("ac_id"); + ShopActivityCutprice shopActivityCutprice = getOne(queryWrapper); + if (shopActivityCutprice == null) { + return Pair.of(false, I18nUtil._("系统未找到您发起的砍价记录。")); + } + + // 4. 检查是否已砍到最低价 + // 砍价底价 + BigDecimal mixSalePrice = shopActivityCutprice.getAc_mix_limit_price(); + // 当前最终被砍价后的最新价格 + BigDecimal currPrice = shopActivityCutprice.getAc_sale_price(); + + // 还剩多少到底价 = 当前价格 - 活动底价 + BigDecimal subPrice = NumberUtil.sub(currPrice, mixSalePrice); + // 当前价格已经等于或低于底价,可以立即出手下单 + if (NumberUtil.isGreater(subPrice, BigDecimal.ZERO)) { + return Pair.of(false, String.format(I18nUtil._("还剩%.2f元可达活动底价,请继续加油。"), subPrice)); + } + // 5. 检查是否存在砍价历史记录 + QueryWrapper queryWrapperHistory = new QueryWrapper<>(); + queryWrapperHistory.eq("ac_id", shopActivityCutprice.getAc_id()); + queryWrapperHistory.eq("activity_id", shopActivityCutprice.getActivity_id()); + List shopActivityCutpriceHistoryList = shopActivityCutpriceHistoryService.list(queryWrapperHistory); + if (CollUtil.isEmpty(shopActivityCutpriceHistoryList)) { + return Pair.of(false, I18nUtil._("未找到砍价记录,请检查")); + } + + // 所有条件都满足,可以下单 + return Pair.of(true, ""); + } catch (Exception e) { + // 异常处理,防止影响主流程 + log.error("检查砍价活动是否可下单时发生异常,activity_id={}, order_user_id={}", activity_id, order_user_id, e); + return Pair.of(false, I18nUtil._("系统繁忙,请稍后再试。")); + } } + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java index 8ba50cb9..bc45b8ad 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/listener/OrderPayedListener.java @@ -189,11 +189,11 @@ public class OrderPayedListener { // 同城配送或普通快递,都发送 unipush 推送:您有一个新的[同城][预约]订单,请及时拣货配送[请及时查看预约订单]。 String bookingTip = isBookingOrder ? "预约" : ""; - String bookingTiP2 = isBookingOrder ? "请及时查看预约订单。" : "请及时拣货配送。"; - - String orderType = orderInfoOld.getDelivery_type_id() == StateCode.DELIVERY_TYPE_SAME_CITY ? "同城" + bookingTip : bookingTip; - String title = String.format("您有一笔新的%s订单,%s", orderType, bookingTiP2); - String content = String.format("这笔新的%s订单:%s,用户于%s下的单,%s", orderType, orderId, DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"), bookingTiP2); + String actionTip = isBookingOrder ? "请及时检查预约订单信息" : "请及时拣货配送"; + String orderType = (orderInfoOld.getDelivery_type_id() == StateCode.DELIVERY_TYPE_SAME_CITY ? "同城" : "") + bookingTip; + String title = String.format("您有一笔新的%s订单,%s。", orderType, actionTip); + String content = String.format("这笔新的%s订单:%s,用户于%s下的单,%s。", orderType, orderId, + DateTimeUtils.formatDateTime(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"), actionTip); JSONObject payload = new JSONObject(); payload.put("category", CommonConstant.PUSH_MSG_CATE_MCH_ONLINE_ORDER_LIST); payload.put("orderId", orderId);