Kaynağa Gözat

镜像店铺

zoujiajian 1 yıl önce
ebeveyn
işleme
947f9177c2
100 değiştirilmiş dosya ile 3718 ekleme ve 120 silme
  1. 10 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonMapper.java
  3. 2 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  4. 6 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  5. 17 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/MirrorNoticeUserMapper.java
  6. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/MirrorNoticeUserReviewRecordMapper.java
  7. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopApplyRecordMapper.java
  8. 15 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopDistributeMoneyApplyMapper.java
  9. 22 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopDistributeWaitingSendPointsMapper.java
  10. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopFeeOrderDonMapper.java
  11. 28 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopMapper.java
  12. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopOrderRelateMapper.java
  13. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopSubUserMapper.java
  14. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/UserMirrorShopUserDistributeSharedMapper.java
  15. 6 0
      netflix-dao/src/main/java/com/cyksj/model/dto/AuthRedirect.java
  16. 32 0
      netflix-dao/src/main/java/com/cyksj/model/dto/UserMirrorShopDistributeConfigDto.java
  17. 5 0
      netflix-dao/src/main/java/com/cyksj/model/dto/UserWxIndentDto.java
  18. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java
  19. 10 1
      netflix-dao/src/main/java/com/cyksj/model/entity/MirrorNotice.java
  20. 42 0
      netflix-dao/src/main/java/com/cyksj/model/entity/MirrorNoticeUser.java
  21. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/MirrorNoticeUserReviewRecord.java
  22. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/MirrorNoticeUserStatusRelate.java
  23. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  24. 0 4
      netflix-dao/src/main/java/com/cyksj/model/entity/UserCertRecord.java
  25. 101 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShop.java
  26. 57 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopApplyRecord.java
  27. 90 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopDistributeMoneyApply.java
  28. 66 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopDistributeWaitingSendPoints.java
  29. 105 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopFeeOrderDon.java
  30. 21 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopOrderRelate.java
  31. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopSubUser.java
  32. 21 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopUserAdvertiseReviewRecord.java
  33. 30 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopUserDistributeShared.java
  34. 2 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  35. 20 0
      netflix-dao/src/main/java/com/cyksj/model/request/BatchIdsReq.java
  36. 6 1
      netflix-dao/src/main/java/com/cyksj/model/request/LoginReq.java
  37. 6 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  38. 39 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserMirrorShopApplyMoneyReq.java
  39. 25 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserMirrorShopInfoApplyReq.java
  40. 25 0
      netflix-dao/src/main/java/com/cyksj/model/request/UserMirrorShopSubmitReq.java
  41. 2 0
      netflix-dao/src/main/java/com/cyksj/model/response/WxCertAuthTokenResp.java
  42. 7 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  43. 45 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopAdvertiseFrontView.java
  44. 67 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopApplyInfoView.java
  45. 64 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopApplyMoneyView.java
  46. 67 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDistributeMoneyApplyView.java
  47. 43 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDsJoinOrderDetailView.java
  48. 55 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDsOrderDetailView.java
  49. 40 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDsOrderStatisticsView.java
  50. 57 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopFeeOrderDonView.java
  51. 48 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopInfoView.java
  52. 26 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopOrderDataStatisticsView.java
  53. 41 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopOrderView.java
  54. 100 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopView.java
  55. 1 0
      netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml
  56. 12 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  57. 16 0
      netflix-dao/src/main/resources/mapper/UserMirrorShopDistributeMoneyApplyMapper.xml
  58. 77 0
      netflix-dao/src/main/resources/mapper/UserMirrorShopDistributeWaitingSendPointsMapper.xml
  59. 14 0
      netflix-dao/src/main/resources/mapper/UserMirrorShopManageAdvertiseMapper.xml
  60. 70 0
      netflix-dao/src/main/resources/mapper/UserMirrorShopMapper.xml
  61. 7 0
      netflix-service/src/main/java/com/cyksj/config/wxlogin/BaseWxOpenPlatConfig.java
  62. 2 0
      netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java
  63. 3 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  64. 3 1
      netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java
  65. 1 0
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  66. 5 0
      netflix-service/src/main/java/com/cyksj/service/mange/RefreshCacheService.java
  67. 66 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  68. 21 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/RefreshCacheServiceImpl.java
  69. 2 0
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/StatisticsDataService.java
  70. 27 0
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  71. 20 0
      netflix-service/src/main/java/com/cyksj/service/mange/usermirror/UserMirrorCommonService.java
  72. 169 0
      netflix-service/src/main/java/com/cyksj/service/mange/usermirror/impl/UserMirrorCommonServiceImpl.java
  73. 30 0
      netflix-service/src/main/java/com/cyksj/service/mirrorshop/CmsUserMirrorShopService.java
  74. 176 0
      netflix-service/src/main/java/com/cyksj/service/mirrorshop/impl/CmsUserMirrorShopServiceImpl.java
  75. 2 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderRefundService.java
  76. 22 0
      netflix-service/src/main/java/com/cyksj/service/order/UserMirrorShopOrderService.java
  77. 220 99
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  78. 34 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderRefundServiceImpl.java
  79. 206 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/UserMirrorShopOrderServiceImpl.java
  80. 2 0
      netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java
  81. 3 0
      netflix-service/src/main/java/com/cyksj/service/pay/TransferFuncService.java
  82. 35 0
      netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java
  83. 118 0
      netflix-service/src/main/java/com/cyksj/service/pay/impl/TransferFuncServiceImpl.java
  84. 1 1
      netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java
  85. 12 1
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  86. 1 1
      netflix-service/src/main/java/com/cyksj/service/shop/YhShopDistributeService.java
  87. 21 1
      netflix-service/src/main/java/com/cyksj/service/shop/impl/YhShopDistributeServiceImpl.java
  88. 7 0
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  89. 1 1
      netflix-service/src/main/java/com/cyksj/service/user/UserIdentCertService.java
  90. 7 0
      netflix-service/src/main/java/com/cyksj/service/user/UserService.java
  91. 32 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  92. 1 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBindRelationServiceImpl.java
  93. 14 1
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserIdentCertServiceImpl.java
  94. 22 2
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  95. 2 2
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  96. 39 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  97. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/shop/YhShopLoginController.java
  98. 234 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/UserMirrorShopController.java
  99. 180 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorNoticeController.java
  100. 158 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorShopController.java

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

@@ -410,4 +410,14 @@ public interface Constant {
 	 * 小时
 	 */
 	String HOUR_DAY_OF_DATE = "hour";
+
+	/**
+	 * 用户镜像店铺佣金比例配置key
+	 */
+	String MIRROR_SHOP_COMMISSION = "mirror_shop_commission";
+
+	/**
+	 * 镜像店铺默认LOGO
+	 */
+	String USER_MIRROR_SHOP_DEFAULT_LOGO = "https://cdn2.yicanggongyi.com/picture/f6e48d2c854bd38a2ed2cc7d319b524f-1731038450046.webp";
 }

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

@@ -30,4 +30,7 @@ public interface GoodsDonMapper extends BaseMapper<GoodsDon> {
 
 	@Select("select g.id, g.title from (select distinct goods_id from order_don where status not in ('close','noPayment') and yhs_id = #{yhsId}) o inner join goods_don g on g.id = o.goods_id and g.type = 1")
 	List<GoodsDon> getYhShopDistributeGoodsDetail(Long yhsId);
+
+	@Select("select g.id, g.title from (select distinct o.goods_id from order_don o inner join user_mirror_shop_order_relate uor on uor.order_id = o.id where o.status not in ('close','noPayment') and uor.mp_id = #{yhsId}) o inner join goods_don g on g.id = o.goods_id")
+	List<GoodsDon> getUserMirrorShopShopDistributeGoodsDetail(Long id);
 }

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

@@ -93,4 +93,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	BigDecimal getCouponUsedMoney(Long couponId);
 
 	Integer checkUserHasPaidMjMirror(@Param("list") List<Long> userIdList);
+
+	Map<String, Object> selectUserMIrrorShopDistributeOrderDetail(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }

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

@@ -77,4 +77,10 @@ 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);
+
+    @Update("update user set mp_money = mp_money - #{deductMoney} where id = #{userId} and mp_money = #{mpMoney}")
+    Integer subUserMirrorShopMoney(@Param("userId") Long userId, @Param("mpMoney") BigDecimal mpMoney, @Param("deductMoney") BigDecimal deductMoney);
 }

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/mirrorshop/MirrorNoticeUserMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.MirrorNoticeUser;
+import com.cyksj.model.views.UserMirrorShopAdvertiseFrontView;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorNoticeUserMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 17:49
+ */
+public interface MirrorNoticeUserMapper extends BaseMapper<MirrorNoticeUser> {
+	Page<UserMirrorShopAdvertiseFrontView> getAdvertise(@Param("customId") String customId, @Param("page") Page page);
+}

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.MirrorNoticeUserReviewRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorNoticeUserReviewRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 15:55
+ */
+public interface MirrorNoticeUserReviewRecordMapper extends BaseMapper<MirrorNoticeUserReviewRecord> {
+}

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

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

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

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

@@ -0,0 +1,22 @@
+package com.cyksj.mapper.mirrorshop;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShopDistributeWaitingSendPoints;
+import com.cyksj.model.views.YhShopBrokenLineCpsUserWMoneyView;
+import com.cyksj.model.views.YhShopUserWMoneyStatisticsDataView;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDistributeWaitingSendPointsMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 11:59
+ */
+public interface UserMirrorShopDistributeWaitingSendPointsMapper extends BaseMapper<UserMirrorShopDistributeWaitingSendPoints> {
+	YhShopBrokenLineCpsUserWMoneyView getWMoneyStatisticsDataView(@Param("yhShopUserId") long yhShopUserId, @Param("first") DateTime first, @Param("end") DateTime end, @Param("today") Boolean today);
+
+	List<YhShopUserWMoneyStatisticsDataView> getWMoneyStatisticsDate(@Param("yhShopUserId") long yhShopUserId, @Param("first") DateTime first, @Param("end") DateTime end, @Param("today") Boolean today);
+}

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

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

