Quellcode durchsuchen

百亿补贴商品

zoujiajian vor 2 Jahren
Ursprung
Commit
46eb03326c

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonSkuSubsidyMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsDonSkuSubsidy;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 12:04
+ */
+public interface GoodsDonSkuSubsidyMapper extends BaseMapper<GoodsDonSkuSubsidy> {
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -85,4 +85,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	UserOrderDetailView getNumOfTagFansUser(@Param("date") String date, @Param("tagIdStr") String tagIdStr, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
 	UserOrderDetailView getFansToDayOrdersView(@Param("tagIdStr") String tagIdStr, @Param("date") String date);
+
+	List<Long> getPayGoodsIds(@Param("userIds") List<Long> relationUserIdList);
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonSubsidyRelateMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDonSubsidyRelate;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonSubsidyRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 16:28
+ */
+public interface OrderDonSubsidyRelateMapper extends BaseMapper<OrderDonSubsidyRelate> {
+}

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSkuSubsidy.java

@@ -0,0 +1,36 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidy
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 11:42
+ * 商品补贴价格
+ */
+@Getter
+@Setter
+public class GoodsDonSkuSubsidy extends BaseEntity {
+	private Long goodsId;
+
+	@NotNull
+	private Long skuId;
+
+	/**
+	 * 补贴价格
+	 */
+	@NotNull
+	@Min(value = 0, message = "补贴价格不能小于0")
+	private BigDecimal price;
+
+	/**
+	 * true 存在
+	 */
+	private Boolean deleted;
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonSubsidyRelate.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonSubsidyRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 16:26
+ */
+@Getter
+@Setter
+public class OrderDonSubsidyRelate {
+	private Long subsidyId;
+
+	private Long orderId;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -160,4 +160,9 @@ public class OrderPayRequest {
      * 是否设备满减活动优惠
      */
     private Boolean isAcReduce;
+
+    /**
+     * 百亿补贴规格id
+     */
+    private Long subsidyId;
 }

+ 124 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuSubsidyDetailView.java

@@ -0,0 +1,124 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 14:53
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_sku_subsidy gs inner join goods_don_sku sku on sku.id = gs.sku_id",
+		where = "gs.deleted is true and sku.status is true",
+		orderBy = "sku.sorted asc")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class GoodsDonSkuSubsidyDetailView {
+
+	/**
+	 * 规格补贴id
+	 */
+	@DbField("gs.subsidy_id")
+	private Long subsidyId;
+
+	@DbField("gs.id")
+	private Long id;
+
+	@DbField("sku.goods_id")
+	private Long goodsId;
+
+
+	@DbField("sku.sub_title")
+	private String subTitle;
+
+	/**
+	 * 商品规格 ids
+	 */
+	@DbField("sku.spec_ids")
+	private String specIds;
+
+	/**
+	 * 商品规格 value
+	 */
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	/**
+	 * 商品规格 json
+	 */
+	@DbField("sku.spec_json")
+	private String specJson;
+
+	/**
+	 * 规格说明信息
+	 */
+	@DbField("sku.notify_text")
+	private String notifyText;
+
+	/**
+	 * H5标签
+	 */
+	@DbField("sku.mobile_tags")
+	private String mobileTags;
+
+	/**
+	 * 规格背景图
+	 */
+	@DbField("sku.img")
+	private String img;
+
+	/**
+	 * 规格框提示
+	 */
+	@DbField("sku.small_msg")
+	private String smallMsg;
+
+	/**
+	 * 商品预览图
+	 */
+	@DbField("sku.picture")
+	private String picture;
+
+	/**
+	 * 商品详情图
+	 */
+	@DbField("sku.detail")
+	private String detail;
+
+	/**
+	 * 标签
+	 */
+	@DbField("sku.tags")
+	private String tags;
+
+	/**
+	 * 价格
+	 */
+	@DbField("gs.price")
+	private BigDecimal price;
+
+	/**
+	 * 月数
+	 */
+	@DbField("sku.months")
+	private Integer months;
+
+	/**
+	 * 天数
+	 */
+	@DbField("sku.days")
+	private Integer days;
+
+	/**
+	 * 排序
+	 */
+	@DbField("sku.sorted")
+	private Integer sorted;
+}

+ 56 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuSubsidyFrontView.java

@@ -0,0 +1,56 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 14:18
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_sku_subsidy gs inner join goods_don_sku sku on gs.sku_id = sku.id inner join goods_don g on sku.goods_id = g.id",
+		where = "gs.deleted is true and sku.status is true and g.deleted is true"
+		, groupBy = "g.id,g.title,g.tags,g.virtual_sold",
+		orderBy = "g.sort_by asc, g.id")
+public class GoodsDonSkuSubsidyFrontView {
+	@DbField("g.id")
+	private Long id;
+
+	/**
+	 * 商品名称
+	 */
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * 标签
+	 */
+	@DbField("g.tags")
+	private String tags;
+
+	/**
+	 * 缩略图
+	 */
+	@DbField("g.logo")
+	private String logo;
+
+	/**
+	 * 最低规格价格
+	 */
+	@DbField("min(gs.price)")
+	private BigDecimal price;
+
+
+	/**
+	 * 已售
+	 */
+	@DbField("g.virtual_sold")
+	private Integer sold;
+}

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuSubsidyView.java

@@ -0,0 +1,43 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 12:18
+ */
+@SearchBean(tables = "goods_don_sku_subsidy gs inner join goods_don_sku on sku.id = gs.sku_id inner join goods_don g on g.id = sku.goods_id",
+		where = "gs.deleted is true")
+@Getter
+@Setter
+public class GoodsDonSkuSubsidyView {
+
+	@DbField("gs.id")
+	private Long id;
+
+	@DbField("gs.sku_id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("gs.price")
+	private BigDecimal price;
+
+	@DbField("gs.created_time")
+	private Date createdTime;
+}

+ 125 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSubsidyDetailView.java

@@ -0,0 +1,125 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.GoodsDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSubsidyDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 14:44
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_sku_subsidy gs inner join goods_don_sku sku on gs.sku_id = sku.id inner join goods_don g on sku.goods_id = g.id",
+		where = "gs.deleted is true and sku.status is true and g.deleted is true"
+		, groupBy = "g.id,g.title,g.tags,g.virtual_sold,g.sort_by",
+		orderBy = "g.sort_by asc, g.id")
+public class GoodsDonSubsidyDetailView {
+	@DbField("g.id")
+	private Long id;
+
+	/**
+	 * 商品名称
+	 */
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * 标签
+	 */
+	@DbField("g.tags")
+	private String tags;
+
+	/**
+	 * 缩略图
+	 */
+	@DbField("g.logo")
+	private String logo;
+
+	/**
+	 * 背景图
+	 */
+	@DbField("g.img")
+	private String img;
+
+	/**
+	 * 视频封面
+	 */
+	@DbField("g.video_cover")
+	private String videoCover;
+
+	@DbField("g.banner")
+	private String banner;
+
+	/**
+	 * 商品搭配图
+	 */
+	@DbField("g.match_img")
+	private String matchImg;
+
+
+	/**
+	 * 是否贴片 false
+	 */
+	@DbField("g.is_patch")
+	private Boolean isPatch;
+
+	/**
+	 * H5标签
+	 */
+	@DbField("g.mobile_tags")
+	private String mobileTags;
+
+	/**
+	 * 类型
+	 */
+	@DbField("g.type")
+	private Integer type;
+
+	@DbField("g.second_type")
+	private Integer secondType;
+
+	@DbField("g.special_type")
+	private GoodsDon.SpecialType specialType;
+
+	/**
+	 * 最低规格价格
+	 */
+	@DbField("min(gs.price)")
+	private BigDecimal price;
+
+	/**
+	 * 已售
+	 */
+	@DbField("g.virtual_sold")
+	private Integer sold;
+
+	@DbField("g.pay_desc")
+	private String payDesc;
+
+	@DbField("g.buy_desc")
+	private String buyDesc;
+
+	@DbField("g.detail")
+	private String detail;
+
+	@DbField("g.video")
+	private String video;
+
+	@DbIgnore
+	private List<GoodsDonSkuSubsidyDetailView> skuList;
+
+	@DbIgnore
+	private GoodsDonSpecFrontView specs;
+
+	@DbIgnore
+	private OrderCommentFrontView comments;
+}

+ 8 - 0
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -511,4 +511,12 @@
                                and date_format(o.created_time, '%Y-%m-%d') = #{date}
                                and o.money > 0
     </select>
+
+    <select id="getPayGoodsIds" resultType="java.lang.Long">
+        select distinct goods_id from order_don where status not in ('close','noPayment')
+        where user_id in
+        <foreach collection="userIds" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonSkuSubsidyService.java

@@ -0,0 +1,14 @@
+package com.cyksj.service.mange;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GoodsDonSkuSubsidy;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyService
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 12:13
+ */
+public interface GoodsDonSkuSubsidyService extends IService<GoodsDonSkuSubsidy> {
+	void saveOrUpdateSubsidy(GoodsDonSkuSubsidy goodsDonSkuSubsidy);
+}

+ 32 - 0
netflix-service/src/main/java/com/cyksj/service/mange/goods/GoodsDonSkuSubsidyServiceImpl.java

@@ -0,0 +1,32 @@
+package com.cyksj.service.mange.goods;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.GoodsDonSkuSubsidyMapper;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.GoodsDonSkuSubsidy;
+import com.cyksj.service.mange.GoodsDonSkuSubsidyService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 12:14
+ */
+@Service
+@RequiredArgsConstructor
+public class GoodsDonSkuSubsidyServiceImpl extends ServiceImpl<GoodsDonSkuSubsidyMapper, GoodsDonSkuSubsidy> implements GoodsDonSkuSubsidyService {
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
+	@Override
+	public void saveOrUpdateSubsidy(GoodsDonSkuSubsidy goodsDonSkuSubsidy) {
+		Long skuId = goodsDonSkuSubsidy.getSkuId();
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(skuId);
+		Assert.notNull(sku, "选择的规格不存在");
+		goodsDonSkuSubsidy.setGoodsId(goodsDonSkuSubsidy.getGoodsId());
+		this.saveOrUpdate(goodsDonSkuSubsidy);
+	}
+}

+ 123 - 63
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alipay.api.AlipayApiException;
@@ -281,6 +282,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonLocationRelateMapper orderDonLocationRelateMapper;
 
+	private final GoodsDonSkuSubsidyMapper goodsDonSkuSubsidyMapper;
+
+	private final OrderDonSubsidyRelateMapper orderDonSubsidyRelateMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -500,71 +505,16 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (isSpecificPrice && (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0 || orderDon.getMoney().compareTo(specificPrice) != 0)) {
 			throw BusinessRuntimeException.getInstance("专属价格不支持使用其他优惠");
 		}
-		orderDon.setPayDesc(goodsDon.getPayDesc());
-		StringBuilder payTitle = new StringBuilder();
-		payTitle.append(goodsDon.getTitle());
-		if (sku != null) {
-			payTitle.append(sku.getSpecVal());
-		}
-		if (isGiftCardPay.get()) {
-			//礼品卡规格
-			Map<Long, Integer> giftCardPayNumMap = new ConcurrentHashMap<>();
-			giftCards.stream().forEach(data -> {
-				if (data.getNum() <= 0) {
-					return;
-				}
-				giftCardPayNumMap.putIfAbsent(data.getGcId(), data.getNum());
-			});
-			if (giftCardPayNumMap.isEmpty()) {
-				throw BusinessRuntimeException.getInstance("请选择要购买礼品卡的数量");
-			}
-			List<GiftCardGoodsSkuFrontView> giftCardViews = beanSearcher.searchAll(GiftCardGoodsSkuFrontView.class, MapUtils.builder().field(GiftCardGoodsSkuFrontView::getId, giftCardPayNumMap.keySet()).op(Operator.InList).build());
-			if (giftCardViews.size() != giftCards.size()) {
-				throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重试");
-			}
-			payTitle.append("购买详情:");
-			BigDecimal gift_card_pay_money = BigDecimal.ZERO;
-			for (GiftCardGoodsSkuFrontView data : giftCardViews) {
-				//礼品卡数量
-				Integer num = giftCardPayNumMap.get(data.getId());
-				data.setGcNum(num);
-				data.setGcShowType(gcPayInfo.getGcShowType());
-				data.setGcImg(gcPayInfo.getGcImg());
-				gift_card_pay_money = gift_card_pay_money.add(data.getPrice().multiply(BigDecimal.valueOf(num)));
 
-				//礼品卡关系
-				if (!payTitle.toString().endsWith("购买详情:")) {
-					payTitle.append(" + ");
-				}
-				String gcDetail;
-				if (data.getGcType() == 1) {
-					gcDetail = String.format("%s张现金卡%s%s", num, Constant.CN_CYS, data.getCash().divide(BigDecimal.valueOf(100)));
-					payTitle.append(gcDetail);
-				} else {
-					gcDetail = String.format("%s张虚拟卡%s%s", num, data.getGcGoodsTitle(), data.getGcSpecVal());
-					payTitle.append(gcDetail);
-				}
-			}
-			gcPayInfo.setGcPayDetail(giftCardViews);
-
-			//调整礼品卡金额
-			if (gift_card_pay_money.compareTo(orderDon.getMoney()) > 0) {
-				orderDon.setMoney(gift_card_pay_money);
-				orderDon.setRealMoney(gift_card_pay_money);
-			}
+		//规格补贴id
+		Long subsidyId = payRequest.getSubsidyId();
+		if (subsidyId != null) {
+			//校验百亿补贴规格,并设置参数
+			setSubsidyOrderDonInfo(subsidyId, user, orderDon);
 		}
-		if (orderDon.getIsDp()) {
-			List<GoodsDonSkuView> dp_skuViewList = beanSearcher.searchAll(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, dpSkuIds).op(Operator.InList).build());
-			if (dp_skuViewList.size() != dpSkuIds.size()) {
-				throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新下单");
-			}
-			dp_skuViewList.forEach(dp_SkuView -> {
-				payTitle.append(" + ");
-				payTitle.append(dp_SkuView.getGoodsTitle());
-				payTitle.append(dp_SkuView.getSpecVal());
-			});
-		}
-		orderDon.setPayTitle(payTitle.toString());
+		orderDon.setPayDesc(goodsDon.getPayDesc());
+		//设置订单支付商品信息
+		setOrderDonPayTile(isGiftCardPay, gcPayInfo, giftCards, orderDon, goodsDon, sku, dpSkuIds);
 		//下单手机号
 		orderDon.setPhone(orderPhone);
 		this.saveOrUpdate(orderDon);
@@ -647,6 +597,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		//记录订单ip关联
 		recordOrderDonLocationRelate(orderDon.getId(), payRequest.getIp());
+		//记录补贴订单关联
+		recordOrderDonSubsidyRelate(orderDon.getId(), subsidyId);
 		return orderDon;
 	}
 
@@ -2988,4 +2940,112 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDonLocationRelate.setIp(ip);
 		orderDonLocationRelateMapper.insert(orderDonLocationRelate);
 	}
