Эх сурвалжийг харах

Merge remote-tracking branch 'origin/master'

Ben 10 сар өмнө
parent
commit
e1b17b6f48
35 өөрчлөгдсөн 633 нэмэгдсэн , 100 устгасан
  1. 0 1
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  2. 3 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  3. 1 13
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/DuserController.java
  4. 0 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserRespVO.java
  5. 10 7
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/PtProfitLogController.java
  6. 4 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java
  7. 18 6
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/SharePathController.java
  8. 3 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathRespVO.java
  9. 22 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathTreeReqVO.java
  10. 12 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/TreeNode.java
  11. 1 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  12. 19 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharepath/SharePathMapper.java
  13. 5 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java
  14. 21 23
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  15. 0 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  16. 5 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java
  17. 19 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java
  18. 4 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathService.java
  19. 104 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java
  20. 32 12
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml
  21. 8 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/ProductSpuController.java
  22. 3 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java
  23. 7 1
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/mysql/spu/ProductSpuMapper.java
  24. 3 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/favorite/ProductFavoriteService.java
  25. 13 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/favorite/ProductFavoriteServiceImpl.java
  26. 2 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuService.java
  27. 14 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuServiceImpl.java
  28. 4 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/aftersale/vo/AfterSalePageReqVO.java
  29. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/aftersale/AfterSaleMapper.java
  30. 9 6
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java
  31. 10 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/mysql/shop/ShopMapper.java
  32. 2 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java
  33. 5 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java
  34. 1 1
      feifan-server/src/main/resources/application-local.yaml
  35. 268 0
      feifan-server/src/main/resources/application-prod.yaml

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

