From 1cf342fa23a6c34bd9dd1ff4e416cd255c044fdd Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期四, 02 四月 2026 11:41:17 +0800
Subject: [PATCH] Merge branch 'dev_银川_中盛建材' of http://114.132.189.42:9002/r/product-inventory-management into dev_银川_中盛建材

---
 src/views/index.vue |  869 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 586 insertions(+), 283 deletions(-)

diff --git a/src/views/index.vue b/src/views/index.vue
index 03bda77..cf17886 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -2,9 +2,9 @@
   <div class="home-page">
     <div class="top-bar">
       <div class="user-box">
-        <!-- <img :src="userStore.avatar"
+        <img :src="userStore.avatar"
              class="avatar"
-             alt="" /> -->
+             alt="" />
         <div>
           <div class="hello">{{ userStore.roleName || "绯荤粺绠$悊鍛�" }}锛屼綘濂�</div>
           <div class="sub">鐧诲綍鏃堕棿锛歿{ userStore.currentLoginTime }}</div>
@@ -16,9 +16,9 @@
                    type="primary"
                    plain
                    @click="refreshDashboardData">鍒锋柊鏁版嵁</el-button>
-        <el-button size="small"
+        <!-- <el-button size="small"
                    plain
-                   @click="configDialogVisible = true">棣栭〉閰嶇疆</el-button>
+                   @click="configDialogVisible = true">棣栭〉閰嶇疆</el-button> -->
       </div>
     </div>
     <div class="content-grid">
@@ -40,7 +40,7 @@
             </el-button>
           </div>
         </section>
-        <section class="section-card">
+        <!-- <section class="section-card">
           <div class="section-title">閲嶇偣寰呭姙</div>
           <div class="todo-row"
                v-for="todo in todos"
@@ -49,7 +49,7 @@
                     :type="todo.type">{{ todo.level }}</el-tag>
             <span>{{ todo.title }}</span>
           </div>
-        </section>
+        </section> -->
         <section class="section-card">
           <div class="section-title">缁忚惀鍏虫敞</div>
           <div class="focus-row"
@@ -61,33 +61,25 @@
         </section>
         <section class="section-card flex-fill-card">
           <div class="section-title-row">
-            <div class="section-title">浠婃棩寰呭鐞�</div>
-            <el-radio-group v-model="pendingFilter"
-                            size="small">
-              <el-radio-button label="all">鍏ㄩ儴</el-radio-button>
-              <el-radio-button label="mine">鎴戠殑</el-radio-button>
-              <el-radio-button label="high">楂樹紭鍏�</el-radio-button>
+            <div class="section-title">鍖哄煙閿�鍞噾棰濆垎鏋�</div>
+            <el-radio-group v-model="chartProductType2"
+                            size="small"
+                            @change="fetchSalesAmountChartData">
+              <el-radio-button label="鏉挎潗">鏉挎潗</el-radio-button>
+              <el-radio-button label="鐮屽潡">鐮屽潡</el-radio-button>
             </el-radio-group>
           </div>
-          <div class="task-row"
-               v-for="task in filteredPendingTasks"
-               :key="task.id">
-            <div class="task-left">
-              <el-tag size="small"
-                      :type="task.type">{{ task.level }}</el-tag>
-              <span class="task-title">{{ task.title }}</span>
-            </div>
-            <el-button link
-                       type="primary"
-                       @click="goTo(task.path)">鍘诲鐞�</el-button>
-          </div>
-          <el-empty v-if="filteredPendingTasks.length === 0"
-                    description="鏆傛棤寰呭鐞嗕簨椤�"
-                    :image-size="80" />
+          <Echarts :chartStyle="chartStyle"
+                   :grid="grid"
+                   :tooltip="barTooltip"
+                   :xAxis="salesAmountXAxis"
+                   :yAxis="salesAmountYAxis"
+                   :series="salesAmountSeries"
+                   style="height: 90%" />
         </section>
       </div>
       <div class="right-col">
-        <section class="section-card"
+        <!-- <section class="section-card"
                  v-if="isSectionVisible('trendCards')">
           <div class="section-title">鏈�杩�7澶╁叧閿寚鏍囪秼鍔�</div>
           <div class="trend-cards">
@@ -111,7 +103,7 @@
               </div>
             </div>
           </div>
-        </section>
+        </section> -->
         <section class="section-card"
                  v-if="isSectionVisible('planTrend')">
           <div class="section-title-row">
@@ -137,35 +129,25 @@
              v-if="isSectionVisible('qualityChart') || isSectionVisible('costChart')">
           <section class="section-card"
                    v-if="isSectionVisible('qualityChart')">
-            <div class="section-title-row">
-              <div class="section-title">璐ㄦ寮傚父鍒嗗竷</div>
-              <el-radio-group v-model="chartRangeQuality"
-                              size="small"
-                              @change="loadQualityData">
-                <el-radio-button :label="1">鍛�</el-radio-button>
-                <el-radio-button :label="2">鏈�</el-radio-button>
-                <el-radio-button :label="3">瀛e害</el-radio-button>
-              </el-radio-group>
-            </div>
+            <div class="section-title">浠婂勾鑳借�楃敤閲忚秼鍔�</div>
             <Echarts :chartStyle="chartStyle"
                      :grid="grid"
                      :tooltip="barTooltip"
