Prechádzať zdrojové kódy

公司机构功能优化

jingbo 4 mesiacov pred
rodič
commit
07438f84ca

+ 1 - 0
src/main/java/com/jeesite/modules/mes/entity/MesDeviceUrgency.java

@@ -7,6 +7,7 @@ import com.jeesite.common.mybatis.annotation.Column;
 import com.jeesite.common.mybatis.annotation.JoinTable;
 import com.jeesite.common.mybatis.annotation.JoinTable.Type;
 import com.jeesite.common.mybatis.annotation.Table;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
 import com.jeesite.common.utils.excel.annotation.ExcelField;
 import com.jeesite.common.utils.excel.annotation.ExcelFields;
 import com.jeesite.modules.sys.entity.User;

+ 1 - 1
src/main/java/com/jeesite/modules/mes/service/MesSkillService.java

@@ -189,4 +189,4 @@ public class MesSkillService extends CrudService<MesSkillDao, MesSkill> {
 		}
 		return true;
 	}
-}
+}

+ 34 - 6
src/main/java/com/jeesite/modules/mes/web/EmpUserCustomController.java

@@ -16,7 +16,6 @@ import com.jeesite.modules.sys.web.user.EmpUserController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -128,11 +127,20 @@ public class EmpUserCustomController extends BaseController {
            }
     @RequestMapping(value = "save")
     @ResponseBody
