Przeglądaj źródła

银河PC端文章

zwhui 2 lat temu
rodzic
commit
3855084884
81 zmienionych plików z 2945 dodań i 342 usunięć
  1. 35 0
      netflix-common/src/main/java/com/cyksj/common/util/TimeUtil.java
  2. 15 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationCategoryMapper.java
  3. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationClickUserRecordMapper.java
  4. 20 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationMapper.java
  5. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/SearchHistoryMapper.java
  6. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserGalaxycoinRecordMapper.java
  7. 9 2
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  8. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/home/HomeManagementConfigOrderRecordMapper.java
  9. 14 0
      netflix-dao/src/main/java/com/cyksj/mapper/order/OrderMasterDonMapper.java
  10. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/order/ShoppingCartDonMapper.java
  11. 16 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java
  12. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfigOrderRecord.java
  13. 62 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Information.java
  14. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/InformationCategory.java
  15. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/InformationClickUserRecord.java
  16. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDetailView.java
  17. 8 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  18. 187 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderMasterDon.java
  19. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SearchHistory.java
  20. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ShoppingCartDon.java
  21. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  22. 36 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserGalaxycoinRecord.java
  23. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  24. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  25. 54 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDetailView.java
  26. 141 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonBackView.java
  27. 106 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonView.java
  28. 51 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterSearchView.java
  29. 6 0
      netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java
  30. 2 0
      netflix-dao/src/main/java/com/cyksj/model/request/HomeManageConfigReq.java
  31. 17 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  32. 0 0
      netflix-dao/src/main/java/com/cyksj/model/request/ShoppingCartDonReq.java
  33. 44 0
      netflix-dao/src/main/java/com/cyksj/model/request/UnifiedOrderPayReq.java
  34. 4 2
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryGoodsView.java
  35. 4 2
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java
  36. 36 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuDetailView.java
  37. 4 2
      netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java
  38. 82 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationDetailView.java
  39. 48 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationListView.java
  40. 109 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationView.java
  41. 17 0
      netflix-dao/src/main/java/com/cyksj/model/views/SearchView.java
  42. 25 0
      netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonPayDetailView.java
  43. 41 0
      netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonView.java
  44. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java
  45. 11 0
      netflix-dao/src/main/resources/mapper/InformationCategoryMapper.xml
  46. 28 0
      netflix-dao/src/main/resources/mapper/InformationMapper.xml
  47. 10 0
      netflix-dao/src/main/resources/mapper/OrderMasterDonMapper.xml
  48. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  49. 21 5
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  50. 16 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java
  51. 5 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java
  52. 14 0
      netflix-service/src/main/java/com/cyksj/service/information/InformationCategoryService.java
  53. 17 0
      netflix-service/src/main/java/com/cyksj/service/information/InformationService.java
  54. 21 0
      netflix-service/src/main/java/com/cyksj/service/information/impl/InformationCategoryServiceImpl.java
  55. 32 0
      netflix-service/src/main/java/com/cyksj/service/information/impl/InformationServiceImpl.java
  56. 17 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  57. 11 7
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  58. 13 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderMasterDonService.java
  59. 18 0
      netflix-service/src/main/java/com/cyksj/service/order/ShoppingCartDonService.java
  60. 421 209
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  61. 17 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderMasterDonServiceImpl.java
  62. 79 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/ShoppingCartOrderServiceImpl.java
  63. 1 1
      netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java
  64. 15 9
      netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java
  65. 21 9
      netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java
  66. 25 14
      netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java
  67. 6 0
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  68. 11 0
      netflix-service/src/main/java/com/cyksj/service/user/UserGalaxycoinRecordService.java
  69. 24 4
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  70. 17 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserGalaxycoinRecordServiceImpl.java
  71. 92 0
      netflix-web/src/main/java/com/cyksj/web/controller/information/InformationController.java
  72. 106 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  73. 15 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  74. 0 11
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java
  75. 30 10
      netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java
  76. 175 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/information/CmsInformationController.java
  77. 80 54
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  78. 100 0
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderShopCartController.java
  79. 84 0
      netflix-web/src/main/java/com/cyksj/web/controller/search/SearchController.java
  80. 16 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java
  81. 1 1
      netflix-web/src/main/resources/application.yml

+ 35 - 0
netflix-common/src/main/java/com/cyksj/common/util/TimeUtil.java

@@ -0,0 +1,35 @@
+package com.cyksj.common.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 18:06
+ */
+public class TimeUtil {
+    /**
+     * 差值日期
+     */
+    public static String getDifferenceTime(Date date){
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        long span = (System.currentTimeMillis() - date.getTime()) / 1000;
+        //比当前时间还大
+        if(span < 0){
+            return format.format(date);
+        }else if(span/(60*60*24*30) > 0){
+            //大于30天直接显示年月日
+            return format.format(date);
+        }else if(span/(60*60*24*7) > 0){
+            return  span/(60*60*24*7) +"周前";
+        }else if(span/(60*60*24) > 0){
+            return span/(60*60*24) +"天前";
+        }else if(span/(60*60) > 0 ){
+            return span/(60*60) +"小时前";
+        }else if(span/(60) > 0){
+            return span/(60) +"分钟前";
+        }
+
+        return "刚刚";
+    }
+}

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationCategoryMapper.java

