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