From 78839ec83b089ed91ad00585748e78f1c724e570 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@63.com> Date: 星期五, 16 九月 2022 08:46:28 +0800 Subject: [PATCH] # --- src/main/java/com/zy/crm/system/controller/DeptController.java | 45 ++++ /dev/null | 102 ------------ src/main/java/com/zy/crm/manager/utils/NodeUtils.java | 17 ++ src/main/webapp/views/dept/dept.html | 295 ++++++++++++++++++++++++++++++++++-- 4 files changed, 329 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/zy/crm/manager/utils/NodeUtils.java b/src/main/java/com/zy/crm/manager/utils/NodeUtils.java index 0b0710b..6631d49 100644 --- a/src/main/java/com/zy/crm/manager/utils/NodeUtils.java +++ b/src/main/java/com/zy/crm/manager/utils/NodeUtils.java @@ -5,6 +5,8 @@ import com.zy.crm.manager.entity.Tag; import com.zy.crm.manager.service.NodeService; import com.zy.crm.manager.service.TagService; +import com.zy.crm.system.entity.Dept; +import com.zy.crm.system.service.DeptService; /** * Created by vincent on 2021/1/19 @@ -45,6 +47,21 @@ } } + public void executePath(Dept dept) { + DeptService bean = SpringUtils.getBean(DeptService.class); + Dept parent = bean.selectById(dept.getParentId()); + if (null != parent) { + path.insert(0, parent.getId()).insert(0,","); + pathName.insert(0, parent.getName()).insert(0,","); + if (parent.getParentId() != null) { + executePath(parent); + } else { + path.deleteCharAt(0); + pathName.deleteCharAt(0); + } + } + } + public void executePath(Long parentId) { TagService bean = SpringUtils.getBean(TagService.class); Tag parent = bean.selectById(parentId); diff --git a/src/main/java/com/zy/crm/system/controller/DeptController.java b/src/main/java/com/zy/crm/system/controller/DeptController.java index decd896..b753f51 100644 --- a/src/main/java/com/zy/crm/system/controller/DeptController.java +++ b/src/main/java/com/zy/crm/system/controller/DeptController.java @@ -12,11 +12,12 @@ 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.manager.utils.NodeUtils; import com.zy.crm.system.entity.Dept; import com.zy.crm.system.service.DeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.*; @@ -45,6 +46,7 @@ EntityWrapper<Dept> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); + hostEq(wrapper); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} { wrapper.orderBy("sort"); } @@ -67,13 +69,27 @@ @RequestMapping(value = "/dept/add/auth") @ManagerAuth public R add(Dept dept) { + dept.setLevel(1); + if (dept.getParentId() == null || dept.getParentId() == 0) { + dept.setParentId(getOriginDept().getId()); + } + Dept parent = deptService.selectById(dept.getParentId()); + if (parent != null) { + dept.setParentName(parent.getName()); + dept.setLevel(parent.getLevel() + 1); + } + // path + NodeUtils nodeUtils = new NodeUtils(); + nodeUtils.executePath(dept); + dept.setHostId(getHostId()); + dept.setPath(nodeUtils.path.toString()); + dept.setNamePath(nodeUtils.pathName.toString()); + dept.setCreateBy(getUserId()); dept.setCreateTime(new Date()); dept.setUpdateBy(getUserId()); dept.setUpdateTime(new Date()); - if (dept.getParentId() == null) { - dept.setParentId(0L); - } + dept.setStatus(1); deptService.insert(dept); return R.ok(); } @@ -84,6 +100,23 @@ if (Cools.isEmpty(dept) || null==dept.getId()){ return R.error(); } + if (dept.getParentId() != null && dept.getParentId() > 0) { + if (dept.getParentId().equals(dept.getId())) { + return R.error("鏁版嵁閿欒"); + } + Dept parent = deptService.selectById(dept.getParentId()); + if (parent != null) { + dept.setParentName(parent.getName()); + dept.setLevel(parent.getLevel() + 1); + } + } + // path + NodeUtils nodeUtils = new NodeUtils(); + nodeUtils.executePath(dept); + dept.setPath(nodeUtils.path.toString()); + dept.setNamePath(nodeUtils.pathName.toString()); + dept.setUpdateBy(getUserId()); + dept.setUpdateTime(new Date()); deptService.updateById(dept); return R.ok(); } @@ -139,7 +172,7 @@ @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()); + ArrayList<Map> tree = treeUtils.getDeptTree(String.valueOf(getDeptId()), getHostId()); // 娣辨嫹璐� List<Map> result = ListUtils.deepCopy(tree); if (!Cools.isEmpty(condition)) { diff --git a/src/main/webapp/views/dept/dept.html b/src/main/webapp/views/dept/dept.html index 663faab..ef03e88 100644 --- a/src/main/webapp/views/dept/dept.html +++ b/src/main/webapp/views/dept/dept.html @@ -9,28 +9,30 @@ <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all"> <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all"> <link rel="stylesheet" href="../../static/css/cool.css" media="all"> - <link rel="stylesheet" href="../../static/css/common.css" media="all"> <style> - body { - /*background-color: #F1F1F1;*/ - padding: 15px; + #detail { + padding: 25px 30px 0 0; } - .btn-edit { - display: none; - } - .btn-del { - display: none; + .ew-tree-table-box { + height: 100%; } </style> </head> <body> - -<!-- 鎼滅储鏍� --> - -<!-- 琛ㄦ牸 --> -<div class="layui-form"> - <table class="layui-hide" id="dept" lay-filter="dept"></table> +<!-- 姝f枃寮�濮� --> +<div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-body"> + <!-- 鏁版嵁琛ㄦ牸 --> + <table id="dept"></table> + </div> + </div> </div> + +<script type="text/html" id="operate"> + <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a> + <a class="layui-btn layui-btn-danger layui-btn-xs btn-del" lay-event="del">鍒犻櫎</a> +</script> <script type="text/html" id="statusTpl"> <span name="status" {{# if( d.status === 0){ }} @@ -40,21 +42,270 @@ {{# } }} >{{d.status$}}</span> </script> -<!-- 琛ㄦ牸鎿嶄綔鍒� --> -<script type="text/html" id="tbBar"> - <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a> - <a class="layui-btn layui-btn-danger layui-btn-xs btn-del" lay-event="del">鍒犻櫎</a> -</script> +<!-- 琛ㄥ崟寮圭獥 --> +<script type="text/html" id="editDialog"> + <form id="detail" lay-filter="detail" class="layui-form"> + <input name="id" type="hidden"> + <input name="uuid" type="hidden"> + <input name="path" type="hidden"> + <input name="pathName" type="hidden"> + <input name="img" type="hidden"> + <input name="brief" type="hidden"> + <input name="level" type="hidden"> + <input name="count" type="hidden"> + <input name="createTime$" type="hidden"> + <input name="createBy" type="hidden"> + <input name="updateTime$" type="hidden"> + <input name="updateBy" type="hidden"> + <div class="layui-row"> + + <div class="layui-col-md6"> + + <div class="layui-form-item"> + <label class="layui-form-label">涓婄骇閮ㄩ棬</label> + <div class="layui-input-block"> + <div id="deptParentSel" class="ew-xmselect-tree"></div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label">绫诲瀷</label> + <div class="layui-input-block"> + <select name="type" lay-vertype="tips"> + <option value="">璇烽�夋嫨绫诲瀷</option> + <option value="0">鍏朵粬</option> + </select> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label">璐熻矗浜�</label> + <div class="layui-input-block"> + <input name="leading" placeholder="璇疯緭鍏ヨ礋璐d汉" class="layui-input"> + </div> + </div> + + </div> + + <div class="layui-col-md6"> + + <div class="layui-form-item"> + <label class="layui-form-label layui-form-required">褰掔被鍚嶇О</label> + <div class="layui-input-block"> + <input name="name" placeholder="璇疯緭鍏ュ綊绫诲悕绉�" class="layui-input" lay-vertype="tips" lay-verify="required" required=""> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label">鎺掑簭</label> + <div class="layui-input-block"> + <input name="sort" placeholder="璇疯緭鍏ユ帓搴�" class="layui-input"> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label">澶囨敞</label> + <div class="layui-input-block"> + <input name="memo" placeholder="璇疯緭鍏ュ娉�" class="layui-input"> + </div> + </div> + + </div> + </div> + <hr class="layui-bg-gray"> + <div class="layui-form-item text-right"> + <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button> + <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button> + </div> + </form> +</script> <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script> -<script type="text/javascript" src="../../static/js/dept/dept.js" charset="utf-8"></script> -<iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe> +<script> + layui.config({ + base: baseUrl + "/static/layui/lay/modules/" + }).use(['form','treeTable', 'admin', 'xmSelect'], function() { + var $ = layui.jquery; + var layer = layui.layer; + var form = layui.form; + var admin = layui.admin; + var treeTable = layui.treeTable; + var xmSelect = layui.xmSelect; + var tbDataList = []; + var insTb = treeTable.render({ + elem: '#dept', + url: baseUrl+'/dept/list/auth', + headers: {token: localStorage.getItem('token')}, + height: 'full-200', + toolbar: ['<p>', + '<button lay-event="add" class="layui-btn layui-btn-sm icon-btn"><i class="layui-icon"></i>娣诲姞</button> ', + '<button lay-event="del" class="layui-btn layui-btn-sm layui-btn-danger icon-btn"><i class="layui-icon"></i>鍒犻櫎</button>', + '</p>'].join(''), + tree: { + iconIndex: 2, // 鎶樺彔鍥炬爣鏄剧ず鍦ㄧ鍑犲垪 + isPidData: true, // 鏄惁鏄痠d銆乸id褰㈠紡鏁版嵁 + idName: 'id', // id瀛楁鍚嶇О + pidName: 'parentId' // pid瀛楁鍚嶇О + }, + cols: [[ + {type: 'checkbox'} + ,{type: 'numbers'} + ,{field: 'name', align: 'left',title: '鍚嶇О', minWidth: 150} + // ,{field: 'uuid', align: 'center',title: '缂栧彿'} + ,{field: 'type$', align: 'center',title: '绫诲瀷'} + ,{field: 'leading', align: 'center',title: '璐熻矗浜�'} + ,{field: 'img', align: 'center',title: '鍥剧墖', hide: true} + // ,{field: 'brief', align: 'center',title: '绠�瑕佹弿杩�'} + // ,{field: 'count', align: 'center',title: '鏁伴噺'} + ,{field: 'sort', align: 'center',title: '鎺掑簭'} + ,{field: 'status$', align: 'center',title: '鐘舵��'} + ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'} + ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳', hide: true} + ,{field: 'memo', align: 'center',title: '澶囨敞', hide: true} + + ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150} + ]], + done: function (data) { + $('.ew-tree-table-box').css('height', '100%'); + insTb.expandAll(); + tbDataList = data; + } + }); + + /* 琛ㄦ牸澶村伐鍏锋爮鐐瑰嚮浜嬩欢 */ + treeTable.on('toolbar(dept)', function (obj) { + if (obj.event === 'add') { // 娣诲姞 + showEditModel(); + } else if (obj.event === 'del') { // 鍒犻櫎 + var checkRows = insTb.checkStatus(); + if (checkRows.length === 0) { + layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2}); + return; + } + var ids = checkRows.map(function (d) { + if (!d.LAY_INDETERMINATE) { + return d.id; + } else { + return null; + } + }); + doDel({ids: ids}); + } + }); + + /* 琛ㄦ牸鎿嶄綔鍒楃偣鍑讳簨浠� */ + treeTable.on('tool(dept)', function (obj) { + if (obj.event === 'edit') { // 淇敼 + showEditModel(obj.data); + } else if (obj.event === 'del') { // 鍒犻櫎 + doDel(obj); + } + }); + + /* 鏄剧ず琛ㄥ崟寮圭獥 */ + function showEditModel(mData) { + admin.open({ + type: 1, + area: '600px', + title: (mData ? '淇敼' : '娣诲姞') + '閮ㄩ棬', + content: $('#editDialog').html(), + success: function (layero, dIndex) { + // 鍥炴樉琛ㄥ崟鏁版嵁 + form.val('detail', mData); + // 琛ㄥ崟鎻愪氦浜嬩欢 + form.on('submit(editSubmit)', function (data) { + data.field.parentId = insXmSel.getValue('valueStr'); + var loadIndex = layer.load(2); + $.ajax({ + url: baseUrl+"/dept/"+(mData?'update':'add')+"/auth", + headers: {'token': localStorage.getItem('token')}, + data: data.field, + method: 'POST', + success: function (res) { + layer.close(loadIndex); + if (res.code === 200){ + layer.close(dIndex); + layer.msg(res.msg, {icon: 1}); + insTb.refresh(); + } else if (res.code === 403){ + top.location.href = baseUrl+"/"; + }else { + layer.msg(res.msg, {icon: 2}); + } + } + }) + return false; + }); + // 娓叉煋涓嬫媺鏍� + var insXmSel = xmSelect.render({ + el: '#deptParentSel', + height: '250px', + data: insTb.options.data, + initValue: mData ? [mData.parentId] : [], + model: {label: {type: 'text'}}, + prop: { + name: 'name', + value: 'id' + }, + radio: true, + clickClose: true, + tree: { + show: true, + indent: 15, + strict: false, + expandedKeys: true + } + }); + // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯 + $(layero).children('.layui-layer-content').css('overflow', 'visible'); + layui.form.render('select'); + } + }); + } + + /* 鍒犻櫎 */ + function doDel(obj) { + layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', { + skin: 'layui-layer-admin', + shade: .1 + }, function (i) { + layer.close(i); + var loadIndex = layer.load(2); + var ids; + if (obj.data) { + ids = []; + ids[0] = obj.data.id; + } else { + ids = obj.ids; + } + $.ajax({ + url: baseUrl+"/dept/delete/auth", + headers: {'token': localStorage.getItem('token')}, + data: {ids: ids}, + method: 'POST', + success: function (res) { + layer.close(loadIndex); + if (res.code === 200){ + layer.msg(res.msg, {icon: 1}); + insTb.refresh(); + } else if (res.code === 403){ + top.location.href = baseUrl+"/"; + } else { + layer.msg(res.msg, {icon: 2}); + } + } + }) + }); + } + + }); +</script> </body> </html> diff --git a/src/main/webapp/views/dept/dept_detail.html b/src/main/webapp/views/dept/dept_detail.html deleted file mode 100644 index d734fef..0000000 --- a/src/main/webapp/views/dept/dept_detail.html +++ /dev/null @@ -1,102 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <title></title> - <meta name="renderer" content="webkit"> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> - <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all"> - <link rel="stylesheet" href="../../static/css/cool.css" media="all"> - <link rel="stylesheet" href="../../static/css/common.css" media="all"> -</head> -<body> - -<!-- 璇︽儏 --> -<div id="data-detail" class="layer_self_wrap"> - <form id="detail" class="layui-form" style="text-align: center"> - <div class="layui-inline" style="width:80%;display: none"> - <label class="layui-form-label"><span class="not-null">*</span>閮ㄩ棬缂栧彿锛�</label> - <div class="layui-input-inline"> - <input id="id" class="layui-input" type="text" onkeyup="check(this.id, 'dept')" lay-verify="number" > - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label">鐖堕儴闂細</label> - <div class="layui-input-inline cool-auto-complete"> - <input id="parentId" class="layui-input" type="text" style="display: none"> - <input id="deptName" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" onfocus=this.blur()> - <div class="cool-auto-complete-window"> - <input class="cool-auto-complete-window-input" data-key="deptQuery" onkeyup="autoLoad(this.getAttribute('data-key'))"> - <select class="cool-auto-complete-window-select" data-key="deptQuerySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple"> - </select> - </div> - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label"><span class="not-null">*</span>閮ㄩ棬鍚嶇О锛�</label> - <div class="layui-input-inline"> - <input id="name" class="layui-input" type="text" lay-verify="required" autocomplete="off"> - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label">璐� 璐� 浜猴細</label> - <div class="layui-input-inline cool-auto-complete"> - <input id="leader" class="layui-input" type="text" lay-verify="number" style="display: none"> - <input id="leader$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" onfocus=this.blur()> - <div class="cool-auto-complete-window"> - <input class="cool-auto-complete-window-input" data-key="userQueryByleader" onkeyup="autoLoad(this.getAttribute('data-key'))"> - <select class="cool-auto-complete-window-select" data-key="userQueryByleaderSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple"> - </select> - </div> - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label">鑱旂郴鐢佃瘽锛�</label> - <div class="layui-input-inline"> - <input id="phone" class="layui-input" type="text" autocomplete="off"> - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label">閭��銆�绠憋細</label> - <div class="layui-input-inline"> - <input id="email" class="layui-input" type="text" autocomplete="off"> - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label">閮ㄩ棬鐘舵�侊細</label> - <div class="layui-input-inline"> - <select id="status"> - <option value="" style="display: none"></option> - <option value="1">姝e父</option> - <option value="0">鍋滅敤</option> - </select> - </div> - </div> - <div class="layui-inline" style="width:80%;"> - <label class="layui-form-label">鏄剧ず椤哄簭锛�</label> - <div class="layui-input-inline"> - <input id="sort" class="layui-input" type="text" lay-verify="number" autocomplete="off"> - </div> - </div> - <hr class="layui-bg-gray"> - - <div id="data-detail-btn" class="layui-btn-container layui-form-item"> - <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">淇濆瓨</div> - <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">淇敼</div> - <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">鍏抽棴</div> - </div> - - <div id="prompt"> - 娓╅Θ鎻愮ず锛氳浠旂粏濉啓鐩稿叧淇℃伅锛�<span class="extrude"><span class="not-null">*</span> 涓哄繀濉�夐」銆�</span> - </div> - </form> -</div> -</body> -<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> -<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script> -<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script> -<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script> -<script type="text/javascript" src="../../static/js/dept/dept.js" charset="utf-8"></script> -</html> - -- Gitblit v1.9.1