ソースを参照

员工、用户分开管理

jingbo 4 ヶ月 前
親
コミット
3349ad9e30

+ 9 - 0
src/main/java/com/jeesite/modules/mes/dao/MesEmployeeDao.java

@@ -0,0 +1,9 @@
+package com.jeesite.modules.mes.dao;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.mes.entity.MesEmployee;
+
+@MyBatisDao
+public interface MesEmployeeDao extends CrudDao<MesEmployee> {
+}

+ 164 - 0
src/main/java/com/jeesite/modules/mes/entity/MesEmployee.java

@@ -0,0 +1,164 @@
+package com.jeesite.modules.mes.entity;
+
+import com.jeesite.common.entity.DataEntity;
+import com.jeesite.common.mybatis.annotation.Column;
+import com.jeesite.common.mybatis.annotation.JoinTable;
+import com.jeesite.common.mybatis.annotation.Table;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+import com.jeesite.modules.sys.entity.User;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+@Table(name="js_sys_employee", alias="a", label="员工信息", columns={
+		@Column(name="emp_code", attrName="empCode", label="员工编码", isPK=true),
+		@Column(name="emp_name", attrName="empName", label="员工姓名", queryType=QueryType.LIKE),
+		@Column(name="emp_name_en", attrName="empNameEn", label="员工英文名"),
+		@Column(name="emp_no", attrName="empNo", label="员工工号", queryType=QueryType.LIKE),
+		@Column(name="office_code", attrName="officeCode", label="机构编码"),
+		@Column(name="office_name", attrName="officeName", label="机构名称", queryType=QueryType.LIKE),
+		@Column(name="company_code", attrName="companyCode", label="公司编码"),
+		@Column(name="company_name", attrName="companyName", label="公司名称"),
+		@Column(name="status", attrName="status", label="状态", isUpdate=false),
+		@Column(name="create_by", attrName="createBy", label="创建者", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="创建时间", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="更新者", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="更新时间", isQuery=false, isUpdateForce=true),
+		@Column(name="remarks", attrName="remarks", label="备注信息", queryType=QueryType.LIKE),
+		@Column(name="corp_code", attrName="corpCode", label="租户代码", isQuery=false),
+		@Column(name="corp_name", attrName="corpName", label="租户名称", isQuery=false),
+	}, joinTable={
+		@JoinTable(type=JoinTable.Type.LEFT_JOIN, entity= User.class, attrName="this", alias="u",
+				on="u.ref_code = a.emp_code AND u.user_type = 'employee' AND u.status <> '1'",
+				columns={
+						@Column(name="user_code", attrName="userCode", label="用户编码"),
+						@Column(name="login_code", attrName="loginCode", label="登录账号"),
+						@Column(name="status", attrName="userStatus", label="账号状态"),
+				}),
+	}, orderBy="a.update_date DESC"
+)
+public class MesEmployee extends DataEntity<MesEmployee> {
+
+	private static final long serialVersionUID = 1L;
+
+	private String empCode;
+	private String empName;
+	private String empNameEn;
+	private String empNo;
+	private String officeCode;
+	private String officeName;
+	private String companyCode;
+	private String companyName;
+	private String userCode;
+	private String loginCode;
+	private String userStatus;
+
+	public MesEmployee() {
+		this(null);
+	}
+
+	public MesEmployee(String empCode) {
+		super(empCode);
+		this.empCode = empCode;
+	}
+
+	@NotBlank(message="员工姓名不能为空")
+	@Size(min=0, max=100, message="员工姓名长度不能超过 100 个字符")
+	public String getEmpName() {
+		return empName;
+	}
+
+	public void setEmpName(String empName) {
+		this.empName = empName;
+	}
+
+	@Size(min=0, max=64, message="员工编码长度不能超过 64 个字符")
+	public String getEmpCode() {
+		return empCode;
+	}
+
+	public void setEmpCode(String empCode) {
+		this.empCode = empCode;
+		this.id = empCode;
+	}
+
+	@Size(min=0, max=100, message="员工英文名长度不能超过 100 个字符")
+	public String getEmpNameEn() {
+		return empNameEn;
+	}
+
+	public void setEmpNameEn(String empNameEn) {
+		this.empNameEn = empNameEn;
+	}
+
+	@Size(min=0, max=100, message="员工工号长度不能超过 100 个字符")
+	public String getEmpNo() {
+		return empNo;
+	}
+
+	public void setEmpNo(String empNo) {
+		this.empNo = empNo;
+	}
+
+	@NotBlank(message="归属机构不能为空")
+	@Size(min=0, max=64, message="机构编码长度不能超过 64 个字符")
+	public String getOfficeCode() {
+		return officeCode;
+	}
+
+	public void setOfficeCode(String officeCode) {
+		this.officeCode = officeCode;
+	}
+
+	@NotBlank(message="归属机构名称不能为空")
+	@Size(min=0, max=100, message="机构名称长度不能超过 100 个字符")
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	@Size(min=0, max=64, message="公司编码长度不能超过 64 个字符")
+	public String getCompanyCode() {
+		return companyCode;
+	}
+
+	public void setCompanyCode(String companyCode) {
+		this.companyCode = companyCode;
+	}
+
+	@Size(min=0, max=200, message="公司名称长度不能超过 200 个字符")
+	public String getCompanyName() {
+		return companyName;
+	}
+
+	public void setCompanyName(String companyName) {
+		this.companyName = companyName;
+	}
+
+	public String getUserCode() {
+		return userCode;
+	}
+
+	public void setUserCode(String userCode) {
+		this.userCode = userCode;
+	}
+
+	public String getLoginCode() {
+		return loginCode;
+	}
+
+	public void setLoginCode(String loginCode) {
+		this.loginCode = loginCode;
+	}
+
+	public String getUserStatus() {
+		return userStatus;
+	}
+
+	public void setUserStatus(String userStatus) {
+		this.userStatus = userStatus;
+	}
+}