-                     :xAxis="qualityXAxis"
+                     :xAxis="energyConsumptionXAxis"
                      :yAxis="valueYAxis"
-                     :series="qualitySeries"
+                     :series="energyConsumptionSeries"
                      style="height: 260px" />
           </section>
           <section class="section-card"
                    v-if="isSectionVisible('costChart')">
-            <div class="section-title">鑳借�椾笌鎴愭湰缁撴瀯</div>
+            <div class="section-title">浠婂勾鑳借�楃被鍨嬪崰姣�</div>
             <Echarts :chartStyle="chartStyle"
-                     :legend="costLegend"
                      :tooltip="pieTooltip"
-                     :series="costSeries"
+                     :series="energyTypeSeries"
                      style="height: 260px" />
           </section>
         </div>
-        <section class="section-card"
+        <!-- <section class="section-card"
                  v-if="isSectionVisible('warningCenter')">
           <div class="section-title">寮傚父棰勮涓績</div>
           <div class="warning-row"
@@ -183,40 +165,53 @@
           <el-empty v-if="warningList.length === 0"
                     description="鏆傛棤寮傚父棰勮"
                     :image-size="80" />
-        </section>
+        </section> -->
         <section class="section-card mini-table-wrap"
                  v-if="isSectionVisible('planTable')">
-          <div class="section-title">鐢熶骇璁″垝鎵ц鏄庣粏</div>
-          <el-table :data="planTable"
+          <div class="section-title">鏈�杩戞姤宸�</div>
+          <el-table :data="reportingTable"
                     size="small"
-                    stripe>
-            <el-table-column prop="planNo"
-                             label="璁″垝鍗曞彿"
+                    stripe
+                    :loading="reportingTableLoading">
+            <el-table-column prop="productNo"
+                             label="鎶ュ伐缂栧彿"
                              min-width="150" />
-            <el-table-column prop="product"
-                             label="浜у搧"
-                             min-width="120" />
-            <el-table-column prop="qty"
-                             label="璁″垝閲�"
-                             min-width="90" />
-            <el-table-column prop="issued"
-                             label="宸蹭笅鍙�"
-                             min-width="90" />
-            <el-table-column prop="status"
-                             label="鐘舵��"
+            <el-table-column prop="schedule"
+                             label="鐝粍"
+                             min-width="80">
+              <template #default="{ row }">
+                <el-tag :type="row.schedule === '鐧界彮' ? 'primary' : 'warning'">{{ row.schedule || '-' }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column prop="postName"
+                             label="鍒涘缓浜�"
                              min-width="100" />
-            <el-table-column label="鎿嶄綔"
+            <el-table-column prop="createTime"
+                             label="鎶ュ伐鏃堕棿"
+                             min-width="150">
+              <template #default="{ row }">
+                {{ row.createTime ? dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') : '' }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="productName"
+                             label="浜у搧"
                              min-width="120">
               <template #default="{ row }">
-                <el-button link
-                           type="primary"
-                           @click="goTo(routePathMap.plan)">鏌ョ湅</el-button>
-                <el-button v-if="row.status !== '宸插畬鎴�'"
-                           link
-                           type="success"
-                           @click="goTo(routePathMap.dispatch)">
-                  涓嬪彂
-                </el-button>
+                <el-tag :type="row.productName === '鐮屽潡' ? 'primary' : 'warning'">{{ row.productName || '-' }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column prop="totalQuantity"
+                             label="鐢熶骇鏁伴噺"
+                             min-width="100">
+              <template #default="{ row }">
+                <span style="color:rgba(18, 148, 212, 0.8);">{{ row.totalQuantity || '-' }}</span> 鏂�
+              </template>
+            </el-table-column>
+            <el-table-column prop="quantity"
+                             label="鍚堟牸鏁伴噺"
+                             min-width="100">
+              <template #default="{ row }">
+                <span style="color:rgba(0, 228, 99, 0.8);">{{ row.quantity || '-' }}</span> 鏂�
               </template>
             </el-table-column>
           </el-table>
@@ -298,7 +293,12 @@
     processDataProductionStatistics,
     qualityInspectionStatistics,
     nonComplianceWarning,
+    getManageStatistics,
   } from "@/api/viewIndex.js";
+  import { energyConsumptionDetailStatistics } from "@/api/energyManagement/energyType";
+  import { getSalesAmountAnalysis } from "@/api/reportAnalysis/salesStatistics";
+  import { productionReportListPage } from "@/api/productionManagement/productionReporting.js";
+  import dayjs from "dayjs";
 
   const router = useRouter();
   const userStore = useUserStore();
@@ -481,8 +481,8 @@
     { name: "宸插畬鎴愯鍗曟暟", value: "-" },
     { name: "鏈畬鎴愯鍗曟暟", value: "-" },
     { name: "閮ㄥ垎瀹屾垚璁㈠崟鏁�", value: "-" },
-    { name: "璐ㄦ鎬绘暟", value: "-" },
-    { name: "杩囩▼妫�鎬绘暟", value: "-" },
+    { name: "鏉ユ枡妫�鎬绘暟", value: "-" },
+    // { name: "杩囩▼妫�鎬绘暟", value: "-" },
   ]);
 
   const pendingTasks = reactive([]);
@@ -543,7 +543,290 @@
     },
   ]);
 