@@ -0,0 +1,28 @@
+package com.cyksj.mapper.mirrorshop;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserMirrorShop;
+import com.cyksj.model.views.UserMirrorShopOrderDataStatisticsView;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShop
+ * 创建者: JavaZou
+ * 创建时间:2024/10/18 11:58
+ */
+public interface UserMirrorShopMapper extends BaseMapper<UserMirrorShop> {
+	String selectSoldMaxGoods(Long userId);
+
+	Map<String, Object> selectUserMIrrorShopDetail(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+	BigDecimal selectUserMirrorShopTakeMoney(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+	Map<String, Object> selectUserMirrorShopApplyMoney(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+
+	UserMirrorShopOrderDataStatisticsView selectOrderBrokenLineMoney(@Param("mpId") long mpId, @Param("first") String first, @Param("end") String end);
+}

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

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

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

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

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

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/AuthRedirect.java

@@ -83,4 +83,10 @@ public class AuthRedirect {
      * 1.主动 2.被邀请用户
      */
     private Integer cst;
+
+    /**
+     * 店铺类型
+     * 1.普通店铺(默认) 2.镜像店铺
+     */
+    private Integer cmt = 1;
 }

+ 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/dto/UserWxIndentDto.java

@@ -16,5 +16,10 @@ public class UserWxIndentDto {
 
 	private String redirectUrl;
 
+	/**
+	 * 错误跳转地址
+	 */
+	private String errorUrl;
+
 	private String bizToken;
 }

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

@@ -74,6 +74,12 @@ public class GroupsRelation extends BaseEntity {
 
     private Long yhsId;
 
+    /**
+     * 店铺类型
+     * 0无 1.普通店铺 2.镜像店铺
+     */
+    private Integer cmt;
+
     /**
      * 获取权益时的订单id
      */

+ 10 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/MirrorNotice.java

@@ -1,5 +1,7 @@
 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.Data;
 
@@ -10,7 +12,7 @@ import java.io.Serializable;
  * @date 2024/6/21 14:57
  */
 @Data
-@SearchBean(tables = "mirror_notice")
+@SearchBean(tables = "mirror_notice mn")
 public class MirrorNotice extends BaseEntity implements Serializable {
 
     /**
@@ -33,4 +35,11 @@ public class MirrorNotice extends BaseEntity implements Serializable {
      */
     private Boolean status;
 
+    @TableField(exist = false)
+    @DbField("select count(1) from mirror_notice_user_review_record myr where myr.notice_id = mn.id :ruid:")
+    private Boolean isRead;
+
+    @TableField(exist = false)
+    @DbField("select count(1) from mirror_notice_user myr where myr.notice_id = mn.id :ruid:")
+    private Boolean sync;
 }

+ 42 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/MirrorNoticeUser.java

@@ -0,0 +1,42 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorNoticeUser
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 17:48
+ */
+@Getter
+@Setter
+public class MirrorNoticeUser extends BaseEntity {
+
+	private Long noticeId;
+
+	/**
+	 * 平台 MJ GPT
+	 */
+	private String platform;
+
+	/**
+	 * 标题
+	 */
+	private String title;
+
+	/**
+	 * 富文本
+	 */
+	private String text;
+
+	/**
+	 * 状态
+	 */
+	private Boolean status;
+
+	/**
+	 * 所属镜像店铺用户id
+	 */
+	private Long userId;
+}

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

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorNoticeUserReviewRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 15:54
+ */
+@Getter
+@Setter
+public class MirrorNoticeUserReviewRecord extends BaseEntity{
+	private Long userId;
+
+	private Long noticeId;
+}

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

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: MirrorNoticeUserStatusRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 11:44
+ */
+@Getter
+@Setter
+public class MirrorNoticeUserStatusRelate extends BaseEntity{
+	private Long noticeId;
+
+	private Long userId;
+
+	private Boolean status;
+}

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

+ 0 - 4
netflix-dao/src/main/java/com/cyksj/model/entity/UserCertRecord.java

@@ -20,9 +20,5 @@ public class UserCertRecord extends BaseEntity{
 
 	private String ident;
 
-	private String front;
-
-	private String reverse;
-
 	private String addr;
 }

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

@@ -0,0 +1,101 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.BaseEntity;
+import com.cyksj.model.views.UserMirrorShopApplyInfoView;
+import com.ejlchina.searcher.bean.DbIgnore;
+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;
+
+	private String logo;
+
+	/**
+	 * 自定义id
+	 */
+	private String customId;
+
+	/**
+	 * 商务id
+	 */
+	private Long businessId;
+
+	private Date businessBindTime;
+
+	/**
+	 * 店铺开放状态
+	 */
+	private Boolean status;
+
+	/**
+	 * 审核失败原因
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String reason;
+
+	/**
+	 * 联系方式
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String contact;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+	/**
+	 * 申请修改记录
+	 */
+	@DbIgnore
+	@TableField(exist = false)
+	private UserMirrorShopApplyInfoView applyInfoView;
+
+	/**
+	 * 加盟费状态
+	 */
+	@DbIgnore
+	@TableField(exist = false)
+	private Boolean joinFeeStatus = true;
+
+	/**
+	 * 最新修改时间
+	 */
+	@DbIgnore
+	@TableField(exist = false)
+	private Date modifyTime;
+
+	@Getter
+	public enum Status {
+		verify("审核中"),
+		success("审核通过"),
+		fail("审核失败");
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+}
+

+ 57 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserMirrorShopApplyRecord.java

@@ -0,0 +1,57 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopApplyRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 16:14
+ */
+
+@Getter
+@Setter
+public class UserMirrorShopApplyRecord extends BaseEntity{
+	/**
+	 * 店主id
+	 */
+	private Long userId;
+
+	/**
+	 * 店铺名称
+	 */
+	private String name;
+
+	private String logo;
+
+	/**
+	 * 自定义id
+	 */
+	private String customId;
+
+	/**
+	 * 是否审核通过
+	 */
+	private Status verifyStatus;
+
+	/**
+	 * 审核失败原因
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String reason;
+
+	@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);
+		}
+	}
+}
+

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

@@ -0,0 +1,66 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: UserMirrorShopDistributeWaitingSendPoints
+ *创建者: JavaZou
+ *创建时间:2022/11/15 12:11
+ */
+@Getter
+@Setter
+public class UserMirrorShopDistributeWaitingSendPoints extends BaseEntity{
+	/**
+	 * 分销订单产生用户id
+	 */
+	private Long userId;
+
+	/**
+	 * 店铺主user_id
+	 */
+	private Long shopUserId;
+
+	private Long orderId;
+
+	private BigDecimal money;
+
+	private BigDecimal refundMoney;
+
+	/**
+	 * 退款状态不再发
+	 */
+	private Status sendStatus;
+
+	private Integer version;
+
+	private Date sendTime;
+
+	/**
+	 * 获取提成比例
+	 */
+	private Integer rate;
+
+	/**
+	 * 提成类型 1.镜像店铺订单 2.加盟提成订单 默认1
+	 */
+	private Integer type;
+
+	@Getter
+	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 Long mpId;
+
+
+	/**
+	 * 订单状态
+	 */
+	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);
+		}
+	}
+}

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

@@ -0,0 +1,21 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopOrderRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/11/4 11:54
+ */
+@Getter
+@Setter
+public class UserMirrorShopOrderRelate extends BaseEntity{
+	private Long orderId;
+
+	/**
+	 * 加盟商id
+	 */
+	private Long mpId;
+}

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

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopSubUser
+ * 创建者: JavaZou
+ * 创建时间:2024/11/18 10:20
+ */
+@Getter
+@Setter
+public class UserMirrorShopSubUser extends BaseEntity{
+	private Long userId;
+
+	private Long subUserId;
+
+	private Long orderId;
+}

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

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java

@@ -25,7 +25,8 @@ import java.util.List;
 @Setter
 @SearchBean(tables = "order_don o left join goods_don g on g.id = o.goods_id" +
 		" left join order_don_transport odt on odt.order_id = o.id" +
-		" left join goods_don_sku sku on sku.id = o.sku_id",
+		" left join goods_don_sku sku on sku.id = o.sku_id" +
+		" :tb:",
 		where = ":condition:"
 )
 public class OrderDonBackView {

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

@@ -0,0 +1,20 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: BatchIdsReq
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 18:05
+ */
+@Getter
+@Setter
+public class BatchIdsReq {
+	@NonNull
+	private List<Long> ids;
+}

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

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

@@ -185,4 +185,10 @@ public class OrderPayRequest {
      * 用户海报记录id
      */
     private Long rid;
+
+    /**
+     * 店铺类型
+     * 1.普通店铺(默认) 2.镜像店铺
+     */
+    private Integer cmt = 1;
 }

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

@@ -0,0 +1,39 @@
+package com.cyksj.model.request;
+
+import com.cyksj.model.entity.UserMirrorShopDistributeMoneyApply;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopApplyMoneyReq
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 16:27
+ */
+@Getter
+@Setter
+public class UserMirrorShopApplyMoneyReq {
+
+	private String account;
+
+	private UserMirrorShopDistributeMoneyApply.Type type;
+
+	private String realName;
+
+	/**
+	 * true提现所有积分金额
+	 */
+	private Boolean isTakeAll;
+
+	/**
+	 * 钱包地址
+	 */
+	private String walletAddr;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+	private Long userId;
+}

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

@@ -0,0 +1,25 @@
+package com.cyksj.model.request;
+
+import com.cyksj.model.entity.UserMirrorShopApplyRecord;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopInfoApplyReq
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 16:46
+ */
+@Getter
+@Setter
+public class UserMirrorShopInfoApplyReq {
+	private Long id;
+
+	private String reason;
+
+	private UserMirrorShopApplyRecord.Status verifyStatus;
+
+	private List<Long> ids;
+}

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

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/response/WxCertAuthTokenResp.java

@@ -21,4 +21,6 @@ public class WxCertAuthTokenResp {
 	 * 一次核身流程的标识
 	 */
 	private String BizToken;
+
+	private String mappingId;
 }

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -159,6 +159,13 @@ public class RenewalView {
     @DbField("gr.yhs_id")
     private Long yhsId;
 
+    /**
+     * 店铺类型
+     * 0无 1.普通店铺 2.镜像店铺
+     */
+    @DbField("gr.cmt")
+    private Integer cmt;
+
     /**
      * 车票获取类型 默认1购买,2.体验
      */

+ 45 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopAdvertiseFrontView.java

@@ -0,0 +1,45 @@
+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;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopAdvertiseFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/8 10:33
+ */
+@Getter
+@Setter
+@SearchBean(tables = "mirror_notice_user mur inner join user_mirror_shop um on um.user_id = mur.user_id and mur.status is true :cm:",
+		orderBy = "mur.update_time desc")
+public class UserMirrorShopAdvertiseFrontView {
+
+	@DbField("mur.id")
+	private Long id;
+
+	/**
+	 * 平台 MJ GPT
+	 */
+	@DbField("mur.platform")
+	private String platform;
+
+	/**
+	 * 标题
+	 */
+	@DbField("mur.title")
+	private String title;
+
+	/**
+	 * 富文本
+	 */
+	@DbField("mur.text")
+	private String text;
+
+	@DbField("mur.update_time")
+	private Date updateTime;
+}

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

@@ -0,0 +1,67 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.UserMirrorShopApplyRecord;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopApplyInfoView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 17:20
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop_apply_record ys left join user u on u.id = ys.user_id")
+public class UserMirrorShopApplyInfoView {
+
+	@DbField("ys.id")
+	private Long id;
+
+	@DbField("ys.user_id")
+	private Long userId;
+
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	/**
+	 * 店铺名称
+	 */
+	@DbField("ys.name")
+	private String name;
+
+	/**
+	 * 店铺名称
+	 */
+	@DbField("ys.logo")
+	private String logo;
+
+	/**
+	 * 自定义id
+	 */
+	@DbField("ys.custom_id")
+	private String customId;
+
+	/**
+	 * 是否审核通过
+	 */
+	@DbField("ys.verify_status")
+	private UserMirrorShopApplyRecord.Status verifyStatus;
+
+	/**
+	 * 审核失败原因
+	 */
+	@DbField("ys.reason")
+	private String reason;
+
+	@DbField("ys.created_time")
+	private Date createdTime;
+
+	@DbField("ys.update_time")
+	private Date updateTime;
+}

+ 64 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopApplyMoneyView.java

@@ -0,0 +1,64 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.UserMirrorShopDistributeMoneyApply;
+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
+ * 文件名: UserMirrorShopApplyView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 18:20
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_mirror_shop_distribute_money_apply dma left join user u on u.id = dma.user_id")
+public class UserMirrorShopApplyMoneyView {
+
+	@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.points")
+	private BigDecimal points;
+
+	@DbField("dma.real_name")
+	private String realName;
+
+	@DbField("dma.type")
+	private UserMirrorShopDistributeMoneyApply.Type type;
+
+	@DbField("dma.account")
+	private String account;
+
+	@DbField("dma.verify_status")
+	private UserMirrorShopDistributeMoneyApply.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;
+}

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

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDsJoinOrderDetailView.java

@@ -0,0 +1,43 @@
+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.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDsJoinOrderDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/12 10:20
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select id,user_id,money,refund_money,created_time from user_mirror_shop_fee_order_don uor where :yhs_id: and uor.status not in ('close','noPayment') :time:) od" +
+		" inner join user_mirror_shop_distribute_waiting_send_points dp on dp.order_id = od.id and dp.type = 2")
+public class UserMirrorShopDsJoinOrderDetailView {
+
+	@DbField("select nickname from user where id = od.user_id limit 1")
+	private String nickname;
+
+	@DbField("od.user_id")
+	private Long userId;
+
+	@DbField("cast(od.money/100 as decimal(10,2))")
+	private BigDecimal money;
+
+	@DbField("TRUNCATE(dp.money/100,2)")
+	private BigDecimal reMoney = BigDecimal.ZERO;
+
+	@DbField("if(send_status = 'success',TRUNCATE(dp.refund_money/100,2),0)")
+	private BigDecimal rdMoney;
+
+	@DbField("dp.send_status")
+	private String sendStatus;
+
+	@DbField("od.created_time")
+	private Date createdTime;
+}

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDsOrderDetailView.java

@@ -0,0 +1,55 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+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;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDsOrderDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 16:01
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select o.id,o.user_id,o.goods_id,o.sku_id,o.money,o.refund_money,o.coupon_money,o.created_time from order_don o inner join user_mirror_shop_order_relate uor on uor.order_id = o.id where :yhs_id: and o.status not in ('close','noPayment') :time:) od" +
+		" left join goods_don g on g.id = od.goods_id" +
+		" inner join user_mirror_shop_distribute_waiting_send_points dp on dp.order_id = od.id and dp.type = 1")
+public class UserMirrorShopDsOrderDetailView {
+
+	@DbField("select nickname from user where id = od.user_id limit 1")
+	private String nickname;
+
+	@JsonIgnore
+	@DbField("g.id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("select spec_val from goods_don_sku where id = od.sku_id limit 1")
+	private String specVal;
+
+	@DbField("cast(od.money/100 as decimal(10,2))")
+	private BigDecimal money;
+
+//	@DbField("od.coupon_money")
+//	private BigDecimal couponMoney;
+
+	@DbField("TRUNCATE(dp.money/100,2)")
+	private BigDecimal reMoney = BigDecimal.ZERO;
+
+	@DbField("if(send_status = 'success',TRUNCATE(dp.refund_money/100,2),0)")
+	private BigDecimal rdMoney;
+
+	@DbField("dp.send_status")
+	private String sendStatus;
+
+	@DbField("od.created_time")
+	private Date createdTime;
+}

+ 40 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopDsOrderStatisticsView.java

@@ -0,0 +1,40 @@
+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.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopDsOrderStatisticsView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 15:57
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select o.id,o.user_id,o.goods_id,o.money,o.refund_money,o.status from order_don o inner join user_mirror_shop_order_relate uor on uor.order_id = o.id where :yhs_id: and o.status not in ('close','noPayment') :time:) od left join goods_don g on g.id = od.goods_id" +
+		" inner join user_mirror_shop_distribute_waiting_send_points dp on dp.order_id = od.id and dp.type = 1",
+		groupBy = "od.goods_id,g.title")
+public class UserMirrorShopDsOrderStatisticsView {
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("cast(sum(od.money)/100 as decimal(10,2))")
+	private BigDecimal distributeOrderMoney;
+
+	@DbField("count(od.id)")
+	private Integer orders;
+
+	@DbField("TRUNCATE(sum(if(dp.send_status != 'close',dp.money,0))/100,2)")
+	private BigDecimal takeMoney;
+
+	@DbField("count(if(od.status = 'refund',1,NULL))")
+	private Integer refundOrders;
+
+	@DbField("cast(sum(ifnull(od.refund_money,0))/100 as decimal(10,2))")
+	private BigDecimal refundMoney;
+}

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

@@ -0,0 +1,57 @@
+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.id")
+	private Long mpId;
+
+	@DbField("ums.custom_id")
+	private String customId;
+
+	@DbField("umo.status")
+	private UserMirrorShopFeeOrderDon.Status status;
+
+	@DbField("umo.created_time")
+	private Date createdTime;
+}

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

@@ -0,0 +1,48 @@
+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;
+
+	/**
+	 * 店铺logo
+	 */
+	@DbField("us.logo")
+	private String logo;
+
+	/**
+	 * 自定义id
+	 */
+	@DbField("us.custom_id")
+	private String customId;
+
+	/**
+	 * 店铺开放状态
+	 */
+	@DbField("us.status")
+	private Boolean status;
+
+	/**
+	 * 联系方式
+	 */
+	@DbField("us.contact")
+	private String contact;
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopOrderDataStatisticsView.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopOrderDataStatisticsView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/12 15:33
+ */
+@Getter
+@Setter
+public class UserMirrorShopOrderDataStatisticsView {
+	private String firstDate;
+
+	private String lastDate;
+
+	/**
+	 * 平台订单数据
+	 */
+	private Map<Long, List<UserMirrorShopOrderView>> goodsData;
+}

+ 41 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserMirrorShopOrderView.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.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMirrorShopOrderView
+ * 创建者: JavaZou
+ * 创建时间:2024/11/12 15:30
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select o.id,o.goods_id,o.money,o.created_time from order_don o inner join user_mirror_shop_order_relate uor on uor.order_id = o.id :mid: where o.status not in ('close','noPayment') :time:) od" +
+		" left join goods_don g on g.id = od.goods_id" +
+		" inner join user_mirror_shop_distribute_waiting_send_points dp on dp.order_id = od.id",
+		groupBy = "od.goods_id,g.title,date_format(od.created_time,'%Y-%m-%d')")
+public class UserMirrorShopOrderView {
+
+	@DbField("od.goods_id")
+	private Long goodsId;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("cast(sum(od.money)/100 as decimal(10,2))")
+	private BigDecimal distributeOrderMoney;
+
+	@DbField("count(od.id)")
+	private Integer orders;
+
+	/**
+	 * 日期
+	 */
+	@DbField("date_format(od.created_time,'%Y-%m-%d')")
+	private String date;
+}

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

@@ -0,0 +1,100 @@
+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 joinFeeTaskMoney;
+
+	@DbIgnore
+	private BigDecimal availableMoney;
+
+	@DbIgnore
+	private BigDecimal gotMoney;
+}

+ 1 - 0
netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml

@@ -18,6 +18,7 @@
         submit_time = null,
         operator = null,
         yhs_id = 0,
+        cmt = 0,
         aq_type = 1
         where id = #{entity.id}
         <if test="expireTime != null">

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

@@ -522,4 +522,16 @@
         and status not in ('close','noPayment','refund') and sku_id in (select id from goods_don_sku where goods_id = 26 and
         is_mirror = 1)
     </select>
+
+    <select id="selectUserMIrrorShopDistributeOrderDetail" resultType="java.util.Map">
+        select count(*) as numOfDsOrder,
+        ifnull(sum(money),0) as dsMoney
+        from `order_don` o inner join user_mirror_shop_order_relate uor on uor.order_id = o.id and o.status not in ('close','noPayment','refund')
+        <if test="startDate != null">
+            and o.created_time >= #{startDate}
+        </if>
+        <if test="endDate != null">
+            and o.created_time &lt; #{endDate}
+        </if>
+    </select>
 </mapper>

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

@@ -0,0 +1,16 @@
+<?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,
+               cast(sum(dp.money) / 100 as decimal(10, 2))               as joinFeeTaskMoney
+        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'
+        left join user_mirror_shop_distribute_waiting_send_points dp on dp.shop_user_id = u.id and dp.type = 2 and dp.send_status in ('waiting','success')
+        group by u.id, u.mp_money
+    </select>
+</mapper>

+ 77 - 0
netflix-dao/src/main/resources/mapper/UserMirrorShopDistributeWaitingSendPointsMapper.xml

@@ -0,0 +1,77 @@
+<?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.UserMirrorShopDistributeWaitingSendPointsMapper">
+
+
+    <select id="getWMoneyStatisticsDataView"
+            resultType="com.cyksj.model.views.YhShopBrokenLineCpsUserWMoneyView">
+        select min(curdate) as firstDate,
+        max(curdate) as lastDate from (select
+        <if test="today">
+            date_format(send_time, '%H') as `curdate`
+        </if>
+        <if test="!today">
+            date_format(send_time, '%Y-%m-%d') `curdate`
+        </if>
+        from `user_mirror_shop_distribute_waiting_send_points`
+        where shop_user_id = #{yhShopUserId}
+        and send_status = 'waiting'
+        <choose>
+            <when test="today">
+                <if test="first != null">
+                    and send_time >= #{first}
+                </if>
+                <if test="end != null">
+                    and send_time &lt;= #{end}
+                </if>
+                group by date_format(send_time, '%H')
+            </when>
+            <otherwise>
+                <if test="first != null">
+                    and date_format(send_time, '%Y-%m-%d') >= #{first}
+                </if>
+                <if test="end != null">
+                    and date_format(send_time, '%Y-%m-%d') &lt; #{end}
+                </if>
+                group by date_format(send_time, '%Y-%m-%d')
+            </otherwise>
+        </choose>
+        )s
+    </select>
+
+    <select id="getWMoneyStatisticsDate" resultType="com.cyksj.model.views.YhShopUserWMoneyStatisticsDataView">
+        select
+        <if test="today">
+            date_format(send_time, '%H') as `hour`,
+        </if>
+        <if test="!today">
+            date_format(send_time, '%Y-%m-%d') `date`,
+        </if>
+        TRUNCATE(sum(money)/ 100,2) money
+        from `user_mirror_shop_distribute_waiting_send_points`
+        where shop_user_id = #{yhShopUserId}
+        and send_status = 'waiting'
+        <choose>
+            <when test="today">
+                <if test="first != null">
+                    and send_time >= #{first}
+                </if>
+                <if test="end != null">
+                    and send_time &lt;= #{end}
+                </if>
+                group by date_format(send_time, '%H')
+                order by date_format(send_time, '%H')
+            </when>
+            <otherwise>
+                <if test="first != null">
+                    and date_format(send_time, '%Y-%m-%d') >= #{first}
+                </if>
+                <if test="end != null">
+                    and date_format(send_time, '%Y-%m-%d') &lt; #{end}
+                </if>
+                group by date_format(send_time, '%Y-%m-%d')
+                order by date_format(send_time, '%Y-%m-%d')
+            </otherwise>
+        </choose>
+    </select>
+</mapper>

