砍价详情增加 判断可以立即出手字段

This commit is contained in:
Jack 2025-11-01 16:49:39 +08:00
parent 6acf94acb5
commit abfefb6f57
2 changed files with 83 additions and 25 deletions

View File

@ -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<ShopActivityCutpriceMapper, ShopActivityCutprice> implements ShopActivityCutpriceService {
@ -320,6 +323,20 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl<ShopActivit
// activity_row.put("activity_endtime", Convert.toDate(time));
// }
// 界面做一个简单的底价验证
boolean canBuyNow = cutprice_row != null
&& CheckUtil.isNotEmpty(cutprice_row.getAc_sale_price())
&& CheckUtil.isNotEmpty(cutprice_row.getAc_mix_limit_price())
&& NumberUtil.isLessOrEqual(cutprice_row.getAc_sale_price(), cutprice_row.getAc_mix_limit_price());
BigDecimal subtractPrice = NumberUtil.sub(cutprice_row.getAc_sale_price(), cutprice_row.getAc_mix_limit_price());
// 能否立即出手 1-可以2-不可以
activity_row.put("can_buy_now", canBuyNow ? CommonConstant.Enable : CommonConstant.Disable2);
activity_row.put("cannot_buy_now_reason",
canBuyNow ? "恭喜您,商品可以立即出手了。" :
String.format("还剩%.2f元到达商品底价,请继续加油!", subtractPrice));
return activity_row;
}
@ -399,7 +416,7 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl<ShopActivit
}
/**
* 砍价活动是否可以下单
* 砍价活动是否符合立即下单了
*
* @param activity_id 活动 Id
* @param order_user_id 下单用户
@ -408,31 +425,72 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl<ShopActivit
* 1活动是否过期
* 2活动是否是下单用户的
* 3活动是否是砍到最低价
* @return
* @return Pair<Boolean, String> 第一个值表示是否可以下单第二个值是相关信息或错误信息
*/
@Override
public Pair<Boolean, String> canDoOrderCutPriceActivity(Integer activity_id, Integer order_user_id) {
QueryWrapper<ShopStoreActivityBase> 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<ShopActivityCutprice> 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<ShopStoreActivityBase> 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<ShopActivityCutprice> 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<ShopActivityCutpriceHistory> queryWrapperHistory = new QueryWrapper<>();
queryWrapperHistory.eq("ac_id", shopActivityCutprice.getAc_id());
queryWrapperHistory.eq("activity_id", shopActivityCutprice.getActivity_id());
List<ShopActivityCutpriceHistory> 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._("系统繁忙,请稍后再试。"));
}
}
}

View File

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