From c493779a8504fe1eb548c865ff268a7f7436ec01 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 19 三月 2026 11:43:36 +0800
Subject: [PATCH] feat: 集成机械手客户端并重构模拟器前端工作台

---
 Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/src/views/CreateView.vue |  104 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 66 insertions(+), 38 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/src/views/CreateView.vue b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/src/views/CreateView.vue
index 77cd356..78e1e50 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/src/views/CreateView.vue
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Web/src/views/CreateView.vue
@@ -1,12 +1,12 @@
-<template>
-  <div>
+锘�<template>
+  <div class="admin-page">
     <div class="page-header">
       <div class="header-left">
         <h2>
           <el-icon :size="24"><Plus /></el-icon>
           鍒涘缓瀹炰緥
         </h2>
-        <p class="text-muted">鍒涘缓鏂扮殑 S7 PLC 浠跨湡鍣ㄥ疄渚�</p>
+        <p class="text-muted">鍒涘缓鏂扮殑 S7 PLC 浠跨湡瀹炰緥</p>
       </div>
       <el-button @click="$router.push('/')">
         <el-icon><Back /></el-icon>
@@ -16,7 +16,7 @@
 
     <el-row justify="center">
       <el-col :lg="24">
-        <el-card shadow="never">
+        <el-card shadow="never" class="panel-card">
           <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
             <!-- 鍩烘湰淇℃伅 -->
             <el-divider content-position="left">
@@ -83,6 +83,21 @@
               </el-col>
             </el-row>
 
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="鍗忚妯℃澘" prop="protocolTemplateId">
+                  <el-select v-model="form.protocolTemplateId" style="width: 100%">
+                    <el-option
+                      v-for="tpl in protocolTemplates"
+                      :key="tpl.id"
+                      :label="`${tpl.name} (${tpl.id})`"
+                      :value="tpl.id"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
             <!-- 鍐呭瓨閰嶇疆 -->
             <el-divider content-position="left">
               <h3>鍐呭瓨閰嶇疆</h3>
@@ -90,7 +105,7 @@
 
             <el-row :gutter="20">
               <el-col :span="8">
-                <el-form-item label="M鍖哄煙澶у皬">
+                <el-form-item label="M鍖哄ぇ灏�">
                   <el-input-number
                     v-model="form.mRegionSize"
                     :min="0"
@@ -99,7 +114,7 @@
                 </el-form-item>
               </el-col>
               <el-col :span="8">
-                <el-form-item label="I鍖哄煙澶у皬">
+                <el-form-item label="I鍖哄ぇ灏�">
                   <el-input-number
                     v-model="form.iRegionSize"
                     :min="0"
@@ -108,7 +123,7 @@
                 </el-form-item>
               </el-col>
               <el-col :span="8">
-                <el-form-item label="Q鍖哄煙澶у皬">
+                <el-form-item label="Q鍖哄ぇ灏�">
                   <el-input-number
                     v-model="form.qRegionSize"
                     :min="0"
@@ -120,11 +135,16 @@
 
             <el-row :gutter="20">
               <el-col :span="8">
-                <el-form-item label="DB鍧楁暟閲�">
-                  <el-input-number
-                    v-model="form.dbBlockCount"
-                    :min="0"
+                <el-form-item label="DB鍧楀垪琛�">
+                  <el-select
+                    v-model="form.dbBlockNumbers"
+                    multiple
+                    filterable
+                    allow-create
+                    default-first-option
+                    :reserve-keyword="false"
                     style="width: 100%"
+                    placeholder="杈撳叆鍧楀彿鍚庡洖杞︼紝渚嬪 50銆�900銆�901"
                   />
                 </el-form-item>
               </el-col>
@@ -172,13 +192,13 @@
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue'
+import { onMounted, ref } from 'vue'
 import { useRouter } from 'vue-router'
 import { ElMessage } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
 import { Plus, Back, QuestionFilled } from '@element-plus/icons-vue'
 import * as api from '../api'