+ 14 - 0
netflix-dao/src/main/resources/mapper/UserMirrorShopManageAdvertiseMapper.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.MirrorNoticeUserMapper">
+
+    <select id="getAdvertise" resultType="com.cyksj.model.views.UserMirrorShopAdvertiseFrontView">
+        select mur.*
+        from mirror_notice_user mur
+                 inner join user_mirror_shop um on um.user_id = mur.user_id
+        where mur.status is true
+          and um.custom_id = #{customId}
+        order by update_time desc
+    </select>
+</mapper>

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

@@ -0,0 +1,70 @@
+<?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>
+
+    <select id="selectUserMIrrorShopDetail" resultType="java.util.Map">
+        select count(distinct ys.user_id) as numOfYhShop,
+        count(distinct us.user_id) as numOfRegisterYhShopUser
+        from (select user_id from `user_mirror_shop` ys
+        where 1 = 1
+        <if test="startDate != null">
+            and created_time >= #{startDate}
+        </if>
+        <if test="endDate != null">
+            and created_time &lt; #{endDate}
+        </if>) ys left join user_mirror_shop_user_distribute_shared us on us.shop_user_id = ys.user_id
+    </select>
+
+    <select id="selectUserMirrorShopTakeMoney" resultType="java.math.BigDecimal">
+        select ifnull(sum(money),0) from `user_mirror_shop_distribute_waiting_send_points` where send_status in
+        ('waiting','success')
+        <if test="startDate != null">
+            and created_time >= #{startDate}
+        </if>
+        <if test="endDate != null">
+            and created_time &lt; #{endDate}
+        </if>
+    </select>
+
+    <select id="selectUserMirrorShopApplyMoney" resultType="java.util.Map">
+        select ifnull(sum(if(verify_status = 'success',money,0)),0)s,
+        ifnull(sum(if(verify_status = 'verifying',money,0)),0)vf
+        from user_mirror_shop_distribute_money_apply where verify_status in ('verifying','success')
+        <if test="startDate != null">
+            and created_time >= #{startDate}
+        </if>
+        <if test="endDate != null">
+            and created_time &lt; #{endDate}
+        </if>
+    </select>
+
+    <select id="selectOrderBrokenLineMoney" resultType="com.cyksj.model.views.UserMirrorShopOrderDataStatisticsView">
+        select min(curdate) as firstDate,max(curdate) as lastDate from (select date_format(od.created_time,'%Y-%m-%d')
+        as curdate
+        from (select o.id,o.goods_id,o.created_time from order_don o
+        inner join user_mirror_shop_order_relate uor on uor.order_id = o.id and uor.mp_id = #{mpId} where
+        o.status not in ('close','noPayment')
+        <if test="first != null">
+            and o.created_time >= #{first}
+        </if>
+        <if test="end != null">
+            and o.created_time &lt; #{end}
+        </if>)od
+        left join goods_don g on g.id = od.goods_id
+        inner join user_mirror_shop_distribute_waiting_send_points dp on dp.order_id = od.id
+        group by date_format(od.created_time,'%Y-%m-%d'))s
+    </select>
+</mapper>

+ 7 - 0
netflix-service/src/main/java/com/cyksj/config/wxlogin/BaseWxOpenPlatConfig.java

@@ -44,5 +44,12 @@ public class BaseWxOpenPlatConfig {
 	 */
 	private String baRedirectUrl;
 
+	/**
+	 * 镜像店铺跳转url
+	 */
+	private String userMirrorShopRedirectUri;
+
+	private String userMirrorShopLoginUrl;
+
 	private String remark;
 }

+ 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扫码支付的方式。 跳转模式
 	 */

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

@@ -848,6 +848,9 @@ public class RedisService {
         NF_SET_TIME_LIMIT("nf_set_time_limit:", "设置pin码", 60l),
         NF_KICKOUT_TIME_LIMIT("nf_kickout_time_limit:", "踢出奈飞设备", 60l),
         GOODS_WHOLESALE_KEY("yh_home_paghe_cache:wholesale_key", "平台批发", 60 * 60 * 4L),
+        USER_MIRROR_SHOP_BACK_LOGIN_KEY("user_mirror_shop_back_login:", "镜像店铺主后台key", 3 * 60),
+        USER_MIRROR_SHOP_AUTH_SUCCESS_KEY("user_mirror_shop_auth_success_key:%s", "镜像店铺主后台微信授权", 60 * 10),
+        USER_MIRROR_SHOP_ADVERTISE_CACHE_KEY("user_mirror_shop_advertise_cache_key:", "用户镜像店铺广告缓存key", 60 * 60 * 12),
         ;
 
         private String name;

+ 3 - 1
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -472,7 +472,9 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
                 .orderBy(ChatgptCarInfoView::getTeamClearsIn).asc()
                 .orderBy(ChatgptCarInfoView::getClearsIn).asc().orderBy(ChatgptCarInfoView::getScore).asc().build());
 
-        chatgptCarInfoViews.getDataList().forEach(this::buildChatgptCarInfoView);
+        if (chatgptCarInfoViews != null) {
+            chatgptCarInfoViews.getDataList().forEach(this::buildChatgptCarInfoView);
+        }
         return chatgptCarInfoViews;
     }
 

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -451,6 +451,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				relation.setStatus(GroupsRelation.Status.validity);
 			}
 			relation.setYhsId(yhsId);
+			relation.setCmt(1);
 			groupsRelationMapper.updateById(relation);
 
 			Long skuId = sku.getId();

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/mange/RefreshCacheService.java

@@ -34,4 +34,9 @@ public interface RefreshCacheService {
 	void goodsQuestionCache();
 
 	void refreshWholesaleGoods();
+
+	/**
+	 * 清除用户镜像店铺广告
+	 */
+	void refreshUserMirrorShopAdvertiseCache(Long userId);
 }

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

@@ -37,6 +37,8 @@ import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubMapper;
 import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubRewardsMapper;
 import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubWaitingMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopDistributeWaitingSendPointsMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
 import com.cyksj.mapper.shop.YhShopUserDistributeBusinessOrderDonRecordMapper;
 import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper;
 import com.cyksj.model.entity.*;
@@ -203,6 +205,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final LumaUserMapper lumaUserMapper;
 
+    private final UserMirrorShopMapper userMirrorShopMapper;
+
+    private final UserMirrorShopDistributeWaitingSendPointsMapper userMirrorShopDistributeWaitingSendPointsMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -737,6 +743,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         newRelation.setStartTime(relation.getStartTime());
         newRelation.setExpiryTime(relation.getExpiryTime());
         newRelation.setYhsId(yhsId);
+        newRelation.setCmt(relation.getCmt());
         newRelation.setCustomerService(relation.getCustomerService());
         if (newRelation.getStatus() != GroupsRelation.Status.outside) {
             newRelation.setStatus(GroupsRelation.Status.validity);
@@ -1016,6 +1023,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 deductDsPoints(orderDon);
                 //店铺 分销提成金额扣除
                 yhShopDistributeService.deductDsMoney(orderDon);
+                //镜像店铺 分销提成金额扣除
+                deductUserMirrorShopMoney(orderDon);
             }
 
             if (orderDon.getIsFixedDistribute()) {
@@ -1428,4 +1437,61 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             });
         });
     }
+
+    /**
+     * 扣除用户镜像店铺提成
+     */
+    private void deductUserMirrorShopMoney(OrderDon orderDon) {
+        UserMirrorShopDistributeWaitingSendPoints distributeWaitingSendPoints = userMirrorShopDistributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShopDistributeWaitingSendPoints.class)
+                .eq(UserMirrorShopDistributeWaitingSendPoints::getOrderId, orderDon.getId())
+                .last("limit 1"));
+        if (distributeWaitingSendPoints != null) {
+            BigDecimal money = orderDon.getMoney();
+            BigDecimal refundMoney = orderDon.getRefundMoney();
+            //已发送 发送中 部分 全额退款
+            UserMirrorShopDistributeWaitingSendPoints.Status sendStatus = distributeWaitingSendPoints.getSendStatus();
+            BigDecimal take_money = distributeWaitingSendPoints.getMoney();
+            if (sendStatus == UserMirrorShopDistributeWaitingSendPoints.Status.waiting) {
+                if (refundMoney.compareTo(money) == 0) {
+                    //待发送状态 全额退款
+                    distributeWaitingSendPoints.setSendStatus(UserMirrorShopDistributeWaitingSendPoints.Status.close);
+                    distributeWaitingSendPoints.setRefundMoney(take_money);
+                    distributeWaitingSendPoints.setMoney(BigDecimal.ZERO);
+                    userMirrorShopDistributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+                    return;
+                }
+                Integer rate = distributeWaitingSendPoints.getRate();
+                if (rate > 0) {
+                    BigDecimal needDeductMoney = refundMoney.multiply(BigDecimal.valueOf(rate).divide(BigDecimal.valueOf(100)));
+                    distributeWaitingSendPoints.setRefundMoney(needDeductMoney);
+                    //剩余积分
+                    distributeWaitingSendPoints.setMoney(take_money.subtract(needDeductMoney));
+                    userMirrorShopDistributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+                }
+            } else if (sendStatus == UserMirrorShopDistributeWaitingSendPoints.Status.success) {
+                //已发送的提成 部分退款 全额退款 需要扣除用户积分
+                //扣除固定推广者积分
+                if (refundMoney.compareTo(money) == 0) {
+                    //扣除店铺主 已有的提成金额
+                    userBenefitsService.deductUserMirrorShopTakeMoney(orderDon.getId(), distributeWaitingSendPoints.getShopUserId(), take_money);
+                    distributeWaitingSendPoints.setRefundMoney(take_money);
+                    distributeWaitingSendPoints.setMoney(BigDecimal.ZERO);
+                    distributeWaitingSendPoints.setSendStatus(UserMirrorShopDistributeWaitingSendPoints.Status.close);
+                    userMirrorShopDistributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+                    return;
+                }
+                Integer rate = distributeWaitingSendPoints.getRate();
+                if (rate > 0) {
+                    BigDecimal needDeductMoney = refundMoney.multiply(BigDecimal.valueOf(rate).divide(BigDecimal.valueOf(100)));
+                    //扣除店铺主 已有的提成金额
+                    userBenefitsService.deductUserMirrorShopTakeMoney(orderDon.getId(), distributeWaitingSendPoints.getShopUserId(), needDeductMoney);
+                    //部分退款
+                    distributeWaitingSendPoints.setRefundMoney(needDeductMoney);
+                    distributeWaitingSendPoints.setMoney(take_money.subtract(needDeductMoney));
+                    userMirrorShopDistributeWaitingSendPointsMapper.updateById(distributeWaitingSendPoints);
+                }
+
+            }
+        }
+    }
 }

+ 21 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/RefreshCacheServiceImpl.java

@@ -1,10 +1,14 @@
 package com.cyksj.service.mange.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.entity.UserMirrorShop;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mange.RefreshCacheService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -18,6 +22,8 @@ import java.util.Set;
 public class RefreshCacheServiceImpl implements RefreshCacheService {
 	private final RedisService redisService;
 
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
 	@Override
 	public void refreshYhHomePageCache() {
 		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "*");
@@ -66,4 +72,19 @@ public class RefreshCacheServiceImpl implements RefreshCacheService {
 		Set<String> keys = redisService.keys(RedisService.key.GOODS_WHOLESALE_KEY.getName() + "*");
 		redisService.del(keys.toArray(String[]::new));
 	}
+
+	@Override
+	public void refreshUserMirrorShopAdvertiseCache(Long userId) {
+		if (userId == null) {
+			Set<String> keys = redisService.keys(RedisService.key.USER_MIRROR_SHOP_ADVERTISE_CACHE_KEY.getName() + "*");
+			redisService.del(keys.toArray(String[]::new));
+			return;
+		}
+		Optional.ofNullable(userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class).eq(UserMirrorShop::getUserId, userId).last("limit 1")))
+				.ifPresent(um -> {
+					String key = RedisService.key.USER_MIRROR_SHOP_ADVERTISE_CACHE_KEY.getName() + um.getCustomId();
+					redisService.del(key);
+				});
+
+	}
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/statistics/StatisticsDataService.java

@@ -48,4 +48,6 @@ public interface StatisticsDataService {
 	void yhShopDistribute(BackgroundDataView backgroundDataView, Date startDate, Date endDate);
 
 	GroupsDataStatisticsView getGroupsData(Long startTime, Long endTime, Integer type, Boolean isDistribute) throws Exception;
+
+	void userMirrorShopDistribute(BackgroundDataView backgroundDataView, Date startDate, Date endDate);
 }

+ 27 - 0
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -11,6 +11,7 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.manage.statistics.*;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
 import com.cyksj.mapper.shop.YhShopMapper;
 import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.dto.MonthlyUserOrderDetailDto;
@@ -89,6 +90,8 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private final SysConfigMapper sysConfigMapper;
 
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -442,6 +445,30 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		return groupsDataStatisticsView;
 	}
 