+
+	private void recordOrderDonSubsidyRelate(Long orderId, Long subsidyId) {
+		if (subsidyId != null) {
+			OrderDonSubsidyRelate orderDonSubsidyRelate = new OrderDonSubsidyRelate();
+			orderDonSubsidyRelate.setSubsidyId(subsidyId);
+			orderDonSubsidyRelate.setOrderId(orderId);
+			orderDonSubsidyRelateMapper.insert(orderDonSubsidyRelate);
+		}
+	}
+
+	/**
+	 * 设置订单支付商品属性
+	 */
+	public void setOrderDonPayTile(AtomicBoolean isGiftCardPay, GiftCardDto gcPayInfo, List<GiftCardPayReq> giftCards, OrderDon orderDon, GoodsDon goodsDon, GoodsDonSku sku, List<Long> dpSkuIds) {
+		StringBuilder payTitle = new StringBuilder();
+		payTitle.append(goodsDon.getTitle());
+		if (sku != null) {
+			payTitle.append(sku.getSpecVal());
+		}
+		if (isGiftCardPay.get()) {
+			//礼品卡规格
+			Map<Long, Integer> giftCardPayNumMap = new ConcurrentHashMap<>();
+			giftCards.stream().forEach(data -> {
+				if (data.getNum() <= 0) {
+					return;
+				}
+				giftCardPayNumMap.putIfAbsent(data.getGcId(), data.getNum());
+			});
+			if (giftCardPayNumMap.isEmpty()) {
+				throw BusinessRuntimeException.getInstance("请选择要购买礼品卡的数量");
+			}
+			List<GiftCardGoodsSkuFrontView> giftCardViews = beanSearcher.searchAll(GiftCardGoodsSkuFrontView.class, MapUtils.builder().field(GiftCardGoodsSkuFrontView::getId, giftCardPayNumMap.keySet()).op(Operator.InList).build());
+			if (giftCardViews.size() != giftCards.size()) {
+				throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重试");
+			}
+			payTitle.append("购买详情:");
+			BigDecimal gift_card_pay_money = BigDecimal.ZERO;
+			for (GiftCardGoodsSkuFrontView data : giftCardViews) {
+				//礼品卡数量
+				Integer num = giftCardPayNumMap.get(data.getId());
+				data.setGcNum(num);
+				data.setGcShowType(gcPayInfo.getGcShowType());
+				data.setGcImg(gcPayInfo.getGcImg());
+				gift_card_pay_money = gift_card_pay_money.add(data.getPrice().multiply(BigDecimal.valueOf(num)));
+
+				//礼品卡关系
+				if (!payTitle.toString().endsWith("购买详情:")) {
+					payTitle.append(" + ");
+				}
+				String gcDetail;
+				if (data.getGcType() == 1) {
+					gcDetail = String.format("%s张现金卡%s%s", num, Constant.CN_CYS, data.getCash().divide(BigDecimal.valueOf(100)));
+					payTitle.append(gcDetail);
+				} else {
+					gcDetail = String.format("%s张虚拟卡%s%s", num, data.getGcGoodsTitle(), data.getGcSpecVal());
+					payTitle.append(gcDetail);
+				}
+			}
+			gcPayInfo.setGcPayDetail(giftCardViews);
+
+			//调整礼品卡金额
+			if (gift_card_pay_money.compareTo(orderDon.getMoney()) > 0) {
+				orderDon.setMoney(gift_card_pay_money);
+				orderDon.setRealMoney(gift_card_pay_money);
+			}
+		}
+		if (orderDon.getIsDp()) {
+			List<GoodsDonSkuView> dp_skuViewList = beanSearcher.searchAll(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, dpSkuIds).op(Operator.InList).build());
+			if (dp_skuViewList.size() != dpSkuIds.size()) {
+				throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新下单");
+			}
+			dp_skuViewList.forEach(dp_SkuView -> {
+				payTitle.append(" + ");
+				payTitle.append(dp_SkuView.getGoodsTitle());
+				payTitle.append(dp_SkuView.getSpecVal());
+			});
+		}
+		orderDon.setPayTitle(payTitle.toString());
+	}
+
+	/**
+	 * 百亿补贴订单
+	 */
+	private void setSubsidyOrderDonInfo(Long subsidyId, User user, OrderDon orderDon) {
+		Assert.notNull(user, "用户不存在");
+		GoodsDonSkuSubsidy goodsDonSkuSubsidy = goodsDonSkuSubsidyMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSkuSubsidy.class)
+				.eq(GoodsDonSkuSubsidy::getId, subsidyId)
+				.eq(GoodsDonSkuSubsidy::getDeleted, 1)
+				.last("limit 1"));
+		Assert.notNull(goodsDonSkuSubsidy, "商品不存在");
+		Long skuId = goodsDonSkuSubsidy.getSkuId();
+		Long paySkuId = orderDon.getSkuId();
+		if (ObjectUtil.equal(skuId, paySkuId)) {
+			throw BusinessRuntimeException.getInstance("规格不存在");
+		}
+		BigDecimal price = goodsDonSkuSubsidy.getPrice();
+		if (price.compareTo(BigDecimal.ZERO) <= 0) {
+			throw BusinessRuntimeException.getInstance("商品价格异常..");
+		}
+		//是否购买过该规格
+		Integer selectCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+				.eq(OrderDon::getSkuId, skuId)
+				.ne(OrderDon::getStatus, OrderDon.Status.close));
+		if (selectCount > 0) {
+			throw BusinessRuntimeException.getInstance("只可购买一次该补贴规格");
+		}
+		orderDon.setMoney(price);
+	}
 }