+ 63 - 0
src/main/java/com/jeesite/modules/mes/service/MesEmployeeService.java

@@ -0,0 +1,63 @@
+package com.jeesite.modules.mes.service;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesEmployeeDao;
+import com.jeesite.modules.mes.entity.MesEmployee;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.UUID;
+
+@Service
+public class MesEmployeeService extends CrudService<MesEmployeeDao, MesEmployee> {
+
+	@Override
+	public MesEmployee get(MesEmployee mesEmployee) {
+		return super.get(mesEmployee);
+	}
+
+	@Override
+	public Page<MesEmployee> findPage(MesEmployee mesEmployee) {
+		return super.findPage(mesEmployee);
+	}
+
+	@Override
+	public List<MesEmployee> findList(MesEmployee mesEmployee) {
+		return super.findList(mesEmployee);
+	}
+
+	@Override
+	@Transactional
+	public void save(MesEmployee mesEmployee) {
+		if (StringUtils.isBlank(mesEmployee.getEmpCode())) {
+			mesEmployee.setEmpCode(buildEmpCode(mesEmployee));
+			mesEmployee.setIsNewRecord(true);
+		}
+		if (StringUtils.isBlank(mesEmployee.getEmpNameEn())) {
+			mesEmployee.setEmpNameEn("");
+		}
+		if (StringUtils.isBlank(mesEmployee.getCorpCode())) {
+			mesEmployee.setCorpCode("0");
+		}
+		if (StringUtils.isBlank(mesEmployee.getCorpName())) {
+			mesEmployee.setCorpName("JeeSite");
+		}
+		super.save(mesEmployee);
+	}
+
+	private String buildEmpCode(MesEmployee employee) {
+		if (StringUtils.isNotBlank(employee.getEmpNo())) {
+			return employee.getEmpNo().trim();
+		}
+		return "emp_" + UUID.randomUUID().toString().replace("-", "").substring(0, 12);
+	}
+
+	@Override
+	@Transactional
+	public void updateStatus(MesEmployee mesEmployee) {
+		super.updateStatus(mesEmployee);
+	}
+}

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

@@ -3,15 +3,18 @@ package com.jeesite.modules.mes.web;
 import com.jeesite.common.config.Global;
 import com.jeesite.common.lang.StringUtils;
 import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesEmployee;
+import com.jeesite.modules.mes.service.MesEmployeeService;
 import com.jeesite.modules.sys.entity.EmpUser;
 import com.jeesite.modules.sys.entity.EmployeeOffice;
 import com.jeesite.modules.sys.entity.Role;
