Ver Fonte

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

yys há 2 dias atrás
pai
commit
312055ec82

+ 70 - 0
fs-company/src/main/java/com/fs/app/controller/statistic/MemberReportController.java

@@ -0,0 +1,70 @@
+package com.fs.app.controller.statistic;
+
+import com.fs.app.params.MemberReportQuery;
+import com.fs.app.service.IMemberReportService;
+import com.fs.app.vo.MemberReportVO;
+import com.fs.app.vo.SalesMemberReportVO;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * APP会员统计报表Controller
+ *
+ * @author ylrz
+ * @date 2026-04-22
+ */
+@Api(tags = "APP会员统计报表")
+@RestController
+@RequestMapping("/app/statistics")
+public class MemberReportController extends BaseController
+{
+    @Autowired
+    private IMemberReportService memberReportService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 查询会员统计报表列表(按销售公司)
+     */
+    @ApiOperation("查询会员统计报表列表")
+    @PreAuthorize("@ss.hasPermi('app:statistics:salesMemberReport:list')")
+    @GetMapping("/memberReport")
+    public TableDataInfo memberReport(MemberReportQuery query)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        query.setCompanyId(loginUser.getCompany().getCompanyId());
+        List<SalesMemberReportVO> list = memberReportService.selectMemberReportBySalesList(query);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出会员统计报表
+     */
+    @ApiOperation("导出会员统计报表")
+    @PreAuthorize("@ss.hasPermi('app:statistics:memberReport:export')")
+    @GetMapping("/exportMemberReport")
+    public AjaxResult exportMemberReport(MemberReportQuery query)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        query.setCompanyId(loginUser.getCompany().getCompanyId());
+        List<SalesMemberReportVO> list = memberReportService.selectMemberReportBySalesList(query);
+        ExcelUtil<SalesMemberReportVO> util = new ExcelUtil<SalesMemberReportVO>(SalesMemberReportVO.class);
+        return util.exportExcel(list, "会员统计报表");
+    }
+}
+

+ 5 - 0
fs-service/src/main/java/com/fs/app/mapper/MemberReportMapper.java

@@ -2,6 +2,7 @@ package com.fs.app.mapper;
 
 import com.fs.app.params.MemberReportQuery;
 import com.fs.app.vo.MemberReportVO;
+import com.fs.app.vo.SalesMemberReportVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -18,5 +19,9 @@ public interface MemberReportMapper
     List<MemberReportVO> selectMemberReportListNoTime(@Param("params") MemberReportQuery params);
 
     List<MemberReportVO> selectMemberReportAddCountList(@Param("params") MemberReportQuery query);
+
+    List<SalesMemberReportVO> selectSalesMemberReportListNoTime(@Param("params") MemberReportQuery query);
+
+    List<SalesMemberReportVO> selectSalesMemberReportAddCountList(@Param("params")  MemberReportQuery query);
 }
 

+ 1 - 1
fs-service/src/main/java/com/fs/app/params/MemberReportQuery.java

@@ -16,7 +16,7 @@ public class MemberReportQuery
 {
     /** 公司ID */
     @ApiModelProperty("公司ID")
-    private String companyId;
+    private Long companyId;
 
     /** 开始时间 */
     @ApiModelProperty("开始时间")

+ 10 - 1
fs-service/src/main/java/com/fs/app/service/IMemberReportService.java

@@ -2,6 +2,7 @@ package com.fs.app.service;
 
 import com.fs.app.params.MemberReportQuery;
 import com.fs.app.vo.MemberReportVO;
+import com.fs.app.vo.SalesMemberReportVO;
 
 import java.util.List;
 
@@ -14,11 +15,19 @@ import java.util.List;
 public interface IMemberReportService
 {
     /**
-     * 查询会员统计报表列表
+     * 查询会员统计报表列表 按公司
      *
      * @param query 查询条件
      * @return 会员统计报表集合
      */
     public List<MemberReportVO> selectMemberReportList(MemberReportQuery query);
+
+    /**
+     * 查询会员统计报表列表 按销售
+     *
+     * @param query 查询条件
+     * @return 会员统计报表集合
+     */
+    List<SalesMemberReportVO> selectMemberReportBySalesList(MemberReportQuery query);
 }
 

+ 43 - 0
fs-service/src/main/java/com/fs/app/service/impl/MemberReportServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.app.service.impl;
 
 import com.fs.app.service.IMemberReportService;
+import com.fs.app.vo.SalesMemberReportVO;
 import com.fs.common.core.redis.RedisCache;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +10,7 @@ import com.fs.app.params.MemberReportQuery;
 import com.fs.app.vo.MemberReportVO;
 import com.fs.app.mapper.MemberReportMapper;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -76,4 +78,45 @@ public class MemberReportServiceImpl implements IMemberReportService
 
         return memberReportVOList;
     }