@@ -14,7 +14,6 @@ public enum CaclEnum {
     HIGH_QUOTA(6, "最高可以获得积分"),
     SMALL_QUOTA_CRASH(7, "小区额度分配"),
     AFTER_CRASH_CALC_PT_TOTAL_QUOTA(8, "碰撞后计算平台总收益"),
-
     ;
 
     /**

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

@@ -20,5 +20,8 @@ public interface ErrorCodeConstants {
     ErrorCode PT_PROFIT_LOG_NOT_EXISTS = new ErrorCode(1_002_030_013, "平台利润日志表不存在");
     ErrorCode PERCENT_LARGE_ONE_HUNDRED = new ErrorCode(1_002_030_014, "百分比总和超过100");
     ErrorCode HAS_PARENT = new ErrorCode(1_002_030_015, "该直推人已经有推荐人, 故不能增加");
+    ErrorCode DUSER_NAME_NOT_EXISTS = new ErrorCode(1_002_030_017, "该直推人名称不存在");
+    ErrorCode DUSER_NAME_IS_NOT_ONLY_ONE = new ErrorCode(1_002_030_018, "该直推人名称有重复的,请选择电话查询");
+    ErrorCode DUSER_MOBILE_NOT_EXISTS = new ErrorCode(1_002_030_019, "该直推人电话不存在");
 
 }

+ 1 - 13
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/DuserController.java

@@ -1,8 +1,5 @@
 package cn.newfeifan.mall.module.distri.controller.admin.duser;
 
-import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.TreeNode;
-import cn.newfeifan.mall.module.member.controller.admin.user.vo.MemberUserRespVO;
-import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -69,19 +66,10 @@ public class DuserController {
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('distri:duser:query')")
     public CommonResult<DuserRespVO> getDuser(@RequestParam("id") Long id) {
-        DuserDO duser = duserService.getDuser(id);
+        DuserDO duser = duserService.getDuserByUser(id);
         return success(BeanUtils.toBean(duser, DuserRespVO.class));
     }
 
-    @GetMapping("/getDescendants")
-    @Operation(summary = "通过推荐人获得直推人")
-    @Parameter(name = "userId", description = "编号", required = true, example = "1024")
-    @Parameter(name = "depth", description = "层次", required = true, example = "1")
-    @PreAuthorize("@ss.hasPermission('distri:duser:query')")
-    public CommonResult<List<MemberUserRespVO>> getDescendants(@RequestParam("userId") Long userId, Long depth) {
-        List<MemberUserDO> descendants = duserService.getDescendants(userId, depth);
-        return success(BeanUtils.toBean(descendants, MemberUserRespVO.class));
-    }
 
     @GetMapping("/page")
     @Operation(summary = "获得推荐用户分页")

+ 0 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserRespVO.java

@@ -62,7 +62,4 @@ public class DuserRespVO {
     @Schema(description = "后代总数")
     private Long childrenCount;
 
-    @Schema(description = "用户头像")
-    private String avatar;
-
 }

+ 10 - 7
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/PtProfitLogController.java

@@ -1,14 +1,15 @@
 package cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog;
 
 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;
 
-import javax.validation.constraints.*;
 import javax.validation.*;
 import javax.servlet.http.*;
 import java.util.*;
@@ -18,11 +19,13 @@ 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.ptprofitlog.vo.*;
@@ -75,8 +78,9 @@ public class PtProfitLogController {
     @Operation(summary = "获得平台利润记录分页")
     @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:query')")
     public CommonResult<PageResult<PtProfitLogRespVO>> getPtProfitLogPage(@Valid PtProfitLogPageReqVO pageReqVO) {
-        PageResult<PtProfitLogDO> pageResult = ptProfitLogService.getPtProfitLogPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, PtProfitLogRespVO.class));
+        PageResult<PtProfitLogRespVO> pageResult = ptProfitLogService.getPtProfitLogPage(pageReqVO);
+
+        return success(pageResult);
     }
 
     @GetMapping("/export-excel")
@@ -84,12 +88,11 @@ public class PtProfitLogController {
     @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:export')")
     @OperateLog(type = EXPORT)
     public void exportPtProfitLogExcel(@Valid PtProfitLogPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
+                                       HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<PtProfitLogDO> list = ptProfitLogService.getPtProfitLogPage(pageReqVO).getList();
+        List<PtProfitLogRespVO> list = ptProfitLogService.getPtProfitLogPage(pageReqVO).getList();
         // 导出 Excel
-        ExcelUtils.write(response, "平台利润记录.xls", "数据", PtProfitLogRespVO.class,
-                        BeanUtils.toBean(list, PtProfitLogRespVO.class));
+        ExcelUtils.write(response, "平台利润记录.xls", "数据", PtProfitLogRespVO.class,list);
     }
 
 }

+ 4 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java

@@ -2,9 +2,7 @@ package cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.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.*;
 
@@ -48,4 +46,7 @@ public class PtProfitLogRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "排序")
+    private Integer sort;
+
 }

+ 18 - 6
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/SharePathController.java

@@ -11,7 +11,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Operation;
 
-import javax.validation.constraints.*;
 import javax.validation.*;
 import javax.servlet.http.*;
 import java.util.*;
@@ -88,6 +87,14 @@ public class SharePathController {
         return success(BeanUtils.toBean(sharePath, SharePathRespVO.class));
     }
 
+    @GetMapping("/getDescendants")
+    @Operation(summary = "通过推荐人获得直推人")
+    @PreAuthorize("@ss.hasPermission('distri:duser:query')")
+    public CommonResult<PageResult<SharePathRespVO>> getDescendants(@Valid SharePathPageReqVO pageReqVO) {
+        PageResult<SharePathRespVO> descendants = sharePathService.getDescendants(pageReqVO);
+        return success(descendants);
+    }
+
     @GetMapping("/page")
     @Operation(summary = "获得分销用户关系分页")
     @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
@@ -121,12 +128,17 @@ public class SharePathController {
     @GetMapping("/getTree")
     @Operation(summary = "获取分销人员关系树")
     @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
-    public CommonResult<TreeNode> getTree(@RequestParam("userId") Long userId) {
-        TreeNode sharePath = sharePathService.getTree(userId);
+    public CommonResult<TreeNode> getTree(@RequestParam("userId") Long userId,
+                                          @RequestParam("maxDepth") Integer maxDepth) {
+        TreeNode sharePath = sharePathService.getTree(userId,maxDepth);
         return success(sharePath);
     }
 
-
-
-
+    @GetMapping("/getTreeByNameOrMobile")
+    @Operation(summary = "通过人员的名称或者电话获取分销人员关系树")
+    @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
+    public CommonResult<TreeNode> getTreeByNameOrMobile(SharePathTreeReqVO sharePathTreeReqVO) {
+        TreeNode sharePath = sharePathService.getTreeByNameOrMobile(sharePathTreeReqVO);
+        return success(sharePath);
+    }
 }

+ 3 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathRespVO.java

@@ -2,9 +2,6 @@ package cn.newfeifan.mall.module.distri.controller.admin.sharepath.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.*;
 
@@ -61,4 +58,7 @@ public class SharePathRespVO {
     @Schema(description = "直推人昵称", example = "张三")
     @ExcelProperty("直推人昵称")
     private String descNickName;
+
+    @Schema(description = "用户头像")
+    private String avatar;
 }

+ 22 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathTreeReqVO.java

@@ -0,0 +1,22 @@
+package cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 分销用户关系树 Request VO")
+@Data
+@ToString(callSuper = true)
+public class SharePathTreeReqVO {
+    @Schema(description = "名称")
+    private String name;
+
+    @Schema(description = "电话")
+    private String mobile;
+
+    @Schema(description = "最大层级")
+    @NotNull(message = "最大层级不能为空")
+    private Integer maxDepth;
+}

+ 12 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/TreeNode.java

@@ -12,10 +12,21 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class TreeNode {
-    private Long id;
+    private Long userId;
     private String name; // 节点名称
     private String nickname;
     private String phone;
+    private Integer deep;
     private Integer value; // 节点值,某些节点可能没有值
+    private Long parentId; // 父亲Id
+    private Boolean hasSon;
     private List<TreeNode> children; // 子节点列表
+
+    public Boolean getHasSon() {
+        if (children == null) {
+            return false;
+        }
+        return !children.isEmpty();
+    }
 }
+

+ 1 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java

@@ -1,6 +1,5 @@
 package cn.newfeifan.mall.module.distri.dal.mysql.ptprofitlog;
 
-import java.util.*;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -26,7 +25,6 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                 .eqIfPresent(PtProfitLogDO::getProfitStatus, reqVO.getProfitStatus())
                 .eqIfPresent(PtProfitLogDO::getUserId, reqVO.getUserId())
                 .eqIfPresent(PtProfitLogDO::getOrderId, reqVO.getOrderId())
-                .eqIfPresent(PtProfitLogDO::getOrderNo, reqVO.getOrderNo())
-                .orderByDesc(PtProfitLogDO::getId));
+                .eqIfPresent(PtProfitLogDO::getOrderNo, reqVO.getOrderNo()));
     }
 }

+ 19 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharepath/SharePathMapper.java

@@ -33,6 +33,17 @@ public interface SharePathMapper extends BaseMapperX<SharePathDO> {
                 .likeIfPresent(SharePathDO::getDescNickName, reqVO.getDescNickName())
                 .orderByDesc(SharePathDO::getId));
     }
+    default PageResult<SharePathDO> selectDescendantsPage(SharePathPageReqVO reqVO) {
+        LambdaQueryWrapperX<SharePathDO> queryWrapper = new LambdaQueryWrapperX<SharePathDO>()
+                .eqIfPresent(SharePathDO::getAncestor, reqVO.getAncestor());
+        if(reqVO.getDepth() != null){
+            queryWrapper.eq(SharePathDO::getDepth, 1);
+            queryWrapper.orderByAsc(SharePathDO::getSort);
+        }else {
+            queryWrapper.ne(SharePathDO::getDepth, 1);
+        }
+        return selectPage(reqVO, queryWrapper);
+    }
 
     void addNode(@Param("parentId") Long parentId,
                  @Param("parentName") String parentName,
@@ -61,7 +72,14 @@ public interface SharePathMapper extends BaseMapperX<SharePathDO> {
     List<Long> findLessSortedSiblings(@Param("descendantId") Long descendantId);
 
 
-    List<TreeNode> selectDescendants(@Param("ancestor")  Long userId);
+    List<TreeNode> selectDescendants(@Param("ancestor") Long userId,  @Param("maxDepth") Integer maxDepth);
+
+    default Long selectAncestorByDescendant(Long userId){
+        return selectOne(new LambdaQueryWrapperX<SharePathDO>()
+                .eq(SharePathDO::getDescendant, userId)
+                .eq(SharePathDO::getDepth, 1)
+        ).getAncestor();
+    }
 }
 
 

+ 5 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java

@@ -6,7 +6,6 @@ import cn.newfeifan.mall.module.distri.controller.admin.duser.vo.*;
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.SharePathSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 
 /**
  * 推荐用户 Service 接口
@@ -82,5 +81,9 @@ public interface DuserService {
      */
     DuserInfoVO getDuserInfo(Long userId);
 
-    List<MemberUserDO> getDescendants(Long userId, Long depth);
+    DuserDO getDuserByUser(Long userId);
+
+    List<DuserDO> getDuserByName(String name);
+
+    DuserDO getDuserByMobile(String mobile);
 }

