Przeglądaj źródła

系统人员修复

沐梦. 2 tygodni temu
rodzic
commit
a299a01862

+ 18 - 5
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java

@@ -31,6 +31,7 @@ import org.dromara.customer.service.ICustomerContactService;
 import org.dromara.system.api.RemoteDeptService;
 import org.dromara.system.api.RemoteUserService;
 import org.dromara.system.api.domain.bo.RemoteUserBo;
+import org.dromara.system.api.domain.vo.RemoteDeptVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -111,14 +112,17 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
 
-            Map<Long, String> deptNameMap = deptIds.isEmpty() 
-                ? new HashMap<>() 
+            Map<Long, String> deptNameMap = deptIds.isEmpty()
+                ? new HashMap<>()
                 : remoteDeptService.selectDeptNameByIds(deptIds);
 
             records.forEach(item -> {
                 item.setCustomerName(customerNameMap.get(item.getCustomerId()));
                 if (item.getDeptId() != null) {
-                    item.setDeptName(deptNameMap.get(item.getDeptId()));
+                    String remoteDeptName = deptNameMap.get(item.getDeptId());
+                    if (StringUtils.isNotBlank(remoteDeptName)) {
+                        item.setDeptName(remoteDeptName);
+                    }
                 }
             });
         }
@@ -197,12 +201,11 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean insertByBo(CustomerContactBo bo) {
+        syncDeptName(bo);
         // 1. 获取并校验客户编号
         String customerNo = null;
         if (bo.getCustomerId() != null) {
             CustomerInfoVo customerInfoVo = customerInfoMapper.selectVoById(bo.getCustomerId());
-
-            // 【关键修复】防御性编程:如果查不到客户信息,应直接抛错或返回失败,避免生成 "nullxxx" 数据
             if (customerInfoVo == null) {
                 log.error("客户不存在,无法创建联系人 (ID: " + bo.getCustomerId() + ")");
                 throw new RuntimeException("客户不存在,无法创建联系人 (ID: " + bo.getCustomerId() + ")");
@@ -273,6 +276,7 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateByBo(CustomerContactBo bo) {
+        syncDeptName(bo);
         CustomerContact update = MapstructUtils.convert(bo, CustomerContact.class);
         validEntityBeforeSave(update);
         boolean flag = baseMapper.updateById(update) > 0;
@@ -332,6 +336,15 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
         }
     }
 
+    private void syncDeptName(CustomerContactBo bo) {
+        if (bo.getDeptId() != null && StringUtils.isBlank(bo.getDeptName())) {
+            RemoteDeptVo vo = remoteDeptService.selectDeptById(bo.getDeptId());
+            if (vo != null && StringUtils.isNotBlank(vo.getDeptName())) {
+                bo.setDeptName(vo.getDeptName());
+            }
+        }
+    }
+
     /**
      * 保存前的数据校验
      */

+ 48 - 10
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/WorkbenchServiceImpl.java

@@ -143,20 +143,45 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
         // 当前
         List<Salesleads> list = salesleadsMapper.selectList(new LambdaQueryWrapper<Salesleads>().eq(Salesleads::getIzClue, 0).eq(Salesleads::getDelFlag, "0"));
         BigDecimal amount = list.stream().map(Salesleads::getProjectBudget).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
-        long win = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>().eq(SalesResultAnalyze::getDealResult, 1).eq(SalesResultAnalyze::getDataType, 2).eq(SalesResultAnalyze::getIsDelete, 0));
-        long lose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>().eq(SalesResultAnalyze::getDealResult, 0).eq(SalesResultAnalyze::getDataType, 2).eq(SalesResultAnalyze::getIsDelete, 0));
+        List<String> oppNos = list.stream().map(Salesleads::getProjectNo).filter(Objects::nonNull).collect(Collectors.toList());
+
+        long win = 0;
+        long lose = 0;
+        if (!oppNos.isEmpty()) {
+            win = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
+                .eq(SalesResultAnalyze::getDealResult, 1)
+                .in(SalesResultAnalyze::getObjectNo, oppNos)
+                .eq(SalesResultAnalyze::getIsDelete, 0));
+            lose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
+                .eq(SalesResultAnalyze::getDealResult, 2)
+                .in(SalesResultAnalyze::getObjectNo, oppNos)
+                .eq(SalesResultAnalyze::getIsDelete, 0));
+        }
 
         // 7天前
         List<Salesleads> oldList = salesleadsMapper.selectList(new LambdaQueryWrapper<Salesleads>().eq(Salesleads::getIzClue, 0).eq(Salesleads::getDelFlag, "0").le(Salesleads::getCreateTime, weekAgo));
         BigDecimal oldAmount = oldList.stream().map(Salesleads::getProjectBudget).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
