forked from kidgrow-microservices-platform

zhaoxiaohao
2020-04-14 acf111c53912a96da9d142225a08ac20c6f1f454
添加  组织结构的功能
6 files modified
2 files added
453 ■■■■■ changed files
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysOrganizationVo.java 9 ●●●●● patch | view | raw | blame | history
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysOrganizationService.java 16 ●●●●● patch | view | raw | blame | history
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysOrganizationServiceImpl.java 98 ●●●●● patch | view | raw | blame | history
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysOrganizationMapper.xml 2 ●●● patch | view | raw | blame | history
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysOrganizationController.java 11 ●●●●● patch | view | raw | blame | history
kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysOrganization.java 4 ●●● patch | view | raw | blame | history
kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java 19 ●●●● patch | view | raw | blame | history
kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysOrganization.html 294 ●●●●● patch | view | raw | blame | history
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-api/src/main/java/com/kidgrow/usercenter/vo/SysOrganizationVo.java
New file
@@ -0,0 +1,9 @@
package com.kidgrow.usercenter.vo;
import com.kidgrow.common.model.SysOrganization;
import lombok.Data;
@Data
public class SysOrganizationVo extends SysOrganization {
    private String orgParentName;
}
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/ISysOrganizationService.java
@@ -39,7 +39,21 @@
     * @return
     */
    List<SysOrganization> findListByUserId(Long userId);
    /**
     * 根据map  查询,  将参数中的  access_token 去掉
     * @param params
     * @return
     */
    ResultBody getListByMap(Map<String, Object> params);
    ResultBody updateEnabled(Map<String, Object> params);
    /**
     * 获取树状图
     * @param params
     * @return
     */
    ResultBody getTree(Map<String, Object> params);
}
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/java/com/kidgrow/usercenter/service/impl/SysOrganizationServiceImpl.java
@@ -1,5 +1,6 @@
package com.kidgrow.usercenter.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kidgrow.common.model.PageResult;
import com.kidgrow.common.model.ResultBody;
@@ -7,12 +8,19 @@
import com.kidgrow.common.service.impl.SuperServiceImpl;
import com.kidgrow.usercenter.mapper.SysOrganizationMapper;
import com.kidgrow.usercenter.service.ISysOrganizationService;
import com.kidgrow.usercenter.vo.SysOrganizationVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
@@ -47,14 +55,102 @@
        return baseMapper.findByObject(sysOrganization);
    }
    /**
     * 根据用户  获取组织
     * @param userId
     * @return
     */
    @Override
    public List<SysOrganization> findListByUserId(Long userId) {
        return baseMapper.findListByUserId(userId);
    }
    /**
     * 根据map  查询,  将参数中的  access_token 去掉
     * @param params
     * @return
     */
    @Override
    public ResultBody getListByMap(Map<String, Object> params) {
        //将access_token  参数去掉
        params.remove("access_token");
        List<SysOrganization> sysOrganizations = baseMapper.selectByMap(params);
        return ResultBody.ok().data(sysOrganizations);
        List<SysOrganizationVo> sysOrganizationVos=new ArrayList<>();
        sysOrganizations.forEach(e ->{
            if(e.getOrgParentId()!=null){
                SysOrganizationVo sysOrganizationVo=new SysOrganizationVo();
                BeanCopier beanCopier = BeanCopier.create(SysOrganization.class, SysOrganizationVo.class, false);
                beanCopier.copy(e,sysOrganizationVo,null);
                SysOrganization sysOrganization = baseMapper.selectById(e.getOrgParentId());
                if(sysOrganization!=null){
                    sysOrganizationVo.setOrgParentName(sysOrganization.getOrgName());
                }
                sysOrganizationVos.add(sysOrganizationVo);
            }
        });
        return ResultBody.ok().data(sysOrganizationVos);
    }
    /**
     * 更新状态
     * @param params
     * @return
     */
    @Override
    public ResultBody updateEnabled(Map<String, Object> params) {
        Long id = MapUtils.getLong(params, "id");
        if(id==null){
            return ResultBody.failed("请选取一条数据");
        }
        SysOrganization sysOrganization = baseMapper.selectById(id);
        if (sysOrganization != null) {
            sysOrganization.setEnabled(MapUtils.getBoolean(params,"enabled"));
            int i = baseMapper.updateById(sysOrganization);
            if(i>0){
                return  ResultBody.ok();
            }else {
                return ResultBody.failed("更新失败");
            }
        }else {
            return ResultBody.failed("更新失败");
        }
    }
    /**
     * 获取树状图
     * @param params
     * @return
     */
    @Override
    public ResultBody getTree(Map<String, Object> params) {
        List<SysOrganization> sysOrganizations = baseMapper.selectByMap(params);
        List<Map<String, Object>> treeData = getTreeData(Long.valueOf("-1"), sysOrganizations);
        return ResultBody.ok().data(treeData);
    }
    /**
     * 将数据  封装成  tree   (递归方式)
     * @param MyId
     * @param sysOrganizations
     * @return
     */
    public List<Map<String,Object>> getTreeData(Long MyId,List<SysOrganization> sysOrganizations){
        List<Map<String,Object>> listMap=new ArrayList<>();
        Map<Long, SysOrganization> collect = sysOrganizations.stream().collect(Collectors.toMap(SysOrganization::getId, SysOrganization -> SysOrganization));
        List<Long> idList = sysOrganizations.stream().filter(e -> e.getOrgParentId()==MyId).map(e -> e.getId()).collect(Collectors.toList());
        for (Long id:idList
             ) {
            Map<String,Object> map=new HashMap<>();
            map.put("id",id);
            map.put("name",collect.get(id).getOrgName());
            map.put("level",collect.get(id).getOrgLevel());
            List<Long> childs = sysOrganizations.stream().filter(e -> e.getOrgParentId() == id).map(e -> e.getId()).collect(Collectors.toList());
            if(childs.size()>0){
                List<Map<String, Object>> treeData = getTreeData(id, sysOrganizations);
                map.put("children",treeData);
            }
            listMap.add(map);
        }
        return listMap;
    }
}
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-biz/src/main/resources/mapper/SysOrganizationMapper.xml
@@ -25,7 +25,7 @@
                and org_parent_id = #{p.orgParentId}
            </if>
            <if test="p.orgName != null and p.orgName !=''">
                and org_name = #{p.orgName}
                and org_name like '%${p.orgName}%'
            </if>
            <if test="p.orgOrder != null and p.orgOrder !=''">
                and org_order = #{p.orgOrder}
