From ebf57c2e82e43d1acebc4b6c4fea2b9fbb65d3dc Mon Sep 17 00:00:00 2001 From: dashixiong Date: Wed, 8 Apr 2026 10:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=B7=E5=81=87=E8=A1=A5=E5=81=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +- .../administration/LeaveApplyController.java | 400 +++++++++++++++ .../sipai/controller/user/UserController.java | 32 +- .../dao/administration/LeaveApplyDao.java | 13 + .../sipai/entity/activiti/ProcessType.java | 2 + .../entity/administration/LeaveApply.java | 267 ++++++++++ .../entity/administration/LeaveCommStr.java | 30 ++ .../sipai/entity/business/BusinessUnit.java | 5 + .../administration/LeaveApplyMapper.xml | 162 ++++++ .../administration/LeaveApplyService.java | 478 ++++++++++++++++++ .../com/sipai/service/user/JobService.java | 9 + .../sipai/service/user/JobServiceImpl.java | 51 +- .../diagrams/leave/Administration_Leave.bpmn | 138 +++++ .../resources/sql/add_leave_apply_module.sql | 127 +++++ src/main/webapp/jsp/activiti/taskList.jsp | 35 ++ .../jsp/administration/leaveApplyAdd.jsp | 215 ++++++++ .../jsp/administration/leaveApplyAudit.jsp | 94 ++++ .../jsp/administration/leaveApplyEdit.jsp | 210 ++++++++ .../administration/leaveApplyExecuteView.jsp | 24 + .../leaveApplyExecuteViewInModal.jsp | 24 + .../jsp/administration/leaveApplyHandle.jsp | 196 +++++++ .../jsp/administration/leaveApplyList.jsp | 161 ++++++ .../jsp/administration/leaveApplyView.jsp | 47 ++ 23 files changed, 2706 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/sipai/controller/administration/LeaveApplyController.java create mode 100644 src/main/java/com/sipai/dao/administration/LeaveApplyDao.java create mode 100644 src/main/java/com/sipai/entity/administration/LeaveApply.java create mode 100644 src/main/java/com/sipai/entity/administration/LeaveCommStr.java create mode 100644 src/main/java/com/sipai/mapper/administration/LeaveApplyMapper.xml create mode 100644 src/main/java/com/sipai/service/administration/LeaveApplyService.java create mode 100644 src/main/resources/diagrams/leave/Administration_Leave.bpmn create mode 100644 src/main/resources/sql/add_leave_apply_module.sql create mode 100644 src/main/webapp/jsp/administration/leaveApplyAdd.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyAudit.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyEdit.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyExecuteView.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyExecuteViewInModal.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyHandle.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyList.jsp create mode 100644 src/main/webapp/jsp/administration/leaveApplyView.jsp diff --git a/pom.xml b/pom.xml index ffddf3a2..a032a273 100644 --- a/pom.xml +++ b/pom.xml @@ -369,6 +369,12 @@ org.xhtmlrenderer core-renderer R8 + + + bouncycastle + bcprov-jdk14 + + @@ -874,4 +880,4 @@ - \ No newline at end of file + diff --git a/src/main/java/com/sipai/controller/administration/LeaveApplyController.java b/src/main/java/com/sipai/controller/administration/LeaveApplyController.java new file mode 100644 index 00000000..7b937574 --- /dev/null +++ b/src/main/java/com/sipai/controller/administration/LeaveApplyController.java @@ -0,0 +1,400 @@ +package com.sipai.controller.administration; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sipai.entity.activiti.WorkTask; +import com.sipai.entity.administration.LeaveApply; +import com.sipai.entity.administration.LeaveCommStr; +import com.sipai.entity.base.Result; +import com.sipai.entity.business.BusinessUnit; +import com.sipai.entity.business.BusinessUnitAudit; +import com.sipai.entity.business.BusinessUnitHandle; +import com.sipai.entity.business.BusinessUnitRecord; +import com.sipai.entity.user.User; +import com.sipai.service.activiti.WorkflowProcessDefinitionService; +import com.sipai.service.activiti.WorkflowService; +import com.sipai.service.administration.LeaveApplyService; +import com.sipai.service.business.BusinessUnitAuditService; +import com.sipai.service.business.BusinessUnitHandleService; +import com.sipai.service.user.UserService; +import com.sipai.tools.ActivitiUtil; +import com.sipai.tools.CommString; +import com.sipai.tools.CommUtil; +import net.sf.json.JSONArray; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.impl.pvm.process.ActivityImpl; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.*; + +@Controller +@RequestMapping("/administration/leaveApply") +public class LeaveApplyController { + @Resource + private LeaveApplyService leaveApplyService; + @Resource + private WorkflowProcessDefinitionService workflowProcessDefinitionService; + @Resource + private BusinessUnitHandleService businessUnitHandleService; + @Resource + private BusinessUnitAuditService businessUnitAuditService; + @Resource + private WorkflowService workflowService; + @Resource + private RuntimeService runtimeService; + @Resource + private TaskService taskService; + @Resource + private UserService userService; + + @RequestMapping("/showList.do") + public String showList(HttpServletRequest request, Model model) { + return "/administration/leaveApplyList"; + } + + @RequestMapping("/getList.do") + public ModelAndView getList(HttpServletRequest request, Model model, + @RequestParam(value = "page") Integer page, + @RequestParam(value = "rows") Integer rows, + @RequestParam(value = "sort", required = false) String sort, + @RequestParam(value = "order", required = false) String order) { + if (sort == null || "id".equals(sort)) { + sort = " insdt "; + } + if (order == null) { + order = " desc "; + } + String wherestr = " where 1=1 "; + if (request.getParameter("search_code") != null && !request.getParameter("search_code").isEmpty()) { + wherestr += " and unit_id = '" + request.getParameter("search_code") + "'"; + } + if (request.getParameter("search_name") != null && !request.getParameter("search_name").isEmpty()) { + wherestr += " and (reason like '%" + request.getParameter("search_name") + "%' or insuser like '%" + request.getParameter("search_name") + "%')"; + } + if (request.getParameter("applyType") != null && !request.getParameter("applyType").isEmpty()) { + wherestr += " and apply_type = '" + request.getParameter("applyType") + "'"; + } + PageHelper.startPage(page, rows); + List list = this.leaveApplyService.selectListByWhere(wherestr + " order by " + sort + " " + order); + PageInfo pInfo = new PageInfo(list); + JSONArray jsonArray = JSONArray.fromObject(list); + String result = "{\"total\":" + pInfo.getTotal() + ",\"rows\":" + jsonArray + "}"; + model.addAttribute("result", result); + return new ModelAndView("result"); + } + + @RequestMapping("/add.do") + public String add(HttpServletRequest request, Model model) { + return "/administration/leaveApplyAdd"; + } + + @RequestMapping("/save.do") + public String save(HttpServletRequest request, Model model, @ModelAttribute LeaveApply leaveApply) { + User cu = (User) request.getSession().getAttribute("cu"); + leaveApply.setId(CommUtil.getUUID()); + leaveApply.setInsdt(CommUtil.nowDate()); + leaveApply.setInsuser(cu.getId()); + leaveApply.setState(LeaveCommStr.STATE_DRAFT); + leaveApply.setDelFlag("0"); + int result = this.leaveApplyService.save(leaveApply); + String resultstr = "{\"res\":\"" + result + "\",\"id\":\"" + leaveApply.getId() + "\"}"; + model.addAttribute("result", resultstr); + return "result"; + } + + @RequestMapping("/edit.do") + public String edit(HttpServletRequest request, Model model, @RequestParam(value = "id") String id) { + model.addAttribute("leaveApply", this.leaveApplyService.selectById(id)); + return "/administration/leaveApplyEdit"; + } + + @RequestMapping("/update.do") + public String update(HttpServletRequest request, Model model, @ModelAttribute LeaveApply leaveApply) { + User cu = (User) request.getSession().getAttribute("cu"); + leaveApply.setUpduser(cu.getId()); + leaveApply.setUpddt(CommUtil.nowDate()); + int result = this.leaveApplyService.update(leaveApply); + String resstr = "{\"res\":\"" + result + "\",\"id\":\"" + leaveApply.getId() + "\"}"; + model.addAttribute("result", resstr); + return "result"; + } + + @RequestMapping("/view.do") + public String view(HttpServletRequest request, Model model, @RequestParam(value = "id") String id) { + model.addAttribute("leaveApply", this.leaveApplyService.selectById(id)); + return "/administration/leaveApplyView"; + } + + @RequestMapping("/delete.do") + public String delete(HttpServletRequest request, Model model, @RequestParam(value = "id") String id) { + int result = this.leaveApplyService.deleteById(id); + model.addAttribute("result", result); + return "result"; + } + + @RequestMapping("/deletes.do") + public String deletes(HttpServletRequest request, Model model, @RequestParam(value = "ids") String ids) { + ids = ids.replace(",", "','"); + int result = this.leaveApplyService.deleteByWhere("where id in ('" + ids + "')"); + model.addAttribute("result", result); + return "result"; + } + + @RequestMapping("/startProcess.do") + public String startProcess(HttpServletRequest request, Model model, @ModelAttribute LeaveApply leaveApply) { + User cu = (User) request.getSession().getAttribute("cu"); + if (leaveApply.getId() == null || leaveApply.getId().isEmpty()) { + leaveApply.setId(CommUtil.getUUID()); + } + leaveApply.setInsuser(cu.getId()); + leaveApply.setInsdt(CommUtil.nowDate()); + int result = this.leaveApplyService.doStartProcess(leaveApply); + String resstr = "{\"res\":\"" + result + "\",\"id\":\"" + leaveApply.getId() + "\"}"; + model.addAttribute("result", resstr); + return "result"; + } + + @RequestMapping("/showExecuteView.do") + public String showExecuteView(HttpServletRequest request, Model model) { + String id = request.getParameter("id"); + LeaveApply leaveApply = this.leaveApplyService.selectById(id); + if (leaveApply == null) { + model.addAttribute("businessUnitRecords", JSONArray.fromObject(new ArrayList())); + model.addAttribute("finishFlag", false); + model.addAttribute("processStarted", false); + model.addAttribute("processMessage", "未找到对应的请假申请记录。"); + if (request.getParameter("inModal") != null) { + return "administration/leaveApplyExecuteViewInModal"; + } + return "administration/leaveApplyExecuteView"; + } + request.setAttribute("business", leaveApply); + List businessUnitRecords = new ArrayList(); + User launchUser = userService.getUserById(leaveApply.getInsuser()); + String recordUser = leaveApply.getAuditMan(); + BusinessUnitRecord businessUnitRecord = new BusinessUnitRecord( + leaveApply.getInsdt(), leaveApply.getInsuser(), leaveApply.getId(), leaveApply.getProcessid(), + leaveApply.getUnitId(), null, (recordUser == null || recordUser.trim().isEmpty() || "待签收".equals(recordUser)) + ? "提交了请假补假申请,等待审批人签收。" + : "提交了请假补假申请至" + recordUser + "进行审批。", launchUser, "流程发起"); + businessUnitRecords.add(businessUnitRecord); + + boolean processStarted = leaveApply.getProcessdefid() != null && !leaveApply.getProcessdefid().trim().isEmpty(); + if (processStarted) { + List workTasks = workflowProcessDefinitionService.getAllPDTask(leaveApply.getProcessdefid(), "desc"); + List keys = new ArrayList(); + for (WorkTask workTask : workTasks) { + keys.add(workTask.getTaskKey()); + } + Set set = new HashSet(); + set.addAll(keys); + keys = new ArrayList(); + keys.addAll(set); + for (String item : keys) { + if (BusinessUnit.UNIT_LEAVE_APPLY_HANDLE.equals(item)) { + List list = businessUnitHandleService.selectListByWhere("where businessid='" + id + "'"); + for (BusinessUnitHandle businessUnitHandle : list) { + businessUnitRecord = new BusinessUnitRecord(businessUnitHandle); + businessUnitRecords.add(businessUnitRecord); + } + } else if (BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT.equals(item) + || BusinessUnit.UNIT_LEAVE_APPLY_MANAGER_AUDIT.equals(item) + || BusinessUnit.UNIT_LEAVE_APPLY_GENERAL_MANAGER_AUDIT.equals(item)) { + List listAudit = businessUnitAuditService.selectListByWhere("where businessid='" + id + "'"); + for (BusinessUnitAudit businessUnitAudit : listAudit) { + businessUnitRecord = new BusinessUnitRecord(businessUnitAudit); + businessUnitRecords.add(businessUnitRecord); + } + break; + } + } + } + if (leaveApply.getProcessid() != null && !leaveApply.getProcessid().trim().isEmpty()) { + List list = this.workflowService.getHistoryService().createHistoricTaskInstanceQuery() + .processInstanceId(leaveApply.getProcessid()).list(); + for (HistoricTaskInstance task : list) { + if (task.getAssignee() == null || task.getClaimTime() == null) { + continue; + } + businessUnitRecord = new BusinessUnitRecord(task); + businessUnitRecords.add(businessUnitRecord); + } + } + Collections.sort(businessUnitRecords, new Comparator() { + public int compare(BusinessUnitRecord o1, BusinessUnitRecord o2) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + try { + Date dt1 = df.parse(o1.getInsdt()); + Date dt2 = df.parse(o2.getInsdt()); + if (dt1.getTime() > dt2.getTime()) { + return 1; + } else if (dt1.getTime() < dt2.getTime()) { + return -1; + } + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + }); + model.addAttribute("businessUnitRecords", JSONArray.fromObject(businessUnitRecords)); + long num = 0L; + if (leaveApply.getProcessid() != null && !leaveApply.getProcessid().trim().isEmpty()) { + num = runtimeService.createProcessInstanceQuery().processInstanceId(leaveApply.getProcessid()).count(); + } + model.addAttribute("finishFlag", processStarted && num <= 0); + model.addAttribute("processStarted", processStarted); + model.addAttribute("processMessage", processStarted ? "" : "当前请假单尚未发起审批流程,仅显示单据信息。"); + if (request.getParameter("inModal") != null) { + return "administration/leaveApplyExecuteViewInModal"; + } + return "administration/leaveApplyExecuteView"; + } + + @RequestMapping("/showAudit.do") + public String showAudit(HttpServletRequest request, Model model) { + String taskId = request.getParameter("taskId"); + String processInstanceId = request.getParameter("processInstanceId"); + BusinessUnitAudit businessUnitAudit = new BusinessUnitAudit(); + + Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult(); + model.addAttribute("taskName", task.getName()); + ProcessInstance pInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + + businessUnitAudit.setId(CommUtil.getUUID()); + businessUnitAudit.setProcessid(processInstanceId); + businessUnitAudit.setTaskid(taskId); + businessUnitAudit.setBusinessid(pInstance.getBusinessKey()); + businessUnitAudit.setTaskdefinitionkey(task.getTaskDefinitionKey()); + model.addAttribute("businessUnitAudit", businessUnitAudit); + model.addAttribute("leaveApply", this.leaveApplyService.selectById(pInstance.getBusinessKey())); + + List activityImpls = workflowProcessDefinitionService.getNEXTActivities(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + model.addAttribute("showTargetUsersFlag", activityImpls.size() > 0); + return "administration/leaveApplyAudit"; + } + + @RequestMapping("/doAudit.do") + public String doAudit(HttpServletRequest request, Model model, @ModelAttribute BusinessUnitAudit businessUnitAudit) { + User cu = (User) request.getSession().getAttribute("cu"); + businessUnitAudit.setInsuser(cu.getId()); + businessUnitAudit.setInsdt(CommUtil.nowDate()); + if (businessUnitAudit.getPassstatus() && (businessUnitAudit.getTargetusers() == null || businessUnitAudit.getTargetusers().trim().isEmpty())) { + LeaveApply leaveApply = this.leaveApplyService.selectById(businessUnitAudit.getBusinessid()); + businessUnitAudit.setTargetusers(this.leaveApplyService.getDefaultCandidateUserIdsForNextTask( + leaveApply, businessUnitAudit.getTaskdefinitionkey(), businessUnitAudit.getRouteNum(), true)); + } + int result = this.leaveApplyService.doAuditProcess(businessUnitAudit); + String resstr = "{\"res\":\"" + result + "\",\"id\":\"" + businessUnitAudit.getId() + "\"}"; + model.addAttribute("result", resstr); + return "result"; + } + + @RequestMapping("/showHandle.do") + public String showHandle(HttpServletRequest request, Model model) { + String taskId = request.getParameter("taskId"); + String processInstanceId = request.getParameter("processInstanceId"); + String unitId = request.getParameter("unitId"); + BusinessUnitHandle businessUnitHandle = new BusinessUnitHandle(); + Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult(); + model.addAttribute("taskName", task.getName()); + List businessUnitHandles = this.businessUnitHandleService.selectListByWhere("where processid='" + processInstanceId + "' and taskId='" + taskId + "'"); + if (businessUnitHandles != null && businessUnitHandles.size() > 0) { + businessUnitHandle = businessUnitHandles.get(0); + businessUnitHandle.setTaskid(taskId); + } else { + businessUnitHandle.setId(CommUtil.getUUID()); + businessUnitHandle.setProcessid(processInstanceId); + businessUnitHandle.setTaskid(taskId); + ProcessInstance pInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + businessUnitHandle.setBusinessid(pInstance.getBusinessKey()); + businessUnitHandle.setTaskdefinitionkey(task.getTaskDefinitionKey()); + businessUnitHandle.setUnitid(unitId); + } + String userIds = businessUnitHandle.getTargetusers(); + if (userIds != null && !userIds.isEmpty()) { + List users = userService.selectListByWhere("where id in('" + userIds.replace(",", "','") + "')"); + String targetUsersName = ""; + for (User user : users) { + if (!targetUsersName.isEmpty()) { + targetUsersName += ","; + } + targetUsersName += user.getCaption(); + } + model.addAttribute("targetUsersName", targetUsersName); + } + model.addAttribute("businessUnitHandle", businessUnitHandle); + LeaveApply leaveApply = this.leaveApplyService.selectById(businessUnitHandle.getBusinessid()); + model.addAttribute("leaveApply", leaveApply); + List businessUnitAudits = this.businessUnitAuditService.selectListByWhere("where businessId = '" + leaveApply.getId() + "' order by insdt desc"); + String rejectReason = ""; + if (businessUnitAudits != null && businessUnitAudits.size() > 0) { + rejectReason = businessUnitAudits.get(0).getAuditopinion(); + } + model.addAttribute("rejectReason", rejectReason); + ActivityImpl activityImpl = workflowProcessDefinitionService.getNEXTActivityImpl(task.getProcessDefinitionId(), task.getTaskDefinitionKey(), CommString.ACTI_Condition_PASS); + model.addAttribute("showTargetUsersFlag", activityImpl != null && "userTask".equals(activityImpl.getProperties().get("type"))); + return "administration/leaveApplyHandle"; + } + + @RequestMapping("/doHandle.do") + public String doHandle(HttpServletRequest request, Model model, + @ModelAttribute LeaveApply leaveApply, + @ModelAttribute BusinessUnitHandle businessUnitHandle) { + User cu = (User) request.getSession().getAttribute("cu"); + int result = 0; + leaveApply.setUpduser(cu.getId()); + leaveApply.setUpddt(CommUtil.nowDate()); + leaveApply.setState(LeaveCommStr.STATE_SECTION_AUDIT); + result = this.leaveApplyService.update(leaveApply); + if (result > 0) { + String routeNum = request.getParameter("routeNum"); + businessUnitHandle.setStatus(BusinessUnitHandle.Status_FINISH); + if (!this.businessUnitHandleService.checkExit(businessUnitHandle)) { + businessUnitHandle.setInsuser(cu.getId()); + businessUnitHandle.setInsdt(CommUtil.nowDate()); + result = this.businessUnitHandleService.save(businessUnitHandle); + } else { + result = this.businessUnitHandleService.update(businessUnitHandle); + } + try { + Map variables = new HashMap(); + variables = ActivitiUtil.fixVariableWithRoute(variables, true, routeNum); + if (businessUnitHandle.getTargetusers() == null || businessUnitHandle.getTargetusers().trim().isEmpty()) { + businessUnitHandle.setTargetusers(this.leaveApplyService.getDefaultCandidateUserIds( + leaveApply, BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT)); + } + variables.put(CommString.ACTI_KEK_Candidate_Users, businessUnitHandle.getTargetusers()); + variables.put(CommString.ACTI_KEK_Assignee, null); + taskService.complete(businessUnitHandle.getTaskid(), variables); + } catch (Exception e) { + e.printStackTrace(); + result = 0; + } + } + String resstr = "{\"res\":\"" + result + "\",\"id\":\"" + leaveApply.getId() + "\"}"; + model.addAttribute("result", resstr); + return "result"; + } + + @RequestMapping("/getList4Mobile.do") + public Result getList4Mobile(HttpServletRequest request, Model model) { + String wherestr = "where 1=1 order by insdt desc"; + List list = this.leaveApplyService.selectListByWhere(wherestr); + JSONArray json = JSONArray.fromObject(list); + String res = "{\"total\":" + list.size() + ",\"rows\":" + json + "}"; + return Result.success(res); + } +} diff --git a/src/main/java/com/sipai/controller/user/UserController.java b/src/main/java/com/sipai/controller/user/UserController.java index 6763f563..7a737c9b 100644 --- a/src/main/java/com/sipai/controller/user/UserController.java +++ b/src/main/java/com/sipai/controller/user/UserController.java @@ -145,21 +145,27 @@ public class UserController { wherestr += "and pid in (" + pidstr + ") "; } } else { - Company company = unitService.getCompanyByUserId(cu.getId()); - String companyId = "-1"; - if (company != null) { - companyId = company.getId(); - } - List users = unitService.getChildrenUsersById(companyId); - String userIds = ""; - for (User user : users) { - if (!userIds.isEmpty()) { - userIds += "','"; + String companyId = request.getParameter("companyId"); + if (StringUtils.isBlank(companyId) && cu != null && StringUtils.isNotBlank(cu.getId())) { + Company company = unitService.getCompanyByUserId(cu.getId()); + if (company != null) { + companyId = company.getId(); } - userIds += user.getId(); } - if (!userIds.isEmpty()) { - wherestr += "and id in ('" + userIds + "') "; + if (StringUtils.isNotBlank(companyId)) { + List users = unitService.getChildrenUsersById(companyId); + String userIds = ""; + for (User user : users) { + if (!userIds.isEmpty()) { + userIds += "','"; + } + userIds += user.getId(); + } + if (!userIds.isEmpty()) { + wherestr += "and id in ('" + userIds + "') "; + } + } else { + wherestr += "and 1=0 "; } } } diff --git a/src/main/java/com/sipai/dao/administration/LeaveApplyDao.java b/src/main/java/com/sipai/dao/administration/LeaveApplyDao.java new file mode 100644 index 00000000..de94ee59 --- /dev/null +++ b/src/main/java/com/sipai/dao/administration/LeaveApplyDao.java @@ -0,0 +1,13 @@ +package com.sipai.dao.administration; + +import com.sipai.dao.base.CommDaoImpl; +import com.sipai.entity.administration.LeaveApply; +import org.springframework.stereotype.Repository; + +@Repository +public class LeaveApplyDao extends CommDaoImpl { + public LeaveApplyDao() { + super(); + this.setMappernamespace("administration.LeaveApplyMapper"); + } +} diff --git a/src/main/java/com/sipai/entity/activiti/ProcessType.java b/src/main/java/com/sipai/entity/activiti/ProcessType.java index 7b6cf881..3dbbaf86 100644 --- a/src/main/java/com/sipai/entity/activiti/ProcessType.java +++ b/src/main/java/com/sipai/entity/activiti/ProcessType.java @@ -50,6 +50,8 @@ public enum ProcessType { Administration_Reserve("Administration_Reserve","预案工作"), /*预案*/ Administration_Temporary("Administration_Temporary","临时任务"), + /*请假补假*/ + Administration_Leave("Administration_Leave","请假补假"), /*工艺调整*/ Process_Adjustment("Process_Adjustment","工艺调整"), /*水质化验*/ diff --git a/src/main/java/com/sipai/entity/administration/LeaveApply.java b/src/main/java/com/sipai/entity/administration/LeaveApply.java new file mode 100644 index 00000000..02baac49 --- /dev/null +++ b/src/main/java/com/sipai/entity/administration/LeaveApply.java @@ -0,0 +1,267 @@ +package com.sipai.entity.administration; + +import com.sipai.entity.base.BusinessUnitAdapter; + +public class LeaveApply extends BusinessUnitAdapter { + private String id; + private String insdt; + private String insuser; + private String upduser; + private String upddt; + private String unitId; + private String applyType; + private String leaveType; + private String startTime; + private String endTime; + private String hours; + private String days; + private String reason; + private String handoverDesc; + private String attachmentIds; + private String overtimeRefId; + private String overtimeHours; + private String actualStartTime; + private String actualEndTime; + private String state; + private String stateName; + private String auditManId; + private String auditMan; + private String submissionTime; + private String processid; + private String processdefid; + private String remark; + private String delFlag; + private String insuserName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getInsdt() { + return insdt; + } + + public void setInsdt(String insdt) { + this.insdt = insdt; + } + + public String getInsuser() { + return insuser; + } + + public void setInsuser(String insuser) { + this.insuser = insuser; + } + + public String getUpduser() { + return upduser; + } + + public void setUpduser(String upduser) { + this.upduser = upduser; + } + + public String getUpddt() { + return upddt; + } + + public void setUpddt(String upddt) { + this.upddt = upddt; + } + + public String getUnitId() { + return unitId; + } + + public void setUnitId(String unitId) { + this.unitId = unitId; + } + + public String getApplyType() { + return applyType; + } + + public void setApplyType(String applyType) { + this.applyType = applyType; + } + + public String getLeaveType() { + return leaveType; + } + + public void setLeaveType(String leaveType) { + this.leaveType = leaveType; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getHours() { + return hours; + } + + public void setHours(String hours) { + this.hours = hours; + } + + public String getDays() { + return days; + } + + public void setDays(String days) { + this.days = days; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getHandoverDesc() { + return handoverDesc; + } + + public void setHandoverDesc(String handoverDesc) { + this.handoverDesc = handoverDesc; + } + + public String getAttachmentIds() { + return attachmentIds; + } + + public void setAttachmentIds(String attachmentIds) { + this.attachmentIds = attachmentIds; + } + + public String getOvertimeRefId() { + return overtimeRefId; + } + + public void setOvertimeRefId(String overtimeRefId) { + this.overtimeRefId = overtimeRefId; + } + + public String getOvertimeHours() { + return overtimeHours; + } + + public void setOvertimeHours(String overtimeHours) { + this.overtimeHours = overtimeHours; + } + + public String getActualStartTime() { + return actualStartTime; + } + + public void setActualStartTime(String actualStartTime) { + this.actualStartTime = actualStartTime; + } + + public String getActualEndTime() { + return actualEndTime; + } + + public void setActualEndTime(String actualEndTime) { + this.actualEndTime = actualEndTime; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getStateName() { + return stateName; + } + + public void setStateName(String stateName) { + this.stateName = stateName; + } + + public String getAuditManId() { + return auditManId; + } + + public void setAuditManId(String auditManId) { + this.auditManId = auditManId; + } + + public String getAuditMan() { + return auditMan; + } + + public void setAuditMan(String auditMan) { + this.auditMan = auditMan; + } + + public String getSubmissionTime() { + return submissionTime; + } + + public void setSubmissionTime(String submissionTime) { + this.submissionTime = submissionTime; + } + + public String getProcessid() { + return processid; + } + + public void setProcessid(String processid) { + this.processid = processid; + } + + public String getProcessdefid() { + return processdefid; + } + + public void setProcessdefid(String processdefid) { + this.processdefid = processdefid; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getInsuserName() { + return insuserName; + } + + public void setInsuserName(String insuserName) { + this.insuserName = insuserName; + } +} diff --git a/src/main/java/com/sipai/entity/administration/LeaveCommStr.java b/src/main/java/com/sipai/entity/administration/LeaveCommStr.java new file mode 100644 index 00000000..0d2a5698 --- /dev/null +++ b/src/main/java/com/sipai/entity/administration/LeaveCommStr.java @@ -0,0 +1,30 @@ +package com.sipai.entity.administration; + +public class LeaveCommStr { + + public static final String APPLY_TYPE_LEAVE = "leave"; + public static final String APPLY_TYPE_COMPENSATORY = "compensatory"; + + public static final String STATE_DRAFT = "草稿"; + public static final String STATE_SECTION_AUDIT = "科长/副科长审批"; + public static final String STATE_MANAGER_AUDIT = "分管经理审批"; + public static final String STATE_GENERAL_MANAGER_AUDIT = "总经理审批"; + public static final String STATE_HANDLE = "退回修改"; + public static final String STATE_FINISH = "已通过"; + public static final String STATE_REJECT = "已驳回"; + + public static final String[][] APPLY_TYPES = { + {APPLY_TYPE_LEAVE, "请假"}, + {APPLY_TYPE_COMPENSATORY, "补假"} + }; + + public static final String[][] LEAVE_TYPES = { + {"annual", "年假"}, + {"personal", "事假"}, + {"sick", "病假"}, + {"marriage", "婚假"}, + {"maternity", "产假"}, + {"funeral", "丧假"}, + {"adjustment", "调休"} + }; +} diff --git a/src/main/java/com/sipai/entity/business/BusinessUnit.java b/src/main/java/com/sipai/entity/business/BusinessUnit.java index 44f36925..800893c8 100644 --- a/src/main/java/com/sipai/entity/business/BusinessUnit.java +++ b/src/main/java/com/sipai/entity/business/BusinessUnit.java @@ -115,6 +115,11 @@ public class BusinessUnit extends SQLAdapter { //预案工作审核流程节点 public final static String UNIT_Temporary_AUDIT = "temporary_audit";//指标审核 public final static String UNIT_Temporary_HANDLE = "temporary_handle";//指标业务处理 + //请假补假流程节点 + public final static String UNIT_LEAVE_APPLY_SECTION_AUDIT = "leave_apply_section_audit"; + public final static String UNIT_LEAVE_APPLY_MANAGER_AUDIT = "leave_apply_manager_audit"; + public final static String UNIT_LEAVE_APPLY_GENERAL_MANAGER_AUDIT = "leave_apply_general_manager_audit"; + public final static String UNIT_LEAVE_APPLY_HANDLE = "leave_apply_handle"; /** * 运行模块 diff --git a/src/main/java/com/sipai/mapper/administration/LeaveApplyMapper.xml b/src/main/java/com/sipai/mapper/administration/LeaveApplyMapper.xml new file mode 100644 index 00000000..13c27d5d --- /dev/null +++ b/src/main/java/com/sipai/mapper/administration/LeaveApplyMapper.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, insdt, insuser, upduser, upddt, unit_id, apply_type, leave_type, start_time, end_time, + hours, days, reason, handover_desc, attachment_ids, overtime_ref_id, overtime_hours, + actual_start_time, actual_end_time, state, audit_man_id, submission_time, processid, + processdefid, remark, del_flag + + + + delete from tb_administration_leave_apply + where id = #{id,jdbcType=VARCHAR} + + + insert into tb_administration_leave_apply ( + id, insdt, insuser, upduser, upddt, unit_id, apply_type, leave_type, start_time, end_time, + hours, days, reason, handover_desc, attachment_ids, overtime_ref_id, overtime_hours, + actual_start_time, actual_end_time, state, audit_man_id, submission_time, processid, + processdefid, remark, del_flag) + values ( + #{id,jdbcType=VARCHAR}, #{insdt,jdbcType=TIMESTAMP}, #{insuser,jdbcType=VARCHAR}, #{upduser,jdbcType=VARCHAR}, #{upddt,jdbcType=TIMESTAMP}, + #{unitId,jdbcType=VARCHAR}, #{applyType,jdbcType=VARCHAR}, #{leaveType,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, #{endTime,jdbcType=TIMESTAMP}, + NULLIF(#{hours,jdbcType=VARCHAR}, ''), NULLIF(#{days,jdbcType=VARCHAR}, ''), #{reason,jdbcType=VARCHAR}, #{handoverDesc,jdbcType=VARCHAR}, #{attachmentIds,jdbcType=VARCHAR}, + #{overtimeRefId,jdbcType=VARCHAR}, NULLIF(#{overtimeHours,jdbcType=VARCHAR}, ''), #{actualStartTime,jdbcType=TIMESTAMP}, #{actualEndTime,jdbcType=TIMESTAMP}, + #{state,jdbcType=VARCHAR}, #{auditManId,jdbcType=VARCHAR}, #{submissionTime,jdbcType=TIMESTAMP}, #{processid,jdbcType=VARCHAR}, + #{processdefid,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{delFlag,jdbcType=CHAR}) + + + insert into tb_administration_leave_apply + + id, + insdt, + insuser, + upduser, + upddt, + unit_id, + apply_type, + leave_type, + start_time, + end_time, + hours, + days, + reason, + handover_desc, + attachment_ids, + overtime_ref_id, + overtime_hours, + actual_start_time, + actual_end_time, + state, + audit_man_id, + submission_time, + processid, + processdefid, + remark, + del_flag, + + + #{id,jdbcType=VARCHAR}, + #{insdt,jdbcType=TIMESTAMP}, + #{insuser,jdbcType=VARCHAR}, + #{upduser,jdbcType=VARCHAR}, + #{upddt,jdbcType=TIMESTAMP}, + #{unitId,jdbcType=VARCHAR}, + #{applyType,jdbcType=VARCHAR}, + #{leaveType,jdbcType=VARCHAR}, + #{startTime,jdbcType=TIMESTAMP}, + #{endTime,jdbcType=TIMESTAMP}, + NULLIF(#{hours,jdbcType=VARCHAR}, ''), + NULLIF(#{days,jdbcType=VARCHAR}, ''), + #{reason,jdbcType=VARCHAR}, + #{handoverDesc,jdbcType=VARCHAR}, + #{attachmentIds,jdbcType=VARCHAR}, + #{overtimeRefId,jdbcType=VARCHAR}, + NULLIF(#{overtimeHours,jdbcType=VARCHAR}, ''), + #{actualStartTime,jdbcType=TIMESTAMP}, + #{actualEndTime,jdbcType=TIMESTAMP}, + #{state,jdbcType=VARCHAR}, + #{auditManId,jdbcType=VARCHAR}, + #{submissionTime,jdbcType=TIMESTAMP}, + #{processid,jdbcType=VARCHAR}, + #{processdefid,jdbcType=VARCHAR}, + #{remark,jdbcType=VARCHAR}, + #{delFlag,jdbcType=CHAR}, + + + + update tb_administration_leave_apply + + insdt = #{insdt,jdbcType=TIMESTAMP}, + insuser = #{insuser,jdbcType=VARCHAR}, + upduser = #{upduser,jdbcType=VARCHAR}, + upddt = #{upddt,jdbcType=TIMESTAMP}, + unit_id = #{unitId,jdbcType=VARCHAR}, + apply_type = #{applyType,jdbcType=VARCHAR}, + leave_type = #{leaveType,jdbcType=VARCHAR}, + start_time = #{startTime,jdbcType=TIMESTAMP}, + end_time = #{endTime,jdbcType=TIMESTAMP}, + hours = NULLIF(#{hours,jdbcType=VARCHAR}, ''), + days = NULLIF(#{days,jdbcType=VARCHAR}, ''), + reason = #{reason,jdbcType=VARCHAR}, + handover_desc = #{handoverDesc,jdbcType=VARCHAR}, + attachment_ids = #{attachmentIds,jdbcType=VARCHAR}, + overtime_ref_id = #{overtimeRefId,jdbcType=VARCHAR}, + overtime_hours = NULLIF(#{overtimeHours,jdbcType=VARCHAR}, ''), + actual_start_time = #{actualStartTime,jdbcType=TIMESTAMP}, + actual_end_time = #{actualEndTime,jdbcType=TIMESTAMP}, + state = #{state,jdbcType=VARCHAR}, + audit_man_id = #{auditManId,jdbcType=VARCHAR}, + submission_time = #{submissionTime,jdbcType=TIMESTAMP}, + processid = #{processid,jdbcType=VARCHAR}, + processdefid = #{processdefid,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + del_flag = #{delFlag,jdbcType=CHAR}, + + where id = #{id,jdbcType=VARCHAR} + + + + delete from tb_administration_leave_apply + ${where} + + diff --git a/src/main/java/com/sipai/service/administration/LeaveApplyService.java b/src/main/java/com/sipai/service/administration/LeaveApplyService.java new file mode 100644 index 00000000..a5415148 --- /dev/null +++ b/src/main/java/com/sipai/service/administration/LeaveApplyService.java @@ -0,0 +1,478 @@ +package com.sipai.service.administration; + +import com.sipai.dao.administration.LeaveApplyDao; +import com.sipai.entity.activiti.ProcessType; +import com.sipai.entity.administration.LeaveApply; +import com.sipai.entity.administration.LeaveCommStr; +import com.sipai.entity.base.BusinessUnitAdapter; +import com.sipai.entity.business.BusinessUnit; +import com.sipai.entity.business.BusinessUnitAudit; +import com.sipai.entity.business.BusinessUnitRecord; +import com.sipai.entity.maintenance.MaintenanceCommString; +import com.sipai.entity.user.User; +import com.sipai.service.activiti.WorkflowProcessDefinitionService; +import com.sipai.service.activiti.WorkflowService; +import com.sipai.service.business.BusinessUnitAuditService; +import com.sipai.service.user.JobService; +import com.sipai.service.user.UnitService; +import com.sipai.service.user.UserJobService; +import com.sipai.service.user.UserService; +import com.sipai.tools.CommService; +import org.apache.commons.lang3.StringUtils; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.LinkedHashSet; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Service +public class LeaveApplyService implements CommService { + @Resource + private LeaveApplyDao leaveApplyDao; + @Resource + private UserService userService; + @Resource + private WorkflowProcessDefinitionService workflowProcessDefinitionService; + @Resource + private WorkflowService workflowService; + @Resource + private BusinessUnitAuditService businessUnitAuditService; + @Resource + private JobService jobService; + @Resource + private UserJobService userJobService; + @Resource + private UnitService unitService; + + @Override + public LeaveApply selectById(String id) { + LeaveApply leaveApply = this.leaveApplyDao.selectByPrimaryKey(id); + this.fillExtraInfo(leaveApply); + return leaveApply; + } + + @Override + public int deleteById(String id) { + return this.leaveApplyDao.deleteByPrimaryKey(id); + } + + @Override + public int save(LeaveApply leaveApply) { + this.normalizeLeaveApply(leaveApply); + return this.leaveApplyDao.insert(leaveApply); + } + + @Override + public int update(LeaveApply leaveApply) { + this.normalizeLeaveApply(leaveApply); + return this.leaveApplyDao.updateByPrimaryKeySelective(leaveApply); + } + + @Override + public List selectListByWhere(String wherestr) { + LeaveApply leaveApply = new LeaveApply(); + leaveApply.setWhere(wherestr); + List list = this.leaveApplyDao.selectListByWhere(leaveApply); + if (list != null) { + for (LeaveApply item : list) { + this.fillExtraInfo(item); + } + } + return list; + } + + @Override + public int deleteByWhere(String wherestr) { + LeaveApply leaveApply = new LeaveApply(); + leaveApply.setWhere(wherestr); + return this.leaveApplyDao.deleteByWhere(leaveApply); + } + + public String getUserNamesByUserIds(String userIds) { + if (userIds == null || userIds.isEmpty()) { + return ""; + } + userIds = userIds.replace(",", "','"); + String userNames = ""; + List users = this.userService.selectListByWhere("where id in ('" + userIds + "')"); + for (User item : users) { + if (!userNames.isEmpty()) { + userNames += ","; + } + userNames += item.getCaption(); + } + return userNames; + } + + @Transactional + public int doStartProcess(LeaveApply leaveApply) { + try { + this.normalizeLeaveApply(leaveApply); + String candidateUserIds = this.getDefaultCandidateUserIds(leaveApply, BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT); + Map variables = new HashMap(); + if (StringUtils.isBlank(candidateUserIds)) { + return MaintenanceCommString.Response_StartProcess_NoUser; + } + leaveApply.setAuditManId(candidateUserIds); + variables.put("userIds", candidateUserIds); + variables.put("applyType", leaveApply.getApplyType()); + variables.put("leaveType", leaveApply.getLeaveType()); + variables.put("days", leaveApply.getDays()); + variables.put("hours", leaveApply.getHours()); + variables.put("applicantId", null); + + List processDefinitions = workflowProcessDefinitionService.getProcessDefsBykey( + ProcessType.Administration_Leave.getId() + "-" + leaveApply.getUnitId()); + if (processDefinitions == null || processDefinitions.size() == 0) { + processDefinitions = workflowProcessDefinitionService.getProcessDefsBykey(ProcessType.Administration_Leave.getId()); + } + if (processDefinitions == null || processDefinitions.size() == 0) { + return MaintenanceCommString.Response_StartProcess_NoProcessDef; + } + + ProcessInstance processInstance = workflowService.startWorkflow( + leaveApply.getId(), leaveApply.getInsuser(), processDefinitions.get(0).getKey(), variables); + if (processInstance == null) { + throw new RuntimeException(); + } + leaveApply.setProcessid(processInstance.getId()); + leaveApply.setProcessdefid(processDefinitions.get(0).getId()); + leaveApply.setState(LeaveCommStr.STATE_SECTION_AUDIT); + leaveApply.setSubmissionTime(leaveApply.getInsdt()); + + int res = 0; + LeaveApply db = this.selectById(leaveApply.getId()); + if (db != null) { + res = this.leaveApplyDao.updateByPrimaryKeySelective(leaveApply); + } else { + res = this.leaveApplyDao.insert(leaveApply); + } + if (res == 1) { + User user = userService.getUserById(leaveApply.getInsuser()); + String recordUser = this.getUserNamesByUserIds(candidateUserIds); + BusinessUnitRecord businessUnitRecord = new BusinessUnitRecord( + leaveApply.getInsdt(), leaveApply.getInsuser(), leaveApply.getId(), leaveApply.getProcessid(), + leaveApply.getUnitId(), null, StringUtils.isBlank(recordUser) + ? "提交了请假补假申请,等待审批人签收。" + : "提交了请假补假申请至" + recordUser + "进行审批。", user, "流程发起"); + businessUnitRecord.sendMessage(candidateUserIds, ""); + } + return res; + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } + + public int updateStatus(String id) { + LeaveApply leaveApply = this.selectById(id); + List task = workflowService.getTaskService().createTaskQuery().processInstanceId(leaveApply.getProcessid()).list(); + if (task != null && task.size() > 0) { + leaveApply.setState(task.get(0).getName()); + } else { + leaveApply.setState(LeaveCommStr.STATE_FINISH); + } + return this.update(leaveApply); + } + + @Transactional + public int doAuditProcess(BusinessUnitAudit entity) { + try { + BusinessUnitAdapter businessUnitAdapter = this.selectById(entity.getBusinessid()); + int res = businessUnitAuditService.doAudit(entity, businessUnitAdapter); + if (res > 0) { + this.updateStatus(entity.getBusinessid()); + } + return res; + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(); + } + } + + private void fillExtraInfo(LeaveApply leaveApply) { + if (leaveApply == null) { + return; + } + if (leaveApply.getAuditManId() != null && !leaveApply.getAuditManId().isEmpty()) { + leaveApply.setAuditMan(this.getUserNamesByUserIds(leaveApply.getAuditManId())); + } else if (StringUtils.isNotBlank(leaveApply.getProcessid()) + && !LeaveCommStr.STATE_FINISH.equals(leaveApply.getState()) + && !LeaveCommStr.STATE_DRAFT.equals(leaveApply.getState())) { + leaveApply.setAuditMan("待签收"); + } + if (leaveApply.getInsuser() != null && !leaveApply.getInsuser().isEmpty()) { + User user = this.userService.getUserById(leaveApply.getInsuser()); + if (user != null) { + leaveApply.setInsuserName(user.getCaption()); + } + } + leaveApply.setStateName(leaveApply.getState()); + } + + private void normalizeLeaveApply(LeaveApply leaveApply) { + if (leaveApply == null) { + return; + } + leaveApply.setStartTime(StringUtils.trimToNull(leaveApply.getStartTime())); + leaveApply.setEndTime(StringUtils.trimToNull(leaveApply.getEndTime())); + leaveApply.setActualStartTime(this.normalizeDateTimeValue(leaveApply.getActualStartTime())); + leaveApply.setActualEndTime(this.normalizeDateTimeValue(leaveApply.getActualEndTime())); + leaveApply.setHours(StringUtils.trimToNull(leaveApply.getHours())); + leaveApply.setDays(StringUtils.trimToNull(leaveApply.getDays())); + leaveApply.setOvertimeHours(StringUtils.trimToNull(leaveApply.getOvertimeHours())); + this.calculateDuration(leaveApply); + leaveApply.setStartTime(this.normalizeLeaveTimeValue(leaveApply.getStartTime())); + leaveApply.setEndTime(this.normalizeLeaveTimeValue(leaveApply.getEndTime())); + } + + public String getDefaultCandidateUserIds(LeaveApply leaveApply) { + return this.getDefaultCandidateUserIds(leaveApply, null); + } + + public String getDefaultCandidateUserIds(LeaveApply leaveApply, String taskDefinitionKey) { + if (leaveApply == null) { + return null; + } + String resourceId = StringUtils.trimToNull(taskDefinitionKey); + if (resourceId == null) { + resourceId = BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT; + } + String auditManId = StringUtils.trimToNull(leaveApply.getAuditManId()); + if (auditManId != null && (StringUtils.isBlank(leaveApply.getProcessid()) + || BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT.equals(resourceId))) { + return auditManId; + } + String jobIds = StringUtils.trimToNull(this.jobService.getJobs4Activiti( + leaveApply.getUnitId(), ProcessType.Administration_Leave.getId(), resourceId)); + if (StringUtils.isBlank(jobIds) && !BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT.equals(resourceId)) { + jobIds = StringUtils.trimToNull(this.jobService.getJobs4Activiti( + leaveApply.getUnitId(), ProcessType.Administration_Leave.getId())); + } + Set unitUserIds = new LinkedHashSet(); + List unitUsers = this.unitService.getChildrenUsersById(leaveApply.getUnitId()); + if (unitUsers != null) { + for (User user : unitUsers) { + if (user != null && StringUtils.isNotBlank(user.getId())) { + unitUserIds.add(user.getId()); + } + } + } + Set candidateUserIds = new LinkedHashSet(); + if (StringUtils.isNotBlank(jobIds)) { + List userJobs = this.userJobService.selectListByWhere( + "where jobid in ('" + jobIds.replace(",", "','") + "')"); + if (userJobs != null) { + for (com.sipai.entity.user.UserJob userJob : userJobs) { + if (userJob != null && StringUtils.isNotBlank(userJob.getUserid()) + && (unitUserIds.isEmpty() || unitUserIds.contains(userJob.getUserid()))) { + candidateUserIds.add(userJob.getUserid()); + } + } + } + } + if (candidateUserIds.isEmpty()) { + candidateUserIds.addAll(unitUserIds); + } + return this.joinUserIds(new ArrayList(candidateUserIds)); + } + + public String getDefaultCandidateUserIdsForNextTask(LeaveApply leaveApply, String currentTaskDefinitionKey, Integer routeNum, boolean passStatus) { + if (leaveApply == null || StringUtils.isBlank(leaveApply.getProcessdefid()) || StringUtils.isBlank(currentTaskDefinitionKey)) { + return this.getDefaultCandidateUserIds(leaveApply); + } + List nextWorkTasks = + workflowProcessDefinitionService.getNextWorkTasks(leaveApply.getProcessdefid(), currentTaskDefinitionKey); + if (nextWorkTasks == null || nextWorkTasks.isEmpty()) { + return this.getDefaultCandidateUserIds(leaveApply); + } + int expectedRouteNum = routeNum == null ? -1 : routeNum; + for (com.sipai.entity.activiti.WorkTask workTask : nextWorkTasks) { + if (workTask == null || !"userTask".equals(workTask.getType())) { + continue; + } + if (workTask.isPassFlag() != passStatus) { + continue; + } + if (expectedRouteNum >= 0 && workTask.getRouteNum() != expectedRouteNum) { + continue; + } + return this.getDefaultCandidateUserIds(leaveApply, workTask.getTaskKey()); + } + return this.getDefaultCandidateUserIds(leaveApply); + } + + private String joinUserIds(List userIds) { + if (userIds == null || userIds.isEmpty()) { + return null; + } + StringBuilder builder = new StringBuilder(); + for (String userId : userIds) { + if (StringUtils.isBlank(userId)) { + continue; + } + if (builder.length() > 0) { + builder.append(","); + } + builder.append(userId.trim()); + } + return builder.length() == 0 ? null : builder.toString(); + } + + private void calculateDuration(LeaveApply leaveApply) { + if (StringUtils.isBlank(leaveApply.getStartTime()) || StringUtils.isBlank(leaveApply.getEndTime())) { + leaveApply.setHours(null); + leaveApply.setDays(null); + return; + } + try { + if (this.isHalfDayValue(leaveApply.getStartTime()) && this.isHalfDayValue(leaveApply.getEndTime())) { + LeaveTimePoint startPoint = this.parseLeaveTimePoint(leaveApply.getStartTime()); + LeaveTimePoint endPoint = this.parseLeaveTimePoint(leaveApply.getEndTime()); + int halfDays = this.calculateHalfDays(startPoint, endPoint); + if (halfDays <= 0) { + leaveApply.setHours(null); + leaveApply.setDays(null); + return; + } + leaveApply.setHours(this.formatDecimal(BigDecimal.valueOf(halfDays * 4L))); + leaveApply.setDays(this.formatDecimal(BigDecimal.valueOf(halfDays).divide(BigDecimal.valueOf(2), 1, RoundingMode.HALF_UP))); + return; + } + + Date startDate = this.parseDateTime(leaveApply.getStartTime()); + Date endDate = this.parseDateTime(leaveApply.getEndTime()); + long diffMillis = endDate.getTime() - startDate.getTime(); + if (diffMillis <= 0) { + leaveApply.setHours(null); + leaveApply.setDays(null); + return; + } + BigDecimal hours = BigDecimal.valueOf(diffMillis) + .divide(BigDecimal.valueOf(1000L * 60L * 60L), 2, RoundingMode.HALF_UP); + BigDecimal days = hours.divide(BigDecimal.valueOf(8), 2, RoundingMode.HALF_UP); + if (days.compareTo(BigDecimal.valueOf(0.5)) < 0) { + days = BigDecimal.valueOf(0.5); + } + leaveApply.setHours(this.formatDecimal(hours)); + leaveApply.setDays(this.formatDecimal(days)); + } catch (ParseException e) { + leaveApply.setHours(null); + leaveApply.setDays(null); + } + } + + private boolean isHalfDayValue(String value) { + if (StringUtils.isBlank(value)) { + return false; + } + String trimmed = StringUtils.trim(value); + if (trimmed.matches("^\\d{4}-\\d{2}-\\d{2}\\s+(上午|下午)$")) { + return true; + } + return trimmed.matches("^\\d{4}-\\d{2}-\\d{2}\\s+(00:00(?::00)?|12:00(?::00)?)$"); + } + + private LeaveTimePoint parseLeaveTimePoint(String value) throws ParseException { + String[] parts = StringUtils.trim(value).split("\\s+"); + if (parts.length != 2) { + throw new ParseException("Unsupported leave time format: " + value, 0); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + sdf.setLenient(false); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(sdf.parse(parts[0])); + return new LeaveTimePoint(calendar, this.parsePeriodIndex(parts[1])); + } + + private int calculateHalfDays(LeaveTimePoint startPoint, LeaveTimePoint endPoint) { + long diffMillis = endPoint.calendar.getTimeInMillis() - startPoint.calendar.getTimeInMillis(); + int dayDiff = (int) (diffMillis / (1000 * 60 * 60 * 24)); + return dayDiff * 2 + (endPoint.periodIndex - startPoint.periodIndex) + 1; + } + + private int parsePeriodIndex(String period) throws ParseException { + if ("下午".equals(period) || "12:00".equals(period) || "12:00:00".equals(period)) { + return 1; + } + if ("上午".equals(period) || "00:00".equals(period) || "00:00:00".equals(period)) { + return 0; + } + throw new ParseException("Unsupported leave period: " + period, 0); + } + + private String normalizeLeaveTimeValue(String value) { + if (StringUtils.isBlank(value)) { + return null; + } + String trimmed = StringUtils.trim(value); + if (!trimmed.matches("^\\d{4}-\\d{2}-\\d{2}\\s+(上午|下午)$")) { + return this.normalizeDateTimeValue(trimmed); + } + String[] parts = trimmed.split("\\s+"); + return parts[0] + ("下午".equals(parts[1]) ? " 12:00:00" : " 00:00:00"); + } + + private String normalizeDateTimeValue(String value) { + if (StringUtils.isBlank(value)) { + return null; + } + String trimmed = StringUtils.trim(value); + String[] patterns = new String[]{"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd"}; + for (String pattern : patterns) { + try { + SimpleDateFormat parser = new SimpleDateFormat(pattern); + parser.setLenient(false); + Date parsed = parser.parse(trimmed); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return formatter.format(parsed); + } catch (ParseException e) { + // try next format + } + } + return trimmed; + } + + private Date parseDateTime(String value) throws ParseException { + String trimmed = StringUtils.trim(value); + String[] patterns = new String[]{"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd"}; + for (String pattern : patterns) { + try { + SimpleDateFormat parser = new SimpleDateFormat(pattern); + parser.setLenient(false); + return parser.parse(trimmed); + } catch (ParseException e) { + // try next format + } + } + throw new ParseException("Unsupported datetime format: " + value, 0); + } + + private String formatDecimal(BigDecimal value) { + return value.stripTrailingZeros().toPlainString(); + } + + private static class LeaveTimePoint { + private final Calendar calendar; + private final int periodIndex; + + private LeaveTimePoint(Calendar calendar, int periodIndex) { + this.calendar = calendar; + this.periodIndex = periodIndex; + } + } +} diff --git a/src/main/java/com/sipai/service/user/JobService.java b/src/main/java/com/sipai/service/user/JobService.java index fbf34e11..c42dbb7c 100644 --- a/src/main/java/com/sipai/service/user/JobService.java +++ b/src/main/java/com/sipai/service/user/JobService.java @@ -33,4 +33,13 @@ public interface JobService { * @return */ String getJobs4Activiti(String unitId, String type); + + /** + * 获取流程指定节点岗位 + * @param unitId 单位ID + * @param type ProcessType中的type + * @param resourceId 流程节点resourceId/taskDefinitionKey + * @return 逗号分隔的岗位ID + */ + String getJobs4Activiti(String unitId, String type, String resourceId); } diff --git a/src/main/java/com/sipai/service/user/JobServiceImpl.java b/src/main/java/com/sipai/service/user/JobServiceImpl.java index 6ef6ddc4..ca2f143a 100644 --- a/src/main/java/com/sipai/service/user/JobServiceImpl.java +++ b/src/main/java/com/sipai/service/user/JobServiceImpl.java @@ -11,6 +11,7 @@ import com.sipai.entity.user.User; import com.sipai.entity.user.UserJob; import com.sipai.tools.CommUtil; import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -156,16 +157,50 @@ public class JobServiceImpl implements JobService { @Override public String getJobs4Activiti(String unitId, String type) { + return this.getJobs4Activiti(unitId, type, null); + } + + @Override + public String getJobs4Activiti(String unitId, String type, String resourceId) { + Model model = this.findModel(unitId, type); + if (model == null) { + return ""; + } + return this.findJobIds(model.getId(), resourceId); + } + + private Model findModel(String unitId, String type) { String sql = "select * from [ACT_RE_MODEL] where KEY_ like '%" + unitId + "%' and KEY_ = '" + type + "-" + unitId + "'"; + List listModel = repositoryService.createNativeModelQuery().sql(sql).list(); + if (listModel != null && listModel.size() > 0) { + return listModel.get(0); + } + sql = "select * from [ACT_RE_MODEL] where KEY_ = '" + type + "'"; + listModel = repositoryService.createNativeModelQuery().sql(sql).list(); + if (listModel != null && listModel.size() > 0) { + return listModel.get(0); + } + return null; + } + + private String findJobIds(String modelId, String resourceId) { String jobIds = ""; - List list_model = repositoryService.createNativeModelQuery().sql(sql).list(); - if (list_model != null && list_model.size() > 0) { - ModelNodeJob modelNodeJob = new ModelNodeJob(); - modelNodeJob.setWhere("where model_id = '" + list_model.get(0).getId() + "'"); - List list_model_node = modelNodeJobDao.selectListByWhere(modelNodeJob); - HashSet hs = new HashSet(); - for (int i = 0; i < list_model_node.size(); i++) { - jobIds += "" + list_model_node.get(i).getJobId() + ","; + String where = "where model_id = '" + modelId + "'"; + if (resourceId != null && !resourceId.trim().isEmpty()) { + where += " and resource_id = '" + resourceId.trim() + "'"; + } + ModelNodeJob modelNodeJob = new ModelNodeJob(); + modelNodeJob.setWhere(where); + List listModelNode = modelNodeJobDao.selectListByWhere(modelNodeJob); + HashSet exists = new HashSet(); + if (listModelNode != null) { + for (ModelNodeJob item : listModelNode) { + if (item == null || item.getJobId() == null || item.getJobId().trim().isEmpty()) { + continue; + } + if (exists.add(item.getJobId())) { + jobIds += item.getJobId() + ","; + } } } return jobIds; diff --git a/src/main/resources/diagrams/leave/Administration_Leave.bpmn b/src/main/resources/diagrams/leave/Administration_Leave.bpmn new file mode 100644 index 00000000..143afde9 --- /dev/null +++ b/src/main/resources/diagrams/leave/Administration_Leave.bpmn @@ -0,0 +1,138 @@ + + + + 请假补假流程 + + + + leave_apply_section_audit + + + + + leave_apply_manager_audit + + + + + leave_apply_general_manager_audit + + + + + leave_apply_handle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/sql/add_leave_apply_module.sql b/src/main/resources/sql/add_leave_apply_module.sql new file mode 100644 index 00000000..71b17be0 --- /dev/null +++ b/src/main/resources/sql/add_leave_apply_module.sql @@ -0,0 +1,127 @@ +/* + 请假补假模块初始化脚本 + 1) 建表 tb_administration_leave_apply + 2) 注册流程节点 tb_business_unit + 3) 增加菜单并授权 admin +*/ + +IF OBJECT_ID('dbo.tb_administration_leave_apply', 'U') IS NULL +BEGIN + CREATE TABLE dbo.tb_administration_leave_apply ( + id varchar(50) NOT NULL PRIMARY KEY, + insdt datetime NULL, + insuser varchar(50) NULL, + upduser varchar(50) NULL, + upddt datetime NULL, + unit_id varchar(50) NULL, + apply_type varchar(20) NULL, + leave_type varchar(20) NULL, + start_time datetime NULL, + end_time datetime NULL, + hours decimal(10,2) NULL, + days decimal(10,2) NULL, + reason varchar(1000) NULL, + handover_desc varchar(1000) NULL, + attachment_ids varchar(1000) NULL, + overtime_ref_id varchar(50) NULL, + overtime_hours decimal(10,2) NULL, + actual_start_time datetime NULL, + actual_end_time datetime NULL, + state varchar(100) NULL, + audit_man_id varchar(max) NULL, + submission_time datetime NULL, + processid varchar(100) NULL, + processdefid varchar(100) NULL, + remark varchar(1000) NULL, + del_flag char(1) NULL DEFAULT '0' + ); +END +GO + +IF OBJECT_ID('dbo.tb_administration_leave_apply', 'U') IS NOT NULL +AND EXISTS ( + SELECT 1 + FROM sys.columns + WHERE object_id = OBJECT_ID('dbo.tb_administration_leave_apply') + AND name = 'audit_man_id' + AND max_length <> -1 +) +BEGIN + ALTER TABLE dbo.tb_administration_leave_apply + ALTER COLUMN audit_man_id varchar(max) NULL; +END +GO + +IF NOT EXISTS (SELECT 1 FROM tb_business_unit WHERE id = 'leave_apply_section_audit') +BEGIN + INSERT INTO tb_business_unit (id, name, process_type_id, insdt, insuser, active, url, modal_id) + VALUES ('leave_apply_section_audit', N'请假补假-科长/副科长审批', 'Administration_Leave', GETDATE(), 'emp01', '1', + 'administration/leaveApply/showAudit.do', 'subModal'); +END +GO + +IF NOT EXISTS (SELECT 1 FROM tb_business_unit WHERE id = 'leave_apply_manager_audit') +BEGIN + INSERT INTO tb_business_unit (id, name, process_type_id, insdt, insuser, active, url, modal_id) + VALUES ('leave_apply_manager_audit', N'请假补假-分管经理审批', 'Administration_Leave', GETDATE(), 'emp01', '1', + 'administration/leaveApply/showAudit.do', 'subModal'); +END +GO + +IF NOT EXISTS (SELECT 1 FROM tb_business_unit WHERE id = 'leave_apply_general_manager_audit') +BEGIN + INSERT INTO tb_business_unit (id, name, process_type_id, insdt, insuser, active, url, modal_id) + VALUES ('leave_apply_general_manager_audit', N'请假补假-总经理审批', 'Administration_Leave', GETDATE(), 'emp01', '1', + 'administration/leaveApply/showAudit.do', 'subModal'); +END +GO + +IF NOT EXISTS (SELECT 1 FROM tb_business_unit WHERE id = 'leave_apply_handle') +BEGIN + INSERT INTO tb_business_unit (id, name, process_type_id, insdt, insuser, active, url, modal_id) + VALUES ('leave_apply_handle', N'请假补假-退回修改', 'Administration_Leave', GETDATE(), 'emp01', '1', + 'administration/leaveApply/showHandle.do', 'subModal'); +END +GO + +DECLARE @menuId VARCHAR(50) = 'leave_apply_menu_001'; +DECLARE @menuName NVARCHAR(200) = N'请假补假申请'; +DECLARE @menuLocation VARCHAR(1000) = 'administration/leaveApply/showList.do'; +DECLARE @parentMenuId VARCHAR(50); +DECLARE @nextOrder INT; + +SELECT TOP 1 @parentMenuId = id +FROM tb_menuitem +WHERE name IN (N'事项管理', N'行政管理') + AND type = 'menu' +ORDER BY morder; + +IF @parentMenuId IS NULL + SET @parentMenuId = '-1'; + +SELECT @nextOrder = ISNULL(MAX(CAST(morder AS INT)), -1) + 1 +FROM tb_menuitem +WHERE pid = @parentMenuId + AND type = 'menu'; + +IF NOT EXISTS (SELECT 1 FROM tb_menuitem WHERE id = @menuId OR location = @menuLocation) +BEGIN + INSERT INTO tb_menuitem ( + id, pid, PowerID, caption, name, description, location, target, onclick, onmouseover, onmouseout, + image, altImage, tooltip, roles, page, width, height, forward, action, morder, lvl, active, type, + mainpage, count, engkey + ) + VALUES ( + @menuId, @parentMenuId, NULL, NULL, @menuName, NULL, @menuLocation, NULL, NULL, NULL, NULL, + 'fa-calendar', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @nextOrder, NULL, N'启用', 'menu', + NULL, NULL, NULL + ); +END +GO + +IF OBJECT_ID('dbo.tb_role_menu', 'U') IS NOT NULL +AND NOT EXISTS (SELECT 1 FROM tb_role_menu WHERE roleID = 'rol0001' AND menuID = 'leave_apply_menu_001') +BEGIN + INSERT INTO tb_role_menu (roleID, menuID) VALUES ('rol0001', 'leave_apply_menu_001'); +END +GO diff --git a/src/main/webapp/jsp/activiti/taskList.jsp b/src/main/webapp/jsp/activiti/taskList.jsp index b50c9f40..d9bec068 100644 --- a/src/main/webapp/jsp/activiti/taskList.jsp +++ b/src/main/webapp/jsp/activiti/taskList.jsp @@ -161,6 +161,11 @@ <% request.setAttribute("Administration_Temporary", ProcessType.Administration_Temporary.getId());%> <% request.setAttribute("UNIT_Temporary_AUDIT", BusinessUnit.UNIT_Temporary_AUDIT);%> <% request.setAttribute("UNIT_Temporary_HANDLE", BusinessUnit.UNIT_Temporary_HANDLE);%> +<% request.setAttribute("Administration_Leave", ProcessType.Administration_Leave.getId());%> +<% request.setAttribute("UNIT_LEAVE_APPLY_SECTION_AUDIT", BusinessUnit.UNIT_LEAVE_APPLY_SECTION_AUDIT);%> +<% request.setAttribute("UNIT_LEAVE_APPLY_MANAGER_AUDIT", BusinessUnit.UNIT_LEAVE_APPLY_MANAGER_AUDIT);%> +<% request.setAttribute("UNIT_LEAVE_APPLY_GENERAL_MANAGER_AUDIT", BusinessUnit.UNIT_LEAVE_APPLY_GENERAL_MANAGER_AUDIT);%> +<% request.setAttribute("UNIT_LEAVE_APPLY_HANDLE", BusinessUnit.UNIT_LEAVE_APPLY_HANDLE);%> <%--报表--%> <% request.setAttribute("Report_Check", ProcessType.Report_Check.getId());%> <% request.setAttribute("UNIT_REPORT_CREATE", BusinessUnit.UNIT_REPORT_CREATE);%> @@ -346,6 +351,11 @@ $("#subDiv").html(data); openModal('contractExcuteModal'); }); + } else if (type.indexOf('${Administration_Leave}') != -1) { + $.post(ext.contextPath + '/administration/leaveApply/showExecuteView.do', {id: id}, function (data) { + $("#subDiv").html(data); + openModal('contractExcuteModal'); + }); } else if (type.indexOf('${Administration_Reserve}') != -1) { $.post(ext.contextPath + '/administration/organization/showProcessOrganizationView.do', {id: id}, function (data) { $("#subDiv").html(data); @@ -879,6 +889,31 @@ default: showAlert('w', '未查询到任务模块!', 'mainAlertdiv'); } + } else if (type.indexOf('${Administration_Leave}') != -1) { + switch (status) { + case '${UNIT_LEAVE_APPLY_SECTION_AUDIT}': + case '${UNIT_LEAVE_APPLY_MANAGER_AUDIT}': + case '${UNIT_LEAVE_APPLY_GENERAL_MANAGER_AUDIT}': + $.post(ext.contextPath + '/administration/leaveApply/showAudit.do', { + processInstanceId: processInstanceId, taskId: taskId, businessKey: businessKey, + unitId: status + }, function (data) { + $("#subDiv").html(data); + openModal('subModal'); + }); + break; + case '${UNIT_LEAVE_APPLY_HANDLE}': + $.post(ext.contextPath + '/administration/leaveApply/showHandle.do', { + processInstanceId: processInstanceId, taskId: taskId, businessKey: businessKey, + unitId: status + }, function (data) { + $("#subDiv").html(data); + openModal('subModal'); + }); + break; + default: + showAlert('w', '未查询到任务模块!', 'mainAlertdiv'); + } } else if (type.indexOf('${Process_Adjustment}') > -1) { switch (status) { case '${UNIT_PROCESSADJUSTMENT_EDIT}'://工艺申请 diff --git a/src/main/webapp/jsp/administration/leaveApplyAdd.jsp b/src/main/webapp/jsp/administration/leaveApplyAdd.jsp new file mode 100644 index 00000000..849b059c --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyAdd.jsp @@ -0,0 +1,215 @@ +<%@ page language="java" pageEncoding="UTF-8"%> + + + diff --git a/src/main/webapp/jsp/administration/leaveApplyAudit.jsp b/src/main/webapp/jsp/administration/leaveApplyAudit.jsp new file mode 100644 index 00000000..8d59d88d --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyAudit.jsp @@ -0,0 +1,94 @@ +<%@ page language="java" pageEncoding="UTF-8"%> + + diff --git a/src/main/webapp/jsp/administration/leaveApplyEdit.jsp b/src/main/webapp/jsp/administration/leaveApplyEdit.jsp new file mode 100644 index 00000000..f0a0bc2c --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyEdit.jsp @@ -0,0 +1,210 @@ +<%@ page language="java" pageEncoding="UTF-8"%> + + diff --git a/src/main/webapp/jsp/administration/leaveApplyExecuteView.jsp b/src/main/webapp/jsp/administration/leaveApplyExecuteView.jsp new file mode 100644 index 00000000..dc914f21 --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyExecuteView.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%> + diff --git a/src/main/webapp/jsp/administration/leaveApplyExecuteViewInModal.jsp b/src/main/webapp/jsp/administration/leaveApplyExecuteViewInModal.jsp new file mode 100644 index 00000000..ee7bd0bc --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyExecuteViewInModal.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%> + +
${processMessage}
+
+
    + +
  • + + + + + + + + +
    + ${item.insdt.substring(0,16)} +

    ${item.taskName} ${item.user.caption}

    +
    ${item.record}
    +
    +
  • +
    +
diff --git a/src/main/webapp/jsp/administration/leaveApplyHandle.jsp b/src/main/webapp/jsp/administration/leaveApplyHandle.jsp new file mode 100644 index 00000000..da4b0d01 --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyHandle.jsp @@ -0,0 +1,196 @@ +<%@ page language="java" pageEncoding="UTF-8"%> + + diff --git a/src/main/webapp/jsp/administration/leaveApplyList.jsp b/src/main/webapp/jsp/administration/leaveApplyList.jsp new file mode 100644 index 00000000..418ef977 --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyList.jsp @@ -0,0 +1,161 @@ +<%@ page language="java" pageEncoding="UTF-8"%> +<%@ taglib uri="http://www.springsecurity.org/jsp" prefix="security"%> +<%@ page import="com.sipai.entity.base.ServerObject" %> + + + + + + <%= ServerObject.atttable.get("TOPTITLE")%> + + +
+
+
+
+
+
+

请假补假申请

+
+ +
+
+
+
+ + + + + +
+
+
+
+
+ diff --git a/src/main/webapp/jsp/administration/leaveApplyView.jsp b/src/main/webapp/jsp/administration/leaveApplyView.jsp new file mode 100644 index 00000000..8dd0b3c6 --- /dev/null +++ b/src/main/webapp/jsp/administration/leaveApplyView.jsp @@ -0,0 +1,47 @@ +<%@ page language="java" pageEncoding="UTF-8"%> + +