@@ -0,0 +1,15 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.InformationCategory;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:47
+ */
+public interface InformationCategoryMapper extends BaseMapper<InformationCategory> {
+    List<InformationCategory> getInformationCategory();
+
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationClickUserRecordMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.InformationClickUserRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 14:03
+ */
+public interface InformationClickUserRecordMapper extends BaseMapper<InformationClickUserRecord> {
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationMapper.java

@@ -0,0 +1,20 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:32
+ */
+public interface InformationMapper extends BaseMapper<Information> {
+    IPage<InformationListView> getInformation(@Param("page") Page<InformationListView> page, @Param("categoryId") Long categoryId);
+
+    List<InformationListView> getInformationByTitle(@Param("title") String title);
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/SearchHistoryMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SearchHistory;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 10:55
+ */
+public interface SearchHistoryMapper extends BaseMapper<SearchHistory> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserGalaxycoinRecordMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 10:23
+ */
+public interface UserGalaxycoinRecordMapper extends BaseMapper<UserGalaxycoinRecord> {
+}

+ 9 - 2
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -36,8 +36,8 @@ public interface UserMapper extends BaseMapper<User> {
     @Update("update user set points = points - #{deductPoints} where id = #{id} and points = #{originalPoints}")
     Integer subPointsNegative(@Param("id") Long userId, @Param("originalPoints") BigDecimal originalPoints, @Param("deductPoints") BigDecimal deductPoints);
 
-    @Update("update user set balance = balance - #{deduct} where id = #{userId} and balance = #{userBalance} and balance >= #{deduct}")
-    Integer deductBalance(@Param("userId") Long userId, @Param("deduct") BigDecimal deduct, @Param("userBalance") BigDecimal userBalance);
+    @Update("update user set balance = balance - #{deduct} where id = #{userId} and balance >= #{deduct}")
+    Integer deductBalance(@Param("userId") Long userId, @Param("deduct") BigDecimal deduct);
 
     @Update("update user set balance = balance + #{returnBalance} where id = #{userId} and balance = #{userBalance}")
     Integer returnBalance(@Param("userId") Long userId, @Param("returnBalance") BigDecimal returnBalance, @Param("userBalance") BigDecimal userBalance);
@@ -62,4 +62,11 @@ public interface UserMapper extends BaseMapper<User> {
 
     @Update("update user set yhs_money = yhs_money - #{subMoney} where id = #{shopUserId} and yhs_money >= #{subMoney} and yhs_money > 0")
     Integer subYhsMoney(@Param("shopUserId") Long shopUserId, @Param("subMoney") BigDecimal subMoney);
+
+    @Update("update user set galaxycoin = galaxycoin - (${subGalaxycoin}) where id = #{id} and galaxycoin >= #{subGalaxycoin}")
+    Integer deductGalaxycoin(@Param("id") Long id, @Param("subGalaxycoin") BigDecimal subGalaxycoin);
+
+    @Update("update user set galaxycoin = galaxycoin + (${addGalaxycoin}) where id = #{id} and galaxycoin = #{originalGalaxycoin}")
+    Integer updateGalaxycoin(@Param("id") Long id, @Param("originalGalaxycoin") BigDecimal originalGalaxycoin, @Param("addGalaxycoin") BigDecimal addGalaxycoin);
+
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/home/HomeManagementConfigOrderRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.home;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.HomeManagementConfigOrderRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: HomeManagementConfigOrderRecord
+ * 创建者: JavaZou
+ * 创建时间:2023/10/18 11:32
+ */
+public interface HomeManagementConfigOrderRecordMapper extends BaseMapper<HomeManagementConfigOrderRecord> {
+}

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/mapper/order/OrderMasterDonMapper.java

@@ -0,0 +1,14 @@
+package com.cyksj.mapper.order;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderMasterDon;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDonMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/10/13 18:08
+ */
+public interface OrderMasterDonMapper extends BaseMapper<OrderMasterDon> {
+	String getOrderPayTitle(Long mOid);
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.order;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ShoppingCartDon;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 15:47
+ */
+public interface ShoppingCartDonMapper extends BaseMapper<ShoppingCartDon> {
+}

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/HomeManagementConfig.java

@@ -30,6 +30,8 @@ public class HomeManagementConfig extends BaseEntity{
 
 	private Boolean deleted;
 
+	private AdType adType;
+
 	@Getter
 	public enum Type {
 		ad("广告"),
@@ -43,4 +45,18 @@ public class HomeManagementConfig extends BaseEntity{
 			this.desc = desc;
 		}
 	}
+
+	@Getter
+	public enum AdType {
+		pc("pc首页"),
+		h5("h5首页"),
+		pcSec("pc首页副"),
+		pcDis("pc发现首页"),
+		;
+		String desc;
+
+		AdType(String desc) {
+			this.desc = desc;
+		}
+	}
 }

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

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: HomeManagementConfigOrderRecord
+ * 创建者: JavaZou
+ * 创建时间:2023/10/18 11:31
+ */
+@Getter
+@Setter
+public class HomeManagementConfigOrderRecord {
+	private Long configId;
+
+	private Long mOid;
+}

+ 62 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Information.java

@@ -0,0 +1,62 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/11 17:11
+ */
+@Getter
+@Setter
+public class Information extends BaseEntity{
+    /**
+     * 文章标题
+     */
+    private String title;
+
+    /**
+     * 副标题
+     */
+    private String subTitle;
+
+    /**
+     * 缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    private String categoryIds;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    private Boolean top;
+
+    /**
+     * true 存在 || false 删除
+     */
+    private Boolean deleted;
+
+    /**
+     * 推荐商品
+     */
+    private String goodsIds;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/InformationCategory.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:36
+ */
+@Getter
+@Setter
+public class InformationCategory extends BaseEntity{
+    /**
+     * 类型名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Integer sortBy;
+}

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

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 14:02
+ */
+@Getter
+@Setter
+public class InformationClickUserRecord extends BaseEntity{
+    private Long userId;
+
+    private Long goodsId;
+
+    private Long infoId;
+}

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

@@ -25,6 +25,12 @@ public class OrderDetailView {
 	@DbField("o.id")
 	private Long id;
 
+	/**
+	 * 主订单id
+	 */
+	@DbField("o.m_oid")
+	private Long mOid;
+
 	/**
 	 * 商品id
 	 */

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -22,6 +22,8 @@ import java.util.List;
 @Setter
 public class OrderDon extends BaseEntity implements Serializable {
 
+    private Long mOid;
+
     /**
      * 座位id
      */
@@ -215,6 +217,11 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private BigDecimal balance;
 
+    /**
+     * 银河币
+     */
+    private BigDecimal galaxycoin;
+
     /**
      * 付款说明
      */
@@ -286,6 +293,7 @@ public class OrderDon extends BaseEntity implements Serializable {
         EQUIPMENT("equipment", "实物设备分销"),
         PAY_EQUIPMENT("pay_equipment", "自购设备"),
         BALANCE("balance", "余额支付"),
+        GALAXYCOIN("galaxycoin", "银河币支付"),
         PAYPAL("paypal","paypal支付"),
         STRIPE("stripe","stripe支付")
         ;

+ 187 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderMasterDon.java

@@ -0,0 +1,187 @@
+package com.cyksj.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDon
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 10:48
+ */
+@Getter
+@Setter
+public class OrderMasterDon extends BaseEntity{
+
+	/** 订单号 */
+	private String orderNo ;
+
+	/**
+	 * 微信订单号
+	 */
+	private String transactionId;
+
+
+	/** 用户id */
+	private Long userId ;
+
+	/**
+	 * openId
+	 */
+	private String openId;
+
+	/** 金额 */
+	private BigDecimal money ;
+
+	/**
+	 * 实际金额
+	 */
+	private BigDecimal realMoney;
+
+	/**
+	 * 退款金额
+	 */
+	private BigDecimal refundMoney;
+
+	/**
+	 * 海外支付金额
+	 */
+	private BigDecimal abroadMoney;
+
+	/**
+	 * 手续费
+	 */
+	private BigDecimal abroadTransactionFee;
+
+	/**
+	 * 退款原因
+	 */
+	private String refundDesc;
+
+
+	/** 支付状态 */
+	private Status status ;
+
+	/**
+	 * 支付类型
+	 */
+	private OrderMasterDon.Type type;
+
+	/**
+	 * 订单类型 1普通订单、2续费订单
+	 * 默认值为1
+	 */
+	private Integer orderType;
+
+	/**
+	 * 支付时间
+	 */
+	private Date payTime;
+
+	/**
+	 * 是否是分销订单
+	 */
+	private Boolean isDistribute;
+
+	/**
+	 * 是否是固定推广者分销
+	 */
+	private Boolean isFixedDistribute;
+
+	/**
+	 * 商户id
+	 */
+	private String shopId;
+
+	/**
+	 * 渠道链接id
+	 */
+	private Long popularizeId;
+
+	/**
+	 * 是否是推广未登录用户购买订单
+	 */
+	private Boolean isNoLogin;
+
+	/**
+	 * 是否是网页端支付 默认0移动端支付
+	 */
+	private Boolean isWebPay;
+
+	/**
+	 * 关联推广id
+	 */
+	private Long dsPopularizeId;
+
+	/**
+	 * cps后台推广id
+	 */
+	private Long cpsPopularizeId;
+
+	/**
+	 * 是否优惠加购规格
+	 */
+	private Boolean isDp;
+
+	private String payTitle;
+
+	/**
+	 * 是否是额外硬塞车票车位的订单
+	 */
+	private Boolean isOt;
+
+	/**
+	 * 店铺id
+	 */
+	private Long yhsId;
+
+	public enum Status {
+		/**
+		 * 订单状态
+		 */
+		close("已关闭"),
+		noPayment("待付款"),
+		hasPayment("已付款"),
+		transport("已发货"),
+		received("已签收"),
+		complete("已完成"),
+		refund("已退款"),
+		;
+
+		private String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+
+		public String getDesc() {
+			return desc;
+		}
+	}
+
+	@Getter
+	@AllArgsConstructor
+	public enum Type{
+		WeChat("wechat","微信"),
+		ALI_PAY("zfb","支付宝"),
+		EX_CODE("exchange_code","兑换码"),
+		LOTTERY("lottery","抽奖"),
+		EQUIPMENT("equipment", "实物设备分销"),
+		PAY_EQUIPMENT("pay_equipment", "自购设备"),
+		BALANCE("balance", "余额支付"),
+		PAYPAL("paypal","paypal支付"),
+		STRIPE("stripe","stripe支付")
+		;
+		String type;
+		String desc;
+
+		public static OrderMasterDon.Type getType(String type) {
+			return Arrays.stream(OrderMasterDon.Type.values()).filter(tp -> tp.getType().equals(type)).findFirst().orElse(ALI_PAY);
+		}
+	}
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SearchHistory.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 10:43
+ */
+@Getter
+@Setter
+public class SearchHistory extends BaseEntity{
+
+    /**
+     * 搜索名称
+     */
+    private String name;
+
+    private Long userId;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ShoppingCartDon.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDon
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 15:47
+ */
+@Getter
+@Setter
+public class ShoppingCartDon extends BaseEntity{
+	private Long userId;
+
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Integer num;
+}

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

@@ -67,6 +67,11 @@ public class User extends BaseEntity implements Serializable{
      */
     private BigDecimal yhsMoney;
 
+    /**
+     * 银河币
+     */
+    private BigDecimal galaxycoin;
+
     /**
      * 推广id
      */

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

@@ -0,0 +1,36 @@
+package com.cyksj.model.entity;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 09:58
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_galaxycoin_record")
+public class UserGalaxycoinRecord extends BaseEntity{
+    private Long userId;
+
+    private BigDecimal galaxycoin;
+
+    private String remark;
+
+    private Source source;
+
+    @Getter
+    public enum Source {
+        payment("下单"),
+        refund("订单退款");
+        String desc;
+
+        Source(String desc) {
+            this.desc = desc;
+        }
+    }
+
+}

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

@@ -31,6 +31,9 @@ public class OrderDonBackView {
 	@DbField("o.id")
 	private Long id;
 
+	@DbField("o.m_oid")
+	private Long mOid;
+
 	@DbIgnore
 	private String channel;
 

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

@@ -29,6 +29,9 @@ public class OrderDonView {
     @DbField("o.id")
     private Long id;
 
+    @DbField("o.m_oid")
+    private Long mOid;
+
     @DbField("o.relation_id")
     private Long relationId;
 

+ 54 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDetailView.java

@@ -0,0 +1,54 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.OrderDetailView;
+import com.cyksj.model.entity.OrderMasterDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDetailView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/16 10:23
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_master_don o")
+public class OrderMasterDetailView {
+	@DbField("o.id")
+	private Long mOid;
+
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@DbField("o.money")
+	private BigDecimal money;
+
+	@DbField("o.status")
+	private OrderMasterDon.Status status;
+
+	@DbField("o.type")
+	private OrderMasterDon.Type type;
+
+	@DbField("o.num")
+	private Integer num;
+
+	@DbField("o.created_time")
+	private Date createdTime;
+
+	@DbField("o.pay_time")
+	private Date payTime;
+
+	@DbField("o.pay_title")
+	private String payTitle;
+
+	@DbIgnore
+	private List<OrderDetailView> orderDetailViews;
+}

+ 141 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonBackView.java

@@ -0,0 +1,141 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.OrderMasterDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDonBackView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/16 11:30
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_master_don o" +
+		" left join user u on o.user_id = u.id" +
+		" left join order_don_transport odt on odt.order_id = o.id",
+		where = ":condition:"
+)
+public class OrderMasterDonBackView {
+	@DbField("o.id")
+	private Long mOid;
+
+	@DbIgnore
+	private String channel;
+
+	/**
+	 * 是否是额外硬塞的虚拟车票订单
+	 */
+	@DbField("o.is_ot")
+	private Boolean isOt;
+
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@DbField("o.transaction_id")
+	private String transactionId;
+
+	@DbField("o.user_id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("case when u.login_phone != '' then 'phone' when u.email != '' then 'email' when u.open_id != '' then 'wechat' else 'wechat' end")
+	private String register;
+
+	/**
+	 * 登录注册手机号
+	 */
+	@DbField("u.login_phone")
+	private String loginPhone;
+
+	/**
+	 * 登录注册邮箱
+	 */
+	@DbField("u.email")
+	private String email;
+
+	@DbField("u.is_google")
+	private Boolean isGoogle;
+
+	@DbField("o.money")
+	private BigDecimal money;
+
+	@DbField("o.refund_money")
+	private BigDecimal refundMoney;
+
+	@DbField("o.status")
+	private OrderMasterDon.Status status;
+
+	@DbField("o.type")
+	private OrderMasterDon.Type type;
+
+	@DbField("o.order_type")
+	private Integer orderType;
+
+	@DbField("o.num")
+	private Integer num;
+
+	@DbField("o.created_time")
+	private Date createdTime;
+
+	@DbField("o.popularize_id")
+	private Long popularizeId;
+
+	@DbField("o.pay_time")
+	private Date payTime;
+
+	@DbField("o.is_dp")
+	private Boolean isDp;
+
+	@DbField("o.pay_title")
+	private String payTitle;
+
+	/**
+	 * 收货人
+	 */
+	@DbField("odt.receiver")
+	private String receiver;
+
+	/**
+	 * 手机号
+	 */
+	@DbField("odt.phone")
+	private String phone;
+
+	/**
+	 * 省份
+	 */
+	@DbField("odt.province")
+	private String province;
+
+	/**
+	 * 城市
+	 */
+	@DbField("odt.city")
+	private String city;
+
+	/**
+	 * 区/县
+	 */
+	@DbField("odt.district")
+	private String district;
+
+	/**
+	 * 详细地址
+	 */
+	@DbField("odt.address")
+	private String address;
+
+	@DbIgnore
+	private List<OrderDonBackView> orderDonViews;
+}

+ 106 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonView.java

@@ -0,0 +1,106 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.OrderDonWaybill;
+import com.cyksj.model.entity.OrderMasterDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDonView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/13 17:51
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_master_don o left join order_don_transport odt on odt.order_id = o.id",
+		where = ":condition:")
+public class OrderMasterDonView {
+
+	@DbField("o.id")
+	private Long mOid;
+
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@DbField("o.user_id")
+	@JsonIgnore
+	private Long userId;
+
+	@DbField("o.money")
+	private BigDecimal money;
+
+	@DbField("o.status")
+	private OrderMasterDon.Status status;
+
+	@DbField("o.type")
+	private OrderMasterDon.Type type;
+
+	@DbField("o.num")
+	private Integer num;
+
+	@DbField("o.created_time")
+	private Date createdTime;
+
+	@DbField("o.pay_time")
+	private Date payTime;
+
+	@DbField("o.is_dp")
+	private Boolean isDp;
+
+	@DbField("o.pay_title")
+	private String payTitle;
+
+	/**
+	 * 收货人
+	 */
+	@DbField("odt.receiver")
+	private String receiver;
+
+	/**
+	 * 手机号
+	 */
+	@DbField("odt.phone")
+	private String phone;
+
+	/**
+	 * 省份
+	 */
+	@DbField("odt.province")
+	private String province;
+
+	/**
+	 * 城市
+	 */
+	@DbField("odt.city")
+	private String city;
+
+	/**
+	 * 区/县
+	 */
+	@DbField("odt.district")
+	private String district;
+
+	/**
+	 * 详细地址
+	 */
+	@DbField("odt.address")
+	private String address;
+
+	@DbField("o.yhs_id")
+	private Long yhsId;
+
+	@DbIgnore
+	private OrderDonWaybill waybill;
+
+	@DbIgnore
+	List<OrderDonView> orderDonViews;
+}

+ 51 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterSearchView.java

@@ -0,0 +1,51 @@
+package com.cyksj.model.manage.views;
+
+import com.cyksj.model.entity.OrderMasterDon;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterSearchView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/16 9:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_master_don o")
+public class OrderMasterSearchView {
+	@DbField("o.id")
+	private Long mOid;
+
+	@DbField("o.order_no")
+	private String orderNo;
+
+	@DbField("o.money")
+	private BigDecimal money;
+
+	@DbField("o.status")
+	private OrderMasterDon.Status status;
+
+	@DbField("o.type")
+	private OrderMasterDon.Type type;
+
+	@DbField("o.num")
+	private Integer num;
+
+	@DbField("o.created_time")
+	private Date createdTime;
+
+	@DbField("o.pay_time")
+	private Date payTime;
+
+	@DbField("o.pay_title")
+	private String payTitle;
+
+	@DbField("o.yhs_id")
+	private Long yhsId;
+}

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

@@ -20,9 +20,15 @@ public class ClickRecordReq {
 
 	private Long goodsId;
 
+	/**
+	 * 文章id
+	 */
+	private Long infoId;
+
 	/**
 	 * 1、首页点击
 	 * 2、平台分类点击
+	 * 3、文章点击
 	 */
 	private Integer type;
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/HomeManageConfigReq.java

@@ -30,6 +30,8 @@ public class HomeManageConfigReq {
 
 	private HomeManagementConfig.Type type;
 
+	private HomeManagementConfig.AdType adType;
+
 	private Integer sorted;
 
 	private String tag;

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

@@ -74,6 +74,11 @@ public class OrderPayRequest {
      */
     private Long popularizeId;
 
+    /**
+     * 文章id
+     */
+    private Long infoId;
+
     private Boolean isNoLogin;
 
     /**
@@ -101,6 +106,11 @@ public class OrderPayRequest {
      */
     private BigDecimal balance;
 
+    /**
+     * 银河币支付
+     */
+    private BigDecimal yhb;
+
     private String callback;
 
     private String callbackType;
@@ -136,4 +146,11 @@ public class OrderPayRequest {
      * 购买实物
      */
     private Boolean isPayReal;
+
+    /**
+     * 购物车id 用以购买后删除
+     */
+    private Long shopCartId;
+
+    private BigDecimal galaxycoin;
 }

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


+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/request/UnifiedOrderPayReq.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UnifiedOrderPayReq
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 18:27
+ */
+@Getter
+@Setter
+public class UnifiedOrderPayReq {
+	private Long userId;
+
+	/**
+	 * 推荐人id
+	 */
+	private Long sharedId;
+
+	/**
+	 * 是否是网页端支付 默认0移动端支付
+	 */
+	private Boolean isWebPay;
+
+	private String callback;
+
+	private String callbackType;
+
+	private Boolean isNoLogin;
+
+	/**
+	 * 店铺id
+	 */
+	private String customId;
+
+	/**
+	 * 购买商品
+	 */
+	private List<OrderPayRequest> payGoods;
+}

+ 4 - 2
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryGoodsView.java

@@ -1,7 +1,6 @@
 package com.cyksj.model.views;
 
 import com.ejlchina.searcher.bean.DbField;
-import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -36,9 +35,12 @@ public class GoodsDonCategoryGoodsView {
 	@DbField("g.status")
 	private Boolean status;
 
-	@DbIgnore
+	@DbField("select count(*) from goods_click_user_record gcur where gcur.goods_id = g.id")
 	private Integer click;
 
+	@DbField("select count(*) from order_don o where o.goods_id = g.id and o.status not in ('close','noPayment','refund')")
+	private Integer orderNum;
+
 	@DbField("g.sort_by")
 	private Integer sorted;
 }

+ 4 - 2
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonCategoryView.java

@@ -1,7 +1,6 @@
 package com.cyksj.model.views;
 
 import com.ejlchina.searcher.bean.DbField;
-import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -31,9 +30,12 @@ public class GoodsDonCategoryView {
 	@DbField("count(g.id)")
 	private Integer count;
 
-	@DbIgnore
+	@DbField("select count(*) from goods_click_user_record gcur where gcur.category = gc.id")
 	private Integer click;
 
+	@DbField("select count(*) from goods_don_category_relate gcr left join order_don o on o.goods_id = gcr.goods_id where gcr.category = gc.id and o.status not in ('close','noPayment','refund')")
+	private Integer orderNum;
+
 	@DbField("gc.status")
 	private Boolean status;
 

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuDetailView.java

@@ -0,0 +1,36 @@
+ package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsDonSkuDetailView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 18:05
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g left join goods_don_sku sku on sku.goods_id = g.id",
+		where = "g.deleted is true")
+public class GoodsDonSkuDetailView {
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("sku.id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("sku.status")
+	private Boolean goodsStatus;
+
+	@DbField("g.status")
+	private Boolean goodsSkuStatus;
+}

+ 4 - 2
netflix-dao/src/main/java/com/cyksj/model/views/HomeManagementConfigView.java

@@ -2,7 +2,6 @@ package com.cyksj.model.views;
 
 import com.cyksj.model.entity.HomeManagementConfig;
 import com.ejlchina.searcher.bean.DbField;
-import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -50,9 +49,12 @@ public class HomeManagementConfigView {
 	@DbField("hc.status")
 	private Boolean status;
 
-	@DbIgnore
+	@DbField("select count(*) from home_management_config_user_click_record hcr where hcr.config_id = hc.id")
 	private Integer click;
 
+	@DbField("select count(*) from home_management_config_order_record hor left join order_don o on o.id = hor.order_id where o.status not in ('close','noPayment')")
+	private Integer orderNum;
+
 	@DbField("hc.created_time")
 	private Date createdTime;
 }

+ 82 - 0
netflix-dao/src/main/java/com/cyksj/model/views/InformationDetailView.java

@@ -0,0 +1,82 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 13:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "information i")
+public class InformationDetailView {
+    @DbField("i.id")
+    private Long id;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.title")
+    private String title;
+
+    /**
+     * 副标题
+     */
+    @DbField("i.sub_title")
+    private String subTitle;
+
+    /**
+     * 缩略图
+     */
+    @DbField("i.thumbnail")
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    @DbField("i.category_ids")
+    private String categoryIds;
+
+
+    /**
+     * 内容
+     */
+    @DbField("i.content")
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    @DbField("i.status")
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    @DbField("i.recommend")
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    @DbField("i.top")
+    private Boolean top;
+
+    /**
+     * 推荐商品id
+     */
+    @DbField("i.goods_ids")
+    private String goodsIds;
+
+    /**
+     * 推荐商品名
+     */
+    @DbIgnore
+    private List<GoodsFrontListView> goods;
+}

+ 48 - 0
netflix-dao/src/main/java/com/cyksj/model/views/InformationListView.java

@@ -0,0 +1,48 @@
+package com.cyksj.model.views;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.common.util.TimeUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 18:02
+ */
+@Getter
+@Setter
+public class InformationListView {
+
+    private Long id;
+    /**
+     * 文章标题
+     */
+    private String title;
+
+    /**
+     * 副标题
+     */
+    private String subTitle;
+
+    /**
+     * 缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    private Date createdTime;
+
+    @TableField(exist = false)
+    private String differenceTime;
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+        this.differenceTime = TimeUtil.getDifferenceTime(createdTime);
+    }
+}

+ 109 - 0
netflix-dao/src/main/java/com/cyksj/model/views/InformationView.java

@@ -0,0 +1,109 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:58
+ */
+@Getter
+@Setter
+@SearchBean(tables = "information i",where = "i.deleted is true")
+public class InformationView {
+    @DbField("i.id")
+    private Long id;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.title")
+    private String title;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.sub_title")
+    private String subTitle;
+
+    /**
+     * 缩略图
+     */
+    @DbField("i.thumbnail")
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    @DbField("i.category_ids")
+    private String categoryIds;
+
+    /**
+     * 文章类型名
+     */
+    @DbIgnore
+    private List<String> categoryNames;
+
+    /**
+     * 内容
+     */
+    @DbField("i.content")
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    @DbField("i.status")
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    @DbField("i.recommend")
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    @DbField("i.top")
+    private Boolean top;
+
+    /**
+     * 推荐商品id
+     */
+    @DbField("i.goods_ids")
+    private String goodsIds;
+
+    @DbField("i.created_time")
+    private Date createdTime;
+
+    /**
+     * 推荐商品名
+     */
+    @DbIgnore
+    private List<String> goodsTitles;
+
+    /**
+     * 点击数
+     */
+    @DbField("select count(*) from information_click_user_record ir where ir.info_id = i.id and ir.goods_id is not null")
+    private Integer click;
+
+    /**
+     * 下单数
+     */
+    @DbField("select count(*) from information_click_user_record ir left join order_don o on o.id = ir.order_id where ir.info_id = i.id and o.status not in ('close','noPayment')")
+    private Integer orderNum;
+
+    /**
+     * 浏览量
+     */
+    @DbField("select count(*) from information_click_user_record ir where ir.info_id = i.id and ir.goods_id is null and ir.order_id is null")
+    private Integer visit;
+}

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/model/views/SearchView.java

@@ -0,0 +1,17 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 12:11
+ */
+@Getter
+@Setter
+public class SearchView {
+    private List<GoodsFrontListView> goodsList;
+    private List<InformationListView> informationList;
+}

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonPayDetailView.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonPayDetailView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:16
+ */
+@Getter
+@Setter
+public class ShoppingCartDonPayDetailView {
+	private String orderNo;
+
+	private BigDecimal money;
+
+	private String payTitle;
+
+	private Date createdTime;
+}

+ 41 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonView.java

@@ -0,0 +1,41 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonView
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:06
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from shopping_cart_don :uid:) sc left join goods_don g on g.id = sc.goods_id" +
+		" left join goods_don_sku sku on sku.id = sc.sku_id :uid:")
+public class ShoppingCartDonView {
+	@DbField("sc.id")
+	private Long shopCartId;
+
+	@DbField("sc.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("sc.sku_id")
+	private Long skuId;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("sc.num")
+	private Integer num;
+
+	@DbField("sc.created_time")
+	private Date createdTime;
+}

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

@@ -50,4 +50,9 @@ public class UserPersonalView {
 	private Integer numOfGiftCard;
 
 	private String phone;
+
+	/**
+	 * 银河币
+	 */
+	private BigDecimal galaxycoin;
 }

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

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.InformationCategoryMapper">
+
+
+    <select id="getInformationCategory" resultType="com.cyksj.model.entity.InformationCategory">
+        select ic.* from information_category ic, information i where JSON_CONTAINS(i.category_ids, CONCAT('"',ic.id,'"')) = 1 GROUP BY id,sort_by order by sort_by
+    </select>
+
+</mapper>

+ 28 - 0
netflix-dao/src/main/resources/mapper/InformationMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.InformationMapper">
+
+
+    <select id="getInformation" resultType="com.cyksj.model.views.InformationListView">
+        select id,title,thumbnail,created_time,content from information where status is true and deleted is true
+        <choose>
+            <when test="categoryId != null">
+                and JSON_CONTAINS(category_ids,'"${categoryId}"') = 1
+            </when>
+            <otherwise>
+                and recommend is true
+            </otherwise>
+        </choose>
+        order by case when top is true then 1 else 2 end,created_time desc
+    </select>
+
+    <select id="getInformationByTitle" resultType="com.cyksj.model.views.InformationListView">
+        select id,title,thumbnail,created_time,content
+        from information
+        where title like '%${title}%'
+          and status is true
+          and deleted is true
+        order by created_time desc
+    </select>
+</mapper>

+ 10 - 0
netflix-dao/src/main/resources/mapper/OrderMasterDonMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.order.OrderMasterDonMapper">
+
+    <select id="getOrderPayTitle" resultType="java.lang.String">
+        select group_concat(g.title)
+        from (select distinct goods_id from order_don where m_oid = #{mOid} o)
+                 left join goods_don g on g.id = o.goods_id
+    </select>
+</mapper>

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -652,6 +652,7 @@ public class RedisService {
         PLUS_GOODS_ADDRESS_KEY("plus_goods_address_key:", "优惠加购实物地址key", 10 * 60l),
         GROUPS_TRIPS_OUTSIDE_RELATION("groups_trips_outside_relation:key", "额外车位", 30l),
         DISTRIBUTE_RULE_TIME_KEY("DISTRIBUTE_RULE_TIME_KEY", "渠道规格记录时间key", 5 * 60L),
+        INFORMATION_KEY("information_key:", "文章", 30 * 60L),
         ;
 
         private String name;

+ 21 - 5
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -19,6 +19,7 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.exchange.ExchangeCodeMapper;
 import com.cyksj.mapper.market.draw.LuckyDrawRecordMapper;
+import com.cyksj.mapper.order.OrderMasterDonMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelExchangeCodeData;
 import com.cyksj.model.manage.views.AccountView;
@@ -71,6 +72,8 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	private final OrderDonMapper orderDonMapper;
 
+	private final OrderMasterDonMapper orderMasterDonMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	private final LuckyDrawRecordMapper luckyDrawRecordMapper;
@@ -293,11 +296,24 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				}
 			}
 		} else {
+			StringBuilder payTitle = new StringBuilder();
+			payTitle.append(goodsDon.getTitle());
+			payTitle.append(sku.getSpecVal());
+
+			OrderMasterDon orderMasterDon = new OrderMasterDon();
 			/* 生成订单 */
 			String donNo = SEQUENCE.nextId().toString();
+			orderMasterDon.setOrderNo(donNo);
+			orderMasterDon.setOpenId(user.getOpenId());
+			orderMasterDon.setMoney(BigDecimal.ZERO);
+			orderMasterDon.setStatus(OrderMasterDon.Status.hasPayment);
+			orderMasterDon.setYhsId(yhsId);
+			orderMasterDon.setType(OrderMasterDon.Type.getType(orderDonTye.getType()));
+			orderMasterDon.setUserId(user.getId());
+			orderMasterDon.setPayTitle(payTitle.toString());
+
+
 			orderDon = new OrderDon();
-			orderDon.setOrderNo(donNo);
-			orderDon.setOpenId(user.getOpenId());
 			orderDon.setMoney(BigDecimal.ZERO);
 			orderDon.setSkuId(sku.getId());
 			orderDon.setRelationId(relationId);
@@ -310,15 +326,15 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				orderDon.setStatus(OrderDon.Status.hasPayment);
 			}
 			if (relation != null && relation.getStatus() == GroupsRelation.Status.outside) {
+				orderMasterDon.setIsOt(true);
 				orderDon.setIsOt(true);
 			}
 			//兑换码兑换
 			orderDon.setType(orderDonTye);
 			orderDon.setUserId(user.getId());
-			StringBuilder payTitle = new StringBuilder();
-			payTitle.append(goodsDon.getTitle());
-			payTitle.append(sku.getSpecVal());
 			orderDon.setPayTitle(payTitle.toString());
+			//主订单
+			orderMasterDonMapper.insert(orderMasterDon);
 			orderDonMapper.insert(orderDon);
 			log.info("用户{}兑换规格:{}车位成功", user.getId(), orderDon.getSkuId());
 		}

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java

@@ -5,6 +5,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.GoodsClickUserRecordMapper;
 import com.cyksj.mapper.GoodsDonCategoryMapper;
 import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.InformationClickUserRecordMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigUserClickRecordMapper;
 import com.cyksj.model.entity.*;
@@ -35,6 +36,8 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 
 	private final GoodsClickUserRecordMapper goodsClickUserRecordMapper;
 
+	private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
 
 	@Override
 	public void click(Long userId, ClickRecordReq request) {
@@ -47,6 +50,9 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 			clickGoodsCategoryOrGoods(userId, request.getGoodsId(), request.getCategory());
 			return;
 		}
+		if (request.getType() == 3) {
+			clickInformation(userId,request.getGoodsId(),request.getInfoId());
+		}
 	}
 
 	public void clickHomePage(Long userId, Long configId) {
@@ -88,4 +94,14 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 			}
 		}
 	}
+	public void clickInformation(Long userId,Long goodsId,Long infoId){
+		if (infoId == null && goodsId == null) {
+			throw BusinessRuntimeException.getInstance("参数错误");
+		}
+		InformationClickUserRecord record = new InformationClickUserRecord();
+		record.setUserId(userId);
+		record.setGoodsId(goodsId);
+		record.setInfoId(infoId);
+		informationClickUserRecordMapper.insert(record);
+	}
 }

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/home/impl/HomeManagementConfigServiceImpl.java

@@ -36,6 +36,11 @@ public class HomeManagementConfigServiceImpl extends ServiceImpl<HomeManagementC
 			Assert.notEmpty(config.getTitle(), "标题不为空");
 			HomeManagementConfig homeManagementConfig = new HomeManagementConfig();
 			BeanUtil.copyProperties(config, homeManagementConfig);
+			if (config.getType() == HomeManagementConfig.Type.ad) {
+				if (config.getAdType() == null) {
+					throw BusinessRuntimeException.getInstance("请选择对应的广告配置类型");
+				}
+			}
 			this.saveOrUpdate(homeManagementConfig);
 			return;
 		}

+ 14 - 0
netflix-service/src/main/java/com/cyksj/service/information/InformationCategoryService.java

@@ -0,0 +1,14 @@
+package com.cyksj.service.information;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.InformationCategory;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:48
+ */
+public interface InformationCategoryService extends IService<InformationCategory> {
+    List<InformationCategory> getInformationCategory();
+}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/information/InformationService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.information;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:39
+ */
+public interface InformationService extends IService<Information> {
+    IPage<InformationListView> getInformation(Long categoryId, Integer start, Integer limit);
+    List<InformationListView> getInformationByTitle(String name);
+}

+ 21 - 0
netflix-service/src/main/java/com/cyksj/service/information/impl/InformationCategoryServiceImpl.java

@@ -0,0 +1,21 @@
+package com.cyksj.service.information.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.InformationCategoryMapper;
+import com.cyksj.model.entity.InformationCategory;
+import com.cyksj.service.information.InformationCategoryService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:48
+ */
+@Service
+public class InformationCategoryServiceImpl extends ServiceImpl<InformationCategoryMapper, InformationCategory> implements InformationCategoryService {
+    @Override
+    public List<InformationCategory> getInformationCategory() {
+        return baseMapper.getInformationCategory();
+    }
+}

+ 32 - 0
netflix-service/src/main/java/com/cyksj/service/information/impl/InformationServiceImpl.java

@@ -0,0 +1,32 @@
+package com.cyksj.service.information.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.InformationMapper;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.service.information.InformationService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:40
+ */
+@Service
+public class InformationServiceImpl extends ServiceImpl<InformationMapper, Information> implements InformationService {
+
+
+    @Override
+    public IPage<InformationListView> getInformation(Long categoryId, Integer start, Integer limit) {
+        return baseMapper.getInformation(new Page<>(start,limit),categoryId);
+    }
+
+
+    @Override
+    public List<InformationListView> getInformationByTitle(String name) {
+        return baseMapper.getInformationByTitle(name);
+    }
+}

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

@@ -343,6 +343,23 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 .eq(WorkOrder::getStatus, WorkOrder.Status.waiting)
                 .eq(WorkOrder::getUserId, orderDon.getUserId())
                 .eq(WorkOrder::getRelationId, orderDon.getRelationId()));
+
+        //更新主订单 订单状态
+        Long mOid = orderDon.getMOid();
+        List<OrderDon> orderDonList = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
+                .eq(OrderDon::getMOid, mOid));
+        if (orderDonList.size() == 1) {
+            orderMasterDonService.update(null, Wrappers.lambdaUpdate(OrderMasterDon.class)
+                    .eq(OrderMasterDon::getId, mOid)
+                    .set(OrderMasterDon::getStatus, OrderMasterDon.Status.refund));
+        } else {
+            Optional<OrderDon> any = orderDonList.stream().filter(od -> od.getStatus() != OrderDon.Status.refund).findAny();
+            if (!any.isPresent()) {
+                orderMasterDonService.update(null, Wrappers.lambdaUpdate(OrderMasterDon.class)
+                        .eq(OrderMasterDon::getId, mOid)
+                        .set(OrderMasterDon::getStatus, OrderMasterDon.Status.refund));
+            }
+        }
     }
 
     public String wxRefund(OrderRefundReq refundReq, OrderDon orderDon) throws Exception {

+ 11 - 7
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -7,10 +7,12 @@ import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
-import com.cyksj.model.entity.OrderDetailView;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderMasterDon;
 import com.cyksj.model.entity.RealGoodsInterestUser;
+import com.cyksj.model.manage.views.OrderMasterDetailView;
 import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.UnifiedOrderPayReq;
 
 import java.util.Date;
 import java.util.List;
@@ -24,15 +26,17 @@ public interface OrderDonService extends IService<OrderDon> {
 
     OrderDon submit(OrderPayRequest request) throws Exception;
 
+    OrderMasterDon unifiedSubmit(UnifiedOrderPayReq unifiedOrderPayReq) throws Exception;
+
     /**
      * 订单支付
      */
-    H5JsPayParams pay(Long orderId, String tradeType) throws Exception;
+    H5JsPayParams pay(Long mOid, String tradeType) throws Exception;
 
     /**
      * 微信pc端支付
      */
-    H5JsPayParams wxPcWebPay(Long orderId, String tradeType) throws Exception;
+    H5JsPayParams wxPcWebPay(Long mOid, String tradeType) throws Exception;
 
     /**
      * 微信支付回调
@@ -42,18 +46,18 @@ public interface OrderDonService extends IService<OrderDon> {
     /**
      * 关闭订单
      */
-    void closeOrder(Long orderId, Long userId);
+    void closeOrder(Long mOid, Long userId);
 
     OrderDon renewal(OrderPayRequest request) throws Exception;
 
-    OrderDetailView getDetail(Long orderId, Long userId);
+    OrderMasterDetailView getDetail(Long orderId, Long userId);
 
     List<OrderDon> getAppleOneOrderDons(List<Long> skuIds, List<String> noOrderStatus, Date yesZeroDate, Date thisZeroDate);
 
     /**
      * 支付宝预支付
      */
-    AliPayParams aliPay(Long orderId, String returnUrl, String productCode, String qrPayMode) throws Exception;
+    AliPayParams aliPay(Long mOid, String returnUrl, String productCode, String qrPayMode) throws Exception;
 
     /**
      * 支付宝回调
@@ -86,7 +90,7 @@ public interface OrderDonService extends IService<OrderDon> {
     /**
      * 0元订单确认
      */
-    void zeroOrderConfirm(Long orderId);
+    void zeroOrderConfirm(Long mOid);
 
     void orderNotify(OrderDon orderDon);
 }

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderMasterDonService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.order;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.OrderMasterDon;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDonService
+ * 创建者: JavaZou
+ * 创建时间:2023/10/13 18:08
+ */
+public interface OrderMasterDonService extends IService<OrderMasterDon> {
+}

+ 18 - 0
netflix-service/src/main/java/com/cyksj/service/order/ShoppingCartDonService.java

@@ -0,0 +1,18 @@
+package com.cyksj.service.order;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.ShoppingCartDon;
+import com.cyksj.model.request.UnifiedOrderPayReq;
+import com.cyksj.model.views.ShoppingCartDonPayDetailView;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartDonService
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:01
+ */
+public interface ShoppingCartDonService extends IService<ShoppingCartDon> {
+	void addGoodsShoppingCart(ShoppingCartDon goodsCartDon);
+
+	ShoppingCartDonPayDetailView unifiedPayShoppingCartGoods(UnifiedOrderPayReq unifiedOrderPayReq);
+}

+ 421 - 209
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -19,7 +19,6 @@ import com.alipay.api.request.AlipayTradeQueryRequest;
 import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
 import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.EnvCommonService;
@@ -42,6 +41,7 @@ import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.corp.CorpInteractiveUserOrderRelationMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
@@ -52,17 +52,12 @@ import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
 import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.manage.dto.ChannelBaiDuDiscountDto;
 import com.cyksj.model.manage.dto.GiftCardDto;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.manage.views.OrderDonView;
-import com.cyksj.model.request.GiftCardPayReq;
-import com.cyksj.model.request.OrderAttach;
-import com.cyksj.model.request.OrderPayRequest;
-import com.cyksj.model.request.TelegramBotMsgReq;
-import com.cyksj.model.views.CouponNewUserView;
-import com.cyksj.model.views.CouponUserView;
-import com.cyksj.model.views.GiftCardGoodsSkuFrontView;
-import com.cyksj.model.views.GoodsDonSkuView;
+import com.cyksj.model.request.*;
+import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.coupon.CouponFontService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
@@ -71,11 +66,13 @@ import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.giftcard.GiftCardOrderUseRecordService;
 import com.cyksj.service.giftcard.GiftCardUserRecordService;
 import com.cyksj.service.groups.GroupsFuncService;
+import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderCommonService;
 import com.cyksj.service.order.OrderDonPostService;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.order.OrderRefundService;
 import com.cyksj.service.pay.AliPayCommonService;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.relation.GroupRelationFrontService;
@@ -87,6 +84,7 @@ import com.cyksj.service.telegram.TelegramService;
 import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.task.JobManager;
 import com.ejlchina.searcher.BeanSearcher;
@@ -106,9 +104,6 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
-import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
-
 /**
  * @author chan
  * @date 2021/10/11 下午4:08
@@ -126,6 +121,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserMapper userMapper;
 
+	private final UserService userService;
+
 	private final WeChatService weChatService;
 
 	private final RedisService redisService;
@@ -166,6 +163,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final UserPlatDistributeRateMapper userPlatDistributeRateMapper;
 
+	private final BusinessDistributeDefaultSkuRateConfigMapper businessDistributeDefaultSkuRateConfigMapper;
+
+	private final BusinessDistributeDefaultRateConfigMapper businessDistributeDefaultRateConfigMapper;
+
 	private final CouponMapper couponMapper;
 
 	private final CouponFontService couponFontService;
@@ -216,6 +217,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonPostService orderDonPostService;
 
+	private final CorpInteractiveUserOrderRelationMapper corpInteractiveUserOrderRelationMapper;
+
 	private final GoodsDiscountPlusPurchaseRelationMapper discountPlusPurchaseRelationMapper;
 
 	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
@@ -242,6 +245,18 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final YhShopGoodsSkuMapper yhShopGoodsSkuMapper;
 
+	private final AccountMapper accountMapper;
+
+	private final CouponCommonService couponCommonService;
+
+	private final UserPlatSkuDistributeRateMapper userPlatSkuDistributeRateMapper;
+
+	private final OrderRefundService orderRefundService;
+
+	private final UserPayOrderBlockMapper userPayOrderBlockMapper;
+
+	private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -287,7 +302,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId(), couponPopularizeDto);
 		}
 		Boolean isNoLogin = payRequest.getIsNoLogin();
-		User user;
+		User user = null;
 		String payOpenId = null;
 		Long relationId = 0L;
 		Boolean isNeedTicket = checkIsNeedGroupsRelation(goodsDon);
@@ -301,9 +316,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 		GroupsRelation relation = null;
+		String orderPhone = payRequest.getPhone();
+		if (StrUtil.isNotBlank(orderPhone)) {
+			user = saveOrGetOrderPhoneUser(payRequest);
+			userId = user.getId();
+			payRequest.setUserId(userId);
+			isNoLogin = false;
+		}
 		if (userId == null) {
 			user = new User();
 			user.setId(0l);
+			isNoLogin = true;
 		} else {
 			user = userMapper.selectById(userId);
 			if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
@@ -325,6 +348,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		/* 生成订单 */
 		String donNo = SEQUENCE.nextId().toString();
 		OrderDon orderDon = new OrderDon();
+		orderDon.setIp(payRequest.getIp());
+		orderDon.setLocation(payRequest.getLocation());
+
 		orderDon.setIsDp(false);
 		if (isNoLogin != null && isNoLogin) {
 			orderDon.setIsNoLogin(true);
@@ -371,6 +397,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		orderDon.setMoney(payRequest.getDonMoney());
 		orderDon.setRealMoney(payRequest.getDonMoney());
+		orderDon.setOriMoney(sku.getPrice());
 
 		List<Long> dpSkuIds = payRequest.getDpSkuIds();
 		if (CollUtil.isNotEmpty(dpSkuIds)) {
@@ -386,6 +413,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			for (GoodsDiscountPlusPurchaseRelation re : ds_relations) {
 				goods_discount_plus_pay = goods_discount_plus_pay.add(re.getDisPrice());
 				dsSkuIds.add(re.getDisSid());
+				orderDon.setDpMoney(goods_discount_plus_pay);
 			}
 			BigDecimal pay_money = sku.getPrice().add(goods_discount_plus_pay);
 			if (pay_money.compareTo(orderDon.getMoney()) > 0) {
@@ -420,6 +448,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setCouponExCode(payRequest.getCouponExCode());
 		//店铺id
 		orderDon.setYhsId(yhsId);
+		orderDon.setInfoId(payRequest.getInfoId());
 		if (relation != null && relation.getStatus() == GroupsRelation.Status.outside) {
 			orderDon.setIsOt(true);
 		}
@@ -498,6 +527,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			});
 		}
 		orderDon.setPayTitle(payTitle.toString());
+		//下单手机号
+		orderDon.setPhone(orderPhone);
 		this.saveOrUpdate(orderDon);
 
 		if (orderDon.getIsDp()) {
@@ -558,6 +589,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			});
 			giftCardOrderUseRecordService.saveBatch(orderDon.getGcUseRecords());
 		}
+		if (payRequest.getRadarId() != null && user != null) {
+			CorpInteractiveUserOrderRelation corpInteractiveUserOrderRelation = new CorpInteractiveUserOrderRelation();
+			corpInteractiveUserOrderRelation.setUserId(user.getId());
+			corpInteractiveUserOrderRelation.setOrderId(orderDon.getId());
+			corpInteractiveUserOrderRelation.setRadarId(payRequest.getRadarId());
+			corpInteractiveUserOrderRelation.setIsNew(false);
+			if (user.getCreatedTime().getTime() >= DateUtil.beginOfDay(DateTime.now()).getTime()) {
+				corpInteractiveUserOrderRelation.setIsNew(true);
+			}
+			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
+		}
 		return orderDon;
 	}
 
@@ -759,38 +801,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						if (groupsRelation.getUserId() != 0) {
 							User user = userMapper.selectById(orderDon.getUserId());
 							if (user != null) {
-								checkIsSameUser(groupsRelation.getUserId(), orderDon.getUserId(), user.getOpenId(), user.getLoginPhone());
+								checkIsSameUser(groupsRelation.getUserId(), user);
 							}
 						}
 						//throw new BusinessRuntimeException("订单用户与车位用户不匹配!");
 					} else {
-						if (GroupsRelation.Status.locking == groupsRelation.getStatus() || GroupsRelation.Status.outside == groupsRelation.getStatus()) {
-							log.info("清理用户userId:{}未支付订单", orderDon.getUserId());
-							groupsRelation.setUserId(0L);
-							Long groupsId = groupsRelation.getGroupsId();
-							GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
-							if (groupsRelation.getNum() > groupsTrips.getNum()) {
-								groupsRelation.setStatus(GroupsRelation.Status.outside);
-							} else {
-								groupsRelation.setStatus(GroupsRelation.Status.none);
-							}
-							groupsRelation.setYhsId(0l);
-							groupsRelationMapper.updateById(groupsRelation);
-							orderCommonService.delRelation(groupsRelation);
-
-							//车位空余发送模板消息
-//						TASK_POOL.execute(() -> {
-//							try {
-//								List<CustomerService> customerServices = customerServiceMapper.selectList(null);
-//								for (CustomerService customerService : customerServices) {
-//									log.info("发送客服{}空车位通知消息", customerService.getNickName());
-//									emptySendMsgNotify(orderDon, customerService.getOpenId());
-//								}
-//							} catch (Exception e) {
-//								log.error("发送{}空车位模板消息至客服失败:{}", orderDon.getGoodsId(), e);
-//							}
-//						});
-						}
+						clearUserLockingRelation(groupsRelation, orderDon);
 					}
 				}
 				//返还优惠券
@@ -833,9 +849,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//若存在店铺id,校验店铺状态
 		Long yhsId = yhShopFrontService.checkShopCustomIdAndReturnShopId(customId);
 		//是否有其他规格的续费订单 若有请先关闭
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
 		Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
 				.eq(OrderDon::getRelationId, payRequest.getRelationId())
 				.eq(OrderDon::getYhsId, yhsId)
+				.in(OrderDon::getUserId, userIdList)
 				.eq(OrderDon::getStatus, OrderDon.Status.noPayment).eq(OrderDon::getOrderType, 2));
 		if (count > 0) {
 			throw BusinessRuntimeException.getInstance("您有该车票未支付的续费订单..");
@@ -849,7 +867,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		//todo 多账号同一用户绑定 续费
 		if (!relation.getUserId().equals(user.getId())) {
-			checkIsSameUser(relation.getUserId(), userId, user.getOpenId(), user.getLoginPhone());
+			checkIsSameUser(relation.getUserId(), user);
 		}
 		GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
 		if (groupsTrips == null) {
@@ -906,6 +924,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		/* 生成订单 */
 		String donNo = SEQUENCE.nextId().toString();
 		OrderDon orderDon = new OrderDon();
+		orderDon.setIp(payRequest.getIp());
+		orderDon.setLocation(payRequest.getLocation());
+
 		orderDon.setOrderNo(donNo);
 		orderDon.setOpenId(payOpenId);
 		orderDon.setYhsId(yhsId);
@@ -933,11 +954,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//扣除使用优惠券、余额的订单金额
 		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon.getType(), payRequest.getGcCash(), payRequest.getGcpIds());
 		this.saveOrUpdate(orderDon);
-		//订单金额为0 且订单为已完成 更新虚物车票
-		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
-			orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
-			updateGroupsTicket(orderDon, goodsDon, sku);
-		}
 		if (orderDon.getStatus() == OrderDon.Status.noPayment) {
 			jobManager.addJob(EXPIRY_TIME, () -> {
 				closeOrder(orderDon.getId(), null);
@@ -950,6 +966,25 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			});
 			giftCardOrderUseRecordService.saveBatch(orderDon.getGcUseRecords());
 		}
+		if (payRequest.getRadarId() != null && user != null) {
+			CorpInteractiveUserOrderRelation corpInteractiveUserOrderRelation = new CorpInteractiveUserOrderRelation();
+			corpInteractiveUserOrderRelation.setUserId(user.getId());
+			corpInteractiveUserOrderRelation.setOrderId(orderDon.getId());
+			corpInteractiveUserOrderRelation.setRadarId(payRequest.getRadarId());
+			corpInteractiveUserOrderRelation.setIsNew(false);
+			if (user.getCreatedTime().getTime() >= DateUtil.beginOfDay(DateTime.now()).getTime()) {
+				corpInteractiveUserOrderRelation.setIsNew(true);
+			}
+			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
+		}
+		//订单金额为0 且订单为已完成 更新虚物车票
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
+			OrderDon updateOrder = orderDonMapper.selectById(orderDon.getId());
+			updateOrder.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
+			updateGroupsTicket(updateOrder, goodsDon, sku);
+			orderDonMapper.updateById(updateOrder);
+			return updateOrder;
+		}
 		return orderDon;
 	}
 
@@ -963,8 +998,24 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			builder.field(OrderDonView::getUserId, userId);
 		}
 		OrderDetailView detail = beanSearcher.searchFirst(OrderDetailView.class, builder.build());
