Compare commits

9 Commits

Author SHA1 Message Date
0377a0cc8c 请假补假 2026-04-09 13:12:26 +08:00
ebf57c2e82 请假补假 2026-04-08 10:30:34 +08:00
6d5c8bfd65 fix(file): 优化文件上传及预览逻辑,完善当前用户信息设置 2026-04-05 22:36:07 +08:00
b9d6a7458f bug 2026-04-04 14:00:29 +08:00
784ac30847 style(webapp): 注释和调整前端页面部分元素及代码 2026-04-04 01:22:16 +08:00
b0e2e58d93 Merge branch 'deng' into deng-release
# Conflicts:
#	src/main/java/com/sipai/controller/equipment/MaintenancePlanController.java
2026-04-04 01:18:42 +08:00
dafda57a0e refactor(mpont): 优化测点查询及前端图表渲染逻辑
- 优化数据库查询测点逻辑,优先通过unitId和测点编码查询,失败后通过测点编码模糊查询
- 统一调整AJAX请求格式,规范URL拼接及回调函数编写
- 修正前端JS代码中数据解析方式,使用严格的空字符串判断
- 规范DOM选择器对应代码格式,采用双引号替换单引号
- 重构echart饼图组件配置,提升代码可读性和维护性
- 移除注释的旧版echart图表函数,精简前端代码
- 优化echart折线图、柱状图渲染,统一异步请求与数据展示流程
- 新增多点柱状图(工业生活污水流量7天日趋势)异步数据加载和渐变色样式配置
- 修复部分变量声明和函数命名规范,提升代码一致性
2026-04-04 00:51:33 +08:00
c11112b066 fix: 修复维护计划详情空指针异常并更新GIS页面数据 2026-03-31 15:49:36 +08:00
5bacfa37d4 fix: 修复jobList.jsp中companyId变量初始化顺序问题 2026-03-26 23:15:14 +08:00
43 changed files with 4522 additions and 947 deletions

19
pom.xml
View File

@ -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>

View File

@ -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);
}
}

View File

@ -17,6 +17,7 @@ import io.swagger.annotations.*;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.activiti.engine.RepositoryService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -144,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 ";
}
}
}
@ -866,6 +873,9 @@ public class UserController {
public String getUsersByIds(HttpServletRequest request, Model model) {
String userIds = request.getParameter("userIds");
List<User> list = this.userService.selectListByWhere("where id in ('" + userIds.replace(",", "','") + "') order by CHARINDEX(','+ id +',','," + userIds + ",')");
if (CollectionUtils.isNotEmpty(list)){
list = list.stream().filter(u -> StringUtils.isNotBlank(u.getId())).collect(toList());
}
JSONArray json = JSONArray.fromObject(list);
model.addAttribute("result", json);
return "result";

View File

@ -4152,8 +4152,15 @@ public class MPointController {
for (int i = 0; i < ids.length; i++) {
com.alibaba.fastjson.JSONObject jsonObject2 = new com.alibaba.fastjson.JSONObject();
//通过es查询bizid
MPoint mPoint_es = mPointService.selectById(ids[i]);
//通过数据库查询测点优先通过unitId和测点编码查询
MPoint mPoint_es = mPointService.selectById(unitId, ids[i]);
if (mPoint_es == null) {
// 尝试通过测点编码查询
List<MPoint> mPointList = mPointService.selectListByWhere(unitId, "where mpointcode='" + ids[i] + "'");
if (mPointList != null && mPointList.size() > 0) {
mPoint_es = mPointList.get(0);
}
}
if (mPoint_es != null) {
unitId = mPoint_es.getBizid();

View File

@ -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");
}
}

View File

@ -50,6 +50,8 @@ public enum ProcessType {
Administration_Reserve("Administration_Reserve","预案工作"),
/*预案*/
Administration_Temporary("Administration_Temporary","临时任务"),
/*请假补假*/
Administration_Leave("Administration_Leave","请假补假"),
/*工艺调整*/
Process_Adjustment("Process_Adjustment","工艺调整"),
/*水质化验*/

View 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;
}
}

View File

@ -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", "调休"}
};
}

View File

