From 14763d895151f3ddad09906f2233057b8b967881 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期五, 19 十二月 2025 17:06:18 +0800
Subject: [PATCH] 添加plc通讯协议工厂,支持后续多种plc协议
---
mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue | 235 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 204 insertions(+), 31 deletions(-)
diff --git a/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue b/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue
index 8b669ce..7d4eb7c 100644
--- a/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue
+++ b/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue
@@ -35,12 +35,51 @@
</div>
<el-form :model="form" label-width="120px" :rules="rules" ref="formRef">
+ <div style="width: 350px; margin-bottom: 12px; margin-left: 120px;">
+ <el-select
+ v-model="selectedEngineeringId"
+ placeholder="閫夋嫨宸ョ▼鍙凤紙閫夋嫨鍚庤嚜鍔ㄥ~鍏呯幓鐠僆D锛�"
+ clearable
+ filterable
+ :disabled="!group"
+ :loading="engineeringListLoading"
+ @change="handleEngineeringChange"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in engineeringList"
+ :key="item.engineeringId"
+ :label="item.engineeringId"
+ :value="item.engineeringId"
+ >
+ <div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
+ <div style="flex: 1;">
+ <span>{{ item.engineeringId }}</span>
+ <span style="margin-left: 8px; color: #8492a6; font-size: 12px">
+ {{ item.date ? new Date(item.date).toLocaleDateString() : '' }}
+ </span>
+ </div>
+ <el-button
+ type="danger"
+ link
+ size="small"
+ :loading="deletingEngineeringId === item.engineeringId"
+ @click.stop="handleDeleteEngineering(item.engineeringId)"
+ style="margin-left: 8px; padding: 0 4px;"
+ >
+ <el-icon><Delete /></el-icon>
+ </el-button>
+ </div>
+ </el-option>
+ </el-select>
+ </div>
+
<el-form-item label="鐜荤拑ID鍒楄〃" prop="glassIds">
<el-input
v-model="glassIdsInput"
type="textarea"
:rows="4"
- placeholder="鍙�夛細杈撳叆鐜荤拑ID锛屽皢浣跨敤杈撳叆鐨処D杩涜娴嬭瘯"
+ placeholder="鍙�夛細杈撳叆鐜荤拑ID锛屽皢浣跨敤杈撳叆鐨処D杩涜娴嬭瘯锛堟垨閫氳繃涓婃柟閫夋嫨宸ョ▼鍙疯嚜鍔ㄥ~鍏咃級"
show-word-limit
:maxlength="5000"
/>
@@ -57,8 +96,8 @@
</template>
<script setup>
-import { computed, reactive, ref, watch } from 'vue'
-import { ElMessage } from 'element-plus'
+import { computed, reactive, ref, watch, onMounted } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
import { Delete, Promotion, Upload } from '@element-plus/icons-vue'
import * as XLSX from 'xlsx'
import { multiDeviceTaskApi } from '@/api/device/multiDeviceTask'
@@ -116,13 +155,27 @@
const loadDeviceLoading = ref(false)
const fileInputRef = ref(null)
+// 宸ョ▼鍙风浉鍏�
+const selectedEngineeringId = ref('')
+const engineeringList = ref([])
+const engineeringListLoading = ref(false)
+const glassIdsLoading = ref(false)
+const deletingEngineeringId = ref('')
+
watch(
() => props.group,
() => {
glassIdsInput.value = ''
+ selectedEngineeringId.value = ''
fetchLoadDevice()
+ fetchEngineeringList()
}
)
+
+// 缁勪欢鎸傝浇鏃跺姞杞藉伐绋嬪彿鍒楄〃
+onMounted(() => {
+ fetchEngineeringList()
+})
const glassIds = computed(() => {
if (!glassIdsInput.value) return []
@@ -131,6 +184,108 @@
.map((item) => item.trim())
.filter((item) => item.length > 0)
})
+
+// 鑾峰彇宸ョ▼鍙峰垪琛�
+const fetchEngineeringList = async () => {
+ try {
+ engineeringListLoading.value = true
+ const response = await engineeringApi.getEngineeringList()
+
+ if (Array.isArray(response)) {
+ engineeringList.value = response
+ } else if (Array.isArray(response?.data)) {
+ engineeringList.value = response.data
+ } else {
+ engineeringList.value = []
+ }
+ // 鎸夋棩鏈熷�掑簭鎺掑垪
+ engineeringList.value.sort((a, b) => {
+ const dateA = a.date ? new Date(a.date).getTime() : 0
+ const dateB = b.date ? new Date(b.date).getTime() : 0
+ return dateB - dateA
+ })
+ } catch (error) {
+ console.error('鑾峰彇宸ョ▼鍙峰垪琛ㄥけ璐�:', error)
+ ElMessage.error(error?.message || '鑾峰彇宸ョ▼鍙峰垪琛ㄥけ璐�')
+ engineeringList.value = []
+ } finally {
+ engineeringListLoading.value = false
+ }
+}
+
+// 澶勭悊宸ョ▼鍙烽�夋嫨鍙樺寲
+const handleEngineeringChange = async (engineeringId) => {
+ if (!engineeringId) {
+ // 娓呯┖閫夋嫨鏃讹紝涓嶆竻绌哄凡杈撳叆鐨勭幓鐠僆D锛岃鐢ㄦ埛淇濈暀
+ return
+ }
+
+ try {
+ glassIdsLoading.value = true
+ const response = await engineeringApi.getGlassIdsByEngineeringId(engineeringId)
+
+ const glassIds = response?.glassIds || response?.data?.glassIds || []
+
+ if (glassIds.length > 0) {
+ glassIdsInput.value = glassIds.join('\n')
+ ElMessage.success(`宸插姞杞藉伐绋嬪彿 ${engineeringId} 鐨� ${glassIds.length} 涓幓鐠僆D`)
+ } else {
+ ElMessage.warning(`宸ョ▼鍙� ${engineeringId} 涓嬫病鏈夋壘鍒扮幓鐠僆D`)
+ }
+ } catch (error) {
+ console.error('鑾峰彇鐜荤拑ID鍒楄〃澶辫触:', error)
+ ElMessage.error(error?.message || '鑾峰彇鐜荤拑ID鍒楄〃澶辫触')
+ } finally {
+ glassIdsLoading.value = false
+ }
+}
+
+// 澶勭悊鍒犻櫎宸ョ▼鍙�
+const handleDeleteEngineering = async (engineeringId) => {
+ if (!engineeringId) {
+ return
+ }
+
+ try {
+ await ElMessageBox.confirm(
+ `纭畾瑕佸垹闄ゅ伐绋嬪彿 "${engineeringId}" 鍙婂叾鍏宠仈鐨勬墍鏈夌幓鐠冧俊鎭悧锛熸鎿嶄綔涓嶅彲鎭㈠锛乣,
+ '纭鍒犻櫎',
+ {
+ confirmButtonText: '纭畾鍒犻櫎',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning',
+ dangerouslyUseHTMLString: false
+ }
+ )
+
+ deletingEngineeringId.value = engineeringId
+ const response = await engineeringApi.deleteEngineering(engineeringId)
+
+ const result = response?.data || response
+ if (result?.success !== false) {
+ const deletedCount = result?.deletedGlassCount || 0
+ ElMessage.success(`宸插垹闄ゅ伐绋嬪彿 ${engineeringId}锛屽叡鍒犻櫎 ${deletedCount} 鏉$幓鐠冧俊鎭痐)
+
+ // 濡傛灉鍒犻櫎鐨勬槸褰撳墠閫変腑鐨勫伐绋嬪彿锛屾竻绌洪�夋嫨
+ if (selectedEngineeringId.value === engineeringId) {
+ selectedEngineeringId.value = ''
+ glassIdsInput.value = ''
+ }
+
+ // 鍒锋柊宸ョ▼鍙峰垪琛�
+ await fetchEngineeringList()
+ } else {
+ throw new Error(result?.message || '鍒犻櫎澶辫触')
+ }
+ } catch (error) {
+ if (error !== 'cancel') {
+ console.error('鍒犻櫎宸ョ▼鍙峰け璐�:', error)
+ ElMessage.error(error?.message || '鍒犻櫎宸ョ▼鍙峰け璐�')
+ }
+ } finally {
+ deletingEngineeringId.value = ''
+ }
+}
const normalizeType = (type) => (type || '').trim().toUpperCase()
@@ -323,7 +478,7 @@
return
}
- // 鍙戦�佹暟鎹埌 MES 鎺ュ彛
+ // 鍙戦�佹暟鎹�
submitGlassData(parsedData)
} catch (error) {
@@ -376,10 +531,10 @@
headerStr === 'w' || headerStr === '瀹藉害') {
headerMap.width = index
}
- // 楂樺害
- else if (headerStr.includes('楂�') || headerStr.includes('height') ||
- headerStr === 'h' || headerStr === '楂樺害') {
- headerMap.height = index
+ // 闀垮害
+ else if (headerStr.includes('闀�') || headerStr.includes('length') ||
+ headerStr === 'l' || headerStr === '闀垮害') {
+ headerMap.length = index
}
// 鍘氬害
else if (headerStr.includes('鍘�') || headerStr.includes('thickness') ||
@@ -390,11 +545,6 @@
else if (headerStr.includes('鏁伴噺') || headerStr.includes('quantity') ||
headerStr.includes('qty') || headerStr === '鏁伴噺') {
headerMap.quantity = index
- }
- // 璁㈠崟鍙�
- else if (headerStr.includes('璁㈠崟') || headerStr.includes('order') ||
- headerStr.includes('orderno') || headerStr === '璁㈠崟鍙�') {
- headerMap.orderNumber = index
}
// 鑶滅郴
else if (headerStr.includes('鑶滅郴') || headerStr.includes('films') ||
@@ -420,10 +570,10 @@
// 濡傛灉娌℃湁鎵惧埌琛ㄥご锛屽皾璇曚娇鐢ㄧ涓�琛屼綔涓鸿〃澶达紙绱㈠紩鏂瑰紡锛�
if (Object.keys(headerMap).length === 0 && jsonData.length > 1) {
- // 榛樿鏍煎紡锛氱幓鐠僆D, 瀹�, 楂�, 鍘�, 鏁伴噺锛堟寜鍒楅『搴忥級
+ // 榛樿鏍煎紡锛氱幓鐠僆D, 瀹�, 闀�, 鍘�, 鏁伴噺锛堟寜鍒楅『搴忥級
headerMap.glassId = 0
headerMap.width = 1
- headerMap.height = 2
+ headerMap.length = 2
headerMap.thickness = 3
headerMap.quantity = 4
}
@@ -436,18 +586,16 @@
const glassId = row[headerMap.glassId] ? String(row[headerMap.glassId]).trim() : ''
const width = row[headerMap.width] ? String(row[headerMap.width]).trim() : ''
- const height = row[headerMap.height] ? String(row[headerMap.height]).trim() : ''
+ const length = row[headerMap.length] ? String(row[headerMap.length]).trim() : ''
const thickness = row[headerMap.thickness] ? String(row[headerMap.thickness]).trim() : ''
const quantity = row[headerMap.quantity] ? String(row[headerMap.quantity]).trim() : ''
- // 璁㈠崟搴忓彿锛堟帴鍙h姹傛暣鏁帮紝杩欓噷灏濊瘯瑙f瀽涓烘暣鏁帮紝涓嶅彲瑙f瀽鍒欑疆绌猴級
- const orderNumber = parseInt(row[headerMap.orderNumber]) || ''
const filmsId = row[headerMap.filmsId] ? String(row[headerMap.filmsId]).trim() : ''
const flowCardId = row[headerMap.flowCardId] ? String(row[headerMap.flowCardId]).trim() : ''
const productName = row[headerMap.productName] ? String(row[headerMap.productName]).trim() : ''
const customerName = row[headerMap.customerName] ? String(row[headerMap.customerName]).trim() : ''
// 璺宠繃绌鸿
- if (!glassId && !width && !height && !thickness && !quantity) {
+ if (!glassId && !width && !length && !thickness && !quantity) {
continue
}
@@ -468,15 +616,14 @@
const qty = parseInt(quantity) || 1
for (let j = 0; j < qty; j++) {
// 濡傛灉鏁伴噺澶т簬1锛屼负姣忔潯璁板綍鐢熸垚鍞竴鐨勭幓鐠僆D锛堣拷鍔犲簭鍙凤級
- const finalGlassId = qty > 1 ? `${glassId}_${j + 1}` : glassId
+ const finalGlassId = qty > 1 ? `${glassId}${j + 1}` : glassId
result.push({
glassId: finalGlassId,
width: parseNumber(width),
- height: parseNumber(height),
+ length: parseNumber(length),
thickness: parseNumber(thickness),
quantity: '1', // 姣忔潯璁板綍鏁伴噺涓�1
- orderNumber: orderNumber,
filmsId: filmsId,
flowCardId: flowCardId || finalGlassId,
productName: productName,
@@ -506,22 +653,48 @@
const response = await engineeringApi.importEngineer(requestData)
- if (response?.code === 200 || response?.code === 0 || response?.data) {
- ElMessage.success(`鎴愬姛瀵煎叆 ${glassDataList.length} 鏉$幓鐠冩暟鎹紝宸ョ▼鍙凤細${requestData.engineerId}`)
+ // 妫�鏌� MES 鎺ュ彛鏄惁璋冪敤鎴愬姛
+ // MES 鎺ュ彛鎴愬姛鏃惰繑鍥炴牸寮忥細{ code: 200/0, data: true/false, message: "..." }
+ if (response?.code === 200 || response?.code === 0) {
+ // MES 鎺ュ彛璋冪敤鎴愬姛
+ const engineerId = response?.data?.engineerId || response?.engineerId || ''
+ const successMsg = engineerId
+ ? `鎴愬姛瀵煎叆 ${glassDataList.length} 鏉$幓鐠冩暟鎹紝宸ョ▼鍙凤細${engineerId}`
+ : `鎴愬姛瀵煎叆 ${glassDataList.length} 鏉$幓鐠冩暟鎹甡
+ ElMessage.success(successMsg)
- // 灏嗗鍏ョ殑鐜荤拑ID濉厖鍒拌緭鍏ユ锛屾柟渚跨敤鎴锋煡鐪嬪拰缂栬緫
- const glassIds = glassDataList.map(item => item.glassId).filter(id => id)
- if (glassIds.length > 0) {
- glassIdsInput.value = glassIds.join('\n')
+ // 鎴愬姛鍚庡埛鏂板伐绋嬪彿涓嬫媺鍒楄〃锛屽苟閫変腑鏈�鏂板伐绋嬪彿
+ try {
+ await fetchEngineeringList()
+ if (engineerId) {
+ selectedEngineeringId.value = engineerId
+ // 鍒锋柊骞跺洖濉悗绔繚瀛樼殑 glassId锛堝甫宸ョ▼鍙峰墠缂�锛夛紝閬垮厤浣跨敤鍓嶇鍘熷鍊�
+ await handleEngineeringChange(engineerId)
+ }
+ } catch (refreshErr) {
+ console.error('鍒锋柊宸ョ▼鍙峰垪琛ㄥけ璐�:', refreshErr)
}
} else {
- throw new Error(response?.message || '瀵煎叆澶辫触')
+ // MES 鎺ュ彛杩斿洖澶辫触
+ throw new Error(response?.message || 'MES 鎺ュ彛杩斿洖澶辫触')
}
} catch (error) {
console.error('鎻愪氦鐜荤拑鏁版嵁澶辫触:', error)
- // 鏄剧ず閿欒淇℃伅
- const errorMsg = error?.response?.data?.message || error?.message || '鏈煡閿欒'
+ // 鍒ゆ柇閿欒绫诲瀷锛岀粰鍑烘洿鍙嬪ソ鐨勬彁绀�
+ let errorMsg = '鏈煡閿欒'
+
+ // 妫�鏌ユ槸鍚︽槸鍚庣杩斿洖鐨勯敊璇搷搴旓紙鍚庣杞彂 MES 澶辫触锛�
+ if (error?.response?.status === 500 && error?.response?.data) {
+ // 鍚庣杩斿洖鐨勭粺涓�閿欒鏍煎紡
+ errorMsg = error.response.data.message || error.response.data || '杞彂 MES 鎺ュ彛澶辫触'
+ } else if (error?.response?.data?.message) {
+ // MES 鎺ュ彛杩斿洖鐨勯敊璇�
+ errorMsg = error.response.data.message
+ } else if (error?.message) {
+ errorMsg = error.message
+ }
+
ElMessage.error('鎻愪氦鏁版嵁澶辫触: ' + errorMsg)
// 鍗充娇澶辫触锛屼篃灏濊瘯濉厖鐜荤拑ID鍒拌緭鍏ユ
--
Gitblit v1.8.0