Compare commits

...

4 Commits

Author SHA1 Message Date
c91fc181c9 活动逻辑处理 2025-10-31 16:05:08 +08:00
002baf3ffd Merge remote-tracking branch 'origin/main' 2025-10-31 16:04:01 +08:00
3aef824fbe Merge remote-tracking branch 'origin/main' 2025-10-31 09:41:50 +08:00
a7f2a7ac14 调整了打票机 订单商品间距 2025-10-31 08:55:15 +08:00
5 changed files with 108 additions and 5 deletions

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.activity.ShopActivityCutprice;
import com.suisung.mall.core.web.service.IBaseService;
import org.springframework.data.util.Pair;
import java.util.Map;
@ -28,4 +29,13 @@ public interface ShopActivityCutpriceService extends IBaseService<ShopActivityCu
CommonResult doCutPrice(Integer ac_id, Integer user_id);
/**
* 砍价活动是否可以下单
*
* @param ac_id 活动 自增Id
* @param order_user_id 下单用户
* @return
*/
Pair<Boolean, String> canDoOrderCutPriceActivity(Integer ac_id, Integer order_user_id);
}

View File

@ -35,6 +35,7 @@ import com.suisung.mall.shop.base.service.AccountBaseConfigService;
import com.suisung.mall.shop.store.service.ShopStoreActivityBaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -397,4 +398,41 @@ public class ShopActivityCutpriceServiceImpl extends BaseServiceImpl<ShopActivit
return CommonResult.success(ach_data);
}
/**
* 砍价活动是否可以下单
*
* @param activity_id 活动 Id
* @param order_user_id 下单用户
* <p>
* 判断逻辑
* 1活动是否过期
* 2活动是否是下单用户的
* 3活动是否是砍到最低价
* @return
*/
@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._("该活动不存在!"));
}
if (!shopStoreActivityBaseService.isActivityTimeValid(storeActivityBase.getActivity_starttime(), storeActivityBase.getActivity_endtime())) {
return Pair.of(false, I18nUtil._("该活动已过期!"));
}
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._("未找到用户发起的砍价活动!"));
}
return null;
}
}

View File