+import com.jeesite.modules.sys.entity.User;
 import com.jeesite.modules.sys.service.EmpUserService;
+import com.jeesite.modules.sys.service.UserService;
 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;
@@ -30,6 +33,12 @@ public class EmpUserCustomController extends BaseController {
     @Autowired
     private EmpUserService empUserService;
 
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private MesEmployeeService mesEmployeeService;
+
     @ModelAttribute
     public EmpUser get(String userCode, boolean isNewRecord) {
         return empUserService.get(userCode, isNewRecord);
@@ -103,11 +112,16 @@ 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, "保存用户失败,登录账号不能为空。");
+        }
         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, "保存用户失败,登录账号已存在(不能与原账号相同),请修改登录账号!");
         }
 
@@ -115,11 +129,90 @@ 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, "保存用户失败,用户昵称已存在(不能与原昵称相同),请修改用户昵称!");
             }
         }
 
+        if (StringUtils.isBlank(empUser.getUserType())) {
+            empUser.setUserType("employee");
+        }
+        MesEmployee selectedEmployee = findSelectedEmployee(empUser);
+        String selectedEmployeeError = checkSelectedEmployee(empUser, selectedEmployee);
+        if (StringUtils.isNotBlank(selectedEmployeeError)) {
+            return renderResult(Global.FALSE, selectedEmployeeError);
+        }
+        if (selectedEmployee != null) {
+            User boundUser = findBoundUser(selectedEmployee);
+            if (boundUser != null && (StringUtils.isBlank(empUser.getUserCode())
+                    || !StringUtils.equals(boundUser.getUserCode(), empUser.getUserCode()))) {
+                return renderResult(Global.FALSE, "保存用户失败,该员工已创建账号:" + boundUser.getLoginCode());
+            }
+            bindSelectedEmployeeUser(empUser, selectedEmployee);
+            userService.save(empUser);
+            return renderResult(Global.TRUE, "保存用户 '" + empUser.getLoginCode() + "' 成功");
+        }
         return empUserController.save(empUser, oldLoginCode, request);
     }
-}
+
+    private MesEmployee findSelectedEmployee(EmpUser empUser) {
+        if (empUser.getEmployee() == null) {
+            return null;
+        }
+        if (StringUtils.isNotBlank(empUser.getEmployee().getEmpCode())) {
+            MesEmployee employee = mesEmployeeService.get(new MesEmployee(empUser.getEmployee().getEmpCode()));
+            if (employee != null) {
+                return employee;
+            }
+        }
+        if (StringUtils.isNotBlank(empUser.getEmployee().getEmpNo())) {
+            MesEmployee where = new MesEmployee();
+            where.setEmpNo(StringUtils.trim(empUser.getEmployee().getEmpNo()));
+            List<MesEmployee> employees = mesEmployeeService.findList(where);
+            if (employees != null && !employees.isEmpty()) {
+                return employees.get(0);
+            }
+        }
+        return null;
+    }
+
+    private String checkSelectedEmployee(EmpUser empUser, MesEmployee employee) {
+        if (employee != null && StringUtils.isNotBlank(employee.getUserCode())
+                && (StringUtils.isBlank(empUser.getUserCode()) || !StringUtils.equals(employee.getUserCode(), empUser.getUserCode()))) {
+            return "保存用户失败,该员工已创建账号:" + employee.getLoginCode();
+        }
+        return null;
+    }
+
+    private User findBoundUser(MesEmployee employee) {
+        if (employee == null || StringUtils.isBlank(employee.getEmpCode())) {
+            return null;
+        }
+        User query = new User();
+        query.setUserType("employee");
+        query.setRefCode(employee.getEmpCode());
+        return userService.getByUserTypeAndRefCode(query);
+    }
+
+    private void bindSelectedEmployeeUser(EmpUser empUser, MesEmployee employee) {
+        empUser.setUserType("employee");
+        if (StringUtils.isBlank(empUser.getMgrType())) {
+            empUser.setMgrType("0");
+        }
+        empUser.setRefCode(employee.getEmpCode());
+        empUser.setRefName(employee.getEmpName());
+        empUser.setEmployee(null);
+    }
+
+    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;
+    }
+}

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

