Pārlūkot izejas kodu

完善CID订单统计

cgp 4 dienas atpakaļ
vecāks
revīzija
dcd4e592b8

+ 14 - 2
fs-admin/src/main/java/com/fs/company/controller/CompanyStatisticsController.java

@@ -12,6 +12,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.company.param.CompanyStatisticsParam;
 import com.fs.company.param.FsStoreStatisticsParam;
 import com.fs.company.param.SalesStatCIDParam;
+import com.fs.company.param.SalesUserDetailCIDParam;
 import com.fs.company.service.ICompanySmsLogsService;
 import com.fs.company.service.ICompanyStatisticsCIDService;
 import com.fs.company.service.ICompanyUserService;
@@ -675,7 +676,7 @@ public class CompanyStatisticsController extends BaseController
     }
 
     /**
-     * 员工销售统计:部门/员工、进粉时间、下单时间 → 进粉量、订单金额、购买次数、购买人数
+     * 员工销售CID订单统计:部门/员工、进粉时间、下单时间 → 进粉量、订单金额、购买次数、购买人数
      */
     @PostMapping("/salesStat")
     @PreAuthorize("@ss.hasPermi('company:statistics:salesStat')")
@@ -683,8 +684,19 @@ public class CompanyStatisticsController extends BaseController
         if (param.getPageNum() != null && param.getPageSize() != null) {
             PageHelper.startPage(param.getPageNum(), param.getPageSize());
         }
-
         List<SalesStatCIDVO> voList = statisticsCIDService.getSalesStatisticsCID(param);
         return getDataTable(voList);
     }
+    /**
+     *  员工销售CID订单明细
+     * */
+    @PostMapping("/salesUserDetail")
+    @PreAuthorize("@ss.hasPermi('company:statistics:salesUserDetail')")
+    public TableDataInfo salesUserDetail(@RequestBody SalesUserDetailCIDParam param) {
+        if (param.getPageNum() != null && param.getPageSize() != null) {
+            PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        }
+        List<SalesUserDetailCIDVO> list = statisticsCIDService.getSalesUserDetailCID(param);
+        return getDataTable(list);
+    }
 }

+ 6 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyStatisticsCIDMapper.java

@@ -1,11 +1,17 @@
 package com.fs.company.mapper;
 
 import com.fs.company.param.SalesStatCIDParam;
+import com.fs.company.param.SalesUserDetailCIDParam;
 import com.fs.company.vo.SalesStatCIDVO;
+import com.fs.company.vo.SalesUserDetailCIDVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 public interface CompanyStatisticsCIDMapper {
+    //获取CID订单统计
     List<SalesStatCIDVO> getSalesStatisticsCID(@Param("param") SalesStatCIDParam param);
+
+    //获取CID订单明细
+    List<SalesUserDetailCIDVO> getSalesUserDetailCID(@Param("param") SalesUserDetailCIDParam param);
 }

+ 18 - 2
fs-service/src/main/java/com/fs/company/param/SalesStatCIDParam.java

@@ -2,6 +2,8 @@ package com.fs.company.param;
 
 import lombok.Data;
 
