Parcourir la source

Merge branch 'dev/2024/0415/update-app' of Harper/feifan-backend-zx-app into master

拓展商品二维码分享功能
Yangzw il y a 1 an
Parent
commit
2191308060
29 fichiers modifiés avec 403 ajouts et 120 suppressions
  1. 40 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/CategoryEnum.java
  2. 4 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  3. 6 0
      feifan-module-distri/feifan-module-distri-biz/pom.xml
  4. 28 24
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/AppShareLinkController.java
  5. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkPageReqVO.java
  6. 19 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkReqVO.java
  7. 3 5
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkRespVO.java
  8. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkResultVO.java
  9. 3 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelink/vo/AppShareLinkSaveReqVO.java
  10. 15 13
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/AppShareLinkRegisterController.java
  11. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterPageReqVO.java
  12. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterRespVO.java
  13. 6 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/sharelinkregister/vo/AppShareLinkRegisterSaveReqVO.java
  14. 9 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelink/ShareLinkMapper.java
  15. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelinkregister/ShareLinkRegisterMapper.java
  16. 13 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/sharePath/AddSharePathConsumer.java
  17. 31 9
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelink/ShareLinkService.java
  18. 104 8
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelink/ShareLinkServiceImpl.java
  19. 6 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelinkregister/ShareLinkRegisterService.java
  20. 28 8
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharelinkregister/ShareLinkRegisterServiceImpl.java
  21. 7 4
      feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/message/share/SharePathCreateMessage.java
  22. 1 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/AppAuthController.java
  23. 10 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/AppAuthSmsLoginReqVO.java
  24. 9 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java
  25. 1 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/auth/vo/SocialLoginValidateSmsCodeReqVO.java
  26. 4 4
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/mq/producer/sharePath/SharePathProducer.java
  27. 4 4
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/auth/MemberAuthServiceImpl.java
  28. 6 4
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java
  29. 26 13
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.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);
+    }
+}

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

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

+ 6 - 3
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,14 +6,17 @@ 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;
 
     @Schema(description = "分享链接表id:关联分享链接表,本记录对应的分享链接表记录", requiredMode = Schema.RequiredMode.REQUIRED, example = "12173")
     @NotNull(message = "分享链接表id:关联分享链接表,本记录对应的分享链接表记录不能为空")
-    private Long distriShareLinkId;
+    private Long ShareLinkId;
 
     @Schema(description = "注册用户id:通过distri_share_link_id分享链接,新注册的用户id,对应member_user表的id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21753")
     @NotNull(message = "注册用户id:通过distri_share_link_id分享链接,新注册的用户id,对应member_user表的id不能为空")

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

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

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

@@ -1,16 +1,30 @@
 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.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 +38,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 +54,7 @@ public class ShareLinkServiceImpl implements ShareLinkService {
     }
 
     @Override
-    public void updateShareLink(ShareLinkSaveReqVO updateReqVO) {
+    public void updateShareLink(AppShareLinkSaveReqVO updateReqVO) {
         // 校验存在
         validateShareLinkExists(updateReqVO.getId());
         // 更新
@@ -52,18 +72,94 @@ 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) {
+        //先判断是否存在
+        ShareLinkDO shareLinkDO = shareLinkMapper.selectByCategory(appShareLinkReqVO.getCategory(), getLoginUserId(), 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.getShareLinkId())
+                .eq(ShareLinkRegisterDO::getRegisterUserId, createReqVO.getRegisterUserId()));
+        if (shareLinkRegisterDO != null) {
+            return shareLinkRegisterDO.getId();
+        }
+
         // 插入
         ShareLinkRegisterDO shareLinkRegister = BeanUtils.toBean(createReqVO, ShareLinkRegisterDO.class);
         shareLinkRegisterMapper.insert(shareLinkRegister);
+
+        //增加当前链接的累计
+        if (createReqVO.getShareLinkId() != null) {
+            shareLinkService.addRegisterUserCountById(createReqVO.getShareLinkId());
+        }
         // 返回
         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);
     }
 

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

+ 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 {
     }
 
 
-
-
     /**
      * 对密码进行加密
      *