@ -1155,13 +1155,13 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
}
// 时间槽间隔分钟
int slotInterval = 30;
int slotInterval = 15;
// 对于今天需要特殊处理第二个时间槽从当前时间+50分钟开始
Date startTime = openTime;
if (isToday) {
// 当前时间+50分钟作为第二个时间槽的开始时间
Date nowPlusFifty = DateUtil.offsetMinute(new Date(), 50);
Date nowPlusFifty = DateUtil.offsetMinute(new Date(), 35);
// 如果当前时间+50分钟在营业时间范围内则从该时间开始
if (nowPlusFifty.after(openTime) && nowPlusFifty.before(closeTime)) {

View File

@ -10,6 +10,7 @@ import com.suisung.mall.core.web.service.IBaseService;
import com.suisung.mall.shop.product.pojo.vo.ProductVo;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -58,6 +59,15 @@ public interface ShopStoreActivityBaseService extends IBaseService<ShopStoreActi
List<Long> getActivityAllItemIds(Map activity_row);
boolean isActivityTimeValid(Map activity_row);
/**
* 验证活动时间是否有效
*
* @param starTime 活动开始时间
* @param endTime 活动结束时间
* @return 时间是否有效
*/
boolean isActivityTimeValid(Date starTime, Date endTime);
Map listsMarketing();
@ -169,4 +179,6 @@ public interface ShopStoreActivityBaseService extends IBaseService<ShopStoreActi
* @return
*/
Map getGiftbag(Integer activity_id);
}

View File

@ -2055,6 +2055,7 @@ public class ShopStoreActivityBaseServiceImpl extends BaseServiceImpl<ShopStoreA
* @param activityRow 活动数据
* @return 时间是否有效
*/
@Override
public boolean isActivityTimeValid(Map activityRow) {
if (CollUtil.isEmpty(activityRow)) {
return false;
@ -2078,6 +2079,23 @@ public class ShopStoreActivityBaseServiceImpl extends BaseServiceImpl<ShopStoreA
return !now.before(startTime) && !now.after(endTime);
}
/**
* 验证活动时间是否有效
*
* @param starTime 活动开始时间
* @param endTime 活动结束时间
* @return 时间是否有效
*/
@Override
public boolean isActivityTimeValid(Date starTime, Date endTime) {
if (starTime == null || endTime == null) {
return false;
}
Date now = new Date();
return !now.before(starTime) && !now.after(endTime);
}
@Override
public Map listsMarketing() {
Integer page = Convert.toInt(getParameter("page"), 1);
@ -3983,43 +4001,68 @@ public class ShopStoreActivityBaseServiceImpl extends BaseServiceImpl<ShopStoreA
return item_row;
}
/**
* 计算砍价活动中每次砍价的价格
*
* @param activity_row 活动基础信息
* @param ac_row 砍价活动记录
* @return 砍价金额
*/
@Override
public BigDecimal getCutDownPrice(ShopStoreActivityBase activity_row, ShopActivityCutprice ac_row) {
// 1. 参数校验
if (activity_row == null || ac_row == null) {
throw new ApiException(I18nUtil._("活动不存在!"));
}
// 2. 活动类型校验
Integer activity_type_id = activity_row.getActivity_type_id();
if (ObjectUtil.notEqual(StateCode.ACTIVITY_TYPE_CUTPRICE, activity_type_id)) {
throw new ApiException(I18nUtil._("活动不存在!"));
}
BigDecimal price = BigDecimal.ZERO;
BigDecimal price;
// 3. 解析活动规则
String str_activity_rule = activity_row.getActivity_rule();
JSONObject activity_rule = JSONObject.parseObject(str_activity_rule);
Integer cut_down_type = activity_rule.getObject("cut_down_type", Integer.class);
BigDecimal ac_sale_price = ac_row.getAc_sale_price();
BigDecimal ac_mix_limit_price = ac_row.getAc_mix_limit_price();
// 4. 根据砍价类型计算砍价金额
switch (cut_down_type) {
case 1:
// 固定金额砍价
price = activity_rule.getObject("cut_down_fixed_price", BigDecimal.class);
break;
case 2:
// 随机金额砍价
BigDecimal cut_down_min_limit_price = activity_rule.getObject("cut_down_min_limit_price", BigDecimal.class);
Integer cut_down_user_num = activity_rule.getObject("cut_down_user_num", Integer.class);
Integer ac_num = ac_row.getAc_num();
List<Integer> arr = randMoney(NumberUtil.sub(ac_sale_price, cut_down_min_limit_price), cut_down_user_num - ac_num);
Integer randPrice = arr.size() == 1 ? arr.get(0) : arr.get(RandomUtil.randomInt(0, arr.size() - 1));
// 计算剩余可砍价金额和剩余次数
List<Integer> arr = randMoney(
NumberUtil.sub(ac_sale_price, cut_down_min_limit_price),
cut_down_user_num - ac_num
);
// 随机选择一个砍价金额
Integer randPrice = arr.size() == 1 ? arr.get(0) : arr.get(RandomUtil.randomInt(0, arr.size()));
price = NumberUtil.div(BigDecimal.valueOf(randPrice), 100, 2);
break;
default:
// 未知砍价类型返回0
price = BigDecimal.ZERO;
break;
}
// 5. 返回砍价金额不超过可砍价的上限
return NumberUtil.min(NumberUtil.sub(ac_sale_price, ac_mix_limit_price), price);
}
@Override
public List<ShopStoreActivityBase> getCouponsList(Integer activity_type_id) {
QueryWrapper<ShopStoreActivityBase> wrapper = new QueryWrapper<>();