+	@Override
+	public void userMirrorShopDistribute(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
+		//店铺数量
+		//注册用户
+		Map<String, Object> yhShopDetail = userMirrorShopMapper.selectUserMIrrorShopDetail(startDate, endDate);
+		backgroundDataView.setNumOfYhShop(Integer.parseInt(yhShopDetail.get("numOfYhShop").toString()));
+		backgroundDataView.setNumOfYhShopRegisterUser(Integer.parseInt(yhShopDetail.get("numOfRegisterYhShopUser").toString()));
+		//销售单数
+		//销售金额
+		Map<String, Object> yhShopOrderDetail = orderDonMapper.selectUserMIrrorShopDistributeOrderDetail(startDate, endDate);
+		backgroundDataView.setNumOfYhShopDsOrders(Integer.parseInt(yhShopOrderDetail.get("numOfDsOrder").toString()));
+		backgroundDataView.setYhShopAmount(BigDecimal.valueOf(Long.parseLong(yhShopOrderDetail.get("dsMoney").toString())).divide(BigDecimal.valueOf(100)));
+		//提成金额
+		BigDecimal yhShopTakeMoney = userMirrorShopMapper.selectUserMirrorShopTakeMoney(startDate, endDate);
+		backgroundDataView.setYhShopTakeMoney(yhShopTakeMoney.divide(BigDecimal.valueOf(100)));
+
+
+		Map<String, Object> yhShopApplyDetail = userMirrorShopMapper.selectUserMirrorShopApplyMoney(startDate, endDate);
+		//已提现
+		backgroundDataView.setDistributeGotMoney(BigDecimal.valueOf(Long.parseLong(yhShopApplyDetail.get("s").toString())).divide(BigDecimal.valueOf(100)));
+		//待审核
+		backgroundDataView.setDistributeVerifyingMoney(BigDecimal.valueOf(Long.parseLong(yhShopApplyDetail.get("vf").toString())).divide(BigDecimal.valueOf(100)));
+	}
+
 	private void getUnbindChannelOrderData(GroupsDataStatisticsView groupsDataStatisticsView, String startDate, String endDate) {
 		//解绑渠道
 		//流媒体

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

@@ -0,0 +1,20 @@
+package com.cyksj.service.mange.usermirror;
+
+import com.cyksj.model.request.DistributeApplyMoneyReq;
+import com.cyksj.model.request.UserMirrorShopInfoApplyReq;
+
+/**
+ * 项目名: 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;
+
+	void verifyUserMIrrorShopApply(UserMirrorShopInfoApplyReq applyReq);
+}

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

@@ -0,0 +1,169 @@
+package com.cyksj.service.mange.usermirror.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.mirrorshop.*;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.request.DistributeApplyMoneyReq;
+import com.cyksj.model.request.UserMirrorShopInfoApplyReq;
+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 UserMirrorShopApplyRecordMapper userMirrorShopApplyRecordMapper;
+
+	private final RedisService redisService;
+
+	private final UserBenefitsService userBenefitsService;
+
+	private final UserMirrorShopFeeOrderDonMapper userMirrorShopFeeOrderDonMapper;
+
+	private final OrderRefundService orderRefundService;
+
+	private final UserMirrorShopDistributeWaitingSendPointsMapper waitingSendPointsMapper;
+
+	@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());
+
+		UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, orderDon.getUserId())
+				.last("limit 1"));
+		if (userMirrorShop != null) {
+			userMirrorShop.setStatus(false);
+			userMirrorShopMapper.updateById(userMirrorShop);
+		}
+		userMirrorShopFeeOrderDonMapper.updateById(orderDon);
+
+		//扣除提成
+		UserMirrorShopDistributeWaitingSendPoints waitingSendPoints = waitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShopDistributeWaitingSendPoints.class)
+				.eq(UserMirrorShopDistributeWaitingSendPoints::getUserId, orderDon.getUserId())
+				.eq(UserMirrorShopDistributeWaitingSendPoints::getType, 2)
+				.last("limit 1"));
+		if (waitingSendPoints != null) {
+			if (waitingSendPoints.getSendStatus() == UserMirrorShopDistributeWaitingSendPoints.Status.waiting) {
+				waitingSendPoints.setSendStatus(UserMirrorShopDistributeWaitingSendPoints.Status.close);
+				waitingSendPointsMapper.updateById(waitingSendPoints);
+			} else if (waitingSendPoints.getSendStatus() == UserMirrorShopDistributeWaitingSendPoints.Status.success) {
+				waitingSendPoints.setRefundMoney(waitingSendPoints.getMoney());
+				userBenefitsService.deductUserMirrorShopTakeMoney(waitingSendPoints.getOrderId(), waitingSendPoints.getShopUserId(), waitingSendPoints.getMoney());
+				waitingSendPointsMapper.updateById(waitingSendPoints);
+			}
+		}
+	}
+
+	@Override
+	public void verifyUserMIrrorShopApply(UserMirrorShopInfoApplyReq applyReq) {
+		UserMirrorShopApplyRecord userMirrorShopApplyRecord = userMirrorShopApplyRecordMapper.selectById(applyReq.getId());
+
+		UserMirrorShopApplyRecord.Status status = applyReq.getVerifyStatus();
+		if (status == UserMirrorShopApplyRecord.Status.fail && StrUtil.isEmpty(applyReq.getReason())) {
+			throw BusinessRuntimeException.getInstance("请输入审核失败原因");
+		}
+
+		if (status == UserMirrorShopApplyRecord.Status.success) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getUserId, userMirrorShopApplyRecord.getUserId())
+					.last("limit 1"));
+
+			userMirrorShop.setName(userMirrorShopApplyRecord.getName());
+			userMirrorShop.setLogo(userMirrorShopApplyRecord.getLogo());
+			userMirrorShopMapper.updateById(userMirrorShop);
+		}
+		userMirrorShopApplyRecord.setVerifyStatus(applyReq.getVerifyStatus());
+		userMirrorShopApplyRecord.setReason(applyReq.getReason());
+		userMirrorShopApplyRecordMapper.updateById(userMirrorShopApplyRecord);
+	}
+}

+ 30 - 0
netflix-service/src/main/java/com/cyksj/service/mirrorshop/CmsUserMirrorShopService.java

@@ -0,0 +1,30 @@
+package com.cyksj.service.mirrorshop;
+
+import cn.hutool.core.date.DateTime;
+import com.cyksj.dto.Result;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.request.UserMirrorShopApplyMoneyReq;
+import com.cyksj.model.views.YhShopBrokenLineCpsUserWMoneyView;
+import com.cyksj.model.views.YhShopUserWMoneyStatisticsDataView;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopService
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:07
+ */
+public interface CmsUserMirrorShopService {
+	void getLoginCode(Integer type, String login, Integer cid);
+
+	String yhShopManageRedirect(long userId);
+
+	User login(Integer type, String login, String code);
+
+	YhShopBrokenLineCpsUserWMoneyView getWMoneyStatisticsDate(long yhShopUserId, DateTime first, DateTime end);
+
+	List<YhShopUserWMoneyStatisticsDataView> getWMoneyStatisticsDataView(long yhShopUserId, DateTime first, DateTime end);
+
+	Result<String> applyMoney(UserMirrorShopApplyMoneyReq applyMoneyReq);
+}

+ 176 - 0
netflix-service/src/main/java/com/cyksj/service/mirrorshop/impl/CmsUserMirrorShopServiceImpl.java

@@ -0,0 +1,176 @@
+package com.cyksj.service.mirrorshop.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.SmsUtil;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.dto.Result;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopDistributeWaitingSendPointsMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserMirrorShop;
+import com.cyksj.model.request.UserMirrorShopApplyMoneyReq;
+import com.cyksj.model.views.YhShopBrokenLineCpsUserWMoneyView;
+import com.cyksj.model.views.YhShopUserWMoneyStatisticsDataView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.mail.MailService;
+import com.cyksj.service.mirrorshop.CmsUserMirrorShopService;
+import com.cyksj.service.pay.TransferFuncService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:07
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CmsUserMirrorShopServiceImpl implements CmsUserMirrorShopService {
+	private final UserMapper userMapper;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final MailService mailService;
+
+	private final RedisService redisService;
+
+	private final UserMirrorShopDistributeWaitingSendPointsMapper userMirrorShopDistributeWaitingSendPointsMapper;
+
+	private final TransferFuncService transferFuncService;
+
+	@Override
+	public void getLoginCode(Integer type, String login, Integer cid) {
+		if (type > 2) {
+			throw BusinessRuntimeException.getInstance("");
+		}
+		if (cid == null) {
+			cid = 86;
+		}
+		String phone = null;
+		String email = null;
+		if (type == 1) phone = login;
+		else if (type == 2) email = login;
+		User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
+				.eq(StrUtil.isNotBlank(phone), User::getLoginPhone, phone)
+				.eq(StrUtil.isNotBlank(email), User::getEmail, email).last("limit 1"));
+		if (user == null) throw BusinessRuntimeException.getInstance("登录信息不存在");
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, user.getId()).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+
+		String CACHE_LOGIN_KEY = RedisService.key.USER_MIRROR_SHOP_BACK_LOGIN_KEY.getName()  + login;
+		Object o = redisService.get(CACHE_LOGIN_KEY);
+		Long expire = redisService.getExpire(CACHE_LOGIN_KEY);
+		if (o != null && expire >= 3 * 60 - 10) {
+			throw BusinessRuntimeException.getInstance("获取验证码过于频繁");
+		}
+		String code = StringUtil.getRandomCodeStr(6);
+		if (type == 1) {
+			if (StrUtil.isEmpty(login) || (86 == cid && !Validator.isMobile(phone))) {
+				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			}
+			SmsUtil.sendTencent(cid, login, code);
+		} else if (type == 2) {
+			if (!Validator.isEmail(login)) {
+				throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+			}
+			mailService.sendLoginCodeEmailToPeople(code, login);
+		}
+		redisService.set(CACHE_LOGIN_KEY, code, RedisService.key.USER_MIRROR_SHOP_BACK_LOGIN_KEY.getTimeout());
+	}
+
+	@Override
+	public String yhShopManageRedirect(long userId) {
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, userId).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+		return null;
+	}
+
+	@Override
+	public User login(Integer type, String login, String code) {
+		String phone = null;
+		String email = null;
+		if (type == null) {
+			type = 1;
+		}
+		if (type > 2) {
+			throw BusinessRuntimeException.getInstance("");
+		}
+		if (type == 1) phone = login;
+		if (type == 2) email = login;
+		if (StrUtil.isEmpty(code)) {
+			throw BusinessRuntimeException.getInstance("请输入验证码");
+		}
+		String CACHE_LOGIN_KEY = RedisService.key.USER_MIRROR_SHOP_BACK_LOGIN_KEY.getName() + login;
+		if (type == 1) {
+			if (StrUtil.isEmpty(phone)) {
+				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			}
+		} else if (type == 2) {
+			if (!Validator.isEmail(email)) {
+				throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+			}
+		}
+		String cache_code = String.valueOf(redisService.get(CACHE_LOGIN_KEY));
+		if (StrUtil.isBlank(cache_code) || !cache_code.equals(code)) {
+			throw BusinessRuntimeException.getInstance("验证码错误");
+		}
+		User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
+				.eq(StrUtil.isNotBlank(phone), User::getLoginPhone, phone)
+				.eq(StrUtil.isNotBlank(email), User::getEmail, email).last("limit 1"));
+		if (user == null) throw BusinessRuntimeException.getInstance("用户不存在");
+		//是否是店铺主
+		UserMirrorShop shop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, user.getId()).last("limit 1"));
+		if (shop == null) {
+			throw BusinessRuntimeException.getInstance("您不是小店店铺主");
+		}
+		return user;
+	}
+
+	@Override
+	public YhShopBrokenLineCpsUserWMoneyView getWMoneyStatisticsDate(long yhShopUserId, DateTime first, DateTime end) {
+		boolean today = isToday(first, end);
+		return userMirrorShopDistributeWaitingSendPointsMapper.getWMoneyStatisticsDataView(yhShopUserId, first, end, today);
+	}
+
+	@Override
+	public List<YhShopUserWMoneyStatisticsDataView> getWMoneyStatisticsDataView(long yhShopUserId, DateTime first, DateTime end) {
+		boolean today = isToday(first, end);
+		return userMirrorShopDistributeWaitingSendPointsMapper.getWMoneyStatisticsDate(yhShopUserId, first, end, today);
+	}
+
+	@Override
+	public Result<String> applyMoney(UserMirrorShopApplyMoneyReq applyMoneyReq) {
+		return transferFuncService.userMirrorShopDistributeApply(applyMoneyReq);
+	}
+
+
+	public boolean isToday(DateTime first, DateTime end) {
+		boolean today = false;
+		if (first != null && end != null) {
+			if (DateUtil.beginOfDay(DateTime.now()).equals(first) && (DateUtil.beginOfDay(DateUtil.offsetDay(DateTime.now(), 1)).equals(end) || DateUtil.endOfDay(DateTime.now()).equals(end))) {
+				today = true;
+			}
+		}
+		return today;
+	}
+}

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

+ 220 - 99
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -57,6 +57,10 @@ import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubRewardsMapper;
 import com.cyksj.mapper.manage.distribute.sub.UserDistributeSubWaitingMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopDistributeWaitingSendPointsMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopOrderRelateMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopUserDistributeSharedMapper;
 import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
 import com.cyksj.mapper.shop.YhShopGoodsSkuMapper;
 import com.cyksj.model.dto.*;
@@ -331,6 +335,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonIndependentRenewRecordMapper independentRenewRecordMapper;
 
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final UserMirrorShopUserDistributeSharedMapper userMirrorShopUserDistributeSharedMapper;
+
+	private final UserMirrorShopOrderRelateMapper userMirrorShopOrderRelateMapper;
+
+	private final UserMirrorShopDistributeWaitingSendPointsMapper userMirrorShopDistributeWaitingSendPointsMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -346,7 +358,18 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		AtomicBoolean isGiftCardPay = new AtomicBoolean(false);
 		//若存在店铺id,校验店铺状态
 		String customId = payRequest.getCustomId();
-		Long yhsId = yhShopFrontService.checkShopCustomIdAndReturnShopId(customId);
+		UserMirrorShop userMirrorShop = null;
+		Long yhsId = 0l;
+		if (payRequest.getCmt() == 1) {
+			yhsId = yhShopFrontService.checkShopCustomIdAndReturnShopId(customId);
+		} else if (payRequest.getCmt() == 2) {
+			userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, customId)
+					.last("limit 1"));
+			if (!userMirrorShop.getStatus()) {
+				throw BusinessRuntimeException.getInstance("店铺已关闭");
+			}
+		}
 		if (CollUtil.isNotEmpty(giftCards)) {
 			goodsId = payRequest.getGoodsId();
 			isGiftCardPay.set(true);
@@ -381,7 +404,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		Long relationId = 0L;
 		Boolean isNeedTicket = checkIsNeedGroupsRelation(goodsDon);
 		Long userId = payRequest.getUserId();
-		if (userId != null) {
+		if (userId != null && payRequest.getCmt() == 1) {
 			int noPayCount = count(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).eq(OrderDon::getGoodsId, goodsId)
 					.eq(OrderDon::getYhsId, yhsId)
 					.eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
@@ -577,6 +600,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		setOrderDonPayTile(isGiftCardPay, gcPayInfo, giftCards, orderDon, goodsDon, sku, dpSkuIds);
 		//下单手机号
 		orderDon.setPhone(orderPhone);
+		//镜像店铺订单 区分车票
+		if (payRequest.getCmt() == 2 && userMirrorShop != null) {
+			relation.setCmt(2);
+			relation.setYhsId(userMirrorShop.getId());
+			groupsRelationMapper.updateById(relation);
+		}
 		this.saveOrUpdate(orderDon);
 
 		if (orderDon.getIsDp()) {
@@ -655,7 +684,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
 		}
 		//记录文章下单量
-		if (payRequest.getInfoId() != null){
+		if (payRequest.getInfoId() != null) {
 			InformationClickUserRecord informationClickUserRecord = new InformationClickUserRecord();
 			informationClickUserRecord.setInfoId(payRequest.getInfoId());
 			informationClickUserRecord.setOrderId(orderDon.getId());
@@ -677,10 +706,28 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//记录补贴订单关联
 		recordOrderDonSubsidyRelate(orderId, payRequest.getSubsidyId());
 		//试用车票跳转记录
-		recordOrderTrialTicketJumpPay(orderId,payRequest.getIsTrial());
+		recordOrderTrialTicketJumpPay(orderId, payRequest.getIsTrial());
 		//记录用户推广海报下单记录
 		recordPosterUserOrder(orderId, payRequest.getRid());
+		//记录用户镜像店铺订单
+		recordUserMirrorShopOrderRelate(orderId, payRequest.getUserId(), payRequest.getCmt(), payRequest.getCustomId());
+	}
 
+	private void recordUserMirrorShopOrderRelate(Long orderId, Long userId, Integer cmt, String customId) {
+		if (cmt == 2 && StrUtil.isNotBlank(customId)) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, customId).last("limit 1"));
+//			if (userMirrorShop.getUserId().equals(userId)) {
+//				return;
+//			}
+			if (userMirrorShop == null || !userMirrorShop.getStatus()) {
+				return;
+			}
+			UserMirrorShopOrderRelate userMirrorShopOrderRelate = new UserMirrorShopOrderRelate();
+			userMirrorShopOrderRelate.setOrderId(orderId);
+			userMirrorShopOrderRelate.setMpId(userMirrorShop.getId());
+			userMirrorShopOrderRelateMapper.insert(userMirrorShopOrderRelate);
+		}
 	}
 
 	private Boolean checkIsNeedGroupsRelation(GoodsDon goodsDon) {
@@ -930,17 +977,36 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			throw new BusinessRuntimeException("缺少必填参数");
 		}
 		String customId = payRequest.getCustomId();
-		//若存在店铺id,校验店铺状态
-		Long yhsId = yhShopFrontService.checkShopCustomIdAndReturnShopId(customId);
+		Long yhsId = 0l;
+		if (payRequest.getCmt() == 1) {
+			//若存在店铺id,校验店铺状态
+			yhsId = yhShopFrontService.checkShopCustomIdAndReturnShopId(customId);
+		} else if (payRequest.getCmt() == 2) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, customId)
+					.last("limit 1"));
+			if (!userMirrorShop.getStatus()) {
+				throw BusinessRuntimeException.getInstance("店铺已关闭");
+			}
+		}
+
 		//是否有其他规格的续费订单 若有请先关闭
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
-		Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
-				.eq(OrderDon::getRelationId, payRequest.getRelationId())
-				.eq(OrderDon::getYhsId, yhsId)
-				.in(OrderDon::getUserId, userIdList)
-				.eq(OrderDon::getStatus, OrderDon.Status.noPayment).eq(OrderDon::getOrderType, 2));
-		if (count > 0) {
-			throw BusinessRuntimeException.getInstance("您有该车票未支付的续费订单..");
+		if (payRequest.getCmt() == 2) {
+			//关闭其他待支付订单
+			orderDonMapper.update(null, Wrappers.lambdaUpdate(OrderDon.class)
+					.set(OrderDon::getStatus, OrderDon.Status.close)
+					.eq(OrderDon::getUserId, userId)
+					.eq(OrderDon::getStatus, OrderDon.Status.noPayment));
+		} else {
+			Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getRelationId, payRequest.getRelationId())
+					.eq(OrderDon::getYhsId, yhsId)
+					.in(OrderDon::getUserId, userIdList)
+					.eq(OrderDon::getStatus, OrderDon.Status.noPayment).eq(OrderDon::getOrderType, 2));
+			if (count > 0) {
+				throw BusinessRuntimeException.getInstance("您有该车票未支付的续费订单..");
+			}
 		}
 		GoodsDonSku sku = adjustGoodsDonSku(yhsId, false, renewSkuId);
 
