中扬CRM客户关系管理系统
#
luxiaotao1123
2022-09-16 78839ec83b089ed91ad00585748e78f1c724e570
#
1个文件已删除
3个文件已修改
459 ■■■■ 已修改文件
src/main/java/com/zy/crm/manager/utils/NodeUtils.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/crm/system/controller/DeptController.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/dept/dept.html 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/dept/dept_detail.html 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
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)) {
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>
<!-- 正文开始 -->
<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="请输入负责人" 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,        // 是否是id、pid形式数据
                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>
src/main/webapp/views/dept/dept_detail.html
File was deleted