kidgrow-business/kidgrow-usercenter/kidgrow-usercenter-server/src/main/java/com/kidgrow/usercenter/controller/SysOrganizationController.java
@@ -58,6 +58,17 @@
        return sysOrganizationService.getListByMap(params);
    }
    @ApiOperation(value = "获取tree")
    @GetMapping("getTree")
    public ResultBody getTree(@RequestParam Map<String, Object> params) {
        return sysOrganizationService.getTree(params);
    }
    @ApiOperation(value = "更新状态")
    @GetMapping("updateEnabled")
    public ResultBody updateEnabled(@RequestParam Map<String, Object> params) {
        return sysOrganizationService.updateEnabled(params);
    }
    /**
     * 查询
     */
kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/model/SysOrganization.java
@@ -11,6 +11,8 @@
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.*;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
@@ -32,7 +34,7 @@
            /**
    * 节点级别取值 0-9
    */
        @NotBlank(message = "节点级别取值 0-9不能为空")
        @NotNull(message = "节点级别取值 0-9不能为空")
        private Integer orgLevel;
            /**
    * 节点属性(集团/公司/部门等,取值0,1,2,3,4)
kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/UserInfoHeaderFilter.java
@@ -3,6 +3,7 @@
import cn.hutool.core.collection.CollectionUtil;
import com.kidgrow.common.constant.CommonConstant;
import com.kidgrow.common.constant.SecurityConstants;
import com.kidgrow.common.model.ResultBody;
import com.kidgrow.common.model.SysOrganization;
import com.kidgrow.common.model.SysUser;
import com.kidgrow.common.utils.AddrUtil;
@@ -69,11 +70,19 @@
                List<SysOrganization> organizations = (List<SysOrganization>)user.getOrganizations();
                //如果有组织架构
                if(organizations!=null && organizations.size()==2){
                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_ID_HEADER,String.valueOf(organizations.get(0).getId()));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_NAME_HEADER, URLEncoder.encode(organizations.get(0).getOrgName(),"UTF-8"));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(organizations.get(1).getId()));
                    ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_NAME_HEADER,URLEncoder.encode(organizations.get(1).getOrgName(),"UTF-8"));
                    tenantId=String.valueOf(organizations.get(0).getId());
                   if(organizations.get(0)!=null){
                       ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_ID_HEADER,String.valueOf(organizations.get(0).getId()));
                       ctx.addZuulRequestHeader(SecurityConstants.USER_ORG_NAME_HEADER, URLEncoder.encode(organizations.get(0).getOrgName(),"UTF-8"));
                       tenantId=String.valueOf(organizations.get(0).getId());
                   }else{
                        return ResultBody.failed("您的组织,已经被禁用,请联系管理员");
                   }
                   if(organizations.get(1)!=null){
                       ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_ID_HEADER,String.valueOf(organizations.get(1).getId()));
                       ctx.addZuulRequestHeader(SecurityConstants.USER_DEP_NAME_HEADER,URLEncoder.encode(organizations.get(1).getOrgName(),"UTF-8"));
                   }else {
                       return ResultBody.failed("您组织部门或者科室,已经被禁用,请联系管理员");
                   }
                }
//                log.error("用户ID写入Header成功,用户ID为:"+String.valueOf(user.getId()));
            }
kidgrow-web/kidgrow-web-manager/src/main/resources/static/pages/opration/sysOrganization.html
New file
@@ -0,0 +1,294 @@
<div class="layui-card">
    <div class="layui-card-header">
        <h2 class="header-title">组织结构</h2>
        <span class="layui-breadcrumb pull-right">
            <a href="#!home_console">首页</a>
            <a><cite>组织结构</cite></a>
        </span>
    </div>
    <div class="layui-card-body">
        <div class="layui-form toolbar">
            <input id="orgName-search" class="layui-input search-input" type="text" placeholder="请输入名称" />&emsp;
            <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
            <button id="organization-add" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
        </div>
        <!-- 数据表格 -->
        <table class="layui-table" id="organization-table" lay-filter="organization-table"></table>
    </div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="organization-table-bar">
    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<!-- 表格状态列 -->
<script type="text/html" id="organization-tpl-state">
    <input type="checkbox" lay-filter="organization-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|锁定"
           {{d.enabled==true?'checked':''}}/>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="app-model">
    <form id="app-form" lay-filter="app-form" class="layui-form model-form">
        <input name="id" type="hidden"/>
        <div class="layui-form-item">
            <label class="layui-form-label">请选择:</label>
            <div class="layui-input-block">
                <div id="orgParentId-tree" class="demo-tree demo-tree-box"></div>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">上级组织:</label>
            <div class="layui-input-block">
                <input name="orgParentId" id="orgParentId" type="hidden" value="-1" class="layui-input" maxlength="20"/>
            <input name="orgParentName" id="orgParentName" type="text"  class="layui-input" maxlength="20"/>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">组织类型:</label>
            <div class="layui-input-block">
                <select id="doctorRankId" name="orgAttr"   placeholder="选择一个职称" >
                    <option value="">-请选择-</option>
                    <option value="0">集团</option>
                    <option value="1">公司/医院</option>
                    <option value="2">部门/科室</option>
                    <option value="3">子部门/子科室</option>
                </select>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">组织层级:</label>
            <div class="layui-input-block">
                       <select  name="orgLevel" id='orgLevel' disabled="true" placeholder="选择一个职称" >
                        <option value="">-请选择-</option>
                        <option value="0">1级</option>
                        <option value="1">2级</option>
                        <option value="2">3级</option>
                        <option value="3">4级</option>
                        <option value="4">5级</option>
                        <option value="5">6级</option>
                        <option value="6">7级</option>
                        <option value="7">8级</option>
                        <option value="8">9级</option>
                    </select>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">组织名称:</label>
            <div class="layui-input-block">
                <input name="orgName"  type="text" class="layui-input" maxlength="20"/>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">组织状态:</label>
            <div class="layui-input-block">
                <input id="orgName-shi" name="enabled" value="true" title="启用" type="radio" class="layui-input" maxlength="20"/>
                <input id="orgName-fou" name="enabled" value="false" title="禁用" type="radio" class="layui-input" maxlength="20"/>
            </div>
        </div>
        <div class="layui-form-item model-form-footer">
            <button class="layui-btn layui-btn-primary"  ew-event="closeDialog" type="button">取消</button>
            <button class="layui-btn" id="sure" lay-filter="user-form-submit" lay-submit>保存</button>
        </div>
    </form>
</script>
<script>
    layui.use(['form', 'table', 'laydate', 'util', 'tree', 'config', 'admin', 'treetable'], function () {
        var form = layui.form;
        var table = layui.table;
        var config = layui.config;
        var layer = layui.layer;
        var util = layui.util;
        var admin = layui.admin;
        let treetable = layui.treetable;
        //树形插件
        var tree = layui.tree;
        var layer = layui.layer
            , $ = layui.jquery;
        // 渲染表格
        // 渲染表格
        var renderTable = function (param) {
            if (param) {
                param.access_token = config.getToken().access_token;
            } else {
                param = {
                    access_token: config.getToken().access_token
                };
            }
            treetable.render({
                treeColIndex: 1,
                treeSpid: -1,
                treeIdName: 'id',
                treePidName: 'orgParentId',
                elem: '#organization-table',
                url: config.base_server + 'api-user/sysorganization/getListByMap',
                where: param,
                page: false,
                cols: [[
                    { type: 'numbers' },
                    { field: 'orgName', align: 'right', title: '组织名称' },
                    {
                        field: 'orgAttr', align: 'right', title: '所属类型', templet: function (d) {
                            //节点属性(集团/公司/部门等,取值0,1,2,3,4)
                            if (d.orgAttr == 0) {
                                return "集团";
                            } else if (d.orgAttr == 1) {
                                return "公司";
                            } else if (d.orgAttr == 2) {
                                return "部门";
                            }
                        }
                    },
                    { field: 'enabled', align: 'right', sort: true, templet: '#organization-tpl-state', title: '状态' },
                    { toolbar: '#organization-table-bar', align: 'right', align: 'center', title: '操作' }
                ]]
            });
        };
        renderTable({ access_token: config.clientId, is_del: 0 });
        // 工具条点击事件
        table.on('tool(organization-table)', function (obj) {
            var data = obj.data;
            var layEvent = obj.event;
            if (layEvent === 'edit') { // 查看详情
                showEditModel(data);
            } else if (layEvent === 'del') {
                layer.confirm('确定删除此菜单吗?', function () {
                    layer.load(2);
                    let tenantId = $('#menu_clients').val();
                    admin.req('api-user/sysorganization/' + obj.data.id + '?tenantId=' + tenantId, {}, function (data) {
                        layer.closeAll('loading');
                        if (0 === data.code) {
                            layer.msg(data.msg, { icon: 1, time: 500 });
                            renderTable({ tenantId: tenantId });
                        } else {
                            layer.msg(data.msg, { icon: 2, time: 500 });
                        }
                    }, 'DELETE');
                });
            }
        });
        // 修改menu状态
        form.on('switch(organization-tpl-state)', function (obj) {
            layer.load(2);
            admin.req('api-user/sysorganization/updateEnabled', {
                id: obj.elem.value,
                enabled: obj.elem.checked ? true : false
            }, function (data) {
                layer.closeAll('loading');
                if (data.code == 0) {
                    layer.msg(data.msg, { icon: 1, time: 500 });
                    renderTable({ access_token: config.clientId, is_del: 0 });
                } else {
                    layer.msg(data.msg, { icon: 2, time: 500 });
                    $(obj.elem).prop('checked', !obj.elem.checked);
                    form.render('checkbox');
                }
            }, 'GET');
        });
         // 添加按钮点击事件
         $('#organization-add').click(function () {
            showEditModel();
        });
        // 表单提交事件
        form.on('submit(user-form-submit)', function (data) {
            layer.load(2);
            admin.req('api-user/sysorganization', JSON.stringify(data.field), function (data) {
                layer.closeAll('loading');
                if (data.code == 0) {
                    // layer.msg(data.msg, { icon: 1, time: 500 });
                    layer.closeAll();
                    // treetable.reload('organization-table', {});
                    renderTable({ access_token: config.clientId, is_del: 0 });
                } else {
                    layer.msg(data.msg, { icon: 2, time: 500 });
                }
            }, "POST");
            return false;
        });
        // 搜索按钮点击事件
        $('#app-btn-search').click(function () {
            var keyword = $('#orgName-search').val();
            var searchCount = 0;
            $('#organization-table').next('.treeTable').find('.layui-table-body tbody tr td').each(function () {
                $(this).css('background-color', 'transparent');
                var text = $(this).text();
                if (keyword !== '' && text.indexOf(keyword) >= 0) {
                    $(this).css('background-color', 'rgba(250,230,160,0.5)');
                    if (searchCount === 0) {
                        $('.layui-tab-item.layui-show').stop(true);
                        $('.layui-tab-item.layui-show').animate({ scrollTop: $(this).offset().top - 150 }, 500);
                    }
                    searchCount++;
                }
            });
            if (keyword !== '' && searchCount === 0) {
                layer.msg("没有匹配结果", { icon: 5, time: 500 });
            } else {
                treetable.expandAll('#organization-table');
            }
        });
        var getData = function () {
            admin.req('api-user/sysorganization/getTree', { is_del: 0 }, function (data) {
                layer.closeAll('loading');
                var data1 = [{
                    name: '常用文件夹',
                    id: 1,
                    children: [
                        { name: '所有未读', id: 11 },
                        { name: '置顶邮件', id: 12 },
                        { name: '标签邮件', id: 13 }]
                }];
                if (0 === data.code) {
                    console.log(JSON.stringify(data.data))
                    tree({
                        elem: "#orgParentId-tree",
                        nodes: data.data,
                        click: function (node) {
                            //将数据赋值
                            $("#orgParentId").val(node.id)
                            $("#orgParentName").val(node.name)
                            $("#orgLevel").val(node.level+1)
                            form.render('select');
                        }
                    });
                } else {
                    layer.msg(data.msg, { icon: 2, time: 500 });
                }
            }, 'get');
        }
        // // 显示编辑弹窗
        var showEditModel = function (data) {
            layer.open({
                type: 1,
                title: '查看详情',
                area: '450px',
                offset: '120px',
                content: $('#app-model').html(),
                success: function () {
                    $('#app-form')[0].reset();
                    $('#app-form').attr('method', 'POST');
                    getData();
                    if (data) {
                        //
                        form.val('app-form', data);
                        $("#orgParentId").val(data.orgParentId);
                        if (data.enabled) {
                            $("#orgName-shi").prop("checked", true);
                        } else {
                            $("#orgName-fou").prop("checked", true);
                        }
                    }
                }
            });
        };
    });
</script>