diff --git a/src/main/java/com/sipai/controller/activiti/ActivitiController.java b/src/main/java/com/sipai/controller/activiti/ActivitiController.java index ea82d57b..d5a88e32 100644 --- a/src/main/java/com/sipai/controller/activiti/ActivitiController.java +++ b/src/main/java/com/sipai/controller/activiti/ActivitiController.java @@ -492,24 +492,24 @@ public class ActivitiController { } } - // 当 passFlag=false 过滤后返回空列表(即未识别到退回路径),则作为备用方案返回全部路径 - if (list.isEmpty() && !pFlag && totalCount > 0) { + // 当过滤后返回空列表,则作为备用方案返回全部路径 + if (list.isEmpty() && totalCount > 0) { list = workflowProcessDefinitionService.getNextWorkTasks(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); } - JSONArray jsonArray = new JSONArray(); - if (list != null && list.size() > 0) { - for (WorkTask workTask : list) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("id", workTask.getRouteNum()); - jsonObject.put("text", workTask.getName()); - jsonObject.put("resourceId", workTask.getId()); - jsonObject.put("modelKEY", workTask.getPd_key()); - jsonArray.add(jsonObject); - } - - } - model.addAttribute("result", jsonArray.toString()); } + JSONArray jsonArray = new JSONArray(); + if (list != null && list.size() > 0) { + for (WorkTask workTask : list) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", workTask.getRouteNum()); + jsonObject.put("text", workTask.getName()); + jsonObject.put("resourceId", workTask.getId()); + jsonObject.put("modelKEY", workTask.getPd_key()); + jsonArray.add(jsonObject); + } + + } + model.addAttribute("result", jsonArray.toString()); return "result"; } diff --git a/src/main/java/com/sipai/controller/administration/AttendanceController.java b/src/main/java/com/sipai/controller/administration/AttendanceController.java index 401fc54d..1993ad8d 100644 --- a/src/main/java/com/sipai/controller/administration/AttendanceController.java +++ b/src/main/java/com/sipai/controller/administration/AttendanceController.java @@ -17,7 +17,18 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - +//curl --location 'http://127.0.0.1:8090/dh-netsdk/attendance/getDailyRecordList' \ +// header 'Content-Type: application/json' \ +// header 'Dh-Device-Ip: 192.168.1.108' \ +// header 'Dh-Device-User: admin' \ +// header 'Dh-Device-Port: 37777' \ +// header 'Dh-Device-Timestamp: {{dhTs}}' \ +// header 'Dh-Device-Password: {{dhEncPwd}}' \ +// data '{ +// "day": "2026-04-28", +// "pageNum": 1, +// "pageSize": 20 +// }' @Controller @RequestMapping("/administration/attendance") public class AttendanceController { diff --git a/src/main/java/com/sipai/controller/report/RptCreateController.java b/src/main/java/com/sipai/controller/report/RptCreateController.java index f8e23e36..1a4205f3 100644 --- a/src/main/java/com/sipai/controller/report/RptCreateController.java +++ b/src/main/java/com/sipai/controller/report/RptCreateController.java @@ -404,14 +404,20 @@ public class RptCreateController { @RequestMapping("/doaddMore.do") public String doaddMore(HttpServletRequest request, Model model) { User cu = (User) request.getSession().getAttribute("cu"); + if (cu == null) { + model.addAttribute("result", "{\"res\":\"用户未登录\",\"msg\":\"用户未登录\"}"); + return "result"; + } request.setAttribute("userId", cu.getId()); request.setAttribute("userName", cu.getCaption()); request.setAttribute("id", CommUtil.getUUID()); String rpttype = request.getParameter("rpttype"); if (RptInfoSet.RptType_Day.equals(rpttype)) { request.setAttribute("dateD", CommUtil.nowDate().substring(0, 10)); - } else if (RptInfoSet.RptType_Month.equals(rpttype) || RptInfoSet.RptType_Quarterly.equals(rpttype) || RptInfoSet.RptType_HalfYear.equals(rpttype)) { - request.setAttribute("dateD", CommUtil.nowDate().substring(0, 7)); + } else if (RptInfoSet.RptType_Month.equals(rpttype) || RptInfoSet.RptType_HalfYear.equals(rpttype)) { + request.setAttribute("dateM", CommUtil.nowDate().substring(0, 7)); + } else if (RptInfoSet.RptType_Quarterly.equals(rpttype)) { + request.setAttribute("dateQ", CommUtil.nowDate().substring(0, 7)); } else if (RptInfoSet.RptType_Year.equals(rpttype)) { request.setAttribute("dateY", CommUtil.nowDate().substring(0, 4)); } diff --git a/src/main/java/com/sipai/controller/safety/SafetyCheckComprehensiveController.java b/src/main/java/com/sipai/controller/safety/SafetyCheckComprehensiveController.java index f277c57f..433aedf6 100644 --- a/src/main/java/com/sipai/controller/safety/SafetyCheckComprehensiveController.java +++ b/src/main/java/com/sipai/controller/safety/SafetyCheckComprehensiveController.java @@ -114,6 +114,8 @@ public class SafetyCheckComprehensiveController { model.addAttribute("checkItemList", SafetyCheckItemComprehensiveEnum.getAllEnableType4JSON()); //检查结果下拉 model.addAttribute("checkResultList", SafetyCheckResultEnum.getAllEnableType4JSON()); + // 预生成ID,用于附件上传 + model.addAttribute("preId", UUID.randomUUID().toString()); return "safety/SafetyCheckComprehensiveAdd"; } @@ -126,13 +128,10 @@ public class SafetyCheckComprehensiveController { @RequestMapping("/save.do") @ResponseBody @Transactional(rollbackFor = Exception.class) - public Result save(HttpServletRequest request, SafetyCheckComprehensive bean, MultipartFile[] multipartFiles) throws Exception { + public Result save(HttpServletRequest request, SafetyCheckComprehensive bean) throws Exception { User cu = (User) request.getSession().getAttribute("cu"); - bean.setId(UUID.randomUUID().toString()); - if (multipartFiles != null) { - for (MultipartFile file : multipartFiles) { - safetyFilesService.upload(request, file, SafetyFunctionEnum.SAFETY_CHECK_COMPREHENSIVE.getId(), SafetyCheckStatusEnum.APPLY.getId(), bean.getId()); - } + if (StringUtils.isEmpty(bean.getId())) { + bean.setId(UUID.randomUUID().toString()); } bean.setCheckCode(safetySeqService.code(request, SafetyFunctionEnum.SAFETY_CHECK_COMPREHENSIVE)); if (bean.getCheckResult() == SafetyCheckResultEnum.OK.getId()) { @@ -156,12 +155,12 @@ public class SafetyCheckComprehensiveController { @RequestMapping("/saveApply.do") @ResponseBody @Transactional(rollbackFor = Exception.class) - public Result saveApply(HttpServletRequest request, SafetyCheckComprehensive bean, MultipartFile[] file) throws Exception { + public Result saveApply(HttpServletRequest request, SafetyCheckComprehensive bean) throws Exception { if (StringUtils.isEmpty(bean.getDutyUserId())) { return Result.failed("整改负责人不能为空!"); } - save(request, bean, file); + save(request, bean); // 不相符的才提交申请 if (bean.getCheckResult() == SafetyCheckResultEnum.NOT_OK.getId()) { safetyCheckActivityService.apply(bean.getCreateUserId(), bean.getDutyUserId(), ProcessType.SAFETY_CHECK_COMPREHENSIVE, bean.getId()); diff --git a/src/main/java/com/sipai/service/activiti/WorkflowProcessDefinitionService.java b/src/main/java/com/sipai/service/activiti/WorkflowProcessDefinitionService.java index 7898e0e6..2326ab47 100644 --- a/src/main/java/com/sipai/service/activiti/WorkflowProcessDefinitionService.java +++ b/src/main/java/com/sipai/service/activiti/WorkflowProcessDefinitionService.java @@ -284,22 +284,8 @@ public class WorkflowProcessDefinitionService { String id = activityImpl.getId(); if(taskDefinitionKey.toLowerCase().equals(id.toLowerCase())){ System.out.println("当前执行的任务:"+activityImpl.getProperty("name")); - //获取从某个节点出来的所有子节点-网关 - List outTransitions_gw = activityImpl.getOutgoingTransitions(); - for(PvmTransition tr_gw:outTransitions_gw){ - //获取线路的终点节点-网关 - PvmActivity ac_gw = tr_gw.getDestination(); - if(ac_gw.getProperty("type").equals("userTask") || ac_gw.getProperty("type").equals("endEvent")){ - activityImpls.add((ActivityImpl)ac_gw); - }else{ - List outTransitions =ac_gw.getOutgoingTransitions(); - for(PvmTransition tr:outTransitions){ - PvmActivity ac = tr.getDestination(); - ActivityImpl itemActivityImpl =(ActivityImpl)ac; - activityImpls.add(itemActivityImpl); - } - } - } + //获取从某个节点出来的所有子节点(递归处理多层网关嵌套) + collectNextActivities(activityImpl.getOutgoingTransitions(), activityImpls); break; } } @@ -318,27 +304,37 @@ public class WorkflowProcessDefinitionService { if (taskDefinitionKey.toLowerCase().equals(id.toLowerCase()) || (StringUtil.isBlank(taskDefinitionKey) && activityImpl.getProperty("type").equals("startEvent"))) { System.out.println("当前执行的任务:" + activityImpl.getProperty("name")); - //获取从某个节点出来的所有子节点-网关 - List outTransitions_gw = activityImpl.getOutgoingTransitions(); - for (PvmTransition tr_gw : outTransitions_gw) { - //获取线路的终点节点-网关 - PvmActivity ac_gw = tr_gw.getDestination(); - if (ac_gw.getProperty("type").equals("userTask") || ac_gw.getProperty("type").equals("endEvent")) { - activityImpls.add((ActivityImpl) ac_gw); - } else { - List outTransitions = ac_gw.getOutgoingTransitions(); - for (PvmTransition tr : outTransitions) { - PvmActivity ac = tr.getDestination(); - ActivityImpl itemActivityImpl = (ActivityImpl) ac; - activityImpls.add(itemActivityImpl); - } - } - } + //获取从某个节点出来的所有子节点 + collectNextActivities(activityImpl.getOutgoingTransitions(), activityImpls); break; } } return activityImpls; } + + /** + * 递归收集后续节点,处理多层网关嵌套 + * @param transitions 当前层的流出路径 + * @param result 收集结果的列表 + */ + private void collectNextActivities(List transitions, List result) { + if (transitions == null || transitions.isEmpty()) { + return; + } + for (PvmTransition tr : transitions) { + PvmActivity dest = tr.getDestination(); + String destType = String.valueOf(dest.getProperty("type")); + if ("userTask".equals(destType) || "endEvent".equals(destType)) { + // 目标是用户任务或结束事件,直接收集 + result.add((ActivityImpl) dest); + } else if ("exclusiveGateway".equals(destType) || "parallelGateway".equals(destType) + || "inclusiveGateway".equals(destType)) { + // 目标是网关,递归遍历其流出路径 + collectNextActivities(dest.getOutgoingTransitions(), result); + } + // 其他类型(如serviceTask、scriptTask等)忽略 + } + } /** * 查找含routeNum的workTask * @param processDefId @@ -395,12 +391,12 @@ public class WorkflowProcessDefinitionService { return list; } /** - * 获取两节点的路径条件--20190710-王贤平 + * 递归查找从sourceTaskDefId到destTaskDefId的路径条件,处理多层网关嵌套 + * @param processDefId * @param sourceTaskDefId * @param destTaskDefId - * @param processDefId - * @param pvmTransitionId 出现多路径时,避免重复 - * @return + * @param pvmTransitionId 出现多路径时,避免重复 + * @return 带条件文本的路径(优先返回第一个含有条件的路径) */ public PvmTransition getTransition(String processDefId,String sourceTaskDefId,String destTaskDefId,String pvmTransitionId) { @@ -410,29 +406,53 @@ public class WorkflowProcessDefinitionService { for(ActivityImpl activityImpl:activitiList){ String id = activityImpl.getId(); if(sourceTaskDefId.toLowerCase().equals(id.toLowerCase())){ - //获取从某个节点出来的所有子节点-网关 - List outTransitions_gw = activityImpl.getOutgoingTransitions(); - for(PvmTransition tr_gw:outTransitions_gw){ - //获取线路的终点节点-网关 - PvmActivity ac_gw = tr_gw.getDestination(); - if(ac_gw.getId().equals(destTaskDefId) && !tr_gw.getId().equals(pvmTransitionId)){ - return tr_gw; - }else{ - List outTransitions =ac_gw.getOutgoingTransitions(); - for(PvmTransition tr:outTransitions){ - PvmActivity ac = tr.getDestination(); - if(ac.getId().equals(destTaskDefId) && !tr.getId().equals(pvmTransitionId)){ - return tr; - } - } - } - } - break; + PvmTransition result = findTransitionToDestination(activityImpl.getOutgoingTransitions(), destTaskDefId, pvmTransitionId, null); + return result; } } return null; } - /** + + /** + * 递归遍历路径,查找目标节点,处理多层网关嵌套 + * @param transitions 当前层的流出路径 + * @param destTaskDefId 目标节点ID + * @param pvmTransitionId 需要跳过的路径ID + * @param firstConditionTransition 第一个含有条件文本的路径(优先返回) + * @return 带条件文本的路径,或直接到达目标的路径 + */ + private PvmTransition findTransitionToDestination(List transitions, String destTaskDefId, String pvmTransitionId, PvmTransition firstConditionTransition) { + if (transitions == null || transitions.isEmpty()) { + return null; + } + for (PvmTransition tr : transitions) { + if (tr.getId().equals(pvmTransitionId)) { + continue; + } + PvmActivity dest = tr.getDestination(); + // 记录第一个含有条件文本的路径 + PvmTransition conditionTransition = firstConditionTransition; + String conditionText = String.valueOf(tr.getProperty("conditionText")); + if (conditionTransition == null && conditionText != null && !conditionText.isEmpty() && !"null".equals(conditionText)) { + conditionTransition = tr; + } + // 直接找到目标节点 + if (dest.getId().equals(destTaskDefId)) { + return conditionTransition != null ? conditionTransition : tr; + } + // 目标是网关,递归遍历 + String destType = String.valueOf(dest.getProperty("type")); + if ("exclusiveGateway".equals(destType) || "parallelGateway".equals(destType) + || "inclusiveGateway".equals(destType)) { + PvmTransition found = findTransitionToDestination(dest.getOutgoingTransitions(), destTaskDefId, pvmTransitionId, conditionTransition); + if (found != null) { + return found; + } + } + } + return null; + } + /** * * 根据任务单编号获取流程定义 * diff --git a/src/main/webapp/JS/activiti/workflow.js b/src/main/webapp/JS/activiti/workflow.js index 94bf40c7..8a92fe4f 100644 --- a/src/main/webapp/JS/activiti/workflow.js +++ b/src/main/webapp/JS/activiti/workflow.js @@ -238,6 +238,10 @@ var processSelectNode = function(taskId){ //选择下一节点,先选择审核结果,再选择节点 $.post(ext.contextPath + "/activiti/workflow/getRoutesForSelect2.do", {taskId:taskId,passFlag:passFlag}, function(data) { $("#routeNum").empty(); + if (!data || data.length === 0) { + console.warn('getRoutesForSelect2: no routes found for passFlag=' + passFlag); + return; + } var selelct = $("#routeNum").select2({ data: data, placeholder:'请先选择审核结果',//默认文字提示 diff --git a/src/main/webapp/jsp/document/documentEdit.jsp b/src/main/webapp/jsp/document/documentEdit.jsp index 1653121e..39ede012 100644 --- a/src/main/webapp/jsp/document/documentEdit.jsp +++ b/src/main/webapp/jsp/document/documentEdit.jsp @@ -551,6 +551,8 @@ if($(".file-preview-thumbnails").html() == null || $(".file-preview-thumbnails").html().length==0 || $.trim($(".file-preview-thumbnails").html())==''){ showAlert('d','上传的文件不能为空!','alertFileEditDiv'); } else { + var editorText = editor.txt.html(); + $("#wContent").val(editorText); $.post(ext.contextPath + "/documentData/doupdate.do", $("#fileInputModalForm").serialize(), function (data) { if (data.res == 1){ $("#fileTable").bootstrapTable('refresh'); diff --git a/src/main/webapp/jsp/report/rptCreateAddMore.jsp b/src/main/webapp/jsp/report/rptCreateAddMore.jsp index 472bbab5..2971a177 100644 --- a/src/main/webapp/jsp/report/rptCreateAddMore.jsp +++ b/src/main/webapp/jsp/report/rptCreateAddMore.jsp @@ -72,6 +72,18 @@ }).on('hide', function (e) { $('#subForm').data('bootstrapValidator').updateStatus('rptdtM_Start', 'NOT_VALIDATED', null).validateField('rptdtM_Start'); }); + $('#rptdtQ_Start').datepicker({ + changeYear: true, + changeMonth: true, + format: 'yyyy-mm', + language: "zh-CN", + autoclose: true, + startView: 1, + minViewMode: 1, + maxViewMode: 2, + }).on('hide', function (e) { + $('#subForm').data('bootstrapValidator').updateStatus('rptdtQ_Start', 'NOT_VALIDATED', null).validateField('rptdtQ_Start'); + }); $('#rptdtY_Start').datepicker({ format: 'yyyy', language: "zh-CN", @@ -105,6 +117,18 @@ }).on('hide', function (e) { $('#subForm').data('bootstrapValidator').updateStatus('rptdtM_End', 'NOT_VALIDATED', null).validateField('rptdtM_End'); }); + $('#rptdtQ_End').datepicker({ + changeYear: true, + changeMonth: true, + format: 'yyyy-mm', + language: "zh-CN", + autoclose: true, + startView: 1, + minViewMode: 1, + maxViewMode: 2, + }).on('hide', function (e) { + $('#subForm').data('bootstrapValidator').updateStatus('rptdtQ_End', 'NOT_VALIDATED', null).validateField('rptdtQ_End'); + }); $('#rptdtY_End').datepicker({ format: 'yyyy', language: "zh-CN", @@ -146,6 +170,8 @@ value="${dateD}"> + @@ -160,6 +186,8 @@ value="${dateD}"> + diff --git a/src/main/webapp/jsp/safety/SafetyCheckComprehensiveAdd.jsp b/src/main/webapp/jsp/safety/SafetyCheckComprehensiveAdd.jsp index 56b11547..2ae4c13e 100644 --- a/src/main/webapp/jsp/safety/SafetyCheckComprehensiveAdd.jsp +++ b/src/main/webapp/jsp/safety/SafetyCheckComprehensiveAdd.jsp @@ -16,16 +16,10 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD .form-horizontal { padding-top: 20px; } - .DDD{ - list-style: none; - line-height: 30px; - }