+ 21 - 23
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java

@@ -13,7 +13,6 @@ import cn.newfeifan.mall.module.distri.service.socialstatus.SocialStatusService;
 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.service.user.MemberUserService;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -21,7 +20,6 @@ import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 import cn.newfeifan.mall.module.distri.controller.admin.duser.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
@@ -87,6 +85,11 @@ public class DuserServiceImpl implements DuserService {
         duserMapper.deleteById(id);
     }
 
+    @Override
+    public DuserDO getDuser(Long id) {
+        return duserMapper.selectById(id);
+    }
+
     private void validateDuserExists(Long id) {
         if (duserMapper.selectById(id) == null) {
             throw exception(DUSER_NOT_EXISTS);
@@ -94,8 +97,22 @@ public class DuserServiceImpl implements DuserService {
     }
 
     @Override
-    public DuserDO getDuser(Long id) {
-        return duserMapper.selectById(id);
+    public DuserDO getDuserByUser(Long id) {
+        return duserMapper.selectOne(new LambdaQueryWrapperX<DuserDO>().eq(DuserDO::getUserId,id));
+    }
+
+    @Override
+    public List<DuserDO> getDuserByName(String name) {
+        return duserMapper.selectList(new LambdaQueryWrapperX<DuserDO>()
+                .eq(DuserDO::getName,name)
+        );
+    }
+
+    @Override
+    public DuserDO getDuserByMobile(String mobile) {
+        return duserMapper.selectOne(new LambdaQueryWrapperX<DuserDO>()
+                .eq(DuserDO::getMobile,mobile)
+        );
     }
 
     @Override
@@ -206,23 +223,4 @@ public class DuserServiceImpl implements DuserService {
             ));
         }
     }
-
-    @Override
-    public List<MemberUserDO> getDescendants(Long userId, Long depth) {
-        LambdaQueryWrapperX<SharePathDO> wrapper = new LambdaQueryWrapperX<SharePathDO>()
-                .eq(SharePathDO::getAncestor, userId);
-        if(depth != null){
-            wrapper.eq(SharePathDO::getDepth, 1);
-        }else {
-            wrapper.ne(SharePathDO::getDepth, 1);
-        }
-        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(wrapper);
-        List<Long> userIds = sharePathDOS.stream().map(SharePathDO::getDescendant).collect(Collectors.toList());
-
-
-        return memberUserMapper.selectList(new LambdaQueryWrapper<MemberUserDO>()
-                .in(MemberUserDO::getId, userIds)
-        );
-    }
-
 }

+ 0 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java

@@ -150,8 +150,6 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             // 计算兄弟分区, 以及后代分区
             partitionCrashService.calcCrash(userId);
         }
-
-
     }
 
     @Override

+ 5 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java

@@ -2,6 +2,7 @@ package cn.newfeifan.mall.module.distri.service.ptprofitlog;
 
 import java.util.*;
 import javax.validation.*;
+
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -50,7 +51,7 @@ public interface PtProfitLogService {
      * @param pageReqVO 分页查询
      * @return 平台利润记录分页
      */
-    PageResult<PtProfitLogDO> getPtProfitLogPage(PtProfitLogPageReqVO pageReqVO);
+    PageResult<PtProfitLogRespVO> getPtProfitLogPage(PtProfitLogPageReqVO pageReqVO);
 
     void saveBatch(List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS);
 
@@ -61,12 +62,14 @@ public interface PtProfitLogService {
      * @param caclEnum    日志模板
      * @param amount      增加额度
      * @param afterAmount 增加之后的额度
-     * @param jsonString
+     * @param jsonString  百分比计算模板
      */
     void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount, String jsonString);
+    void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount);
 
     /**
      * 获取昨日的日志信息
+     *
      * @param sonsId
      * @return
      */

+ 19 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java

@@ -2,7 +2,6 @@ package cn.newfeifan.mall.module.distri.service.ptprofitlog;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -35,6 +34,8 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
     private PtProfitLogMapper ptProfitLogMapper;
 
 
