Browse Source

Merge branch 'master' of http://10.0.5.229:10880/Harper/feifan-backend-zx-admin into dev/2024/0416/update-admin-member

# Conflicts:
#	feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/DuserController.java
#	feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java
#	feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
Yangzw 11 months ago
parent
commit
4b7ae0b711
14 changed files with 249 additions and 34 deletions
  1. 10 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/DuserController.java
  2. 26 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserInfoVO.java
  3. 22 7
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/SharePathController.java
  4. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/TreeNode.java
  5. 1 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharepath/SharePathMapper.java
  6. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java
  7. 33 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  8. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  9. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java
  10. 40 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java
  11. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathService.java
  12. 34 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java
  13. 49 16
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml
  14. 1 1
      feifan-server/src/main/resources/application-local.yaml

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

@@ -1,5 +1,6 @@
 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.*;
@@ -107,5 +108,14 @@ public class DuserController {
     }
 
 
+    @GetMapping("/getDuserInfo")
+    @Operation(summary = "获取分销人员信息")
+    @PreAuthorize("@ss.hasPermission('distri:duser:query')")
+    public CommonResult<DuserInfoVO> getDuserInfo(@RequestParam("userId") Long userId) {
+        DuserInfoVO duserInfo = duserService.getDuserInfo(userId);
+        return success(duserInfo);
+    }
+
+
 
 }

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

@@ -0,0 +1,26 @@
+package cn.newfeifan.mall.module.distri.controller.admin.duser.vo;
+
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+@Schema(description = "管理后台 - 用户基础信息 Request VO")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DuserInfoVO {
+
+
+    @Schema(description = "用户积分信息", example = "IntegralDO")
+    private IntegralDO integralDO;
+
+    @Schema(description = "用户直推人人数", example = "88")
+    private Integer descNo;
+
+    @Schema(description = "团队昨日贡献值=直推奖+合赢奖", example = "88")
+    private Integer descPrice;
+
+    @Schema(description = "团队历史总贡献值=直推奖+合赢奖", example = "88")
+    private Integer descTotalPrice;
+}

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

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.module.distri.controller.admin.sharepath;
 
+import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -50,13 +51,7 @@ public class SharePathController {
         return success(true);
     }
 
-    @GetMapping("/getTree")
-    @Operation(summary = "获取分销人员关系树")
-    @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
-    public CommonResult<SharePathRespVO> getTree() {
-        TreeNode sharePath = sharePathService.getTree();
-        return success(BeanUtils.toBean(sharePath, SharePathRespVO.class));
-    }
+
 
     @PutMapping("/transference_rela")
     @Operation(summary = "转让分销关系")
@@ -114,4 +109,24 @@ public class SharePathController {
                 BeanUtils.toBean(list, SharePathRespVO.class));
     }
 
+
+    @GetMapping("/selectSon")
+    @Operation(summary = "获取当前用户的所有后代")
+    @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
+    public CommonResult<List<DuserDO>> selectSon(@RequestParam("userId") Long userId) {
+        List<DuserDO> pageResult = sharePathService.selectSon(userId);
+        return success(pageResult);
+    }
+
+    @GetMapping("/getTree")
+    @Operation(summary = "获取分销人员关系树")
+    @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
+    public CommonResult<TreeNode> getTree(@RequestParam("userId") Long userId) {
+        TreeNode sharePath = sharePathService.getTree(userId);
+        return success(sharePath);
+    }
+
+
+
+
 }

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

@@ -12,7 +12,10 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class TreeNode {
+    private Long id;
     private String name; // 节点名称
+    private String nickname;
+    private String phone;
     private Integer value; // 节点值,某些节点可能没有值
     private List<TreeNode> children; // 子节点列表
 }

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

@@ -61,10 +61,7 @@ public interface SharePathMapper extends BaseMapperX<SharePathDO> {
     List<Long> findLessSortedSiblings(@Param("descendantId") Long descendantId);
 
 
-
-
-
-
+    List<TreeNode> selectDescendants(@Param("ancestor")  Long userId);
 }
 
 

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

