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

+ 2 - 2
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -701,7 +701,7 @@ public class DataCollectController {
 //        String sqlQueryMain = "select id,cSOCode,iStatus ,dverifysystime,dcreatesystime,dverifydate,iverifystate,dDate   " +
 //                "from  SO_SOMAIN ssm  where ssm.dverifydate >= DATEADD(day, -30, GETDATE()) order by ID OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";
         String sqlQueryMain = "select id,cSOCode,iStatus ,FORMAT(dverifysystime,'yyyy-MM-dd HH:mm:ss') as dverifysystime,FORMAT(dverifydate,'yyyy-MM-dd') as dverifydate,iverifystate,FORMAT(dDate,'yyyy-MM-dd') as dDate   " +
-                "from  SO_SOMAIN ssm  where ssm.iStatus = 1  and  ssm.cdefine1 = '设备' and  cstcode = 10 and ssm.dverifydate >= DATEADD(day, -30, GETDATE()) order by ID";
+                "from  SO_SOMAIN ssm  where ssm.iStatus = 1  and  ssm.cdefine1 = '设备' and  cstcode = 10 and ssm.dverifydate >= DATEADD(day, -365, GETDATE()) order by ID";
         //获取销售主表单信息数据
         String sqlQueryDetail = "select id,autoId,cSOCode,cItemCode ,cItemName from SO_SODetails ssd where ssd.id in (%s)";
 
@@ -756,7 +756,7 @@ public class DataCollectController {
 
     @RequestMapping("/getProdOrderData")
     public List<ProdOrderMain> getProdOrderData(@RequestBody PageBO pageBO) {
-        String sqlQueryMain = "select moId,moCode,FORMAT(createDate,'yyyy-MM-dd') AS createDate ,FORMAT(modifyDate,'yyyy-MM-dd') AS modifyDate from mom_order mom where  mom.createDate >= DATEADD(day, -30, GETDATE()) order by moId";
+        String sqlQueryMain = "select moId,moCode,FORMAT(createDate,'yyyy-MM-dd') AS createDate ,FORMAT(modifyDate,'yyyy-MM-dd') AS modifyDate from mom_order mom where  mom.createDate >= DATEADD(day, -365, GETDATE()) order by moId";
         //获取销售主表单信息数据
         String sqlQueryDetail = "select FORMAT(relsTime, 'yyyy-MM-dd HH:mm:ss') AS relsTime, CostItemName ,Define24 ,OrderDId ,CostItemCode ,MoDId ,moid ,FORMAT(relsDate, 'yyyy-MM-dd') AS relsDate,Status  from mom_orderdetail momd where momd.relsDate is not null and momd.moid in (%s)";
 

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -3658,9 +3658,10 @@ public class ReportController {
 
     //项目工时排名前三部门分配表
     @RequestMapping("/getTop3ProjectReportGroupByDept")
-    public HttpRespMsg getTop3ProjectReportGroupByDept(String ymonth) {
+    public HttpRespMsg getTop3ProjectReportGroupByDept(String ymonth,
+            @RequestParam(required = false) String deptMode) {
         User user = userMapper.selectById(request.getHeader("TOKEN"));
-        return reportService.getTop3ProjectReportGroupByDept(user.getCompanyId(), ymonth);
+        return reportService.getTop3ProjectReportGroupByDept(user.getCompanyId(), ymonth, deptMode);
     }
 
     //各部门总工时和人均工时表

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -237,6 +237,8 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth);
 
+    HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth, String deptMode);
+
     HttpRespMsg getProjectReportGroupByDept(Integer companyId, String ymonth);
 
     HttpRespMsg getDeptProjectCount(Integer companyId, String ymonth);

+ 42 - 23
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -16188,8 +16188,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
     @Override
     public HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth) {
+        return getTop3ProjectReportGroupByDept(companyId, ymonth, null);
+    }
+
+    public HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth, String deptMode) {
         HttpRespMsg msg = new HttpRespMsg();
         String month = normalizeYearMonth(ymonth);
+        boolean useTopLevel = "top".equals(deptMode);
+        
         List<Map<String, Object>> topProjectList = reportMapper.selectMaps(new QueryWrapper<Report>()
                 .select("project_id as projectId", "sum(working_time) as workingTime")
                 .eq("company_id", companyId)
@@ -16221,15 +16227,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
         Map<String, HashMap<String, Object>> projectDeptMap = new LinkedHashMap<>();
         fillProjectInfo(companyId, projectDeptReportList).forEach(item -> {
-            Integer deptId = toInteger(item.get("deptId"));
-            Integer topDeptId = getTopDepartmentId(deptId, departmentMap);
+            Integer rawDeptId = toInteger(item.get("deptId"));
+            Integer deptId = useTopLevel ? getTopDepartmentId(rawDeptId, departmentMap) : rawDeptId;
             Integer projectId = toInteger(item.get("projectId"));
-            String key = (topDeptId == null ? -1 : topDeptId) + "_" + projectId;
+            String key = (deptId == null ? -1 : deptId) + "_" + projectId;
             HashMap<String, Object> target = projectDeptMap.computeIfAbsent(key, groupKey -> {
                 HashMap<String, Object> map = new HashMap<>();
                 map.putAll(item);
-                map.put("deptId", topDeptId);
-                fillDepartmentInfo(map, topDeptId, departmentMap);
+                fillDepartmentInfo(map, deptId, departmentMap);
                 map.put("projectRank", projectRankMap.getOrDefault(projectId, Integer.MAX_VALUE));
                 map.put("workingTime", 0D);
                 map.put("overtimeHours", 0D);
@@ -16240,29 +16245,43 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         });
 
         Map<Integer, HashMap<String, Object>> deptGroupMap = new LinkedHashMap<>();
-        departmentMap.values().stream()
-                .filter(department -> department.getDepartmentId() != null)
-                .filter(department -> department.getDepartmentId().equals(getTopDepartmentId(department.getDepartmentId(), departmentMap)))
-                .filter(department -> !Integer.valueOf(1).equals(department.getCorpwxDeptid()))
-                .sorted(Comparator
-                        .comparing((Department department) -> department.getSeq(), Comparator.nullsLast(Integer::compareTo))
-                        .thenComparing(Department::getDepartmentId))
-                .forEach(department -> {
-                    HashMap<String, Object> map = new HashMap<>();
-                    fillDepartmentInfo(map, department.getDepartmentId(), departmentMap);
-                    map.put("workingTime", 0D);
-                    map.put("overtimeHours", 0D);
-                    map.put("items", new ArrayList<HashMap>());
-                    deptGroupMap.put(department.getDepartmentId(), map);
-                });
+        if (useTopLevel) {
+            departmentMap.values().stream()
+                    .filter(department -> department.getDepartmentId() != null)
+                    .filter(department -> department.getDepartmentId().equals(getTopDepartmentId(department.getDepartmentId(), departmentMap)))
+                    .filter(department -> !Integer.valueOf(1).equals(department.getCorpwxDeptid()))
+                    .sorted(Comparator
+                            .comparing((Department department) -> department.getSeq(), Comparator.nullsLast(Integer::compareTo))
+                            .thenComparing(Department::getDepartmentId))
+                    .forEach(department -> {
+                        HashMap<String, Object> map = new HashMap<>();
+                        fillDepartmentInfo(map, department.getDepartmentId(), departmentMap);
+                        map.put("workingTime", 0D);
+                        map.put("overtimeHours", 0D);
+                        map.put("items", new ArrayList<HashMap>());
+                        deptGroupMap.put(department.getDepartmentId(), map);
+                    });
+        }
         projectDeptMap.values().stream()
                 .sorted(Comparator.comparingInt(item -> toInteger(item.get("projectRank")) == null ? Integer.MAX_VALUE : toInteger(item.get("projectRank"))))
                 .forEach(item -> {
                     Integer deptId = toInteger(item.get("departmentId"));
                     Integer key = deptId == null ? -1 : deptId;
-                    HashMap<String, Object> deptMap = deptGroupMap.get(key);
-                    if (deptMap == null) {
-                        return;
+                    HashMap<String, Object> deptMap;
+                    if (useTopLevel) {
+                        deptMap = deptGroupMap.get(key);
+                        if (deptMap == null) {
+                            return;
+                        }
+                    } else {
+                        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;
+                        });
                     }
                     deptMap.put("workingTime", roundHours(toDouble(deptMap.get("workingTime")) + toDouble(item.get("workingTime"))));
                     deptMap.put("overtimeHours", roundHours(toDouble(deptMap.get("overtimeHours")) + toDouble(item.get("overtimeHours"))));

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java

@@ -178,7 +178,7 @@ public class DataCollectTask {
     /**
      * 同步销售订单数据
      */
-    @Scheduled(cron ="0 30 3 * * ?")
+    @Scheduled(cron ="0 00 3 * * ?")
     public void saleOrderData(){
         if(isDev){return;}
         if(isPrivateDeploy) return;
@@ -212,10 +212,10 @@ public class DataCollectTask {
     /**
      * 同步销售订单数据
      */
-    @Scheduled(cron ="0 00 3 * * ?")
+    @Scheduled(cron ="0 05 3 * * ?")
     public void prdOrderData(){
-        if(isDev){return;}
-        if(isPrivateDeploy) return;
+//        if(isDev){return;}
+//        if(isPrivateDeploy) return;
         LocalDate nowDate = LocalDate.now();
         RestTemplate restTemplate = new RestTemplate();
         String getUrl = PREFIX_URL+"/dataCollect/getProdOrderData";

+ 70 - 30
fhKeeper/formulahousekeeper/timesheet/src/views/dashboard/index.vue

@@ -133,7 +133,16 @@
       <div class="chart-card project-rank-card">
         <div class="chart-title">
           <span>工时前三项目部门分配表</span>
-          <div class="chart-title-actions">
+          <div class="chart-title-actions" style="display:flex;gap:8px;align-items:center;">
+            <el-radio-group
+              v-model="top3DeptTabMode"
+              size="mini"
+              :disabled="loading2"
+              @change="onTop3DeptTabChange"
+            >
+              <el-radio-button label="top">一级部门</el-radio-button>
+              <el-radio-button label="all">子孙部门明细</el-radio-button>
+            </el-radio-group>
             <el-radio-group
               v-model="top3PieMode"
               size="mini"
@@ -392,6 +401,8 @@ export default {
       chart8: null,
       chart9: null,
       top3PieMode: "working",
+      top3DeptTabMode: "top",
+      top3DeptDataAll: [],
       userProjectTop10Data: [],
       loading9: false,
     };
@@ -682,7 +693,8 @@ export default {
 
     hasTop3DeptChartData() {
       const valueKey = this.top3PieMode === "overtime" ? "overtimeHours" : "workingTime";
-      return (this.top3DeptData || []).some((dept) =>
+      const sourceData = this.top3DeptTabMode === "top" ? this.top3DeptData : this.top3DeptDataAll;
+      return (sourceData || []).some((dept) =>
         (dept.items || []).some((item) => Number(item[valueKey] || 0) > 0),
       );
     },
@@ -716,37 +728,61 @@ export default {
       );
     },
 
+    onTop3DeptTabChange() {
+      this.$nextTick(() => this.renderChart2());
+    },
+
     loadTop3ProjectDept() {
       const requestMonth = this.selectedMonth;
       this.loading2 = true;
       this.top3DeptData = [];
-      this.http.post(
-        "/report/getTop3ProjectReportGroupByDept",
-        { ymonth: requestMonth },
-        (res) => {
-          if (!this.isCurrentMonthRequest(requestMonth)) return;
-          this.loading2 = false;
-          if (res.code === "ok") {
-            const data = res.data || [];
-            const processData = (translated) => {
-              this.top3DeptData = translated;
-              this.$nextTick(() => this.renderChart2());
-            };
-            if (this.needWxOpenData && data.length > 0) {
-              this.translateDeptNames(data, "departmentName", processData);
+      this.top3DeptDataAll = [];
+
+      const loadMode = (deptMode, storeKey, callback) => {
+        this.http.post(
+          "/report/getTop3ProjectReportGroupByDept",
+          { ymonth: requestMonth, deptMode },
+          (res) => {
+            if (!this.isCurrentMonthRequest(requestMonth)) return;
+            if (res.code === "ok") {
+              const data = res.data || [];
+              const processData = (translated) => {
+                this[storeKey] = translated;
+                if (callback) callback();
+              };
+              if (this.needWxOpenData && data.length > 0) {
+                this.translateDeptNames(data, "departmentName", processData);
+              } else {
+                processData(data);
+              }
             } else {
-              processData(data);
+              this.$message({ message: res.msg, type: "error" });
             }
-          } else {
-            this.$message({ message: res.msg, type: "error" });
-          }
-        },
-        (err) => {
-          if (!this.isCurrentMonthRequest(requestMonth)) return;
+          },
+          (err) => {
+            if (!this.isCurrentMonthRequest(requestMonth)) return;
+            this.$message({ message: err, type: "error" });
+          },
+        );
+      };
+
+      let topDone = false;
+      let allDone = false;
+      const tryFinish = () => {
+        if (topDone && allDone) {
           this.loading2 = false;
-          this.$message({ message: err, type: "error" });
-        },
-      );
+          this.$nextTick(() => this.renderChart2());
+        }
+      };
+
+      loadMode("top", "top3DeptData", () => {
+        topDone = true;
+        tryFinish();
+      });
+      loadMode(null, "top3DeptDataAll", () => {
+        allDone = true;
+        tryFinish();
+      });
     },
 
     loadDeptHours() {
@@ -1285,13 +1321,17 @@ export default {
       el.innerHTML = "";
       const parentEl = el.parentElement;
       const width = parentEl ? parentEl.clientWidth - 32 : el.clientWidth;
-      this.chart2 = echarts.init(el, null, { width, height: 380 });
-
       const isOvertime = this.top3PieMode === "overtime";
       const valueKey = isOvertime ? "overtimeHours" : "workingTime";
-      const chartData = this.top3DeptData.filter((dept) =>
+      const sourceData = this.top3DeptTabMode === "top" ? this.top3DeptData : this.top3DeptDataAll;
+      const chartData = sourceData.filter((dept) =>
         (dept.items || []).some((item) => Number(item[valueKey] || 0) > 0),
       );
+      const rowHeight = 28;
+      const minHeight = 300;
+      const height = Math.max(minHeight, chartData.length * rowHeight + 100);
+      el.style.height = height + "px";
+      this.chart2 = echarts.init(el, null, { width, height });
       const depts = chartData.map((item) => item.departmentName);
       const deptOpenIdMap2 = {};
       chartData.forEach((item) => {
@@ -1401,7 +1441,7 @@ export default {
         })),
       };
       this.chart2.setOption(option, true);
-      this.chart2.resize({ width, height: 380 });
+      this.chart2.resize({ width, height });
     },
 
     renderChart3() {