From 0ad2c4106d6f570e0ca63c8fe5093e6f97492534 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期六, 11 十月 2025 17:44:10 +0800
Subject: [PATCH] yys 1.修改销售出库-煤种选中问题 2.采购管理增加车牌字段
---
src/views/productionControl/intelligentScheduling/index.vue | 488 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 488 insertions(+), 0 deletions(-)
diff --git a/src/views/productionControl/intelligentScheduling/index.vue b/src/views/productionControl/intelligentScheduling/index.vue
new file mode 100644
index 0000000..31d8a97
--- /dev/null
+++ b/src/views/productionControl/intelligentScheduling/index.vue
@@ -0,0 +1,488 @@
+<template>
+ <div class="intelligent-scheduling">
+ <!-- 鎼滅储琛ㄥ崟 -->
+ <el-card class="search-form-card" shadow="never">
+ <el-form :inline="true" :model="searchParams" class="search-form">
+ <el-form-item label="鏃堕棿鑼冨洿">
+ <el-date-picker
+ v-model="searchParams.dateRange"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ :shortcuts="dateShortcuts"
+ />
+ </el-form-item>
+ <el-form-item label="鐓ょ">
+ <el-input v-model="searchParams.coalType" placeholder="璇疯緭鍏ョ叅绉�" clearable />
+ </el-form-item>
+ <el-form-item label="鎺掍骇鐘舵��">
+ <el-select v-model="searchParams.status" placeholder="璇烽�夋嫨鎺掍骇鐘舵��" clearable style="width: 200px">
+ <el-option label="鍏ㄩ儴" value="" />
+ <el-option label="寰呮帓浜�" value="pending" />
+ <el-option label="鎺掍骇涓�" value="processing" />
+ <el-option label="宸插畬鎴�" value="completed" />
+ </el-select>
+ </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-form-item>
+ </el-form>
+ </el-card>
+
+ <!-- 缁熻鍗$墖 -->
+ <div class="stats-cards">
+ <div class="stat-card">
+ <div class="card-icon">
+ <i class="el-icon-s-order" />
+ </div>
+ <div class="card-content">
+ <div class="card-title">鎬绘帓浜ч噺</div>
+ <div class="card-value">{{ totalScheduledQuantity.toFixed(2) }} 鍚�</div>
+ </div>
+ </div>
+
+ <div class="stat-card">
+ <div class="card-icon">
+ <i class="el-icon-check" />
+ </div>
+ <div class="card-content">
+ <div class="card-title">宸插畬鎴愭帓浜�</div>
+ <div class="card-value">{{ completedScheduledQuantity.toFixed(2) }} 鍚�</div>
+ </div>
+ </div>
+
+ <div class="stat-card">
+ <div class="card-icon">
+ <i class="el-icon-time" />
+ </div>
+ <div class="card-content">
+ <div class="card-title">寰呮帓浜�</div>
+ <div class="card-value">{{ pendingScheduledQuantity.toFixed(2) }} 鍚�</div>
+ </div>
+ </div>
+
+ <div class="stat-card">
+ <div class="card-icon">
+ <i class="el-icon-warning" />
+ </div>
+ <div class="card-content">
+ <div class="card-title">搴撳瓨棰勮</div>
+ <div class="card-value">{{ stockWarningCount }} 椤�</div>
+ </div>
+ </div>
+ </div>
+
+ <!-- 搴撳瓨鍘熸枡鍒楄〃 -->
+ <el-card class="stock-materials-card" shadow="never">
+ <template #header>
+ <div class="card-header">
+ <span>搴撳瓨鍘熸枡</span>
+ </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">
+ <template #default="scope">
+ <span :class="{ 'stock-warning': scope.row.currentStock < scope.row.minStock }">
+ {{ scope.row.currentStock.toFixed(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="updateTime" label="鏇存柊鏃堕棿" width="180" />
+ </el-table>
+ </el-card>
+
+ <!-- 鎺掍骇缁撴灉鍒楄〃 -->
+ <el-card class="scheduling-results-card" shadow="never">
+ <template #header>
+ <div class="card-header">
+ <span>鎺掍骇缁撴灉</span>
+ </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>
+ <el-table-column prop="scheduleTime" label="鎺掍骇鏃堕棿" width="180" />
+ <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'"
+ size="small"
+ >
+ {{ scope.row.status === 'completed' ? '宸插畬鎴�' : scope.row.status === 'processing' ? '鎺掍骇涓�' : '寰呮帓浜�' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="remark" label="澶囨敞" width="200" />
+ </el-table>
+ </el-card>
+ </div>
+</template>
+
+<script setup>
+import { ref, onMounted } from 'vue'
+import { ElMessage } from 'element-plus'
+
+// 鎼滅储鍙傛暟
+const searchParams = ref({
+ dateRange: [],
+ coalType: '',
+ status: ''
+})
+
+// 鏃ユ湡蹇嵎閫夐」
+const dateShortcuts = [
+ {
+ text: '浠婂ぉ',
+ value: () => {
+ const end = new Date()
+ const start = new Date()
+ return [start, end]
+ }
+ },
+ {
+ text: '鏄ㄥぉ',
+ value: () => {
+ const end = new Date()
+ const start = new Date()
+ start.setTime(start.getTime() - 3600 * 1000 * 24)
+ return [start, end]
+ }
+ },
+ {
+ text: '杩�7澶�',
+ value: () => {
+ const end = new Date()
+ const start = new Date()
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+ return [start, end]
+ }
+ },
+ {
+ text: '杩�30澶�',
+ value: () => {
+ const end = new Date()
+ const start = new Date()
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+ return [start, end]
+ }
+ },
+ {
+ text: '鏈湀',
+ value: () => {
+ const end = new Date()
+ const start = new Date(end.getFullYear(), end.getMonth(), 1)
+ return [start, end]
+ }
+ }
+]
+
+// 缁熻鏁版嵁
+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 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 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 generateSchedulingCode = () => {
+ const date = new Date()
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0')
+ return `PS${year}${month}${day}${random}`
+}
+
+// 闅忔満鎺掍骇
+const handleRandomScheduling = async () => {
+ try {
+ loading.value = true
+
+ // 妯℃嫙API璇锋眰寤惰繜
+ await new Promise(resolve => setTimeout(resolve, 1000))
+
+ // 鑾峰彇鏈夊簱瀛樼殑鍘熸枡
+ const availableMaterials = stockMaterials.value.filter(item => item.currentStock > 0)
+
+ if (availableMaterials.length === 0) {
+ ElMessage.warning('娌℃湁鍙敤鐨勫簱瀛樺師鏂�')
+ return
+ }
+
+ // 闅忔満閫夋嫨鍘熸枡
+ const randomMaterial = availableMaterials[Math.floor(Math.random() * availableMaterials.length)]
+
+ // 闅忔満鐢熸垚鎺掍骇鏁伴噺锛堜笉瓒呰繃搴撳瓨鐨�50%锛�
+ const maxQuantity = randomMaterial.currentStock * 0.5
+ const quantity = Math.max(50, Math.random() * maxQuantity) // 鑷冲皯鎺掍骇50鍚�
+
+ // 闅忔満閫夋嫨鐢熶骇绾�
+ const productionLines = ['鐢熶骇绾�1', '鐢熶骇绾�2', '鐢熶骇绾�3']
+ const randomLine = productionLines[Math.floor(Math.random() * productionLines.length)]
+
+ // 鐢熸垚鏂扮殑鎺掍骇璁″垝
+ const newScheduling = {
+ code: generateSchedulingCode(),
+ productionLine: randomLine,
+ coalType: randomMaterial.coalType,
+ quantity: quantity,
+ scheduleTime: new Date().toLocaleString('zh-CN'),
+ status: 'pending',
+ remark: '闅忔満鎺掍骇鐢熸垚'
+ }
+
+ // 娣诲姞鍒版帓浜х粨鏋滃垪琛�
+ schedulingResults.value.unshift(newScheduling)
+
+ // 鏇存柊搴撳瓨鏁伴噺
+ randomMaterial.currentStock -= quantity
+
+ // 鏇存柊缁熻鏁版嵁
+ calculateStats()
+
+ ElMessage.success('闅忔満鎺掍骇鎴愬姛')
+ } catch (error) {
+ console.error('闅忔満鎺掍骇澶辫触:', error)
+ ElMessage.error('闅忔満鎺掍骇澶辫触锛岃绋嶅悗閲嶈瘯')
+ } finally {
+ loading.value = false
+ }
+}
+
+// 鏌ヨ鏁版嵁
+const handleSearch = async () => {
+ try {
+ loading.value = true
+
+ // 妯℃嫙API璇锋眰寤惰繜
+ await new Promise(resolve => setTimeout(resolve, 800))
+
+ // 杩欓噷鍙互鏍规嵁鎼滅储鏉′欢杩囨护鏁版嵁
+ // 瀹為檯搴旂敤涓簲璇ヨ皟鐢ˋPI鑾峰彇鏁版嵁
+
+ ElMessage.success('鏌ヨ鎴愬姛')
+ } catch (error) {
+ console.error('鏌ヨ澶辫触:', error)
+ ElMessage.error('鏌ヨ澶辫触锛岃绋嶅悗閲嶈瘯')
+ } finally {
+ loading.value = false
+ }
+}
+
+// 閲嶇疆鎼滅储鍙傛暟
+const handleReset = () => {
+ searchParams.value = {
+ dateRange: [],
+ coalType: '',
+ status: ''
+ }
+
+ // 閲嶇疆鍚庨噸鏂版煡璇�
+ handleSearch()
+}
+
+// 鍒濆鍖栭〉闈�
+onMounted(() => {
+ // 榛樿鏌ヨ杩�7澶╂暟鎹�
+ const end = new Date()
+ const start = new Date()
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+ searchParams.value.dateRange = [start, end]
+
+ // 璁$畻缁熻鏁版嵁
+ calculateStats()
+
+ // 鍒濆鍔犺浇鏁版嵁
+ handleSearch()
+})
+</script>
+
+<style scoped>
+.intelligent-scheduling {
+ padding: 20px;
+}
+
+.page-header {
+ margin-bottom: 20px;
+}
+
+.page-header h2 {
+ font-size: 18px;
+ font-weight: 600;
+ color: #303133;
+}
+
+.search-form-card {
+ margin-bottom: 20px;
+}
+
+.search-form {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+}
+
+.stats-cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
+ gap: 16px;
+ margin-bottom: 24px;
+}
+
+.stat-card {
+ display: flex;
+ padding: 20px;
+ background: #fff;
+ border-radius: 8px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ transition: transform 0.3s, box-shadow 0.3s;
+}
+
+.stat-card:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
+}
+
+.card-icon {
+ width: 48px;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ font-size: 24px;
+ margin-right: 16px;
+}
+
+.stat-card:nth-child(1) .card-icon {
+ background: #ECF5FF;
+ color: #409EFF;
+}
+
+.stat-card:nth-child(2) .card-icon {
+ background: #F6FFED;
+ color: #52C41A;
+}
+
+.stat-card:nth-child(3) .card-icon {
+ background: #FFF7E6;
+ color: #FAAD14;
+}
+
+.stat-card:nth-child(4) .card-icon {
+ background: #FFF1F0;
+ color: #F5222D;
+}
+
+.card-content {
+ flex: 1;
+}
+
+.card-title {
+ font-size: 14px;
+ color: #606266;
+ margin-bottom: 8px;
+}
+
+.card-value {
+ font-size: 24px;
+ font-weight: 600;
+ color: #303133;
+}
+
+.stock-materials-card,
+.scheduling-results-card {
+ margin-bottom: 24px;
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 16px;
+ border-bottom: 1px solid #EBEEF5;
+}
+
+.card-header span {
+ font-weight: 600;
+ color: #303133;
+}
+
+.stock-warning {
+ color: #F5222D;
+ font-weight: 500;
+}
+
+/* 鍝嶅簲寮忓竷灞� */
+@media (max-width: 768px) {
+ .intelligent-scheduling {
+ padding: 10px;
+ }
+
+ .stats-cards {
+ grid-template-columns: 1fr;
+ }
+
+ .search-form {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .search-form .el-form-item {
+ margin-right: 0;
+ margin-bottom: 10px;
+ }
+}
+</style>
\ No newline at end of file
--
Gitblit v1.9.3