-    public String save(@Validated EmpUser empUser, String oldLoginCode, HttpServletRequest request) {
+    public String save(EmpUser empUser, String oldLoginCode, HttpServletRequest request) {
+        String loginCode = StringUtils.trim(empUser.getLoginCode());
+        empUser.setLoginCode(loginCode);
+        if (StringUtils.isBlank(loginCode)) {
+            return renderResult(Global.FALSE, "保存用户失败,登录账号不能为空。");
+        }
+        if (!loginCode.matches("[a-zA-Z0-9_\\u4e00-\\u9fa5]{1,20}")) {
+            return renderResult(Global.FALSE, "保存用户失败,登录账号只允许中文、字母、数字、下划线,长度不能超过20个字符。");
+        }
+
         EmpUser existUser = new EmpUser();
-        existUser.setLoginCode(empUser.getLoginCode());
+        existUser.setLoginCode(loginCode);
         List<EmpUser> uList = empUserService.findList(existUser);
-        if (uList != null && !uList.isEmpty()) {
+        if (hasOtherUser(uList, empUser.getUserCode())) {
             return renderResult(Global.FALSE, "保存用户失败,登录账号已存在(不能与原账号相同),请修改登录账号!");
         }
 
@@ -140,13 +148,33 @@ public class EmpUserCustomController extends BaseController {
             EmpUser where = new EmpUser();
             where.setUserName(empUser.getUserName());
             List<EmpUser> list = empUserService.findList(where);
-            if (list != null && !list.isEmpty()) {
+            if (hasOtherUser(list, empUser.getUserCode())) {
                 return renderResult(Global.FALSE, "保存用户失败,用户昵称已存在(不能与原昵称相同),请修改用户昵称!");
             }
         }
 
-        return empUserController.save(empUser, oldLoginCode, request);
+        if (StringUtils.isBlank(empUser.getUserType())) {
+            empUser.setUserType("employee");
+        }
+        if (StringUtils.isBlank(empUser.getEmployee().getEmpNo())) {
+            empUser.getEmployee().setEmpNo(loginCode);
+        }
+        empUserService.save(empUser);
+        return renderResult(Global.TRUE, "保存用户成功。");
     }
+
+    private boolean hasOtherUser(List<EmpUser> userList, String userCode) {
+        if (userList == null || userList.isEmpty()) {
+            return false;
+        }
+        for (EmpUser user : userList) {
+            if (StringUtils.isBlank(userCode) || !StringUtils.equals(userCode, user.getUserCode())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @RequestMapping({"listData"})
     @ResponseBody
     public Page<EmpUser> listData(EmpUser empUser, Boolean isAll, String ctrlPermi, HttpServletRequest request, HttpServletResponse response) {

+ 1 - 1
src/main/java/com/jeesite/modules/mes/web/MesDevicePreventTaskController.java

@@ -410,4 +410,4 @@ public class MesDevicePreventTaskController extends BaseController {
 		}
 		return successMsg.toString();
 	}
-}
+}

+ 1 - 1
src/main/resources/config/application.yml

@@ -938,7 +938,7 @@ file:
   enabled: true
 
   #  # 文件上传根路径,设置路径中不允许包含“userfiles”,在指定目录中系统会自动创建userfiles目录,如果不设置默认为contextPath路径
-  baseDir: D:/mescloud
+  baseDir: E:/mescloud
   #  baseDir: /www/wwwroot/mes_cloud_dy
   #
   #  # 上传文件的相对路径(支持:yyyy, MM, dd, HH, mm, ss, E)

+ 18 - 1
src/main/resources/views/modules/mes/mesScreenConfigList.html

@@ -62,8 +62,9 @@ $('#dataGrid').dataGrid({
 			return val == '1' ? '是' : '否';
 		}},
 		{header:'${text("备注")}', name:'remarks', index:'a.remarks', width:150, align:"center"},
-		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+		{header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){
 			var actions = [];
+			actions.push('<a href="javascript:" class="screen-preview" data-url="' + encodeURIComponent(row.screenUrl || '') + '" data-title="' + encodeURIComponent(row.screenName || '') + '" title="打开大屏"><i class="fa fa-desktop"></i></a>&nbsp;');
 			<% if(hasPermi('mes:mesScreenConfig:edit')){ %>
 				actions.push('<a href="${ctx}/mes/mesScreenConfig/form?id='+row.id+'" class="btnList" title="${text("编辑大屏配置")}"><i class="fa fa-pencil"></i></a>&nbsp;');
 				actions.push('<a href="${ctx}/mes/mesScreenConfig/delete?id='+row.id+'" class="btnList" title="${text("删除大屏配置")}" data-confirm="${text("确认要删除该大屏配置吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
@@ -75,4 +76,20 @@ $('#dataGrid').dataGrid({
 	ajaxSuccess: function(data){
 	}
 });
+
+$('#dataGrid').on('click', '.screen-preview', function() {
+	openScreenPreview($(this).attr('data-url'), $(this).attr('data-title'));
+});
+
+function openScreenPreview(encodedUrl, encodedTitle) {
+	var url = decodeURIComponent(encodedUrl || '');
+	if (!url) {
+		js.showMessage('未配置大屏URL');
+		return;
+	}
+	if (url.indexOf('http://') !== 0 && url.indexOf('https://') !== 0) {
+		url = url.charAt(0) === '/' ? url : ('/' + url);
+	}
+	window.open(url, '_blank');
+}
 </script>

+ 10 - 17
src/main/resources/views/modules/sys/officeForm.html

@@ -57,24 +57,17 @@
 							</div>
 						</div>
 					</div>
-					<div class="col-xs-6">
-						<div class="form-group">
-							<label class="control-label col-sm-4" title="">
-								<span class="required ">*</span> ${text('排序号')}:<i class="fa icon-question hide"></i></label>
-							<div class="col-sm-8">
-								<#form:input path="treeSort" maxlength="9" class="form-control required digits"/>
-							</div>
-						</div>
-					</div>
+<!--					<div class="col-xs-6">-->
+<!--						<div class="form-group">-->
+<!--							<label class="control-label col-sm-4" title="">-->
+<!--								<span class="required ">*</span> ${text('排序号')}:<i class="fa icon-question hide"></i></label>-->
+<!--							<div class="col-sm-8">-->
+<!--								<#form:input path="treeSort" maxlength="9" class="form-control required digits"/>-->
+<!--							</div>-->
+<!--						</div>-->
+<!--					</div>-->
 				</div>
-				<%
-					var officeType = office.officeType;
-					if (isBlank(officeType!)){
-						officeType = office.parent != null && office.parent.officeType == '1' ? '2'
-								: (office.parent != null ? '3' : '1');
-					}
-				%>
-				<#form:hidden name="officeType" value="${officeType}"/>
+
 				<div class="form-unit">${text('详细信息')}</div>
 				<div class="row">
 					<div class="col-xs-6">

+ 162 - 0
src/main/resources/views/modules/sys/officeList.html

@@ -0,0 +1,162 @@
+<% 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 icon-grid"></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>
+				<a href="#" class="btn btn-default" id="btnRefreshTree" title="${text('刷新')}"><i class="fa fa-refresh"></i> ${text('刷新')}</a>
+				<a href="#" class="btn btn-default" id="btnExpandTreeNode" title="${text('展开一级')}"><i class="fa fa-angle-double-down"></i> ${text('展开')}</a>
+				<a href="#" class="btn btn-default" id="btnCollapseTreeNode" title="${text('折叠全部')}"><i class="fa fa-angle-double-up"></i> ${text('折叠')}</a>
+				<a href="#" class="btn btn-default" id="btnExport"><i class="glyphicon glyphicon-export"></i> ${text('导出')}</a>
+				<% if(hasPermi('sys:office:edit')){ %>
+					<a href="#" class="btn btn-default" id="btnImport"><i class="glyphicon glyphicon-import"></i> ${text('导入')}</a>
+					<a href="${ctx}/sys/office/form" class="btn btn-default btnTool" title="${text('新增机构')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
+				<% } %>
+				<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
+			</div>
+		</div>
+		<div class="box-body">
+			<#form:form id="searchForm" model="${office}" action="${ctx}/sys/office/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<#form:hidden name="ctrlPermi" value="${ctrlPermi}"/>
+				<#form:hidden path="officeCode" class="isReset"/>
+				<div class="form-group">
+					<label class="control-label">${text('机构代码')}:</label>
+					<div class="control-inline">
+						<#form:input path="viewCode" maxlength="100" class="form-control width-90"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('机构名称')}:</label>
+					<div class="control-inline">
+						<#form:input path="officeName" maxlength="100" class="form-control width-90"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('机构全称')}:</label>
+					<div class="control-inline">
+						<#form:input path="fullName" maxlength="200" class="form-control width-90"/>
+					</div>
+				</div>
+				<!--<div class="form-group">
+					<label class="control-label">${text('机构类型')}:</label>
+					<div class="control-inline width-90">
+						<#form:select path="officeType" dictType="sys_office_type" blankOption="true" class="form-control"/>
+					</div>
+				</div>-->
+				<div class="form-group">
+					<label class="control-label">${text('状态')}:</label>
+					<div class="control-inline width-60">
+						<#form:select path="status" dictType="sys_search_status" blankOption="true" class="form-control isQuick"/>
+					</div>
+				</div>
+				<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>
+	</div>
+</div>
+<% } %>
+<script>
+// 初始化DataGrid对象
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("机构名称")}', name:'officeName', index:'a.office_name', width:300, align:"left", frozen:true, formatter: function(val, obj, row, act){
+			return '( '+row.viewCode+' ) '+'<a href="${ctx}/sys/office/form?officeCode='+row.officeCode+'" class="btnList" data-title="${text("编辑机构")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("机构全称")}', name:'fullName', index:'a.full_name', width:200, align:"left"},
+		{header:'${text("更新时间")}', name:'updateDate', index:'a.update_date', width:150, align:"center"},
+		{header:'${text("备注信息")}', name:'remarks', index:'a.remarks', width:100, align:"left"},
+		{header:'${text("状态")}', name:'status', index:'a.status', width:80, align:"center", formatter: function(val, obj, row, act){
+			return js.getDictLabel(${@DictUtils.getDictListJson('sys_status')}, val, '${text("未知")}', true);
+		}},
+		{header:'${text("操作")}', name:'actions', width:150, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('sys:office:edit')){ %>
+				actions.push('<a href="${ctx}/sys/office/form?officeCode='+row.officeCode+'" class="btnList" title="${text("编辑机构")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				if (row.status == Global.STATUS_NORMAL){
+					actions.push('<a href="${ctx}/sys/office/disable?officeCode='+row.officeCode+'" class="btnList" title="${text("停用机构")}" data-confirm="${text("确认要停用该机构吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a>&nbsp;');
+				} else if (row.status == Global.STATUS_DISABLE){
+					actions.push('<a href="${ctx}/sys/office/enable?officeCode='+row.officeCode+'" class="btnList" title="${text("启用机构")}" data-confirm="${text("确认要启用该机构吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a>&nbsp;');
+				}
+				actions.push('<a href="${ctx}/sys/office/delete?officeCode='+row.officeCode+'" class="btnList" title="${text("删除机构")}" data-confirm="${text("确认要删除该机构及所有子机构吗?")}" data-deltreenode="'+row.id+'"><i class="fa fa-trash-o"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/sys/office/form?parentCode='+row.id+'" class="btnList" title="${text("新增下级机构")}"><i class="fa fa-plus-square"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	treeGrid: true,			// 启用树结构表格
+	defaultExpandLevel: 0,	// 默认展开的层次
+	expandNodeClearPostData: 'viewCode,officeName,fullName,', // 展开节点清理请求参数数据(一般设置查询条件的字段属性,否则在查询后,不能展开子节点数据)	// 加载成功后执行事件
+	ajaxSuccess: function(data){
+		if ($('#officeCode').val() != ''){
+			$('#officeCode').val('');
+			$('#btnExpandTreeNode').click();
+		}
+	}
+});
+$('#btnExport').click(function(){
+	js.ajaxSubmitForm($('#searchForm'), {
+		url:'${ctx}/sys/office/exportData',
+		downloadFile:true
+	});
+});
+$('#btnImport').click(function(){
+	js.layer.open({
+		type: 1,
+		area: ['400px'],
+		title: '${text("导入机构数据")}',
+		resize: false,
+		scrollbar: true,
+		content: js.template('importTpl'),
+		success: function(layero, index){
+			layero.find('input[type="checkbox"]').iCheck();
+		},
+		btn: ['<i class="fa fa-check"></i> ${text("导入")}',
+			'<i class="fa fa-remove"></i> ${text("关闭")}'],
+		btn1: function(index, layero){
+			var form = {
+				inputForm: layero.find('#inputForm'),
+				file: layero.find('#file').val()
+			};
+		    if (form.file == '' || (!js.endWith(form.file, '.xls') && !js.endWith(form.file, '.xlsx'))){
+		    	js.showMessage("${text('文件不正确,请选择后缀为“xls”或“xlsx”的文件。')}", null, 'warning');
+		        return false;
+		    }
+			js.ajaxSubmitForm(form.inputForm, function(data){
+				js.showMessage(data.message);
+				if(data.result == Global.TRUE){
+					js.layer.closeAll();
+				}
+				page();
+			}, "json");
+			return true;
+		}
+	});
+});
+</script>
+<script id="importTpl" type="text/template">//<!--
+<form id="inputForm" action="${ctx}/sys/office/importData" method="post" enctype="multipart/form-data"
+	class="form-horizontal mt20 mb10" style="overflow:auto;max-height:200px;">
+	<div class="row">
+		<div class="col-xs-12 col-xs-offset-1">
+			<input type="file" id="file" name="file" class="form-file"/>
+			<div class="mt10 pt5">
+				<#form:checkbox name="updateSupport" label="${text('是否更新已经存在的机构数据')}" class="form-control"
+					title="${text('如果机构编码已经存在,更新这条数据。')}"/> &nbsp;
+				<a href="${ctx}/sys/office/importTemplate" class="btn btn-default btn-xs"><i class="fa fa-file-excel-o"></i> ${text('下载模板')}</a>
+			</div>
+			<font color="red" class="pull-left mt10">
+				${text('提示:仅允许导入“xls”或“xlsx”格式文件!')}
+			</font>
+		</div>
+	</div>
+</form>
+//--></script>

+ 5 - 5
src/main/resources/views/modules/sys/user/empUserForm.html

@@ -9,7 +9,7 @@
 				<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="${empUser}" action="${ctx}/sys/empUser/save" method="post" class="form-horizontal">
+		<#form:form id="inputForm" model="${empUser}" action="${ctx}/mes/empUserCustom/save" method="post" class="form-horizontal">
 			<#form:hidden name="op" value="${op}"/>
 			<#form:hidden name="userType" value="employee"/>
 			<#form:hidden path="userCode"/>
@@ -51,8 +51,8 @@
 								<span class="required ">*</span> ${text('登录账号')}:<i class="fa icon-question hide"></i></label>
 							<div class="col-sm-8">
 								<#form:hidden name="oldLoginCode" value="${empUser.loginCode}"/>
-								<#form:input path="loginCode" minlength="4" maxlength="20" readonly="${op=='auth'}"
-									class="form-control required userName"
+								<#form:input path="loginCode" minlength="0" maxlength="20" readonly="${op=='auth'}"
+									class="form-control required"
 									remote="${ctx}/sys/user/checkLoginCode?oldLoginCode=${empUser.loginCode}"
 									data-msg-remote="${text('登录账号已存在')}"/>
 							</div>
@@ -125,7 +125,7 @@
 							<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:input path="employee.empNo" maxlength="32" class="form-control userName"
+								<#form:input path="employee.empNo" maxlength="32" class="form-control"
 									remote="${ctx}/sys/empUser/checkEmpNo?oldEmpNo=${empUser.employee.empNo}"
 									data-msg-remote="${text('员工工号已存在')}"/>
 							</div>
@@ -134,7 +134,7 @@
 					<div class="col-xs-6">
 						<div class="form-group">
 							<label class="control-label col-sm-4" title="">
-								<span class="required hide">*</span> ${text('员工姓名')}:<i class="fa icon-question hide"></i></label>
+								<span class="required ">*</span> ${text('员工姓名')}:<i class="fa icon-question hide"></i></label>
 							<div class="col-sm-8">
 								<#form:input path="employee.empName" maxlength="32" class="form-control "/>
 							</div>

+ 4 - 4
src/main/resources/views/modules/sys/user/employeeList.html

@@ -10,7 +10,7 @@
 				<a href="#" class="btn btn-default" id="btnExport"><i class="glyphicon glyphicon-export"></i> ${text('导出')}</a>
 				<% if(hasPermi('sys:empUser:edit')){ %>
 				<a href="#" class="btn btn-default" id="btnImport"><i class="glyphicon glyphicon-import"></i> ${text('导入')}</a>
-				<a href="${ctx}/sys/empUser/form?op=add" class="btn btn-default btnTool" title="${text('新增用户')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
+				<a href="${ctx}/mes/empUserCustom/form?op=add" class="btn btn-default btnTool" title="${text('新增用户')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
 				<% } %>
 				<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
 				<!-- <div class="btn-group">
@@ -124,7 +124,7 @@
 		searchForm: $("#searchForm"),
 		columnModel: [
 			{header:'${text("登录账号")}', name:'loginCode', index:'a.login_code', width:125, align:"center", frozen:true, formatter: function(val, obj, row, act){
-					return '<a href="${ctx}/sys/empUser/form?userCode='+row.userCode+'&op=edit" class="btnList" data-title="${text("编辑用户")}">'+(val||row.id)+'</a>';
+					return '<a href="${ctx}/mes/empUserCustom/form?userCode='+row.userCode+'&op=edit" class="btnList" data-title="${text("编辑用户")}">'+(val||row.id)+'</a>';
 				}},
 			{header:'${text("用户昵称")}', name:'userName', index:'a.user_name', width:125, align:"center"},
 			{header:'${text("员工姓名")}', name:'refName', index:'a.ref_name', width:125, align:"center"},
@@ -140,7 +140,7 @@
 			{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
 					var actions = [];
 					//<% if(hasPermi('sys:empUser:edit')){ %>
-					actions.push('<a href="${ctx}/sys/empUser/form?userCode='+row.userCode+'&op=edit" class="btnList" title="${text("编辑用户")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+					actions.push('<a href="${ctx}/mes/empUserCustom/form?userCode='+row.userCode+'&op=edit" class="btnList" title="${text("编辑用户")}"><i class="fa fa-pencil"></i></a>&nbsp;');
 					//<% } %>
 					//<% if(hasPermi('sys:empUser:updateStatus')){ %>
 					if (row.status == Global.STATUS_NORMAL){
@@ -239,4 +239,4 @@
 		</div>
 	</div>
 </form>
-//--></script>
+//--></script>