+import java.util.Arrays;
+
 @Data
 public class SalesStatCIDParam {
     private Long deptId;
@@ -13,6 +15,20 @@ public class SalesStatCIDParam {
     private String startOrderTime;  // 下单开始时间
     private String endOrderTime;    // 下单结束时间
 
-    private Integer pageNum=1;
-    private Integer pageSize=10;
+    // 分页
+    private Integer pageNum = 1;
+    private Integer pageSize = 10;
+
+    // 排序
+    private String orderByColumn;   // 列名(如 fansCount、totalAmount 等)
+    private String isAsc;           // "asc" 或 "desc"
+
+    public void setOrderByColumn(String orderByColumn) {
+        // 仅允许以下列名
+        if (Arrays.asList("fansCount", "totalAmount", "orderCount", "buyerCount").contains(orderByColumn)) {
+            this.orderByColumn = orderByColumn;
+        } else {
+            this.orderByColumn = null;
+        }
+    }
 }

+ 17 - 0
fs-service/src/main/java/com/fs/company/param/SalesUserDetailCIDParam.java

@@ -0,0 +1,17 @@
+package com.fs.company.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class SalesUserDetailCIDParam {
+    @NotNull
+    private Long companyUserId;        // 员工ID
+    private String startOrderTime;     // 下单开始时间
+    private String endOrderTime;       //下单结束时间
+    private Integer pageNum = 1;
+    private Integer pageSize = 10;
+    private String orderByColumn;      // 排序字段:orderCount / totalAmount
+    private String isAsc;              // asc / desc
+}

+ 10 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyStatisticsCIDService.java

@@ -1,10 +1,20 @@
 package com.fs.company.service;
 
+import com.fs.company.param.SalesUserDetailCIDParam;
 import com.fs.company.vo.SalesStatCIDVO;
 import com.fs.company.param.SalesStatCIDParam;
+import com.fs.company.vo.SalesUserDetailCIDVO;
 
 import java.util.List;
 
 public interface ICompanyStatisticsCIDService {
+    /**
+     *  获取销售统计CID
+     * */
     List<SalesStatCIDVO> getSalesStatisticsCID(SalesStatCIDParam param);
+
+    /**
+     *  获取销售人员明细CID
+     * */
+    List<SalesUserDetailCIDVO> getSalesUserDetailCID(SalesUserDetailCIDParam param);
 }

+ 19 - 2
fs-service/src/main/java/com/fs/company/service/impl/CompanyStatisticsCIDCIDServiceImpl.java

@@ -2,11 +2,15 @@ package com.fs.company.service.impl;
 
 import com.fs.company.mapper.CompanyStatisticsCIDMapper;
 import com.fs.company.param.SalesStatCIDParam;
+import com.fs.company.param.SalesUserDetailCIDParam;
 import com.fs.company.service.ICompanyStatisticsCIDService;
 import com.fs.company.vo.SalesStatCIDVO;
+import com.fs.company.vo.SalesUserDetailCIDVO;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.List;
 
 @Service
@@ -18,6 +22,19 @@ public class CompanyStatisticsCIDCIDServiceImpl implements ICompanyStatisticsCID
     @Override
     public List<SalesStatCIDVO> getSalesStatisticsCID(SalesStatCIDParam param) {
         param.setCompanyId(2L);//只查询益寿缘中医院的CID订单
-        return companyStatisticsMapper.getSalesStatisticsCID(param);
+        List<SalesStatCIDVO> salesStatisticsCID = companyStatisticsMapper.getSalesStatisticsCID(param);
+        if (CollectionUtils.isEmpty(salesStatisticsCID)){
+            return Collections.emptyList();
+        }
+        return salesStatisticsCID;
     }
-}
+
+    @Override
+    public List<SalesUserDetailCIDVO> getSalesUserDetailCID(SalesUserDetailCIDParam param) {
+        List<SalesUserDetailCIDVO> salesUserDetailCID = companyStatisticsMapper.getSalesUserDetailCID(param);
+        if (CollectionUtils.isEmpty(salesUserDetailCID)){
+            return Collections.emptyList();
+        }
+        return salesUserDetailCID;
+    }
+}

+ 14 - 0
fs-service/src/main/java/com/fs/company/vo/SalesUserDetailCIDVO.java

@@ -0,0 +1,14 @@
+package com.fs.company.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class SalesUserDetailCIDVO {
+    private Long userId;               // 客户ID
+    private String nickName;           // 客户昵称(从 fs_user 取)
+    private String realName;           // 真实姓名
+    private Integer orderCount;        // 购买次数(去重订单号)
+    private BigDecimal totalAmount;    // 购买总金额(pay_price 求和)
+}