@@ -1120,13 +1186,15 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//独立规格续费订单记录
 			recordIndependentRenewOrderDon(orderDon, renewUpgradeIndependentPackage, groupsTrips);
 		}
+		//统一处理订单记录操作
+		unifiedHandlerOrderRecordFunc(orderDon.getId(), payRequest);
 		//订单金额为0 且订单为已完成 更新虚物车票
 		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
 			OrderDon updateOrder = orderDonMapper.selectById(orderDon.getId());
 			//mj镜像续费订单
-			if(orderDon.getOrderType() == 2 && orderDon.getGoodsId() == 26){
+			if (orderDon.getOrderType() == 2 && orderDon.getGoodsId() == 26) {
 				GroupsRelation groupsRelation = groupsRelationMapper.selectById(orderDon.getRelationId());
-				if(groupsRelation != null){
+				if (groupsRelation != null) {
 					Date expiryTime = groupsRelation.getExpiryTime();
 
 					//mj续费订单当天过期直接加次数
@@ -1185,7 +1253,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	@Override
 	public AliPayParams aliPay(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
-		return aliPayCommonService.unifiedPay(re,productCode, qrPayMode);
+		return aliPayCommonService.unifiedPay(re, productCode, qrPayMode);
 	}
 
 	@Override
@@ -1429,7 +1497,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setType(UpgradeOrderDon.Type.BALANCE);
 			orderDon.setPayTime(DateTime.now());
 		}
-		unifiedHandlerUpgradeOrderNotify(orderDon,upgradePackage);
+		unifiedHandlerUpgradeOrderNotify(orderDon, upgradePackage);
 	}
 
 	public void updateCarParkAndSendMsg(GoodsDon goodsDon, GoodsDonSku sku, OrderDon order) {
@@ -1840,7 +1908,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 							throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
 						}
 						CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-						if (couponNewUserView != null) throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+						if (couponNewUserView != null)
+							throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
 					}
 					if (userDistributeShared != null && !userDistributeShared.getSharedId().equals(exists.getUserId())) {
 						throw BusinessRuntimeException.getInstance("您已有推广,无法使用其他人推广码");
@@ -2034,10 +2103,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	}
 
 	/**
-	 * @param orderDon       续费订单
-	 * @param afterSku      续费之后的规格
+	 * @param orderDon 续费订单
+	 * @param afterSku 续费之后的规格
 	 */
-	private void changeTicketAndRecord(OrderDon orderDon,GoodsDonSku afterSku) {
+	private void changeTicketAndRecord(OrderDon orderDon, GoodsDonSku afterSku) {
 		Long preSkuId = orderDon.getSkuId();
 		Long preRelationId = orderDon.getRelationId();
 		Long orderId = orderDon.getId();
@@ -2577,9 +2646,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 
 		//mj镜像续费订单
-		if(orderDon.getOrderType() == 2 && orderDon.getGoodsId() == 26){
+		if (orderDon.getOrderType() == 2 && orderDon.getGoodsId() == 26) {
 			GroupsRelation groupsRelation = groupsRelationMapper.selectById(orderDon.getRelationId());
-			if(groupsRelation != null){
+			if (groupsRelation != null) {
 				Date expiryTime = groupsRelation.getExpiryTime();
 
 				//mj续费订单当天过期直接加次数
@@ -2611,7 +2680,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			userBenefitsService.recordBalanceBySource(orderDon.getUserId(), orderDon.getBalance().negate(), UserBalanceSourceRecord.Source.payment, orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.payment.getDesc());
 		}
 
-		TASK_POOL.execute(()->{
+		TASK_POOL.execute(() -> {
 			try {
 				//发放积分
 				if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0 && orderDon.getIsDistribute()) {
@@ -2666,22 +2735,24 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 				//HBO GO车队满员 车队自动下架
 				setTripDownIfFull(orderDon);
+				//用户镜像店铺分销订单
+				handleUserMirrorSHopOrderDon(orderDon);
 			} catch (Exception e) {
 				log.error("回调修改订单信息错误,orderId:{},error:{}", orderDon.getId(), StringUtil.getErrorText(e));
 			}
 		});
 
-		TASK_POOL.execute(()->{
+		TASK_POOL.execute(() -> {
 			try {
 				orderDonPostService.postData(orderDon.getId(), orderDon.getGoodsId(), orderDon.getPopularizeId());
 			} catch (Exception e) {
-				log.error("回传错误 {}",StringUtil.getErrorText(e));
+				log.error("回传错误 {}", StringUtil.getErrorText(e));
 			}
 		});
 
 		//虚拟物品购买推送电报消息
-		if(goodsDon.getType() == 1){
-			TASK_POOL.execute(()->{
+		if (goodsDon.getType() == 1) {
+			TASK_POOL.execute(() -> {
 				sendTelegramMsg(orderDon, goodsDon, sku);
 			});
 		}
@@ -2721,6 +2792,36 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 	}
 
+	private void handleUserMirrorSHopOrderDon(OrderDon orderDon) throws Exception {
+		Long orderId = orderDon.getId();
+		UserMirrorShopOrderRelate userMirrorShopOrderRelate = userMirrorShopOrderRelateMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShopOrderRelate.class)
+				.eq(UserMirrorShopOrderRelate::getOrderId, orderId)
+				.last("limit 1"));
+		if (userMirrorShopOrderRelate != null) {
+			Long mpId = userMirrorShopOrderRelate.getMpId();
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectById(mpId);
+			if (userMirrorShop == null) {
+				return;
+			}
+			log.info("用户镜像店铺:{}订单:{}分销,发放提成", userMirrorShop.getName(), orderId);
+			SysConfig config = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.MIRROR_SHOP_COMMISSION)
+					.last("limit 1"));
+			UserMirrorShopDistributeConfigDto shopDistributeConfigDto = Jsons.parseObject(config.getSysValue(), UserMirrorShopDistributeConfigDto.class);
+			Integer consumeRate = shopDistributeConfigDto.getConsumeRate();
+
+			UserMirrorShopDistributeWaitingSendPoints waitingSendPoints = new UserMirrorShopDistributeWaitingSendPoints();
+			waitingSendPoints.setOrderId(orderId);
+			waitingSendPoints.setShopUserId(userMirrorShop.getUserId());
+			waitingSendPoints.setSendStatus(UserMirrorShopDistributeWaitingSendPoints.Status.waiting);
+			waitingSendPoints.setMoney(BigDecimal.valueOf(consumeRate).divide(BigDecimal.valueOf(100)).multiply(orderDon.getMoney()));
+			waitingSendPoints.setRate(consumeRate);
+			waitingSendPoints.setUserId(orderDon.getUserId());
+			waitingSendPoints.setSendTime(DateUtil.offsetDay(orderDon.getPayTime(), 3));
+			userMirrorShopDistributeWaitingSendPointsMapper.insert(waitingSendPoints);
+		}
+	}
+
 	private void setTripDownIfFull(OrderDon orderDon) {
 		if (orderDon.getGoodsId() == 8l) {
 			Long relationId = orderDon.getRelationId();
@@ -2740,18 +2841,18 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 	}
 
-	private void mjRenewOrder(OrderDon orderDon){
+	private void mjRenewOrder(OrderDon orderDon) {
 		if (orderDon.getOrderType() == 2 && orderDon.getGoodsId() == 26) {
 			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
-			if (goodsDonSku.getIsMirror()){
-					midjourneyUserMapper.update(null, Wrappers.lambdaUpdate(MidjourneyUser.class)
-							.set(MidjourneyUser::getMjFastNum, goodsDonSku.getMjFastNum())
-							.set(MidjourneyUser::getMjRelaxNum, goodsDonSku.getMjRelaxNum())
-							.eq(MidjourneyUser::getRelationId, orderDon.getRelationId()));
-					MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, orderDon.getRelationId()));
-					log.info("恢复midjourney镜像使用次数: {}", midjourneyUser.getId());
-					redisService.del(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId());
-					redisService.del(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId());
+			if (goodsDonSku.getIsMirror()) {
+				midjourneyUserMapper.update(null, Wrappers.lambdaUpdate(MidjourneyUser.class)
+						.set(MidjourneyUser::getMjFastNum, goodsDonSku.getMjFastNum())
+						.set(MidjourneyUser::getMjRelaxNum, goodsDonSku.getMjRelaxNum())
+						.eq(MidjourneyUser::getRelationId, orderDon.getRelationId()));
+				MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, orderDon.getRelationId()));
+				log.info("恢复midjourney镜像使用次数: {}", midjourneyUser.getId());
+				redisService.del(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId());
+				redisService.del(RedisService.key.MIDJOURNEY_RELAX_LIMIT.getName() + midjourneyUser.getId());
 			}
 		}
 	}
@@ -2837,7 +2938,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		plusOrderIds.add(orderDon.getId());
 	}
 
-	public void saveTransportByAddress(Address address,Long orderId) {
+	public void saveTransportByAddress(Address address, Long orderId) {
 		OrderDonTransport transport = new OrderDonTransport();
 		transport.setOrderId(orderId);
 		transport.setReceiver(address.getReceiver());
@@ -3271,41 +3372,41 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						.select(UserDistributeSubWaiting::getLevel).last("limit 1")).stream().map(UserDistributeSubWaiting::getLevel).collect(Collectors.toList());
 				List<UserDistributeSubRewards> userDistributeSubRewards = userDistributeSubRewardsMapper.selectList(Wrappers.lambdaQuery(UserDistributeSubRewards.class)
 						.notIn(CollUtil.isNotEmpty(existLevels), UserDistributeSubRewards::getLevel, existLevels));
-					for (UserDistributeSubRewards userDistributeSubReward : userDistributeSubRewards) {
-						log.info("当前级别:{}对应的目标金额是{}", userDistributeSubReward.getLevel(), userDistributeSubReward.getTargetAmount().divide(BigDecimal.valueOf(100)));
-						Integer rewardLevel = userDistributeSubReward.getLevel();
-						Integer months = userDistributeSubReward.getMonths();
-						BigDecimal targetAmount = userDistributeSubReward.getTargetAmount();
-						//是否达到目标额
-						BigDecimal subOrderMoney = Optional.ofNullable(orderDonMapper.selectSubChannelOrderMoney(subUserId, userDistributeSub.getCreatedTime(), DateUtil.offsetMonth(userDistributeSub.getCreatedTime(), months))).orElse(BigDecimal.ZERO);
-						if (subOrderMoney.compareTo(BigDecimal.ZERO) > 0 && subOrderMoney.compareTo(targetAmount) >= 0) {
-							try {
-								UserDistributeSubWaiting waiting = Optional.ofNullable(userDistributeSubWaitingMapper.selectOne(Wrappers.lambdaQuery(UserDistributeSubWaiting.class)
-										.eq(UserDistributeSubWaiting::getUserId, userId)
-										.eq(UserDistributeSubWaiting::getSubUserId, subUserId)
-										.eq(UserDistributeSubWaiting::getLevel, rewardLevel)
-										.last("limit 1"))).orElse(new UserDistributeSubWaiting());
-								if (waiting.getId() != null) {
-									if (waiting.getSendStatus() == UserDistributeSubWaiting.Status.close) {
-										userDistributeSubWaitingMapper.update(null, Wrappers.lambdaUpdate(UserDistributeSubWaiting.class)
-												.set(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.waiting)
-												.eq(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.close)
-												.eq(UserDistributeSubWaiting::getId, waiting.getId()));
-									}
-								} else {
-									waiting.setMoney(userDistributeSubReward.getMoney());
-									waiting.setUserId(userId);
-									waiting.setSubUserId(subUserId);
-									waiting.setSendStatus(UserDistributeSubWaiting.Status.waiting);
-									waiting.setSendTime(DateUtil.offsetDay(DateTime.now(), 3));
-									waiting.setLevel(rewardLevel);
-									userDistributeSubWaitingMapper.insert(waiting);
+				for (UserDistributeSubRewards userDistributeSubReward : userDistributeSubRewards) {
+					log.info("当前级别:{}对应的目标金额是{}", userDistributeSubReward.getLevel(), userDistributeSubReward.getTargetAmount().divide(BigDecimal.valueOf(100)));
+					Integer rewardLevel = userDistributeSubReward.getLevel();
+					Integer months = userDistributeSubReward.getMonths();
+					BigDecimal targetAmount = userDistributeSubReward.getTargetAmount();
+					//是否达到目标额
+					BigDecimal subOrderMoney = Optional.ofNullable(orderDonMapper.selectSubChannelOrderMoney(subUserId, userDistributeSub.getCreatedTime(), DateUtil.offsetMonth(userDistributeSub.getCreatedTime(), months))).orElse(BigDecimal.ZERO);
+					if (subOrderMoney.compareTo(BigDecimal.ZERO) > 0 && subOrderMoney.compareTo(targetAmount) >= 0) {
+						try {
+							UserDistributeSubWaiting waiting = Optional.ofNullable(userDistributeSubWaitingMapper.selectOne(Wrappers.lambdaQuery(UserDistributeSubWaiting.class)
+									.eq(UserDistributeSubWaiting::getUserId, userId)
+									.eq(UserDistributeSubWaiting::getSubUserId, subUserId)
+									.eq(UserDistributeSubWaiting::getLevel, rewardLevel)
+									.last("limit 1"))).orElse(new UserDistributeSubWaiting());
+							if (waiting.getId() != null) {
+								if (waiting.getSendStatus() == UserDistributeSubWaiting.Status.close) {
+									userDistributeSubWaitingMapper.update(null, Wrappers.lambdaUpdate(UserDistributeSubWaiting.class)
+											.set(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.waiting)
+											.eq(UserDistributeSubWaiting::getSendStatus, UserDistributeSubWaiting.Status.close)
+											.eq(UserDistributeSubWaiting::getId, waiting.getId()));
 								}
-								log.info("分销用户:{}下级渠道:{}达到:{}销售额,发送奖励成功", userId, subUserId, UserDistributeSubRewards.RewardLevel.values()[rewardLevel].getMsg());
-							} catch (DuplicateKeyException e) {
+							} else {
+								waiting.setMoney(userDistributeSubReward.getMoney());
+								waiting.setUserId(userId);
+								waiting.setSubUserId(subUserId);
+								waiting.setSendStatus(UserDistributeSubWaiting.Status.waiting);
+								waiting.setSendTime(DateUtil.offsetDay(DateTime.now(), 3));
+								waiting.setLevel(rewardLevel);
+								userDistributeSubWaitingMapper.insert(waiting);
 							}
+							log.info("分销用户:{}下级渠道:{}达到:{}销售额,发送奖励成功", userId, subUserId, UserDistributeSubRewards.RewardLevel.values()[rewardLevel].getMsg());
+						} catch (DuplicateKeyException e) {
 						}
 					}
+				}
 			}
 
 		}
@@ -3480,13 +3581,22 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 			if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
 		}
-		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
-		int noPayCount = upgradeOrderDonMapper.selectCount(Wrappers.lambdaQuery(UpgradeOrderDon.class)
-				.in(UpgradeOrderDon::getUserId, userIdList)
-				.eq(UpgradeOrderDon::getRelationId, payRequest.getRelationId())
-				.eq(UpgradeOrderDon::getStatus, UpgradeOrderDon.Status.noPayment.toString()));
-		if (noPayCount > 0) {
-			throw new BusinessRuntimeException("您有未支付订单.");
+		if (payRequest.getCmt() == 1) {
+			List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
+			int noPayCount = upgradeOrderDonMapper.selectCount(Wrappers.lambdaQuery(UpgradeOrderDon.class)
+					.in(UpgradeOrderDon::getUserId, userIdList)
+					.eq(UpgradeOrderDon::getRelationId, payRequest.getRelationId())
+					.eq(UpgradeOrderDon::getStatus, UpgradeOrderDon.Status.noPayment.toString()));
+			if (noPayCount > 0) {
+				throw new BusinessRuntimeException("您有未支付订单.");
+			}
+		} else if (payRequest.getCmt() == 2) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, payRequest.getCustomId())
+					.last("limit 1"));
+			if (!userMirrorShop.getStatus()) {
+				throw BusinessRuntimeException.getInstance("店铺已关闭");
+			}
 		}
 		GroupsRelation groupsRelation = getGroupsRelation(payRequest.getUserId(), payRequest.getRelationId());
 		GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
@@ -3555,7 +3665,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					payRequest.setDonMoney(upgradePackage.getPrice());
 				}
 				MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, payRequest.getRelationId()));
-				if (midjourneyUser == null){
+				if (midjourneyUser == null) {
 					throw BusinessRuntimeException.getInstance("车票未激活Midjourney账号,请先激活");
 				}
 			}
@@ -3577,7 +3687,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			upgradeOrderDon.setType(UpgradeOrderDon.Type.ALI_PAY);
 			upgradeOrderDonMapper.insert(upgradeOrderDon);
 
-			deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest.getBalance(),user );
+			deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest.getBalance(), user);
 
 			if (upgradeOrderDon.getStatus() == UpgradeOrderDon.Status.noPayment) {
 				jobManager.addJob(EXPIRY_TIME, () -> {
@@ -3643,7 +3753,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	@Override
 	public AliPayParams aliPayUpgrade(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
-		return aliPayCommonService.unifiedPayUpgrade(re,productCode,qrPayMode);
+		return aliPayCommonService.unifiedPayUpgrade(re, productCode, qrPayMode);
 	}
 
 
@@ -3695,7 +3805,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 
 		//回调
-		unifiedHandlerUpgradeOrderNotify(orderDon,upgradePackage );
+		unifiedHandlerUpgradeOrderNotify(orderDon, upgradePackage);
 	}
 
 
@@ -3704,7 +3814,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	 */
 	public void unifiedHandlerUpgradeOrderNotify(UpgradeOrderDon orderDon, UpgradePackage upgradePackage) {
 		orderDon.setStatus(UpgradeOrderDon.Status.complete);
-		int isSuccess = upgradeOrderDonMapper.update(null,Wrappers.lambdaUpdate(UpgradeOrderDon.class)
+		int isSuccess = upgradeOrderDonMapper.update(null, Wrappers.lambdaUpdate(UpgradeOrderDon.class)
 				.set(UpgradeOrderDon::getStatus, orderDon.getStatus())
 				.in(UpgradeOrderDon::getStatus, List.of(UpgradeOrderDon.Status.noPayment, UpgradeOrderDon.Status.close))
 				.eq(UpgradeOrderDon::getId, orderDon.getId()));
@@ -3729,7 +3839,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				Object fastNum = redisService.get(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId());
 				if (fastNum == null) {
 					redisService.set(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(), midjourneyUser.getMjFastNum() + upgradePackage.getNum().longValue(), RedisService.key.MIDJOURNEY_FAST_LIMIT.getTimeout());
-				}else {
+				} else {
 					redisService.incr(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(), upgradePackage.getNum().longValue());
 				}
 			}
@@ -3848,7 +3958,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		return orderDon.getStatus();
 	}
 
-	private UpgradeOrderDon.Status updateUpgradeNoPayment(UpgradeOrderDon orderDon,UpgradePackage upgradePackage) {
+	private UpgradeOrderDon.Status updateUpgradeNoPayment(UpgradeOrderDon orderDon, UpgradePackage upgradePackage) {
 		unifiedHandlerUpgradeOrderNotify(orderDon, upgradePackage);
 		return orderDon.getStatus();
 	}
@@ -3856,13 +3966,13 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	@Override
 	public UpgradeOrderDetailView getUpgradeOrderDetail(Long orderId, Long userId) {
-			MapBuilder builder = MapUtils.builder()
-					.field(OrderDonView::getId, orderId)
-					.orderBy(OrderDonView::getId).desc();
-			if (userId != null) {
-				builder.field(UpgradeOrderDetailView::getUserId, userId);
-			}
-        return beanSearcher.searchFirst(UpgradeOrderDetailView.class, builder.build());
+		MapBuilder builder = MapUtils.builder()
+				.field(OrderDonView::getId, orderId)
+				.orderBy(OrderDonView::getId).desc();
+		if (userId != null) {
+			builder.field(UpgradeOrderDetailView::getUserId, userId);
+		}
+		return beanSearcher.searchFirst(UpgradeOrderDetailView.class, builder.build());
 	}
 
 
@@ -3877,13 +3987,22 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		User user = userMapper.selectById(userId);
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
-		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
-		int noPayCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
-				.in(OrderDon::getUserId, userIdList)
-				.eq(OrderDon::getRelationId, payRequest.getRelationId())
-				.eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
-		if (noPayCount > 0) {
-			throw new BusinessRuntimeException("您有未支付订单.");
+		if (payRequest.getCmt() == 1) {
+			List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, user);
+			int noPayCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+					.in(OrderDon::getUserId, userIdList)
+					.eq(OrderDon::getRelationId, payRequest.getRelationId())
+					.eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
+			if (noPayCount > 0) {
+				throw new BusinessRuntimeException("您有未支付订单.");
+			}
+		} else if (payRequest.getCmt() == 2) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, payRequest.getCustomId())
+					.last("limit 1"));
+			if (!userMirrorShop.getStatus()) {
+				throw BusinessRuntimeException.getInstance("店铺已关闭");
+			}
 		}
 		GroupsRelation groupsRelation = getGroupsRelation(payRequest.getUserId(), payRequest.getRelationId());
 		GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
@@ -3939,13 +4058,15 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		jobManager.addJob(EXPIRY_TIME, () -> {
 			closeOrder(orderDon.getId(), null);
 		});
+		//记录用户镜像店铺订单
+		recordUserMirrorShopOrderRelate(orderDon.getId(), payRequest.getUserId(), payRequest.getCmt(), payRequest.getCustomId());
 		return orderDon;
 	}
 
 	/**
 	 * 试用车票跳转购买正式车票订单记录
 	 */