@@ -154,7 +154,7 @@ public class MesDevicePreventTaskController extends BaseController {
 
 		List<String> mlps = new ArrayList<>();
 		for(MesLineProcessUser mesLineProcessUser1:list){
-			mlps.add(mesLineProcessUser1.getId());
+			mlps.add(mesLineProcessUser1.getLineProcessId());
 		}
 
 		MesLineProcess mesLineProcess = new MesLineProcess();

+ 120 - 0
src/main/java/com/jeesite/modules/mes/web/MesEmployeeController.java

@@ -0,0 +1,120 @@
+package com.jeesite.modules.mes.web;
+
+import com.jeesite.common.config.Global;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesEmployee;
+import com.jeesite.modules.mes.service.MesEmployeeService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesEmployee")
+public class MesEmployeeController extends BaseController {
+
+	@Autowired
+	private MesEmployeeService mesEmployeeService;
+
+	@ModelAttribute
+	public MesEmployee get(String empCode, boolean isNewRecord) {
+		if (StringUtils.isNotBlank(empCode)) {
+			MesEmployee employee = mesEmployeeService.get(new MesEmployee(empCode));
+			if (employee != null) {
+				return employee;
+			}
+		}
+		MesEmployee employee = new MesEmployee();
+		employee.setIsNewRecord(isNewRecord);
+		return employee;
+	}
+
+	@RequiresPermissions("mes:mesEmployee:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesEmployee mesEmployee, Model model) {
+		model.addAttribute("mesEmployee", mesEmployee);
+		return "modules/mes/mesEmployeeList";
+	}
+
+	@RequiresPermissions(value={"mes:mesEmployee:view", "sys:empUser:edit"}, logical= Logical.OR)
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesEmployee> listData(MesEmployee mesEmployee, HttpServletRequest request, HttpServletResponse response) {
+		mesEmployee.setPage(new Page<>(request, response));
+		return mesEmployeeService.findPage(mesEmployee);
+	}
+
+	@RequiresPermissions("mes:mesEmployee:view")
+	@RequestMapping(value = "form")
+	public String form(MesEmployee mesEmployee, Model model) {
+		model.addAttribute("mesEmployee", mesEmployee);
+		model.addAttribute("ctrlPermi", Global.getConfig("user.adminCtrlPermi", "2"));
+		return "modules/mes/mesEmployeeForm";
+	}
+
+	@RequiresPermissions("mes:mesEmployee:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesEmployee mesEmployee) {
+		mesEmployeeService.save(mesEmployee);
+		return renderResult(Global.TRUE, text("保存员工信息成功!"));
+	}
+
+	@RequiresPermissions("mes:mesEmployee:edit")
+	@RequestMapping(value = "disable")
+	@ResponseBody
+	public String disable(MesEmployee mesEmployee) {
+		mesEmployee.setStatus(MesEmployee.STATUS_DISABLE);
+		mesEmployeeService.updateStatus(mesEmployee);
+		return renderResult(Global.TRUE, text("停用员工信息成功"));
+	}
+
+	@RequiresPermissions("mes:mesEmployee:edit")
+	@RequestMapping(value = "enable")
+	@ResponseBody
+	public String enable(MesEmployee mesEmployee) {
+		mesEmployee.setStatus(MesEmployee.STATUS_NORMAL);
+		mesEmployeeService.updateStatus(mesEmployee);
+		return renderResult(Global.TRUE, text("启用员工信息成功"));
+	}
+
+	@RequiresPermissions("mes:mesEmployee:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesEmployee mesEmployee) {
+		mesEmployeeService.delete(mesEmployee);
+		return renderResult(Global.TRUE, text("删除员工信息成功!"));
+	}
+
+	@RequestMapping(value = "search")
+	@ResponseBody
+	public List<MesEmployee> search(String keyword) {
+		MesEmployee employee = new MesEmployee();
+		if (StringUtils.isNotBlank(keyword)) {
+			employee.setEmpName(keyword);
+		}
+		employee.setStatus(MesEmployee.STATUS_NORMAL);
+		return mesEmployeeService.findList(employee);
+	}
+
+	@RequestMapping(value = "searchPage")
+	public String searchPage(String keyword, Model model) {
+		MesEmployee mesEmployee = new MesEmployee();
+		mesEmployee.setEmpName(keyword);
+		model.addAttribute("mesEmployee", mesEmployee);
+		model.addAttribute("keyword", keyword);
+		return "modules/mes/mesEmployeeSelect";
+	}
+}

+ 89 - 0
src/main/resources/views/modules/mes/mesEmployeeForm.html

@@ -0,0 +1,89 @@
+<% 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 icon-user"></i> ${text(mesEmployee.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="${mesEmployee}" action="${ctx}/mes/mesEmployee/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="empCode"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4"><span class="required">*</span> ${text('员工姓名')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="empName" maxlength="100" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('员工工号')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="empNo" maxlength="100" class="form-control"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4"><span class="required">*</span> ${text('归属机构')}:</label>
+							<div class="col-sm-8">
+								<#form:treeselect id="office" title="${text('机构选择')}"
+									path="officeCode" labelPath="officeName"
+									url="${ctx}/sys/office/treeData?ctrlPermi=${ctrlPermi}"
+									class="required" allowClear="false" canSelectRoot="true" canSelectParent="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('状态')}:</label>
+							<div class="col-sm-8">
+								<#form:radiobuttons path="status" dictType="sys_search_status" class="required"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-12">
+						<div class="form-group">
+							<label class="control-label col-sm-2">${text('备注信息')}:</label>
+							<div class="col-sm-10">
+								<#form:textarea path="remarks" rows="4" maxlength="500" 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('mes:mesEmployee:edit')){ %>
+							<button type="submit" class="btn btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保存')}</button>&nbsp;
+						<% } %>
+						<button type="button" class="btn 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>

