src/main/java/com/zy/crm/common/utils/TreeUtils.java
@@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.zy.crm.system.entity.Dept; import com.zy.crm.system.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; @@ -23,6 +25,8 @@ private TagService tagService; @Autowired private NodeService nodeService; @Autowired private DeptService deptService; /******************************** 归类树 *********************************/ @@ -116,6 +120,52 @@ } } /******************************** 部门树 *********************************/ /** * 获取树图数据结构 */ @Cacheable(cacheNames="deptTree",key="#id") public ArrayList<Map> getDeptTree(String id, Long hostId){ ArrayList<Map> result = new ArrayList<>(); Dept dept = deptService.selectById(id); // 主节点 Map<String, Object> map = new HashMap<>(); map.put("title", dept.getName()); map.put("id", dept.getId()); map.put("spread", true); List<Map> childrens = new ArrayList<>(); map.put("children", childrens); dealDept(dept, childrens, hostId); result.add(map); // 开始处理字节点 // deal(tag, childrens); return result; } /** * 递归获取子节点数据 */ public void dealDept(Dept parent, List<Map> list, Long hostId) { Wrapper<Dept> wrapper = new EntityWrapper<Dept>() .eq("parent_id", parent.getId()) .eq("status", "1"); if (hostId != null) { wrapper.eq("host_id", hostId); } List<Dept> depts = deptService.selectList(wrapper); for (Dept dept : depts) { Map<String, Object> map = new HashMap<>(); map.put("title", dept.getName()); map.put("id", dept.getId()); map.put("spread", true); List<Map> childrens = new ArrayList<>(); map.put("children", childrens); dealDept(dept, childrens, hostId); list.add(map); } } // ------------------------------------------------------------------------------------------------------- src/main/java/com/zy/crm/common/web/BaseController.java
@@ -7,6 +7,8 @@ import com.core.common.Cools; import com.core.controller.AbstractBaseController; import com.core.exception.CoolException; import com.zy.crm.system.entity.Dept; import com.zy.crm.system.service.DeptService; import io.swagger.annotations.ApiModelProperty; import org.springframework.beans.factory.annotation.Autowired; import com.zy.crm.manager.entity.Node; @@ -38,6 +40,8 @@ private TagService tagService; @Autowired private NodeService nodeService; @Autowired private DeptService deptService; @Autowired private UserLoginService userLoginService; @@ -101,6 +105,14 @@ return node; } protected Dept getOriginDept(){ Dept dept = deptService.getTop(); if (dept == null) { throw new CoolException("部门数据错误"); } return dept; } protected <T> void hostEq(EntityWrapper<T> wrapper){ Long hostId = getHostId(); if (hostId != null) { src/main/java/com/zy/crm/manager/entity/Node.java
@@ -29,9 +29,9 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; src/main/java/com/zy/crm/manager/entity/Tag.java
@@ -29,9 +29,9 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; src/main/java/com/zy/crm/system/controller/DeptController.java
@@ -10,12 +10,15 @@ import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.R; import com.zy.crm.common.utils.ListUtils; import com.zy.crm.common.utils.TreeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.zy.crm.common.web.BaseController; import com.zy.crm.system.entity.Dept; import com.zy.crm.system.service.DeptService; import java.io.IOException; import java.util.*; @RestController @@ -23,6 +26,8 @@ @Autowired private DeptService deptService; @Autowired private TreeUtils treeUtils; @RequestMapping(value = "/dept/{id}/auth") @ManagerAuth @@ -131,4 +136,17 @@ return R.ok(); } @PostMapping(value = "/dept/tree/auth") @ManagerAuth public R tree(@RequestParam(required = false, defaultValue = "") String condition) throws IOException, ClassNotFoundException { ArrayList<Map> tree = treeUtils.getDeptTree(String.valueOf(getOriginDept().getId()), getHostId()); // 深拷贝 List<Map> result = ListUtils.deepCopy(tree); if (!Cools.isEmpty(condition)) { treeUtils.remove(condition, result); treeUtils.remove(condition, result); } return R.ok(result); } } src/main/java/com/zy/crm/system/entity/Config.java
@@ -23,9 +23,9 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; src/main/java/com/zy/crm/system/entity/Dept.java
@@ -10,11 +10,13 @@ import com.zy.crm.system.service.DeptService; import com.zy.crm.system.service.HostService; import com.zy.crm.system.service.UserService; import lombok.Data; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @TableName("sys_dept") public class Dept implements Serializable { @@ -28,24 +30,56 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; /** * 父部门编号 * 编号 */ @ApiModelProperty(value= "父部门编号") @TableField("parent_id") private Long parentId; @ApiModelProperty(value= "编号") private String uuid; /** * 部门名称 */ @ApiModelProperty(value= "部门名称") private String name; /** * 父部门编号 */ @ApiModelProperty(value= "父级") @TableField("parent_id") private Long parentId; /** * 父级名称 */ @ApiModelProperty(value= "父级名称") @TableField("parent_name") private String parentName; /** * 关联路径 */ @ApiModelProperty(value= "关联路径") private String path; /** * 关联路径名 */ @ApiModelProperty(value= "关联路径名") @TableField("name_path") private String namePath; /** * 等级 */ @ApiModelProperty(value= "等级") private Integer level; /** * 显示顺序 @@ -74,8 +108,8 @@ /** * 部门状态 1: 正常;0 */ @ApiModelProperty(value= "部门状态 1: 正常;0 ") private Short status; @ApiModelProperty(value= "部门状态 1: 正常;0: 禁用") private Integer status; /** * 创建者 @@ -105,52 +139,13 @@ @TableField("update_time") private Date updateTime; /** * 备注 */ @ApiModelProperty(value= "备注") private String memo; public Dept() {} public Dept(Long hostId, Long parentId,String name,Integer sort,Long leader,String phone,String email,Short status,Long createBy,Date createTime,Long updateBy,Date updateTime) { this.hostId = hostId; this.parentId = parentId; this.name = name; this.sort = sort; this.leader = leader; this.phone = phone; this.email = email; this.status = status; this.createBy = createBy; this.createTime = createTime; this.updateBy = updateBy; this.updateTime = updateTime; } // Dept dept = new Dept( // null, // 父部门编号 // null, // 部门名称[非空] // null, // 显示顺序 // null, // 负责人 // null, // 联系电话 // null, // 邮箱 // null, // 部门状态 // null, // 创建者 // null, // 创建时间 // null, // 更新者 // null // 更新时间 // ); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getHostId() { return hostId; } public void setHostId(Long hostId) { this.hostId = hostId; } public String getHostId$(){ HostService service = SpringUtils.getBean(HostService.class); @@ -159,10 +154,6 @@ return String.valueOf(host.getName()); } return null; } public Long getParentId() { return parentId; } public String getParentId$() { @@ -174,30 +165,6 @@ return null; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getSort() { return sort; } public void setSort(Integer sort) { this.sort = sort; } public Long getLeader() { return leader; } public String getLeader$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.leader); @@ -207,56 +174,16 @@ return null; } public void setLeader(Long leader) { this.leader = leader; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Short getStatus() { return status; } public String getStatus$(){ if (null == this.status){ return null; } switch (this.status){ case 1: return "正常"; case 0: return "停用"; return "禁用"; default: return String.valueOf(this.status); } } public void setStatus(Short status) { this.status = status; } public Long getCreateBy() { return createBy; } public void setCreateBy(Long createBy) { this.createBy = createBy; } public Date getCreateTime() { return createTime; } public String getCreateTime$(){ @@ -266,31 +193,11 @@ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Long getUpdateBy() { return updateBy; } public void setUpdateBy(Long updateBy) { this.updateBy = updateBy; } public Date getUpdateTime() { return updateTime; } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } } src/main/java/com/zy/crm/system/entity/OperateLog.java
@@ -26,9 +26,9 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; src/main/java/com/zy/crm/system/entity/Permission.java
@@ -24,9 +24,9 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; src/main/java/com/zy/crm/system/entity/UserLogin.java
@@ -26,9 +26,9 @@ private Long id; /** * 所属项目 * 所属商户 */ @ApiModelProperty(value= "所属项目") @ApiModelProperty(value= "所属商户") @TableField("host_id") private Long hostId; src/main/java/com/zy/crm/system/service/DeptService.java
@@ -1,10 +1,13 @@ package com.zy.crm.system.service; import com.baomidou.mybatisplus.service.IService; import com.zy.crm.manager.entity.Node; import com.zy.crm.system.entity.Dept; public interface DeptService extends IService<Dept> { Dept getTop(); int getMemberCount(Long deptId); } src/main/java/com/zy/crm/system/service/impl/DeptServiceImpl.java
@@ -1,6 +1,9 @@ package com.zy.crm.system.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.core.exception.CoolException; import com.zy.crm.manager.entity.Node; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zy.crm.system.entity.Dept; @@ -8,6 +11,8 @@ import com.zy.crm.system.service.DeptService; import com.zy.crm.system.service.UserService; import java.util.Date; @Service("deptService") public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements DeptService { @@ -15,6 +20,26 @@ private UserService userService; @Override public Dept getTop() { Dept top = this.selectOne(new EntityWrapper<Dept>().eq("level", 0)); if (top == null) { top = new Dept(); top.setName("全部"); top.setUuid("全部"); top.setLevel(0); top.setSort(0); top.setStatus(1); top.setCreateTime(new Date()); top.setUpdateTime(new Date()); Integer insert = this.baseMapper.insert(top); if (insert == 0) { throw new CoolException("服务器异常"); } } return top; } @Override public int getMemberCount(Long deptId) { Dept dept = selectById(deptId); return 0; src/main/resources/mapper/DeptMapper.xml
@@ -6,8 +6,13 @@ <resultMap id="BaseResultMap" type="com.zy.crm.system.entity.Dept"> <id column="id" property="id" /> <result column="host_id" property="hostId" /> <result column="parent_id" property="parentId" /> <result column="uuid" property="uuid" /> <result column="name" property="name" /> <result column="parent_id" property="parentId" /> <result column="parent_name" property="parentName" /> <result column="path" property="path" /> <result column="name_path" property="namePath" /> <result column="level" property="level" /> <result column="sort" property="sort" /> <result column="leader" property="leader" /> <result column="phone" property="phone" /> @@ -17,7 +22,7 @@ <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> <result column="memo" property="memo" /> </resultMap> </mapper> src/main/webapp/static/js/deptTree.js
New file @@ -0,0 +1,85 @@ var currentDeptId; var currentDeptName; var init = false; layui.config({ base: baseUrl + "/static/layui/lay/modules/" // 配置模块所在的目录 }).use(['table','laydate', 'form', 'tree', 'xmSelect'], function() { var table = layui.table; var $ = layui.jquery; var layer = layui.layer; var layDate = layui.laydate; var form = layui.form; var tree = layui.tree; var xmSelect = layui.xmSelect; var selObj, treeData; // 左树选中数据 var organizationTree; window.loadTree = function(condition){ var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/dept/tree/auth", headers: {'token': localStorage.getItem('token')}, data: { 'condition': condition }, method: 'POST', success: function (res) { if (res.code === 200){ layer.close(loadIndex); // 树形图 organizationTree = tree.render({ elem: '#organizationTree', id: 'organizationTree', onlyIconControl: true, data: res.data, click: function (obj) { currentDeptId = obj.data.id; currentDeptName = obj.data.title.split(" - ")[0]; // currentTemSsbm = obj.data.title.split(" - ")[1]; selObj = obj; $('#organizationTree').find('.ew-tree-click').removeClass('ew-tree-click'); $(obj.elem).children('.layui-tree-entry').addClass('ew-tree-click'); tableIns.reload({ where: {dept_id: obj.data.id}, page: {curr: 1} }); } }); treeData = res.data; if (isEmpty(condition) && init) { tableIns.reload({ where: {dept_id: ""}, page: {curr: 1} }); } if (!init) { init = true; } } else if (res.code === 403){ top.location.href = baseUrl+"/"; } else { layer.msg(res.msg) } } }) } loadTree(); /* 树形图重置 */ $('#treeReset').click(function () { $("#condition").val(""); loadTree(""); }) }) function closeDialog() { layer.closeAll(); } /* 树形图搜索 */ function findData(el) { var condition = $(el).val(); loadTree(condition) } src/main/webapp/views/user/user.html
@@ -132,10 +132,10 @@ </div> <div class="layui-form-item"> <label class="layui-form-label">所属项目: </label> <label class="layui-form-label">所属商户: </label> <div class="layui-input-block cool-auto-complete"> <input name="hostId" class="layui-input" style="display: none"> <input id="hostName" name="hostName" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请选择所属项目" onfocus=this.blur()> <input id="hostName" name="hostName" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请选择所属商户" onfocus=this.blur()> <div class="cool-auto-complete-window"> <input class="cool-auto-complete-window-input" data-key="hostQueryByhostId" onkeyup="autoLoad(this.getAttribute('data-key'))"> <select class="cool-auto-complete-window-select" data-key="hostQueryByhostIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">