Sfoglia il codice sorgente

Merge branch 'ig_sku_func'

zoujiajian 2 anni fa
parent
commit
9db684cf3a
29 ha cambiato i file con 509 aggiunte e 110 eliminazioni
  1. 19 0
      netflix-common/src/main/java/com/cyksj/dto/UserSharedDto.java
  2. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonSkuMapper.java
  3. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsExportMapper.java
  4. 22 0
      netflix-dao/src/main/java/com/cyksj/model/dto/MonthlyUserOrderDetailDto.java
  5. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
  6. 14 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  7. 14 0
      netflix-dao/src/main/java/com/cyksj/model/excel/ExcelMonthOrderData.java
  8. 6 1
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
  9. 15 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  10. 27 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeSearchView.java
  11. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java
  12. 4 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListCategoryView.java
  13. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  14. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/GroupsDataStatisticsView.java
  15. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementFrontView.java
  16. 11 0
      netflix-dao/src/main/resources/mapper/GoodsDonSkuMapper.xml
  17. 21 0
      netflix-dao/src/main/resources/mapper/StatisticsExportMapper.xml
  18. 24 5
      netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonServiceImpl.java
  19. 21 9
      netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSpecServiceImpl.java
  20. 26 1
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  21. 2 2
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  22. 5 0
      netflix-service/src/main/java/com/cyksj/service/user/UserService.java
  23. 48 30
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  24. 155 49
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  25. 10 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  26. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgBulkTaskController.java
  27. 9 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  28. 31 9
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java
  29. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

+ 19 - 0
netflix-common/src/main/java/com/cyksj/dto/UserSharedDto.java

@@ -0,0 +1,19 @@
+package com.cyksj.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSharedDto
+ * 创建者: JavaZou
+ * 创建时间:2024/1/2 15:41
+ */
+@Getter
+@Setter
+public class UserSharedDto {
+
+	private Long sharedId;
+
+	private Long dsPopularizeId;
+}

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

@@ -22,4 +22,6 @@ public interface GoodsDonSkuMapper  extends BaseMapper<GoodsDonSku> {
 	List<YhShopGoodsSku> selectSkuShops(@Param("list") List<Long> goodsIds);
 
 	List<Long> selectSingleSkuIdsByGoodsId(Long goodsId);
+
+	GoodsDonSku checkAndReturnMinPriceUserOwnsSku(@Param("goodsId") Long goodsId, @Param("dsUserId") Long dsUserId);
 }

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsExportMapper.java

@@ -1,6 +1,7 @@
 package com.cyksj.mapper.manage.statistics;
 
 import cn.hutool.core.date.DateTime;
+import com.cyksj.model.dto.MonthlyUserOrderDetailDto;
 import com.cyksj.model.dto.NatureOrderDataDto;
 import com.cyksj.model.excel.statistics.ExcelAppleOneData;
 import org.apache.ibatis.annotations.Param;