-		detail.setTransport(transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, detail.getId()).last(" limit 1")));
-		detail.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, detail.getId()).last(" limit 1")));
+		//获取对应车票订单 账号密码
+		if (userId != null) {
+			List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+			RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, MapUtils.builder()
+					.field(RenewalView::getUserId, userIdList).op(Operator.InList)
+					.field(RenewalView::getRelationId, detail.getRelationId())
+					.onlySelect(RenewalView::getAccount, RenewalView::getPassword)
+					.build());
+			if (renewalView != null) {
+				detail.setAccount(renewalView.getAccount());
+				detail.setPassword(renewalView.getPassword());
+			}
+		}
+
+		if (detail.getRelationId() != 0) {
+			detail.setTransport(transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, detail.getId()).last(" limit 1")));
+			detail.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, detail.getId()).last(" limit 1")));
+		}
 		return detail;
 	}
 
@@ -974,8 +1025,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	}
 
 	@Override
-	public AliPayParams aliPay(Long orderId, String returnUrl, String productCode, String qrPayMode) throws Exception {
-		return aliPayCommonService.unifiedPay(orderId, productCode, qrPayMode, returnUrl);
+	public AliPayParams aliPay(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
+		return aliPayCommonService.unifiedPay(re,productCode, qrPayMode);
 	}
 
 	@Override
@@ -1000,6 +1051,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		String transactionId = params.get("trade_no");
 		String payTimeStr = params.get("gmt_payment");
+		//买家支付宝账号
+		String buyerId = params.get("buyer_id");
+		log.info("支付宝回调信息:{}", Jsons.toJson(params));
 		if (!orderDon.getStatus().equals(OrderDon.Status.noPayment) && !orderDon.getStatus().equals(OrderDon.Status.close)) {
 			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
 			return;
@@ -1023,13 +1077,49 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setShopId(appId);
 		orderDon.setType(OrderDon.Type.ALI_PAY);
 
+		orderDon.setBuyerId(buyerId);
+		//该支付账号id 是否被后台拉黑
+		Integer count1 = userPayOrderBlockMapper.selectCount(Wrappers.lambdaQuery(UserPayOrderBlock.class)
+				.eq(UserPayOrderBlock::getBuyerId, buyerId));
+		if (count1 > 0) {
+			log.info("该支付账号id:{} 已被后台拉黑", buyerId);
+			notifyRefundOrder(orderDon, goodsDon, sku);
+			return;
+		}
+
+		if (orderDon.getOrderType() == 1 && StrUtil.isNotEmpty(buyerId)) {
+			//近一个月同一买家id 只能购买一次 多人
+			if (orderDon.getGoodsId() == 26l && sku.getNum() != 1) {
+				Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+						.ne(OrderDon::getId, orderDon.getId())
+						.eq(OrderDon::getGoodsId, orderDon.getGoodsId())
+						.eq(OrderDon::getBuyerId, buyerId)
+						.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+						.ge(OrderDon::getCreatedTime, DateUtil.offsetMonth(DateTime.now(), -1)));
+				if (count > 1) {
+					//退款
+					log.info("一个月内同一买家id购买过Midjourney账号,对订单号:{}进行退款", orderDon.getOrderNo());
+					notifyRefundOrder(orderDon, goodsDon, sku);
+					return;
+				}
+			}
+		}
+		//回调
 		unifiedHandlerOrderNotify(orderDon, goodsDon, sku);
 	}
 
