Procházet zdrojové kódy

Merge branch 'master' into dev

# Conflicts:
#	netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
#	netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java
#	netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
#	netflix-web/src/main/resources/application-prd.yml
zoujiajian před 2 roky
rodič
revize
4455527e9d
35 změnil soubory, kde provedl 509 přidání a 108 odebrání
  1. 1 1
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  2. 1 1
      netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserTagMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/UserDistributeEquipmentMapper.java
  4. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/DistributeWaitingSendPoints.java
  5. 3 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
  6. 9 4
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  7. 35 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeEquipment.java
  8. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/YhShopDistributeWaitingSendPoints.java
  9. 5 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
  10. 6 4
      netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java
  11. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/DistributeOrdersDetailView.java
  12. 7 3
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java
  13. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/RefundOrderDonView.java
  14. 7 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeRateDetailView.java
  15. 1 1
      netflix-dao/src/main/java/com/cyksj/model/views/UserDistributeViews.java
  16. 5 2
      netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsSkuFrontView.java
  17. 3 0
      netflix-dao/src/main/resources/mapper/CorpUserTagMapper.xml
  18. 6 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  19. 162 43
      netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java
  20. 1 1
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpEventActionServiceImpl.java
  21. 6 1
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpTagServiceImpl.java
  22. 12 3
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpUserServiceImpl.java
  23. 51 2
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  24. 4 2
      netflix-service/src/main/java/com/cyksj/service/groups/impl/GroupFunServiceImpl.java
  25. 4 2
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  26. 79 7
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  27. 3 3
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  28. 28 7
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  29. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java
  30. 14 15
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  31. 3 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  32. 16 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java
  33. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
  34. 0 0
      netflix-web/src/main/resources/application-prd.yml
  35. 4 1
      netflix-web/src/main/resources/application-pre.yml

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

@@ -39,7 +39,7 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 
 	Integer selectCouponCodeUserNum(@Param("dsPopularizeId") Long dsPopularizeId, @Param("noOrderAllStatus") List<String> noOrderAllStatus);
 