@@ -71,4 +72,6 @@ public interface StatisticsExportMapper{
 	Map<String, BigDecimal> getTransferData(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
 	List<NatureOrderDataDto> getGroupsOrderData(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+	List<MonthlyUserOrderDetailDto> getMonthlyUserOrderDetail(@Param("thisMonth") DateTime thisMonth, @Param("nextMonth") DateTime nextMonth);
 }

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/MonthlyUserOrderDetailDto.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: MonthlyUserOrderDetailDto
+ * 创建者: JavaZou
+ * 创建时间:2024/1/3 16:38
+ */
+@Getter
+@Setter
+public class MonthlyUserOrderDetailDto {
+	private Integer type;
+
+	private Integer orders;
+
+	private BigDecimal money;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java

@@ -204,6 +204,11 @@ public class GoodsDon extends BaseEntity {
      */
     private Boolean isSp;
 
+    /**
+     * 是否有专属用户规格属性
+     */
+    private Boolean isOwns;
+
     /**
      * 是否参与分销 默认参与
      */

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

@@ -2,6 +2,7 @@ package com.cyksj.model.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.views.DistributeSearchView;
 import com.cyksj.model.views.GoodsDiscountPlusPurchaseRelationFrontView;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
@@ -107,6 +108,19 @@ public class GoodsDonSku extends BaseEntity {
      */
     private BigDecimal price;
 
+    /**
+     * 专属用户规格
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String userOwns;
+
+    /**
+     * 专属用户列表
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private List<DistributeSearchView> userOwnsList;
+
     /**
      * 是否开启实物车票时长权益
      */

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelMonthOrderData.java

@@ -5,6 +5,8 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: ExcelMonthOrderData
@@ -69,6 +71,18 @@ public class ExcelMonthOrderData {
 	@ExcelProperty({"品类数据类", "AI类复购数据", "C.A用户中购买第二单流媒体产品的用户数"})
 	private Integer monthAiNewPayStreamingNumOfUser;
 
+	@ExcelProperty({"用户维度", "当月新用户", "订单量"})
+	private Integer monthlyNewUserOrders;
+
+	@ExcelProperty({"用户维度", "当月新用户", "金额"})
+	private BigDecimal monthlyNewUserOrdersMoney;
+
+	@ExcelProperty({"用户维度", "当月之前老用户", "订单量"})
+	private Integer monthlyBeforeUserOrders;
+
+	@ExcelProperty({"用户维度", "当月之前老用户", "金额"})
+	private BigDecimal monthlyBeforeUserOrdersMoney;
+
 //	@ExcelProperty({"历史复购","有奈飞车票的人数"})
 //	private Integer nfTicketNumOfUser;
 //

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

@@ -66,6 +66,11 @@ public class ReqGoodsSkuInsert {
 
         private BigDecimal price;
 
+        /**
+         * 专属用户规格
+         */
+        private String userOwns;
+
         /**
          * 数量
          */
@@ -104,7 +109,7 @@ public class ReqGoodsSkuInsert {
         /**
          * 特定价格
          */
-        private String specificPrice;
+        private BigDecimal specificPrice;
 
         /**
          * 特定平台购买用户人群

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java

@@ -224,6 +224,21 @@ public class OrderDonBackView {
 	@DbField("o.phone")
 	private String orderPhone;
 
+	@DbField("o.yhs_id")
+	private Long yhsId;
+
+	/**
+	 * 店铺自定义id
+	 */
+	@DbIgnore
+	private String customId;
+
+	/**
+	 * 店铺名
+	 */
+	@DbIgnore
+	private String shopName;
+
 	@DbIgnore
 	private OrderDonWaybill waybill;
 

+ 27 - 0
netflix-dao/src/main/java/com/cyksj/model/views/DistributeSearchView.java

@@ -0,0 +1,27 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: DistributeSearchView
+ * 创建者: JavaZou
+ * 创建时间:2024/1/2 15:34
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_distribute ud inner join user u on u.id = ud.user_id and ud.deleted is true")
+public class DistributeSearchView {
+
+	@DbField("ud.id")
+	private Long distributeId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("ud.user_id")
+	private Long userId;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java

@@ -90,6 +90,11 @@ public class GoodsDonSkuFrontView {
 	 */
 	private BigDecimal price;
 
+	/**
+	 * 专属用户规格
+	 */
+	private String userOwns;
+
 	/**
 	 * 月数
 	 */

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListCategoryView.java

@@ -109,6 +109,10 @@ public class GoodsFrontListCategoryView {
 	@DbField("g.is_sp")
 	private Boolean isSp;
 
+
+	@DbField("g.is_owns")
+	private Boolean isOwns;
+
 	@DbField("g.video")
 	private String video;
 

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

@@ -128,6 +128,9 @@ public class GoodsFrontListView {
 	@DbField("g.is_sp")
 	private Boolean isSp;
 
+	@DbField("g.is_owns")
+	private Boolean isOwns;
+
 	@DbField("g.detail")
 	private String detail;
 

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/views/GroupsDataStatisticsView.java

@@ -78,7 +78,7 @@ public class GroupsDataStatisticsView {
 	private BigDecimal newBuyOrderMoney;
 
 	/**
-	 * 解绑渠道销售金额
+	 * 解绑渠道流媒体销售金额
 	 */
 	private BigDecimal unBIndGroupsStreamingMoney;
 

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

@@ -41,6 +41,9 @@ public class HomeManagementFrontView {
 	@DbField("g.logo")
 	private String logo;
 
+	@DbField("g.is_owns")
+	private Boolean isOwns;
+
 	@DbField("hc.url")
 	private String url;
 

+ 11 - 0
netflix-dao/src/main/resources/mapper/GoodsDonSkuMapper.xml

@@ -37,4 +37,15 @@
     <select id="selectSingleSkuIdsByGoodsId" resultType="java.lang.Long">
         select id from goods_don_sku where goods_id = #{goodsId} and num = 1
     </select>
+
+    <select id="checkAndReturnMinPriceUserOwnsSku" resultType="com.cyksj.model.entity.GoodsDonSku">
+        select id,price,months,days
+        from goods_don_sku
+        where goods_id = #{goodsId}
+        and status is true
+        and (user_owns is null
+        <if test="dsUserId != 0">
+            or JSON_CONTAINS(user_owns, '${dsUserId}')
+        </if>) order by price limit 1
+    </select>
 </mapper>

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

@@ -484,4 +484,25 @@
             and o.created_time &lt; #{endDate}
         </if>) s group by `type`
     </select>
+
+    <select id="getMonthlyUserOrderDetail" resultType="com.cyksj.model.dto.MonthlyUserOrderDetailDto">
+        select cast(((sum(money) - sum(ifnull(refund_money, 0))) / 100) as decimal(10,2)) as money,
+               count(if(`status` != 'refund', 1, NUll))          as orders,
+               1                                                    type
+        from `order_don` o
+                 left join user u on u.id = o.user_id
+
+        where o.status not in ('close', 'noPayment')
+          and o.created_time BETWEEN #{thisMonth} and #{nextMonth}
+          and u.created_time &lt; #{thisMonth}
+        union all
+        select cast(((sum(money) - sum(ifnull(refund_money, 0))) / 100) as decimal(10,2)) as money,
+               count(if(`status` != 'refund', 1, NUll))          as orders,
+               2                                                    type
+        from `order_don` o
+                 left join user u on u.id = o.user_id
+        where o.status not in ('close', 'noPayment')
+          and o.created_time BETWEEN #{thisMonth} and #{nextMonth}
+          and u.created_time BETWEEN #{thisMonth} and #{nextMonth}
+    </select>
 </mapper>

+ 24 - 5
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonServiceImpl.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.mange.goods;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.mapper.GoodsDonMapper;
@@ -15,6 +16,7 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * @author chan
@@ -36,15 +38,32 @@ public class CmsGoodsDonServiceImpl extends ServiceImpl<GoodsDonMapper, GoodsDon
 				.eq(GoodsDonSku::getGoodsId, goodsId)
 				.eq(GoodsDonSku::getStatus, true)
 				.orderByAsc(GoodsDonSku::getPrice));
-		//是否有特定价格规格
-		if (goods.getIsSp() && CollUtil.isEmpty(skuViews)) {
-			goods.setIsSp(false);
+		//是否有特殊属性
+		if (CollUtil.isEmpty(skuViews)) {
+			if (goods.getIsSp()) {
+				goods.setIsSp(false);
+			}
+			if (goods.getIsOwns()) {
+				goods.setIsOwns(false);
+			}
 			goodsDonMapper.updateById(goods);
 		}
 		if (!skuViews.isEmpty()) {
 			//是否有特定价格规格
-			Optional<GoodsDonSku> specificSkuAny = skuViews.stream().filter(sku -> sku.getSpecificPrice().compareTo(BigDecimal.ZERO) > 0).findAny();
-			goods.setIsSp(specificSkuAny.isPresent() ? true : false);
+			if (goods.getIsSp() || goods.getIsOwns()) {
+				AtomicBoolean isSp = new AtomicBoolean(false);
+				AtomicBoolean isOwns = new AtomicBoolean(false);
+				skuViews.stream().forEach(sku->{
+					if (sku.getSpecificPrice().compareTo(BigDecimal.ZERO) > 0) {
+						isSp.set(true);
+					}
+					if (StrUtil.isNotBlank(sku.getUserOwns())) {
+						isOwns.set(true);
+					}
+				});
+				goods.setIsSp(isSp.get());
+				goods.setIsOwns(isOwns.get());
+			}
 
 			GoodsDonSku min = skuViews.get(0);
 			goods.setMinPrice(min.getPrice());

+ 21 - 9
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSpecServiceImpl.java

@@ -245,16 +245,28 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 			String specificGoodsIds = goodsDonSku.getSpecificGoodsIds();
 			if (StrUtil.isNotBlank(specificGoodsIds)) {
 				Set<Long> specificGids = Jsons.parseSet(specificGoodsIds, Long.class);
-				Integer count = goodsDonMapper.selectCount(Wrappers.lambdaQuery(GoodsDon.class)
-						.in(GoodsDon::getId, specificGids)
-						.eq(GoodsDon::getStatus, true)
-						.eq(GoodsDon::getDeleted, true));
-				if (count != specificGids.size()) {
-					throw BusinessRuntimeException.getInstance("存在被删除或已下架的平台");
+				if (specificGids.isEmpty()) {
+					goodsDonSku.setSpecificPrice(BigDecimal.ZERO);
+				} else {
+					Integer count = goodsDonMapper.selectCount(Wrappers.lambdaQuery(GoodsDon.class)
+							.in(GoodsDon::getId, specificGids)
+							.eq(GoodsDon::getStatus, true)
+							.eq(GoodsDon::getDeleted, true));
+					if (count != specificGids.size()) {
+						throw BusinessRuntimeException.getInstance("存在被删除或已下架的平台");
+					}
+					BigDecimal specificPrice = goodsDonSku.getSpecificPrice();
+					if (specificPrice == null || specificPrice.compareTo(BigDecimal.ZERO) <= 0) {
+						throw BusinessRuntimeException.getInstance("请输入正确的特定价格");
+					}
 				}
-				BigDecimal specificPrice = goodsDonSku.getSpecificPrice();
-				if (specificPrice == null || specificPrice.compareTo(BigDecimal.ZERO) <= 0) {
-					throw BusinessRuntimeException.getInstance("请输入正确的特定价格");
+			}
+			if (StrUtil.isNotEmpty(goodsDonSku.getUserOwns())) {
+				List<Long> userOwnsList = Jsons.parseList(goodsDonSku.getUserOwns(), Long.class);
+				if (CollUtil.isEmpty(userOwnsList)) {
+					goodsDonSku.setUserOwns(null);
+				} else {
+					goodsDonSku.setUserOwns(userOwnsList.toString());
 				}
 			}
 			goodsDonSkuMapper.insert(goodsDonSku);

+ 26 - 1
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -12,6 +12,7 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.statistics.*;
 import com.cyksj.mapper.shop.YhShopMapper;
+import com.cyksj.model.dto.MonthlyUserOrderDetailDto;
 import com.cyksj.model.dto.NatureOrderDataDto;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
@@ -598,6 +599,25 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		//Ai A中第二单 为流媒体
 		Integer monthAiNewPayStreamingNumOfUser = statisticsExportMapper.getMonthAiNewPayStreamingNumOfUser(thisMonth, nextMonth);
 
+		//用户维度 订单数据
+		List<MonthlyUserOrderDetailDto> monthlyUserOrderDetails = statisticsExportMapper.getMonthlyUserOrderDetail(thisMonth, nextMonth);
+		Integer monthlyNewUserOrders = 0;
+		BigDecimal monthlyNewUserOrdersMoney = BigDecimal.ZERO;
+		Integer monthlyBeforeUserOrders = 0;
+		BigDecimal monthlyBeforeUserOrdersMoney = BigDecimal.ZERO;
+		for (MonthlyUserOrderDetailDto monthlyUserOrderDetail : monthlyUserOrderDetails) {
+			BigDecimal money = monthlyUserOrderDetail.getMoney();
+			Integer orders = monthlyUserOrderDetail.getOrders();
+			//上月
+			if (monthlyUserOrderDetail.getType() == 1) {
+				monthlyBeforeUserOrders = orders;
+				monthlyBeforeUserOrdersMoney = money;
+			} else {
+				monthlyNewUserOrders = orders;
+				monthlyNewUserOrdersMoney = money;
+			}
+		}
+
 //		//历史复购 AI、奈飞车票人数 以及交叉
 //		Integer nfTicketNumOfUser = statisticsExportMapper.getNfTicketNumOfUser(1l);
 //
@@ -629,7 +649,12 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 				.setMonthStreamingNewPayAiNumOfUser(monthStreamingNewPayAiNumOfUser)
 				.setMonthAiNewNumOfUser(monthAiNewNumOfUser)
 				.setMonthAiNewPayOtherNumOfUser(monthAiNewPayOtherNumOfUser)
-				.setMonthAiNewPayStreamingNumOfUser(monthAiNewPayStreamingNumOfUser);
+				.setMonthAiNewPayStreamingNumOfUser(monthAiNewPayStreamingNumOfUser)
+				.setMonthlyNewUserOrders(monthlyNewUserOrders)
+				.setMonthlyNewUserOrdersMoney(monthlyNewUserOrdersMoney)
+				.setMonthlyBeforeUserOrders(monthlyBeforeUserOrders)
+				.setMonthlyBeforeUserOrdersMoney(monthlyBeforeUserOrdersMoney)
+				;
 //				.setNfTicketNumOfUser(nfTicketNumOfUser)
 //				.setAiTicketNumOfUser(aiTicketNumOfUser)
 //				.setNfAiTicketNumOfUser(nfAiTicketNumOfUser)

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -108,11 +108,11 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		}
 		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-		Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
+		//Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
 		List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, builder
 				.field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
 				.field(RenewalView::getUserId, userIds).op(Operator.InList)
-				.field(RenewalView::getYhsId, yhsId)
+				//.field(RenewalView::getYhsId, yhsId)
 				.field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
 				.orderBy(RenewalView::getExpiryTime).asc()
 				.build());

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.user;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.dto.UserSharedDto;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.UserWhoami;
 import com.cyksj.model.entity.User;
@@ -51,4 +52,8 @@ public interface UserService extends IService<User> {
 	 * 领取礼品卡
 	 */
 	void receiveGiftCardByRc(Long userId, String code, Long relationId);
+
+	UserSharedDto getUserShredDtoByDsCode(String dsCode);
+
+	Long getSharedIdByUserId(Long userId);
 }

+ 48 - 30
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -16,6 +16,7 @@ import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
+import com.cyksj.dto.UserSharedDto;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.corp.CorpCustomerAcquisitionLinkMapper;
@@ -23,6 +24,7 @@ import com.cyksj.mapper.corp.CorpFollowActiveCodeMapper;
 import com.cyksj.mapper.corp.CorpUserMapper;
 import com.cyksj.mapper.corp.CorpWelcomeTemplateMapper;
 import com.cyksj.mapper.manage.cps.UserDistributePopularizeMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
@@ -113,6 +115,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 	private final CorpWelcomeTemplateMapper corpWelcomeTemplateMapper;
 
 	private final UserLoginRecordService userLoginRecordService;
+
+	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -174,21 +179,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		}
 		Long dsPopularizeId = null;
 		if (StrUtil.isNotBlank(dsCode)) {
-			dsCode = dsCode.trim();
-			User sharedUser = getOne(Wrappers.lambdaQuery(User.class)
-					.eq(User::getShowId, dsCode).last("limit 1"));
-			if (sharedUser != null) {
-				sharedId = sharedUser.getId();
-			} else {
-				UserDistributePopularize distributePopularize = distributePopularizeMapper.selectOne(Wrappers.lambdaQuery(UserDistributePopularize.class)
-						.eq(UserDistributePopularize::getCode, dsCode)
-						.select(UserDistributePopularize::getUserId, UserDistributePopularize::getId).last("limit 1"));
-				if (distributePopularize != null) {
-					log.info("渠道sharedId:{}设置固定推广链接用户分销", distributePopularize.getUserId());
-					sharedId = distributePopularize.getUserId();
-					dsPopularizeId = distributePopularize.getId();
-				}
-			}
+			UserSharedDto userSharedDto = getUserShredDtoByDsCode(dsCode);
+			sharedId = userSharedDto.getSharedId();
+			dsPopularizeId = userSharedDto.getDsPopularizeId();
 		}
 		if (sharedId != null && isNewUser) {
 			if (dsType == null || dsType == 1) {
@@ -428,21 +421,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		String customId = loginReq.getCustomId();
 		Boolean isNewUser = false;
 		if (StrUtil.isNotBlank(dsCode)) {
-			dsCode = dsCode.trim();
-			User sharedUser = this.getOne(Wrappers.lambdaQuery(User.class)
-					.eq(User::getShowId, dsCode).last("limit 1"));
-			if (sharedUser != null) {
-				sharedId = sharedUser.getId();
-			} else {
-				UserDistributePopularize distributePopularize = distributePopularizeMapper.selectOne(Wrappers.lambdaQuery(UserDistributePopularize.class)
-						.eq(UserDistributePopularize::getCode, dsCode)
-						.select(UserDistributePopularize::getUserId, UserDistributePopularize::getId).last("limit 1"));
-				if (distributePopularize != null) {
-					log.info("渠道sharedId:{}设置固定推广链接PC用户分销", distributePopularize.getUserId());
-					sharedId = distributePopularize.getUserId();
-					dsPopularizeId = distributePopularize.getId();
-				}
-			}
+			UserSharedDto userSharedDto = getUserShredDtoByDsCode(dsCode);
+			sharedId = userSharedDto.getSharedId();
+			dsPopularizeId = userSharedDto.getDsPopularizeId();
 		}
 		if (user != null && loginReq.getType() == 3 && !user.getIsGoogle()) {
 			user.setIsGoogle(true);
@@ -710,4 +691,41 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 			}
 		}
 	}
+
+	@Override
+	public UserSharedDto getUserShredDtoByDsCode(String dsCode) {
+		Long sharedId = null;
+		Long dsPopularizeId = null;
+		dsCode = dsCode.trim();
+		User sharedUser = getOne(Wrappers.lambdaQuery(User.class)
+				.eq(User::getShowId, dsCode).last("limit 1"));
+		if (sharedUser != null) {
+			sharedId = sharedUser.getId();
+		} else {
+			UserDistributePopularize distributePopularize = distributePopularizeMapper.selectOne(Wrappers.lambdaQuery(UserDistributePopularize.class)
+					.eq(UserDistributePopularize::getCode, dsCode)
+					.select(UserDistributePopularize::getUserId, UserDistributePopularize::getId).last("limit 1"));
+			if (distributePopularize != null) {
+				log.info("渠道sharedId:{}设置固定推广链接用户分销", distributePopularize.getUserId());
+				sharedId = distributePopularize.getUserId();
+				dsPopularizeId = distributePopularize.getId();
+			}
+		}
+		UserSharedDto sharedDto = new UserSharedDto();
+		sharedDto.setSharedId(sharedId);
+		sharedDto.setDsPopularizeId(dsPopularizeId);
+		return sharedDto;
+	}
+
+	@Override
+	public Long getSharedIdByUserId(Long userId) {
+		UserDistributeShared distributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class)
+				.eq(UserDistributeShared::getUserId, userId)
+				.last("limit 1")
+				.select(UserDistributeShared::getSharedId));
+		if (distributeShared == null) {
+			return 0l;
+		}
+		return distributeShared.getSharedId();
+	}
 }

+ 155 - 49
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -13,6 +13,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
+import com.cyksj.dto.UserSharedDto;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
@@ -24,6 +25,7 @@ import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.home.ClickRecordFrontService;
 import com.cyksj.service.shop.YhShopFrontService;
+import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -38,6 +40,8 @@ import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -69,6 +73,8 @@ public class GoodsDonController {
 
 	private final YhShopFrontService yhShopFrontService;
 
+	private final UserService userService;
+
 	/**
      * 获取平台商品分类
      */
@@ -209,6 +215,7 @@ public class GoodsDonController {
      * 官网首页 平台列表
      */
     @GetMapping("/get/list")
+    @Deprecated
     public Result<? extends Object> getGoodsList(String customId) {
 	    if (StrUtil.isNotBlank(customId)) {
 		    Result<List<YhShopGoodsFrontView>> shopGoods = getShopGoods(yhShopFrontService.getYhsIdByCustomId(customId));
@@ -243,7 +250,7 @@ public class GoodsDonController {
 		    data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1, null));
 
 		    //设置特定价格
-		    setSpecificPrice(data, fUid);
+		    setSpecificPrice(data, fUid, null);
 	    });
 	    return GatewayResponse.SUCCESS.newBuilder().toResult(Optional.of(list));
     }
@@ -287,7 +294,7 @@ public class GoodsDonController {
 		    data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1, null));
 
 		    //设置特定价格
-		    setSpecificPrice(data, fUid);
+		    setSpecificPrice(data, fUid, null);
 	    });
 	    return GatewayResponse.SUCCESS.newBuilder().toResult(Optional.of(list));
     }
@@ -326,16 +333,15 @@ public class GoodsDonController {
 	 * 获取商品详情
 	 */
 	@GetMapping("/get/{id}")
-	public Result<? extends Object> getDetail(@PathVariable Long id, String customId) {
+	public Result<? extends Object> getDetail(@PathVariable Long id, String customId, String dsCode) {
 		if (StrUtil.isNotBlank(customId) && id != 15) {
 			Result<YhShopGoodsFrontView> yhShopGoodsDetail = getGoodsDetailByYhsId(yhShopFrontService.getYhsIdByCustomId(customId), id);
 			return yhShopGoodsDetail;
 		}
 		String goodsDetailKey = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "goods_detail:" + id;
 		Object o = redisService.get(goodsDetailKey);
-		GoodsFrontListView views = null;
 		if (o == null) {
-			views = beanSearcher.searchFirst(GoodsFrontListView.class, MapUtils.builder().field(GoodsFrontListView::getId, id)
+			GoodsFrontListView views = beanSearcher.searchFirst(GoodsFrontListView.class, MapUtils.builder().field(GoodsFrontListView::getId, id)
 					.build());
 
 			views.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
@@ -349,10 +355,26 @@ public class GoodsDonController {
 			o = redisService.get(goodsDetailKey);
 		}
 		Long fUid = StpUserUtil.getUserIdAfterLogin();
-		if (views == null) {
-			views = Jsons.parseObject(o, GoodsFrontListView.class);
+		GoodsFrontListView views = Jsons.parseObject(o, GoodsFrontListView.class);
+		AtomicLong dsUserId = new AtomicLong();
+		AtomicBoolean existsChannel = new AtomicBoolean(true);
+		if (StrUtil.isNotBlank(dsCode)) {
+			UserSharedDto userSharedDto = userService.getUserShredDtoByDsCode(dsCode);
+			dsUserId.set(userSharedDto.getSharedId());
 		}
-		for (GoodsDonSkuFrontView sku : views.getSkuList()) {
+		views.setSkuList(views.getSkuList().stream().filter(sku -> {
+			if (StrUtil.isNotBlank(sku.getUserOwns())) {
+				if (dsUserId.get() == 0 && fUid != null && existsChannel.get()) {
+					Long sharedId = userService.getSharedIdByUserId(fUid);
+					if (sharedId == 0) {
+						existsChannel.set(false);
+					}
+					dsUserId.set(sharedId);
+				}
+				if (dsUserId.get() == 0 || !sku.getUserOwns().contains(String.valueOf(dsUserId.get()))) {
+					return false;
+				}
+			}
 			if (sku.getIsDp()) {
 				sku.setDpSkuViews(beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelationFrontView.class, MapUtils.builder()
 						.field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId())
@@ -362,27 +384,28 @@ public class GoodsDonController {
 				if (fUid == null) {
 					sku.setSpecificPrice(null);
 					sku.setSpecificGoodsIds(null);
-					continue;
-				}
-				//设置特定价格
-				if (!isPaySpecificGoodsIds(sku.getSpecificGoodsIds(), fUid)) {
-					sku.setSpecificGoodsIds(null);
-					sku.setSpecificPrice(null);
-				} else {
-					BigDecimal specificPrice = views.getSpecificPrice();
-
-					BigDecimal skuSpecificPrice = sku.getSpecificPrice();
-					Long specificSkuId = sku.getId();
-					if (specificPrice == null) {
-						views.setSpecificPrice(skuSpecificPrice);
-						views.setSpecificSkuId(specificSkuId);
-					} else if (specificPrice.compareTo(skuSpecificPrice) > 0) {
-						views.setSpecificPrice(skuSpecificPrice);
-						views.setSpecificSkuId(specificSkuId);
+				}else {
+					//设置特定价格
+					if (!isPaySpecificGoodsIds(sku.getSpecificGoodsIds(), fUid)) {
+						sku.setSpecificGoodsIds(null);
+						sku.setSpecificPrice(null);
+					} else {
+						BigDecimal specificPrice = views.getSpecificPrice();
+
+						BigDecimal skuSpecificPrice = sku.getSpecificPrice();
+						Long specificSkuId = sku.getId();
+						if (specificPrice == null) {
+							views.setSpecificPrice(skuSpecificPrice);
+							views.setSpecificSkuId(specificSkuId);
+						} else if (specificPrice.compareTo(skuSpecificPrice) > 0) {
+							views.setSpecificPrice(skuSpecificPrice);
+							views.setSpecificSkuId(specificSkuId);
+						}
 					}
 				}
 			}
-		}
+			return true;
+		}).collect(Collectors.toList()));
 		Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
 				.eq(OrderDon::getGoodsId, views.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
 		views.setSold(sold + views.getSold());
@@ -400,7 +423,7 @@ public class GoodsDonController {
      * 获取商品推荐平台
      */
     @GetMapping("/get/recommend/{id}")
-    public Result<List<GoodsFrontListView>> getRecommendGoodsByGid(@PathVariable Long id, String customId) throws Exception {
+    public Result<List<GoodsFrontListView>> getRecommendGoodsByGid(@PathVariable Long id, String customId, String dsCode) throws Exception {
 	    String key = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "recommend:" + id;
 	    Long yhsId = null;
 	    if (StrUtil.isNotBlank(customId)) {
@@ -432,13 +455,36 @@ public class GoodsDonController {
 	    if (goodsRecommendViews == null) {
 		    goodsRecommendViews = Jsons.parseList(o.toString(), GoodsFrontListView.class);
 	    }
-	    goodsRecommendViews.forEach(data -> {
+	    AtomicLong dsUserId = new AtomicLong();
+	    AtomicBoolean existsChannel = new AtomicBoolean(true);
+	    if (StrUtil.isNotBlank(dsCode)) {
+		    UserSharedDto userSharedDto = userService.getUserShredDtoByDsCode(dsCode);
+		    dsUserId.set(userSharedDto.getSharedId());
+	    }
+	    goodsRecommendViews = goodsRecommendViews.stream().filter(data -> {
+		    if (data.getIsOwns()) {
+			    if (dsUserId.get() == 0 && fUid != null && existsChannel.get()) {
+				    Long sharedId = userService.getSharedIdByUserId(fUid);
+				    if (sharedId == 0) {
+					    existsChannel.set(false);
+				    }
+				    dsUserId.set(sharedId);
+			    }
+			    GoodsDonSku minPriceUserOwnsSku = goodsDonSkuMapper.checkAndReturnMinPriceUserOwnsSku(data.getId(), dsUserId.get());
+			    if (minPriceUserOwnsSku == null) {
+				    return false;
+			    }
+			    data.setPrice(minPriceUserOwnsSku.getPrice());
+			    data.setMonths(minPriceUserOwnsSku.getMonths());
+			    data.setDays(minPriceUserOwnsSku.getDays());
+		    }
 		    Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
 				    .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
-			data.setSold(data.getSold() + sold);
+		    data.setSold(data.getSold() + sold);
 		    //设置特定价格
-		    setSpecificPrice(data, fUid);
-	    });
+		    setSpecificPrice(data, fUid, dsUserId.get());
+		    return true;
+	    }).collect(Collectors.toList());
 	    return GatewayResponse.SUCCESS.newBuilder().toResult(goodsRecommendViews);
     }
 
@@ -482,7 +528,7 @@ public class GoodsDonController {
 	 * 获取首页配置列表
 	 */
 	@GetMapping("/get/homeManage")
-	public Result<Map<String, List<HomeManagementFrontView>>> getHomeManagementFrontPage(String customId) {
+	public Result<Map<String, List<HomeManagementFrontView>>> getHomeManagementFrontPage(String customId, String dsCode) {
 		String key = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "homeManage";
 		Long yhsId = null;
 		if (StrUtil.isNotBlank(customId)) {
@@ -511,21 +557,22 @@ public class GoodsDonController {
 			redisService.setNx(key, map, 50 * 60l);
 			o = redisService.get(key);
 		}
+		AtomicLong dsUserId = new AtomicLong();
+		AtomicBoolean existsChannel = new AtomicBoolean(true);
+		if (StrUtil.isNotBlank(dsCode)) {
+			UserSharedDto userSharedDto = userService.getUserShredDtoByDsCode(dsCode);
+			dsUserId.set(userSharedDto.getSharedId());
+		}
 		Map<String, List<HomeManagementFrontView>> map = Jsons.parseObject(o, Map.class);
 		if (map.containsKey(HomeManagementConfig.Type.ex.name()) || map.containsKey(HomeManagementConfig.Type.vg.name())) {
 			try {
-				//设置特定价格
+				//精彩推荐
 				List<HomeManagementFrontView> exList = Jsons.parseList(Jsons.toJson(map.get(HomeManagementConfig.Type.ex.name())), HomeManagementFrontView.class);
-				if (CollUtil.isNotEmpty(exList)) {
-					setHomeManageSpecific(exList, fUid);
-					map.put(HomeManagementConfig.Type.ex.name(), exList);
-				}
-				//设置特定价格
+				setHomeConfigGoods(map, HomeManagementConfig.Type.ex, exList, dsUserId, existsChannel, fUid);
+
+				//虚拟平台
 				List<HomeManagementFrontView> vgList = Jsons.parseList(Jsons.toJson(map.get(HomeManagementConfig.Type.vg.name())), HomeManagementFrontView.class);
-				if (CollUtil.isNotEmpty(vgList)) {
-					setHomeManageSpecific(vgList, fUid);
-					map.put(HomeManagementConfig.Type.vg.name(), vgList);
-				}
+				setHomeConfigGoods(map, HomeManagementConfig.Type.vg, vgList, dsUserId, existsChannel, fUid);
 			} catch (Exception e) {
 			}
 		}
@@ -637,7 +684,7 @@ public class GoodsDonController {
     /**
      * 设置平台 特定价格
      */
-    public void setSpecificPrice(GoodsFrontListView data, Long fUid) {
+    public void setSpecificPrice(GoodsFrontListView data, Long fUid, Long dsUserId) {
 	    if (fUid != null) {
 		    if (data.getIsSp()) {
 			    //查找所有特定规格最小价格 满足条件
@@ -655,6 +702,9 @@ public class GoodsDonController {
 				    redisService.setNx(specificGoodsKey, specificSkus, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
 			    }
 			    specificSkus.forEach(specificSku -> {
+				    if (StrUtil.isNotEmpty(specificSku.getUserOwns()) && (dsUserId == null || !specificSku.getUserOwns().contains(dsUserId.toString()))) {
+					    return;
+				    }
 				    String specificGoodsIdsStr = specificSku.getSpecificGoodsIds();
 				    if (isPaySpecificGoodsIds(specificGoodsIdsStr, fUid)) {
 					    BigDecimal specificPrice = data.getSpecificPrice();
@@ -686,7 +736,7 @@ public class GoodsDonController {
 	/**
 	 * 设置平台 特定价格
 	 */
-	public void setGcSpecificPrice(GoodsFrontListCategoryView data, Long fUid) {
+	public void setGcSpecificPrice(GoodsFrontListCategoryView data, Long fUid, Long dsUserId) {
 		if (fUid != null) {
 			if (data.getIsSp()) {
 				//查找所有特定规格最小价格 满足条件
@@ -704,6 +754,9 @@ public class GoodsDonController {
 					redisService.setNx(specificGoodsKey, specificSkus, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
 				}
 				specificSkus.forEach(specificSku -> {
+					if (StrUtil.isNotEmpty(specificSku.getUserOwns()) && (dsUserId == null || !specificSku.getUserOwns().contains(dsUserId.toString()))) {
+						return;
+					}
 					String specificGoodsIdsStr = specificSku.getSpecificGoodsIds();
 					if (isPaySpecificGoodsIds(specificGoodsIdsStr, fUid)) {
 						BigDecimal specificPrice = data.getSpecificPrice();
@@ -757,13 +810,16 @@ public class GoodsDonController {
 	/**
 	 * 设置首页配置 涉及平台特定价格
 	 */
-	public void setHomeManageSpecific(List<HomeManagementFrontView> list, Long fUid) {
+	public void setHomeManageSpecific(List<HomeManagementFrontView> list, Long fUid, Long dsUserId) {
 		DateTime now = DateTime.now();
 		list.forEach(data -> {
 			if (data.getIsSp() != null && data.getIsSp() && fUid != null) {
 				//查找所有特定规格最小价格 满足条件
 				List<GoodsDonSku> specificSkus = getSpecificSku(data.getGoodsId());
 				specificSkus.forEach(specificSku -> {
+					if (StrUtil.isNotEmpty(specificSku.getUserOwns()) && (dsUserId == null || !specificSku.getUserOwns().contains(dsUserId.toString()))) {
+						return;
+					}
 					String specificGoodsIdsStr = specificSku.getSpecificGoodsIds();
 					if (isPaySpecificGoodsIds(specificGoodsIdsStr, fUid)) {
 						BigDecimal specificPrice = data.getSpecificPrice();
@@ -786,6 +842,33 @@ public class GoodsDonController {
 		});
 	}
 
+	public void setHomeConfigGoods(Map<String, List<HomeManagementFrontView>> map, HomeManagementConfig.Type type, List<HomeManagementFrontView> list, AtomicLong dsUserId, AtomicBoolean existsChannel, Long fUid) throws Exception {
+		//设置特定价格
+		if (CollUtil.isNotEmpty(list)) {
+			list = list.stream().filter(data -> {
+				if (data.getIsOwns()) {
+					if (dsUserId.get() == 0 && fUid != null && existsChannel.get()) {
+						Long sharedId = userService.getSharedIdByUserId(fUid);
+						if (sharedId == 0) {
+							existsChannel.set(false);
+						}
+						dsUserId.set(sharedId);
+					}
+					GoodsDonSku minPriceUserOwnsSku = goodsDonSkuMapper.checkAndReturnMinPriceUserOwnsSku(data.getGoodsId(), dsUserId.get());
+					if (minPriceUserOwnsSku == null) {
+						return false;
+					}
+					data.setPrice(minPriceUserOwnsSku.getPrice());
+					data.setMonths(minPriceUserOwnsSku.getMonths());
+					data.setDays(minPriceUserOwnsSku.getDays());
+				}
+				return true;
+			}).collect(Collectors.toList());
+			setHomeManageSpecific(list, fUid, dsUserId.get());
+			map.put(type.name(), list);
+		}
+	}
+
     /**
      * 店铺平台列表
      */
@@ -843,7 +926,7 @@ public class GoodsDonController {
 	 * 根据分类获取对应平台
 	 */
 	@GetMapping("/get/categoryGoods")
-	public Result<? extends Object> getGoodsByCategory(Long cgy, String customId) {
+	public Result<? extends Object> getGoodsByCategory(Long cgy, String customId, String dsCode) {
 		if (StrUtil.isNotBlank(customId)) {
 			Result<List<YhShopGoodsFrontCategoryView>> shopGoods = getShopCategoryGoods(yhShopFrontService.getYhsIdByCustomId(customId), cgy);
 			return shopGoods;
@@ -866,14 +949,37 @@ public class GoodsDonController {
 		}
 		List<GoodsFrontListCategoryView> goodsFrontListViews = Jsons.parseList(o, GoodsFrontListCategoryView.class);
 		DateTime now = DateTime.now();
-		goodsFrontListViews.forEach(data -> {
+		AtomicLong dsUserId = new AtomicLong();
+		AtomicBoolean existsChannel = new AtomicBoolean(true);
+		if (StrUtil.isNotBlank(dsCode)) {
+			UserSharedDto userSharedDto = userService.getUserShredDtoByDsCode(dsCode);
+			dsUserId.set(userSharedDto.getSharedId());
+		}
+		goodsFrontListViews = goodsFrontListViews.stream().filter(data -> {
+			if (data.getIsOwns()) {
+				if (dsUserId.get() == 0 && fUid != null && existsChannel.get()) {
+					Long sharedId = userService.getSharedIdByUserId(fUid);
+					if (sharedId == 0) {
+						existsChannel.set(false);
+					}
+					dsUserId.set(sharedId);
+				}
+				GoodsDonSku minPriceUserOwnsSku = goodsDonSkuMapper.checkAndReturnMinPriceUserOwnsSku(data.getId(), dsUserId.get());
+				if (minPriceUserOwnsSku == null) {
+					return false;
+				}
+				data.setPrice(minPriceUserOwnsSku.getPrice());
+				data.setMonths(minPriceUserOwnsSku.getMonths());
+				data.setDays(minPriceUserOwnsSku.getDays());
+			}
 			Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
 					.eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
 			data.setSold(sold + data.getSold());
 			data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1, null));
 			//设置特定价格
-			setGcSpecificPrice(data, fUid);
-		});
+			setGcSpecificPrice(data, fUid, dsUserId.get());
+			return true;
+		}).collect(Collectors.toList());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsFrontListViews);
 	}
 

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -26,6 +26,7 @@ import com.cyksj.mapper.channel.UserPayEquipmentAvailableBenefitsMapper;
 import com.cyksj.mapper.channel.UserPayEquipmentReceiveBenefitsRecordMapper;
 import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
+import com.cyksj.mapper.shop.YhShopMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelOrderDonData;
 import com.cyksj.model.excel.ExcelRealGoodsOrderData;
@@ -97,6 +98,8 @@ public class CmsOrderController {
 
 	private final UserPayEquipmentAvailableBenefitsMapper availableBenefitsMapper;
 
+	private final YhShopMapper yhShopMapper;
+
 
 	@GetMapping("/get")
 	@SaCheckPermission("order:view")
@@ -164,6 +167,13 @@ public class CmsOrderController {
 							data.setIsHasBenefits(count == 0 ? true : false);
 						}
 					});
+			if (data.getYhsId() != 0) {
+				Optional.ofNullable(yhShopMapper.selectById(data.getYhsId()))
+						.ifPresent(e -> {
+							data.setShopName(e.getName());
+							data.setCustomId(e.getCustomId());
+						});
+			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgBulkTaskController.java

@@ -287,7 +287,7 @@ public class CorpMsgBulkTaskController {
 	 */
 	@DeleteMapping("/category/delete/{id}")
 	public Result<String> delCategory(@PathVariable Long id) {
-		int count = corpMsgBulkTaskService.count(Wrappers.lambdaQuery(CorpMsgBulkTask.class).eq(CorpMsgBulkTask::getCategory, id));
+		int count = corpMsgBulkTaskService.count(Wrappers.lambdaQuery(CorpMsgBulkTask.class).eq(CorpMsgBulkTask::getCategory, id).eq(CorpMsgBulkTask::getDeleted, 1));
 		if (count > 0) {
 			throw BusinessRuntimeException.getInstance("存在该分类下的群发任务");
 		}

+ 9 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -282,6 +282,15 @@ public class DistributeController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 渠道推广者查询列表
+	 */
+	@GetMapping("/search")
+	public Result<SearchResult<DistributeSearchView>> searchDistribute() {
+		SearchResult<DistributeSearchView> search = beanSearcher.search(DistributeSearchView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
 	/**
 	 * 所有固定推广者列表
 	 */

+ 31 - 9
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java

@@ -1,5 +1,6 @@
 package com.cyksj.web.controller.manage.goods;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
@@ -13,12 +14,14 @@ import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.manage.request.ReqGoodsSkuInsert;
 import com.cyksj.model.request.CombinationSkuReq;
+import com.cyksj.model.views.DistributeSearchView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import com.cyksj.service.mange.CmsGoodsDonSpecService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
@@ -122,16 +125,28 @@ public class CmsGoodsDonSkuController {
             sku.setSpecificPrice(BigDecimal.ZERO);
         } else {
             Set<Long> specificGids = Jsons.parseSet(specificGoodsIds, Long.class);
-            Integer count = goodsDonService.count(Wrappers.lambdaQuery(GoodsDon.class)
-                    .in(GoodsDon::getId, specificGids)
-                    .eq(GoodsDon::getStatus, true)
-                    .eq(GoodsDon::getDeleted, true));
-            if (count != specificGids.size()) {
-                throw BusinessRuntimeException.getInstance("存在被删除或已下架的平台");
+            if (specificGids.isEmpty()) {
+                sku.setSpecificPrice(BigDecimal.ZERO);
+            } else {
+                Integer count = goodsDonService.count(Wrappers.lambdaQuery(GoodsDon.class)
+                        .in(GoodsDon::getId, specificGids)
+                        .eq(GoodsDon::getStatus, true)
+                        .eq(GoodsDon::getDeleted, true));
+                if (count != specificGids.size()) {
+                    throw BusinessRuntimeException.getInstance("存在被删除或已下架的平台");
+                }
+                BigDecimal specificPrice = sku.getSpecificPrice();
+                if (specificPrice == null || specificPrice.compareTo(BigDecimal.ZERO) <= 0) {
+                    throw BusinessRuntimeException.getInstance("请输入正确的特定价格");
+                }
             }
-            BigDecimal specificPrice = sku.getSpecificPrice();
-            if (specificPrice == null || specificPrice.compareTo(BigDecimal.ZERO) <= 0) {
-                throw BusinessRuntimeException.getInstance("请输入正确的特定价格");
+        }
+        if (StrUtil.isNotEmpty(sku.getUserOwns())) {
+            List<Long> userOwnsList = Jsons.parseList(sku.getUserOwns(), Long.class);
+            if (CollUtil.isEmpty(userOwnsList)) {
+                sku.setUserOwns(null);
+            }else {
+                sku.setUserOwns(userOwnsList.toString());
             }
         }
         //优惠加购
@@ -195,6 +210,13 @@ public class CmsGoodsDonSkuController {
                         .field(GoodsDiscountPlusPurchaseRelation::getSkuId, sku.getId())
                         .build()));
             }
+
+            if (StrUtil.isNotEmpty(sku.getUserOwns())) {
+                try {
+                    sku.setUserOwnsList(beanSearcher.searchAll(DistributeSearchView.class, MapUtils.builder().field(DistributeSearchView::getUserId, Jsons.parseList(sku.getUserOwns(), Long.class)).op(Operator.InList).build()));
+                } catch (Exception e) {
+                }
+            }
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(skuViewList);
     }

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -364,10 +364,10 @@ public class OrderController {
     public Result<SearchResult<OrderDonView>> list(String customId){
         long userId = StpUserUtil.getLoginIdAsLong();
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
-        Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
+        //Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
         List<Long> userIds = UserBindRelationService.getRelationUserIdList(userId, null);
         SearchResult<OrderDonView> search = beanSearcher.search(OrderDonView.class, builder
-                .field(OrderDonView::getYhsId, yhsId)
+                //.field(OrderDonView::getYhsId, yhsId)
                 .field(OrderDonView::getUserId, userIds).op(Operator.InList)
                 .orderBy(OrderDonView::getId).desc()
                 .build());