@ -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";
/**
* 运行模块

View File

@ -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>

View File

@ -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;
}
}
}

View File

@ -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;
@ -377,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);
@ -391,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);
@ -400,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);

View File

@ -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 {

View File

@ -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);
}

View File

@ -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;

View 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>

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -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');
};

File diff suppressed because it is too large Load Diff

View File

@ -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>

View File

@ -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}'://工艺申请

View 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>&times;</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>

View 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>&times;</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>

View 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>&times;</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>

View 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">&times;</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>

View File

@ -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>

View 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>&times;</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>

View 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>

View 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>&times;</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>

View File

@ -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');
}
});
}

View File

@ -141,9 +141,9 @@
formatter: function (value, row, index) {
var buts = "";
buts += '<security:authorize buttonUrl="equipment/location.do">';
buts += '<button class="btn btn-default btn-sm" title="定位" onclick="locationFun(\'' + row.id + '\')"><i class="fa fa-map-marker"></i><span class="hidden-md hidden-lg"> 定位</span></button>';
buts += '</security:authorize>';
// buts += '<security:authorize buttonUrl="equipment/location.do">';
// buts += '<button class="btn btn-default btn-sm" title="定位" onclick="locationFun(\'' + row.id + '\')"><i class="fa fa-map-marker"></i><span class="hidden-md hidden-lg"> 定位</span></button>';
// buts += '</security:authorize>';
buts += '<security:authorize buttonUrl="equipment/edit.do">';
buts += '<button class="btn btn-default btn-sm" title="编辑" onclick="editFun(\'' + row.id + '\')"><i class="fa fa-edit"></i><span class="hidden-md hidden-lg"> 编辑</span></button>';

View File

@ -105,16 +105,15 @@
masterId: id,
tbName: tbName
}, function (data) {
//console.info(data)
// 清空之前的配置
previews = [];
previewConfigs = [];
if (data.length > 0) {
previews = new Array();
$('#maintenancefile').show();
for (var i = 0; i < data.length; i++) {
var previewConfig = new Object();
var path = data[i].abspath;
path = path.substring(path.indexOf('webapps') + 7, path.length);
path = ext.basePath.replace(ext.contextPath, '') + path.replace(/\\/g, "\/");
;
// 预览地址添加preview=true参数让浏览器内嵌显示
var path = ext.contextPath + "/report/rptInfoSetFile/downloadFile4minio.do?id=" + data[i].id + "&tbName=" + tbName + "&preview=true";
previews.push(path);
previewConfig['width'] = '2500px';
previewConfig['caption'] = data[i].filename;

View File

@ -47,7 +47,7 @@
$("#subForm").bootstrapValidator('validate');//提交验证
//setTimeout(function(){
if ($("#subForm").data('bootstrapValidator').isValid()) {//获取验证结果,如果成功,执行下面代码
$.post(ext.contextPath + "/equipment/maintenancePlan/doupdate.do", $("#subForm").serialize(), function(data) {
$.post(ext.contextPath + "/maintenance/equipmentPlan/doupdate.do", $("#subForm").serialize(), function(data) {
if (data.res == 1){
$("#table").bootstrapTable('refresh');
closeModal("subModal");
@ -70,7 +70,7 @@
$("#subUnitForm").bootstrapValidator('validate');//提交验证
//setTimeout(function(){
if ($("#subForm").data('bootstrapValidator').isValid() && $("#subUnitForm").data('bootstrapValidator').isValid()) {//获取验证结果,如果成功,执行下面代码
$.post(ext.contextPath + "/equipment/maintenancePlan/doupdate.do", $("#subForm").serialize(), function(data) {
$.post(ext.contextPath + "/maintenance/equipmentPlan/doupdate.do", $("#subForm").serialize(), function(data) {
var routeNum = $("#routeNum").val();
if (data.res == 1){
$.post(ext.contextPath + "/equipment/maintenancePlan/submitAuditAgain.do", $("#subUnitForm").serialize()+"&routeNum="+routeNum, function(unitdata) {
@ -426,6 +426,43 @@
</div>
<div id="fileArea"></div>--%>
</form>
<!--流程审核退回后显示-->
<form class="form-horizontal" id="subUnitForm" enctype="multipart/form-data">
<input type="hidden" class="form-control" name="id" value="${businessUnitHandle.id}">
<input type="hidden" class="form-control" name="processid" value="${businessUnitHandle.processid}">
<input type="hidden" class="form-control" name="taskid" value="${businessUnitHandle.taskid}">
<input type="hidden" class="form-control" name="businessid" value="${businessUnitHandle.businessid}">
<input type="hidden" class="form-control" name="taskdefinitionkey" value="${businessUnitHandle.taskdefinitionkey}">
<input type="hidden" class="form-control" name="unitid" value="${businessUnitHandle.unitid}">
<c:if test='${not empty businessUnitAudit.auditopinion}'>
<div class="form-group">
<label class="col-sm-2 control-label">审核意见:</label>
<div class="col-sm-10">
<textarea class="form-control" id="auditopinion" name="auditopinion" rows="2" placeholder="审核意见">${businessUnitAudit.auditopinion}</textarea>
</div>
</div>
</c:if>
<div class="form-group">
<label class="col-sm-2 control-label">*下一节点</label>
<div class="col-sm-6">
<select class="form-control select2" id="routeNum" name="routeNum" style="width: 270px;">
</select>
</div>
</div>
<div id="selectUsers" class="form-group">
<label class="col-sm-2 control-label">提交至:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="targetUsersName" name="targetUsersName" placeholder="下一级人员" onclick="showUser4AuditSelectsFun();">
<input id="targetusers" name="targetusers" type="hidden" value="${businessUnitHandle.targetusers}"/>
<input class="form-control" id="targetjobs" name="targetjobs" type="hidden" value=""/>
</div>
</div>
<!-- 文件上传,显示 -->
<div class="form-group" style="margin:8px">
<button type="button" class="btn btn-default btn-file" onclick="fileinput_process()"><i class="fa fa-paperclip"></i>上传文件</button>
</div>
<div class="file-border" id="fileArea"></div>
</form>
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">关联设备</h3>

View File

@ -135,7 +135,7 @@
//配置logo
var array = eval(${jsonArray});
var verCode = true;
var bgpath = ["IMG/login/bg1.png"];
var bgpath = ["IMG/loginbp.png"];
if(array!=null && array!=undefined && array.length>0){
for(var i =0;i<array.length;i++){
var img = null;
@ -325,15 +325,9 @@
<div class="content" style="height:100%;vertical-align: middle;" id="login-content">
<!-- BEGIN 登录 FORM -->
<form class="login-form " id="loginForm">
<div class="logo row">
<!-- <div class="logo row">
<img src="IMG/login/title.png" style="width:100%;" alt="" id="login-title" />
<!-- <div class="col-lg-8 col-sm-8 col-md-8 col-xs-8">
<h5 style="color:black" class="form-title">西派埃智能</h4>
<h2 style="margin:0px">南康智慧水厂运管平台</h2>
<h4 style="color:black;margin-top:4px" >精益运行工业互联网平台</h4>
</div> -->
</div>
</div> -->
<div class="form-group">
<div id="alertDiv"></div>

View File

@ -78,7 +78,7 @@
/* 上部分区域 */
.top-section {
display: grid;
grid-template-columns: 220px 1fr 220px;
grid-template-columns: 220px 1fr 240px;
gap: 15px;
margin-bottom: 15px;
align-items: start;
@ -186,7 +186,7 @@
/* 设备运行卡片 */
.device-list {
max-height: 360px;
max-height: 343px;
overflow-y: auto;
}
@ -424,6 +424,7 @@
padding: 10px 15px;
border-top: 1px solid #f0f0f0;
background: #fafafa;
margin: 0;
}
.pagination-info {
@ -483,6 +484,127 @@
.device-list::-webkit-scrollbar-track {
background: #f1f1f1;
}
/* 企业模块样式 */
.enterprise-section {
margin-top: 15px;
}
.enterprise-stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 15px;
margin-bottom: 15px;
}
.enterprise-stat-card {
background: #fff;
border-radius: 8px;
padding: 20px;
text-align: center;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.enterprise-stat-card .stat-value {
font-size: 32px;
font-weight: bold;
color: #0c4377;
margin-bottom: 5px;
}
.enterprise-stat-card .stat-label {
font-size: 14px;
color: #666;
}
.enterprise-stat-card.primary .stat-value {
color: #378dcc;
}
.enterprise-stat-card.success .stat-value {
color: #52c41a;
}
.enterprise-stat-card.warning .stat-value {
color: #faad14;
}
.enterprise-list-wrapper {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 15px;
}
.enterprise-item {
background: #fff;
border-radius: 8px;
padding: 15px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
transition: transform 0.2s, box-shadow 0.2s;
}
.enterprise-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.12);
}
.enterprise-item-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #f0f0f0;
}
.enterprise-item-name {
font-size: 14px;
font-weight: bold;
color: #333;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 150px;
}
.enterprise-item-status {
padding: 2px 8px;
border-radius: 4px;
font-size: 12px;
}
.enterprise-item-status.online {
background: #e6f7e6;
color: #52c41a;
}
.enterprise-item-status.offline {
background: #fff1f0;
color: #ff4d4f;
}
.enterprise-item-flow {
display: flex;
justify-content: space-between;
align-items: center;
}
.enterprise-flow-label {
font-size: 12px;
color: #999;
}
.enterprise-flow-value {
font-size: 18px;
font-weight: bold;
color: #378dcc;
}
.enterprise-flow-unit {
font-size: 12px;
color: #999;
margin-left: 2px;
}
</style>
<script type="text/javascript">
// 分页配置
@ -494,17 +616,259 @@
var alarmCurrentPage = 1;
var alarmData = [];
// 接口返回的原始数据缓存
var mainConfigData = null;
// 默认unitId如果在URL中没有传递或无法从父页面获取
var defaultUnitId = '0533JS';
$(function () {
initData();
initChart();
// 如果unitId为空使用默认值或URL参数
if (!unitId || unitId === '') {
var urlParams = new URLSearchParams(window.location.search);
unitId = urlParams.get('unitId') || defaultUnitId;
}
loadMainConfig();
loadEnterpriseData();
});
// 企业模块变量
var enterpriseTotal = 0;
var enterpriseOnline = 0;
var enterpriseList = [];
// 加载企业数据
function loadEnterpriseData() {
$.ajax({
type: 'POST',
url: ext.contextPath + '/sparepart/sewage/getList.do',
data: {
page: 1,
rows: 1000,
sort: "displacement",
order: "asc",
unitId: '0533JS',
},
// async: true,
// dataType: 'json',
// globle: false,
error: function () {
// loadEnterpriseDataMock();
return false;
},
success: function (data) {
if (typeof data === "string") {
var dataList = JSON.parse(data);
if (dataList && dataList.rows) {
var list = dataList.rows || [];
enterpriseTotal = dataList.total;
enterpriseOnline = list.filter(function(item) {
return item._input;
}).length;
enterpriseList = list;
renderEnterpriseStats();
renderEnterpriseList(list);
} else {
loadEnterpriseDataMock();
}
}
}
});
}
// Mock企业数据
function loadEnterpriseDataMock() {
var mockData = [
{id: '001', text: '金山污水处理厂', attributes: {status: 'online', flow: 12580}},
{id: '002', text: '亭林污水处理厂', attributes: {status: 'online', flow: 8650}},
{id: '003', text: '朱泾污水处理厂', attributes: {status: 'online', flow: 5430}},
{id: '004', text: '枫泾污水处理厂', attributes: {status: 'offline', flow: 0}},
{id: '005', text: '廊下污水处理厂', attributes: {status: 'online', flow: 3280}},
{id: '006', text: '张堰污水处理厂', attributes: {status: 'online', flow: 4560}},
{id: '007', text: '吕巷污水处理厂', attributes: {status: 'online', flow: 2890}},
{id: '008', text: '漕泾污水处理厂', attributes: {status: 'offline', flow: 0}}
];
enterpriseTotal = mockData.length;
enterpriseOnline = mockData.filter(function(item) { return item.attributes.status === 'online'; }).length;
enterpriseList = mockData;
renderEnterpriseStats();
renderEnterpriseList(mockData);
}
// 渲染企业统计
function renderEnterpriseStats() {
$('#enterprise_total').text(enterpriseTotal);
$('#enterprise_online').text(enterpriseOnline);
$('#enterprise_offline').text(enterpriseTotal - enterpriseOnline);
// 计算总流量
var totalFlow = enterpriseList.reduce(function(sum, item) {
return sum + (item.attributes && item.attributes.flow ? item.attributes.flow : 0);
}, 0);
$('#enterprise_total_flow').text(formatNumber(totalFlow));
}
// 渲染企业列表
function renderEnterpriseList(list) {
var html = '';
list.forEach(function(item) {
var name = item.name || item.text || '--';
var status = item._input ? 'online' : 'offline';
var flow = item.attributes && item.attributes.flow ? item.attributes.flow : 0;
var statusClass = status === 'online' ? 'online' : 'offline';
var statusText = status === 'online' ? '已接入' : '未接入';
html += '<div class="enterprise-item">';
html += '<div class="enterprise-item-header">';
html += '<span class="enterprise-item-name" title="' + name + '">' + name + '</span>';
html += '<span class="enterprise-item-status ' + statusClass + '">' + statusText + '</span>';
html += '</div>';
html += '<div class="enterprise-item-flow">';
html += '<span class="enterprise-flow-label">瞬时流量</span>';
html += '<div>';
html += '<span class="enterprise-flow-value">' + formatNumber(flow) + '</span>';
html += '<span class="enterprise-flow-unit">m³/h</span>';
html += '</div>';
html += '</div>';
html += '</div>';
});
$('#enterprise_list').html(html);
}
// 格式化数字
function formatNumber(num) {
if (num === null || num === undefined) return '--';
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
// 加载主配置数据
function loadMainConfig() {
$.ajax({
type: 'GET',
url: ext.contextPath + '/base/mainConfig/getJson.do',
async: true,
data: {unitId: unitId},
globle: false,
error: function () {
console.error('获取主配置数据失败');
// // 加载失败时使用默认数据
// initData();
// initChart();
return false;
},
success: function (data) {
try {
var jsonData = eval('(' + data + ')');
if (jsonData.status === 'pass' && jsonData.mpcode) {
mainConfigData = jsonData.mpcode;
processMainConfig(jsonData.mpcode);
} else {
// initData();
// initChart();
}
} catch (e) {
console.error('解析主配置数据失败', e);
// initData();
// initChart();
}
}
});
}
// 处理主配置数据
function processMainConfig(mpcode) {
var hasChartConfig = false;
for (var i = 0; i < mpcode.length; i++) {
var item = mpcode[i];
var code = item.mpointId;
var funname = item.funName;
var divid = item.divId;
var testid = item.testId;
var type = item.type;
var mpointId = item.mpointId;
var funName = item.funName;
if (type == '${type_pro}' && funName == 'getValue') {//生产
eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')")
}
if (type == '${type_safe}') {//安全
eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')")
}
if (type == '${type_eff}') {//效率
eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')")
}
if (type == '${type_pic}') {//左上角图片
// getUnitsByUnitId4Select(unitId,funname,mpointId);
}
}
// // 根据type类型调用对应函数
// if (type === '${type_pro}' || type === '${type_safe}' || type === '${type_eff}') {
// if (funname && divid) {
// eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')");
// }
// } else if (type === 'chart') {
// // 图表类型
// hasChartConfig = true;
// if (funname === 'initChartByConfig') {
// initChartByConfig(code, divid);
// } else if (funname === 'echartMixed' || funname === 'echartColumnar1' || funname === 'echartColumnar2') {
// eval(funname + "('" + unitId + "','" + code + "','" + divid + "')");
// } else if (funname === 'echartPie') {
// eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')");
// } else if (funname) {
// eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')");
// }
// } else if (type === 'device') {
// // 设备运行状态
// initDeviceListByConfig(code, divid);
// } else if (type === 'pump') {
// // 泵站详情
// initPumpStationByConfig(item);
// } else if (type === 'process') {
// // 工艺列表
// initProcessListByConfig(code, divid);
// } else if (type === 'alarm') {
// // 告警列表
// initAlarmListByConfig(code, divid);
// }
// // 如果没有图表配置,使用默认图表
// if (!hasChartConfig) {
// initChart();
// }
// 如果没有设备配置,使用默认数据
var hasDeviceConfig = mpcode.some(function(item) { return item.type === 'device'; });
if (!hasDeviceConfig) {
initDeviceList();
}
// 如果没有泵站配置,使用默认数据
var hasPumpConfig = mpcode.some(function(item) { return item.type === 'pump'; });
if (!hasPumpConfig) {
initPumpStations();
}
// 如果没有工艺配置,使用默认数据
var hasProcessConfig = mpcode.some(function(item) { return item.type === 'process'; });
if (!hasProcessConfig) {
initProcessList();
}
// 如果没有告警配置,使用默认数据
var hasAlarmConfig = mpcode.some(function(item) { return item.type === 'alarm'; });
if (!hasAlarmConfig) {
initAlarmList();
}
}
function initData() {
// 初始化进出水累计
$('#industrial_inflow_value').text('12,580');
$('#industrial_outflow_value').text('12,380');
$('#domestic_inflow_value').text('8,650');
$('#domestic_outflow_value').text('8,450');
// 初始化进出水累计(默认值)
$('#valueProduce1_js').text('--');
$('#valueProduce2_js').text('--');
$('#valueProduce3_js').text('--');
$('#valueProduce4_js').text('--');
// 初始化设备运行列表
initDeviceList();
@ -516,32 +880,132 @@
initAlarmList();
}
// 设备列表分页配置
var devicePageSize = 20;
var deviceCurrentPage = 1;
var deviceTotal = 0;
function initDeviceList() {
loadDeviceList(1);
}
// 加载设备运行列表(分页)
function loadDeviceList(page) {
deviceCurrentPage = page;
$.ajax({
type: 'GET',
url: ext.contextPath + '/equipment/getList4EquipmentCard.do',
data: {
rows: devicePageSize,
page: page,
sort: 'equipmentcardid',
order: 'asc',
unitId: unitId,
},
async: true,
globle: false,
error: function () {
// 失败时使用默认mock数据
loadDeviceListMock();
return false;
},
success: function (data) {
if (data != null && data !== '') {
try {
var result = eval('(' + data + ')');
if (result.total !== undefined && result.rows) {
deviceTotal = result.total;
renderDeviceList('device_list', result.rows);
renderDevicePagination();
} else {
loadDeviceListMock();
}
} catch (e) {
loadDeviceListMock();
}
} else {
loadDeviceListMock();
}
}
});
}
// Mock数据接口失败时使用
function loadDeviceListMock() {
var devices = [
{name: '进水泵1#', status: 'running'},
{name: '进水泵2#', status: 'running'},
{name: '鼓风机1#', status: 'running'},
{name: '鼓风机2#', status: 'stopped'},
{name: '回流泵1#', status: 'warning'},
{name: '回流泵2#', status: 'running'},
{name: '污泥泵1#', status: 'running'},
{name: '污泥泵2#', status: 'stopped'},
{name: '提升泵1#', status: 'running'},
{name: '提升泵2#', status: 'running'}
{equipmentname: '进水泵1#', equipmentstatus: '运行'},
{equipmentname: '进水泵2#', equipmentstatus: '运行'},
{equipmentname: '鼓风机1#', equipmentstatus: '运行'},
{equipmentname: '鼓风机2#', equipmentstatus: '停止'},
{equipmentname: '回流泵1#', equipmentstatus: '异常'},
{equipmentname: '回流泵2#', equipmentstatus: '运行'},
{equipmentname: '污泥泵1#', equipmentstatus: '运行'},
{equipmentname: '污泥泵2#', equipmentstatus: '停止'},
{equipmentname: '提升泵1#', equipmentstatus: '运行'},
{equipmentname: '提升泵2#', equipmentstatus: '运行'}
];
deviceTotal = devices.length;
renderDeviceList('device_list', devices);
renderDevicePagination();
}
// 根据配置初始化设备运行列表
function initDeviceListByConfig(mpointCode, containerId) {
loadDeviceList(1);
}
// 渲染设备列表
function renderDeviceList(containerId, devices) {
var html = '';
devices.forEach(function(device) {
var statusClass = device.status === 'running' ? 'status-running' :
device.status === 'stopped' ? 'status-stopped' : 'status-warning';
var statusText = device.status === 'running' ? '运行中' :
device.status === 'stopped' ? '已停止' : '异常';
var status = device.equipmentStatusManagement.name || device.status || '';
var name = device.equipmentname || device.name || '';
// 根据状态设置样式
var statusClass = '';
var statusText = '';
if (status === '在用' || status === 'running') {
statusClass = 'status-running';
statusText = '在用';
} else if (status === '停用') {
statusClass = 'status-stopped';
statusText = '停用';
} else if (status === '异常') {
statusClass = 'status-warning';
statusText = '异常';
} else {
statusClass = 'status-stopped';
statusText = status || '运行中';
}
html += '<div class="device-item">';
html += '<span class="device-name">' + device.name + '</span>';
html += '<span class="device-name">' + name + '</span>';
html += '<span class="device-status ' + statusClass + '">' + statusText + '</span>';
html += '</div>';
});
$('#device_list').html(html);
$('#' + containerId).html(html);
}
// 渲染设备分页
function renderDevicePagination() {
var totalPages = Math.ceil(deviceTotal / devicePageSize);
// var pageInfo = '第 ' + deviceCurrentPage + '/' + totalPages + ' 页,共 ' + deviceTotal + ' 条';
var pageInfo = '第 ' + deviceCurrentPage + '/' + totalPages + '页';
var html = '<span class="pagination-info">' + pageInfo + '</span>';
html += '<div class="pagination-btns">';
// html += '<button class="pagination-btn" onclick="deviceGoToPage(1)" ' + (deviceCurrentPage === 1 ? 'disabled' : '') + '>首页</button>';
html += '<button class="pagination-btn" onclick="deviceGoToPage(' + (deviceCurrentPage - 1) + ')" ' + (deviceCurrentPage === 1 ? 'disabled' : '') + '><</button>';
html += '<button class="pagination-btn" onclick="deviceGoToPage(' + (deviceCurrentPage + 1) + ')" ' + (deviceCurrentPage >= totalPages ? 'disabled' : '') + '>></button>';
html += '</div>';
$('#device_pagination').html(html);
}
// 设备分页跳转
function deviceGoToPage(page) {
var totalPages = Math.ceil(deviceTotal / devicePageSize);
if (page < 1) page = 1;
if (page > totalPages) page = totalPages;
loadDeviceList(page);
}
function initPumpStations() {
@ -576,6 +1040,55 @@
$('#' + containerId).html(html);
}
// 根据配置初始化泵站详情
function initPumpStationByConfig(configItem) {
var code = configItem.mpointId;
var divid = configItem.divId;
var testid = configItem.testId;
var memo = configItem.memo || '';
// 解析memo获取泵站信息格式如"泵站名称:COD:氨氮"
var parts = memo.split(':');
var stationName = parts[0] || '';
var paramNames = parts.slice(1);
$.ajax({
type: 'GET',
url: ext.contextPath + '/work/mpoint/getPumpStation.do?unitId=' + unitId + '&mpointCode=' + code,
async: true,
globle: false,
error: function () {
return false;
},
success: function (data) {
if (data != null && data !== '') {
try {
var result = eval('(' + data + ')');
if (result.status === 'pass') {
// 更新水质参数
if (result.params) {
for (var key in result.params) {
$('#' + key).text(result.params[key]);
}
}
// 更新泵状态
if (result.pumps && divid) {
renderPumpList(divid, result.pumps);
}
}
} catch (e) {
console.error('解析泵站数据失败', e);
}
}
}
});
}
// 获取泵站水质参数值
function getPumpParamValue(unitId, mpointCode, valueId, textId) {
getValue(unitId, mpointCode, valueId, textId);
}
// 生成工艺列表mock数据
function generateProcessData() {
var processNames = ['粗格栅间', '细格栅间', '曝气沉砂池', '厌氧池', '缺氧池', '好氧池', '二沉池', '消毒池', '污泥浓缩池', '污泥脱水间'];
@ -596,6 +1109,41 @@
return data;
}
// 根据配置初始化工艺列表
function initProcessListByConfig(mpointCode, containerId) {
$.ajax({
type: 'GET',
url: ext.contextPath + '/work/mpoint/getProcessList.do?unitId=' + unitId + '&mpointCode=' + mpointCode,
async: true,
globle: false,
error: function () {
processData = generateProcessData();
renderProcessTable();
return false;
},
success: function (data) {
if (data != null && data !== '') {
try {
var result = eval('(' + data + ')');
if (result.status === 'pass' && result.processList) {
processData = result.processList;
renderProcessTable();
} else {
processData = generateProcessData();
renderProcessTable();
}
} catch (e) {
processData = generateProcessData();
renderProcessTable();
}
} else {
processData = generateProcessData();
renderProcessTable();
}
}
});
}
// 生成告警列表mock数据
function generateAlarmData() {
var processNames = ['粗格栅间', '细格栅间', '曝气沉砂池', '厌氧池', '缺氧池', '好氧池', '二沉池', '消毒池', '污泥浓缩池', '污泥脱水间'];
@ -620,6 +1168,41 @@
return data;
}
// 根据配置初始化告警列表
function initAlarmListByConfig(mpointCode, containerId) {
$.ajax({
type: 'GET',
url: ext.contextPath + '/work/mpoint/getAlarmList.do?unitId=' + unitId + '&mpointCode=' + mpointCode,
async: true,
globle: false,
error: function () {
alarmData = generateAlarmData();
renderAlarmTable();
return false;
},
success: function (data) {
if (data != null && data !== '') {
try {
var result = eval('(' + data + ')');
if (result.status === 'pass' && result.alarmList) {
alarmData = result.alarmList;
renderAlarmTable();
} else {
alarmData = generateAlarmData();
renderAlarmTable();
}
} catch (e) {
alarmData = generateAlarmData();
renderAlarmTable();
}
} else {
alarmData = generateAlarmData();
renderAlarmTable();
}
}
});
}
function initProcessList() {
processData = generateProcessData();
renderProcessTable();
@ -705,10 +1288,34 @@
alarmCurrentPage = page;
renderAlarmTable();
}
function initChart() {
var chart = echarts.init(document.getElementById('flow_chart'));
var option = {
// 构建图表配置项
function buildChartOption(chartData) {
var series = [];
var legendData = [];
if (chartData.series) {
chartData.series.forEach(function(item, index) {
legendData.push(item.name);
var colors = [
[{offset: 0, color: '#378dcc'}, {offset: 1, color: '#5ba3d9'}],
[{offset: 0, color: '#5b8def'}, {offset: 1, color: '#40a9ff'}],
[{offset: 0, color: '#52c41a'}, {offset: 1, color: '#73d13d'}],
[{offset: 0, color: '#2ecc71'}, {offset: 1, color: '#58d68d'}]
];
series.push({
name: item.name,
type: item.type || 'bar',
barWidth: '20%',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, colors[index % colors.length])
},
data: item.data
});
});
}
return {
tooltip: {
trigger: 'axis',
axisPointer: {
@ -716,7 +1323,7 @@
}
},
legend: {
data: ['工业进水', '工业出水', '生活进水', '生活出水'],
data: legendData,
top: 5,
textStyle: {
fontSize: 12
@ -731,7 +1338,7 @@
},
xAxis: {
type: 'category',
data: ['3/16', '3/17', '3/18', '3/19', '3/20', '3/21', '3/22'],
data: chartData.xAxis || ['3/16', '3/17', '3/18', '3/19', '3/20', '3/21', '3/22'],
axisLine: {
lineStyle: {
color: '#e8e8e8'
@ -744,7 +1351,7 @@
},
yAxis: {
type: 'value',
name: 'm³/D',
name: chartData.yAxisName || 'm³/D',
nameTextStyle: {
fontSize: 12
},
@ -764,62 +1371,8 @@
}
}
},
series: [
{
name: '工业进水',
type: 'bar',
barWidth: '20%',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{offset: 0, color: '#378dcc'},
{offset: 1, color: '#5ba3d9'}
])
},
data: [12000, 11500, 13000, 12500, 11800, 12200, 12580]
},
{
name: '工业出水',
type: 'bar',
barWidth: '20%',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{offset: 0, color: '#5b8def'},
{offset: 1, color: '#40a9ff'}
])
},
data: [11800, 11300, 12800, 12300, 11600, 12000, 12380]
},
{
name: '生活进水',
type: 'bar',
barWidth: '20%',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{offset: 0, color: '#52c41a'},
{offset: 1, color: '#73d13d'}
])
},
data: [8500, 8200, 9000, 8800, 8600, 8400, 8650]
},
{
name: '生活出水',
type: 'bar',
barWidth: '20%',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{offset: 0, color: '#2ecc71'},
{offset: 1, color: '#58d68d'}
])
},
data: [8300, 8000, 8800, 8600, 8400, 8200, 8450]
}
]
series: series
};
chart.setOption(option);
window.addEventListener('resize', function() {
chart.resize();
});
}
</script>
</head>
@ -838,19 +1391,19 @@
<div class="inflow-group-content">
<div class="inflow-item industrial-inflow">
<div class="inflow-content">
<span class="label">进水累计</span>
<span class="label" id="textProduce1_js">进水累计</span>
<div class="value-row">
<span class="value" id="industrial_inflow_value">--</span>
<span class="unit">m³</span>
<span class="value" id="valueProduce1_js">--</span>
<!-- <span class="unit">m³</span> -->
</div>
</div>
</div>
<div class="inflow-item industrial-outflow">
<div class="inflow-content">
<span class="label">出水累计</span>
<span class="label" id="textProduce2_js">出水累计</span>
<div class="value-row">
<span class="value" id="industrial_outflow_value">--</span>
<span class="unit">m³</span>
<span class="value" id="valueProduce2_js">--</span>
<!-- <span class="unit">m³</span> -->
</div>
</div>
</div>
@ -861,19 +1414,19 @@
<div class="inflow-group-content">
<div class="inflow-item domestic-inflow">
<div class="inflow-content">
<span class="label">进水累计</span>
<span class="label" id="textProduce3_js">进水累计</span>
<div class="value-row">
<span class="value" id="domestic_inflow_value">--</span>
<span class="unit">m³</span>
<span class="value" id="valueProduce3_js">--</span>
<!-- <span class="unit">m³</span> -->
</div>
</div>
</div>
<div class="inflow-item domestic-outflow">
<div class="inflow-content">
<span class="label">出水累计</span>
<span class="label" id="textProduce4_js">出水累计</span>
<div class="value-row">
<span class="value" id="domestic_outflow_value">--</span>
<span class="unit">m³</span>
<span class="value" id="valueProduce4_js">--</span>
<!-- <span class="unit">m³</span> -->
</div>
</div>
</div>
@ -887,7 +1440,7 @@
<div class="card">
<div class="card-header">污水流量7天日趋势</div>
<div class="card-body">
<div id="flow_chart" class="chart-container"></div>
<div id="myChartProduce8" class="chart-container"></div>
</div>
</div>
@ -897,6 +1450,7 @@
<div class="card-body" style="padding: 0;">
<div class="device-list" id="device_list"></div>
</div>
<div class="pagination device_pagination" id="device_pagination"></div>
</div>
</div>
@ -1011,6 +1565,39 @@
</div>
</div>
</div>
<!-- 企业模块 -->
<div class="enterprise-section">
<div class="card">
<div class="card-header">企业概况</div>
<div class="card-body">
<!-- 统计卡片 -->
<div class="enterprise-stats">
<div class="enterprise-stat-card primary">
<div class="stat-value" id="enterprise_total">--</div>
<div class="stat-label">企业总数</div>
</div>
<div class="enterprise-stat-card success">
<div class="stat-value" id="enterprise_online">--</div>
<div class="stat-label">接入总数</div>
</div>
<div class="enterprise-stat-card warning">
<div class="stat-value" id="enterprise_offline">--</div>
<div class="stat-label">离线企业</div>
</div>
<div class="enterprise-stat-card">
<div class="stat-value" id="enterprise_total_flow">--</div>
<div class="stat-label">总瞬时流量(m³/h)</div>
</div>
</div>
<!-- 企业列表 -->
<div class="enterprise-list-wrapper" id="enterprise_list">
<!-- 企业卡片将通过JS动态生成 -->
</div>
</div>
</div>
</div>
</div>
</body>

View File

@ -0,0 +1,398 @@
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page import="com.sipai.entity.base.ServerObject" %>
<%@ taglib uri="http://www.springsecurity.org/jsp" prefix="security" %>
<%@ page import="com.sipai.entity.base.MainConfig" %>
<% request.setAttribute("type_pro", MainConfig.type_pro); %>
<% request.setAttribute("type_safe", MainConfig.type_safe); %>
<% request.setAttribute("type_eff", MainConfig.type_eff); %>
<% request.setAttribute("type_pic", MainConfig.type_pic); %>
<!DOCTYPE html>
<head>
<title><%= ServerObject.atttable.get("TOPTITLE")%>
</title>
<!-- 引用页头及CSS页-->
<jsp:include page="/jsp/inc.jsp"></jsp:include>
<!-- echarts-->
<script type="text/javascript" src="<%=request.getContextPath()%>/plugins/echarts/echarts.4.1.0.min.js"
charset="utf-8"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/JS/main/main_js.js" charset="utf-8"></script>
<style>
/*
根据不同分辨率显示不同px的文字大小
*/
@media (min-width: 1080px) {
}
@media (min-width: 1550px) {
}
.fontValue {
text-align: center;
margin-top: 20px;
margin-left: 70px;
font-size: 20px;
color: #ffffff;
font-weight: bold;
}
.fontText {
margin-left: 20px;
font-size: 14px;
color: #ffffff;
font-weight: bold;
}
.carousel-inner,
.carousel-inner >.item,
.carousel-inner >.item >img{
width:100%;height:100%;
}
.carousel-caption{
cursor: pointer;
padding: 0;
background-color: RGBA(55,141,204,0.5);
bottom: 10px;
}
</style>
<script type="text/javascript">
$(function () {
firstFun();
});
window.onresize = function () {
firstFun();
}
function firstFun() {
//var height = document.documentElement.clientHeight;
var height = $(window).height();
$('#mainDiv').css('height', height);//页面加载先给高度
$.ajax({
type: 'GET',
url: ext.contextPath + '/base/mainConfig/getJson.do',
async: true,
data: {unitId: unitId},
globle: false,
error: function () {
return false;
},
success: function (data) {
var data = eval('(' + data + ')');
for (var i = 0; i < data.mpcode.length; i++) {
var code = data.mpcode[i].mpointId;
var funname = data.mpcode[i].funName;
var divid = data.mpcode[i].divId;
var testid = data.mpcode[i].testId;
var mpointId = data.mpcode[i].mpointId;
if (data.mpcode[i].type == '${type_pro}') {//生产
eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')")
}
if (data.mpcode[i].type == '${type_safe}') {//安全
eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')")
}
if (data.mpcode[i].type == '${type_eff}') {//效率
eval(funname + "('" + unitId + "','" + code + "','" + divid + "','" + testid + "')")
}
if (data.mpcode[i].type == '${type_pic}') {//左上角图片
//eval(funname + "('" + unitId + "')")
getUnitsByUnitId4Select(unitId,funname,mpointId);
}
}
//安全
// echartColumnar2(unitId, 'TH_03_FIT040001D_FLOW_C', 'myChartsafe1');
}
});
//优良差
$(".evaluateIcon").attr("src", ext.contextPath + "/IMG/main/evaluate.png");
//左上角图片
// $("#mainImg").attr("src", ext.contextPath + "/IMG/main/main.jpg");
}
</script>
</head>
<body>
<div id="mainDiv" style="background:#f1f1f1;">
<div style="float:left;height:100%;width:35%;">
<div style="float:left;height:45%;width:100%;padding:5px 5px 5px 5px;">
<div style="height:100%;width:100%;background-color:#ffffff;">
<%--图片--%>
<!-- <img src="" id="mainImg" style="width:100%;height:100%;"> -->
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" style="width:100%;height:100%;">
<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox" id="carousel-items">
</div>
<!-- Controls -->
<a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
</div>
<div style="float:left;height:55%;width:100%;padding:5px 5px 5px 5px;">
<div style="height:100%;width:100%;background-color:#ffffff;">
<div style="width:100%;height:5%;float:left;border-bottom:2px solid #67aad7;font-weight: bold;">
水量及电耗
</div>
<div style="width:100%;height:40%;float:left;">
<div style="width:48%;height:45%;float:left;background-color:#378dcc;margin:1%;">
<div class="fontValue" id="safe_value_1">-</div>
<div class="fontText" id="safe_text_1">-</div>
</div>
<div style="width:48%;height:45%;float:right;background-color:#67aad7;margin:1%;">
<div class="fontValue" id="safe_value_2">-</div>
<div class="fontText" id="safe_text_2">-</div>
</div>
<div style="width:48%;height:45%;float:left;background-color:#FACA00;margin:1%;">
<div class="fontValue" id="safe_value_3">-</div>
<div class="fontText" id="safe_text_3">-</div>
</div>
<div style="width:48%;height:45%;float:right;background-color:#66D97C;margin:1%;">
<div class="fontValue" id="safe_value_4">-</div>
<div class="fontText" id="safe_text_4">-</div>
</div>
</div>
<div style="width:100%;height:55%;float:left;padding: 5px 5px 5px 5px;">
<div style="width:100%;height:100%;float:left;">
<div style="width:100%;height:100%;float:left;" id="myChartProduce8"></div>
</div>
</div>
</div>
</div>
</div>
<div style="float:left;height:100%;width:65%;">
<div style="float:left;height:50%;width:100%;padding:5px 5px 5px 5px;">
<div style="height:100%;width:100%;background-color:#ffffff;">
<div style="width:100%;height:5%;float:left;border-bottom:2px solid #67aad7;font-weight: bold;">
一车间
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:25%;float:left;background-color:#cbe3f9;margin:6%;">
<div class="fontValue" style="color: #0c4377;" id="valueProduce1_js"></div>
<div class="fontText" style="color: #0c4377;" id="textProduce1_js"></div>
</div>
<div style="width:100%;height:25%;float:left;background-color:#badaf8;margin:6%;">
<div class="fontValue" style="color: #0c4377;" id="valueProduce2_js"></div>
<div class="fontText" style="color: #0c4377;" id="textProduce2_js"></div>
</div>
<div style="width:100%;height:25%;float:left;background-color:#73afd8;margin:6%;">
<div class="fontValue" style="color: #0c4377;" id="valueProduce3_js"></div>
<div class="fontText" style="color: #0c4377;" id="textProduce3_js"></div>
</div>
</div>
<div style="width:80%;height:100%;float:left;padding: 5px 10px 30px 10px;">
<div style="width:100%;height:100%;float:left;">
<div style="width:100%;height:3%;float:left;"></div>
<div style="width:100%;height:40%;float:left;">
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText1_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce1_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText2_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce2_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText3_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce3_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText4_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce4_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText5_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce5_js"></div>
</div>
</div>
<div style="width:100%;height:4%;float:left;"></div>
<div style="width:100%;height:40%;float:left;">
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText6_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce6_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText7_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce7_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText8_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce8_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText9_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce9_js"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText10_js">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce10_js"></div>
</div>
</div>
<div style="width:100%;height:3%;float:left;"></div>
</div>
</div>
</div>
</div>
<div style="float:left;height:50%;width:100%;padding:5px 5px 5px 5px;">
<div style="height:100%;width:100%;background-color:#ffffff;">
<div style="width:100%;height:5%;float:left;border-bottom:2px solid #67aad7;font-weight: bold;">
二车间
</div>
<div style="width:20%;height:96%;float:left;">
<div style="width:100%;height:25%;float:left;background-color:#cbe3f9;margin:6%;">
<div class="fontValue" style="color: #0c4377;" id="valueProduce1_cs"></div>
<div class="fontText" style="color: #0c4377;" id="textProduce1_cs"></div>
</div>
<div style="width:100%;height:25%;float:left;background-color:#badaf8;margin:6%;">
<div class="fontValue" style="color: #0c4377;" id="valueProduce2_cs"></div>
<div class="fontText" style="color: #0c4377;" id="textProduce2_cs"></div>
</div>
<div style="width:100%;height:25%;float:left;background-color:#73afd8;margin:6%;">
<div class="fontValue" style="color: #0c4377;" id="valueProduce3_cs"></div>
<div class="fontText" style="color: #0c4377;" id="textProduce3_cs"></div>
</div>
</div>
<div style="width:80%;height:96%;float:left;padding: 5px 10px 30px 10px;">
<div style="width:100%;height:100%;float:left;">
<div style="width:100%;height:3%;float:left;"></div>
<div style="width:100%;height:40%;float:left;">
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText1_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce1_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText2_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce2_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText3_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce3_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText4_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce4_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText5_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce5_cs"></div>
</div>
</div>
<div style="width:100%;height:4%;float:left;"></div>
<div style="width:100%;height:40%;float:left;">
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText6_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce6_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText7_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce7_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText8_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce8_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText9_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce9_cs"></div>
</div>
<div style="width:20%;height:100%;float:left;">
<div style="width:100%;height:20%;padding-top:10%;padding-right:5%;" align="center"
id="myChartProduceText10_cs">
-
</div>
<div style="width:100%;height:80%;" id="myChartProduce10_cs"></div>
</div>
</div>
<div style="width:100%;height:3%;float:left;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -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>