-	public void recordOrderTrialTicketJumpPay(Long orderId,Boolean isTrial) {
+	public void recordOrderTrialTicketJumpPay(Long orderId, Boolean isTrial) {
 		if (isTrial != null && isTrial) {
 			UserTrialTicketJumpPayRecord userTrialTicketJumpPayRecord = new UserTrialTicketJumpPayRecord();
 			userTrialTicketJumpPayRecord.setOrderId(orderId);

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

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

@@ -0,0 +1,206 @@
+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.UserMirrorShopDistributeWaitingSendPointsMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopFeeOrderDonMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopSubUserMapper;
+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 com.cyksj.service.sys.SysConfigService;
+import com.cyksj.service.user.UserService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
+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 UserMirrorShopMapper userMirrorShopMapper;
+
+	private final UserService userService;
+
+	private final static Sequence SEQUENCE = new Sequence(0);
+
+	private final SysConfigService sysConfigService;
+
+	private final UserMirrorShopDistributeWaitingSendPointsMapper userMirrorShopDistributeWaitingSendPointsMapper;
+
+	private final UserMirrorShopSubUserMapper subUserMapper;
+
+	@Override
+	public UserMirrorShopFeeOrderDon submitOpenShop(UserMirrorShopSubmitReq shopSubmitReq) throws Exception {
+		Long userId = shopSubmitReq.getUserId();
+		String customId = shopSubmitReq.getCustomId();
+		User user = userMapper.selectById(userId);
+		Integer selectCount = feeOrderDonMapper.selectCount(Wrappers.lambdaQuery(UserMirrorShopFeeOrderDon.class)
+				.eq(UserMirrorShopFeeOrderDon::getUserId, userId)
+				.eq(UserMirrorShopFeeOrderDon::getStatus, UserMirrorShopFeeOrderDon.Status.hasPayment));
+		if (selectCount > 0) {
+			throw BusinessRuntimeException.getInstance("您已支付开店加盟费");
+		}
+		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.MIRROR_SHOP_COMMISSION)
+				.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.setUserId(userId);
+			userMirrorShopFeeOrderDon.setType(UserMirrorShopFeeOrderDon.Type.ALI_PAY);
+			userMirrorShopFeeOrderDon.setOpenId(user.getOpenId());
+			feeOrderDonMapper.insert(userMirrorShopFeeOrderDon);
+		}
+		UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getCustomId, customId)
+				.last("limit 1"));
+		if (userMirrorShop != null) {
+			userMirrorShopFeeOrderDon.setMpId(userMirrorShop.getId());
+		}
+		userMirrorShopFeeOrderDon.setMoney(fee);
+		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(UserMirrorShopFeeOrderDon.Status.noPayment) && !orderDon.getStatus().equals(UserMirrorShopFeeOrderDon.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);
+		orderDon.setStatus(UserMirrorShopFeeOrderDon.Status.hasPayment);
+		feeOrderDonMapper.updateById(orderDon);
+
+		try {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getUserId, orderDon.getUserId())
+					.last("limit 1"));
+			if (userMirrorShop == null) {
+				userMirrorShop = new UserMirrorShop();
+				userMirrorShop.setUserId(orderDon.getUserId());
+				userMirrorShop.setStatus(true);
+				userMirrorShop.setLogo(Constant.USER_MIRROR_SHOP_DEFAULT_LOGO);
+				userMirrorShopMapper.insert(userMirrorShop);
+				//获取customId
+				userService.getUserMirrorShopId(orderDon.getUserId());
+			} else {
+				if (!userMirrorShop.getStatus()) {
+					userMirrorShop.setStatus(true);
+					userMirrorShopMapper.updateById(userMirrorShop);
+				}
+			}
+		} catch (DuplicateKeyException e) {
+
+		}
+
+		if (orderDon.getMpId() != null) {
+			UserMirrorShop masterShop = userMirrorShopMapper.selectById(orderDon.getMpId());
+			if (masterShop == null) {
+				return;
+			}
+			log.info("用户:{}加盟店铺:{}订单:{}分销,发放提成", orderDon.getUserId(), masterShop.getName(), orderDon.getId());
+			SysConfig config = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.MIRROR_SHOP_COMMISSION)
+					.last("limit 1"));
+			UserMirrorShopDistributeConfigDto shopDistributeConfigDto = Jsons.parseObject(config.getSysValue(), UserMirrorShopDistributeConfigDto.class);
+			Integer feeRate = shopDistributeConfigDto.getFeeRate();
+			UserMirrorShopDistributeWaitingSendPoints waitingSendPoints = new UserMirrorShopDistributeWaitingSendPoints();
+			waitingSendPoints.setOrderId(orderDon.getId());
+			waitingSendPoints.setShopUserId(masterShop.getUserId());
+			waitingSendPoints.setSendStatus(UserMirrorShopDistributeWaitingSendPoints.Status.waiting);
+			waitingSendPoints.setMoney(BigDecimal.valueOf(feeRate).divide(BigDecimal.valueOf(100)).multiply(orderDon.getMoney()));
+			waitingSendPoints.setRate(feeRate);
+			waitingSendPoints.setUserId(orderDon.getUserId());
+			waitingSendPoints.setSendTime(DateUtil.offsetDay(orderDon.getPayTime(), 3));
+			waitingSendPoints.setType(2);
+			userMirrorShopDistributeWaitingSendPointsMapper.insert(waitingSendPoints);
+
+			UserMirrorShopSubUser shopSubUser = new UserMirrorShopSubUser();
+			shopSubUser.setUserId(masterShop.getUserId());
+			shopSubUser.setSubUserId(orderDon.getUserId());
+			shopSubUser.setOrderId(orderDon.getId());
+			subUserMapper.insert(shopSubUser);
+		}
+	}
+}

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

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/pay/TransferFuncService.java

@@ -4,6 +4,7 @@ import com.alipay.api.AlipayResponse;
 import com.cyksj.dto.Result;
 import com.cyksj.model.request.ApplyMoneyReq;
 import com.cyksj.model.request.TransferAccountsReq;
