zoujiajian 3 gadi atpakaļ
vecāks
revīzija
896a92a3ea
21 mainītis faili ar 422 papildinājumiem un 8 dzēšanām
  1. 21 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsDiscountPlusPurchaseRelationMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDiscountPlusPurchaseTicketRelationMapper.java
  3. 20 0
      netflix-dao/src/main/java/com/cyksj/model/dto/GoodsDiscountPlusPurchaseRelationDto.java
  4. 26 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDiscountPlusPurchaseRelation.java
  5. 19 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  6. 23 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDiscountPlusPurchaseTicketRelation.java
  7. 13 1
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  8. 2 1
      netflix-dao/src/main/java/com/cyksj/model/entity/UserTicketClearedRecord.java
  9. 6 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
  10. 6 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  11. 39 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDiscountPlusPurchaseRelationFrontView.java
  12. 8 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonFrontSkuView.java
  13. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/GroupsView.java
  14. 21 0
      netflix-dao/src/main/resources/mapper/GoodsDiscountPlusPurchaseRelationMapper.xml
  15. 4 0
      netflix-service/src/main/java/com/cyksj/service/mange/CmsGoodsDonSkuService.java
  16. 102 0
      netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSkuServiceImpl.java
  17. 19 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  18. 46 5
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  19. 12 1
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  20. 8 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  21. 11 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDiscountPlusPurchaseRelationMapper.java

@@ -0,0 +1,21 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.dto.GoodsDiscountPlusPurchaseRelationDto;
+import com.cyksj.model.entity.GoodsDiscountPlusPurchaseRelation;
+import com.cyksj.model.entity.GoodsDonSku;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDiscountPlusPurchaseRelationMapper
+ *创建者: JavaZou
+ *创建时间:2023/7/19 11:42
+ */
+public interface GoodsDiscountPlusPurchaseRelationMapper extends BaseMapper<GoodsDiscountPlusPurchaseRelation> {
+	GoodsDiscountPlusPurchaseRelationDto countDiscountGoodsRelation(@Param("list") List<Long> dpSIds, @Param("skuId") Long skuId);
+
+	List<GoodsDonSku> selectRelationSkuByDpId(@Param("list") List<Long> dpSIds, @Param("skuId") Long skuId);
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDiscountPlusPurchaseTicketRelation;
+
+/*
+ *项目名: netflix
+ *文件名: OrderDiscountPlusPurchaseTicketRelationMapper
+ *创建者: JavaZou
+ *创建时间:2023/7/19 11:43
+ */
+public interface OrderDiscountPlusPurchaseTicketRelationMapper extends BaseMapper<OrderDiscountPlusPurchaseTicketRelation> {
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/GoodsDiscountPlusPurchaseRelationDto.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDiscountPlusPurchaseRelationDto
+ *创建者: JavaZou
+ *创建时间:2023/7/19 15:21
+ */
+@Getter
+@Setter
+public class GoodsDiscountPlusPurchaseRelationDto {
+	private Integer count;
+
+	private BigDecimal totalMoney;
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDiscountPlusPurchaseRelation.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDiscountPlusPurchaseRelation
+ *创建者: JavaZou
+ *创建时间:2023/7/19 11:38
+ */
+@Getter
+@Setter
+public class GoodsDiscountPlusPurchaseRelation extends BaseEntity{
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Long disGid;
+
+	private Long disSid;
+
+	private BigDecimal disPrice;
+}

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -2,12 +2,15 @@ package com.cyksj.model.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.views.GoodsDiscountPlusPurchaseRelationFrontView;
 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;
 
 /**
  * @author chan
@@ -100,4 +103,20 @@ public class GoodsDonSku extends BaseEntity {
     @DbField("case when spec_val like '%月%' and spec_val not like '%年%' then 0 when spec_val like '%季%' then 1 when spec_val like '%半年%' then 2 when spec_val like '%年%' then 3 else 66 end")
     @TableField(exist = false)
     private Integer orderBy;
+
+    @DbIgnore
+    @TableField(exist = false)
+    private List<GoodsDiscountPlusPurchaseRelation> discountPlusPurchaseGoods;
+
+    /**
+     * 是否是优惠加购规格
+     */
+    private Boolean isDp;
+
+    /**
+     * 优惠加购商品
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private List<GoodsDiscountPlusPurchaseRelationFrontView> dpGoods;
 }

+ 23 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDiscountPlusPurchaseTicketRelation.java

@@ -0,0 +1,23 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: OrderDiscountPlusPurchaseTicketRelation
+ *创建者: JavaZou
+ *创建时间:2023/7/19 11:40
+ */
+@Getter
+@Setter
+public class OrderDiscountPlusPurchaseTicketRelation extends BaseEntity{
+
+	private Long orderId;
+
+	private Long userId;
+
+	private List<Long> relationIds;
+}

+ 13 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -2,12 +2,15 @@ package com.cyksj.model.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import lombok.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author chan
@@ -212,6 +215,15 @@ public class OrderDon extends BaseEntity implements Serializable {
     @TableField(exist = false)
     private GoodsDon.SpecialType specialType;
 
+    /**
+     * 是否优惠加购规格
+     */
+    private Boolean isDp;
+
+    /**
+     * 优惠加购规格id
+     */
+    private List<Long> dpSIds;
 
     public enum Status {
         /**

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/UserTicketClearedRecord.java

@@ -53,7 +53,8 @@ public class UserTicketClearedRecord extends BaseEntity{
 		new_groups_ticket("新空车队车票"),
 		disable("禁用账号分配车票"),
 		refund_balance("退款余额"),
-		abnormal("异常订单")
+		abnormal("异常订单"),
+		dp("优惠加购订单退款")
 		;
 		String desc;
 

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.manage.request;
 
+import com.cyksj.model.entity.GoodsDiscountPlusPurchaseRelation;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -83,6 +84,11 @@ public class ReqGoodsSkuInsert {
          */
         private String benefitsList;
 
+        /**
+         * 优惠加购虚拟商品
+         */
+        private List<GoodsDiscountPlusPurchaseRelation> discountPlusPurchaseGoods;
+
     }
 
 }

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

@@ -7,6 +7,7 @@ import lombok.ToString;
 
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @author chan
@@ -90,6 +91,11 @@ public class OrderPayRequest {
      */
     private OrderDon.Source source;
 
+    /**
+     * 优惠加购规格id
+     */
+    private List<Long> dpSIds;
+
     /**
      * 余额支付
      */

+ 39 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDiscountPlusPurchaseRelationFrontView.java

@@ -0,0 +1,39 @@
+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;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDiscountPlusPurchaseRelationFrontView
+ *创建者: JavaZou
+ *创建时间:2023/7/19 14:08
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_discount_plus_purchase_relation gpr left join goods_don g on g.id = gpr.goods_id" +
+		" left join goods_don_sku sku on sku.id = gpr.sku_id",
+		where = "g.deleted is true and g.status is true and sku.status is true")
+public class GoodsDiscountPlusPurchaseRelationFrontView {
+	@DbField("gpr.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("gpr.sku_id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("sku.price")
+	private String oPrice;
+
+	@DbField("gpr.price")
+	private BigDecimal price;
+}

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonFrontSkuView.java

@@ -6,6 +6,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -60,4 +61,11 @@ public class GoodsDonFrontSkuView {
 	private Integer days;
 
 	private String notifyText;
+
+	private Boolean isDp;
+
+	/**
+	 * 优惠加购商品
+	 */
+	private List<GoodsDiscountPlusPurchaseRelationFrontView> dpGoods;
 }

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GroupsView.java

@@ -61,4 +61,7 @@ public class GroupsView {
     @DbIgnore
     private List<GroupsRelationView> relations;
 
+    @DbField("")
+    private Boolean isDp;
+
 }

+ 21 - 0
netflix-dao/src/main/resources/mapper/GoodsDiscountPlusPurchaseRelationMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.GoodsDiscountPlusPurchaseRelationMapper">
+
+    <select id="countDiscountGoodsRelation" resultType="com.cyksj.model.dto.GoodsDiscountPlusPurchaseRelationDto">
+        select count(*) as 'count', sum(price) as totalMoney from goods_discount_plus_purchase_relation
+        where sku_id = #{skuId} and id in
+        <foreach collection="list" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="selectRelationSkuByDpId" resultType="com.cyksj.model.entity.GoodsDonSku">
+        select sku.* from (select dis_sid from goods_discount_plus_purchase_relation
+        where sku_id = #{skuId} and id in
+        <foreach collection="list" open="(" separator="," close=")">
+            #{item}
+        </foreach>) s inner join goods_don_sku sku on sku.id = s.dis_sid
+    </select>
+</mapper>

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsGoodsDonSkuService.java

@@ -1,11 +1,15 @@
 package com.cyksj.service.mange;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GoodsDiscountPlusPurchaseRelation;
 import com.cyksj.model.entity.GoodsDonSku;
 
+import java.util.List;
+
 /**
  * @author chan
  * @date 2022/9/27 5:43 PM
  */
 public interface CmsGoodsDonSkuService extends IService<GoodsDonSku> {
+	void handleDiscountPurchaseGoods(GoodsDonSku sku, List<GoodsDiscountPlusPurchaseRelation> discountPlusPurchaseGoods);
 }

+ 102 - 0
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSkuServiceImpl.java

@@ -1,13 +1,25 @@
 package com.cyksj.service.mange.goods;
 
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.GoodsDiscountPlusPurchaseRelationMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.model.entity.GoodsDiscountPlusPurchaseRelation;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 /**
  * @author chan
  * @date 2022/9/27 5:43 PM
@@ -16,4 +28,94 @@ import org.springframework.stereotype.Service;
 @RequiredArgsConstructor
 @Service
 public class CmsGoodsDonSkuServiceImpl extends ServiceImpl<GoodsDonSkuMapper,GoodsDonSku> implements CmsGoodsDonSkuService {
+	private final GoodsDiscountPlusPurchaseRelationMapper discountPlusPurchaseRelationMapper;
+
+	private final GoodsDonSkuMapper skuMapper;
+
+	@Override
+	public void handleDiscountPurchaseGoods(GoodsDonSku sku, List<GoodsDiscountPlusPurchaseRelation> discountPlusPurchaseGoods) {
+		Long skuId = sku.getId();
+		Long goodsId = sku.getGoodsId();
+		List<GoodsDiscountPlusPurchaseRelation> dbDiscountPlusGoodsList = discountPlusPurchaseRelationMapper.selectList(Wrappers.lambdaQuery(GoodsDiscountPlusPurchaseRelation.class)
+				.eq(GoodsDiscountPlusPurchaseRelation::getSkuId, skuId));
+		if (CollUtil.isEmpty(dbDiscountPlusGoodsList)) {
+			discountPlusPurchaseGoods.forEach(discountGoods -> {
+				checkPurchaseParamsAndSaveOrUpdate(goodsId, skuId, discountGoods);
+			});
+			sku.setIsDp(true);
+			return;
+		}
+		//优惠加购为空
+		if (CollUtil.isEmpty(discountPlusPurchaseGoods)) {
+			discountPlusPurchaseRelationMapper.delete(Wrappers.lambdaQuery(GoodsDiscountPlusPurchaseRelation.class)
+					.eq(GoodsDiscountPlusPurchaseRelation::getSkuId, skuId));
+			sku.setIsDp(false);
+			return;
+		}
+
+		//新增或更新
+		sku.setIsDp(true);
+		Map<Long, GoodsDiscountPlusPurchaseRelation> skuIdMap = new ConcurrentHashMap<>();
+		discountPlusPurchaseGoods.forEach(discountGoods -> {
+			AtomicBoolean is_exist = new AtomicBoolean(false);
+			if (skuIdMap.get(discountGoods.getDisGid()) == null) {
+				skuIdMap.put(discountGoods.getDisGid(), discountGoods);
+			}
+			dbDiscountPlusGoodsList.forEach(db_exist->{
+				//存在
+				if (db_exist.getDisGid().equals(discountGoods.getDisGid())) {
+					is_exist.set(true);
+					discountGoods.setId(db_exist.getId());
+					checkPurchaseParamsAndSaveOrUpdate(goodsId, skuId, discountGoods);
+				}
+			});
+			//不存在新增
+			if (!is_exist.get()) {
+				checkPurchaseParamsAndSaveOrUpdate(goodsId, skuId, discountGoods);
+			}
+		});
+
+		//去除数据库已被删除的
+		dbDiscountPlusGoodsList.forEach(dbDiscountPlusGoods -> {
+			GoodsDiscountPlusPurchaseRelation exists = skuIdMap.get(dbDiscountPlusGoods.getDisGid());
+			//不存在
+			if (exists == null) {
+				discountPlusPurchaseRelationMapper.deleteById(dbDiscountPlusGoods.getId());
+				return;
+			}
+		});
+	}
+
+	public void checkPurchaseParamsAndSaveOrUpdate(Long goodsId, Long skuId, GoodsDiscountPlusPurchaseRelation discountGoods) {
+		Long disSid = discountGoods.getDisSid();
+		if (disSid == null) {
+			throw BusinessRuntimeException.getInstance("请选择对应优惠加购规格");
+		}
+		if (skuId.equals(disSid)) {
+			return;
+		}
+		BigDecimal disPrice = discountGoods.getDisPrice();
+		GoodsDonSku sku = skuMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSku.class)
+				.eq(GoodsDonSku::getId, disSid).last("limit 1"));
+		if (sku == null) {
+			throw BusinessRuntimeException.getInstance("规格不存在");
+		}
+		if (!sku.getStatus()) {
+			throw BusinessRuntimeException.getInstance("{0}规格未上架", sku.getSpecVal());
+		}
+		if (disPrice == null || disPrice.compareTo(BigDecimal.ZERO) <= 0) {
+			throw BusinessRuntimeException.getInstance("请输入正确的优惠加购价格");
+		}
+		discountGoods.setGoodsId(goodsId);
+		discountGoods.setSkuId(skuId);
+		discountGoods.setDisGid(sku.getGoodsId());
+		if (discountGoods.getId() != null) {
+			discountPlusPurchaseRelationMapper.updateById(discountGoods);
+			return;
+		}
+		try {
+			discountPlusPurchaseRelationMapper.insert(discountGoods);
+		} catch (DuplicateKeyException e) {
+		}
+	}
 }

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.mange.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
@@ -131,6 +132,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final StripeService stripeService;
 
+    private final GoodsDiscountPlusPurchaseRelationMapper discountPlusPurchaseRelationMapper;
+
+    private final OrderDiscountPlusPurchaseTicketRelationMapper orderRelationTicketRelationMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -594,6 +599,20 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 record.setStatus(UserDistributeBusinessOrderDonRecord.Status.refund);
                 businessOrderDonRecordMapper.updateById(record);
             }
+            //是否是优惠加购关联订单
+            if (orderDon.getIsDp()) {
+                OrderDiscountPlusPurchaseTicketRelation discountPlusPurchaseTicketRelation = orderRelationTicketRelationMapper.selectOne(Wrappers.lambdaQuery(OrderDiscountPlusPurchaseTicketRelation.class)
+                        .eq(OrderDiscountPlusPurchaseTicketRelation::getOrderId, orderDon.getId()).last("limit 1"));
+                if (discountPlusPurchaseTicketRelation != null) {
+                    List<Long> relationIds = discountPlusPurchaseTicketRelation.getRelationIds();
+                    if (CollUtil.isNotEmpty(relationIds)) {
+                        List<GroupsRelation> groupsRelations = relationMapper.selectList(Wrappers.lambdaQuery(GroupsRelation.class)
+                                .in(GroupsRelation::getId, relationIds));
+                        log.info("优惠加购订单orderId:{}退款,清除相关车票", orderDon.getId());
+                        groupsRelations.forEach(relation -> relationClearService.clearTicket(relation, UserTicketClearedRecord.Source.dp));
+                    }
+                }
+            }
         });
     }
 

+ 46 - 5
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -87,10 +87,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
@@ -202,6 +199,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonPostService orderDonPostService;
 
+	private final GoodsDiscountPlusPurchaseRelationMapper discountPlusPurchaseRelationMapper;
+
+	private final OrderDiscountPlusPurchaseTicketRelationMapper orderRelationTicketRelationMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -249,10 +250,29 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		orderDon.setOrderNo(donNo);
 		orderDon.setOpenId(payOpenId);
-		if (sku.getPrice() != null && payRequest.getDonMoney().compareTo(sku.getPrice()) < 0) {
+		if (sku.getPrice() == null || sku.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
+			throw BusinessRuntimeException.getInstance("下单商品价格异常");
+		}
+		if (payRequest.getDonMoney().compareTo(sku.getPrice()) < 0) {
 			log.info("规格:{}支付金额:{}异常,调整用户userId:{}支付金额为:{}", sku.getSpecVal(), payRequest.getDonMoney(), user.getId(), sku.getPrice());
 			payRequest.setDonMoney(sku.getPrice());
 		}
+
+		List<Long> dpSIds = payRequest.getDpSIds();
+		if (CollUtil.isNotEmpty(dpSIds)) {
+			//是否满足关联
+			GoodsDiscountPlusPurchaseRelationDto purchaseRelationDto = discountPlusPurchaseRelationMapper.countDiscountGoodsRelation(dpSIds, sku.getId());
+			if (purchaseRelationDto.getCount() != dpSIds.size()) {
+				throw BusinessRuntimeException.getInstance("下单异常,请重新下单");
+			}
+			BigDecimal pay_money = sku.getPrice().add(purchaseRelationDto.getTotalMoney());
+			if (pay_money.compareTo(orderDon.getMoney()) < 0) {
+				orderDon.setMoney(pay_money);
+			}
+			orderDon.setIsDp(true);
+			orderDon.setDpSIds(dpSIds);
+		}
+
 		orderDon.setMoney(payRequest.getDonMoney());
 		orderDon.setRealMoney(payRequest.getDonMoney());
 
@@ -1124,6 +1144,27 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			log.info("虚物订单orderNo:{}开始更新车票信息", order.getOrderNo());
 			//修改车位状态
 			GroupsRelation relation = groupsRelationMapper.selectById(order.getRelationId());
+			if (CollUtil.isNotEmpty(order.getDpSIds())) {
+				//是否已经发送优惠加购车票
+				Integer count = orderRelationTicketRelationMapper.selectCount(Wrappers.lambdaQuery(OrderDiscountPlusPurchaseTicketRelation.class)
+						.eq(OrderDiscountPlusPurchaseTicketRelation::getOrderId, order.getId()));
+				if (count > 0) {
+					return;
+				}
+				//发送优惠加购 规格车票
+				List<GoodsDonSku> relationSkus = discountPlusPurchaseRelationMapper.selectRelationSkuByDpId(order.getDpSIds(), sku.getId());
+				List<Long> dis_relation_ids = new ArrayList<>();
+				relationSkus.forEach(reSku -> {
+					GroupsRelation relationNoOrder = exchangeCodeService.getRelationNoOrder(reSku, order.getUserId());
+					dis_relation_ids.add(relationNoOrder.getId());
+				});
+				//保存订单关联优惠加购车票
+				OrderDiscountPlusPurchaseTicketRelation purchaseTicketRelation = new OrderDiscountPlusPurchaseTicketRelation();
+				purchaseTicketRelation.setUserId(order.getUserId());
+				purchaseTicketRelation.setOrderId(order.getId());
+				purchaseTicketRelation.setRelationIds(dis_relation_ids);
+				orderRelationTicketRelationMapper.insert(purchaseTicketRelation);
+			}
 			if (order.getRelationId() != 0 && !relation.getUserId().equals(order.getUserId()) && order.getOrderType() == 1) {
 				GroupsRelation relationNoOrder = exchangeCodeService.getRelationNoOrder(sku, order.getUserId());
 				if (relationNoOrder == null) {

+ 12 - 1
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -180,6 +180,11 @@ public class GoodsDonController {
         list.forEach(data -> {
             data.setSpecs(beanSearcher.searchFirst(GoodsDonSpec.class, MapUtils.builder().field(GoodsDonSpec::getGoodsId, data.getId()).build()));
             data.setSkuList(beanSearcher.searchAll(GoodsDonFrontSkuView.class, MapUtils.builder().field(GoodsDonFrontSkuView::getGoodsId, data.getId()).field(GoodsDonFrontSkuView::getStatus, true).orderBy(GoodsDonFrontSkuView::getPrice).asc().build()));
+            data.getSkuList().forEach(sku -> {
+                if (sku.getIsDp()) {
+                    sku.setDpGoods(beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelationFrontView.class, MapUtils.builder().field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId()).build()));
+                }
+            });
             Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
                     .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
             data.setSold(sold + data.getVirtualSold());
@@ -290,7 +295,13 @@ public class GoodsDonController {
         if (goodsDonSkuView != null && goodsDonSkuView.getType() == 1) {
             builder.orderBy(GoodsDonSku::getOrderBy).asc();
         }
-        views.setSkuList(beanSearcher.searchAll(GoodsDonSku.class, builder.build()));
+        List<GoodsDonSku> goodsDonSkus = beanSearcher.searchAll(GoodsDonSku.class, builder.build());
+        goodsDonSkus.forEach(sku -> {
+            if (sku.getIsDp()) {
+                sku.setDpGoods(beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelationFrontView.class, MapUtils.builder().field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId()).build()));
+            }
+        });
+        views.setSkuList(goodsDonSkus);
         return GatewayResponse.SUCCESS.newBuilder().toResult(views);
     }
 

+ 8 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -7,6 +7,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.GoodsDiscountPlusPurchaseRelation;
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.manage.request.ReqGoodsSpuInsert;
@@ -59,6 +60,13 @@ public class CmsGoodsDonController {
     public Result<GoodsDonViewer> getById(@PathVariable Long id) {
         GoodsDonViewer goodsDonViewer = beanSearcher.searchFirst(GoodsDonViewer.class, MapUtils.builder().field(GoodsDonViewer::getId, id).build());
         List<GoodsDonSku> goodsDonSkus = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.builder().field(GoodsDonSku::getGoodsId, id).build());
+        if (goodsDonViewer.getType() == 1) {
+            goodsDonSkus.forEach(sku -> {
+                if (sku.getIsDp()) {
+                    sku.setDiscountPlusPurchaseGoods(beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelation.class, MapUtils.builder().field(GoodsDiscountPlusPurchaseRelation::getSkuId, sku.getId()).build()));
+                }
+            });
+        }
         goodsDonViewer.setSkus(goodsDonSkus);
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonViewer);
     }

+ 11 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.manage.goods;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -223,7 +224,14 @@ public class CmsGoodsDonSkuController {
                 if (sku.getMonths() == null && sku.getDays() == null)
                     throw BusinessRuntimeException.getInstance("请输入对应续费时间");
             }
+            if (CollUtil.isNotEmpty(sku.getDiscountPlusPurchaseGoods())) {
+                goodsDonSku.setIsDp(true);
+            }
             goodsDonSkuService.save(goodsDonSku);
+            if (CollUtil.isNotEmpty(sku.getDiscountPlusPurchaseGoods())) {
+                Long goodsId = goodsDonSku.getGoodsId();
+                goodsDonSkuService.handleDiscountPurchaseGoods(goodsDonSku, sku.getDiscountPlusPurchaseGoods());
+            }
 
         }
         //给平台更新额外属性
@@ -254,6 +262,8 @@ public class CmsGoodsDonSkuController {
         if (sku.getDays() == null) {
             sku.setDays(null);
         }
+        //优惠加购
+        goodsDonSkuService.handleDiscountPurchaseGoods(sku, sku.getDiscountPlusPurchaseGoods());
         goodsDonSkuService.saveOrUpdate(sku);
         //给平台更新额外属性
         goodsDonService.updateGoodsSkuPrice(sku.getGoodsId(), null);
@@ -272,6 +282,7 @@ public class CmsGoodsDonSkuController {
     public Result<String> skuDelete(@PathVariable Long skuId) {
         //给平台更新额外属性
         GoodsDonSku sku = goodsDonSkuService.getById(skuId);
+        goodsDonSkuService.handleDiscountPurchaseGoods(sku, null);
         goodsDonSkuService.removeById(skuId);
         goodsDonService.updateGoodsSkuPrice(sku.getGoodsId(), null);
         Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "*");