-	public void setRelation(Long relationId, Long groupsId, Long userId, Long goodsId, Boolean isLoginPopularize, GroupsRelation.Status status) {
-		if (!redisService.setNx(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L)) {
-			log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
-			throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
+	public void setRelation(GroupsRelation relation) {
+		Long relationId = relation.getId();
+		Long userId = relation.getUserId();
+		Long groupsId = relation.getGroupsId();
+		GroupsRelation.Status status = relation.getStatus();
+		String relation_num_key = RedisKey.GROUPS_RELATION_NUM_KEY + relationId;
+		if (!redisService.setNx(relation_num_key, userId, 60 * 5L)) {
+			GroupsRelation dbRelation = groupsRelationMapper.selectById(relationId);
+			if (dbRelation.getUserId() != 0) {
+				log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
+				throw new BusinessRuntimeException("系统繁忙,请重试...");
+			}
 		}
 		if (status == GroupsRelation.Status.outside) {
 			return;
@@ -1137,6 +1227,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setPayTime(DateTime.now());
 		}
 		this.updateById(orderDon);
+
+		//调整指定规格车队下次可 停用车位数的时间
+		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
 	}
 
 	public void updateCarParkAndSendMsg(GoodsDon goodsDon, GoodsDonSku sku, OrderDon order) {
@@ -1257,8 +1350,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						order.setStatus(OrderDon.Status.complete);
 					}
 				}
-				//下架POE会员车队
-				if (order.getGoodsId() != null && Constant.DOWN_GOODS_PAY.contains(order.getGoodsId())) {
+				//下架POE会员车队 || GPT Plus独立规格 下架
+				if (order.getGoodsId() != null && Constant.DOWN_GOODS_PAY.contains(order.getGoodsId()) || goodsDonSkuMapper.selectSingleSkuIdsByGoodsId(Constant.AI_goodsIds.get(0)).contains(groupsTrips.getSkuId())) {
 					if (groupsTrips.getAccountId() != null && groupsTrips.getStatus() == GroupsTrips.Status.validity) {
 						groupsTrips.setStatus(GroupsTrips.Status.down);
 						groupsMapper.updateById(groupsTrips);
@@ -1266,6 +1359,30 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 				//TODO 如未发车逻辑
 				groupsRelationMapper.updateById(relation);
+
+				if (envCommonService.isPrdEnv() && order.getOrderType() == 2) {
+					//ChatGPT plus 独立和Midjourney 独立有人续费了发短信
+					if (Constant.AI_goodsIds.contains(order.getGoodsId()) && sku.getNum() == 1) {
+						try {
+							String accountStr = StrUtil.EMPTY;
+							Account account = accountMapper.selectById(groupsTrips.getAccountId());
+							if (account != null) {
+								accountStr = account.getAccount();
+							}
+							String renew_msg = String.format(Constant.AI_RENEW_MSG, order.getUserId(), goodsDon.getTitle(), sku.getSpecVal(), accountStr);
+							SmsUtil.sendLuoKey2Msg(Constant.SERVICE_PHONE, renew_msg);
+						} catch (Exception e) {
+						}
+					}
+				}
+				//GPT 代充 发送短信通知
+				if (envCommonService.isPrdEnv() && order.getGoodsId() == 40l) {
+					try {
+						String pay_msg = String.format(Constant.PAY_MSG, order.getUserId(), goodsDon.getTitle(), sku.getSpecVal());
+						SmsUtil.sendLuoKey2Msg(Constant.SERVICE_PHONE, pay_msg);
+					} catch (Exception e) {
+					}
+				}
 			}
 		}
 
@@ -1299,13 +1416,31 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	 * 分销待发积分记录
 	 */
 	public void distributeWaitingSendPointsRecord(OrderDon order) {
+		log.info("订单id:{}产生分销积分开始--->", order.getId());
 		DistributeWaitingSendPoints distributeWaitingSendPoints = new DistributeWaitingSendPoints();
 		distributeWaitingSendPoints.setOrderId(order.getId());
 		distributeWaitingSendPoints.setUserId(order.getUserId());
 		BigDecimal orderMoney = order.getMoney();
+		//是否是加购订单
+		if (order.getIsDp()) {
+			//加购订单使用 主平台金额 分销
+			orderMoney = order.getOriMoney();
+			if (orderMoney.compareTo(BigDecimal.ZERO) == 0) {
+				log.info("orderId:{}之前加购订单,无主平台金额,使用规格金额", order.getId());
+				GoodsDonSku sku = goodsDonSkuMapper.selectById(order.getSkuId());
+				orderMoney = sku.getPrice();
+			}
+		}
+		order.setDsMoney(orderMoney);
 		BigDecimal points = null;
 		BigDecimal returnMoney = null;
 		Long businessId = null;
+		//普通分销
+		GoodsDon goodsDon = goodsDonMapper.selectById(order.getGoodsId());
+		if (goodsDon == null || !goodsDon.getIsDistribute()) {
+			log.info("分销订单orderId:{}对应平台goodsId:{}不存在或已不参与分成比例", order.getId(), order.getGoodsId());
+			return;
+		}
 		UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, order.getUserId()).last("limit 1"));
 		if (userDistributeShared != null) {
 			distributeWaitingSendPoints.setSharedId(userDistributeShared.getSharedId());
@@ -1314,49 +1449,80 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				log.info("分销兑换积分比例未配置");
 			} else {
 				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()).eq(UserDistribute::getDeleted, true).last("limit 1"));