+ 37 - 13
fs-service/src/main/resources/mapper/company/CompanyStatisticsCIDMapper.xml

@@ -22,10 +22,8 @@
         FROM company_user cu
         LEFT JOIN company_dept d ON cu.dept_id = d.dept_id AND d.del_flag = '0'
 
-        -- 进粉统计(始终关联,内部按条件动态过滤)
         LEFT JOIN (
-        SELECT
-        qu.company_user_id,
+        SELECT qu.company_user_id,
         COUNT(DISTINCT ec.id) AS fans_count
         FROM qw_user qu
         INNER JOIN qw_external_contact ec ON ec.qw_user_id = qu.id
@@ -36,27 +34,21 @@
         GROUP BY qu.company_user_id
         ) fc ON fc.company_user_id = cu.user_id
 
-        -- 订单统计(始终关联,内部按条件动态过滤)
         LEFT JOIN (
-        SELECT
-        log.company_user_id,
+        SELECT log.company_user_id,
         SUM(o.pay_price) AS total_amount,
         COUNT(DISTINCT o.order_code) AS order_count,
         COUNT(DISTINCT o.user_id) AS buyer_count
         FROM fs_store_order o
         INNER JOIN (
-        SELECT DISTINCT
-        package_order_code,
-        company_user_id,
-        user_id
+        SELECT DISTINCT package_order_code, company_user_id, user_id
         FROM fs_user_information_collection_personal_log
         WHERE 1 = 1
         <if test="param.startOrderTime != null and param.endOrderTime != null">
             AND order_time BETWEEN #{param.startOrderTime} AND #{param.endOrderTime}
         </if>
         ) log ON o.order_code = log.package_order_code
-        WHERE o.is_pay = 1
-        AND o.refund_status = 0
+        WHERE o.is_pay = 1 AND o.refund_status = 0
         GROUP BY log.company_user_id
         ) oc ON oc.company_user_id = cu.user_id
 
@@ -78,6 +70,38 @@
             AND cu.nick_name LIKE CONCAT('%', #{param.companyUserNickName}, '%')
         </if>
         GROUP BY cu.user_id, cu.nick_name, d.dept_name
-        ORDER BY cu.user_id
+        -- 动态排序 ↓
+        <if test="param.orderByColumn != null and param.orderByColumn != ''">
+            ORDER BY ${param.orderByColumn} ${param.isAsc}
+        </if>
+        <if test="param.orderByColumn == null or param.orderByColumn == ''">
+            ORDER BY cu.user_id
+        </if>
+    </select>
+
+    <select id="getSalesUserDetailCID" resultType="com.fs.company.vo.SalesUserDetailCIDVO">
+        SELECT
+        log.user_id AS userId,
+        fu.nickname AS nickName,
+        COUNT(DISTINCT o.order_code) AS orderCount,
+        SUM(o.pay_price) AS totalAmount
+        FROM (
+        SELECT DISTINCT user_id, package_order_code
+        FROM fs_user_information_collection_personal_log
+        WHERE company_user_id = #{param.companyUserId}
+        <if test="param.startOrderTime != null and param.endOrderTime != null">
+            AND order_time BETWEEN #{param.startOrderTime} AND #{param.endOrderTime}
+        </if>
+        ) log
+        INNER JOIN fs_store_order o ON o.order_code = log.package_order_code
+        AND o.is_pay = 1 AND o.refund_status = 0
+        LEFT JOIN fs_user fu ON fu.user_id = log.user_id
+        GROUP BY log.user_id, fu.nickname
+        <if test="param.orderByColumn != null and param.orderByColumn != ''">
+            ORDER BY ${param.orderByColumn} ${param.isAsc}
+        </if>
+        <if test="param.orderByColumn == null or param.orderByColumn == ''">
+            ORDER BY totalAmount DESC
+        </if>
     </select>
 </mapper>