沐梦. 1 тиждень тому
батько
коміт
7db72e7663

+ 9 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerListBo.java

@@ -38,6 +38,15 @@ public class CustomerListBo extends BaseEntity {
     /** 所属部门ID */
     private Long belongingDepartmentId;
 
+    /** 状态/合作状态 */
+    private String status;
+
+    /** 客户名称 */
+    private String customerName;
+
+    /** 企业类型ID */
+    private Long enterpriseTypeId;
+
     /** 是否为公海客户 (true: 是, false: 否) */
     private String isHighSeas;
 }

+ 6 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesAnnualFinalizationBo.java

@@ -313,6 +313,12 @@ public class SalesAnnualFinalizationBo extends BaseEntity {
     @Schema(description = "批量操作ID列表")
     private List<Long> ids;
 
+    /**
+     * 成交结果
+     */
+    @Schema(description = "成交结果")
+    private Integer dealResult;
+
 }
 
 

+ 3 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SalesleadsBo.java

@@ -132,4 +132,7 @@ public class SalesleadsBo extends TenantEntity {
 
     @Schema(description = "保留已有项目负责人(认领时使用)")
     private Boolean keepOldManager;
+
+    @Schema(description = "成交结果")
+    private Integer dealResult;
 }

+ 26 - 11
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/WorkbenchServiceImpl.java

@@ -89,7 +89,7 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
         long newMonth = customerInfoMapper.selectCount(new LambdaQueryWrapper<CustomerInfo>()
             .ge(CustomerInfo::getCreateTime, monthStart).eq(CustomerInfo::getDelFlag, "0"));
         long dealMonth = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
-            .eq(SalesResultAnalyze::getDealResult, 1).ge(SalesResultAnalyze::getCreateTime, monthStart).eq(SalesResultAnalyze::getIsDelete, 0));
+            .eq(SalesResultAnalyze::getDealResult, 1).ge(SalesResultAnalyze::getCreateTime, monthStart).and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
 
         // 7天前值
         long totalOld = countBefore(weekAgo, "0", false);
@@ -151,11 +151,11 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
             win = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
                 .eq(SalesResultAnalyze::getDealResult, 1)
                 .in(SalesResultAnalyze::getObjectNo, oppNos)
-                .eq(SalesResultAnalyze::getIsDelete, 0));
+                .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
             lose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
                 .eq(SalesResultAnalyze::getDealResult, 2)
                 .in(SalesResultAnalyze::getObjectNo, oppNos)
-                .eq(SalesResultAnalyze::getIsDelete, 0));
+                .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
         }
 
         // 7天前
@@ -167,12 +167,12 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
             oldWin = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
                 .eq(SalesResultAnalyze::getDealResult, 1)
                 .in(SalesResultAnalyze::getObjectNo, oppNos)
-                .eq(SalesResultAnalyze::getIsDelete, 0)
+                .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete))
                 .le(SalesResultAnalyze::getCreateTime, weekAgo));
             oldLose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
                 .eq(SalesResultAnalyze::getDealResult, 2)
                 .in(SalesResultAnalyze::getObjectNo, oppNos)
-                .eq(SalesResultAnalyze::getIsDelete, 0)
+                .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete))
                 .le(SalesResultAnalyze::getCreateTime, weekAgo));
         }
 
@@ -219,11 +219,11 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
             win = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
                 .eq(SalesResultAnalyze::getDealResult, 1)
                 .in(SalesResultAnalyze::getObjectNo, selectionNos)
-                .eq(SalesResultAnalyze::getIsDelete, 0));
+                .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
             lose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
                 .eq(SalesResultAnalyze::getDealResult, 2)
                 .in(SalesResultAnalyze::getObjectNo, selectionNos)
-                .eq(SalesResultAnalyze::getIsDelete, 0));
+                .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
         }
 
         List<WorkbenchStatVo.StatItem> stats = new ArrayList<>();