-  const planTable = reactive([]);
+  // 鑳借�楃被鍨嬪崰姣旀暟鎹�
+  const energyTypeSeries = reactive([
+    {
+      type: "pie",
+      radius: ["40%", "70%"],
+      center: ["50%", "50%"],
+      avoidLabelOverlap: false,
+      itemStyle: {
+        borderRadius: 10,
+        borderColor: "#fff",
+        borderWidth: 2,
+      },
+      label: {
+        show: true,
+        formatter: "{b}: {d}%",
+      },
+      data: [
+        { value: 0, name: "姘�", itemStyle: { color: "#409EFF" } },
+        { value: 0, name: "鐢�", itemStyle: { color: "#E6A23C" } },
+        { value: 0, name: "姘�", itemStyle: { color: "#F56C6C" } },
+      ],
+    },
+  ]);
+
+  // 鑳借�楃敤閲忚秼鍔垮浘琛�
+  const energyConsumptionXAxis = reactive({
+    type: "category",
+    data: [],
+    axisLabel: {
+      rotate: 45,
+    },
+  });
+
+  const energyConsumptionSeries = reactive([
+    {
+      name: "鐢ㄦ按閲�",
+      type: "bar",
+      data: [],
+      itemStyle: { color: "#409EFF" },
+    },
+    {
+      name: "鐢ㄧ數閲�",
+      type: "bar",
+      data: [],
+      itemStyle: { color: "#E6A23C" },
+    },
+    {
+      name: "鐢ㄦ皵閲�",
+      type: "bar",
+      data: [],
+      itemStyle: { color: "#67C23A" },
+    },
+  ]);
+
+  // 閿�鍞噾棰濆浘琛�
+  const chartProductType2 = ref("鐮屽潡");
+  const salesAmountChartData = ref({
+    dates: [],
+    customerTrends: [],
+  });
+
+  const salesAmountXAxis = reactive({
+    type: "value",
+    axisLabel: {
+      interval: "auto",
+      formatter: value => {
+        // 鏍煎紡鍖栭噾棰濓紝鏄剧ず涓烘洿鏄撹鐨勫舰寮�
+        if (value >= 10000) {
+          return (value / 10000).toFixed(0) + "涓�";
+        }
+        return value;
+      },
+    },
+    axisTick: {
+      interval: "auto",
+    },
+  });
+
+  const salesAmountYAxis = reactive({
+    type: "category",
+    data: [],
+    axisLabel: {
+      rotate: 0,
+    },
+  });
+
+  const salesAmountSeries = reactive([]);
+
+  // 鑾峰彇閿�鍞噾棰濆垎鏋愬浘琛ㄦ暟鎹�
+  const fetchSalesAmountChartData = async () => {
+    try {
+      const response = await getSalesAmountAnalysis({
+        type: chartProductType2.value,
+        days: "骞�", // 榛樿骞�
+      });
+      if (response?.data) {
+        salesAmountChartData.value = response.data;
+        updateSalesAmountChart();
+      }
+    } catch (error) {
+      console.error("鑾峰彇閿�鍞噾棰濆垎鏋愬浘琛ㄦ暟鎹け璐�:", error);
+      // 浣跨敤妯℃嫙鏁版嵁
+      salesAmountChartData.value = {
+        dates: [
+          "2026-01-01",
+          "2025-01-01",
+          "2024-01-01",
+          "2023-01-01",
+          "2022-01-01",
+        ],
+        customerTrends: [
+          { 鍐呰挋鍙�: 100, 閾跺窛: 200, 鑷彁: 300, 鍏朵粬: 150, 鍏ㄩ儴: 750 },
+          { 鍐呰挋鍙�: 80, 閾跺窛: 180, 鑷彁: 280, 鍏朵粬: 130, 鍏ㄩ儴: 670 },
+          { 鍐呰挋鍙�: 90, 閾跺窛: 190, 鑷彁: 290, 鍏朵粬: 140, 鍏ㄩ儴: 710 },
+          { 鍐呰挋鍙�: 70, 閾跺窛: 170, 鑷彁: 270, 鍏朵粬: 120, 鍏ㄩ儴: 630 },
+          { 鍐呰挋鍙�: 110, 閾跺窛: 210, 鑷彁: 310, 鍏朵粬: 160, 鍏ㄩ儴: 790 },
+        ],
+      };
+      updateSalesAmountChart();
+    }
+  };
+
+  // 鏇存柊閿�鍞噾棰濆浘琛�
+  const updateSalesAmountChart = () => {
+    const { customerTrends = [] } = salesAmountChartData.value;
+
+    // 璁$畻姣忎釜閿�鍞尯鍩熺殑鎬婚攢鍞锛堣繃婊ゆ帀"鍏ㄩ儴"锛�
+    const areaTotalMap = new Map();
+    customerTrends.forEach(item => {
+      Object.keys(item).forEach(key => {
+        // 杩囨护鎺�"鍏ㄩ儴"閿�鍞尯鍩�
+        if (key !== "鍏ㄩ儴") {
+          const value = item[key] || 0;
+          if (areaTotalMap.has(key)) {
+            areaTotalMap.set(key, areaTotalMap.get(key) + value);
+          } else {
+            areaTotalMap.set(key, value);
+          }
+        }
+      });
+    });
+
+    // 杞崲涓烘暟缁�
+    const salesAreas = Array.from(areaTotalMap.keys());
+
+    const colors = [
+      "#00A4ED",
+      "#34D8F7",
+      "#4A8BFF",
+      "#8A6BFF",
+      "#C8C447",
+      "#FF6B6B",
+    ];
+
+    // 鏇存柊Y杞存暟鎹紙鐜板湪鏄攢鍞尯鍩燂級
+    salesAmountYAxis.data = salesAreas;
+
+    // 鏇存柊绯诲垪鏁版嵁锛堟瘡涓攢鍞尯鍩熺殑鎬婚攢鍞锛�
+    salesAmountSeries.splice(0, salesAmountSeries.length);
+    salesAmountSeries.push({
+      name: "閿�鍞噾棰�",
+      data: salesAreas.map(area => areaTotalMap.get(area)),
+      type: "bar",
+      itemStyle: { color: "#00A4ED" },
+    });
+  };
+
+  // 妯℃嫙鑳借�楁暟鎹�
+  const energyData = reactive({
+    water: 120,
+    electricity: 350,
+    gas: 80,
+  });
+
+  // 鏇存柊鑳借�楃被鍨嬪崰姣斿浘琛ㄥ拰鑳借�楃敤閲忚秼鍔垮浘琛�
+  const updateEnergyTypeChart = () => {
+    // 鏋勫缓鍙傛暟锛氫粖骞寸殑骞村垵鍒板勾鏈互鍙婂ぉ鏁�
+    const currentYear = new Date().getFullYear();
+    const params = {
+      startDate: `${currentYear}-01-01`,
+      endDate: `${currentYear}-12-31`,
+      days: 365,
+      state: "骞�",
+    };
+
+    // 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
+    energyConsumptionDetailStatistics(params)
+      .then(res => {
+        if (res.code === 200) {
+          const data = res.data;
+          // 澶勭悊鑳借�楃被鍨嬪崰姣旀暟鎹�
+          const energyTypeData = data.energyCostDtos || [];
+
+          // 璁$畻鍚勮兘鑰楃被鍨嬬殑鎬绘秷鑰楅噺
+          let total = 0;
+          const typeMap = {
+            姘�: 0,
+            鐢�: 0,
+            姘�: 0,
+          };
+
+          // 鍑嗗鑳借�楃敤閲忚秼鍔垮浘琛ㄦ暟鎹�
+          const dates = [];
+          const waterConsumptionData = [];
+          const electricityConsumptionData = [];
+          const gasConsumptionData = [];
+
+          energyTypeData.forEach(item => {
+            // 鏀堕泦鏃ユ湡鍜屽悇鑳借�楃被鍨嬫暟鎹�
+            if (item.meterReadingDate) {
+              dates.push(item.meterReadingDate);
+              waterConsumptionData.push(item.waterConsumption || 0);
+              electricityConsumptionData.push(item.electricityConsumption || 0);
+              gasConsumptionData.push(item.gasConsumption || 0);
+            }
+
+            // 璁$畻鎬绘秷鑰楅噺
+            if (item.waterConsumption)
+              typeMap.姘� += Number(item.waterConsumption);
+            if (item.electricityConsumption)
+              typeMap.鐢� += Number(item.electricityConsumption);
+            if (item.gasConsumption) typeMap.姘� += Number(item.gasConsumption);
+          });
+
+          total = typeMap.姘� + typeMap.鐢� + typeMap.姘�;
+
+          // 鏇存柊鑳借�楃被鍨嬪崰姣斿浘琛ㄦ暟鎹�
+          energyTypeSeries[0].data = [
+            {
+              value: total > 0 ? ((typeMap.姘� / total) * 100).toFixed(2) : 0,
+              name: "姘�",
+              itemStyle: { color: "#409EFF" },
+            },
+            {
+              value: total > 0 ? ((typeMap.鐢� / total) * 100).toFixed(2) : 0,
+              name: "鐢�",
+              itemStyle: { color: "#E6A23C" },
+            },
+            {
+              value: total > 0 ? ((typeMap.姘� / total) * 100).toFixed(2) : 0,
+              name: "姘�",
+              itemStyle: { color: "#F56C6C" },
+            },
+          ];
+
+          // 鏇存柊鑳借�楃敤閲忚秼鍔垮浘琛ㄦ暟鎹�
+          energyConsumptionXAxis.data = dates;
+          energyConsumptionSeries[0].data = waterConsumptionData;
+          energyConsumptionSeries[1].data = electricityConsumptionData;
+          energyConsumptionSeries[2].data = gasConsumptionData;
+        }
+      })
+      .catch(err => {
+        console.error("鑾峰彇鑳借�楁暟鎹紓甯革細", err);
+      });
+  };
+
+  // 鎶ュ伐琛ㄦ牸鏁版嵁
+  const reportingTable = ref([]);
+  const reportingTableLoading = ref(false);
+
+  // 鑾峰彇鏈�杩戞姤宸ユ暟鎹�
+  const fetchReportingData = () => {
+    reportingTableLoading.value = true;
+    productionReportListPage({
+      current: 1,
+      size: 5, // 鍙樉绀烘渶杩�5鏉�
+    })
+      .then(res => {
+        if (res.code === 200) {
+          console.log(res.data.records || []);
+          reportingTable.value = res.data.records || [];
+        } else {
+          reportingTable.value = [];
+        }
+      })
+      .catch(error => {
+        console.error("鑾峰彇鎶ュ伐鏁版嵁澶辫触:", error);
+        reportingTable.value = [];
+      })
+      .finally(() => {
+        reportingTableLoading.value = false;
+      });
+  };
   const recentTrendCards = reactive([
     {
       key: "planIssued",
@@ -715,102 +998,100 @@
   };
 
   const loadHomeTodos = async () => {
-    try {
-      const res = await homeTodos();
-      const list = Array.isArray(res?.data) ? res.data : [];
-      const mapped = list.slice(0, 4).map((item, idx) => {
-        const text =
-          item?.approveReason || item?.approveTypeName || `寰呭鐞嗕簨椤� ${idx + 1}`;
-        const levelType = idx === 0 ? "danger" : idx <= 2 ? "warning" : "success";
-        const level = idx === 0 ? "楂�" : idx <= 2 ? "涓�" : "浣�";
-        return { level, title: text, type: levelType };
-      });
-      updateArray(todos, mapped);
-      const pendingMapped = list.slice(0, 4).map((item, idx) => {
-        const title =
-          item?.approveReason || item?.approveTypeName || `寰呭鐞嗕簨椤� ${idx + 1}`;
-        const path = inferTodoPath(item);
-        return {
-          id: item?.id || `${idx}-${title}`,
-          title,
-          level: idx === 0 ? "楂�" : idx <= 2 ? "涓�" : "浣�",
-          type: idx === 0 ? "danger" : idx <= 2 ? "warning" : "success",
-          path,
-          ownerId: item?.approveUserId || item?.userId || "",
-          ownerName: item?.approveUserName || item?.userName || "",
-        };
-      });
-      updateArray(pendingTasks, pendingMapped);
-    } catch (error) {
-      console.error("homeTodos鎺ュ彛鑾峰彇澶辫触:", error);
-    }
+    // try {
+    //   const res = await homeTodos();
+    //   const list = Array.isArray(res?.data) ? res.data : [];
+    //   const mapped = list.slice(0, 4).map((item, idx) => {
+    //     const text =
+    //       item?.approveReason || item?.approveTypeName || `寰呭鐞嗕簨椤� ${idx + 1}`;
+    //     const levelType = idx === 0 ? "danger" : idx <= 2 ? "warning" : "success";
+    //     const level = idx === 0 ? "楂�" : idx <= 2 ? "涓�" : "浣�";
+    //     return { level, title: text, type: levelType };
+    //   });
+    //   updateArray(todos, mapped);
+    //   const pendingMapped = list.slice(0, 4).map((item, idx) => {
+    //     const title =
+    //       item?.approveReason || item?.approveTypeName || `寰呭鐞嗕簨椤� ${idx + 1}`;
+    //     const path = inferTodoPath(item);
+    //     return {
+    //       id: item?.id || `${idx}-${title}`,
+    //       title,
+    //       level: idx === 0 ? "楂�" : idx <= 2 ? "涓�" : "浣�",
+    //       type: idx === 0 ? "danger" : idx <= 2 ? "warning" : "success",
+    //       path,
+    //       ownerId: item?.approveUserId || item?.userId || "",
+    //       ownerName: item?.approveUserName || item?.userName || "",
+    //     };
+    //   });
+    //   updateArray(pendingTasks, pendingMapped);
+    // } catch (error) {
+    //   console.error("homeTodos鎺ュ彛鑾峰彇澶辫触:", error);
+    // }
   };
 
   const loadOrderAndProgress = async () => {
-    try {
-      const [orderRes, progressRes] = await Promise.allSettled([
-        orderCount(),
-        getProgressStatistics(),
-      ]);
-
-      if (orderRes.status === "fulfilled") {
-        const items = Array.isArray(orderRes.value?.data)
-          ? orderRes.value.data
-          : [];
-        const byName = Object.fromEntries(
-          items.map(i => [String(i?.name || "").replace(/\s/g, ""), i?.value])
-        );
-        businessFocus[0].value = `${
-          pickFirstNumber(byName, ["鐢熶骇璁㈠崟鏁�", "鐢熶骇璁㈠崟鎬绘暟", "鎬昏鍗曟暟"]) || 0
-        } 鍗昤;
-        businessFocus[1].value = `${
-          pickFirstNumber(byName, ["宸插畬鎴愯鍗曟暟"]) || 0
-        } 鍗昤;
-        businessFocus[2].value = `${
-          pickFirstNumber(byName, ["寰呯敓浜ц鍗曟暟", "鏈畬鎴愯鍗曟暟"]) || 0
-        } 鍗昤;
-        businessFocus[3].value = `${
-          pickFirstNumber(byName, ["閮ㄥ垎瀹屾垚璁㈠崟鏁�"]) || 0
-        } 鍗昤;
-      }
-
-      if (progressRes.status === "fulfilled") {
-        const p = progressRes.value?.data || {};
-        const detail = Array.isArray(p.completedOrderDetails)
-          ? p.completedOrderDetails
-          : [];
-        const rows = detail.slice(0, 6).map((item, index) => {
-          const qty = pickFirstNumber(item, ["quantity", "planQuantity"]);
-          const done = pickFirstNumber(item, [
-            "completeQuantity",
-            "completedQuantity",
-          ]);
-          return {
-            planNo: item.npsNo || item.productionPlanNo || `NO-${index + 1}`,
-            product: item.productCategory || item.productName || "-",
-            qty,
-            issued: done,
-            status:
-              qty > 0 && done >= qty ? "宸插畬鎴�" : done > 0 ? "鎵ц涓�" : "寰呬笅鍙�",
-          };
-        });
-        updateArray(planTable, rows);
-        setTrendCard(
-          "planIssued",
-          detail
-            .slice(-7)
-            .map(i =>
-              pickFirstNumber(i, [
-                "completeQuantity",
-                "completedQuantity",
-                "issueNum",
-              ])
-            )
-        );
-      }
-    } catch (error) {
-      console.error("orderCount/getProgressStatistics鎺ュ彛鑾峰彇澶辫触:", error);
-    }
+    // try {
+    //   const [orderRes, progressRes] = await Promise.allSettled([
+    //     orderCount(),
+    //     getProgressStatistics(),
+    //   ]);
+    //   if (orderRes.status === "fulfilled") {
+    //     const items = Array.isArray(orderRes.value?.data)
+    //       ? orderRes.value.data
+    //       : [];
+    //     const byName = Object.fromEntries(
+    //       items.map(i => [String(i?.name || "").replace(/\s/g, ""), i?.value])
+    //     );
+    //     businessFocus[0].value = `${
+    //       pickFirstNumber(byName, ["鐢熶骇璁㈠崟鏁�", "鐢熶骇璁㈠崟鎬绘暟", "鎬昏鍗曟暟"]) || 0
+    //     } 鍗昤;
+    //     businessFocus[1].value = `${
+    //       pickFirstNumber(byName, ["宸插畬鎴愯鍗曟暟"]) || 0
+    //     } 鍗昤;
+    //     businessFocus[2].value = `${
+    //       pickFirstNumber(byName, ["寰呯敓浜ц鍗曟暟", "鏈畬鎴愯鍗曟暟"]) || 0
+    //     } 鍗昤;
+    //     businessFocus[3].value = `${
+    //       pickFirstNumber(byName, ["閮ㄥ垎瀹屾垚璁㈠崟鏁�"]) || 0
+    //     } 鍗昤;
+    //   }
+    //   if (progressRes.status === "fulfilled") {
+    //     const p = progressRes.value?.data || {};
+    //     const detail = Array.isArray(p.completedOrderDetails)
+    //       ? p.completedOrderDetails
+    //       : [];
+    //     const rows = detail.slice(0, 6).map((item, index) => {
+    //       const qty = pickFirstNumber(item, ["quantity", "planQuantity"]);
+    //       const done = pickFirstNumber(item, [
+    //         "completeQuantity",
+    //         "completedQuantity",
+    //       ]);
+    //       return {
+    //         planNo: item.npsNo || item.productionPlanNo || `NO-${index + 1}`,
+    //         product: item.productCategory || item.productName || "-",
+    //         qty,
+    //         issued: done,
+    //         status:
+    //           qty > 0 && done >= qty ? "宸插畬鎴�" : done > 0 ? "鎵ц涓�" : "寰呬笅鍙�",
+    //       };
+    //     });
+    //     updateArray(planTable, rows);
+    //     setTrendCard(
+    //       "planIssued",
+    //       detail
+    //         .slice(-7)
+    //         .map(i =>
+    //           pickFirstNumber(i, [
+    //             "completeQuantity",
+    //             "completedQuantity",
+    //             "issueNum",
+    //           ])
+    //         )
+    //     );
+    //   }
+    // } catch (error) {
+    //   console.error("orderCount/getProgressStatistics鎺ュ彛鑾峰彇澶辫触:", error);
+    // }
   };
 
   const inferTodoPath = todo => {
@@ -827,112 +1108,112 @@
   };
 
   const loadPlanTrend = async () => {
-    try {
-      const res = await processDataProductionStatistics({
-        type: chartRangePlan.value,
-      });
-      const list = Array.isArray(res?.data) ? res.data : [];
-      planXAxis[0].data = list.map(
-        (i, index) => i.processName || `宸ュ簭${index + 1}`
-      );
-      planSeries[0].data = list.map(i =>
-        pickFirstNumber(i, ["totalInput", "input", "planNum"])
-      );
-      planSeries[1].data = list.map(i =>
-        pickFirstNumber(i, ["totalOutput", "output", "issueNum"])
-      );
-      planSeries[2].data = list.map(i =>
-        pickFirstNumber(i, ["totalScrap", "scrap", "completeNum"])
-      );
-    } catch (error) {
-      console.error("processDataProductionStatistics鎺ュ彛鑾峰彇澶辫触:", error);
-    }
+    // try {
+    //   const res = await processDataProductionStatistics({
+    //     type: chartRangePlan.value,
+    //   });
+    //   const list = Array.isArray(res?.data) ? res.data : [];
+    //   planXAxis[0].data = list.map(
+    //     (i, index) => i.processName || `宸ュ簭${index + 1}`
+    //   );
+    //   planSeries[0].data = list.map(i =>
+    //     pickFirstNumber(i, ["totalInput", "input", "planNum"])
+    //   );
+    //   planSeries[1].data = list.map(i =>
+    //     pickFirstNumber(i, ["totalOutput", "output", "issueNum"])
+    //   );
+    //   planSeries[2].data = list.map(i =>
+    //     pickFirstNumber(i, ["totalScrap", "scrap", "completeNum"])
+    //   );
+    // } catch (error) {
+    //   console.error("processDataProductionStatistics鎺ュ彛鑾峰彇澶辫触:", error);
+    // }
   };
 
   const loadQualityData = async () => {
-    try {
-      const res = await qualityInspectionStatistics({
-        type: chartRangeQuality.value,
-      });
-      const data = res?.data || {};
-      const items = Array.isArray(data.item) ? data.item : [];
-      if (items.length > 0) {
-        qualityXAxis[0].data = items.map(i => i.date || i.name || "-");
-        qualitySeries[0].data = items.map(i =>
-          pickFirstNumber(i, [
-            "supplierNum",
-            "processNum",
-            "factoryNum",
-            "totalNum",
-          ])
-        );
-        setTrendCard(
-          "qualityRaw",
-          items.map(i => pickFirstNumber(i, ["supplierNum"]))
-        );
-        setTrendCard(
-          "qualityProcess",
-          items.map(i => pickFirstNumber(i, ["processNum"]))
-        );
-        setTrendCard(
-          "qualityFactory",
-          items.map(i => pickFirstNumber(i, ["factoryNum"]))
-        );
-      } else {
-        qualityXAxis[0].data = ["鏉ユ枡妫�", "杩囩▼妫�", "鎴愬搧妫�"];
-        qualitySeries[0].data = [
-          pickFirstNumber(data, ["supplierNum"]),
-          pickFirstNumber(data, ["processNum"]),
-          pickFirstNumber(data, ["factoryNum"]),
-        ];
-        setTrendCard("qualityRaw", [pickFirstNumber(data, ["supplierNum"])]);
-        setTrendCard("qualityProcess", [pickFirstNumber(data, ["processNum"])]);
-        setTrendCard("qualityFactory", [pickFirstNumber(data, ["factoryNum"])]);
-      }
-      businessFocus[4].value = `${pickFirstNumber(data, [
-        "supplierNum",
-        "totalNum",
-      ])} 鏉;
-      businessFocus[5].value = `${pickFirstNumber(data, ["processNum"])} 鏉;
-    } catch (error) {
-      console.error("qualityInspectionStatistics鎺ュ彛鑾峰彇澶辫触:", error);
-    }
+    // try {
+    //   const res = await qualityInspectionStatistics({
+    //     type: chartRangeQuality.value,
+    //   });
+    //   const data = res?.data || {};
+    //   const items = Array.isArray(data.item) ? data.item : [];
+    //   if (items.length > 0) {
+    //     qualityXAxis[0].data = items.map(i => i.date || i.name || "-");
+    //     qualitySeries[0].data = items.map(i =>
+    //       pickFirstNumber(i, [
+    //         "supplierNum",
+    //         "processNum",
+    //         "factoryNum",
+    //         "totalNum",
+    //       ])
+    //     );
+    //     setTrendCard(
+    //       "qualityRaw",
+    //       items.map(i => pickFirstNumber(i, ["supplierNum"]))
+    //     );
+    //     setTrendCard(
+    //       "qualityProcess",
+    //       items.map(i => pickFirstNumber(i, ["processNum"]))
+    //     );
+    //     setTrendCard(
+    //       "qualityFactory",
+    //       items.map(i => pickFirstNumber(i, ["factoryNum"]))
+    //     );
+    //   } else {
+    //     qualityXAxis[0].data = ["鏉ユ枡妫�", "杩囩▼妫�", "鎴愬搧妫�"];
+    //     qualitySeries[0].data = [
+    //       pickFirstNumber(data, ["supplierNum"]),
+    //       pickFirstNumber(data, ["processNum"]),
+    //       pickFirstNumber(data, ["factoryNum"]),
+    //     ];
+    //     setTrendCard("qualityRaw", [pickFirstNumber(data, ["supplierNum"])]);
+    //     setTrendCard("qualityProcess", [pickFirstNumber(data, ["processNum"])]);
+    //     setTrendCard("qualityFactory", [pickFirstNumber(data, ["factoryNum"])]);
+    //   }
+    //   businessFocus[4].value = `${pickFirstNumber(data, [
+    //     "supplierNum",
+    //     "totalNum",
+    //   ])} 鏉;
+    //   businessFocus[5].value = `${pickFirstNumber(data, ["processNum"])} 鏉;
+    // } catch (error) {
+    //   console.error("qualityInspectionStatistics鎺ュ彛鑾峰彇澶辫触:", error);
+    // }
   };
 
   const loadWarningCenter = async () => {
-    try {
-      const res = await nonComplianceWarning();
-      const list = Array.isArray(res?.data) ? res.data : [];
-      const mapped = list.slice(0, 6).map((item, idx) => {
-        const levelNum = toNumber(item.level ?? item.warningLevel ?? 2);
-        const levelType =
-          levelNum >= 3 ? "danger" : levelNum === 2 ? "warning" : "info";
-        const levelText = levelNum >= 3 ? "楂�" : levelNum === 2 ? "涓�" : "浣�";
-        const title =
-          item.name || item.title || item.paramName || `寮傚父棰勮 ${idx + 1}`;
-        const text = `${title}${item.processName || ""}${
-          item.orderNo || ""
-        }`.toLowerCase();
-        const path = text.includes("璐ㄦ")
-          ? routePathMap.processInspection
-          : text.includes("璁㈠崟")
-          ? routePathMap.order
-          : routePathMap.processInspection ||
-            routePathMap.order ||
-            routePathMap.plan;
-        return {
-          id: item.id || `${idx}-${title}`,
-          levelType,
-          levelText,
-          title,
-          path,
-        };
-      });
-      updateArray(warningList, mapped);
-    } catch (error) {
-      console.error("nonComplianceWarning鎺ュ彛鑾峰彇澶辫触:", error);
-      updateArray(warningList, []);
-    }
+    // try {
+    //   const res = await nonComplianceWarning();
+    //   const list = Array.isArray(res?.data) ? res.data : [];
+    //   const mapped = list.slice(0, 6).map((item, idx) => {
+    //     const levelNum = toNumber(item.level ?? item.warningLevel ?? 2);
+    //     const levelType =
+    //       levelNum >= 3 ? "danger" : levelNum === 2 ? "warning" : "info";
+    //     const levelText = levelNum >= 3 ? "楂�" : levelNum === 2 ? "涓�" : "浣�";
+    //     const title =
+    //       item.name || item.title || item.paramName || `寮傚父棰勮 ${idx + 1}`;
+    //     const text = `${title}${item.processName || ""}${
+    //       item.orderNo || ""
+    //     }`.toLowerCase();
+    //     const path = text.includes("璐ㄦ")
+    //       ? routePathMap.processInspection
+    //       : text.includes("璁㈠崟")
+    //       ? routePathMap.order
+    //       : routePathMap.processInspection ||
+    //         routePathMap.order ||
+    //         routePathMap.plan;
+    //     return {
+    //       id: item.id || `${idx}-${title}`,
+    //       levelType,
+    //       levelText,
+    //       title,
+    //       path,
+    //     };
+    //   });
+    //   updateArray(warningList, mapped);
+    // } catch (error) {
+    //   console.error("nonComplianceWarning鎺ュ彛鑾峰彇澶辫触:", error);
+    //   updateArray(warningList, []);
+    // }
   };
 
   const initSectionConfig = () => {
@@ -964,32 +1245,54 @@
   };
 
   const loadCostComposition = async () => {
+    // try {
+    //   const res = await expenseCompositionAnalysis({ type: 1 });
+    //   const list = Array.isArray(res?.data) ? res.data : [];
+    //   const mapped = list.map(i => ({
+    //     name: i.name || "鏈懡鍚�",
+    //     value: pickFirstNumber(i, ["value", "amount", "cost"]),
+    //   }));
+    //   costSeries[0].data = mapped;
+    // } catch (error) {
+    //   console.error("expenseCompositionAnalysis鎺ュ彛鑾峰彇澶辫触:", error);
+    // }
+  };
+  const loadManageStatistics = async () => {
     try {
-      const res = await expenseCompositionAnalysis({ type: 1 });
-      const list = Array.isArray(res?.data) ? res.data : [];
-      const mapped = list.map(i => ({
-        name: i.name || "鏈懡鍚�",
-        value: pickFirstNumber(i, ["value", "amount", "cost"]),
-      }));
-      costSeries[0].data = mapped;
+      const res = await getManageStatistics();
+      const data = res?.data || {};
+      businessFocus[0].value = `${pickFirstNumber(data, ["total"])} 鏉;
+      businessFocus[1].value = `${pickFirstNumber(data, ["completed"])} 鏉;
+      businessFocus[2].value = `${pickFirstNumber(data, ["uncompleted"])} 鏉;
+      businessFocus[3].value = `${pickFirstNumber(data, [
+        "partialCompleted",
+      ])} 鏉;
+      businessFocus[4].value = `${pickFirstNumber(data, [
+        "materialInspection",
+      ])} 鏉;
+      // businessFocus[5].value = `${pickFirstNumber(data, [""])} 鏉;
     } catch (error) {
-      console.error("expenseCompositionAnalysis鎺ュ彛鑾峰彇澶辫触:", error);
+      console.error("manageStatistics鎺ュ彛鑾峰彇澶辫触:", error);
     }
   };
 
   const refreshDashboardData = () => {
-    loadHomeTodos();
-    loadOrderAndProgress();
-    loadPlanTrend();
-    loadQualityData();
-    loadCostComposition();
-    loadWarningCenter();
+    // loadHomeTodos();
+    // loadOrderAndProgress();
+    // loadPlanTrend();
+    // loadQualityData();
+    // loadCostComposition();
+    // loadWarningCenter();
+    loadManageStatistics();
+    updateEnergyTypeChart();
+    fetchSalesAmountChartData();
+    fetchReportingData();
     lastUpdatedAt.value = new Date().toLocaleString();
   };
 
   onMounted(() => {
     // initSectionConfig();
-    // refreshDashboardData();
+    refreshDashboardData();
   });
 </script>
 

--
Gitblit v1.9.3