+ 61 - 0
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -26,6 +26,7 @@ import com.cyksj.redis.RedisService;
 import com.cyksj.service.goods.GoodsDonFrontService;
 import com.cyksj.service.home.ClickRecordFrontService;
 import com.cyksj.service.shop.YhShopFrontService;
+import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
@@ -78,6 +79,8 @@ public class GoodsDonController {
 
 	private final GoodsDonFrontService goodsDonFrontService;
 
+	private final UserBindRelationService userBindRelationService;
+
 	/**
      * 获取平台商品分类
      */
@@ -1131,4 +1134,62 @@ public class GoodsDonController {
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
 	}
+
+	/**
+	 * 百亿补贴
+	 * 补贴规格列表
+	 */
+	@GetMapping("/get/subsidy")
+	public Result<List<GoodsDonSkuSubsidyFrontView>> getSubsidyGoods() {
+		String key = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "subsidy";
+		Object o = redisService.get(key);
+		if (o == null) {
+			List<GoodsDonSkuSubsidyFrontView> subsidyList = beanSearcher.searchAll(GoodsDonSkuSubsidyFrontView.class, MapUtils.builder().build());
+			redisService.setNx(key, subsidyList, RedisService.key.YH_HOME_PAGHE_CACHE .getTimeout() + 60 * RandomUtil.randomInt(10));
+			o = redisService.get(key);
+		}
+		List<GoodsDonSkuSubsidyFrontView> subsidyList = Jsons.parseList(o, GoodsDonSkuSubsidyFrontView.class);
+		if (CollUtil.isEmpty(subsidyList)) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult(subsidyList);
+		}
+		Long userId = StpUserUtil.getUserIdAfterLogin();
+		if (userId != null) {
+			List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
+			//过滤用户已经购买过平台
+			List<Long> goodsIds = orderDonMapper.getPayGoodsIds(relationUserIdList);
+			if (CollUtil.isNotEmpty(goodsIds)) {
+				subsidyList = subsidyList.stream().filter(data -> !goodsIds.contains(data.getId())).collect(Collectors.toList());
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(subsidyList);
+	}
+
+	/**
+	 * 百亿补贴规格详情
+	 */
+	@GetMapping("/get/subsidy/detail/{id}")
+	public Result<GoodsDonSubsidyDetailView> getSubsidyDetailById(@PathVariable Long id) throws Exception {
+		String goodsDetailKey = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "subsidy:detail:" + id;
+		Object o = redisService.get(goodsDetailKey);
+		GoodsDonSubsidyDetailView subsidyDetail = null;
+		if (o == null) {
+			subsidyDetail = beanSearcher.searchFirst(GoodsDonSubsidyDetailView.class, MapUtils.builder().field(GoodsDonSubsidyDetailView::getId, id).build());
+
+			subsidyDetail.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, subsidyDetail.getId()).build()));
+			MapBuilder builder = MapUtils.builder().field(GoodsDonSkuSubsidyDetailView::getGoodsId, subsidyDetail.getId());
+			subsidyDetail.setSkuList(beanSearcher.searchAll(GoodsDonSkuSubsidyDetailView.class, builder.build()));
+			Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getGoodsId, subsidyDetail.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
+			subsidyDetail.setSold(sold + subsidyDetail.getSold());
+
+			redisService.setNx(goodsDetailKey, subsidyDetail, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 60 * RandomUtil.randomInt(10));
+		}
+		if (subsidyDetail == null) {
+			o = redisService.get(goodsDetailKey);
+			subsidyDetail = Jsons.parseObject(o.toString(), GoodsDonSubsidyDetailView.class);
+		}
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult(subsidyDetail);
+	}
+
 }

