ソースを参照

加盟商银河后台接口;店铺公告;开店押金

zoujiajian 1 年間 前
コミット
1b10aa4d97
46 ファイル変更1723 行追加6 行削除
  1. 5 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  3. 15 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopDistributeMoneyApplyMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopDistributeWaitingSendPointsMapper.java
  5. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopFeeOrderDonMapper.java
  6. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopManageAdvertiseMapper.java
  7. 14 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopMapper.java
  8. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopUserAdvertiseReviewRecordMapper.java
  9. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopUserDistributeSharedMapper.java
  10. 32 0
      netflix-dao/src/main/java/com/cyksj/model/dto/UserMirrorShopDistributeConfigDto.java
  11. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  12. 86 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShop.java
  13. 90 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopDistributeMoneyApply.java
  14. 64 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopDistributeWaitingSendPoints.java
  15. 105 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopFeeOrderDon.java
  16. 36 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopManageAdvertise.java
  17. 21 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopUserAdvertiseReviewRecord.java
  18. 30 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopUserDistributeShared.java
  19. 6 1
      netflix-dao/src/main/java/com/cyksj/model/request/LoginReq.java
  20. 25 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserMirrorShopSubmitReq.java
  21. 67 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDistributeMoneyApplyView.java
  22. 54 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopFeeOrderDonView.java
  23. 42 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopInfoView.java
  24. 94 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopView.java
  25. 14 0
      netflix-dao/src/main/resources/mapper/UserMirrorShopDistributeMoneyApplyMapper.xml
  26. 17 0
      netflix-dao/src/main/resources/mapper/UserMirrorShopMapper.xml
  27. 2 0
      netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java
  28. 17 0
      netflix-service/src/main/java/com/cyksj/service/mange/usermirror/UserMirrorCommonService.java
  29. 120 0
      netflix-service/src/main/java/com/cyksj/service/mange/usermirror/impl/UserMirrorCommonServiceImpl.java
  30. 13 0
      netflix-service/src/main/java/com/cyksj/service/mirrorshop/UserMirrorShopAdvertiseService.java
  31. 20 0
      netflix-service/src/main/java/com/cyksj/service/mirrorshop/impl/UserMirrorShopAdvertiseServiceImpl.java
  32. 2 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java
  33. 22 0
      netflix-service/src/main/java/com/cyksj/service/order/UserMirrorShopOrderService.java
  34. 34 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java
  35. 127 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/UserMirrorShopOrderServiceImpl.java
  36. 2 0
      netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java
  37. 41 0
      netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java
  38. 5 0
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  39. 16 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  40. 1 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBindRelationServiceImpl.java
  41. 36 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  42. 87 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopAdvertiseController.java
  43. 156 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopController.java
  44. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/mirror/MidjourneyController.java
  45. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
  46. 129 0
      netflix-web/src/main/java/com/cyksj/web/controller/mirrorshop/UserMirrorShopFrontController.java

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -410,4 +410,9 @@ public interface Constant {
 	 * 小时
 	 */
 	String HOUR_DAY_OF_DATE = "hour";
+
+	/**
+	 * 用户镜像店铺佣金比例配置key
+	 */
+	String USER_MIRROR_SHOP_DISTRIBUTE_KEY = "user_mirror_shop_distribute_key";
 }

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

@@ -77,4 +77,7 @@ public interface UserMapper extends BaseMapper<User> {
     Integer getNewMaliceUser(DateTime beginOfDay);
 
     List<User> selectUserById(@Param("pid") Long phoneUserId, @Param("eid") Long emailUserId);
+
+    @Update("update user set mp_money = mp_money + #{addMoney} where id = #{userId} and mp_money = #{mpMoney}")
+    Integer addMpMoney(@Param("userId") Long userId, @Param("mpMoney") BigDecimal mpMoney, @Param("addMoney") BigDecimal addMoney);
 }

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