-        long oldWin = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>().eq(SalesResultAnalyze::getDealResult, 1).eq(SalesResultAnalyze::getDataType, 2).eq(SalesResultAnalyze::getIsDelete, 0).le(SalesResultAnalyze::getCreateTime, weekAgo));
+        long oldWin = 0;
+        long oldLose = 0;
+        if (!oppNos.isEmpty()) {
+            oldWin = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
+                .eq(SalesResultAnalyze::getDealResult, 1)
+                .in(SalesResultAnalyze::getObjectNo, oppNos)
+                .eq(SalesResultAnalyze::getIsDelete, 0)
+                .le(SalesResultAnalyze::getCreateTime, weekAgo));
+            oldLose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
+                .eq(SalesResultAnalyze::getDealResult, 2)
+                .in(SalesResultAnalyze::getObjectNo, oppNos)
+                .eq(SalesResultAnalyze::getIsDelete, 0)
+                .le(SalesResultAnalyze::getCreateTime, weekAgo));
+        }
 
         List<WorkbenchStatVo.StatItem> stats = new ArrayList<>();
         stats.add(new WorkbenchStatVo.StatItem("商机总数", String.valueOf(list.size()), calculateTrend(list.size(), oldList.size())));
         stats.add(new WorkbenchStatVo.StatItem("金额", amount.setScale(0, BigDecimal.ROUND_HALF_UP).toString(), calculateTrend(amount, oldAmount)));
         stats.add(new WorkbenchStatVo.StatItem("跟进中", String.valueOf(list.size() - win - lose), -0.05));
         stats.add(new WorkbenchStatVo.StatItem("赢单数", String.valueOf(win), calculateTrend(win, oldWin)));
-        stats.add(new WorkbenchStatVo.StatItem("丢单数", String.valueOf(lose), 0.02));
+        stats.add(new WorkbenchStatVo.StatItem("丢单数", String.valueOf(lose), calculateTrend(lose, oldLose)));
         return stats;
     }
 
@@ -182,18 +207,31 @@ public class WorkbenchServiceImpl implements IWorkbenchService {
     // --- 5. 年度入围 (总览) ---
     private List<WorkbenchStatVo.StatItem> getSelectionTotalStats() {
         Date weekAgo = new Date(System.currentTimeMillis() - 7 * DAY_MS);
-        long total = salesAnnualFinalizationMapper.selectCount(new LambdaQueryWrapper<SalesAnnualFinalization>().eq(SalesAnnualFinalization::getIsDelete, 0));
+        List<SalesAnnualFinalization> selectionList = salesAnnualFinalizationMapper.selectList(new LambdaQueryWrapper<SalesAnnualFinalization>().eq(SalesAnnualFinalization::getIsDelete, 0));
+        long total = selectionList.size();
         long totalOld = salesAnnualFinalizationMapper.selectCount(new LambdaQueryWrapper<SalesAnnualFinalization>().eq(SalesAnnualFinalization::getIsDelete, 0).le(SalesAnnualFinalization::getCreateTime, weekAgo));
-        BigDecimal amount = salesAnnualFinalizationMapper.selectList(new LambdaQueryWrapper<SalesAnnualFinalization>().eq(SalesAnnualFinalization::getIsDelete, 0))
-            .stream().map(SalesAnnualFinalization::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
-        long win = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>().eq(SalesResultAnalyze::getDealResult, 1).eq(SalesResultAnalyze::getDataType, 1).eq(SalesResultAnalyze::getIsDelete, 0));
+        BigDecimal amount = selectionList.stream().map(SalesAnnualFinalization::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+        List<String> selectionNos = selectionList.stream().map(SalesAnnualFinalization::getProjectNo).filter(Objects::nonNull).collect(Collectors.toList());
+
+        long win = 0;
+        long lose = 0;
+        if (!selectionNos.isEmpty()) {
+            win = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
+                .eq(SalesResultAnalyze::getDealResult, 1)
+                .in(SalesResultAnalyze::getObjectNo, selectionNos)
+                .eq(SalesResultAnalyze::getIsDelete, 0));
+            lose = salesresultanalyzeMapper.selectCount(new LambdaQueryWrapper<SalesResultAnalyze>()
+                .eq(SalesResultAnalyze::getDealResult, 2)
+                .in(SalesResultAnalyze::getObjectNo, selectionNos)
+                .eq(SalesResultAnalyze::getIsDelete, 0));
+        }
 
         List<WorkbenchStatVo.StatItem> stats = new ArrayList<>();
         stats.add(new WorkbenchStatVo.StatItem("入围项目数", String.valueOf(total), calculateTrend(total, totalOld)));
         stats.add(new WorkbenchStatVo.StatItem("金额", amount.setScale(0, BigDecimal.ROUND_HALF_UP).toString(), 0.10));
-        stats.add(new WorkbenchStatVo.StatItem("跟进中", String.valueOf(total - win), -0.08));
+        stats.add(new WorkbenchStatVo.StatItem("跟进中", String.valueOf(total - win - lose), -0.08));
         stats.add(new WorkbenchStatVo.StatItem("赢单数", String.valueOf(win), 0.15));
-        stats.add(new WorkbenchStatVo.StatItem("丢单数", "0", 0.0));
+        stats.add(new WorkbenchStatVo.StatItem("丢单数", String.valueOf(lose), 0.0));
         return stats;
     }
 

+ 0 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/ComStaffController.java

@@ -76,7 +76,6 @@ public class ComStaffController extends BaseController {
     }
 
 
-
     /**
      * 根据供应商ID查询客户经理和采购员
      *