+
+    @Override
+    public List<SalesMemberReportVO> selectMemberReportBySalesList(MemberReportQuery query) {
+        String memberReportKey="memberReport:company:"+query.getCompanyId();
+        List<SalesMemberReportVO> memberReportVOList =redisCache.getCacheObject(memberReportKey);
+        if(memberReportVOList==null || memberReportVOList.isEmpty()){
+            memberReportVOList=memberReportMapper.selectSalesMemberReportListNoTime(query);
+            redisCache.setCacheObject(memberReportKey,memberReportVOList,10,TimeUnit.MINUTES);
+        }
+
+        // 时间为空不查询新增app用户数
+        if(StringUtils.isBlank(query.getSTime())||StringUtils.isBlank(query.getETime())){
+            return memberReportVOList;
+        }
+
+        List<SalesMemberReportVO> memberReportAddCountList =memberReportMapper.selectSalesMemberReportAddCountList(query);
+        if (memberReportAddCountList != null && !memberReportAddCountList.isEmpty()) {
+            Map<Long, SalesMemberReportVO> reportMap = memberReportVOList.stream()
+                    .filter(report -> report.getCompanyUserId() != null)
+                    .collect(Collectors.toMap(
+                            SalesMemberReportVO::getCompanyUserId,
+                            report -> report,
+                            (existing, replacement) -> existing
+                    ));
+
+            for (SalesMemberReportVO addCountReport : memberReportAddCountList) {
+                if (addCountReport.getCompanyUserId() != null) {
+                    SalesMemberReportVO existingReport = reportMap.get(addCountReport.getCompanyUserId());
+
+                    if (existingReport != null) {
+                        existingReport.setNewMemberCount(
+                                addCountReport.getNewMemberCount() != null ?
+                                        addCountReport.getNewMemberCount() : 0L
+                        );
+                    }
+                }
+            }
+        }
+
+        return memberReportVOList;
+    }
 }

+ 43 - 0
fs-service/src/main/java/com/fs/app/vo/SalesMemberReportVO.java

@@ -0,0 +1,43 @@
+package com.fs.app.vo;
+
+import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 会员统计报表视图对象
+ *
+ * @author ylrz
+ * @date 2026-04-22
+ */
+@Data
+@ApiModel("会员统计报表视图对象")
+public class SalesMemberReportVO implements java.io.Serializable
+{
+
+    private static final long serialVersionUID = 1L;
+
+    // 销售用户id
+    private Long companyUserId;
+
+    // 销售公司
+    @Excel(name = "销售名称")
+    private String companyUserName;
+
+    /** 会员总数 */
+    @Excel(name = "会员总数")
+    @ApiModelProperty("会员总数")
+    private Long totalMemberCount;
+
+    /** APP会员数 */
+    @Excel(name = "APP会员数")
+    @ApiModelProperty("APP会员数")
+    private Long appMemberCount;
+
+    /** 新增会员数 */
+    @Excel(name = "APP新增会员数")
+    @ApiModelProperty("新增会员数")
+    private Long newMemberCount = 0L;
+}
+

+ 0 - 47
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -2182,53 +2182,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
             }
         }
 