@@ -0,0 +1,15 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopDistributeMoneyApply;
+import com.cyksj.model.views.UserMirrorShopView;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDistributeMoneyApplyMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 11:58
+ */
+public interface UserMirrorShopDistributeMoneyApplyMapper extends BaseMapper<UserMirrorShopDistributeMoneyApply> {
+	UserMirrorShopView getApplyDetailByUserId(Long userId);
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopDistributeWaitingSendPoints;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDistributeWaitingSendPointsMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 11:59
+ */
+public interface UserMirrorShopDistributeWaitingSendPointsMapper extends BaseMapper<UserMirrorShopDistributeWaitingSendPoints> {
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopFeeOrderDon;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopFeeOrderDonMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/23 16:19
+ */
+public interface UserMirrorShopFeeOrderDonMapper extends BaseMapper<UserMirrorShopFeeOrderDon> {
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopManageAdvertise;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopManageAdvertiseMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:53
+ */
+public interface UserMirrorShopManageAdvertiseMapper extends BaseMapper<UserMirrorShopManageAdvertise> {
+}

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopMapper.java

@@ -0,0 +1,14 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShop;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShop
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 11:58
+ */
+public interface UserMirrorShopMapper extends BaseMapper<UserMirrorShop> {
+	String selectSoldMaxGoods(Long userId);
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopUserAdvertiseReviewRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopUserAdvertiseReviewRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:53
+ */
+public interface UserMirrorShopUserAdvertiseReviewRecordMapper extends BaseMapper<UserMirrorShopUserAdvertiseReviewRecord> {
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopUserDistributeShared;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopUserDistributeSharedMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 11:59
+ */
+public interface UserMirrorShopUserDistributeSharedMapper extends BaseMapper<UserMirrorShopUserDistributeShared> {
+}

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/UserMirrorShopDistributeConfigDto.java

@@ -0,0 +1,32 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDistributeConfigDto
+ * 创建者: JavaZou
+ * 创建时间:2024/10/23 17:14
+ */
+
+@Getter
+@Setter
+public class UserMirrorShopDistributeConfigDto {
+	/**
+	 * 加盟费分佣
+	 */
+	private Integer feeRate;
+
+	/**
+	 * 消费分佣
+	 */
+	private Integer consumeRate;
+
+	/**
+	 * 店铺加盟费
+	 */
+	private BigDecimal shopFee;
+}

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

@@ -72,6 +72,11 @@ public class User extends BaseEntity implements Serializable{
      */
     private BigDecimal subApplyMoney;
 
+    /**
+     * 镜像加盟商提成金额
+     */
+    private BigDecimal mpMoney;
+
     /**
      * 推广id
      */

+ 86 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShop.java

@@ -0,0 +1,86 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: yhlxj
+ *文件名: YhShop
+ *创建者: JavaZou
+ *创建时间:2023/9/14 13:59
+ */
+@Getter
+@Setter
+public class UserMirrorShop extends BaseEntity {
+	/**
+	 * 店主id
+	 */
+	private Long userId;
+
+	/**
+	 * 店铺名称
+	 */
+	private String name;
+
+	/**
+	 * 自定义id
+	 */
+	private String customId;
+
+	/**
+	 * 用户是否展示广告位 默认false
+	 */
+	private Boolean isShowAd;
+
+	/**
+	 * 商务id
+	 */
+	private Long businessId;
+
+	private Date businessBindTime;
+
+	/**
+	 * 是否审核通过
+	 */
+	private Status verifyStatus;
+
+	/**
+	 * 店铺开放状态
+	 */
+	private Boolean status;
+
+	/**
+	 * 审核失败原因
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String reason;
+
+	/**
+	 * 联系方式
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String contact;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+	@Getter
+	public enum Status {
+		verify("审核中"),
+		success("审核通过"),
+		fail("审核失败");
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+}
+

+ 90 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopDistributeMoneyApply.java

@@ -0,0 +1,90 @@
+package com.cyksj.model.entity;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+
+/*
+ *项目名: yhlxj
+ *文件名: YhShopDistributeMoneyApply
+ *创建者: JavaZou
+ *创建时间:2023/9/18 17:45
+ */
+@Getter
+@Setter
+public class UserMirrorShopDistributeMoneyApply extends BaseEntity {
+
+	private Long userId;
+
+	private BigDecimal money;
+
+	private String reason;
+
+	private Status verifyStatus;
+
+	private Type type;
+
+	private String account;
+
+	private String realName;
+
+	private String img;
+
+	/**
+	 * 钱包地址
+	 */
+	private String walletAddr;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+	private Long businessId;
+
+	private String businessName;
+
+	@Getter
+	public enum Type {
+		zfb("支付宝"),
+		wechat("微信"),
+		usdt("usdt"),
+		pwdRed("口令红包"),
+		other("其他")
+		;
+		String desc;
+
+		Type(String desc) {
+			this.desc = desc;
+		}
+
+		public DistributeMoneyApply.Type getType(String value) {
+			if (StrUtil.isEmpty(value)) {
+				return null;
+			}
+			return Arrays.stream(DistributeMoneyApply.Type.values()).filter(type -> type.name().equals(value)).findFirst().get();
+		}
+
+	}
+
+	@Getter
+	public enum Status {
+		success("审核成功"),
+		fail("审核失败"),
+		verifying("审核中"),
+		;
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+
+		public static UserMirrorShopDistributeMoneyApply.Status checkStatus(String status) {
+			return Arrays.stream(UserMirrorShopDistributeMoneyApply.Status.values()).filter(st -> st.name().equals(status)).findFirst().orElse(null);
+		}
+	}
+}
+

+ 64 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopDistributeWaitingSendPoints.java

@@ -0,0 +1,64 @@
+package com.cyksj.model.entity;
+
+import com.cyksj.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: yhlxj
+ *文件名: YhShopDistributeWaitingSendPoints
+ *创建者: JavaZou
+ *创建时间:2023/9/14 14:01
+ */
+@Getter
+@Setter
+public class UserMirrorShopDistributeWaitingSendPoints extends BaseEntity {
+	/**
+	 * 店铺用户id
+	 */
+	private Long userId;
+
+	/**
+	 * 店铺主id
+	 */
+	private Long shopUserId;
+
+	private Long orderId;
+
+	private Long skuId;
+
+	/**
+	 * 分成金额
+	 */
+	private BigDecimal money;
+
+	/**
+	 * 订单退款扣除的分成金额
+	 */
+	private BigDecimal refundMoney;
+
+	/**
+	 * 提成比例
+	 */
+	private Integer rate;
+
+	private Date sendTime;
+
+	private Status sendStatus;
+
+	public enum Status{
+		close("店铺分销订单关闭,积分奖励不分发"),
+		success("积分发送成功"),
+		waiting("积分等待发送"),
+		not_exist("用户不存在,导致发送失败"),
+		;
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+}

+ 105 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopFeeOrderDon.java

@@ -0,0 +1,105 @@
+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;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopFeeOrderDon
+ * 创建者: JavaZou
+ * 创建时间:2024/10/23 16:15
+ */
+@Getter
+@Setter
+public class UserMirrorShopFeeOrderDon extends BaseEntity {
+	private String openId;
+
+	private Long userId;
+
+	/**
+	 * 商家订单号
+	 */
+	private String orderNo;
+
+	/**
+	 * 交易id
+	 */
+	private String transactionId;
+
+	/**
+	 * 卖家id
+	 */
+	private String buyerId;
+
+	private BigDecimal money;
+
+	private BigDecimal refundMoney;
+
+	private String refundDesc;
+
+	private String outRefundNo;
+
+	/**
+	 * 订单状态
+	 */
+	private Status status;
+
+	/**
+	 * 支付类型
+	 */
+	private Type type;
+
+	private Date payTime;
+
+	/**
+	 * 商户id
+	 */
+	private String shopId;
+
+	/**
+	 * 上级店铺主自定义id
+	 */
+	private String customId;
+
+
+	/**
+	 * 订单状态
+	 */
+	public enum Status {
+		close("已关闭"),
+		noPayment("待付款"),
+		hasPayment("已付款"),
+		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", "支付宝"),
+		PAYPAL("paypal", "paypal支付"),
+		STRIPE("stripe", "stripe支付");
+		String type;
+		String desc;
+
+		public static UserMirrorShopFeeOrderDon.Type getType(String type) {
+			return Arrays.stream(UserMirrorShopFeeOrderDon.Type.values()).filter(tp -> tp.getType().equals(type)).findFirst().orElse(ALI_PAY);
+		}
+	}
+}

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

@@ -0,0 +1,36 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopManageAdvertise
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:51
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop_manage_advertise ua")
+public class UserMirrorShopManageAdvertise extends BaseEntity{
+	private Long goodsId;
+
+	/**
+	 * 公告简介
+	 */
+	private String about;
+
+	/**
+	 * 公告详情
+	 */
+	private String detail;
+
+	private Boolean status;
+
+	@TableField(exist = false)
+	@DbField("select 1 from user_mirror_shop_user_advertise_review_record uar where uar.advertise_id = ua.id")
+	private Boolean isNew;
+}

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopUserAdvertiseReviewRecord.java

@@ -0,0 +1,21 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopUserAdvertiseReviewRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:52
+ */
+@Getter
+@Setter
+public class UserMirrorShopUserAdvertiseReviewRecord extends BaseEntity{
+	private Long userId;
+
+	/**
+	 * 公告id
+	 */
+	private Long advertiseId;
+}

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopUserDistributeShared.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: yhlxj
+ *文件名: YhShopUserDistributeShared
+ *创建者: JavaZou
+ *创建时间:2023/9/20 15:36
+ */
+@Getter
+@Setter
+public class UserMirrorShopUserDistributeShared extends BaseEntity{
+	/**
+	 * 被分享人id
+	 */
+	private Long userId;
+
+	/**
+	 * 店铺主user_id
+	 */
+	private Long shopUserId;
+
+	/**
+	 * 邀请方式备注
+	 */
+	private String remark;
+}
+

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

@@ -1,6 +1,5 @@
 package com.cyksj.model.request;
 
-import cn.hutool.http.server.HttpServerRequest;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
@@ -65,6 +64,12 @@ public class LoginReq {
 
 	private String subject;
 
+	/**
+	 * 店铺类型
+	 * 1.普通店铺(默认) 2.镜像店铺
+	 */
+	private Integer cmt = 1;
+
 	/**
 	 * 店铺自定义id
 	 */

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

@@ -0,0 +1,25 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopSubmitReq
+ * 创建者: JavaZou
+ * 创建时间:2024/10/25 17:04
+ */
+@Getter
+@Setter
+public class UserMirrorShopSubmitReq {
+	/**
+	 * 原店铺主id
+	 */
+	private String customId;
+
+	private Long userId;
+
+	private BigDecimal money;
+}

+ 67 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDistributeMoneyApplyView.java

@@ -0,0 +1,67 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.YhShopDistributeMoneyApply;
+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
+ *文件名: UserMirrorShopDistributeMoneyApplyView
+ *创建者: JavaZou
+ *创建时间:2023/9/18 17:44
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop_distribute_money_apply dma left join user u on u.id = dma.user_id")
+public class UserMirrorShopDistributeMoneyApplyView {
+	@DbField("dma.id")
+	private Long id;
+
+	@DbField("dma.user_id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("dma.money")
+	private BigDecimal money;
+
+	@DbField("dma.reason")
+	private String reason;
+
+	@DbField("dma.real_name")
+	private String realName;
+
+	@DbField("dma.type")
+	private YhShopDistributeMoneyApply.Type type;
+
+	@DbField("dma.account")
+	private String account;
+
+	@DbField("dma.verify_status")
+	private YhShopDistributeMoneyApply.Status verifyStatus;
+
+	@DbField("dma.img")
+	private String img;
+
+	@DbField("dma.created_time")
+	private Date createdTime;
+
+	@DbField("dma.wallet_addr")
+	private String walletAddr;
+
+	@DbField("dma.remark")
+	private String remark;
+
+	@DbField("dma.business_id")
+	private Long businessId;
+
+	@DbField("dma.business_name")
+	private String businessName;
+
+}

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

@@ -0,0 +1,54 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.UserMirrorShopFeeOrderDon;
+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;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopFeeOrderDonView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/23 16:25
+ */
+
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop_fee_order_don umo left join user u on u.id = umo.user_id" +
+		" left join user_mirror_shop ums on ums.user_id = u.id")
+public class UserMirrorShopFeeOrderDonView {
+
+	@DbField("umo.id")
+	private Long orderId;
+
+	@DbField("umo.order_no")
+	private String orderNo;
+
+	@DbField("umo.money")
+	private BigDecimal money;
+
+	@DbField("umo.type")
+	private UserMirrorShopFeeOrderDon.Type type;
+
+	@DbField("umo.user_id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	/**
+	 * 镜像店铺id
+	 */
+	@DbField("ums.mirror_store_id")
+	private String mirrorStoreId;
+
+	@DbField("umo.status")
+	private UserMirrorShopFeeOrderDon.Status status;
+
+	@DbField("umo.created_time")
+	private Date createdTime;
+}

+ 42 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopInfoView.java

@@ -0,0 +1,42 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopInfoView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/25 15:55
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop us")
+public class UserMirrorShopInfoView {
+
+	/**
+	 * 店铺名称
+	 */
+	@DbField("us.name")
+	private String name;
+
+	/**
+	 * 自定义id
+	 */
+	@DbField("us.custom_id")
+	private String customId;
+
+	/**
+	 * 店铺开放状态
+	 */
+	@DbField("us.status")
+	private Boolean status;
+
+	/**
+	 * 联系方式
+	 */
+	@DbField("us.contact")
+	private String contact;
+}

+ 94 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopView.java

@@ -0,0 +1,94 @@
+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.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/21 18:22
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop ys left join user_mirror_shop_order_relate omr on omr.mp_id = ys.id" +
+		" left join order_don od on od.id = omr.order_id and od.status not in ('noPayment', 'close') :time:",
+		groupBy = "ys.id,ys.user_id,ys.custom_id,ys.status,ys.remark,ys.created_time,ys.update_time")
+public class UserMirrorShopView {
+
+	@DbField("ys.id")
+	private Long id;
+
+	/**
+	 * 店铺名
+	 */
+	@DbField("ys.name")
+	private String name;
+
+	@DbField("ys.user_id")
+	private Long userId;
+
+	@DbIgnore
+	private String businessName;
+
+	@DbIgnore
+	private String nickname;
+
+	@DbField("count(od.id)")
+	private Integer orders;
+
+	@DbField("ys.custom_id")
+	private String customId;
+
+	/**
+	 * 分销人数
+	 * 其中拉新用户购买一单又退款,且无后续下单动作的不算分销用户,不统计在此字段内
+	 */
+	@DbIgnore
+	private Integer distributeUserNum;
+
+	/**
+	 * 邀请人数
+	 */
+	@DbField("select count(*) from user_mirror_shop_user_distribute_shared where shop_user_id = ys.user_id")
+	private Integer inviteNum;
+
+	/**
+	 * 分销订单金额(无需产生积分)
+	 */
+	@DbField("(ifnull(sum(od.money),0) - ifnull(sum(od.refund_money),0))")
+	private BigDecimal distributeOrdersMoney;
+
+	/**
+	 * 销量最高的产品
+	 */
+	@DbIgnore
+	private String goodsTitle;
+
+	@DbField("ys.status")
+	private Boolean status;
+
+	@DbField("ys.remark")
+	private String remark;
+
+	@DbField("ys.contact")
+	private String contact;
+
+	@DbField("ys.created_time")
+	private Date createdTime;
+
+	@DbField("ys.update_time")
+	private Date updateTime;
+
+	@DbIgnore
+	private BigDecimal availableMoney;
+
+	@DbIgnore
+	private BigDecimal gotMoney;
+}

+ 14 - 0
netflix-dao/src/main/resources/mapper/UserMirrorShopDistributeMoneyApplyMapper.xml

@@ -0,0 +1,14 @@
+<?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.mirrorshop.UserMirrorShopDistributeMoneyApplyMapper">
+
+
+    <select id="getApplyDetailByUserId" resultType="com.cyksj.model.views.UserMirrorShopView">
+        select ifnull(cast(sum(da.money) / 100 as decimal(10, 2)), 0) as gotMoney,
+               cast(u.mp_money / 100 as decimal(10, 2))               as availableMoney
+        from (select id, mp_money from user where id = #{userId} limit 1) u
+                 left join user_mirror_shop_distribute_money_apply da on da.user_id = u.id and verify_status = 'success'
+        group by u.id, u.mp_money
+    </select>
+</mapper>

+ 17 - 0
netflix-dao/src/main/resources/mapper/UserMirrorShopMapper.xml

@@ -0,0 +1,17 @@
+<?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.mirrorshop.UserMirrorShopMapper">
+
+
+    <select id="selectSoldMaxGoods" resultType="java.lang.String">
+        select title
+        from goods_don
+        where id = (select od.goods_id
+                    from (select id from user_mirror_shop where user_id = #{userId} limit 1) s
+                             inner join user_mirror_shop_order_relate omr on omr.mp_id = s.id
+                             inner join order_don od
+                                        on od.id = omr.order_id and od.status not in ('close', 'noPayment', 'refund')
+                    group by od.goods_id
+                    order by max(od.money) desc limit 1)
+    </select>
+</mapper>

+ 2 - 0
netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java

@@ -52,6 +52,8 @@ public class BaseZfbConfig {
 
 	public static String wholesaleDepositNotifyUrl = "applet/wholesale/deposit/zfb/notify";
 
+	public static String userMirrorOpenShopNotifyUrl = "applets/mirror/shop/prepay/zfb/notify";
+
 	/**
 	 * qr_pay_mode PC扫码支付的方式。 跳转模式
 	 */

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/mange/usermirror/UserMirrorCommonService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.mange.usermirror;
+
+import com.cyksj.model.request.DistributeApplyMoneyReq;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorCommonService
+ * 创建者: JavaZou
+ * 创建时间:2024/10/23 15:25
+ */
+public interface UserMirrorCommonService {
+	void verifyApplyMoney(DistributeApplyMoneyReq distributeApplyMoneyReq);
+
+	void updateVerifyImg(DistributeApplyMoneyReq distributeApplyMoneyReq);
+
+	void refundUserMirrorShopFee(Long orderId) throws Exception;
+}

+ 120 - 0
netflix-service/src/main/java/com/cyksj/service/mange/usermirror/impl/UserMirrorCommonServiceImpl.java

@@ -0,0 +1,120 @@
+package com.cyksj.service.mange.usermirror.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopDistributeMoneyApplyMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopFeeOrderDonMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.entity.UserMirrorShopDistributeMoneyApply;
+import com.cyksj.model.entity.UserMirrorShopFeeOrderDon;
+import com.cyksj.model.entity.YhShopDistributeMoneyApply;
+import com.cyksj.model.request.DistributeApplyMoneyReq;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.mange.usermirror.UserMirrorCommonService;
+import com.cyksj.service.order.OrderRefundService;
+import com.cyksj.service.user.UserBenefitsService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorCommonServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/10/23 15:25
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserMirrorCommonServiceImpl implements UserMirrorCommonService {
+
+	private final UserMirrorShopDistributeMoneyApplyMapper moneyApplyMapper;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final RedisService redisService;
+
+	private final UserBenefitsService userBenefitsService;
+
+	private final UserMirrorShopFeeOrderDonMapper userMirrorShopFeeOrderDonMapper;
+
+	private final OrderRefundService orderRefundService;
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void verifyApplyMoney(DistributeApplyMoneyReq distributeApplyMoneyReq) {
+		UserMirrorShopDistributeMoneyApply.Status status = UserMirrorShopDistributeMoneyApply.Status.checkStatus(distributeApplyMoneyReq.getVerifyStatus());
+		if (status == null || status == UserMirrorShopDistributeMoneyApply.Status.verifying) {
+			throw BusinessRuntimeException.getInstance("审核状态错误");
+		}
+		UserMirrorShopDistributeMoneyApply distributeMoneyApply = moneyApplyMapper.selectById(distributeApplyMoneyReq.getId());
+		if (distributeMoneyApply == null) {
+			throw BusinessRuntimeException.getInstance("提现记录不存在");
+		}
+		if (distributeMoneyApply.getVerifyStatus() != UserMirrorShopDistributeMoneyApply.Status.verifying) {
+			throw BusinessRuntimeException.getInstance("该提现记录已处理,无法再进行审核");
+		}
+		distributeMoneyApply.setVerifyStatus(status);
+		if (YhShopDistributeMoneyApply.Status.fail.name().equals(distributeApplyMoneyReq.getVerifyStatus()) && StrUtil.isEmpty(distributeApplyMoneyReq.getReason())) {
+			throw BusinessRuntimeException.getInstance("拒绝原因为空");
+		}
+		if (YhShopDistributeMoneyApply.Status.fail.name().equals(distributeApplyMoneyReq.getVerifyStatus())) {
+			distributeMoneyApply.setReason(distributeApplyMoneyReq.getReason());
+			Long userId = distributeMoneyApply.getUserId();
+			userBenefitsService.addMpMoney(userId, distributeMoneyApply.getMoney());
+			log.info("镜像店铺提现审核失败,归还申请提现金额:{}至用户{}结束", distributeMoneyApply.getMoney().divide(BigDecimal.valueOf(100)), userId);
+		}
+		if (YhShopDistributeMoneyApply.Status.success.name().equals(distributeApplyMoneyReq.getVerifyStatus())) {
+			distributeMoneyApply.setImg(distributeApplyMoneyReq.getImg());
+		}
+		moneyApplyMapper.updateById(distributeMoneyApply);
+
+		if (distributeMoneyApply.getVerifyStatus() == UserMirrorShopDistributeMoneyApply.Status.fail) {
+			String type = "mirrorShop";
+			String key = String.format(RedisService.key.APPLY_MONEY_DAY_LIMIT_KEY.getName(), DateTime.now().toDateStr(), type, distributeMoneyApply.getUserId());
+			redisService.del(key);
+		}
+	}
+
+
+	@Override
+	public void updateVerifyImg(DistributeApplyMoneyReq distributeApplyMoneyReq) {
+		Long id = distributeApplyMoneyReq.getId();
+		String img = distributeApplyMoneyReq.getImg();
+		if (id == null) {
+			throw BusinessRuntimeException.getInstance("请选择对应的申请提现记录");
+		}
+		UserMirrorShopDistributeMoneyApply mirrorShopDistributeMoneyApply = moneyApplyMapper.selectById(id);
+		if (mirrorShopDistributeMoneyApply == null) {
+			throw BusinessRuntimeException.getInstance("请选择对应的申请提现记录");
+		}
+		if (StrUtil.isEmpty(img)) {
+			throw BusinessRuntimeException.getInstance("请传入对应的审核图片");
+		}
+		if (mirrorShopDistributeMoneyApply.getVerifyStatus() != UserMirrorShopDistributeMoneyApply.Status.success) {
+			throw BusinessRuntimeException.getInstance("该申请提现记录未审核成功");
+		}
+		mirrorShopDistributeMoneyApply.setImg(img);
+		moneyApplyMapper.updateById(mirrorShopDistributeMoneyApply);
+	}
+
+	@Override
+	public void refundUserMirrorShopFee(Long orderId) throws Exception {
+		UserMirrorShopFeeOrderDon orderDon = userMirrorShopFeeOrderDonMapper.selectById(orderId);
+		if (orderDon == null) {
+			throw BusinessRuntimeException.getInstance("订单不存在");
+		}
+		if (orderDon.getStatus() != UserMirrorShopFeeOrderDon.Status.hasPayment) {
+			throw BusinessRuntimeException.getInstance("订单状态错误");
+		}
+		String outRefundNo = orderRefundService.refundUserMirrorShopFee(orderDon);
+		orderDon.setOutRefundNo(outRefundNo);
+		orderDon.setStatus(UserMirrorShopFeeOrderDon.Status.refund);
+		orderDon.setRefundMoney(orderDon.getMoney());
+		userMirrorShopFeeOrderDonMapper.updateById(orderDon);
+	}
+}

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/mirrorshop/UserMirrorShopAdvertiseService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.mirrorshop;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.UserMirrorShopManageAdvertise;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopAdvertiseService
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:58
+ */
+public interface UserMirrorShopAdvertiseService extends IService<UserMirrorShopManageAdvertise> {
+}

+ 20 - 0
netflix-service/src/main/java/com/cyksj/service/mirrorshop/impl/UserMirrorShopAdvertiseServiceImpl.java

@@ -0,0 +1,20 @@
+package com.cyksj.service.mirrorshop.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopManageAdvertiseMapper;
+import com.cyksj.model.entity.UserMirrorShopManageAdvertise;
+import com.cyksj.service.mirrorshop.UserMirrorShopAdvertiseService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopAdvertiseServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:58
+ */
+@Service
+@RequiredArgsConstructor
+public class UserMirrorShopAdvertiseServiceImpl extends ServiceImpl<UserMirrorShopManageAdvertiseMapper, UserMirrorShopManageAdvertise> implements UserMirrorShopAdvertiseService {
+
+}

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java

@@ -28,4 +28,6 @@ public interface OrderRefundService {
 	String refundWholesaleUserDeposit(GoodsWholesaleUserDeposit goodsWholesaleUserDeposit) throws Exception;
 
 	String refundWholesaleOrder(GoodsWholesaleOrderDon orderDon) throws Exception;
+
+	String refundUserMirrorShopFee(UserMirrorShopFeeOrderDon orderDon) throws Exception;
 }

+ 22 - 0
netflix-service/src/main/java/com/cyksj/service/order/UserMirrorShopOrderService.java

@@ -0,0 +1,22 @@
+package com.cyksj.service.order;
+
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.entity.UserMirrorShopFeeOrderDon;
+import com.cyksj.model.request.AlipayOrderDonReq;
+import com.cyksj.model.request.UserMirrorShopSubmitReq;
+
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopOrderService
+ * 创建者: JavaZou
+ * 创建时间:2024/10/25 17:08
+ */
+public interface UserMirrorShopOrderService {
+	UserMirrorShopFeeOrderDon submitOpenShop(UserMirrorShopSubmitReq shopSubmitReq) throws Exception;
+
+	AliPayParams aliPay(AlipayOrderDonReq re, String productCode, String qrPayModeOrderCode) throws Exception;
+
+	void aliPayNotify(Map<String, String> params) throws Exception;
+}

+ 34 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java

@@ -398,6 +398,40 @@ public class OrderRefundServiceImpl implements OrderRefundService {
 		return StrUtil.EMPTY;
 	}
 
+	@Override
+	public String refundUserMirrorShopFee(UserMirrorShopFeeOrderDon orderDon) throws Exception {
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) <=0){
+			return StrUtil.EMPTY;
+		}
+		AlipayTradeRefundResponse response;
+		//支付宝退款
+		AlipayClient alipayClient = AliPayClientFactory.getAlipayClient(Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID));
+		AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+		AlipayTradeRefundModel model = new AlipayTradeRefundModel();
+		//支付宝交易号
+		model.setTradeNo(orderDon.getTransactionId());
+		model.setRefundAmount(orderDon.getMoney().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_EVEN).toString());
+		model.setQueryOptions(List.of("gmt_refund_pay"));
+		long time = System.currentTimeMillis();
+		//退款订单号
+		String outRefundNo = Codec.DoDigest.custom()
+				.setAlgorithm(Codec.DoDigest.Algorithm.MD5)
+				.setStringData(time + String.valueOf(orderDon.getId()))
+				.toHexString();
+		//退款请求号
+		model.setOutRequestNo(outRefundNo);
+		request.setBizModel(model);
+		String shopId = orderDon.getShopId();
+		ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class).eq(ShopConfig::getAppId, orderDon.getShopId()));
+		if (shopId != null && shopConfig != null && shopConfig.getIsCert()) {
+			response = alipayClient.certificateExecute(request);
+		} else {
+			response = alipayClient.execute(request);
+		}
+		if (!response.isSuccess()) throw BusinessRuntimeException.getInstance("退款失败,e:{0}", response.getSubMsg());
+		return outRefundNo;
+	}
+
 	private String zfbRefundWholesaleOrder(GoodsWholesaleOrderDon orderDon) throws Exception {
 		BigDecimal money = orderDon.getRefundMoney();
 		if (money.compareTo(BigDecimal.ZERO) <=0){

+ 127 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/UserMirrorShopOrderServiceImpl.java

@@ -0,0 +1,127 @@
+package com.cyksj.service.order.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
+import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopFeeOrderDonMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.dto.UserMirrorShopDistributeConfigDto;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.request.AlipayOrderDonReq;
+import com.cyksj.model.request.OrderAttach;
+import com.cyksj.model.request.UserMirrorShopSubmitReq;
+import com.cyksj.service.order.UserMirrorShopOrderService;
+import com.cyksj.service.pay.AliPayCommonService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopOrderServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/10/25 17:08
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class UserMirrorShopOrderServiceImpl implements UserMirrorShopOrderService {
+	private final SysConfigMapper sysConfigMapper;
+
+	private final UserMirrorShopFeeOrderDonMapper feeOrderDonMapper;
+
+	private final UserMapper userMapper;
+
+	private final AliPayCommonService aliPayCommonService;
+
+	private final ShopConfigMapper shopConfigMapper;
+
+	private final static Sequence SEQUENCE = new Sequence(0);
+
+	@Override
+	public UserMirrorShopFeeOrderDon submitOpenShop(UserMirrorShopSubmitReq shopSubmitReq) throws Exception {
+		Long userId = shopSubmitReq.getUserId();
+		String customId = shopSubmitReq.getCustomId();
+		User user = userMapper.selectById(userId);
+		UserMirrorShopFeeOrderDon userMirrorShopFeeOrderDon = Optional.ofNullable(feeOrderDonMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShopFeeOrderDon.class).eq(UserMirrorShopFeeOrderDon::getUserId, userId)
+				.eq(UserMirrorShopFeeOrderDon::getStatus, UserMirrorShopFeeOrderDon.Status.noPayment)
+				.last("limit 1"))).orElse(new UserMirrorShopFeeOrderDon());
+		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.USER_MIRROR_SHOP_DISTRIBUTE_KEY)
+				.last("limit 1"));
+		UserMirrorShopDistributeConfigDto userMirrorShopDistributeConfigDto = Jsons.parseObject(sysConfig.getSysValue(), UserMirrorShopDistributeConfigDto.class);
+		BigDecimal fee = userMirrorShopDistributeConfigDto.getShopFee();
+		if (userMirrorShopFeeOrderDon.getId() == null) {
+			userMirrorShopFeeOrderDon = new UserMirrorShopFeeOrderDon();
+			userMirrorShopFeeOrderDon.setOrderNo(SEQUENCE.nextId().toString());
+			userMirrorShopFeeOrderDon.setStatus(UserMirrorShopFeeOrderDon.Status.noPayment);
+			userMirrorShopFeeOrderDon.setMoney(fee);
+			userMirrorShopFeeOrderDon.setUserId(userId);
+			userMirrorShopFeeOrderDon.setType(UserMirrorShopFeeOrderDon.Type.ALI_PAY);
+			userMirrorShopFeeOrderDon.setOpenId(user.getOpenId());
+			feeOrderDonMapper.insert(userMirrorShopFeeOrderDon);
+		}
+		userMirrorShopFeeOrderDon.setCustomId(customId);
+		feeOrderDonMapper.updateById(userMirrorShopFeeOrderDon);
+		return userMirrorShopFeeOrderDon;
+	}
+
+	@Override
+	public AliPayParams aliPay(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
+		return aliPayCommonService.openShopAliPay(re,productCode, qrPayMode);
+	}
+
+	@Override
+	public void aliPayNotify(Map<String, String> params) throws Exception {
+		//调用SDK验证签名
+		String body = Codec.DoBase64.custom().setData(params.get("body")).decodeAsText();
+		OrderAttach orderAttach = Jsons.parseObject(body, OrderAttach.class);
+		Long oderId = orderAttach.getO();
+		UserMirrorShopFeeOrderDon orderDon = feeOrderDonMapper.selectById(oderId);
+		if (null == orderDon) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+		String appId = params.get("app_id");
+		boolean signVerified = AlipaySignature.rsaCheckV1(params, shopConfigMapper.getByAppId(appId).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		if (!signVerified) {
+			log.error("开店押金支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
+			throw BusinessRuntimeException.getInstance("开店押金支付宝回调校验签名错误");
+		}
+		String transactionId = params.get("trade_no");
+		String payTimeStr = params.get("gmt_payment");
+		//买家支付宝账号
+		String buyerId = Optional.ofNullable(params.get("buyer_id")).orElse(params.get("buyer_open_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;
+		}
+		Date payTime = DateTime.now();
+		if (StringUtils.isNotBlank(payTimeStr)) {
+			payTime = DateUtil.parse(payTimeStr, "yyyy-MM-dd HH:mm:ss");
+		}
+		// 更改订单状态
+		orderDon.setTransactionId(transactionId);
+		orderDon.setPayTime(payTime);
+		orderDon.setShopId(appId);
+		orderDon.setType(UserMirrorShopFeeOrderDon.Type.ALI_PAY);
+		orderDon.setBuyerId(buyerId);
+		feeOrderDonMapper.updateById(orderDon);
+	}
+}

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

@@ -26,4 +26,6 @@ public interface AliPayCommonService {
 	AliPayParams aliPayUnifiedWholesale(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
 
 	AliPayParams aliPayUnifiedWholesaleDeposit(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
+
+	AliPayParams openShopAliPay(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
 }

+ 41 - 0
netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java

@@ -22,6 +22,7 @@ import com.cyksj.config.zfb.BaseZfbConfig;
 import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopFeeOrderDonMapper;
 import com.cyksj.mapper.order.OrderDonPostMapper;
 import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.OrderPayBuilderDto;
@@ -71,6 +72,8 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 
 	private final GoodsWholesaleUserDepositMapper depositMapper;
 
+	private final UserMirrorShopFeeOrderDonMapper feeOrderDonMapper;
+
 	private static final Sequence SEQUENCE = new Sequence(0);
 
 	@Override
@@ -388,4 +391,42 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 				notifyUrl,
 				returnUrl);
 	}
+
+	@Override
+	public AliPayParams openShopAliPay(AlipayOrderDonReq re, String productCode, String payMode) throws Exception {
+		Long orderId = re.getOrderId();
+		String returnUrl = re.getReturnUrl();
+		UserMirrorShopFeeOrderDon orderDon = feeOrderDonMapper.selectById(orderId);
+		//获取支付宝默认商户
+		String appId = sysConfigService.getDefaultShopConfigByType("zfb");
+		if (UserMirrorShopFeeOrderDon.Type.ALI_PAY != orderDon.getType()) {
+			orderDon.setType(UserMirrorShopFeeOrderDon.Type.ALI_PAY);
+		}
+		orderDon.setShopId(appId);
+		feeOrderDonMapper.updateById(orderDon);
+		String subject = "押金";
+		//回调地址
+		String host = envCommonService.getNotifyHost();
+		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.userMirrorOpenShopNotifyUrl);
+		//是否在微信内支付 微信内支付宝支付后 支付宝回调页面不跳转
+		Boolean isWx = Optional.ofNullable(re.getIsWx()).orElse(false);
+		if (StrUtil.isEmpty(returnUrl)) {
+			//默认跳转页
+			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.DEFAULT_URL);
+		}
+		//退款后重新支付
+		if (orderDon.getStatus() == UserMirrorShopFeeOrderDon.Status.refund) {
+			orderDon.setOrderNo(SEQUENCE.nextId().toString());
+		}
+		return builderPayParams(orderDon.getId(),
+				orderDon.getOrderNo(),
+				orderDon.getShopId(),
+				orderDon.getMoney(),
+				orderDon.getUpdateTime(),
+				subject,
+				productCode,
+				payMode,
+				notifyUrl,
+				returnUrl);
+	}
 }

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

@@ -49,4 +49,9 @@ public interface UserBenefitsService {
 	 * 返回用户邀请奖励提成
 	 */
 	void addDistributeSubMoney(Long userId, BigDecimal needApplyMoney);
+
+	/**
+	 * 增加镜像加盟商提成金额
+	 */
+	void addMpMoney(Long userId, BigDecimal money);
 }

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java

@@ -185,6 +185,22 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 		}
 	}
 
+	@Override
+	public void addMpMoney(Long userId, BigDecimal addMoney) {
+		if (addMoney.compareTo(BigDecimal.ZERO) <= 0) {
+			return;
+		}
+		while (true) {
+			User user = userMapper.selectById(userId);
+			if (user == null) break;
+			BigDecimal mpMoney = user.getMpMoney();
+			Integer success = userMapper.addMpMoney(user.getId(), mpMoney, addMoney);
+			if (success == 1) {
+				break;
+			}
+		}
+	}
+
 	private void deductYhsMoneyRecord(Long orderId, Long shopUserId, BigDecimal deductMoney) {
 		try {
 			YhShopDistributeOrdersDeductPointsRecord record = new YhShopDistributeOrdersDeductPointsRecord();

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBindRelationServiceImpl.java

@@ -32,6 +32,7 @@ public class UserBindRelationServiceImpl implements UserBindRelationService {
 
 	@Override
 	public List<Long> getRelationUserIdList(Long userId, User selectUser) {
+		if (userId == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 		List<Long> userIds = new ArrayList<>();
 		User user = Optional.ofNullable(selectUser).orElse(userMapper.selectById(userId));
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);

+ 36 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -128,7 +128,7 @@ public class CmsOrderController {
 
 	@GetMapping("/get")
 	@SaCheckPermission("order:view")
-	public Result<SearchResult<OrderDonBackView>> get(Long channelId, String account, String showId, Long acId, String nickname, String register, Boolean isGoogle, Boolean isSubsidy, Boolean isRenewPackage) {
+	public Result<SearchResult<OrderDonBackView>> get(Long channelId, String account, String showId, Long acId, String nickname, String register, Boolean isGoogle, Boolean isSubsidy, Boolean isRenewPackage, Integer otherOrderType, Long userMirrorShopId) {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (channelId != null) {
 			List<Long> popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId);
@@ -184,6 +184,23 @@ public class CmsOrderController {
 			}
 			conditionSql += " exists (select 1 from order_don_renew_record odrr1 where odrr1.order_id = o.id limit 1)";
 		}
+		if (otherOrderType != null) {
+			//3.续费升级订单
+			if (otherOrderType == 3) {
+				builder.put("tb", String.format(" inner join order_don_renew_record odcr on odcr.order_id = o.id and odcr.order_type = 2"));
+			}
+			if (otherOrderType == 4) {
+				//4.用户权益订单
+				builder.put("tb", String.format(" inner join user_benefits_order_record ubor on ubor.order_id = o.id and ubor.type = 'RENEW'"));
+			}
+			if (otherOrderType == 5) {
+				//5.加盟订单
+				builder.put("tb", String.format(" inner join user_mirror_shop_order_relate umr on umr.order_id = o.id"));
+			}
+		}
+		if (userMirrorShopId != null) {
+			conditionSql += String.format(" exists (select 1 from user_mirror_shop_order_relate umr where mp_id = %s and umr.order_id = o.id limit 1)", userMirrorShopId);
+		}
 		if (StrUtil.isNotBlank(conditionSql)) {
 			builder.put("condition", conditionSql);
 		}
@@ -304,7 +321,7 @@ public class CmsOrderController {
 	@GetMapping("/export")
 	@SaCheckPermission("order:export")
 	@Log(module = "订单管理/导出订单", businessType = BusinessType.EXPORT, isSaveRequestData = true)
-	public void exportOrders(HttpServletResponse response, Long channelId, String account, String showId, Long acId, String nickname, String register, Boolean isGoogle, Boolean isSubsidy, Boolean isRenewPackage) throws InterruptedException {
+	public void exportOrders(HttpServletResponse response, Long channelId, String account, String showId, Long acId, String nickname, String register, Boolean isGoogle, Boolean isSubsidy, Boolean isRenewPackage, Integer otherOrderType, Long userMirrorShopId) throws InterruptedException {
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
 		if (channelId != null) {
 			List<Long> popularizeIds = channelPopularizeMapper.getPopularizeIdByChannelId(channelId);
@@ -360,6 +377,23 @@ public class CmsOrderController {
 			}
 			conditionSql += " exists (select 1 from order_don_renew_record odrr1 where odrr1.order_id = o.id limit 1)";
 		}
+		if (otherOrderType != null) {
+			//3.续费升级订单
+			if (otherOrderType == 3) {
+				builder.put("tb", String.format(" inner join order_don_renew_record odcr on odcr.order_id = o.id and odcr.order_type = 2"));
+			}
+			if (otherOrderType == 4) {
+				//4.用户权益订单
+				builder.put("tb", String.format(" inner join user_benefits_order_record ubor on ubor.order_id = o.id and ubor.type = 'RENEW'"));
+			}
+			if (otherOrderType == 5) {
+				//5.加盟订单
+				builder.put("tb", String.format(" inner join user_mirror_shop_order_relate umr on umr.order_id = o.id"));
+			}
+		}
+		if (userMirrorShopId != null) {
+			conditionSql += String.format(" exists (select 1 from user_mirror_shop_order_relate umr where mp_id = %s and umr.order_id = o.id limit 1)", userMirrorShopId);
+		}
 		if (StrUtil.isNotBlank(conditionSql)) {
 			builder.put("condition", conditionSql);
 		}

+ 87 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopAdvertiseController.java

@@ -0,0 +1,87 @@
+package com.cyksj.web.controller.manage.mirrorshop;
+
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.UserMirrorShopManageAdvertise;
+import com.cyksj.service.mirrorshop.UserMirrorShopAdvertiseService;
+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.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopAdvertiseController
+ * 创建者: JavaZou
+ * 创建时间:2024/10/24 11:54
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/mirror/shop/advertise")
+public class UserMirrorShopAdvertiseController {
+	private final UserMirrorShopAdvertiseService userMirrorShopAdvertiseService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	/**
+	 * 店铺公告列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<UserMirrorShopManageAdvertise>> get() {
+		SearchResult<UserMirrorShopManageAdvertise> search = beanSearcher.search(UserMirrorShopManageAdvertise.class, MapUtils.flatBuilder(request.getParameterMap())
+				.orderBy(UserMirrorShopManageAdvertise::getUpdateTime).desc()
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 新增店铺公告
+	 */
+	@PostMapping("/post")
+	public Result<String> post(@RequestBody UserMirrorShopManageAdvertise advertise) {
+		userMirrorShopAdvertiseService.saveOrUpdate(advertise);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 编辑店铺公告
+	 */
+	@PutMapping("/update")
+	public Result<String> update(@RequestBody UserMirrorShopManageAdvertise advertise) {
+		userMirrorShopAdvertiseService.saveOrUpdate(advertise);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 上下架店铺公告
+	 */
+	@PutMapping("/update/status/{id}")
+	public Result<String> updateStatusById(@PathVariable Long id) {
+		Optional.ofNullable(userMirrorShopAdvertiseService.getById(id))
+				.ifPresent(en -> {
+					en.setStatus(!en.getStatus());
+					userMirrorShopAdvertiseService.updateById(en);
+				});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除店铺公告
+	 */
+	@PutMapping("/delete/{id}")
+	public Result<String> deleteById(@PathVariable Long id) {
+		userMirrorShopAdvertiseService.removeById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 156 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopController.java

@@ -0,0 +1,156 @@
+package com.cyksj.web.controller.manage.mirrorshop;
+
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopDistributeMoneyApplyMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.request.DistributeApplyMoneyReq;
+import com.cyksj.model.views.*;
+import com.cyksj.service.mange.usermirror.UserMirrorCommonService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopController
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 17:07
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/mirror/shop")
+public class UserMirrorShopController {
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final UserMapper userMapper;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final UserMirrorCommonService userMirrorCommonService;
+
+	private final UserMirrorShopDistributeMoneyApplyMapper moneyApplyMapper;
+
+
+	/**
+	 * 店铺列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<UserMirrorShopView>> getYhShopDistributeView(String nickname, String startTime, String endTime) {
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (StrUtil.isNotBlank(nickname)) {
+			List<Long> userIds = userMapper.selectListByNickname(nickname);
+			builder.field(YhShopDistributeView::getUserId, userIds).op(Operator.InList);
+		}
+		String timeSql = StrUtil.EMPTY;
+		if (StrUtil.isNotBlank(startTime)) {
+			timeSql += String.format("and od.created_time >= '%s'", startTime);
+		}
+		if (StrUtil.isNotBlank(endTime)) {
+			timeSql += String.format("and od.created_time < '%s'", endTime);
+		}
+		if (StrUtil.isNotBlank(timeSql)) {
+			builder.put("time", timeSql);
+			//按时间筛选 固定推广人分销情况 倒序
+			builder.orderBy(YhShopDistributeView::getDistributeOrdersMoney).desc();
+		}
+		SearchResult<UserMirrorShopView> search = beanSearcher.search(UserMirrorShopView.class, builder.build());
+		search.getDataList().forEach(view -> {
+			if (view.getDistributeOrdersMoney().compareTo(BigDecimal.ZERO) > 0) {
+				Optional.ofNullable(userMirrorShopMapper.selectSoldMaxGoods(view.getUserId())).ifPresent(title -> view.setGoodsTitle(title));
+			}
+			Optional.ofNullable(userMapper.selectById(view.getUserId())).ifPresent(user -> view.setNickname(user.getNickname()));
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 修改店铺状态
+	 */
+	@PutMapping("/update/shop/status/{id}")
+	public Result<String> updateShopStatusById(@PathVariable Long id) {
+		Optional.ofNullable(userMirrorShopMapper.selectById(id)).ifPresent(shop->{
+			shop.setStatus(!shop.getStatus());
+			userMirrorShopMapper.updateById(shop);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 提现详情记录
+	 */
+	@GetMapping("/get/user/apply/detail/record/{userId}")
+	public Result<UserMirrorShopView> getUserApplyDetailRecord(@PathVariable Long userId) {
+		UserMirrorShopView userDistributeViews = moneyApplyMapper.getApplyDetailByUserId(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userDistributeViews);
+	}
+
+	//--------------------------------------提现管理-----------------------------------------------
+
+	/**
+	 * 提现列表
+	 */
+	@GetMapping("/get/apply/list")
+	public Result<SearchResult<UserMirrorShopDistributeMoneyApplyView>> applyMoneyList() {
+		SearchResult<UserMirrorShopDistributeMoneyApplyView> search = beanSearcher.search(UserMirrorShopDistributeMoneyApplyView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 店铺提现 审核
+	 */
+	@PutMapping("/verify/applyMoney")
+	@NoSubmit
+	public Result<String> verifyApplyMoney(@RequestBody @Validated DistributeApplyMoneyReq distributeApplyMoneyReq) {
+		userMirrorCommonService.verifyApplyMoney(distributeApplyMoneyReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("审核操作成功");
+	}
+
+	/**
+	 * 修改审核图片
+	 */
+	@PutMapping("/verify/applyMoney/img")
+	public Result<String> updateVerifyImg(@RequestBody DistributeApplyMoneyReq distributeApplyMoneyReq) {
+		userMirrorCommonService.updateVerifyImg(distributeApplyMoneyReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	//--------------------------------------加盟费管理-----------------------------------------------
+
+	/**
+	 * 加盟费 订单列表
+	 */
+	@GetMapping("/get/fee/list")
+	public Result<SearchResult<UserMirrorShopFeeOrderDonView>> getFeeList() {
+		SearchResult<UserMirrorShopFeeOrderDonView> search = beanSearcher.search(UserMirrorShopFeeOrderDonView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 加盟费 退款
+	 */
+	@PutMapping("/fee/refund/{orderId}")
+	public Result<String> refundUserMirrorShopFee(@PathVariable Long orderId) throws Exception {
+		userMirrorCommonService.refundUserMirrorShopFee(orderId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

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

@@ -67,7 +67,7 @@ public class MidjourneyController {
      */
     @GetMapping("/mj/cars")
     public Result<SearchResult<MidjouneyCarInfoView>> getCarInfoList(Long relationId) {
-        long userId = StpUserUtil.getLoginIdAsLong();
+        long userId = StpUserUtil.getUserIdAfterLogin();
         //查看用户是否存在车票
         MidjourneyUser midjourneyUser = midjourneyService.getUser(userId, relationId);
         if (midjourneyUser == null) {

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

@@ -158,7 +158,7 @@ public class MirrorController {
      */
     @GetMapping("/gpt/cars")
     public Result<SearchResult<ChatgptCarInfoView>> getCarInfoList(Long relationId,@RequestParam(defaultValue = "20") Integer limit) {
-        long userId = StpUserUtil.getLoginIdAsLong();
+        long userId = StpUserUtil.getUserIdAfterLogin();
         //查看用户是否存在车票
         ChatgptUser carChatGptUser = chatGptAccountService.getCarChatGptUser(userId, relationId);
         if (carChatGptUser == null) {
@@ -441,7 +441,7 @@ public class MirrorController {
      */
     @GetMapping("/claude/cars")
     public Result<SearchResult<ClaudeCarInfoView>> claudeCarInfoList(Long relationId) {
-        long userId = StpUserUtil.getLoginIdAsLong();
+        long userId = StpUserUtil.getUserIdAfterLogin();
         //查看用户是否存在车票
         ClaudeUser claudeUser = claudeService.getClaudeUser(userId, relationId);
         if (claudeUser == null) {

+ 129 - 0
netflix-web/src/main/java/com/cyksj/web/controller/mirrorshop/UserMirrorShopFrontController.java

@@ -0,0 +1,129 @@
+package com.cyksj.web.controller.mirrorshop;
+
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.config.zfb.ZfbProductCode;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.entity.UserMirrorShopFeeOrderDon;
+import com.cyksj.model.request.AlipayOrderDonReq;
+import com.cyksj.model.request.UserMirrorShopSubmitReq;
+import com.cyksj.model.response.AliPayTradeStatus;
+import com.cyksj.model.views.UserMirrorShopInfoView;
+import com.cyksj.service.order.UserMirrorShopOrderService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopFrontController
+ * 创建者: JavaZou
+ * 创建时间:2024/10/25 15:53
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/applets/mirror/shop")
+public class UserMirrorShopFrontController {
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final UserMirrorShopOrderService userMirrorShopOrderService;
+
+	/**
+	 * 镜像店铺主 个人信息
+	 */
+	@GetMapping("/get/detail/{customId}")
+	public Result<UserMirrorShopInfoView> getShopDetail(@PathVariable String customId) {
+		UserMirrorShopInfoView userMirrorShopInfoView = beanSearcher.searchFirst(UserMirrorShopInfoView.class, MapUtils.flatBuilder(request.getParameterMap()).field(UserMirrorShopInfoView::getCustomId, customId).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(userMirrorShopInfoView);
+	}
+
+	/**
+	 * 立即开店
+	 */
+	@PostMapping("/submit")
+	public Result<UserMirrorShopFeeOrderDon> submit(@RequestBody UserMirrorShopSubmitReq shopSubmitReq) throws Exception {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		shopSubmitReq.setUserId(userId);
+		UserMirrorShopFeeOrderDon feeOrderDon = userMirrorShopOrderService.submitOpenShop(shopSubmitReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(feeOrderDon);
+	}
+
+
+	/**
+	 * 支付宝web支付
+	 */
+	@PostMapping("/zfb/orderQrCode")
+	public Result<String> zfbWebQrCode(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = userMirrorShopOrderService.aliPay(re, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_orderCode);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 支付宝表单支付
+	 * 手机支付
+	 */
+	@PostMapping("/pay/zfb")
+	public Result<String> aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = userMirrorShopOrderService.aliPay(re, ZfbProductCode.MOBILE_WEB.getProductCode(), null);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 支付宝回调
+	 */
+	@PostMapping("/prepay/zfb/notify")
+	public String aliPayNotify(HttpServletRequest request) throws Exception {
+		////将异步通知中收到的所有参数都存放到map中
+		Map<String, String> params = convertRequestParamsToMap(request);
+		String tradeStatus = params.get("trade_status");
+		String orderNo = params.get("out_trade_no");
+		if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
+			log.info("支付宝商家订单号orderNo:{},status:{}开始回调", orderNo, tradeStatus);
+			userMirrorShopOrderService.aliPayNotify(params);
+		} else {
+			log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo);
+			return "fail";
+		}
+		return "success";
+	}
+
+
+
+	/**
+	 * 获取支付宝回调参数
+	 */
+	private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
+		Map<String, String> retMap = new HashMap<>();
+		Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
+		for (Map.Entry<String, String[]> entry : entrySet) {
+			String name = entry.getKey();
+			String[] values = entry.getValue();
+			int valLen = values.length;
+			if (valLen == 1) {
+				retMap.put(name, values[0]);
+			} else if (valLen > 1) {
+				StringBuilder sb = new StringBuilder();
+				for (String val : values) {
+					sb.append(",").append(val);
+				}
+				retMap.put(name, sb.substring(1));
+			} else {
+				retMap.put(name, "");
+			}
+		}
+		return retMap;
+	}
+}