+ 86 - 0
src/main/resources/views/modules/mes/mesEmployeeList.html

@@ -0,0 +1,86 @@
+<% 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-people"></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('mes:mesEmployee:edit')){ %>
+					<a href="${ctx}/mes/mesEmployee/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="${mesEmployee}" action="${ctx}/mes/mesEmployee/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<div class="form-group">
+					<label class="control-label">${text('员工姓名')}:</label>
+					<div class="control-inline">
+						<#form:input path="empName" maxlength="100" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('员工工号')}:</label>
+					<div class="control-inline">
+						<#form:input path="empNo" maxlength="100" class="form-control width-120"/>
+					</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-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('状态')}:</label>
+					<div class="control-inline width-120">
+						<#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 id="dataGridPage"></div>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("员工姓名")}', name:'empName', index:'a.emp_name', width:120, align:"center", frozen:true, formatter: function(val, obj, row){
+			return '<a href="${ctx}/mes/mesEmployee/form?empCode='+row.empCode+'" class="btnList" data-title="${text("编辑员工")}">'+(val||row.empCode)+'</a>';
+		}},
+		{header:'${text("员工工号")}', name:'empNo', index:'a.emp_no', width:120, align:"center"},
+		{header:'${text("所属机构")}', name:'officeName', index:'a.office_name', width:160, align:"center"},
+		{header:'${text("登录账号")}', name:'loginCode', index:'u.login_code', width:120, align:"center", formatter: function(val){
+			return val || '<span class="text-muted">未开通</span>';
+		}},
+		{header:'${text("员工状态")}', name:'status', index:'a.status', width:90, align:"center", formatter: function(val){
+			return js.getDictLabel(${@DictUtils.getDictListJson('sys_search_status')}, val, '${text("未知")}', true);
+		}},
+		{header:'${text("更新时间")}', name:'updateDate', index:'a.update_date', width:140, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:140, formatter: function(val, obj, row){
+			var actions = [];
+			<% if(hasPermi('mes:mesEmployee:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesEmployee/form?empCode='+row.empCode+'" class="btnList" title="${text("编辑")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				if (row.status == Global.STATUS_NORMAL){
+					actions.push('<a href="${ctx}/mes/mesEmployee/disable?empCode='+row.empCode+'" 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}/mes/mesEmployee/enable?empCode='+row.empCode+'" class="btnList" title="${text("启用")}" data-confirm="${text("确认要启用该员工吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a>&nbsp;');
+				}
+				actions.push('<a href="${ctx}/mes/mesEmployee/delete?empCode='+row.empCode+'" class="btnList" title="${text("删除")}" data-confirm="${text("确认要删除该员工吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			<% } %>
+			return actions.join('');
+		}}
+	],
+	ajaxSuccess: function(){}
+});
+</script>