View File

@ -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())
};

View File

@ -354,7 +354,9 @@
var buts= '';
buts+= '<button class="btn btn-default btn-sm" title="瞬时流量" onclick="showLineFun(\'' + (row.ventNum || '') + '\', \'SSLL\')"><i class="fa fa-line-chart"></i></button>';
buts+= '<button class="btn btn-default btn-sm" title="累计流量" onclick="showLineFun(\'' + (row.ventNum || '') + '\', \'LJLL\')"><i class="fa fa-area-chart"></i></button>';
buts+= '<button class="btn btn-default btn-sm" title="查看点位" onclick="showpointFun(\'' + row.name + '\')"><i class="fa fa-check-square-o"></i></button>';
// buts+= '<button class="btn btn-default btn-sm" title="查看点位" onclick="showpointFun(\'' + row.name + '\')"><i class="fa fa-check-square-o"></i></button>';
buts+= '<security:authorize buttonUrl="sparepart/sewage/edit.do">';
buts+= '<button class="btn btn-default btn-sm" title="编辑" onclick="editFun(\'' + row.id + '\')"><i class="fa fa-edit"></i><span class="hidden-md hidden-lg"> 编辑</span></button>';
buts+= '</security:authorize>';

View File

@ -20,7 +20,10 @@
src="<%=request.getContextPath()%>/node_modules/bootstrap-switch/dist/js/bootstrap-switch.min.js"
charset="utf-8"></script>
<script type="text/javascript">
var companyId = unitId;
var companyId = '';
$(function() {
companyId = unitId;
});
var addFun = function () {
$.post(ext.contextPath + '/user/addJob.do', {companyId: companyId}, function (data) {
$("#subDiv").html(data);

View File

@ -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>
@ -1116,12 +1111,12 @@ pageEncoding="UTF-8"%>
// 泵站名称到经纬度的映射
lngLatMap: {
'卫八路泵站': { lng: 121.277502, lat: 30.720661 },
'春华泵站': { lng: 121.287567, lat: 30.727986 },
'九号泵站': { lng: 121.286513, lat: 30.716669 }
'春华泵站': { lng: 121.287567, lat: 30.727986 },
'九号泵站': { lng: 121.286513, lat: 30.716669 },
},
transform: function(item, idx) {
var name = item.text || item.name || '';
var lngLat = this.lngLatMap[name] || { lng: 121.32 + idx * 0.01, lat: 30.76 - idx * 0.005 };
var lngLat = this.lngLatMap[name] ? this.lngLatMap[name] : { lng: 121.32 + idx * 0.01, lat: 30.76 - idx * 0.005 };
return {
id: item.id || 'pump_' + idx,
name: name,
@ -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;
@ -1605,7 +1602,7 @@ pageEncoding="UTF-8"%>
var item = dataConfig.company.data[index];
if (!item || !item.lng || !item.lat) return;
map.panTo(new T.LngLat(item.lng, item.lat));
map.setZoom(15);
map.setZoom(16);
selectMarker(item.name, 'company');
}