From e1c5dd1b209b7f444dd86d686e83d6e9f76b5632 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 14 十月 2025 13:10:32 +0800
Subject: [PATCH] 生产管控-智能排产页面联调
---
src/views/productionControl/intelligentScheduling/index.vue | 203 ++++++++++++++++++++++++++++++--------------------
1 files changed, 122 insertions(+), 81 deletions(-)
diff --git a/src/views/productionControl/intelligentScheduling/index.vue b/src/views/productionControl/intelligentScheduling/index.vue
index 31d8a97..c21c397 100644
--- a/src/views/productionControl/intelligentScheduling/index.vue
+++ b/src/views/productionControl/intelligentScheduling/index.vue
@@ -13,7 +13,7 @@
:shortcuts="dateShortcuts"
/>
</el-form-item>
- <el-form-item label="鐓ょ">
+ <!-- <el-form-item label="鐓ょ">
<el-input v-model="searchParams.coalType" placeholder="璇疯緭鍏ョ叅绉�" clearable />
</el-form-item>
<el-form-item label="鎺掍骇鐘舵��">
@@ -23,11 +23,11 @@
<el-option label="鎺掍骇涓�" value="processing" />
<el-option label="宸插畬鎴�" value="completed" />
</el-select>
- </el-form-item>
+ </el-form-item> -->
<el-form-item>
<el-button type="primary" @click="handleSearch" :loading="loading">鏌ヨ</el-button>
<el-button @click="handleReset">閲嶇疆</el-button>
- <el-button type="success" @click="handleRandomScheduling">闅忔満鎺掍骇</el-button>
+ <!-- <el-button type="success" @click="handleRandomScheduling">闅忔満鎺掍骇</el-button> -->
</el-form-item>
</el-form>
</el-card>
@@ -40,7 +40,7 @@
</div>
<div class="card-content">
<div class="card-title">鎬绘帓浜ч噺</div>
- <div class="card-value">{{ totalScheduledQuantity.toFixed(2) }} 鍚�</div>
+ <div class="card-value">{{ statisticsData.totalOutput.toFixed(2) }} 鍚�</div>
</div>
</div>
@@ -50,7 +50,7 @@
</div>
<div class="card-content">
<div class="card-title">宸插畬鎴愭帓浜�</div>
- <div class="card-value">{{ completedScheduledQuantity.toFixed(2) }} 鍚�</div>
+ <div class="card-value">{{ statisticsData.completedScheduling }} 鍚�</div>
</div>
</div>
@@ -60,7 +60,7 @@
</div>
<div class="card-content">
<div class="card-title">寰呮帓浜�</div>
- <div class="card-value">{{ pendingScheduledQuantity.toFixed(2) }} 鍚�</div>
+ <div class="card-value">{{ statisticsData.pendingScheduling }} 鍚�</div>
</div>
</div>
@@ -70,7 +70,7 @@
</div>
<div class="card-content">
<div class="card-title">搴撳瓨棰勮</div>
- <div class="card-value">{{ stockWarningCount }} 椤�</div>
+ <div class="card-value">{{ statisticsData.inventoryWarning }} 椤�</div>
</div>
</div>
</div>
@@ -83,21 +83,16 @@
</div>
</template>
<el-table v-loading="loading" :data="stockMaterials" style="width: 100%">
- <el-table-column prop="id" label="搴忓彿" width="80" type="index" />
- <el-table-column prop="coalType" label="鐓ょ" width="120" />
- <el-table-column prop="origin" label="浜у湴" width="120" />
- <el-table-column prop="calorificValue" label="鐑��" width="120" />
- <el-table-column prop="currentStock" label="褰撳墠搴撳瓨(鍚�)" width="150" align="right">
+ <el-table-column prop="id" label="搴忓彿" width="80" type="index" align="center" />
+ <el-table-column prop="type" label="鐓ゆ枡绫诲瀷">
<template #default="scope">
- <span :class="{ 'stock-warning': scope.row.currentStock < scope.row.minStock }">
- {{ scope.row.currentStock.toFixed(2) }}
- </span>
+ <span>{{ scope.row.type === 1 ? '鎴愬搧' : scope.row.type === 2 ? '鍘熸枡' : '-' }}</span>
</template>
</el-table-column>
- <el-table-column prop="minStock" label="鏈�浣庡簱瀛�(鍚�)" width="150" align="right">
- <template #default="scope">{{ scope.row.minStock.toFixed(2) }}</template>
- </el-table-column>
- <el-table-column prop="unit" label="鍗曚綅" width="80" />
+ <el-table-column prop="coalId" label="鐓ょ" />
+ <el-table-column prop="inventoryQuantity" label="褰撳墠搴撳瓨"></el-table-column>
+ <el-table-column prop="pendingReplenishment" label="寰呰ˉ搴�"></el-table-column>
+ <el-table-column prop="unit" label="鍗曚綅" />
<el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
</el-table>
</el-card>
@@ -110,24 +105,37 @@
</div>
</template>
<el-table v-loading="loading" :data="schedulingResults" style="width: 100%">
- <el-table-column prop="code" label="鎺掍骇缂栫爜" width="180" />
- <el-table-column prop="productionLine" label="鐢熶骇绾�" width="120" />
- <el-table-column prop="coalType" label="鐓ょ" width="120" />
- <el-table-column prop="quantity" label="鎺掍骇鏁伴噺(鍚�)" width="150" align="right">
- <template #default="scope">{{ scope.row.quantity.toFixed(2) }}</template>
+ <el-table-column prop="id" label="搴忓彿" width="60" type="index"/>
+ <el-table-column prop="schedulingNum" label="鎺掍骇鏁伴噺" width="100">
+ <template #default="scope">{{ scope.row.schedulingNum ? scope.row.schedulingNum.toFixed(2) : '0.00' }}</template>
</el-table-column>
- <el-table-column prop="scheduleTime" label="鎺掍骇鏃堕棿" width="180" />
+ <el-table-column prop="successNum" label="鍏ュ簱鏁伴噺" width="100">
+ <template #default="scope">{{ scope.row.successNum ? scope.row.successNum.toFixed(2) : '0.00' }}</template>
+ </el-table-column>
+ <el-table-column prop="type" label="鐓ゆ枡绫诲瀷" width="100">
+ <template #default="scope">
+ <span>{{ scope.row.type === 1 ? '鎴愬搧' : scope.row.type === 2 ? '鍘熸枡' : '-' }}</span>
+ </template>
+ </el-table-column>
<el-table-column prop="status" label="鐘舵��" width="100">
<template #default="scope">
<el-tag
- :type="scope.row.status === 'completed' ? 'success' : scope.row.status === 'processing' ? 'warning' : 'info'"
+ :type="scope.row.status === 3 ? 'success' : scope.row.status === 2 ? 'warning' : 'info'"
size="small"
>
- {{ scope.row.status === 'completed' ? '宸插畬鎴�' : scope.row.status === 'processing' ? '鎺掍骇涓�' : '寰呮帓浜�' }}
+ {{ scope.row.status === 3 ? '宸叉姤宸�' : scope.row.status === 2 ? '鐢熶骇涓�' : '寰呯敓浜�' }}
</el-tag>
</template>
</el-table-column>
- <el-table-column prop="remark" label="澶囨敞" width="200" />
+ <el-table-column prop="process" label="宸ュ簭" width="120" />
+ <el-table-column prop="unit" label="鍗曚綅" width="80" />
+ <el-table-column prop="workHours" label="宸ユ椂瀹氶" width="100">
+ <template #default="scope">{{ scope.row.workHours ? scope.row.workHours.toFixed(2) : '0.00' }}</template>
+ </el-table-column>
+ <el-table-column prop="schedulingDate" label="鎺掍骇鏃ユ湡" width="180" />
+ <el-table-column prop="schedulingUserName" label="鎺掍骇浜�" width="120" />
+ <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
+ <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
</el-table>
</el-card>
</div>
@@ -136,6 +144,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
+import { getProductionSchedulingInventoryList, getProductionSchedulingStatistics, getProductionSchedulingStatisticsList } from '@/api/productionScheduling'
// 鎼滅储鍙傛暟
const searchParams = ref({
@@ -191,49 +200,22 @@
}
]
-// 缁熻鏁版嵁
-const totalScheduledQuantity = ref(0)
-const completedScheduledQuantity = ref(0)
-const pendingScheduledQuantity = ref(0)
-const stockWarningCount = ref(0)
-
// 搴撳瓨鍘熸枡鏁版嵁
-const stockMaterials = ref([
- { id: 1, coalType: '鐑熺叅', origin: '灞辫タ', calorificValue: '5300澶у崱', currentStock: 1200.5, minStock: 500, unit: '鍚�', updateTime: '2023-05-07 09:30:15' },
- { id: 2, coalType: '鏃犵儫鐓�', origin: '鍐呰挋鍙�', calorificValue: '5800澶у崱', currentStock: 800.2, minStock: 400, unit: '鍚�', updateTime: '2023-05-07 10:15:30' },
- { id: 3, coalType: '瑜愮叅', origin: '鏂扮枂', calorificValue: '4200澶у崱', currentStock: 350.8, minStock: 400, unit: '鍚�', updateTime: '2023-05-07 11:05:45' },
- { id: 4, coalType: '璐叅', origin: '闄曡タ', calorificValue: '5100澶у崱', currentStock: 900.0, minStock: 300, unit: '鍚�', updateTime: '2023-05-07 13:20:00' },
- { id: 5, coalType: '鐦︾叅', origin: '璐靛窞', calorificValue: '5400澶у崱', currentStock: 650.5, minStock: 350, unit: '鍚�', updateTime: '2023-05-07 14:45:15' }
-])
+const stockMaterials = ref([])
// 鎺掍骇缁撴灉鏁版嵁
-const schedulingResults = ref([
- { code: 'PS20230507001', productionLine: '鐢熶骇绾�1', coalType: '鐑熺叅', quantity: 200.5, scheduleTime: '2023-05-07 09:30:15', status: 'completed', remark: '鎸夎鍒掑畬鎴�' },
- { code: 'PS20230507002', productionLine: '鐢熶骇绾�2', coalType: '鏃犵儫鐓�', quantity: 150.2, scheduleTime: '2023-05-07 10:15:30', status: 'processing', remark: '姝e湪杩涜涓�' },
- { code: 'PS20230507003', productionLine: '鐢熶骇绾�3', coalType: '璐叅', quantity: 180.0, scheduleTime: '2023-05-07 11:05:45', status: 'pending', remark: '绛夊緟鎺掍骇' }
-])
+const schedulingResults = ref([])
// 鍔犺浇鐘舵��
const loading = ref(false)
-// 璁$畻缁熻鏁版嵁
-const calculateStats = () => {
- // 璁$畻鎬绘帓浜ч噺
- totalScheduledQuantity.value = schedulingResults.value.reduce((sum, item) => sum + item.quantity, 0)
-
- // 璁$畻宸插畬鎴愭帓浜�
- completedScheduledQuantity.value = schedulingResults.value
- .filter(item => item.status === 'completed')
- .reduce((sum, item) => sum + item.quantity, 0)
-
- // 璁$畻寰呮帓浜�
- pendingScheduledQuantity.value = schedulingResults.value
- .filter(item => item.status === 'pending')
- .reduce((sum, item) => sum + item.quantity, 0)
-
- // 璁$畻搴撳瓨棰勮鏁伴噺
- stockWarningCount.value = stockMaterials.value.filter(item => item.currentStock < item.minStock).length
-}
+// 缁熻鏁版嵁
+const statisticsData = ref({
+ totalOutput: 0,
+ completedScheduling: 0,
+ pendingScheduling: 0,
+ inventoryWarning: 0
+})
// 鐢熸垚鎺掍骇缂栫爜
const generateSchedulingCode = () => {
@@ -289,9 +271,6 @@
// 鏇存柊搴撳瓨鏁伴噺
randomMaterial.currentStock -= quantity
- // 鏇存柊缁熻鏁版嵁
- calculateStats()
-
ElMessage.success('闅忔満鎺掍骇鎴愬姛')
} catch (error) {
console.error('闅忔満鎺掍骇澶辫触:', error)
@@ -301,24 +280,91 @@
}
}
-// 鏌ヨ鏁版嵁
-const handleSearch = async () => {
+// 鑾峰彇搴撳瓨鍘熸枡鍒楄〃
+const getStockMaterials = async () => {
try {
loading.value = true
- // 妯℃嫙API璇锋眰寤惰繜
- await new Promise(resolve => setTimeout(resolve, 800))
+ // 鏋勫缓璇锋眰鍙傛暟
+ const params = {
+ dto: {
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
+ searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
+ searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
+ }
+ }
- // 杩欓噷鍙互鏍规嵁鎼滅储鏉′欢杩囨护鏁版嵁
- // 瀹為檯搴旂敤涓簲璇ヨ皟鐢ˋPI鑾峰彇鏁版嵁
+ // 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
+ const response = await getProductionSchedulingInventoryList(params)
- ElMessage.success('鏌ヨ鎴愬姛')
+ if (response.code === 200 && response.data) {
+ // 澶勭悊杩斿洖鐨勬暟鎹紝灏嗘帴鍙e瓧娈垫槧灏勫埌琛ㄦ牸闇�瑕佺殑瀛楁
+ stockMaterials.value = response.data
+ }
+
} catch (error) {
- console.error('鏌ヨ澶辫触:', error)
- ElMessage.error('鏌ヨ澶辫触锛岃绋嶅悗閲嶈瘯')
+ console.error('鑾峰彇搴撳瓨鍘熸枡澶辫触:', error)
} finally {
loading.value = false
}
+}
+
+// 鑾峰彇缁熻鏁版嵁
+const getProductionStatistics = async () => {
+ try {
+ // 鏋勫缓璇锋眰鍙傛暟
+ const params = {
+ dto: {
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
+ searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
+ searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
+ }
+ }
+
+ // 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
+ const response = await getProductionSchedulingStatistics(params)
+
+ if (response.code === 200 && response.data) {
+ statisticsData.value = response.data
+ }
+
+ } catch (error) {
+ console.error('鑾峰彇缁熻鏁版嵁澶辫触:', error)
+ }
+}
+
+// 鑾峰彇鎺掍骇缁撴灉鍒楄〃
+const getSchedulingResults = async () => {
+ try {
+ // 鏋勫缓璇锋眰鍙傛暟
+ const params = {
+ dto: {
+ entryDateStart: searchParams.value.dateRange && searchParams.value.dateRange[0] ?
+ searchParams.value.dateRange[0].toISOString().split('T')[0] : '',
+ entryDateEnd: searchParams.value.dateRange && searchParams.value.dateRange[1] ?
+ searchParams.value.dateRange[1].toISOString().split('T')[0] : ''
+ }
+ }
+
+ // 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
+ const response = await getProductionSchedulingStatisticsList(params)
+
+ if (response.code === 200 && response.data) {
+ schedulingResults.value = response.data
+ }
+
+ } catch (error) {
+ console.error('鑾峰彇鎺掍骇缁撴灉澶辫触:', error)
+ }
+}
+
+// 鏌ヨ鏁版嵁
+const handleSearch = async () => {
+ await getStockMaterials()
+ getProductionStatistics()
+ getSchedulingResults()
}
// 閲嶇疆鎼滅储鍙傛暟
@@ -328,8 +374,6 @@
coalType: '',
status: ''
}
-
- // 閲嶇疆鍚庨噸鏂版煡璇�
handleSearch()
}
@@ -340,9 +384,6 @@
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
searchParams.value.dateRange = [start, end]
-
- // 璁$畻缁熻鏁版嵁
- calculateStats()
// 鍒濆鍔犺浇鏁版嵁
handleSearch()
--
Gitblit v1.9.3