-				//普通分销
-				GoodsDon goodsDon = goodsDonMapper.selectById(order.getGoodsId());
 				//分销比例
 				Integer rate = 0;
 				if (userDistribute == null) {
-					if (goodsDon != null) {
-						//普通分销者 是否享受过该用户的首单分销
-						DistributeWaitingSendPoints isReceived = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
-								.eq(DistributeWaitingSendPoints::getSharedId, userDistributeShared.getSharedId())
-								.eq(DistributeWaitingSendPoints::getUserId, order.getUserId())
-								.in(DistributeWaitingSendPoints::getSendStatus, List.of(DistributeWaitingSendPoints.Status.waiting.name(), DistributeWaitingSendPoints.Status.success.name()))
-								.last("limit 1"));
-						if (isReceived != null) {
-							return;
-						}
-						rate = goodsDon.getRate();
-						//实物分销比例
-						if (goodsDon.getType() == 2) {
-							GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
-							if (goodsDonSku != null) {
-								//不包含套餐权益
-								if (!goodsDonSku.getIsBenefits()) {
-									rate = goodsDon.getSecondRate();
-								}
+					//普通分销者 是否享受过该用户的首单分销
+					DistributeWaitingSendPoints isReceived = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
+							.eq(DistributeWaitingSendPoints::getSharedId, userDistributeShared.getSharedId())
+							.eq(DistributeWaitingSendPoints::getUserId, order.getUserId())
+							.in(DistributeWaitingSendPoints::getSendStatus, List.of(DistributeWaitingSendPoints.Status.waiting.name(), DistributeWaitingSendPoints.Status.success.name()))
+							.last("limit 1"));
+					if (isReceived != null) {
+						return;
+					}
+					rate = goodsDon.getRate();
+					//实物分销比例
+					if (goodsDon.getType() == 2) {
+						GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
+						if (goodsDonSku != null) {
+							//不包含套餐权益
+							if (!goodsDonSku.getIsBenefits()) {
+								rate = goodsDon.getSecondRate();
 							}
 						}
-						returnMoney = orderMoney.multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(100));
 					}
+					returnMoney = orderMoney.multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(100));
 				} else {
 					businessId = userDistribute.getBusinessId();
-					//固定推广分销
-					UserPlatDistributeRate userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
-							.eq(UserPlatDistributeRate::getGoodsId, order.getGoodsId())
-							.eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
-							.last("limit 1"));
+					UserPlatDistributeRate userPlatDistributeRate = null;
+					Integer secondRate = 0;
+					//该商品是否开启了 规格分销
+					if (goodsDon.getIsSkuDistribute()) {
+						//规格分销 比例
+						UserPlatSkuDistributeRate userPlatSkuDistributeRate = userPlatSkuDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatSkuDistributeRate.class)
+								.eq(UserPlatSkuDistributeRate::getDistributeId, userDistribute.getId())
+								.eq(UserPlatSkuDistributeRate::getSkuId, order.getSkuId()).last("limit 1"));
+						if (userPlatSkuDistributeRate != null) {
+							userPlatDistributeRate = getUserPlatDistributeRate(userPlatSkuDistributeRate.getRate(), userPlatSkuDistributeRate.getSecondRate());
+						}
+					}
+					if (userPlatDistributeRate == null) {
+						//默认规格分销比例
+						if (goodsDon.getIsSkuDistribute()) {
+							BusinessDistributeDefaultSkuRateConfig businessDistributeDefaultSkuRateConfig = businessDistributeDefaultSkuRateConfigMapper.selectOne(Wrappers.lambdaQuery(BusinessDistributeDefaultSkuRateConfig.class)
+									.eq(BusinessDistributeDefaultSkuRateConfig::getSkuId, order.getSkuId())
+									.last("limit 1"));
+							if (businessDistributeDefaultSkuRateConfig != null) {
+								userPlatDistributeRate = getUserPlatDistributeRate(businessDistributeDefaultSkuRateConfig.getRate(), businessDistributeDefaultSkuRateConfig.getSecondRate());
+							}
+						}
+					}
+					if (userPlatDistributeRate == null) {
+						//固定推广分销 平台比例
+						userPlatDistributeRate = userPlatDistributeRateMapper.selectOne(Wrappers.lambdaQuery(UserPlatDistributeRate.class)
+								.eq(UserPlatDistributeRate::getGoodsId, order.getGoodsId())
+								.eq(UserPlatDistributeRate::getDistributeId, userDistribute.getId())
+								.last("limit 1"));
+					}
+					//未配置平台分销比例 寻找默认比例
+					if (userPlatDistributeRate == null) {
+						BusinessDistributeDefaultRateConfig defaultRateConfig = businessDistributeDefaultRateConfigMapper.selectOne(Wrappers.lambdaQuery(BusinessDistributeDefaultRateConfig.class)
+								.eq(BusinessDistributeDefaultRateConfig::getGoodsId, order.getGoodsId())
+								.last("limit 1"));
+						if (defaultRateConfig != null) {
+							userPlatDistributeRate = getUserPlatDistributeRate(defaultRateConfig.getRate(), defaultRateConfig.getSecondRate());
+						}
+					}
 					if (userPlatDistributeRate != null) {
 						rate = userPlatDistributeRate.getRate();
-						if (goodsDon != null && goodsDon.getType() == 2) {
+						secondRate = userPlatDistributeRate.getSecondRate();
+						if (goodsDon.getType() == 2) {
 							GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(order.getSkuId());
 							if (goodsDonSku != null) {
 								//不包含套餐权益
 								if (!goodsDonSku.getIsBenefits()) {
-									rate = userPlatDistributeRate.getSecondRate();
+									rate = secondRate;
 								}
 							}
 							distributeWaitingSendPoints.setIsDelivery(false);
@@ -1378,6 +1544,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					log.info("用户{}邀请{},产生分销订单分发积分记录入库", userDistributeShared.getSharedId(), order.getUserId());
 					distributeWaitingSendPoints.setSendStatus(DistributeWaitingSendPoints.Status.waiting);
 					distributeWaitingSendPoints.setSendTime(DateUtil.offsetDay(order.getPayTime(), 3));
+					distributeWaitingSendPoints.setRate(rate);
 					distributeWaitingSendPointsMapper.insert(distributeWaitingSendPoints);
 					//暂定虚物 商务可首单提成
 					if (businessId != null) {
@@ -1757,38 +1924,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		return orderDon.getStatus();
 	}
 
-	public void checkIsSameUser(Long relationUserId, Long userId, String openId, String loginPhone) {
-		//手机用户与微信用户
-		LambdaQueryWrapper<UserBindDetail> wrapper = Wrappers.lambdaQuery(UserBindDetail.class);
-		Boolean isPcUser = false;
-		if (StrUtil.isNotBlank(openId)) {
-			wrapper.eq(UserBindDetail::getUserId, userId);
-		} else {
-			isPcUser = true;
-			wrapper.eq(UserBindDetail::getPhone, loginPhone);
-		}
-		UserBindDetail userBindDetail = userBindDetailMapper.selectOne(wrapper.last("limit 1"));
-		if (userBindDetail == null) {
-			throw new BusinessRuntimeException("");
-		}
-		if (userBindDetail != null) {
-			if (isPcUser) {
-				if (!relationUserId.equals(userBindDetail.getUserId())) {
-					throw new BusinessRuntimeException("");
-				}
-			} else {
-				if (StrUtil.isEmpty(userBindDetail.getPhone())) {
-					throw new BusinessRuntimeException("");
-				}
-				User otherUser = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
-						.eq(User::getLoginPhone, userBindDetail.getPhone()).last("limit 1"));
-				if (otherUser == null) {
-					throw new BusinessRuntimeException("");
-				}
-				if (!relationUserId.equals(otherUser.getId())) {
-					throw new BusinessRuntimeException("");
-				}
-			}
+	public void checkIsSameUser(Long relationUserId, User renewUser) {
+		List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(renewUser.getId(), renewUser);
+		if (!relationUserIdList.contains(relationUserId)) {
+			throw BusinessRuntimeException.getInstance("");
 		}
 	}
 
@@ -1868,90 +2007,23 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	 * yshId 店铺id
 	 */
 	public GroupsRelation getRelation(OrderPayRequest payRequest, GoodsDonSku sku, Long yhsId) {
-		GroupsRelation relation;
 		Long payRelationId = payRequest.getRelationId();
-		Boolean isLoginPopularize = payRequest.getIsLoginPopularize();
 		Long userId = payRequest.getUserId();
-		//锁定座位
-		if (payRelationId != null && payRelationId > 0) {
-			relation = groupsRelationMapper.selectById(payRelationId);
-			if (relation == null) {
-				throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-			}
-			if (relation.getUserId() != null && relation.getUserId() > 0L) {
-				throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
-			}
-
-		} else {
-			//寻找差不多过期时间规格的车位
-			relation = groupRelationFrontService.getSimilarExpiredGroupRelation(sku.getId(), sku.getDays(), sku.getMonths(), null);
-			if (relation == null) {
-				//TODO 如果没指定座位,等待逻辑确认
-				GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
-						.eq(GroupsTrips::getSkuId, sku.getId())
-						.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
-						.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
-						.orderByAsc(GroupsTrips::getAvailableNum));
-				if (groups == null) {
-					//若是MidJourney、ChatGPT PLUS每个已满车队 硬塞5个座位
-					//主账号过期时间10天以外
-					if (sku.getNum() > 1 && Constant.AI_goodsIds.contains(sku.getGoodsId())) {
-						DateTime tenExpiry = DateUtil.offsetDay(DateUtil.beginOfDay(DateTime.now()), 10);
-						//不塞存在该用户的车队
-						Long groupsId = groupsRelationMapper.getOutSideGroupsTripsRelationByGoodsId(sku.getId(), tenExpiry, 5, userId);
-						if (groupsId != null) {
-							relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-									.eq(GroupsRelation::getGroupsId, groupsId)
-									.eq(GroupsRelation::getUserId, 0)
-									.eq(GroupsRelation::getStatus, GroupsRelation.Status.outside)
-									.last("limit 1"));
-							if (relation == null) {
-								if (redisService.setNx(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getName() + groupsId, groupsId, RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getTimeout())) {
-									relation = new GroupsRelation();
-									relation.setStatus(GroupsRelation.Status.outside);
-									relation.setUserId(userId);
-									relation.setGroupsId(groupsId);
-									GroupsRelation maxNumRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getGroupsId, groupsId).orderByDesc(GroupsRelation::getNum).last("limit 1"));
-									relation.setNum(maxNumRelation.getNum() + 1);
-									groupsRelationMapper.insert(relation);
-									redisService.del(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getName() + groupsId);
-								}
-							}
-							groups = groupsMapper.selectById(groupsId);
-						}
-					}
-					if (relation == null) {
-						//待发车
-						groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
-								.eq(GroupsTrips::getSkuId, sku.getId())
-								.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
-								.eq(GroupsTrips::getStatus, GroupsTrips.Status.waiting)
-								.orderByAsc(GroupsTrips::getAvailableNum));
-					}
-				}
-
-				if (groups == null) {
-					relation = groupsFuncService.createNewGroupsTrips(sku);
-				}
-
-				if (relation == null) {
-					//寻找快满编车队进行占座
-					relation = groupsRelationMapper.selectRandomOneRelationByGroupsId(groups.getId());
-					if (relation == null) {
-						throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-					}
-				}
-			}
-		}
+		//获取车票车位
+		GroupsRelation relation = groupRelationFrontService.getRelation(payRelationId, userId, sku);
 
 		//锁定座位
-		setRelation(relation.getId(), relation.getGroupsId(), userId, sku.getGoodsId(), isLoginPopularize, relation.getStatus());
+		setRelation(relation);
 		relation.setUserId(userId);
 		//重新置为锁定
 		relation.setStatus(GroupsRelation.Status.locking);
 		relation.setYhsId(yhsId);
 		groupsRelationMapper.updateById(relation);
-		redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relation.getId());
+
+		Long skuId = sku.getId();
+		Long groupsId = relation.getGroupsId();
+		//校验指定平台规格的 目前车队的可停车位数
+		groupRelationFrontService.checkGroupsAvailParkingNum(skuId, groupsId, relation.getGroupsAvailParkingNum(), relation.getMaxNum());
 		return relation;
 	}
 
@@ -2013,10 +2085,20 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			Long couponId = couponUser.getCouponId();
 			Coupon coupon = couponMapper.getCouponById(couponId);
 			BigDecimal couponMoney = null;
+			BigDecimal payMoney = orderDon.getMoney();
+			BigDecimal needDeductMoney = payMoney;
+			if (orderDon.getOriMoney() == null) {
+				orderDon.setOriMoney(payMoney);
+			}
+			if (orderDon.getIsDp() != null && orderDon.getIsDp()) {
+				needDeductMoney = needDeductMoney.subtract(orderDon.getDpMoney());
+			}
 			if (coupon.getType() == Coupon.Type.discount) {
-				BigDecimal discountMoney = orderDon.getMoney().multiply(coupon.getDiscount());
-				orderDon.setMoney(discountMoney);
-				couponMoney = orderDon.getRealMoney().subtract(discountMoney);
+				couponMoney = needDeductMoney.multiply(BigDecimal.valueOf(1).subtract(coupon.getDiscount()));
+				//需支付金额
+				orderDon.setMoney(payMoney.subtract(couponMoney));
+
+				orderDon.setOriMoney(orderDon.getOriMoney().multiply(coupon.getDiscount()));
 				//记录折扣 用于分销
 				couponUser.setDiscount(coupon.getDiscount());
 				couponUserMapper.updateById(couponUser);
@@ -2026,9 +2108,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						throw BusinessRuntimeException.getInstance(String.format("满%s可用", coupon.getReduceCondition().divide(BigDecimal.valueOf(100))));
 					}
 				}
-				BigDecimal subtractMoney = orderDon.getMoney().subtract(coupon.getReduceMoney());
+				BigDecimal subtractMoney = payMoney.subtract(coupon.getReduceMoney());
 				orderDon.setMoney(subtractMoney);
-				couponMoney = orderDon.getRealMoney().subtract(subtractMoney);
+				couponMoney = coupon.getReduceMoney();
+
+				orderDon.setOriMoney(orderDon.getOriMoney().subtract(coupon.getReduceMoney()));
 			}
 			if (couponMoney != null && couponMoney.compareTo(first_money) >= 0) {
 				throw BusinessRuntimeException.getInstance("支付金额不能小于优惠金额");
@@ -2040,14 +2124,38 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getPopularizeId() != null && orderDon.getPopularizeId() != 0L) {
 			//使用了优惠券 不再使用360渠道 折扣
 			if (couponUser == null && goodsType == 1) {
-				String name = channelPopularizeMapper.selectChannelByPid(orderDon.getPopularizeId());
-				if (Constant.CHANNEL_NAME_360.equals(name)) {
-					SysConfig sysConfig = sysConfigService.getBaseMapper().selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.CHANNEL_360_DISCOUNT));
-					if (sysConfig != null) {
-						BigDecimal discountMoney = orderDon.getMoney().multiply(BigDecimal.valueOf(Double.valueOf(sysConfig.getSysValue())));
-						orderDon.setMoney(discountMoney);
+				//百度渠道 专门优惠链接
+				SysConfig baiduConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+						.eq(SysConfig::getSysKey, Constant.CHANNEL_BAIDU_DISCOUNT_KEY).last("limit 1"));
+				if (baiduConfig != null) {
+					String sysValue = baiduConfig.getSysValue();
+					if (StrUtil.isNotBlank(sysValue)) {
+						try {
+							ChannelBaiDuDiscountDto baiDuDiscountDto = Jsons.parseObject(sysValue, ChannelBaiDuDiscountDto.class);
+							List<Long> baiduPopularizeIds = baiDuDiscountDto.getPopularizeIds();
+							BigDecimal discount = baiDuDiscountDto.getDiscount();
+							if (CollUtil.isNotEmpty(baiduPopularizeIds) && discount != null && discount.compareTo(BigDecimal.ZERO) > 0) {
+								if (baiduPopularizeIds.contains(orderDon.getPopularizeId())) {
+									BigDecimal discountMoney = orderDon.getMoney().multiply(discount);
+									orderDon.setMoney(discountMoney);
+								}
+							}
+
+						} catch (Exception e) {
+						}
+					}
+				} else {
+					//360
+					String name = channelPopularizeMapper.selectChannelByPid(orderDon.getPopularizeId());
+					if (Constant.CHANNEL_NAME_360.equals(name)) {
+						SysConfig sysConfig = sysConfigService.getBaseMapper().selectOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.CHANNEL_360_DISCOUNT));
+						if (sysConfig != null) {
+							BigDecimal discountMoney = orderDon.getMoney().multiply(BigDecimal.valueOf(Double.valueOf(sysConfig.getSysValue())));
+							orderDon.setMoney(discountMoney);
+						}
 					}
 				}
+
 			}
 		}
 
@@ -2172,6 +2280,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		this.updateById(orderDon);
 
+		//调整指定规格车队下次可 停用车位数的时间
+		groupRelationFrontService.adjustGroupsParkingTime(orderDon.getRelationId(), sku);
+
 		TASK_POOL.execute(()->{
 			try {
 				//发放积分
@@ -2238,6 +2349,28 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				sendTelegramMsg(orderDon, goodsDon, sku);
 			});
 		}
+		if (orderDon.getPopularizeId() != null && orderDon.getPopularizeId() != 0 && StrUtil.isNotEmpty(orderDon.getPhone())) {
+			//百度渠道 专门优惠链接
+			SysConfig baiduConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.CHANNEL_BAIDU_DISCOUNT_KEY).last("limit 1"));
+			if (baiduConfig != null) {
+				String sysValue = baiduConfig.getSysValue();
+				if (StrUtil.isNotBlank(sysValue)) {
+					try {
+						ChannelBaiDuDiscountDto baiDuDiscountDto = Jsons.parseObject(sysValue, ChannelBaiDuDiscountDto.class);
+						List<Long> couponIds = baiDuDiscountDto.getCouponIds();
+						//下单成功后 发送优惠券
+						if (CollUtil.isNotEmpty(couponIds)) {
+							List<Long> baiduPopularizeIds = baiDuDiscountDto.getPopularizeIds();
+							if (baiduPopularizeIds.contains(orderDon.getPopularizeId())) {
+								couponIds.forEach(couponId -> couponCommonService.sendCouponToUser(orderDon.getUserId(), couponId, null, null, null, CouponUser.Channel.manual));
+							}
+						}
+					} catch (Exception e) {
+					}
+				}
+			}
+		}
 	}
 
 	private void deductGiftCardCash(Long userId, Long gcId, BigDecimal deductCash, BigDecimal gcRemainCash, List<GiftCardOrderUseRecord> gcUseRecords, Boolean isUsed) {
@@ -2364,6 +2497,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						Coupon coupon = couponDistributePopularizeMapper.selectDiscountCouponByUserId(distributeId, order.getSkuId());
 						//未配置对应折扣
 						//按优惠多少对半平摊
+						BigDecimal real_points = points;
 						if (coupon == null) {
 							BigDecimal splitDiscount = BigDecimal.valueOf(1).subtract(plat_discount);
 							BigDecimal avg = realMoney.multiply(splitDiscount).divide(BigDecimal.valueOf(2));
@@ -2372,6 +2506,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 								points = BigDecimal.ZERO;
 							}
 							distributeWaitingSendPoints.setIsRule(true);
+							//平摊积分
+							distributeWaitingSendPoints.setDeductPoints(real_points.subtract(points));
 						}
 						if (coupon != null) {
 							BigDecimal distribute_discount = coupon.getDiscount();
@@ -2386,6 +2522,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 									points = BigDecimal.ZERO;
 								}
 								distributeWaitingSendPoints.setIsRule(true);
+								//平摊积分
+								distributeWaitingSendPoints.setDeductPoints(real_points.subtract(points));
 							}
 						}
 					}
@@ -2450,12 +2588,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					if (!userDistributeShared.getIsBind()) {
 						orderDon.setIsDistribute(false);
 					} else {
-						//45天内是否下单成功
+						//45天内是否下单成功 ==>改为30天
 						Date createdTime = userDistributeShared.getCreatedTime();
-						DateTime forty_five = DateUtil.offsetDay(createdTime, 45);
+						DateTime time = DateUtil.offsetDay(createdTime, 30);
 						//在45天内
 						Boolean is_fit = false;
-						boolean before = DateTime.now().isBefore(forty_five);
+						boolean before = DateTime.now().isBefore(time);
 						//超过45天还未下过单
 						//直接不参与后续的 提成
 						if (before) {
@@ -2464,7 +2602,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 							int count = this.count(Wrappers.lambdaQuery(OrderDon.class)
 									.eq(OrderDon::getUserId, userId)
 									.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
-									.le(OrderDon::getCreatedTime, forty_five));
+									.le(OrderDon::getCreatedTime, time));
 							if (count > 0) {
 								is_fit = true;
 							} else {
@@ -2503,4 +2641,78 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		return sku;
 	}
-}
+
+	public User saveOrGetOrderPhoneUser(OrderPayRequest payRequest) {
+		String orderPhone = payRequest.getPhone();
+		User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
+				.eq(User::getLoginPhone, orderPhone).last("limit 1"));
+		if (user == null) {
+			user = new User();
+			StringBuilder name = new StringBuilder();
+			name.append(Constant.DEFAULT_NAME);
+			user.setPopularizeId(payRequest.getPopularizeId());
+			user.setLoginPhone(orderPhone);
+			user.setNickname(String.format("%s%s", name.toString(), RandomUtil.randomString(6)));
+			//默认头像
+			user.setHeadimgurl(Constant.DEFAULT_HEAD_IMG);
+			String registerEnv = null;
+			user.setRegisterEnv(StrUtil.isEmpty(registerEnv) ? User.RegisterEnv.pc.name() : registerEnv);
+			userMapper.insert(user);
+			if (StrUtil.isEmpty(user.getShowId())) {
+				user.setShowId(userService.getUserShowId(user.getId()));
+			}
+		}
+		return user;
+	}
+
+	public UserPlatDistributeRate getUserPlatDistributeRate(Integer rate, Integer secondRate) {
+		UserPlatDistributeRate userPlatDistributeRate = new UserPlatDistributeRate();
+		userPlatDistributeRate.setRate(rate);
+		userPlatDistributeRate.setSecondRate(secondRate);
+		return userPlatDistributeRate;
+	}
+
+	private void clearUserLockingRelation(GroupsRelation groupsRelation, OrderDon orderDon) {
+		if (groupsRelation == null) {
+			return;
+		}
+		if (GroupsRelation.Status.locking == groupsRelation.getStatus()) {
+			log.info("清理用户userId:{}未支付订单", orderDon.getUserId());
+			groupsRelation.setUserId(0L);
+			Long groupsId = groupsRelation.getGroupsId();
+			GroupsTrips groupsTrips = groupsMapper.selectById(groupsId);
+			if (groupsRelation.getNum() > groupsTrips.getNum()) {
+				groupsRelation.setStatus(GroupsRelation.Status.outside);
+
+				redisService.del(RedisService.key.GROUPS_TRIPS_OUTSIDE_RELATION.getNameFormat(groupsId, groupsRelation.getNum()));
+			} else {
+				groupsRelation.setStatus(GroupsRelation.Status.none);
+			}
+			groupsRelation.setYhsId(0l);
+			groupsRelationMapper.updateById(groupsRelation);
+			orderCommonService.delRelation(groupsRelation);
+		}
+	}
+
+	/**
+	 * 回调后 直接退款
+	 */
+	public void notifyRefundOrder(OrderDon orderDon, GoodsDon goodsDon, GoodsDonSku sku) throws Exception {
+		//退款
+		OrderRefundReq orderRefundReq = new OrderRefundReq();
+		orderRefundReq.setOrderId(orderDon.getId());
+		orderRefundReq.setRefundType("ALI_PAY");
+		orderRefundReq.setRefundMoney(orderDon.getMoney());
+		orderDon.setRefundDesc("近一个月内购买过Midjourney账号");
+		String outNo = orderRefundService.centerRefund(orderRefundReq, orderDon);
+
+		orderDon.setStatus(OrderDon.Status.refund);
+		orderDonMapper.updateById(orderDon);
+
+		clearUserLockingRelation(groupsRelationMapper.selectById(orderDon.getRelationId()), orderDon);
+
+		//记录退款
+		orderRefundService.refundRecord(orderDon, orderRefundReq.getRefundMoney(), goodsDon, sku, outNo, orderDon.getType().getType());
+		return;
+	}
+}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderMasterDonServiceImpl.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.order.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.order.OrderMasterDonMapper;
+import com.cyksj.model.entity.OrderMasterDon;
+import com.cyksj.service.order.OrderMasterDonService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderMasterDonServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/10/13 18:08
+ */
+@Service
+public class OrderMasterDonServiceImpl extends ServiceImpl<OrderMasterDonMapper, OrderMasterDon> implements OrderMasterDonService {
+}

