yusm 1 неделя назад
Родитель
Сommit
29c3b81a70

+ 4 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -16260,14 +16260,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 .forEach(item -> {
                     Integer deptId = toInteger(item.get("departmentId"));
                     Integer key = deptId == null ? -1 : deptId;
-                    HashMap<String, Object> deptMap = deptGroupMap.computeIfAbsent(key, groupKey -> {
-                        HashMap<String, Object> map = new HashMap<>();
-                        fillDepartmentInfo(map, key == -1 ? null : key, departmentMap);
-                        map.put("workingTime", 0D);
-                        map.put("overtimeHours", 0D);
-                        map.put("items", new ArrayList<HashMap>());
-                        return map;
-                    });
+                    HashMap<String, Object> deptMap = deptGroupMap.get(key);
+                    if (deptMap == null) {
+                        return;
+                    }
                     deptMap.put("workingTime", roundHours(toDouble(deptMap.get("workingTime")) + toDouble(item.get("workingTime"))));
                     deptMap.put("overtimeHours", roundHours(toDouble(deptMap.get("overtimeHours")) + toDouble(item.get("overtimeHours"))));
                     ((List<HashMap>) deptMap.get("items")).add(item);

+ 25 - 27
fhKeeper/formulahousekeeper/timesheet/src/views/dashboard/index.vue

@@ -1298,18 +1298,22 @@ export default {
         const openId = item._deptOpenId || this.getDeptOpenId(item);
         deptOpenIdMap2[item.departmentName] = openId || null;
       });
-      const rankSeries = [
-        { rank: 0, name: "项目TOP1" },
-        { rank: 1, name: "项目TOP2" },
-        { rank: 2, name: "项目TOP3" },
-      ];
-      const getDeptRankItem = (dept, rank) =>
-        (dept.items || [])
-          .slice()
-          .sort(
-            (left, right) =>
-              Number(left.projectRank || 0) - Number(right.projectRank || 0),
-          )[rank];
+      const projectMap = new Map();
+      chartData.forEach((dept) => {
+        (dept.items || []).forEach((project) => {
+          const projectId = project.projectId || project.projectCode || project.projectName;
+          if (!projectMap.has(projectId)) {
+            projectMap.set(projectId, {
+              id: projectId,
+              name: project.projectCode || project.projectName || "未关联项目",
+              rank: Number(project.projectRank || 0),
+            });
+          }
+        });
+      });
+      const projects = Array.from(projectMap.values()).sort(
+        (left, right) => left.rank - right.rank,
+      );
       const maxValue = Math.max(
         ...chartData.flatMap((dept) =>
           (dept.items || []).map((project) => Number(project[valueKey] || 0)),
@@ -1330,17 +1334,15 @@ export default {
             const openId = deptOpenIdMap2[deptName] || null;
             let result = deptNameHtml(deptName, openId) + "<br/>";
             params.forEach((p) => {
-              const item = p.data || {};
-              const value = Number(item.value || 0);
+              const value = Number(p.value || 0);
               if (!value) return;
-              const projectText = item.projectCode || item.projectName || p.seriesName;
-              result += p.marker + projectText + ": " + value + " h<br/>";
+              result += p.marker + p.seriesName + ": " + value + " h<br/>";
             });
             return result;
           },
         },
         legend: {
-          data: rankSeries.map((series) => series.name),
+          data: projects.map((project) => project.name),
           bottom: 8,
           textStyle: { fontSize: 11 },
         },
@@ -1366,18 +1368,14 @@ export default {
             margin: 12,
           },
         },
-        series: rankSeries.map((rankConfig) => ({
-          name: rankConfig.name,
+        series: projects.map((project) => ({
+          name: project.name,
           type: "bar",
           data: chartData.map((dept) => {
-            const matched = getDeptRankItem(dept, rankConfig.rank);
-            return matched
-              ? {
-                  value: Number(matched[valueKey] || 0),
-                  projectCode: matched.projectCode,
-                  projectName: matched.projectName,
-                }
-              : { value: 0 };
+            const matched = (dept.items || []).find(
+              (item) => (item.projectId || item.projectCode || item.projectName) === project.id,
+            );
+            return matched ? Number(matched[valueKey] || 0) : 0;
           }),
           barMaxWidth: 14,
           label: {