+ 76 - 0
src/main/resources/views/modules/mes/mesEmployeeSelect.html

@@ -0,0 +1,76 @@
+<% layout('/layouts/default.html', {title: '选择员工', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-body">
+			<#form:form id="searchForm" model="${mesEmployee!}" action="${ctx}/mes/mesEmployee/listData" method="post" class="form-inline"
+					data-page-no="${parameter.pageNo}" data-page-size="10">
+				<div class="form-group">
+					<label class="control-label">${text('员工姓名')}:</label>
+					<div class="control-inline">
+						<input type="text" id="empName" name="empName" value="${keyword!}" maxlength="100" class="form-control width-160"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
+				</div>
+			</#form:form>
+			<table id="employeeSelectGrid"></table>
+			<div id="employeeSelectGridPage"></div>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+var employeeSelectRows = {};
+$('#employeeSelectGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'empCode', name:'empCode', index:'a.emp_code', hidden:true},
+		{header:'officeCode', name:'officeCode', index:'a.office_code', hidden:true},
+		{header:'${text("员工姓名")}', name:'empName', index:'a.emp_name', width:120, align:"center"},
+		{header:'${text("员工工号")}', name:'empNo', index:'a.emp_no', width:120, align:"center"},
+		{header:'${text("所属机构")}', name:'officeName', index:'a.office_name', width:150, align:"center"},
+		{header:'${text("登录账号")}', name:'loginCode', index:'u.login_code', width:120, align:"center"},
+		{header:'操作', name:'actions', width:80, formatter: function(val, obj, row){
+			employeeSelectRows[obj.rowId] = row;
+			return '<a href="javascript:" onclick="selectEmployeeById(\''+obj.rowId+'\')" class="btn btn-primary btn-xs">选择</a>';
+		}}
+	],
+	ajaxSuccess: function(){
+		var ids = $('#employeeSelectGrid').dataGrid('getDataIDs') || [];
+		for (var i = 0; i < ids.length; i++) {
+			employeeSelectRows[ids[i]] = $('#employeeSelectGrid').dataGrid('getRowData', ids[i]);
+		}
+	}
+});
+
+function selectEmployeeById(rowId){
+	var row = employeeSelectRows[rowId] || $('#employeeSelectGrid').dataGrid('getRowData', rowId);
+	var opener = getApplySelectedEmployeeWindow(parent);
+	if (opener && opener.applySelectedEmployee) {
+		opener.applySelectedEmployee(row);
+	}
+	var layerApi = (parent && parent.layer) || (top && top.layer) || (js && js.layer);
+	if (layerApi) {
+		layerApi.close(layerApi.getFrameIndex(window.name));
+	}
+}
+
+function getApplySelectedEmployeeWindow(win){
+	if (!win) {
+		return null;
+	}
+	try {
+		if (win.applySelectedEmployee) {
+			return win;
+		}
+		for (var i = 0; i < win.frames.length; i++) {
+			var found = getApplySelectedEmployeeWindow(win.frames[i]);
+			if (found) {
+				return found;
+			}
+		}
+	} catch (e) {}
+	return null;
+}
+</script>

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

@@ -9,10 +9,11 @@
 				<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"/>
+		<#form:hidden path="employee.empCode"/>
 		<div class="box-body">
 			<% if(op=='auth'){ %><br/><% } %>
 			<% if(op == 'add' || op == 'edit') { %>
@@ -30,18 +31,6 @@
 						</div>
 					</div>
 				</div>
-				<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>
-						<div class="col-sm-8">
-							<#form:treeselect id="company" title="${text('公司选择')}"
-							path="employee.company.companyCode" labelPath="employee.company.companyName"
-							url="${ctx}/sys/company/treeData?ctrlPermi=${ctrlPermi}"
-							btnClass="" allowClear="true" canSelectRoot="true" canSelectParent="true"/>
-						</div>
-					</div>
-				</div>
 			</div>
 			<% } %>
 			<div class="row">
