Compare commits
13 Commits
dafda57a0e
...
process-de
| Author | SHA1 | Date | |
|---|---|---|---|
| 0377a0cc8c | |||
| ebf57c2e82 | |||
| 6d5c8bfd65 | |||
| b9d6a7458f | |||
| 784ac30847 | |||
| b0e2e58d93 | |||
| 785654a510 | |||
| 9cc4d4a988 | |||
| fadbe2b59f | |||
| f33f57f6a7 | |||
| c3babf2c4d | |||
| 04610aa678 | |||
| 596b2a68bf |
19
pom.xml
19
pom.xml
@ -369,6 +369,12 @@
|
||||
<groupId>org.xhtmlrenderer</groupId>
|
||||
<artifactId>core-renderer</artifactId>
|
||||
<version>R8</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk14</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!-- 支持css样式渲染 -->
|
||||
<dependency>
|
||||
@ -597,6 +603,17 @@
|
||||
<groupId>org.redisson</groupId>
|
||||
<artifactId>redisson</artifactId>
|
||||
<version>3.11.4</version>
|
||||
<exclusions>
|
||||
<!-- 项目仍使用 jodd 3.x,排除 redisson 传入的 jodd 5.x,避免运行时方法签名冲突 -->
|
||||
<exclusion>
|
||||
<groupId>org.jodd</groupId>
|
||||
<artifactId>jodd-bean</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.jodd</groupId>
|
||||
<artifactId>jodd-core</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
<!-- <version>3.13.3</version>-->
|
||||
</dependency>
|
||||
<!-- zkclient -->
|
||||
@ -874,4 +891,4 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
</project>
|
||||
|
||||
@ -483,6 +483,7 @@ public class ActivitiController {
|
||||
String passFlag = request.getParameter("passFlag");
|
||||
if (passFlag != null && !passFlag.isEmpty()) {
|
||||
boolean pFlag = Boolean.parseBoolean(passFlag);
|
||||
int totalCount = list.size();
|
||||
Iterator<WorkTask> iterator = list.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
WorkTask workTask = (WorkTask) iterator.next();
|
||||
@ -491,6 +492,10 @@ public class ActivitiController {
|
||||
}
|
||||
|
||||
}
|
||||
// 当 passFlag=false 过滤后返回空列表(即未识别到退回路径),则作为备用方案返回全部路径
|
||||
if (list.isEmpty() && !pFlag && totalCount > 0) {
|
||||
list = workflowProcessDefinitionService.getNextWorkTasks(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
|
||||
}
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
if (list != null && list.size() > 0) {
|
||||
for (WorkTask workTask : list) {
|
||||
|
||||
@ -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<LeaveApply> list = this.leaveApplyService.selectListByWhere(wherestr + " order by " + sort + " " + order);
|
||||
PageInfo<LeaveApply> pInfo = new PageInfo<LeaveApply>(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<BusinessUnitRecord>()));
|
||||
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<BusinessUnitRecord> businessUnitRecords = new ArrayList<BusinessUnitRecord>();
|
||||
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<WorkTask> workTasks = workflowProcessDefinitionService.getAllPDTask(leaveApply.getProcessdefid(), "desc");
|
||||
List<String> keys = new ArrayList<String>();
|
||||
for (WorkTask workTask : workTasks) {
|
||||
keys.add(workTask.getTaskKey());
|
||||
}
|
||||
Set set = new HashSet();
|
||||
set.addAll(keys);
|
||||
keys = new ArrayList<String>();
|
||||
keys.addAll(set);
|
||||
for (String item : keys) {
|
||||
if (BusinessUnit.UNIT_LEAVE_APPLY_HANDLE.equals(item)) {
|
||||
List<BusinessUnitHandle> 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<BusinessUnitAudit> 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<HistoricTaskInstance> 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<BusinessUnitRecord>() {
|
||||
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<ActivityImpl> 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<BusinessUnitHandle> 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<User> 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<BusinessUnitAudit> 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<String, Object> variables = new HashMap<String, Object>();
|
||||
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<LeaveApply> list = this.leaveApplyService.selectListByWhere(wherestr);
|
||||
JSONArray json = JSONArray.fromObject(list);
|
||||
String res = "{\"total\":" + list.size() + ",\"rows\":" + json + "}";
|
||||
return Result.success(res);
|
||||
}
|
||||
}
|
||||
@ -369,7 +369,9 @@ public class AlarmPointController {
|
||||
this.mPointService.updateLalarmmin(alarmPoint.getUnitId(), mPoint.getMpointcode());
|
||||
// mPoint.setLalarmmin(null);
|
||||
}
|
||||
// this.mPointService.update2(alarmPoint.getUnitId(),mPoint);
|
||||
// Enable TriggerAlarm to allow ScadaAlarmJob to process this MPoint
|
||||
mPoint.setTriggeralarm("1");
|
||||
this.mPointService.update2(alarmPoint.getUnitId(), mPoint);
|
||||
}
|
||||
|
||||
if (code == Result.SUCCESS) {
|
||||
|
||||
@ -197,16 +197,15 @@ public class ProAlarmController {
|
||||
// Iterator<String> sIterator = jsonObject.keys();
|
||||
|
||||
JSONArray arr = new JSONArray();
|
||||
List<XServer> allxServerList = this.xServerService.selectListByWhere(" where 1=1 ");
|
||||
for (XServer xServer :
|
||||
allxServerList) {
|
||||
// List<XServer> allxServerList = this.xServerService.selectListByWhere(" where 1=1 ");
|
||||
// for (XServer xServer : allxServerList) {
|
||||
// if (jsonObject.get(xServer.getBizid()) != null) {
|
||||
// String code_value = jsonObject.get(xServer.getBizid()).toString();
|
||||
// code_value = code_value + ",data_stop_alarm";
|
||||
// code_value = code_value.replace(",", "','");
|
||||
// List<ProAlarm> list = this.proAlarmService.selectListByWhere(xServer.getBizid(), wherestr + " and point_code in ('" + code_value + "')"
|
||||
// + orderstr);
|
||||
List<ProAlarm> list = this.proAlarmService.selectListByWhere(xServer.getBizid(), wherestr + orderstr);
|
||||
List<ProAlarm> list = this.proAlarmService.selectListByWhere(companyId, wherestr + orderstr);
|
||||
// System.out.println(wherestr + " and point_code in ('" + code_value + "')");
|
||||
if (list != null && list.size() > 0) {
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
@ -249,7 +248,7 @@ public class ProAlarmController {
|
||||
}
|
||||
// }
|
||||
|
||||
}
|
||||
// }
|
||||
model.addAttribute("result", arr);
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
|
||||
@ -37,6 +37,7 @@ 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.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.ui.Model;
|
||||
@ -356,7 +357,7 @@ public class MaintenancePlanController {
|
||||
model.addAttribute("nowDate", CommUtil.nowDate());
|
||||
String maintenancePlanId = pInstance.getBusinessKey();
|
||||
List<BusinessUnitAudit> list = this.businessUnitAuditService.selectListByWhere("where businessId = '" + maintenancePlanId + "' order by insdt desc ");
|
||||
if (list != null && list.size() > 0) {
|
||||
if (CollectionUtils.isNotEmpty(list)){
|
||||
model.addAttribute("businessUnitAudit", list.get(0));
|
||||
}
|
||||
MaintenancePlan maintenancePlan = this.maintenancePlanService.selectById(maintenancePlanId);
|
||||
|
||||
@ -279,10 +279,8 @@ public class EquipmentPlanController {
|
||||
if (company != null) {
|
||||
model.addAttribute("companyName", company.getSname());
|
||||
}
|
||||
User user = userService.getUserById(equipmentPlan.getAuditId());
|
||||
if (user != null) {
|
||||
model.addAttribute("userName", user.getCaption());
|
||||
}
|
||||
String userNames = userService.getUserNamesByUserIds(equipmentPlan.getAuditId());
|
||||
model.addAttribute("userName", userNames);
|
||||
EquipmentPlanType equipmentPlanType_big = equipmentPlanTypeService.selectById(equipmentPlan.getPlanTypeBig());
|
||||
if (equipmentPlanType_big != null) {
|
||||
model.addAttribute("planTypeBigName", equipmentPlanType_big.getName());
|
||||
@ -308,10 +306,8 @@ public class EquipmentPlanController {
|
||||
if (company != null) {
|
||||
model.addAttribute("companyName", company.getSname());
|
||||
}
|
||||
User user = userService.getUserById(equipmentPlan.getAuditId());
|
||||
if (user != null) {
|
||||
model.addAttribute("userName", user.getCaption());
|
||||
}
|
||||
String userNames = userService.getUserNamesByUserIds(equipmentPlan.getAuditId());
|
||||
model.addAttribute("userName", userNames);
|
||||
EquipmentPlanType equipmentPlanType_big = equipmentPlanTypeService.selectById(equipmentPlan.getPlanTypeBig());
|
||||
if (equipmentPlanType_big != null) {
|
||||
model.addAttribute("planTypeBigName", equipmentPlanType_big.getName());
|
||||
@ -422,10 +418,8 @@ public class EquipmentPlanController {
|
||||
if (company != null) {
|
||||
model.addAttribute("companyName", company.getSname());
|
||||
}
|
||||
User user = userService.getUserById(equipmentPlan.getAuditId());
|
||||
if (user != null) {
|
||||
model.addAttribute("userName", user.getCaption());
|
||||
}
|
||||
String userNames = userService.getUserNamesByUserIds(equipmentPlan.getAuditId());
|
||||
model.addAttribute("userName", userNames);
|
||||
EquipmentPlanType equipmentPlanType_big = equipmentPlanTypeService.selectById(equipmentPlan.getPlanTypeBig());
|
||||
if (equipmentPlanType_big != null) {
|
||||
model.addAttribute("planTypeBigName", equipmentPlanType_big.getName());
|
||||
|
||||
@ -123,7 +123,9 @@ public class PipelineDataController {
|
||||
@RequestMapping("/deletes.do")
|
||||
public String dodeletes(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "ids") String ids) {
|
||||
int result = this.pipelineDataService.deleteByWhere("where id in (" + ids + ")");
|
||||
// 移除末尾逗号,防止SQL语法错误
|
||||
String cleanIds = ids.replaceAll("[,\\s]+$", "").replaceAll("^[,\\s]+", "");
|
||||
int result = this.pipelineDataService.deleteByWhere("where id in (" + cleanIds + ")");
|
||||
model.addAttribute("result", result);
|
||||
return "result";
|
||||
}
|
||||
|
||||
@ -374,6 +374,16 @@ public class RptCreateController {
|
||||
@RequestMapping("/doadd.do")
|
||||
public String doadd(HttpServletRequest request, Model model) {
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
String rptsetId = request.getParameter("rptsetId");
|
||||
|
||||
// 权限验证:检查用户是否有报表生成权限
|
||||
if (rptsetId != null && !rptsetId.isEmpty()) {
|
||||
if (!this.rptCreateService.checkGeneratePermission(rptsetId, cu)) {
|
||||
model.addAttribute("result", "{\"res\":\"您没有该报表的生成权限\",\"msg\":\"您没有该报表的生成权限\"}");
|
||||
return "result";
|
||||
}
|
||||
}
|
||||
|
||||
request.setAttribute("userId", cu.getId());
|
||||
request.setAttribute("userName", cu.getCaption());
|
||||
request.setAttribute("id", CommUtil.getUUID());
|
||||
@ -432,6 +442,14 @@ public class RptCreateController {
|
||||
String rptsetId = request.getParameter("rptsetId");
|
||||
int result = 0;
|
||||
|
||||
// 权限验证:检查用户是否有报表生成权限
|
||||
if (rptCreate.getRptsetId() != null && !rptCreate.getRptsetId().isEmpty()) {
|
||||
if (!this.rptCreateService.checkGeneratePermission(rptCreate.getRptsetId(), cu)) {
|
||||
model.addAttribute("result", "{\"res\":\"您没有该报表的生成权限\",\"msg\":\"您没有该报表的生成权限\"}");
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
}
|
||||
|
||||
RptInfoSet rptInfoSet = rptInfoSetService.selectById(rptCreate.getRptsetId());
|
||||
if (rptInfoSet != null) {
|
||||
//日报
|
||||
@ -545,6 +563,15 @@ public class RptCreateController {
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
String rptsetId = request.getParameter("rptsetId");
|
||||
int result = 0;
|
||||
|
||||
// 权限验证:检查用户是否有报表生成权限
|
||||
if (rptCreate.getRptsetId() != null && !rptCreate.getRptsetId().isEmpty()) {
|
||||
if (!this.rptCreateService.checkGeneratePermission(rptCreate.getRptsetId(), cu)) {
|
||||
model.addAttribute("result", "{\"res\":\"您没有该报表的生成权限\",\"msg\":\"您没有该报表的生成权限\"}");
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
}
|
||||
|
||||
RptInfoSet rptInfoSet = rptInfoSetService.selectById(rptCreate.getRptsetId());
|
||||
if (rptInfoSet != null) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
||||
@ -750,13 +777,26 @@ public class RptCreateController {
|
||||
@RequestMapping("/getSheet.do")
|
||||
public String getSheet(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "id") String id) {
|
||||
String path = "";
|
||||
String name = "";
|
||||
Result_Report result1 = new Result_Report();
|
||||
RptCreate rptCreate = this.rptCreateService.selectById(id);
|
||||
if (rptCreate != null) {//报表生成中的预览
|
||||
// 优先使用数据库中存储的文件路径,如果没有则构造路径(兼容旧数据)
|
||||
if (rptCreate.getAbspath() != null && !rptCreate.getAbspath().isEmpty()) {
|
||||
path = rptCreate.getAbspath();
|
||||
} else {
|
||||
path = rptCreate.getRptname() + rptCreate.getId() + ".xls";
|
||||
}
|
||||
// 获取文件扩展名
|
||||
String extension = ".xls";
|
||||
if (path.toLowerCase().endsWith(".xlsx")) {
|
||||
extension = ".xlsx";
|
||||
}
|
||||
String sourcePath = rptCreate.getRptname() + extension;
|
||||
List<RptInfoSetSheet> list = rptInfoSetSheetService.selectListByWhere("where rptInfoSet_id = '" + rptCreate.getRptsetId() + "'");
|
||||
try {
|
||||
String sourcePath = rptCreate.getRptname();
|
||||
byte[] isb = commonFileService.getInputStreamBytes(FileNameSpaceEnum.RptCreateFile.getNameSpace(), CommUtil.fixRptCreateFileName(rptCreate.getRptname() + rptCreate.getId()));
|
||||
byte[] isb = commonFileService.getInputStreamBytes(FileNameSpaceEnum.RptCreateFile.getNameSpace(), path);
|
||||
if (isb == null || isb.length == 0) {
|
||||
result1 = Result_Report.failed("文件不存在或已被删除");
|
||||
model.addAttribute("result", CommUtil.toJson(result1));
|
||||
@ -774,7 +814,7 @@ public class RptCreateController {
|
||||
List<RptInfoSetSheet> list = rptInfoSetSheetService.selectListByWhere("where rptInfoSet_id = '" + rptInfoSetFile.getMasterid() + "'");
|
||||
try {
|
||||
String sourcePath = "";
|
||||
String path = rptInfoSetFile.getAbspath();
|
||||
path = rptInfoSetFile.getAbspath();
|
||||
// path = path.replaceAll("\\.xlsx", "").replaceAll("\\.xls", "");
|
||||
// byte[] isb = commonFileService.getInputStreamBytes(FileNameSpaceEnum.RptInfoSetFile.getNameSpace(), CommUtil.fixRptCreateFileName(path));
|
||||
byte[] isb = commonFileService.getInputStreamBytes(FileNameSpaceEnum.RptInfoSetFile.getNameSpace(), path);
|
||||
@ -850,8 +890,18 @@ public class RptCreateController {
|
||||
String name = "";
|
||||
RptCreate rptCreate = this.rptCreateService.selectById(id);
|
||||
if (rptCreate != null) {
|
||||
path = rptCreate.getRptname() + rptCreate.getId() + ".xls";
|
||||
name = rptCreate.getRptname() + ".xls";
|
||||
// 优先使用数据库中存储的文件路径,如果没有则构造路径(兼容旧数据)
|
||||
if (rptCreate.getAbspath() != null && !rptCreate.getAbspath().isEmpty()) {
|
||||
path = rptCreate.getAbspath();
|
||||
} else {
|
||||
path = rptCreate.getRptname() + rptCreate.getId() + ".xls";
|
||||
}
|
||||
// 获取文件扩展名
|
||||
String extension = ".xls";
|
||||
if (path.toLowerCase().endsWith(".xlsx")) {
|
||||
extension = ".xlsx";
|
||||
}
|
||||
name = rptCreate.getRptname() + extension;
|
||||
}
|
||||
byte[] bytes = commonFileService.getInputStreamBytes(FileNameSpaceEnum.RptCreateFile.getNameSpace(), path);
|
||||
if (bytes == null || bytes.length == 0) {
|
||||
|
||||
@ -123,6 +123,13 @@ public class RptDayLogController {
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
String userId = cu.getId();
|
||||
|
||||
// 权限验证:检查用户是否有填报权限
|
||||
if (!this.rptDayLogService.checkInputPermission(rptdeptId, cu)) {
|
||||
Result result = Result.failed("您没有该报表的填报权限");
|
||||
model.addAttribute("result", CommUtil.toJson(result));
|
||||
return "result";
|
||||
}
|
||||
|
||||
JSONObject jsonObject = this.rptDayLogService.getJson(null,rptdeptId,rptdt,userId);
|
||||
|
||||
Result result = Result.success(jsonObject);
|
||||
@ -149,6 +156,14 @@ public class RptDayLogController {
|
||||
@RequestParam(value = "rptdeptId") String rptdeptId) throws IOException {
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
String userId = cu.getId();
|
||||
|
||||
// 权限验证:检查用户是否有填报权限
|
||||
if (!this.rptDayLogService.checkInputPermission(rptdeptId, cu)) {
|
||||
Result result = Result.failed("您没有该报表的填报权限");
|
||||
model.addAttribute("result", CommUtil.toJson(result));
|
||||
return "result";
|
||||
}
|
||||
|
||||
JSONObject jsonObject = this.rptDayLogService.getJson(id,rptdeptId,null,userId);
|
||||
model.addAttribute("rptDayLog", jsonObject);
|
||||
// return "/report/reportdetail";
|
||||
@ -191,11 +206,19 @@ public class RptDayLogController {
|
||||
}
|
||||
|
||||
@RequestMapping("/dosave.do")
|
||||
public String dosave(HttpServletRequest request,Model model){
|
||||
public ModelAndView dosave(HttpServletRequest request,Model model){
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
String userId = cu.getId();
|
||||
String json = request.getParameter("json");
|
||||
JSONObject jsonObject = JSONObject.fromObject(json);
|
||||
|
||||
// 权限验证:检查用户是否有填报权限
|
||||
String rptdeptId = (String) jsonObject.get("rptdeptId");
|
||||
if (!this.rptDayLogService.checkInputPermission(rptdeptId, cu)) {
|
||||
model.addAttribute("result", "{\"res\":\"您没有该报表的填报权限\",\"msg\":\"您没有该报表的填报权限\"}");
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
|
||||
if (jsonObject.get("id")==null||jsonObject.get("id").equals("")) {
|
||||
jsonObject.put("id", CommUtil.getUUID());
|
||||
}
|
||||
@ -206,12 +229,12 @@ public class RptDayLogController {
|
||||
e.printStackTrace();
|
||||
Result result = Result.failed("插入失败");
|
||||
model.addAttribute("result", CommUtil.toJson(result));
|
||||
return "result";
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
|
||||
Result result = Result.success(null);
|
||||
model.addAttribute("result", CommUtil.toJson(result));
|
||||
return "result";
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
|
||||
@RequestMapping("/onekeyAudit.do")//一键审核
|
||||
@ -268,6 +291,14 @@ public class RptDayLogController {
|
||||
@RequestParam(value = "rptdeptId", required=false) String rptdeptId) {
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
String userId = cu.getId();
|
||||
|
||||
// 权限验证:检查用户是否有填报权限
|
||||
if (!this.rptDayLogService.checkInputPermission(rptdeptId, cu)) {
|
||||
Result result = Result.failed("您没有该报表的填报权限");
|
||||
model.addAttribute("result", CommUtil.toJson(result));
|
||||
return "result";
|
||||
}
|
||||
|
||||
MultipartRequest multipartRequest = (MultipartRequest)request;
|
||||
|
||||
List<MultipartFile> fileList = multipartRequest.getFiles("filelist");
|
||||
|
||||
@ -181,8 +181,8 @@ public class SafetyCheckComprehensiveController {
|
||||
SafetyCheckStatusEnum.RESPONSE.getTaskTitle(),
|
||||
bean.getDutyUserId(), // 当前节点审批人
|
||||
bean.getDutyUserName(), // 当前节点审批人
|
||||
null, // 抄送人
|
||||
null,// 抄送人
|
||||
bean.getCopyUserId(), // 抄送人
|
||||
bean.getCopyUserName(),// 抄送人
|
||||
null);
|
||||
}
|
||||
return Result.success();
|
||||
@ -377,10 +377,9 @@ public class SafetyCheckComprehensiveController {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Result response(HttpServletRequest request, SafetyCheckComprehensive bean, String processInstanceId, int pass) throws IOException, ServiceException {
|
||||
|
||||
safetyCheckActivityService.audit(bean.getConfirmUserId(), processInstanceId, pass);
|
||||
|
||||
//通过
|
||||
if (pass == 1) {
|
||||
safetyCheckActivityService.audit(bean.getConfirmUserId(), processInstanceId, pass);
|
||||
bean.setStatus(SafetyCheckStatusEnum.COMPLETE.getId());
|
||||
service.update(bean);
|
||||
|
||||
@ -403,6 +402,7 @@ public class SafetyCheckComprehensiveController {
|
||||
}
|
||||
//不通过
|
||||
else {
|
||||
safetyCheckActivityService.audit(bean.getDutyUserId(), processInstanceId, pass);
|
||||
bean.setStatus(SafetyCheckStatusEnum.APPLY.getId());
|
||||
service.update(bean);
|
||||
safetyFlowTaskService.saveWorkFlowRecord(true,
|
||||
|
||||
@ -236,8 +236,8 @@ public class SafetyCheckDaylyController {
|
||||
SafetyCheckStatusEnum.RESPONSE.getTaskTitle(),
|
||||
bean.getDutyUserId(), // 当前节点审批人
|
||||
bean.getDutyUserName(), // 当前节点审批人
|
||||
null, // 抄送人
|
||||
null,// 抄送人
|
||||
bean.getCopyUserId(), // 抄送人
|
||||
bean.getCopyUserName(),// 抄送人
|
||||
null);
|
||||
|
||||
}
|
||||
@ -373,10 +373,9 @@ public class SafetyCheckDaylyController {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Result response(HttpServletRequest request, SafetyCheckDayly bean, String processInstanceId, int pass) throws IOException, ServiceException {
|
||||
|
||||
safetyCheckActivityService.audit(bean.getConfirmUserId(), processInstanceId, pass);
|
||||
|
||||
//通过
|
||||
if (pass == 1) {
|
||||
safetyCheckActivityService.audit(bean.getConfirmUserId(), processInstanceId, pass);
|
||||
bean.setStatus(SafetyCheckStatusEnum.COMPLETE.getId());
|
||||
safetyCheckDaylyService.update(bean);
|
||||
|
||||
@ -400,6 +399,7 @@ public class SafetyCheckDaylyController {
|
||||
}
|
||||
//不通过
|
||||
else {
|
||||
safetyCheckActivityService.audit(bean.getDutyUserId(), processInstanceId, pass);
|
||||
bean.setStatus(SafetyCheckStatusEnum.APPLY.getId());
|
||||
safetyCheckDaylyService.update(bean);
|
||||
safetyFlowTaskService.saveWorkFlowRecord(true,
|
||||
|
||||
@ -197,8 +197,8 @@ public class SafetyCheckSpecialController {
|
||||
SafetyCheckStatusEnum.RESPONSE.getTaskTitle(),
|
||||
bean.getDutyUserId(), // 当前节点审批人
|
||||
bean.getDutyUserName(), // 当前节点审批人
|
||||
null, // 抄送人
|
||||
null,// 抄送人
|
||||
bean.getCopyUserId(), // 抄送人
|
||||
bean.getCopyUserName(),// 抄送人
|
||||
null);
|
||||
}
|
||||
return Result.success();
|
||||
@ -393,10 +393,9 @@ public class SafetyCheckSpecialController {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Result response(HttpServletRequest request, SafetyCheckSpecial bean, String processInstanceId, int pass) throws IOException, ServiceException {
|
||||
|
||||
safetyCheckActivityService.audit(bean.getConfirmUserId(), processInstanceId, pass);
|
||||
|
||||
//通过
|
||||
if (pass == 1) {
|
||||
safetyCheckActivityService.audit(bean.getConfirmUserId(), processInstanceId, pass);
|
||||
bean.setStatus(SafetyCheckStatusEnum.COMPLETE.getId());
|
||||
service.update(bean);
|
||||
|
||||
@ -419,6 +418,7 @@ public class SafetyCheckSpecialController {
|
||||
}
|
||||
//不通过
|
||||
else {
|
||||
safetyCheckActivityService.audit(bean.getDutyUserId(), processInstanceId, pass);
|
||||
bean.setStatus(SafetyCheckStatusEnum.APPLY.getId());
|
||||
service.update(bean);
|
||||
safetyFlowTaskService.saveWorkFlowRecord(true,
|
||||
|
||||
@ -343,8 +343,6 @@ public class SafetyExternalCertificateController {
|
||||
int result = 0;
|
||||
for (String id : ids) {
|
||||
result += service.deleteById(id);
|
||||
}
|
||||
for (String id : ids) {
|
||||
safetyFilesService.deleteByBizId(id);
|
||||
}
|
||||
model.addAttribute("result", result);
|
||||
|
||||
@ -227,7 +227,7 @@ public class PatrolModelController {
|
||||
User cu=(User)request.getSession().getAttribute("cu");
|
||||
String companyId = request.getParameter("bizId");
|
||||
String type = request.getParameter("type");
|
||||
List<PatrolModel> list = this.patrolModelService.selectListByWhere("where unit_id = '"+companyId+"' and type='"+type+"' order by insdt");
|
||||
List<PatrolModel> list = this.patrolModelService.selectListByWhere("where unit_id = '"+companyId+"' order by insdt");
|
||||
ArrayList<Select2> list4select2 = new ArrayList<Select2>();
|
||||
for (int i=0;i<list.size();i++){
|
||||
Select2 select2 = new Select2();
|
||||
|
||||
@ -242,10 +242,11 @@ public class ProcessSectionController {
|
||||
@RequestMapping("/getProcessSection4Select.do")
|
||||
public String getProcessSection4Select(HttpServletRequest request, Model model) {
|
||||
String companyId = request.getParameter("companyId"); // 默认查询JSBZ???
|
||||
Company company = this.companyService.selectByPrimaryKey(companyId);
|
||||
// 使用unitService获取Unit信息,因为companyId来自tb_unit表
|
||||
Unit unit = this.unitService.getUnitById(companyId);
|
||||
|
||||
String wherestr = "where 1=1 and active='" + CommString.Active_True + "' ";
|
||||
if (company != null && company.getType().equals(CommString.UNIT_TYPE_COMPANY)) { // "C";//公司
|
||||
if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_COMPANY)) { // "C";//公司
|
||||
String bizs = "";//公司下属所有厂id
|
||||
List<Unit> blist = this.unitService.getParentCompanyChildrenBizByUnitid(companyId);
|
||||
if (blist != null && blist.size() > 0) {
|
||||
@ -257,7 +258,7 @@ public class ProcessSectionController {
|
||||
}
|
||||
bizs = bizs.replace(",", "','");
|
||||
wherestr += " and (unit_id='" + ProcessSection.UnitId_Sys + "' or (code not in (select code from tb_process_section where unit_id='" + ProcessSection.UnitId_Sys + "')) and unit_id in ('" + bizs + "') ) ";
|
||||
} else if (company != null && company.getType().equals(CommString.UNIT_TYPE_BIZ)) { // B 水厂
|
||||
} else if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_BIZ)) { // B 水厂
|
||||
wherestr += " and unit_id='" + companyId + "' ";
|
||||
}
|
||||
if (request.getParameter("search_name") != null && !request.getParameter("search_name").isEmpty()) {
|
||||
@ -272,13 +273,13 @@ public class ProcessSectionController {
|
||||
for (int i = 0; i < processSections.size(); i++) {
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("id", processSections.get(i).getCode());
|
||||
if (company != null && company.getType().equals(CommString.UNIT_TYPE_COMPANY)) { // "C";//公司
|
||||
if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_COMPANY)) { // "C";//公司
|
||||
if (!processSections.get(i).getUnitId().equals(ProcessSection.UnitId_Sys)) {
|
||||
jsonObject.put("text", processSections.get(i).getSname() + "(" + processSections.get(i).getCompanySname() + ")");
|
||||
} else {
|
||||
jsonObject.put("text", processSections.get(i).getSname());
|
||||
}
|
||||
} else if (company != null && company.getType().equals(CommString.UNIT_TYPE_BIZ)) { // "B";//水厂
|
||||
} else if (unit != null && unit.getType().equals(CommString.UNIT_TYPE_BIZ)) { // "B";//水厂
|
||||
jsonObject.put("text", processSections.get(i).getSname());
|
||||
}
|
||||
|
||||
|
||||
@ -213,6 +213,9 @@ public class RoleController {
|
||||
JSONArray json = JSONArray.fromObject(list);
|
||||
model.addAttribute("json", json);
|
||||
model.addAttribute("roleid", roleid);
|
||||
if(request.getParameter("bizid") != null && !request.getParameter("bizid").isEmpty()){
|
||||
model.addAttribute("companyId", request.getParameter("bizid"));
|
||||
}
|
||||
return "user/roleUser";
|
||||
}
|
||||
|
||||
|
||||
@ -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<User> 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<User> 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 ";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -853,11 +859,13 @@ public class UserController {
|
||||
public String userForSelectByCompany(HttpServletRequest request, Model model) {
|
||||
String userIds = request.getParameter("userIds");
|
||||
String jobIds = request.getParameter("jobIds");
|
||||
String displayDept = request.getParameter("displayDept");
|
||||
if (userIds != null && !userIds.isEmpty()) {
|
||||
List<User> list = this.userService.selectListByWhere("where id in ('" + userIds.replace(",", "','") + "') order by CHARINDEX(','+ id +',','," + userIds + ",')");
|
||||
List<User> list = this.userService.selectListByWhere("where id in ('" + userIds.replace(",", "','") + "') order by CHARINDEX(','+ id +',',','" + userIds + ",')");
|
||||
model.addAttribute("users", JSONArray.fromObject(list));
|
||||
}
|
||||
model.addAttribute("jobIds", jobIds);
|
||||
model.addAttribute("displayDept", displayDept);
|
||||
return "user/userForSelectByCompany";
|
||||
}
|
||||
|
||||
@ -1259,6 +1267,7 @@ public class UserController {
|
||||
model.addAttribute("users", JSONArray.fromObject(list));
|
||||
}
|
||||
model.addAttribute("jobIds", jobIds);
|
||||
model.addAttribute("displayDept", request.getParameter("displayDept"));
|
||||
return "user/userForSelectByWorkOrder";
|
||||
}
|
||||
|
||||
@ -1458,6 +1467,7 @@ public class UserController {
|
||||
model.addAttribute("users", JSONArray.fromObject(list));
|
||||
}
|
||||
model.addAttribute("jobIds", jobIds);
|
||||
model.addAttribute("displayDept", request.getParameter("displayDept"));
|
||||
return "user/userSelectLayer";
|
||||
}
|
||||
|
||||
|
||||
@ -514,6 +514,21 @@ public class MPointController {
|
||||
mp.setProcessSection(processSections.get(0));
|
||||
}
|
||||
}
|
||||
// 取redis点位数据最新值,没有就是0
|
||||
for (MPoint mPoint : list) {
|
||||
String id = mPoint.getId();
|
||||
int num = mPoint.getId().hashCode() % 25;
|
||||
RMapCache<String, String> map_redis_data = redissonClient.getMapCache(CommString.RedisMpointFlag + num);
|
||||
if (map_redis_data.get(id) != null && !"".equals(map_redis_data.get(id))) {
|
||||
String[] str = map_redis_data.get(id).split(";");
|
||||
if (str.length >= 3 && str[1] != null && !str[1].isEmpty() && !"null".equals(str[1])) {
|
||||
mPoint.setParmvalue(new BigDecimal(str[1]));
|
||||
mPoint.setMeasuredt(str[2]);
|
||||
} else {
|
||||
mPoint.setParmvalue(BigDecimal.ZERO);
|
||||
}
|
||||
}
|
||||
}
|
||||
PageInfo<MPoint> pi = new PageInfo<MPoint>(list);
|
||||
JSONArray json = JSONArray.fromObject(list);
|
||||
result = "{\"total\":" + pi.getTotal() + ",\"rows\":" + json + "}";
|
||||
|
||||
@ -133,6 +133,9 @@ public class SchedulingController {
|
||||
public String doadd(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "date") String date) {
|
||||
model.addAttribute("date", date.substring(0, 10));
|
||||
if(request.getParameter("bizid") != null && !request.getParameter("bizid").isEmpty()){
|
||||
model.addAttribute("bizid", request.getParameter("bizid"));
|
||||
}
|
||||
return "work/schedulingAdd";
|
||||
}
|
||||
|
||||
@ -142,6 +145,9 @@ public class SchedulingController {
|
||||
String wherestr = " where s.id = '" + schedulingId + "'";
|
||||
List<Scheduling> scheduling = this.schedulingService.selectCalenderListByWhere(wherestr);
|
||||
model.addAttribute("scheduling", scheduling.get(0));
|
||||
if(request.getParameter("bizid") != null && !request.getParameter("bizid").isEmpty()){
|
||||
model.addAttribute("bizid", request.getParameter("bizid"));
|
||||
}
|
||||
return "work/schedulingEdit";
|
||||
}
|
||||
|
||||
|
||||
@ -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<LeaveApply> {
|
||||
public LeaveApplyDao() {
|
||||
super();
|
||||
this.setMappernamespace("administration.LeaveApplyMapper");
|
||||
}
|
||||
}
|
||||
@ -50,6 +50,8 @@ public enum ProcessType {
|
||||
Administration_Reserve("Administration_Reserve","预案工作"),
|
||||
/*预案*/
|
||||
Administration_Temporary("Administration_Temporary","临时任务"),
|
||||
/*请假补假*/
|
||||
Administration_Leave("Administration_Leave","请假补假"),
|
||||
/*工艺调整*/
|
||||
Process_Adjustment("Process_Adjustment","工艺调整"),
|
||||
/*水质化验*/
|
||||
|
||||
267
src/main/java/com/sipai/entity/administration/LeaveApply.java
Normal file
267
src/main/java/com/sipai/entity/administration/LeaveApply.java
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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", "调休"}
|
||||
};
|
||||
}
|
||||
@ -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";
|
||||
|
||||
/**
|
||||
* 运行模块
|
||||
|
||||
@ -0,0 +1,160 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="administration.LeaveApplyMapper" >
|
||||
<resultMap id="BaseResultMap" type="com.sipai.entity.administration.LeaveApply" >
|
||||
<id column="id" property="id" jdbcType="VARCHAR" />
|
||||
<result column="insdt" property="insdt" jdbcType="TIMESTAMP" />
|
||||
<result column="insuser" property="insuser" jdbcType="VARCHAR" />
|
||||
<result column="upduser" property="upduser" jdbcType="VARCHAR" />
|
||||
<result column="upddt" property="upddt" jdbcType="TIMESTAMP" />
|
||||
<result column="unit_id" property="unitId" jdbcType="VARCHAR" />
|
||||
<result column="apply_type" property="applyType" jdbcType="VARCHAR" />
|
||||
<result column="leave_type" property="leaveType" jdbcType="VARCHAR" />
|
||||
<result column="start_time" property="startTime" jdbcType="TIMESTAMP" />
|
||||
<result column="end_time" property="endTime" jdbcType="TIMESTAMP" />
|
||||
<result column="hours" property="hours" jdbcType="DECIMAL" />
|
||||
<result column="days" property="days" jdbcType="DECIMAL" />
|
||||
<result column="reason" property="reason" jdbcType="VARCHAR" />
|
||||
<result column="handover_desc" property="handoverDesc" jdbcType="VARCHAR" />
|
||||
<result column="attachment_ids" property="attachmentIds" jdbcType="VARCHAR" />
|
||||
<result column="overtime_ref_id" property="overtimeRefId" jdbcType="VARCHAR" />
|
||||
<result column="overtime_hours" property="overtimeHours" jdbcType="DECIMAL" />
|
||||
<result column="actual_start_time" property="actualStartTime" jdbcType="TIMESTAMP" />
|
||||
<result column="actual_end_time" property="actualEndTime" jdbcType="TIMESTAMP" />
|
||||
<result column="state" property="state" jdbcType="VARCHAR" />
|
||||
<result column="audit_man_id" property="auditManId" jdbcType="VARCHAR" />
|
||||
<result column="submission_time" property="submissionTime" jdbcType="TIMESTAMP" />
|
||||
<result column="processid" property="processid" jdbcType="VARCHAR" />
|
||||
<result column="processdefid" property="processdefid" jdbcType="VARCHAR" />
|
||||
<result column="remark" property="remark" jdbcType="VARCHAR" />
|
||||
<result column="del_flag" property="delFlag" jdbcType="CHAR" />
|
||||
</resultMap>
|
||||
<sql id="Base_Column_List" >
|
||||
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
|
||||
</sql>
|
||||
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
|
||||
select
|
||||
<include refid="Base_Column_List" />
|
||||
from tb_administration_leave_apply
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</select>
|
||||
<delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
|
||||
delete from tb_administration_leave_apply
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</delete>
|
||||
<insert id="insert" parameterType="com.sipai.entity.administration.LeaveApply" >
|
||||
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, 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}, #{submissionTime,jdbcType=TIMESTAMP}, #{processid,jdbcType=VARCHAR},
|
||||
#{processdefid,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, #{delFlag,jdbcType=CHAR})
|
||||
</insert>
|
||||
<insert id="insertSelective" parameterType="com.sipai.entity.administration.LeaveApply" >
|
||||
insert into tb_administration_leave_apply
|
||||
<trim prefix="(" suffix=")" suffixOverrides="," >
|
||||
<if test="id != null" >id,</if>
|
||||
<if test="insdt != null" >insdt,</if>
|
||||
<if test="insuser != null" >insuser,</if>
|
||||
<if test="upduser != null" >upduser,</if>
|
||||
<if test="upddt != null" >upddt,</if>
|
||||
<if test="unitId != null" >unit_id,</if>
|
||||
<if test="applyType != null" >apply_type,</if>
|
||||
<if test="leaveType != null" >leave_type,</if>
|
||||
<if test="startTime != null" >start_time,</if>
|
||||
<if test="endTime != null" >end_time,</if>
|
||||
<if test="hours != null" >hours,</if>
|
||||
<if test="days != null" >days,</if>
|
||||
<if test="reason != null" >reason,</if>
|
||||
<if test="handoverDesc != null" >handover_desc,</if>
|
||||
<if test="attachmentIds != null" >attachment_ids,</if>
|
||||
<if test="overtimeRefId != null" >overtime_ref_id,</if>
|
||||
<if test="overtimeHours != null" >overtime_hours,</if>
|
||||
<if test="actualStartTime != null" >actual_start_time,</if>
|
||||
<if test="actualEndTime != null" >actual_end_time,</if>
|
||||
<if test="state != null" >state,</if>
|
||||
<if test="submissionTime != null" >submission_time,</if>
|
||||
<if test="processid != null" >processid,</if>
|
||||
<if test="processdefid != null" >processdefid,</if>
|
||||
<if test="remark != null" >remark,</if>
|
||||
<if test="delFlag != null" >del_flag,</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides="," >
|
||||
<if test="id != null" >#{id,jdbcType=VARCHAR},</if>
|
||||
<if test="insdt != null" >#{insdt,jdbcType=TIMESTAMP},</if>
|
||||
<if test="insuser != null" >#{insuser,jdbcType=VARCHAR},</if>
|
||||
<if test="upduser != null" >#{upduser,jdbcType=VARCHAR},</if>
|
||||
<if test="upddt != null" >#{upddt,jdbcType=TIMESTAMP},</if>
|
||||
<if test="unitId != null" >#{unitId,jdbcType=VARCHAR},</if>
|
||||
<if test="applyType != null" >#{applyType,jdbcType=VARCHAR},</if>
|
||||
<if test="leaveType != null" >#{leaveType,jdbcType=VARCHAR},</if>
|
||||
<if test="startTime != null" >#{startTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="endTime != null" >#{endTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="hours != null" >NULLIF(#{hours,jdbcType=VARCHAR}, ''),</if>
|
||||
<if test="days != null" >NULLIF(#{days,jdbcType=VARCHAR}, ''),</if>
|
||||
<if test="reason != null" >#{reason,jdbcType=VARCHAR},</if>
|
||||
<if test="handoverDesc != null" >#{handoverDesc,jdbcType=VARCHAR},</if>
|
||||
<if test="attachmentIds != null" >#{attachmentIds,jdbcType=VARCHAR},</if>
|
||||
<if test="overtimeRefId != null" >#{overtimeRefId,jdbcType=VARCHAR},</if>
|
||||
<if test="overtimeHours != null" >NULLIF(#{overtimeHours,jdbcType=VARCHAR}, ''),</if>
|
||||
<if test="actualStartTime != null" >#{actualStartTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="actualEndTime != null" >#{actualEndTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="state != null" >#{state,jdbcType=VARCHAR},</if>
|
||||
<if test="submissionTime != null" >#{submissionTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="processid != null" >#{processid,jdbcType=VARCHAR},</if>
|
||||
<if test="processdefid != null" >#{processdefid,jdbcType=VARCHAR},</if>
|
||||
<if test="remark != null" >#{remark,jdbcType=VARCHAR},</if>
|
||||
<if test="delFlag != null" >#{delFlag,jdbcType=CHAR},</if>
|
||||
</trim>
|
||||
</insert>
|
||||
<update id="updateByPrimaryKeySelective" parameterType="com.sipai.entity.administration.LeaveApply" >
|
||||
update tb_administration_leave_apply
|
||||
<set >
|
||||
<if test="insdt != null" >insdt = #{insdt,jdbcType=TIMESTAMP},</if>
|
||||
<if test="insuser != null" >insuser = #{insuser,jdbcType=VARCHAR},</if>
|
||||
<if test="upduser != null" >upduser = #{upduser,jdbcType=VARCHAR},</if>
|
||||
<if test="upddt != null" >upddt = #{upddt,jdbcType=TIMESTAMP},</if>
|
||||
<if test="unitId != null" >unit_id = #{unitId,jdbcType=VARCHAR},</if>
|
||||
<if test="applyType != null" >apply_type = #{applyType,jdbcType=VARCHAR},</if>
|
||||
<if test="leaveType != null" >leave_type = #{leaveType,jdbcType=VARCHAR},</if>
|
||||
<if test="startTime != null" >start_time = #{startTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="endTime != null" >end_time = #{endTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="hours != null" >hours = NULLIF(#{hours,jdbcType=VARCHAR}, ''),</if>
|
||||
<if test="days != null" >days = NULLIF(#{days,jdbcType=VARCHAR}, ''),</if>
|
||||
<if test="reason != null" >reason = #{reason,jdbcType=VARCHAR},</if>
|
||||
<if test="handoverDesc != null" >handover_desc = #{handoverDesc,jdbcType=VARCHAR},</if>
|
||||
<if test="attachmentIds != null" >attachment_ids = #{attachmentIds,jdbcType=VARCHAR},</if>
|
||||
<if test="overtimeRefId != null" >overtime_ref_id = #{overtimeRefId,jdbcType=VARCHAR},</if>
|
||||
<if test="overtimeHours != null" >overtime_hours = NULLIF(#{overtimeHours,jdbcType=VARCHAR}, ''),</if>
|
||||
<if test="actualStartTime != null" >actual_start_time = #{actualStartTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="actualEndTime != null" >actual_end_time = #{actualEndTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="state != null" >state = #{state,jdbcType=VARCHAR},</if>
|
||||
audit_man_id = NULL,
|
||||
<if test="submissionTime != null" >submission_time = #{submissionTime,jdbcType=TIMESTAMP},</if>
|
||||
<if test="processid != null" >processid = #{processid,jdbcType=VARCHAR},</if>
|
||||
<if test="processdefid != null" >processdefid = #{processdefid,jdbcType=VARCHAR},</if>
|
||||
<if test="remark != null" >remark = #{remark,jdbcType=VARCHAR},</if>
|
||||
<if test="delFlag != null" >del_flag = #{delFlag,jdbcType=CHAR},</if>
|
||||
</set>
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
<select id="selectListByWhere" parameterType="java.lang.String" resultMap="BaseResultMap" >
|
||||
select
|
||||
<include refid="Base_Column_List" />
|
||||
from tb_administration_leave_apply
|
||||
${where}
|
||||
</select>
|
||||
<delete id="deleteByWhere" parameterType="java.lang.String" >
|
||||
delete from tb_administration_leave_apply
|
||||
${where}
|
||||
</delete>
|
||||
</mapper>
|
||||
@ -362,9 +362,22 @@ public class WorkflowProcessDefinitionService {
|
||||
String pvmTransitionId = "";
|
||||
for (WorkTask workTask : list) {
|
||||
PvmTransition item=this.getTransition(processDefId, taskDefId,workTask.getId(),pvmTransitionId);
|
||||
if (item == null) {
|
||||
// 未找到对应路径时默认标记为通过路径,继续处理其他任务
|
||||
workTask.setPassFlag(true);
|
||||
continue;
|
||||
}
|
||||
pvmTransitionId = item.getId();
|
||||
String conditionText=String.valueOf(item.getProperty("conditionText"));
|
||||
if (conditionText!=null && conditionText.contains("!"+CommString.ACTI_KEK_Condition)) {
|
||||
// 检测退回路径:支持多种条件表达式格式
|
||||
// ${!pass} / ${pass == false} / ${pass==false} / ${pass != true} / ${pass!=true}
|
||||
boolean isRejectPath = conditionText != null && (
|
||||
conditionText.contains("!"+CommString.ACTI_KEK_Condition) ||
|
||||
conditionText.contains(CommString.ACTI_KEK_Condition+" == false") ||
|
||||
conditionText.contains(CommString.ACTI_KEK_Condition+"==false") ||
|
||||
conditionText.contains(CommString.ACTI_KEK_Condition+" != true") ||
|
||||
conditionText.contains(CommString.ACTI_KEK_Condition+"!=true"));
|
||||
if (isRejectPath) {
|
||||
workTask.setPassFlag(false);
|
||||
}else{
|
||||
workTask.setPassFlag(true);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,477 @@
|
||||
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<LeaveApply> {
|
||||
@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<LeaveApply> selectListByWhere(String wherestr) {
|
||||
LeaveApply leaveApply = new LeaveApply();
|
||||
leaveApply.setWhere(wherestr);
|
||||
List<LeaveApply> 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<User> 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<String, Object> variables = new HashMap<String, Object>();
|
||||
if (StringUtils.isBlank(candidateUserIds)) {
|
||||
return MaintenanceCommString.Response_StartProcess_NoUser;
|
||||
}
|
||||
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<ProcessDefinition> 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> 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 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<String> unitUserIds = new LinkedHashSet<String>();
|
||||
List<User> 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<String> candidateUserIds = new LinkedHashSet<String>();
|
||||
if (StringUtils.isNotBlank(jobIds)) {
|
||||
List<com.sipai.entity.user.UserJob> 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<String>(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<com.sipai.entity.activiti.WorkTask> nextWorkTasks =
|
||||
workflowProcessDefinitionService.getNextWorkTasks(leaveApply.getProcessdefid(), currentTaskDefinitionKey);
|
||||
if (nextWorkTasks == null || nextWorkTasks.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
int expectedRouteNum = routeNum == null ? -1 : routeNum;
|
||||
boolean matchedRoute = false;
|
||||
for (com.sipai.entity.activiti.WorkTask workTask : nextWorkTasks) {
|
||||
if (workTask == null) {
|
||||
continue;
|
||||
}
|
||||
if (workTask.isPassFlag() != passStatus) {
|
||||
continue;
|
||||
}
|
||||
if (expectedRouteNum >= 0 && workTask.getRouteNum() != expectedRouteNum) {
|
||||
continue;
|
||||
}
|
||||
matchedRoute = true;
|
||||
if (!"userTask".equals(workTask.getType())) {
|
||||
continue;
|
||||
}
|
||||
return this.getDefaultCandidateUserIds(leaveApply, workTask.getTaskKey());
|
||||
}
|
||||
return matchedRoute ? null : this.getDefaultCandidateUserIds(leaveApply);
|
||||
}
|
||||
|
||||
private String joinUserIds(List<String> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -20,9 +20,12 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -351,6 +354,8 @@ public class CommonFileServiceImpl implements CommonFileService {
|
||||
String errorMsg = e.getMessage();
|
||||
if (errorMsg != null && errorMsg.contains("NoSuchKey")) {
|
||||
logger.error("MinIO文件不存在: bucketName={}, objectName={}", nameSpace, filePath);
|
||||
} else if (errorMsg != null && errorMsg.contains("NoSuchBucket")) {
|
||||
logger.error("MinIO存储桶不存在: bucketName={}, objectName={}", nameSpace, filePath);
|
||||
} else {
|
||||
logger.error("获取MinIO文件失败: bucketName={}, objectName={}, 错误: {}", nameSpace, filePath, errorMsg, e);
|
||||
}
|
||||
@ -375,12 +380,12 @@ public class CommonFileServiceImpl implements CommonFileService {
|
||||
try {
|
||||
// 安全获取文件名(自动检测编码)
|
||||
fileName = getSafeFileName(item);
|
||||
|
||||
|
||||
// 生成MinIO安全的对象名称
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
|
||||
String timestamp = dateFormat.format(new Date());
|
||||
filePath = generateMinioObjectName(fileName, timestamp);
|
||||
|
||||
|
||||
InputStream in = item.getInputStream();
|
||||
String contentType = item.getContentType();
|
||||
minioTemplate.makeBucket(nameSpace);
|
||||
@ -389,7 +394,7 @@ public class CommonFileServiceImpl implements CommonFileService {
|
||||
CommonFile commonFile = new CommonFile();
|
||||
commonFile.setId(CommUtil.getUUID());
|
||||
commonFile.setMasterid(masterId);
|
||||
// 20210105 YYJ 用于文件表绑定资料节点用字段 tb_doc_file内和masterId一样
|
||||
// 20210105 YYJ 用于文件表绑定<EFBFBD><EFBFBD>料节点用字段 tb_doc_file内和masterId一样
|
||||
// commonFile.setPid(masterId);
|
||||
commonFile.setFilename(fileName); // 保存原始文件名用于显示
|
||||
commonFile.setType(contentType);
|
||||
@ -398,6 +403,19 @@ public class CommonFileServiceImpl implements CommonFileService {
|
||||
commonFile.setAbspath(filePath); // 保存MinIO对象名称
|
||||
commonFile.setInsdt(CommUtil.nowDate());
|
||||
commonFile.setSize((int) item.getSize());
|
||||
// 获取当前用户ID并设置
|
||||
try {
|
||||
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
||||
if (attributes != null) {
|
||||
HttpServletRequest request = attributes.getRequest();
|
||||
User cu = (User) request.getSession().getAttribute("cu");
|
||||
if (cu != null) {
|
||||
commonFile.setInsuser(cu.getId());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("无法获取当前用户信息: {}", e.getMessage());
|
||||
}
|
||||
res = this.insertByTable(tableName, commonFile);
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to update file to MinIO for masterId: {}", masterId, e);
|
||||
|
||||
@ -112,17 +112,24 @@ public class BusinessUnitAuditService implements CommService<BusinessUnitAudit>{
|
||||
}
|
||||
List<HistoricActivityInstance> list=historyService.createHistoricActivityInstanceQuery().processInstanceId(entity.getProcessid()).activityId(wortTaskId)
|
||||
.orderByHistoricActivityInstanceStartTime().desc().list();
|
||||
if (list != null && list.size()>0) {
|
||||
variables.put(CommString.ACTI_KEK_Assignee, list.get(0).getAssignee());
|
||||
if(entity.getAuditopinion()!=null && !entity.getAuditopinion().isEmpty()){
|
||||
taskService.addComment(entity.getTaskid(), entity.getProcessid(), entity.getAuditopinion());
|
||||
}
|
||||
}else {
|
||||
variables.put(CommString.ACTI_KEK_Assignee, businessUnitAdapter.getInsuser());
|
||||
if(entity.getAuditopinion()!=null && !entity.getAuditopinion().isEmpty()){
|
||||
taskService.addComment(entity.getTaskid(), entity.getProcessid(), entity.getAuditopinion());
|
||||
}
|
||||
// 优先取历史记录中的 assignee;若 assignee 为空(候选人任务未签收),则查 BusinessUnitAudit 记录获取实际提交人
|
||||
String targetAssignee = null;
|
||||
if (list != null && list.size() > 0) {
|
||||
targetAssignee = list.get(0).getAssignee();
|
||||
}
|
||||
if (targetAssignee == null && !wortTaskId.isEmpty()) {
|
||||
// 历史 assignee 为空时,从 BusinessUnitAudit 记录中查找该步骤的实际提交人
|
||||
List<BusinessUnitAudit> previousAuditList = this.selectListByWhere(
|
||||
"where businessid='" + entity.getBusinessid() + "' and taskdefinitionkey='" + wortTaskId + "' order by insdt desc");
|
||||
if (previousAuditList != null && previousAuditList.size() > 0) {
|
||||
targetAssignee = previousAuditList.get(0).getInsuser();
|
||||
}
|
||||
}
|
||||
// 设置退回目标处理人(若仍为空则由流程变量 userIds 确定候选人,不再回退到工单创建人)
|
||||
variables.put(CommString.ACTI_KEK_Assignee, targetAssignee);
|
||||
if(entity.getAuditopinion()!=null && !entity.getAuditopinion().isEmpty()){
|
||||
taskService.addComment(entity.getTaskid(), entity.getProcessid(), entity.getAuditopinion());
|
||||
}
|
||||
}
|
||||
//int res=0;
|
||||
taskService.complete(entity.getTaskid(), variables);
|
||||
@ -141,17 +148,24 @@ public class BusinessUnitAuditService implements CommService<BusinessUnitAudit>{
|
||||
BusinessUnitRecord businessUnitRecord = new BusinessUnitRecord(entity);
|
||||
if(entity.getPassstatus()){
|
||||
//通过
|
||||
if(variables.get(CommString.ACTI_KEK_Candidate_Users)!=null){
|
||||
businessUnitRecord.sendMessage(variables.get(CommString.ACTI_KEK_Candidate_Users).toString(),"");
|
||||
String candidateUsers = variables.get(CommString.ACTI_KEK_Candidate_Users) != null
|
||||
? variables.get(CommString.ACTI_KEK_Candidate_Users).toString() : null;
|
||||
if(candidateUsers != null && !candidateUsers.isEmpty()){
|
||||
// 有下一步接收人,通知下一步处理人
|
||||
businessUnitRecord.sendMessage(candidateUsers, "");
|
||||
}else if(variables.get(CommString.ACTI_KEK_AssigneeList) != null){
|
||||
// 会签
|
||||
businessUnitRecord.sendMessage(entity.getTargetusers(), "");
|
||||
}else{
|
||||
//会签
|
||||
if(variables.get(CommString.ACTI_KEK_AssigneeList)!=null){
|
||||
businessUnitRecord.sendMessage(entity.getTargetusers(),"");
|
||||
}
|
||||
// 最后一步,无下一步处理人,通知当前提交人(完成确认)
|
||||
if(entity.getInsuser() != null && !entity.getInsuser().isEmpty()){
|
||||
businessUnitRecord.sendMessage(entity.getInsuser(), "");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(variables.get(CommString.ACTI_KEK_Assignee)!=null){
|
||||
businessUnitRecord.sendMessage(variables.get(CommString.ACTI_KEK_Assignee).toString(),"");
|
||||
// 退回:通知目标处理人(排除空值,避免错误发送)
|
||||
if(variables.get(CommString.ACTI_KEK_Assignee) != null){
|
||||
businessUnitRecord.sendMessage(variables.get(CommString.ACTI_KEK_Assignee).toString(), "");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@ package com.sipai.service.report;
|
||||
|
||||
import com.sipai.entity.business.BusinessUnitAudit;
|
||||
import com.sipai.entity.report.RptCreate;
|
||||
import com.sipai.entity.user.User;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
@ -45,4 +46,11 @@ public interface RptCreateService {
|
||||
|
||||
//改变状态
|
||||
public abstract int updateStatus(String id);
|
||||
|
||||
/** 检查用户是否有报表生成权限
|
||||
* @param rptInfoSetId 报表配置id
|
||||
* @param user 当前用户
|
||||
* @return true=有权限, false=无权限
|
||||
*/
|
||||
public abstract boolean checkGeneratePermission(String rptInfoSetId, User user);
|
||||
}
|
||||
@ -60,4 +60,11 @@ public interface RptDayLogService {
|
||||
* @return
|
||||
*/
|
||||
public abstract Result onekeyAudit(String ids ,User cu,String rptdeptId);
|
||||
|
||||
/** 检查用户是否有填报权限
|
||||
* @param rptdeptId 填报配置id
|
||||
* @param user 当前用户
|
||||
* @return true=有权限, false=无权限
|
||||
*/
|
||||
public abstract boolean checkInputPermission(String rptdeptId, User user);
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@ import com.sipai.entity.report.*;
|
||||
import com.sipai.entity.scada.MPoint;
|
||||
import com.sipai.entity.scada.TempReport;
|
||||
import com.sipai.entity.user.User;
|
||||
import com.sipai.entity.user.UserJob;
|
||||
import com.sipai.entity.work.GroupDetail;
|
||||
import com.sipai.entity.work.Scheduling;
|
||||
import com.sipai.service.activiti.WorkflowProcessDefinitionService;
|
||||
@ -24,6 +25,7 @@ import com.sipai.service.report.*;
|
||||
import com.sipai.service.scada.MPointService;
|
||||
import com.sipai.service.scada.TempReportService;
|
||||
import com.sipai.service.user.UserService;
|
||||
import com.sipai.service.user.UserJobService;
|
||||
import com.sipai.service.work.GroupDetailService;
|
||||
import com.sipai.service.work.SchedulingService;
|
||||
import com.sipai.tools.*;
|
||||
@ -107,6 +109,8 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
private BusinessUnitHandleDetailService businessUnitHandleDetailService;
|
||||
@Resource
|
||||
private GroupDetailService groupDetailService;
|
||||
@Resource
|
||||
private UserJobService userJobService;
|
||||
|
||||
@Override
|
||||
public RptCreate selectById(String id) {
|
||||
@ -833,6 +837,20 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
// System.out.println("rptdt==============================================================" + rptdt);
|
||||
String rpttype = rptInfoSet.getRpttype();//报表类型
|
||||
String bucketName = "rptinfosetfile";
|
||||
String endtype = ".xls"; // 默认文件扩展名
|
||||
|
||||
// 首先确保report bucket存在
|
||||
try {
|
||||
MinioClient minioClient = new MinioClient(minioProp.getEndPoint(), minioProp.getAccessKey(), minioProp.getSecretKey());
|
||||
boolean isExist = minioClient.bucketExists("report");
|
||||
if (!isExist) {
|
||||
minioClient.makeBucket("report");
|
||||
logger.info("Created MinIO bucket: report");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to create report bucket", e);
|
||||
}
|
||||
|
||||
List<RptInfoSetFile> filelist = this.rptInfoSetFileService.selectListByWhere(" where masterid='" + rptInfoSet.getId() + "' ");
|
||||
String path = "";
|
||||
try {
|
||||
@ -843,7 +861,11 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
rptInfoSetFile.setAbspath(obj);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(e);
|
||||
logger.error("Failed to get template file from MinIO", e);
|
||||
}
|
||||
if (filelist == null || filelist.size() == 0) {
|
||||
logger.error("No template file configured for report: {}", rptInfoSet.getId());
|
||||
return null;
|
||||
}
|
||||
if (filelist != null && filelist.size() > 0) {
|
||||
// 设定Excel文件所在路径
|
||||
@ -854,7 +876,7 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
byte[] bytes_m = commonFileService.getInputStreamBytes(FileNameSpaceEnum.RptInfoSetFile.getNameSpace(), path);
|
||||
// Check if bytes_m is null or empty
|
||||
if (bytes_m == null || bytes_m.length == 0) {
|
||||
logger.error("Excel file is empty or not found: " + path);
|
||||
logger.error("Excel template file is empty or not found: {}", path);
|
||||
return null;
|
||||
}
|
||||
// 直接从本地文件创建Workbook, 从输入流创建Workbook
|
||||
@ -866,7 +888,8 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
logger.error("Failed to create workbook from file: " + path, e);
|
||||
e.printStackTrace();
|
||||
}
|
||||
String endtype = path.toLowerCase().endsWith(".xlsx") ? ".xlsx" : ".xls";
|
||||
// 更新文件扩展名(根据模板文件)
|
||||
endtype = path.toLowerCase().endsWith(".xlsx") ? ".xlsx" : ".xls";
|
||||
// 生成一个样式,用在表格数据
|
||||
CellStyle listStyle = null;
|
||||
listStyle = workbook.createCellStyle();
|
||||
@ -1374,6 +1397,10 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
//删除文件 只保留minio中的文件
|
||||
File file = new File(file3);//根据指定的文件名创建File对象
|
||||
file.delete();
|
||||
|
||||
// 保存文件路径到数据库
|
||||
rptCreate.setAbspath(showname + endtype);
|
||||
rptCreateDao.updateByPrimaryKeySelective(rptCreate);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
@ -1912,4 +1939,54 @@ public class RptCreateServiceImpl implements RptCreateService {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户是否有报表生成权限
|
||||
* @param rptInfoSetId 报表配置id
|
||||
* @param user 当前用户
|
||||
* @return true=有权限, false=无权限
|
||||
*/
|
||||
@Override
|
||||
public boolean checkGeneratePermission(String rptInfoSetId, User user) {
|
||||
if (user == null || rptInfoSetId == null || rptInfoSetId.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 管理员默认有权限
|
||||
if ("emp01".equals(user.getId())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 获取报表配置信息
|
||||
RptInfoSet rptInfoSet = rptInfoSetService.selectById4Simple(rptInfoSetId);
|
||||
if (rptInfoSet == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String userId = user.getId();
|
||||
|
||||
// 检查用户是否在createusers列表中
|
||||
String createusers = rptInfoSet.getCreateusers();
|
||||
if (createusers != null && !createusers.isEmpty()) {
|
||||
if (createusers.contains(userId)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查用户岗位是否在generate_position列表中
|
||||
String generatePosition = rptInfoSet.getGeneratePosition();
|
||||
if (generatePosition != null && !generatePosition.isEmpty()) {
|
||||
// 获取用户的所有岗位
|
||||
List<UserJob> userJobs = userJobService.selectListByWhere(" where userid='" + userId + "'");
|
||||
if (userJobs != null && !userJobs.isEmpty()) {
|
||||
for (UserJob userJob : userJobs) {
|
||||
if (generatePosition.contains(userJob.getJobid())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ import com.sipai.entity.scada.MPoint;
|
||||
import com.sipai.entity.scada.MPointExpand;
|
||||
import com.sipai.entity.scada.MPointHistory;
|
||||
import com.sipai.entity.user.User;
|
||||
import com.sipai.entity.user.UserJob;
|
||||
import com.sipai.service.msg.MsgService;
|
||||
import com.sipai.service.msg.MsgServiceImpl;
|
||||
import com.sipai.service.msg.MsgTypeService;
|
||||
@ -20,6 +21,7 @@ import com.sipai.service.scada.MPointExpandService;
|
||||
import com.sipai.service.scada.MPointHistoryService;
|
||||
import com.sipai.service.scada.MPointService;
|
||||
import com.sipai.service.user.UserService;
|
||||
import com.sipai.service.user.UserJobService;
|
||||
import com.sipai.tools.CommUtil;
|
||||
import com.sipai.tools.SpringContextUtil;
|
||||
import net.sf.json.JSONArray;
|
||||
@ -65,6 +67,8 @@ public class RptDayLogServiceImpl implements RptDayLogService {
|
||||
private MsgTypeService msgtypeService;
|
||||
@Resource
|
||||
private MPointExpandService mPointExpandService;
|
||||
@Resource
|
||||
private UserJobService userJobService;
|
||||
|
||||
@Override
|
||||
public RptDayLog selectById(String id) {
|
||||
@ -877,5 +881,69 @@ public class RptDayLogServiceImpl implements RptDayLogService {
|
||||
Result result = Result.success(1);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean checkInputPermission(String rptdeptId, User user) {
|
||||
if (rptdeptId == null || user == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RptDeptSet rptDeptSet = this.rptDeptSetService.selectById(rptdeptId);
|
||||
if (rptDeptSet == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Integer roleType = rptDeptSet.getRoleType();
|
||||
String inputuser = rptDeptSet.getInputuser();
|
||||
String inputjob = rptDeptSet.getInputjob();
|
||||
String userId = user.getId();
|
||||
|
||||
// role_type=2: 不控制权限,所有人都可以填报
|
||||
if (roleType != null && roleType == 2) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// role_type 为 null 或空字符串: 允许所有人
|
||||
if (roleType == null || roleType == 0 && (inputuser == null || inputuser.isEmpty())
|
||||
|| roleType == 1 && (inputjob == null || inputjob.isEmpty())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// role_type=0: 按用户控制权限
|
||||
if (roleType == 0) {
|
||||
if (inputuser != null && !inputuser.isEmpty()) {
|
||||
// 检查当前用户ID是否在inputuser中
|
||||
String[] userIds = inputuser.split(",");
|
||||
for (String uid : userIds) {
|
||||
if (userId.equals(uid.trim())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// role_type=1: 按岗位控制权限
|
||||
if (roleType == 1) {
|
||||
if (inputjob != null && !inputjob.isEmpty()) {
|
||||
// 获取当前用户的所有岗位
|
||||
List<UserJob> userJobs = this.userJobService.selectListByWhere("where userid = '" + userId + "'");
|
||||
if (userJobs != null && !userJobs.isEmpty()) {
|
||||
String[] jobIds = inputjob.split(",");
|
||||
for (UserJob userJob : userJobs) {
|
||||
String userJobId = userJob.getJobid();
|
||||
for (String jobId : jobIds) {
|
||||
if (userJobId != null && userJobId.equals(jobId.trim())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -47,12 +47,22 @@ public class SafetyCheckActivityService {
|
||||
if (processDefinitions == null || processDefinitions.size() == 0) {
|
||||
return Result.failed(company.getName() + "缺少该流程定义。");
|
||||
}
|
||||
// 防止重复发起:若该业务已有运行中的流程实例,则跳过,避免创建双倍待办任务
|
||||
List<org.activiti.engine.runtime.ProcessInstance> existingInstances = workflowService.getRuntimeService()
|
||||
.createProcessInstanceQuery()
|
||||
.processDefinitionKey(processKey)
|
||||
.processInstanceBusinessKey(bizId)
|
||||
.active()
|
||||
.list();
|
||||
if (existingInstances != null && !existingInstances.isEmpty()) {
|
||||
return Result.success();
|
||||
}
|
||||
// 启动流程实例
|
||||
// 设置网关条件
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put(CommString.ACTI_KEK_Condition, 1);
|
||||
map.put(CommString.ACTI_KEK_Assignee, applyUserId);
|
||||
map.put(CommString.ACTI_KEK_Candidate_Users, applyUserId);
|
||||
map.put(CommString.ACTI_KEK_Candidate_Users, "");
|
||||
|
||||
// 启动流程
|
||||
ProcessInstance processInstance = workflowService.startWorkflow(
|
||||
@ -71,7 +81,7 @@ public class SafetyCheckActivityService {
|
||||
Map<String, Object> map2 = new HashMap<>();
|
||||
map2.put(CommString.ACTI_KEK_Condition, 1);
|
||||
map2.put(CommString.ACTI_KEK_Assignee, nextUserId);
|
||||
map2.put(CommString.ACTI_KEK_Candidate_Users, nextUserId);
|
||||
map2.put(CommString.ACTI_KEK_Candidate_Users, "");
|
||||
workflowService.getTaskService().complete(task.getId(), map2);
|
||||
|
||||
return Result.success();
|
||||
@ -91,10 +101,9 @@ public class SafetyCheckActivityService {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put(CommString.ACTI_KEK_Condition, pass);
|
||||
map.put(CommString.ACTI_KEK_Assignee, nextUserId);
|
||||
map.put(CommString.ACTI_KEK_Candidate_Users, nextUserId);
|
||||
for (Task task : tasks) {
|
||||
workflowService.getTaskService().complete(task.getId(), map);
|
||||
}
|
||||
map.put(CommString.ACTI_KEK_Candidate_Users, "");
|
||||
// 只完成第一个任务,防止多任务场景下指数级创建待办(如因重复发起导致有多个并发任务时)
|
||||
workflowService.getTaskService().complete(tasks.get(0).getId(), map);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
|
||||
@ -101,6 +101,9 @@ public class SafetyFilesService implements CommService<SafetyFiles> {
|
||||
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
|
||||
List<MultipartFile> files = multipartRequest.getFiles("file");
|
||||
for (MultipartFile mfile : files) {
|
||||
if (mfile == null || mfile.getSize() == 0) {
|
||||
continue;
|
||||
}
|
||||
String suffix = mfile.getOriginalFilename().substring(mfile.getOriginalFilename().lastIndexOf("."));
|
||||
|
||||
//判断保存文件的路径是否存在
|
||||
|
||||
@ -100,44 +100,65 @@ public class SafetyFlowTaskService implements CommService<SafetyFlowTask> {
|
||||
String copyNames,
|
||||
String record) throws ServiceException {
|
||||
|
||||
SafetyFlowTask safetyFlowTask;
|
||||
SafetyFlowTask safetyFlowTask = null;
|
||||
List<SafetyFlowTask> list = selectListByWhere(" where biz_id='" + bizId + "' order by create_time desc");
|
||||
if (list != null && list.size() != 0 && list.get(0).getTaskName().equals(taskTitle)) {
|
||||
safetyFlowTask = list.get(0);
|
||||
safetyFlowTask.setIsDone(true);
|
||||
safetyFlowTask.setCopy(copyNames);
|
||||
safetyFlowTask.setDoneTime(DateUtil.toStr(null, new Date()));
|
||||
update(safetyFlowTask);
|
||||
} else if (list != null && list.size() != 0 && !list.get(0).getTaskName().equals(taskTitle)) {
|
||||
safetyFlowTask = list.get(0);
|
||||
safetyFlowTask.setIsDone(true);
|
||||
safetyFlowTask.setCopy(copyNames);
|
||||
safetyFlowTask.setDoneTime(DateUtil.toStr(null, new Date()));
|
||||
update(safetyFlowTask);
|
||||
|
||||
safetyFlowTask = new SafetyFlowTask();
|
||||
|
||||
safetyFlowTask.setId(UUID.randomUUID().toString());
|
||||
safetyFlowTask.setBizId(bizId);
|
||||
safetyFlowTask.setTaskName(taskTitle);
|
||||
safetyFlowTask.setIsDone(isDone);
|
||||
safetyFlowTask.setDoneTime(isDone ? DateUtil.toStr(null, new Date()) : null);
|
||||
safetyFlowTask.setAuditor(auditorName);
|
||||
safetyFlowTask.setCopy(copyNames);
|
||||
save(safetyFlowTask);
|
||||
|
||||
} else {
|
||||
safetyFlowTask = new SafetyFlowTask();
|
||||
|
||||
safetyFlowTask.setId(UUID.randomUUID().toString());
|
||||
safetyFlowTask.setBizId(bizId);
|
||||
safetyFlowTask.setTaskName(taskTitle);
|
||||
safetyFlowTask.setIsDone(isDone);
|
||||
safetyFlowTask.setDoneTime(isDone ? DateUtil.toStr(null, new Date()) : null);
|
||||
safetyFlowTask.setAuditor(auditorName);
|
||||
safetyFlowTask.setCopy(copyNames);
|
||||
save(safetyFlowTask);
|
||||
|
||||
// 查找是否已存在相同taskTitle的记录
|
||||
SafetyFlowTask existingTask = null;
|
||||
if (list != null && !list.isEmpty()) {
|
||||
for (SafetyFlowTask task : list) {
|
||||
if (task.getTaskName().equals(taskTitle)) {
|
||||
existingTask = task;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isDone) {
|
||||
// 标记任务为完成
|
||||
if (existingTask != null) {
|
||||
// 更新已存在的记录
|
||||
existingTask.setIsDone(true);
|
||||
existingTask.setCopy(copyNames);
|
||||
existingTask.setDoneTime(DateUtil.toStr(null, new Date()));
|
||||
update(existingTask);
|
||||
safetyFlowTask = existingTask;
|
||||
} else {
|
||||
// 创建新的完成记录
|
||||
safetyFlowTask = new SafetyFlowTask();
|
||||
safetyFlowTask.setId(UUID.randomUUID().toString());
|
||||
safetyFlowTask.setBizId(bizId);
|
||||
safetyFlowTask.setTaskName(taskTitle);
|
||||
safetyFlowTask.setIsDone(true);
|
||||
safetyFlowTask.setDoneTime(DateUtil.toStr(null, new Date()));
|
||||
safetyFlowTask.setAuditor(auditorName);
|
||||
safetyFlowTask.setCopy(copyNames);
|
||||
save(safetyFlowTask);
|
||||
}
|
||||
} else {
|
||||
// 创建待处理任务
|
||||
if (existingTask == null) {
|
||||
// 不存在才创建
|
||||
safetyFlowTask = new SafetyFlowTask();
|
||||
safetyFlowTask.setId(UUID.randomUUID().toString());
|
||||
safetyFlowTask.setBizId(bizId);
|
||||
safetyFlowTask.setTaskName(taskTitle);
|
||||
safetyFlowTask.setIsDone(false);
|
||||
safetyFlowTask.setDoneTime(null);
|
||||
safetyFlowTask.setAuditor(auditorName);
|
||||
safetyFlowTask.setCopy(copyNames);
|
||||
save(safetyFlowTask);
|
||||
} else {
|
||||
// 已存在,重置为待处理状态(用于流程回退后重新处理)
|
||||
existingTask.setIsDone(false);
|
||||
existingTask.setDoneTime(null);
|
||||
existingTask.setAuditor(auditorName);
|
||||
existingTask.setCopy(copyNames);
|
||||
update(existingTask);
|
||||
safetyFlowTask = existingTask;
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(record)) {
|
||||
SafetyFlowTaskDetail safetyFlowTaskDetail = new SafetyFlowTaskDetail();
|
||||
safetyFlowTaskDetail.setId(UUID.randomUUID().toString());
|
||||
|
||||
@ -1474,7 +1474,7 @@ public class MPointService {
|
||||
if (DateUtil.isCellDateFormatted(cell)) {
|
||||
//用于转化为日期格式
|
||||
Date d = cell.getDateCellValue();
|
||||
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
|
||||
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String cellDate = formater.format(d);
|
||||
return cellDate;
|
||||
} else {
|
||||
@ -1510,7 +1510,7 @@ public class MPointService {
|
||||
if (DateUtil.isCellDateFormatted(cell)) {
|
||||
//用于转化为日期格式
|
||||
Date d = cell.getDateCellValue();
|
||||
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
|
||||
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
String cellDate = formater.format(d);
|
||||
return cellDate;
|
||||
} else {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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<Model> 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<org.activiti.engine.repository.Model> 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<ModelNodeJob> list_model_node = modelNodeJobDao.selectListByWhere(modelNodeJob);
|
||||
HashSet<String> hs = new HashSet<String>();
|
||||
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<ModelNodeJob> listModelNode = modelNodeJobDao.selectListByWhere(modelNodeJob);
|
||||
HashSet<String> exists = new HashSet<String>();
|
||||
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;
|
||||
|
||||
138
src/main/resources/diagrams/leave/Administration_Leave.bpmn
Normal file
138
src/main/resources/diagrams/leave/Administration_Leave.bpmn
Normal file
@ -0,0 +1,138 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:activiti="http://activiti.org/bpmn"
|
||||
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
|
||||
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
|
||||
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
|
||||
targetNamespace="http://com.sipai.activiti">
|
||||
<process id="Administration_Leave" name="请假补假流程" isExecutable="true">
|
||||
<documentation>请假补假流程</documentation>
|
||||
<startEvent id="startevent1" name="Start" activiti:initiator="applyUserId"/>
|
||||
|
||||
<userTask id="sectionChiefAudit" name="科长/副科长审批" activiti:candidateUsers="#{userIds}">
|
||||
<documentation>leave_apply_section_audit</documentation>
|
||||
</userTask>
|
||||
<exclusiveGateway id="gatewaySection" name="科长审批判断"/>
|
||||
|
||||
<userTask id="managerAudit" name="分管经理审批" activiti:candidateUsers="#{userIds}">
|
||||
<documentation>leave_apply_manager_audit</documentation>
|
||||
</userTask>
|
||||
<exclusiveGateway id="gatewayManager" name="分管经理审批判断"/>
|
||||
|
||||
<userTask id="generalManagerAudit" name="总经理审批" activiti:candidateUsers="#{userIds}">
|
||||
<documentation>leave_apply_general_manager_audit</documentation>
|
||||
</userTask>
|
||||
<exclusiveGateway id="gatewayGeneralManager" name="总经理审批判断"/>
|
||||
|
||||
<userTask id="modifyApply" name="退回修改" activiti:assignee="${applicantId}">
|
||||
<documentation>leave_apply_handle</documentation>
|
||||
</userTask>
|
||||
|
||||
<endEvent id="endevent1" name="End"/>
|
||||
|
||||
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="sectionChiefAudit"/>
|
||||
<sequenceFlow id="flow2" sourceRef="sectionChiefAudit" targetRef="gatewaySection"/>
|
||||
<sequenceFlow id="flow3" name="通过" sourceRef="gatewaySection" targetRef="managerAudit">
|
||||
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass && route==1}]]></conditionExpression>
|
||||
</sequenceFlow>
|
||||
<sequenceFlow id="flow4" name="驳回" sourceRef="gatewaySection" targetRef="modifyApply">
|
||||
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass && route==0}]]></conditionExpression>
|
||||
</sequenceFlow>
|
||||
<sequenceFlow id="flow5" sourceRef="managerAudit" targetRef="gatewayManager"/>
|
||||
<sequenceFlow id="flow6" name="通过" sourceRef="gatewayManager" targetRef="generalManagerAudit">
|
||||
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass && route==1}]]></conditionExpression>
|
||||
</sequenceFlow>
|
||||
<sequenceFlow id="flow7" name="驳回" sourceRef="gatewayManager" targetRef="modifyApply">
|
||||
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass && route==0}]]></conditionExpression>
|
||||
</sequenceFlow>
|
||||
<sequenceFlow id="flow8" sourceRef="modifyApply" targetRef="sectionChiefAudit"/>
|
||||
<sequenceFlow id="flow9" sourceRef="generalManagerAudit" targetRef="gatewayGeneralManager"/>
|
||||
<sequenceFlow id="flow10" name="通过" sourceRef="gatewayGeneralManager" targetRef="endevent1">
|
||||
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${pass && route==1}]]></conditionExpression>
|
||||
</sequenceFlow>
|
||||
<sequenceFlow id="flow11" name="驳回" sourceRef="gatewayGeneralManager" targetRef="modifyApply">
|
||||
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${!pass && route==0}]]></conditionExpression>
|
||||
</sequenceFlow>
|
||||
</process>
|
||||
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_Administration_Leave">
|
||||
<bpmndi:BPMNPlane bpmnElement="Administration_Leave" id="BPMNPlane_Administration_Leave">
|
||||
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
|
||||
<omgdc:Bounds height="35.0" width="35.0" x="40.0" y="110.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="sectionChiefAudit" id="BPMNShape_sectionChiefAudit">
|
||||
<omgdc:Bounds height="55.0" width="120.0" x="110.0" y="100.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="gatewaySection" id="BPMNShape_gatewaySection">
|
||||
<omgdc:Bounds height="40.0" width="40.0" x="265.0" y="108.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="managerAudit" id="BPMNShape_managerAudit">
|
||||
<omgdc:Bounds height="55.0" width="100.0" x="350.0" y="100.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="gatewayManager" id="BPMNShape_gatewayManager">
|
||||
<omgdc:Bounds height="40.0" width="40.0" x="485.0" y="108.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="generalManagerAudit" id="BPMNShape_generalManagerAudit">
|
||||
<omgdc:Bounds height="55.0" width="100.0" x="560.0" y="100.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="gatewayGeneralManager" id="BPMNShape_gatewayGeneralManager">
|
||||
<omgdc:Bounds height="40.0" width="40.0" x="695.0" y="108.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="modifyApply" id="BPMNShape_modifyApply">
|
||||
<omgdc:Bounds height="55.0" width="100.0" x="430.0" y="220.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
|
||||
<omgdc:Bounds height="35.0" width="35.0" x="800.0" y="110.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
|
||||
<omgdi:waypoint x="75.0" y="127.0"/>
|
||||
<omgdi:waypoint x="110.0" y="127.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
|
||||
<omgdi:waypoint x="230.0" y="127.0"/>
|
||||
<omgdi:waypoint x="265.0" y="128.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
|
||||
<omgdi:waypoint x="305.0" y="128.0"/>
|
||||
<omgdi:waypoint x="350.0" y="127.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
|
||||
<omgdi:waypoint x="285.0" y="148.0"/>
|
||||
<omgdi:waypoint x="285.0" y="247.0"/>
|
||||
<omgdi:waypoint x="430.0" y="247.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
|
||||
<omgdi:waypoint x="450.0" y="127.0"/>
|
||||
<omgdi:waypoint x="485.0" y="128.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
|
||||
<omgdi:waypoint x="525.0" y="128.0"/>
|
||||
<omgdi:waypoint x="560.0" y="127.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
|
||||
<omgdi:waypoint x="505.0" y="148.0"/>
|
||||
<omgdi:waypoint x="505.0" y="247.0"/>
|
||||
<omgdi:waypoint x="530.0" y="247.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
|
||||
<omgdi:waypoint x="430.0" y="247.0"/>
|
||||
<omgdi:waypoint x="170.0" y="247.0"/>
|
||||
<omgdi:waypoint x="170.0" y="155.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
|
||||
<omgdi:waypoint x="660.0" y="127.0"/>
|
||||
<omgdi:waypoint x="695.0" y="128.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
|
||||
<omgdi:waypoint x="735.0" y="128.0"/>
|
||||
<omgdi:waypoint x="800.0" y="127.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
|
||||
<omgdi:waypoint x="715.0" y="148.0"/>
|
||||
<omgdi:waypoint x="715.0" y="247.0"/>
|
||||
<omgdi:waypoint x="530.0" y="247.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</definitions>
|
||||
127
src/main/resources/sql/add_leave_apply_module.sql
Normal file
127
src/main/resources/sql/add_leave_apply_module.sql
Normal file
@ -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
|
||||
14
src/main/resources/sql/upgrade_leave_apply_audit_man_id.sql
Normal file
14
src/main/resources/sql/upgrade_leave_apply_audit_man_id.sql
Normal file
@ -0,0 +1,14 @@
|
||||
/*
|
||||
请假补假流程审批人字段扩容脚本
|
||||
场景:
|
||||
1) audit_man_id 保存当前节点候选审批人 ID 列表
|
||||
2) 组织下候选人员较多时,原 varchar(250/500) 可能被截断
|
||||
*/
|
||||
|
||||
IF OBJECT_ID('dbo.tb_administration_leave_apply', 'U') IS NOT NULL
|
||||
AND COL_LENGTH('dbo.tb_administration_leave_apply', 'audit_man_id') IS NOT NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.tb_administration_leave_apply
|
||||
ALTER COLUMN audit_man_id varchar(max) NULL;
|
||||
END
|
||||
GO
|
||||
@ -346,6 +346,10 @@ var processSelectNodeForHandle = function(taskId){
|
||||
//选择下一节点,先选择审核结果,再选择节点
|
||||
$.post(ext.contextPath + "/activiti/workflow/getRoutesForSelect2.do", {taskId:taskId,passFlag:passFlag}, function(data) {
|
||||
$("#routeNum").empty();
|
||||
if (!data || data.length === 0) {
|
||||
console.warn('getRoutesForSelect2: no routes found for passFlag=' + passFlag);
|
||||
return;
|
||||
}
|
||||
var selelct = $("#routeNum").select2({
|
||||
data: data,
|
||||
placeholder:'请先选择审核结果',//默认文字提示
|
||||
@ -374,6 +378,10 @@ var processSelectNodeForHandle = function(taskId){
|
||||
})
|
||||
selectResult.val('').trigger("change");
|
||||
$.post(ext.contextPath + "/activiti/workflow/getRoutesForSelect2.do", {taskId:taskId,passFlag:true}, function(data) {
|
||||
if (!data || data.length === 0) {
|
||||
console.warn('getRoutesForSelect2: no routes found for passFlag=true');
|
||||
return;
|
||||
}
|
||||
var selelct = $("#routeNum").select2({
|
||||
data: data,
|
||||
placeholder:'请先选择审核结果',//默认文字提示
|
||||
|
||||
@ -116,8 +116,11 @@ var getFileListMinioPic = function (divId, status, entityId, previews, previewCo
|
||||
tbName: tbName,
|
||||
bucketName: bucketName
|
||||
}, function (data) {
|
||||
// 清空数组而不是重新赋值,这样可以保持引用不变
|
||||
previews.length = 0;
|
||||
previewConfigs.length = 0;
|
||||
|
||||
if (data.length > 0) {
|
||||
previews = new Array();
|
||||
$('#maintenancefile').show();
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var previewConfig = new Object();
|
||||
@ -133,10 +136,9 @@ var getFileListMinioPic = function (divId, status, entityId, previews, previewCo
|
||||
}
|
||||
previewConfigs.push(previewConfig);
|
||||
}
|
||||
showFileInput_new(divId, previews, previewConfigs);
|
||||
} else {
|
||||
$('#' + divId).hide();
|
||||
}
|
||||
// 无论是否有数据都重新初始化控件
|
||||
showFileInput_new(divId, previews, previewConfigs);
|
||||
}, 'json');
|
||||
};
|
||||
|
||||
|
||||
@ -174,7 +174,7 @@
|
||||
page: params.offset/params.limit+1, // 每页显示数据的开始页码
|
||||
sort: params.sort, // 要排序的字段
|
||||
order: params.order,
|
||||
search_name: $('#search_name').val(),
|
||||
// search_name: $('#search_name').val(),
|
||||
search_code: $('#search_code').val()
|
||||
}
|
||||
},
|
||||
@ -301,14 +301,14 @@
|
||||
<label class="form-label" id="companylabel">公司</label>
|
||||
<select class="form-control select2 " id="search_code" name ="search_code" style="width: 220px;"></select>
|
||||
<span class="select2-selection select2-selection--single" id="company" style="width:220px;border: none;background: transparent;" ></span>
|
||||
<div class="form-group pull-right" >
|
||||
<!-- <div class="form-group pull-right" >
|
||||
<div class="input-group input-group-sm" style="width: 250px;">
|
||||
<input type="text" id="search_name" name="search_name" class="form-control pull-right" placeholder="名称">
|
||||
<div class="input-group-btn">
|
||||
<button class="btn btn-default" onclick="dosearch();"><i class="fa fa-search"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<table id="table"></table>
|
||||
</div>
|
||||
|
||||
@ -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}'://工艺申请
|
||||
|
||||
200
src/main/webapp/jsp/administration/leaveApplyAdd.jsp
Normal file
200
src/main/webapp/jsp/administration/leaveApplyAdd.jsp
Normal file
@ -0,0 +1,200 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<style type="text/css">
|
||||
.select2-container .select2-selection--single{height:34px;line-height:34px;}
|
||||
.select2-selection__arrow{margin-top:3px;}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
function padNumber(num) {
|
||||
return num < 10 ? "0" + num : "" + num;
|
||||
}
|
||||
function formatDateValue(date) {
|
||||
return date.getFullYear() + "-" + padNumber(date.getMonth() + 1) + "-" + padNumber(date.getDate());
|
||||
}
|
||||
function normalizeDateValue(value) {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
var match = value.match(/^(\d{4}-\d{2}-\d{2})/);
|
||||
return match ? match[1] : value;
|
||||
}
|
||||
function getHalfDayIndex(period) {
|
||||
return period === "下午" ? 1 : 0;
|
||||
}
|
||||
function getDayNumber(dateText) {
|
||||
var parts = dateText.split("-");
|
||||
if (parts.length !== 3) {
|
||||
return NaN;
|
||||
}
|
||||
return Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / (24 * 60 * 60 * 1000));
|
||||
}
|
||||
function syncLeaveTimeFields() {
|
||||
var startDate = normalizeDateValue($("#startDate").val());
|
||||
var endDate = normalizeDateValue($("#endDate").val());
|
||||
var startPeriod = $("#startPeriod").val();
|
||||
var endPeriod = $("#endPeriod").val();
|
||||
$("#startDate").val(startDate);
|
||||
$("#endDate").val(endDate);
|
||||
$("#startTime").val(startDate && startPeriod ? (startDate + " " + startPeriod) : "");
|
||||
$("#endTime").val(endDate && endPeriod ? (endDate + " " + endPeriod) : "");
|
||||
}
|
||||
function calculateLeaveDays() {
|
||||
syncLeaveTimeFields();
|
||||
var startDate = $("#startDate").val();
|
||||
var endDate = $("#endDate").val();
|
||||
var startPeriod = $("#startPeriod").val();
|
||||
var endPeriod = $("#endPeriod").val();
|
||||
if (!startDate || !endDate || !startPeriod || !endPeriod) {
|
||||
$("#hours").val("");
|
||||
$("#days").val("");
|
||||
return true;
|
||||
}
|
||||
var startUnit = getDayNumber(startDate) * 2 + getHalfDayIndex(startPeriod);
|
||||
var endUnit = getDayNumber(endDate) * 2 + getHalfDayIndex(endPeriod);
|
||||
if (isNaN(startUnit) || isNaN(endUnit) || endUnit < startUnit) {
|
||||
$("#hours").val("");
|
||||
$("#days").val("");
|
||||
return false;
|
||||
}
|
||||
var halfDays = endUnit - startUnit + 1;
|
||||
var hours = halfDays * 4;
|
||||
var days = halfDays / 2;
|
||||
$("#hours").val(hours.toString());
|
||||
$("#days").val(days % 1 === 0 ? days.toString() : days.toFixed(1));
|
||||
return true;
|
||||
}
|
||||
function doSaveLeaveApply(startProcess) {
|
||||
$("#subForm").bootstrapValidator('validate');
|
||||
if ($("#subForm").data('bootstrapValidator').isValid()) {
|
||||
if (!calculateLeaveDays()) {
|
||||
showAlert('d', '结束日期时段不能早于开始日期时段');
|
||||
return;
|
||||
}
|
||||
var url = startProcess ? "/administration/leaveApply/startProcess.do" : "/administration/leaveApply/save.do";
|
||||
$.post(ext.contextPath + url, $("#subForm").serialize(), function(data) {
|
||||
if (data.res == 1) {
|
||||
closeModal('subModal');
|
||||
$("#table").bootstrapTable('refresh');
|
||||
} else if (data.res == 0) {
|
||||
showAlert('d', '操作失败');
|
||||
} else {
|
||||
showAlert('d', data.res);
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
}
|
||||
$(function(){
|
||||
$("#subForm").bootstrapValidator({
|
||||
live: 'disabled',
|
||||
fields: {
|
||||
applyType: {validators: {notEmpty: {message: '请选择申请类型'}}},
|
||||
leaveType: {validators: {notEmpty: {message: '请选择假别'}}},
|
||||
startDate: {validators: {notEmpty: {message: '请选择开始日期'}}},
|
||||
startPeriod: {validators: {notEmpty: {message: '请选择开始时段'}}},
|
||||
endDate: {validators: {notEmpty: {message: '请选择结束日期'}}},
|
||||
endPeriod: {validators: {notEmpty: {message: '请选择结束时段'}}},
|
||||
reason: {validators: {notEmpty: {message: '请填写申请事由'}}}
|
||||
}
|
||||
});
|
||||
$('#startDate,#endDate').datetimepicker({
|
||||
language: 'zh-CN',
|
||||
format: 'yyyy-mm-dd',
|
||||
startView: 'month',
|
||||
minView: 2,
|
||||
maxView: 'year',
|
||||
autoclose: true,
|
||||
todayBtn: true,
|
||||
todayHighlight: true
|
||||
}).on('changeDate', function() {
|
||||
calculateLeaveDays();
|
||||
});
|
||||
$('#startDate,#endDate,#startPeriod,#endPeriod').on('change', function() {
|
||||
calculateLeaveDays();
|
||||
});
|
||||
var today = formatDateValue(new Date());
|
||||
$("#startDate").val(today);
|
||||
$("#endDate").val(today);
|
||||
calculateLeaveDays();
|
||||
});
|
||||
</script>
|
||||
<div class="modal fade" id="subModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
|
||||
<h4 class="modal-title">新增请假补假申请</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal" id="subForm">
|
||||
<input type="hidden" name="unitId" value="${param.companyId}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">申请类型</label>
|
||||
<div class="col-sm-8">
|
||||
<select class="form-control" name="applyType">
|
||||
<option value="leave">请假</option>
|
||||
<option value="compensatory">补假</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">假别</label>
|
||||
<div class="col-sm-8">
|
||||
<select class="form-control" name="leaveType">
|
||||
<option value="annual">年假</option>
|
||||
<option value="personal">事假</option>
|
||||
<option value="sick">病假</option>
|
||||
<option value="marriage">婚假</option>
|
||||
<option value="maternity">产假</option>
|
||||
<option value="funeral">丧假</option>
|
||||
<option value="adjustment">调休</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">开始日期</label>
|
||||
<div class="col-sm-5"><input type="text" class="form-control" id="startDate" name="startDate" autocomplete="off" placeholder="请选择日期"></div>
|
||||
<div class="col-sm-3">
|
||||
<select class="form-control" id="startPeriod" name="startPeriod">
|
||||
<option value="上午">上午</option>
|
||||
<option value="下午">下午</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">结束日期</label>
|
||||
<div class="col-sm-5"><input type="text" class="form-control" id="endDate" name="endDate" autocomplete="off" placeholder="请选择日期"></div>
|
||||
<div class="col-sm-3">
|
||||
<select class="form-control" id="endPeriod" name="endPeriod">
|
||||
<option value="上午">上午</option>
|
||||
<option value="下午">下午</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" id="startTime" name="startTime">
|
||||
<input type="hidden" id="endTime" name="endTime">
|
||||
<input type="hidden" id="hours" name="hours">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">天数</label>
|
||||
<div class="col-sm-8"><input type="text" class="form-control" id="days" name="days" readonly placeholder="自动计算"></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">申请事由</label>
|
||||
<div class="col-sm-8"><textarea class="form-control" rows="3" name="reason"></textarea></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">工作交接</label>
|
||||
<div class="col-sm-8"><textarea class="form-control" rows="2" name="handoverDesc"></textarea></div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">备注</label>
|
||||
<div class="col-sm-8"><textarea class="form-control" rows="2" name="remark"></textarea></div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||
<button type="button" class="btn btn-primary" onclick="doSaveLeaveApply(false)">保存</button>
|
||||
<button type="button" class="btn btn-primary" onclick="doSaveLeaveApply(true)">发起审批</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
94
src/main/webapp/jsp/administration/leaveApplyAudit.jsp
Normal file
94
src/main/webapp/jsp/administration/leaveApplyAudit.jsp
Normal file
@ -0,0 +1,94 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<script type="text/javascript">
|
||||
function formatLeaveHalfDay(value) {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
var text = $.trim(value);
|
||||
var halfDayMatch = text.match(/^(\d{4}-\d{2}-\d{2})\s+(上午|下午)$/);
|
||||
if (halfDayMatch) {
|
||||
return halfDayMatch[1] + " " + halfDayMatch[2];
|
||||
}
|
||||
var dateTimeMatch = text.match(/^(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2})(?::\d{1,2}(?::\d{1,2})?)?(?:\.\d+)?)?$/);
|
||||
if (dateTimeMatch) {
|
||||
var hour = dateTimeMatch[2] ? parseInt(dateTimeMatch[2], 10) : 0;
|
||||
return dateTimeMatch[1] + " " + (hour >= 12 ? "下午" : "上午");
|
||||
}
|
||||
return text;
|
||||
}
|
||||
function showUser4SelectsFun() {
|
||||
var userIds= $("#targetusers").val();
|
||||
var jobIds= $("#targetjobs").val();
|
||||
$.post(ext.contextPath + '/user/userForSelectByCompany.do', {formId:"subForm",hiddenId:"targetusers",textId:"targetUsersName",userIds:userIds,jobIds:jobIds}, function(data) {
|
||||
$("#user4SelectDiv").html(data);
|
||||
openModal("user4SelectModal");
|
||||
});
|
||||
}
|
||||
function doSubmit() {
|
||||
$("#subForm").bootstrapValidator('validate');
|
||||
if ($("#subForm").data('bootstrapValidator').isValid()) {
|
||||
$.post(ext.contextPath + "/administration/leaveApply/doAudit.do", $("#subForm").serialize(), function(data) {
|
||||
if (data.res == 1) {
|
||||
closeModal('subModal');
|
||||
$("#table").bootstrapTable('refresh');
|
||||
} else {
|
||||
showAlert('d', data.res == 0 ? '操作执行失败,请重试' : data.res);
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
}
|
||||
$(function(){
|
||||
processSelectNode("${businessUnitAudit.taskid}");
|
||||
$("#subForm").bootstrapValidator({live:'disabled'});
|
||||
$("#startTimeText").text(formatLeaveHalfDay("${leaveApply.startTime}"));
|
||||
$("#endTimeText").text(formatLeaveHalfDay("${leaveApply.endTime}"));
|
||||
$.post(ext.contextPath + '/administration/leaveApply/showExecuteView.do', {id:'${leaveApply.id}',inModal:'inModal'}, function(data) {
|
||||
$("#showView").html(data);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<div class="modal fade" id="subModal">
|
||||
<div class="modal-dialog modal-xlg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
|
||||
<h4 class="modal-title">审批(${taskName})</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-7 col-xs-12">
|
||||
<form class="form-horizontal" id="subForm">
|
||||
<div class="form-group"><label class="col-sm-3 control-label">申请类型</label><div class="col-sm-8"><p class="form-control-static">${leaveApply.applyType}</p></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">假别</label><div class="col-sm-8"><p class="form-control-static">${leaveApply.leaveType}</p></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">开始时间</label><div class="col-sm-8"><p class="form-control-static" id="startTimeText"></p></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">结束时间</label><div class="col-sm-8"><p class="form-control-static" id="endTimeText"></p></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">申请事由</label><div class="col-sm-8"><p class="form-control-static">${leaveApply.reason}</p></div></div>
|
||||
<input type="hidden" name="id" value="${businessUnitAudit.id}">
|
||||
<input type="hidden" name="processid" value="${businessUnitAudit.processid}">
|
||||
<input type="hidden" name="taskid" value="${businessUnitAudit.taskid}">
|
||||
<input type="hidden" name="businessid" value="${businessUnitAudit.businessid}">
|
||||
<input type="hidden" name="unitid" value="${param.unitId}">
|
||||
<input type="hidden" name="taskdefinitionkey" value="${businessUnitAudit.taskdefinitionkey}">
|
||||
<div class="form-group"><label class="col-sm-3 control-label">审核结果</label><div class="col-sm-6"><select class="form-control select2" id="passstatus" name="passstatus"><option value=true>通过</option><option value=false>驳回</option></select></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">下一节点</label><div class="col-sm-6"><select class="form-control select2" id="routeNum" name="routeNum"></select></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">审核意见</label><div class="col-sm-6"><textarea class="form-control" rows="2" id="auditopinion" name="auditopinion">通过</textarea></div></div>
|
||||
<div id="selectUsers" class="form-group">
|
||||
<label class="col-sm-3 control-label">转至</label>
|
||||
<div class="col-sm-9">
|
||||
<input type="text" class="form-control" id="targetUsersName" name="targetUsersName" onclick="showUser4SelectsFun();" placeholder="可不选;不选时谁签收谁审批">
|
||||
<input id="targetusers" name="targetusers" type="hidden" value="">
|
||||
<input id="targetjobs" name="targetjobs" type="hidden" value="">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-md-5 col-xs-12" id="showView"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||
<button type="button" class="btn btn-primary" onclick="doSubmit()">审核</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
195
src/main/webapp/jsp/administration/leaveApplyEdit.jsp
Normal file
195
src/main/webapp/jsp/administration/leaveApplyEdit.jsp
Normal file
@ -0,0 +1,195 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<script type="text/javascript">
|
||||
function normalizeDateValue(value) {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
var match = value.match(/^(\d{4}-\d{2}-\d{2})/);
|
||||
return match ? match[1] : value;
|
||||
}
|
||||
function getHalfDayIndex(period) {
|
||||
return period === "下午" ? 1 : 0;
|
||||
}
|
||||
function getDayNumber(dateText) {
|
||||
var parts = dateText.split("-");
|
||||
if (parts.length !== 3) {
|
||||
return NaN;
|
||||
}
|
||||
return Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / (24 * 60 * 60 * 1000));
|
||||
}
|
||||
function parseLeaveTimeValue(value) {
|
||||
if (!value) {
|
||||
return {date: "", period: "上午"};
|
||||
}
|
||||
var match = value.match(/^(\d{4}-\d{2}-\d{2})\s*(上午|下午)$/);
|
||||
if (match) {
|
||||
return {date: match[1], period: match[2]};
|
||||
}
|
||||
var datetimeMatch = value.match(/^(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2})(?::\d{1,2}(?::\d{1,2})?)?(?:\.\d+)?)?$/);
|
||||
if (datetimeMatch) {
|
||||
var hour = datetimeMatch[2] ? parseInt(datetimeMatch[2], 10) : 0;
|
||||
return {date: datetimeMatch[1], period: hour >= 12 ? "下午" : "上午"};
|
||||
}
|
||||
return {date: "", period: "上午"};
|
||||
}
|
||||
function syncLeaveTimeFields() {
|
||||
var startDate = normalizeDateValue($("#startDate").val());
|
||||
var endDate = normalizeDateValue($("#endDate").val());
|
||||
var startPeriod = $("#startPeriod").val();
|
||||
var endPeriod = $("#endPeriod").val();
|
||||
$("#startDate").val(startDate);
|
||||
$("#endDate").val(endDate);
|
||||
$("#startTime").val(startDate && startPeriod ? (startDate + " " + startPeriod) : "");
|
||||
$("#endTime").val(endDate && endPeriod ? (endDate + " " + endPeriod) : "");
|
||||
}
|
||||
function calculateLeaveDays() {
|
||||
syncLeaveTimeFields();
|
||||
var startDate = $("#startDate").val();
|
||||
var endDate = $("#endDate").val();
|
||||
var startPeriod = $("#startPeriod").val();
|
||||
var endPeriod = $("#endPeriod").val();
|
||||
if (!startDate || !endDate || !startPeriod || !endPeriod) {
|
||||
$("#hours").val("");
|
||||
$("#days").val("");
|
||||
return true;
|
||||
}
|
||||
var startUnit = getDayNumber(startDate) * 2 + getHalfDayIndex(startPeriod);
|
||||
var endUnit = getDayNumber(endDate) * 2 + getHalfDayIndex(endPeriod);
|
||||
if (isNaN(startUnit) || isNaN(endUnit) || endUnit < startUnit) {
|
||||
$("#hours").val("");
|
||||
$("#days").val("");
|
||||
return false;
|
||||
}
|
||||
var halfDays = endUnit - startUnit + 1;
|
||||
var hours = halfDays * 4;
|
||||
var days = halfDays / 2;
|
||||
$("#hours").val(hours.toString());
|
||||
$("#days").val(days % 1 === 0 ? days.toString() : days.toFixed(1));
|
||||
return true;
|
||||
}
|
||||
function doUpdateLeaveApply(startProcess) {
|
||||
$("#subForm").bootstrapValidator('validate');
|
||||
if ($("#subForm").data('bootstrapValidator').isValid()) {
|
||||
if (!calculateLeaveDays()) {
|
||||
showAlert('d', '结束日期时段不能早于开始日期时段');
|
||||
return;
|
||||
}
|
||||
var url = startProcess ? "/administration/leaveApply/startProcess.do" : "/administration/leaveApply/update.do";
|
||||
$.post(ext.contextPath + url, $("#subForm").serialize(), function(data) {
|
||||
if (data.res == 1) {
|
||||
closeModal('subModal');
|
||||
$("#table").bootstrapTable('refresh');
|
||||
} else {
|
||||
showAlert('d', data.res == 0 ? '操作失败' : data.res);
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
}
|
||||
$(function(){
|
||||
$("#subForm").bootstrapValidator({
|
||||
live: 'disabled',
|
||||
fields: {
|
||||
startDate: {validators: {notEmpty: {message: '请选择开始日期'}}},
|
||||
startPeriod: {validators: {notEmpty: {message: '请选择开始时段'}}},
|
||||
endDate: {validators: {notEmpty: {message: '请选择结束日期'}}},
|
||||
endPeriod: {validators: {notEmpty: {message: '请选择结束时段'}}},
|
||||
reason: {validators: {notEmpty: {message: '请填写申请事由'}}}
|
||||
}
|
||||
});
|
||||
$('#startDate,#endDate').datetimepicker({
|
||||
language: 'zh-CN',
|
||||
format: 'yyyy-mm-dd',
|
||||
startView: 'month',
|
||||
minView: 2,
|
||||
maxView: 'year',
|
||||
autoclose: true,
|
||||
todayBtn: true,
|
||||
todayHighlight: true
|
||||
}).on('changeDate', function() {
|
||||
calculateLeaveDays();
|
||||
});
|
||||
$('#startDate,#endDate,#startPeriod,#endPeriod').on('change', function() {
|
||||
calculateLeaveDays();
|
||||
});
|
||||
var startInfo = parseLeaveTimeValue("${leaveApply.startTime}");
|
||||
var endInfo = parseLeaveTimeValue("${leaveApply.endTime}");
|
||||
$("#applyType").val("${leaveApply.applyType}");
|
||||
$("#leaveType").val("${leaveApply.leaveType}");
|
||||
$("#startDate").val(startInfo.date);
|
||||
$("#startPeriod").val(startInfo.period);
|
||||
$("#endDate").val(endInfo.date);
|
||||
$("#endPeriod").val(endInfo.period);
|
||||
calculateLeaveDays();
|
||||
});
|
||||
</script>
|
||||
<div class="modal fade" id="subModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
|
||||
<h4 class="modal-title">编辑请假补假申请</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="form-horizontal" id="subForm">
|
||||
<input type="hidden" name="id" value="${leaveApply.id}">
|
||||
<input type="hidden" name="unitId" value="${leaveApply.unitId}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">申请类型</label>
|
||||
<div class="col-sm-8">
|
||||
<select class="form-control" id="applyType" name="applyType">
|
||||
<option value="leave">请假</option>
|
||||
<option value="compensatory">补假</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">假别</label>
|
||||
<div class="col-sm-8">
|
||||
<select class="form-control" id="leaveType" name="leaveType">
|
||||
<option value="annual">年假</option>
|
||||
<option value="personal">事假</option>
|
||||
<option value="sick">病假</option>
|
||||
<option value="marriage">婚假</option>
|
||||
<option value="maternity">产假</option>
|
||||
<option value="funeral">丧假</option>
|
||||
<option value="adjustment">调休</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">开始日期</label>
|
||||
<div class="col-sm-5"><input class="form-control" id="startDate" name="startDate" autocomplete="off" placeholder="请选择日期"></div>
|
||||
<div class="col-sm-3">
|
||||
<select class="form-control" id="startPeriod" name="startPeriod">
|
||||
<option value="上午">上午</option>
|
||||
<option value="下午">下午</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">结束日期</label>
|
||||
<div class="col-sm-5"><input class="form-control" id="endDate" name="endDate" autocomplete="off" placeholder="请选择日期"></div>
|
||||
<div class="col-sm-3">
|
||||
<select class="form-control" id="endPeriod" name="endPeriod">
|
||||
<option value="上午">上午</option>
|
||||
<option value="下午">下午</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" id="startTime" name="startTime" value="${leaveApply.startTime}">
|
||||
<input type="hidden" id="endTime" name="endTime" value="${leaveApply.endTime}">
|
||||
<input type="hidden" id="hours" name="hours" value="${leaveApply.hours}">
|
||||
<div class="form-group"><label class="col-sm-3 control-label">天数</label><div class="col-sm-8"><input class="form-control" id="days" name="days" value="${leaveApply.days}" readonly placeholder="自动计算"></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">申请事由</label><div class="col-sm-8"><textarea class="form-control" rows="3" name="reason">${leaveApply.reason}</textarea></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">工作交接</label><div class="col-sm-8"><textarea class="form-control" rows="2" name="handoverDesc">${leaveApply.handoverDesc}</textarea></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">备注</label><div class="col-sm-8"><textarea class="form-control" rows="2" name="remark">${leaveApply.remark}</textarea></div></div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||
<button type="button" class="btn btn-primary" onclick="doUpdateLeaveApply(false)">保存</button>
|
||||
<button type="button" class="btn btn-primary" onclick="doUpdateLeaveApply(true)">发起审批</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
24
src/main/webapp/jsp/administration/leaveApplyExecuteView.jsp
Normal file
24
src/main/webapp/jsp/administration/leaveApplyExecuteView.jsp
Normal file
@ -0,0 +1,24 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
|
||||
<div class="modal fade" id="leaveApplyExcuteModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
<h4 class="modal-title">流程详情</h4>
|
||||
</div>
|
||||
<div class="modal-body" style="padding-left:0;padding-right:0;">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<jsp:include page="/jsp/administration/leaveApplyExecuteViewInModal.jsp"></jsp:include>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -0,0 +1,24 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
|
||||
<c:if test="${not empty processMessage}">
|
||||
<div class="alert alert-info" style="margin-bottom:10px;">${processMessage}</div>
|
||||
</c:if>
|
||||
<ul class="timeline">
|
||||
<c:forEach items="${businessUnitRecords}" var="item" varStatus="status">
|
||||
<li>
|
||||
<c:choose>
|
||||
<c:when test='${finishFlag && status.last}'>
|
||||
<i class="fa fa-check bg-blue"></i>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<i class="fa fa-clock-o bg-grey"></i>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<div class="timeline-item">
|
||||
<span class="time"><i class="fa fa-clock-o"></i> ${item.insdt.substring(0,16)}</span>
|
||||
<h3 class="timeline-header"><a href="#">${item.taskName}</a> ${item.user.caption}</h3>
|
||||
<div class="timeline-body">${item.record}</div>
|
||||
</div>
|
||||
</li>
|
||||
</c:forEach>
|
||||
</ul>
|
||||
196
src/main/webapp/jsp/administration/leaveApplyHandle.jsp
Normal file
196
src/main/webapp/jsp/administration/leaveApplyHandle.jsp
Normal file
@ -0,0 +1,196 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<script type="text/javascript">
|
||||
function normalizeDateValue(value) {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
var match = value.match(/^(\d{4}-\d{2}-\d{2})/);
|
||||
return match ? match[1] : value;
|
||||
}
|
||||
function getHalfDayIndex(period) {
|
||||
return period === "下午" ? 1 : 0;
|
||||
}
|
||||
function getDayNumber(dateText) {
|
||||
var parts = dateText.split("-");
|
||||
if (parts.length !== 3) {
|
||||
return NaN;
|
||||
}
|
||||
return Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / (24 * 60 * 60 * 1000));
|
||||
}
|
||||
function parseLeaveTimeValue(value) {
|
||||
if (!value) {
|
||||
return {date: "", period: "上午"};
|
||||
}
|
||||
var match = value.match(/^(\d{4}-\d{2}-\d{2})\s*(上午|下午)$/);
|
||||
if (match) {
|
||||
return {date: match[1], period: match[2]};
|
||||
}
|
||||
var datetimeMatch = value.match(/^(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2})(?::\d{1,2}(?::\d{1,2})?)?(?:\.\d+)?)?$/);
|
||||
if (datetimeMatch) {
|
||||
var hour = datetimeMatch[2] ? parseInt(datetimeMatch[2], 10) : 0;
|
||||
return {date: datetimeMatch[1], period: hour >= 12 ? "下午" : "上午"};
|
||||
}
|
||||
return {date: "", period: "上午"};
|
||||
}
|
||||
function syncLeaveTimeFields() {
|
||||
var startDate = normalizeDateValue($("#startDate").val());
|
||||
var endDate = normalizeDateValue($("#endDate").val());
|
||||
var startPeriod = $("#startPeriod").val();
|
||||
var endPeriod = $("#endPeriod").val();
|
||||
$("#startDate").val(startDate);
|
||||
$("#endDate").val(endDate);
|
||||
$("#startTime").val(startDate && startPeriod ? (startDate + " " + startPeriod) : "");
|
||||
$("#endTime").val(endDate && endPeriod ? (endDate + " " + endPeriod) : "");
|
||||
}
|
||||
function calculateLeaveDays() {
|
||||
syncLeaveTimeFields();
|
||||
var startDate = $("#startDate").val();
|
||||
var endDate = $("#endDate").val();
|
||||
var startPeriod = $("#startPeriod").val();
|
||||
var endPeriod = $("#endPeriod").val();
|
||||
if (!startDate || !endDate || !startPeriod || !endPeriod) {
|
||||
$("#hours").val("");
|
||||
$("#days").val("");
|
||||
return true;
|
||||
}
|
||||
var startUnit = getDayNumber(startDate) * 2 + getHalfDayIndex(startPeriod);
|
||||
var endUnit = getDayNumber(endDate) * 2 + getHalfDayIndex(endPeriod);
|
||||
if (isNaN(startUnit) || isNaN(endUnit) || endUnit < startUnit) {
|
||||
$("#hours").val("");
|
||||
$("#days").val("");
|
||||
return false;
|
||||
}
|
||||
var halfDays = endUnit - startUnit + 1;
|
||||
var hours = halfDays * 4;
|
||||
var days = halfDays / 2;
|
||||
$("#hours").val(hours.toString());
|
||||
$("#days").val(days % 1 === 0 ? days.toString() : days.toFixed(1));
|
||||
return true;
|
||||
}
|
||||
function showUser4AuditSelectsFun() {
|
||||
var userIds= $("#targetusers").val();
|
||||
var jobIds= $("#targetjobs").val();
|
||||
$.post(ext.contextPath + '/user/userForSelectByCompany.do', {formId:"subUnitForm",hiddenId:"targetusers",textId:"targetUsersName",userIds:userIds,jobIds:jobIds}, function(data) {
|
||||
$("#user4SelectDiv").html(data);
|
||||
openModal("user4SelectModal");
|
||||
});
|
||||
}
|
||||
function dosubmit() {
|
||||
$("#subForm").bootstrapValidator('validate');
|
||||
if ($("#subForm").data('bootstrapValidator').isValid()) {
|
||||
if (!calculateLeaveDays()) {
|
||||
showAlert('d', '结束时间必须大于开始时间');
|
||||
return;
|
||||
}
|
||||
var routeNum = $("#routeNum").val();
|
||||
$.post(ext.contextPath + "/administration/leaveApply/doHandle.do", $("#subForm").serialize() + "&" + $("#subUnitForm").serialize() + "&routeNum=" + routeNum, function(data) {
|
||||
if (data.res == 1) {
|
||||
closeModal('subModal');
|
||||
$("#table").bootstrapTable('refresh');
|
||||
} else {
|
||||
showAlert('d', data.res == 0 ? '保存失败' : data.res);
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
}
|
||||
$(function(){
|
||||
processSelectNodeForHandle("${businessUnitHandle.taskid}");
|
||||
$("#subForm").bootstrapValidator({live:'disabled',fields:{
|
||||
startDate:{validators:{notEmpty:{message:'请选择开始日期'}}},
|
||||
startPeriod:{validators:{notEmpty:{message:'请选择开始时段'}}},
|
||||
endDate:{validators:{notEmpty:{message:'请选择结束日期'}}},
|
||||
endPeriod:{validators:{notEmpty:{message:'请选择结束时段'}}},
|
||||
reason:{validators:{notEmpty:{message:'请填写申请事由'}}}
|
||||
}});
|
||||
$('#startDate,#endDate').datetimepicker({
|
||||
language: 'zh-CN',
|
||||
format: 'yyyy-mm-dd',
|
||||
startView: 'month',
|
||||
minView: 2,
|
||||
maxView: 'year',
|
||||
autoclose: true,
|
||||
todayBtn: true,
|
||||
todayHighlight: true
|
||||
}).on('changeDate', function() {
|
||||
calculateLeaveDays();
|
||||
});
|
||||
$('#startDate,#endDate,#startPeriod,#endPeriod').on('change', function() {
|
||||
calculateLeaveDays();
|
||||
});
|
||||
$.post(ext.contextPath + '/administration/leaveApply/showExecuteView.do', {id:'${leaveApply.id}',inModal:'inModal'}, function(data) {
|
||||
$("#showView").html(data);
|
||||
});
|
||||
var startInfo = parseLeaveTimeValue("${leaveApply.startTime}");
|
||||
var endInfo = parseLeaveTimeValue("${leaveApply.endTime}");
|
||||
$("#startDate").val(startInfo.date);
|
||||
$("#startPeriod").val(startInfo.period);
|
||||
$("#endDate").val(endInfo.date);
|
||||
$("#endPeriod").val(endInfo.period);
|
||||
calculateLeaveDays();
|
||||
});
|
||||
</script>
|
||||
<div class="modal fade" id="subModal">
|
||||
<div class="modal-dialog modal-xlg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
|
||||
<h4 class="modal-title">退回修改(${taskName})</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-7 col-xs-12">
|
||||
<form class="form-horizontal" id="subForm">
|
||||
<input type="hidden" name="id" value="${leaveApply.id}">
|
||||
<input type="hidden" name="unitId" value="${leaveApply.unitId}">
|
||||
<div class="form-group"><label class="col-sm-3 control-label">申请类型</label><div class="col-sm-8"><input class="form-control" name="applyType" value="${leaveApply.applyType}"></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">假别</label><div class="col-sm-8"><input class="form-control" name="leaveType" value="${leaveApply.leaveType}"></div></div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">开始日期</label>
|
||||
<div class="col-sm-5"><input class="form-control" id="startDate" name="startDate" autocomplete="off" placeholder="请选择日期"></div>
|
||||
<div class="col-sm-3">
|
||||
<select class="form-control" id="startPeriod" name="startPeriod">
|
||||
<option value="上午">上午</option>
|
||||
<option value="下午">下午</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-3 control-label">结束日期</label>
|
||||
<div class="col-sm-5"><input class="form-control" id="endDate" name="endDate" autocomplete="off" placeholder="请选择日期"></div>
|
||||
<div class="col-sm-3">
|
||||
<select class="form-control" id="endPeriod" name="endPeriod">
|
||||
<option value="上午">上午</option>
|
||||
<option value="下午">下午</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" id="startTime" name="startTime" value="${leaveApply.startTime}">
|
||||
<input type="hidden" id="endTime" name="endTime" value="${leaveApply.endTime}">
|
||||
<input type="hidden" id="hours" name="hours" value="${leaveApply.hours}">
|
||||
<div class="form-group"><label class="col-sm-3 control-label">天数</label><div class="col-sm-8"><input class="form-control" id="days" name="days" value="${leaveApply.days}" readonly placeholder="自动计算"></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">申请事由</label><div class="col-sm-8"><textarea class="form-control" rows="3" name="reason">${leaveApply.reason}</textarea></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">工作交接</label><div class="col-sm-8"><textarea class="form-control" rows="2" name="handoverDesc">${leaveApply.handoverDesc}</textarea></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">备注</label><div class="col-sm-8"><textarea class="form-control" rows="2" name="remark">${leaveApply.remark}</textarea></div></div>
|
||||
</form>
|
||||
<form class="form-horizontal" id="subUnitForm">
|
||||
<input type="hidden" name="id" value="${businessUnitHandle.id}">
|
||||
<input type="hidden" name="processid" value="${businessUnitHandle.processid}">
|
||||
<input type="hidden" name="taskid" value="${businessUnitHandle.taskid}">
|
||||
<input type="hidden" name="businessid" value="${businessUnitHandle.businessid}">
|
||||
<input type="hidden" name="taskdefinitionkey" value="${businessUnitHandle.taskdefinitionkey}">
|
||||
<input type="hidden" name="unitid" value="${businessUnitHandle.unitid}">
|
||||
<div class="form-group"><label class="col-sm-3 control-label">驳回意见</label><div class="col-sm-8"><textarea class="form-control" rows="2" readonly>${rejectReason}</textarea></div></div>
|
||||
<div class="form-group"><label class="col-sm-3 control-label">下一节点</label><div class="col-sm-6"><select class="form-control select2" id="routeNum" name="routeNum"></select></div></div>
|
||||
<div id="selectUsers" class="form-group"><label class="col-sm-3 control-label">提交至</label><div class="col-sm-9"><input type="text" class="form-control" id="targetUsersName" name="targetUsersName" onclick="showUser4AuditSelectsFun();" placeholder="可不选;不选时谁签收谁审批"><input id="targetusers" name="targetusers" type="hidden" value="${businessUnitHandle.targetusers}"><input id="targetjobs" name="targetjobs" type="hidden" value=""></div></div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-md-5 col-xs-12" id="showView"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||
<button type="button" class="btn btn-primary" onclick="dosubmit()">提交</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
161
src/main/webapp/jsp/administration/leaveApplyList.jsp
Normal file
161
src/main/webapp/jsp/administration/leaveApplyList.jsp
Normal file
@ -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" %>
|
||||
<jsp:include page="/jsp/inc.jsp"></jsp:include>
|
||||
<style type="text/css">
|
||||
.main-header,.content-header,.main-footer{display:none;}
|
||||
.table-hover>tbody>tr:hover{cursor:pointer;}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
var companyId = "";
|
||||
var addFun = function() {
|
||||
$.post(ext.contextPath + '/administration/leaveApply/add.do', {companyId: companyId}, function(data) {
|
||||
$("#subDiv").html(data);
|
||||
openModal('subModal');
|
||||
});
|
||||
};
|
||||
var editFun = function(id) {
|
||||
$.post(ext.contextPath + '/administration/leaveApply/edit.do', {id:id}, function(data) {
|
||||
$("#subDiv").html(data);
|
||||
openModal('subModal');
|
||||
});
|
||||
};
|
||||
var viewFun = function(id) {
|
||||
$.post(ext.contextPath + '/administration/leaveApply/view.do', {id:id}, function(data) {
|
||||
$("#subDiv").html(data);
|
||||
openModal('subModal');
|
||||
});
|
||||
};
|
||||
var processFun = function(id) {
|
||||
$.post(ext.contextPath + '/administration/leaveApply/showExecuteView.do', {id:id}, function(data) {
|
||||
$("#subDiv").html(data);
|
||||
openModal('leaveApplyExcuteModal');
|
||||
});
|
||||
};
|
||||
var showNotStartedProcessTip = function() {
|
||||
showAlert('i', '该请假单尚未发起审批流程');
|
||||
};
|
||||
var formatLeaveHalfDay = function(value) {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
var text = $.trim(value);
|
||||
var halfDayMatch = text.match(/^(\d{4}-\d{2}-\d{2})\s+(上午|下午)$/);
|
||||
if (halfDayMatch) {
|
||||
return halfDayMatch[1] + " " + halfDayMatch[2];
|
||||
}
|
||||
var dateTimeMatch = text.match(/^(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2})(?::\d{1,2}(?::\d{1,2})?)?(?:\.\d+)?)?$/);
|
||||
if (dateTimeMatch) {
|
||||
var hour = dateTimeMatch[2] ? parseInt(dateTimeMatch[2], 10) : 0;
|
||||
return dateTimeMatch[1] + " " + (hour >= 12 ? "下午" : "上午");
|
||||
}
|
||||
return text;
|
||||
};
|
||||
var applyTypeTextMap = {
|
||||
"leave": "请假",
|
||||
"compensatory": "补假"
|
||||
};
|
||||
var leaveTypeTextMap = {
|
||||
"annual": "年假",
|
||||
"personal": "事假",
|
||||
"sick": "病假",
|
||||
"marriage": "婚假",
|
||||
"maternity": "产假",
|
||||
"funeral": "丧假",
|
||||
"adjustment": "调休"
|
||||
};
|
||||
var formatApplyType = function(value) {
|
||||
return applyTypeTextMap[value] || value || "";
|
||||
};
|
||||
var formatLeaveType = function(value) {
|
||||
return leaveTypeTextMap[value] || value || "";
|
||||
};
|
||||
var formatProcessStarted = function(row) {
|
||||
return row.processdefid ? "已发起" : "未发起";
|
||||
};
|
||||
var deleteFun = function(id) {
|
||||
$.post(ext.contextPath + '/administration/leaveApply/delete.do', {id:id}, function(data) {
|
||||
if (data == 1) { $("#table").bootstrapTable('refresh'); } else { showAlert('d','删除失败','mainAlertdiv'); }
|
||||
});
|
||||
};
|
||||
var dosearch = function(){ $("#table").bootstrapTable('refresh'); };
|
||||
$(function(){
|
||||
$.post(ext.contextPath + '/user/getUnitForTree.do', {ng:''}, function(data){
|
||||
if (data.length > 0) {
|
||||
companyId = data[0].id;
|
||||
$("#search_pid").val(companyId);
|
||||
$("#cname_input").val(data[0].text);
|
||||
initFun();
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
var initFun = function() {
|
||||
$("#table").bootstrapTable({
|
||||
url: ext.contextPath + '/administration/leaveApply/getList.do',
|
||||
cache: false,
|
||||
striped: true,
|
||||
pagination: true,
|
||||
pageList: [10,20,50],
|
||||
pageSize: 10,
|
||||
pageNumber: 1,
|
||||
sidePagination: 'server',
|
||||
queryParams: function(params) {
|
||||
return {rows: params.limit,page: params.offset/params.limit+1,sort: params.sort,order: params.order,search_code: companyId,search_name: $("#search_name").val(),applyType: $("#applyType").val()};
|
||||
},
|
||||
sortName: 'insdt',
|
||||
sortOrder: 'desc',
|
||||
columns: [
|
||||
{checkbox: true},
|
||||
{field: 'applyType', title: '申请类型', align: 'center', formatter: function(value){ return formatApplyType(value); }},
|
||||
{field: 'leaveType', title: '假别', align: 'center', formatter: function(value){ return formatLeaveType(value); }},
|
||||
{field: 'startTime', title: '开始时间', align: 'center', formatter: function(value){ return formatLeaveHalfDay(value); }},
|
||||
{field: 'endTime', title: '结束时间', align: 'center', formatter: function(value){ return formatLeaveHalfDay(value); }},
|
||||
{field: 'days', title: '天数', align: 'center'},
|
||||
{field: 'auditMan', title: '审批人', align: 'center'},
|
||||
{field: 'processdefid', title: '流程状态', align: 'center', formatter: function(value,row){ return formatProcessStarted(row); }},
|
||||
{field: 'stateName', title: '状态', align: 'center'},
|
||||
{field: 'id', title: '操作', align: 'center', formatter: function(value,row,index){
|
||||
var processLink = row.processdefid
|
||||
? "<a href='javascript:processFun(\""+row.id+"\")'>流程</a>"
|
||||
: "<a href='javascript:showNotStartedProcessTip()'>未发起</a>";
|
||||
return "<a href='javascript:editFun(\""+row.id+"\")'>编辑</a> | "
|
||||
+ processLink + " | "
|
||||
+ "<a href='javascript:deleteFun(\""+row.id+"\")'>删除</a>";
|
||||
}}
|
||||
]
|
||||
});
|
||||
};
|
||||
</script>
|
||||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title><%= ServerObject.atttable.get("TOPTITLE")%></title>
|
||||
</head>
|
||||
<body>
|
||||
<section class="content">
|
||||
<div id="mainAlertdiv"></div>
|
||||
<div id="subDiv"></div>
|
||||
<div id="user4SelectDiv"></div>
|
||||
<div class="box box-primary">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">请假补假申请</h3>
|
||||
<div class="box-tools pull-right">
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick="addFun()">新增</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<form id="searchForm" class="form-inline" style="margin-bottom:10px;">
|
||||
<input type="hidden" id="search_pid">
|
||||
<input type="text" id="cname_input" class="form-control" placeholder="厂区" readonly>
|
||||
<input type="text" id="search_name" class="form-control" placeholder="事由关键字">
|
||||
<select id="applyType" class="form-control">
|
||||
<option value="">全部类型</option>
|
||||
<option value="leave">请假</option>
|
||||
<option value="compensatory">补假</option>
|
||||
</select>
|
||||
<button type="button" class="btn btn-default" onclick="dosearch()">查询</button>
|
||||
</form>
|
||||
<table id="table" class="table table-hover"></table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</body>
|
||||
47
src/main/webapp/jsp/administration/leaveApplyView.jsp
Normal file
47
src/main/webapp/jsp/administration/leaveApplyView.jsp
Normal file
@ -0,0 +1,47 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<script type="text/javascript">
|
||||
function formatLeaveHalfDay(value) {
|
||||
if (!value) {
|
||||
return "";
|
||||
}
|
||||
var text = $.trim(value);
|
||||
var halfDayMatch = text.match(/^(\d{4}-\d{2}-\d{2})\s+(上午|下午)$/);
|
||||
if (halfDayMatch) {
|
||||
return halfDayMatch[1] + " " + halfDayMatch[2];
|
||||
}
|
||||
var dateTimeMatch = text.match(/^(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2})(?::\d{1,2}(?::\d{1,2})?)?(?:\.\d+)?)?$/);
|
||||
if (dateTimeMatch) {
|
||||
var hour = dateTimeMatch[2] ? parseInt(dateTimeMatch[2], 10) : 0;
|
||||
return dateTimeMatch[1] + " " + (hour >= 12 ? "下午" : "上午");
|
||||
}
|
||||
return text;
|
||||
}
|
||||
$(function(){
|
||||
$("#viewStartTimeText").text(formatLeaveHalfDay("${leaveApply.startTime}"));
|
||||
$("#viewEndTimeText").text(formatLeaveHalfDay("${leaveApply.endTime}"));
|
||||
});
|
||||
</script>
|
||||
<div class="modal fade" id="subModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
|
||||
<h4 class="modal-title">查看申请</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<table class="table table-bordered">
|
||||
<tr><th>申请类型</th><td>${leaveApply.applyType}</td><th>假别</th><td>${leaveApply.leaveType}</td></tr>
|
||||
<tr><th>开始时间</th><td id="viewStartTimeText"></td><th>结束时间</th><td id="viewEndTimeText"></td></tr>
|
||||
<tr><th>天数</th><td>${leaveApply.days}</td><th>审批人</th><td>${leaveApply.auditMan}</td></tr>
|
||||
<tr><th>状态</th><td colspan="3">${leaveApply.stateName}</td></tr>
|
||||
<tr><th>申请事由</th><td colspan="3">${leaveApply.reason}</td></tr>
|
||||
<tr><th>工作交接</th><td colspan="3">${leaveApply.handoverDesc}</td></tr>
|
||||
<tr><th>备注</th><td colspan="3">${leaveApply.remark}</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -1,9 +1,10 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8" %>
|
||||
<script type="text/javascript">
|
||||
|
||||
var previews = new Array();
|
||||
var previewConfigs = new Array();
|
||||
var filelist = new Array();
|
||||
// 不重新定义这些变量,直接使用主页面的全局变量
|
||||
// var previews = new Array();
|
||||
// var previewConfigs = new Array();
|
||||
// var filelist = new Array();
|
||||
|
||||
//初始化fileinput控件(第一次初始化)
|
||||
function initFileInput(ctrlName, uploadUrl) {
|
||||
@ -55,9 +56,10 @@
|
||||
//导入文件上传完成之后的事件
|
||||
control.on("fileuploaded", function (event, data, previewId, index) {
|
||||
if (data.response.suc) {
|
||||
<%--getFileListMinioPic('${param.divId}','edit');--%>
|
||||
// getFileListMinioPic('abnormityFileId', 'edit', '', previews, previewConfigs);
|
||||
// 直接使用主页面的全局变量重新加载文件列表
|
||||
getFileListMinioPic('${param.divId}', 'edit', '', previews, previewConfigs);
|
||||
// 关闭上传弹窗,返回主页面
|
||||
closeModal('fileInputModal');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -354,7 +354,7 @@
|
||||
</div>--%>
|
||||
|
||||
<div class="form-group" style="margin:8px">
|
||||
<button type="button" class="btn btn-default btn-file" onclick="fileinputPic('maintenanceDetailFile')"
|
||||
<button type="button" class="btn btn-default btn-file" onclick="fileinputPic('abnormityFileId')"
|
||||
id="btn_save"><i
|
||||
class="fa fa-paperclip"></i>上传图片
|
||||
</button>
|
||||
|
||||
@ -88,7 +88,10 @@
|
||||
var checkedItems = $("#table").bootstrapTable('getSelections');
|
||||
var datas = "";
|
||||
$.each(checkedItems, function(index, item) {
|
||||
datas += item.id + ",";
|
||||
if (datas != "") {
|
||||
datas += ",";
|
||||
}
|
||||
datas += item.id;
|
||||
});
|
||||
if (datas == "") {
|
||||
showAlert('d', '请先选择记录', 'mainAlertdiv');
|
||||
|
||||
@ -115,7 +115,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
|
||||
var fileinput = function () {
|
||||
$('#file').click();
|
||||
};
|
||||
var filedel = function () {
|
||||
var filedel = function (index) {
|
||||
fileList.splice(index,1)
|
||||
$('#test').html(initFileInputView())
|
||||
};
|
||||
|
||||
@ -234,7 +234,8 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
|
||||
{
|
||||
formId: "addForm",
|
||||
hiddenId: "userId",
|
||||
textId: "userName"
|
||||
textId: "userName",
|
||||
displayDept: "true"
|
||||
}, function (data) {
|
||||
$("#user4SelectDiv").html(data);
|
||||
openModal("user4SelectModal");
|
||||
|
||||
@ -47,6 +47,11 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding: 8px;
|
||||
width: 140px;
|
||||
text-align: left;
|
||||
}
|
||||
.detail-row {
|
||||
clear: both;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
@ -253,7 +258,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
|
||||
function initdeTail(list) {
|
||||
let temp = `<div >`
|
||||
list.forEach((item, index) => {
|
||||
temp += `<div><div class="AAA">` + item.deptName + `</div>`
|
||||
temp += `<div class="detail-row"><div class="AAA">` + item.deptName + `</div>`
|
||||
temp += `<div class="AAA">` + item.userName + `</div>`
|
||||
temp += `<div class="AAA">` + item.pass + `</div>`
|
||||
temp += `<div class="AAA">` + item.time + `</div></div>`
|
||||
@ -426,7 +431,9 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label ">查看其它会签意见</label>
|
||||
<div id="deTail"></div>
|
||||
<div class="col-sm-10">
|
||||
<div id="deTail"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" style="margin-left: 39px">
|
||||
<div id="fileList"></div>
|
||||
|
||||
@ -56,7 +56,7 @@
|
||||
|
||||
//编辑用户信息
|
||||
var editUserFun = function (roleid, bizid) {
|
||||
$.post(ext.contextPath + '/user/showRoleUser.do', { roleid: roleid }, function (data) {
|
||||
$.post(ext.contextPath + '/user/showRoleUser.do', { roleid: roleid, bizid: bizid }, function (data) {
|
||||
$("#subDiv_User").html(data);
|
||||
openModal('roleUserModal');
|
||||
});
|
||||
|
||||
@ -88,9 +88,14 @@
|
||||
$("#search_pid").select2({
|
||||
ajax: {
|
||||
type:'POST',
|
||||
url: ext.contextPath +"/work/group/getListForSelect.do",
|
||||
url: ext.contextPath +"/user/getDeptByBizId4Select.do",
|
||||
dataType: 'json',
|
||||
delay: 250,
|
||||
data: function (params) {
|
||||
return {
|
||||
companyId: '${companyId}'
|
||||
};
|
||||
},
|
||||
processResults: function (data) {
|
||||
return {
|
||||
results: data
|
||||
|
||||
@ -20,7 +20,12 @@
|
||||
if(datas_name!=""){
|
||||
datas_name+=",";
|
||||
}
|
||||
datas_name+=item.caption;
|
||||
// 支持通过参数控制显示部门名称还是用户名称
|
||||
var displayField = item.caption;
|
||||
if('${param.displayDept}' === 'true' && item._pname) {
|
||||
displayField = item._pname;
|
||||
}
|
||||
datas_name+=displayField;
|
||||
});
|
||||
$('#${param.formId} #${param.hiddenId}' ).val(datas);
|
||||
$('#${param.formId} #${param.textId}').val(datas_name);
|
||||
|
||||
@ -233,12 +233,12 @@ pageEncoding="UTF-8"%>
|
||||
class="drawer-nav-icon"
|
||||
/>企业
|
||||
</div>
|
||||
<div class="drawer-nav-item" onclick="switchTab('tab-pipeline', this)">
|
||||
<!-- <div class="drawer-nav-item" onclick="switchTab('tab-pipeline', this)">
|
||||
<img
|
||||
src="<%=request.getContextPath()%>/IMG/icon_gd.png"
|
||||
class="drawer-nav-icon"
|
||||
/>管道
|
||||
</div>
|
||||
</div> -->
|
||||
<!-- <div class="drawer-nav-item" onclick="switchTab('tab-well', this)">
|
||||
<img
|
||||
src="<%=request.getContextPath()%>/IMG/icon_gj.png"
|
||||
@ -548,15 +548,6 @@ pageEncoding="UTF-8"%>
|
||||
</div>
|
||||
|
||||
<div style="max-height: 400px; overflow-y: auto" id="company-table-container">
|
||||
<div id="company-loading" style="display: none; text-align: center; padding: 20px;">
|
||||
<i class="glyphicon glyphicon-refresh" style="font-size: 24px; color: #007bff; animation: spin 1s infinite linear;"></i>
|
||||
<p style="margin-top: 10px; color: #666; font-size: 12px">数据加载中...</p>
|
||||
<style>
|
||||
@keyframes spin {
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
</style>
|
||||
</div>
|
||||
<table
|
||||
class="table table-bordered table-hover table-condensed table-custom"
|
||||
style="font-size: 12px; white-space: nowrap"
|
||||
@ -578,6 +569,10 @@ pageEncoding="UTF-8"%>
|
||||
</thead>
|
||||
<tbody id="company-table-body"></tbody>
|
||||
</table>
|
||||
<div id="company-loading" style="display: none; text-align: center; padding: 20px;">
|
||||
<i class="glyphicon glyphicon-refresh" style="font-size: 24px; color: #007bff; animation: spin 1s infinite linear;"></i>
|
||||
<p style="margin-top: 10px; color: #666; font-size: 12px">数据加载中...</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1330,7 +1325,9 @@ pageEncoding="UTF-8"%>
|
||||
// 直接返回数组
|
||||
list = res;
|
||||
}
|
||||
config.data = list.map(config.transform);
|
||||
config.data = list.map(function(item, idx) {
|
||||
return config.transform(item, idx);
|
||||
});
|
||||
config.loaded = true;
|
||||
console.log('[' + type + '] 加载完成:', config.data.length, '条');
|
||||
return config.data;
|
||||
|
||||
@ -202,9 +202,14 @@
|
||||
}, 'json');
|
||||
|
||||
//巡检模式
|
||||
var patrolType = '${param.patroltype}';
|
||||
var bizIdForPatrol = '${bizid}';
|
||||
if (!bizIdForPatrol || bizIdForPatrol === '') {
|
||||
bizIdForPatrol = unitId;
|
||||
}
|
||||
$.post(ext.contextPath + "/timeEfficiency/patrolModel/getPatrolModelList4Select3.do", {
|
||||
type: '${param.patroltype}',
|
||||
bizId: unitId
|
||||
type: patrolType,
|
||||
bizId: bizIdForPatrol
|
||||
}, function (data) {
|
||||
var selectpatrolmode_add = $("#schedulingAddModal #patrolmode").select2({
|
||||
data: data,
|
||||
|
||||
@ -134,9 +134,14 @@
|
||||
}, 'json');
|
||||
|
||||
//巡检模式
|
||||
var patrolType = '${param.patroltype}';
|
||||
var bizIdForPatrol = '${bizid}';
|
||||
if (!bizIdForPatrol || bizIdForPatrol === '') {
|
||||
bizIdForPatrol = unitId;
|
||||
}
|
||||
$.post(ext.contextPath + "/timeEfficiency/patrolModel/getPatrolModelList4Select3.do", {
|
||||
type: '${param.patroltype}',
|
||||
bizId: unitId
|
||||
type: patrolType,
|
||||
bizId: bizIdForPatrol
|
||||
}, function (data) {
|
||||
var selectpatrolmode_edit = $("#schedulingEditModal #patrolmode").select2({
|
||||
data: data,
|
||||
|
||||
@ -8,15 +8,16 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
var date = "${date}";
|
||||
var bizid = "${param.bizid}";
|
||||
var addFun = function () {
|
||||
$.post(ext.contextPath + '/work/scheduling/add.do', { date: date },
|
||||
$.post(ext.contextPath + '/work/scheduling/add.do', { date: date, bizid: bizid },
|
||||
function (data) {
|
||||
$("#addDiv").html(data);
|
||||
openModal('schedulingAddModal');
|
||||
});
|
||||
};
|
||||
var viewFun = function (id) {
|
||||
$.post(ext.contextPath + '/work/scheduling/view.do', { id: id }, function (data) {
|
||||
$.post(ext.contextPath + '/work/scheduling/view.do', { id: id, bizid: bizid }, function (data) {
|
||||
$("#viewDiv").html(data);
|
||||
openModal('schedulingEditModal');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user