用户管理新增附属机构配置,支持一个用户配置多个部门,支持多部门数据权限过滤
This commit is contained in:
@@ -160,16 +160,18 @@ user:
|
||||
# 角色管理
|
||||
role:
|
||||
# 扩展数据权限定义:3:本部门;4:本公司;5:本部门和本公司
|
||||
# ctrlTypeClass 控制的 Class 类,如果为 NONE,则代表是不控制该类型权限;
|
||||
# ctrlDataAttrName 控制的数据,返回当前用户有权限的数据值,可以接受 String 或 String[] 的类型;
|
||||
# ctrlDataParentCodesAttrName 控制的数据所有上级,用于控制数据为树表的情况,为数组时,必须与 ctrlDataAttrName 长度相同。
|
||||
extendDataScopes: >
|
||||
{
|
||||
3: {
|
||||
Office: {
|
||||
#控制类型的类名 : "用来获取控制表名和主键,如果为 NONE,则代表是不控制该类型权限;",
|
||||
ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
|
||||
ctrlDataAttrName: "currentUser.refObj.office.officeCode",
|
||||
ctrlDataParentCodesAttrName: "currentUser.refObj.office.parentCodes"
|
||||
#控制数据的类名: "指定一个静态类名,方便 ctrlDataAttrName 得到权限数据,如:当前部门编码、公司编码",
|
||||
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
|
||||
#控制数据的类名下的属性名 : "可看做类下的 get 方法,如:EmpUtils.getOffices(),支持返回字符串或字符串数组类型",
|
||||
ctrlDataAttrName: "officeCodes",
|
||||
#控制数据的所有上级编码 : "用于控制数据为树表的情况,为数组时,必须与 ctrlDataAttrName 返回的长度相同,不是树表设置为空",
|
||||
ctrlDataParentCodesAttrName: "officeParentCodess"
|
||||
},
|
||||
Company: {
|
||||
ctrlTypeClass: "NONE"
|
||||
@@ -181,20 +183,23 @@ role:
|
||||
},
|
||||
Company: {
|
||||
ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
|
||||
ctrlDataAttrName: "currentUser.refObj.company.companyCode",
|
||||
ctrlDataParentCodesAttrName: "currentUser.refObj.company.parentCodes"
|
||||
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
|
||||
ctrlDataAttrName: "company.companyCode",
|
||||
ctrlDataParentCodesAttrName: "company.parentCodes"
|
||||
}
|
||||
},
|
||||
5: {
|
||||
Office: {
|
||||
ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
|
||||
ctrlDataAttrName: "currentUser.refObj.office.officeCode",
|
||||
ctrlDataParentCodesAttrName: "currentUser.refObj.office.parentCodes"
|
||||
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
|
||||
ctrlDataAttrName: "officeCodes",
|
||||
ctrlDataParentCodesAttrName: "officeParentCodess"
|
||||
},
|
||||
Company: {
|
||||
ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
|
||||
ctrlDataAttrName: "currentUser.refObj.company.companyCode",
|
||||
ctrlDataParentCodesAttrName: "currentUser.refObj.company.parentCodes"
|
||||
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
|
||||
ctrlDataAttrName: "company.companyCode",
|
||||
ctrlDataParentCodesAttrName: "company.parentCodes"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,14 @@
|
||||
|
||||
-- 新增文件管理模块
|
||||
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
|
||||
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', getdate(), 'system', getdate(), NULL);
|
||||
|
||||
-- 员工附属机构关系表
|
||||
CREATE TABLE [js_sys_employee_office]
|
||||
(
|
||||
[id] varchar(64) NOT NULL UNIQUE,
|
||||
[emp_code] varchar(64) NOT NULL,
|
||||
[office_code] varchar(64) NOT NULL,
|
||||
[post_code] varchar(64),
|
||||
PRIMARY KEY ([emp_code], [office_code])
|
||||
);
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
|
||||
-- 新增文件管理模块
|
||||
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
|
||||
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', now(), 'system', now(), NULL);
|
||||
|
||||
-- 员工附属机构关系表
|
||||
CREATE TABLE js_sys_employee_office
|
||||
(
|
||||
id varchar(64) NOT NULL COMMENT '编号',
|
||||
emp_code varchar(64) NOT NULL COMMENT '员工编码',
|
||||
office_code varchar(64) NOT NULL COMMENT '机构编码',
|
||||
post_code varchar(64) COMMENT '岗位编码',
|
||||
PRIMARY KEY (emp_code, office_code),
|
||||
UNIQUE (id)
|
||||
) COMMENT = '员工附属机构关系表';
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
|
||||
-- 新增文件管理模块
|
||||
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
|
||||
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', sysdate, 'system', sysdate, NULL);
|
||||
|
||||
-- 员工附属机构关系表
|
||||
CREATE TABLE js_sys_employee_office
|
||||
(
|
||||
id varchar2(64) NOT NULL UNIQUE,
|
||||
emp_code varchar2(64) NOT NULL,
|
||||
office_code varchar2(64) NOT NULL,
|
||||
post_code varchar2(64),
|
||||
PRIMARY KEY (emp_code, office_code)
|
||||
);
|
||||
COMMENT ON TABLE js_sys_employee_office IS '员工附属机构关系表';
|
||||
COMMENT ON COLUMN js_sys_employee_office.id IS '编号';
|
||||
COMMENT ON COLUMN js_sys_employee_office.emp_code IS '员工编码';
|
||||
COMMENT ON COLUMN js_sys_employee_office.office_code IS '机构编码';
|
||||
COMMENT ON COLUMN js_sys_employee_office.post_code IS '岗位编码';
|
||||
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
|
||||
-- 新增文件管理模块
|
||||
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
|
||||
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', now(), 'system', now(), NULL);
|
||||
|
||||
-- 员工附属机构关系表
|
||||
CREATE TABLE js_sys_employee_office
|
||||
(
|
||||
id varchar(64) NOT NULL UNIQUE,
|
||||
emp_code varchar(64) NOT NULL,
|
||||
office_code varchar(64) NOT NULL,
|
||||
post_code varchar(64),
|
||||
PRIMARY KEY (emp_code, office_code)
|
||||
) WITHOUT OIDS;
|
||||
COMMENT ON TABLE js_sys_employee_office IS '员工附属机构关系表';
|
||||
COMMENT ON COLUMN js_sys_employee_office.id IS '编号';
|
||||
COMMENT ON COLUMN js_sys_employee_office.emp_code IS '员工编码';
|
||||
COMMENT ON COLUMN js_sys_employee_office.office_code IS '机构编码';
|
||||
COMMENT ON COLUMN js_sys_employee_office.post_code IS '岗位编码';
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.jeesite.modules.sys.dao.EmployeeOfficeDao">
|
||||
|
||||
<!-- 查询数据
|
||||
<select id="findList" resultType="EmployeeOffice">
|
||||
SELECT ${sqlMap.column.toSql()}
|
||||
FROM ${sqlMap.table.toSql()}
|
||||
<where>
|
||||
${sqlMap.where.toSql()}
|
||||
</where>
|
||||
ORDER BY ${sqlMap.order.toSql()}
|
||||
</select> -->
|
||||
|
||||
</mapper>
|
||||
@@ -107,7 +107,7 @@ for (c in child.columnList){
|
||||
id: 'office_'+editOptions.id, title: '机构选择',
|
||||
name: '${c.attrName}', value: val.split('|')[0],
|
||||
labelName: '${c.attrName2}', labelValue: val.split('|')[1],
|
||||
url: '\${ctx}/sys/office/treeData?officeTypes=1,2', cssClass: '${cssClass}'
|
||||
url: '\${ctx}/sys/office/treeData', cssClass: '${cssClass}'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
<% layout('/layouts/default.html', {title: '附属机构管理', libs: ['validate']}){ %>
|
||||
<div class="main-content">
|
||||
<div class="box box-main">
|
||||
<div class="box-header with-border">
|
||||
<div class="box-title">
|
||||
<i class="fa fa-list-alt"></i> ${text(employeeOffice.isNewRecord ? '新增附属机构' : '编辑附属机构')}
|
||||
</div>
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<#form:form id="inputForm" model="${employeeOffice}" action="${ctx}/sys/empOffice/save" method="post" class="form-horizontal">
|
||||
<#form:hidden path="empCode"/>
|
||||
<#form:hidden path="isNewRecord"/>
|
||||
<div class="box-body"><br/>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" title="">
|
||||
<span class="required hide">*</span> ${text('附属机构')}:<i class="fa icon-question hide"></i></label>
|
||||
<div class="col-sm-5">
|
||||
<#form:treeselect id="office" title="${text('机构选择')}"
|
||||
path="officeCode" labelPath="officeName" readonly="${!employeeOffice.isNewRecord}"
|
||||
url="${ctx}/sys/office/treeData?ctrlPermi=2" class="required" allowClear="false"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" title="">
|
||||
<span class="required hide">*</span> ${text('岗位编码')}:<i class="fa icon-question hide"></i></label>
|
||||
<div class="col-sm-5">
|
||||
<#form:select name="postCode" items="${postList}"
|
||||
itemLabel="postName" itemValue="postCode" class="form-control"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-footer">
|
||||
<div class="row">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<% if (hasPermi('sys:empUser:view')){ %>
|
||||
<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>
|
||||
<% } %>
|
||||
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</#form:form>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
<script>
|
||||
$("#inputForm").validate({
|
||||
submitHandler: function(form){
|
||||
js.ajaxSubmitForm($(form), function(data){
|
||||
js.showMessage(data.message);
|
||||
if(data.result == Global.TRUE){
|
||||
js.closeCurrentTabPage(function(contentWindow){
|
||||
contentWindow.page();
|
||||
});
|
||||
}
|
||||
}, "json");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,53 @@
|
||||
<% layout('/layouts/default.html', {title: '附属机构管理', libs: ['dataGrid']}){ %>
|
||||
<div class="main-content">
|
||||
<div class="box box-main">
|
||||
<div class="box-header">
|
||||
<div class="box-title">
|
||||
<i class="fa fa-list-alt"></i> ${text('附属机构管理')}
|
||||
</div>
|
||||
<div class="box-tools pull-right">
|
||||
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
|
||||
<% if(hasPermi('sys:empUser:view')){ %>
|
||||
<a href="${ctx}/sys/empOffice/form?empCode=1&isNewRecord=true" class="btn btn-default btnTool" title="${text('新增附属机构')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<#form:form id="searchForm" model="${employeeOffice}" action="${ctx}/sys/empOffice/listData" method="post" class="form-inline hide"
|
||||
data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
|
||||
<#form:hidden path="empCode"/>
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
|
||||
<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
|
||||
</div>
|
||||
</#form:form>
|
||||
<table id="dataGrid"></table>
|
||||
<div id="dataGridPage"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
<script>
|
||||
// 初始化DataGrid对象
|
||||
$('#dataGrid').dataGrid({
|
||||
searchForm: $("#searchForm"),
|
||||
columnModel: [
|
||||
{header:'${text("附属机构")}', name:'officeCode', index:'a.office_code', width:200, align:"center", frozen:true, formatter: function(val, obj, row, act){
|
||||
return '<a href="${ctx}/sys/empOffice/form?empCode='+row.empCode+'&officeCode='+row.officeCode+'" class="btnList" data-title="${text("编辑附属机构")}">'+(val||row.id)+'</a>';
|
||||
}},
|
||||
{header:'${text("岗位编码")}', name:'postCode', index:'a.post_code', width:200, align:"center"},
|
||||
{header:'${text("操作")}', name:'actions', width:120, sortable:false, title:false, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
<% if(hasPermi('sys:empUser:view')){ %>
|
||||
actions.push('<a href="${ctx}/sys/empOffice/form?empCode='+row.empCode+'&officeCode='+row.officeCode+'" class="btnList" title="${text("编辑附属机构")}"><i class="fa fa-pencil"></i></a> ');
|
||||
actions.push('<a href="${ctx}/sys/empOffice/delete?empCode='+row.empCode+'&officeCode='+row.officeCode+'" class="btnList" title="${text("删除附属机构")}" data-confirm="${text("确认要删除该附属机构吗?")}"><i class="fa fa-trash-o"></i></a> ');
|
||||
<% } %>
|
||||
return actions.join('');
|
||||
}}
|
||||
],
|
||||
// 加载成功后执行事件
|
||||
ajaxSuccess: function(data){
|
||||
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -143,8 +143,8 @@
|
||||
<label class="control-label col-sm-4" title="">
|
||||
<span class="required hide">*</span> ${text('所在岗位')}:<i class="fa icon-question hide"></i></label>
|
||||
<div class="col-sm-8">
|
||||
<#form:select multiple="true" path="employee.employeePosts" items="${postList}"
|
||||
itemLabel="postName" itemValue="postCode" class="form-control"/>
|
||||
<#form:select multiple="true" path="employee.employeePosts" items="${postList}"
|
||||
itemLabel="postName" itemValue="postCode" class="form-control"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -158,6 +158,20 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" title="">
|
||||
<span class="required hide">*</span> ${text('附属机构')}:<i class="fa icon-question hide"></i></label>
|
||||
<div class="col-sm-10">
|
||||
<table id="empOfficeGrid"></table>
|
||||
<% if (hasPermi('sys:empUser:edit')){ %>
|
||||
<a href="#" id="empOfficeGridAddRowBtn" class="btn btn-primary btn-sm mt10 mb10"><i class="fa fa-plus"></i> ${text('增行')}</a>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="form-group">
|
||||
@@ -195,21 +209,59 @@
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
<script id="treeselectTpl" type="text/template">//<!--<div>
|
||||
<#form:treeselect id="{{d.id}}" title="{{d.title}}" name="{{d.name}}" value="{{d.value}}"
|
||||
labelName="{{d.labelName}}" labelValue="{{d.labelValue}}" url="{{d.url}}"
|
||||
class="{{d.cssClass}}" btnClass="btn-sm" allowClear="true"/>
|
||||
</div>//--></script>
|
||||
<script>
|
||||
$("#inputForm").validate({
|
||||
submitHandler: function(form){
|
||||
<% if(op == 'add' || op == 'auth') { // 获取选中角色 %>
|
||||
$("#userRoleString").val(roleGrid.dataGrid('getSelectRows').join(','));
|
||||
<% } %>
|
||||
js.ajaxSubmitForm($(form), function(data){
|
||||
js.showMessage(data.message);
|
||||
if(data.result == Global.TRUE){
|
||||
js.closeCurrentTabPage(function(contentWindow){
|
||||
contentWindow.page();
|
||||
});
|
||||
$("#empOfficeGrid").dataGrid({
|
||||
data: ${toJson(empUser.employee.employeeOfficeList)},
|
||||
datatype: "local", // 设置本地数据
|
||||
columnModel: [
|
||||
{header:'${text("附属机构")}', name:'officeName', sortable:false, width:100,
|
||||
formatter: function(val, obj, row, act){
|
||||
return js.val(row, 'officeCode')+'|'+js.val(row, 'officeName');
|
||||
}, editable: true, edittype: "custom", editoptions: {
|
||||
custom_element: function(val, editOptions) {
|
||||
return js.template('treeselectTpl', {
|
||||
id: 'office_'+editOptions.id, title: '机构选择',
|
||||
name: 'officeCode', value: val.split('|')[0],
|
||||
labelName: 'officeName', labelValue: val.split('|')[1],
|
||||
url: '${ctx}/sys/office/treeData', cssClass: 'required'
|
||||
});
|
||||
}
|
||||
}
|
||||
}, "json");
|
||||
}
|
||||
},
|
||||
{header:'${text("附属岗位")}', name:'postCode', sortable:false, width:100,
|
||||
editable:true, edittype:'select', editoptions:{'class':'form-control',
|
||||
items: $.merge([{postName:' ',postCode:''}], ${toJson(postList)}),
|
||||
itemLabel: 'postName', itemValue: 'postCode', dataInit: function(element){
|
||||
$(element).select2().on("change",function(){$(this).valid()});
|
||||
}
|
||||
}
|
||||
},
|
||||
{header:'${text("操作")}', name:'actions', width:80, sortable:false, fixed:true, formatter: function(val, obj, row, act){
|
||||
var actions = [];
|
||||
actions.push('<a href="#" onclick="js.confirm(\'${text("你确认要删除这条数据吗?")}\', function(){$(\'#empOfficeGrid\').dataGrid(\'delRowData\',\''+obj.rowId+'\')});return false;"><i class="fa fa-trash-o"></i></a> ');
|
||||
return actions.join('');
|
||||
}, editoptions: {defaultValue: 'new'}}
|
||||
],
|
||||
autoGridHeight: function(){return 'auto'}, // 设置自动高度
|
||||
|
||||
// 编辑表格参数
|
||||
editGrid: true, // 是否是编辑表格
|
||||
editGridInitRowNum: 0, // 编辑表格的初始化新增行数
|
||||
editGridAddRowBtn: $('#empOfficeGridAddRowBtn'), // 子表增行按钮
|
||||
editGridAddRowInitData: {id: '', status: Global.STATUS_NORMAL}, // 新增行的时候初始化的数据
|
||||
|
||||
// 编辑表格的提交数据参数
|
||||
editGridInputFormListName: 'employee.employeeOfficeList', // 提交的数据列表名
|
||||
editGridInputFormListAttrs: 'officeCode,officeName,postCode,postName,', // 提交数据列表的属性字段
|
||||
|
||||
ajaxSuccess: function(){
|
||||
|
||||
}
|
||||
});
|
||||
<% if(op == 'add' || op == 'auth') {%>
|
||||
// 加载角色列表
|
||||
@@ -237,4 +289,19 @@ var roleGrid = $("#roleGrid").dataGrid({
|
||||
}
|
||||
});
|
||||
<% } %>
|
||||
$("#inputForm").validate({
|
||||
submitHandler: function(form){
|
||||
<% if(op == 'add' || op == 'auth') { // 获取选中角色 %>
|
||||
$("#userRoleString").val(roleGrid.dataGrid('getSelectRows').join(','));
|
||||
<% } %>
|
||||
js.ajaxSubmitForm($(form), function(data){
|
||||
js.showMessage(data.message);
|
||||
if(data.result == Global.TRUE){
|
||||
js.closeCurrentTabPage(function(contentWindow){
|
||||
contentWindow.page();
|
||||
});
|
||||
}
|
||||
}, "json");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user