From 5f14844e81dade9e55725642f42c76568c5ec908 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期五, 16 一月 2026 10:22:48 +0800
Subject: [PATCH] 修改超时时间显示

---
 business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java |   57 ++++++++++---
 business/src/main/java/com/ycl/task/FlowableTask.java                 |  141 ++++++++++++++++++++--------------
 2 files changed, 126 insertions(+), 72 deletions(-)

diff --git a/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java b/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
index f375bc5..4297f42 100644
--- a/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/IndexHomeServiceImpl.java
@@ -507,17 +507,11 @@
 
 
         List<Task> allRunningTasks  = taskService.createTaskQuery().active().list();
-
+        //杩欓噷 鑾峰緱 褰撳墠鐢ㄦ埛 鎵�灞炵殑 娴佺▼瀹炰緥ids闆嗗悎涓� 瀵瑰簲鐨勬鍦ㄨ繍琛岀殑浠诲姟銆�
         List<Task> targetRunningTasks = allRunningTasks.stream()
-                // 鍏抽敭鍖归厤锛氫换鍔$殑娴佺▼瀹氫箟ID 瀛樺湪浜� projectProcessList 鐨勬祦绋嬪畾涔塈D鍒楄〃涓�
+                // 鍏抽敭鍖归厤锛氫换鍔$殑娴佺▼瀹炰緥ID 瀛樺湪浜� targetProcessInsIds 鍒楄〃涓�
                 .filter(task -> targetProcessInsIds.contains(task.getProcessInstanceId()))
-                .filter(task -> {
-                    String assignee = task.getAssignee();
-                    log.info("assignee:{}",assignee);
-                    return assignee == null || userId.toString().equals(assignee);
-                })
                 .collect(Collectors.toList());
-
         List<TaskInfoVo> list = new ArrayList<>();
         // 鎸夋祦绋嬪疄渚媔d鍒嗙粍
         if (!CollectionUtils.isEmpty(targetRunningTasks)){
@@ -529,6 +523,7 @@
                     .eq(ProcessCoding::getDeleted, Boolean.FALSE)
                     .in(ProcessCoding::getTaskId, taskIds)
                     .list();
+
             log.info("processCodingList.size():{}", processCodingList.size()); // 鐪嬫棩蹇楁槸鍚︿负0
             Map<String, ProcessCoding> processCodingMap = new HashMap<>();
             //鎸塼askId杞崲涓簃ap鏂归潰涓嬮潰鑾峰彇
@@ -554,6 +549,25 @@
                                 }
                         ));
             }
+
+            //涓簍argetRunningTasks杩涜涓�娆℃帓搴� 鎸夊瓨鍦ㄨ秴鏃舵椂闂� 鐢辨悶鍒颁綆鎺掑簭
+            Map<String, ProcessCoding> finalProcessCodingMap = processCodingMap;
+            targetRunningTasks.sort((t1, t2) -> {
+                ProcessCoding pc1 = finalProcessCodingMap.get(t1.getId());
+                ProcessCoding pc2 = finalProcessCodingMap.get(t2.getId());
+
+                String status1 = (pc1 != null && pc1.getOvertimeStatus() != null) ? pc1.getOvertimeStatus() : ProcessOverTimeConstants.NORMAL;
+                String status2 = (pc2 != null && pc2.getOvertimeStatus() != null) ? pc2.getOvertimeStatus() : ProcessOverTimeConstants.NORMAL;
+
+                // 瀹氫箟鏉冮噸锛歰vertime=3, willOvertime=2, normal=1
+                int weight1 = ProcessOverTimeConstants.OVERTIME.equals(status1) ? 3 :
+                        (ProcessOverTimeConstants.WILLOVERTIME.equals(status1) ? 2 : 1);
+                int weight2 = ProcessOverTimeConstants.OVERTIME.equals(status2) ? 3 :
+                        (ProcessOverTimeConstants.WILLOVERTIME.equals(status2) ? 2 : 1);
+
+                return Integer.compare(weight2, weight1); // 鐢遍珮鍒颁綆鎺掑簭
+            });
+
             for (Task task : targetRunningTasks) {
 
                 TaskInfoVo taskVo = new TaskInfoVo();
@@ -637,16 +651,33 @@
                 }
                 //瓒呮椂鏃堕棿鍜屾鏁板湪 processCodingList涓�  杩欓噷闇�瑕佹洿鍏穞askId鏉ヨ幏寰楀搴斾俊鎭�
                 ProcessCoding processCoding = processCodingMap.get(task.getId());