+ 67 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/GoodsDonSkuSubsidyController.java

@@ -0,0 +1,67 @@
+package com.cyksj.web.controller.manage.goods;
+
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.GoodsDonSkuSubsidy;
+import com.cyksj.service.mange.GoodsDonSkuSubsidyService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuSubsidyController
+ * 创建者: JavaZou
+ * 创建时间:2024/4/11 12:05
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RequestMapping("/manage/goods/sku/subsidy")
+@RestController
+public class GoodsDonSkuSubsidyController {
+	private final GoodsDonSkuSubsidyService goodsDonSkuSubsidyService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	@PostMapping("/insert")
+	public Result<String> insertGoodsDonSkuSubsidy(@RequestBody @Validated GoodsDonSkuSubsidy goodsDonSkuSubsidy) {
+		goodsDonSkuSubsidyService.saveOrUpdateSubsidy(goodsDonSkuSubsidy);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	@PutMapping("/update")
+	public Result<String> updateGoodsDonSkuSubsidy(@RequestBody @Validated GoodsDonSkuSubsidy goodsDonSkuSubsidy) {
+		goodsDonSkuSubsidyService.saveOrUpdateSubsidy(goodsDonSkuSubsidy);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除商品补贴价格记录
+	 */
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteGoodsDonSkuSubsidy(@PathVariable Long id) {
+		GoodsDonSkuSubsidy byId = goodsDonSkuSubsidyService.getById(id);
+		if (byId != null && byId.getDeleted()) {
+			byId.setDeleted(false);
+			goodsDonSkuSubsidyService.removeById(id);
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 查询商品补贴价格记录 列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<GoodsDonSkuSubsidy>> getGoodsDonSkuSubsidy() {
+		SearchResult<GoodsDonSkuSubsidy> search = beanSearcher.search(GoodsDonSkuSubsidy.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}