From 7bbe5274772ea151b9b6b104561a083a0a6abb22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=B9=90=E8=A8=80?= Date: Wed, 25 Mar 2026 18:24:40 +0800 Subject: [PATCH] =?UTF-8?q?0325-=E6=B5=B7=E5=AE=81pad=E8=B5=B0=E8=AE=BF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CustGroupMemberServiceImpl.java | 8 +- .../service/impl/CustGroupServiceImpl.java | 82 ++++-------- .../mapper/DrawGridCustUserUnbindMapper.java | 12 -- .../mapper/DrawGridShapeRelateMapper.java | 9 +- .../mapper/draw/DrawGridCustMapper.xml | 14 +-- .../mapper/draw/DrawGridShapeRelateMapper.xml | 25 ++++ .../src/main/resources/application.yml | 2 +- ruoyi-ui/src/api/group/custGroup.js | 2 +- ruoyi-ui/src/views/group/custGroup/detail.vue | 35 +++++- ruoyi-ui/src/views/group/custGroup/index.vue | 119 ++++++++++-------- .../views/taskManage/PADvisitRecord/index.vue | 68 +++++++--- 11 files changed, 211 insertions(+), 165 deletions(-) create mode 100644 ibs/src/main/resources/mapper/draw/DrawGridShapeRelateMapper.xml diff --git a/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupMemberServiceImpl.java b/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupMemberServiceImpl.java index 5a3aff0..0f52653 100644 --- a/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupMemberServiceImpl.java +++ b/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupMemberServiceImpl.java @@ -4,6 +4,8 @@ import com.ruoyi.group.domain.dto.CustGroupMemberQueryDTO; import com.ruoyi.group.domain.entity.CustGroup; import com.ruoyi.group.domain.entity.CustGroupMember; import com.ruoyi.group.domain.vo.CustGroupMemberVO; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.group.mapper.CustGroupMapper; import com.ruoyi.group.mapper.CustGroupMemberMapper; import com.ruoyi.group.service.ICustGroupService; @@ -43,7 +45,10 @@ public class CustGroupMemberServiceImpl implements ICustGroupMemberService { // 检查客群是否存在 CustGroup custGroup = custGroupMapper.selectById(groupId); if (custGroup == null) { - return "客群不存在"; + throw new ServiceException("客群不存在"); + } + if (!SecurityUtils.getUsername().equals(custGroup.getUserName())) { + throw new ServiceException("无权限操作该客群"); } // 删除客户关联 @@ -52,6 +57,7 @@ public class CustGroupMemberServiceImpl implements ICustGroupMemberService { if (member != null && member.getGroupId().equals(groupId)) { // 设置手动移除标识 member.setManualRemove(1); + custGroupMemberMapper.updateById(member); // 逻辑删除 custGroupMemberMapper.deleteById(memberId); } diff --git a/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupServiceImpl.java b/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupServiceImpl.java index 0ba910f..14f471c 100644 --- a/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupServiceImpl.java +++ b/ibs-group/src/main/java/com/ruoyi/group/service/impl/CustGroupServiceImpl.java @@ -9,7 +9,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.ibs.cmpm.domain.vo.GridCmpmVO; import com.ruoyi.ibs.cmpm.service.GridCmpmService; -import com.ruoyi.ibs.draw.mapper.DrawGridCustUserUnbindMapper; +import com.ruoyi.ibs.draw.mapper.DrawGridShapeRelateMapper; import com.ruoyi.ibs.grid.service.RegionGridListService; import com.ruoyi.group.domain.dto.CustGroupMemberTemplate; import com.ruoyi.group.domain.dto.CustGroupQueryDTO; @@ -59,7 +59,7 @@ public class CustGroupServiceImpl implements ICustGroupService { private RegionGridListService regionGridListService; @Resource - private DrawGridCustUserUnbindMapper drawGridCustUserUnbindMapper; + private DrawGridShapeRelateMapper drawGridShapeRelateMapper; @Resource private TransactionTemplate transactionTemplate; @@ -418,6 +418,8 @@ public class CustGroupServiceImpl implements ICustGroupService { log.info("找到 {} 个动态客群需要更新", dynamicGroups.size()); Date now = new Date(); + int successCount = 0; + int failureCount = 0; for (CustGroup custGroup : dynamicGroups) { // 检查有效期,过期的客群跳过更新 @@ -429,22 +431,18 @@ public class CustGroupServiceImpl implements ICustGroupService { try { updateDynamicCustGroup(custGroup); + successCount++; log.info("动态客群更新成功,客群ID:{},客群名称:{}", custGroup.getId(), custGroup.getGroupName()); } catch (Exception e) { + failureCount++; log.error("动态客群更新失败,客群ID:{},客群名称:{}", custGroup.getId(), custGroup.getGroupName(), e); } } log.info("动态客群更新完成,总计:{},成功:{},失败:{}", dynamicGroups.size(), - dynamicGroups.stream().filter(g -> { - // 假设更新成功的状态设置 - LambdaQueryWrapper w = new LambdaQueryWrapper<>(); - w.eq(CustGroup::getId, g.getId()); - // 这里简单统计,实际可以通过更精确的方式 - return true; - }).count(), - 0); + successCount, + failureCount); } @Override @@ -655,7 +653,6 @@ public class CustGroupServiceImpl implements ICustGroupService { int batchSize = 1000; int successCount = 0; int skippedCount = 0; - int restoredCount = 0; for (int i = 0; i < memberList.size(); i += batchSize) { int endIndex = Math.min(i + batchSize, memberList.size()); List batchList = memberList.subList(i, endIndex); @@ -665,30 +662,23 @@ public class CustGroupServiceImpl implements ICustGroupService { custGroupMemberMapper.insert(member); successCount++; } catch (DuplicateKeyException e) { - // 客户已存在,检查是否是被手动移除的 + // 客户已存在(包含被手动移除后保留的记录),直接跳过,避免再次加入客群 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(CustGroupMember::getGroupId, member.getGroupId()) .eq(CustGroupMember::getCustId, member.getCustId()) .eq(CustGroupMember::getCustType, member.getCustType()); CustGroupMember existMember = custGroupMemberMapper.selectOne(queryWrapper); + skippedCount++; if (existMember != null && existMember.getManualRemove() != null && existMember.getManualRemove() == 1) { - // 是被手动移除的客户,清除标记并恢复 - existMember.setManualRemove(0); - existMember.setDelFlag(0); - existMember.setCustName(member.getCustName()); - custGroupMemberMapper.updateById(existMember); - restoredCount++; - log.debug("恢复手动移除的客户:groupId={}, custId={}", member.getGroupId(), member.getCustId()); + log.debug("客户已被手动移除,跳过重新导入:groupId={}, custId={}", member.getGroupId(), member.getCustId()); } else { - // 正常存在的客户,跳过 - skippedCount++; log.debug("客户已存在,跳过:groupId={}, custId={}", member.getGroupId(), member.getCustId()); } } } } - log.info("客群客户导入完成(模板),客群ID:{},成功:{},跳过重复:{},恢复:{}", - custGroup.getId(), successCount, skippedCount, restoredCount); + log.info("客群客户导入完成(模板),客群ID:{},成功:{},跳过重复:{}", + custGroup.getId(), successCount, skippedCount); // 更新创建状态为成功 custGroup.setCreateStatus("1"); custGroup.setUpdateBy(custGroup.getCreateBy()); @@ -747,7 +737,6 @@ public class CustGroupServiceImpl implements ICustGroupService { // 分批批量插入(每批1000条) int batchSize = 1000; int totalInserted = 0; - int totalRestored = 0; int totalSkipped = 0; for (int i = 0; i < memberList.size(); i += batchSize) { @@ -759,28 +748,13 @@ public class CustGroupServiceImpl implements ICustGroupService { // SQL层面的批量插入 custGroupMemberMapper.batchInsertMembers(batchList); - // 查询本批中被手动移除的客户,需要恢复 - List toRestore = findManualRemovedToRestore(custGroup.getId(), batchList); - if (!toRestore.isEmpty()) { - // 恢复被手动移除的客户 - for (CustGroupMember m : toRestore) { - batchList.stream() - .filter(b -> b.getCustId().equals(m.getCustId()) && b.getCustType().equals(m.getCustType())) - .findFirst() - .ifPresent(origin -> m.setCustName(origin.getCustName())); - m.setManualRemove(0); - custGroupMemberMapper.updateById(m); - } - log.info("本批恢复被手动移除的客户:{} 条", toRestore.size()); - totalRestored += toRestore.size(); - } - - totalInserted += batchList.size() - toRestore.size(); - totalSkipped += toRestore.size(); + int manualRemovedCount = countManualRemovedMembers(custGroup.getId(), batchList); + totalInserted += batchList.size() - manualRemovedCount; + totalSkipped += manualRemovedCount; } - log.info("客群客户导入完成(网格),客群ID:{},插入:{},恢复:{},跳过:{}", - custGroup.getId(), totalInserted, totalRestored, totalSkipped); + log.info("客群客户导入完成(网格),客群ID:{},插入:{},跳过:{}", + custGroup.getId(), totalInserted, totalSkipped); // 更新创建状态为成功 custGroup.setCreateStatus("1"); @@ -814,29 +788,21 @@ public class CustGroupServiceImpl implements ICustGroupService { } /** - * 查找需要恢复的被手动移除的客户 - * - * @param groupId 客群ID - * @param batchList 本批导入的客户列表 - * @return 需要恢复的客户列表 + * 统计本批中被手动移除、因此需要持续排除的客户数量 */ - private List findManualRemovedToRestore(Long groupId, List batchList) { - // 构建本批客户的 (custId, custType) 集合 + private int countManualRemovedMembers(Long groupId, List batchList) { Set batchKeys = batchList.stream() .map(m -> m.getCustId() + "|" + m.getCustType()) .collect(Collectors.toSet()); - // 查询该客群所有被手动移除的客户 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(CustGroupMember::getGroupId, groupId) - .eq(CustGroupMember::getManualRemove, 1) - .eq(CustGroupMember::getDelFlag, 0); + .eq(CustGroupMember::getManualRemove, 1); List manualRemovedList = custGroupMemberMapper.selectList(queryWrapper); - // 筛选出本批中需要恢复的 - return manualRemovedList.stream() + return (int) manualRemovedList.stream() .filter(m -> batchKeys.contains(m.getCustId() + "|" + m.getCustType())) - .collect(Collectors.toList()); + .count(); } /** @@ -907,7 +873,7 @@ public class CustGroupServiceImpl implements ICustGroupService { } // 使用 selectCustByDrawGridId 方法(直接在SQL中拼接headId,绕过拦截器) for (Long gridId : gridImportDTO.getDrawGridIds()) { - List custUsers = drawGridCustUserUnbindMapper.selectCustByDrawGridId(gridId, headId); + List custUsers = drawGridShapeRelateMapper.selectCustByDrawGridId(gridId, headId); if (custUsers != null && !custUsers.isEmpty()) { for (RegionCustUser custUser : custUsers) { CustGroupMember member = new CustGroupMember(); diff --git a/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridCustUserUnbindMapper.java b/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridCustUserUnbindMapper.java index 9dae8c0..dbbf2ed 100644 --- a/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridCustUserUnbindMapper.java +++ b/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridCustUserUnbindMapper.java @@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.ibs.draw.domain.dto.grid.DrawGridCustListDTO; import com.ruoyi.ibs.draw.domain.entity.DrawGridCustUserUnbind; import com.ruoyi.ibs.draw.domain.vo.DrawGridCustVO; -import com.ruoyi.ibs.grid.domain.entity.RegionCustUser; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -19,14 +17,4 @@ public interface DrawGridCustUserUnbindMapper extends BaseMapper getCustList(DrawGridCustListDTO drawGridCustListDTO); List getCustListByManager(DrawGridCustListDTO drawGridCustListDTO); - - /** - * 根据绘制网格ID查询所有客户(用于客群导入,拼接headId绕过拦截器) - * @param gridId 绘制网格ID - * @param headId 总行机构号前三位(用于拼接动态表名) - * @return 客户列表 - */ - List selectCustByDrawGridId(@Param("gridId") Long gridId, @Param("headId") String headId); - - } diff --git a/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridShapeRelateMapper.java b/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridShapeRelateMapper.java index 8931b91..d7f9022 100644 --- a/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridShapeRelateMapper.java +++ b/ibs/src/main/java/com/ruoyi/ibs/draw/mapper/DrawGridShapeRelateMapper.java @@ -2,11 +2,11 @@ package com.ruoyi.ibs.draw.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.ibs.draw.domain.entity.DrawGridShapeRelate; +import com.ruoyi.ibs.grid.domain.entity.RegionCustUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; -import java.util.Map; /** * @Author 吴凯程 @@ -23,10 +23,7 @@ public interface DrawGridShapeRelateMapper extends BaseMapper selectByGridId(@Param("gridId") Long gridId); /** - * 根据网格ID查询所有客户(用于客群导入,直接拼接headId绕过拦截器) - * @param gridId 网格ID - * @param headId 部门代码(用于拼接动态表名) - * @return 客户列表,包含 custId, custName, custType + * 根据绘制网格ID查询所有客户(用于客群导入,直接拼接headId绕过拦截器) */ - List> selectCustListByGridId(@Param("gridId") Long gridId, @Param("headId") String headId); + List selectCustByDrawGridId(@Param("gridId") Long gridId, @Param("headId") String headId); } diff --git a/ibs/src/main/resources/mapper/draw/DrawGridCustMapper.xml b/ibs/src/main/resources/mapper/draw/DrawGridCustMapper.xml index caa9d07..5f92201 100644 --- a/ibs/src/main/resources/mapper/draw/DrawGridCustMapper.xml +++ b/ibs/src/main/resources/mapper/draw/DrawGridCustMapper.xml @@ -56,16 +56,4 @@ AND b.cust_type = #{custType} - - - - \ No newline at end of file + diff --git a/ibs/src/main/resources/mapper/draw/DrawGridShapeRelateMapper.xml b/ibs/src/main/resources/mapper/draw/DrawGridShapeRelateMapper.xml new file mode 100644 index 0000000..3bd4178 --- /dev/null +++ b/ibs/src/main/resources/mapper/draw/DrawGridShapeRelateMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 48d2593..23ed5c1 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -68,7 +68,7 @@ mybatis-plus: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 - mapperLocations: classpath*:mapper/**/*Mapper.xml + mapperLocations: classpath*:mapper/*Mapper.xml,classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml type-handlers-package: com.ruoyi.ibs.handler diff --git a/ruoyi-ui/src/api/group/custGroup.js b/ruoyi-ui/src/api/group/custGroup.js index caa4aac..909708c 100644 --- a/ruoyi-ui/src/api/group/custGroup.js +++ b/ruoyi-ui/src/api/group/custGroup.js @@ -93,7 +93,7 @@ export function deleteCustGroup(idList) { // 手动移除客群客户 export function removeMembers(groupId, memberIds) { return request({ - url: '/group/cust/removeMembers', + url: '/group/member/remove', method: 'post', params: { groupId: groupId }, data: memberIds diff --git a/ruoyi-ui/src/views/group/custGroup/detail.vue b/ruoyi-ui/src/views/group/custGroup/detail.vue index 3d8a565..93fe74c 100644 --- a/ruoyi-ui/src/views/group/custGroup/detail.vue +++ b/ruoyi-ui/src/views/group/custGroup/detail.vue @@ -48,6 +48,11 @@ + + + @@ -63,7 +68,7 @@