+
+
     @Override
     public Long createPtProfitLog(PtProfitLogSaveReqVO createReqVO) {
         // 插入
@@ -73,8 +74,14 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
     }
 
     @Override
-    public PageResult<PtProfitLogDO> getPtProfitLogPage(PtProfitLogPageReqVO pageReqVO) {
-        return ptProfitLogMapper.selectPage(pageReqVO);
+    public PageResult<PtProfitLogRespVO> getPtProfitLogPage(PtProfitLogPageReqVO pageReqVO) {
+        PageResult<PtProfitLogDO> ptProfitLogDOPageResult = ptProfitLogMapper.selectPage(pageReqVO);
+        PageResult<PtProfitLogRespVO> result = BeanUtils.toBean(ptProfitLogDOPageResult, PtProfitLogRespVO.class);
+
+        for (int i = 0; i < result.getList().size(); i++) {
+            result.getList().get(i).setSort((pageReqVO.getPageNo()-1)*pageReqVO.getPageSize() + i+1);
+        }
+        return result;
     }
 
     @Override
@@ -93,6 +100,15 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
                 .profitStatus(caclEnum.getType())
                 .build();
         ptProfitLogMapper.insert(BeanUtils.toBean(ptProfitLog, PtProfitLogDO.class));
+        // todo 发送通知
+        // todo 发短信
+
+    }
+
+    @Override
+    public void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount) {
+
+
 
     }
 

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

