Bläddra i källkod

Merge remote-tracking branch 'origin/master'

gaohp 1 år sedan
förälder
incheckning
f3d21a903f
42 ändrade filer med 600 tillägg och 146 borttagningar
  1. 40 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/CategoryEnum.java
  2. 5 1
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java
  3. 4 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  4. 6 0
      feifan-module-distri/feifan-module-distri-biz/pom.xml
  5. 28 24
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/AppShareLinkController.java
  6. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkPageReqVO.java
  7. 19 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkReqVO.java
  8. 3 5
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkRespVO.java
  9. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkResultVO.java
  10. 3 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkSaveReqVO.java
  11. 15 13
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/AppShareLinkRegisterController.java
  12. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterPageReqVO.java
  13. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterRespVO.java
  14. 5 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterSaveReqVO.java
  15. 24 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/sharepath/SharePathDO.java
  16. 9 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelink/ShareLinkMapper.java
  17. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelinkregister/ShareLinkRegisterMapper.java
  18. 35 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/shareLinkRegister/AddShareLinkRegisterConsumer.java
  19. 13 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/sharePath/AddSharePathConsumer.java
  20. 31 9
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelink/ShareLinkService.java
  21. 109 8
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelink/ShareLinkServiceImpl.java
  22. 6 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelinkregister/ShareLinkRegisterService.java
  23. 28 8
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelinkregister/ShareLinkRegisterServiceImpl.java
  24. 28 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java
  25. 7 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java
  26. 1 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
  27. 4 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
  28. 9 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java
  29. 3 3
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  30. 24 6
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  31. 13 0
      feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/message/share/ShareLinkRegisterCreateMessage.java
  32. 7 4
      feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/message/share/SharePathCreateMessage.java
  33. 1 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/AppAuthController.java
  34. 10 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java
  35. 9 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java
  36. 1 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/SocialLoginValidateSmsCodeReqVO.java
  37. 29 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/mq/producer/shareLinkRegister/ShareLinkRegisterProducer.java
  38. 4 4
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/mq/producer/sharePath/SharePathProducer.java
  39. 4 4
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/auth/MemberAuthServiceImpl.java
  40. 6 4
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java
  41. 26 13
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java
  42. 11 8
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

+ 40 - 0
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/CategoryEnum.java

@@ -0,0 +1,40 @@
+package cn.newfeifan.mall.framework.common.enums;
+
+import cn.hutool.core.util.ObjUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum CategoryEnum {
+    /**
+     * 商城
+     */
+    MALL(1, "商城"),
+
+    /**
+     * 店铺
+     */
+    SHOP(2, "店铺"),
+
+    /**
+     * 商品
+     */
+    PRODUCT(3, "商品");
+
+    private final int category;
+    private final String name;
+
+
+    public static boolean isMall(Integer category) {
+        return ObjUtil.equal(MALL.category, category);
+    }
+
+    public static boolean isShop(Integer category) {
+        return ObjUtil.equal(SHOP.category, category);
+    }
+
+    public static boolean isProduct(Integer category) {
+        return ObjUtil.equal(PRODUCT.category, category);
+    }
+}

+ 5 - 1
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java

@@ -4,7 +4,11 @@ import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 
 public class DistriConstants {
     // ========== 分销信息商户信息 1-002-029-000 ==========
-    public static final Integer PERCENT = 10000;
+    public static final Integer PERCENT = 10000;//积分数据库中的值,比页面显示的值,大了此倍数
+
+    // 数据库中,积分比金钱大的倍数
+    public static final Integer INTEGRAL2MONEY = PERCENT/100;
+
     public static final Double ONE_HUNDRED = 1d;
 
 }

+ 4 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java