@@ -68,6 +68,19 @@ public interface DuserService {
 
 
     void getSharePathCount(PageResult<DuserRespVO> result);
+    /**
+     * 根据ID列表查询出所有的Id
+     * @param duserId
+     * @return
+     */
+    List<DuserDO> selectUserByUserIds(List<Long> duserId);
+
+    /**
+     * 获取当前推荐人的基础信息
+     * @param userId
+     * @return
+     */
+    DuserInfoVO getDuserInfo(Long userId);
 
     List<MemberUserDO> getDescendants(Long userId, Long depth);
 }

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

@@ -7,6 +7,8 @@ import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 import cn.newfeifan.mall.module.distri.dal.mysql.sharepath.SharePathMapper;
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
+import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
 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;
@@ -52,6 +54,12 @@ public class DuserServiceImpl implements DuserService {
     @Resource
     private MemberUserMapper memberUserMapper;
 
+    @Resource
+    private SharePathService sharePathService;
+
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
 
     @Override
     public Long createDuser(DuserSaveReqVO createReqVO) {
@@ -125,6 +133,31 @@ public class DuserServiceImpl implements DuserService {
         return duserMapper.selectList();
     }
 
+    @Override
+    public List<DuserDO> selectUserByUserIds(List<Long> duserId) {
+        return duserMapper.selectList(new LambdaQueryWrapperX<DuserDO>().inIfPresent(DuserDO::getUserId, duserId));
+    }
+
+    @Override
+    public DuserInfoVO getDuserInfo(Long userId) {
+
+        List<Long> sonsId = sharePathService.sonsId(userId);
+        IntegralDO integral = integralService.getIntegral(userId);
+        if (integral == null){
+            throw exception(INTEGRAL_NOT_EXISTS);
+        }
+        DuserInfoVO.DuserInfoVOBuilder duserInfoVOBuilder = DuserInfoVO.builder()
+                .integralDO(integral)
+                .descNo(sonsId.size());
+
+        // 获取昨日贡献值 + 合赢奖
+        String yesterday = ptProfitLogService.getYesterdayLog(sonsId);
+        String totalLog = ptProfitLogService.getTotalLog(sonsId);
+        return duserInfoVOBuilder.descPrice(Integer.parseInt(yesterday))
+                .descTotalPrice(Integer.parseInt(totalLog)).build();
+
+    }
+
     private void checkAndCreat(Long userId) {
         DuserDO duserDO = duserMapper.selectOne(new LambdaQueryWrapperX<DuserDO>().eqIfPresent(DuserDO::getUserId, userId));
         MemberUserDO user = memberUserService.getUser(userId);

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java

@@ -73,7 +73,7 @@ public class IntegralServiceImpl implements IntegralService {
 
     @Override
     public IntegralDO getIntegral(Long id) {
-        return integralMapper.selectById(id);
+        return integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eqIfPresent(IntegralDO::getUserId, id));
     }
 
     @Override

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

@@ -65,4 +65,13 @@ public interface PtProfitLogService {
      */
     void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount, String jsonString);
 
+    /**
+     * 获取昨日的日志信息
+     * @param sonsId
+     * @return
+     */
+    String getYesterdayLog(List<Long> sonsId);
+
+    String getTotalLog(List<Long> sonsId);
+
 }

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

@@ -1,12 +1,15 @@
 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;
 
 import org.springframework.validation.annotation.Validated;
 
+import java.time.LocalDateTime;
 import java.util.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
@@ -93,4 +96,41 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
 
     }
 
+    @Override
+    public String getYesterdayLog(List<Long> sonsId) {
+
+        // 获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+
+        // 获取昨天的3点
+        LocalDateTime yesterdayThreeAM = now.minusDays(1).withHour(3).withMinute(0).withSecond(0).withNano(0);
+
+        // 获取今天的3点
+        LocalDateTime todayThreeAM = now.withHour(3).withMinute(0).withSecond(0).withNano(0);
+        if (now.isBefore(todayThreeAM)) {
+            // 如果当前时间在今天的3点之前,调整今天的3点为昨天的3点
+            todayThreeAM = todayThreeAM.minusDays(1);
+        }
+
+        List<PtProfitLogDO> ptProfitLogDOS = ptProfitLogMapper.selectList(new LambdaQueryWrapperX<PtProfitLogDO>()
+                .betweenIfPresent(PtProfitLogDO::getCreateTime, yesterdayThreeAM, todayThreeAM)
+                .eqIfPresent(PtProfitLogDO::getProfitStatus, CaclEnum.DIRECT_REFERRAL_QUOTA.getType())
+                .or().eq(PtProfitLogDO::getProfitStatus, CaclEnum.TOGETHER_AWARD.getType())
+                .in(PtProfitLogDO::getUserId, sonsId));
+        int sum = ptProfitLogDOS.stream().mapToInt(PtProfitLogDO::getAmount).sum();
+
+        return sum + "";
+    }
+
+    @Override
+    public String getTotalLog(List<Long> sonsId) {
+        List<PtProfitLogDO> ptProfitLogDOS = ptProfitLogMapper.selectList(new LambdaQueryWrapperX<PtProfitLogDO>()
+                .eqIfPresent(PtProfitLogDO::getProfitStatus, CaclEnum.DIRECT_REFERRAL_QUOTA.getType())
+                .or().eq(PtProfitLogDO::getProfitStatus, CaclEnum.TOGETHER_AWARD.getType())
+                .in(PtProfitLogDO::getUserId, sonsId));
+        int sum = ptProfitLogDOS.stream().mapToInt(PtProfitLogDO::getAmount).sum();
+
+        return sum + "";
+    }
+
 }

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