-	ChannelPopularizeView countPopularizeOrderDetail(@Param("popularizeId") Long popularizeId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+	ChannelPopularizeView countPopularizeOrderDetail(@Param("popularizeId") Long popularizeId, @Param("goodsId") Long goodsId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 
 	BigDecimal selectThisMonthAppleOneMoney(@Param("skuIds") Set<Long> skuIds, @Param("startDate") String startDate, @Param("endDate") String endDate);
 

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserTagMapper.java

@@ -20,7 +20,7 @@ public interface CorpUserTagMapper extends BaseMapper<CorpUserTag> {
 
 	List<CorpUserTagExcelData> exportUserTagDetail(@Param("tagIds") String[] tagIds, @Param("groupIds") String[] groupIds, @Param("wxCorpId") Long wxCorpId);
 
-	UserOrderDetailView countTagUser(@Param("tagIdStr") String tagIdStr, @Param("startTime") String startTime, @Param("endTime") String endTime);
+	UserOrderDetailView countTagUser(@Param("tagIdStr") String tagIdStr, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("thisDate") String thisDate);
 
 	List<Long> getTagIdByCorpUserId(Long corpUserId);
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/distribute/equipment/UserDistributeEquipmentMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.distribute.equipment;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserDistributeEquipment;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserDistributeEquipmentMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/3/18 16:30
+ */
+public interface UserDistributeEquipmentMapper extends BaseMapper<UserDistributeEquipment> {
+}

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

@@ -62,6 +62,11 @@ public class DistributeWaitingSendPoints extends BaseEntity{
 	 */
 	private Integer rate;
 
+	/**
+	 * 是否特殊设备分销订单
+	 */
+	private Boolean isSpecialEp;
+
 	@Getter
 	public enum Status{
 		close("分销订单关闭,积分奖励不分发"),

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

@@ -79,6 +79,9 @@ public class GoodsDon extends BaseEntity {
      */
     private String remark;
 
+    /**
+     * 1.虚拟,2.实物,3.潮玩,4.租赁
+     */
     private Integer type;
 
     /**

+ 9 - 4
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -4,7 +4,6 @@ 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;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -143,9 +142,9 @@ public class GoodsDonSku extends BaseEntity {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer days;
 
-    @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;
+//    @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;
 
     /**
      * 加购规格
@@ -200,4 +199,10 @@ public class GoodsDonSku extends BaseEntity {
     @DbIgnore
     @TableField(exist = false)
     private BigDecimal yhShopSkuPrice;
+
+    /**
+     * 排序
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer sorted;
 }

+ 35 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserDistributeEquipment.java

@@ -0,0 +1,35 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserDistributeEquipment
+ * 创建者: JavaZou
+ * 创建时间:2024/3/18 16:27
+ */
+@Getter
+@Setter
+public class UserDistributeEquipment extends BaseEntity{
+	private Long DistributeId;
+
+	private Long userId;
+
+	/**
+	 * 设备提成
+	 */
+	private BigDecimal ep;
+
+	/**
+	 * Apple TV 提成
+	 */
+	private BigDecimal apTv;
+
+	/**
+	 * 套餐提成
+	 */
+	private BigDecimal combo;
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/YhShopDistributeWaitingSendPoints.java

@@ -49,6 +49,12 @@ public class YhShopDistributeWaitingSendPoints extends BaseEntity {
 
 	private Status sendStatus;
 
+	/**
+	 * 是否是特殊设备分销订单
+	 * false
+	 */
+	private Boolean isSpecialEp;
+
 	public enum Status{
 		close("店铺分销订单关闭,积分奖励不分发"),
 		success("积分发送成功"),

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

@@ -131,6 +131,11 @@ public class ReqGoodsSkuInsert {
          */
         private Boolean isMirror;
 
+        /**
+         * 排序
+         */
+        private Integer sorted;
+
     }
 
 }

+ 6 - 4
netflix-dao/src/main/java/com/cyksj/model/request/UserDistributeReq.java

@@ -1,9 +1,6 @@
 package com.cyksj.model.request;
 
-import com.cyksj.model.entity.CouponDistributePopularize;
-import com.cyksj.model.entity.UserDistributeTargetAlert;
-import com.cyksj.model.entity.UserPlatDistributeRate;
-import com.cyksj.model.entity.UserPlatSkuDistributeRate;
+import com.cyksj.model.entity.*;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -56,4 +53,9 @@ public class UserDistributeReq {
 	 * 渠道目标额
 	 */
 	private List<UserDistributeTargetAlert> targets;
+
+	/**
+	 * 设备分销
+	 */
+	private UserDistributeEquipment epRate;
 }

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

@@ -32,6 +32,9 @@ public class DistributeOrdersDetailView {
 	@JsonIgnore
 	private Long sharedId;
 
+	@DbField("gd.id")
+	private Long goodsId;
+
 	@DbField("gd.title")
 	private String platform;
 

+ 7 - 3
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java

@@ -1,6 +1,5 @@
 package com.cyksj.model.views;
 
-import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -105,8 +104,8 @@ public class GoodsDonSkuFrontView {
 	 */
 	private Integer days;
 
-	@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")
-	private Integer orderBy;
+//	@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")
+//	private Integer orderBy;
 
 	private Boolean isDp;
 
@@ -125,4 +124,9 @@ public class GoodsDonSkuFrontView {
 	 * 特定购买平台
 	 */
 	private String specificGoodsIds;
+
+	/**
+	 * 排序
+	 */
+	private Integer sorted;
 }

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

@@ -73,6 +73,9 @@ public class RefundOrderDonView {
 	@DbField("rd.is_clear_balance")
 	private Boolean isClearBalance;
 
+	@DbField("rd.operator")
+	private String operator;
+
 	@DbField("rd.created_time")
 	private Date createTime;
 }

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

@@ -1,6 +1,6 @@
 package com.cyksj.model.views;
 
-import com.cyksj.model.entity.CouponDistributePopularize;
+import com.cyksj.model.entity.UserDistributeEquipment;
 import com.cyksj.model.entity.UserDistributeTargetAlert;
 import lombok.Getter;
 import lombok.Setter;
@@ -29,4 +29,10 @@ public class UserDistributeRateDetailView {
 	 * 渠道目标额
 	 */
 	private List<UserDistributeTargetAlert> targets;
+
+
+	/**
+	 * 设备分销
+	 */
+	private UserDistributeEquipment epRate;
 }

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

@@ -19,7 +19,7 @@ import java.util.Date;
 @Setter
 @SearchBean(tables = "user_distribute ud left join user_distribute_shared us on ud.user_id = us.shared_id" +
 		" left join order_don od on od.user_id = us.user_id and od.is_fixed_distribute = 1 and od.status not in ('noPayment', 'close') :time:",
-		where = "ud.deleted is true",
+		where = "ud.deleted is true :condition:",
 		groupBy = "ud.id,ud.user_id,ud.business_id,ud.remark,ud.created_time,ud.update_time,ud.business_bind_time,ud.type")
 public class UserDistributeViews {
 

+ 5 - 2
netflix-dao/src/main/java/com/cyksj/model/views/YhShopGoodsSkuFrontView.java

@@ -98,8 +98,11 @@ public class YhShopGoodsSkuFrontView {
 	@DbField("sku.days")
 	private Integer days;
 
-	@DbField("case when sku.spec_val like '%月%' and sku.spec_val not like '%年%' then 0 when sku.spec_val like '%季%' then 1 when sku.spec_val like '%半年%' then 2 when sku.spec_val like '%年%' then 3 else 66 end")
-	private Integer orderBy;
+//	@DbField("case when sku.spec_val like '%月%' and sku.spec_val not like '%年%' then 0 when sku.spec_val like '%季%' then 1 when sku.spec_val like '%半年%' then 2 when sku.spec_val like '%年%' then 3 else 66 end")
+//	private Integer orderBy;
+
+	@DbField("sku.sorted")
+	private Integer sorted;
 
 	@DbField("sku.is_dp")
 	private Boolean isDp;

+ 3 - 0
netflix-dao/src/main/resources/mapper/CorpUserTagMapper.xml

@@ -72,6 +72,9 @@
         </if>
         <if test="endTime != null">
             and ct.created_time &lt; #{endTime}
+        </if>
+        <if test="thisDate != null">
+            and date_format(ct.created_time,'%Y-%m-%d') = #{thisDate}
         </if>) s
         left join corp_user_follow_relation cufr on cufr.id = s.relation_id
         left join corp_user_auth ca on ca.external_userid = cufr.corp_user_id

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

@@ -142,6 +142,9 @@
         <if test="endTime != null and endTime != ''">
             and created_time &lt; #{endTime}
         </if>
+        <if test="goodsId != null">
+            and goods_id = #{goodsId}
+        </if>
         and status not in ('close', 'noPayment')) s1
         ,
         (select count(*) as refundCount, ifnull(sum(money),0) as refundMoney
@@ -153,6 +156,9 @@
         <if test="endTime != null and endTime != ''">
             and created_time &lt; #{endTime}
         </if>
+        <if test="goodsId != null">
+            and goods_id = #{goodsId}
+        </if>
         and status = 'refund')
         s2
     </select>

+ 162 - 43
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -3,8 +3,10 @@ package com.cyksj.service.chatgpt.impl;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
 import cn.hutool.http.Method;
 import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.StringUtil;
@@ -18,7 +20,12 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.imageio.stream.FileImageOutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author chan
@@ -27,7 +34,7 @@ import java.util.List;
 @Service
 @Slf4j
 @RequiredArgsConstructor
-public class ChatGptAccountServiceImpl implements ChatGptAccountService{
+public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
     @Value("${chatgpt.domain}")
     private String GPT_DOMAIN;
@@ -51,29 +58,63 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService{
 
     @Override
     public String addAccount(Account account) {
-        Integer count = chatgptSessionMapper.selectCount(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getEmail, account.getAccount()));
-        if(count > 0){
+        if (isAccountExists(account)) {
             throw BusinessRuntimeException.getInstance("镜像服务该账号已存在.");
         }
+
         String refreshToken = "";
         String officialSession = "";
+        try {
+            JSONObject loginResult = getLoginResult(account);
+            if (StringUtils.isBlank(loginResult.getStr("accessToken"))) {
+                throw BusinessRuntimeException.getInstance(loginResult.getStr("detail"));
+            }
+            refreshToken = loginResult.getStr("refresh_token");
+            officialSession = loginResult.toString();
+        } catch (Exception e) {
+            throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + e.getMessage());
+        }
+
+        createChatgptSession(account, officialSession);
+
+        return refreshToken;
+    }
+
+    /**
+     * 判断账号是否存在
+     *
+     * @param account 账号
+     * @return 是否存在
+     */
+    private boolean isAccountExists(Account account) {
+        Integer count = chatgptSessionMapper.selectCount(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getEmail, account.getAccount()));
+        return count > 0;
+    }
+
+    /**
+     * 获取登录结果
+     *
+     * @param account
+     * @return
+     * @throws Exception
+     */
+    private JSONObject getLoginResult(Account account) throws Exception {
+        HttpRequest request = new HttpRequest(GPT_PROXY + "/getsession");
+        request.form("username", account.getAccount());
+        request.form("password", account.getPassword());
+        request.header("Content-Type", "application/x-www-form-urlencoded");
+        HttpResponse execute = request.method(Method.POST).execute();
+        return new JSONObject(execute.body());
+    }
+
+    /**
+     * 创建chatgptSession
+     *
+     * @param account
+     * @param officialSession
+     */
+    private void createChatgptSession(Account account, String officialSession) {
         ChatgptSession chatgptSession = new ChatgptSession();
-       try {
-           HttpRequest request = new HttpRequest(GPT_PROXY + "/applelogin");
-           request.form("username", account.getAccount());
-           request.form("password", account.getPassword());
-           request.header("Content-Type","application/x-www-form-urlencoded");
-           HttpResponse execute = request.method(Method.POST).execute();
-           JSONObject loginResult = new JSONObject(execute.body());
-           //detail
-           if (StringUtils.isBlank(loginResult.getStr("accessToken"))) {
-               throw BusinessRuntimeException.getInstance(loginResult.getStr("detail"));
-           }
-           refreshToken = loginResult.getStr("refresh_token");
-           officialSession = execute.body();
-       }catch (Exception e){
-           throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + e.getMessage());
-       }
         chatgptSession.setOfficialSession(officialSession);
         chatgptSession.setEmail(account.getAccount());
         chatgptSession.setPassword(account.getPassword());
@@ -81,15 +122,18 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService{
         chatgptSession.setAccountId(account.getId());
         chatgptSession.setStatus(1);
         chatgptSessionMapper.insert(chatgptSession);
-
-        return refreshToken;
     }
 
+    /**
+     * 更新账号
+     *
+     * @param account
+     */
     @Override
     public void upAccount(Account account) {
         ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getEmail, account.getAccount()));
-        if(chatgptSession != null){
-            if(StringUtils.isNotBlank(account.getGptRefreshToken())){
+        if (chatgptSession != null) {
+            if (StringUtils.isNotBlank(account.getGptRefreshToken())) {
                 chatgptSession.setOfficialSession(account.getGptRefreshToken());
             }
             chatgptSession.setEmail(account.getAccount());
@@ -101,38 +145,113 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService{
         }
     }
 
+    /**
+     * 获取登录url
+     *
+     * @param userId
+     * @param relationId
+     * @return
+     */
     @Override
     public String getLoginUrl(Long userId, Long relationId) {
+        GroupsRelation groupsRelation = getGroupsRelation(userId, relationId);
+        GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
+        GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
+
+        if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
+            ChatgptUser chatgptUser = getChatgptUser(userId, relationId, groupsRelation, groupsTrips);
+            return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
+        } else {
+            throw BusinessRuntimeException.getInstance("服务器出了点问题");
+        }
+    }
+
+    /**
+     * 获取车位信息
+     *
+     * @param userId
+     * @param relationId
+     * @return
+     */
+    private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
         List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
         GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
         if (groupsRelation == null) {
             throw BusinessRuntimeException.getInstance("车票不存在");
         }
+        return groupsRelation;
+    }
+
+    /**
+     * 获取车队信息
+     *
+     * @param groupsRelation
+     * @return
+     */
+    private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
         GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
         if (groupsTrips == null) {
             throw BusinessRuntimeException.getInstance("车队异常");
         }
-        GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
-        if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
-            ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
-            if (chatgptUser == null) {
-                User user = userMapper.selectById(userId);
-                ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getAccountId, groupsTrips.getAccountId()));
-                //第一次访问
-                chatgptUser = new ChatgptUser();
-                chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
-                chatgptUser.setIsPlus(1);
-                chatgptUser.setSessionId(chatgptSession.getId());
-                chatgptUser.setName(user.getNickname());
-                chatgptUser.setImg(user.getHeadimgurl());
-                chatgptUser.setRelationId(groupsRelation.getId());
-                chatgptUser.setUserToken(UUID.randomUUID().toString());
-                chatgptUserMapper.insert(chatgptUser);
-            }
+        return groupsTrips;
+    }
 
-            return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
-        }else {
-            throw BusinessRuntimeException.getInstance("服务器出了点问题");
+    private ChatgptUser getChatgptUser(Long userId, Long relationId, GroupsRelation groupsRelation, GroupsTrips groupsTrips) {
+        ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
+        User user = userMapper.selectById(userId);
+        if (chatgptUser == null) {
+            chatgptUser = createChatgptUser(groupsRelation, groupsTrips, user);
+        } else {
+            updateChatgptUser(groupsRelation, user, chatgptUser);
+        }
+        return chatgptUser;
+    }
+
+    /**
+     * 创建chatgptUser
+     */
+    private ChatgptUser createChatgptUser(GroupsRelation groupsRelation, GroupsTrips groupsTrips, User user) {
+        ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getAccountId, groupsTrips.getAccountId()));
+        ChatgptUser chatgptUser = new ChatgptUser();
+        chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
+        chatgptUser.setIsPlus(1);
+        chatgptUser.setSessionId(chatgptSession.getId());
+        chatgptUser.setName(user.getNickname());
+        chatgptUser.setImg(getWxImg(user.getHeadimgurl(), user));
+        chatgptUser.setRelationId(groupsRelation.getId());
+        chatgptUser.setUserToken(UUID.randomUUID().toString());
+        chatgptUserMapper.insert(chatgptUser);
+        return chatgptUser;
+    }
+
+    private void updateChatgptUser(GroupsRelation groupsRelation, User user, ChatgptUser chatgptUser) {
+        chatgptUser.setName(user.getNickname());
+        chatgptUser.setImg(getWxImg(user.getHeadimgurl(), user));
+        chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
+        chatgptUserMapper.updateById(chatgptUser);
+    }
+
+    /**
+     * 更换wx头像至oss
+     */
+    private String getWxImg(String headimgurl, User user) {
+        if (headimgurl.contains("thirdwx.qlogo.cn")) {
+            try {
+                byte[] body = HttpUtil.downloadBytes(headimgurl);
+                Path tempFile = Files.createTempFile("wxheadimg-" + user.getId(), ".jpeg");
+                try (FileImageOutputStream imageOutput = new FileImageOutputStream(tempFile.toFile())) {
+                    imageOutput.write(body, 0, body.length);
+                }
+                Map<String, Object> paramMap = new HashMap<>();
+                paramMap.put("file", tempFile.toFile());
+                JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
+                return result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl");
+            } catch (Exception ex) {
+                log.error("上传微信头像错误!msg:{}", StringUtil.getErrorText(ex));
+                return "./avatars.png";
+            }
+        } else {
+            return user.getHeadimgurl();
         }
     }
 

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpEventActionServiceImpl.java

@@ -965,7 +965,7 @@ public class CorpEventActionServiceImpl implements CorpEventActionService {
 		//是否是手机用户 或者 邮箱用户
 		Set<Long> relationUserIds = getRelationUserIds(phone);
 		if (CollUtil.isEmpty(relationUserIds)) {
-			log.info("该备注手机号:{]暂无关联银河用户", phone);
+			log.info("该备注手机号:{}暂无关联银河用户", phone);
 			return;
 		}
 		List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, MapUtils.builder()

+ 6 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpTagServiceImpl.java

@@ -424,12 +424,17 @@ public class CorpTagServiceImpl implements CorpTagService {
 	public UserOrderDetailView getTagUserData(Integer start, Integer limit, String tagIdStr, String startTime, String endTime) {
 		UserOrderDetailView u = orderDonMapper.getTagUserData(tagIdStr, startTime, endTime);
 
-		UserOrderDetailView u2 = corpUserTagMapper.countTagUser(tagIdStr, startTime, endTime);
+		UserOrderDetailView u2 = corpUserTagMapper.countTagUser(tagIdStr, startTime, endTime,null);
 
 		u.setNumOfUser(u2.getNumOfUser());
 		u.setDelNumOfUser(u2.getDelNumOfUser());
 		u.setOrderRate(u.getNumOfUser() == 0 ? BigDecimal.ZERO : BigDecimal.valueOf(u.getNumOfEpOrder()).divide(BigDecimal.valueOf(u.getNumOfUser()), 2, RoundingMode.HALF_DOWN));
 		Page<UserOrderDetailView> records = orderDonMapper.getTagUserDataPage(new Page<>(start, limit), tagIdStr, startTime, endTime);
+		records.getRecords().forEach(e->{
+			String date = e.getDate();
+			UserOrderDetailView userOrderDetailView = corpUserTagMapper.countTagUser(tagIdStr, null, null, date);
+			e.setNumOfUser(userOrderDetailView.getNumOfUser());
+		});
 
 		u.setRecords(records);
 		return u;

+ 12 - 3
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpUserServiceImpl.java

@@ -74,17 +74,26 @@ public class CorpUserServiceImpl implements CorpUserService {
 			log.info("该客户{}不是微信用户或未关联unionId", externalUserid);
 			return new YHLXUserDetailView();
 		}
-		if (corpUser.getUserId() == 0) {
-			User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionid, corpUser.getUnionid()).last("limit 1"));
+		Long corpUserUserId = corpUser.getUserId();
+		User user;
+		if (corpUserUserId == 0) {
+			user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionid, corpUser.getUnionid()).last("limit 1"));
 			if (user == null) {
 				log.info("该客户{}不是银河用户", externalUserid);
 				return new YHLXUserDetailView();
 			}
 			corpUser.setUserId(user.getId());
 			corpUserMapper.updateById(corpUser);
+		}else {
+			user = Optional.ofNullable(userMapper.selectById(corpUserUserId)).orElseGet(()->{
+				User user1 = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionid, corpUser.getUnionid()).last("limit 1"));
+				corpUser.setUserId(user1.getId());
+				corpUserMapper.updateById(corpUser);
+				return user1;
+			});
 		}
 		//关联关系
-		List<Long> userIdList = userBindRelationService.getRelationUserIdList(corpUser.getUserId(), null);
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(corpUser.getUserId(), user);
 		YHLXUserDetailView view = Optional.ofNullable(beanSearcher.searchFirst(YHLXUserDetailView.class, MapUtils.builder().field(YHLXUserDetailView::getUserId, corpUser.getUserId()).op(Operator.Equal).build())).orElse(new YHLXUserDetailView());
 		if (view.getUserId() != null) {
 			view.setAddress(addressMapper.selectOne(Wrappers.lambdaQuery(Address.class).eq(Address::getUserId, view.getUserId()).eq(Address::getIsDefault, true).last("limit 1")));

+ 51 - 2
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -14,6 +14,7 @@ import com.cyksj.mapper.UserDistributeSharedRelateUnbindMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.shop.YhShopMapper;
 import com.cyksj.mapper.shop.YhShopUserPlatDistributeRateMapper;
@@ -74,6 +75,9 @@ public class DistributeServiceImpl implements DistributeService {
 	private final UserDistributeTargetAlertMapper targetAlertMapper;
 
 	private final UserDistributeSharedRelateUnbindMapper userDistributeSharedRelateUnbindMapper;
+
+	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertDistribute(UserDistributeReq userDistributeReq) {
@@ -149,6 +153,9 @@ public class DistributeServiceImpl implements DistributeService {
 		//渠道目标额配置
 		List<UserDistributeTargetAlert> targets = userDistributeReq.getTargets();
 		handlerDistributeTargetAlert(userDistribute.getId(), targets);
+
+		//设备分销
+		handlerSpecialEquipmentRate(userDistributeReq.getEpRate(), userDistribute);
 	}
 
 	@Override
@@ -281,6 +288,9 @@ public class DistributeServiceImpl implements DistributeService {
 
 		//渠道目标额配置
 		handlerDistributeTargetAlert(userDistribute.getId(), userDistributeReq.getTargets());
+
+		//设备分销
+		handlerSpecialEquipmentRate(userDistributeReq.getEpRate(), userDistribute);
 	}
 
 	@Override
@@ -389,12 +399,15 @@ public class DistributeServiceImpl implements DistributeService {
 			if (StrUtil.isEmpty(exCode)) {
 				throw BusinessRuntimeException.getInstance("优惠码为空");
 			}
-			Integer count = couponDistributePopularizeMapper.selectCount(Wrappers.lambdaQuery(CouponDistributePopularize.class).ne(data.getId() != null, CouponDistributePopularize::getId, data.getId()).eq(CouponDistributePopularize::getDeleted, 1).eq(CouponDistributePopularize::getExCode, exCode));
+			Integer count = couponDistributePopularizeMapper.selectCount(Wrappers.lambdaQuery(CouponDistributePopularize.class).ne(data.getId() != null, CouponDistributePopularize::getId, data.getId())
+					.eq(CouponDistributePopularize::getDeleted, 1)
+					.eq(CouponDistributePopularize::getIsGeneral, false)
+					.eq(CouponDistributePopularize::getExCode, exCode));
 			if (count == 0) {
 				count = couponMapper.selectCount(Wrappers.lambdaQuery(Coupon.class).eq(Coupon::getExCode, exCode).eq(Coupon::getDeleted, true));
 			}
 			if (count > 0) {
-				throw BusinessRuntimeException.getInstance("优惠码:{]已存在", exCode);
+				throw BusinessRuntimeException.getInstance("优惠码:{}已存在", exCode);
 			}
 			if (data.getId() != null) {
 				couponDistributePopularizeMapper.updateById(data);
@@ -486,4 +499,40 @@ public class DistributeServiceImpl implements DistributeService {
 			targetAlertMapper.deleteBatchIds(delDbTargetAlert);
 		}
 	}
+
+	/**
+	 * 设备分销
+	 */
+	private void handlerSpecialEquipmentRate(UserDistributeEquipment epRate, UserDistribute userDistribute) {
+		BigDecimal zero = BigDecimal.ZERO;
+		Long userId = userDistribute.getUserId();
+		Long distributeId = userDistribute.getId();
+		if (epRate != null) {
+			epRate.setUserId(userId);
+			epRate.setDistributeId(distributeId);
+			BigDecimal ep = epRate.getEp();
+			BigDecimal apTv = epRate.getApTv();
+			BigDecimal combo = epRate.getCombo();
+			if (ep == null || apTv == null || combo == null) {
+				throw BusinessRuntimeException.getInstance("请填写设备分销必填项..");
+			}
+			if (ep.compareTo(zero) <= 0 || apTv.compareTo(zero) <= 0 || combo.compareTo(zero) <= 0 || combo.compareTo(BigDecimal.valueOf(100)) >= 0) {
+				throw BusinessRuntimeException.getInstance("请输入正确的设备分销设置");
+			}
+			if (epRate.getId() == null) {
+				try {
+					userDistributeEquipmentMapper.insert(epRate);
+				} catch (DuplicateKeyException e) {
+				}
+			} else {
+				userDistributeEquipmentMapper.updateById(epRate);
+			}
+			return;
+		}
+		if (userDistributeEquipmentMapper.selectCount(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+				.eq(UserDistributeEquipment::getDistributeId, distributeId)) > 0) {
+			userDistributeEquipmentMapper.delete(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+					.eq(UserDistributeEquipment::getDistributeId, distributeId));
+		}
+	}
 }

+ 4 - 2
netflix-service/src/main/java/com/cyksj/service/groups/impl/GroupFunServiceImpl.java

@@ -52,11 +52,13 @@ public class GroupFunServiceImpl implements GroupsFuncService {
 			groups.setRemark("等待设置账号");
 		}
 		//限制每天新车队前3天 停车数量
+		//10人镜像月付GPT
 		Integer availableParkingNum = 0;
-		if (sku.getId() == 161l) {
+		if (sku.getId() == 161l || sku.getId() == 422l) {
 			availableParkingNum = 10;
 		}
-		if (sku.getId() == 178l) {
+		//4人镜像月付GPT
+		if (sku.getId() == 178l || sku.getId() == 423l) {
 			availableParkingNum = 4;
 		}
 		groups.setAvailableParkingNum(availableParkingNum);

+ 4 - 2
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -857,7 +857,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 DistributeWaitingSendPoints.Status sendStatus = distributeWaitingSendPoints.getSendStatus();
                 BigDecimal points = distributeWaitingSendPoints.getPoints();
                 if (sendStatus == DistributeWaitingSendPoints.Status.waiting) {
-                    if (refundMoney.compareTo(money) == 0) {
+                    //实物设备退款就清0
+                    if (refundMoney.compareTo(money) == 0 || orderDon.getGoodsId() == 15) {
                         //待发送状态 全额退款
                         distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.close);
                         distributeWaitingSendPoints.setRefundPoints(points);
@@ -885,7 +886,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 } else if (sendStatus == DistributeWaitingSendPoints.Status.success) {
                     //已发送的提成 部分退款 全额退款 需要扣除用户积分
                     //扣除固定推广者积分
-                    if (refundMoney.compareTo(money) == 0) {
+                    //实物设备退款就清0
+                    if (refundMoney.compareTo(money) == 0 || orderDon.getGoodsId() == 15) {
                         userBenefitsService.deductDistributePoints(orderDon.getId(), distributeWaitingSendPoints.getSharedId(), points);
                         distributeWaitingSendPoints.setRefundPoints(points);
                         distributeWaitingSendPoints.setPoints(BigDecimal.ZERO);

+ 79 - 7
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -47,6 +47,7 @@ import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
@@ -164,6 +165,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
+
 	private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
 
 	private final BusinessDistributeDefaultSkuRateConfigMapper businessDistributeDefaultSkuRateConfigMapper;
@@ -198,8 +201,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final GroupRelationFrontService groupRelationFrontService;
 
-	private final TransferAccountsRecordMapper transferAccountsRecordMapper;
-
 	private final GroupRelationClearService groupRelationClearService;
 
 	private final UserRenewChangeTicketRecordMapper userRenewChangeTicketRecordMapper;
@@ -1470,6 +1471,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		Long businessId = null;
 		//普通分销
 		GoodsDon goodsDon = goodsDonMapper.selectById(order.getGoodsId());
+		GoodsDonSku goodsDonSku = null;
 		if (goodsDon == null || !goodsDon.getIsDistribute()) {
 			log.info("分销订单orderId:{}对应平台goodsId:{}不存在或已不参与分成比例", order.getId(), order.getGoodsId());
 			return;
@@ -1497,7 +1499,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					rate = goodsDon.getRate();
 					//实物分销比例
 					if (goodsDon.getType() == 2) {
-						GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
+						goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
 						if (goodsDonSku != null) {
 							//不包含套餐权益
 							if (!goodsDonSku.getIsBenefits()) {
@@ -1551,7 +1553,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						rate = userPlatDistributeRate.getRate();
 						secondRate = userPlatDistributeRate.getSecondRate();
 						if (goodsDon.getType() == 2) {
-							GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
+							goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
 							if (goodsDonSku != null) {
 								//不包含套餐权益
 								if (!goodsDonSku.getIsBenefits()) {
@@ -1568,8 +1570,20 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					points = returnPoints;
 				}
 				if (userDistribute != null) {
-					//处理渠道规则分销
-					points = handlerDistributeRule(order, distributeWaitingSendPoints, userDistribute.getId(), distributePointsExchangeMoney, points);
+					UserDistributeEquipment userDistributeEquipment = null;
+					if (goodsDon.getType() == 2) {
+						userDistributeEquipment = userDistributeEquipmentMapper.selectOne(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+								.eq(UserDistributeEquipment::getUserId, userDistribute.getUserId()).last("limit 1"));
+					}
+					//是否特殊渠道设备分销用户
+					if (userDistributeEquipment != null) {
+						BigDecimal takeMoney = handlerEquipmentDistribute(order, goodsDonSku, userDistributeEquipment);
+						points = takeMoney.multiply(BigDecimal.valueOf(distributePointsExchangeMoney.getPoints())).divide(distributePointsExchangeMoney.getMoney(), 2, RoundingMode.HALF_DOWN);
+						distributeWaitingSendPoints.setIsSpecialEp(true);
+					} else {
+						//处理渠道规则分销
+						points = handlerDistributeRule(order, distributeWaitingSendPoints, userDistribute.getId(), distributePointsExchangeMoney, points);
+					}
 				}
 
 				distributeWaitingSendPoints.setPoints(points);
@@ -2612,6 +2626,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				orderDon.setIsDistribute(true);
 				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()));
 				if (userDistribute != null) {
+					orderDon.setCpsPopularizeId(userDistributeShared.getDsPopularizeId());
+					//是否特殊渠道设备分销用户
+					Integer selectCount = userDistributeEquipmentMapper.selectCount(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+							.eq(UserDistributeEquipment::getUserId, userDistribute.getUserId()));
+					if (selectCount > 0) {
+						orderDon.setIsFixedDistribute(true);
+						return;
+					}
 					//直接去除
 					if (!userDistributeShared.getIsBind()) {
 						UserDistributeSharedRelateUnbind userDistributeSharedRelateUnbind = userDistributeSharedRelateUnbindMapper.selectOne(Wrappers.lambdaQuery(UserDistributeSharedRelateUnbind.class)
@@ -2660,7 +2682,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 							orderDon.setIsFixedDistribute(false);
 						}
 					}
-					orderDon.setCpsPopularizeId(userDistributeShared.getDsPopularizeId());
 				}
 			}
 		}
@@ -2832,4 +2853,55 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		return null;
 	}
+
+	/**
+	 * 特殊设备分销
+	 */
+	private BigDecimal handlerEquipmentDistribute(OrderDon orderDon, GoodsDonSku goodsDonSku, UserDistributeEquipment userDistributeEquipment) {
+		BigDecimal takeMoney = BigDecimal.ZERO;
+		try {
+			//设备提成 含路由器
+			if (goodsDonSku.getSpecJson().contains("路由")) {
+				takeMoney = takeMoney.add(userDistributeEquipment.getEp());
+			}
+			BigDecimal couponMoney = orderDon.getCouponMoney();
+			BigDecimal balance = orderDon.getBalance();
+			List<Integer> specIdsList = Jsons.parseList(goodsDonSku.getSpecIds(), Integer.class);
+			//包含Apple TV
+			if (goodsDonSku.getSpecJson().contains("TV")) {
+				takeMoney = takeMoney.add(userDistributeEquipment.getApTv());
+			}
+			//包含套餐
+			if (userDistributeEquipment.getCombo() != null && userDistributeEquipment.getCombo().compareTo(BigDecimal.ZERO) > 0 && goodsDonSku.getSpecJson().contains("套餐")) {
+				GoodsDonSpec goodsDonSpec = goodsDonSpecMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSpec.class)
+						.eq(GoodsDonSpec::getGoodsId, orderDon.getGoodsId()).last("limit 1"));
+				List<ReqGoodsSkuSpec> specs = Jsons.parseList(goodsDonSpec.getSpecsJson(), ReqGoodsSkuSpec.class);
+				for (ReqGoodsSkuSpec e : specs) {
+					if (e.getKey().contains("套餐")) {
+						List<ReqGoodsSkuSpec.Node> values = e.getValues();
+						for (ReqGoodsSkuSpec.Node node : values) {
+							if (specIdsList.contains(node.getId())) {
+								BigDecimal price = node.getPrice();
+								takeMoney = takeMoney.add(price.multiply(userDistributeEquipment.getCombo()).divide(BigDecimal.valueOf(100)));
+								break;
+							}
+						}
+					}
+				}
+			}
+			//使用优惠分摊一半
+			if (couponMoney != null) {
+				takeMoney = takeMoney.subtract(couponMoney.divide(BigDecimal.valueOf(2), 0, RoundingMode.DOWN));
+			}
+			if (balance != null) {
+				takeMoney = takeMoney.subtract(balance.divide(BigDecimal.valueOf(2), 0, RoundingMode.DOWN));
+			}
+		} catch (Exception e) {
+		}
+		//防止超过订单金额
+		if (takeMoney.compareTo(orderDon.getMoney()) > 0) {
+			takeMoney = BigDecimal.ZERO;
+		}
+		return takeMoney;
+	}
 }

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

@@ -517,8 +517,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 	@Override
 	public void adjustGroupsParkingTime(Long relationId, GoodsDonSku sku) {
 		Long skuId = sku.getId();
-		//更新GPT Plus10人、4人月付车队状态
-		if (skuId == 161l || skuId == 178l) {
+		//更新GPT Plus10人、4人月付车队状态 待优化
+		if (skuId == 161l || skuId == 178l || skuId == 422l || skuId == 423l) {
 			GroupsRelation relation = groupsRelationMapper.selectById(relationId);
 			Long groupsId = relation.getGroupsId();
 			GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
@@ -528,7 +528,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				return;
 			}
 			Integer extraNum = 5;
-			if (skuId == 178l) {
+			if (skuId == 178l || skuId == 423l) {
 				extraNum = 2;
 			}
 			Integer maxNum = sku.getNum() + extraNum;

+ 28 - 7
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -354,10 +354,10 @@ public class GoodsDonController {
 					.build());
 
 			views.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, views.getId()).build()));
-			MapBuilder builder = MapUtils.builder().field(GoodsDonSku::getGoodsId, views.getId()).field(GoodsDonSku::getStatus, true);
+			MapBuilder builder = MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, views.getId()).field(GoodsDonSkuFrontView::getStatus, true);
 
 			if (views.getType() == 1) {
-				builder.orderBy(GoodsDonSku::getOrderBy).asc();
+				builder.orderBy(GoodsDonSkuFrontView::getSorted).asc();
 			}
 			views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, builder.build()));
 			Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
@@ -537,11 +537,13 @@ public class GoodsDonController {
 			yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
 			key = RedisService.key.YH_HOME_PAGHE_CACHE_SHOP.getEnvName() + yhsId + ":homeManage";
 		}
-		//List<Long> filter_goodsIds = getFilterGoodsIds();
+//		List<Long> filter_goodsIds = getFilterGoodsIds();
 		List<Long> filter_goodsIds = null;
-		if (CollUtil.isNotEmpty(filter_goodsIds)) {
-			key += ":hz-ip";
-		}
+		AtomicBoolean isRemoveRg = new AtomicBoolean(false);
+//		if (isHzIp()) {
+//			key += ":hz-ip";
+//			isRemoveRg.set(true);
+//		}
 		Long fUid = StpUserUtil.getUserIdAfterLogin();
 		Object o = redisService.get(key);
 		if (o == null) {
@@ -553,6 +555,9 @@ public class GoodsDonController {
 			final String conditionSql = condition;
 			Stream.of(HomeManagementConfig.Type.values())
 					.forEach(type -> {
+						if (isRemoveRg.get() && type == HomeManagementConfig.Type.rg) {
+							return;
+						}
 						MapBuilder builder = MapUtils.builder()
 								.field(HomeManagementFrontView::getType, type.name());
 						if (type == HomeManagementConfig.Type.ex || type == HomeManagementConfig.Type.vg) {
@@ -616,6 +621,13 @@ public class GoodsDonController {
         return filter_goodsIds;
     }
 
+	public Boolean isHzIp() {
+		if (StringUtil.getRealAddressByIP(ServletUtil.getClientIP(request)).contains("杭州")) {
+			return true;
+		}
+		return false;
+	}
+
     /**
      * @param goodsId
      * @param type    1、普通,2、注册平台
@@ -921,7 +933,7 @@ public class GoodsDonController {
         if (goodsDetailView == null) {
             throw BusinessRuntimeException.getInstance("该平台不存在或已下架,请刷新页面");
         }
-        goodsDetailView.setSkuList(beanSearcher.searchAll(YhShopGoodsSkuFrontView.class, MapUtils.builder().put("condition", condition).orderBy(YhShopGoodsSkuFrontView::getOrderBy).asc().build()));
+        goodsDetailView.setSkuList(beanSearcher.searchAll(YhShopGoodsSkuFrontView.class, MapUtils.builder().put("condition", condition).orderBy(YhShopGoodsSkuFrontView::getSorted).asc().build()));
         goodsDetailView.setSpecs(beanSearcher.searchFirst(GoodsDonSpecFrontView.class, MapUtils.builder().field(GoodsDonSpecFrontView::getGoodsId, goodsDetailView.getId()).build()));
         OrderCommentFrontView comments = beanSearcher.searchFirst(OrderCommentFrontView.class, MapUtils.builder()
                 .field(OrderCommentFrontView::getGoodsId, goodsDetailView.getId())
@@ -1078,10 +1090,19 @@ public class GoodsDonController {
 	@GetMapping("/get/pc/homeManage")
 	public Result<Map<String, List<HomeManagementFrontView>>> getPcHomeManagementFrontPage() {
 		String key = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "pc:homeManage";
+		//移除奈飞客厅 临时
+		Long filterConfigId = null;
+//		if (isHzIp()) {
+//			key += ":hz_ip";
+//			filterConfigId = 55l;
+//		}
 		Object o = redisService.get(key);
 		if (o == null) {
 			MapBuilder builder = MapUtils.builder()
 					.field(HomeManagementFrontView::getAdType, List.of(HomeManagementConfig.AdType.pc.name(), HomeManagementConfig.AdType.pcSec.name(), HomeManagementConfig.AdType.pcDis.name())).op(Operator.InList);
+			if (filterConfigId != null) {
+				builder.field(HomeManagementFrontView::getHomeManageConfigId, filterConfigId).op(Operator.NotEqual);
+			}
 			List<HomeManagementFrontView> homeManagementFrontViews = beanSearcher.searchAll(HomeManagementFrontView.class, builder.build());
 			Map<HomeManagementConfig.AdType, List<HomeManagementFrontView>> map = homeManagementFrontViews.stream().collect(Collectors.groupingBy(HomeManagementFrontView::getAdType));
 			redisService.setNx(key, map, 50 * 60l);

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/channel/CmsChannelPopularizeController.java

@@ -56,7 +56,7 @@ public class CmsChannelPopularizeController {
 
     @GetMapping
     @SaCheckPermission("promotion:view")
-    public Result<SearchResult<ChannelPopularizeView>> get(String startTime, String endTime) {
+    public Result<SearchResult<ChannelPopularizeView>> get(String startTime, String endTime, Long goodsId) {
         long adminId = StpUtil.getLoginIdAsLong();
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         Boolean isRootRole = cmsUserService.isRootRole(adminId);
@@ -84,7 +84,7 @@ public class CmsChannelPopularizeController {
                     .eq(OrderDon::getIsWebPay, true)
                     .notIn(OrderDon::getStatus, Constant.noOrderStatus));
             data.setNumOfOrderWebPay(numOfOrderWebPay);
-            ChannelPopularizeView channelPopularizeView = orderDonMapper.countPopularizeOrderDetail(data.getId(), startTime, endTime);
+            ChannelPopularizeView channelPopularizeView = orderDonMapper.countPopularizeOrderDetail(data.getId(), goodsId, startTime, endTime);
             data.setOrderCount(channelPopularizeView.getOrderCount());
             data.setOrderMoney(channelPopularizeView.getOrderMoney());
             data.setRefundCount(channelPopularizeView.getRefundCount());

+ 14 - 15
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -21,6 +21,7 @@ import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.BusinessDistributeDefaultRateDetailReq;
 import com.cyksj.model.request.DistributeApplyMoneyReq;
@@ -119,6 +120,8 @@ public class DistributeController {
 
 	private final UserDistributeSharedWhiteMapper userDistributeSharedWhiteMapper;
 
+	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
+
 	/**
 	 * 添加固定推广者
 	 */
@@ -156,6 +159,8 @@ public class DistributeController {
 			throw BusinessRuntimeException.getInstance("id不存在");
 		}
 		userDistributeMapper.deleteById(id);
+		userDistributeEquipmentMapper.delete(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+				.eq(UserDistributeEquipment::getDistributeId, id));
 		return GatewayResponse.SUCCESS.newBuilder().toResult("删除成功");
 	}
 
@@ -195,6 +200,8 @@ public class DistributeController {
 		List<UserDistributeTargetAlert> targets = targetAlertMapper.selectList(Wrappers.lambdaQuery(UserDistributeTargetAlert.class)
 				.eq(UserDistributeTargetAlert::getDistributeId, id));
 		rateDetailView.setTargets(targets);
+		rateDetailView.setEpRate(userDistributeEquipmentMapper.selectOne(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+				.eq(UserDistributeEquipment::getDistributeId, id).last("limit 1")));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(rateDetailView);
 	}
 
@@ -215,7 +222,7 @@ public class DistributeController {
 				.orElse(new BrokenLineObjView());
 
 		if (brokenLineObjView != null) {
-			List<DistributePlatOrderDonBrokenLineView> views = beanSearcher.searchAll(DistributePlatOrderDonBrokenLineView.class, MapUtils.builder()
+			List<DistributePlatOrderDonBrokenLineView> views = beanSearcher.searchAll(DistributePlatOrderDonBrokenLineView.class, MapUtils.flatBuilder(request.getParameterMap())
 					.field(DistributePlatOrderDonBrokenLineView::getDate, first, end).op(Operator.Between)
 					.put("sid", String.format("where shared_id = %s", sharedId))
 					.orderBy(DistributePlatOrderDonBrokenLineView::getDate).asc()
@@ -230,7 +237,7 @@ public class DistributeController {
 	 * 固定推广者列表
 	 */
 	@GetMapping
-	public Result<SearchResult<UserDistributeViews>> distributeList(String nickname, String showId, String startTime, String endTime) {
+	public Result<SearchResult<UserDistributeViews>> distributeList(String nickname, String showId, String startTime, String endTime, Boolean isSpecialEp) {
 		long adminId = StpUtil.getLoginIdAsLong();
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		//是否是商务人员
@@ -256,23 +263,15 @@ public class DistributeController {
 			//按时间筛选 固定推广人分销情况 倒序
 			builder.orderBy(UserDistributeViews::getDistributeOrdersMoney).desc();
 		}
+		if (isSpecialEp != null) {
+			//是否是特殊设备分销渠道商
+			String condition = String.format(" and %s (select 1 from user_distribute_equipment up where up.distribute_id = ud.id limit 1)", isSpecialEp ? "exists" : "not exists");
+			builder.put("condition", condition);
+		}
 		Map<Long, String> businessNameMap = new ConcurrentHashMap<>();
 		SearchResult<UserDistributeViews> search = beanSearcher.search(UserDistributeViews.class,
 				builder.build());
 		search.getDataList().forEach(view -> {
-//			Optional.ofNullable(cmsUserMapper.selectById(view.getBusinessId())).ifPresent(business -> view.setBusinessName(business.getNickname()));
-//			Optional.ofNullable(userMapper.selectById(view.getUserId())).ifPresent(user -> {
-//				view.setNickname(user.getNickname());
-//				view.setPoints(user.getPoints());
-//			});
-//			BigDecimal num = view.getPoints().divide(BigDecimal.valueOf(pointsMoneyRate.getPoints()), RoundingMode.DOWN);
-//			view.setAvailableMoney(pointsMoneyRate.getMoney().multiply(num));
-//			List<DistributeMoneyApply> moneyApplies = distributeMoneyApplyMapper.selectList(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success).eq(DistributeMoneyApply::getUserId, view.getUserId()).select(DistributeMoneyApply::getMoney));
-//			Optional<BigDecimal> money = moneyApplies.stream().map(apply -> apply.getMoney()).reduce(BigDecimal::add);
-//			view.setGotMoney(money.isPresent() ? money.get() : BigDecimal.ZERO);
-//			Integer orders = view.getOrders();
-//			BigDecimal hasPayCount = userDistributeMapper.countHasPayBySharedId(view.getUserId(), Constant.noOrderAllStatus, startTime, endTime);
-//			view.setDistributeConsumerRate(orders == 0 ? BigDecimal.ZERO : hasPayCount.divide(BigDecimal.valueOf(view.getDistributeUserNum()), 2, RoundingMode.HALF_DOWN));
 			if (view.getDistributeOrdersMoney().compareTo(BigDecimal.ZERO) > 0) {
 				Optional.ofNullable(userDistributeMapper.selectSoldMaxGoods(view.getUserId())).ifPresent(title -> view.setGoodsTitle(title));
 			}

+ 3 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -84,7 +84,9 @@ public class CmsGoodsDonController {
      */
     @GetMapping("/get/sku/{id}")
     public Result<List<GoodsDonSku>> getSkuById(@PathVariable Long id, HttpServletRequest request) {
-        List<GoodsDonSku> goodsDonSkus = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsDonSku::getGoodsId, id).build());
+        List<GoodsDonSku> goodsDonSkus = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsDonSku::getGoodsId, id)
+                .orderBy(GoodsDonSku::getSorted).asc()
+                .build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonSkus);
     }
 

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

@@ -2,6 +2,7 @@ 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.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -239,4 +240,19 @@ public class CmsGoodsDonSkuController {
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+
+    /**
+     * 规格排序
+     */
+    @PutMapping("/sorted")
+    public Result<String> sorted(@RequestBody GoodsDonSku sku) {
+        Long id = sku.getId();
+        Integer sorted = sku.getSorted();
+        Assert.notNull(id, "请选择指定的规格");
+        goodsDonSkuService.update(null, Wrappers.lambdaUpdate(GoodsDonSku.class)
+                .eq(GoodsDonSku::getId, id)
+                .set(GoodsDonSku::getSorted, sorted));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
 }

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -13,7 +13,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 /**
- * 镜像服务
+ * /server/镜像服务
  * @author chan
  * @date 2024/3/19 14:41
  */

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 4 - 1
netflix-web/src/main/resources/application-pre.yml

@@ -174,4 +174,7 @@ advertisementwxapp:
   secret: 44c1e7431099fc0bd21dc320822b0108
   shopId: 1644299849
   shopKey: 5y5ZScTJGm0q0umHQOD4r3EfjRvCioUx
-  notify: https://xue.niupian.com.cn/8081/api/
+  notify: https://xue.niupian.com.cn/8081/api/
+
+chatgpt:
+  domain: "https://gpt.claudeplus.com.cn"

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů