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">&#xe654;</i>娣诲姞</button>&nbsp;',
+                '<button lay-event="del" class="layui-btn layui-btn-sm layui-btn-danger icon-btn"><i class="layui-icon">&#xe640;</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