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