+ 79 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/ShoppingCartOrderServiceImpl.java

@@ -0,0 +1,79 @@
+package com.cyksj.service.order.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.order.ShoppingCartDonMapper;
+import com.cyksj.model.entity.ShoppingCartDon;
+import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.UnifiedOrderPayReq;
+import com.cyksj.model.views.GoodsDonSkuDetailView;
+import com.cyksj.model.views.ShoppingCartDonPayDetailView;
+import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.order.ShoppingCartDonService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ShoppingCartOrderServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 16:01
+ */
+@Service
+@RequiredArgsConstructor
+public class ShoppingCartOrderServiceImpl extends ServiceImpl<ShoppingCartDonMapper, ShoppingCartDon> implements ShoppingCartDonService {
+	private final BeanSearcher beanSearcher;
+
+	private final OrderDonService orderDonService;
+	@Override
+	public void addGoodsShoppingCart(ShoppingCartDon goodsCartDon) {
+		//最多添加购物车数量30
+		int count = this.count(Wrappers.lambdaQuery(ShoppingCartDon.class)
+				.eq(ShoppingCartDon::getUserId, goodsCartDon.getUserId()));
+		if (count >= 30) {
+			throw BusinessRuntimeException.getInstance("最多添加30件商品至购物车");
+		}
+		Long skuId = goodsCartDon.getSkuId();
+		if (skuId == null) {
+			throw BusinessRuntimeException.getInstance("请指定商品添加至购物车");
+		}
+		GoodsDonSkuDetailView goodsDonSkuDetailView = beanSearcher.searchFirst(GoodsDonSkuDetailView.class, MapUtils.builder()
+				.field(GoodsDonSkuDetailView::getSkuId, skuId).build());
+		if (goodsDonSkuDetailView == null) {
+			throw BusinessRuntimeException.getInstance("该商品已不存在..");
+		}
+		if (!goodsDonSkuDetailView.getGoodsStatus()) {
+			throw BusinessRuntimeException.getInstance("该商品已下架..");
+		}
+		if (!goodsDonSkuDetailView.getGoodsSkuStatus()) {
+			throw BusinessRuntimeException.getInstance("该商品规格已下架..");
+		}
+		if (goodsCartDon.getNum() == null) {
+			goodsCartDon.setNum(1);
+		}
+		goodsCartDon.setGoodsId(goodsDonSkuDetailView.getGoodsId());
+		goodsCartDon.setSkuId(skuId);
+		this.save(goodsCartDon);
+	}
+
+	@Override
+	public ShoppingCartDonPayDetailView unifiedPayShoppingCartGoods(UnifiedOrderPayReq unifiedOrderPayReq) {
+		Long userId = unifiedOrderPayReq.getUserId();
+		//处理订单
+		List<OrderPayRequest> payGoods = unifiedOrderPayReq.getPayGoods();
+		if (CollUtil.isEmpty(payGoods)) {
+			throw BusinessRuntimeException.getInstance("请选择商品后再进行下单..");
+		}
+		ShoppingCartDonPayDetailView payDetailView = new ShoppingCartDonPayDetailView();
+//		String orderNo = ;
+//		String payTitle = ;
+//		orderDonService.submit();
+		return null;
+	}
+}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java

@@ -18,5 +18,5 @@ public interface AliPayCommonService {
 	 */
 	AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception;
 
-	AliPayParams unifiedPay(Long orderId, String productCode, String payMode, String returnUrl) throws Exception;
+	AliPayParams unifiedPay(Long mOid, String productCode, String payMode, String returnUrl) throws Exception;
 }

+ 15 - 9
netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java

@@ -22,10 +22,10 @@ import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.order.OrderMasterDonMapper;
 import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.OrderPayBuilderDto;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderMasterDon;
 import com.cyksj.model.entity.RegisterOrderDon;
 import com.cyksj.model.entity.ShopConfig;
 import com.cyksj.model.request.OrderAttach;
@@ -62,6 +62,8 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 
 	private final SysConfigService sysConfigService;
 
+	private final OrderMasterDonMapper orderMasterDonMapper;
+
 	@Override
 	public AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception {
 		RegisterOrderDon orderDon = registerOrderDonMapper.selectById(orderId);
@@ -96,8 +98,8 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 	}
 
 	@Override
-	public AliPayParams unifiedPay(Long orderId, String productCode, String payMode, String returnUrl) throws Exception {
-		OrderDon orderDon = orderDonMapper.selectById(orderId);
+	public AliPayParams unifiedPay(Long mOid, String productCode, String payMode, String returnUrl) throws Exception {
+		OrderMasterDon orderDon = orderMasterDonMapper.selectById(mOid);
 		//获取支付宝默认商户
 		String appId = sysConfigService.getDefaultShopConfigByType("zfb");
 		if (orderDon.getPopularizeId() != null) {
@@ -106,8 +108,8 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 				appId = shopConfig.getAppId();
 			}
 		}
-		if (OrderDon.Type.ALI_PAY != orderDon.getType()) {
-			orderDon.setType(OrderDon.Type.ALI_PAY);
+		if (OrderMasterDon.Type.ALI_PAY != orderDon.getType()) {
+			orderDon.setType(OrderMasterDon.Type.ALI_PAY);
 		}
 		orderDon.setShopId(appId);
 		if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
@@ -116,9 +118,13 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode)) {
 			orderDon.setIsWebPay(false);
 		}
-		orderDonMapper.updateById(orderDon);
-		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
-		String subject = goodsDon.getTitle().contains("ChatGPT") ? "AI订阅" : goodsDon.getTitle();
+		orderMasterDonMapper.updateById(orderDon);
+
+		String subject = orderMasterDonMapper.getOrderPayTitle(mOid);
+		if (subject.contains("ChatGPT")) {
+			subject = "AI订阅";
+		}
+
 		//回调地址
 		String host = envCommonService.getHost();
 		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.notifyUrl);

+ 21 - 9
netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java

@@ -1,14 +1,17 @@
 package com.cyksj.service.paypal;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderMasterDon;
 import com.cyksj.model.entity.PaypalPayConfig;
 import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.order.OrderMasterDonService;
 import com.paypal.api.payments.*;
 import com.paypal.api.payments.Currency;
 import com.paypal.base.rest.APIContext;