+
                 //璁剧疆瓒呮椂淇℃伅
                 if (processCoding != null) {
-
+                    log.error("褰撳墠澶勭悊processCoding鐨刬d:{}",processCoding.getId());
                     String overTimeTotalStr = processCoding.getOverTimeTotal();
                     long overTimeTotal = 0L;
+                    log.error("褰撳墠澶勭悊瓒呮椂鏃堕棿锛歿}",overTimeTotalStr);
                     if (StringUtils.isNotBlank(overTimeTotalStr)) {
-                        try {
-                            overTimeTotal = Long.parseLong(overTimeTotalStr.trim());
-                        } catch (NumberFormatException e) {
 
+                        try {
+                            // 绗竴姝ワ細鍏堝幓闄ゅ瓧绗︿覆涓ょ绌虹櫧
+                            String trimStr = overTimeTotalStr.trim();
+                            // 绗簩姝ワ細鍏堣浆鎴怐ouble澶勭悊灏忔暟锛屽啀杞琇ong锛堝彲閫夋嫨鍥涜垗浜斿叆鎴栫洿鎺ュ彇鏁达級
+                            double doubleValue = Double.parseDouble(trimStr);
+                            // 鏂瑰紡1锛氱洿鎺ュ彇鏁存暟閮ㄥ垎锛�4778.3 鈫� 4778锛�
+                            overTimeTotal = (long) doubleValue;
+                            // 鏂瑰紡2锛氬洓鑸嶄簲鍏ワ紙4778.3 鈫� 4778锛�4778.6 鈫� 4779锛�
+                            // overTimeTotal = Math.round(doubleValue);
+
+                            log.error("鎵撳嵃瓒呮椂鎬绘椂闀夸笉涓簄ull鐨刬d:{}锛屽搴斿�納}锛堝師濮嬪�硷細{}锛�",
+                                    processCoding.getId(), overTimeTotal, trimStr);
+                        } catch (NumberFormatException e) {
+                            // 鍏抽敭锛氭墦鍗板紓甯歌鎯呭拰鍘熷鍊硷紝鏂逛究鎺掓煡
+                            log.error("杞崲瓒呮椂鏃堕棿澶辫触锛乮d:{}锛屽師濮嬪�硷細{}",
+                                    processCoding.getId(), overTimeTotalStr, e);
+                            // 鍙�夛細缁欓粯璁ゅ�硷紝閬垮厤鍚庣画浣跨敤overTimeTotal鏃跺嚭鐜扮┖鎸囬拡
+                            overTimeTotal = 0L; // 鎴栨牴鎹笟鍔¤缃粯璁ゅ�硷紝姣斿60000L锛�1鍒嗛挓锛�
                         }
                     }
                     String overTimeDesc = convertHoursToDayHourStr(overTimeTotal);
@@ -674,8 +705,6 @@
                 }
                 list.add(taskVo);
             }
-
-
         }
 
         return Result.ok().data(list);
