From ba3175055eaaa2df285165a8c20015406834b5af Mon Sep 17 00:00:00 2001 From: Vinjor Date: Tue, 2 Dec 2025 18:13:19 +0800 Subject: [PATCH] 1 --- .../cus/service/impl/CusMainServiceImpl.java | 11 +- .../controller/system/SysUserController.java | 11 +- .../src/main/resources/application-druid.yml | 2 +- .../resources/mapper/cus/CusMainMapper.xml | 6 + .../common/core/domain/DlTreeSelect.java | 112 +++++ .../ruoyi/system/service/ISysDeptService.java | 11 + .../service/impl/SysDeptServiceImpl.java | 83 +++- dl_vue/src/api/system/user.js | 7 + dl_vue/src/views/cus/main/index.vue | 405 +++++++++++------- 9 files changed, 471 insertions(+), 177 deletions(-) create mode 100644 dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DlTreeSelect.java diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java index 8e1e7a7..e27147e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/cus/service/impl/CusMainServiceImpl.java @@ -222,14 +222,19 @@ public class CusMainServiceImpl extends ServiceImpl impl List contacts = cusContactsService.list(new LambdaQueryWrapper().eq(CusContacts::getCusId, id).orderByDesc(CusContacts::getIfDefault).orderByAsc(DlBaseEntity::getCreateTime)); cusMainVO.setContact(contacts); //3.查公司表 - CusCompany company = cusCompanyService.list(new LambdaQueryWrapper().eq(CusCompany::getCusId, id).orderByDesc(DlBaseEntity::getCreateTime)).get(0); + List companyList = cusCompanyService.list(new LambdaQueryWrapper().eq(CusCompany::getCusId, id).orderByDesc(DlBaseEntity::getCreateTime)); + CusCompany company = companyList.isEmpty() ? new CusCompany() : companyList.get(0); cusMainVO.setCompanyInfo(company); + //4.查管理表 - CusManager manager = cusManagerService.list(new LambdaQueryWrapper().eq(CusManager::getCusId, id).orderByDesc(DlBaseEntity::getCreateTime)).get(0); + List managerList = cusManagerService.list(new LambdaQueryWrapper().eq(CusManager::getCusId, id).orderByDesc(DlBaseEntity::getCreateTime)); + CusManager manager = managerList.isEmpty() ? new CusManager() : managerList.get(0); cusMainVO.setManagementInfo(manager); + //5.查银行表 List bankList = cusBankService.list(new LambdaQueryWrapper().eq(CusBank::getCusId, id).orderByDesc(DlBaseEntity::getCreateTime)); - cusMainVO.setBankInfo(bankList); + cusMainVO.setBankInfo(bankList.isEmpty() ? new ArrayList<>() : bankList); + //6.查唛头表 List markList = cusMarkService.list(new LambdaQueryWrapper().eq(CusMark::getCusId, id).orderByDesc(DlBaseEntity::getCreateTime)); MarkVO markVO = new MarkVO(); diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 6911749..154b68b 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -250,8 +250,15 @@ public class SysUserController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/deptTree") - public AjaxResult deptTree(SysDept dept) - { + public AjaxResult deptTree(SysDept dept) { return success(deptService.selectDeptTreeList(dept)); } + + /** + * 获取部门树+客户列表(客户左侧部门树) + */ + @GetMapping("/deptAndUserTree") + public AjaxResult deptAndUserTree(SysDept dept) { + return success(deptService.selectDeptAndUserTreeList(dept)); + } } diff --git a/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml b/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml index ae1238f..9630cf4 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,7 +6,7 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://rm-bp1msd0a4kq4t7a66lo.mysql.rds.aliyuncs.com:3306/dl_crm_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://rm-bp1msd0a4kq4t7a66lo.mysql.rds.aliyuncs.com:3306/dl_crm_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: csd_rw password: Csd2025#123 # 从库数据源 diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml index b42ddc2..cc77c41 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/cus/CusMainMapper.xml @@ -63,6 +63,12 @@ AND cm.cus_code = #{entity.cusCode} + + AND cm.user_id = #{entity.userId} + + + AND cm.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = #{entity.deptId} or find_in_set( #{entity.deptId}, ancestors ) ) + AND cm.full_name LIKE CONCAT('%',#{entity.fullName},'%') diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DlTreeSelect.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DlTreeSelect.java new file mode 100644 index 0000000..09b4312 --- /dev/null +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/DlTreeSelect.java @@ -0,0 +1,112 @@ +package com.ruoyi.common.core.domain; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysMenu; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.StringUtils; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Treeselect树结构实体类---点亮扩展 + * + * @author ruoyi + */ +public class DlTreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private Long id; + + /** 节点名称 */ + private String label; + + /** 节点类型(user用户|dept部门) */ + private String type; + + /** 节点禁用 */ + private boolean disabled = false; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public DlTreeSelect() + { + + } + + public DlTreeSelect(SysDept dept) { + this.id = dept.getDeptId(); + this.type="dept"; + this.label = dept.getDeptName(); + this.disabled = StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()); + this.children = dept.getChildren().stream().map(DlTreeSelect::new).collect(Collectors.toList()); + } + + public DlTreeSelect(SysUser user) { + this.id = user.getUserId(); + this.type="user"; + this.label = user.getNickName(); + } + + public DlTreeSelect(SysMenu menu) + { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(DlTreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getLabel() + { + return label; + } + + public void setLabel(String label) + { + this.label = label; + } + + public boolean isDisabled() + { + return disabled; + } + + public void setDisabled(boolean disabled) + { + this.disabled = disabled; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index f228208..3338c59 100644 --- a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -1,6 +1,9 @@ package com.ruoyi.system.service; import java.util.List; +import java.util.Map; + +import com.ruoyi.common.core.domain.DlTreeSelect; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; @@ -27,6 +30,14 @@ public interface ISysDeptService */ public List selectDeptTreeList(SysDept dept); + /** + * 获取部门树+客户列表(客户左侧部门树) + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + public Map selectDeptAndUserTreeList(SysDept dept); + /** * 构建前端所需要树结构 * diff --git a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 54b605d..fe0bad1 100644 --- a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -1,9 +1,11 @@ package com.ruoyi.system.service.impl; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; + +import com.ruoyi.common.core.domain.DlTreeSelect; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.annotation.DataScope; @@ -27,13 +29,14 @@ import com.ruoyi.system.service.ISysDeptService; * @author ruoyi */ @Service -public class SysDeptServiceImpl implements ISysDeptService -{ +public class SysDeptServiceImpl implements ISysDeptService { @Autowired private SysDeptMapper deptMapper; @Autowired private SysRoleMapper roleMapper; + @Autowired + private SysUserMapper userMapper; /** * 查询部门管理数据 @@ -55,12 +58,60 @@ public class SysDeptServiceImpl implements ISysDeptService * @return 部门树信息集合 */ @Override - public List selectDeptTreeList(SysDept dept) - { + public List selectDeptTreeList(SysDept dept) { List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); return buildDeptTreeSelect(depts); } + /** + * 获取部门树+客户列表(客户左侧部门树) + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + @Override + public Map selectDeptAndUserTreeList(SysDept dept) { + Map rtnMap = new HashMap<>(); + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + //所有部门的Id + rtnMap.put("deptId",depts.stream().map(SysDept::getDeptId).collect(Collectors.toList())); + List deptTreeSelects = buildDeptAndUserTreeSelect(depts); + //部门树处理完以后逐级查询用户 + List userList = userMapper.selectAllUserList(); + Map> userMap = userList.stream().collect(Collectors.groupingBy(SysUser::getDeptId)); + //树处理-添加每个部门的用户 + dealDeptUser(deptTreeSelects,userMap); + rtnMap.put("deptTree",deptTreeSelects); + return rtnMap; + } + + /** + * 组装每个部门的子级用户 + * @author vinjor-M + * @date 16:47 2025/12/2 + * @param deptTreeSelects TODO + * @param userMap TODO + **/ + private void dealDeptUser(List deptTreeSelects,Map> userMap){ + for (DlTreeSelect deptTree : deptTreeSelects){ + if("dept".equals(deptTree.getType())){ + //只处理部门 + List children = new ArrayList<>(); + if(null!=deptTree.getChildren() && !deptTree.getChildren().isEmpty()){ + children = deptTree.getChildren(); + } + if(userMap.containsKey(deptTree.getId())){ + //存在当前部门的用户,添加到子级中 + for(SysUser sysUser:userMap.get(deptTree.getId())){ + children.add(new DlTreeSelect(sysUser)); + } + } + //处理所有子级 + this.dealDeptUser(children,userMap); + } + } + } + /** * 构建前端所需要树结构 * @@ -68,8 +119,7 @@ public class SysDeptServiceImpl implements ISysDeptService * @return 树结构列表 */ @Override - public List buildDeptTree(List depts) - { + public List buildDeptTree(List depts) { List returnList = new ArrayList(); List tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList()); for (SysDept dept : depts) @@ -95,12 +145,23 @@ public class SysDeptServiceImpl implements ISysDeptService * @return 下拉树结构列表 */ @Override - public List buildDeptTreeSelect(List depts) - { + public List buildDeptTreeSelect(List depts) { List deptTrees = buildDeptTree(depts); return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); } + /** + * 构建前端所需要下拉树结构--点亮扩展 + * @author vinjor-M + * @date 16:33 2025/12/2 + * @param depts + * @return java.util.List + **/ + private List buildDeptAndUserTreeSelect(List depts) { + List deptTrees = buildDeptTree(depts); + return deptTrees.stream().map(DlTreeSelect::new).collect(Collectors.toList()); + } + /** * 根据角色ID查询部门树信息 * diff --git a/dl_vue/src/api/system/user.js b/dl_vue/src/api/system/user.js index b5e3edd..737ce4f 100644 --- a/dl_vue/src/api/system/user.js +++ b/dl_vue/src/api/system/user.js @@ -134,3 +134,10 @@ export function deptTreeSelect() { method: 'get' }) } +// 查询部门下拉树结构--带用户 +export function deptAndUserTree() { + return request({ + url: '/system/user/deptAndUserTree', + method: 'get' + }) +} diff --git a/dl_vue/src/views/cus/main/index.vue b/dl_vue/src/views/cus/main/index.vue index ebf60f4..d14d5c4 100644 --- a/dl_vue/src/views/cus/main/index.vue +++ b/dl_vue/src/views/cus/main/index.vue @@ -88,174 +88,185 @@ - - - -