@@ -44,6 +47,8 @@ public class PayPalService{
 
     private final RedisService redisService;
 
+    private final OrderMasterDonService orderMasterDonService;
+
 
     private static final String SANDBOX_URL = "https://api-m.sandbox.paypal.com";
     private static final String LIVE_URL = "https://api-m.paypal.com";
@@ -66,15 +71,22 @@ public class PayPalService{
             Sale sale = payment.getTransactions().get(0).getRelatedResources().get(0).getSale();
             Currency transactionFee = sale.getTransactionFee();
             String transationId = sale.getId();
-            String orderId = payment.getTransactions().get(0).getCustom();
+
+            String mOid = payment.getTransactions().get(0).getCustom();
+            OrderMasterDon masterDon = orderMasterDonService.getById(mOid);
             //更新订单支付状态
-            OrderDon orderDon = orderDonService.getById(orderId);
-            orderDon.setTransactionId(transationId);
-            orderDon.setPayTime(new Date());
-            orderDon.setAbroadTransactionFee(new BigDecimal(transactionFee.getValue()).multiply(BigDecimal.valueOf(100)));
-            orderDonService.orderNotify(orderDon);
-            log.info("支付成功订单:"+orderId+",支付交易号:"+transationId);
-            log.info("支付成功订单:"+orderId+",返回参数:"+Jsons.toJson(payment));
+            masterDon.setTransactionId(transationId);
+            masterDon.setPayTime(new Date());
+            masterDon.setAbroadTransactionFee(new BigDecimal(transactionFee.getValue()).multiply(BigDecimal.valueOf(100)));
+            log.info("支付成功订单:"+mOid+",支付交易号:"+transationId);
+            log.info("支付成功订单:"+mOid+",返回参数:"+Jsons.toJson(payment));
+
+            //子订单
+            List<OrderDon> orderDonList = orderDonService.list(Wrappers.lambdaQuery(OrderDon.class)
+                    .eq(OrderDon::getMOid, mOid));
+            orderDonList.forEach(orderDon -> {
+                orderDonService.orderNotify(orderDon);
+            });
 
             THREAD_POOL.execute(()->{
                 try {
@@ -101,7 +113,7 @@ public class PayPalService{
 
             });
 
-            return redisService.getStr(RedisService.key.ABROAD_SUCCESS_URL.getName() + orderId);
+            return redisService.getStr(RedisService.key.ABROAD_SUCCESS_URL.getName() + mOid);
         }
         log.info("支付失败返回参数:"+ Jsons.toJson(payment));
         return paypalPayConfig.getCancelUrl();

+ 25 - 14
netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java

@@ -1,14 +1,17 @@
 package com.cyksj.service.stripe;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.StripePayConfigMapper;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderMasterDon;
 import com.cyksj.model.entity.StripePayConfig;
 import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.order.OrderMasterDonService;
 import com.stripe.Stripe;
 import com.stripe.exception.StripeException;
 import com.stripe.model.*;
@@ -23,6 +26,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * @author zwhui
@@ -41,9 +45,11 @@ public class StripeService {
 
     private final StripePayConfigMapper stripePayConfigMapper;
 
+    private final OrderMasterDonService orderMasterDonService;
 
 
-   public String checkOutStripe(Long orderId,String successUrl) throws Exception{
+
+    public String checkOutStripe(Long orderId,String successUrl) throws Exception{
        OrderDon orderDon = orderDonService.getById(orderId);
        BigDecimal money = orderDon.getMoney();
        orderDon.setType(OrderDon.Type.STRIPE);
@@ -87,16 +93,17 @@ public class StripeService {
            log.error("支付回调失败");
            return;
        }
-       String orderId = session.getClientReferenceId();
+       String mOid = session.getClientReferenceId();
        if (!"paid".equals(session.getPaymentStatus())){
            return;
        }
-       OrderDon orderDon = orderDonService.getById(orderId);
-       if (orderDon == null){
+       OrderMasterDon masterDon = orderMasterDonService.getById(mOid);
+
+       if (masterDon == null){
            return;
        }
-       if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
-           log.info("已回调,重复修改状态 id:{}", orderDon.getId());
+       if (!masterDon.getStatus().equals(OrderMasterDon.Status.noPayment) && !masterDon.getStatus().equals(OrderMasterDon.Status.close)) {
+           log.info("支付宝已回调,重复修改状态 id:{}", masterDon.getId());
            return;
        }
        String paymentIntentId = session.getPaymentIntent();
@@ -104,14 +111,18 @@ public class StripeService {
        String chargeId = paymentIntent.getLatestCharge();
        BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve(chargeId).getBalanceTransaction());
        //更新订单支付状态
-
-       orderDon.setTransactionId(chargeId);
-       orderDon.setAbroadTransactionFee(BigDecimal.valueOf(balanceTransaction.getFee()));
-       orderDon.setPayTime(new Date());
-       orderDonService.orderNotify(orderDon);
-       log.info("支付成功订单:"+orderId+",支付交易号:"+chargeId);
-       log.info("支付成功订单:"+orderId+",返回参数:"+Jsons.toJson(session));
-
+       masterDon.setTransactionId(chargeId);
+       masterDon.setAbroadTransactionFee(BigDecimal.valueOf(balanceTransaction.getFee()));
+       masterDon.setPayTime(new Date());
+       log.info("支付成功订单:"+mOid+",支付交易号:"+chargeId);
+       log.info("支付成功订单:"+mOid+",返回参数:"+Jsons.toJson(session));
+
+       //子订单
+       List<OrderDon> orderDonList = orderDonService.list(Wrappers.lambdaQuery(OrderDon.class)
+               .eq(OrderDon::getMOid, mOid));
+       orderDonList.forEach(orderDon->{
+           orderDonService.orderNotify(orderDon);
+       });
    }
 
 

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.user;
 
 import com.cyksj.model.entity.UserBalanceSourceRecord;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
 
 import java.math.BigDecimal;
 
@@ -44,4 +45,9 @@ public interface UserBenefitsService {
 	 * 扣除店铺主用户 提成金额
 	 */
 	void deductYhShopTakeMoney(Long orderId, Long shopUserId, BigDecimal deductMoney);
+
+	/**
+	 * 修改用户银河币
+	 */
+	void updateGalaxycoin(Long userId, BigDecimal addGalaxycoin, UserGalaxycoinRecord.Source source);
 }

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserGalaxycoinRecordService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.user;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 13:34
+ */
+public interface UserGalaxycoinRecordService extends IService<UserGalaxycoinRecord> {
+}

+ 24 - 4
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java

@@ -4,12 +4,10 @@ import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.mapper.DistributeOrdersDeductPointsRecordMapper;
 import com.cyksj.mapper.UserBalanceSourceRecordMapper;
+import com.cyksj.mapper.UserGalaxycoinRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.shop.YhShopDistributeOrdersDeductPointsRecordMapper;
-import com.cyksj.model.entity.DistributeOrdersDeductPointsRecord;
-import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserBalanceSourceRecord;
-import com.cyksj.model.entity.YhShopDistributeOrdersDeductPointsRecord;
+import com.cyksj.model.entity.*;
 import com.cyksj.service.sms.SmsService;
 import com.cyksj.service.user.UserBenefitsService;
 import lombok.RequiredArgsConstructor;
@@ -39,6 +37,8 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 
 	private final YhShopDistributeOrdersDeductPointsRecordMapper yhShopDistributeOrdersDeductPointsRecordMapper;
 
+	private final UserGalaxycoinRecordMapper userGalaxycoinRecordMapper;
+
 	@Override
 	public void deductDistributePoints(Long orderId, Long userId, BigDecimal deductPoints) {
 		if (deductPoints.compareTo(BigDecimal.ZERO) <= 0) {
@@ -178,4 +178,24 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 
 		}
 	}
+
+
+	@Override
+	public void updateGalaxycoin(Long userId, BigDecimal addGalaxycoin, UserGalaxycoinRecord.Source source) {
+		if (addGalaxycoin.compareTo(BigDecimal.ZERO) == 0) {
+			return;
+		}
+		while (true) {
+			User user = userMapper.selectById(userId);
+			if (user == null) break;
+			Integer success = userMapper.updateGalaxycoin(user.getId(), addGalaxycoin, user.getGalaxycoin());
+			if (success == 1) break;
+			UserGalaxycoinRecord record = new UserGalaxycoinRecord();
+			record.setUserId(userId);
+			record.setGalaxycoin(addGalaxycoin);
+			record.setSource(source);
+			record.setRemark(source.getDesc());
+			userGalaxycoinRecordMapper.insert(record);
+		}
+	}
 }

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserGalaxycoinRecordServiceImpl.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.user.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.UserGalaxycoinRecordMapper;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
+import com.cyksj.service.user.UserGalaxycoinRecordService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 13:35
+ */
+@Service
+@RequiredArgsConstructor
+public class UserGalaxycoinRecordServiceImpl extends ServiceImpl<UserGalaxycoinRecordMapper, UserGalaxycoinRecord> implements UserGalaxycoinRecordService {
+}

+ 92 - 0
netflix-web/src/main/java/com/cyksj/web/controller/information/InformationController.java

@@ -0,0 +1,92 @@
+package com.cyksj.web.controller.information;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.entity.InformationCategory;
+import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.InformationDetailView;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.information.InformationCategoryService;
+import com.cyksj.service.information.InformationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 17:20
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/information")
+@RequiredArgsConstructor
+public class InformationController {
+    private final BeanSearcher beanSearcher;
+
+    private final InformationCategoryService informationCategoryService;
+
+    private final InformationService informationService;
+
+    private final HttpServletRequest request;
+
+    private final RedisService redisService;
+
+    /**
+     * 查询发现页文章列表
+     */
+    @GetMapping("/get")
+    public Result<IPage<InformationListView>> getInformation(Long categoryId, @RequestParam(defaultValue = "0") Integer start, @RequestParam(defaultValue = "5") Integer limit){
+        String key = RedisService.key.INFORMATION_KEY.getEnvName() + "categoryId:" + categoryId;
+        IPage<InformationListView> information = (IPage<InformationListView>) redisService.get(key);
+        if (information == null) {
+            information = informationService.getInformation(categoryId, start, limit);
+            redisService.setNx(key, information, RedisService.key.INFORMATION_KEY.getTimeout());
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(information);
+    }
+
+
+    /**
+     * 查询分类
+     */
+    @GetMapping("/get/category")
+    public Result<List<InformationCategory>> getInformationCategory() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(informationCategoryService.getInformationCategory());
+    }
+
+    /**
+     * 获取文章详情
+     */
+    @GetMapping("/get/detail/{id}")
+    public Result<InformationDetailView> getInformation(@PathVariable Long id) {
+        String key = RedisService.key.INFORMATION_KEY.getEnvName() + "id:" + id;
+        InformationDetailView view = (InformationDetailView) redisService.get(key);
+        if (view == null){
+            view = beanSearcher.searchFirst(InformationDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+                    .field(InformationDetailView::getId, id).build());
+            try {
+                List<Long> goodsIds = Jsons.parseList(view.getGoodsIds(), Long.class);
+                List<GoodsFrontListView> goodsList = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsFrontListView::getId,goodsIds).op(Operator.InList).build());
+                view.setGoods(goodsList);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            redisService.setNx(key, view, RedisService.key.INFORMATION_KEY.getTimeout());
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+    }
+}

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

@@ -30,6 +30,7 @@ import com.cyksj.model.excel.ExcelRealGoodsUserInterestHasPaymentData;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.OrderDonBackView;
+import com.cyksj.model.manage.views.OrderMasterDonBackView;
 import com.cyksj.model.request.*;
 import com.cyksj.model.views.*;
 import com.cyksj.service.mange.CmsOrderDonService;
@@ -89,6 +90,7 @@ public class CmsOrderController {
 
 	@GetMapping("/get")
 	@SaCheckPermission("order:view")
+	@Deprecated
 	public Result<SearchResult<OrderDonBackView>> get(Long channelId, String account, String showId) {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (channelId != null) {
@@ -140,6 +142,110 @@ public class CmsOrderController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * @param channelId    推广渠道id
+	 * @param account      用户邀请制座位账号
+	 * @param showId       用户展示id
+	 * @param goodsDonType 平台类型 1虚拟
+	 * @param goodsId      平台id
+	 * @param skuId        规格id
+	 * @param isNoBind     是否未绑定车票
+	 * @param dsType       优惠类型 1优惠券 2余额 3 银河币
+	 * @return
+	 */
+	@GetMapping("/get/mOrder")
+	public Result<SearchResult<OrderMasterDonBackView>> getMOrder(Long channelId, String account, String showId, Long goodsDonType, Long goodsId, Long skuId, Boolean isNoBind, Integer dsType, List<String> status) {
+		StringBuilder conditionSb = new StringBuilder();
+
+		if (goodsId != null) {
+			conditionSb.append(String.format(" and goods_id = %s", goodsId));
+		}
+		if (skuId != null) {
+			conditionSb.append(String.format(" and os.sku_id = %s"));
+		}
+		if (goodsDonType != null) {
+			conditionSb.append(String.format(" and os.goods_id in (select id from goods_don where type = %s)", goodsDonType));
+		}
+		if (isNoBind != null) {
+			String f = isNoBind ? "=" : "!=";
+			conditionSb.append(String.format(" and os.ex_code != '' and os.user_id %s 0", f));
+		}
+		if (dsType != null) {
+			//默认优惠券
+			String dsTypeField = "coupon_user_id";
+			if (dsType == 2) {
+				dsTypeField = "balance";
+			} else if (dsType == 3) {
+				dsTypeField = "galaxycoin";
+			}
+			conditionSb.append(String.format(" and os.%s != 0", dsTypeField));
+		}
+		if (status != null) {
+			conditionSb.append(String.format(" and os.status in %s", status.toString().replaceAll("\\[", "(").replaceAll("]", ")")));
+		}
+		String conditionSql = null;
+		if (conditionSb.length() > 0) {
+			conditionSql = String.format(" exists (select count(*) from order_don os where os.m_oid = o.id %s) > 0", conditionSb.toString());
+		}
+
+		//主订单
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (channelId != null) {
+			List<Long> popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId);
+			builder.field(OrderMasterDonBackView::getPopularizeId, popularizeIds).op(Operator.InList);
+		}
+		if (StrUtil.isNotBlank(account)) {
+			GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+					.eq(GroupsRelation::getAccount, account).last("limit 1"));
+			if (relation != null) {
+				builder.field(OrderMasterDonBackView::getUserId, relation.getUserId());
+			} else {
+				builder.field(OrderMasterDonBackView::getUserId).op(Operator.IsNull);
+			}
+		}
+		if (StrUtil.isNotBlank(showId)) {
+			builder.field(OrderMasterDonBackView::getUserId, userService.getUserIdByShowId(showId));
+		}
+		if (StrUtil.isNotBlank(conditionSql)) {
+			builder.put("condition", conditionSql);
+		}
+		SearchResult<OrderMasterDonBackView> search1 = beanSearcher.search(OrderMasterDonBackView.class, builder.build());
+		search1.getDataList().forEach(mData -> {
+			List<OrderDonBackView> orderDonBackViews = beanSearcher.searchAll(OrderDonBackView.class, MapUtils.builder().field(OrderDonBackView::getMOid).build());
+			mData.setOrderDonViews(orderDonBackViews);
+			mData.getOrderDonViews().forEach(data -> {
+				if (data.getPopularizeId() != null) {
+					Optional.ofNullable(channelPopularizeMapper.selectChannelByPid(data.getPopularizeId()))
+							.ifPresent(channelName -> data.setChannel(channelName));
+				}
+				if (data.getGoodsDonType() != null && Constant.realGoodsType.contains(data.getGoodsDonType())) {
+					RealGoodsOrderHandle realGoodsOrderHandle = realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, data.getId()).last("limit 1"));
+					if (realGoodsOrderHandle != null) {
+						data.setBeforeServiceName(realGoodsOrderHandle.getBeforeServiceName());
+						data.setAfterServiceName(realGoodsOrderHandle.getAfterServiceName());
+					}
+				}
+				if (data.getCouponUserId() != 0) {
+					data.setCouponName(couponMapper.getCouponNameByCouponUserId(data.getCouponUserId()));
+					data.setCouponMoney(data.getCouponMoney() == null ? BigDecimal.ZERO : data.getCouponMoney());
+				}
+				Optional.ofNullable(relationMapper.selectById(data.getRelationId()))
+						.ifPresent(relation -> {
+							data.setAccount(relation.getAccount());
+							AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGroupsId, relation.getGroupsId()).onlySelect(AccountView::getAccount).build());
+							Optional.ofNullable(accountView).ifPresent(view -> data.setGtAccount(view.getAccount()));
+						});
+				Optional.ofNullable(skuMapper.selectById(data.getSkuId()))
+						.ifPresent(sku -> {
+							data.setSpecVal(sku.getSpecVal());
+							data.setMonths(sku.getMonths());
+							data.setDays(sku.getDays());
+						});
+			});
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search1);
+	}
+
 	/**
 	 * 用户退款订单列表
 	 */

+ 15 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -2,7 +2,9 @@ package com.cyksj.web.controller.manage;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -18,6 +20,8 @@ import com.cyksj.model.request.UserFuncPropertyReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserGalaxycoinRecordService;
+import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
@@ -62,6 +66,8 @@ public class CmsUserController{
 
     private final OrderDonMapper orderDonMapper;
 
+    private final UserGalaxycoinRecordService userGalaxycoinRecordService;
+
     @GetMapping("/get")
     @SaCheckPermission("user:view")
     public Result<SearchResult<UserView>> get(String otherPhone, Long sharedId, String userid, Long businessId, String sort, String order) {
@@ -277,4 +283,13 @@ public class CmsUserController{
         List<QuestionResponseRecordView> views = beanSearcher.searchAll(QuestionResponseRecordView.class, builder.build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(views);
     }
+
+    /**
+     * 查询用户银河币明细
+     */
+    @GetMapping("/get/galaxycoinRecord")
+    public Result<SearchResult<UserGalaxycoinRecord>> getGalaxycoinRecord(){
+        SearchResult<UserGalaxycoinRecord> search = beanSearcher.search(UserGalaxycoinRecord.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }

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

@@ -6,7 +6,6 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsClickUserRecordMapper;
-import com.cyksj.model.entity.GoodsClickUserRecord;
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonCategory;
 import com.cyksj.model.views.GoodsDonCategoryGoodsView;
@@ -120,11 +119,6 @@ public class CmsGoodsDonCategoryController {
 	@GetMapping("/get")
 	public Result<SearchResult<GoodsDonCategoryView>> getCategory() {
 		SearchResult<GoodsDonCategoryView> search = beanSearcher.search(GoodsDonCategoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		search.getDataList().forEach(data->{
-			Integer count = goodsClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(GoodsClickUserRecord.class)
-					.eq(GoodsClickUserRecord::getCategory, data.getId()));
-			data.setClick(count);
-		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
@@ -134,11 +128,6 @@ public class CmsGoodsDonCategoryController {
 	@GetMapping("/get/goods")
 	public Result<SearchResult<GoodsDonCategoryGoodsView>> getCategoryGoodsView() {
 		SearchResult<GoodsDonCategoryGoodsView> search = beanSearcher.search(GoodsDonCategoryGoodsView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		search.getDataList().forEach(data->{
-			Integer count = goodsClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(GoodsClickUserRecord.class)
-					.eq(GoodsClickUserRecord::getGoodsId, data.getGoodsId()));
-			data.setClick(count);
-		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 

+ 30 - 10
netflix-web/src/main/java/com/cyksj/web/controller/manage/home/HomeManageConfigController.java

@@ -4,13 +4,14 @@ import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.GoodsDonCategory;
 import com.cyksj.model.entity.HomeManagementConfig;
-import com.cyksj.model.entity.HomeManagementConfigUserClickRecord;
 import com.cyksj.model.request.HomeManageConfigReq;
 import com.cyksj.model.views.HomeManagementAvailableGoodsView;
 import com.cyksj.model.views.HomeManagementConfigView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.home.HomeManagementConfigService;
+import com.cyksj.service.mange.GoodsDonCategoryService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
@@ -39,6 +40,8 @@ public class HomeManageConfigController {
 
 	private final RedisService redisService;
 
+	private final GoodsDonCategoryService goodsDonCategoryService;
+
 	/**
 	 * 新增首页配置
 	 */
@@ -54,7 +57,7 @@ public class HomeManageConfigController {
 	@PutMapping("/put")
 	public Result<String> updateConfig(@RequestBody HomeManageConfigReq config) {
 		homeManagementConfigService.saveOrUpdateConfig(config);
-		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
 		redisService.del(keys.toArray(String[]::new));
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
@@ -69,11 +72,33 @@ public class HomeManageConfigController {
 		Assert.notNull(byId, "配置不存在");
 		byId.setStatus(!byId.getStatus());
 		homeManagementConfigService.updateById(byId);
-		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
 		redisService.del(keys.toArray(String[]::new));
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
+	/**
+	 * 配置 一键上下架
+	 */
+	@PutMapping("/batch/update/status/{status}")
+	public Result<String> batchUpdateStatus(@RequestBody List<Long> ids, @PathVariable Boolean status) {
+		homeManagementConfigService.update(null, Wrappers.lambdaUpdate(HomeManagementConfig.class)
+				.set(HomeManagementConfig::getStatus, status)
+				.in(HomeManagementConfig::getId, ids));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 分类 一键上下架
+	 */
+	@PutMapping("/batch/update/category/status/{status}")
+	public Result<String> batchUpdateCategoryStatus(@RequestBody List<Long> ids, @PathVariable Boolean status) {
+		goodsDonCategoryService.update(null, Wrappers.lambdaUpdate(GoodsDonCategory.class)
+				.set(GoodsDonCategory::getStatus, status)
+				.in(GoodsDonCategory::getId, ids));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 	/**
 	 * 配置排序
 	 */
@@ -85,7 +110,7 @@ public class HomeManageConfigController {
 		Integer sorted = config.getSorted();
 		byId.setSorted(sorted);
 		homeManagementConfigService.updateById(byId);
-		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
 		redisService.del(keys.toArray(String[]::new));
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
@@ -99,7 +124,7 @@ public class HomeManageConfigController {
 						.set(HomeManagementConfig::getDeleted, false)
 						.eq(HomeManagementConfig::getId, id)
 						.eq(HomeManagementConfig::getDeleted, true));
-		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "homeManage" + "*");
+		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "*");
 		redisService.del(keys.toArray(String[]::new));
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
@@ -112,11 +137,6 @@ public class HomeManageConfigController {
 		SearchResult<HomeManagementConfigView> search = beanSearcher.search(HomeManagementConfigView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.field(HomeManagementConfigView::getType, type.name())
 				.build());
-		search.getDataList().forEach(data -> {
-			Number number = beanSearcher.searchCount(HomeManagementConfigUserClickRecord.class, MapUtils.builder()
-					.field(HomeManagementConfigUserClickRecord::getConfigId, data.getId()).build());
-			data.setClick(number.intValue());
-		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 

+ 175 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/information/CmsInformationController.java

@@ -0,0 +1,175 @@
+package com.cyksj.web.controller.manage.information;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.InformationClickUserRecordMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.views.InformationView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.information.InformationCategoryService;
+import com.cyksj.service.information.InformationService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:41
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/information")
+public class CmsInformationController {
+    private final InformationService informationService;
+
+    private final BeanSearcher beanSearcher;
+
+    private final HttpServletRequest request;
+
+    private final InformationCategoryService informationCategoryService;
+
+    private final GoodsDonMapper goodsDonMapper;
+
+    private final RedisService redisService;
+
+    private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
+    private final OrderDonMapper orderDonMapper;
+
+    /**
+     * 保存文章
+     */
+    @PostMapping("/post")
+    public Result<String> saveInformation(@RequestBody Information information) {
+        informationService.save(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 修改文章
+     */
+    @PutMapping("/put")
+    public Result<String> updateInformation(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章");
+        }
+        informationService.updateById(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 获取文章
+     */
+    @GetMapping("/get")
+    public Result<SearchResult<InformationView>> getInformation() {
+        SearchResult<InformationView> list = beanSearcher.search(InformationView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        list.getDataList().forEach(data -> {
+            try {
+                List<Long> goodsIds = Jsons.parseList(data.getGoodsIds(), Long.class);
+                data.setGoodsTitles(goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class)
+                        .select(GoodsDon::getTitle)
+                        .in(GoodsDon::getId, goodsIds)
+                        .eq(GoodsDon::getStatus, true)
+                        .eq(GoodsDon::getDeleted,true)).stream().map(GoodsDon::getTitle).collect(Collectors.toList()));
+                List<Long> categoryIds = Jsons.parseList(data.getCategoryIds(), Long.class);
+                data.setCategoryNames(informationCategoryService.list(Wrappers.lambdaQuery(InformationCategory.class)
+                        .select(InformationCategory::getName)
+                        .in(InformationCategory::getId,categoryIds)).stream().map(InformationCategory::getName).collect(Collectors.toList()));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    }
+
+    /**
+     * 修改文章状态
+     */
+    @PutMapping("/update/status")
+    public Result<String> updateStatus(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章");
+        }
+        informationService.updateById(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除文章
+     */
+    @DeleteMapping("/del/{id}")
+    public Result<String> delById(@PathVariable Long id) {
+        Information byId = informationService.getById(id);
+        if (byId == null) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
+        byId.setDeleted(false);
+        informationService.updateById(byId);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+    /**
+     * 保存文章类型
+     */
+    @PostMapping("/post/category")
+    public Result<String> saveInformationCategory(@RequestBody List<InformationCategory> informationCategorys) {
+        log.info("保存文章类型 categorys:{}",informationCategorys);
+        informationCategoryService.saveBatch(informationCategorys);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 修改文章类型
+     */
+    @PutMapping("/put/category")
+    public Result<String> updateInformationCategory(@RequestBody List<InformationCategory> informationCategorys) {
+        informationCategoryService.updateBatchById(informationCategorys);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 获取文章类型
+     */
+    @GetMapping("/get/category")
+    public Result<List<InformationCategory>> getInformationCategory() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(informationCategoryService.list(Wrappers.lambdaQuery(InformationCategory.class).orderByAsc(InformationCategory::getSortBy)));
+    }
+
+    /**
+     * 删除文章类型
+     */
+    @DeleteMapping("/del/category/{id}")
+    public Result<String> delCategoryById(@PathVariable Long id) {
+        int count = informationService.count(Wrappers.lambdaQuery(Information.class).apply("JSON_CONTAINS(category_ids,'\"" + id + "\"')").eq(Information::getDeleted, true));
+        if (count > 0){
+            throw BusinessRuntimeException.getInstance("该类型下存在文章,无法删除");
+        }
+        informationCategoryService.removeById(id);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+}

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

@@ -22,8 +22,10 @@ import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
 import com.cyksj.model.entity.*;
-import com.cyksj.model.manage.views.OrderDonSearchView;
 import com.cyksj.model.manage.views.OrderDonView;
+import com.cyksj.model.manage.views.OrderMasterDetailView;
+import com.cyksj.model.manage.views.OrderMasterDonView;
+import com.cyksj.model.manage.views.OrderMasterSearchView;
 import com.cyksj.model.request.AlipayOrderDonReq;
 import com.cyksj.model.request.OrderPayRequest;
 import com.cyksj.model.response.AliPayTradeStatus;
@@ -60,7 +62,6 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.List;
@@ -138,9 +139,9 @@ public class OrderController {
     /**
      * 0元订单确认
      */
-    @PostMapping("/post/order/status/{orderId}")
-    public Result<String> zeroOrderConfirm(@PathVariable Long orderId) {
-        orderDonService.zeroOrderConfirm(orderId);
+    @PostMapping("/post/order/status/{mOid}")
+    public Result<String> zeroOrderConfirm(@PathVariable Long mOid) {
+        orderDonService.zeroOrderConfirm(mOid);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
@@ -150,12 +151,12 @@ public class OrderController {
      * @author chan
      * @date 2021-10-11 下午4:56
      */
-    @PostMapping("/post/pay/{orderId}")
-    public Result<H5JsPayParams> pay(@PathVariable Long orderId) throws Exception {
+    @PostMapping("/post/pay/{mOid}")
+    public Result<H5JsPayParams> pay(@PathVariable Long mOid) throws Exception {
         final String methodName = "吊起微信支付";
-        log.info("{}[start] orderId:{}",methodName,orderId);
+        log.info("{}[start] orderId:{}",methodName,mOid);
 
-        H5JsPayParams payParams = orderDonService.pay(orderId, "JSAPI");
+        H5JsPayParams payParams = orderDonService.pay(mOid, "JSAPI");
 
         return GatewayResponse.SUCCESS.newBuilder().toResult(payParams);
     }
@@ -164,10 +165,10 @@ public class OrderController {
      * 调用生成订单之后
      * 微信网页预下单获取交易链接生成二维码
      */
-    @PostMapping("/get/wx/orderQrCode/{orderId}")
-    public Result<String> createUnifiedOrderQr(@PathVariable Long orderId) throws Exception {
+    @PostMapping("/get/wx/orderQrCode/{mOid}")
+    public Result<String> createUnifiedOrderQr(@PathVariable Long mOid) throws Exception {
         //预下单
-        H5JsPayParams payParams = orderDonService.wxPcWebPay(orderId, "NATIVE");
+        H5JsPayParams payParams = orderDonService.wxPcWebPay(mOid, "NATIVE");
         //获取二维码链接code_url
         String codeUrl = payParams.getCodeUrl();
         QrConfig qrConfig = new QrConfig(300, 300);
@@ -249,9 +250,9 @@ public class OrderController {
 	@PostMapping("/post/pay/zfb")
     @Deprecated
     public Result<String> aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
-        Long orderId = re.getOrderId();
+        Long mOid = re.getOrderId();
         String returnUrl = re.getReturnUrl();
-        AliPayParams aliPayParams = orderDonService.aliPay(orderId, returnUrl, ZfbProductCode.MOBILE_WEB.getProductCode(), null);
+        AliPayParams aliPayParams = orderDonService.aliPay(mOid, returnUrl, ZfbProductCode.MOBILE_WEB.getProductCode(), null);
 //        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
         //直接将完整的表单html输出到页面
 //        response.getWriter().write(aliPayParams.getBody());
@@ -266,9 +267,9 @@ public class OrderController {
      */
     @PostMapping("/get/zfb/orderQrCode")
     public Result<String> zfbWebQrCode(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
-        Long orderId = re.getOrderId();
+        Long mOid = re.getOrderId();
         String returnUrl = re.getReturnUrl();
-        AliPayParams aliPayParams = orderDonService.aliPay(orderId, returnUrl, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_orderCode);
+        AliPayParams aliPayParams = orderDonService.aliPay(mOid, returnUrl, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_orderCode);
 //        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
         //直接将完整的表单html输出到页面
 //        response.getWriter().write(aliPayParams.getBody());
@@ -283,9 +284,9 @@ public class OrderController {
      */
     @PostMapping("/get/zfb/orderRedirect")
     public Result<String> zfbWebRedirectQrCode(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
-        Long orderId = re.getOrderId();
+        Long mOid = re.getOrderId();
         String returnUrl = re.getReturnUrl();
-        AliPayParams aliPayParams = orderDonService.aliPay(orderId, returnUrl, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_redirect);
+        AliPayParams aliPayParams = orderDonService.aliPay(mOid, returnUrl, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_redirect);
         return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
     }
 
@@ -339,33 +340,51 @@ public class OrderController {
      * 获取订单列表
      */
     @GetMapping("/get")
-    public Result<SearchResult<OrderDonView>> list(String customId){
+    public Result<SearchResult<OrderMasterDonView>> list(String customId, String status) {
         long userId = StpUserUtil.getLoginIdAsLong();
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         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::getUserId, userIds).op(Operator.InList)
-                .orderBy(OrderDonView::getId).desc()
-                .build());
-        search.getDataList().forEach(data->{
-            Integer count = availableBenefitsMapper.selectCount(Wrappers.lambdaQuery(UserPayEquipmentAvailableBenefits.class)
-                    .eq(UserPayEquipmentAvailableBenefits::getRealOrderId, data.getId())
-                    .eq(UserPayEquipmentAvailableBenefits::getDeleted, true));
-            data.setIsHasBenefits(count > 0 ? true : false);
-            if (data.getIsBenefits() != null && data.getIsBenefits()) {
-                String benefitsList = data.getBenefitsList();
-                if (StrUtil.isNotBlank(benefitsList)) {
-                    try {
-                        List<Long> skuIds = Jsons.parseList(benefitsList, GoodsDonSku.class).stream().map(GoodsDonSku::getId).collect(Collectors.toList());
-                        data.setBenefitsViews(beanSearcher.searchAll(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuIds).op(Operator.InList).build()));
-                    } catch (Exception e) {
 
+        String conditionSql = null;
+        if (StrUtil.isNotBlank(status)) {
+            StringBuilder conditionSb = new StringBuilder();
+            conditionSb.append(String.format(" and os.status = %s", status));
+            conditionSql = String.format(" exists (select count(*) from order_don os where os.m_oid = o.id %s) > 0", conditionSb.toString());
+        }
+        if (StrUtil.isNotBlank(conditionSql)) {
+            builder.put("condition", conditionSql);
+        }
+        SearchResult<OrderMasterDonView> search = beanSearcher.search(OrderMasterDonView.class, builder
+                .field(OrderMasterDonView::getYhsId, yhsId)
+                .field(OrderMasterDonView::getUserId, userIds).op(Operator.InList)
+                .orderBy(OrderMasterDonView::getMOid).desc()
+                .build());
+        search.getDataList().forEach(mData -> {
+            List<OrderDonView> orderDonViews = beanSearcher.searchAll(OrderDonView.class, MapUtils.builder()
+                    .field(OrderDonView::getMOid, mData.getMOid())
+                    .orderBy(OrderDonView::getId).desc().build());
+            mData.setOrderDonViews(orderDonViews);
+            mData.getOrderDonViews().forEach(data -> {
+                if (data.getIsBenefits() != null && data.getIsBenefits()) {
+                    String benefitsList = data.getBenefitsList();
+                    if (StrUtil.isNotBlank(benefitsList)) {
+                        try {
+                            List<Long> skuIds = Jsons.parseList(benefitsList, GoodsDonSku.class).stream().map(GoodsDonSku::getId).collect(Collectors.toList());
+                            data.setBenefitsViews(beanSearcher.searchAll(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuIds).op(Operator.InList).build()));
+                        } catch (Exception e) {
+
+                        }
                     }
                 }
-            }
-            data.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, data.getId()).last("limit 1")));
+                if (data.getRelationId() == 0) {
+                    Integer count = availableBenefitsMapper.selectCount(Wrappers.lambdaQuery(UserPayEquipmentAvailableBenefits.class)
+                            .eq(UserPayEquipmentAvailableBenefits::getRealOrderId, data.getId())
+                            .eq(UserPayEquipmentAvailableBenefits::getDeleted, true));
+                    data.setIsHasBenefits(count > 0 ? true : false);
+                    data.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, data.getId()).last("limit 1")));
+                }
+            });
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
@@ -374,35 +393,36 @@ public class OrderController {
     /**
      * 获取订单详情
      */
-    @GetMapping("/get/{orderId}")
-    public Result<OrderDetailView> detail(@PathVariable Long orderId, Boolean isNoLogin) {
+    @GetMapping("/get/{mOid}")
+    public Result<OrderMasterDetailView> detail(@PathVariable Long mOid, Boolean isNoLogin) {
         Long userId = null;
         if (isNoLogin == null || !isNoLogin) {
             userId = StpUserUtil.getLoginIdAsLong();
         }
 
-        OrderDetailView detail = orderDonService.getDetail(orderId, userId);
+        OrderMasterDetailView detail = orderDonService.getDetail(mOid, userId);
 
         return GatewayResponse.SUCCESS.newBuilder().toResult(detail);
     }
 
     /**
      * 取消订单
+     * 主订单id
      */
-    @GetMapping("/get/close/{orderId}")
-    public Result<String> closeOrder(@PathVariable Long orderId) {
+    @GetMapping("/get/close/{mOid}")
+    public Result<String> closeOrder(@PathVariable Long mOid) {
         long userId = StpUserUtil.getLoginIdAsLong();
-        orderDonService.closeOrder(orderId, userId);
+        orderDonService.closeOrder(mOid, userId);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
-    @GetMapping("/get/order/status/{orderId}")
-    public Result<OrderDonSearchView> getOrderStatusById(@PathVariable Long orderId) {
-        if (orderId < 1) {
+    @GetMapping("/get/order/status/{mOid}")
+    public Result<OrderMasterSearchView> getMasterOrderStatusById(@PathVariable Long mOid) {
+        if (mOid < 1) {
             throw BusinessRuntimeException.getInstance("订单不存在");
         }
-        OrderDonSearchView orderDonView = beanSearcher.searchFirst(OrderDonSearchView.class, MapUtils.builder()
-                .put("orderId", String.format("where id = %s", orderId))
+        OrderMasterSearchView orderDonView = beanSearcher.searchFirst(OrderMasterSearchView.class, MapUtils.builder()
+                .field(OrderMasterSearchView::getMOid, mOid)
                 .build());
         if (orderDonView == null) {
             throw BusinessRuntimeException.getInstance("订单不存在");
@@ -411,11 +431,17 @@ public class OrderController {
     }
 
     @PostMapping("/get/noLogin/order")
-    public Result<List<OrderDonView>> getSearchResult(@RequestBody List<Long> orderIds) {
-        List<OrderDonView> orderDonViews = beanSearcher.searchAll(OrderDonView.class, MapUtils.builder()
-                .field(OrderDonView::getId, orderIds).op(Operator.InList)
-                .orderBy(OrderDonView::getId).desc().build());
-        return GatewayResponse.SUCCESS.newBuilder().toResult(orderDonViews);
+    public Result<List<OrderMasterDonView>> getSearchResult(@RequestBody List<Long> orderIds) {
+        List<OrderMasterDonView> orderMasterDonViews = beanSearcher.searchAll(OrderMasterDonView.class, MapUtils.builder()
+                .field(OrderMasterDonView::getMOid, orderIds).op(Operator.InList)
+                .orderBy(OrderMasterDonView::getMOid).desc().build());
+        orderMasterDonViews.forEach(mData->{
+            List<OrderDonView> orderDonViews = beanSearcher.searchAll(OrderDonView.class, MapUtils.builder()
+                    .field(OrderDonView::getMOid, mData.getMOid())
+                    .orderBy(OrderDonView::getId).desc().build());
+            mData.setOrderDonViews(orderDonViews);
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(orderMasterDonViews);
     }
 
     /**

+ 100 - 0
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderShopCartController.java

@@ -0,0 +1,100 @@
+package com.cyksj.web.controller.payment;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.ShoppingCartDon;
+import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.UnifiedOrderPayReq;
+import com.cyksj.model.views.ShoppingCartDonPayDetailView;
+import com.cyksj.model.views.ShoppingCartDonView;
+import com.cyksj.service.order.ShoppingCartDonService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderShopCartController
+ * 创建者: JavaZou
+ * 创建时间:2023/10/12 11:05
+ */
+@RestController
+@RequestMapping("/applet/order/shopCart")
+@RequiredArgsConstructor
+public class OrderShopCartController {
+	private final ShoppingCartDonService shoppingCartDonService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	/**
+	 * 将商品添加至购物车
+	 */
+	@PostMapping("/add")
+	public Result<String> addGoodsShoppingCart(@RequestBody ShoppingCartDon goods) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		goods.setUserId(userId);
+		shoppingCartDonService.addGoodsShoppingCart(goods);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 将商品 移除购物车
+	 */
+	@DeleteMapping("/remove/{id}")
+	public Result<String> removeShoppingCartGoodsById(@PathVariable Long id) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		shoppingCartDonService.remove(Wrappers.lambdaQuery(ShoppingCartDon.class)
+				.eq(ShoppingCartDon::getUserId, userId)
+				.eq(ShoppingCartDon::getId, id));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 一键清空 购物车
+	 */
+	@DeleteMapping("/clean")
+	public Result<String> cleanShoppingCart() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		shoppingCartDonService.remove(Wrappers.lambdaQuery(ShoppingCartDon.class)
+				.eq(ShoppingCartDon::getUserId, userId));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 个人 购物车列表
+	 */
+	@DeleteMapping("/get")
+	public Result<SearchResult<ShoppingCartDonView>> getShoppingCartGoods() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		builder.put("uid", String.format(" where user_id = %s", userId));
+		SearchResult<ShoppingCartDonView> search = beanSearcher.search(ShoppingCartDonView.class, builder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 购物车 下单
+	 */
+	@PostMapping("/unified/pay")
+	public Result<ShoppingCartDonPayDetailView> unifiedPayShoppingCartGoods(@RequestBody UnifiedOrderPayReq unifiedOrderPayReq) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		unifiedOrderPayReq.setUserId(userId);
+		ShoppingCartDonPayDetailView payDetailView = shoppingCartDonService.unifiedPayShoppingCartGoods(unifiedOrderPayReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(payDetailView);
+	}
+
+
+}

+ 84 - 0
netflix-web/src/main/java/com/cyksj/web/controller/search/SearchController.java

@@ -0,0 +1,84 @@
+package com.cyksj.web.controller.search;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.SearchHistoryMapper;
+import com.cyksj.model.entity.SearchHistory;
+import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.model.views.SearchView;
+import com.cyksj.service.information.InformationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.operator.Contain;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 17:13
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/search")
+@RequiredArgsConstructor
+public class SearchController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final InformationService informationService;
+
+    private final SearchHistoryMapper searchHistoryMapper;
+
+    private final HttpServletRequest request;
+
+    /**
+     * 查询搜索结果
+     */
+    @GetMapping("/get")
+    public Result<SearchView> search(String name){
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        if (userId != null){
+            SearchHistory searchHistory = new SearchHistory();
+            searchHistory.setName(name);
+            searchHistory.setUserId(userId);
+            searchHistoryMapper.insert(searchHistory);
+        }
+        List<GoodsFrontListView> goodsList = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsFrontListView::getTitle,name).op(Operator.Contain).build());
+        List<InformationListView> informationList = informationService.getInformationByTitle(name);
+        SearchView view = new SearchView();
+        view.setGoodsList(goodsList);
+        view.setInformationList(informationList);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+    }
+
+
+    /**
+     * 查询搜索历史
+     */
+    @GetMapping("/get/searchHistory")
+    public Result<List<SearchHistory>> getSearchHistory(){
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        if (userId != null){
+            return GatewayResponse.SUCCESS.newBuilder().toResult(searchHistoryMapper.selectList(Wrappers.lambdaQuery(SearchHistory.class).eq(SearchHistory::getUserId,userId).orderByDesc(SearchHistory::getCreatedTime).last("limit 10")));
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除搜索历史
+     */
+    @DeleteMapping("/delete/history")
+    private Result<Void> delHistory(Long id){
+        long userId = StpUserUtil.getLoginIdAsLong();
+        searchHistoryMapper.delete(Wrappers.lambdaQuery(SearchHistory.class).eq(id != null,SearchHistory::getId,id).eq(SearchHistory::getUserId,userId));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+}

+ 16 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -2,7 +2,9 @@ package com.cyksj.web.controller.user;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -21,6 +23,7 @@ import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.shop.YhShopFrontService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserGalaxycoinRecordService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.user.WorkOrderFrontService;
 import com.cyksj.web.util.StpUserUtil;
@@ -69,6 +72,8 @@ public class UserController {
 
     private final YhShopFrontService yhShopFrontService;
 
+    private final UserGalaxycoinRecordService userGalaxycoinRecordService;
+
     @GetMapping(value = "/wx/whoami")
     public Result<UserWhoami> whoami() {
         long userId = StpUserUtil.getLoginIdAsLong();
@@ -118,6 +123,7 @@ public class UserController {
         //推广积分
         personalView.setPopularizePoints(user.getPoints());
         personalView.setBalance(user.getBalance());
+        personalView.setGalaxycoin(user.getGalaxycoin());
         OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
                 .eq(OrderDon::getUserId, userId)
                 .eq(OrderDon::getStatus, OrderDon.Status.noPayment).last("limit 1"));
@@ -404,4 +410,14 @@ public class UserController {
         userService.receiveGiftCardByRc(userId, req.getCode(), relationId);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * 查询用户银河币明细
+     */
+    @GetMapping("/get/galaxycoinRecord")
+    public Result<IPage<UserGalaxycoinRecord>> getGalaxycoinRecord(@RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit){
+        long userId = StpUserUtil.getLoginIdAsLong();
+        Page<UserGalaxycoinRecord> page = userGalaxycoinRecordService.page(new Page<>(start, limit), Wrappers.lambdaQuery(UserGalaxycoinRecord.class).eq(UserGalaxycoinRecord::getUserId, userId));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(page);
+    }
 }

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

@@ -1 +1 @@
-spring:
  profiles:
    active:
      - ${activeProfile}
+spring:
  profiles:
    active: dev