@@ -4,6 +4,7 @@ import java.util.*;
 import javax.validation.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.*;
+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;
@@ -54,7 +55,7 @@ public interface SharePathService {
     PageResult<SharePathDO> getSharePathPage(SharePathPageReqVO pageReqVO);
 
 
-    TreeNode getTree();
+    TreeNode getTree(Long userId);
 
 
     /**
@@ -94,4 +95,9 @@ public interface SharePathService {
 
     Long queryParentBySonUserId(Long userId);
 
+    List<DuserDO> selectSon(Long userId);
+
+
+    List<Long> sonsId(Long userId);
+
 }

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

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.distri.service.sharepath;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+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.service.duser.DuserService;
 import cn.newfeifan.mall.module.distri.service.ordercalc.OrderCalcService;
@@ -155,10 +156,16 @@ public class SharePathServiceImpl implements SharePathService {
     }
 
     @Override
-    public TreeNode getTree() {
-
-
-        return null;
+    public TreeNode getTree(Long userId) {
+        // 如果user为空, 则查询全部信息
+        DuserDO sharePathDO = duserService.getDuser(userId);
+        List<TreeNode> treeNodes = sharePathMapper.selectDescendants(userId);
+        TreeNode build = TreeNode.builder()
+                .phone(sharePathDO.getMobile())
+                .name(sharePathDO.getName())
+                .nickname(sharePathDO.getNickName())
+                .children(treeNodes).build();
+        return build;
     }
 
     @Override
@@ -234,6 +241,29 @@ public class SharePathServiceImpl implements SharePathService {
 
     }
 
+    @Override
+    public List<DuserDO> selectSon(Long userId) {
+
+        // 查询当前用户的所有后代
+        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().eqIfPresent(SharePathDO::getAncestor, userId));
+
+        List<Long> duserId = sharePathDOS.stream().map(SharePathDO::getDescendant).collect(Collectors.toList());
+
+        if (duserId.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        return duserService.selectUserByUserIds(duserId);
+
+    }
+
+    @Override
+    public List<Long> sonsId(Long userId) {
+        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().eq(SharePathDO::getAncestor, userId));
+        return sharePathDOS.stream().map(SharePathDO::getDescendant).collect(Collectors.toList());
+
+    }
+
 
     public List<Long> unionList(List<Long> orderUserId, List<Long> userId) {
         return Stream.concat(orderUserId.stream(), userId.stream()).distinct().collect(Collectors.toList());

+ 49 - 16
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml

@@ -9,12 +9,10 @@
                                        anc_name,
                                        anc_nick_name,
                                        anc_phone,
-
                                        descendant,
                                        desc_name,
                                        desc_nick_name,
                                        desc_phone,
-
                                        depth, sort)
         SELECT ancestor,
                anc_name,
@@ -45,22 +43,25 @@
     </insert>
 
 
-
     <!-- Get the maximum sort value for a given parent ID -->
     <select id="getMaxSortByParentId" resultType="int" parameterType="long">
-        SELECT IFNULL(MAX(sort), 0) + 1 FROM distri_share_path WHERE ancestor = #{parentId} AND depth = 1
+        SELECT IFNULL(MAX(sort), 0) + 1
+        FROM distri_share_path
+        WHERE ancestor = #{parentId}
+          AND depth = 1
     </select>
 
 
     <!-- 删除旧的祖先关系 -->
     <delete id="deleteOldAncestors" parameterType="java.lang.Long">
-        DELETE FROM distri_share_path
-        WHERE descendant IN (
-            SELECT descendant FROM distri_share_path WHERE ancestor = #{nodeId}
-        )
-          AND ancestor NOT IN (
-            SELECT descendant FROM distri_share_path WHERE ancestor = #{nodeId}
-        );
+        DELETE
+        FROM distri_share_path
+        WHERE descendant IN (SELECT descendant
+                             FROM distri_share_path
+                             WHERE ancestor = #{nodeId})
+          AND ancestor NOT IN (SELECT descendant
+                               FROM distri_share_path
+                               WHERE ancestor = #{nodeId});
     </delete>
 
     <!-- 添加新的祖先关系 -->
@@ -68,12 +69,14 @@
         INSERT INTO distri_share_path (ancestor, descendant, depth, sort)
         SELECT np.ancestor, c.descendant, np.depth + c.depth + 1, 0
         FROM distri_share_path AS np
-                 CROSS JOIN (
-            SELECT descendant, depth FROM distri_share_path WHERE ancestor = #{nodeId}
-        ) AS c
+                 CROSS JOIN (SELECT descendant, depth
+                             FROM distri_share_path
+                             WHERE ancestor = #{nodeId}) AS c
         WHERE np.descendant = #{newParentId}
         UNION ALL
-        SELECT #{nodeId} as ancestor, descendant, depth + 1, 0 FROM distri_share_path WHERE ancestor = #{nodeId};
+        SELECT #{nodeId} as ancestor, descendant, depth + 1, 0
+        FROM distri_share_path
+        WHERE ancestor = #{nodeId};
     </insert>
 
 
@@ -89,6 +92,36 @@
         SELECT a.descendant
         FROM distri_share_path a
                  JOIN distri_share_path b ON a.ancestor = b.ancestor
-        WHERE b.descendant = #{descendantId} AND a.sort  &lt; b.sort
+        WHERE b.descendant = #{descendantId}
+          AND a.sort &lt; b.sort
+    </select>
+
+
+    <resultMap id="TreeNodeMap" type="cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.TreeNode">
+        <id property="id" column="descendant"/>
+        <result property="name" column="desc_name"/>
+        <collection property="children" ofType="cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.TreeNode"
+                    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}
+            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 * FROM SubPath
+
     </select>
 </mapper>

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

@@ -1,5 +1,5 @@
 server:
-  port: 8004
+  port: 8002
 
 --- #################### 数据库相关配置 ####################