+import com.cyksj.model.request.UserMirrorShopApplyMoneyReq;
 import com.cyksj.model.request.YhShopApplyMoneyReq;
 
 /*
@@ -31,4 +32,6 @@ public interface TransferFuncService {
 	AlipayResponse transferAccounts(TransferAccountsReq transferAccountsReq) throws Exception;
 
 	Result<String> subApplyMoney(ApplyMoneyReq applyMoneyReq) throws Exception;
+
+	Result<String> userMirrorShopDistributeApply(UserMirrorShopApplyMoneyReq applyMoneyReq);
 }

+ 35 - 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,36 @@ 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);
+		//退款后重新支付
+		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);
+	}
 }

+ 118 - 0
netflix-service/src/main/java/com/cyksj/service/pay/impl/TransferFuncServiceImpl.java

@@ -29,11 +29,13 @@ import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeMoneyApplyMapper;
 import com.cyksj.mapper.manage.distribute.DistributePointsExchangeMoneyMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopDistributeMoneyApplyMapper;
 import com.cyksj.mapper.shop.YhShopDistributeMoneyApplyMapper;
 import com.cyksj.mapper.shop.YhShopMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.ApplyMoneyReq;
 import com.cyksj.model.request.TransferAccountsReq;
+import com.cyksj.model.request.UserMirrorShopApplyMoneyReq;
 import com.cyksj.model.request.YhShopApplyMoneyReq;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.distribute.UserDistributeReturnMoneyDetailService;
@@ -84,6 +86,8 @@ public class TransferFuncServiceImpl implements TransferFuncService {
 
 	private final UserDistributeReturnMoneyDetailService userDistributeReturnMoneyDetailService;
 
+	private final UserMirrorShopDistributeMoneyApplyMapper userMirrorShopDistributeMoneyApplyMapper;
+
 	@Override
 	public Result distributeApply(ApplyMoneyReq applyMoneyReq) throws Exception {
 		applyMoneyReq.setMType(DistributeMoneyApply.MType.ds);
@@ -166,6 +170,120 @@ public class TransferFuncServiceImpl implements TransferFuncService {
 		return commonApplyMoney(applyMoneyReq);
 	}
 
+	@Override
+	public Result<String> userMirrorShopDistributeApply(UserMirrorShopApplyMoneyReq applyMoneyReq) {
+		String type = "mirrorShop";
+		String key = String.format(RedisService.key.APPLY_MONEY_DAY_LIMIT_KEY.getName(), DateTime.now().toDateStr(), type, applyMoneyReq.getUserId());
+		if (!redisService.setNx(key, applyMoneyReq.getUserId(), RedisService.key.APPLY_MONEY_DAY_LIMIT_KEY.getTimeout())) {
+			throw BusinessRuntimeException.getInstance("每天仅可提现一次");
+		}
+		try {
+			Result result = userMirrorShopApplyMoney(applyMoneyReq);
+			if (result.isFlag()) {
+				redisService.set(key, applyMoneyReq.getUserId(), RedisService.key.APPLY_MONEY_DAY_LIMIT_KEY.getTimeout());
+			} else {
+				redisService.del(key);
+			}
+			return result;
+		} catch (Exception e) {
+			redisService.del(key);
+			throw BusinessRuntimeException.getInstance(StringUtil.getErrorMsg(e));
+		}
+	}
+
+	private Result userMirrorShopApplyMoney(UserMirrorShopApplyMoneyReq applyMoneyReq) throws Exception {
+		Long userId = applyMoneyReq.getUserId();
+		User user = userMapper.selectById(userId);
+		if (user == null) {
+			throw BusinessRuntimeException.getInstance("请先授权登录");
+		}
+		Boolean isTakeAll = applyMoneyReq.getIsTakeAll();
+		UserMirrorShopDistributeMoneyApply.Type type = applyMoneyReq.getType();
+		if (type == null) type = UserMirrorShopDistributeMoneyApply.Type.zfb;
+		if (type == UserMirrorShopDistributeMoneyApply.Type.zfb) {
+			if (ObjectUtil.hasEmpty(applyMoneyReq.getAccount(), applyMoneyReq.getRealName())) {
+				throw BusinessRuntimeException.getInstance("必填项不能为空");
+			}
+			if (applyMoneyReq.getAccount().length() > 255 || applyMoneyReq.getRealName().length() > 32) {
+				throw BusinessRuntimeException.getInstance("请输入正确的账户信息");
+			}
+		}
+		if (type == UserMirrorShopDistributeMoneyApply.Type.usdt) {
+			if (StrUtil.isEmpty(applyMoneyReq.getWalletAddr())) {
+				throw BusinessRuntimeException.getInstance("USDT提现钱包地址不能为空");
+			}
+			if (applyMoneyReq.getWalletAddr().length() > 1000) {
+				throw BusinessRuntimeException.getInstance("请输入正确的钱包地址");
+			}
+			if (StrUtil.isNotBlank(applyMoneyReq.getRemark()) && applyMoneyReq.getRemark().length() > 512) {
+				throw BusinessRuntimeException.getInstance("备注过多");
+			}
+			isTakeAll = true;
+
+		}
+		UserMirrorShopDistributeMoneyApply distributeMoneyApply = null;
+
+		BigDecimal needApplyMoney = user.getMpMoney();
+		BigDecimal fourHundred = BigDecimal.valueOf(4 * 10000);
+		if (isTakeAll == null || !isTakeAll) {
+			if (needApplyMoney.compareTo(fourHundred) > 0) {
+				needApplyMoney = fourHundred;
+			}
+		}
+		Integer update = userMapper.subUserMirrorShopMoney(user.getId(), user.getMpMoney(), needApplyMoney);
+		if (update == 1) {
+			distributeMoneyApply = Optional.ofNullable(distributeMoneyApply).orElse(new UserMirrorShopDistributeMoneyApply());
+			distributeMoneyApply.setUserId(userId);
+			distributeMoneyApply.setMoney(needApplyMoney);
+			distributeMoneyApply.setAccount(applyMoneyReq.getAccount());
+			distributeMoneyApply.setRealName(applyMoneyReq.getRealName());
+			distributeMoneyApply.setWalletAddr(applyMoneyReq.getWalletAddr());
+			distributeMoneyApply.setRemark(applyMoneyReq.getRemark());
+			distributeMoneyApply.setType(applyMoneyReq.getType());
+			if (isTakeAll != null && isTakeAll) {
+				distributeMoneyApply.setVerifyStatus(UserMirrorShopDistributeMoneyApply.Status.verifying);
+			} else {
+				TransferAccountsReq req = new TransferAccountsReq();
+				req.setMoney(needApplyMoney);
+				req.setAccount(applyMoneyReq.getAccount());
+				req.setName(applyMoneyReq.getRealName());
+				req.setChannelType(2);
+				req.setUserId(userId);
+				req.setRemark("镜像小店提现");
+				AlipayResponse alipayResponse = transferAccounts(req);
+				if (alipayResponse.isSuccess()) {
+					distributeMoneyApply.setVerifyStatus(UserMirrorShopDistributeMoneyApply.Status.success);
+				} else {
+					distributeMoneyApply.setVerifyStatus(UserMirrorShopDistributeMoneyApply.Status.fail);
+					distributeMoneyApply.setReason(alipayResponse.getSubMsg());
+					userBenefitsService.addMpMoney(userId, distributeMoneyApply.getMoney());
+					if (StrUtil.equals(alipayResponse.getSubCode(), "SECURITY_CHECK_FAILED")) {
+						return GatewayResponse.FAIL.newBuilder().setMsg("当前支付宝提现人数较多,请稍后再试").toResult();
+					}
+					if (alipayResponse.getSubMsg().contains("冻结")) {
+						return GatewayResponse.FAIL.newBuilder().setMsg("目前财务清账中,48小时后可提现").toResult();
+					}
+					if (alipayResponse.getSubMsg().contains("余额不足")) {
+						return GatewayResponse.FAIL.newBuilder().setMsg("转账失败,请联系客服").toResult();
+					}
+					return GatewayResponse.FAIL.newBuilder().setMsg(alipayResponse.getSubMsg()).toResult();
+				}
+			}
+			try {
+				userMirrorShopDistributeMoneyApplyMapper.insert(distributeMoneyApply);
+				//大额提现 超过400
+				if (envCommonService.isPrdEnv() && distributeMoneyApply.getVerifyStatus() == UserMirrorShopDistributeMoneyApply.Status.verifying && distributeMoneyApply.getMoney().compareTo(fourHundred) > 0) {
+					SmsUtil.sendLuoKey2Msg(Constant.ZK_MOBILE, "镜像小店有大额提现申请【银河录像局】");
+				}
+			} catch (Exception e) {
+				userBenefitsService.addMpMoney(userId, distributeMoneyApply.getMoney());
+				return GatewayResponse.FAIL.newBuilder().setMsg("网络错误,请重试").toResult();
+			}
+			return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply);
+		}
+		throw BusinessRuntimeException.getInstance("系统异常,请重新提交提现申请");
+	}
+
 	private AlipayRequest aliPayTransferAccountsRequest(String donNo, String account, String name, BigDecimal money, String remark) {
 		//支付宝转账
 		AlipayFundTransUniTransferRequest transUniTransferRequest = new AlipayFundTransUniTransferRequest();

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -18,7 +18,7 @@ import java.util.List;
  *创建时间:2022/12/29 15:42
  */
 public interface GroupRelationFrontService {
-	SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account);
+	SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account, Integer cmt);
 
 	Boolean isJoinCorpWx(Long userId, Boolean isJoin, Boolean noCoupon);
 

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

@@ -22,6 +22,7 @@ import com.cyksj.mapper.manage.distribute.DistributeGeneralSkuRateMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
 import com.cyksj.mapper.manage.distribute.UserPlatDistributeRateMapper;
 import com.cyksj.mapper.manage.distribute.UserPlatSkuDistributeRateMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
 import com.cyksj.mapper.renew.RenewUpgradePackageMapper;
 import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.model.entity.*;
@@ -155,8 +156,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final AccountMapper accountMapper;
 
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
 	@Override