@@ -8,7 +8,6 @@ import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
 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;
 
 /**
  * 分销用户关系 Service 接口
@@ -55,7 +54,6 @@ public interface SharePathService {
     PageResult<SharePathDO> getSharePathPage(SharePathPageReqVO pageReqVO);
 
 
-    TreeNode getTree(Long userId);
 
 
     /**
@@ -100,4 +98,8 @@ public interface SharePathService {
 
     List<Long> sonsId(Long userId);
 
+    PageResult<SharePathRespVO> getDescendants(SharePathPageReqVO pageReqVO);
+    TreeNode getTree(Long userId,  Integer maxDepth);
+
+    TreeNode getTreeByNameOrMobile(SharePathTreeReqVO sharePathTreeReqVO);
 }

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

@@ -7,6 +7,7 @@ import cn.newfeifan.mall.module.distri.service.duser.DuserService;
 import cn.newfeifan.mall.module.distri.service.ordercalc.OrderCalcService;
 import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 import cn.newfeifan.mall.module.member.service.user.MemberUserService;
+import com.aliyuncs.utils.StringUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
@@ -155,11 +156,32 @@ public class SharePathServiceImpl implements SharePathService {
         return sharePathMapper.selectPage(pageReqVO);
     }
 
+
     @Override
-    public TreeNode getTree(Long userId) {
+    public TreeNode getTree(Long userId, Integer maxDepth) {
         // 如果user为空, 则查询全部信息
-        DuserDO sharePathDO = duserService.getDuser(userId);
-        List<TreeNode> treeNodes = sharePathMapper.selectDescendants(userId);
+        if (userId == null) {
+            userId = PT_ID;
+        }
+        DuserDO sharePathDO = duserService.getDuserByUser(userId);
+        // 查询层级范围
+        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().eq(SharePathDO::getAncestor, userId)
+                .between(SharePathDO::getDepth, 1, maxDepth));
+
+        List<TreeNode> deep = sharePathDO2TreeNode(sharePathDOS);
+        if (maxDepth > 1) {
+            List<Long> descs = sharePathDOS.stream().filter(k -> k.getDepth() > 1).map(SharePathDO::getDescendant).collect(Collectors.toList());
+            if (!descs.isEmpty()) {
+                // 获取大于1层级的数据
+                List<SharePathDO> descList = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().ne(SharePathDO::getAncestor, 1).in(SharePathDO::getDescendant, descs));
+                List<TreeNode> treeNodes1 = sharePathDO2TreeNode(descList);
+                deep = deep.stream().filter(k -> k.getDeep() == 1).collect(Collectors.toList());
+                deep.addAll(treeNodes1);
+            }
+        }
+        // 整合结构
+        List<TreeNode> treeNodes = listWithTree(deep, userId);
+
         TreeNode build = TreeNode.builder()
                 .phone(sharePathDO.getMobile())
                 .name(sharePathDO.getName())
@@ -168,6 +190,66 @@ public class SharePathServiceImpl implements SharePathService {
         return build;
     }
 
+    @Override
+    public TreeNode getTreeByNameOrMobile(SharePathTreeReqVO sharePathTreeReqVO) {
+        //拿到当前用户ID
+        Long userId = getUserIdByNameOrMobile(sharePathTreeReqVO.getName(), sharePathTreeReqVO.getMobile());
+
+        //拿到推荐人ID
+        Long ancestor = sharePathMapper.selectAncestorByDescendant(userId);
+        return getTree(ancestor, sharePathTreeReqVO.getMaxDepth());
+    }
+
+    private Long getUserIdByNameOrMobile(String name, String mobile) {
+        if (!StringUtils.isEmpty(name)) {
+            List<DuserDO> duserDOS = duserService.getDuserByName(name);
+            if (duserDOS.isEmpty()) {
+                throw exception(DUSER_NAME_NOT_EXISTS);
+            } else if (duserDOS.size() > 1) {
+                throw exception(DUSER_NAME_IS_NOT_ONLY_ONE);
+            }
+
+            return duserDOS.get(0).getUserId();
+        } else {
+            DuserDO duserDO = duserService.getDuserByMobile(mobile);
+            if (duserDO == null) {
+                throw exception(DUSER_MOBILE_NOT_EXISTS);
+            }
+            return duserDO.getUserId();
+        }
+    }
+
+
+    public List<TreeNode> sharePathDO2TreeNode(List<SharePathDO> sharePathDOS) {
+        return sharePathDOS.stream().map(k -> TreeNode.builder()
+                .phone(k.getDescPhone())
+                .name(k.getDescName())
+                .deep(k.getDepth())
+                .parentId(k.getAncestor())
+                .userId(k.getDescendant())
+                .nickname(k.getDescNickName()).build()).collect(Collectors.toList());
+    }
+
+
+    public static List<TreeNode> listWithTree(List<TreeNode> all, Long pid) {
+        // 2、找到一级父类,再通过级联去查询儿子
+        return all.stream().filter(k ->
+                k.getParentId().equals(pid)   //查询父类
+        ).map(k -> {
+            k.setChildren(getChildren(k, all));
+            return k;//查询子类菜单
+        }).collect(Collectors.toList());
+    }
+
+    public static List<TreeNode> getChildren(TreeNode root, List<TreeNode> all) {
+        // 递归查找所有后代的儿子
+        return all.stream().filter(k -> k.getParentId().equals(root.getUserId()))
+                .map(k -> {
+                    k.setChildren(getChildren(k, all));
+                    return k;
+                }).collect(Collectors.toList());
+    }
+
     @Override
     public void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO) {
         // todo 转让用户关系
@@ -270,5 +352,24 @@ public class SharePathServiceImpl implements SharePathService {
 
     }
 
+    @Override
+    public PageResult<SharePathRespVO> getDescendants(SharePathPageReqVO pageReqVO) {
+        LambdaQueryWrapperX<SharePathDO> wrapper = new LambdaQueryWrapperX<SharePathDO>()
+                .eq(SharePathDO::getAncestor, pageReqVO.getAncestor());
+        if (pageReqVO.getDepth() != null) {
+            wrapper.eq(SharePathDO::getDepth, 1);
+        } else {
+            wrapper.ne(SharePathDO::getDepth, 1);
+        }
+
+        PageResult<SharePathDO> sharePathDOPageResult = sharePathMapper.selectDescendantsPage(pageReqVO);
+        PageResult<SharePathRespVO> result = BeanUtils.toBean(sharePathDOPageResult, SharePathRespVO.class);
+        List<SharePathRespVO> list = result.getList();
+        list.forEach(sharePath -> {
+            sharePath.setAvatar(memberUserService.getUser(sharePath.getDescendant()).getAvatar());
+        });
+        return result;
+    }
+
 
 }

+ 32 - 12
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml

@@ -104,24 +104,44 @@
                     column="descendant" select="selectDescendants" />
 
     </resultMap>
-  <!--  <select id="selectTopLevelAncestors" resultMap="TreeNodeMap">
-        SELECT descendant, desc_name
-        FROM distri_share_path
-        WHERE depth = 1
-    </select>-->
+
 
     <select id="selectDescendants"
             resultMap="TreeNodeMap">
+
+
         WITH RECURSIVE SubPath AS (
-            SELECT descendant, desc_name, depth
-            FROM distri_share_path
-            WHERE ancestor = #{ancestor}
+            SELECT
+                descendant,
+                desc_name,
+                depth,
+                1 AS current_depth
+            FROM
+                distri_share_path
+            WHERE
+                ancestor = #{ancestor}
+              AND depth = 1
             UNION ALL
-            SELECT d.descendant, d.desc_name, d.depth
-            FROM distri_share_path d
-                     INNER JOIN SubPath sp ON sp.descendant = d.ancestor
+            SELECT
+                d.descendant,
+                d.desc_name,
+                d.depth,
+                sp.current_depth + 1
+            FROM
+                distri_share_path d
+                    JOIN
+                SubPath sp ON sp.descendant = d.ancestor
+            WHERE
+                sp.current_depth <![CDATA[<]]> #{maxDepth}
         )
-        SELECT * FROM SubPath
+        SELECT
+            descendant,
+            desc_name,
+            depth
+        FROM
+            SubPath
+        WHERE
+            current_depth <![CDATA[<=]]> #{maxDepth};
 
     </select>
 </mapper>

+ 8 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/ProductSpuController.java

@@ -117,6 +117,14 @@ public class ProductSpuController {
         return success(BeanUtils.toBean(pageResult, ProductSpuRespVO.class));
     }
 
+    @GetMapping("/getFavoriteByUser")
+    @Operation(summary = "根据用户id获得商品收藏分页")
+    @PreAuthorize("@ss.hasPermission('product:favorite:query')")
+    public CommonResult<PageResult<ProductSpuRespVO>> getFavoriteByUser(@Valid ProductSpuPageReqVO pageVO){
+        PageResult<ProductSpuRespVO> pageResult = productSpuService.getFavoriteByUser(pageVO);
+        return success(pageResult);
+    }
+
     @GetMapping("/get-count")
     @Operation(summary = "获得商品 SPU 分页 tab count")
     @PreAuthorize("@ss.hasPermission('product:spu:query')")

+ 3 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java

@@ -75,4 +75,7 @@ public class ProductSpuPageReqVO extends PageParam {
 
     @Schema(description = "商户id", example = "8240")
     private Long merchantId;
+
+    @Schema(description = "用户Id")
+    private Long userId;
 }

+ 7 - 1
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/mysql/spu/ProductSpuMapper.java

@@ -9,11 +9,11 @@ import cn.newfeifan.mall.module.product.controller.app.spu.vo.AppProductSpuPageR
 import cn.newfeifan.mall.module.product.dal.dataobject.spu.ProductSpuDO;
 import cn.newfeifan.mall.module.product.enums.ProductConstants;
 import cn.newfeifan.mall.module.product.enums.spu.ProductSpuStatusEnum;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 
@@ -39,6 +39,12 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> {
         return selectPage(reqVO, queryWrapper);
     }
 
+    default PageResult<ProductSpuDO> selectPage(ProductSpuPageReqVO reqVO, List<Long> spuIds) {
+        LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<ProductSpuDO>()
+                .in(ProductSpuDO::getId, spuIds);
+        return selectPage(reqVO, queryWrapper);
+    }
+
     /**
      * 查询触发警戒库存的 SPU 数量
      *

+ 3 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/favorite/ProductFavoriteService.java

@@ -6,6 +6,7 @@ import cn.newfeifan.mall.module.product.controller.app.favorite.vo.AppFavoritePa
 import cn.newfeifan.mall.module.product.dal.dataobject.favorite.ProductFavoriteDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 商品收藏 Service 接口
@@ -61,4 +62,6 @@ public interface ProductFavoriteService {
      */
     Long getFavoriteCount(Long userId);
 