-        // 获取销售的 app会员数和 新注册的会员数
-        CompletableFuture<List<AppSalesCourseStatisticsVO>> appNewUserFuture = CompletableFuture.supplyAsync(() -> {
-            return userMapper.selectAppSalesNewUserCountVO(param);
-        });
-
-        CompletableFuture<List<AppSalesCourseStatisticsVO>> appUserFuture = CompletableFuture.supplyAsync(() -> {
-            return userMapper.selectAppSalesUserCountVO(param);
-        });
-
-        CompletableFuture.allOf(appNewUserFuture, appUserFuture).join();
-
-        // 整合数据
-        List<AppSalesCourseStatisticsVO> appNewUserCountList = appNewUserFuture.join();
-        List<AppSalesCourseStatisticsVO> appUserCountList = appUserFuture.join();
-
-        if (CollectionUtils.isNotEmpty(appNewUserCountList)) {
-            Map<Long, Long> newUserCountMap = appNewUserCountList.stream()
-                    .collect(Collectors.toMap(
-                            AppSalesCourseStatisticsVO::getCompanyUserId,
-                            AppSalesCourseStatisticsVO::getNewAppUserCount,
-                            (e, r) -> e
-                    ));
-
-            for (AppSalesCourseStatisticsVO vo : dataMap.values()) {
-                Long newAppUserCount = newUserCountMap.get(vo.getCompanyUserId());
-                if (newAppUserCount != null) {
-                    vo.setNewAppUserCount(newAppUserCount);
-                }
-            }
-        }
-
-        if (CollectionUtils.isNotEmpty(appUserCountList)) {
-            Map<Long, Long> userCountMap = appUserCountList.stream()
-                    .collect(Collectors.toMap(
-                            AppSalesCourseStatisticsVO::getCompanyUserId,
-                            AppSalesCourseStatisticsVO::getAppUserCount,
-                            (e, r) -> e
-                    ));
-
-            for (AppSalesCourseStatisticsVO vo : dataMap.values()) {
-                Long appUserCount = userCountMap.get(vo.getCompanyUserId());
-                if (appUserCount != null) {
-                    vo.setAppUserCount(appUserCount);
-                }
-            }
-        }
-
         List<AppSalesCourseStatisticsVO> resultList = new ArrayList<>(dataMap.values());
         resultList.forEach(this::setDefaultValues);
         return resultList;

+ 27 - 0
fs-service/src/main/resources/mapper/app/MemberReportMapper.xml

@@ -81,5 +81,32 @@
             GROUP BY uc.company_id
         ) stats ON c.company_id = stats.company_id
     </select>
+    <select id="selectSalesMemberReportListNoTime" resultType="com.fs.app.vo.SalesMemberReportVO">
+        select
+            uc.company_user_id,
+            us.user_name AS companyUserName,
+            COUNT(DISTINCT uc.user_id) AS totalMemberCount,
+            COUNT(DISTINCT CASE WHEN u.app_open_id IS NOT NULL THEN u.user_id END) AS appMemberCount
+        from fs_user_company_user uc
+        INNER JOIN fs_user u ON uc.user_id = u.user_id
+        INNER JOIN  company_user us on uc.company_user_id=us.user_id
+        where u.is_del=0 and uc.status =1
+        and uc.company_id=#{params.companyId}
+        group by uc.company_user_id
+
+    </select>
+
+
+    <select id="selectSalesMemberReportAddCountList" resultType="com.fs.app.vo.SalesMemberReportVO">
+        SELECT
+        uc.company_user_id,
+        COUNT(DISTINCT uc.user_id) AS newMemberCount
+        FROM fs_user_company_user uc
+        INNER JOIN fs_user u ON uc.user_id = u.user_id
+        where u.is_del=0 and uc.status =1
+        and u.app_create_time &gt;= #{params.sTime} and u.app_create_time &lt;= #{params.eTime}
+        and uc.company_id=#{params.companyId}
+        GROUP BY uc.company_user_id
+    </select>
 
 </mapper>