@@ -137,21 +126,12 @@
 							<span class="required hide">*</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 "/>
+							<span class="help-block selected-employee-tip hide"></span>
 						</div>
 					</div>
 				</div>
 			</div>
 			<div class="row">
-				<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>
-						<div class="col-sm-8">
-							<#form:select multiple="true" path="employee.employeePosts" items="${postList}"
-							itemLabel="postName" itemValue="postCode" class="form-control"/>
-						</div>
-					</div>
-				</div>
 				<div class="col-xs-6 hide">
 					<div class="form-group">
 						<label class="control-label col-sm-4" title="">
@@ -293,8 +273,20 @@
 		}
 	});
 	//<% } %>
+	var empUserSubmitting = false;
+	var employeeSearchOpening = false;
+	var empNoRemoteUrl = '${ctx}/sys/empUser/checkEmpNo?oldEmpNo=${empUser.employee.empNo}';
 	$("#inputForm").validate({
 		submitHandler: function(form){
+			if (empUserSubmitting) {
+				return false;
+			}
+			if ('${op}' == 'add' && $.trim($('[name="employee.empName"]').val()) != '' && $('[name="employee.empCode"]').val() == '') {
+				js.showMessage('请先按员工姓名查询并选择员工。', null, 'warning');
+				openEmployeeSearchByKeyword($('[name="employee.empName"]').val(), true);
+				return false;
+			}
+			empUserSubmitting = true;
 			//<% if(hasPermi('sys:empUser:authRole') && (op == 'add' || op == 'auth')) { %>
 			$("#userRoleString").val(roleGrid.dataGrid('getSelectRows').join(','));
 			//<% } %>
@@ -303,6 +295,7 @@
 				$('#employee_empNo').val($('#loginCode').val());
 			}
 			js.ajaxSubmitForm($(form), function(data){
+				empUserSubmitting = false;
 				js.showMessage(data.message);
 				if(data.result == Global.TRUE){
 					js.closeCurrentTabPage(function(contentWindow){
@@ -310,6 +303,124 @@
 					});
 				}
 			}, "json");
+			return false;
+		}
+	});
+	$('#inputForm').on('submit.empUserAjax', function(e){
+		e.preventDefault();
+		if (empUserSubmitting) {
+			return false;
+		}
+		if ($(this).valid()) {
+			$(this).validate().settings.submitHandler(this);
+		}
+		return false;
+	});
+
+	// 新建账号时按员工姓名匹配已有员工,选中后绑定账号到该员工。
+	(function(){
+		var lastKeyword = '';
+		$('[name="employee.empName"]').on('input', function(){
+			$('[name="employee.empCode"]').val('');
+			$('.selected-employee-tip').addClass('hide').text('');
+			toggleEmpNoRemoteValidation(false);
+			lastKeyword = '';
+		});
+		$('[name="employee.empName"]').on('blur', function(){
+			var keyword = $.trim($(this).val());
+			if ('${op}' != 'add' || keyword.length < 1 || keyword == lastKeyword || $('[name="employee.empCode"]').val()) {
+				return;
+			}
+			lastKeyword = keyword;
+			openEmployeeSearchByKeyword(keyword, false);
+		});
+	})();
+
+	window.applySelectedEmployee = function(row){
+		$('[name="employee.empCode"]').val(row.empCode || '');
+		$('[name="employee.empName"]').val(row.empName || '');
+		$('[name="employee.empNo"]').val(row.empNo || '');
+		$('[name="userName"]').val(row.empName || '');
+		$('[name="employee.office.officeCode"]').val(row.officeCode || '');
+		$('[name="employee.office.officeName"]').val(row.officeName || '');
+		$('.selected-employee-tip').removeClass('hide').text('已选择员工:' + (row.empName || '') + (row.empNo ? '(' + row.empNo + ')' : ''));
+		toggleEmpNoRemoteValidation(true);
+	};
+
+	function toggleEmpNoRemoteValidation(selectedEmployee){
+		var empNoInput = $('#employee_empNo');
+		if (!empNoInput.length || !empNoInput.rules) {
+			return;
+		}
+		if (selectedEmployee) {
+			empNoInput.rules('remove', 'remote');
+			empNoInput.removeData('previousValue');
+		} else if (!empNoInput.rules().remote) {
+			empNoInput.rules('add', {
+				remote: empNoRemoteUrl,
+				messages: {
+					remote: empNoInput.attr('data-msg-remote')
+				}
+			});
+		}
+		empNoInput.resetValid();
+	}
+
+	function openEmployeeSearchByKeyword(keyword, showEmptyMessage){
+		keyword = $.trim(keyword || '');
+		if ('${op}' != 'add' || keyword.length < 1 || $('[name="employee.empCode"]').val()) {
+			return;
+		}
+		if (employeeSearchOpening) {
+			return;
+		}
+		employeeSearchOpening = true;
+		$('[name="employee.empName"]').val(keyword);
+		$.get('${ctx}/mes/mesEmployee/search', {keyword: keyword}, function(list){
+			if (!list || list.length == 0) {
+				employeeSearchOpening = false;
+				if (showEmptyMessage) {
+					js.showMessage('未查询到匹配的员工,请检查员工姓名。', null, 'warning');
+				}
+				return;
+			}
+			if (list.length == 1 && list[0].empName == keyword) {
+				applySelectedEmployee(list[0]);
+				employeeSearchOpening = false;
+				return;
+			}
+			js.layer.open({
+				type: 2,
+				title: '${text("选择员工")}',
+				area: ['820px', '520px'],
+				content: '${ctx}/mes/mesEmployee/searchPage?keyword=' + encodeURIComponent(keyword),
+				end: function(){
+					employeeSearchOpening = false;
+				}
+			});
+		}).fail(function(){
+			employeeSearchOpening = false;
+			if (showEmptyMessage) {
+				js.showMessage('查询员工失败,请稍后重试。', null, 'error');
+			}
+		});
+	}
+
+	$('[name="employee.empName"]').on('keydown', function(e){
+		if (e.keyCode == 13) {
+			e.preventDefault();
+			e.stopImmediatePropagation();
+			openEmployeeSearchByKeyword($(this).val(), true);
+			return false;
+		}
+	});
+
+	$('#inputForm').on('submit', function(e){
+		var activeName = document.activeElement ? document.activeElement.name : '';
+		if (activeName == 'employee.empName') {
+			e.preventDefault();
+			openEmployeeSearchByKeyword($('[name="employee.empName"]').val(), true);
+			return false;
 		}
 	});
 </script>

