From c10661bab41e6161449a6dac8eef40bb53feb235 Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期五, 26 十二月 2025 09:28:26 +0800
Subject: [PATCH] 1
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs | 12
项目代码/WMS无仓储版/WIDESEA_WMSServer/BigGreenService/BigGreenService.csproj | 14
项目代码/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue | 415 ++++++++++---------------
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/BigGreen/BigScreenController.cs | 25 +
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj | 1
项目代码/WIDESEA_WMSClient/src/router/viewGird.js | 4
项目代码/WMS无仓储版/WIDESEA_WMSServer/IBigBreen/IBigBreenService.csproj | 13
项目代码/WIDESEA_WMSClient/package-lock.json | 174 +++++-----
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs | 33 +
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer.sln | 33 ++
项目代码/WMS无仓储版/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs | 196 ++++++++++++
项目代码/WMS无仓储版/WIDESEA_WMSServer/IBigBreen/IBigGreenService.cs | 14
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs | 7
13 files changed, 609 insertions(+), 332 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/package-lock.json" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/package-lock.json"
index 55513a8..e3ce864 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/package-lock.json"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/package-lock.json"
@@ -3612,11 +3612,6 @@
"dev": true,
"optional": true
},
- "@popperjs/core": {
- "version": "npm:@sxzz/popperjs-es@2.11.7",
- "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
- "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
- },
"@soda/friendly-errors-webpack-plugin": {
"version": "1.8.0",
"resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz?cache=0&sync_timestamp=1607927406873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40soda%2Ffriendly-errors-webpack-plugin%2Fdownload%2F%40soda%2Ffriendly-errors-webpack-plugin-1.8.0.tgz",
@@ -4391,6 +4386,87 @@
"webpack-chain": "^6.4.0",
"webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "optional": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "optional": true
+ },
+ "loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "vue-loader-v16": {
+ "version": "npm:vue-loader@16.8.3",
+ "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+ "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "hash-sum": "^2.0.0",
+ "loader-utils": "^2.0.0"
+ }
+ }
}
},
"@vue/cli-shared-utils": {
@@ -7561,6 +7637,13 @@
"lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0"
+ },
+ "dependencies": {
+ "@popperjs/core": {
+ "version": "npm:@sxzz/popperjs-es@2.11.7",
+ "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+ "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
+ }
}
},
"element-ui": {
@@ -15385,87 +15468,6 @@
"resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
"integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
"dev": true
- }
- }
- },
- "vue-loader-v16": {
- "version": "npm:vue-loader@16.8.3",
- "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
- "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
- "dev": true,
- "optional": true,
- "requires": {
- "chalk": "^4.1.0",
- "hash-sum": "^2.0.0",
- "loader-utils": "^2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "optional": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "optional": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "optional": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "optional": true
- },
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dev": true,
- "optional": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "optional": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
}
}
},
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
index 727c0c8..78836a8 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
@@ -248,8 +248,8 @@
name: 'takeStockOrderDetail',
component: () => import('@/views/inbound/takeStockOrderDetail.vue')
}, {
- path: '/dashboard',
- name: 'dashboard',
+ path: '/wms-dashboard',
+ name: 'wms-dashboard',
component: () => import('@/views/charts/wms-dashboard.vue')
}
]
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue"
index 5271c53..1126002 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/charts/wms-dashboard.vue"
@@ -1,7 +1,7 @@
<template>
<div class="wms-dashboard">
<!-- 椤堕儴鏍囬鏍� -->
- <div class="header">
+ <!-- <div class="header">
<h1>WMS浠撳偍鍙鍖栧浘琛ㄧ湅鏉�</h1>
<div class="header-right">
<span>2025-12-24 16:11:44</span>
@@ -11,36 +11,36 @@
</el-select>
<el-button type="primary" style="margin-left: 10px;" @click="refreshCharts">鍒锋柊</el-button>
</div>
- </div>
+ </div> -->
- <!-- 缁熻鍗$墖鍖哄煙 -->
+ <!-- 缁熻鍗$墖鍖哄煙 - 缁戝畾鍝嶅簲寮忔暟鎹� -->
<el-row :gutter="20" class="stats-card-row">
<el-col :span="6">
<el-card class="stats-card">
<div class="card-title">鎬诲簱瀛橈紙浠讹級</div>
- <div class="card-value">269,225</div>
- <div class="card-change"><el-tag type="success">鈫� 2.1% 杈冩槰鏃�</el-tag></div>
+ <div class="card-value">{{ formatNumber(bigscreendata.totalStockQuantity) }}</div>
+ <!-- <div class="card-change"><el-tag type="success">鈫� 2.1% 杈冩槰鏃�</el-tag></div> -->
</el-card>
</el-col>
<el-col :span="6">
<el-card class="stats-card">
<div class="card-title">寰呭嚭搴撹鍗�</div>
- <div class="card-value">425</div>
- <div class="card-change"><el-tag type="warning">鈫� 5.3% 杈�1灏忔椂鍓�</el-tag></div>
+ <div class="card-value">{{ bigscreendata.unOutBoundOrderCount }}</div>
+ <!-- <div class="card-change"><el-tag type="warning">鈫� 5.3% 杈�1灏忔椂鍓�</el-tag></div> -->
</el-card>
</el-col>
<el-col :span="6">
<el-card class="stats-card">
<div class="card-title">浠婃棩浣滀笟瀹屾垚鐜�</div>
- <div class="card-value">93.9%</div>
- <div class="card-change"><el-tag type="success">鈫� 1.8% 杈冩槰鏃�</el-tag></div>
+ <div class="card-value">{{ bigscreendata.dailyCompletionRate ? `${bigscreendata.dailyCompletionRate}%` : '0%' }}</div>
+ <!-- <div class="card-change"><el-tag type="success">鈫� 1.8% 杈冩槰鏃�</el-tag></div> -->
</el-card>
</el-col>
<el-col :span="6">
<el-card class="stats-card">
<div class="card-title">鏈鐞嗗紓甯�</div>
- <div class="card-value">7</div>
- <div class="card-change"><el-tag type="danger">鈫� 1 杈�30鍒嗛挓鍓�</el-tag></div>
+ <div class="card-value">{{ bigscreendata.unhandledExceptionCount || 0 }}</div>
+ <!-- <div class="card-change"><el-tag type="danger">鈫� 1 杈�30鍒嗛挓鍓�</el-tag></div> -->
</el-card>
</el-col>
</el-row>
@@ -49,18 +49,18 @@
<el-row :gutter="20" class="chart-row">
<el-col :span="12">
<el-card class="chart-card">
- <div class="chart-title">搴撳瓨搴撲綅鍒嗗竷锛堝浘鍍忓寲鍗犳瘮锛�<el-button type="text" class="view-btn">鍒囨崲瑙嗗浘</el-button></div>
+ <div class="chart-title">搴撳瓨搴撲綅鍒嗗竷锛堝浘鍍忓寲鍗犳瘮锛�</div>
<div ref="inventoryPieRef" class="chart-container"></div>
</el-card>
</el-col>
<el-col :span="12">
<el-card class="chart-card">
<div class="chart-title">杩�7鏃ュ嚭鍏ュ簱瓒嬪娍锛堝浘鍍忓寲璧板娍锛�
- <el-button-group class="btn-group">
+ <!-- <el-button-group class="btn-group">
<el-button type="primary" size="small">鍏ㄩ儴</el-button>
<el-button type="default" size="small">鍏ュ簱</el-button>
<el-button type="default" size="small">鍑哄簱</el-button>
- </el-button-group>
+ </el-button-group> -->
</div>
<div ref="stockTrendRef" class="chart-container"></div>
</el-card>
@@ -69,19 +69,13 @@
<!-- 鍥捐〃鍖哄煙锛堢浜岃锛� -->
<el-row :gutter="20" class="chart-row">
- <el-col :span="8">
+ <el-col :span="12">
<el-card class="chart-card">
<div class="chart-title">搴撲綅鍒╃敤鐜�</div>
<div ref="locationRateRef" class="chart-container"></div>
</el-card>
</el-col>
- <el-col :span="8">
- <el-card class="chart-card">
- <div class="chart-title">浣滀笟绫诲瀷鍒嗗竷<el-button type="text" class="view-btn">鏌ョ湅璇︽儏</el-button></div>
- <div ref="operationRadarRef" class="chart-container"></div>
- </el-card>
- </el-col>
- <el-col :span="8">
+ <el-col :span="12">
<el-card class="chart-card">
<div class="chart-title">寮傚父绫诲瀷缁熻瓒嬪娍<el-button type="text" class="view-btn">绛涢��</el-button></div>
<div ref="exceptionTrendRef" class="chart-container"></div>
@@ -89,39 +83,9 @@
</el-col>
</el-row>
- <!-- 琛ㄦ牸鍖哄煙 -->
- <el-row :gutter="20" class="table-row">
- <el-col :span="12">
- <el-card class="table-card">
- <div class="table-title">璁㈠崟澶勭悊杩涘害<el-select v-model="orderType" placeholder="閫�璐у叆搴�"
- style="width: 100px; margin-left: 10px;">
- <el-option label="閫�璐у叆搴�" value="return"></el-option>
- <el-option label="鏅�氬嚭搴�" value="normal"></el-option>
- </el-select></div>
- <el-table :data="orderList" border style="width: 100%;">
- <el-table-column prop="orderNo" label="璁㈠崟鍙�" />
- <el-table-column prop="type" label="绫诲瀷" />
- <el-table-column prop="priority" label="浼樺厛绾�">
- <template #default="scope">
- <el-tag
- :type="scope.row.priority === '绱ф��' ? 'danger' : scope.row.priority === '鍔犳��' ? 'warning' : 'success'">
- {{ scope.row.priority }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="progress" label="杩涘害">
- <template #default="scope">
- <el-progress :percentage="scope.row.progress" :color="scope.row.progressColor" />
- </template>
- </el-table-column>
- </el-table>
- <div class="table-pagination">
- <el-button type="text">鍔犺浇鏇村璁㈠崟</el-button>
- <el-pagination layout="prev, pager, next, jumper" :current-page="1" :total="50" />
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
+ <!-- 琛ㄦ牸鍖哄煙 - 缁戝畾鍚庣浣滀笟鏁版嵁 -->
+ <el-row :gutter="20" class="table-row" width="100%">
+ <el-col :span="24">
<el-card class="table-card">
<div class="table-title">瀹炴椂浣滀笟鐩戞帶
<el-button-group class="btn-group">
@@ -131,7 +95,7 @@
<el-button type="default" size="small">鐩樼偣</el-button>
</el-button-group>
</div>
- <el-table :data="operationList" border style="width: 100%;">
+ <el-table :data="bigscreendata.taskList.length ? bigscreendata.taskList : operationList" border style="width: 100%;">
<el-table-column prop="opNo" label="浣滀笟鍗曞彿" />
<el-table-column prop="opType" label="浣滀笟绫诲瀷" />
<el-table-column prop="operator" label="鎿嶄綔浜哄憳" />
@@ -157,18 +121,52 @@
<script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
import * as echarts from 'echarts';
+import http from "@/api/http.js";
// 鍝嶅簲寮忔暟鎹�
const month = ref('month');
const orderType = ref('return');
-// 妯℃嫙鏁版嵁
-const orderList = ref([
- { orderNo: 'OD20251224001', type: '鏅�氬嚭搴�', priority: '绱ф��', progress: 60, progressColor: '#ff4d4f' },
- { orderNo: 'OD20251224002', type: '閫�璐у叆搴�', priority: '鏅��', progress: 80, progressColor: '#1890ff' },
- { orderNo: 'OD20251224003', type: '璋冩嫧璁㈠崟', priority: '鍔犳��', progress: 40, progressColor: '#faad14' },
- { orderNo: 'OD20251224004', type: '鏅�氬嚭搴�', priority: '甯歌', progress: 100, progressColor: '#52c41a' }
-]);
+// 鍚庣杩斿洖鏁版嵁锛堝搷搴斿紡锛�
+const bigscreendata = ref({
+ totalStockQuantity: 0,
+ unOutBoundOrderCount: 0,
+ dailyCompletionRate: 0,
+ unhandledExceptionCount: 0,
+ locationUtilizationRate: 0,
+ dailyInOutBoundList: [],
+ taskList: [],
+ inventoryLocationDist: [], // 搴撳瓨搴撲綅鍒嗗竷鏁版嵁
+ exceptionTypeTrend: [] // 寮傚父绫诲瀷瓒嬪娍鏁版嵁
+});
+
+// 鏁板瓧鏍煎紡鍖栵紙鍗冨垎浣嶅垎闅旓級
+const formatNumber = (num) => {
+ if (!num) return '0';
+ return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+};
+
+// 鑾峰彇鍚庣澶у睆鏁版嵁
+const fetchBigGreenData = async () => {
+ try {
+ // 淇锛氫唬鐞嗗凡閰嶇疆锛岀Щ闄ゅ浣欑殑/api鍓嶇紑
+ const res = await http.get('/api/BigScreen/GetBigGreenData');
+ console.log('澶у睆鏁版嵁', res);
+ // 璧嬪�煎搷搴斿紡鏁版嵁锛堝吋瀹瑰悗绔粺涓�杩斿洖鏍煎紡锛�
+ bigscreendata.value = res.data || res;
+ // 鏁版嵁鏇存柊鍚庡埛鏂板浘琛�
+ nextTick(() => {
+ refreshCharts();
+ });
+ } catch (error) {
+ console.error('鑾峰彇澶у睆鏁版嵁澶辫触锛�', error);
+ ElMessage.error('鏁版嵁鑾峰彇澶辫触锛岃妫�鏌ュ悗绔帴鍙f槸鍚︽甯�'); // 鏇挎崲涓篍lement Plus娑堟伅鎻愮ず
+ }
+};
+
+console.log('澶у睆鏁版嵁111', bigscreendata.value);
+
+// 澶囩敤妯℃嫙鏁版嵁
const operationList = ref([
{ opNo: 'JW251224001', opType: '鍏ュ簱', operator: '寮犱笁', startTime: '15:30:22', status: '澶勭悊涓�' },
{ opNo: 'CK251224002', opType: '鍑哄簱', operator: '鏉庡洓', startTime: '15:25:10', status: '宸插畬鎴�' },
@@ -176,29 +174,38 @@
{ opNo: 'SC251224005', opType: '涓婃灦', operator: '瀛欎竷', startTime: '15:10:18', status: '寮傚父' }
]);
-// 鍥捐〃瀹瑰櫒
+// 鍥捐〃瀹瑰櫒Ref
const inventoryPieRef = ref(null);
const stockTrendRef = ref(null);
const locationRateRef = ref(null);
-const operationRadarRef = ref(null);
const exceptionTrendRef = ref(null);
-// 鍥捐〃瀹炰緥
+// 鍥捐〃瀹炰緥锛堝叏灞�绠$悊锛岀敤浜庨攢姣佸拰resize锛�
let inventoryPieChart = null;
let stockTrendChart = null;
let locationRateChart = null;
-let operationRadarChart = null;
let exceptionTrendChart = null;
-// 鍒濆鍖栧簱瀛樺簱浣嶅垎甯冮ゼ鍥�
+// 鍒濆鍖栧簱瀛樺簱浣嶅垎甯冮ゼ鍥撅紙鍏宠仈鍚庣鏁版嵁锛�
const initInventoryPie = () => {
if (!inventoryPieRef.value) return;
+ // 閿�姣佹棫瀹炰緥锛岄槻姝㈠唴瀛樻硠婕�
if (inventoryPieChart) {
inventoryPieChart.dispose();
}
inventoryPieChart = echarts.init(inventoryPieRef.value);
+ // 浼樺厛浣跨敤鍚庣鏁版嵁锛屾棤鏁版嵁鍒欑敤榛樿鍊�
+ const locationData = bigscreendata.value.inventoryLocationDist.length
+ ? bigscreendata.value.inventoryLocationDist
+ : [
+ { value: 48.7, name: '甯告俯鍖篈鍖�', itemStyle: { color: '#5470c6' } },
+ { value: 29.2, name: '鍐疯棌鍖築鍖�', itemStyle: { color: '#91cc75' } },
+ { value: 21.9, name: '淇濈◣鍖篊鍖�', itemStyle: { color: '#fac858' } },
+ { value: 2.2, name: '娈嬫鍝佸尯D鍖�', itemStyle: { color: '#ee6666' } }
+ ];
+
const option = {
tooltip: {
trigger: 'item',
@@ -207,7 +214,7 @@
legend: {
bottom: 0,
left: 'center',
- data: ['甯告俯鍖篈鍖�', '鍐疯棌鍖築鍖�', '淇濈◣鍖篊鍖�', '娈嬫鍝佸尯D鍖�']
+ data: locationData.map(item => item.name)
},
series: [{
name: '搴撳瓨搴撲綅鍒嗗竷',
@@ -234,12 +241,7 @@
labelLine: {
show: false
},
- data: [
- { value: 48.7, name: '甯告俯鍖篈鍖�', itemStyle: { color: '#5470c6' } },
- { value: 29.2, name: '鍐疯棌鍖築鍖�', itemStyle: { color: '#91cc75' } },
- { value: 21.9, name: '淇濈◣鍖篊鍖�', itemStyle: { color: '#fac858' } },
- { value: 2.2, name: '娈嬫鍝佸尯D鍖�', itemStyle: { color: '#ee6666' } }
- ]
+ data: locationData
}]
};
@@ -247,7 +249,7 @@
return inventoryPieChart;
};
-// 鍒濆鍖栬繎7鏃ュ嚭鍏ュ簱瓒嬪娍鍥�
+// 鍒濆鍖栬繎7鏃ュ嚭鍏ュ簱瓒嬪娍鍥撅紙鍏宠仈鍚庣鏁版嵁锛�
const initStockTrend = () => {
if (!stockTrendRef.value) return;
@@ -256,6 +258,19 @@
}
stockTrendChart = echarts.init(stockTrendRef.value);
+ // 浼樺厛浣跨敤鍚庣鏁版嵁
+ const trendData = bigscreendata.value.dailyInOutBoundList.length
+ ? bigscreendata.value.dailyInOutBoundList
+ : [
+ { date: '12-18', inNum: 10, outNum: 16 },
+ { date: '12-19', inNum: 12, outNum: 18 },
+ { date: '12-20', inNum: 10, outNum: 14 },
+ { date: '12-21', inNum: 12, outNum: 18 },
+ { date: '12-22', inNum: 10, outNum: 16 },
+ { date: '12-23', inNum: 12, outNum: 18 },
+ { date: '12-24', inNum: 12, outNum: 20 }
+ ];
+
const option = {
tooltip: {
trigger: 'axis',
@@ -277,7 +292,7 @@
xAxis: {
type: 'category',
boundaryGap: true,
- data: ['12-18', '12-19', '12-20', '12-21', '12-22', '12-23', '12-24']
+ data: trendData.map(item => item.date)
},
yAxis: {
type: 'value',
@@ -289,14 +304,14 @@
name: '鍏ュ簱閲�',
type: 'bar',
barWidth: '30%',
- data: [10, 12, 10, 12, 10, 12, 12],
+ data: trendData.map(item => item.inNum),
itemStyle: { color: '#52c41a' }
},
{
name: '鍑哄簱閲�',
type: 'bar',
barWidth: '30%',
- data: [16, 18, 14, 18, 16, 18, 20],
+ data: trendData.map(item => item.outNum),
itemStyle: { color: '#1890ff' }
}
]
@@ -306,161 +321,76 @@
return stockTrendChart;
};
-// 鍒濆鍖栧簱浣嶅埄鐢ㄧ巼鐜舰鍥�
+// 鍒濆鍖栧簱浣嶅埄鐢ㄧ巼鐜舰鍥撅紙淇锛氱粺涓�瀹炰緥绠$悊锛屽叧鑱斿悗绔暟鎹級
const initLocationRate = () => {
if (!locationRateRef.value) return;
+ // 閿�姣佹棫瀹炰緥
if (locationRateChart) {
locationRateChart.dispose();
}
locationRateChart = echarts.init(locationRateRef.value);
+ // 浼樺厛浣跨敤鍚庣鏁版嵁锛屾棤鏁版嵁鍒欑敤榛樿鍊�
+ console.log('搴撲綅鍒╃敤鐜囨暟鎹�', bigscreendata.value.locationUtilizationRate);
+ const utilizationRate = bigscreendata.value.locationUtilizationRate || 86.2;
+ const freeRate = 100 - utilizationRate;
+
const option = {
tooltip: {
- formatter: '{a} <br/>{b} : {c}%'
+ trigger: 'item',
+ formatter: '{b}: {c}%'
},
- series: [{
- name: '搴撲綅鍒╃敤鐜�',
- type: 'gauge',
- min: 0,
- max: 100,
- splitNumber: 10,
- radius: '90%',
- center: ['50%', '55%'],
- startAngle: 180,
- endAngle: 0,
- progress: {
- show: true,
- width: 20,
- itemStyle: {
- color: '#1890ff'
+ legend: {
+ bottom: 0,
+ left: 'center',
+ data: ['宸插崰鐢ㄥ簱浣�', '绌洪棽搴撲綅'],
+ textStyle: { fontSize: 12, color: '#666' }
+ },
+ graphic: [
+ {
+ type: 'text',
+ left: 'right',
+ top: '10%',
+ style: {
+ text: `${utilizationRate}%`,
+ fontSize: 24,
+ fontWeight: 'bold',
+ fill: '#333'
}
},
- axisLine: {
- lineStyle: {
- width: 20,
- color: [[1, 'rgba(200,200,200,0.3)']]
+ {
+ type: 'text',
+ left: 'right',
+ top: '25%',
+ style: {
+ text: '搴撲綅鍒╃敤鐜�',
+ fontSize: 14,
+ fill: '#666'
}
- },
- axisTick: {
- distance: -30,
- splitNumber: 5,
- lineStyle: {
- width: 2,
- color: '#999'
- }
- },
- splitLine: {
- distance: -30,
- length: 14,
- lineStyle: {
- width: 3,
- color: '#999'
- }
- },
- axisLabel: {
- distance: -20,
- color: '#999',
- fontSize: 12
- },
- anchor: {
- show: false
- },
- title: {
- show: true,
- offsetCenter: [0, '30%'],
- fontSize: 16,
- fontWeight: 'bold'
- },
- detail: {
- valueAnimation: true,
- formatter: '{value}%',
- fontSize: 20,
- fontWeight: 'bold',
- offsetCenter: [0, '70%']
- },
- data: [{
- value: 86.2,
- name: '搴撲綅鍒╃敤鐜�'
- }]
- }]
+ }
+ ],
+ series: [
+ {
+ type: 'pie',
+ radius: ['50%', '70%'],
+ center: ['40%', '50%'],
+ avoidLabelOverlap: false,
+ label: { show: false },
+ labelLine: { show: false },
+ data: [
+ { value: utilizationRate, name: '宸插崰鐢ㄥ簱浣�', itemStyle: { color: '#1890ff' } },
+ { value: freeRate, name: '绌洪棽搴撲綅', itemStyle: { color: '#e5e9f2' } }
+ ]
+ }
+ ]
};
locationRateChart.setOption(option);
return locationRateChart;
};
-// 鍒濆鍖栦綔涓氱被鍨嬮浄杈惧浘
-const initOperationRadar = () => {
- if (!operationRadarRef.value) return;
-
- if (operationRadarChart) {
- operationRadarChart.dispose();
- }
-
- operationRadarChart = echarts.init(operationRadarRef.value);
- const option = {
- tooltip: {
- trigger: 'item'
- },
- legend: {
- show: false
- },
- radar: {
- indicator: [
- { name: '鍑哄簱浣滀笟', max: 100 },
- { name: '鍏ュ簱浣滀笟', max: 100 },
- { name: '璋冩嫧浣滀笟', max: 100 },
- { name: '鐩樼偣浣滀笟', max: 100 }
- ],
- shape: 'circle',
- splitNumber: 5,
- axisName: {
- color: '#666'
- },
- splitLine: {
- lineStyle: {
- color: 'rgba(0,0,0,0.1)'
- }
- },
- splitArea: {
- show: true,
- areaStyle: {
- color: ['rgba(255,255,255,0.8)', 'rgba(200,200,200,0.2)']
- }
- }
- },
- series: [{
- name: '浣滀笟绫诲瀷鍒嗗竷',
- type: 'radar',
- symbolSize: 8,
- areaStyle: {
- color: 'rgba(24,144,255,0.3)'
- },
- lineStyle: {
- width: 2
- },
- itemStyle: {
- color: '#1890ff'
- },
- data: [{
- value: [45, 30, 15, 10],
- name: '浣滀笟鍗犳瘮',
- label: {
- show: true,
- formatter: function (params) {
- return params.value + '%';
- }
- }
- }]
- }]
- };
-
- operationRadarChart.setOption(option);
- return operationRadarChart;
-};
-
-// 鍒濆鍖栧紓甯歌秼鍔挎姌绾垮浘
+// 鍒濆鍖栧紓甯哥被鍨嬬粺璁¤秼鍔垮浘锛堝叧鑱斿悗绔暟鎹級
const initExceptionTrend = () => {
if (!exceptionTrendRef.value) return;
@@ -469,6 +399,17 @@
}
exceptionTrendChart = echarts.init(exceptionTrendRef.value);
+ // 浼樺厛浣跨敤鍚庣鏁版嵁
+ const exceptionData = bigscreendata.value.exceptionTypeTrend.length
+ ? bigscreendata.value.exceptionTypeTrend
+ : {
+ dates: ['12-18', '12-19', '12-20', '12-21', '12-22', '12-23', '12-24'],
+ stockShort: [10, 11, 9, 12, 10, 13, 12],
+ orderTimeout: [8, 9, 7, 8, 7, 9, 8],
+ locationException: [4, 5, 2, 4, 3, 5, 4],
+ checkDiff: [2, 3, 1, 2, 1, 3, 2]
+ };
+
const option = {
tooltip: {
trigger: 'axis',
@@ -490,7 +431,7 @@
xAxis: {
type: 'category',
boundaryGap: false,
- data: ['12-18', '12-19', '12-20', '12-21', '12-22', '12-23', '12-24']
+ data: exceptionData.dates
},
yAxis: {
type: 'value',
@@ -503,11 +444,9 @@
smooth: true,
symbol: 'circle',
symbolSize: 8,
- data: [10, 11, 9, 12, 10, 13, 12],
+ data: exceptionData.stockShort,
itemStyle: { color: '#ff4d4f' },
- lineStyle: {
- width: 3
- }
+ lineStyle: { width: 3 }
},
{
name: '璁㈠崟瓒呮椂',
@@ -515,11 +454,9 @@
smooth: true,
symbol: 'circle',
symbolSize: 8,
- data: [8, 9, 7, 8, 7, 9, 8],
+ data: exceptionData.orderTimeout,
itemStyle: { color: '#faad14' },
- lineStyle: {
- width: 3
- }
+ lineStyle: { width: 3 }
},
{
name: '搴撲綅寮傚父',
@@ -527,11 +464,9 @@
smooth: true,
symbol: 'circle',
symbolSize: 8,
- data: [4, 5, 2, 4, 3, 5, 4],
+ data: exceptionData.locationException,
itemStyle: { color: '#722ed1' },
- lineStyle: {
- width: 3
- }
+ lineStyle: { width: 3 }
},
{
name: '鐩樼偣宸紓',
@@ -539,11 +474,9 @@
smooth: true,
symbol: 'circle',
symbolSize: 8,
- data: [2, 3, 1, 2, 1, 3, 2],
+ data: exceptionData.checkDiff,
itemStyle: { color: '#13c2c2' },
- lineStyle: {
- width: 3
- }
+ lineStyle: { width: 3 }
}
]
};
@@ -552,13 +485,12 @@
return exceptionTrendChart;
};
-// 鍒锋柊鎵�鏈夊浘琛�
+// 鍒锋柊鎵�鏈夊浘琛紙绉婚櫎鏃犳晥闆疯揪鍥鹃�昏緫锛�
const refreshCharts = () => {
const charts = [
initInventoryPie,
initStockTrend,
initLocationRate,
- initOperationRadar,
initExceptionTrend
];
@@ -570,13 +502,12 @@
});
};
-// 鐩戝惉绐楀彛澶у皬鍙樺寲
+// 绐楀彛澶у皬鍙樺寲鐩戝惉
const handleResize = () => {
const charts = [
inventoryPieChart,
stockTrendChart,
locationRateChart,
- operationRadarChart,
exceptionTrendChart
];
@@ -587,26 +518,26 @@
});
};
-// 鎸傝浇鍚庡垵濮嬪寲鍥捐〃
+// 缁勪欢鎸傝浇鏃讹細鍏堣姹傛暟鎹紝鍐嶅垵濮嬪寲鍥捐〃
onMounted(() => {
+ // 鍏堣幏鍙栧悗绔暟鎹�
+ fetchBigGreenData();
+ // 鍒濆鍖栧浘琛紙纭繚DOM宸叉覆鏌擄級
nextTick(() => {
initInventoryPie();
initStockTrend();
initLocationRate();
- initOperationRadar();
initExceptionTrend();
-
window.addEventListener('resize', handleResize);
});
});
-// 缁勪欢鍗歌浇鏃舵竻鐞�
+// 缁勪欢鍗歌浇鏃讹細閿�姣佸浘琛ㄥ疄渚嬶紝绉婚櫎浜嬩欢鐩戝惉
onUnmounted(() => {
const charts = [
inventoryPieChart,
stockTrendChart,
locationRateChart,
- operationRadarChart,
exceptionTrendChart
];
@@ -677,7 +608,7 @@
}
.chart-card {
- height: 320px;
+ height: 350px;
padding: 15px;
display: flex;
flex-direction: column;
@@ -686,7 +617,7 @@
.chart-container {
width: 100%;
height: 100%;
- min-height: 250px;
+ min-height: 240px;
flex: 1;
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs"
new file mode 100644
index 0000000..b32da1f
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.cs"
@@ -0,0 +1,196 @@
+锘縰sing IBigBreenService;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEA_Common.LocationEnum;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Core;
+using WIDESEA_Core.BaseRepository;
+using WIDESEA_Model.Models;
+
+namespace BigGreenService
+{
+ public class BigGreenService : IBigGreenService
+ {
+ private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
+ private readonly IRepository<Dt_OutboundOrder> _outBoundOrderRepository;
+ private readonly IRepository<Dt_LocationInfo> _locationInfoRepository;
+ private readonly IRepository<Dt_OutboundOrderDetail> _outBoundOrderDetailRepository;
+ private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository;
+ private readonly IRepository<Dt_Task> _taskRepository;
+
+ public BigGreenService(IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_OutboundOrder> outBoundOrderRepository, IRepository<Dt_LocationInfo> locationInfoRepository,IRepository<Dt_OutboundOrderDetail> outBoundOrderDetailRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository,IRepository<Dt_Task> taskRepository)
+ {
+ _stockInfoDetailRepository = stockInfoDetailRepository;
+ _outBoundOrderRepository = outBoundOrderRepository;
+ _locationInfoRepository = locationInfoRepository;
+ _outBoundOrderDetailRepository = outBoundOrderDetailRepository;
+ _inboundOrderDetailRepository = inboundOrderDetailRepository;
+ _taskRepository = taskRepository;
+ }
+ public WebResponseContent GetBigGreenData()
+ {
+ //璁$畻鎬诲簱瀛樻暟閲�
+ var totalStockQuantity = _stockInfoDetailRepository.Db.Queryable<Dt_StockInfoDetail>().Sum(x => (decimal?)x.StockQuantity) ?? 0;
+
+ //璁$畻寰呭嚭搴撹鍗�
+ var targetStatus = new List<int>
+ {
+ (int)OutOrderStatusEnum.鍑哄簱涓�,
+ (int)OutOrderStatusEnum.鏈紑濮�
+ };
+ var unOutBound =_outBoundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x =>targetStatus.Contains(x.OrderStatus)).Count();
+
+ //璁$畻搴撲綅鍒╃敤鐜�
+ var freeLocation =_locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x=>x.LocationStatus==(int)LocationStatusEnum.Free).Count();
+ var inStockLocation =_locationInfoRepository.Db.Queryable<Dt_LocationInfo>().Where(x => x.LocationStatus == (int)LocationStatusEnum.InStock).Count();
+ int totalLocation = freeLocation + inStockLocation;
+ decimal locationUtilizationRate = totalLocation == 0
+ ? 0
+ : Math.Round((decimal)inStockLocation / totalLocation, 4);
+
+ // 4. 鑾峰彇杩�7鏃ユ瘡鏃ュ嚭鍏ュ簱鏄庣粏锛堟牳蹇冧慨鏀癸細璋冪敤涓婇潰鐨勬柟娉曪級
+ var dailyInOutBoundList = Get7DaysDailyInOutBound();
+
+ //浠诲姟
+ List<Dt_Task> tasks = _taskRepository.QueryData();
+
+ var bigGreenData = new BigGreenDataDto
+ {
+ TotalStockQuantity=totalStockQuantity,
+ UnOutBoundOrderCount = unOutBound,
+ LocationUtilizationRate = locationUtilizationRate,
+ DailyInOutBoundList = dailyInOutBoundList,
+ TaskList = tasks
+ };
+ return WebResponseContent.Instance.OK(data: bigGreenData);
+ }
+
+ /// <summary>
+ /// 鑾峰彇杩�7鏃ユ瘡鏃ュ嚭鍏ュ簱鏄庣粏
+ /// </summary>
+ /// <returns>姣忔棩鍑哄叆搴撴槑缁嗗垪琛�</returns>
+ private List<DailyInOutBoundDto> Get7DaysDailyInOutBound()
+ {
+ // 1. 瀹氫箟鏃堕棿鑼冨洿锛堣繎7涓嚜鐒舵棩锛�
+ DateTime endDate = DateTime.Today;
+ DateTime startDate = endDate.AddDays(-6);
+ // 鐢熸垚杩�7鏃ユ墍鏈夋棩鏈燂紙纭繚鏃犵己澶憋紝鍗充娇鏌愪竴澶╂棤鏁版嵁涔熻繑鍥�0锛�
+ var all7Days = Enumerable.Range(0, 7)
+ .Select(i => endDate.AddDays(-i).ToString("MM-dd"))
+ .Reverse() // 鎸夋棩鏈熷崌搴忔帓鍒楋紙浠�7澶╁墠鍒颁粖鏃ワ級
+ .ToList();
+
+ // 2. 鏌ヨ姣忔棩鍑哄簱鏄庣粏锛堟寜鏃ユ湡鍒嗙粍锛�
+ var dailyOutboundList = _outBoundOrderDetailRepository.Db
+ .Queryable<Dt_OutboundOrderDetail>()
+ .Where(x => x.CreateDate >= startDate
+ && x.CreateDate < endDate.AddDays(1))
+ .GroupBy(x => x.CreateDate) // 鎸夋棩鏈熸牸寮忓寲鍒嗙粍
+ .Select(x => new
+ {
+ Date = x.CreateDate.ToString( "MM-dd"),
+ DailyOutbound = SqlFunc.AggregateSum((decimal?)x.OverOutQuantity) ?? 0
+ })
+ .ToList()
+ .ToDictionary(k => k.Date, v => v.DailyOutbound); // 杞负瀛楀吀鏂逛究鍖归厤
+
+ // 3. 鏌ヨ姣忔棩鍏ュ簱鏄庣粏锛堟寜鏃ユ湡鍒嗙粍锛�
+ var dailyInboundList = _inboundOrderDetailRepository.Db
+ .Queryable<Dt_InboundOrderDetail>()
+ .Where(x => x.CreateDate != null // 杩囨护绌烘棩鏈�
+ && x.CreateDate >= startDate
+ && x.CreateDate < endDate.AddDays(1))
+ .GroupBy(x => x.CreateDate).Distinct() // 鎸夋棩鏈熸牸寮忓寲鍒嗙粍
+ .Select(x => new
+ {
+ Date = x.CreateDate.ToString("MM-dd"),
+ DailyInbound = SqlFunc.AggregateSum((decimal?)x.OverInQuantity) ?? 0
+ })
+ .ToList()
+ .ToDictionary(k => k.Date, v => v.DailyInbound); // 杞负瀛楀吀鏂逛究鍖归厤
+
+ // 4. 鍚堝苟姣忔棩鏁版嵁锛堢‘淇�7澶╂棩鏈熷畬鏁达紝鏃犳暟鎹ˉ0锛�
+ var dailyInOutBoundList = all7Days.Select(date => new DailyInOutBoundDto
+ {
+ Date = date,
+ DailyOutboundQuantity = dailyOutboundList.ContainsKey(date) ? dailyOutboundList[date] : 0,
+ DailyInboundQuantity = dailyInboundList.ContainsKey(date) ? dailyInboundList[date] : 0,
+
+ }).ToList();
+
+ return dailyInOutBoundList;
+ }
+
+ /// <summary>
+ /// 澶у睆/姹囨�绘暟鎹繑鍥濪TO锛堝ぇ缁挎暟鎹眹鎬伙級
+ /// </summary>
+ public class BigGreenDataDto
+ {
+ /// <summary>
+ /// 鎬诲簱瀛樻暟閲�
+ /// </summary>
+ public decimal TotalStockQuantity { get; set; }
+
+ /// <summary>
+ /// 寰呭嚭搴撹鍗曟暟閲忥紙鍑哄簱涓�+鏈紑濮嬶級
+ /// </summary>
+ public int UnOutBoundOrderCount { get; set; }
+
+ /// <summary>
+ /// 绌洪棽搴撲綅鏁伴噺
+ /// </summary>
+ public int FreeLocationCount { get; set; }
+
+ /// <summary>
+ /// 鍗犵敤搴撲綅鏁伴噺锛堝凡瀛樺簱锛�
+ /// </summary>
+ public int InStockLocationCount { get; set; }
+
+ /// <summary>
+ /// 搴撲綅鍒╃敤鐜囷紙灏忔暟褰㈠紡锛屽0.85瀵瑰簲85%锛�
+ /// </summary>
+ public decimal LocationUtilizationRate { get; set; }
+
+ /// <summary>
+ /// 杩�7鏃ユ瘡鏃ュ嚭鍏ュ簱鏄庣粏
+ /// </summary>
+ public List<DailyInOutBoundDto> DailyInOutBoundList { get; set; } = new List<DailyInOutBoundDto>();
+
+ /// <summary>
+ /// 杩�7鏃ュ噣鍏ュ簱閲忥紙鍏ュ簱-鍑哄簱锛�
+ /// </summary>
+ public decimal NetStock7Days { get; set; }
+
+ /// <summary>
+ /// 浠诲姟鍒楄〃
+ /// </summary>
+ public List<Dt_Task> TaskList { get; set; } = new List<Dt_Task>();
+ }
+
+ /// <summary>
+ /// 姣忔棩鍑哄叆搴撴槑缁咲TO
+ /// </summary>
+ public class DailyInOutBoundDto
+ {
+ /// <summary>
+ /// 鏃ユ湡锛堟牸寮忥細yyyy-MM-dd锛�
+ /// </summary>
+ public string Date { get; set; }
+
+ /// <summary>
+ /// 褰撴棩鍑哄簱鎬婚噺
+ /// </summary>
+ public decimal DailyOutboundQuantity { get; set; }
+
+ /// <summary>
+ /// 褰撴棩鍏ュ簱鎬婚噺
+ /// </summary>
+ public decimal DailyInboundQuantity { get; set; }
+
+ }
+ }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.csproj"
new file mode 100644
index 0000000..47ee17b
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/BigGreenService/BigGreenService.csproj"
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net6.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\IBigBreen\IBigBreenService.csproj" />
+ <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/IBigBreen/IBigBreenService.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/IBigBreen/IBigBreenService.csproj"
new file mode 100644
index 0000000..e096efb
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/IBigBreen/IBigBreenService.csproj"
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net6.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/IBigBreen/IBigGreenService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/IBigBreen/IBigGreenService.cs"
new file mode 100644
index 0000000..4aeaffc
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/IBigBreen/IBigGreenService.cs"
@@ -0,0 +1,14 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEA_Core;
+
+namespace IBigBreenService
+{
+ public interface IBigGreenService : IDependency
+ {
+ WebResponseContent GetBigGreenData();
+ }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index 1f2ce30..e6b3476 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -4,6 +4,7 @@
using SqlSugar;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.StockEnum;
+using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
@@ -20,7 +21,7 @@
public partial class StockInfoService : ServiceBase<Dt_StockInfo, IRepository<Dt_StockInfo>>, IStockInfoService
{
private readonly IMapper _mapper;
-
+ private readonly IUnitOfWorkManage _unitOfWorkManage;
private readonly IRecordService _recordService;
public IRepository<Dt_StockInfo> Repository => BaseDal;
private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
@@ -29,7 +30,7 @@
private readonly IRepository<Dt_AllocateOrder> _allocateRepository;
private readonly ILocationInfoService _locationInfoService;
- public StockInfoService(IRepository<Dt_StockInfo> BaseDal, IMapper mapper, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRecordService recordService, ILocationInfoService locationInfoService, IOutboundOrderService outboundOrderService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
+ public StockInfoService(IRepository<Dt_StockInfo> BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRecordService recordService, ILocationInfoService locationInfoService, IOutboundOrderService outboundOrderService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
{
_mapper = mapper;
_stockInfoDetailRepository = stockInfoDetailRepository;
@@ -37,6 +38,7 @@
_locationInfoService = locationInfoService;
_outboundOrderService = outboundOrderService;
_allocateRepository = allocateRepository;
+ _unitOfWorkManage = unitOfWorkManage;
//_outboundOrderDetailService = outboundOrderDetailService;
}
@@ -55,7 +57,34 @@
return stockInfo;
}
+ public override WebResponseContent DeleteData(object[] keys)
+ {
+ try
+ {
+ List<int> stockIds = keys.Select(x => x.ObjToInt()).ToList();
+ List<Dt_StockInfo> stockInfos = BaseDal.QueryData(x => stockIds.Contains(x.Id) && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt());
+
+ List<string> locationCodes = stockInfos.Select(x => x.LocationCode).Distinct().ToList();
+
+ List<Dt_LocationInfo> locationInfos = _locationInfoService.Repository.QueryData(x => locationCodes.Contains(x.LocationCode) && x.LocationStatus == LocationStatusEnum.Pallet.ObjToInt());
+
+ stockInfos = stockInfos.Where(x => locationInfos.Select(l => l.LocationCode).Contains(x.LocationCode)).ToList();
+
+ _unitOfWorkManage.BeginTran();
+ _locationInfoService.UpdateLocationStatus(locationInfos, LocationStatusEnum.Free);
+
+ BaseDal.DeleteAndMoveIntoHty(stockInfos, WIDESEA_Core.Enums.OperateTypeEnum.浜哄伐鍒犻櫎);
+ _unitOfWorkManage.CommitTran();
+
+ return WebResponseContent.Instance.OK("鍒犻櫎鎴愬姛");
+ }
+ catch(Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error("鍒犻櫎澶辫触锛�"+ex.Message);
+ }
+ }
public void AddMaterielGroup(Dt_StockInfo stockInfo)
{
decimal beforeQuantity = 0;
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln"
index 8026feb..58ada50 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln"
@@ -76,6 +76,12 @@
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LogLibrary", "LogLibrary\LogLibrary.csproj", "{A7C339A4-CC00-2872-6005-A272626BC5F1}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BigGreen", "BigGreen", "{23BE058E-6D08-4075-99BD-8054DC328FFE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBigBreenService", "IBigBreen\IBigBreenService.csproj", "{21939E11-C422-4E19-BDD6-333804F5128C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BigGreenService", "BigGreenService\BigGreenService.csproj", "{2CB630FF-FEB0-46DB-B2A1-88F34DB91725}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -374,6 +380,30 @@
{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|Any CPU.Build.0 = Release|Any CPU
{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|x86.ActiveCfg = Release|x86
{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|x86.Build.0 = Release|x86
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Debug|x86.Build.0 = Debug|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|Any CPU.ActiveCfg = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|Any CPU.Build.0 = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|x86.ActiveCfg = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Dev|x86.Build.0 = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Release|x86.ActiveCfg = Release|Any CPU
+ {21939E11-C422-4E19-BDD6-333804F5128C}.Release|x86.Build.0 = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Debug|x86.Build.0 = Debug|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|Any CPU.ActiveCfg = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|Any CPU.Build.0 = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|x86.ActiveCfg = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Dev|x86.Build.0 = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|x86.ActiveCfg = Release|Any CPU
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -406,6 +436,9 @@
{02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {60DE2920-37C6-4C2B-A053-6B1B2DAF047A}
{D35E0897-0E66-4E1E-B8DA-28701BE3B2B7} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{A6E822A3-5A09-4B18-BEE6-57CC7D7B8BEC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {23BE058E-6D08-4075-99BD-8054DC328FFE} = {60DE2920-37C6-4C2B-A053-6B1B2DAF047A}
+ {21939E11-C422-4E19-BDD6-333804F5128C} = {23BE058E-6D08-4075-99BD-8054DC328FFE}
+ {2CB630FF-FEB0-46DB-B2A1-88F34DB91725} = {23BE058E-6D08-4075-99BD-8054DC328FFE}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {599A7267-7402-4143-84AE-9B407FC2BB69}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs"
index 1b3e918..76da4b1 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/LocationInfoController.cs"
@@ -57,5 +57,17 @@
var lists = Service.GetLocationTypes();
return WebResponseContent.Instance.OK("", lists);
}
+
+ [HttpPost, Route("LocationDisableStatus")]
+ public WebResponseContent LocationDisableStatus([FromBody]int[] keys)
+ {
+ return Service.LocationDisableStatus(keys);
+ }
+
+ [HttpPost, Route("LocationEnableStatus")]
+ public WebResponseContent LocationEnableStatus([FromBody] int[] keys)
+ {
+ return Service.LocationEnableStatus(keys);
+ }
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/BigGreen/BigScreenController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/BigGreen/BigScreenController.cs"
new file mode 100644
index 0000000..bf058da
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/BigGreen/BigScreenController.cs"
@@ -0,0 +1,25 @@
+锘縰sing IBigBreenService;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
+
+namespace WIDESEA_WMSServer.Controllers.BigGreen
+{
+ [Route("api/BigScreen")]
+ [ApiController]
+ public class BigScreenController : ControllerBase
+ {
+ private readonly IBigGreenService _bigGreenService;
+ public BigScreenController(IBigGreenService bigGreenService)
+ {
+ _bigGreenService = bigGreenService;
+ }
+
+ [HttpGet, Route("GetBigGreenData"),AllowAnonymous]
+ public WebResponseContent GetBigGreenData()
+ {
+ return _bigGreenService.GetBigGreenData();
+ }
+ }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs"
index 09e3e2e..2c7e0ee 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Jobs/QuartzJobMildd.cs"
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Text;
using WIDESEA.QuartzJob;
+using WIDESEA_Core;
using WIDESEA_Core.Helper;
namespace WIDESEA_WMSServer
@@ -36,6 +37,12 @@
},
};
+
+ //Console.WriteLine("HostEnvironment"+App.HostEnvironment.IsDevelopment());
+ if(App.HostEnvironment.IsDevelopment())
+ {
+ return;
+ }
foreach (var item in allQzServices)
{
var ResuleModel = schedulerCenter.AddScheduleJobAsync(item).Result;
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj"
index 96225ab..dfd8728 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj"
@@ -55,6 +55,7 @@
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\BigGreenService\BigGreenService.csproj" />
<ProjectReference Include="..\WIDESEA_AllocateService\WIDESEA_AllocateService.csproj" />
<ProjectReference Include="..\WIDESEA_BasicService\WIDESEA_BasicService.csproj" />
<ProjectReference Include="..\WIDESEA_CheckService\WIDESEA_CheckService.csproj" />
--
Gitblit v1.9.3