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="请输入名称" />  <button id="app-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> <button id="organization-add" class="layui-btn icon-btn"><i class="layui-icon"></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>