diff --git a/business/src/main/java/com/ycl/task/FlowableTask.java b/business/src/main/java/com/ycl/task/FlowableTask.java
index dd90247..5adc84f 100644
--- a/business/src/main/java/com/ycl/task/FlowableTask.java
+++ b/business/src/main/java/com/ycl/task/FlowableTask.java
@@ -54,22 +54,33 @@
      * 涓や釜閫昏緫 鏀归」鐩爜銆佹敼鑺傜偣棰滆壊
      */
     public void expireTask() {
-        log.info("寮�濮嬭祴鐮�");
+        log.info("寮�濮嬪畾鏃朵换鍔★細expireTask 璧嬬爜璁$畻");
         //褰撳墠姝e湪杩愯鐨勬墍鏈変换鍔¤妭鐐�
         List<Task> taskList = taskService.createTaskQuery().active().list();
-        if (CollectionUtils.isEmpty(taskList)) return;
+        log.info("鏌ヨ鍒板綋鍓嶆椿璺冧换鍔℃暟閲�: {}", taskList.size());
+        if (CollectionUtils.isEmpty(taskList)) {
+            log.info("娲昏穬浠诲姟鍒楄〃涓虹┖锛岀粨鏉熶换鍔�");
+            return;
+        }
+
         //鎺掗櫎鎺夎妭鐐规寕璧风殑浠诲姟
         List<String> allHangupTask = processLogMapper.getAllHangup();
-        taskList = taskList.stream()
-                .filter(task -> !allHangupTask.contains(task.getId()))
-                .collect(Collectors.toList());
-        //TODO锛氱瓫閫夊嚭娴佺▼瀹炰緥id锛岀敤浣滈」鐩寕璧�
-        Set<String> proInsIds = taskList.stream()
-                .map(TaskInfo::getProcessInstanceId)
-                .collect(Collectors.toSet());
-        //TODO:鏌ヨ椤圭洰鎸傝捣鏃ュ織
+        log.info("鏌ヨ鍒版寕璧蜂换鍔� ID 鏁伴噺: {}", allHangupTask.size());
 
-        List<String> taskIds = taskList.stream().map(TaskInfo::getId).collect(Collectors.toList());
+        List<Task> filteredTaskList = taskList.stream()
+                .filter(task -> {
+                    boolean isHangup = allHangupTask.contains(task.getId());
+                    if (isHangup) {
+                        log.info("浠诲姟 [{}] 鍥犲浜庢寕璧风姸鎬佽璺宠繃", task.getId());
+                    }
+                    return !isHangup;
+                })
+                .collect(Collectors.toList());
+
+        log.info("鎺掗櫎鎸傝捣浠诲姟鍚庯紝寰呭鐞嗕换鍔℃暟閲�: {}", filteredTaskList.size());
+
+        List<String> taskIds = filteredTaskList
+        .stream().map(TaskInfo::getId).collect(Collectors.toList());
         //鏌ヨ鑺傜偣鎸傝捣鏃ュ織
         Map<String, List<ProcessLog>> hangupLogMap = new LambdaQueryChainWrapper<>(processLogMapper)
                 .in(ProcessLog::getEventType, HANGUP, CANCEL_HANGUP)
@@ -82,6 +93,9 @@
         List<ProcessCoding> processCodingList = new LambdaQueryChainWrapper<>(processCodingMapper)
                 .in(ProcessCoding::getTaskId, taskIds)
                 .list();
+
+        log.info("寮�濮嬪鐞嗚祴鐮佽绠楅�昏緫銆傚綋鍓嶅緟澶勭悊娲昏穬浠诲姟鏁�: {}, 宸查厤缃洃鎺х殑浠诲姟鏁�: {}", taskIds.size(), processCodingList.size());
+
         Map<String, ProcessCoding> taskMap = new HashMap<>();
         Map<String, Date> startTaskMap = new HashMap<>();
         if (!CollectionUtils.isEmpty(processCodingList)) {
@@ -89,7 +103,9 @@
             taskMap = processCodingList.stream().collect(Collectors.toMap(ProcessCoding::getTaskId, Function.identity()));
             //鎷垮埌寮�濮嬭鏃剁殑鑺傜偣闆嗗悎 key:taskId value:寮�濮嬫椂闂�
             startTaskMap = getStartTaskList(processCodingList);
+            log.info("鑾峰彇鍒拌鏃惰捣鐐硅褰曟暟閲�: {}", startTaskMap.size());
         }
+
         //鎻愬墠鍑嗗鎺ユ敹鏁版嵁鐨刴ap key:娴佺▼瀹炰緥id value:闇�瑕佹敼鍙樼殑棰滆壊
         Map<String, List<String>> map = new HashMap<>();
         List<ProcessCoding> list = new ArrayList<>();
@@ -97,85 +113,85 @@
         map.put(RED, new ArrayList<>());
         map.put(YELLOW, new ArrayList<>());
         Date now = new Date();
+
         //閬嶅巻鎵�鏈変唬鍔炵殑鑺傜偣
-        for (Task task : taskList) {
+        for (Task task : filteredTaskList) {
             String taskId = task.getId();
+            String procInsId = task.getProcessInstanceId();
             ProcessCoding processCoding = taskMap.get(taskId);
+
             if (processCoding == null) {
                 //涓嶉渶瑕佺洃鎺х殑浠诲姟鑺傜偣椤圭洰鐮佺洿鎺ユ敼涓虹豢鑹�
-                map.get(GREEN).add(task.getProcessInstanceId());
+                log.info("浠诲姟 ID: {}, 娴佺▼瀹炰緥: {}, 鍚嶇О: {} 鏈湪鐩戞帶閰嶇疆涓紝椤圭洰鐮侀粯璁よ涓� GREEN", taskId, procInsId, task.getName());
+                map.get(GREEN).add(procInsId);
                 continue;
             }
+
             //鍒ゆ柇璧嬬爜缁熶竴鐢ㄧ浣滀负鍗曚綅锛屼笖鍙渶鐢ㄧ孩鐮佹椂闂村垽鏂秴鏃讹紝閫氳繃瓒呮椂鍘绘敼鍙橀」鐩殑璧嬬爜鐘舵�侊紝鑺傜偣鏈韩鏃犺祴鐮佺姸鎬�
             Date startTime = startTaskMap.get(processCoding.getStartTaskId());
+            if (startTime == null) {
+                log.warn("浠诲姟 ID: {}, 娴佺▼瀹炰緥: {} 鎵句笉鍒拌鏃惰捣鐐规椂闂� (StartTaskId: {}), 灏嗛粯璁ゅ綊涓� GREEN 浠ラ槻姝换鍔′涪澶�", taskId, procInsId, processCoding.getStartTaskId());
+                map.get(GREEN).add(procInsId);
+                continue;
+            }
+
             try {
                 Long redTime = getTime(processCoding.getRedTime());
-//                Long yellowTime = getTime(processCoding.getYellowTime());
-//                Long overtime = getTime(processCoding.getOvertime());
-                if (startTime == null) continue;
-
                 //鑺傜偣澶勭悊鏃堕棿锛岄渶鎺掗櫎鑺傚亣鏃�
                 long durationTime = DateUtils.getWorkingSed(startTime, now);
 
-                //TODO锛氬噺鍘绘祦绋嬫寕璧锋椂闀�
-
                 //鍑忓幓鑺傜偣鎸傝捣鏃堕暱
-                durationTime = subNodeHangupTime(hangupLogMap, task, durationTime);
+                long finalDurationTime = subNodeHangupTime(hangupLogMap, task, durationTime);
 
                 String status = GREEN; // 榛樿鐘舵�佷负缁胯壊
                 String overtimeStatus = NORMAL;
                 Long overtimeDurationSec = null; // 瓒呮椂鏃堕暱锛堢锛屽師濮嬪�硷級
-                Double overtimeDurationHour = null; // 瓒呮椂鏃堕暱锛堝皬鏃讹紝杞崲鍚庯級
-                if (redTime != null && redTime != 0 && durationTime >= redTime) {
+                Double overtimeDurationHour = 0.0; // 瓒呮椂鏃堕暱锛堝皬鏃讹紝杞崲鍚庯級
+
+                if (redTime != null && redTime != 0 && finalDurationTime >= redTime) {
                     status = RED; // 濡傛灉瓒呰繃绾㈣壊鏃堕棿闃堝�硷紝鍒欒〃鏄庤浠诲姟瓒呮椂
                     overtimeStatus = OVERTIME;
-                    overtimeDurationSec = durationTime - redTime;
-                    // 2. 杞崲涓哄皬鏃讹紙淇濈暀1浣嶅皬鏁帮紝閬垮厤灏忔暟杩囧锛�
+                    overtimeDurationSec = finalDurationTime - redTime;
                     overtimeDurationHour = Math.round((overtimeDurationSec / 3600.0) * 10) / 10.0;
 
-                    // 鏃堕棿鏍煎紡鍖栵紙Java鏍囧噯API锛屾棤渚濊禆锛�
                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-                    String formattedStartTime = sdf.format(startTime);
-                    String formattedNow = sdf.format(now);
-                    // 杞崲绾㈢爜闃堝�间负灏忔椂锛堝彲閫夛紝鏃ュ織鏇存槗璇伙級
-                    Double redTimeHour = Math.round((redTime / 3600.0) * 10) / 10.0;
-                    Double durationTimeHour = Math.round((durationTime / 3600.0) * 10) / 10.0;
-
-                    // 鎵撳嵃瓒呮椂鏃堕暱锛堝皬鏃跺崟浣嶏級
-                    log.info("浠诲姟瓒呮椂棰勮锛氫换鍔D[{}]锛屾祦绋嬪疄渚婭D[{}]锛岃鏃惰捣鐐筟{}]锛屽綋鍓嶆椂闂碵{}]锛岀孩鐮侀槇鍊糩{}灏忔椂]锛屽疄闄呮湁鏁堣�楁椂[{}灏忔椂]锛岃秴鏃舵椂闀縖{}灏忔椂]",
-                            taskId, task.getProcessInstanceId(),
-                            formattedStartTime, formattedNow,
-                            redTimeHour, durationTimeHour, overtimeDurationHour);
+                    log.info("浠诲姟瓒呮椂棰勮锛氫换鍔D[{}], 娴佺▼瀹炰緥[{}], 璧风偣[{}], 褰撳墠[{}], 绾㈢爜闃堝�糩{}灏忔椂], 瀹為檯鑰楁椂[{}灏忔椂], 瓒呮椂[{}灏忔椂]",
+                            taskId, procInsId,
+                            sdf.format(startTime), sdf.format(now),
+                            Math.round((redTime / 3600.0) * 10) / 10.0,
+                            Math.round((finalDurationTime / 3600.0) * 10) / 10.0,
+                            overtimeDurationHour);
+                } else {
+                    log.info("浠诲姟鏈秴鏃讹細浠诲姟ID[{}], 娴佺▼瀹炰緥[{}], 瀹為檯鑰楁椂[{}灏忔椂], 绾㈢爜闃堝�糩{}灏忔椂]",
+                            taskId, procInsId,
+                            Math.round((finalDurationTime / 3600.0) * 10) / 10.0,
+                            redTime != null ? Math.round((redTime / 3600.0) * 10) / 10.0 : 0);
                 }
-//                else if (yellowTime != null && yellowTime != 0 && durationTime >= yellowTime) {
-//                    status = YELLOW; // 鍚﹀垯锛屽鏋滆秴杩囬粍鑹叉椂闂撮槇鍊硷紝鍒欑姸鎬佷负榛勮壊
-//                }
-//                //澶勭悊鍔炵悊鏈熼檺
-//                String overtimeStatus = NORMAL;
-//                if (overtime != null && overtime != 0 && durationTime >= overtime) {
-//                    overtimeStatus = OVERTIME; // 濡傛灉瓒呰繃鍔炵悊鏈熼檺
-//                } else if (overtime != null && overtime != 0 && durationTime >= (overtime - 12 * 60 * 60)) {
-//                    overtimeStatus = WILLOVERTIME; // 濡傛灉涓存湡(鍥哄畾瓒呮椂鍓�12灏忔椂涓轰复鏈�)
-//                }
-//                else if (overtime != null && overtime != 0 && durationDay >= (overtime - 60)) {
-//                    overtimeStatus = WILLOVERTIME; // 濡傛灉涓存湡(鍥哄畾瓒呮椂鍓�12灏忔椂涓轰复鏈�)
-//                }
-                map.get(status).add(task.getProcessInstanceId());
+
+                map.get(status).add(procInsId);
                 processCoding.setOverTimeTotal(String.valueOf(overtimeDurationHour));
                 processCoding.setStatus(status);
                 processCoding.setOvertimeStatus(overtimeStatus);
                 processCoding.setStartTaskTime(task.getCreateTime());
                 list.add(processCoding);
             } catch (Exception e) {
-                log.error(e.getMessage(), "璧嬬爜鏃堕棿鏍煎紡鏈夎");
+                log.error("浠诲姟 [{}] 璧嬬爜璁$畻鍙戠敓寮傚父: {}", taskId, e.getMessage(), e);
             }
         }
         //鏇存柊椤圭洰鐮�
-        map.forEach((key, value) -> updateProjectCoding(value, key));
+        map.forEach((key, value) -> {
+            if (!value.isEmpty()) {
+                log.info("鍑嗗鏇存柊椤圭洰鐮佷负 {}: 娴佺▼瀹炰緥鍒楄〃 {}", key, value);
+                updateProjectCoding(value, key);
+            }
+        });
         //鏇存柊鑺傜偣鐘舵�� 鑷畾涔夌殑mybatis鏂规硶
-        if (!CollectionUtils.isEmpty(list)) processCodingMapper.updateBatch(list);
+        if (!CollectionUtils.isEmpty(list)) {
+            log.info("鎵归噺鏇存柊鑺傜偣鐘舵�佹暟閲�: {}", list.size());
+            processCodingMapper.updateBatch(list);
+        }
 
-        log.info("缁撴潫璧嬬爜");
+        log.info("瀹氭椂浠诲姟锛歟xpireTask 璧嬬爜璁$畻缁撴潫");
     }
 
     //鍑忓幓鑺傜偣鎸傝捣鏃堕暱
@@ -239,19 +255,28 @@
             return;
         }
 
-        List<String> projectIds = new LambdaQueryChainWrapper<>(projectProcessMapper)
+        List<ProjectProcess> projectProcesses = new LambdaQueryChainWrapper<>(projectProcessMapper)
                 .in(ProjectProcess::getProcessInsId, processInstanceIds)
                 .eq(ProjectProcess::getProjectType, ProjectProcessTypeEnum.PROJECT)
-                .list()
-                .stream()
-                .map(ProjectProcess::getProjectId)
+                .list();
+
+        log.info("璧嬬爜绫诲瀷 [{}]: 鏌ヨ鍒� {} 涓搴旂殑椤圭洰娴佺▼鍏崇郴", coding, projectProcesses.size());
+
+        List<String> projectIds = projectProcesses.stream()
+                .map(p -> {
+                    log.info("娴佺▼瀹炰緥 [{}] 瀵瑰簲椤圭洰 ID [{}]", p.getProcessInsId(), p.getProjectId());
+                    return p.getProjectId();
+                })
                 .collect(Collectors.toList());
 
         if (!CollectionUtils.isEmpty(projectIds)) {
+            log.info("鎵ц鏁版嵁搴撴洿鏂�: 灏嗛」鐩� {} 鐨勭紪鐮佹洿鏂颁负 {}", projectIds, coding);
             new LambdaUpdateChainWrapper<>(projectInfoMapper)
                     .in(ProjectInfo::getId, projectIds)
                     .set(ProjectInfo::getCoding, coding)
                     .update();
+        } else {
+            log.warn("鏈壘鍒板搴旂殑椤圭洰 ID锛屾棤娉曟墽琛岀紪鐮佹洿鏂般�傛祦绋嬪疄渚嬪垪琛�: {}", processInstanceIds);
         }
     }
 }

--
Gitblit v1.8.0