+    List<Long> getSpuByUserId(Long userId);
+
 }

+ 13 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/favorite/ProductFavoriteServiceImpl.java

@@ -6,12 +6,16 @@ import cn.newfeifan.mall.module.product.controller.app.favorite.vo.AppFavoritePa
 import cn.newfeifan.mall.module.product.convert.favorite.ProductFavoriteConvert;
 import cn.newfeifan.mall.module.product.dal.dataobject.favorite.ProductFavoriteDO;
 import cn.newfeifan.mall.module.product.dal.mysql.favorite.ProductFavoriteMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.module.product.enums.ErrorCodeConstants.FAVORITE_EXISTS;
 import static cn.newfeifan.mall.module.product.enums.ErrorCodeConstants.FAVORITE_NOT_EXISTS;
@@ -70,4 +74,13 @@ public class ProductFavoriteServiceImpl implements ProductFavoriteService {
         return productFavoriteMapper.selectCountByUserId(userId);
     }
 
+    @Override
+    public List<Long> getSpuByUserId(Long userId) {
+        List<ProductFavoriteDO> productFavoriteDOS = productFavoriteMapper.selectList(new LambdaQueryWrapper<ProductFavoriteDO>()
+                .eq(ProductFavoriteDO::getUserId, userId)
+        );
+
+        return productFavoriteDOS.stream().map(ProductFavoriteDO::getSpuId).collect(Collectors.toList());
+    }
+
 }

+ 2 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuService.java

@@ -2,6 +2,7 @@ package cn.newfeifan.mall.module.product.service.spu;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuPageReqVO;
+import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuRespVO;
 import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO;
 import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO;
 import cn.newfeifan.mall.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
@@ -140,4 +141,5 @@ public interface ProductSpuService {
     @Async
     void updateBrowseCount(Long id, int incrCount);
 
+    PageResult<ProductSpuRespVO> getFavoriteByUser(ProductSpuPageReqVO pageVO);
 }

+ 14 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuServiceImpl.java

@@ -15,6 +15,7 @@ import cn.newfeifan.mall.module.product.dal.mysql.spu.ProductSpuMapper;
 import cn.newfeifan.mall.module.product.enums.spu.ProductSpuStatusEnum;
 import cn.newfeifan.mall.module.product.service.brand.ProductBrandService;
 import cn.newfeifan.mall.module.product.service.category.ProductCategoryService;
+import cn.newfeifan.mall.module.product.service.favorite.ProductFavoriteService;
 import cn.newfeifan.mall.module.product.service.sku.ProductSkuService;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
 import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
