xw 5 дней назад
Родитель
Сommit
2139b42818

+ 42 - 35
fs-company/src/main/java/com/fs/user/FsUserAdminController.java

@@ -17,6 +17,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.course.domain.FsUserCompanyUser;
 import com.fs.course.mapper.FsUserCompanyUserMapper;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.dto.BatchSendCourseDTO;
 import com.fs.course.param.FsCourseLinkCreateParam;
@@ -54,6 +55,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
 
@@ -91,6 +93,9 @@ public class FsUserAdminController extends BaseController {
     @Autowired
     private FsUserCompanyUserMapper fsUserCompanyUserMapper;
 
+    @Autowired
+    private FsCourseWatchLogMapper fsCourseWatchLogMapper;
+
     @Autowired
     private IFsUserCoursePeriodService fsUserCoursePeriodService;
 
@@ -396,6 +401,7 @@ public class FsUserAdminController extends BaseController {
             int successCount = 0;
             int failCount = 0;
             StringBuilder failReasons = new StringBuilder();
+            List<UserProjectDTO> userProjectList = new ArrayList<>();
 
             // 先查询源营期和源销售下的所有有效会员ID(通过观看记录表关联)
             List<Long> validUserIds = fsUserCompanyUserMapper
@@ -414,40 +420,41 @@ public class FsUserAdminController extends BaseController {
                         continue;
                     }
 
-                    // 仅删除当前公司下源营期+源销售的关系,不影响其他营期/销售/公司
-                    FsUserCompanyUser deleteParam = new FsUserCompanyUser();
-                    deleteParam.setUserId(userId);
-                    deleteParam.setProjectId(param.getSourcePeriodId());
-                    deleteParam.setCompanyUserId(param.getSourceCompanyUserId());
-                    deleteParam.setCompanyId(companyId);
-                    List<FsUserCompanyUser> sourceRecords = fsUserCompanyUserService.selectFsUserCompanyUserList(deleteParam);
-                    if (sourceRecords.isEmpty()) {
-                        failReasons.append("会员ID:").append(userId).append("在源营期和源销售下不存在; ");
+                    // 从观看记录获取该营期下关联的项目ID(project_id 存的是项目ID,不是营期ID)
+                    List<Long> projectIds = fsCourseWatchLogMapper.selectProjectIdsByUserPeriodAndCompanyUser(
+                            userId, param.getSourcePeriodId(), param.getSourceCompanyUserId(), companyId);
+                    if (projectIds.isEmpty()) {
+                        FsUserCompanyUser queryParam = new FsUserCompanyUser();
+                        queryParam.setUserId(userId);
+                        queryParam.setCompanyUserId(param.getSourceCompanyUserId());
+                        queryParam.setCompanyId(companyId);
+                        projectIds = fsUserCompanyUserService.selectFsUserCompanyUserList(queryParam).stream()
+                                .map(FsUserCompanyUser::getProjectId)
+                                .filter(Objects::nonNull)
+                                .distinct()
+                                .collect(Collectors.toList());
+                    }
+                    if (projectIds.isEmpty()) {
+                        failReasons.append("会员ID:").append(userId).append("未找到可转移的项目关系; ");
                         failCount++;
                         continue;
                     }
-                    for (FsUserCompanyUser record : sourceRecords) {
-                        fsUserCompanyUserService.deleteFsUserCompanyUserById(record.getId());
-                        log.info("删除源营期关系 - 会员ID:{}, 记录ID:{}, 营期ID:{}, 销售ID:{}",
-                                userId, record.getId(), record.getProjectId(), record.getCompanyUserId());
-                    }
 
-                    // 创建目标营期记录(已存在则跳过,避免重复绑定)
-                    FsUserCompanyUser targetQuery = new FsUserCompanyUser();
-                    targetQuery.setUserId(userId);
-                    targetQuery.setProjectId(param.getTargetPeriodId());
-                    targetQuery.setCompanyUserId(param.getTargetCompanyUserId());
-                    targetQuery.setCompanyId(companyId);
-                    List<FsUserCompanyUser> targetRecords = fsUserCompanyUserService.selectFsUserCompanyUserList(targetQuery);
-                    if (targetRecords.isEmpty()) {
-                        fsUserCompanyUserService.bindRelationship(userId, param.getTargetPeriodId(), companyId, param.getTargetCompanyUserId(), 1);
-                        log.info("创建目标营期新记录 - 会员ID:{}, 营期ID:{}, 公司ID:{}, 销售ID:{}",
-                                userId, param.getTargetPeriodId(), companyId, param.getTargetCompanyUserId());
-                    } else {
-                        log.info("目标营期关系已存在,跳过创建 - 会员ID:{}, 营期ID:{}, 销售ID:{}",
-                                userId, param.getTargetPeriodId(), param.getTargetCompanyUserId());
+                    // 更新会员-项目-销售关系:保持项目ID不变,仅变更销售
+                    for (Long projectId : projectIds) {
+                        fsUserCompanyUserService.changeRelationship(
+                                userId, projectId, companyId, param.getTargetCompanyUserId());
+                        log.info("更新会员项目销售关系 - 会员ID:{}, 项目ID:{}, 源销售ID:{}, 目标销售ID:{}",
+                                userId, projectId, param.getSourceCompanyUserId(), param.getTargetCompanyUserId());
                     }
 
+                    // 更新观看记录中的营期和销售
+                    int watchLogCount = fsCourseWatchLogMapper.transferPeriodWatchLog(
+                            userId, param.getSourcePeriodId(), param.getSourceCompanyUserId(),
+                            param.getTargetPeriodId(), param.getTargetCompanyUserId(), companyId);
+                    log.info("更新观看记录 - 会员ID:{}, 源营期ID:{}, 目标营期ID:{}, 更新条数:{}",
+                            userId, param.getSourcePeriodId(), param.getTargetPeriodId(), watchLogCount);
+
                     // 仅当会员主归属属于当前公司时,更新fs_user表
                     FsUser fsUser = fsUserService.selectFsUserById(userId);
                     if (fsUser != null && Objects.equals(fsUser.getCompanyId(), companyId)) {
@@ -457,6 +464,13 @@ public class FsUserAdminController extends BaseController {
                                 userId, companyId, param.getTargetCompanyUserId());
                     }
 
+                    for (Long projectId : projectIds) {
+                        UserProjectDTO dto = new UserProjectDTO();
+                        dto.setUserId(userId);
+                        dto.setProjectId(projectId);
+                        userProjectList.add(dto);
+                    }
+
                     successCount++;
                     log.info("会员ID:{} 从营期ID:{} 销售ID:{} 转移到 营期ID:{} 销售ID:{} 成功",
                             userId, param.getSourcePeriodId(), param.getSourceCompanyUserId(),
@@ -470,13 +484,6 @@ public class FsUserAdminController extends BaseController {
             }
 
             // 6. 创建审批记录并记录到审批列表
-            List<UserProjectDTO> userProjectList = new ArrayList<>();
-            for (Long userId : param.getUserIds()) {
-                UserProjectDTO dto = new UserProjectDTO();
-                dto.setUserId(userId);
-                dto.setProjectId(param.getTargetPeriodId()); // 使用目标营期ID
-                userProjectList.add(dto);
-            }
 
             CustomerTransferApproval approval = new CustomerTransferApproval();
             approval.setCorpId(String.valueOf(companyId));

+ 26 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -799,4 +799,30 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     List<FsCoureseWatchLogVO> selectAppIdList();
 
     List<FsCoureseWatchLogVO> selectUserIdList(FsCourseWatchLogParam fsCourseWatchLog);
+
+    /**
+     * 查询会员在指定营期和销售下的项目ID列表
+     */
+    @Select("SELECT DISTINCT project FROM fs_course_watch_log " +
+            "WHERE user_id = #{userId} AND period_id = #{periodId} " +
+            "AND company_user_id = #{companyUserId} AND company_id = #{companyId} " +
+            "AND project IS NOT NULL")
+    List<Long> selectProjectIdsByUserPeriodAndCompanyUser(@Param("userId") Long userId,
+                                                         @Param("periodId") Long periodId,
+                                                         @Param("companyUserId") Long companyUserId,
+                                                         @Param("companyId") Long companyId);
+
+    /**
+     * 转移会员在源营期下的观看记录到目标营期及目标销售
+     */
+    @Update("UPDATE fs_course_watch_log SET period_id = #{targetPeriodId}, " +
+            "company_user_id = #{targetCompanyUserId}, update_time = NOW() " +
+            "WHERE user_id = #{userId} AND period_id = #{sourcePeriodId} " +
+            "AND company_user_id = #{sourceCompanyUserId} AND company_id = #{companyId}")
+    int transferPeriodWatchLog(@Param("userId") Long userId,
+                               @Param("sourcePeriodId") Long sourcePeriodId,
+                               @Param("sourceCompanyUserId") Long sourceCompanyUserId,
+                               @Param("targetPeriodId") Long targetPeriodId,
+                               @Param("targetCompanyUserId") Long targetCompanyUserId,
+                               @Param("companyId") Long companyId);
 }

+ 0 - 1
fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml

@@ -208,7 +208,6 @@
                 AND b.period_id = #{periodId}
         WHERE
             a.company_user_id = #{companyUserId}
-            AND a.project_id = #{periodId}
             AND a.company_id = #{companyId}
         GROUP BY
             a.user_id