From ba8aa925e7901381ceb394adb53eca8723d1c4c5 Mon Sep 17 00:00:00 2001
From: leiqunqing <zhengqifeng@hnkhzn.com>
Date: 星期一, 19 一月 2026 11:05:49 +0800
Subject: [PATCH] 完善工位界面

---
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaService.cs                                                 |    4 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/FormulaController.cs                                    |   15 
 .vs/slnx.sqlite                                                                                                                          |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IBoxingDetailService.cs                                            |    7 
 代码管理/WIDESEAWCS_Client/src/views/basicinfo/formula.vue                                                                                   |  248 --
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCs_TaskInfoService.assets.cache             |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/37cbdcf3-408e-4196-9c7f-486ef5eef107.vsidx               |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/ToolingBoardSubmitDto.cs                                               |   26 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfo.cs                                             |   42 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoDetailService.cs                                         |   24 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_Formula.cs                                                 |   46 
 代码管理/WIDESEAWCS_Client/src/extension/basicinfo/boxingDetail.js                                                                           |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2                                              |    0 
 代码管理/WIDESEAWCS_Client/src/components/basic/VolForm.vue                                                                                  |  407 ++---
 代码管理/WIDESEAWCS_Client/src/views/Home.vue                                                                                                | 1094 ++++++++++++++++
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs                                               |  208 +++
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/BoxingDetailController.cs                               |   18 
 代码管理/WIDESEAWCS_Client/src/views/basicinfo/formulaDetail.vue                                                                             |   54 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/0f5d7584-9cfe-4074-aeb3-fa1f9e570949.vsidx               |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_FormulaDetail.cs                                           |    8 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml                               |    6 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj                                                      |    1 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoDetailController.cs                          |   21 
 代码管理/WIDESEAWCS_Client/src/extension/basicinfo/formula.js                                                                                |   11 
 代码管理/WIDESEAWCS_Client/src/views/basicinfo/scanStation.vue                                                                               |  238 --
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfo.cs          |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/UpdatePartScannedStatusRequest.cs                                      |   22 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/R_PLCDBName.cs                                                        |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj                                  |   10 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/W_PLCDBName.cs                                                        |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ScanStationController.cs                                |   62 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6b8b6a38-d1b1-459e-b415-f709208d542a.vsidx               |    0 
 代码管理/WIDESEAWCS_Client/src/router/viewGird.js                                                                                            |    4 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketClient.cs                                                                |   52 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaService.cs                                                   |   45 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoController.cs                                |   16 
 代码管理/WIDESEAWCS_Client/src/extension/basicinfo/processInfoDetail.js                                                                      |   22 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfoDetail.cs                                       |   38 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2                                                         |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IScanStationService.cs                                             |   16 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/BoxingDetailService.cs                                              |  271 +++
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/a92150fa-07f2-4b35-842d-8af5d93da741.vsidx               |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaDetailService.cs                                             |    6 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/.config/dotnet-tools.json                                                     |    5 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs                                                                      |  359 ++---
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/CodeChunks.db                              |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoService.cs                                               |   45 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj                                                        |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo                                                                  |    0 
 代码管理/WIDESEAWCS_Client/src/api/http.js                                                                                                   |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaDetailService.cs                                           |    7 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c99954ff-673f-45d7-b93b-30e6c1adfe58.vsidx               |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj                                                        |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/SemanticSymbols.db                         |    0 
 代码管理/WIDESEAWCS_Client/src/extension/basicinfo/boxing.js                                                                                 |    2 
 代码管理/WIDESEAWCS_Client/src/views/basicinfo/boxing.vue                                                                                    |   59 
 .vs/VSWorkspaceState.json                                                                                                                |    7 
 代码管理/WIDESEAWCS_Client/src/components/basic/VolTable.vue                                                                                 |  139 +
 代码管理/WIDESEAWCS_Client/src/views/basicinfo/processInfoDetail.vue                                                                         |  176 ++
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ScanStation.cs                                             |    4 
 /dev/null                                                                                                                                |    0 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfoInputs.cache |    2 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoService.cs                                             |    4 
 代码管理/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoDetailService.cs                                       |   16 
 64 files changed, 2,879 insertions(+), 1,002 deletions(-)

diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json
new file mode 100644
index 0000000..93d0dbb
--- /dev/null
+++ b/.vs/VSWorkspaceState.json
@@ -0,0 +1,7 @@
+{
+  "ExpandedNodes": [
+    ""
+  ],
+  "SelectedNode": "\\WIDESEAWCS_Server.sln",
+  "PreviewInSolutionExplorer": false
+}
\ No newline at end of file
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
new file mode 100644
index 0000000..fac1efa
--- /dev/null
+++ b/.vs/slnx.sqlite
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/api/http.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/api/http.js"
index f73725b..993d5d5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/api/http.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/api/http.js"
@@ -19,7 +19,7 @@
 }
 
 else if (process.env.NODE_ENV == 'production') {
-    axios.defaults.baseURL = 'http://127.0.0.1:8098/';
+    axios.defaults.baseURL = 'http://192.168.2.110:8098/';
 }
 if (!axios.defaults.baseURL.endsWith('/')) {
     axios.defaults.baseURL+="/";
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolForm.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolForm.vue"
index 3e6b9b1..224bcfd 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolForm.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolForm.vue"
@@ -26,9 +26,7 @@
           ></form-expand>
           <!-- 2021.10.17澧炲姞琛ㄥ崟瀹炴椂鏂规硶璁$畻 -->
           <span
-            v-else-if="
-              item.readonly && typeof formFields[item.field] == 'function'
-            "
+            v-else-if="item.readonly && typeof formFields[item.field] == 'function'"
             >{{ formFields[item.field]() }}</span
           >
           <!-- 鍙鍥剧墖鎴栨枃浠�  -->
@@ -82,17 +80,15 @@
               node-key="key"
               :props="{ label: 'label' }"
             >
-              <template #default="{data,node }">
+              <template #default="{ data, node }">
                 <!-- <el-checkbox v-model="node.checked"></el-checkbox> -->
-               <!-- {{getNode(node, data)}} -->
-               <!-- {{node.checked}} -->
-               <!-- 杩欓噷杩樻湁鐐归棶棰橈紝鍚庨潰澶勭悊 -->
-                {{  data.label}}</template
+                <!-- {{getNode(node, data)}} -->
+                <!-- {{node.checked}} -->
+                <!-- 杩欓噷杩樻湁鐐归棶棰橈紝鍚庨潰澶勭悊 -->
+                {{ data.label }}</template
               >
             </el-tree-select>
-            <template
-              v-else-if="['select', 'selectList'].indexOf(item.type) != -1"
-            >
+            <template v-else-if="['select', 'selectList'].indexOf(item.type) != -1">
               <el-select-v2
                 :disabled="item.readonly || item.disabled"
                 v-show="!item.hidden"
@@ -230,9 +226,7 @@
             <div
               class="v-date-range"
               style="display: flex"
-              v-else-if="
-                ['date', 'datetime'].indexOf(item.type) != -1 && item.range
-              "
+              v-else-if="['date', 'datetime'].indexOf(item.type) != -1 && item.range"
             >
               <el-date-picker
                 :size="size"
@@ -250,9 +244,7 @@
                 :value-format="getDateFormat(item)"
               >
               </el-date-picker>
-              <span style="margin: 0px 5px; font-size: 13px; color: #6f6b6b"
-                >鑷�</span
-              >
+              <span style="margin: 0px 5px; font-size: 13px; color: #6f6b6b">鑷�</span>
               <el-date-picker
                 :size="size"
                 :disabled="item.readonly || item.disabled"
@@ -284,9 +276,7 @@
                 v-model="formFields[item.field]"
                 @change="item.onChange"
                 :type="item.type"
-                :placeholder="
-                  item.placeholder ? item.placeholder : '璇烽�夋嫨' + item.title
-                "
+                :placeholder="item.placeholder ? item.placeholder : '璇烽�夋嫨' + item.title"
                 :disabledDate="(val) => getDateOptions(val, item)"
                 :value-format="getDateFormat(item)"
               >
@@ -308,9 +298,7 @@
             <el-scrollbar
               style="border: 1px solid #c7d8db; border-radius: 5px"
               :height="item.height || 150"
-              v-else-if="
-                item.type == 'editor' && (item.readonly || item.disabled)
-              "
+              v-else-if="item.type == 'editor' && (item.readonly || item.disabled)"
             >
               <div ref="editor" v-html="formFields[item.field]"></div>
             </el-scrollbar>
@@ -358,7 +346,7 @@
               v-else-if="item.type == 'cascader'"
               :options="item.data"
               :props="{
-                checkStrictly: item.changeOnSelect || item.checkStrictly
+                checkStrictly: item.changeOnSelect || item.checkStrictly,
               }"
               @change="item.onChange"
             >
@@ -373,10 +361,7 @@
               :max="item.max"
               v-model="formFields[item.field]"
             />
-            <div
-              style="display: flex"
-              v-else-if="item.type == 'range' || item.range"
-            >
+            <div style="display: flex" v-else-if="item.type == 'range' || item.range">
               <el-input
                 :size="size"
                 :disabled="item.readonly || item.disabled"
@@ -404,7 +389,7 @@
               type="textarea"
               :autosize="{
                 minRows: item.minRows || 2,
-                maxRows: item.maxRows || 10
+                maxRows: item.maxRows || 10,
               }"
               :placeholder="item.placeholder ? item.placeholder : item.title"
             />
@@ -492,33 +477,25 @@
 </template>
 <script>
 const rule = {
-  change: [
-    'checkbox',
-    'select',
-    'date',
-    'datetime',
-    'drop',
-    'radio',
-    'cascader'
-  ], // 2020.05.31澧炲姞绾ц仈绫诲瀷
+  change: ["checkbox", "select", "date", "datetime", "drop", "radio", "cascader"], // 2020.05.31澧炲姞绾ц仈绫诲瀷
   phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
   decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/,
-  number: /(^[\-0-9][0-9]*([0-9]+)?)$/
+  number: /(^[\-0-9][0-9]*([0-9]+)?)$/,
 };
-const inputTypeArr = ['text', 'string', 'mail', 'textarea', 'password'];
+const inputTypeArr = ["text", "string", "mail", "textarea", "password"];
 const types = {
-  int: 'number',
-  byte: 'number',
-  decimal: 'number', // "float",
-  string: 'string',
-  bool: 'boolean',
-  date: 'datetime',
-  date: 'date',
-  mail: 'email'
+  int: "number",
+  byte: "number",
+  decimal: "number", // "float",
+  string: "string",
+  bool: "boolean",
+  date: "datetime",
+  date: "date",
+  mail: "email",
 };
 //琛ㄥ崟楠岃瘉娉ㄦ剰锛氭瘡娆¢獙璇侀兘蹇呴』鎵цcallback,鍚﹀垯楠岃瘉涓嶆墽琛屽洖璋冩柟娉�
 const colPow = Math.pow(10, 3);
-import FormExpand from './VolForm/VolFormRender';
+import FormExpand from "./VolForm/VolFormRender";
 import {
   defineAsyncComponent,
   defineComponent,
@@ -527,61 +504,59 @@
   toRefs,
   getCurrentInstance,
   onMounted,
-  watch
-} from 'vue';
+  watch,
+} from "vue";
 export default defineComponent({
   components: {
     FormExpand,
-    'vol-upload': defineAsyncComponent(() =>
-      import('@/components/basic/VolUpload.vue')
+    "vol-upload": defineAsyncComponent(() => import("@/components/basic/VolUpload.vue")),
+    "vol-wang-editor": defineAsyncComponent(() =>
+      import("@/components/editor/VolWangEditor.vue")
     ),
-    'vol-wang-editor': defineAsyncComponent(() =>
-      import('@/components/editor/VolWangEditor.vue')
-    )
   },
   props: {
     loadKey: {
       // 鏄惁鍔犺浇formRules瀛楁閰嶇疆鐨勬暟鎹簮
       type: Boolean,
-      default: true
+      default: true,
     },
     width: {
       // 琛ㄥ崟瀹藉害
       type: Number,
-      default: 0
+      default: 0,
     },
     labelWidth: {
       // 琛ㄥ崟宸﹁竟label鏂囧瓧鏍囩鐨勫搴�
       type: Number,
-      default: 100
+      default: 100,
     },
     formRules: {
       // 琛ㄥ崟閰嶇疆瑙勫垯锛屽瀛楁绫诲瀷锛屾槸鍚﹀繀濉�
       type: Array,
-      default: []
+      default: [],
     },
     formFields: {
       type: Object,
       default: () => {
         return {};
-      }
+      },
     },
     editor: {
       // 2021.01.16缂栬緫鍣ㄤ俊鎭� {uploadImgUrl:"",upload:null//涓婁紶鏂规硶}
       type: Object,
       default: () => {
         return {};
-      }
+      },
     },
     size: {
       type: String, //large / default / small
-      default: 'large'
+      default: "large",
     },
     select2Count: {
       //瓒呭嚭鏁伴噺鏄剧ずselect2缁勪欢
       type: Number,
-      default: 500
-    }
+      default: 500,
+    },
   },
   computed: {
     rules() {
@@ -597,7 +572,7 @@
         }, 100);
       }
       return ruleResult;
