沐梦. преди 1 месец
родител
ревизия
a93cbd05ff

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/constant/CustomerConstants.java

@@ -16,6 +16,11 @@ public interface CustomerConstants {
      */
     String PROJECT_TYPE_LEADS = "销售线索";
 
+    /**
+     * 项目商机类型
+     */
+    String PROJECT_TYPE_OPPORTUNITY = "销售商机";
+
     /**
      * 数据类型:销售线索/项目商机
      */

+ 17 - 17
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/VisitRoutine.java

@@ -34,73 +34,73 @@ public class VisitRoutine extends TenantEntity {
     /**
      * 计划编号,关联拜访计划表
      */
-    @TableField("PlanNo")
+    @TableField("plan_no")
     private String planNo;
 
     /**
      * 日程编号,唯一标识
      */
-    @TableField("ScheduleNo")
+    @TableField("schedule_no")
     private String scheduleNo;
 
     /**
      * 关联类型
      */
-    @TableField("RelevanceType")
+    @TableField("relevance_type")
     private Integer relevanceType;
 
     /**
      * 对象编号
      */
-    @TableField("ObjectNo")
+    @TableField("object_no")
     private String objectNo;
 
     /**
      * 对象名称
      */
-    @TableField("ObjectName")
+    @TableField("object_name")
     private String objectName;
 
     /**
      * 客户编号
      */
-    @TableField("CustomerNo")
+    @TableField("customer_no")
     private String customerNo;
 
     /**
      * 客户名称
      */
-    @TableField("CustomerName")
+    @TableField("customer_name")
     private String customerName;
 
     /**
      * 拜访人员编号
      */
-    @TableField("CallPeopleNo")
+    @TableField("call_people_no")
     private Long callPeopleNo;
 
     /**
      * 拜访人员姓名
      */
-    @TableField("CallPeopleName")
+    @TableField("call_people_name")
     private String callPeopleName;
 
     /**
      * 拜访日期
      */
-    @TableField("CallDate")
+    @TableField("call_date")
     private Date callDate;
 
     /**
      * 跟进人员编号
      */
-    @TableField("FollowPeopleNo")
+    @TableField("follow_people_no")
     private String followPeopleNo;
 
     /**
      * 跟进人员姓名
      */
-    @TableField("FollowPeopleName")
+    @TableField("follow_people_name")
     private String followPeopleName;
 
     /**
@@ -108,13 +108,13 @@ public class VisitRoutine extends TenantEntity {
      */
     @ExcelProperty(value = "紧要级别", converter = ExcelDictConvert.class)
     @ExcelDictFormat(readConverterExp = "1=一般,2=重要,3=紧急")
-    @TableField("ImportantLevel")
+    @TableField("Important_level")
     private Integer importantLevel;
 
     /**
      * 拜访目的
      */
-    @TableField("PurposeVisit")
+    @TableField("purpose_visit")
     private String purposeVisit;
 
     /**
@@ -122,19 +122,19 @@ public class VisitRoutine extends TenantEntity {
      */
     @ExcelProperty(value = "日程状态", converter = ExcelDictConvert.class)
     @ExcelDictFormat(readConverterExp = "0=未执行,1=已执行,2=放弃执行")
-    @TableField("ScheduleStatus")
+    @TableField("schedule_status")
     private Integer scheduleStatus;
 
     /**
      * 实际执行时间
      */
-    @TableField("ExecuteTime")
+    @TableField("execute_time")
     private Date executeTime;
 
     /**
      * 未执行原因
      */
-    @TableField("UnExecuteReason")
+    @TableField("un_execute_reason")
     private String unExecuteReason;
 
     /**

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

@@ -129,4 +129,7 @@ public class SalesleadsBo extends TenantEntity {
 
     @Schema(description = "批量操作ID列表")
     private List<Long> ids;
+
+    @Schema(description = "保留已有项目负责人(认领时使用)")
+    private Boolean keepOldManager;
 }

+ 3 - 14
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SalesAnnualFinalizationServiceImpl.java

@@ -204,14 +204,6 @@ public class SalesAnnualFinalizationServiceImpl implements ISalesAnnualFinalizat
         
         Long newLeaderId = bo.getNewLeaderId() != null ? bo.getNewLeaderId() : bo.getLeader();
         if (newLeaderId == null) return false;
-
-        String leaderName = bo.getLeaderName();
-        if (StrUtil.isBlank(leaderName)) {
-            List<RemoteUserVo> users = remoteUserService.selectListByIds(List.of(newLeaderId));
-            if (CollUtil.isNotEmpty(users)) {
-                leaderName = users.get(0).getNickName();
-            }
-        }
         
         boolean result = true;
         for (Long id : ids) {
@@ -228,7 +220,7 @@ public class SalesAnnualFinalizationServiceImpl implements ISalesAnnualFinalizat
             SalesAnnualFinalization update = new SalesAnnualFinalization();
             update.setId(id);
             update.setLeader(newLeaderId);
-            update.setLeaderName(leaderName);
+            update.setLeaderName(bo.getLeaderName());
             boolean success = baseMapper.updateById(update) > 0;
             result = result && success;
             if (success) {
@@ -237,19 +229,16 @@ public class SalesAnnualFinalizationServiceImpl implements ISalesAnnualFinalizat
                 memberBo.setDataType(2); // 年度入围
                 memberBo.setObjectNo(String.valueOf(id));
                 memberBo.setUserNo(newLeaderId);
-                memberBo.setRealName(leaderName);
+                memberBo.setRealName(bo.getLeaderName());
                 memberBo.setRoleCode(CustomerConstants.TEAM_ROLE_LEADER);
                 memberBo.setUpdateAccredit(1);
                 memberBo.setIzManager(1);
                 teamMemberService.insertOrUpdateMember(memberBo);
 
                 // 记录日志
-                operationLogService.recordLog(2, String.valueOf(id), CustomerConstants.ACTION_TYPE_TRANSFER, null, "转移了年度入围项目", leaderName);
+                operationLogService.recordLog(2, String.valueOf(id), CustomerConstants.ACTION_TYPE_TRANSFER, null, "转移了年度入围项目", bo.getLeaderName());
             }
         }
-
         return result;
     }
-
-
 }

+ 46 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SalesleadsServiceImpl.java

@@ -45,7 +45,10 @@ public class SalesleadsServiceImpl implements ISalesleadsService {
      */
     @Override
     public SalesleadsVo queryById(Long id) {
-        return baseMapper.selectVoById(id);
+        SalesleadsBo bo = new SalesleadsBo();
+        bo.setId(id);
+        List<SalesleadsVo> list = baseMapper.selectSalesleadsList(bo);
+        return list.isEmpty() ? null : list.get(0);
     }
 
     /**
@@ -141,13 +144,28 @@ public class SalesleadsServiceImpl implements ISalesleadsService {
         // 逐条更新(批量认领场景通常数据量不大)
         boolean result = true;
         for (Long id : ids) {
+            Salesleads oldData = baseMapper.selectById(id);
             Salesleads update = new Salesleads();
             update.setId(id);
             update.setLeader(bo.getLeader());
             update.setLeaderName(bo.getLeaderName());
+            update.setIzClue(0); // 认领后转为项目商机
+            update.setProjectType(CustomerConstants.PROJECT_TYPE_OPPORTUNITY);
+            update.setStatus("0"); // 转为商机后,状态设为跟进中
             boolean success = baseMapper.updateById(update) > 0;
             result = result && success;
             if (success) {
+                // 处理原负责人逻辑
+                if (oldData != null && oldData.getLeader() != null && !oldData.getLeader().equals(bo.getLeader())) {
+                    if (Boolean.TRUE.equals(bo.getKeepOldManager())) {
+                        // 保留:将原负责人降级为普通团队成员
+                        demoteLeaderToMember(id, oldData.getLeader(), oldData.getLeaderName());
+                    } else {
+                        // 否:直接从团队中移除原负责人
+                        teamMemberService.removeMember(CustomerConstants.DATA_TYPE_LEADS, String.valueOf(id), oldData.getLeader());
+                    }
+                }
+
                 syncLeaderToTeamMember(id, bo.getLeader(), bo.getLeaderName());
                 // 记录日志
                 operationLogService.recordLog(CustomerConstants.DATA_TYPE_LEADS, String.valueOf(id), CustomerConstants.ACTION_TYPE_CLAIM, null, "认领了销售线索", bo.getLeaderName());
@@ -156,6 +174,21 @@ public class SalesleadsServiceImpl implements ISalesleadsService {
         return result;
     }
 
+    /**
+     * 将原负责人降级为普通成员
+     */
+    private void demoteLeaderToMember(Long objectNo, Long oldLeaderId, String oldLeaderName) {
+        TeamMemberBo memberBo = new TeamMemberBo();
+        memberBo.setDataType(CustomerConstants.DATA_TYPE_LEADS);
+        memberBo.setObjectNo(String.valueOf(objectNo));
+        memberBo.setUserNo(oldLeaderId);
+        memberBo.setRealName(oldLeaderName);
+        memberBo.setRoleCode("2"); // 假设 2 是普通成员(后续可根据字典调整)
+        memberBo.setIzManager(0);
+        memberBo.setUpdateAccredit(0);
+        teamMemberService.insertOrUpdateMember(memberBo);
+    }
+
     /**
      * 转移销售线索 - 更换负责人(支持批量)
      */
@@ -169,6 +202,7 @@ public class SalesleadsServiceImpl implements ISalesleadsService {
         }
         boolean result = true;
         for (Long id : ids) {
+            Salesleads oldData = baseMapper.selectById(id);
             Salesleads update = new Salesleads();
             update.setId(id);
             update.setLeader(bo.getLeader());
@@ -176,6 +210,17 @@ public class SalesleadsServiceImpl implements ISalesleadsService {
             boolean success = baseMapper.updateById(update) > 0;
             result = result && success;
             if (success) {
+                // 处理原负责人逻辑
+                if (oldData != null && oldData.getLeader() != null && !oldData.getLeader().equals(bo.getLeader())) {
+                    if (Boolean.TRUE.equals(bo.getKeepOldManager())) {
+                        // 保留:将原负责人降级为普通团队成员
+                        demoteLeaderToMember(id, oldData.getLeader(), oldData.getLeaderName());
+                    } else {
+                        // 否:直接从团队中移除原负责人
+                        teamMemberService.removeMember(CustomerConstants.DATA_TYPE_LEADS, String.valueOf(id), oldData.getLeader());
+                    }
+                }
+
                 syncLeaderToTeamMember(id, bo.getLeader(), bo.getLeaderName());
                 // 记录日志
                 operationLogService.recordLog(CustomerConstants.DATA_TYPE_LEADS, String.valueOf(id), CustomerConstants.ACTION_TYPE_TRANSFER, null, "转移了销售线索", bo.getLeaderName());

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

@@ -13,6 +13,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN sys_dept d ON cs.dept_id = d.dept_id
         <where>
             s.del_flag = '0'
+            <if test="bo.id != null">
+                AND s.id = #{bo.id}
+            </if>
             <if test="bo.izClue != null">
                 AND s.iz_clue = #{bo.izClue}
             </if>