Sfoglia il codice sorgente

用户购物车;主次订单下单购买

zoujiajian 2 anni fa
parent
commit
4ac11a8785
36 ha cambiato i file con 1860 aggiunte e 313 eliminazioni
  1. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  2. 14 0
      netflix-dao/src/main/java/com/cyksj/mapper/order/OrderMasterDonMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/order/ShoppingCartDonMapper.java
  4. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDetailView.java
  5. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  6. 187 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderMasterDon.java
  7. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ShoppingCartDon.java
  8. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  9. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  10. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  11. 54 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDetailView.java
  12. 141 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonBackView.java
  13. 106 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterDonView.java
  14. 51 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderMasterSearchView.java
  15. 12 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  16. 44 0
      netflix-dao/src/main/java/com/cyksj/model/request/UnifiedOrderPayReq.java
  17. 36 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuDetailView.java
  18. 25 0
      netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonPayDetailView.java
  19. 41 0
      netflix-dao/src/main/java/com/cyksj/model/views/ShoppingCartDonView.java
  20. 10 0
      netflix-dao/src/main/resources/mapper/OrderMasterDonMapper.xml
  21. 21 5
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  22. 5 3
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  23. 11 7
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  24. 13 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderMasterDonService.java
  25. 18 0
      netflix-service/src/main/java/com/cyksj/service/order/ShoppingCartDonService.java
  26. 576 210
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  27. 17 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderMasterDonServiceImpl.java
  28. 72 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/ShoppingCartOrderServiceImpl.java
  29. 1 1
      netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java
  30. 15 9
      netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java
  31. 21 9
      netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java
  32. 25 14
      netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java
  33. 106 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  34. 80 54
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  35. 100 0
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderShopCartController.java
  36. 1 1
      netflix-web/src/main/resources/application.yml

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -63,6 +63,9 @@ 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 = #{userGalaxycoin}")
+    Integer deductGalaxycoin(@Param("id") Long id, @Param("subGalaxycoin") BigDecimal subGalaxycoin, @Param("userGalaxycoin") BigDecimal userGalaxycoin);
+
     @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);
 

+ 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> {
+}

+ 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
 	 */

+ 5 - 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
      */
@@ -257,6 +259,8 @@ public class OrderDon extends BaseEntity implements Serializable {
     @JsonIgnore
     private List<GiftCardOrderUseRecord> gcUseRecords;
 
+    BigDecimal galaxycoin;
+
     /**
      * 店铺id
      */
@@ -296,6 +300,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);
+		}
+	}
+}

+ 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;
+}

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

@@ -62,6 +62,8 @@ public class User extends BaseEntity implements Serializable{
      */
     private BigDecimal balance;
 
+    private BigDecimal galaxycoin;
+
     /**
      * 用户店铺提成金额
      */

+ 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;
+}

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

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

+ 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;
+}

+ 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;
+}

+ 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;
+}

+ 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>

+ 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());
 		}

+ 5 - 3
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -813,10 +813,12 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (gcCash != null && gcCash.compareTo(BigDecimal.ZERO) > 0) {
                 giftCardOrderUseRecordService.returnGiftCardCash(orderDon.getId());
             }
+
             //记录银河币明细
-            BigDecimal refundGalaxycoin = orderDon.getRefundMoney().add(orderDon.getRefundBalance());
-            orderDon.setGalaxycoin(orderDon.getGalaxycoin().subtract(refundGalaxycoin));
-            userBenefitsService.updateGalaxycoin(orderDon.getUserId(),refundGalaxycoin.negate(), UserGalaxycoinRecord.Source.refund);
+            BigDecimal refundGalaxycoin = orderDon.getGalaxycoin();
+            if (refundGalaxycoin.compareTo(BigDecimal.ZERO) > 0) {
+                userBenefitsService.updateGalaxycoin(orderDon.getUserId(), refundGalaxycoin.negate(), UserGalaxycoinRecord.Source.refund);
+            }
         });
     }
 

+ 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);
+}

File diff suppressed because it is too large
+ 576 - 210
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java


+ 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 {
+}

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

@@ -0,0 +1,72 @@
+package com.cyksj.service.order.impl;
+
+import cn.hutool.core.collection.CollUtil;
+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) {
+		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);
+       });
    }
 
 

+ 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);
+	}
+
 	/**
 	 * 用户退款订单列表
 	 */

+ 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);
+	}
+
+
+}

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

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

Some files were not shown because too many files changed in this diff