+ 1 - 11
src/main/resources/views/modules/sys/user/empUserList.html

@@ -76,15 +76,6 @@
 					</div>
 				</div>
 				<div class="form-group">
-					<label class="control-label">${text('公司')}:</label>
-					<div class="control-inline width-90">
-						<#form:treeselect id="company" title="${text('公司选择')}"
-						path="employee.company.companyCode" labelPath="employee.company.companyName"
-						url="${ctx}/sys/company/treeData?ctrlPermi=${@Global.getConfig('user.adminCtrlPermi', '2')}"
-						btnClass="btn-sm" allowClear="true" canSelectRoot="true" canSelectParent="true"/>
-					</div>
-				</div>
-				<div class="form-group">
 					<label class="control-label">${text('邮箱')}:</label>
 					<div class="control-inline">
 						<#form:input path="email" maxlength="300" class="form-control width-90"/>
@@ -129,7 +120,6 @@
 			{header:'${text("用户昵称")}', name:'userName', index:'a.user_name', width:125, align:"center"},
 			{header:'${text("员工姓名")}', name:'refName', index:'a.ref_name', width:125, align:"center"},
 			{header:'${text("归属机构")}', name:'employee.office.officeName', index:'o.office_name', width:135, align:"center"},
-			{header:'${text("归属公司")}', name:'employee.company.companyName', index:'c.company_name', width:135, align:"center"},
 			{header:'${text("电子邮箱")}', name:'email', index:'a.email', width:120, align:"center"},
 			{header:'${text("手机号码")}', name:'mobile', index:'a.mobile', width:120, align:"center"},
 			{header:'${text("办公电话")}', name:'phone', index:'a.phone', width:120, align:"center"},
@@ -239,4 +229,4 @@
 		</div>
 	</div>
 </form>
-//--></script>
+//--></script>