-import type { InstanceConfig, MemoryRegionConfig, SiemensPLCType } from '../types'
+import type { InstanceConfig, MemoryRegionConfig, ProtocolTemplate, SiemensPLCType } from '../types'
 
 const router = useRouter()
 const formRef = ref<FormInstance>()
@@ -190,9 +210,11 @@
   port: 102,
   activationKey: '4b86f3fc-f650-3b08-5924-b0f8278d6ed2',
   autoStart: false,
+  protocolTemplateId: '',
   mRegionSize: 1024,
-  dbBlockCount: 100,
-  dbBlockSize: 1024,
+  dbBlockCount: 0,
+  dbBlockNumbers: [] as Array<number | string>,
+  dbBlockSize: 65536,
   iRegionSize: 256,
   qRegionSize: 256,
   tRegionCount: 64,
@@ -200,6 +222,7 @@
 })
 
 const submitting = ref(false)
+const protocolTemplates = ref<ProtocolTemplate[]>([])
 
 const rules: FormRules = {
   id: [
@@ -214,9 +237,19 @@
   ],
   port: [
     { required: true, message: '璇疯緭鍏ョ洃鍚鍙�', trigger: 'blur' },
-    { type: 'number', min: 1, max: 65535, message: '绔彛蹇呴』鍦�1-65535涔嬮棿', trigger: 'blur' }
+    { type: 'number', min: 1, max: 65535, message: '绔彛蹇呴』鍦� 1-65535 涔嬮棿', trigger: 'blur' }
+  ],
+  protocolTemplateId: [
+    { required: true, message: '璇烽�夋嫨鍗忚妯℃澘', trigger: 'change' }
   ]
 }
+
+onMounted(async () => {
+  protocolTemplates.value = await api.getProtocolTemplates()
+  if (protocolTemplates.value.length > 0) {
+    form.value.protocolTemplateId = protocolTemplates.value[0].id
+  }
+})
 
 async function handleSubmit() {
   if (!formRef.value) return
@@ -227,9 +260,16 @@
     submitting.value = true
 
     try {
+      const dbBlockNumbers = normalizeDbBlockNumbers(form.value.dbBlockNumbers)
+      if (dbBlockNumbers.length === 0) {
+        ElMessage.error('璇疯嚦灏戦厤缃竴涓狣B鍧楀彿锛屼緥濡� 50,900,901')
+        return
+      }
+
       const memoryConfig: MemoryRegionConfig = {
         mRegionSize: form.value.mRegionSize > 0 ? form.value.mRegionSize : 1024,
-        dbBlockCount: form.value.dbBlockCount > 0 ? form.value.dbBlockCount : 100,
+        dbBlockCount: 0,
+        dbBlockNumbers,
         dbBlockSize: form.value.dbBlockSize > 0 ? form.value.dbBlockSize : 1024,
         iRegionSize: form.value.iRegionSize > 0 ? form.value.iRegionSize : 256,
         qRegionSize: form.value.qRegionSize > 0 ? form.value.qRegionSize : 256,
@@ -244,6 +284,7 @@
         port: form.value.port,
         activationKey: form.value.activationKey || '',
         autoStart: form.value.autoStart,
+        protocolTemplateId: form.value.protocolTemplateId,
         memoryConfig
       }
 
@@ -263,30 +304,17 @@
     }
   })
 }
+
+function normalizeDbBlockNumbers(input: Array<number | string>): number[] {
+  return Array.from(new Set(
+    input
+      .map(x => Number(String(x).trim()))
+      .filter(x => Number.isInteger(x) && x > 0)
+  )).sort((a, b) => a - b)
+}
 </script>
 
 <style scoped>
-.page-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: flex-start;
-  margin-bottom: 20px;
-  flex-wrap: wrap;
-  gap: 16px;
-}
-
-.header-left h2 {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-  margin: 0 0 8px 0;
-}
-
-.text-muted {
-  color: #909399;
-  margin: 0;
-}
-
 .el-divider h3 {
   margin: 0;
   font-size: 16px;

--
Gitblit v1.9.3