-	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account) {
+	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account, Integer cmt) {
 		User u = userMapper.selectById(userId);
 		if (u == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 		if (u.getIsBlack()) {
@@ -164,6 +167,14 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		}
 		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
 		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (cmt != null && cmt == 2 && StrUtil.isNotBlank(customId)) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, customId)
+					.last("limit 1"));
+			if (userMirrorShop != null) {
+				builder.field(RenewalView::getCmt, cmt).field(RenewalView::getYhsId, userMirrorShop.getId());
+			}
+		}
 		//Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
 		DateTime now = DateTime.now();
 		if (StrUtil.isNotBlank(account)) {

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/shop/YhShopDistributeService.java

@@ -20,5 +20,5 @@ public interface YhShopDistributeService {
 	/**
 	 * 店铺分销 用户关系记录
 	 */
-	void saveDistributionInvitation(String customId, Long userId);
+	void saveDistributionInvitation(String customId, Long userId, Integer cmt);
 }

+ 21 - 1
netflix-service/src/main/java/com/cyksj/service/shop/impl/YhShopDistributeServiceImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopUserDistributeSharedMapper;
 import com.cyksj.mapper.shop.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.service.distribute.UserBusinessFrontService;
@@ -41,6 +43,10 @@ public class YhShopDistributeServiceImpl implements YhShopDistributeService {
 	private final GoodsDonMapper goodsDonMapper;
 
 	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final UserMirrorShopUserDistributeSharedMapper userMirrorShopUserDistributeSharedMapper;
 	@Override
 	public void distributeWaitingSendPointsRecord(OrderDon order) {
 		BigDecimal orderMoney = order.getMoney();
@@ -159,8 +165,22 @@ public class YhShopDistributeServiceImpl implements YhShopDistributeService {
 	}
 
 	@Override
-	public void saveDistributionInvitation(String customId, Long userId) {
+	public void saveDistributionInvitation(String customId, Long userId, Integer cmt) {
 		customId = customId.trim();
+		if (cmt != null && cmt == 2) {
+			UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+					.eq(UserMirrorShop::getCustomId, customId)
+					.last("limit 1"));
+			if (userMirrorShop != null && userMirrorShop.getStatus()) {
+				log.info("用户镜像店铺shopUserId:{}新用户uid:{}注册关联上下级", userMirrorShop.getUserId(), userId);
+				UserMirrorShopUserDistributeShared shopUserDistributeShared = new UserMirrorShopUserDistributeShared();
+				shopUserDistributeShared.setShopUserId(userMirrorShop.getUserId());
+				shopUserDistributeShared.setUserId(userId);
+				userMirrorShopUserDistributeSharedMapper.insert(shopUserDistributeShared);
+			}
+			return;
+		}
+
 		YhShop yhShop = yhShopMapper.selectOne(Wrappers.lambdaQuery(YhShop.class).eq(YhShop::getCustomId, customId).last("limit 1"));
 		if (yhShop.getVerifyStatus() != YhShop.Status.success) {
 			return;

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

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

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/user/UserIdentCertService.java

@@ -21,7 +21,7 @@ public interface UserIdentCertService {
 
 	Boolean checkCertRecord(long userId);
 
-	UserCertRecord getUserCertRecord(long userId);
+	UserCertRecord getUserCertRecord(long userId, String mappingId) throws Exception;
 
 	UserStudentCertRecord getUserStudentCertRecord(long userId);
 }

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

@@ -38,6 +38,13 @@ public interface UserService extends IService<User> {
      */
 	String getUserShowId(Long userId);
 
+	/**
+	 * 设置用户镜像店铺展示id
+	 * @param userId
+	 * @return
+	 */
+	String getUserMirrorShopId(Long userId);
+
 	/**
 	 * 根据showId 获取用户id
 	 */

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

@@ -185,6 +185,38 @@ 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;
+			}
+		}
+	}
+
+	@Override
+	public void deductUserMirrorShopTakeMoney(Long orderId, Long shopUserId, BigDecimal deductMoney) {
+		if (deductMoney.compareTo(BigDecimal.ZERO) <= 0) {
+			return;
+		}
+		while (true) {
+			User user = userMapper.selectById(shopUserId);
+			if (user == null) break;
+			BigDecimal mpMoney = user.getMpMoney();
+			Integer success = userMapper.subUserMirrorShopMoney(shopUserId, mpMoney, deductMoney);
+			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);

+ 14 - 1
netflix-service/src/main/java/com/cyksj/service/user/impl/UserIdentCertServiceImpl.java

@@ -72,7 +72,19 @@ public class UserIdentCertServiceImpl implements UserIdentCertService {
 	}
 
 	@Override
-	public UserCertRecord getUserCertRecord(long userId) {
+	public UserCertRecord getUserCertRecord(long userId, String mappingId) throws Exception {
+		if (StrUtil.isNotEmpty(mappingId)) {
+			//实名认证结果查询
+			String redirectParams = redisService.getStr(mappingId);
+			if (StrUtil.isNotBlank(redirectParams)) {
+				UserWxIndentDto userWxIndentDto = Jsons.parseObject(redirectParams, UserWxIndentDto.class);
+				try {
+					wxH5IndentCertResult(userWxIndentDto);
+				} catch (Exception e) {
+
+				}
+			}
+		}
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
 		UserCertRecord record = userCertRecordMapper.selectOne(Wrappers.lambdaQuery(UserCertRecord.class)
 				.in(UserCertRecord::getUserId, userIdList)
@@ -167,6 +179,7 @@ public class UserIdentCertServiceImpl implements UserIdentCertService {
 		userWxIndentDto.setRedirectUrl(redirectUrl);
 		userWxIndentDto.setBizToken(tokenResp.getBizToken());
 		redisService.set(mappingId.toString(), Jsons.toJson(userWxIndentDto), 60 * 60 * 24L);
+		tokenResp.setMappingId(mappingId.toString());
 		return tokenResp;
 	}
 

+ 22 - 2
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -23,6 +23,7 @@ import com.cyksj.mapper.corp.*;
 import com.cyksj.mapper.manage.cps.UserDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
 import com.cyksj.mapper.station.CollegeStudentStationUserRelateMapper;
 import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
@@ -127,6 +128,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
 	private final GroupRelationFrontService groupRelationFrontService;
 
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -207,7 +210,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		}
 		//店铺注册用户 关联
 		if (isNewUser && StrUtil.isNotBlank(customId)) {
-			yhShopDistributeService.saveDistributionInvitation(customId, user.getId());
+			yhShopDistributeService.saveDistributionInvitation(customId, user.getId(), re.getCmt());
 		}
 		Long userId = user.getId();
 		if (isNewUser && pid != null) {
@@ -387,6 +390,23 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		return showId;
 	}
 
+	@Override
+	public String getUserMirrorShopId(Long userId) {
+		Integer update = 0;
+		String showId = null;
+		while (update != 1) {
+			showId = StringUtil.randomString(5);
+			try {
+				update = userMirrorShopMapper.update(null, Wrappers.lambdaUpdate(UserMirrorShop.class)
+						.set(UserMirrorShop::getCustomId, showId)
+						.eq(UserMirrorShop::getUserId, userId));
+			} catch (DuplicateKeyException e) {
+				update = 0;
+			}
+		}
+		return showId;
+	}
+
 	@Override
 	public Long getUserIdByShowId(String showId) {
 		return userMapper.getUserIdByShowId(showId);
@@ -484,7 +504,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 			}
 			//店铺注册用户 关联
 			if (StrUtil.isNotBlank(customId)) {
-				yhShopDistributeService.saveDistributionInvitation(customId, user.getId());
+				yhShopDistributeService.saveDistributionInvitation(customId, user.getId(), loginReq.getCmt());
 			}
 			//缓存用户注册 回传信息
 			String callback = loginReq.getCallback();

+ 2 - 2
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -136,9 +136,9 @@ public class GroupRelationController {
     private final static Sequence SEQUENCE = new Sequence(0);
 
     @RequestMapping("/get/renewal")
-    public Result<SearchResult<RenewalView>> get(Boolean isLoginPopularize, String customId, String account) {
+    public Result<SearchResult<RenewalView>> get(Boolean isLoginPopularize, String customId, String account, Integer cmt) {
         long userId = StpUserUtil.getLoginIdAsLong();
-        SearchResult<RenewalView> list = groupRelationFrontService.getMyTicket(userId, isLoginPopularize, customId, account);
+        SearchResult<RenewalView> list = groupRelationFrontService.getMyTicket(userId, isLoginPopularize, customId, account, cmt);
         return GatewayResponse.SUCCESS.newBuilder().toResult(list);
     }
 

+ 39 - 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,26 @@ 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 == 6) {
+				//6.加盟订单
+				builder.put("tb", String.format(" inner join user_mirror_shop_order_relate umr on umr.order_id = o.id"));
+			}
+		}
+		if (userMirrorShopId != null) {
+			if (StrUtil.isNotEmpty(conditionSql)) {
+				conditionSql += " and ";
+			}
+			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 +324,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 +380,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 == 6) {
+				//6.加盟订单
+				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);
 		}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/shop/YhShopLoginController.java

@@ -93,7 +93,7 @@ public class YhShopLoginController {
 		StpYhShopManageUser.login(user.getId());
 		String yhShopToken = StpYhShopManageUser.getTokenValue();
 		JSONObject re = new JSONObject();
-		re.putOpt("satoken-yhShop", yhShopToken);
+		re.putOpt("satoken-ump", yhShopToken);
 		re.putOpt("img", user.getHeadimgurl());
 		re.putOpt("nickname", user.getNickname());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(re.toString());

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

@@ -0,0 +1,234 @@
+package com.cyksj.web.controller.manage.mirrorshop;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.exception.BusinessRuntimeException;
+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.entity.UserMirrorShopDistributeMoneyApply;
+import com.cyksj.model.request.DistributeApplyMoneyReq;
+import com.cyksj.model.request.UserMirrorShopInfoApplyReq;
+import com.cyksj.model.views.*;
+import com.cyksj.service.mange.statistics.StatisticsDataService;
+import com.cyksj.service.mange.usermirror.UserMirrorCommonService;
+import com.cyksj.web.util.StpCpsManageUser;
+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.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * admin/镜像店铺
+ * 项目名: 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;
+
+	private final StatisticsDataService statisticsDataService;
+
+
+	/**
+	 * 店铺列表
+	 */
+	@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();
+	}
+
+	/**
+	 * 店铺申请修改记录列表
+	 */
+	@GetMapping("/get/apply/info/list")
+	public Result<SearchResult<UserMirrorShopApplyInfoView>> getUserShopApply() {
+		SearchResult<UserMirrorShopApplyInfoView> search = beanSearcher.search(UserMirrorShopApplyInfoView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 店铺审核修改店铺信息
+	 */
+	@PutMapping("/verify")
+	public Result<String> verifyYhShopApply(@RequestBody UserMirrorShopInfoApplyReq applyReq) {
+		userMirrorCommonService.verifyUserMIrrorShopApply(applyReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 一键审核店铺信息
+	 */
+	@PutMapping("/batch/verify")
+	public Result<String> batchVerify(@RequestBody UserMirrorShopInfoApplyReq verifyReq) {
+		List<Long> ids = verifyReq.getIds();
+		if (CollUtil.isEmpty(ids)) {
+			throw BusinessRuntimeException.getInstance("请选择对应的审核记录");
+		}
+		ids.forEach(id -> {
+			verifyReq.setId(id);
+			userMirrorCommonService.verifyUserMIrrorShopApply(verifyReq);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 店铺头部数据
+	 */
+	@GetMapping("/get/head/data")
+	public Result<BackgroundDataView> getHeadData(Long startTime, Long endTime) {
+		BackgroundDataView backgroundDataView = new BackgroundDataView();
+		Date startDate = null;
+		Date endDate = null;
+		if (startTime != null) {
+			startDate = DateUtil.date(startTime);
+		}
+		if (endTime != null) {
+			endDate = DateUtil.date(endTime);
+		}
+		//分销金额数据统计
+		statisticsDataService.userMirrorShopDistribute(backgroundDataView, startDate, endDate);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(backgroundDataView);
+	}
+
+	/**
+	 * 提现列表
+	 */
+	@GetMapping("/get/applyMoney/list")
+	public Result<SearchResult<UserMirrorShopDistributeMoneyApply>> getApplyMoneyList() {
+		long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
+		SearchResult<UserMirrorShopDistributeMoneyApply> search = beanSearcher.search(UserMirrorShopDistributeMoneyApply.class,
+				MapUtils.flatBuilder(request.getParameterMap())
+						.field(UserMirrorShopDistributeMoneyApply::getUserId, cpsUserId)
+						.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}

+ 180 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorNoticeController.java

@@ -0,0 +1,180 @@
+package com.cyksj.web.controller.manage.mirrorshop.manage;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.MirrorNoticeMapper;
+import com.cyksj.mapper.mirrorshop.MirrorNoticeUserMapper;
+import com.cyksj.mapper.mirrorshop.MirrorNoticeUserReviewRecordMapper;
+import com.cyksj.model.entity.MirrorNotice;
+import com.cyksj.model.entity.MirrorNoticeUser;
+import com.cyksj.model.entity.MirrorNoticeUserReviewRecord;
+import com.cyksj.model.request.BatchIdsReq;
+import com.cyksj.service.mange.RefreshCacheService;
+import com.cyksj.web.util.StpUserMirrorShopManageUser;
+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.dao.DuplicateKeyException;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
+
+/**
+ * admin/镜像店铺后台/公告
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorAdvertiseController
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 12:04
+ */
+@RestController
+@RequestMapping("/mirrorShop/manage/notice")
+@RequiredArgsConstructor
+public class CmsUserMirrorNoticeController {
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final MirrorNoticeUserMapper noticeUserMapper;
+
+	private final RefreshCacheService refreshCacheService;
+
+	private final MirrorNoticeMapper mirrorNoticeMapper;
+
+	private final MirrorNoticeUserReviewRecordMapper mirrorNoticeUserReviewRecordMapper;
+
+	/**
+	 * 店铺公告列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult> get(@RequestParam(defaultValue = "1") Boolean self) {
+		long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (self) {
+			SearchResult<MirrorNoticeUser> search = beanSearcher.search(MirrorNoticeUser.class, builder.field(MirrorNoticeUser::getUserId, userId).orderBy(MirrorNoticeUser::getUpdateTime).desc().build());
+			return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+		}
+		builder.put("ruid", String.format(" and myr.user_id = %s", userId));
+		SearchResult<MirrorNotice> search = beanSearcher.search(MirrorNotice.class, builder.orderBy(MirrorNotice::getUpdateTime).desc().build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 新增店铺公告
+	 */
+	@PostMapping("/post")
+	public Result<String> post(@RequestBody MirrorNoticeUser notice) {
+		long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		notice.setUserId(userId);
+		noticeUserMapper.insert(notice);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 编辑店铺公告
+	 */
+	@PutMapping("/update")
+	public Result<String> update(@RequestBody MirrorNoticeUser notice) {
+		Long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		MirrorNoticeUser byId = noticeUserMapper.selectById(notice.getId());
+		if (byId == null || !ObjectUtil.equal(userId, byId.getUserId())) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		noticeUserMapper.updateById(notice);
+		refreshCacheService.refreshUserMirrorShopAdvertiseCache(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 上下架店铺公告
+	 */
+	@PutMapping("/update/status/{id}")
+	public Result<String> updateStatusById(@PathVariable Long id) {
+		Long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		Optional.ofNullable(noticeUserMapper.selectById(id))
+				.ifPresent(en -> {
+					en.setStatus(!en.getStatus());
+					noticeUserMapper.updateById(en);
+					refreshCacheService.refreshUserMirrorShopAdvertiseCache(userId);
+				});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 删除店铺公告
+	 */
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteById(@PathVariable Long id) {
+		Long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		noticeUserMapper.delete(Wrappers.lambdaQuery(MirrorNoticeUser.class)
+				.eq(MirrorNoticeUser::getId, id)
+				.eq(MirrorNoticeUser::getUserId, userId));
+		refreshCacheService.refreshUserMirrorShopAdvertiseCache(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 标记公告已读
+	 */
+	@PostMapping("/mark/{id}")
+	public Result<String> markNotice(@PathVariable Long id) {
+		Long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		MirrorNoticeUserReviewRecord mirrorNoticeUserReviewRecord = Optional.ofNullable(mirrorNoticeUserReviewRecordMapper.selectOne(Wrappers.lambdaQuery(MirrorNoticeUserReviewRecord.class)
+				.eq(MirrorNoticeUserReviewRecord::getNoticeId, id)
+				.eq(MirrorNoticeUserReviewRecord::getUserId, userId)
+				.last("limit 1"))).orElse(new MirrorNoticeUserReviewRecord());
+
+		try {
+			if (mirrorNoticeUserReviewRecord.getId() == null) {
+				mirrorNoticeUserReviewRecord.setNoticeId(id);
+				mirrorNoticeUserReviewRecord.setUserId(userId);
+				mirrorNoticeUserReviewRecordMapper.insert(mirrorNoticeUserReviewRecord);
+			}
+		} catch (DuplicateKeyException e) {
+
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 批量同步银河后台公告
+	 */
+	@PostMapping("/sync/background/notice")
+	public Result<String> syncBackgroundNotice(@RequestBody @Validated BatchIdsReq batchIdsReq) {
+		Long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		mirrorNoticeMapper.selectBatchIds(batchIdsReq.getIds()).forEach(backNotice -> {
+			MirrorNoticeUser mirrorNoticeUser = noticeUserMapper.selectOne(Wrappers.lambdaQuery(MirrorNoticeUser.class)
+					.eq(MirrorNoticeUser::getNoticeId, backNotice.getId())
+					.eq(MirrorNoticeUser::getUserId, userId)
+					.last("limit 1"));
+			if (mirrorNoticeUser == null) {
+				try {
+					mirrorNoticeUser = new MirrorNoticeUser();
+					mirrorNoticeUser.setNoticeId(backNotice.getId());
+					mirrorNoticeUser.setPlatform(backNotice.getPlatform());
+					mirrorNoticeUser.setTitle(backNotice.getTitle());
+					mirrorNoticeUser.setText(backNotice.getText());
+					mirrorNoticeUser.setUserId(userId);
+					noticeUserMapper.insert(mirrorNoticeUser);
+
+					MirrorNoticeUserReviewRecord mirrorNoticeUserReviewRecord = new MirrorNoticeUserReviewRecord();
+					mirrorNoticeUserReviewRecord.setNoticeId(backNotice.getId());
+					mirrorNoticeUserReviewRecord.setUserId(userId);
+					mirrorNoticeUserReviewRecordMapper.insert(mirrorNoticeUserReviewRecord);
+				} catch (DuplicateKeyException e) {
+
+				}
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 158 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/mirrorshop/manage/CmsUserMirrorShopController.java

@@ -0,0 +1,158 @@
+package com.cyksj.web.controller.manage.mirrorshop.manage;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserCertRecordMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopApplyRecordMapper;
+import com.cyksj.mapper.mirrorshop.UserMirrorShopMapper;
+import com.cyksj.model.entity.UserCertRecord;
+import com.cyksj.model.entity.UserMirrorShop;
+import com.cyksj.model.entity.UserMirrorShopApplyRecord;
+import com.cyksj.model.request.UserMirrorShopApplyMoneyReq;
+import com.cyksj.model.views.UserMirrorShopApplyInfoView;
+import com.cyksj.service.mirrorshop.CmsUserMirrorShopService;
+import com.cyksj.web.util.StpUserMirrorShopManageUser;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * admin/镜像店铺后台/店铺设置
+ * 项目名: yhlxj2
+ * 文件名: CmsUserMirrorShopController
+ * 创建者: JavaZou
+ * 创建时间:2024/11/7 16:10
+ */
+@RestController
+@RequestMapping("/mirrorShop/manage")
+@RequiredArgsConstructor
+public class CmsUserMirrorShopController {
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final UserMirrorShopMapper userMirrorShopMapper;
+
+	private final UserMirrorShopApplyRecordMapper userMirrorShopApplyRecordMapper;
+
+	private final CmsUserMirrorShopService cmsUserMirrorShopService;
+
+	private final UserCertRecordMapper userCertRecordMapper;
+
+	/**
+	 * 店铺 信息详情
+	 */
+	@GetMapping("/get/shop/detail/data")
+	public Result<UserMirrorShop> getShopDetail() {
+		long yhShopUserId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		UserMirrorShop detailView = beanSearcher.searchFirst(UserMirrorShop.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(UserMirrorShop::getUserId, yhShopUserId)
+				.build());
+		UserMirrorShopApplyInfoView userMirrorShopApplyInfoView = beanSearcher.searchFirst(UserMirrorShopApplyInfoView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(UserMirrorShopApplyInfoView::getUserId, yhShopUserId).orderBy(UserMirrorShopApplyInfoView::getId).desc().build());
+		detailView.setApplyInfoView(userMirrorShopApplyInfoView);
+
+		UserMirrorShopApplyRecord userMirrorShopApplyRecord = userMirrorShopApplyRecordMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShopApplyRecord.class)
+				.eq(UserMirrorShopApplyRecord::getUserId, yhShopUserId)
+				.ne(UserMirrorShopApplyRecord::getVerifyStatus, UserMirrorShopApplyRecord.Status.fail)
+				.orderByDesc(UserMirrorShopApplyRecord::getId)
+				.last("limit 1"));
+		if (userMirrorShopApplyRecord != null) {
+			detailView.setModifyTime(userMirrorShopApplyRecord.getCreatedTime());
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult(detailView);
+	}
+
+	/**
+	 * 设置联系方式
+	 */
+	@PutMapping("/set/shop/contact")
+	public Result<String> setShopContact(@RequestBody UserMirrorShop yhShop) {
+		long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		String contact = yhShop.getContact();
+		UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, userId).last("limit 1"));
+		if (userMirrorShop == null) {
+			throw BusinessRuntimeException.getInstance("店铺不存在");
+		}
+		userMirrorShop.setContact(contact);
+		userMirrorShopMapper.updateById(userMirrorShop);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 申请修改
+	 */
+	@PutMapping("/update/shop")
+	@Transactional(rollbackFor = Throwable.class)
+	public Result<String> updateShop(@RequestBody UserMirrorShopApplyRecord record) {
+		long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		UserMirrorShop userMirrorShop = userMirrorShopMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShop.class)
+				.eq(UserMirrorShop::getUserId, userId).last("limit 1"));
+		String name = record.getName();
+		if (userMirrorShop == null) {
+			throw BusinessRuntimeException.getInstance("店铺不存在");
+		}
+		if (StrUtil.isEmpty(name)) {
+			throw BusinessRuntimeException.getInstance("请输入申请修改的店铺名");
+		}
+		//是否存在正在修改的提交记录
+		UserMirrorShopApplyRecord userMirrorShopApplyRecord = userMirrorShopApplyRecordMapper.selectOne(Wrappers.lambdaQuery(UserMirrorShopApplyRecord.class)
+				.eq(UserMirrorShopApplyRecord::getUserId, userId)
+				.eq(UserMirrorShopApplyRecord::getVerifyStatus, UserMirrorShopApplyRecord.Status.verify).last("limit 1"));
+
+		if (userMirrorShopApplyRecord != null) {
+			throw BusinessRuntimeException.getInstance("您提交的修改申请正在审核中..");
+		}
+		//三个月可修改一次
+		Integer count = userMirrorShopApplyRecordMapper.selectCount(Wrappers.lambdaQuery(UserMirrorShopApplyRecord.class)
+				.eq(UserMirrorShopApplyRecord::getUserId, userId)
+				.isNull(UserMirrorShopApplyRecord::getCustomId)
+				.eq(UserMirrorShopApplyRecord::getVerifyStatus, UserMirrorShopApplyRecord.Status.success)
+				.ge(UserMirrorShopApplyRecord::getCreatedTime, DateUtil.offsetMonth(DateTime.now(), -3)));
+		if (count > 0) {
+			throw BusinessRuntimeException.getInstance("近三个月只可修改一次");
+		}
+		userMirrorShopApplyRecord = new UserMirrorShopApplyRecord();
+		userMirrorShopApplyRecord.setVerifyStatus(UserMirrorShopApplyRecord.Status.verify);
+		userMirrorShopApplyRecord.setName(name);
+		userMirrorShopApplyRecord.setLogo(record.getLogo());
+		userMirrorShopApplyRecord.setUserId(userId);
+		userMirrorShopApplyRecordMapper.insert(userMirrorShopApplyRecord);
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 申请 提现
+	 */
+	@PostMapping("/apply/money")
+	public Result<String> yhShopApplyMoney(@RequestBody UserMirrorShopApplyMoneyReq applyMoneyReq) throws Exception {
+		long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		applyMoneyReq.setUserId(userId);
+		return cmsUserMirrorShopService.applyMoney(applyMoneyReq);
+	}
+
+
+	/**
+	 * 身份认证信息
+	 */
+	@GetMapping("/get/cert/info")
+	public Result<UserCertRecord> getCertInfo() {
+		long userId = StpUserMirrorShopManageUser.getLoginIdAsLong();
+		UserCertRecord record = userCertRecordMapper.selectOne(Wrappers.lambdaQuery(UserCertRecord.class)
+				.eq(UserCertRecord::getUserId, userId)
+				.last("limit 1"));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(record);
+	}
+}

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor