|
|
@@ -22,15 +22,22 @@ import com.sqx.modules.activity.entity.Activity;
|
|
|
import com.sqx.modules.activity.entity.ActivityShop;
|
|
|
import com.sqx.modules.activity.enums.ActivityTypeEnum;
|
|
|
import com.sqx.modules.activity.enums.FullActivityTypeEnum;
|
|
|
+import com.sqx.modules.activity.service.ActivityGoodsService;
|
|
|
import com.sqx.modules.activity.service.ActivityService;
|
|
|
import com.sqx.modules.activity.service.ActivityShopService;
|
|
|
import com.sqx.modules.activity.util.ActivityUtil;
|
|
|
import com.sqx.modules.activity.vo.ActivityVO;
|
|
|
+import com.sqx.modules.activity.vo.GoodsActivityVO;
|
|
|
+import com.sqx.modules.activity.vo.OrderSuitActivityVO;
|
|
|
+import com.sqx.modules.order.entity.OrderGoods;
|
|
|
+import com.sqx.modules.order.entity.TbOrder;
|
|
|
+import com.sqx.modules.order.service.AppOrderService;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.time.format.DateTimeFormatter;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -45,11 +52,8 @@ import java.util.stream.Collectors;
|
|
|
public class ActivityServiceImpl extends ServiceImpl<ActivityDao, Activity> implements ActivityService {
|
|
|
|
|
|
private final ActivityShopService activityShopService;
|
|
|
-
|
|
|
- /**
|
|
|
- * 时间格式 HH:mm
|
|
|
- */
|
|
|
- private static final DateTimeFormatter TIME_DTF = DateTimeFormatter.ofPattern("HH:mm");
|
|
|
+ private final ActivityGoodsService activityGoodsService;
|
|
|
+ private final AppOrderService orderService;
|
|
|
|
|
|
@Override
|
|
|
public ActivityVO getActivityById(Long id) {
|
|
|
@@ -155,6 +159,78 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityDao, Activity> impl
|
|
|
removeByIds(activityIds);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<OrderSuitActivityVO> getOrderSuitActivity(Long orderId) {
|
|
|
+ TbOrder order = orderService.getById(orderId);
|
|
|
+ if (ObjectUtil.isNull(order)) {
|
|
|
+ throw new SqxException("无效的订单id");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderGoods> orderGoodsList = orderService.getOrderGoods(orderId);
|
|
|
+ if (CollUtil.isEmpty(orderGoodsList)) {
|
|
|
+ throw new SqxException("订单数据异常,请联系管理员");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Long> goodsIds = orderGoodsList.stream().map(OrderGoods::getGoodsId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 获取当前订单内的商品符合的条件的活动
|
|
|
+ List<GoodsActivityVO> goodsActivityVOList = activityGoodsService.getActivityListByGoodsId(goodsIds);
|
|
|
+
|
|
|
+ // 计算各活动优惠价格
|
|
|
+ return goodsActivityVOList.stream()
|
|
|
+ .map(e -> {
|
|
|
+ String type = e.getType();
|
|
|
+ List<Long> curGoodsIds = e.getGoodsIds();
|
|
|
+
|
|
|
+ // 当前商品总价
|
|
|
+ double curGoodsTotalPrice = orderGoodsList.stream()
|
|
|
+ .filter(orderGoods -> curGoodsIds.contains(orderGoods.getGoodsId()))
|
|
|
+ .mapToDouble(orderGoods ->
|
|
|
+ orderGoods.getGoodsPrice().multiply(new BigDecimal(orderGoods.getGoodsNum().toString()))
|
|
|
+ .doubleValue())
|
|
|
+ .sum();
|
|
|
+
|
|
|
+ // 优惠金额
|
|
|
+ double discountAmount = 0.0;
|
|
|
+
|
|
|
+ // 计算活动优惠金额
|
|
|
+ if (ActivityTypeEnum.TIME.getTypeCode().equals(type)) {
|
|
|
+ ActivityOfTimeIntervalDTO curTimeTimeActivity = ActivityUtil.getCurTimeTimeActivity(e.getTimeIntervalInfos());
|
|
|
+ Double discountContent = curTimeTimeActivity.getDiscountContent();
|
|
|
+
|
|
|
+ discountAmount = curGoodsTotalPrice - (curGoodsTotalPrice * discountContent);
|
|
|
+ } else if (ActivityTypeEnum.FULL.getTypeCode().equals(type)) {
|
|
|
+ ActivityOfFullReductionDTO fullReductionInfo = e.getFullReductionInfo();
|
|
|
+
|
|
|
+ if (FullActivityTypeEnum.DISCOUNT.getTypeCode().equals(fullReductionInfo.getType())) {
|
|
|
+ discountAmount = curGoodsTotalPrice - (curGoodsTotalPrice * fullReductionInfo.getDiscountContent());
|
|
|
+ } else {
|
|
|
+ Double discountContent = fullReductionInfo.getDiscountContent();
|
|
|
+
|
|
|
+ // 如果满减金额大于当前商品的总金额,则优惠金额为当前商品的总金额,否则优惠金额为当前配置的金额
|
|
|
+ if (discountContent > curGoodsTotalPrice) {
|
|
|
+ discountAmount = curGoodsTotalPrice;
|
|
|
+ } else {
|
|
|
+ discountAmount = discountContent;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (ActivityTypeEnum.GLOBAL.getTypeCode().equals(type)) {
|
|
|
+ ActivityOfGlobalDiscountDTO globalDiscountsInfo = e.getGlobalDiscountsInfo();
|
|
|
+
|
|
|
+ discountAmount = curGoodsTotalPrice - (curGoodsTotalPrice * globalDiscountsInfo.getDiscountRate());
|
|
|
+ }
|
|
|
+
|
|
|
+ OrderSuitActivityVO vo = new OrderSuitActivityVO();
|
|
|
+ vo.setActivityId(e.getId());
|
|
|
+ vo.setActivityTitle(e.getTitle());
|
|
|
+ vo.setActivityType(type);
|
|
|
+ vo.setDiscountAmount(discountAmount);
|
|
|
+ return vo;
|
|
|
+ })
|
|
|
+ .sorted(Comparator.comparing(OrderSuitActivityVO::getDiscountAmount))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据id获取活动信息
|
|
|
* 如id对应记录不存在,则抛出数据不存在异常
|
|
|
@@ -265,8 +341,8 @@ public class ActivityServiceImpl extends ServiceImpl<ActivityDao, Activity> impl
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- TIME_DTF.parse(timeIntervalInfo.getStartTime());
|
|
|
- TIME_DTF.parse(timeIntervalInfo.getEndTime());
|
|
|
+ MyConstant.TIME_DTF.parse(timeIntervalInfo.getStartTime());
|
|
|
+ MyConstant.TIME_DTF.parse(timeIntervalInfo.getEndTime());
|
|
|
} catch (Exception e) {
|
|
|
throw new SqxException("时间格式有误,startTime和endTime格式应为HH:mm");
|
|
|
}
|