@@ -58,6 +59,9 @@ public class ProductSpuServiceImpl implements ProductSpuService {
     @Resource
     private ProductCategoryService categoryService;
 
+    @Resource
+    private ProductFavoriteService favoriteService;
+
 
     @Resource
     private StringRedisTemplate stringRedisTemplate;
@@ -177,6 +181,16 @@ public class ProductSpuServiceImpl implements ProductSpuService {
         productSpuMapper.updateBrowseCount(id , incrCount);
     }
 
+    @Override
+    public PageResult<ProductSpuRespVO> getFavoriteByUser(ProductSpuPageReqVO reqVO) {
+        List<Long> spuIds = favoriteService.getSpuByUserId(reqVO.getUserId());
+        if(spuIds == null || spuIds.isEmpty()){
+            return PageResult.empty();
+        }
+        PageResult<ProductSpuDO> productSpuDOPageResult = productSpuMapper.selectPage(reqVO, spuIds);
+        return BeanUtils.toBean(productSpuDOPageResult, ProductSpuRespVO.class);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteSpu(Long id) {

+ 4 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/aftersale/vo/AfterSalePageReqVO.java

@@ -12,6 +12,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -52,6 +53,9 @@ public class AfterSalePageReqVO extends PageParam {
     @Schema(description = "店铺id", example = "17019")
     private Long shopId;
 
+    @Schema(description = "店铺编号集")
+    private List<Long> shopIds;
+
     @Schema(description = "商户id", example = "27067")
     private Long merchantId;
 

+ 1 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/aftersale/AfterSaleMapper.java

@@ -24,6 +24,7 @@ public interface AfterSaleMapper extends BaseMapperX<AfterSaleDO> {
                 .eqIfPresent(AfterSaleDO::getMerchantId,reqVO.getMerchantId())
                 .eqIfPresent(AfterSaleDO::getWay, reqVO.getWay())
                 .eqIfPresent(AfterSaleDO::getUserId, reqVO.getUserId())
+                .inIfPresent(AfterSaleDO::getShopId, reqVO.getShopIds())
                 .likeIfPresent(AfterSaleDO::getOrderNo, reqVO.getOrderNo())
                 .likeIfPresent(AfterSaleDO::getSpuName, reqVO.getSpuName())
                 .betweenIfPresent(AfterSaleDO::getCreateTime, reqVO.getCreateTime())

+ 9 - 6
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java

@@ -1,13 +1,9 @@
 package cn.newfeifan.mall.sale.controller.admin.shop;
 
-import cn.newfeifan.mall.module.enums.ErrorCodeConstants;
-import cn.newfeifan.mall.module.system.api.user.dto.AdminUserRespDTO;
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
-import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
-import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
 import cn.newfeifan.mall.sale.dal.redis.ShopMessage;
 import cn.newfeifan.mall.sale.service.merchant.MerchantService;
 import cn.newfeifan.mall.sale.service.shop.ShopService;
@@ -32,7 +28,6 @@ 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.error;
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 
 import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
@@ -41,7 +36,6 @@ import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
 
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
 import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.MERCHANT_NOT_EXISTS;
 
 import cn.newfeifan.mall.sale.dal.dataobject.shop.ShopDO;
 
@@ -177,5 +171,14 @@ public class ShopController {
         return success(shops);
     }
 
+    @GetMapping("/getIdsByName")
+    @Operation(summary = "根据店铺名称获取店铺ids")
+    @Parameter(name = "shopName", description = "店铺名称", required = true, example = "XX")
+    @PreAuthorize("@ss.hasPermission('sale:merchant:query')")
+    public CommonResult<List<Long>> getIdsByName(@RequestParam("shopName") String shopName) {
+        // 获取所有店铺
+        List<Long> ids = shopService.getShopByName(shopName);
+        return success(ids);
+    }
 
 }

+ 10 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/mysql/shop/ShopMapper.java

@@ -5,8 +5,12 @@ import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
 import cn.newfeifan.mall.sale.dal.dataobject.shop.ShopDO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * 店铺 Mapper
  *
@@ -25,4 +29,10 @@ public interface ShopMapper extends BaseMapperX<ShopDO> {
                 .orderByDesc(ShopDO::getId));
     }
 
+    default List<Long> selectShopIds(String shopName){
+        List<ShopDO> shopDOS = selectList(new LambdaQueryWrapper<ShopDO>()
+                .like(ShopDO::getName, shopName)
+        );
+        return shopDOS.stream().map(ShopDO::getId).collect(Collectors.toList());
+    }
 }

+ 2 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java

@@ -3,7 +3,6 @@ package cn.newfeifan.mall.sale.service.shop;
 import javax.validation.*;
 
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
-import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
 import cn.newfeifan.mall.sale.dal.dataobject.merchant.MerchantDO;
@@ -103,4 +102,6 @@ public interface ShopService {
     ShopMessage getCurrentShop(Long loginUserId);
 
     List<ShopRespVO> getAllShopByUserId(Long loginUserId);
+
+    List<Long> getShopByName(String shopName);
 }

+ 5 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java

@@ -7,7 +7,6 @@ import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
 import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
 import cn.newfeifan.mall.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
-import cn.newfeifan.mall.sale.controller.admin.merchant.vo.MerchantSaveReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopPageReqVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopRespVO;
 import cn.newfeifan.mall.sale.controller.admin.shop.vo.ShopSaveReqVO;
@@ -161,4 +160,9 @@ public class ShopServiceImpl implements ShopService {
         return getMerchantAllShop(adminUserDO.getMerchantId());
     }
 
+    @Override
+    public List<Long> getShopByName(String shopName) {
+        return shopMapper.selectShopIds(shopName);
+    }
+
 }

+ 1 - 1
feifan-server/src/main/resources/application-local.yaml

@@ -146,7 +146,7 @@ spring:
     admin:
       # Spring Boot Admin Client 客户端的相关配置
       client:
-        url: http://10.0.5.227:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
+        url: http://10.0.5.228:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
         instance:
           service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
       # Spring Boot Admin Server 服务端的相关配置

+ 268 - 0
feifan-server/src/main/resources/application-prod.yaml

@@ -0,0 +1,268 @@
+server:
+  port: 8002
+
+--- #################### 数据库相关配置 ####################
+
+spring:
+  # 数据源配置项
+  autoconfigure:
+    exclude:
+      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+#      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
+#      - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+#      - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
+#      - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+  datasource:
+    druid: # Druid 【监控】相关的全局配置
+      web-stat-filter:
+        enabled: true
+      stat-view-servlet:
+        enabled: true
+        allow: # 设置白名单,不填则允许所有访问
+        url-pattern: /druid/*
+        login-username: # 控制台管理用户名和密码
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          log-slow-sql: true # 慢 SQL 记录
+          slow-sql-millis: 100
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+    dynamic: # 多数据源配置
+      druid: # Druid 【连接池】相关的全局配置
+        initial-size: 1 # 初始连接数
+        min-idle: 1 # 最小连接池数量
+        max-active: 20 # 最大连接池数量
+        max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+        time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+        min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+        max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+        validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+        test-while-idle: true
+        test-on-borrow: false
+        test-on-return: false
+      primary: master
+      datasource:
+        master:
+          name: mall-letcgo
+          url: jdbc:mysql://120.78.5.233:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          username: root
+          password: PA55W0RD
+        slave: # 模拟从库,可根据自己需要修改
+          name: mall-letcgo
+          lazy: true # 开启懒加载,保证启动速度
+          url: jdbc:mysql://120.78.5.233:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          username: root
+          password: PA55W0RD
+
+  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+  redis:
+    host: 47.107.29.61 # 地址
+    port: 6379 # 端口
+    database: 0 # 数据库索引
+#    password: 123456 # 密码,建议生产环境开启
+
+--- #################### 定时任务相关配置 ####################
+
+# Quartz 配置项,对应 QuartzProperties 配置类
+spring:
+  quartz:
+    auto-startup: true # 本地开发环境,尽量不要开启 Job
+    scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
+    job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
+    wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
+    properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
+      org:
+        quartz:
+          # Scheduler 相关配置
+          scheduler:
+            instanceName: schedulerName
+            instanceId: AUTO # 自动生成 instance ID
+          # JobStore 相关配置
+          jobStore:
+            # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
+            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
+            isClustered: true # 是集群模式
+            clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
+            misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
+          # 线程池相关配置
+          threadPool:
+            threadCount: 25 # 线程池大小。默认为 10 。
+            threadPriority: 5 # 线程优先级
+            class: org.quartz.simpl.SimpleThreadPool # 线程池类型
+    jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
+      initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
+
+--- #################### 消息队列相关 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+  name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+
+spring:
+  # RabbitMQ 配置项,对应 RabbitProperties 配置类
+  rabbitmq:
+    host: 127.0.0.1 # RabbitMQ 服务的地址
+    port: 5672 # RabbitMQ 服务的端口
+    username: rabbit # RabbitMQ 服务的账号
+    password: rabbit # RabbitMQ 服务的密码
+  # Kafka 配置项,对应 KafkaProperties 配置类
+  kafka:
+    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+  acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+  expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+# Resilience4j 配置项
+resilience4j:
+  ratelimiter:
+    instances:
+      backendA:
+        limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
+        limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
+        timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
+        register-health-indicator: true # 是否注册到健康监测
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+  endpoints:
+    web:
+      base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+      exposure:
+        include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+  boot:
+    admin:
+      # Spring Boot Admin Client 客户端的相关配置
+      client:
+        url: http://47.107.28.221:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
+        instance:
+          service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+      # Spring Boot Admin Server 服务端的相关配置
+      context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+  file:
+    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+  level:
+    # 配置自己写的 MyBatis Mapper 打印日志
+    cn.newfeifan.mall.module.bpm.dal.mysql: debug
+    cn.newfeifan.mall.module.infra.dal.mysql: debug
+    cn.newfeifan.mall.module.infra.dal.mysql.job.JobLogMapper: INFO # 配置 JobLogMapper 的日志级别为 info
+    cn.newfeifan.mall.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
+    cn.newfeifan.mall.module.pay.dal.mysql: debug
+    cn.newfeifan.mall.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # 配置 JobLogMapper 的日志级别为 info
+    cn.newfeifan.mall.module.system.dal.mysql: debug
+    cn.newfeifan.mall.module.system.dal.mysql.sensitiveword.SensitiveWordMapper: INFO # 配置 SensitiveWordMapper 的日志级别为 info
+    cn.newfeifan.mall.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info
+    cn.newfeifan.mall.module.tool.dal.mysql: debug
+    cn.newfeifan.mall.module.member.dal.mysql: debug
+    cn.newfeifan.mall.module.trade.dal.mysql: debug
+    cn.newfeifan.mall.module.promotion.dal.mysql: debug
+    cn.newfeifan.mall.module.statistics.dal.mysql: debug
+    cn.newfeifan.mall.module.crm.dal.mysql: debug
+    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 非繁人:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+debug: false
+
+--- #################### 微信公众号、小程序相关配置 ####################
+wx:
+  mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
+#    app-id: wx041349c6f39b268b # 测试号(牛希尧提供的)
+#    secret: 5abee519483bc9f8cb37ce280e814bd0
+    app-id: wx917c16ecb85e8fb8 # 测试号(自己的)
+    secret: e6be2d75ba7dc0f3d833469645062b79
+#    app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的)
+#    secret: bd4f9fab889591b62aeac0d7b8d8b4a0
+    # 存储配置,解决 AccessToken 的跨节点的共享
+    config-storage:
+      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
+      key-prefix: wx # Redis Key 的前缀
+      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
+  miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
+    #    appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
+    #    secret: 333ae72f41552af1e998fe1f54e1584a
+    appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
+    secret: 6f270509224a7ae1296bbf1c8cb97aed
+#    appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的)
+#    secret: 4a1a04e07f6a4a0751b39c3064a92c8b
+    config-storage:
+      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
+      key-prefix: wa # Redis Key 的前缀
+      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
+
+--- #################### 非繁相关配置 ####################
+
+# 非繁配置项,设置当前项目所有自定义的配置
+feifan:
+  captcha:
+    enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
+  security:
+    mock-enable: true
+  xss:
+    enable: false
+    exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
+      - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
+      - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
+  pay:
+    order-notify-url: http://zxgz.newfeifan.cn/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
+    refund-notify-url: http://zxgz.newfeifan.cn/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
+  access-log: # 访问日志的配置项
+    enable: false
+  error-code: # 错误码相关配置项
+    enable: false
+  demo: false # 关闭演示模式
+  tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
+
+justauth:
+  enabled: true
+  type:
+    DINGTALK: # 钉钉
+      client-id: dingvrnreaje3yqvzhxg
+      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
+      ignore-check-redirect-uri: true
+    WECHAT_ENTERPRISE: # 企业微信
+      client-id: wwd411c69a39ad2e54
+      client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
+      agent-id: 1000004
+      ignore-check-redirect-uri: true
+    WECHAT_MINI_APP: # 微信小程序
+      client-id: ${wx.miniapp.appid}
+      client-secret: ${wx.miniapp.secret}
+      ignore-check-redirect-uri: true
+      ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验
+    WECHAT_MP: # 微信公众号
+      client-id: ${wx.mp.app-id}
+      client-secret: ${wx.mp.secret}
+      ignore-check-redirect-uri: true
+  cache:
+    type: REDIS
+    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
+
+# TODO 赤焰:这个配置的目的是?
+#ureport配置
+#ureport:
+#  disableHttpSessionReportCache: true #是否禁用
+#  disableFileProvider: true #是否禁用
+#  debug: true
+#  fileStoreDir: D://ureport//files
+#  provider:
+#    database:
+#       disabled: true
+#    file:
+#       disabled: true
+
+