-    }
+    },
   },
   setup(props, context) {
     const { appContext, proxy } = getCurrentInstance();
@@ -630,7 +605,7 @@
           });
         }
         row.forEach((item, yIndex) => {
-          if (item.type == 'number') {
+          if (item.type == "number") {
             numberFields.push(item.field);
           }
           // 鐩墠鍙敮鎸乻elect鍗曢�夎繙绋嬫悳绱紝remote杩滅▼浠庡悗鍙板瓧鍏告暟鎹簮杩涜鎼滅储锛寀rl浠庢寚瀹氱殑url鎼滅储
@@ -644,18 +619,18 @@
           // 鍒濆鍖栨暟鎹簮绌哄璞�
           if (item.dataKey) {
             // 涓嬫媺妗嗛兘寮哄埗璁剧疆涓哄瓧绗︿覆绫诲瀷
-            item.columnType = 'string';
+            item.columnType = "string";
             if (!item.data) {
               item.data = [];
             }
           }
 
-          if (item.range || item.type == 'range') {
+          if (item.range || item.type == "range") {
             if (
               !(props.formFields[item.field] instanceof Array) ||
               props.formFields[item.field].length != 2
             ) {
-              props.formFields[item.field] = ['', ''];
+              props.formFields[item.field] = ["", ""];
             }
             rangeFields.push(item.field);
           }
@@ -681,10 +656,10 @@
 
       if (keys.length == 0) return;
       appContext.config.globalProperties.http
-        .post('/api/Sys_Dictionary/GetVueDictionary', keys)
+        .post("/api/Sys_Dictionary/GetVueDictionary", keys)
         .then((dic) => {
           bindOptions(dic, binds);
-          proxy.$emit('dicInited', dic);
+          proxy.$emit("dicInited", dic);
         });
     };
     const bindOptions = (dic, binds) => {
@@ -692,7 +667,7 @@
         if (d.data.length > props.select2Count) {
           if (
             !binds.some((x) => {
-              return x.key == d.dicNo && x.type == 'cascader';
+              return x.key == d.dicNo && x.type == "cascader";
             })
           ) {
             d.data.forEach((item) => {
@@ -706,7 +681,7 @@
           // 濡傛灉鏈夋暟鎹殑鍒欎笉鏌ヨ
           if (x.data.length > 0) return true;
           //2022.03.13澧炲姞绾ц仈鏁版嵁婧愯嚜鍔ㄨ浆鎹�
-          if (x.type == 'cascader' || x.type == 'treeSelect') {
+          if (x.type == "cascader" || x.type == "treeSelect") {
             let _data = JSON.parse(JSON.stringify(d.data));
             let cascaderArr = appContext.config.globalProperties.base.convertTree(
               _data,
@@ -726,13 +701,13 @@
                 }
               });
             });
-          } else if (d.data.length > 0 && !d.data[0].hasOwnProperty('key')) {
+          } else if (d.data.length > 0 && !d.data[0].hasOwnProperty("key")) {
             let source = d.data,
               newSource = new Array(source.length);
             for (let index = 0; index < source.length; index++) {
               newSource[index] = {
-                key: source['key'] + '',
-                value: source['value']
+                key: source["key"] + "",
+                value: source["value"],
               };
             }
             x.data.push(...newSource);
@@ -745,18 +720,15 @@
 
     const initUpload = (item, init) => {
       if (!init) return;
-      if (
-        ['img', 'excel', 'file'].indexOf(item.type != -1) ||
-        item.columnType == 'img'
-      ) {
+      if (["img", "excel", "file"].indexOf(item.type != -1) || item.columnType == "img") {
         // 鍙槸娌¤缃槸鍚﹁嚜鍔ㄤ笂浼犵殑锛岄粯璁ら兘鏄�夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�
-        if (!item.hasOwnProperty('autoUpload')) {
+        if (!item.hasOwnProperty("autoUpload")) {
           item.autoUpload = true;
         }
-        if (!item.hasOwnProperty('fileList')) {
+        if (!item.hasOwnProperty("fileList")) {
           item.fileList = true;
         }
-        if (!item.hasOwnProperty('downLoad')) {
+        if (!item.hasOwnProperty("downLoad")) {
           item.downLoad = true;
         }
         if (!item.removeBefore) {
@@ -790,9 +762,9 @@
       let result = true;
       volform.value.validate((valid) => {
         if (!valid) {
-          appContext.config.globalProperties.$message.error('鏁版嵁楠岃瘉鏈�氳繃!');
+          appContext.config.globalProperties.$message.error("鏁版嵁楠岃瘉鏈�氳繃!");
           result = false;
-        } else if (typeof callback === 'function') {
+        } else if (typeof callback === "function") {
           try {
             callback(valid);
           } catch (error) {
@@ -812,7 +784,7 @@
       rangeFields,
       numberFields,
       validate,
-      volform
+      volform,
       //  initFormRules,
       // initSource
     };
@@ -820,7 +792,7 @@
   created() {
     this.formRules.forEach((rules) => {
       rules.forEach((option) => {
-        if (option.type == 'treeSelect' && option.multiple === undefined) {
+        if (option.type == "treeSelect" && option.multiple === undefined) {
           option.multiple = true;
         }
       });
@@ -830,7 +802,7 @@
   data() {
     return {
       // remoteCall: true,
-      errorImg: 'this.src="' + require('@/assets/imgs/error-img.png') + '"'
+      errorImg: 'this.src="' + require("@/assets/imgs/error-img.png") + '"',
       // span: 1,
       // rangeFields: [],
     };
@@ -847,8 +819,7 @@
         if (rowLength > _span) _span = rowLength;
       });
       let rete =
-        Math.round(((item.colSize || 12 / _span) / 0.12) * colPow, 10.0) /
-        colPow;
+        Math.round(((item.colSize || 12 / _span) / 0.12) * colPow, 10.0) / colPow;
       if (item.colSize) return rete.toFixed(3);
       return rete.toFixed(3);
       // return (100 - rete).toFixed(3);
@@ -858,7 +829,7 @@
     },
     getSrc(path) {
       if (!path) return;
-      if (!this.base.isUrl(path) && path.indexOf('.') != -1) {
+      if (!this.base.isUrl(path) && path.indexOf(".") != -1) {
         return this.http.ipAddress + path;
       }
       return path;
@@ -866,10 +837,10 @@
     // 鏄惁涓哄浘鐗囨枃浠剁瓑鏍煎紡骞跺瀛楁鐨勮浆鎹㈡垚鏁扮粍锛歔{name:'1.jpg',path:'127.0.0.1/ff/1.jpg'}]
     isFile(item, formFields) {
       if (
-        item.type == 'img' ||
-        item.columnType == 'img' ||
-        item.type == 'excel' ||
-        item.type == 'file'
+        item.type == "img" ||
+        item.columnType == "img" ||
+        item.type == "excel" ||
+        item.type == "file"
       ) {
         this.convertFileToArray(item, formFields);
         return true;
@@ -896,21 +867,21 @@
         return;
       }
       // 灏嗕互閫楀彿闅斿紑鐨勬枃浠跺垎鍓叉垚鏁扮粍127.0.0.1/aa/1.jpg,灏�127.0.0.1/aa/2.jpg
-      if (typeof fileInfo === 'string') {
-        if (fileInfo.trim() === '') {
+      if (typeof fileInfo === "string") {
+        if (fileInfo.trim() === "") {
           formFields[item.field] = [];
           return;
         }
         // 濡傛灉鏂囦欢璺緞鏄瓧绗︿覆锛屽垯浣跨敤锛屾媶鍒�
-        fileInfo = fileInfo.replace(/\\/g, '/');
-        let files = fileInfo.split(',');
+        fileInfo = fileInfo.replace(/\\/g, "/");
+        let files = fileInfo.split(",");
         formFields[item.field] = [];
         for (let index = 0; index < files.length; index++) {
           let file = files[index];
-          let splitFile = file.split('/');
+          let splitFile = file.split("/");
           formFields[item.field].push({
             name: splitFile.length > 0 ? splitFile[splitFile.length - 1] : file,
-            path: file // this.base.isUrl(file) ? file : this.http.ipAddress + file,
+            path: file, // this.base.isUrl(file) ? file : this.http.ipAddress + file,
           });
         }
       }
@@ -920,26 +891,26 @@
         file.path,
         file.name,
         {
-          Authorization: this.$store.getters.getToken()
+          Authorization: this.$store.getters.getToken(),
         },
         this.http.ipAddress
       );
     },
     validatorPhone(ruleOption, value, callback) {
-      if (!ruleOption.required && !value && value != '0') {
+      if (!ruleOption.required && !value && value != "0") {
         return callback();
       }
-      if (!rule.phone.test((value || '').trim())) {
-        return callback(new Error('璇疯緭鍏ユ纭殑鎵嬫満鍙�'));
+      if (!rule.phone.test((value || "").trim())) {
+        return callback(new Error("璇疯緭鍏ユ纭殑鎵嬫満鍙�"));
       }
       callback();
     },
     validatorPwd(ruleOption, value, callback) {
-      if (!ruleOption.required && !value && value != '0') {
+      if (!ruleOption.required && !value && value != "0") {
         return callback();
       }
-      if ((value + '').trim().length < 6) {
-        return callback(new Error('瀵嗙爜闀垮害涓嶈兘灏忎簬6浣�'));
+      if ((value + "").trim().length < 6) {
+        return callback(new Error("瀵嗙爜闀垮害涓嶈兘灏忎簬6浣�"));
       }
       callback();
     },
@@ -951,33 +922,33 @@
         ? val.map((x) => {
             return x;
           })
-        : val.split(',');
+        : val.split(",");
       for (let index = 0; index < valArr.length; index++) {
         var _item = data.find((x) => {
-          return x.key && x.key != '0' && x.key + '' == valArr[index] + '';
+          return x.key && x.key != "0" && x.key + "" == valArr[index] + "";
         });
         if (_item) {
           valArr[index] = _item.value;
         }
       }
-      return valArr.join(',');
+      return valArr.join(",");
     },
     getText(formFields, item) {
       // 2019.10.24淇琛ㄥ崟select缁勪欢涓哄彧璇荤殑灞炴�ф椂娌℃湁缁戝畾鏁版嵁婧�
       let text = formFields[item.field];
-      if (typeof text === 'function') return text(formFields);
-      if (text === 'null' || text === '' || text === null || text === undefined)
-        return '--';
+      if (typeof text === "function") return text(formFields);
+      if (text === "null" || text === "" || text === null || text === undefined)
+        return "--";
       //2021.03.02澧炲姞鍙鏃舵棩鏈熷鐞�
-      if (item.type == 'date') {
-        return text.replace('T', ' ').split(' ')[0];
+      if (item.type == "date") {
+        return text.replace("T", " ").split(" ")[0];
       }
       //2021.03.31淇琛ㄥ崟switch鍙鏃舵病鏈夎浆鎹㈠�肩殑闂
-      if (item.type == 'switch') {
-        return text ? '鏄�' : '鍚�';
+      if (item.type == "switch") {
+        return text ? "鏄�" : "鍚�";
       }
       if (!item.data) return text;
-      if (item.type == 'selectList' || item.type == 'checkbox') {
+      if (item.type == "selectList" || item.type == "checkbox") {
         return this.convertArrayValue(item.data, text);
       }
       var _item = item.data.find((x) => {
@@ -991,7 +962,7 @@
       // console.log(2);
     },
     onChange(item, value) {
-      if (item.onChange && typeof item.onChange === 'function') {
+      if (item.onChange && typeof item.onChange === "function") {
         item.onChange(value, item);
       }
     },
@@ -1002,7 +973,7 @@
         //  console.log('undefined');
       }
       this.remoteCall = false;
-      if (item.onChange && typeof item.onChange === 'function') {
+      if (item.onChange && typeof item.onChange === "function") {
         item.onChange(value, item);
       }
     },
@@ -1016,23 +987,22 @@
         return;
       }
       if (
-        val == '' ||
-        (item.data.length == 1 &&
-          (val == item.data[0].key || val == item.data[0].value))
+        val == "" ||
+        (item.data.length == 1 && (val == item.data[0].key || val == item.data[0].value))
       ) {
         return;
       }
       // 寮瑰嚭妗嗘垨鍒濆鍖栬〃鍗曟椂缁檇ata璁剧疆鏁扮粍榛樿鍊�2
       // 2020.09.26淇杩滅▼鎼滅储鑷畾涔塽rl涓嶈捣浣滅敤鐨勯棶棰�
       let url;
-      if (typeof item.url === 'function') {
+      if (typeof item.url === "function") {
         url = item.url(val, item.dataKey, item);
       } else {
         url =
-          (item.url || '/api/Sys_Dictionary/GetSearchDictionary') +
-          '?dicNo=' +
+          (item.url || "/api/Sys_Dictionary/GetSearchDictionary") +
+          "?dicNo=" +
           item.dataKey +
-          '&value=' +
+          "&value=" +
           val;
       }
       this.http.post(url).then((dicData) => {
@@ -1043,14 +1013,14 @@
       });
     },
     getObject(date) {
-      if (typeof date === 'object') {
+      if (typeof date === "object") {
         return date;
       }
       return new Date(date);
     },
     reset(sourceObj) {
       // 閲嶇疆琛ㄥ崟鏃讹紝绂佺敤杩滅▼鏌ヨ
-      this.$refs['volform'].resetFields();
+      this.$refs["volform"].resetFields();
       if (this.rangeFields.length) {
         this.rangeFields.forEach((key) => {
           this.formFields[key].splice(0);
@@ -1085,145 +1055,139 @@
       if (
         // item.readonly ||
         // item.disabled ||
-        item.type == 'switch' ||
-        item.type == 'range'
+        item.type == "switch" ||
+        item.type == "range"
       )
         return { required: false };
       // 鐢ㄦ埛璁剧疆鐨勮嚜瀹氫箟鏂规硶
-      if (item.validator && typeof item.validator === 'function') {
+      if (item.validator && typeof item.validator === "function") {
         return {
           validator: (rule, val, callback) => {
             // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
             let message = item.validator(rule, val);
-            if (message) return callback(new Error(message + ''));
+            if (message) return callback(new Error(message + ""));
             return callback();
           },
           required: item.required,
-          trigger: rule.change.indexOf(item.type) != -1 ? 'change' : 'blur'
+          trigger: rule.change.indexOf(item.type) != -1 ? "change" : "blur",
         };
       }
-      if (['img', 'excel', 'file'].indexOf(item.type) != -1) {
+      if (["img", "excel", "file"].indexOf(item.type) != -1) {
         return {
           validator: (rule, val, callback) => {
             //2021.09.05绉婚櫎鏂囦欢涓婁紶榛樿蹇呭~
-            if (
-              item.required &&
-              !this.isReadonly(item) &&
-              (!val || !val.length)
-            ) {
+            if (item.required && !this.isReadonly(item) && (!val || !val.length)) {
               return callback(
-                new Error(item.type == 'img' ? '璇蜂笂浼犵収鐗�' : '璇蜂笂浼犳枃浠�')
+                new Error(item.type == "img" ? "璇蜂笂浼犵収鐗�" : "璇蜂笂浼犳枃浠�")
               );
             }
             return callback();
           },
           required: item.required,
-          trigger: 'change'
+          trigger: "change",
         };
       }
       // 璁剧疆鏁板瓧鐨勬渶澶у�兼皯鏈�灏忓��
       if (
-        item.type == 'number' ||
-        item.columnType == 'number' ||
-        item.columnType == 'int' ||
-        item.type == 'decimal'
+        item.type == "number" ||
+        item.columnType == "number" ||
+        item.columnType == "int" ||
+        item.type == "decimal"
       ) {
         // 濡傛灉鏄繀濉」鐨勬暟瀛楋紝璁剧疆涓�涓粯璁ゆ渶澶т笌鏈�鍊煎皬
-        if (item.required && typeof item.min !== 'number') {
+        if (item.required && typeof item.min !== "number") {
           item.min = 0; //item.type == "decimal" ? 0.1 : 1;
         }
 
         return {
           required: item.required,
-          message: item.title + '鍙兘鏄暟瀛�',
+          message: item.title + "鍙兘鏄暟瀛�",
           title: item.title,
-          trigger: 'blur',
+          trigger: "blur",
           min: item.min,
           max: item.max,
           type: item.columnType || item.type,
           validator: (ruleObj, value, callback) => {
             if (!ruleObj.min && !ruleObj.max) {
               if (ruleObj.required) {
-                if ((!value && value != '0') || !rule.decimal.test(value)) {
-                  return callback(new Error('鍙兘鏄暟瀛�'));
+                if ((!value && value != "0") || !rule.decimal.test(value)) {
+                  return callback(new Error("鍙兘鏄暟瀛�"));
                 }
               }
               return callback();
             }
             if (this.isReadonly(item)) return callback();
-            if (ruleObj.type == 'number') {
+            if (ruleObj.type == "number") {
               if (!rule.number.test(value)) {
-                ruleObj.message = ruleObj.title + '鍙兘鏄暣鏁�';
+                ruleObj.message = ruleObj.title + "鍙兘鏄暣鏁�";
                 return callback(new Error(ruleObj.message));
               }
             } else {
               if (!rule.decimal.test(value)) {
-                ruleObj.message = ruleObj.title + '鍙兘鏄暟瀛�';
+                ruleObj.message = ruleObj.title + "鍙兘鏄暟瀛�";
                 return callback(new Error(ruleObj.message));
               }
             }
             if (
               ruleObj.min !== undefined &&
-              typeof ruleObj.min === 'number' &&
+              typeof ruleObj.min === "number" &&
               value < ruleObj.min
             ) {
-              ruleObj.message = ruleObj.title + '涓嶈兘灏忎簬' + ruleObj.min;
+              ruleObj.message = ruleObj.title + "涓嶈兘灏忎簬" + ruleObj.min;
               return callback(new Error(ruleObj.message));
             }
             if (
               ruleObj.max !== undefined &&
-              typeof ruleObj.max === 'number' &&
+              typeof ruleObj.max === "number" &&
               value > ruleObj.max
             ) {
-              ruleObj.message = ruleObj.title + '涓嶈兘澶т簬' + ruleObj.max;
+              ruleObj.message = ruleObj.title + "涓嶈兘澶т簬" + ruleObj.max;
               return callback(new Error(ruleObj.message));
             }
             return callback();
-          }
+          },
         };
       }
 
       // 鎵嬫満銆佸瘑鐮侀獙璇�
-      if (item.type == 'password' || item.type == 'phone') {
+      if (item.type == "password" || item.type == "phone") {
         return {
-          validator:
-            item.type == 'phone' ? this.validatorPhone : this.validatorPwd,
+          validator: item.type == "phone" ? this.validatorPhone : this.validatorPwd,
           required: item.required,
-          trigger: 'blur'
+          trigger: "blur",
         };
       }
 
-      if (!item.required && item.type != 'mail') return { required: false };
+      if (!item.required && item.type != "mail") return { required: false };
 
-      if (!item.hasOwnProperty('type')) item.type = 'text';
+      if (!item.hasOwnProperty("type")) item.type = "text";
 
       if (inputTypeArr.indexOf(item.type) != -1) {
         let message =
-          item.title +
-          (item.type == 'mail' ? '蹇呴』鏄竴涓偖绠卞湴鍧�' : '涓嶈兘涓虹┖');
-        let type = item.type == 'mail' ? 'email' : types[item.columnType];
+          item.title + (item.type == "mail" ? "蹇呴』鏄竴涓偖绠卞湴鍧�" : "涓嶈兘涓虹┖");
+        let type = item.type == "mail" ? "email" : types[item.columnType];
         let _rule = {
           required: true,
           message: message,
-          trigger: 'blur',
+          trigger: "blur",
           type: type,
           validator: (ruleObj, value, callback) => {
             if (
               !this.isReadonly(item) &&
-              (value === '' || value === undefined || value === null)
+              (value === "" || value === undefined || value === null)
             ) {
               return callback(new Error(ruleObj.message));
             }
             return callback();
-          }
+          },
         };
-        if (item.type == 'mail') {
+        if (item.type == "mail") {
           _rule.validator = undefined;
           return _rule;
         }
         if (item.min) {
           _rule.min = item.min;
-          _rule.message = item.title + '鑷冲皯' + item.min + '涓瓧绗�!';
+          _rule.message = item.title + "鑷冲皯" + item.min + "涓瓧绗�!";
         }
         if (item.max) {
           return [
@@ -1231,94 +1195,94 @@
             {
               max: item.max,
               required: true,
-              message: item.title + '鏈�澶�' + item.max + '涓瓧绗�!',
-              trigger: 'blur'
-            }
+              message: item.title + "鏈�澶�" + item.max + "涓瓧绗�!",
+              trigger: "blur",
+            },
           ];
         }
         return _rule;
       }
 
-      if (item.type == 'radio') {
+      if (item.type == "radio") {
         return {
           required: item.required,
-          message: '璇烽�夋嫨' + item.title,
-          trigger: 'change',
-          type: 'string'
+          message: "璇烽�夋嫨" + item.title,
+          trigger: "change",
+          type: "string",
         };
       }
       if (
-        item.type == 'date' ||
-        item.type == 'datetime' ||
-        item.type == 'month' ||
-        item.type == 'time'
+        item.type == "date" ||
+        item.type == "datetime" ||
+        item.type == "month" ||
+        item.type == "time"
       ) {
         return {
           required: true,
-          message: '璇烽�夋嫨' + item.title,
-          trigger: 'change',
-          type: item.range ? 'array' : 'string',
+          message: "璇烽�夋嫨" + item.title,
+          trigger: "change",
+          type: item.range ? "array" : "string",
           validator: (rule, val, callback) => {
             if (this.isReadonly(item)) return callback();
             // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
             if (!val || (item.range && !val.length)) {
-              return callback(new Error('璇烽�夋嫨鏃ユ湡'));
+              return callback(new Error("璇烽�夋嫨鏃ユ湡"));
             }
             return callback();
-          }
+          },
         };
       }
 
-      if (item.type == 'cascader') {
+      if (item.type == "cascader") {
         return {
-          type: 'array',
+          type: "array",
           required: true,
           min: item.min || 1,
           // message: "璇烽�夋嫨" + item.title,
-          trigger: 'change',
+          trigger: "change",
           validator: (rule, val, callback) => {
             if (this.isReadonly(item)) return callback();
             // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
             let _arr = this.formFields[item.field];
             if (!_arr || !_arr.length) {
-              return callback(new Error('璇烽�夋嫨' + item.title));
+              return callback(new Error("璇烽�夋嫨" + item.title));
             }
             return callback();
-          }
+          },
         };
       }
 
       if (
-        ['select', 'selectList', 'checkbox', 'cascader', 'treeSelect'].indexOf(
+        ["select", "selectList", "checkbox", "cascader", "treeSelect"].indexOf(
           item.type
         ) != -1
       ) {
         let _rule = {
-          type: item.type == 'select' ? 'string' : 'array',
+          type: item.type == "select" ? "string" : "array",
           required: true,
           min: item.min || 1,
-          message: '璇烽�夋嫨' + item.title,
-          trigger: 'change',
+          message: "璇烽�夋嫨" + item.title,
+          trigger: "change",
           validator: (rule, value, callback) => {
             if (this.isReadonly(item)) return callback();
             //2021.11.27淇澶氶�夋病鏈夋彁绀虹殑闂
-            if (value == undefined || value === '') {
+            if (value == undefined || value === "") {
               return callback(new Error(rule.message));
             } else if (
-              (item.type == 'checkbox' ||
-                item.type == 'selectList' ||
-                item.type == 'treeSelect') &&
+              (item.type == "checkbox" ||
+                item.type == "selectList" ||
+                item.type == "treeSelect") &&
               (!(value instanceof Array) || !value.length)
             ) {
               return callback(new Error(rule.message));
             }
             return callback();
-          }
+          },
         };
 
         if (_rule.max) {
           _rule.nax = item.max;
-          _rule.message = '鏈�澶氬彧鑳介�夋嫨' + item.max + '椤�';
+          _rule.message = "鏈�澶氬彧鑳介�夋嫨" + item.max + "椤�";
         }
         return _rule;
       }
@@ -1329,8 +1293,7 @@
         return true;
       }
       return (
-        date1.valueOf() <
-        (typeof date2 == 'number' ? date2 : new Date(date2).valueOf())
+        date1.valueOf() < (typeof date2 == "number" ? date2 : new Date(date2).valueOf())
       );
     },
     getDateOptions(date, item) {
@@ -1338,27 +1301,25 @@
       if ((!item.min && !item.max) || !date) {
         return false;
       }
-      if (item.min && item.min.indexOf(' ') == -1) {
+      if (item.min && item.min.indexOf(" ") == -1) {
         //涓嶈缃椂鍒嗙锛屽悗闈細鑷姩鍔犱笂 08:00
-        item.min = item.min + ' 00:00:000';
+        item.min = item.min + " 00:00:000";
       }
-      return (
-        this.compareDate(date, item.min) || !this.compareDate(date, item.max)
-      );
+      return this.compareDate(date, item.min) || !this.compareDate(date, item.max);
     },
     getDateFormat(item) {
-      if (item.type == 'month') {
-        return 'YYYY-MM';
+      if (item.type == "month") {
+        return "YYYY-MM";
       }
       // if (item.type=='time') {
       //     return 'HH:mm:ss'
       // }
       //瑙乭ttps://day.js.org/docs/zh-CN/display/format
-      return item.type == 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss';
+      return item.type == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss";
     },
     dateRangeChange(val, item) {
       if (!val) {
-        this.$emit('update:formFields');
+        this.$emit("update:formFields");
         return;
       }
       item.onChange && item.onChange(val);
@@ -1372,10 +1333,10 @@
     filterMethod(value, data) {
       return data.label.includes(value);
     },
-    getNode( label,node, data){
-      console.log(label)
-    }
-  }
+    getNode(label, node, data) {
+      console.log(label);
+    },
+  },
 });
 </script>
 <style lang="less" scoped>
@@ -1455,8 +1416,8 @@
   padding-left: 5px;
 }
 .el-form-item ::v-deep(textarea) {
-  font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
-    'Microsoft YaHei', '寰蒋闆呴粦', Arial, sans-serif !important;
+  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
+    "Microsoft YaHei", "寰蒋闆呴粦", Arial, sans-serif !important;
 }
 .el-form-item ::v-deep(.el-select .el-select__tags > span) {
   display: flex;
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolTable.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolTable.vue"
index af51360..096a1ea 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolTable.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/components/basic/VolTable.vue"
@@ -642,6 +642,7 @@
       default: 500,
     },
     selectable: {
+
       type: Function,
       default: (row, index) => {
         return true;
@@ -884,47 +885,110 @@
     rowDbClick(row, column, event) {
       //2021.05.23澧炲姞鍙屽嚮琛屼簨浠�
       this.$emit("rowDbClick", { row, column, event });
-    },
-    rowClick(row, column, event) {
-      //2022.02.20澧炲姞鐐瑰嚮鏃惰〃鏍煎弬鏁板垽鏂�
-      if (!column) {
-        return;
-      }
-      //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
-      if (this.edit.rowIndex == -1) {
-        this.$emit("rowClick", { row, column, event });
-      }
-      // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+    },rowClick(row, column, event) {
+  // 2022.02.20澧炲姞鐐瑰嚮鏃惰〃鏍煎弬鏁板垽鏂�
+  if (!column) {
+    return;
+  }
 
-      if (!this.doubleEdit) {
-        return;
-      }
-      // 鐐瑰嚮鍏朵粬琛屾椂锛屽鏋滅偣鍑荤殑琛屼笌姝e湪缂栬緫鐨勮鐩稿悓锛屼繚鎸佺紪杈戠姸鎬�
-      if (this.clickEdit && this.edit.rowIndex != -1) {
-        if (row.elementIndex == this.edit.rowIndex) {
-          // 鐐瑰嚮鐨勫崟鍏冩牸濡傛灉涓嶅彲浠ョ紪杈戯紝鐩存帴缁撴潫缂栬緫
-          // 2020.10.12淇缁撴潫缂栬緫鏃讹紝element table楂樼増鏈睘鎬ц幏鍙栦笉鍒扮殑闂
-          let _col = this.columns.find((x) => {
-            return x.field == ((event && event.property) || column.property);
-          });
-          if (_col && (!_col.edit || _col.readonly)) {
-            if (this.rowEndEdit(row, event)) {
-              this.edit.rowIndex = -1;
-            }
-          }
-          return;
-        }
-        if (this.rowEndEdit(row, event && event.property ? event : column)) {
+  // ===== 浼樺寲锛氶殧绂诲閫夋鐐瑰嚮浜嬩欢锛岄伩鍏嶅啋娉″共鎵� 寮�濮� =====
+  // 鍒ゆ柇鐐瑰嚮鐩爣鏄惁鏄閫夋锛堟垨澶嶉�夋鎵�鍦ㄧ殑鍗曞厓鏍�/鍥炬爣锛�
+  const targetEl = event.target;
+  const isCheckbox = targetEl.classList.contains('el-checkbox__input') || 
+                      targetEl.closest('.el-checkbox__input') ||
+                      targetEl.closest('.el-table-column--selection');
+  // 濡傛灉鐐瑰嚮鐨勬槸澶嶉�夋鍖哄煙锛岀洿鎺ヨ繑鍥烇紝涓嶆墽琛岃閫変腑閫昏緫
+  if (isCheckbox) {
+    return;
+  }
+  // ===== 浼樺寲锛氶殧绂诲閫夋鐐瑰嚮浜嬩欢 缁撴潫 =====
+
+  // ===== 浼樺寲锛氱偣鍑昏閫変腑/鍒囨崲澶嶉�夋 寮�濮� =====
+  // 1. 鍒ゆ柇鏄惁鏄剧ず澶嶉�夋锛坈k涓簍rue锛夛紝涓嶆樉绀哄垯鏃犻渶澶勭悊
+  // 2. 缂栬緫鐘舵�佷笅涓嶈Е鍙戯紙閬垮厤骞叉壈缂栬緫鍔熻兘锛�
+  if (this.ck && this.edit.rowIndex === -1) {
+    // 3. 鍗曢�夊満鏅紙single涓簍rue锛夛細鍏堟竻绌烘墍鏈夐�変腑椤癸紝鍐嶅己鍒堕�変腑褰撳墠琛岋紙淇濇寔鍗曢�夐�昏緫锛�
+    if (this.single) {
+      this.$refs.table.clearSelection(); // 娓呯┖鎵�鏈夐�変腑
+      this.$refs.table.toggleRowSelection(row, true); // 鍗曢�夊満鏅己鍒堕�変腑褰撳墠琛�
+    } 
+    // 4. 澶氶�夊満鏅紙single涓篺alse锛夛細涓嶄紶绗簩涓弬鏁帮紝瀹炵幇鍒囨崲閫変腑/鍙栨秷鐘舵��
+    else {
+      this.$refs.table.toggleRowSelection(row); // 鍒囨崲鐘舵�侊紝鏀寔鍙栨秷閫変腑
+    }
+  }
+  // ===== 浼樺寲锛氱偣鍑昏閫変腑/鍒囨崲澶嶉�夋 缁撴潫 =====
+
+  // 姝e湪缂栬緫鏃讹紝绂佹瑙﹀彂rowClick浜嬩欢
+  if (this.edit.rowIndex == -1) {
+    this.$emit("rowClick", { row, column, event });
+  }
+  // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+  if (!this.doubleEdit) {
+    return;
+  }
+  // 鐐瑰嚮鍏朵粬琛屾椂锛屽鏋滅偣鍑荤殑琛屼笌姝e湪缂栬緫鐨勮鐩稿悓锛屼繚鎸佺紪杈戠姸鎬�
+  if (this.clickEdit && this.edit.rowIndex != -1) {
+    if (row.elementIndex == this.edit.rowIndex) {
+      // 鐐瑰嚮鐨勫崟鍏冩牸濡傛灉涓嶅彲浠ョ紪杈戯紝鐩存帴缁撴潫缂栬緫
+      // 2020.10.12淇缁撴潫缂栬緫鏃讹紝element table楂樼増鏈睘鎬ц幏鍙栦笉鍒扮殑闂
+      let _col = this.columns.find((x) => {
+        return x.field == ((event && event.property) || column.property);
+      });
+      if (_col && (!_col.edit || _col.readonly)) {
+        if (this.rowEndEdit(row, event)) {
           this.edit.rowIndex = -1;
         }
-        //褰撴鍦ㄧ紪杈戯紝涓旂偣鍑诲埌鍏朵粬琛屾椂锛屽湪鍘熺紪杈戠殑琛岀粨鏉熺紪杈戝悗锛岃Е鍙戞柊琛岀殑rowClick浜嬩欢
-        //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
-        if (this.edit.rowIndex == -1) {
-          this.$emit("rowClick", { row, column, event });
-        }
       }
-      this.rowBeginEdit(row, column);
-    },
+      return;
+    }
+    if (this.rowEndEdit(row, event && event.property ? event : column)) {
+      this.edit.rowIndex = -1;
+    }
+    //褰撴鍦ㄧ紪杈戯紝涓旂偣鍑诲埌鍏朵粬琛屾椂锛屽湪鍘熺紪杈戠殑琛岀粨鏉熺紪杈戝悗锛岃Е鍙戞柊琛岀殑rowClick浜嬩欢
+    //姝e湪缂栬緫鏃讹紝绂佹瑙﹀彂rowClick浜嬩欢
+    if (this.edit.rowIndex == -1) {
+      this.$emit("rowClick", { row, column, event });
+    }
+  }
+  this.rowBeginEdit(row, column);
+},
+
+    //   //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
+    //   if (this.edit.rowIndex == -1) {
+    //     this.$emit("rowClick", { row, column, event });
+    //   }
+    //   // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+
+    //   if (!this.doubleEdit) {
+    //     return;
+    //   }
+    //   // 鐐瑰嚮鍏朵粬琛屾椂锛屽鏋滅偣鍑荤殑琛屼笌姝e湪缂栬緫鐨勮鐩稿悓锛屼繚鎸佺紪杈戠姸鎬�
+    //   if (this.clickEdit && this.edit.rowIndex != -1) {
+    //     if (row.elementIndex == this.edit.rowIndex) {
+    //       // 鐐瑰嚮鐨勫崟鍏冩牸濡傛灉涓嶅彲浠ョ紪杈戯紝鐩存帴缁撴潫缂栬緫
+    //       // 2020.10.12淇缁撴潫缂栬緫鏃讹紝element table楂樼増鏈睘鎬ц幏鍙栦笉鍒扮殑闂
+    //       let _col = this.columns.find((x) => {
+    //         return x.field == ((event && event.property) || column.property);
+    //       });
+    //       if (_col && (!_col.edit || _col.readonly)) {
+    //         if (this.rowEndEdit(row, event)) {
+    //           this.edit.rowIndex = -1;
+    //         }
+    //       }
+    //       return;
+    //     }
+    //     if (this.rowEndEdit(row, event && event.property ? event : column)) {
+    //       this.edit.rowIndex = -1;
+    //     }
+    //     //褰撴鍦ㄧ紪杈戯紝涓旂偣鍑诲埌鍏朵粬琛屾椂锛屽湪鍘熺紪杈戠殑琛岀粨鏉熺紪杈戝悗锛岃Е鍙戞柊琛岀殑rowClick浜嬩欢
+    //     //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
+    //     if (this.edit.rowIndex == -1) {
+    //       this.$emit("rowClick", { row, column, event });
+    //     }
+    //   }
+    //   this.rowBeginEdit(row, column);
+    // },
     dowloadFile(file) {
       this.base.dowloadFile(
         file.path,
@@ -1654,6 +1718,7 @@
       return column.edit.type == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss";
     },
     userSelect(selection, row) {
+      console.log("userSelect", selection, row);
       this.selectRows = selection;
       if (!this.single) {
         this.$emit("rowChange", { row, selection });
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxing.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxing.js"
index da94487..76c1328 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxing.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxing.js"
@@ -1,5 +1,3 @@
-
-
 let extension = {
     components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
         //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxingDetail.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxingDetail.js"
index da94487..76c1328 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxingDetail.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/boxingDetail.js"
@@ -1,5 +1,3 @@
-
-
 let extension = {
     components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
         //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/formula.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/formula.js"
index da94487..96e8cfd 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/formula.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/formula.js"
@@ -1,10 +1,9 @@
 
-
 let extension = {
     components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
         //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
         gridHeader:'',
-        gridbody:'',
+        gridBody: '',
         gridFooter: '',
         //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
         modelHeader: '',
@@ -14,7 +13,13 @@
     buttons: [],//鎵╁睍鐨勬寜閽�
     methods: {//浜嬩欢鎵╁睍
         onInit() {
-        },
+            var detailImport = this.detailOptions.buttons.find(item=>item.value == 'import');
+      if(detailImport){
+        detailImport.onClick = () => {
+          this.$refs.gridBody.open();
+        }
+      }
+    },
         onInited() {
         }
     }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/processInfoDetail.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/processInfoDetail.js"
new file mode 100644
index 0000000..da94487
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/extension/basicinfo/processInfoDetail.js"
@@ -0,0 +1,22 @@
+
+
+let extension = {
+    components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        gridHeader:'',
+        gridbody:'',
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    buttons: [],//鎵╁睍鐨勬寜閽�
+    methods: {//浜嬩欢鎵╁睍
+        onInit() {
+        },
+        onInited() {
+        }
+    }
+};
+export default extension;
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/router/viewGird.js" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/router/viewGird.js"
index 2e93c1c..3bb9020 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/router/viewGird.js"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/router/viewGird.js"
@@ -78,6 +78,10 @@
     name: 'processInfo',
     component: () => import('@/views/basicinfo/processInfo.vue')
   }, {
+    path: '/processInfoDetail',
+    name: 'processInfoDetail',
+    component: () => import('@/views/basicinfo/processInfoDetail.vue')
+  }, {
     path: '/scanStation',
     name: 'scanStation',
     component: () => import('@/views/basicinfo/scanStation.vue')
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/Home.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/Home.vue"
index 820437a..b82d2f2 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/Home.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/Home.vue"
@@ -1,24 +1,1094 @@
 <template>
-  <div class="title"></div>
+  <div class="container">
+    <!-- 宸︿晶鍖哄煙 - 鏃犱换浣曟爣棰樻爣娉� -->
+    <div class="left-area">
+      <div class="left-top">
+        <!-- 鎸夐挳+淇″彿 妯悜鎺掑垪瀹瑰櫒 -->
+        <div class="btn-signal-group">
+          <!-- 鎸夐挳缁� - 淇敼涓轰笂涓嬫帓鍒� -->
+          <div class="btn-group">
+            <button
+              class="btn"
+              :class="isPLCStarted ? 'stop-btn' : 'start-btn'"
+              @click="handleToggle"
+            >
+              <i class="icon" :class="isPLCStarted ? 'icon-stop' : 'icon-start'"></i>
+              {{ isPLCStarted ? "鍏抽棴" : "鍚姩" }}
+            </button>
+            <button
+              class="btn"
+              :class="isPLCPaused ? 'resume-btn' : 'pause-btn'"
+              @click="handlePauseToggle"
+              :disabled="!isPLCStarted"
+            >
+              <i class="icon" :class="isPLCPaused ? 'icon-resume' : 'icon-pause'"></i>
+              {{ isPLCPaused ? "鎭㈠" : "鏆傚仠" }}
+            </button>
+          </div>
+
+          <!-- 淇″彿鐏粍 鍗犱袱涓寜閽搴� + 鏁翠綋鏀惧ぇ -->
+          <div class="signal-status">
+            <div class="signal-item" v-for="(signal, index) in signalStates" :key="index">
+              <div
+                class="signal-light"
+                :class="signal ? 'signal-active' : 'signal-inactive'"
+              >
+                <div class="signal-light-inner"></div>
+              </div>
+              <span class="signal-label">{{ signalLabels[index] }}</span>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="left-bottom">
+        <div class="form-row finished-product-row">
+          <span class="label">鎴愬搧缂栧彿锛�</span>
+          <input type="text" class="input-box" v-model="finishedProduct" disabled />
+        </div>
+        <div class="parts-list">
+          <div
+            class="form-row part-item"
+            v-for="(item, index) in leftPartCodes"
+            :key="index"
+          >
+            <span class="label">闆朵欢{{ index + 1 }}锛�</span>
+            <input
+              type="text"
+              class="input-box"
+              v-model="leftPartCodes[index]"
+              disabled
+            />
+            <label class="checkbox-container">
+              <input
+                type="checkbox"
+                class="part-checkbox"
+                v-model="leftPartChecked[index]"
+                @change="handlePartCheck(index)"
+              />
+              <span class="checkmark"></span>
+              <span class="checkbox-label">{{
+                leftPartChecked[index] ? "鎵爜" : "涓嶆壂"
+              }}</span>
+            </label>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 鍙充晶鍖哄煙 - 鏃犱换浣曟爣棰樻爣娉� 銆愬凡鍒犻櫎娓呯┖+淇濆瓨鎸夐挳銆� -->
+    <div class="right-area">
+      <div class="right-top">
+        <div class="form-row">
+          <span class="label">褰曞叆妗嗭細</span>
+          <!-- 鉁� 鍙繚鐣欑函褰曞叆妗嗭紝娓呯┖/淇濆瓨鎸夐挳宸插垹闄� -->
+          <input type="text" class="input-box" v-model="rightTopInput" />
+        </div>
+      </div>
+
+      <div class="right-bottom">
+        <div class="form-row tooling-board-row">
+          <span class="short-label">宸ヨ鏉跨紪鍙凤細</span>
+          <input
+            type="text"
+            class="input-box short-input"
+            v-model="toolingBoardNo"
+            placeholder="璇疯緭鍏ュ伐瑁呮澘缂栧彿"
+          />
+          <button class="btn clear-btn" @click="clearToolingBoardNo">
+            <i class="icon icon-clear"></i>娓呴櫎
+          </button>
+          <button class="btn save-btn" @click="saveToolingBoardNo">
+            <i class="icon icon-submit"></i>鎻愪氦
+          </button>
+        </div>
+        <div class="parts-list">
+          <div class="form-row part-item finished-product-row">
+            <span class="label">鎴愬搧缂栧彿锛�</span>
+            <input
+              type="text"
+              class="input-box"
+              v-model="finishedProductCode"
+              placeholder="璇疯緭鍏ユ垚鍝佺紪鍙�"
+            />
+            <button class="btn clear-btn" @click="clearFinishedProductCode">
+              <i class="icon icon-clear"></i>娓呴櫎
+            </button>
+          </div>
+          <div
+            class="form-row part-item"
+            v-for="(item, index) in rightPartCodes"
+            :key="index"
+          >
+            <span class="label">闆朵欢{{ index + 1 }}锛�</span>
+            <input
+              type="text"
+              class="input-box"
+              v-model="rightPartCodes[index]"
+              placeholder="璇疯緭鍏ラ浂浠剁紪鍙�"
+            />
+            <button class="btn clear-btn" @click="clearRightPart(index)">
+              <i class="icon icon-clear"></i>娓呴櫎
+            </button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
 </template>
 
 <script>
-import { ref, reactive } from 'vue'
+import { ref, onMounted, onUnmounted, watch, computed } from "vue";
+import axios from "axios";
 
 export default {
   setup() {
-    return {
+    // 鍩虹鏁版嵁瀹氫箟 - 1:1绮惧噯瀵规帴鍚庣 鎴愬搧缂栧彿+闆朵欢缂栧彿 鏃犲啑浣欏吋瀹�
+    const finishedProduct = ref(""); // 宸︿晶鎴愬搧缂栧彿锛圙etLeftInitialData鎺ュ彛杩斿洖锛�
+    const finishedProductId = ref("");
+    const rightTopInput = ref("");
+    const leftPartCodes = ref(Array(10).fill("")); // 宸︿晶闆朵欢缂栧彿鏁扮粍
+    const rightPartCodes = ref(Array(10).fill("")); // 鍙充晶闆朵欢缂栧彿鏁扮粍
+    const leftPartChecked = ref(Array(10).fill(false));
+    const toolingBoardNo = ref("");
+    const fillIndex = ref(-1);
+    const leftPartIds = ref(Array(10).fill(""));
+    const finishedProductCode = ref(""); // 鍙充晶鎴愬搧缂栧彿锛堝伐瑁呮澘鎺ュ彛杩斿洖锛�
 
-    }
-  }
-}
+    // PLC鐘舵��
+    const isPLCStarted = ref(false);
+    const isPLCPaused = ref(false);
+
+    // 淇″彿鐩稿叧
+    const signalStates = ref([false, false, false, false, false]);
+    const signalLabels = ref([
+      "蹇冭烦淇″彿",
+      "鎬ュ仠淇″彿",
+      "鑷姩杩愯淇″彿",
+      "鍦ㄧ嚎妯″紡淇″彿",
+      "鏁呴殰淇″彿",
+    ]);
+
+    // 瀹氭椂杞鏍稿績閰嶇疆
+    let pollingTimer = null;
+    const pollingInterval = 5000;
+    let checkDebounceTimer = null;
+    let destroyDelayTimer = null;
+    const destroyDelayTime = 500; // 鉁� 鏍稿績锛氬~鍏�+娓呯┖ 閮藉欢杩�500姣
+    let boardCodeDebounceTimer = null;
+    // 鉁� 鏂板锛氳嚜鍔ㄦ彁浜ら槻鎶栧畾鏃跺櫒锛岄槻姝㈤噸澶嶆彁浜�
+    let autoSubmitDebounceTimer = null;
+    // 鉁� 鏂板锛氭彁浜ら攣锛岄槻姝㈡棤鍕鹃�夋椂閲嶅瑙﹀彂鎻愪氦
+    let submitLock = ref(false);
+
+    // 鉁� 鉁� 鉁� 鏍稿績鏂板1锛氳绠楀睘鎬� - 瀹炴椂缁熻宸︿晶鍕鹃�夌殑澶嶉�夋鏁伴噺 (鑷姩鏇存柊)
+    const checkedCount = computed(() => {
+      // 缁熻leftPartChecked鏁扮粍涓负true鐨勬暟閲�
+      return leftPartChecked.value.filter((checked) => checked === true).length;
+    });
+
+    // 鉁� 鉁� 鉁� 鏍稿績鏂板2锛氳绠楀睘鎬� - 瀹炴椂缁熻鍙充晶宸插~鍏呯殑闆朵欢鏁伴噺 (鑷姩鏇存柊)
+    const filledPartCount = computed(() => {
+      // 缁熻rightPartCodes鏁扮粍涓湁鍊�(闈炵┖)鐨勯浂浠舵暟閲�
+      return rightPartCodes.value.filter((code) => code.trim() !== "").length;
+    });
+
+    // 鉁� 鑾峰彇宸︿晶鍒濆鏁版嵁 - 瀵规帴 /api/scanStation/GetLeftInitialData
+    const fetchLeftInitialData = async () => {
+      try {
+        console.log("姝e湪鑾峰彇宸︿晶鍒濆鏁版嵁锛堟垚鍝佺紪鍙�+闆朵欢缂栧彿+鍕鹃�夌姸鎬�+闆朵欢ID锛�...");
+        const response = await axios.get("/api/scanStation/GetLeftInitialData", {
+          timeout: 5000,
+        });
+        const resData = response.data;
+        const isSuccess = resData.Status === true || resData.status === true;
+        if (isSuccess) {
+          const data = resData.Data || resData.data || {};
+          if (data.finishedProductId) finishedProductId.value = data.finishedProductId;
+          if (data.finishedProduct) finishedProduct.value = data.finishedProduct;
+          // 璧嬪�煎乏渚ч浂浠剁紪鍙�
+          if (Array.isArray(data.leftPartCodes) && data.leftPartCodes.length >= 10) {
+            for (let i = 0; i < 10; i++) {
+              leftPartCodes.value[i] = data.leftPartCodes[i] || "";
+              leftPartIds.value[i] = data.leftPartIds?.[i] || "";
+            }
+          }
+          // 璧嬪�煎嬀閫夌姸鎬�
+          if (Array.isArray(data.leftPartChecked) && data.leftPartChecked.length >= 10) {
+            for (let i = 0; i < 10; i++) {
+              leftPartChecked.value[i] = !!data.leftPartChecked[i];
+            }
+          }
+        }
+      } catch (error) {
+        console.error("鑾峰彇宸︿晶鍒濆鏁版嵁澶辫触锛�", error);
+      }
+    };
+
+    // 鉁� 鑾峰彇淇″彿+PLC鐘舵��
+    const fetchSignalAndPLCStates = async () => {
+      try {
+        const response = await axios.get("/api/scanStation/GetSignalStates", {
+          timeout: 5000,
+        });
+        const resData = response.data;
+        const isSuccess = resData.Status === true || resData.status === true;
+        if (isSuccess) {
+          const data = resData.Data || resData.data || {};
+          const newSignalStates = data.signalStates || [];
+          for (let i = 0; i < 5; i++) signalStates.value[i] = newSignalStates[i] ?? false;
+          const plcStatus = data.plcStatus || data.plc_status || {};
+          isPLCStarted.value = plcStatus.isStarted ?? isPLCStarted.value;
+          // 鉁� 淇BUG锛氬師浠g爜鏄� isPLCStarted.value 瀵艰嚧鏆傚仠鐘舵�佽祴鍊奸敊璇�
+          isPLCPaused.value = plcStatus.isPaused ?? isPLCPaused.value;
+        }
+      } catch (error) {
+        console.error("鑾峰彇淇″彿鍜孭LC鐘舵�佸け璐ワ細", error);
+      }
+    };
+
+    // 鉁� 銆愭牳蹇冧慨鏀广�戝伐瑁呮澘鏌ヨ鎺ュ彛 - 鏈夋暟鎹氨濉厖锛屾棤鏁版嵁/澶辫触 瀹屽叏淇濈暀鍘熸湁鍐呭锛屼笉鍋氫换浣曟竻绌烘搷浣�
+    const fetchProductAndPartsByBoardCode = async (boardCode) => {
+      if (!boardCode.trim()) return;
+      try {
+        console.log(`宸ヨ鏉跨紪鍙峰彉鏇达紝璇锋眰鏁版嵁锛�${boardCode}`);
+        const response = await axios.get(
+          "/api/boxingDetail/GetProductAndPartsByBoardNo",
+          {
+            params: { palletCode: boardCode.trim() },
+            timeout: 5000,
+          }
+        );
+        const resData = response.data;
+        const isSuccess = resData.Status === true || resData.status === true;
+        // 鉁� 鍙湁銆愭帴鍙f垚鍔�+鏈夎繑鍥炴暟鎹�戠殑鏃跺�欙紝鎵嶆墽琛岃祴鍊艰鐩�
+        if (isSuccess) {
+          const data = resData.Data || resData.data || {};
+          // 鏈夋垚鍝佺紪鍙峰氨璧嬪�硷紝娌℃湁灏变笉鎿嶄綔
+          if (data.finishedProductCode) {
+            finishedProductCode.value = data.finishedProductCode;
+          }
+          // 鏈夐浂浠跺垪琛ㄥ氨濉厖锛屾病鏈夊氨涓嶆搷浣�
+          const partsList = Array.isArray(data.partsList) ? data.partsList : [];
+          if (partsList.length > 0) {
+            for (let i = 0; i < 10; i++) {
+              if (partsList[i]) {
+                rightPartCodes.value[i] = partsList[i];
+              }
+            }
+          }
+          console.log("鉁� 宸ヨ鏉挎煡璇㈡垚鍔燂紝鎴愬搧缂栧彿+闆朵欢缂栧彿濉厖瀹屾垚");
+        } else {
+          // 鉁� 鏃犲搴旀暟鎹細鍙脊鎻愮ず锛屼笉娓呯┖浠讳綍鍐呭
+          alert(
+            "鑾峰彇鏁版嵁澶辫触锛�" + (resData.Message || resData.message || "鏃犲搴斿伐瑁呮澘鏁版嵁")
+          );
+        }
+      } catch (error) {
+        // 鉁� 璇锋眰澶辫触锛氬彧寮规彁绀猴紝涓嶆竻绌轰换浣曞唴瀹�
+        alert("宸ヨ鏉挎暟鎹姹傚け璐ワ紝璇锋鏌ョ綉缁滄垨鎺ュ彛锛�");
+        console.error("宸ヨ鏉挎帴鍙h姹傚け璐ワ細", error);
+      } finally {
+        boardCodeDebounceTimer = null;
+      }
+    };
+
+    // 鍚姩/鍋滄瀹氭椂杞
+    const startPolling = () => {
+      if (pollingTimer) clearInterval(pollingTimer);
+      fetchSignalAndPLCStates();
+      pollingTimer = setInterval(fetchSignalAndPLCStates, pollingInterval);
+    };
+    const stopPolling = () => {
+      if (pollingTimer) clearInterval(pollingTimer);
+      pollingTimer = null;
+    };
+
+    // PLC鍚姩/鍏抽棴閫昏緫
+    const handleToggle = async () => {
+      try {
+        const response = await axios.get("/api/scanStation/StartPLC", {
+          params: { isStop: isPLCStarted.value },
+          timeout: 5000,
+        });
+        const resData = response.data;
+        const isSuccess = resData.Status === true || resData.status === true;
+        if (isSuccess) {
+          isPLCStarted.value = !isPLCStarted.value;
+          isPLCPaused.value = false;
+          fetchSignalAndPLCStates();
+        } else {
+          alert(
+            resData.Message ||
+              resData.message ||
+              (isPLCStarted.value ? "鍏抽棴澶辫触" : "鍚姩澶辫触")
+          );
+        }
+      } catch (error) {
+        alert(isPLCStarted.value ? "鍏抽棴PLC澶辫触" : "鍚姩PLC澶辫触");
+        console.error("PLC鍚仠澶辫触锛�", error);
+      }
+    };
+
+    // PLC鏆傚仠/鎭㈠閫昏緫
+    const handlePauseToggle = async () => {
+      try {
+        const response = await axios.get("/api/scanStation/PausePLC", {
+          params: { isPause: !isPLCPaused.value },
+          timeout: 5000,
+        });
+        const resData = response.data;
+        const isSuccess = resData.Status === true || resData.status === true;
+        if (isSuccess) {
+          isPLCPaused.value = !isPLCPaused.value;
+          fetchSignalAndPLCStates();
+        } else {
+          alert(
+            resData.Message ||
+              resData.message ||
+              (isPLCPaused.value ? "鎭㈠澶辫触" : "鏆傚仠澶辫触")
+          );
+        }
+      } catch (error) {
+        alert(isPLCPaused.value ? "鎭㈠PLC澶辫触" : "鏆傚仠PLC澶辫触");
+        console.error("PLC鏆傚仠鎭㈠澶辫触锛�", error);
+      }
+    };
+
+    // 闆朵欢鍕鹃�夌姸鎬佸彉鏇村鐞�
+    const handlePartCheck = async (index) => {
+      const isChecked = leftPartChecked.value[index];
+      const partCode = leftPartCodes.value[index];
+      const partId = leftPartIds.value[index];
+
+      if (!finishedProductId.value) {
+        alert("鎴愬搧ID涓嶅瓨鍦紝鏃犳硶鏇存柊闆朵欢鎵爜鐘舵�侊紒");
+        leftPartChecked.value[index] = !isChecked;
+        return;
+      }
+      if (!partId) {
+        alert(`闆朵欢${index + 1}鏁版嵁搴揑D涓嶅瓨鍦紝鏃犳硶鏇存柊鎵爜鐘舵�侊紒`);
+        leftPartChecked.value[index] = !isChecked;
+        return;
+      }
+      if (!partCode.trim()) {
+        alert(`闆朵欢${index + 1}缂栧彿涓虹┖锛屾棤娉曟洿鏂版壂鐮佺姸鎬侊紒`);
+        leftPartChecked.value[index] = !isChecked;
+        return;
+      }
+
+      if (checkDebounceTimer) clearTimeout(checkDebounceTimer);
+      checkDebounceTimer = setTimeout(async () => {
+        try {
+          const response = await axios.post(
+            "/api/scanStation/UpdatePartScannedStatus",
+            { Id: partId, IsScanned: isChecked ? 1 : 0 },
+            { timeout: 5000 }
+          );
+          const resData = response.data;
+          const isSuccess = resData.Status === true || resData.status === true;
+          if (isSuccess) {
+            console.log(`闆朵欢${index + 1}鎵爜鐘舵�佹洿鏂版垚鍔焋);
+            // 鉁� 鍕鹃�夌姸鎬佸彉鍖栨椂锛岄噸缃彁浜ら攣
+            submitLock.value = false;
+          } else {
+            leftPartChecked.value[index] = !isChecked;
+            alert(
+              `闆朵欢${index + 1}鐘舵�佹洿鏂板け璐ワ細${
+                resData.Message || resData.message || "鏈煡閿欒"
+              }`
+            );
+          }
+        } catch (error) {
+          leftPartChecked.value[index] = !isChecked;
+          alert(`闆朵欢${index + 1}鐘舵�佹洿鏂拌姹傚け璐ワ紝璇锋鏌ョ綉缁滄垨鎺ュ彛锛乣);
+          console.error(`鏇存柊闆朵欢${index + 1}鎵爜鐘舵�佸け璐ワ細`, error);
+        } finally {
+          checkDebounceTimer = null;
+        }
+      }, 500);
+    };
+
+    // 鉁� 鏍稿績淇敼锛氬欢杩�0.5绉掑~鍏� + 寤惰繜0.5绉掓竻绌� 鍚屾鎵ц 鏃犻渶鎵嬪姩鎸夐挳
+    const fillContent = () => {
+      if (!rightTopInput.value.trim()) return;
+      const inputValue = rightTopInput.value.trim();
+
+      // 娓呴櫎鏃у畾鏃跺櫒锛岄槻姝㈤噸澶嶆墽琛�
+      if (destroyDelayTimer) clearTimeout(destroyDelayTimer);
+      // 缁熶竴寤惰繜500ms鎵ц銆愬~鍏�+娓呯┖銆�
+      destroyDelayTimer = setTimeout(() => {
+        if (!toolingBoardNo.value.trim()) {
+          toolingBoardNo.value = inputValue;
+        } else if (!finishedProductCode.value.trim()) {
+          finishedProductCode.value = inputValue;
+        } else if (fillIndex.value < 10) {
+          rightPartCodes.value[fillIndex.value] = inputValue;
+          fillIndex.value++;
+        } else {
+          alert("宸ヨ鏉跨紪鍙枫�佹垚鍝佺紪鍙峰拰闆朵欢1-10宸插叏閮ㄥ~鍏呭畬鎴�,鏃犳硶缁х画褰曞叆!");
+          rightTopInput.value = "";
+          destroyDelayTimer = null;
+          return;
+        }
+        // 濉厖瀹屾垚鍚� 鑷姩娓呯┖褰曞叆妗�
+        rightTopInput.value = "";
+        destroyDelayTimer = null;
+      }, destroyDelayTime);
+    };
+
+    // 鉁� 鐩戝惉褰曞叆妗嗗唴瀹瑰彉鍖栬嚜鍔ㄨЕ鍙戝~鍏呴�昏緫
+    watch(
+      rightTopInput,
+      (newVal) => {
+        if (newVal.trim()) fillContent();
+      },
+      { immediate: false }
+    );
+
+    // 鐩戝惉宸ヨ鏉跨紪鍙峰彉鍖栨煡璇㈡暟鎹�
+    watch(
+      toolingBoardNo,
+      (newVal) => {
+        const boardCode = newVal.trim();
+        if (boardCode) {
+          if (boardCodeDebounceTimer) clearTimeout(boardCodeDebounceTimer);
+          boardCodeDebounceTimer = setTimeout(
+            () => fetchProductAndPartsByBoardCode(boardCode),
+            300
+          );
+        } else {
+          if (boardCodeDebounceTimer) clearTimeout(boardCodeDebounceTimer);
+        }
+      },
+      { immediate: false }
+    );
+
+    // 鍙充晶椤甸潰鎿嶄綔鏂规硶 (宸插垹闄ゆ竻绌�/淇濆瓨褰曞叆妗嗙殑鏂规硶锛屾棤鍐椾綑)
+    const clearToolingBoardNo = () => (toolingBoardNo.value = "");
+    const clearRightPart = (index) => (rightPartCodes.value[index] = "");
+    const clearFinishedProductCode = () => (finishedProductCode.value = "");
+
+    // 鎻愪氦宸ヨ鏉挎暟鎹埌鍚庣
+    const saveToolingBoardNo = async () => {
+      if (!toolingBoardNo.value.trim()) {
+        alert("宸ヨ鏉跨紪鍙蜂笉鑳戒负绌猴紝璇疯緭鍏ュ悗鍐嶆彁浜わ紒");
+        return;
+      }
+      if (!finishedProductCode.value.trim()) {
+        alert("鎴愬搧缂栧彿涓嶈兘涓虹┖锛岃杈撳叆鍚庡啀鎻愪氦锛�");
+        return;
+      }
+      try {
+        const submitData = {
+          toolingBoardNo: toolingBoardNo.value.trim(),
+          finishedProductCode: finishedProductCode.value.trim(),
+          partsList: rightPartCodes.value.map((item) => item.trim()),
+        };
+        console.log("鉁� 鎻愪氦宸ヨ鏉挎暟鎹細", submitData);
+        const response = await axios.post(
+          "/api/boxingDetail/SaveToolingBoardNo",
+          submitData,
+          { timeout: 5000 }
+        );
+        const resData = response.data;
+        const isSuccess = resData.Status === true || resData.status === true;
+        if (isSuccess) {
+          alert("鉁� 鎻愪氦鎴愬姛锛�");
+          toolingBoardNo.value = "";
+          finishedProductCode.value = "";
+          rightPartCodes.value = Array(10).fill("");
+          rightTopInput.value = "";
+          fillIndex.value = -1;
+          // 鉁� 鎻愪氦鎴愬姛鍚庯紝閲嶇疆鎻愪氦閿�
+          submitLock.value = false;
+        } else {
+          alert("鎻愪氦澶辫触锛�" + (resData.Message || resData.message || "鏈煡閿欒"));
+        }
+      } catch (error) {
+        alert("鎻愪氦璇锋眰澶辫触锛岃妫�鏌ョ綉缁滄垨鎺ュ彛锛�");
+        console.error("鎻愪氦鎺ュ彛澶辫触锛�", error);
+        // 鉁� 璇锋眰澶辫触涔熼噸缃攣
+        submitLock.value = false;
+      }
+    };
+
+    // 鉁� 鉁� 鉁� 鏍稿績鍗囩骇锛氳嚜鍔ㄦ彁浜ゅ垽鏂�昏緫 - 鏂板鏃犲嬀閫夋椂鎴愬搧缂栧彿濉厖鍗虫彁浜�
+    const checkAutoSubmit = () => {
+      // 闃叉姈锛氶槻姝㈢煭鏃堕棿鍐呭娆¤Е鍙戞彁浜�
+      if (autoSubmitDebounceTimer) clearTimeout(autoSubmitDebounceTimer);
+      autoSubmitDebounceTimer = setTimeout(() => {
+        const needCheckNum = checkedCount.value; // 宸︿晶鍕鹃�夌殑鏁伴噺
+        const filledNum = filledPartCount.value; // 鍙充晶濉厖鐨勯浂浠舵暟閲�
+        const hasBoardNo = toolingBoardNo.value.trim() !== ""; // 宸ヨ鏉挎湁鍊�
+        const hasProductCode = finishedProductCode.value.trim() !== ""; // 鎴愬搧鏈夊��
+
+        console.log(`鉁� 鑷姩鎻愪氦鏍¢獙锛氬乏渚у嬀閫�${needCheckNum}涓紝鍙充晶濉厖${filledNum}涓猔);
+
+        // 鍒嗘敮1锛氬乏渚ф湁鍕鹃�� 鈫� 鍘熸湁閫昏緫锛氶浂浠跺~鍏呮暟鈮ュ嬀閫夋暟 鎵嶆彁浜�
+        if (needCheckNum > 0) {
+          if (hasBoardNo && hasProductCode && filledNum >= needCheckNum) {
+            console.log("鉁� 婊¤冻鍕鹃�夋暟閲忔潯浠讹紝鎵ц鑷姩鎻愪氦锛�");
+            saveToolingBoardNo();
+          }
+        }
+        // 鍒嗘敮2锛氬乏渚ф棤鍕鹃�� 鈫� 鏂板閫昏緫锛氬伐瑁呮澘+鎴愬搧閮芥湁鍊� 灏辨彁浜� (鍔犻攣闃查噸澶�)
+        else {
+          if (hasBoardNo && hasProductCode && !submitLock.value) {
+            console.log("鉁� 宸︿晶鏃犲嬀閫夛紝鎴愬搧缂栧彿濉厖瀹屾垚锛屾墽琛岃嚜鍔ㄦ彁浜わ紒");
+            submitLock.value = true; // 鍔犻攣闃叉閲嶅鎻愪氦
+            saveToolingBoardNo();
+          }
+        }
+        autoSubmitDebounceTimer = null;
+      }, 300);
+    };
+
+    // 鉁� 鉁� 鉁� 鏍稿績鏂板4锛氱洃鍚叧閿暟鎹彉鍖栵紝瑙﹀彂鑷姩鎻愪氦鏍¢獙
+    watch(
+      [checkedCount, filledPartCount, toolingBoardNo, finishedProductCode],
+      () => {
+        checkAutoSubmit();
+      },
+      { deep: true, immediate: false }
+    );
+
+    // 鑷姩妫�娴嬪~鍏呯储寮曢�昏緫
+    const detectFillIndex = () => {
+      if (!toolingBoardNo.value.trim() || !finishedProductCode.value.trim()) {
+        fillIndex.value = -1;
+        return;
+      }
+      for (let i = 0; i < 10; i++) {
+        if (!rightPartCodes.value[i].trim()) {
+          fillIndex.value = i;
+          return;
+        }
+      }
+      fillIndex.value = 10;
+    };
+
+    watch(
+      [toolingBoardNo, finishedProductCode, () => [...rightPartCodes.value]],
+      detectFillIndex,
+      {
+        immediate: true,
+        deep: true,
+      }
+    );
+
+    // 椤甸潰鎸傝浇/鍗歌浇鐢熷懡鍛ㄦ湡
+    onMounted(async () => {
+      await fetchLeftInitialData();
+      startPolling();
+      detectFillIndex();
+    });
+
+    onUnmounted(() => {
+      stopPolling();
+      if (checkDebounceTimer) clearTimeout(checkDebounceTimer);
+      if (destroyDelayTimer) clearTimeout(destroyDelayTimer);
+      if (boardCodeDebounceTimer) clearTimeout(boardCodeDebounceTimer);
+      if (autoSubmitDebounceTimer) clearTimeout(autoSubmitDebounceTimer);
+    });
+
+    return {
+      finishedProduct,
+      finishedProductId,
+      rightTopInput,
+      leftPartCodes,
+      rightPartCodes,
+      leftPartChecked,
+      leftPartIds,
+      toolingBoardNo,
+      isPLCStarted,
+      isPLCPaused,
+      signalStates,
+      signalLabels,
+      finishedProductCode,
+      handleToggle,
+      handlePauseToggle,
+      handlePartCheck,
+      clearToolingBoardNo,
+      saveToolingBoardNo,
+      clearRightPart,
+      clearFinishedProductCode,
+    };
+  },
+};
 </script>
 
 <style scoped>
-.title {
-  line-height: 70vh;
-  text-align: center;
-  font-size: 28px;
-  color: orange;
+/* 鍩虹鏍峰紡閲嶇疆涓庡叏灞�鏍峰紡 */
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  font-family: "Microsoft Yahei", "PingFang SC", "Inter", sans-serif;
+  scrollbar-width: none;
+  -ms-overflow-style: none;
 }
-</style>
\ No newline at end of file
+*::-webkit-scrollbar {
+  display: none;
+}
+
+body {
+  background: linear-gradient(135deg, #f0f4f8 0%, #e9ecef 100%);
+  min-height: 100vh;
+  overflow: hidden;
+  font-size: 14px;
+}
+
+/* 瀹瑰櫒鏍峰紡 - 鏀惧ぇ 闂磋窛鍔犲 */
+.container {
+  display: flex;
+  width: 100%;
+  height: 100vh;
+  margin: 0;
+  gap: 15px;
+  padding: 15px;
+  overflow: hidden;
+}
+
+/* 闈㈡澘閫氱敤鏍峰紡 - 缁熶竴鍐呰竟璺� 纭繚宸﹀彸瀵归綈 */
+.left-area,
+.right-area {
+  flex: 1;
+  width: 50%;
+  display: flex;
+  flex-direction: column;
+  gap: 15px;
+  padding: 18px;
+  background: #ffffff;
+  border: 1px solid #e2e8f0;
+  border-radius: 15px;
+  box-shadow: 0 6px 16px rgba(149, 157, 165, 0.15);
+  transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
+}
+
+/* 鎸夐挳+淇″彿 妯悜鎺掑垪瀹瑰櫒 - 鏍稿績甯冨眬 */
+.btn-signal-group {
+  display: flex;
+  align-items: center;
+  gap: 20px;
+  width: 100%;
+}
+.btn-group {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  flex-shrink: 0;
+}
+.signal-status {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  gap: 18px;
+  flex-shrink: 0;
+  padding: 0;
+}
+
+.left-top {
+  background: #f8fafc;
+  padding: 15px;
+  border-radius: 12px;
+  flex-shrink: 0;
+  width: 100%;
+}
+
+.left-bottom,
+.right-bottom {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+  flex: 1;
+  overflow: hidden !important;
+}
+
+.right-top {
+  padding: 15px;
+  background: #f8fafc;
+  border-radius: 12px;
+  flex-shrink: 0;
+}
+
+/* 琛ㄥ崟琛屾牱寮� - 缁熶竴楂樺害鍜岄棿璺� 纭繚宸﹀彸瀵归綈 */
+.form-row {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  flex-wrap: nowrap;
+  padding: 6px 10px;
+  border-radius: 8px;
+  transition: all 0.2s ease;
+  height: 48px;
+  line-height: 48px;
+  flex-shrink: 0;
+  width: 100%;
+}
+
+.form-row:hover {
+  background: #f8fafc;
+}
+
+.finished-product-row {
+  background: #eff6ff;
+  border-left: 4px solid #3b82f6;
+}
+
+.tooling-board-row {
+  background: #f0fdf4;
+  border-left: 4px solid #22c55e;
+}
+
+.part-item {
+  border-bottom: 1px solid #f1f5f9;
+  margin-bottom: 3px;
+}
+
+.part-item:last-child {
+  border-bottom: none;
+}
+
+/* 鏍囩鏍峰紡 - 缁熶竴瀹藉害 纭繚宸﹀彸瀵归綈 */
+.label {
+  width: 90px;
+  text-align: right;
+  color: #334155;
+  font-size: 15px;
+  font-weight: 600;
+  flex-shrink: 0;
+}
+
+.short-label {
+  width: 110px;
+  text-align: right;
+  color: #334155;
+  font-size: 15px;
+  font-weight: 600;
+  flex-shrink: 0;
+}
+
+/* 杈撳叆妗嗘牱寮� - 缁熶竴灏哄 纭繚宸﹀彸瀵归綈 */
+.input-box {
+  flex: 1;
+  min-width: 100px;
+  height: 42px;
+  padding: 0 15px;
+  border: 1px solid #e2e8f0;
+  border-radius: 8px;
+  outline: none;
+  font-size: 15px;
+  transition: all 0.2s ease;
+  background-color: #ffffff;
+}
+
+.short-input {
+  width: 150px !important;
+  flex: none !important;
+}
+
+.input-box:focus {
+  border-color: #3b82f6;
+  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12);
+}
+
+.input-box:disabled {
+  background-color: #f1f5f9;
+  color: #64748b;
+  cursor: not-allowed;
+}
+
+.input-box::placeholder {
+  color: #94a3b8;
+  font-size: 14px;
+}
+
+/* 鎸夐挳鏍峰紡 - 鍥哄畾瀹藉害 涓嶅彉 */
+.btn {
+  width: 120px;
+  height: 42px;
+  padding: 0 16px;
+  border: none;
+  border-radius: 8px;
+  cursor: pointer;
+  font-size: 14px;
+  font-weight: 600;
+  transition: all 0.2s ease;
+  flex-shrink: 0;
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  gap: 8px;
+  position: relative;
+  overflow: hidden;
+}
+
+.btn:disabled {
+  opacity: 0.6;
+  cursor: not-allowed;
+  transform: none !important;
+  box-shadow: none !important;
+}
+
+.btn::after {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: -100%;
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
+  transition: all 0.5s ease;
+}
+
+.btn:hover::after {
+  left: 100%;
+}
+
+/* 鍥炬爣鏍峰紡 - 鍥炬爣鏀惧ぇ */
+.icon {
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  background-size: contain;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+
+.icon-start {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M8 5v14l11-7z'/%3E%3C/svg%3E");
+}
+
+.icon-stop {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M6 6h12v12H6z'/%3E%3C/svg%3E");
+}
+
+.icon-pause {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M6 19h4V5H6v14zm8-14v14h4V5h-4z'/%3E%3C/svg%3E");
+}
+
+.icon-resume {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M11 5L6 9H2v6h4l5 4V5zm7 0v14c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2z'/%3E%3C/svg%3E");
+}
+
+.icon-clear {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z'/%3E%3C/svg%3E");
+}
+
+.icon-submit {
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M2.01 21L15 13.4 23 21V5H2.01V21zM17 15l-5-5-5 5V7h10v8z'/%3E%3C/svg%3E");
+}
+
+/* 鎸夐挳绫诲瀷鏍峰紡 - 涓嶅彉 */
+.start-btn {
+  background: linear-gradient(135deg, #10b981 0%, #059669 100%);
+  color: #fff;
+}
+.start-btn:hover:not(:disabled) {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 8px rgba(16, 185, 129, 0.2);
+}
+
+.stop-btn {
+  background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
+  color: #fff;
+}
+.stop-btn:hover:not(:disabled) {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 8px rgba(239, 68, 68, 0.2);
+}
+
+.pause-btn {
+  background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
+  color: #fff;
+}
+.pause-btn:hover:not(:disabled) {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 8px rgba(245, 158, 11, 0.2);
+}
+
+.resume-btn {
+  background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
+  color: #fff;
+}
+.resume-btn:hover:not(:disabled) {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 8px rgba(139, 92, 246, 0.2);
+}
+
+.clear-btn {
+  background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
+  color: #fff;
+  padding: 0 12px;
+}
+.clear-btn:hover:not(:disabled) {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 8px rgba(239, 68, 68, 0.15);
+}
+
+.save-btn {
+  background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
+  color: #fff;
+  padding: 0 12px;
+}
+.save-btn:hover:not(:disabled) {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 8px rgba(59, 130, 246, 0.15);
+}
+
+/* 淇″彿鐏牱寮� 閱掔洰鏀惧ぇ */
+.signal-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 5px;
+  min-width: 60px;
+}
+.signal-label {
+  font-size: 14px;
+  color: #334155;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100%;
+  text-align: center;
+  font-weight: 600;
+}
+.signal-light {
+  width: 32px;
+  height: 32px;
+  border-radius: 50%;
+  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15);
+  transition: all 0.3s ease;
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.signal-light-inner {
+  width: 14px;
+  height: 14px;
+  border-radius: 50%;
+  background: white;
+  opacity: 0.9;
+  transition: all 0.3s ease;
+}
+.signal-active {
+  background: linear-gradient(135deg, #10b981 0%, #059669 100%);
+  box-shadow: 0 0 18px rgba(16, 185, 129, 0.7);
+  animation: pulse 2s infinite;
+}
+.signal-inactive {
+  background: linear-gradient(135deg, #94a3b8 0%, #64748b 100%);
+}
+@keyframes pulse {
+  0% {
+    box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.8);
+  }
+  70% {
+    box-shadow: 0 0 0 15px rgba(16, 185, 129, 0);
+  }
+  100% {
+    box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
+  }
+}
+
+/* 鑷畾涔夊閫夋鏍峰紡 - 鏀惧ぇ 鐐瑰嚮鍖哄煙鏇村ぇ */
+.checkbox-container {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  cursor: pointer;
+  font-size: 14px;
+  color: #334155;
+  flex-shrink: 0;
+}
+.part-checkbox {
+  display: none;
+}
+.checkmark {
+  width: 22px;
+  height: 22px;
+  background-color: #f1f5f9;
+  border: 1px solid #cbd5e1;
+  border-radius: 4px;
+  transition: all 0.2s ease;
+  position: relative;
+}
+.part-checkbox:checked ~ .checkmark {
+  background-color: #3b82f6;
+  border-color: #3b82f6;
+}
+.checkmark:after {
+  content: "";
+  position: absolute;
+  display: none;
+  left: 7px;
+  top: 2px;
+  width: 6px;
+  height: 12px;
+  border: solid white;
+  border-width: 0 3px 3px 0;
+  transform: rotate(45deg);
+}
+.part-checkbox:checked ~ .checkmark:after {
+  display: block;
+}
+.checkbox-label {
+  font-size: 13px;
+  color: #475569;
+  width: 50px;
+}
+
+/* 鍝嶅簲寮忛�傞厤 */
+@media (max-width: 1200px) {
+  .container {
+    flex-direction: column;
+    height: auto;
+  }
+  .left-area,
+  .right-area {
+    width: 100%;
+    flex: none;
+  }
+  .btn-signal-group {
+    flex-direction: column;
+    align-items: flex-start;
+  }
+  .signal-status {
+    width: 100%;
+    justify-content: flex-start;
+  }
+}
+
+@media (max-width: 768px) {
+  .form-row {
+    flex-direction: column;
+    align-items: flex-start;
+    height: auto;
+    line-height: normal;
+  }
+  .label,
+  .short-label {
+    width: 100%;
+    text-align: left;
+    margin-bottom: 6px;
+  }
+  .input-box {
+    width: 100%;
+  }
+  .short-input {
+    width: 100% !important;
+  }
+  .btn {
+    width: 100%;
+    margin-top: 6px;
+  }
+  .btn-group {
+    flex-direction: column;
+    gap: 10px;
+    width: 100%;
+  }
+}
+</style>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/boxing.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/boxing.vue"
index 8ba74f8..e648e50 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/boxing.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/boxing.vue"
@@ -24,13 +24,13 @@
       footer: "Foots",
       cnName: "缁勭洏淇℃伅",
       name: "boxing",
-      url: "/boxing/", 
-      sortName: "createDate", 
+      url: "/boxing/",
+      sortName: "createDate",
     });
 
     const editFormFields = ref({
       id: "",
-      palletCode: "", 
+      palletCode: "",
       productCode: "",
       productName: "",
     });
@@ -41,22 +41,23 @@
           field: "palletCode",
           type: "input",
           width: 200,
-          require: true
+          link: true,
+          require: true,
         },
         {
           title: "鎴愬搧缂栧彿",
           field: "productCode",
           type: "input",
           width: 200,
-          require: true
+          require: true,
         },
         {
           title: "鎴愬搧鍚嶇О",
           field: "productName",
           type: "input",
           width: 200,
-          require: true
-        }
+          require: true,
+        },
       ],
       [
         {
@@ -65,9 +66,9 @@
           type: "input",
           width: 100,
           hidden: true,
-          readonly: true
-        }
-      ]
+          readonly: true,
+        },
+      ],
     ]);
 
     const searchFormFields = ref({
@@ -105,6 +106,7 @@
         field: "palletCode",
         title: "宸ヨ鏉跨紪鍙�",
         type: "string",
+        link: true,
         width: 200,
         align: "left",
       },
@@ -161,11 +163,36 @@
     ]);
 
     const detail = ref({
-      cnName: "",
-      table: "",
-      columns: [],
-      sortName: "",
-      key: "",
+      cnName: "缁勭洏璇︾粏淇℃伅",
+      table: "boxingDetail",
+      columns: [
+        {
+          field: "boxingId",
+          title: "缁勭洏ID",
+          type: "int",
+          width: 90,
+          hidden: true,
+          readonly: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "componentCode",
+          title: "闆朵欢缂栧彿",
+          type: "string",
+          width: 200,
+          align: "left",
+        },
+        {
+          field: "componentName",
+          title: "闆朵欢鍚嶇О",
+          type: "string",
+          width: 200,
+          align: "left",
+        },
+      ],
+      sortName: "createDate",
+      key: "id",
     });
 
     return {
@@ -180,4 +207,4 @@
     };
   },
 });
-</script>
\ No newline at end of file
+</script>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formula.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formula.vue"
index 0967c15..99f5833 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formula.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formula.vue"
@@ -24,13 +24,13 @@
       footer: "Foots",
       cnName: "閰嶆柟淇℃伅",
       name: "formula",
-      url: "/formula/", 
-      sortName: "createDate", 
+      url: "/formula/",
+      sortName: "createDate",
     });
 
     const editFormFields = ref({
       id: "",
-      productCode: "", 
+      productCode: "",
       productName: "",
       productLength: 0,
       productWidth: 0,
@@ -44,8 +44,8 @@
       yDirectionHeight2: 0,
       xDirectionDistance3: 0,
       yDirectionHeight3: 0,
-});
-    
+    });
+
     const editFormOptions = ref([
       [
         {
@@ -53,106 +53,14 @@
           field: "productCode",
           type: "input",
           width: 200,
-          require: true
+          require: true,
         },
         {
           title: "鎴愬搧鍚嶇О",
           field: "productName",
           type: "input",
           width: 200,
-          require: true
-        },
-        {
-          title: "鍘嬭浣嶄骇鍝侀暱搴�",
-          field: "productLength",
-          type: "number",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "鍘嬭浣嶄骇鍝佸搴�",
-          field: "productWidth",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "鍘嬭浣嶄骇鍝侀珮搴�",
-          field: "productHeight",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "鍘嬭浣嶆嫥绱т笅闄嶉珮搴�",
-          field: "screwDownsetDistance",
-          type: "number",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "鍘嬭浣嶆嫥绱ф壄鍔�",
-          field: "screwTorqueOutput",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "鍘嬭浣嶈嚜鍔ㄦ嫥绱ф墦寮�",
-          field: "dintAutoScrewOn",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "妫�娴嬩綅X鍋忕Щ璺濈1",
-          field: "xDirectionDistance1",
-          type: "number",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "妫�娴嬩綅Z楂樺害1",
-          field: "yDirectionHeight1",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "妫�娴嬩綅X鍋忕Щ璺濈2",
-          field: "xDirectionDistance2",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "妫�娴嬩綅Z楂樺害2",
-          field: "yDirectionHeight2",
-          type: "number",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "妫�娴嬩綅X鍋忕Щ璺濈3",
-          field: "xDirectionDistance3",
-          type: "number",
-          width: 200,
-          require: false
-        },
-        {
-          title: "妫�娴嬩綅Z楂樺害3",
-          field: "yDirectionHeight3",
-          type: "number",
-          width: 200,
-          require: false
+          require: true,
         },
         {
           title: "涓婚敭ID",
@@ -160,9 +68,9 @@
           type: "input",
           width: 100,
           hidden: true,
-          readonly: true
-        }
-      ]
+          readonly: true,
+        },
+      ],
     ]);
 
     const searchFormFields = ref({
@@ -198,6 +106,7 @@
         field: "productCode",
         title: "鎴愬搧缂栧彿",
         type: "string",
+        link: true,
         width: 200,
         align: "left",
       },
@@ -205,90 +114,6 @@
         field: "productName",
         title: "鎴愬搧鍚嶇О",
         type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "productLength",
-        title: "鍘嬭浣嶄骇鍝侀暱搴�",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "productWidth",
-        title: "鍘嬭浣嶄骇鍝佸搴�",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "productHeight",
-        title: "鍘嬭浣嶄骇鍝侀珮搴�",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "screwDownsetDistance",
-        title: "鍘嬭浣嶆嫥绱т笅闄嶉珮搴�",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "screwTorqueOutput",
-        title: "鍘嬭浣嶆嫥绱ф壄鍔�",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "dintAutoScrewOn",
-        title: "鍘嬭浣嶈嚜鍔ㄦ嫥绱ф墦寮�",
-        type: "int",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "xDirectionDistance1",
-        title: "妫�娴嬩綅X鍋忕Щ璺濈1",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "yDirectionHeight1",
-        title: "妫�娴嬩綅Z楂樺害1",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "xDirectionDistance2",
-        title: "妫�娴嬩綅X鍋忕Щ璺濈2",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "yDirectionHeight2",
-        title: "妫�娴嬩綅Z楂樺害2",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "xDirectionDistance3",
-        title: "妫�娴嬩綅X鍋忕Щ璺濈3",
-        type: "float",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "yDirectionHeight3",
-        title: "妫�娴嬩綅Z楂樺害3",
-        type: "float",
         width: 200,
         align: "left",
       },
@@ -321,13 +146,50 @@
         align: "left",
       },
     ]);
-
     const detail = ref({
-      cnName: "",
-      table: "",
-      columns: [],
-      sortName: "",
-      key: "",
+      cnName: "闆朵欢璇︾粏淇℃伅",
+      table: "componentDetail",
+      columns: [
+        {
+          field: "formulaId",
+          title: "ID",
+          type: "int",
+          width: 90,
+          hidden: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "componentCode",
+          title: "闆朵欢缂栧彿",
+          type: "string",
+          width: 120,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "componentName",
+          title: "闆朵欢鍚嶇О",
+          type: "string",
+          width: 150,
+          require: true,
+          align: "left",
+        },
+        {
+          title: "鏄惁鎵爜",
+          field: "isScanned",
+          type: "select",
+          bind: {
+            key: "value",
+            data: [
+              { key: "0", value: "鍚�" },
+              { key: "1", value: "鏄�" },
+            ],
+          },
+        },
+      ],
+      sortName: "createDate",
+      key: "id",
     });
 
     return {
@@ -342,4 +204,4 @@
     };
   },
 });
-</script>
\ No newline at end of file
+</script>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formulaDetail.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formulaDetail.vue"
index 8f54220..fb57cfe 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formulaDetail.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/formulaDetail.vue"
@@ -24,17 +24,17 @@
       footer: "Foots",
       cnName: "閰嶆柟淇℃伅璇︽儏",
       name: "formulaDetail",
-      url: "/formulaDetail/", 
-      sortName: "createDate", 
+      url: "/formulaDetail/",
+      sortName: "createDate",
     });
 
     const editFormFields = ref({
       id: "",
-      formulaId: "", 
+      formulaId: "",
       componentCode: "",
       componentName: "",
     });
-    
+
     const editFormOptions = ref([
       [
         {
@@ -42,22 +42,31 @@
           field: "formulaId",
           type: "input",
           width: 200,
-          require: true
+          require: true,
         },
         {
           title: "闆朵欢缂栧彿",
           field: "componentCode",
           type: "input",
           width: 200,
-          require: true
+          require: true,
         },
         {
           title: "闆朵欢鍚嶇О",
           field: "componentName",
           type: "input",
           width: 200,
-          require: true
-        }
+          require: true,
+        },
+        {
+          title: "鏄惁鎵爜",
+          field: "isScanned",
+          type: "select",
+          data: [
+            { key: "0", value: "鍚�" },
+            { key: "1", value: "鏄�" },
+          ],
+        },
       ],
       [
         {
@@ -66,9 +75,9 @@
           type: "input",
           width: 100,
           hidden: true,
-          readonly: true
-        }
-      ]
+          readonly: true,
+        },
+      ],
     ]);
 
     const searchFormFields = ref({
@@ -84,6 +93,15 @@
         { title: "閰嶆柟淇℃伅涓婚敭", field: "formulaId", type: "int" },
         { title: "闆朵欢缂栧彿", field: "componentCode", type: "like" },
         { title: "闆朵欢鍚嶇О", field: "componentName", type: "like" },
+        {
+          title: "鏄惁鎵爜",
+          field: "isScanned",
+          type: "select",
+          data: [
+            { key: "0", value: "鍚�" },
+            { key: "1", value: "鏄�" },
+          ],
+        },
       ],
       [
         { title: "鍒涘缓浜�", field: "creater", type: "like" },
@@ -122,6 +140,18 @@
         type: "string",
         width: 200,
         align: "left",
+      },
+      {
+        title: "鏄惁鎵爜",
+        field: "isScanned",
+        type: "select",
+        bind: {
+          key: "value",
+          data: [
+            { key: "0", value: "鍚�" },
+            { key: "1", value: "鏄�" },
+          ],
+        },
       },
       {
         field: "creater",
@@ -173,4 +203,4 @@
     };
   },
 });
-</script>
\ No newline at end of file
+</script>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/processInfoDetail.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/processInfoDetail.vue"
new file mode 100644
index 0000000..5800e3f
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/processInfoDetail.vue"
@@ -0,0 +1,176 @@
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+
+<script>
+import extend from "@/extension/basicinfo/processInfoDetail.js";
+import { ref, defineComponent } from "vue";
+
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "鍔犲伐淇℃伅璇︽儏",
+      name: "processInfoDetail",
+      url: "/processInfoDetail/",
+      sortName: "createDate",
+    });
+
+    const editFormFields = ref({
+      id: "",
+      palletCode: "",
+      productCode: "",
+      productName: "",
+    });
+
+    const editFormOptions = ref([
+      [
+        {
+          title: "宸ヨ鏉跨紪鍙�",
+          field: "palletCode",
+          type: "input",
+          width: 200,
+          require: true,
+        },
+        {
+          title: "鎴愬搧缂栧彿",
+          field: "productCode",
+          type: "input",
+          width: 200,
+          require: true,
+        },
+        {
+          title: "鎴愬搧鍚嶇О",
+          field: "productName",
+          type: "input",
+          width: 200,
+          require: true,
+        },
+      ],
+      [
+        {
+          title: "涓婚敭ID",
+          field: "id",
+          type: "input",
+          width: 100,
+          hidden: true,
+          readonly: true,
+        },
+      ],
+    ]);
+
+    const searchFormFields = ref({
+      palletCode: "",
+      productCode: "",
+      productName: "",
+      creater: "",
+      createDate: "",
+    });
+
+    const searchFormOptions = ref([
+      [
+        { title: "宸ヨ鏉跨紪鍙�", field: "palletCode", type: "like" },
+        { title: "鎴愬搧缂栧彿", field: "productCode", type: "like" },
+        { title: "鎴愬搧鍚嶇О", field: "productName", type: "like" },
+      ],
+      [
+        { title: "鍒涘缓浜�", field: "creater", type: "like" },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+      ],
+    ]);
+
+    const columns = ref([
+      {
+        field: "id",
+        title: "搴忓彿",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "palletCode",
+        title: "宸ヨ鏉跨紪鍙�",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "productCode",
+        title: "鎴愬搧缂栧彿",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "productName",
+        title: "鎴愬搧鍚嶇О",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+    ]);
+
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/scanStation.vue" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/scanStation.vue"
index 4cab5db..d7aaa15 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/scanStation.vue"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Client/src/views/basicinfo/scanStation.vue"
@@ -15,37 +15,30 @@
 
 <script>
 import extend from "@/extension/basicinfo/scanStation.js";
-import { ref, defineComponent } from "vue";
+import { ref, defineComponent, onMounted } from "vue";
+import axios from "axios";
 
 export default defineComponent({
   setup() {
+    // 鍏ㄥ眬涓嬫媺鏁版嵁婧愬彉閲� - 鎵�鏈変笅鎷夋鍏辩敤锛屼竴澶勮祴鍊硷紝涓夊澶嶇敤
+    const stationEndProductList = ref([]);
+
     const table = ref({
       key: "id",
       footer: "Foots",
       cnName: "鎵弿宸ヤ綅",
       name: "scanStation",
-      url: "/scanStation/", 
-      sortName: "createDate", 
+      url: "/scanStation/",
+      sortName: "createDate",
     });
 
     const editFormFields = ref({
       id: "",
-      stationCode: "", 
+      stationCode: "",
       stationName: "",
       stationEndProduct: "",
-      stationComponentQty: "",
-      stationComponent1: "",
-      stationComponent2: "",
-      stationComponent3: "",
-      stationComponent4: "",
-      stationComponent5: "",
-      stationComponent6: "",
-      stationComponent7: "",
-      stationComponent8: "",
-      stationComponent9: "",
-      stationComponent10: "",
     });
-    
+
     const editFormOptions = ref([
       [
         {
@@ -53,116 +46,38 @@
           field: "stationCode",
           type: "input",
           width: 200,
-          require: true
+          require: true,
         },
+      ],
+      [
         {
           title: "绔欏彴鍚嶇О",
           field: "stationName",
           type: "input",
           width: 200,
-          require: true
+          require: true,
         },
+      ],
+      [
         {
           title: "绔欏彴鎴愬搧",
           field: "stationEndProduct",
-          type: "input",
+          type: "select",
+          data: stationEndProductList, // 缁戝畾鍏ㄥ眬鎺ュ彛鏁版嵁
           width: 200,
-          require: false
-        }
+          require: false,
+        },
       ],
       [
-        {
-          title: "闆朵欢鏁伴噺",
-          field: "stationComponentQty",
-          type: "input",
-          width: 200,
-          require: true
-        },
-        {
-          title: "闆朵欢1",
-          field: "stationComponent1",
-          type: "input",
-          width: 200,
-          require: false
-        },
-        {
-          title: "闆朵欢2",
-          field: "stationComponent2",
-          type: "input",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "闆朵欢3",
-          field: "stationComponent3",
-          type: "input",
-          width: 200,
-          require: false
-        },
-        {
-          title: "闆朵欢4",
-          field: "stationComponent4",
-          type: "input",
-          width: 200,
-          require: false
-        },
-        {
-          title: "闆朵欢5",
-          field: "stationComponent5",
-          type: "input",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "闆朵欢6",
-          field: "stationComponent6",
-          type: "input",
-          width: 200,
-          require: false
-        },
-        {
-          title: "闆朵欢7",
-          field: "stationComponent7",
-          type: "input",
-          width: 200,
-          require: false
-        },
-        {
-          title: "闆朵欢8",
-          field: "stationComponent8",
-          type: "input",
-          width: 200,
-          require: false
-        }
-      ],
-      [
-        {
-          title: "闆朵欢9",
-          field: "stationComponent9",
-          type: "input",
-          width: 200,
-          require: false
-        },
-        {
-          title: "闆朵欢10",
-          field: "stationComponent10",
-          type: "input",
-          width: 200,
-          require: false
-        },
         {
           title: "涓婚敭ID",
           field: "id",
           type: "input",
           width: 100,
           hidden: true,
-          readonly: true
-        }
-      ]
+          readonly: true,
+        },
+      ],
     ]);
 
     const searchFormFields = ref({
@@ -177,7 +92,12 @@
       [
         { title: "绔欏彴缂栧彿", field: "stationCode", type: "like" },
         { title: "绔欏彴鍚嶇О", field: "stationName", type: "like" },
-        { title: "绔欏彴鎴愬搧", field: "stationEndProduct", type: "like" },
+        {
+          title: "绔欏彴鎴愬搧",
+          field: "stationEndProduct",
+          type: "select-search",
+          data: stationEndProductList, // 缁戝畾鍏ㄥ眬鎺ュ彛鏁版嵁
+        },
       ],
       [
         { title: "鍒涘缓浜�", field: "creater", type: "like" },
@@ -213,84 +133,12 @@
       {
         field: "stationEndProduct",
         title: "绔欏彴鎴愬搧",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponentQty",
-        title: "闆朵欢鏁伴噺",
-        type: "int",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent1",
-        title: "闆朵欢1",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent2",
-        title: "闆朵欢2",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent3",
-        title: "闆朵欢3",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent4",
-        title: "闆朵欢4",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent5",
-        title: "闆朵欢5",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent6",
-        title: "闆朵欢6",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent7",
-        title: "闆朵欢7",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent8",
-        title: "闆朵欢8",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent9",
-        title: "闆朵欢9",
-        type: "string",
-        width: 200,
-        align: "left",
-      },
-      {
-        field: "stationComponent10",
-        title: "闆朵欢10",
-        type: "string",
+        type: "select",
+        bind: {
+          key: "value",
+          data: stationEndProductList, // 缁戝畾鍏ㄥ眬鎺ュ彛鏁版嵁
+        },
+        link: true,
         width: 200,
         align: "left",
       },
@@ -332,6 +180,22 @@
       key: "",
     });
 
+    const getStationEndProductData = async () => {
+      try {
+        const res = await axios.get("/api/formula/getEndProductList");
+        stationEndProductList.value = (res.data?.data || []).map(
+          (item) => item || { key: "", value: "", disabled: false }
+        );
+      } catch (error) {
+        stationEndProductList.value = [];
+        console.error("鑾峰彇绔欏彴鎴愬搧鏁版嵁澶辫触锛�", error);
+      }
+    };
+
+    onMounted(() => {
+      getStationEndProductData();
+    });
+
     return {
       table,
       extend,
@@ -344,4 +208,4 @@
     };
   },
 });
-</script>
\ No newline at end of file
+</script>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/CodeChunks.db" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/CodeChunks.db"
deleted file mode 100644
index b093a5e..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/CodeChunks.db"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db"
deleted file mode 100644
index bdd2782..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db-shm" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db-shm"
deleted file mode 100644
index 0cd0447..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db-shm"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db-wal" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db-wal"
deleted file mode 100644
index dba103d..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.12.53.23981/SemanticSymbols.db-wal"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db"
deleted file mode 100644
index 79d7454..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db-shm" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db-shm"
deleted file mode 100644
index 0fabd61..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db-shm"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db-wal" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db-wal"
deleted file mode 100644
index 085dc98..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/CodeChunks.db-wal"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db"
deleted file mode 100644
index 41cb1f9..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db-shm" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db-shm"
deleted file mode 100644
index e5be343..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db-shm"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db-wal" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db-wal"
deleted file mode 100644
index 59cb4ea..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.1518.61961/SemanticSymbols.db-wal"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/CodeChunks.db" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/CodeChunks.db"
index 767c364..5723a8c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/CodeChunks.db"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/CodeChunks.db"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/SemanticSymbols.db" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/SemanticSymbols.db"
index c948c81..6c09c44 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/SemanticSymbols.db"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/CopilotIndices/17.14.794.21998/SemanticSymbols.db"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2"
index 3c006dc..f1d839d 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/0f5d7584-9cfe-4074-aeb3-fa1f9e570949.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/0f5d7584-9cfe-4074-aeb3-fa1f9e570949.vsidx"
new file mode 100644
index 0000000..dda52cf
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/0f5d7584-9cfe-4074-aeb3-fa1f9e570949.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/37cbdcf3-408e-4196-9c7f-486ef5eef107.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/37cbdcf3-408e-4196-9c7f-486ef5eef107.vsidx"
new file mode 100644
index 0000000..7297cf9
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/37cbdcf3-408e-4196-9c7f-486ef5eef107.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5d2c31e8-d7a5-4453-ab25-eb41469b50b2.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5d2c31e8-d7a5-4453-ab25-eb41469b50b2.vsidx"
deleted file mode 100644
index d1733fe..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/5d2c31e8-d7a5-4453-ab25-eb41469b50b2.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6b8b6a38-d1b1-459e-b415-f709208d542a.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6b8b6a38-d1b1-459e-b415-f709208d542a.vsidx"
new file mode 100644
index 0000000..f2b9d44
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6b8b6a38-d1b1-459e-b415-f709208d542a.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6ed546f4-fadb-4993-bf10-0046de75bd74.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6ed546f4-fadb-4993-bf10-0046de75bd74.vsidx"
deleted file mode 100644
index 33f822d..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/6ed546f4-fadb-4993-bf10-0046de75bd74.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7765cc9c-7efa-493e-8c24-c5cc86a879de.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7765cc9c-7efa-493e-8c24-c5cc86a879de.vsidx"
deleted file mode 100644
index 66a87aa..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/7765cc9c-7efa-493e-8c24-c5cc86a879de.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8803666d-3cb0-4d8e-9882-52f506e51b7a.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8803666d-3cb0-4d8e-9882-52f506e51b7a.vsidx"
deleted file mode 100644
index 841c3e6..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8803666d-3cb0-4d8e-9882-52f506e51b7a.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/a92150fa-07f2-4b35-842d-8af5d93da741.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/a92150fa-07f2-4b35-842d-8af5d93da741.vsidx"
new file mode 100644
index 0000000..c2a4f87
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/a92150fa-07f2-4b35-842d-8af5d93da741.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c99954ff-673f-45d7-b93b-30e6c1adfe58.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c99954ff-673f-45d7-b93b-30e6c1adfe58.vsidx"
new file mode 100644
index 0000000..aab3472
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/c99954ff-673f-45d7-b93b-30e6c1adfe58.vsidx"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/db45f673-18a0-4069-a270-036150636661.vsidx" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/db45f673-18a0-4069-a270-036150636661.vsidx"
deleted file mode 100644
index 99eb04c..0000000
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/db45f673-18a0-4069-a270-036150636661.vsidx"
+++ /dev/null
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2"
index 19e5d1c..8167d69 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo"
index 164b339..085d885 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/BoxingDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/BoxingDetailService.cs"
index dd8c472..7db9778 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/BoxingDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/BoxingDetailService.cs"
@@ -1,22 +1,40 @@
 锘縰sing System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_BasicInfoService
 {
     public class BoxingDetailService : ServiceBase<Dt_BoxingDetail, IRepository<Dt_BoxingDetail>>, IBoxingDetailService
     {
-        public BoxingDetailService(IRepository<Dt_BoxingDetail> BaseDal) : base(BaseDal)
+
+        private readonly IBoxingService _boxingService;
+        private readonly IFormulaService _formulaService;
+        private readonly IFormulaDetailService _formulaDetailService;
+        private readonly IUnitOfWorkManage _unitOfWorkManage;
+
+        public BoxingDetailService(
+            IRepository<Dt_BoxingDetail> BaseDal,
+            IFormulaService formulaService,
+            IBoxingService boxingService,
+            IFormulaDetailService formulaDetailService,
+            IUnitOfWorkManage unitOfWorkManage
+            ) : base(BaseDal)
         {
+            _formulaService = formulaService;
+            _boxingService = boxingService;
+            _formulaDetailService = formulaDetailService;
+            _unitOfWorkManage = unitOfWorkManage;
         }
 
         public IRepository<Dt_BoxingDetail> Repository => BaseDal;
-
 
         /// <summary>
         /// 姣旇緝闆朵欢鏄惁榻愬叏
@@ -30,26 +48,249 @@
             {
                 return false;
             }
+            List<string> BoxingIdList = boxingDetails.Select(x => x.ComponentCode).ToList();
+            List<string> FormulaIdList = formulaDetails.Select(x => x.ComponentCode).ToList();
+            return !BoxingIdList.Except(FormulaIdList).Any() && !FormulaIdList.Except(BoxingIdList).Any();
+        }
 
-            List<string> BoxingIdList = new List<string>();
-            List<string> FormulaIdList = new List<string>();
 
-            for (int i = 0; i < boxingDetails.Count; i++)
+        /// <summary>
+        /// 妫�鏌ラ浂浠�
+        /// </summary>
+        /// <param name="boxingDetails"></param>
+        /// <param name="formulaDetails"></param>
+        /// <returns></returns>
+        public string IsComponentCodesEqual(List<string> boxingDetails, List<string> formulaDetails)
+        {
+            // 澶勭悊null闆嗗悎锛岃閬跨┖鎸囬拡寮傚父
+            var boxList = boxingDetails ?? new List<string>();
+            var formulaList = formulaDetails ?? new List<string>();
+
+            var validBoxCodes = boxList.Where(code => !string.IsNullOrEmpty(code)).ToList();
+            var validFormulaCodes = formulaList.Where(code => !string.IsNullOrEmpty(code)).ToList();
+
+            foreach (var group in validBoxCodes.GroupBy(code => code))
             {
-                BoxingIdList.Add(boxingDetails[i].ComponentCode);
-                FormulaIdList.Add(formulaDetails[i].ComponentCode);
-            }
-            BoxingIdList.Sort();
-            FormulaIdList.Sort();
+                string componentCode = group.Key;
+                int boxCount = group.Count();
+                int formulaCount = validFormulaCodes.Count(code => code == componentCode);
 
-            for (int i = 0; i < BoxingIdList.Count; i++)
-            {
-                if (BoxingIdList[i] != FormulaIdList[i])
+                if (formulaCount == 0 || formulaCount < boxCount)
                 {
-                    return false;
+                    return componentCode;
                 }
             }
-            return true;
+            return null;
+        }
+
+
+        /// <summary>
+        /// 娣诲姞/淇敼缁勭洏淇℃伅锛堜竴浣撳寲鎺ュ彛锛氫紶宸ヨ鏉跨紪鍙峰瓨鍦ㄥ垯淇敼锛屼笉瀛樺湪鍒欐柊澧烇級
+        /// </summary>
+        /// <param name="toolingBoardSubmitDto"></param>
+        /// <returns></returns>
+        public WebResponseContent SaveToolingBoardNo(ToolingBoardSubmitDto toolingBoardSubmitDto)
+        {
+            using (var uow = _unitOfWorkManage.CreateUnitOfWork())
+            {
+                try
+                {
+                    // 1. 鍙傛暟鏍¢獙
+                    if (toolingBoardSubmitDto == null)
+                    {
+                        return WebResponseContent.Instance.Error("鎻愪氦鍙傛暟涓嶈兘涓虹┖");
+                    }
+                    string palletCode = toolingBoardSubmitDto.ToolingBoardNo?.Trim();
+                    string productCode = toolingBoardSubmitDto.FinishedProductCode?.Trim();
+                    if (string.IsNullOrWhiteSpace(palletCode))
+                    {
+                        return WebResponseContent.Instance.Error("宸ヨ鏉跨紪鍙蜂笉鑳戒负绌�");
+                    }
+                    if (string.IsNullOrWhiteSpace(productCode))
+                    {
+                        return WebResponseContent.Instance.Error("鎴愬搧缂栫爜涓嶈兘涓虹┖");
+                    }
+
+                    // 2. 鏌ヨ鎴愬搧閰嶆柟淇℃伅
+                    Dt_Formula formulaModel = _formulaService.Repository.QueryFirst(x => x.ProductCode == productCode);
+                    if (formulaModel == null)
+                    {
+                        return WebResponseContent.Instance.Error("鏃犳垚鍝侀厤鏂癸紝璇锋牳瀵规垚鍝佺紪鐮�");
+                    }
+
+                    List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == formulaModel.Id && x.IsScanned == 1);
+                    List<string> Codelist = dt_FormulaDetails.Select(x => x.ComponentCode).ToList();
+                    string IsCode = IsComponentCodesEqual(toolingBoardSubmitDto.PartsList, Codelist);
+                    if (IsCode != null) 
+                    {
+                        return WebResponseContent.Instance.Error($"鐗╂枡銆恵IsCode}銆戦敊璇紝璇锋牳瀵圭墿鏂欑紪鍙�");
+                    }
+
+
+                    // 3. 鏍稿績鍒ゆ柇锛氭牴鎹伐瑁呮澘缂栧彿鏌ヨ鏄惁瀛樺湪銆愭柊澧�/淇敼銆戠殑涓昏〃鏁版嵁
+                    Dt_Boxing existBoxinModel = _boxingService.Repository.QueryFirst(x => x.PalletCode == palletCode);
+                    if (existBoxinModel == null)
+                    {
+                        #region 鏂板閫昏緫 - 鍘熼�昏緫浼樺寲鐗�
+                        Dt_Boxing dt_boxin = new Dt_Boxing()
+                        {
+                            PalletCode = palletCode,
+                            ProductCode = productCode,
+                            ProductName = formulaModel.ProductName.Trim(),
+                            Creater = "admin",
+                            CreateDate = DateTime.Now
+                        };
+                        int newBoxingId = _boxingService.Repository.AddData(dt_boxin);  
+
+
+                        // 鎵归噺娣诲姞鏄庣粏琛ㄦ暟鎹�
+                        if (toolingBoardSubmitDto.PartsList != null && toolingBoardSubmitDto.PartsList.Count > 0)
+                        {
+                            List<Dt_BoxingDetail> detailList = new List<Dt_BoxingDetail>();
+                            foreach (string ComponentCode in toolingBoardSubmitDto.PartsList)
+                            {
+                                if (string.IsNullOrWhiteSpace(ComponentCode)) continue;
+                                string ComponentCodeTrim = ComponentCode.Trim();
+
+                                Dt_FormulaDetail formulaDetail = _formulaDetailService.Repository.QueryFirst(x => x.FormulaId == formulaModel.Id && x.ComponentCode == ComponentCodeTrim);
+                                if (formulaDetail == null)
+                                {
+                                    return WebResponseContent.Instance.Error($"閰嶆柟涓棤姝ょ墿鏂欍�恵ComponentCodeTrim}銆戯紝璇锋牳瀵圭墿鏂欑紪鍙�");
+                                }
+
+                                Dt_BoxingDetail detailModel = new Dt_BoxingDetail()
+                                {
+                                    BoxingId = newBoxingId,
+                                    ComponentCode = ComponentCodeTrim,
+                                    ComponentName = formulaDetail.ComponentName,
+                                    Creater = "admin",
+                                    CreateDate = DateTime.Now
+                                };
+                                detailList.Add(detailModel);
+                            }
+                            if (detailList.Count > 0)
+                            {
+                                BaseDal.AddData(detailList);
+                            }
+                        }
+                        #endregion
+                    }
+                    else
+                    {
+                        #region 淇敼閫昏緫 - 鏂板鏍稿績閫昏緫
+                        // 1. 鏇存柊涓昏〃鏁版嵁
+                        existBoxinModel.ProductCode = productCode;
+                        existBoxinModel.ProductName = formulaModel.ProductName.Trim();
+                         existBoxinModel.Modifier = "admin";
+                        existBoxinModel.ModifyDate = DateTime.Now;
+                        _boxingService.Repository.UpdateData(existBoxinModel);
+
+                        int boxingId = existBoxinModel.Id;
+
+                        // 2. 鍒犻櫎璇ョ粍鐩樹笅鐨勩�愬師鏈夊叏閮ㄦ槑缁嗚〃鏁版嵁銆�
+                        List<Dt_BoxingDetail> oldDetailList = BaseDal.QueryData(x => x.BoxingId == boxingId);
+                        if (oldDetailList != null && oldDetailList.Count > 0)
+                        {
+                            BaseDal.DeleteData(oldDetailList);
+                        }
+
+                        // 3. 閲嶆柊鎻掑叆淇敼鍚庣殑鏄庣粏琛ㄦ暟鎹�
+                        if (toolingBoardSubmitDto.PartsList != null && toolingBoardSubmitDto.PartsList.Count > 0)
+                        {
+                            List<Dt_BoxingDetail> detailList = new List<Dt_BoxingDetail>();
+                            foreach (string ComponentCode in toolingBoardSubmitDto.PartsList)
+                            {
+                                if (string.IsNullOrWhiteSpace(ComponentCode)) continue;
+                                string ComponentCodeTrim = ComponentCode.Trim();
+
+                                Dt_FormulaDetail formulaDetail = _formulaDetailService.Repository.QueryFirst(x => x.FormulaId == formulaModel.Id && x.ComponentCode == ComponentCodeTrim);
+                                if (formulaDetail == null)
+                                {
+                                    return WebResponseContent.Instance.Error($"閰嶆柟涓棤姝ょ墿鏂欍�恵ComponentCodeTrim}銆戯紝璇锋牳瀵圭墿鏂欏悕绉�");
+                                }
+
+                                Dt_BoxingDetail detailModel = new Dt_BoxingDetail()
+                                {
+                                    BoxingId = boxingId,
+                                    ComponentCode = ComponentCodeTrim,
+                                    ComponentName = formulaDetail.ComponentName,
+                                    Creater = "admin",
+                                    CreateDate = DateTime.Now
+                                };
+                                detailList.Add(detailModel);
+                            }
+                            if (detailList.Count > 0)
+                            {
+                                BaseDal.AddData(detailList);
+                            }
+                        }
+                        #endregion
+                    }
+                    uow.Commit();
+                    string msg = existBoxinModel == null ? "缁勭洏淇℃伅鏂板鎴愬姛锛�" : "缁勭洏淇℃伅淇敼鎴愬姛锛�";
+                    return WebResponseContent.Instance.OK(msg);
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine($"淇濆瓨宸ヨ鏉跨粍鐩樹俊鎭紓甯革細{ex.Message}锛屽爢鏍堬細{ex.StackTrace}");
+                    return WebResponseContent.Instance.Error($"鎻愪氦澶辫触锛歿ex.Message}");
+                }
+            }
+        }
+
+
+
+        /// <summary>
+        /// 鑾峰彇鎴愬搧缂栧彿鍜岄浂浠剁紪鍙�
+        /// </summary>
+        /// <param name="palletCode"></param>
+        /// <returns></returns>
+        public WebResponseContent GetProductAndPartsByBoardNo(string palletCode)
+        {
+            try
+            {
+                if (string.IsNullOrWhiteSpace(palletCode))
+                {
+                    return WebResponseContent.Instance.OK("鏌ヨ鎴愬姛", new
+                    {
+                        finishedProductCode = "",
+                        partsList = Enumerable.Repeat("", 10).ToList()
+                    });
+                }
+                Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == palletCode);
+                if (dt_Boxing == null)
+                {
+                    return WebResponseContent.Instance.OK("鏈煡璇㈠埌璇ュ伐瑁呮澘瀵瑰簲鐨勬垚鍝佷俊鎭�", new
+                    {
+                        finishedProductCode = "",
+                        partsList = Enumerable.Repeat("", 10).ToList()
+                    });
+                }
+                List<Dt_BoxingDetail> dt_BoxingDetails = BaseDal.QueryData(x => x.BoxingId == dt_Boxing.Id)?.ToList() ?? new List<Dt_BoxingDetail>();
+                // 鍙栭浂浠剁紪鍙�
+                List<string> partsList = dt_BoxingDetails.Select(d => d.ComponentCode).ToList();
+                List<string> resultPartsList = new List<string>();
+                for (int i = 0; i < 10; i++)
+                {
+                    if (i < partsList.Count)
+                    {
+                        resultPartsList.Add(partsList[i] ?? "");
+                    }
+                    else
+                    {
+                        resultPartsList.Add("");
+                    }
+                }
+                return WebResponseContent.Instance.OK("闆朵欢缂栧彿鍒楄〃鏌ヨ鎴愬姛", new
+                {
+                    finishedProductCode = dt_Boxing.ProductCode ?? "",
+                    partsList = resultPartsList
+                });
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error($"鏌ヨ闆朵欢缂栧彿鍒楄〃寮傚父锛歿ex.Message}");
+            }
         }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaDetailService.cs"
index 12070e3..52be02e 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaDetailService.cs"
@@ -3,8 +3,10 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_BasicInfoService
@@ -16,5 +18,9 @@
         }
 
         public IRepository<Dt_FormulaDetail> Repository => BaseDal;
+
+
+
+        
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaService.cs"
index 35c819e..200ea66 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/FormulaService.cs"
@@ -31,18 +31,18 @@
                 Id = saveModel.MainData["id"].ObjToInt(),
                 ProductCode = saveModel.MainData["productCode"].ToString(),
                 ProductName = saveModel.MainData["productName"].ToString(),
-                ProductLength = float.Parse(saveModel.MainData["productLength"].ToString()),
-                ProductWidth = float.Parse(saveModel.MainData["productWidth"].ToString()),
-                ProductHeight = float.Parse(saveModel.MainData["productHeight"].ToString()),
-                ScrewDownsetDistance = float.Parse(saveModel.MainData["screwDownsetDistance"].ToString()),
-                ScrewTorqueOutput = float.Parse(saveModel.MainData["screwTorqueOutput"].ToString()),
+                ProductLength = decimal.Parse(saveModel.MainData["productLength"].ToString()),
+                ProductWidth = decimal.Parse(saveModel.MainData["productWidth"].ToString()),
+                ProductHeight = decimal.Parse(saveModel.MainData["productHeight"].ToString()),
+                ScrewDownsetDistance = decimal.Parse(saveModel.MainData["screwDownsetDistance"].ToString()),
+                ScrewTorqueOutput = decimal.Parse(saveModel.MainData["screwTorqueOutput"].ToString()),
                 DintAutoScrewOn = saveModel.MainData["dintAutoScrewOn"].ObjToInt(),
-                XDirectionDistance1 = float.Parse(saveModel.MainData["xDirectionDistance1"].ToString()),
-                YDirectionHeight1 = float.Parse(saveModel.MainData["yDirectionHeight1"].ToString()),
-                XDirectionDistance2 = float.Parse(saveModel.MainData["xDirectionDistance2"].ToString()),
-                YDirectionHeight2 = float.Parse(saveModel.MainData["yDirectionHeight2"].ToString()),
-                XDirectionDistance3 = float.Parse(saveModel.MainData["xDirectionDistance3"].ToString()),
-                YDirectionHeight3 = float.Parse(saveModel.MainData["yDirectionHeight3"].ToString())
+                XDirectionDistance1 = decimal.Parse(saveModel.MainData["xDirectionDistance1"].ToString()),
+                YDirectionHeight1 = decimal.Parse(saveModel.MainData["yDirectionHeight1"].ToString()),
+                XDirectionDistance2 = decimal.Parse(saveModel.MainData["xDirectionDistance2"].ToString()),
+                YDirectionHeight2 = decimal.Parse(saveModel.MainData["yDirectionHeight2"].ToString()),
+                XDirectionDistance3 = decimal.Parse(saveModel.MainData["xDirectionDistance3"].ToString()),
+                YDirectionHeight3 = decimal.Parse(saveModel.MainData["yDirectionHeight3"].ToString())
 
                 //ScrewTorque = float.Parse(saveModel.MainData["ScrewTorque"].ToString()),
                 //UpdateBy = saveModel.UpdateBy,
@@ -56,5 +56,28 @@
         {
             return base.UpdateData(entity);
         }
+
+
+        /// <summary>
+        /// 鑾峰彇绔欏彴鎴愬搧
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent getEndProductList()
+        {
+            try
+            {
+                List<Dt_Formula> dt_Formulas = BaseDal.QueryData(x => 1 == 1);
+                var resultList = dt_Formulas.Select(item => new
+                {
+                    key = item.ProductCode,    
+                    value = item.ProductCode
+                }).ToList();
+                return WebResponseContent.Instance.OK("鏌ヨ绔欏彴鎴愬搧鎴愬姛", resultList);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error($"鏌ヨ绔欏彴鎴愬搧澶辫触锛歿ex.Message}");
+            }
+        }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoDetailService.cs"
new file mode 100644
index 0000000..924520d
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoDetailService.cs"
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core.BaseRepository;
+using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_IBasicInfoService;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_BasicInfoService
+{
+
+    public class ProcessInfoDetailService : ServiceBase<Dt_ProcessInfoDetail, IRepository<Dt_ProcessInfoDetail>>, IProcessInfoDetailService
+    {
+        public ProcessInfoDetailService(IRepository<Dt_ProcessInfoDetail> BaseDal) : base(BaseDal)
+        {
+        }
+
+        public IRepository<Dt_ProcessInfoDetail> Repository => BaseDal;
+
+
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoService.cs"
index 81866db..098bb4e 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ProcessInfoService.cs"
@@ -1,10 +1,9 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+锘縰sing OfficeOpenXml;
+using Spire.Xls;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_BasicInfoService
@@ -16,5 +15,41 @@
         }
 
         public IRepository<Dt_ProcessInfo> Repository => BaseDal;
+
+        /// <summary>
+        /// 涓嬭浇娴佺▼鍗�
+        /// </summary>
+        /// <param name="dt_ProcessInfo"></param>
+        /// <returns></returns>
+        public WebResponseContent ExportData(Dt_ProcessInfo dt_ProcessInfo)
+        {
+            
+                string fileName = $"{DateTime.Now.ToString("yyyyMMddHHssmm")}.xlsx";
+                string templatePath = $"{AppDomain.CurrentDomain.BaseDirectory}ExprotTemplate\\鍙戠數鏈哄脊鎬ф敮鎾戜俊鎭寲娴佺▼鍗�.xlsx";//妯℃澘璺緞
+                string savePath = $"{AppDomain.CurrentDomain.BaseDirectory}Download\\{fileName}";//淇濆瓨鏂囦欢璺緞
+
+                using Stream templateStream = new FileStream(templatePath, FileMode.Open);
+                using Stream saveStream = new FileStream(savePath, FileMode.Create);
+                using ExcelPackage package = new ExcelPackage(saveStream, templateStream);
+                ExcelWorksheet worksheet = package.Workbook.Worksheets["娴佺▼鍗�"];
+                worksheet.Cells[3, 5].Value = dt_ProcessInfo.ProductCode;//鎴愬搧缂栧彿
+
+                package.Save();
+
+                string pdfFileName = $"{DateTime.Now.ToString("yyyyMMddHHssmm")}.pdf";
+                string pdfPath = $"{AppDomain.CurrentDomain.BaseDirectory}Download\\{pdfFileName}";
+
+                Workbook workbook = new Workbook();
+                workbook.LoadFromFile(savePath);
+
+                // 杞崲绗竴涓伐浣滆〃鍒癙DF
+                workbook.SaveToFile(pdfPath, FileFormat.PDF);
+                return WebResponseContent.Instance.OK(data: new { path = pdfPath, fileName = pdfFileName });
+             
+            }
+
+        
+
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs"
index 172962a..4a5fcda 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs"
@@ -1,20 +1,224 @@
-锘縰sing System;
+锘縰sing Autofac.Core;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Common.PLCEnum;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
 
 namespace WIDESEAWCS_BasicInfoService
 {
     public class ScanStationService : ServiceBase<Dt_ScanStation, IRepository<Dt_ScanStation>>, IScanStationService
     {
-        public ScanStationService(IRepository<Dt_ScanStation> BaseDal) : base(BaseDal)
+        private readonly IFormulaService _formulaService;
+        private readonly IFormulaDetailService _formulaDetailService;
+
+        public ScanStationService(IRepository<Dt_ScanStation> BaseDal, 
+            IFormulaService formulaService,
+            IFormulaDetailService formulaDetailService
+            ) : base(BaseDal)
         {
+            _formulaService = formulaService;
+            _formulaDetailService = formulaDetailService;
         }
 
         public IRepository<Dt_ScanStation> Repository => BaseDal;
+
+
+        /// <summary>
+        /// 鍚姩PLC
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        /// <summary>
+        public WebResponseContent StartPLC(bool isStop)
+        {
+            try
+            {
+                OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "涓绘帶PLC") as OtherDevice;
+                if (device == null) throw new Exception("鏈壘鍒颁富鎺LC璁惧淇℃伅");
+                if (!device.IsConnected) throw new Exception($"涓绘帶PLC璁惧閫氳寮傚父");
+                if (isStop)
+                {
+                    device.SetValue(W_PLCDBName.wboolAutoStart, false);
+                    //鏆傚仠淇″彿
+                    device.SetValue(W_PLCDBName.wboolAutoPause, false);
+                    return WebResponseContent.Instance.OK();
+                }
+                var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
+                var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
+                var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
+                var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
+
+                if (Heart && !EMG && OnlineExecuting && !Error)
+                { 
+                    device.SetValue(W_PLCDBName.wboolAutoStart, true);
+                    //鏆傚仠淇″彿
+                    device.SetValue(W_PLCDBName.wboolAutoPause, false);
+                    return WebResponseContent.Instance.OK();
+                }
+
+                return WebResponseContent.Instance.Error("璁惧涓嶆槸鍦ㄧ嚎鐘舵��");
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+
+        /// <summary>
+        /// 鏆傚仠/鎭㈠PLC锛堝弻鍚戞帶鍒讹級
+        /// </summary>
+        /// <param name="isPause">鏄惁涓烘殏鍋滄搷浣滐細true=鏆傚仠锛宖alse=鎭㈠</param>
+        /// <returns>缁熶竴鏍煎紡鐨勫搷搴旂粨鏋�</returns>
+        public WebResponseContent PausePLC(bool isPause)
+        {
+            try
+            {
+                OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "涓绘帶PLC") as OtherDevice;
+                if (device == null) throw new Exception("鏈壘鍒颁富鎺LC璁惧淇℃伅");
+                if (!device.IsConnected) throw new Exception($"涓绘帶PLC璁惧閫氳寮傚父");
+
+                var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
+                var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
+                var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
+                if(!device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart))
+                {
+                    return WebResponseContent.Instance.Error("璁惧鏈惎鍔�");
+                }
+
+                if (!Heart || EMG || Error)
+                {
+                    return WebResponseContent.Instance.Error("璁惧鐘舵�佸紓甯革紝鏃犳硶鎵ц鏆傚仠/鎭㈠鎿嶄綔");
+                }
+                device.SetValue(W_PLCDBName.wboolAutoPause, isPause);
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+
+        /// <summary>
+        /// 杩斿洖淇″彿
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public WebResponseContent GetSignalStates()
+        {
+            OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "涓绘帶PLC") as OtherDevice;
+            if (device == null) throw new Exception("鏈壘鍒颁富鎺LC璁惧淇℃伅");
+            if (!device.IsConnected) throw new Exception($"涓绘帶PLC璁惧閫氳寮傚父");
+
+            //鑾峰彇淇″彿鐏姸鎬�
+            var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
+            var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
+            var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
+            var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
+            var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
+
+            //鑾峰彇鍚姩鏆傚仠鐘舵��
+            var IsStarted = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart);
+            var IsPaused = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoPause);
+
+            //杩斿洖瀵硅薄
+            var responseData = new
+            {
+                // 淇″彿鐏姸鎬佹暟缁勶紙淇濇寔鍘熸湁椤哄簭锛�
+                signalStates = new bool[] { Heart, EMG, AutoExecuting, OnlineExecuting, Error },
+                // PLC鍚姩/鏆傚仠鐘舵�佸璞�
+                plcStatus = new
+                {
+                    isStarted = IsStarted,
+                    isPaused = IsPaused
+                }
+            };
+            return WebResponseContent.Instance.OK(data: responseData);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎴愬搧淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public WebResponseContent GetLeftInitialData()
+        {
+            try
+            {
+                Dt_ScanStation dt_ScanStation = BaseDal.QueryFirst(x => x.StationCode == "001");
+                if (dt_ScanStation == null)
+                {
+                    return WebResponseContent.Instance.Error("鏈壘鍒板伐浣嶇紪鐮佷负001鐨勫伐浣嶄俊鎭�");
+                }
+                Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_ScanStation.StationEndProduct);
+                if (dt_Formula == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒版垚鍝佺紪鍙枫�恵dt_ScanStation.StationEndProduct}銆戝搴旂殑閰嶆柟淇℃伅");
+                }
+                List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id);
+
+                var responseData = new
+                {
+                    finishedProductId = dt_Formula.Id,
+                    finishedProduct = dt_Formula.ProductCode,
+                    leftPartCodes = new List<string>(),
+                    leftPartIds = new List<int>(),
+                    leftPartChecked = new List<int>()
+                };
+
+                foreach (var detail in dt_FormulaDetails.Take(10))
+                {
+                    responseData.leftPartCodes.Add(detail.ComponentCode ?? "");
+                    responseData.leftPartIds.Add(detail.Id);
+                    responseData.leftPartChecked.Add(detail.IsScanned);
+                }
+
+                int needFillCount = 10 - responseData.leftPartCodes.Count;
+                for (int i = 0; i < needFillCount; i++)
+                {
+                    responseData.leftPartCodes.Add("");
+                    responseData.leftPartIds.Add(0);
+                    responseData.leftPartChecked.Add(0);
+                }
+                return WebResponseContent.Instance.OK("鑾峰彇宸︿晶鍒濆鏁版嵁鎴愬姛", responseData);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error($"鑾峰彇宸︿晶鍒濆鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯銆恵ex.Message}銆�");
+            }
+        }
+
+        /// <summary>
+        /// 鏇存柊鏄惁鎵爜
+        /// </summary>
+        /// <param name="updatePartScannedStatusRequest"></param>
+        /// <returns></returns>
+        public WebResponseContent UpdatePartScannedStatus(UpdatePartScannedStatusRequest updatePartScannedStatusRequest)
+        {
+            try
+            {
+                Dt_FormulaDetail dt_FormulaDetail = _formulaDetailService.Repository.QueryFirst(x => x.Id == updatePartScannedStatusRequest.Id);
+                dt_FormulaDetail.IsScanned = updatePartScannedStatusRequest.IsScanned;
+                bool flag = _formulaDetailService.Repository.UpdateData(dt_FormulaDetail);
+                if (flag)
+                {
+                    return WebResponseContent.Instance.OK();
+                }
+                return WebResponseContent.Instance.Error("鏇存柊閿欒");
+            }
+            catch (Exception ex) 
+            {
+                return WebResponseContent.Instance.Error("鑾峰彇鏁版嵁澶辫触");
+            }
+        }
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj"
index 132b4ea..a51c847 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj"
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+锘�<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>
@@ -7,11 +7,17 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="WIDESEAWCS_QuartzJob" Version="1.0.0" />
+    <PackageReference Include="WIDESEAWCS_QuartzJob" Version="3.0.11" />
   </ItemGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\WIDESEAWCS_IBasicInfoService\WIDESEAWCS_IBasicInfoService.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Reference Include="Spire.XLS">
+      <HintPath>Spire.XLS.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+
 </Project>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/R_PLCDBName.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/R_PLCDBName.cs"
similarity index 97%
rename from "\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/R_PLCDBName.cs"
rename to "\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/R_PLCDBName.cs"
index 22228cc..0a3cdae 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/R_PLCDBName.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/R_PLCDBName.cs"
@@ -4,7 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace WIDESEAWCS_Tasks
+namespace WIDESEAWCS_Common.PLCEnum
 {
     public enum R_PLCDBName
     {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/W_PLCDBName.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/W_PLCDBName.cs"
similarity index 98%
rename from "\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/W_PLCDBName.cs"
rename to "\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/W_PLCDBName.cs"
index 5cfd1c3..84b9686 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/W_PLCDBName.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Common/PLCEnum/W_PLCDBName.cs"
@@ -4,7 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace WIDESEAWCS_Tasks
+namespace WIDESEAWCS_Common.PLCEnum
 {
     public enum W_PLCDBName
     {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/ToolingBoardSubmitDto.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/ToolingBoardSubmitDto.cs"
new file mode 100644
index 0000000..2c10519
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/ToolingBoardSubmitDto.cs"
@@ -0,0 +1,26 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_DTO.BasicInfo
+{
+    public class ToolingBoardSubmitDto
+    {
+        /// <summary>
+        /// 宸ヨ鏉跨紪鍙� (蹇呭~)
+        /// </summary>
+        public string ToolingBoardNo { get; set; }
+
+        /// <summary>
+        /// 鎴愬搧缂栧彿 (蹇呭~)
+        /// </summary>
+        public string FinishedProductCode { get; set; }
+
+        /// <summary>
+        /// 闆朵欢鍒楄〃(鍥哄畾10涓紝瀵瑰簲闆朵欢1~闆朵欢10锛岀┖鍒欎紶绌哄瓧绗︿覆)
+        /// </summary>
+        public List<string> PartsList { get; set; }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/UpdatePartScannedStatusRequest.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/UpdatePartScannedStatusRequest.cs"
new file mode 100644
index 0000000..8dacfd2
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_DTO/BasicInfo/UpdatePartScannedStatusRequest.cs"
@@ -0,0 +1,22 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_DTO.BasicInfo
+{
+    public class UpdatePartScannedStatusRequest
+    {
+        /// <summary>
+        /// 闆朵欢鏁版嵁搴撲富閿甀D
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 鏄惁鎵爜
+        /// </summary>
+        public int IsScanned { get; set; }
+    }
+
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IBoxingDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IBoxingDetailService.cs"
index eed9187..2c784bc 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IBoxingDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IBoxingDetailService.cs"
@@ -3,8 +3,10 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_BasicInfoService
@@ -15,5 +17,10 @@
 
         //姣旇緝闆朵欢鏄惁榻愬叏
         public bool IsComponentCodesEqual(List<Dt_BoxingDetail> boxingDetails, List<Dt_FormulaDetail> formulaDetails);
+
+        //娣诲姞缁勭洏淇℃伅
+        public WebResponseContent SaveToolingBoardNo(ToolingBoardSubmitDto toolingBoardSubmitDto);
+        //鑾峰彇鎴愬搧缂栧彿鍜岄浂浠�
+        public WebResponseContent GetProductAndPartsByBoardNo(string palletCode);
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaDetailService.cs"
index f68b1ab..8602d89 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaDetailService.cs"
@@ -13,4 +13,11 @@
     {
         public IRepository<Dt_FormulaDetail> Repository { get; }
     }
+
+
+
+
+    
+
+
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaService.cs"
index a92882e..42c6633 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IFormulaService.cs"
@@ -3,6 +3,7 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_Model.Models;
@@ -12,5 +13,8 @@
     public interface IFormulaService : IService<Dt_Formula>
     {
         public IRepository<Dt_Formula> Repository { get; }
+
+        //鑾峰彇绔欏彴鎴愬搧
+        public WebResponseContent getEndProductList();
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoDetailService.cs"
new file mode 100644
index 0000000..da6e6b4
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoDetailService.cs"
@@ -0,0 +1,16 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core.BaseRepository;
+using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_IBasicInfoService
+{
+    public interface IProcessInfoDetailService : IService<Dt_ProcessInfoDetail>
+    {
+        public IRepository<Dt_ProcessInfoDetail> Repository { get; }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoService.cs"
index c38dacd..f232de0 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IProcessInfoService.cs"
@@ -3,6 +3,7 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_Model.Models;
@@ -12,5 +13,8 @@
     public interface IProcessInfoService : IService<Dt_ProcessInfo>
     {
         public IRepository<Dt_ProcessInfo> Repository { get; }
+
+        // 涓嬭浇娴佺▼鍗�
+        public WebResponseContent ExportData(Dt_ProcessInfo dt_ProcessInfo);
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IScanStationService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IScanStationService.cs"
index c54df53..caad7f5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IScanStationService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/IScanStationService.cs"
@@ -3,8 +3,10 @@
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_BasicInfoService
@@ -12,5 +14,19 @@
     public interface IScanStationService : IService<Dt_ScanStation>
     {
         public IRepository<Dt_ScanStation> Repository { get; }
+
+        //鍚姩PLC
+        public WebResponseContent StartPLC(bool isStop);
+
+        //鏆傚仠PLC
+        public WebResponseContent PausePLC(bool isPause);
+
+        //杩斿洖淇″彿
+        public WebResponseContent GetSignalStates();
+
+        //鑾峰彇鎴愬搧淇℃伅
+        public WebResponseContent GetLeftInitialData();
+        //鏇存柊鎵爜鐘舵��
+        public WebResponseContent UpdatePartScannedStatus(UpdatePartScannedStatusRequest updatePartScannedStatusRequest);
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_Formula.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_Formula.cs"
index 4665677..b4d4339 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_Formula.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_Formula.cs"
@@ -33,74 +33,74 @@
         /// <summary>
         /// 鍘嬭浣嶄骇鍝侀暱搴�
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "鍘嬭浣嶄骇鍝侀暱搴�")]
-        public float ProductLength { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits =2, ColumnDescription = "鍘嬭浣嶄骇鍝侀暱搴�")]
+        public decimal ProductLength { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶄骇鍝佸搴�
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "鍘嬭浣嶄骇鍝佸搴�")]
-        public float ProductWidth { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶄骇鍝佸搴�")]
+        public decimal ProductWidth { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶄骇鍝侀珮搴�
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "鍘嬭浣嶄骇鍝侀珮搴�")]
-        public float ProductHeight { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶄骇鍝侀珮搴�")]
+        public decimal ProductHeight { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶆嫥绱т笅闄嶉珮搴�
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "鍘嬭浣嶆嫥绱т笅闄嶉珮搴�")]
-        public float ScrewDownsetDistance { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶆嫥绱т笅闄嶉珮搴�")]
+        public decimal ScrewDownsetDistance { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶆嫥绱ф壄鍔�
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "鍘嬭浣嶆嫥绱ф壄鍔�")]
-        public float ScrewTorqueOutput { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶆嫥绱ф壄鍔�")]
+        public decimal ScrewTorqueOutput { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶈嚜鍔ㄦ嫥绱ф墦寮�
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "鍘嬭浣嶈嚜鍔ㄦ嫥绱ф墦寮�")]
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶈嚜鍔ㄦ嫥绱ф墦寮�")]
         public int DintAutoScrewOn { get; set; }
 
         /// <summary>
         /// 妫�娴嬩綅X鍋忕Щ璺濈1
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "妫�娴嬩綅X鍋忕Щ璺濈1")]
-        public float XDirectionDistance1 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "妫�娴嬩綅X鍋忕Щ璺濈1")]
+        public decimal XDirectionDistance1 { get; set; }
 
         /// <summary>
         /// 妫�娴嬩綅Z楂樺害1
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "妫�娴嬩綅Z楂樺害1")]
-        public float YDirectionHeight1 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "妫�娴嬩綅Z楂樺害1")]
+        public decimal YDirectionHeight1 { get; set; }
 
         /// <summary>
         /// 妫�娴嬩綅X鍋忕Щ璺濈2
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "妫�娴嬩綅X鍋忕Щ璺濈2")]
-        public float XDirectionDistance2 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "妫�娴嬩綅X鍋忕Щ璺濈2")]
+        public decimal XDirectionDistance2 { get; set; }
 
         /// <summary>
         /// 妫�娴嬩綅Z楂樺害2
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "妫�娴嬩綅Z楂樺害2")]
-        public float YDirectionHeight2 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "妫�娴嬩綅Z楂樺害2")]
+        public decimal YDirectionHeight2 { get; set; }
 
         /// <summary>
         /// 妫�娴嬩綅X鍋忕Щ璺濈3
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "妫�娴嬩綅X鍋忕Щ璺濈3")]
-        public float XDirectionDistance3 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "妫�娴嬩綅X鍋忕Щ璺濈3")]
+        public decimal XDirectionDistance3 { get; set; }
 
         /// <summary>
         /// 妫�娴嬩綅Z楂樺害3
         /// </summary>
-        [SugarColumn(IsNullable = true,  ColumnDescription = "妫�娴嬩綅Z楂樺害3")]
-        public float YDirectionHeight3 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "妫�娴嬩綅Z楂樺害3")]
+        public decimal YDirectionHeight3 { get; set; }
 
         [SugarColumn(IsIgnore = true)]//涓嶅弬涓庢暟鎹簱鏄犲皠锛屾祴璇曚娇鐢�
         [Navigate(NavigateType.OneToMany, nameof(Dt_FormulaDetail.FormulaId), nameof(Id))]
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_FormulaDetail.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_FormulaDetail.cs"
index 1fcbeac..9a29a81 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_FormulaDetail.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_FormulaDetail.cs"
@@ -33,5 +33,13 @@
         /// </summary>
         [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "闆朵欢鍚嶇О")]
         public string ComponentName { get; set; }
+
+        /// <summary>
+        /// 鏄惁鎵爜
+        /// </summary>
+         [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "鏄惁鎵爜")]
+        public int IsScanned { get; set; }
+
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfo.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfo.cs"
index e3ee104..cb53c29 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfo.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfo.cs"
@@ -44,67 +44,67 @@
         /// <summary>
         /// 鎵姏鍊�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鎵姏鍊�")]
-        public float TorsioValue { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鎵姏鍊�")]
+        public decimal TorsioValue { get; set; }
 
         /// <summary>
         /// 鎵姏鍊兼爣鍑�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鎵姏鍊兼爣鍑�")]
-        public float TorsioValueStandard { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鎵姏鍊兼爣鍑�")]
+        public decimal TorsioValueStandard { get; set; }
 
         /// <summary>
         /// 鍒氬害鍊�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鍒氬害鍊�")]
-        public float StiffnessValue { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍒氬害鍊�")]
+        public decimal StiffnessValue { get; set; }
 
         /// <summary>
         /// 鍒氬害鍊兼爣鍑�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鍒氬害鍊兼爣鍑�")]
-        public float StiffnessValueStandard { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍒氬害鍊兼爣鍑�")]
+        public decimal StiffnessValueStandard { get; set; }
 
         /// <summary>
         /// 娴嬭瘯缁撴灉
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "娴嬭瘯缁撴灉")]
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "娴嬭瘯缁撴灉")]
         public int TestResult { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶄笅鍘嬫娴嬮珮搴�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鍘嬭浣嶄笅鍘嬫娴嬮珮搴�")]
-        public float PressHeight { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶄笅鍘嬫娴嬮珮搴�")]
+        public decimal PressHeight { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶆嫥绱ф娴嬫壄鍔�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鍘嬭浣嶆嫥绱ф娴嬫壄鍔�")]
-        public float ScrewTorque { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶆嫥绱ф娴嬫壄鍔�")]
+        public decimal ScrewTorque { get; set; }
 
         /// <summary>
         /// 鍘嬭浣嶆嫥绱ф娴嬭搴�
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鍘嬭浣嶆嫥绱ф娴嬭搴�")]
-        public float ScrewAngle { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鍘嬭浣嶆嫥绱ф娴嬭搴�")]
+        public decimal ScrewAngle { get; set; }
 
         /// <summary>
         /// 鎷х揣浣嶆娴嬮珮搴�1
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鎷х揣浣嶆娴嬮珮搴�1")]
-        public float Height1 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鎷х揣浣嶆娴嬮珮搴�1")]
+        public decimal Height1 { get; set; }
 
         /// <summary>
         /// 鎷х揣浣嶆娴嬮珮搴�2
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鎷х揣浣嶆娴嬮珮搴�2")]
-        public float Height2 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鎷х揣浣嶆娴嬮珮搴�2")]
+        public decimal Height2 { get; set; }
 
         /// <summary>
         /// 鎷х揣浣嶆娴嬮珮搴�3
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDescription = "鎷х揣浣嶆娴嬮珮搴�3")]
-        public float Height3 { get; set; }
+        [SugarColumn(IsNullable = true, DecimalDigits = 2, ColumnDescription = "鎷х揣浣嶆娴嬮珮搴�3")]
+        public decimal Height3 { get; set; }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfoDetail.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfoDetail.cs"
new file mode 100644
index 0000000..78802a3
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ProcessInfoDetail.cs"
@@ -0,0 +1,38 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core.DB.Models;
+
+namespace WIDESEAWCS_Model.Models
+{
+    [SugarTable(nameof(Dt_ProcessInfoDetail), "鍔犲伐淇℃伅璇︽儏琛�")]
+    public class Dt_ProcessInfoDetail : BaseEntity
+    {
+        /// <summary>
+        /// 涓婚敭
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "涓婚敭")]
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 宸ヨ鏉跨紪鍙�
+        /// </summary>
+        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "宸ヨ鏉跨紪鍙�")]
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 鎴愬搧缂栧彿
+        /// </summary>
+        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎴愬搧缂栧彿")]
+        public string ProductCode { get; set; }
+
+        /// <summary>
+        /// 鎴愬搧鍚嶇О
+        /// </summary>
+        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎴愬搧鍚嶇О")]
+        public string ProductName { get; set; }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ScanStation.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ScanStation.cs"
index e725e75..24010ef 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ScanStation.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/Dt_ScanStation.cs"
@@ -32,13 +32,13 @@
         /// <summary>
         /// 绔欏彴鎴愬搧
         /// </summary>
-        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "绔欏彴鎴愬搧")]
+        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "绔欏彴鎴愬搧")]
         public string StationEndProduct { get; set; }
 
         /// <summary>
         /// 闆朵欢鏁伴噺
         /// </summary>
-        [SugarColumn(IsNullable = false, ColumnDescription = "闆朵欢鏁伴噺")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "闆朵欢鏁伴噺")]
         public int StationComponentQty { get; set; }
 
         /// <summary>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj"
index dd63ccd..f6e245e 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj"
@@ -8,7 +8,7 @@
 
 	<ItemGroup>
 		<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
-		<PackageReference Include="WIDESEAWCS_Core" Version="1.0.17" />
+		<PackageReference Include="WIDESEAWCS_Core" Version="1.0.32" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/.config/dotnet-tools.json" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/.config/dotnet-tools.json"
new file mode 100644
index 0000000..b0e38ab
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/.config/dotnet-tools.json"
@@ -0,0 +1,5 @@
+{
+  "version": 1,
+  "isRoot": true,
+  "tools": {}
+}
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/BoxingDetailController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/BoxingDetailController.cs"
index 8982087..9c85305 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/BoxingDetailController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/BoxingDetailController.cs"
@@ -1,6 +1,9 @@
-锘縰sing Microsoft.AspNetCore.Mvc;
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
 using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseController;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_Server.Controllers.BoxingInfo
@@ -17,5 +20,18 @@
 
         }
 
+
+        [HttpPost, Route("SaveToolingBoardNo"), AllowAnonymous]
+        public WebResponseContent SaveToolingBoardNo([FromBody] ToolingBoardSubmitDto toolingBoardSubmitDto)
+        {
+            return Service.SaveToolingBoardNo(toolingBoardSubmitDto);
+        }
+
+
+        [HttpGet, Route("GetProductAndPartsByBoardNo"), AllowAnonymous]
+        public WebResponseContent GetProductAndPartsByBoardNo([FromQuery] string palletCode)
+        {
+            return Service.GetProductAndPartsByBoardNo(palletCode);
+        }
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/FormulaController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/FormulaController.cs"
index eb2fd6c..7cccf9c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/FormulaController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/FormulaController.cs"
@@ -1,5 +1,7 @@
-锘縰sing Microsoft.AspNetCore.Mvc;
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
 using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseController;
 using WIDESEAWCS_Model.Models;
 
@@ -17,5 +19,16 @@
 
         }
 
+
+        /// <summary>
+        /// 鑾峰彇绔欏彴鎴愬搧
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet, Route("getEndProductList"), AllowAnonymous]
+        public WebResponseContent getEndProductList()
+        {
+            return Service.getEndProductList();
+        }
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoController.cs"
index 5757c24..0154273 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoController.cs"
@@ -1,5 +1,7 @@
-锘縰sing Microsoft.AspNetCore.Mvc;
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
 using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseController;
 using WIDESEAWCS_Model.Models;
 
@@ -17,5 +19,17 @@
 
         }
 
+        
+        /// <summary>
+        /// 涓嬭浇娴佺▼鍗�
+        /// </summary>
+        /// <param name="dt_ProcessInfo"></param>
+        /// <returns></returns>
+        [HttpPost, Route("ExportData"), AllowAnonymous]
+        public WebResponseContent ExportData([FromBody]  Dt_ProcessInfo dt_ProcessInfo)
+        {
+            return Service.ExportData(dt_ProcessInfo);
+        }
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoDetailController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoDetailController.cs"
new file mode 100644
index 0000000..5bbfe2b
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ProcessInfoDetailController.cs"
@@ -0,0 +1,21 @@
+锘縰sing Microsoft.AspNetCore.Mvc;
+using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Core.BaseController;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_IBasicInfoService;
+
+namespace WIDESEAWCS_Server.Controllers.BasicInfo
+{
+    /// <summary>
+    /// 鍔犲伐淇℃伅
+    /// </summary>
+    [Route("api/processInfoDetail")]
+    [ApiController]
+    public class ProcessInfoDetailController : ApiBaseController<IProcessInfoDetailService, Dt_ProcessInfoDetail>
+    {
+        public ProcessInfoDetailController(IProcessInfoDetailService service) : base(service)
+        {
+
+        }
+    }
+}
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ScanStationController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ScanStationController.cs"
index 1ec23af..09960c0 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ScanStationController.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/BasicInfo/ScanStationController.cs"
@@ -1,6 +1,9 @@
-锘縰sing Microsoft.AspNetCore.Mvc;
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
 using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseController;
+using WIDESEAWCS_DTO.BasicInfo;
 using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_Server.Controllers.BasicInfo
@@ -17,5 +20,62 @@
 
         }
 
+
+        /// <summary>
+        /// 鍚姩PLC
+        /// </summary>
+        /// <param name="isStop"></param>
+        /// <returns></returns>
+        [HttpGet, Route("StartPLC"), AllowAnonymous]
+        public WebResponseContent StartPLC([FromQuery] bool isStop)
+        {
+            return Service.StartPLC(isStop);
+        }
+
+
+        /// <summary>
+        /// 鏆傚仠PLC
+        /// </summary>
+        /// <param name="isPause"></param>
+        /// <returns></returns>
+        [HttpGet, Route("PausePLC"), AllowAnonymous]
+        public WebResponseContent PausePLC([FromQuery] bool isPause)
+        {
+            return Service.PausePLC(isPause);
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇淇″彿鐏�
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet, Route("GetSignalStates"), AllowAnonymous]
+        public WebResponseContent GetSignalStates()
+        {
+            return Service.GetSignalStates();
+        }
+
+
+        /// <summary>
+        /// 鑾峰彇鎴愬搧淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet, Route("GetLeftInitialData"), AllowAnonymous]
+        public WebResponseContent GetLeftInitialData()
+        {
+            return Service.GetLeftInitialData();
+        }
+
+        /// <summary>
+        /// 鏇存柊鏄惁鎵爜
+        /// </summary>
+        /// <param name="updatePartScannedStatusRequest"></param>
+        /// <returns></returns>
+        [HttpPost, Route("UpdatePartScannedStatus"), AllowAnonymous]
+        public WebResponseContent UpdatePartScannedStatus([FromBody] UpdatePartScannedStatusRequest updatePartScannedStatusRequest)
+        {
+            return Service.UpdatePartScannedStatus(updatePartScannedStatusRequest);
+        }
+
     }
 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml"
index 36847ea..d7c38db 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml"
@@ -10,8 +10,12 @@
     <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
     <LastUsedPlatform>Any CPU</LastUsedPlatform>
     <PublishProvider>FileSystem</PublishProvider>
-    <PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
+    <PublishUrl>F:\IIS\鎬濆▉鍗氭亽\WCS</PublishUrl>
     <WebPublishMethod>FileSystem</WebPublishMethod>
     <_TargetId>Folder</_TargetId>
+    <SiteUrlToLaunchAfterPublish />
+    <TargetFramework>net6.0</TargetFramework>
+    <ProjectGuid>487fa45b-ea1a-4aca-bb5b-0f6708f462c0</ProjectGuid>
+    <SelfContained>false</SelfContained>
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj"
index cd526a9..a79c368 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj"
@@ -68,6 +68,7 @@
 	</ItemGroup>
 
 	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_IProductRecordServer\WIDESEAWCS_IProductRecordService.csproj" />
 		<ProjectReference Include="..\WIDESEAWCS_SystemServices\WIDESEAWCS_SystemServices.csproj" />
 		<ProjectReference Include="..\WIDESEAWCs_TaskInfoService\WIDESEAWCs_TaskInfoService.csproj" />
 		<ProjectReference Include="..\WIDESEAWCS_Tasks\WIDESEAWCS_Tasks.csproj" />
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfo.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfo.cs"
index 27f36ff..f19d4fb 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfo.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfo.cs"
@@ -14,7 +14,7 @@
 [assembly: System.Reflection.AssemblyCompanyAttribute("WIDESEAWCS_TaskInfoService")]
 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+86f5db51a5fd895dcae671d01b28cd0d4948af0e")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2eea48595c784d1d6d58d526f1da12427dfa0a25")]
 [assembly: System.Reflection.AssemblyProductAttribute("WIDESEAWCS_TaskInfoService")]
 [assembly: System.Reflection.AssemblyTitleAttribute("WIDESEAWCS_TaskInfoService")]
 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfoInputs.cache" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfoInputs.cache"
index 1d039b6..7ffa8b5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfoInputs.cache"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCS_TaskInfoService.AssemblyInfoInputs.cache"
@@ -1 +1 @@
-d4cf05aa7aa7ae843c211aeed38667b4957a26b93e653654b3b863537f1c7404
+c9c87e496556920f27ef09770ceb3d9cdc2a9b9b20ce0dfcd54bba65b5fd5b5e
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCs_TaskInfoService.assets.cache" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCs_TaskInfoService.assets.cache"
index d1e5321..8d4b0d5 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCs_TaskInfoService.assets.cache"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/obj/Debug/net6.0/WIDESEAWCs_TaskInfoService.assets.cache"
Binary files differ
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs"
index 03c0398..e373ad1 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/PLCJob.cs"
@@ -1,27 +1,13 @@
-锘縰sing System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
-using Autofac.Core;
-using HslCommunication;
-using HslCommunication.Core;
-using Microsoft.VisualBasic.FileIO;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
+锘縰sing System.Text;
 using Quartz;
-using SixLabors.ImageSharp.PixelFormats;
 using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Common.PLCEnum;
 using WIDESEAWCS_Communicator;
 using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_IBasicInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob;
-using WIDESEAWCS_QuartzJob.DeviceBase;
-using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
 
 namespace WIDESEAWCS_Tasks
 {
@@ -33,22 +19,33 @@
         private readonly IFormulaService _formulaService;
         private readonly IFormulaDetailService _formulaDetailService;
         private readonly IProcessInfoService _processInfoService;
+        private readonly IProcessInfoDetailService _processDetailInfoService;
         private readonly IUnitOfWorkManage _unitOfWorkManage;
-        public PLCJob(IBoxingService boxingService, IBoxingDetailService boxingDetailService, IFormulaService formulaService, IFormulaDetailService formulaDetailService, IProcessInfoService processInfoService, IUnitOfWorkManage unitOfWorkManage)
+        private readonly IScanStationService _scanStationService;
+        //private readonly string PalletCode = "PL107";
+
+        public PLCJob(IBoxingService boxingService,
+            IBoxingDetailService boxingDetailService,
+            IFormulaService formulaService,
+            IFormulaDetailService formulaDetailService,
+            IProcessInfoService processInfoService,
+            IProcessInfoDetailService processDetailInfoService,
+            IUnitOfWorkManage unitOfWorkManage,
+            IScanStationService scanStationService
+            )
         {
             _boxingService = boxingService;
             _boxingDetailService = boxingDetailService;
             _formulaService = formulaService;
             _formulaDetailService = formulaDetailService;
             _processInfoService = processInfoService;
+            _processDetailInfoService = processDetailInfoService;
             _unitOfWorkManage = unitOfWorkManage;
+            _scanStationService = scanStationService;
         }
-        private readonly string set = "0x16,0x4D,0x0D,0x30,0x34,0x30,0x31,0x44,0x30,0x35,0x2E";//涓绘満鍙戦�佽缃壂鎻忔ā寮忎负涓绘満妯″紡鐨勫懡浠�,鎵弿鍣ㄨ繑鍥炴帴鏀跺埌鐨勫懡浠ゅ拰<ACK>锛�0x06锛夊悗锛屽皢鎵弿妯″紡鏇存敼涓轰富鏈烘ā寮�
-        private readonly string Text = "寮�鍚壂鐮�";//涓绘満鍙戦�佽缃壂鎻忔ā寮忎负涓绘満妯″紡鐨勫懡浠�,鎵弿鍣ㄨ繑鍥炴帴鏀跺埌鐨勫懡浠ゅ拰<ACK>锛�0x06锛夊悗锛屽皢鎵弿妯″紡鏇存敼涓轰富鏈烘ā寮�
-        private readonly string command = "0x16,0x54,0x0D";//鍙戦�佸紑濮嬭В鐮佸懡浠わ紱"0x16,0x55,0x0D"鍙戦�佸仠姝㈣В鐮佸懡浠�
         public Task Execute(IJobExecutionContext context)
         {
-
+            
             bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
             if (flag && value != null)
             {
@@ -63,6 +60,7 @@
                         var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
                         var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
                         var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
+
                         if (Heart && !EMG && AutoExecuting && OnlineExecuting && !Error)
                         {
                             #region 涓婄嚎鎵爜
@@ -103,64 +101,35 @@
             var Location1ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation1ScanDone);
             if (Location1ScanStart && !Location1ScanDone)//鎺у埗鎵爜鏋壂鎻忔墭鐩樼爜锛屾牴鎹墭鐩樼爜鏌ヨ缁勭洏鏁版嵁锛屽垽鏂墭鐩樼粦瀹氭垚鍝佹槸鍚﹀凡缁戝畾鎵�鏈夋墍闇�闆朵欢
             {
-                #region 涓插彛杩炴帴
-                SerialPortCommunicator portCommunicator1 = new SerialPortCommunicator("COM1", 9600, "涓婄嚎鎵爜鏋�");
-                bool IsConnected1 = false;
-                SerialPortCommunicator portCommunicator2 = new SerialPortCommunicator("COM2", 9600, "涓婄嚎鎵爜鏋�");
-                bool IsConnected2 = false;
-                if (!IsConnected1) IsConnected1 = portCommunicator1.Connect();
-                if (!IsConnected2) IsConnected2 = portCommunicator2.Connect();
-                byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//杞垚瀛楄妭鏁扮粍
-                portCommunicator1.Write(dataToSend1);
-                string receiveData = portCommunicator2.ToString(Encoding.UTF8);
-                //if (receiveData == "0x16,0x54,0x0D")
-                //{
-                //    Console.WriteLine(receiveData);
-                byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//杞垚瀛楄妭鏁扮粍
-                portCommunicator2.Write(dataToSend2);
-                //}
-                string PalletCode = portCommunicator1.ToString(Encoding.UTF8);
-                using (var uow = _unitOfWorkManage.CreateUnitOfWork())
+                var PalletCode = TcpClientExample.Start("192.168.2.120", 2001);
+                try
                 {
-                    try
+                    if (!PalletCode.IsNotEmptyOrNull())
                     {
-                        if (PalletCode.IsNotEmptyOrNull())
-                        {
-                            var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
-                            if (boxing == null)
-                            {
-                                WriteError(device.DeviceName, "绌烘墭鐩�");
-                                return;
-                            }
-                            List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == boxing.Id);
-                            Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == boxing.ProductCode);
-                            if (dt_Formula == null)
-                            {
-                                WriteError(device.DeviceName, "鏃犳垚鍝侀厤鏂�");
-                                return;
-                            }
-                            List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id);
-                            //姣旇緝闆朵欢鏄惁榻愬叏
-                            if (!_boxingDetailService.IsComponentCodesEqual(dt_BoxingDetails, dt_FormulaDetails))
-                            {
-                                WriteError(device.DeviceName, "闆朵欢鏈夐棶棰橈紝璇峰鐞�");
-                                return;
-                            }
-                        }
-                        //鎻愪氦浜嬪姟
-                        uow.Commit();
-
-                        IsConnected1 = !portCommunicator1.Disconnect();
-                        IsConnected2 = !portCommunicator2.Disconnect();
-                        #endregion
-                        device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true);
-                        
-
+                        throw new InvalidOperationException("鎵樼洏涓虹┖");
                     }
-                    catch (Exception ex)
+                    var boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
+                    if (boxing == null)
                     {
-                        WriteError(device.DeviceName, "涓婄嚎鎵爜娴佺▼鎵ц寮傚父", ex);
+                        throw new InvalidOperationException("鏈坊鍔犵粍鐩樹俊鎭�");
                     }
+                    List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == boxing.Id);
+                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == boxing.ProductCode);
+                    if (dt_Formula == null)
+                    {
+                        throw new InvalidOperationException("鏃犳垚鍝侀厤鏂�");
+                    }
+                    List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id && x.IsScanned == 1);
+                    //姣旇緝闆朵欢鏄惁榻愬叏
+                    if (!_boxingDetailService.IsComponentCodesEqual(dt_BoxingDetails, dt_FormulaDetails))
+                    {
+                        throw new InvalidOperationException("闆朵欢鏈夐棶棰橈紝璇峰鐞�");
+                    }
+                    device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true);
+                }
+                catch (Exception ex)
+                {
+                    WriteError(device.DeviceName, "涓婄嚎鎵爜娴佺▼鎵ц寮傚父", ex);
                 }
             }
             else if (!Location1ScanStart && Location1ScanDone)
@@ -179,71 +148,44 @@
             var Location2ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation2ScanDone);
             if (Location2ScanStart && !Location2ScanDone)//鎺у埗鎵爜鏋壂鎻忔墭鐩樼爜锛屾牴鎹墭鐩樼爜鏌ヨ鎵樼洏缁戝畾鎴愬搧鍔犲伐鎵�闇�鏁版嵁锛屽啓鍏LC
             {
-                #region MyRegion
-                #region 涓插彛杩炴帴
-                SerialPortCommunicator portCommunicator17 = new SerialPortCommunicator("COM17", 9600, "鍘嬭鎵爜鏋�");
-                bool IsConnected17 = false;
-                SerialPortCommunicator portCommunicator18 = new SerialPortCommunicator("COM18", 9600, "鍘嬭鎵爜鏋�");
-                bool IsConnected18 = false;
-                if (!IsConnected17) IsConnected17 = portCommunicator17.Connect();
-                if (!IsConnected18) IsConnected18 = portCommunicator18.Connect();
-                byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//杞垚瀛楄妭鏁扮粍
-                portCommunicator17.Write(dataToSend1);
-                string receiveData = portCommunicator18.ToString(Encoding.UTF8);
-                byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//杞垚瀛楄妭鏁扮粍
-                portCommunicator18.Write(dataToSend2);
-                //}
-                string PalletCode = portCommunicator17.ToString(Encoding.UTF8);
-                using (var uow = _unitOfWorkManage.CreateUnitOfWork())
+                var PalletCode = TcpClientExample.Start("192.168.2.121", 2001);
+
+                try
                 {
-                    try
+                    if (!PalletCode.IsNotEmptyOrNull())
                     {
-                        if (PalletCode.IsNotEmptyOrNull())
-                        {
-                            Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
-                            Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
-                            //鍐欏叆PLC
-                            device.SetValue(W_PLCDBName.wrealProductLength, dt_Formula.ProductLength);
-                            device.SetValue(W_PLCDBName.wrealProductWidth, dt_Formula.ProductWidth);
-                            device.SetValue(W_PLCDBName.wrealProductHeight, dt_Formula.ProductHeight);
-                            device.SetValue(W_PLCDBName.wrealScrewDownsetDistance, dt_Formula.ScrewDownsetDistance);
-                            device.SetValue(W_PLCDBName.wrealScrewTorqueOutput, dt_Formula.ScrewTorqueOutput);
-                            device.SetValue(W_PLCDBName.wDintAutoScrewOn, dt_Formula.DintAutoScrewOn);
-
-                            //鍘嬭鎵爜瀹屾垚
-                            device.SetValue(W_PLCDBName.wboolLocation2ScanDone, true);
-
-                            //鎺ユ敹鏁版嵁
-                            float PressHeight = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectPressHeight);
-                            float ScrewTorque = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewTorque);
-                            float ScrewAngle = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewAngle);
-
-                            //娣诲姞鍒版暟鎹簱
-                            Dt_ProcessInfo dt_ProcessInfo = new Dt_ProcessInfo()
-                            {
-                                PalletCode = PalletCode,
-                                ProductCode = dt_Formula.ProductCode,
-                                ProductName = dt_Formula.ProductName,
-                                PressHeight = PressHeight,
-                                ScrewTorque = ScrewTorque,
-                                ScrewAngle = ScrewAngle
-
-                            };
-                            _processInfoService.Repository.AddData(dt_ProcessInfo);
-                        }
-                        //鎻愪氦浜嬪姟
-                        uow.Commit();
-
-                        IsConnected17 = !portCommunicator17.Disconnect();
-                        IsConnected18 = !portCommunicator18.Disconnect();
-                        #endregion
-                        #endregion
-
+                        throw new InvalidOperationException("鎵樼洏涓虹┖");
                     }
-                    catch (Exception ex)
+                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
+                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
+                    //鍐欏叆PLC
+                    device.SetValue(W_PLCDBName.wrealProductLength, dt_Formula.ProductLength);
+                    device.SetValue(W_PLCDBName.wrealProductWidth, dt_Formula.ProductWidth);
+                    device.SetValue(W_PLCDBName.wrealProductHeight, dt_Formula.ProductHeight);
+                    device.SetValue(W_PLCDBName.wrealScrewDownsetDistance, dt_Formula.ScrewDownsetDistance);
+                    device.SetValue(W_PLCDBName.wrealScrewTorqueOutput, dt_Formula.ScrewTorqueOutput);
+                    device.SetValue(W_PLCDBName.wDintAutoScrewOn, dt_Formula.DintAutoScrewOn);
+                    //鍘嬭鎵爜瀹屾垚
+                    device.SetValue(W_PLCDBName.wboolLocation2ScanDone, true);
+                    //鎺ユ敹鏁版嵁
+                    decimal PressHeight = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectPressHeight);
+                    decimal ScrewTorque = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewTorque);
+                    decimal ScrewAngle = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectScrewAngle);
+                    //娣诲姞鍒版暟鎹簱
+                    Dt_ProcessInfo dt_ProcessInfo = new Dt_ProcessInfo()
                     {
-                        WriteError(device.DeviceName, "鍘嬭鎵爜娴佺▼鎵ц寮傚父", ex);
-                    }
+                        PalletCode = PalletCode,
+                        ProductCode = dt_Formula.ProductCode,
+                        ProductName = dt_Formula.ProductName,
+                        PressHeight = PressHeight,
+                        ScrewTorque = ScrewTorque,
+                        ScrewAngle = ScrewAngle
+                    };
+                    _processInfoService.Repository.AddData(dt_ProcessInfo);
+                }
+                catch (Exception ex)
+                {
+                    WriteError(device.DeviceName, "鍘嬭鎵爜娴佺▼鎵ц寮傚父", ex);
                 }
             }
             else if (!Location2ScanStart && Location2ScanDone)
@@ -262,71 +204,44 @@
             var Location3ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation3ScanDone);
             if (Location3ScanStart && !Location3ScanDone)
             {
-                #region MyRegion
-                #region 涓插彛杩炴帴
-                SerialPortCommunicator portCommunicator19 = new SerialPortCommunicator("COM19", 9600, "妫�娴嬫壂鐮佹灙");
-                bool IsConnected19 = false;
-                SerialPortCommunicator portCommunicator20 = new SerialPortCommunicator("COM20", 9600, "妫�娴嬫壂鐮佹灙");
-                bool IsConnected20 = false;
-                if (!IsConnected19) IsConnected19 = portCommunicator19.Connect();
-                if (!IsConnected20) IsConnected20 = portCommunicator20.Connect();
-                byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//杞垚瀛楄妭鏁扮粍
-                portCommunicator19.Write(dataToSend1);
-                string receiveData = portCommunicator20.ToString(Encoding.UTF8);
-                byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//杞垚瀛楄妭鏁扮粍
-                portCommunicator20.Write(dataToSend2);
-                //}
-                string PalletCode = portCommunicator19.ToString(Encoding.UTF8);
-
-                using (var uow = _unitOfWorkManage.CreateUnitOfWork())
+                var PalletCode = TcpClientExample.Start("192.168.2.122", 2001);
+                try
                 {
-                    try
+                    if (!PalletCode.IsNotEmptyOrNull())
                     {
-                        if (PalletCode.IsNotEmptyOrNull())
-                        {
-                            Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
-                            Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
-                            //鍐欏叆PLC
-                            device.SetValue(W_PLCDBName.wrealXDirectionDistance1, dt_Formula.XDirectionDistance1);
-                            device.SetValue(W_PLCDBName.wrealYDirectionHeight1, dt_Formula.YDirectionHeight1);
-                            device.SetValue(W_PLCDBName.wrealXDirectionDistance2, dt_Formula.XDirectionDistance2);
-                            device.SetValue(W_PLCDBName.wrealYDirectionHeight2, dt_Formula.YDirectionHeight2);
-                            device.SetValue(W_PLCDBName.wrealXDirectionDistance3, dt_Formula.XDirectionDistance3);
-                            device.SetValue(W_PLCDBName.wrealYDirectionHeight3, dt_Formula.YDirectionHeight3);
-
-                            //妫�娴嬫壂鐮佸畬鎴�
-                            device.SetValue(W_PLCDBName.wboolLocation3ScanDone, true);
-
-                            //鎺ユ敹鏁版嵁
-                            float Height1 = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight1);
-                            float Height2 = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight2);
-                            float Height3 = device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight3);
-
-                            Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
-                            if (dt_ProcessInfo == null)
-                            {
-                                WriteInfo(device.DeviceName, "鎴愬搧鏈帇瑁�");
-                                device.SetValue(W_PLCDBName.wboolLocation1ScanDone, true);
-                                return;
-                            }
-                            dt_ProcessInfo.Height1 = Height1;
-                            dt_ProcessInfo.Height2 = Height2;
-                            dt_ProcessInfo.Height3 = Height3;
-                            _processInfoService.Repository.UpdateData(dt_ProcessInfo);
-
-                        }
-                        //鎻愪氦浜嬪姟
-                        uow.Commit();
-
-                        IsConnected19 = !portCommunicator19.Disconnect();
-                        IsConnected20 = !portCommunicator20.Disconnect();
-                        #endregion
-                        #endregion
+                        throw new InvalidOperationException("鎵樼洏涓虹┖");
                     }
-                    catch (Exception ex)
+                    Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
+                    Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_Boxing.ProductCode);
+                    //鍐欏叆PLC
+                    device.SetValue(W_PLCDBName.wrealXDirectionDistance1, dt_Formula.XDirectionDistance1);
+                    device.SetValue(W_PLCDBName.wrealYDirectionHeight1, dt_Formula.YDirectionHeight1);
+                    device.SetValue(W_PLCDBName.wrealXDirectionDistance2, dt_Formula.XDirectionDistance2);
+                    device.SetValue(W_PLCDBName.wrealYDirectionHeight2, dt_Formula.YDirectionHeight2);
+                    device.SetValue(W_PLCDBName.wrealXDirectionDistance3, dt_Formula.XDirectionDistance3);
+                    device.SetValue(W_PLCDBName.wrealYDirectionHeight3, dt_Formula.YDirectionHeight3);
+
+                    //妫�娴嬫壂鐮佸畬鎴�
+                    device.SetValue(W_PLCDBName.wboolLocation3ScanDone, true);
+
+                    //鎺ユ敹鏁版嵁
+                    decimal Height1 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight1);
+                    decimal Height2 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight2);
+                    decimal Height3 = (decimal)device.GetValue<R_PLCDBName, float>(R_PLCDBName.rrealDetectHeight3);
+
+                    Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
+                    if (dt_ProcessInfo == null)
                     {
-                        WriteError(device.DeviceName, "妫�娴嬫壂鐮佹祦绋嬫墽琛屽紓甯�", ex);
+                        throw new InvalidOperationException("鎴愬搧鏈帇瑁�");
                     }
+                    dt_ProcessInfo.Height1 = Height1;
+                    dt_ProcessInfo.Height2 = Height2;
+                    dt_ProcessInfo.Height3 = Height3;
+                    _processInfoService.Repository.UpdateData(dt_ProcessInfo);
+                }
+                catch (Exception ex)
+                {
+                    WriteError(device.DeviceName, "妫�娴嬫壂鐮佹祦绋嬫墽琛屽紓甯�", ex);
                 }
             }
             else if (!Location3ScanStart && Location3ScanDone)
@@ -346,38 +261,38 @@
             var Location4ScanDone = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolLocation4ScanDone);
             if (Location4ScanStart && !Location4ScanDone)//鎺у埗鎵爜鏋壂鎻忔墭鐩樼爜锛屾牴鎹墭鐩樼爜鏌ヨ缁勭洏鏁版嵁锛屽垽鏂墭鐩樼粦瀹氭垚鍝佹槸鍚﹀凡缁戝畾鎵�鏈夋墍闇�闆朵欢
             {
-                SerialPortCommunicator portCommunicator21 = new SerialPortCommunicator("COM21", 9600, "涓嬬嚎鎵爜鏋�");
-                bool IsConnected21 = false;
-                SerialPortCommunicator portCommunicator22 = new SerialPortCommunicator("COM22", 9600, "涓嬬嚎鎵爜鏋�");
-                bool IsConnected22 = false;
-                if (!IsConnected21) IsConnected21 = portCommunicator21.Connect();
-                if (!IsConnected22) IsConnected22 = portCommunicator22.Connect();
-                byte[] dataToSend1 = Encoding.ASCII.GetBytes(command);//杞垚瀛楄妭鏁扮粍
-                portCommunicator21.Write(dataToSend1);
-                string receiveData = portCommunicator22.ToString(Encoding.UTF8);
-                byte[] dataToSend2 = Encoding.ASCII.GetBytes("PL106");//杞垚瀛楄妭鏁扮粍
-                portCommunicator22.Write(dataToSend2);
-                //}
-                string PalletCode = portCommunicator21.ToString(Encoding.UTF8);
+                var PalletCode = TcpClientExample.Start("192.168.2.123", 2001);
                 using (var uow = _unitOfWorkManage.CreateUnitOfWork())
                 {
                     try
                     {
-                        if (PalletCode.IsNotEmptyOrNull())
+                        if (!PalletCode.IsNotEmptyOrNull())
                         {
-                            Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
-                            _boxingService.Repository.DeleteData(dt_Boxing);
-                            List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == dt_Boxing.Id);
-                            foreach (Dt_BoxingDetail dt_BoxingDetail in dt_BoxingDetails)
-                            {
-                                _boxingDetailService.Repository.DeleteDataById(dt_BoxingDetail.Id);
-                            }
-                            uow.Commit();
-                            //涓嬬嚎鎵爜瀹屾垚
-                            device.SetValue(W_PLCDBName.wboolLocation4ScanDone, true);
+                            throw new InvalidOperationException("鎵樼洏涓虹┖");
                         }
-                        IsConnected21 = !portCommunicator21.Disconnect();
-                        IsConnected22 = !portCommunicator22.Disconnect();
+                        Dt_ProcessInfo dt_ProcessInfo = _processInfoService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
+                        if (dt_ProcessInfo == null)
+                        {
+                            throw new InvalidOperationException("鎴愬搧鏈帇瑁呭拰妫�娴�");
+                        }
+                        Dt_Boxing dt_Boxing = _boxingService.Repository.QueryFirst(x => x.PalletCode == PalletCode);
+                        _boxingService.Repository.DeleteData(dt_Boxing);
+                        List<Dt_BoxingDetail> dt_BoxingDetails = _boxingDetailService.Repository.QueryData(x => x.BoxingId == dt_Boxing.Id);
+                        _boxingDetailService.Repository.DeleteData(dt_BoxingDetails);
+
+                        Dt_ProcessInfoDetail dt_ProcessInfoDetail = new Dt_ProcessInfoDetail()
+                        {
+                            PalletCode = PalletCode,
+                            ProductCode = dt_ProcessInfo.ProductCode,
+                            ProductName = dt_ProcessInfo.ProductName,
+                            Creater = "admin",
+                            CreateDate = DateTime.Now
+                        };
+                        _processDetailInfoService.Repository.AddData(dt_ProcessInfoDetail);
+                        _processInfoService.DeleteData(dt_ProcessInfo);
+                        uow.Commit();
+                        //涓嬬嚎鎵爜瀹屾垚
+                        device.SetValue(W_PLCDBName.wboolLocation4ScanDone, true);
                     }
                     catch (Exception ex)
                     {
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketClient.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketClient.cs"
new file mode 100644
index 0000000..f0e7c29
--- /dev/null
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketClient.cs"
@@ -0,0 +1,52 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_DTO.System;
+
+namespace WIDESEAWCS_Tasks
+{
+    public class TcpClientExample
+    {
+        public static string Start(string Ip, int Prot)
+        {
+            try
+            {
+                // 1. 鍒涘缓 Socket 瀵硅薄
+                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                // 1.閰嶇疆瓒呮椂锛堟牳蹇冿細閬垮厤Receive鏃犻檺闃诲锛�
+                clientSocket.SendTimeout = 3000; // 杩炴帴瓒呮椂3绉�
+                clientSocket.ReceiveTimeout = 3000; // 杩炴帴瓒呮椂3绉�
+                // 2. 杩炴帴鏈嶅姟鍣紙IP 涓烘湇鍔″櫒鐨� IP锛岀鍙d笌鏈嶅姟鍣ㄤ竴鑷达級
+                IPAddress serverIp = IPAddress.Parse(Ip); // 鏈湴娴嬭瘯鐢� 127.0.0.1锛屽疄闄呮浛鎹负鏈嶅姟鍣� IP
+                IPEndPoint serverEndPoint = new IPEndPoint(serverIp, Prot);
+                clientSocket.Connect(serverEndPoint);
+                //Console.WriteLine("宸叉垚鍔熻繛鎺ュ埌鏈嶅姟鍣�");
+
+                // 灏嗗瓧绗︿覆杞崲涓哄瓧鑺傛暟缁勫苟鍙戦��
+                byte[] sendBuffer = Encoding.UTF8.GetBytes("start");
+                clientSocket.Send(sendBuffer);
+                // 鎺ユ敹鏈嶅姟鍣ㄥ洖澶�
+                byte[] recvBuffer = new byte[1024];
+                int recvLen = clientSocket.Receive(recvBuffer);
+                string recvMsg = Encoding.UTF8.GetString(recvBuffer, 0, recvLen);
+                //Console.WriteLine($"鏀跺埌鏈嶅姟鍣ㄥ洖澶嶏細{recvMsg}");
+
+                // 4. 鍏抽棴杩炴帴
+                clientSocket.Shutdown(SocketShutdown.Both);
+                clientSocket.Close();
+                //Console.WriteLine("宸叉柇寮�涓庢湇鍔″櫒鐨勮繛鎺�");
+
+                return recvMsg;
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e.Message);
+                return "";
+            }
+        }
+    }
+}
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj"
index 3f53268..ecedd2a 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj"
@@ -7,7 +7,7 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-	  <PackageReference Include="WIDESEAWCS_QuartzJob" Version="3.0.9" />
+	  <PackageReference Include="WIDESEAWCS_QuartzJob" Version="3.0.11" />
 	</ItemGroup>
 
 	<ItemGroup>

--
Gitblit v1.9.3