@@ -252,12 +252,27 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
     private List<WorkbenchStatVo.StatItem> getOpportunityFunnel() {
         List<Salesleads> clues = salesleadsMapper.selectList(new LambdaQueryWrapper<Salesleads>().eq(Salesleads::getIzClue, 1).eq(Salesleads::getDelFlag, "0"));
         List<Salesleads> opps = salesleadsMapper.selectList(new LambdaQueryWrapper<Salesleads>().eq(Salesleads::getIzClue, 0).eq(Salesleads::getDelFlag, "0"));
-        long winCount = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>().eq(SalesResultAnalyze::getDealResult, 1).eq(SalesResultAnalyze::getDataType, 2).eq(SalesResultAnalyze::getIsDelete, 0));
+        
+        List<SalesResultAnalyze> wins = salesresultanalyzeMapper.selectList(new LambdaQueryWrapper<SalesResultAnalyze>()
+            .eq(SalesResultAnalyze::getDealResult, 1)
+            .eq(SalesResultAnalyze::getDataType, 2)
+            .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
+            
+        long winCount = wins.size();
+        BigDecimal winAmount = BigDecimal.ZERO;
+        
+        if (!wins.isEmpty()) {
+            List<String> winNos = wins.stream().map(SalesResultAnalyze::getObjectNo).filter(Objects::nonNull).collect(Collectors.toList());
+            if (!winNos.isEmpty()) {
+                winAmount = salesleadsMapper.selectList(new LambdaQueryWrapper<Salesleads>().in(Salesleads::getProjectNo, winNos).eq(Salesleads::getDelFlag, "0"))
+                    .stream().map(Salesleads::getProjectBudget).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+            }
+        }
         
         List<WorkbenchStatVo.StatItem> stats = new ArrayList<>();
         stats.add(new WorkbenchStatVo.StatItem("销售线索", clues.stream().map(Salesleads::getProjectBudget).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, BigDecimal.ROUND_HALF_UP).toString(), clues.size() + "个"));
         stats.add(new WorkbenchStatVo.StatItem("商机", opps.stream().map(Salesleads::getProjectBudget).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, BigDecimal.ROUND_HALF_UP).toString(), opps.size() + "个"));
-        stats.add(new WorkbenchStatVo.StatItem("赢单", "0", winCount + "个")); // 赢单金额需关联
+        stats.add(new WorkbenchStatVo.StatItem("赢单", winAmount.setScale(0, BigDecimal.ROUND_HALF_UP).toString(), winCount + "个"));
         return stats;
     }
 
@@ -274,7 +289,7 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
         
         // 已成交客户:在成交结果表中有记录的
         long deal = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
-            .eq(SalesResultAnalyze::getDealResult, 1).eq(SalesResultAnalyze::getIsDelete, 0));
+            .eq(SalesResultAnalyze::getDealResult, 1).and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
 
         List<WorkbenchStatVo.StatItem> stats = new ArrayList<>();
         stats.add(new WorkbenchStatVo.StatItem("公海客户", String.valueOf(publicPool), "个"));
@@ -296,7 +311,7 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
         List<SalesResultAnalyze> wins = salesresultanalyzeMapper.selectList(new LambdaQueryWrapper<SalesResultAnalyze>()
             .eq(SalesResultAnalyze::getDealResult, 1)
             .ge(SalesResultAnalyze::getCreateTime, monthStart)
-            .eq(SalesResultAnalyze::getIsDelete, 0));
+            .and(w -> w.eq(SalesResultAnalyze::getIsDelete, 0).or().isNull(SalesResultAnalyze::getIsDelete)));
         
         BigDecimal winAmount = BigDecimal.ZERO;
         if (!wins.isEmpty()) {

+ 9 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/CustomerInfoMapper.xml

@@ -113,6 +113,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="bo.belongingDepartmentId != null">
                 AND ci.belonging_department_id = #{bo.belongingDepartmentId}
             </if>
+            <if test="bo.status != null and bo.status != ''">
+                AND ci.status = #{bo.status}
+            </if>
+            <if test="bo.customerName != null and bo.customerName != ''">
+                AND (ci.customer_name LIKE CONCAT('%', #{bo.customerName}, '%') OR ci.business_customer_name LIKE CONCAT('%', #{bo.customerName}, '%'))
+            </if>
+            <if test="bo.enterpriseTypeId != null">
+                AND ci.customer_type_id = #{bo.enterpriseTypeId}
+            </if>
         </where>
         ORDER BY ci.id DESC
     </select>

+ 8 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/SalesAnnualFinalizationMapper.xml

@@ -43,6 +43,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="bo.productSupport != null and bo.productSupport != ''">
                 AND s.product_support = #{bo.productSupport}
             </if>
+            <if test="bo.dealResult != null">
+                AND EXISTS (
+                    SELECT 1 FROM salesresultanalyze sra 
+                    WHERE sra.objectNo COLLATE utf8mb4_unicode_ci = s.project_no COLLATE utf8mb4_unicode_ci 
+                    AND sra.dealResult = #{bo.dealResult}
+                    AND (sra.IsDelete = 0 OR sra.IsDelete IS NULL)
+                )
+            </if>
             ${bo.params.dataScope}
         </where>
         ORDER BY s.create_time DESC

+ 3 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/SalesleadsMapper.xml

@@ -45,6 +45,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="bo.deptNo != null and bo.deptNo != ''">
                 AND cs.dept_id = #{bo.deptNo}
             </if>
+            <if test="bo.dealResult != null">
+                AND sra.dealResult = #{bo.dealResult}
+            </if>
             ${bo.params.dataScope}
         </where>
         ORDER BY create_time DESC