@@ -21,4 +21,8 @@ public interface ErrorCodeConstants {
     ErrorCode PERCENT_LARGE_ONE_HUNDRED = new ErrorCode(1_002_030_014, "百分比总和超过100");
     ErrorCode HAS_PARENT = new ErrorCode(1_002_030_015, "该直推人已经有推荐人, 故不能增加");
 
+    // ========== 分享链接信息 1-003-030-000 ==========
+    ErrorCode SHARE_LINK_NOT_EXISTS = new ErrorCode(1_003_031_001, "分享链接不存在");
+    ErrorCode SHARE_LINK_REGISTER_NOT_EXISTS = new ErrorCode(1_003_031_002, "通过分享链接,新注册用户不存在");
+
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/pom.xml

@@ -113,5 +113,11 @@
             <groupId>cn.newfeifan.zx</groupId>
             <artifactId>feifan-spring-boot-starter-biz-ip</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-sale-biz</artifactId>
+            <version>2.0.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 28 - 24
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelink/ShareLinkController.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/AppShareLinkController.java

@@ -1,9 +1,11 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelink;
+package cn.newfeifan.mall.module.distri.controller.app.sharelink;
 
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.*;
 import org.springframework.web.bind.annotation.*;
+
 import javax.annotation.Resource;
+
 import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Operation;
@@ -17,37 +19,36 @@ import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.CommonResult;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 
 import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
 
 import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
 
-import cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelink.ShareLinkDO;
 import cn.newfeifan.mall.module.distri.service.sharelink.ShareLinkService;
 
-@Tag(name = "管理后台 - 分享链接")
+@Tag(name = "用户 APP - 分享链接")
 @RestController
 @RequestMapping("/distri/share-link")
 @Validated
-public class ShareLinkController {
+public class AppShareLinkController {
 
     @Resource
     private ShareLinkService shareLinkService;
 
     @PostMapping("/create")
     @Operation(summary = "创建分享链接")
-    @PreAuthorize("@ss.hasPermission('distri:share-link:create')")
-    public CommonResult<Long> createShareLink(@Valid @RequestBody ShareLinkSaveReqVO createReqVO) {
+    public CommonResult<Long> createShareLink(@Valid @RequestBody AppShareLinkSaveReqVO createReqVO) {
         return success(shareLinkService.createShareLink(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新分享链接")
-    @PreAuthorize("@ss.hasPermission('distri:share-link:update')")
-    public CommonResult<Boolean> updateShareLink(@Valid @RequestBody ShareLinkSaveReqVO updateReqVO) {
+    public CommonResult<Boolean> updateShareLink(@Valid @RequestBody AppShareLinkSaveReqVO updateReqVO) {
         shareLinkService.updateShareLink(updateReqVO);
         return success(true);
     }
@@ -55,40 +56,43 @@ public class ShareLinkController {
     @DeleteMapping("/delete")
     @Operation(summary = "删除分享链接")
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('distri:share-link:delete')")
     public CommonResult<Boolean> deleteShareLink(@RequestParam("id") Long id) {
         shareLinkService.deleteShareLink(id);
         return success(true);
     }
 
-    @GetMapping("/get")
+    @GetMapping("/getShareLink")
     @Operation(summary = "获得分享链接")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('distri:share-link:query')")
-    public CommonResult<ShareLinkRespVO> getShareLink(@RequestParam("id") Long id) {
-        ShareLinkDO shareLink = shareLinkService.getShareLink(id);
-        return success(BeanUtils.toBean(shareLink, ShareLinkRespVO.class));
+    public CommonResult<AppShareLinkResultVO> getShareLink(AppShareLinkReqVO appShareLinkReqVO) {
+        String id = shareLinkService.getShareLink(appShareLinkReqVO);
+        return success(AppShareLinkResultVO.builder()
+                .linkId(id).build()
+        );
     }
 
     @GetMapping("/page")
     @Operation(summary = "获得分享链接分页")
-    @PreAuthorize("@ss.hasPermission('distri:share-link:query')")
-    public CommonResult<PageResult<ShareLinkRespVO>> getShareLinkPage(@Valid ShareLinkPageReqVO pageReqVO) {
+    public CommonResult<PageResult<AppShareLinkRespVO>> getShareLinkPage(@Valid AppShareLinkPageReqVO pageReqVO) {
         PageResult<ShareLinkDO> pageResult = shareLinkService.getShareLinkPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, ShareLinkRespVO.class));
+        return success(BeanUtils.toBean(pageResult, AppShareLinkRespVO.class));
     }
 
     @GetMapping("/export-excel")
     @Operation(summary = "导出分享链接 Excel")
-    @PreAuthorize("@ss.hasPermission('distri:share-link:export')")
     @OperateLog(type = EXPORT)
-    public void exportShareLinkExcel(@Valid ShareLinkPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
+    public void exportShareLinkExcel(@Valid AppShareLinkPageReqVO pageReqVO,
+                                     HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         List<ShareLinkDO> list = shareLinkService.getShareLinkPage(pageReqVO).getList();
         // 导出 Excel
-        ExcelUtils.write(response, "分享链接.xls", "数据", ShareLinkRespVO.class,
-                        BeanUtils.toBean(list, ShareLinkRespVO.class));
+        ExcelUtils.write(response, "分享链接.xls", "数据", AppShareLinkRespVO.class,
+                BeanUtils.toBean(list, AppShareLinkRespVO.class));
+    }
+
+    @GetMapping("/getObjectIdByLinkId")
+    @Operation(summary = "通过链接编号获取对应的类型编号")
+    public CommonResult<Long> getObjectIdByLinkId(String linkId) {
+        return success(shareLinkService.getObjectIdByLinkId(Long.parseLong(linkId,16)));
     }
 
 }

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelink/vo/ShareLinkPageReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkPageReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo;
+package cn.newfeifan.mall.module.distri.controller.app.sharelink.vo;
 
 import lombok.*;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -12,7 +12,7 @@ import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class ShareLinkPageReqVO extends PageParam {
+public class AppShareLinkPageReqVO extends PageParam {
 
     @Schema(description = "链接名称", example = "赵六")
     private String name;

+ 19 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkReqVO.java

@@ -0,0 +1,19 @@
+package cn.newfeifan.mall.module.distri.controller.app.sharelink.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+
+@Schema(description = "管理后台 - 分享链接分页 Request VO")
+@Data
+@ToString(callSuper = true)
+public class AppShareLinkReqVO {
+
+    @Schema(description = "分享链接类型编码:1.商城,2.店铺,3.商品")
+    private Integer category;
+
+    @Schema(description = "链接对应业务对象id:如果“链接类型”是3=商品,这个id就是商品的spu表的id,即product_spu.id值。", example = "22758")
+    private Long objectId;
+
+}

+ 3 - 5
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelink/vo/ShareLinkRespVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkRespVO.java

@@ -1,17 +1,15 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo;
+package cn.newfeifan.mall.module.distri.controller.app.sharelink.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
-import java.util.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+
 import java.time.LocalDateTime;
 import com.alibaba.excel.annotation.*;
 
 @Schema(description = "管理后台 - 分享链接 Response VO")
 @Data
 @ExcelIgnoreUnannotated
-public class ShareLinkRespVO {
+public class AppShareLinkRespVO {
 
     @Schema(description = "分享链接id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20538")
     @ExcelProperty("分享链接id")

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkResultVO.java

@@ -0,0 +1,12 @@
+package cn.newfeifan.mall.module.distri.controller.app.sharelink.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 链接结果 result VO")
+@Data
+@Builder
+public class AppShareLinkResultVO {
+    private String linkId;
+}

+ 3 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelink/vo/ShareLinkSaveReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkSaveReqVO.java

@@ -1,13 +1,13 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo;
+package cn.newfeifan.mall.module.distri.controller.app.sharelink.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
-import java.util.*;
+
 import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 分享链接新增/修改 Request VO")
 @Data
-public class ShareLinkSaveReqVO {
+public class AppShareLinkSaveReqVO {
 
     @Schema(description = "分享链接id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20538")
     private Long id;

+ 15 - 13
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelinkregister/ShareLinkRegisterController.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/AppShareLinkRegisterController.java

@@ -1,5 +1,8 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister;
+package cn.newfeifan.mall.module.distri.controller.app.sharelinkregister;
 
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterRespVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterSaveReqVO;
 import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -24,15 +27,14 @@ import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
 import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
 
-import cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelinkregister.ShareLinkRegisterDO;
 import cn.newfeifan.mall.module.distri.service.sharelinkregister.ShareLinkRegisterService;
 
-@Tag(name = "管理后台 - 通过分享链接,新注册用户")
+@Tag(name = "用户 APP - 通过分享链接,新注册用户")
 @RestController
 @RequestMapping("/distri/share-link-register")
 @Validated
-public class ShareLinkRegisterController {
+public class AppShareLinkRegisterController {
 
     @Resource
     private ShareLinkRegisterService shareLinkRegisterService;
@@ -40,14 +42,14 @@ public class ShareLinkRegisterController {
     @PostMapping("/create")
     @Operation(summary = "创建通过分享链接,新注册用户")
     @PreAuthorize("@ss.hasPermission('distri:share-link-register:create')")
-    public CommonResult<Long> createShareLinkRegister(@Valid @RequestBody ShareLinkRegisterSaveReqVO createReqVO) {
+    public CommonResult<Long> createShareLinkRegister(@Valid @RequestBody AppShareLinkRegisterSaveReqVO createReqVO) {
         return success(shareLinkRegisterService.createShareLinkRegister(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新通过分享链接,新注册用户")
     @PreAuthorize("@ss.hasPermission('distri:share-link-register:update')")
-    public CommonResult<Boolean> updateShareLinkRegister(@Valid @RequestBody ShareLinkRegisterSaveReqVO updateReqVO) {
+    public CommonResult<Boolean> updateShareLinkRegister(@Valid @RequestBody AppShareLinkRegisterSaveReqVO updateReqVO) {
         shareLinkRegisterService.updateShareLinkRegister(updateReqVO);
         return success(true);
     }
@@ -65,30 +67,30 @@ public class ShareLinkRegisterController {
     @Operation(summary = "获得通过分享链接,新注册用户")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('distri:share-link-register:query')")
-    public CommonResult<ShareLinkRegisterRespVO> getShareLinkRegister(@RequestParam("id") Long id) {
+    public CommonResult<AppShareLinkRegisterRespVO> getShareLinkRegister(@RequestParam("id") Long id) {
         ShareLinkRegisterDO shareLinkRegister = shareLinkRegisterService.getShareLinkRegister(id);
-        return success(BeanUtils.toBean(shareLinkRegister, ShareLinkRegisterRespVO.class));
+        return success(BeanUtils.toBean(shareLinkRegister, AppShareLinkRegisterRespVO.class));
     }
 
     @GetMapping("/page")
     @Operation(summary = "获得通过分享链接,新注册用户分页")
     @PreAuthorize("@ss.hasPermission('distri:share-link-register:query')")
-    public CommonResult<PageResult<ShareLinkRegisterRespVO>> getShareLinkRegisterPage(@Valid ShareLinkRegisterPageReqVO pageReqVO) {
+    public CommonResult<PageResult<AppShareLinkRegisterRespVO>> getShareLinkRegisterPage(@Valid AppShareLinkRegisterPageReqVO pageReqVO) {
         PageResult<ShareLinkRegisterDO> pageResult = shareLinkRegisterService.getShareLinkRegisterPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, ShareLinkRegisterRespVO.class));
+        return success(BeanUtils.toBean(pageResult, AppShareLinkRegisterRespVO.class));
     }
 
     @GetMapping("/export-excel")
     @Operation(summary = "导出通过分享链接,新注册用户 Excel")
     @PreAuthorize("@ss.hasPermission('distri:share-link-register:export')")
     @OperateLog(type = EXPORT)
-    public void exportShareLinkRegisterExcel(@Valid ShareLinkRegisterPageReqVO pageReqVO,
+    public void exportShareLinkRegisterExcel(@Valid AppShareLinkRegisterPageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         List<ShareLinkRegisterDO> list = shareLinkRegisterService.getShareLinkRegisterPage(pageReqVO).getList();
         // 导出 Excel
-        ExcelUtils.write(response, "通过分享链接,新注册用户.xls", "数据", ShareLinkRegisterRespVO.class,
-                        BeanUtils.toBean(list, ShareLinkRegisterRespVO.class));
+        ExcelUtils.write(response, "通过分享链接,新注册用户.xls", "数据", AppShareLinkRegisterRespVO.class,
+                        BeanUtils.toBean(list, AppShareLinkRegisterRespVO.class));
     }
 
 }

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelinkregister/vo/ShareLinkRegisterPageReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterPageReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo;
+package cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo;
 
 import lombok.*;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -12,7 +12,7 @@ import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class ShareLinkRegisterPageReqVO extends PageParam {
+public class AppShareLinkRegisterPageReqVO extends PageParam {
 
     @Schema(description = "分享链接表id:关联分享链接表,本记录对应的分享链接表记录", example = "12173")
     private Long distriShareLinkId;

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelinkregister/vo/ShareLinkRegisterRespVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterRespVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo;
+package cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -8,7 +8,7 @@ import com.alibaba.excel.annotation.*;
 @Schema(description = "管理后台 - 通过分享链接,新注册用户 Response VO")
 @Data
 @ExcelIgnoreUnannotated
-public class ShareLinkRegisterRespVO {
+public class AppShareLinkRegisterRespVO {
 
     @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19900")
     @ExcelProperty("主键id")

+ 5 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharelinkregister/vo/ShareLinkRegisterSaveReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo;
+package cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -6,7 +6,10 @@ import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 通过分享链接,新注册用户新增/修改 Request VO")
 @Data
-public class ShareLinkRegisterSaveReqVO {
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class AppShareLinkRegisterSaveReqVO {
 
     @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19900")
     private Long id;

+ 24 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/sharepath/SharePathDO.java

@@ -1,9 +1,6 @@
 package cn.newfeifan.mall.module.distri.dal.dataobject.sharepath;
 
 import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.*;
 import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
 
@@ -43,5 +40,29 @@ public class SharePathDO extends BaseDO {
      * 顺序
      */
     private Integer sort;
+    /**
+     * 推荐人姓名
+     */
+    private String ancName;
+    /**
+     * 推荐人手机号
+     */
+    private String ancPhone;
+    /**
+     * 直推人姓名
+     */
+    private String descName;
+    /**
+     * 推荐人手机号
+     */
+    private String descPhone;
+    /**
+     * 推荐人昵称
+     */
+    private String ancNickName;
+    /**
+     * 直推人昵称
+     */
+    private String descNickName;
 
 }

+ 9 - 4
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelink/ShareLinkMapper.java

@@ -1,13 +1,11 @@
 package cn.newfeifan.mall.module.distri.dal.mysql.sharelink;
 
-import java.util.*;
-
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkPageReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelink.ShareLinkDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo.*;
 
 /**
  * 分享链接 Mapper
@@ -17,7 +15,7 @@ import cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo.*;
 @Mapper
 public interface ShareLinkMapper extends BaseMapperX<ShareLinkDO> {
 
-    default PageResult<ShareLinkDO> selectPage(ShareLinkPageReqVO reqVO) {
+    default PageResult<ShareLinkDO> selectPage(AppShareLinkPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<ShareLinkDO>()
                 .likeIfPresent(ShareLinkDO::getName, reqVO.getName())
                 .eqIfPresent(ShareLinkDO::getStatus, reqVO.getStatus())
@@ -29,4 +27,11 @@ public interface ShareLinkMapper extends BaseMapperX<ShareLinkDO> {
                 .orderByDesc(ShareLinkDO::getId));
     }
 
+    default ShareLinkDO selectByCategory(Integer category, Long loginUserId, Long objectId){
+        return selectOne(new LambdaQueryWrapperX<ShareLinkDO>()
+                .eq(ShareLinkDO::getCategory, category)
+                .eq(ShareLinkDO::getCreateUserId, loginUserId)
+                .eq(ShareLinkDO::getObjectId, objectId)
+        );
+    }
 }

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelinkregister/ShareLinkRegisterMapper.java

@@ -4,9 +4,9 @@ package cn.newfeifan.mall.module.distri.dal.mysql.sharelinkregister;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterPageReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelinkregister.ShareLinkRegisterDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo.*;
 
 /**
  * 通过分享链接,新注册用户 Mapper
@@ -16,7 +16,7 @@ import cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo.*;
 @Mapper
 public interface ShareLinkRegisterMapper extends BaseMapperX<ShareLinkRegisterDO> {
 
-    default PageResult<ShareLinkRegisterDO> selectPage(ShareLinkRegisterPageReqVO reqVO) {
+    default PageResult<ShareLinkRegisterDO> selectPage(AppShareLinkRegisterPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<ShareLinkRegisterDO>()
                 .eqIfPresent(ShareLinkRegisterDO::getDistriShareLinkId, reqVO.getDistriShareLinkId())
                 .eqIfPresent(ShareLinkRegisterDO::getRegisterUserId, reqVO.getRegisterUserId())

+ 35 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/shareLinkRegister/AddShareLinkRegisterConsumer.java

@@ -0,0 +1,35 @@
+package cn.newfeifan.mall.module.distri.mq.consumer.shareLinkRegister;
+
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterSaveReqVO;
+import cn.newfeifan.mall.module.distri.service.sharelinkregister.ShareLinkRegisterService;
+import cn.newfeifan.mall.module.member.message.share.ShareLinkRegisterCreateMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 用户注册时,发送通过分享链接注册的用户的消费者,基 {@link ShareLinkRegisterCreateMessage} 消息
+ */
+@Component
+@Slf4j
+public class AddShareLinkRegisterConsumer {
+
+    @Resource
+    private ShareLinkRegisterService shareLinkRegisterService;
+
+    @EventListener
+    @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
+    public void onMessage(ShareLinkRegisterCreateMessage message) {
+        log.info("[onMessage][消息内容({})]", message);
+        AppShareLinkRegisterSaveReqVO reqVO = AppShareLinkRegisterSaveReqVO
+                .builder()
+                .distriShareLinkId(message.getShareLinkId())
+                .registerUserId(message.getRegisterUserId())
+                .build();
+        shareLinkRegisterService.createShareLinkRegister(reqVO);
+    }
+
+}

+ 13 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/sharePath/AddSharePathConsumer.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.distri.mq.consumer.sharePath;
 
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.SharePathSaveReqVO;
+import cn.newfeifan.mall.module.distri.service.sharelink.ShareLinkService;
 import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
 import cn.newfeifan.mall.module.member.message.share.SharePathCreateMessage;
 import cn.newfeifan.mall.module.member.message.user.MemberUserCreateMessage;
@@ -22,14 +23,24 @@ public class AddSharePathConsumer {
 
     @Resource
     private SharePathService sharePathService;
+    @Resource
+    private ShareLinkService shareLinkService;
 
     @EventListener
     @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
     public void onMessage(SharePathCreateMessage message) {
         log.info("[onMessage][消息内容({})]", message);
+
+        Long ancestor;
+        if (message.getLinkId() != null) {
+            ancestor = shareLinkService.getCreateUserIdById(message.getLinkId());
+        } else {
+            ancestor = 1L;
+        }
+
         SharePathSaveReqVO saveReqVO = SharePathSaveReqVO.builder()
-                .ancestor(1L)
-                .descendant(message.getUserId()).build();
+                .ancestor(ancestor)
+                .descendant(message.getDescendant()).build();
         sharePathService.createSharePathByUserId(saveReqVO);
     }
 

+ 31 - 9
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelink/ShareLinkService.java

@@ -1,11 +1,12 @@
 package cn.newfeifan.mall.module.distri.service.sharelink;
 
-import java.util.*;
 import javax.validation.*;
-import cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo.*;
+
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelink.ShareLinkDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
 
 /**
  * 分享链接 Service 接口
@@ -20,14 +21,14 @@ public interface ShareLinkService {
      * @param createReqVO 创建信息
      * @return 编号
      */
-    Long createShareLink(@Valid ShareLinkSaveReqVO createReqVO);
+    Long createShareLink(@Valid AppShareLinkSaveReqVO createReqVO);
 
     /**
      * 更新分享链接
      *
      * @param updateReqVO 更新信息
      */
-    void updateShareLink(@Valid ShareLinkSaveReqVO updateReqVO);
+    void updateShareLink(@Valid AppShareLinkSaveReqVO updateReqVO);
 
     /**
      * 删除分享链接
@@ -39,10 +40,10 @@ public interface ShareLinkService {
     /**
      * 获得分享链接
      *
-     * @param id 编号
-     * @return 分享链接
+     * @param appShareLinkReqVO 链接对象
+     * @return 分享链接编号
      */
-    ShareLinkDO getShareLink(Long id);
+    String getShareLink(AppShareLinkReqVO appShareLinkReqVO);
 
     /**
      * 获得分享链接分页
@@ -50,6 +51,27 @@ public interface ShareLinkService {
      * @param pageReqVO 分页查询
      * @return 分享链接分页
      */
-    PageResult<ShareLinkDO> getShareLinkPage(ShareLinkPageReqVO pageReqVO);
+    PageResult<ShareLinkDO> getShareLinkPage(AppShareLinkPageReqVO pageReqVO);
+
+    /**
+     * 获得分享链接创建人
+     *
+     * @param id 分享链接编号
+     * @return 分享链接创建人
+     */
+    Long getCreateUserIdById(Long id);
 
+    /**
+     * 增加分享链接注册人数
+     *
+     * @param id 分享链接编号
+     */
+    void addRegisterUserCountById(Long id);
+
+    /**
+     * 获得分享链接对应的商品编号
+     * @param linkId 链接编号
+     * @return 商品编号
+     */
+    Long getObjectIdByLinkId(Long linkId);
 }

+ 109 - 8
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelink/ShareLinkServiceImpl.java

@@ -1,16 +1,31 @@
 package cn.newfeifan.mall.module.distri.service.sharelink;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelink.vo.AppShareLinkSaveReqVO;
+import cn.newfeifan.mall.module.product.dal.dataobject.spu.ProductSpuDO;
+import cn.newfeifan.mall.module.product.dal.mysql.spu.ProductSpuMapper;
+import cn.newfeifan.mall.module.sale.dal.dataobject.shop.ShopDO;
+import cn.newfeifan.mall.module.sale.dal.mysql.shop.ShopMapper;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+
 import org.springframework.validation.annotation.Validated;
 
-import cn.newfeifan.mall.module.distri.controller.admin.sharelink.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelink.ShareLinkDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.sharelink.ShareLinkMapper;
 
+import static cn.newfeifan.mall.framework.common.enums.CategoryEnum.*;
+import static cn.newfeifan.mall.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
 
 /**
  * 分享链接 Service 实现类
@@ -24,8 +39,14 @@ public class ShareLinkServiceImpl implements ShareLinkService {
     @Resource
     private ShareLinkMapper shareLinkMapper;
 
+    @Resource
+    private ShopMapper shopMapper;
+
+    @Resource
+    private ProductSpuMapper productSpuMapper;
+
     @Override
-    public Long createShareLink(ShareLinkSaveReqVO createReqVO) {
+    public Long createShareLink(AppShareLinkSaveReqVO createReqVO) {
         // 插入
         ShareLinkDO shareLink = BeanUtils.toBean(createReqVO, ShareLinkDO.class);
         shareLinkMapper.insert(shareLink);
@@ -34,7 +55,7 @@ public class ShareLinkServiceImpl implements ShareLinkService {
     }
 
     @Override
-    public void updateShareLink(ShareLinkSaveReqVO updateReqVO) {
+    public void updateShareLink(AppShareLinkSaveReqVO updateReqVO) {
         // 校验存在
         validateShareLinkExists(updateReqVO.getId());
         // 更新
@@ -52,18 +73,98 @@ public class ShareLinkServiceImpl implements ShareLinkService {
 
     private void validateShareLinkExists(Long id) {
         if (shareLinkMapper.selectById(id) == null) {
-//            throw exception(SHARE_LINK_NOT_EXISTS);
+            throw exception(SHARE_LINK_NOT_EXISTS);
         }
     }
 
     @Override
-    public ShareLinkDO getShareLink(Long id) {
-        return shareLinkMapper.selectById(id);
+    public String getShareLink(AppShareLinkReqVO appShareLinkReqVO) {
+        //先判断是否存在
+        Long loginUserId = getLoginUserId();
+        if (ObjectUtil.isEmpty(loginUserId)) {
+            throw exception(UNAUTHORIZED);
+        }
+        ShareLinkDO shareLinkDO = shareLinkMapper.selectByCategory(appShareLinkReqVO.getCategory(), loginUserId, appShareLinkReqVO.getObjectId());
+
+        if (ObjectUtil.isNotEmpty(shareLinkDO)) {
+            //存在就直接返回查询出来的id - 十六进制
+            return Long.toHexString(shareLinkDO.getId());
+        }
+
+        ShareLinkDO shareLink = BeanUtils.toBean(appShareLinkReqVO, ShareLinkDO.class);
+        shareLink.setCreateUserId(getLoginUserId());
+
+        //获取对象名
+        String name = getObjectName(shareLink.getCategory(), shareLink.getObjectId());
+        shareLink.setName(name);
+
+        shareLinkMapper.insert(shareLink);
+        return Long.toHexString(shareLink.getId());
+    }
+
+    private String getObjectName(Integer category, Long objectId) {
+        if (isMall(category)) {
+            return MALL.getName();
+        } else if (isShop(category)) {
+            ShopDO shopDO = shopMapper.selectById(objectId);
+            return shopDO.getName();
+        } else if (isProduct(category)) {
+            ProductSpuDO productSpuDO = productSpuMapper.selectById(objectId);
+            return productSpuDO.getName();
+        }
+        return null;
+    }
+
+    private Long getObjectId(Integer category, Long objectId) {
+        if (isMall(category)) {
+            return 0L;
+        } else if (isShop(category)) {
+            ShopDO shopDO = shopMapper.selectById(objectId);
+            return shopDO.getId();
+        } else if (isProduct(category)) {
+            ProductSpuDO productSpuDO = productSpuMapper.selectById(objectId);
+            return productSpuDO.getId();
+        }
+        return null;
     }
 
     @Override
-    public PageResult<ShareLinkDO> getShareLinkPage(ShareLinkPageReqVO pageReqVO) {
+    public PageResult<ShareLinkDO> getShareLinkPage(AppShareLinkPageReqVO pageReqVO) {
         return shareLinkMapper.selectPage(pageReqVO);
     }
 
-}
+    @Override
+    public Long getCreateUserIdById(Long id) {
+        return shareLinkMapper.selectById(id).getCreateUserId();
+    }
+
+    @Override
+    public void addRegisterUserCountById(Long id) {
+        ShareLinkDO shareLinkDO = shareLinkMapper.selectById(id);
+
+        // 使用帮助方法来增加注册用户计数,并确保操作的直观性
+        incrementRegisterUserCount(shareLinkDO);
+
+        shareLinkMapper.updateById(shareLinkDO);
+    }
+
+
+    /**
+     * 帮助方法用于增加注册用户计数
+     *
+     * @param shareLinkDO 要更新的ShareLinkDO实例
+     */
+    private void incrementRegisterUserCount(ShareLinkDO shareLinkDO) {
+        shareLinkDO.setRegisterUserCount(shareLinkDO.getRegisterUserCount() + 1);
+    }
+
+    @Override
+    public Long getObjectIdByLinkId(Long linkId) {
+        ShareLinkDO shareLinkDO = shareLinkMapper.selectById(linkId);
+        if (shareLinkDO == null) {
+            throw exception(SHARE_LINK_NOT_EXISTS);
+        }
+
+        return getObjectId(shareLinkDO.getCategory(), shareLinkDO.getObjectId());
+    }
+}

+ 6 - 4
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelinkregister/ShareLinkRegisterService.java

@@ -1,7 +1,9 @@
 package cn.newfeifan.mall.module.distri.service.sharelinkregister;
 
 import javax.validation.*;
-import cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo.*;
+
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelinkregister.ShareLinkRegisterDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 
@@ -18,14 +20,14 @@ public interface ShareLinkRegisterService {
      * @param createReqVO 创建信息
      * @return 编号
      */
-    Long createShareLinkRegister(@Valid ShareLinkRegisterSaveReqVO createReqVO);
+    Long createShareLinkRegister(@Valid AppShareLinkRegisterSaveReqVO createReqVO);
 
     /**
      * 更新通过分享链接,新注册用户
      *
      * @param updateReqVO 更新信息
      */
-    void updateShareLinkRegister(@Valid ShareLinkRegisterSaveReqVO updateReqVO);
+    void updateShareLinkRegister(@Valid AppShareLinkRegisterSaveReqVO updateReqVO);
 
     /**
      * 删除通过分享链接,新注册用户
@@ -48,6 +50,6 @@ public interface ShareLinkRegisterService {
      * @param pageReqVO 分页查询
      * @return 通过分享链接,新注册用户分页
      */
-    PageResult<ShareLinkRegisterDO> getShareLinkRegisterPage(ShareLinkRegisterPageReqVO pageReqVO);
+    PageResult<ShareLinkRegisterDO> getShareLinkRegisterPage(AppShareLinkRegisterPageReqVO pageReqVO);
 
 }

+ 28 - 8
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelinkregister/ShareLinkRegisterServiceImpl.java

@@ -1,15 +1,18 @@
 package cn.newfeifan.mall.module.distri.service.sharelinkregister;
 
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.sharelinkregister.vo.AppShareLinkRegisterSaveReqVO;
+import cn.newfeifan.mall.module.distri.service.sharelink.ShareLinkService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
+
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 
-import java.util.*;
-import cn.newfeifan.mall.module.distri.controller.admin.sharelinkregister.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharelinkregister.ShareLinkRegisterDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.sharelinkregister.ShareLinkRegisterMapper;
@@ -28,18 +31,35 @@ public class ShareLinkRegisterServiceImpl implements ShareLinkRegisterService {
 
     @Resource
     private ShareLinkRegisterMapper shareLinkRegisterMapper;
+    @Resource
+    private ShareLinkService shareLinkService;
+
 
     @Override
-    public Long createShareLinkRegister(ShareLinkRegisterSaveReqVO createReqVO) {
+    @Transactional(rollbackFor = Exception.class)
+    public Long createShareLinkRegister(AppShareLinkRegisterSaveReqVO createReqVO) {
+        //插入之前先判断有没有再插入
+        ShareLinkRegisterDO shareLinkRegisterDO = shareLinkRegisterMapper.selectOne(new LambdaQueryWrapper<ShareLinkRegisterDO>()
+                .eq(ShareLinkRegisterDO::getDistriShareLinkId, createReqVO.getDistriShareLinkId())
+                .eq(ShareLinkRegisterDO::getRegisterUserId, createReqVO.getRegisterUserId()));
+        if (shareLinkRegisterDO != null) {
+            return shareLinkRegisterDO.getId();
+        }
+
         // 插入
         ShareLinkRegisterDO shareLinkRegister = BeanUtils.toBean(createReqVO, ShareLinkRegisterDO.class);
         shareLinkRegisterMapper.insert(shareLinkRegister);
+
+        //增加当前链接的累计
+        if (createReqVO.getDistriShareLinkId() != null) {
+            shareLinkService.addRegisterUserCountById(createReqVO.getDistriShareLinkId());
+        }
         // 返回
         return shareLinkRegister.getId();
     }
 
     @Override
-    public void updateShareLinkRegister(ShareLinkRegisterSaveReqVO updateReqVO) {
+    public void updateShareLinkRegister(AppShareLinkRegisterSaveReqVO updateReqVO) {
         // 校验存在
         validateShareLinkRegisterExists(updateReqVO.getId());
         // 更新
@@ -57,7 +77,7 @@ public class ShareLinkRegisterServiceImpl implements ShareLinkRegisterService {
 
     private void validateShareLinkRegisterExists(Long id) {
         if (shareLinkRegisterMapper.selectById(id) == null) {
-//            throw exception(SHARE_LINK_REGISTER_NOT_EXISTS);
+            throw exception(SHARE_LINK_REGISTER_NOT_EXISTS);
         }
     }
 
@@ -67,7 +87,7 @@ public class ShareLinkRegisterServiceImpl implements ShareLinkRegisterService {
     }
 
     @Override
-    public PageResult<ShareLinkRegisterDO> getShareLinkRegisterPage(ShareLinkRegisterPageReqVO pageReqVO) {
+    public PageResult<ShareLinkRegisterDO> getShareLinkRegisterPage(AppShareLinkRegisterPageReqVO pageReqVO) {
         return shareLinkRegisterMapper.selectPage(pageReqVO);
     }
 

+ 28 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java

@@ -2,20 +2,20 @@ package cn.newfeifan.mall.module.distri.service.sharepath;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.module.distri.service.duser.DuserService;
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 
 import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.sharepath.SharePathMapper;
@@ -38,6 +38,9 @@ public class SharePathServiceImpl implements SharePathService {
     @Resource
     private DuserService duserService;
 
+    @Resource
+    private MemberUserService memberUserService;
+
 
     @Override
     public Long createSharePath(SharePathSaveReqVO createReqVO) {
@@ -61,6 +64,29 @@ public class SharePathServiceImpl implements SharePathService {
         duserService.hasUserAndCreat(createReqVO);
         // 存储他们之间的关系
         sharePathMapper.addNode(createReqVO.getAncestor(), createReqVO.getDescendant());
+
+        //保存用户的基本信息
+        saveSharePathName(createReqVO.getDescendant());
+    }
+
+    private void saveSharePathName(Long descendant){
+        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(new LambdaQueryWrapper<SharePathDO>()
+                .eq(SharePathDO::getDescendant, descendant)
+        );
+
+        for (SharePathDO sharePathDO : sharePathDOS) {
+            MemberUserDO ancestor = memberUserService.getUser(sharePathDO.getAncestor());
+            MemberUserDO descendantUser = memberUserService.getUser(sharePathDO.getDescendant());
+            if (ancestor != null && descendantUser != null) {
+                sharePathDO.setAncName(ancestor.getName());
+                sharePathDO.setAncNickName(ancestor.getNickname());
+                sharePathDO.setAncPhone(ancestor.getMobile());
+                sharePathDO.setDescName(descendantUser.getName());
+                sharePathDO.setDescNickName(descendantUser.getNickname());
+                sharePathDO.setDescPhone(descendantUser.getMobile());
+                sharePathMapper.updateById(sharePathDO);
+            }
+        }
     }
 
 

+ 7 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java

@@ -93,7 +93,13 @@ public class AppTradeOrderController {
         DeliveryExpressDO express = order.getLogisticsId() != null && order.getLogisticsId() > 0 ?
                 deliveryExpressService.getDeliveryExpress(order.getLogisticsId()) : null;
         // 最终组合
-        return success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, tradeOrderProperties, express));
+        CommonResult<AppTradeOrderDetailRespVO> rs=
+                success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, tradeOrderProperties, express));
+
+        //设置订单支付的积分
+        rs.getData().setPayIntegral(order.getPayIntegral());
+
+        return rs;
     }
 
     @GetMapping("/get-express-track-list")

+ 1 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java

@@ -17,7 +17,7 @@ public class AppTradeOrderCreateReqVO extends AppTradeOrderSettlementReqVO {
 
     //add by Ben
     @Schema(description = "本订单使用积分,为一整数", example = "36")
-    private Integer payPoints;
+    private Integer payIntegral;
 
     @Schema(description = "【本属性已不作页面与后台传值使用,被shopRemarks替代。本属性只作java内部使用】备注", example = "这个是我的订单哟")
     private String remark;

+ 4 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java

@@ -13,6 +13,10 @@ import java.util.List;
 @Data
 public class AppTradeOrderDetailRespVO {
 
+    //========使用积分=================
+    @Schema(description = "订单使用积分", example = "8900000")
+    private Integer payIntegral;
+
     // ========== 订单基本信息 ==========
 
     @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")

+ 9 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -32,8 +32,15 @@ import java.time.LocalDateTime;
 @AllArgsConstructor
 public class TradeOrderDO extends BaseDO {
 
-    //本商品使用积分 add by Ben
-    private Integer payPoints;
+    //本商品使用积分 add by Ben payIntegral
+//    private Integer payPoints;
+    private Integer payIntegral;
+
+    //退还的使用的积分 add by Ben
+    private Integer refundIntegral;
+
+    //用户获得积分 add by Ben
+    private Integer increaseIntegral;
 
     //本商品实付的人民币金额 add by Ben
     private Integer payRmb;

+ 3 - 3
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java

@@ -27,16 +27,16 @@ import java.util.List;
 public class TradeOrderItemDO extends BaseDO {
 
     //本商品使用积分 add by Ben
-    private Integer payPoints;
+    private Integer payIntegral;
 
     //本商品实付的人民币金额 add by Ben
     private Integer payRmb;
 
     //退还的使用的积分 add by Ben
-    private Integer refundPoints;
+    private Integer refundIntegral;
 
     //用户获得积分 add by Ben
-    private Integer increasePoints;
+    private Integer increaseIntegral;
 
     // ========== 订单项基本信息 ==========
     /**

+ 24 - 6
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -11,6 +11,7 @@ import cn.newfeifan.mall.framework.common.core.KeyValue;
 import cn.newfeifan.mall.framework.common.enums.UserTypeEnum;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
+import cn.newfeifan.mall.module.distri.constant.DistriConstants;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
 import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
@@ -315,6 +316,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         return tradePriceService.calculatePrice(calculateReqBO);
     }
 
+    //把数据库的钱转换为数据库的积分
+    public static Integer money2Integral(Integer money){
+        return money*DistriConstants.INTEGRAL2MONEY;
+    }
+
+    //把数据库的积分转换为数据库的钱
+    public static Integer integral2Money(Integer integral){
+        return integral/DistriConstants.INTEGRAL2MONEY;
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -375,9 +385,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         }
 
         //消费者在页面录入的,要使用的积分
-        Integer payPoints = createReqVO.getPayPoints();
+        Integer payPoints = createReqVO.getPayIntegral();
+
         if(payPoints == null){
             payPoints = 0;
+        }else{//把页面传入的,1积分=1元钱的积分,转换为后台保存到数据库的积分值
+            payPoints = payPoints* DistriConstants.PERCENT;
         }
 
 
@@ -386,7 +399,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         //计算订单含积分的各项商品价格
         TradePriceCalculateRespBO tradePriceCalculateRespBO = calculatePriceWithPoints(userId, createReqVO);
         //计算分摊的积分金额
-        List<Integer> dividePoints = TradePriceCalculatorHelper.dividePrice(tradePriceCalculateRespBO.getItems(), payPoints);
+        List<Integer> dividePoints = TradePriceCalculatorHelper.dividePrice(tradePriceCalculateRespBO.getItems(), integral2Money(payPoints));
         //键为skuId,value为单个商品项信息
         Map<Long, TradePriceCalculateRespBO.OrderItem> itemPayPointsMap = new HashMap<Long, TradePriceCalculateRespBO.OrderItem>();
 
@@ -394,7 +407,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         List<TradePriceCalculateRespBO.OrderItem> priceOrderItems = tradePriceCalculateRespBO.getItems();
         for (int i = 0; i < priceOrderItems.size(); i++) {
             TradePriceCalculateRespBO.OrderItem orderItem = priceOrderItems.get(i);
-            Integer itemPoint = dividePoints.get(i);//每项商品使用的积分
+            Integer itemPoint = money2Integral(dividePoints.get(i));//每项商品使用的积分
             orderItem.setPayPoints(itemPoint);
             itemPayPointsMap.put(orderItem.getSkuId(),orderItem);
         }
@@ -440,8 +453,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 //计算抵扣积分后的价格
                 Long skuId = orderItem.getSkuId();
                 TradePriceCalculateRespBO.OrderItem orderItemTmp = itemPayPointsMap.get(skuId);
-                orderItem.setPayPoints(orderItemTmp.getPayPoints()); //本商品使用积分
-                Integer payRmb = orderItem.getPrice()*orderItem.getCount()-orderItemTmp.getPayPoints();//本商品实付人民币
+                orderItem.setPayIntegral(orderItemTmp.getPayPoints()); //本商品使用积分
+                Integer payRmb = orderItem.getPrice()*orderItem.getCount()-integral2Money(orderItemTmp.getPayPoints());//本商品实付人民币
                 orderItem.setPayRmb(payRmb);//本商品实付人民币
                 orderItem.setPayPrice(payRmb);//本商品实付人民币
 
@@ -459,7 +472,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             order.setShopId(shopId);
             order.setPayPrice(shopPayPrice);
             order.setPayRmb(shopPayPrice);
-            order.setPayPoints(shopPayPoints);
+            order.setPayIntegral(shopPayPoints);
 
             tradeOrderMapper.insert(order);
 
@@ -494,6 +507,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
         }
 
+        //如果订单有使用积分,则抵扣用户的积分
+        if(payPoints>0){
+
+        }
+
         return virtualOrder;
     }
 

+ 13 - 0
feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/message/share/ShareLinkRegisterCreateMessage.java

@@ -0,0 +1,13 @@
+package cn.newfeifan.mall.module.member.message.share;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ShareLinkRegisterCreateMessage {
+    @NotNull(message = "分享链接表id不能为空")
+    Long ShareLinkId;
+    @NotNull(message = "注册用户id不能为空")
+    Long registerUserId;
+}

+ 7 - 4
feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/message/share/SharePathCreateMessage.java

@@ -13,11 +13,14 @@ import javax.validation.constraints.NotNull;
 public class SharePathCreateMessage {
 
     /**
-     * 用户编号
+     * 直推人编号
      */
-    @NotNull(message = "用户编号不能为空")
-    private Long userId;
-
+    @NotNull(message = "直推人不能为空")
+    private Long descendant;
 
+    /**
+     * 推荐链接编号
+     */
+    private Long linkId;
 
 }

+ 1 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/AppAuthController.java

@@ -43,6 +43,7 @@ public class AppAuthController {
     @Resource
     private SecurityProperties securityProperties;
 
+
     @PostMapping("/login")
     @Operation(summary = "使用手机 + 密码登录")
     public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) {

+ 10 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java

@@ -45,6 +45,16 @@ public class AppAuthSmsLoginReqVO {
     @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62")
     private String socialState;
 
+    @Schema(description = "分享链接ID 没有可以不传")
+    private String linkId;
+
+    public Long getLinkId() {
+        if (linkId == null) {
+            return null;
+        }
+        return Long.parseLong(linkId,16);
+    }
+
     @AssertTrue(message = "授权码不能为空")
     public boolean isSocialCodeValid() {
         return socialType == null || StrUtil.isNotEmpty(socialCode);

+ 9 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java

@@ -31,4 +31,13 @@ public class AppAuthSocialLoginReqVO {
     @NotEmpty(message = "state 不能为空")
     private String state;
 
+    @Schema(description = "分享链接ID 没有可以不传")
+    private String linkId;
+
+    public Long getLinkId() {
+        if (linkId == null) {
+            return null;
+        }
+        return Long.parseLong(linkId,16);
+    }
 }

+ 1 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/SocialLoginValidateSmsCodeReqVO.java

@@ -21,4 +21,5 @@ public class SocialLoginValidateSmsCodeReqVO {
      */
     @Valid
     private AppAuthSocialLoginReqVO loginReqVO;
+
 }

+ 29 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/mq/producer/shareLinkRegister/ShareLinkRegisterProducer.java

@@ -0,0 +1,29 @@
+package cn.newfeifan.mall.module.member.mq.producer.shareLinkRegister;
+
+import cn.newfeifan.mall.module.member.message.share.ShareLinkRegisterCreateMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 创建链接注册用户与平台之间的关系 Producer
+ *
+ */
+@Slf4j
+@Component
+public class ShareLinkRegisterProducer {
+    @Resource
+    private ApplicationContext applicationContext;
+
+    /**
+     * 发送 {@link ShareLinkRegisterCreateMessage} 消息
+     *
+     * @param shareLinkId 链接编号
+     * @param registerUserId 注册用户的编号
+     */
+    public void sendShareLinkRegisterMessage(Long shareLinkId,Long registerUserId){
+        applicationContext.publishEvent(new ShareLinkRegisterCreateMessage().setShareLinkId(shareLinkId).setRegisterUserId(registerUserId));
+    }
+}

+ 4 - 4
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/mq/producer/sharePath/SharePathProducer.java

@@ -1,7 +1,6 @@
 package cn.newfeifan.mall.module.member.mq.producer.sharePath;
 
 import cn.newfeifan.mall.module.member.message.share.SharePathCreateMessage;
-import cn.newfeifan.mall.module.member.message.user.MemberUserCreateMessage;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
@@ -23,10 +22,11 @@ public class SharePathProducer {
     /**
      * 发送 {@link SharePathCreateMessage} 消息
      *
-     * @param userId 用户编号
+     * @param linkId 推荐链接编号
+     * @param descendant 直推人
      */
-    public void sendSharePathCreatMessage(Long userId) {
-        applicationContext.publishEvent(new SharePathCreateMessage().setUserId(userId));
+    public void sendSharePathCreatMessage(Long linkId,Long descendant) {
+        applicationContext.publishEvent(new SharePathCreateMessage().setLinkId(linkId).setDescendant(descendant));
     }
 
 }

+ 4 - 4
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/auth/MemberAuthServiceImpl.java

@@ -86,7 +86,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
         smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp));
 
         // 获得获得注册用户
-        MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, getTerminal());
+        MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp, getTerminal(), reqVO.getLinkId());
         Assert.notNull(user, "获取用户失败,结果为空");
 
         // 如果 socialType 非空,说明需要绑定社交用户
@@ -125,10 +125,10 @@ public class MemberAuthServiceImpl implements MemberAuthService {
                 user = userService.getUserByMobile(phone);
                 if (user == null) {
                     //加入手机号
-                    user = userService.createUser(phone, socialUser.getNickname(), socialUser.getAvatar(), getClientIP(), getTerminal());
+                    user = userService.createUser(phone, socialUser.getNickname(), socialUser.getAvatar(), getClientIP(), getTerminal(), reqVO.getLinkId());
                 }
             } else {
-                user = userService.createUser(null, socialUser.getNickname(), socialUser.getAvatar(), getClientIP(), getTerminal());
+                user = userService.createUser(null, socialUser.getNickname(), socialUser.getAvatar(), getClientIP(), getTerminal(), reqVO.getLinkId());
             }
 
             socialUserApi.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
@@ -151,7 +151,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
 
         // 获得获得注册用户
         MemberUserDO user = userService.createUserIfAbsent(phoneNumberInfo.getPurePhoneNumber(),
-                getClientIP(), TerminalEnum.WECHAT_MINI_PROGRAM.getTerminal());
+                getClientIP(), TerminalEnum.WECHAT_MINI_PROGRAM.getTerminal(), null);
         Assert.notNull(user, "获取用户失败,结果为空");
 
         // 绑定社交用户

+ 6 - 4
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java

@@ -42,22 +42,24 @@ public interface MemberUserService {
      * @param mobile     手机号
      * @param registerIp 注册 IP
      * @param terminal   终端 {@link TerminalEnum}
+     * @param linkId     链接编号
      * @return 用户对象
      */
-    MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal);
+    MemberUserDO createUserIfAbsent(@Mobile String mobile, String registerIp, Integer terminal, Long linkId);
 
     /**
      * 创建用户
      * 目的:三方登录时,如果未绑定用户时,自动创建对应用户
      *
-     * @param mobile   手机号
+     * @param mobile     手机号
      * @param nickname   昵称
      * @param avtar      头像
      * @param registerIp 注册 IP
      * @param terminal   终端 {@link TerminalEnum}
+     * @param linkId     链接编号
      * @return 用户对象
      */
-    MemberUserDO createUser(String mobile, String nickname, String avtar, String registerIp, Integer terminal);
+    MemberUserDO createUser(String mobile, String nickname, String avtar, String registerIp, Integer terminal, Long linkId);
 
     /**
      * 更新用户的最后登陆信息
@@ -103,7 +105,7 @@ public interface MemberUserService {
      * 【会员】修改手机,基于微信小程序的授权码
      *
      * @param userId 用户编号
-     * @param reqVO 请求信息
+     * @param reqVO  请求信息
      */
     void updateUserMobileByWeixin(Long userId, AppMemberUserUpdateMobileByWeixinReqVO reqVO);
 

+ 26 - 13
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java

@@ -15,6 +15,7 @@ import cn.newfeifan.mall.module.member.convert.auth.AuthConvert;
 import cn.newfeifan.mall.module.member.convert.user.MemberUserConvert;
 import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 import cn.newfeifan.mall.module.member.dal.mysql.user.MemberUserMapper;
+import cn.newfeifan.mall.module.member.mq.producer.shareLinkRegister.ShareLinkRegisterProducer;
 import cn.newfeifan.mall.module.member.mq.producer.sharePath.SharePathProducer;
 import cn.newfeifan.mall.module.member.mq.producer.user.MemberUserProducer;
 import cn.newfeifan.mall.module.system.api.sms.SmsCodeApi;
@@ -28,6 +29,7 @@ import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
 import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import javax.annotation.Resource;
@@ -67,6 +69,8 @@ public class MemberUserServiceImpl implements MemberUserService {
 
     @Resource
     private SharePathProducer sharePathProducer;
+    @Resource
+    private ShareLinkRegisterProducer shareLinkRegisterProducer;
 
     @Override
     public MemberUserDO getUserByMobile(String mobile) {
@@ -80,24 +84,24 @@ public class MemberUserServiceImpl implements MemberUserService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public MemberUserDO createUserIfAbsent(String mobile, String registerIp, Integer terminal) {
+    public MemberUserDO createUserIfAbsent(String mobile, String registerIp, Integer terminal, Long linkId) {
         // 用户已经存在
         MemberUserDO user = memberUserMapper.selectByMobile(mobile);
         if (user != null) {
             return user;
         }
         // 用户不存在,则进行创建
-        return privateCreateUser(mobile, null, null, registerIp, terminal);
+        return privateCreateUser(mobile, null, null, registerIp, terminal, linkId);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public MemberUserDO createUser(String mobile,String nickname, String avtar, String registerIp, Integer terminal) {
-        return privateCreateUser(mobile, nickname, avtar, registerIp, terminal);
+    public MemberUserDO createUser(String mobile, String nickname, String avtar, String registerIp, Integer terminal, Long linkId) {
+        return privateCreateUser(mobile, nickname, avtar, registerIp, terminal, linkId);
     }
 
     private MemberUserDO privateCreateUser(String mobile, String nickname, String avtar,
-                                    String registerIp, Integer terminal) {
+                                           String registerIp, Integer terminal, Long linkId) {
         // 生成密码
         String password = IdUtil.fastSimpleUUID();
         // 插入用户
@@ -113,19 +117,30 @@ public class MemberUserServiceImpl implements MemberUserService {
         }
         memberUserMapper.insert(user);
 
-        // 发送 MQ 消息:创建会员
-        sharePathProducer.sendSharePathCreatMessage(user.getId());
+        // 注册事务同步适配器
+        registerTransactionSynchronization(user.getId(), linkId);
 
-        // 发送 MQ 消息:用户创建
-        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+        return user;
+    }
 
+    private void registerTransactionSynchronization(Long userId, Long linkId) {
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
             @Override
             public void afterCommit() {
-                memberUserProducer.sendUserCreateMessage(user.getId());
+                sharePathProducer.sendSharePathCreatMessage(linkId == null ? 1L : linkId, userId);
+                if (linkId != null) {
+                    shareLinkRegisterProducer.sendShareLinkRegisterMessage(linkId, userId);
+                }
             }
+        });
 
+        // 发送 MQ 消息:用户创建
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+            @Override
+            public void afterCommit() {
+                memberUserProducer.sendUserCreateMessage(userId);
+            }
         });
-        return user;
     }
 
     @Override
@@ -232,8 +247,6 @@ public class MemberUserServiceImpl implements MemberUserService {
     }
 
 
-
-
     /**
      * 对密码进行加密
      *

+ 11 - 8
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

@@ -113,17 +113,20 @@ public class PayOrderServiceImpl implements PayOrderService {
         // 校验 App
         PayAppDO app = appService.validPayApp(reqDTO.getAppId());
 
+        //因为我把支付订单中的订单id改为0了,所以下面这逻辑,判断订单是否已经支付过,这个逻辑已经失效了
         // 查询对应的支付交易单是否已经存在。如果是,则直接返回
-        PayOrderDO order = orderMapper.selectByAppIdAndMerchantOrderId(
-                reqDTO.getAppId(), reqDTO.getMerchantOrderId());
-        if (order != null) {
-            log.warn("[createOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(),
-                    order.getMerchantOrderId(), toJsonString(order)); // 理论来说,不会出现这个情况
-            return order.getId();
-        }
+//        PayOrderDO order = orderMapper.selectByAppIdAndMerchantOrderId(
+//                reqDTO.getAppId(), reqDTO.getMerchantOrderId());
+
+        //因为我把支付订单中的订单id改为0了,所以下面这逻辑,判断订单是否已经支付过,这个逻辑已经失效了
+        //        if (order != null) {
+//            log.warn("[createOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(),
+//                    order.getMerchantOrderId(), toJsonString(order)); // 理论来说,不会出现这个情况
+//            return order.getId();
+//        }
 
         // 创建支付交易单
-        order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId())
+        PayOrderDO order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId())
                 // 商户相关字段
                 .setNotifyUrl(app.getOrderNotifyUrl())
                 // 订单相关字段