m0_70156489 2 days ago
parent
commit
98711e98a3

+ 40 - 4
src/view/SalaryManage/ProcessProduction.vue

@@ -81,10 +81,10 @@
           row-key="rowKey"
           style="width: 100%;height: 65vh;"
           size="small"
-          :row-style="{ height: '26px' }"
-          :header-row-style="{ height: '28px' }"
-          :cell-style="{ padding: '2px 0' }"
-          :header-cell-style="{ padding: '2px 0' }"
+          :row-style="processTableRowStyle"
+          :header-row-style="processTableHeaderRowStyle"
+          :cell-style="processTableCellStyle"
+          :header-cell-style="processTableHeaderCellStyle"
           :span-method="tableSpanMethod"
           :row-class-name="processTableRowClassName"
           @row-click="onProcessTableRowClick"
@@ -242,6 +242,24 @@ const props = defineProps({
   initialSysId: { type: String, default: '' },
 })
 
+/** 工分报工内嵌:与当天报工记录一致;独立页保持原紧凑间距 */
+const processTableRowStyle = computed(() =>
+  props.embeddedInTab ? { height: '38px' } : { height: '26px' }
+)
+const processTableHeaderRowStyle = computed(() =>
+  props.embeddedInTab ? { height: '34px' } : { height: '28px' }
+)
+const processTableCellStyle = computed(() =>
+  props.embeddedInTab
+    ? { padding: '6px 0', fontSize: '16px' }
+    : { padding: '2px 0' }
+)
+const processTableHeaderCellStyle = computed(() =>
+  props.embeddedInTab
+    ? { padding: '6px 0', fontSize: '16px' }
+    : { padding: '2px 0' }
+)
+
 /** 主页面表格高度:改此值即可 */
 const MAIN_TABLE_HEIGHT = 'calc(100vh - 300px)'
 /** 弹窗内表格最大高度(距视口顶部的预留像素,含标题/搜索/订单信息栏) */
@@ -976,6 +994,24 @@ defineExpose({ loadByWorkorder })
   padding-bottom: 2px !important;
 }
 
+/* 工分报工内嵌:与当天报工记录表格间距一致 */
+.process-production-page.embedded-in-tab .process-production-table-wrap :deep(.el-table .cell) {
+  line-height: 24px;
+  padding-left: 8px;
+  padding-right: 8px;
+}
+
+.process-production-page.embedded-in-tab .process-production-table-wrap :deep(.el-table__header th),
+.process-production-page.embedded-in-tab .process-production-table-wrap :deep(.el-table__body td),
+.process-production-page.embedded-in-tab .process-production-table-wrap :deep(.el-table__footer td) {
+  padding-top: 4px !important;
+  padding-bottom: 4px !important;
+}
+
+.process-production-page.embedded-in-tab .process-production-table-wrap :deep(.el-table__footer-wrapper td) {
+  font-size: 16px;
+}
+
 .process-production-table-wrap :deep(.el-table__footer-wrapper td) {
   font-weight: 600;
   color: #303133;

+ 1 - 1
src/view/SalaryManage/SalaryList.vue

@@ -147,7 +147,7 @@
                 <template #empty>
                   <el-empty
                     v-if="!listLoading"
-                    description="当前条件下暂无工资数据"
+                    description="暂无数据"
                     :image-size="100"
                   />
                 </template>

+ 82 - 10
src/view/performance/WorkScoreReporting/gongfenbaogong.vue

@@ -48,11 +48,11 @@
                           class="gongfen-history-table"
                           style="width: 100%; height: 52vh"
                           tooltip-effect="dark"
-                          :row-style="{ height: '50px' }"
+                          :row-style="{ height: '38px' }"
                           :header-cell-style="gongfenHistoryHeaderCellStyle"
                           :cell-style="gongfenHistoryCellStyle"
                           :footer-cell-style="gongfenHistoryFooterCellStyle"
-                          :header-row-style="{ height: '36px' }"
+                          :header-row-style="{ height: '34px' }"
                           :data="filteredGongfenHistoryData"
                           border
                           row-key="ID"
@@ -272,11 +272,15 @@
                             
                             <div ref="processTableWrapRef" class="work-score-process-table-wrap">
                               <el-table
+                                ref="processTableRef"
                                 :data="partProcesses[selectedPartIndex]"
                                 :height="processTableHeight"
                                 scrollbar-always-on
+                                highlight-current-row
+                                :row-class-name="processTableRowClassName"
                                 class="work-score-process-table"
                                 style="width: 100%;"
+                                @row-click="onProcessTableRowClick"
                               >
                                 <el-table-column prop="工艺编号" label="工序号" width="72" align="center" />
                                 <el-table-column prop="工艺名称" label="工序名称" min-width="240" />
@@ -292,7 +296,8 @@
                                           class="work-score-staff-input"
                                           readonly
                                           :disabled="isReportingFillDisabled(selectedPartIndex, scope.$index, staffIndex)"
-                                          @click="fillSelectedEmployee(staff, selectedPartIndex, scope.$index, staffIndex)"
+                                          @focus="highlightProcessRow(scope.row)"
+                                          @click="fillSelectedEmployee(staff, selectedPartIndex, scope.$index, staffIndex); highlightProcessRow(scope.row)"
                                           @drop="onDrop($event, selectedPartIndex, scope.$index, staffIndex)"
                                           @dragover="onDragOver($event)"
                                         />
@@ -304,7 +309,8 @@
                                       class="work-score-staff-input"
                                       readonly
                                       :disabled="isReportingFillDisabled(selectedPartIndex, scope.$index)"
-                                      @click="fillSelectedEmployee(getReportingData(selectedPartIndex, scope.$index), selectedPartIndex, scope.$index)"
+                                      @focus="highlightProcessRow(scope.row)"
+                                      @click="fillSelectedEmployee(getReportingData(selectedPartIndex, scope.$index), selectedPartIndex, scope.$index); highlightProcessRow(scope.row)"
                                       @drop="onDrop($event, selectedPartIndex, scope.$index)"
                                       @dragover="onDragOver($event)"
                                     />
@@ -320,6 +326,8 @@
                                           class="work-score-qty-input"
                                           :class="{ 'work-score-qty-over': isQtyOverUnfinished(selectedPartIndex, scope.$index) }"
                                           :disabled="isReportingFillDisabled(selectedPartIndex, scope.$index, staffIndex)"
+                                          @focus="highlightProcessRow(scope.row)"
+                                          @click="highlightProcessRow(scope.row)"
                                           @update:model-value="(v) => onQtyInput(selectedPartIndex, scope.$index, staffIndex, v)"
                                         />
                                       </div>
@@ -331,6 +339,8 @@
                                       class="work-score-qty-input"
                                       :class="{ 'work-score-qty-over': isQtyOverUnfinished(selectedPartIndex, scope.$index) }"
                                       :disabled="isReportingFillDisabled(selectedPartIndex, scope.$index)"
+                                      @focus="highlightProcessRow(scope.row)"
+                                      @click="highlightProcessRow(scope.row)"
                                       @update:model-value="(v) => onQtyInput(selectedPartIndex, scope.$index, null, v)"
                                     />
                                   </template>
@@ -624,20 +634,20 @@ watch(filteredGongfenHistoryData, relayoutGongfenHistoryTable)
 watch(staffNameFilter, relayoutGongfenHistoryTable)
 
 const gongfenHistoryHeaderCellStyle = ({ column }) => ({
-  padding: '8px 0',
-  fontSize: '18px',
+  padding: '6px 0',
+  fontSize: '16px',
   textAlign: column?.property === 'process_name' ? 'left' : 'center',
 })
 
 const gongfenHistoryCellStyle = ({ column }) => ({
-  padding: '8px 0',
-  fontSize: '18px',
+  padding: '6px 0',
+  fontSize: '16px',
   textAlign: column.property === 'process_name' ? 'left' : 'center',
 })
 
 const gongfenHistoryFooterCellStyle = ({ column }) => ({
-  padding: '8px 0',
-  fontSize: '18px',
+  padding: '6px 0',
+  fontSize: '16px',
   fontWeight: '600',
   background: '#fafafa',
   textAlign: column?.property === 'process_name' ? 'left' : 'center',
@@ -810,7 +820,10 @@ const workScoreConfirmRows = ref([]);
 const pendingReportData = ref([]);
 const workScoreSubmitting = ref(false);
 const processTableWrapRef = ref(null);
+const processTableRef = ref(null);
 const processTableHeight = ref(320);
+/** 当前点选的工艺行(用于整行粉色 + 输入框同色) */
+const activeProcessRow = ref(null);
 const batchQuantity = ref('');
 let processTableResizeObserver = null;
 
@@ -1078,6 +1091,18 @@ const fillSelectedEmployee = (row, partIndex, processIndex, staffIndex = null) =
 // 表格内输入完工数量时,若上方已选人员且本格人员为空,则自动填入
 const filterQtyDigits = (val) => String(val ?? '').replace(/[^\d]/g, '').slice(0, 5)
 
+const highlightProcessRow = (row) => {
+  activeProcessRow.value = row
+  processTableRef.value?.setCurrentRow?.(row)
+}
+
+const onProcessTableRowClick = (row) => {
+  highlightProcessRow(row)
+}
+
+const processTableRowClassName = ({ row }) =>
+  row === activeProcessRow.value ? 'work-score-process-row-active' : ''
+
 const onQtyInput = (partIndex, processIndex, staffIndex, val) => {
   const digits = filterQtyDigits(val)
   const item = getReportingData(partIndex, processIndex)
@@ -1171,6 +1196,7 @@ const autoFillStaffOnQuantityInput = (partIndex, processIndex, staffIndex = null
 const selectPart = async (index) => {
   if (index < 0 || index >= processParts.value.length) return
   selectedPartIndex.value = index
+  activeProcessRow.value = null
   if (partProcesses.value[index]?.length > 0) {
     refreshProcessTableLayout()
     return
@@ -2551,6 +2577,12 @@ const warningres = (arr) => {
   text-align: center;
   color: #303133;
 }
+/* 选中行:只高亮整行粉色,输入框保持白底 */
+.work-score-process-table-wrap :deep(.el-table__body tr.work-score-process-row-active > td.el-table__cell),
+.work-score-process-table-wrap :deep(.el-table__body tr.current-row > td.el-table__cell) {
+  background-color: #ff80ff !important;
+  background: #ff80ff !important;
+}
 .work-score-process-table-wrap :deep(.work-score-qty-over .el-input__inner) {
   color: #f56c6c !important;
 }
@@ -2662,9 +2694,17 @@ const warningres = (arr) => {
 .gongfen-history-table :deep(.el-table__footer .cell) {
   padding-left: 8px;
   padding-right: 8px;
+  line-height: 24px;
   box-sizing: border-box;
 }
 
+.gongfen-history-table :deep(.el-table__header th),
+.gongfen-history-table :deep(.el-table__body td),
+.gongfen-history-table :deep(.el-table__footer td) {
+  padding-top: 4px !important;
+  padding-bottom: 4px !important;
+}
+
 .gongfen-history-table :deep(.el-table__footer-wrapper td) {
   font-weight: 600;
   background: #fafafa;
@@ -3012,6 +3052,38 @@ const warningres = (arr) => {
 </style>
 
 <style>
+/* 工分报工工艺表:选中/悬停整行粉色;完工人员、完工数量输入框保持白底 */
+.work-score-process-table .el-table__body tr.work-score-process-row-active > td.el-table__cell,
+.work-score-process-table .el-table__body tr.current-row > td.el-table__cell,
+.work-score-process-table .el-table__body tr:hover > td.el-table__cell {
+  background-color: #ff80ff !important;
+  background: #ff80ff !important;
+}
+.work-score-process-table .el-table__body tr.work-score-process-row-active .work-score-qty-input,
+.work-score-process-table .el-table__body tr.current-row .work-score-qty-input,
+.work-score-process-table .el-table__body tr:hover .work-score-qty-input,
+.work-score-process-table .el-table__body tr.work-score-process-row-active .work-score-staff-input,
+.work-score-process-table .el-table__body tr.current-row .work-score-staff-input,
+.work-score-process-table .el-table__body tr:hover .work-score-staff-input {
+  --el-input-bg-color: #ffffff;
+  --el-fill-color-blank: #ffffff;
+}
+.work-score-process-table .el-table__body tr.work-score-process-row-active .work-score-qty-input .el-input__wrapper,
+.work-score-process-table .el-table__body tr.current-row .work-score-qty-input .el-input__wrapper,
+.work-score-process-table .el-table__body tr:hover .work-score-qty-input .el-input__wrapper,
+.work-score-process-table .el-table__body tr.work-score-process-row-active .work-score-staff-input .el-input__wrapper,
+.work-score-process-table .el-table__body tr.current-row .work-score-staff-input .el-input__wrapper,
+.work-score-process-table .el-table__body tr:hover .work-score-staff-input .el-input__wrapper,
+.work-score-process-table .el-table__body tr.work-score-process-row-active .work-score-qty-input .el-input__wrapper.is-focus,
+.work-score-process-table .el-table__body tr.current-row .work-score-qty-input .el-input__wrapper.is-focus,
+.work-score-process-table .el-table__body tr:hover .work-score-qty-input .el-input__wrapper.is-focus,
+.work-score-process-table .el-table__body tr.work-score-process-row-active .work-score-staff-input .el-input__wrapper.is-focus,
+.work-score-process-table .el-table__body tr.current-row .work-score-staff-input .el-input__wrapper.is-focus,
+.work-score-process-table .el-table__body tr:hover .work-score-staff-input .el-input__wrapper.is-focus {
+  background-color: #ffffff !important;
+  background: #ffffff !important;
+}
+
 /* 确认报工弹窗:固定尺寸 + 内容居中放大(append-to-body 用全局样式) */
 .work-score-confirm-dialog.el-dialog,
 .work-score-confirm-dialog {

+ 9209 - 8951
src/view/yunyin/shengchanguanli/gongdanziliao.vue

@@ -1,8952 +1,9210 @@
-<template>
-	<div>
-	  <layout>
-		<layout-header>
-		  <div class="">
-			<!--按钮部分-->
-			<el-form ref="elSearchFormRef" class="demo-form-inline" @submit.prevent="onSubmit">
-			  <el-form-item>
-				<el-input v-model="searchInfo" placeholder="查询订单编号、生产款号" style="width: 180px;" @keydown.enter.prevent="onSubmit" />
-				<el-button type="primary" native-type="button" icon="search" @click="onSubmit" title="查询">查询</el-button>
-				<el-button type="primary" icon="edit"   @click="cp_gdprintonClick" class="bt" title="打印生产订单" >订单打印</el-button>
-				<el-button type="primary" class="bt" icon="edit"  @click="jsfjClick">附件上传</el-button> 
-				<el-button type="primary" icon="edit"   @click="addgd_onclick"   class="bt"   title="新增工单资料">新增订单资料</el-button>
-				<el-button type="primary" icon="edit"   @click="addgdyj_onclick"   class="bt" title="新增颜色资料">新增颜色资料</el-button>
-				<!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openPartAdd">新增部件资料</el-button> -->
-				<!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openProcessAdd">新增工艺资料</el-button> -->
-				<!-- <el-button type="primary" icon="Sort" class="bt" :disabled="!_Gd_gdbh" @click="openSortDialog">部件与工艺排序</el-button> -->
-				<el-button type="primary" icon="edit"   @click="BOMclick"   class="bt"   title="BOM面料">批量修改新增BOM资料</el-button>
-				<el-button type="danger" icon="edit"   @click="del_ddzlClick" 	v-if="table_del=== true" :disabled="table_Selection === ''"  class="bt" title="选中复选框进行删除订单数据">删除订单资料</el-button>
-				<el-button type="danger" icon="edit"   @click="delgd_delclick"  	v-if="delall=== true" :disabled="ysSelection === ''"  class="bt" title="选中复选框进行删除颜色数据">删除颜色资料</el-button>
-				<!-- <el-button type="danger" icon="edit"   @click="delgy_delclick"  	v-if="delall=== true" :disabled="gySelection === ''"  class="bt" title="选中复选框进行删除工艺数据">删除工艺资料</el-button> -->
-				<el-button type="primary" icon="edit"   @click="copyProductData"  :disabled="!_Gd_gdbh"  class="bt" title="复制订单工艺">复制订单工艺</el-button>
-				<el-button type="primary" icon="upload" @click="openImportProcessDialog" :disabled="!_Gd_gdbh" class="bt" title="导入工艺资料">导入工艺资料</el-button>
-				<el-button type="primary" icon="search" :loading="processProductionChecking" @click="openProcessProductionDialog" :disabled="!_Gd_gdbh" class="bt" title="工序产量核查">工序产量核查</el-button>
-
-				<!-- <el-button type="primary" icon="edit"   @click="delbom_delclick"  	v-if="del_bom=== true" :disabled="bom_Selection === '' "  class="bt" title="选中复选框进行删除bom数据">删除bom资料</el-button> -->
-				
-				<!-- <el-button type="primary" icon="edit"   @click="CSclick"   class="bt"   title="库存测试">库存测试</el-button> -->
-			  </el-form-item>
-			</el-form>
-		  </div> 
-		</layout-header>
-		<layout>
-  
-		  <!-- 左侧树形结构 -->
-		  <layout-sider :resize-directions="['right']" :width="190" style="margin: 0px;">
-			<div class="JKWTree-tree" style="height: 200px">
-			  <h3>客户编号</h3>
-			  <el-tree :data="treeData" class="treecolor" @node-click="handleNodeClick"></el-tree>
-			</div>
-		  </layout-sider>
-  
-		  <!-- 右侧内容区域 -->
-		  <layout-content >
-			<el-main>
-			  <!-- 订单表格列表 -->
-			  <div class="gva-table-box">
-				<el-table ref="multipleTable" style="width: 100%;height: 28vh"
-						  :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
-						  :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-						  border tooltip-effect="dark" 
-						  v-loading="loading" 
-						  element-loading-text="拼命加载中"
-						  element-loading-spinner="el-icon-loading"
-						  element-loading-background="rgba(0, 0, 0, 0.8)"
-						  :data="tableData" :row-key="ddzlTableRowKey"
-						  highlight-current-row="true"
-						  :cell-class-name="tableDataCellClass"
-						  @row-click="tableRowClick" @row-dblclick="updateCompanyFunc"
-						  @selection-change="ddzlSelectionChange" :show-overflow-tooltip="true">
-				  <el-table-column align="center" type="selection" width="40"/>
-				  <el-table-column align="center" prop="status" width="75">
-					<template #header>
-					  <el-tooltip
-						content='「技术附件」列显示 “*” 表示该订单尚未上传对应附件'
-						placement="top"
-						effect="dark"
-					>
-						<span class="fj-col-header">
-						  附件
-						  <el-icon class="fj-col-help"><QuestionFilled /></el-icon>
-						</span>
-					  </el-tooltip>
-					</template>
-				  </el-table-column>
-				  <el-table-column align="left"   label="订单编号" prop="订单编号" 	width="105" sortable/>
-				  <el-table-column align="left"   label="客户"     prop="客户编号" 		width="68" />
-				  <el-table-column align="left"   label="款号"     prop="生产款号"  width="200" />
-				  <el-table-column align="left"   label="款式"     prop="款式"   	width="100"/> 
-				  <el-table-column align="left"   label="数量"     prop="订单数量" 	width="70" />
-				  <el-table-column align="center" label="状态" 	   prop="gd_statu" width="125" sortable>
-				      <template #default="{ row }">
-				        <el-tag :type="row.gd_statu === '1-计划中' ? 'warning' : 
-				                       (row.gd_statu === '已裁剪' ? 'primary' : 
-				                       (row.gd_statu === '已车缝' ? '' : 
-				                       (row.gd_statu === '2-生产中' ? 'success' :
-				                       (row.gd_statu.includes('总检已') ? 
-				                         (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? 'success' : 'info') : 
-				                       (row.gd_statu === '已完工' ? 'success' : 'info')))))">
-				              {{ row.gd_statu === '1-计划中' ? '计划中' : 
-				                 (row.gd_statu === '已裁剪' ? '已裁剪' : 
-				                 (row.gd_statu === '已车缝' ? '已车缝' : 
-				                 (row.gd_statu === '2-生产中' ? '生产中' :
-				                 (row.gd_statu.includes('总检已') ? 
-				                   (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? '已完工' : row.gd_statu.replace('总检已', '总检')) : 
-				                 row.gd_statu)))) }}
-				        </el-tag>
-				      </template>
-				  </el-table-column>
-				  <el-table-column align="left"  label="落货日期"   	prop="落货日期" 	width="98" />
-				  <el-table-column align="left"  label="船样"    		prop="船样合计" 	width="55" />
-				  <el-table-column align="left"  label="船样描述"    	prop="船样描述" 	width="130" />
-				  <el-table-column align="left"  label="单位"    		prop="单位" 		width="55" />
-				  <el-table-column align="left"  label="面料"       	prop="面料" 		width="180" />
-				  <el-table-column align="left"  label="备注"       	prop="要求" 		width="180" />
-				  <el-table-column align="left"  label="计划制造工分"    prop="计划制造工分"		width="180" />
-				  <el-table-column align="left"  label="粘衬"        	prop="粘衬"		width="180" />
-				  <el-table-column align="left"  label="箱唛要求"   	prop="箱唛要求" 	width="180" />
-				  <el-table-column align="left"  label="制单人"    	prop="Sys_id" 	width="160" />
-				  <el-table-column align="left"  label="制单日期"    	prop="Sys_rq" 	width="160" />
-				</el-table>
-				<!-- 分页 -->
-				<div class="gva-pagination">
-				<el-pagination
-					@size-change="handleSizeChange"
-					@current-change="handleCurrentChange"
-					:current-page="page"
-					:page-sizes="[10, 30, 50, 100]"
-					:page-size="pageSize"
-					layout="total, sizes, prev, pager, next, jumper"
-					:total="total">
-				</el-pagination>
-			  </div>
-			  </div>
-  
-			  <!-- 颜色资料列表、部件资料列表、工艺资料列表、BOM资料列表  -->
-			  <el-tabs v-model="activeName" @tab-click="handleClick">
-				<el-tab-pane label="颜色资料"   name="first">
-				  <el-table ref="multipleTable"
-						  :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
-						  :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-							:show-overflow-tooltip="true"
-							highlight-current-row="true"
-							@row-click="ystableclick"
-							@row-dblclick="ysupdateCompanyFunc"
-							@selection-change="selectionChange($event, '颜色资料')"
-							style="width: 100%;height: 36vh" border show-summary
-							:summary-method="getSummaries" tooltip-effect="dark" :data="ystableData" :row-key="ysColorTableRowKey">
-					<el-table-column type="selection" width="30" />
-					<el-table-column align="left" sortable label="子订单编号" prop="子订单编号"  width="140"/>
-					<el-table-column align="left" sortable label="PO号	" prop="款号"  width="180"/>
-					<el-table-column align="left" sortable label="颜色备注" prop="颜色备注"  width="110"/>
-					<el-table-column align="left" sortable label="色系名称" prop="颜色"  width="110"/>
-					<el-table-column align="left" sortable label="船样" prop="船样"  width="80"/>
-					<!-- 尺码列表 -->
-					<template v-for="item in sizeDatas">
-					  <el-table-column align="left" sortable :label=item :prop=item  width="80"/> 
-					</template>
-					<el-table-column align="left" sortable label="制单总数" prop="zdtotal"  width="110"/>
-					<el-table-column align="left" sortable label="创建用户" prop="Sys_id"  width="160"/>
-					<el-table-column align="left" sortable label="创建日期" prop="Sys_rq"  width="160"/>
-					<el-table-column align="left" sortable label="修改时间" prop="更新时间"  width="160"/>
-				  </el-table>
-				</el-tab-pane>
-
-				<!-- <el-tab-pane label="部件资料" name="part">
-				  <el-table ref="multipleTable"
-					:row-style="{ height: '20px' }"
-					:cell-style="{ padding: '0px' }"
-					:header-row-style="{ height: '20px' }"
-					:header-cell-style="{ padding: '0px' }"
-					highlight-current-row="true"
-					:show-overflow-tooltip="true"
-					size="small"
-					@row-click="partTableRowClick"
-					@row-dblclick="partRowDblclick"
-					@selection-change="selectionChange($event, '部件资料')"
-					style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="parttableData" row-key="部件ID">
-					<el-table-column type="selection" width="30" />
-					<el-table-column align="left" label="部件编号" prop="部件编号" width="80"/>
-					<el-table-column align="left" label="部件名称" prop="部件名称" width="150"/>
-					<el-table-column align="left" label="部件类型" prop="部件类型" width="120"/>
-					<el-table-column align="left" label="部件备注" prop="部件备注" width="150"/>
-					<el-table-column align="left" label="录入人" prop="操作人" width="100"/>
-					<el-table-column align="left" label="录入时间" prop="操作时间" width="160"/>
-					<el-table-column align="left" label="修改人" prop="修改人" width="100"/>
-					<el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
-				  </el-table>
-				</el-tab-pane> -->
-
-				<el-tab-pane label="工艺资料" name="second">
-				  <el-table ref="multipleTable"
-							:row-style="{ height: '20px' }"
-							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-							:header-cell-style="{ padding: '0px' }"
-							highlight-current-row="true"
-							:show-overflow-tooltip="true"
-							size="small"
-							:cell-class-name="gysatusCellClass"
-							@row-dblclick="gdgyupdateCompanyFunc"
-							@row-click="clickybupdate2"
-							:row-class-name="rowClassStyle2"
-							@selection-change="selectionChange($event, '工艺资料')"
-							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="gytableData" row-key="id"
-							:summary-method="gySummaries"
-							show-summary>
-					<!-- <el-table-column align="left" label="部件编号" prop="部件编号" width="80"/> -->
-					<el-table-column align="center" label="部件名称" prop="部件名称" width="80"/>
-					<el-table-column align="center" label="工序编号" prop="工艺编号" width="75"/>
-					<el-table-column align="left" label="工序名称" prop="工艺名称" width="200"/>
-					<el-table-column align="center" label="生产工序" prop="大工艺" width="75"/>
-					<!-- <el-table-column align="left" label="秒" prop="标准工时" width="80"/> -->
-					<el-table-column align="center" label="工分" prop="标准公分" width="75"/>
-					<el-table-column align="left" label="备注" prop="备注" width="150"/>
-					<el-table-column align="center" label="难度系数" prop="系数" width="80"/>
-					<el-table-column align="left" label="录入人" prop="系统人" width="100"/>
-					<el-table-column align="left" label="录入时间" prop="系统时间" width="160"/>
-					<el-table-column align="left" label="修改人" prop="修改人" width="100"/>
-					<el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
-				  </el-table>
-				</el-tab-pane>
-  
-				<el-tab-pane label="订单资料附件" name="third">
-				  <el-table ref="multipleTable"
-							:row-style="{ height: '30px' }"
-							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '30px' }"
-							:header-cell-style="{ padding: '0px' }"
-							:show-overflow-tooltip="true"
-							:cell-class-name="planUsageCellClass"
-							highlight-current-row="true"
-							@row-dblclick="gdbomupdateCompanyFunc"
-							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="ddtableData" row-key="ID"
-							 @selection-change="fjSelectionChange">
-					<el-table-column align="left" label="关联编号" prop="关联编号"  width="115"/>
-					<el-table-column align="left" label="附件备注" 	prop="附件备注"  width="110"/>
-					<el-table-column align="left" label="文件类型" prop="附件类型"  width="100"/>
-					<el-table-column align="left" label="版本号" prop="version"  width="80"/>
-					<el-table-column align="left" label="建档用户" prop="sys_id"  width="160"/>
-					<el-table-column align="left" label="建档时间" prop="sys_rq"  width="160"/>
-				  <!-- 操作列,新增修改和删除按钮 -->
-				  <el-table-column align="left" label="操作" width="230" fixed="right">
-					<template #default="scope">
-					  <!-- PDF预览按钮 -->
-					  <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
-					  <!-- 删除按钮 -->
-					  <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
-					</template>
-				  </el-table-column>
-				  </el-table>
-				</el-tab-pane> 
-				
-				
-  
-				<el-tab-pane label="技术附件" name="fourth">
-				  <el-table ref="multipleTable"
-					:row-style="{ height: '30px' }"
-					:cell-style="{ padding: '0px' }"
-					:header-row-style="{ height: '30px' }"
-					:header-cell-style="{ padding: '0px' }"
-					:show-overflow-tooltip="true"
-					:cell-class-name="planUsageCellClass"
-					highlight-current-row="true"
-					@row-dblclick="ExcelShow"
-					style="width: 100%;height: 36vh"
-					border tooltip-effect="dark"
-					:data="jstableData"
-					row-key="ID"
-					@selection-change="fjSelectionChange">
-				
-					<el-table-column align="left" label="关联编号" prop="关联编号" width="115"/>
-					<el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
-					<el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
-					<el-table-column align="left" label="版本号" prop="version" width="80"/>
-					<el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
-					<el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
-					
-					<!-- 操作列,新增修改和删除按钮 -->
-					<el-table-column align="left" label="操作" width="230" fixed="right">
-					  <template #default="scope">
-						<!-- PDF预览按钮 -->
-						<el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
-						<!-- 删除按钮 -->
-						<el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
-					  </template>
-					</el-table-column>
-				  </el-table>
-				</el-tab-pane>
-
-
-				<el-tab-pane label="发货单附件" name="fourths">
-				  <el-table ref="multipleTable"
-					:row-style="{ height: '30px' }"
-					:cell-style="{ padding: '0px' }"
-					:header-row-style="{ height: '30px' }"
-					:header-cell-style="{ padding: '0px' }"
-					:show-overflow-tooltip="true"
-					:cell-class-name="planUsageCellClass"
-					highlight-current-row="true"
-					@row-dblclick="ExcelShow"
-					style="width: 100%;height: 36vh"
-					border tooltip-effect="dark"
-					:data="fhdtableData"
-					row-key="ID"
-					@selection-change="fhdSelectionChange">
-					<el-table-column align="left" label="发货单号" prop="rand_number" width="160"/>
-					<el-table-column align="left" label="订单编号" prop="关联编号" width="115"/>
-					<el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
-					<el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
-					<el-table-column align="left" label="版本号" prop="version" width="80"/>
-					<el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
-					<el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
-					
-					<!-- 操作列,新增修改和删除按钮 -->
-					<el-table-column align="left" label="操作" width="330" fixed="right">
-					  <template #default="scope">
-						<!-- PDF预览按钮 -->
-						<el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
-						<el-button type="primary" size="small" @click="fahuodan(scope.row)">获取发货数量</el-button>
-						<!-- 删除按钮 -->
-						<el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
-					  </template>
-					</el-table-column>
-				  </el-table>
-				</el-tab-pane>
-  
-  
-			<el-tab-pane label="BOM资料"  name="six">
-				  <el-table ref="multipleTable"
-							:row-style="{ height: '20px' }"
-							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-							:header-cell-style="{ padding: '0px' }"
-							:show-overflow-tooltip="true"
-							:cell-class-name="planUsageCellClass"
-							highlight-current-row="true"
-							@row-dblclick="bombomupdateCompanyFunc"
-							@selection-change="bomSelectionChange"
-							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="bomtableData" row-key="ID">
-				   <!-- <el-table-column type="selection" width="30" /> -->
-					<el-table-column align="left" label="订单编号" prop="订单编号"  width="105"/>
-					<el-table-column align="left" label="物料分类" prop="物料分类"  width="100"/>
-					<el-table-column align="left" label="物料名称" prop="物料名称"  width="210"/>
-					<el-table-column align="left" label="计划入库时间" prop="计划入库时间"  width="160" />
-					<el-table-column align="left" label="计划用料" prop="计划用料"  width="90" />
-					<el-table-column align="left" label="计划门幅" prop="计划门幅"  width="90"/>
-					<el-table-column align="left" label="定额用料" prop="定额用料"  width="90"/>
-					<el-table-column align="left" label="定额门幅" prop="定额门幅"  width="90"/>
-					<el-table-column align="left" label="备注" prop="备注"  width="240"/>
-					<el-table-column align="left" label="更新用户" prop="ID"  width="90"/>
-					<el-table-column align="left" label="更新日期" prop="日期"  width="160"/>
-					<!-- <el-table-column align="left" label="UNIQID" prop="UNIQID"  width="80"/> -->
-				  </el-table>
-				</el-tab-pane>
-  
-				<el-tab-pane label="面料库存" name="seven">
-				  <el-table ref="multipleTable"
-						  :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
-						  :cell-style="{ padding: '0px' }" :header-row-style="{ height: '25px' }"
-							:show-overflow-tooltip="true"
-							:cell-class-name="planUsageCellClass"
-							highlight-current-row="true"
-							@row-dblclick="mlupdateCompanyFunc"
-							:summary-method="mlgetSummaries" 
-							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="mltableData" row-key="ID" @selection-change="handleSelectionChange">
-  <!--                  <el-table-column type="selection" width="30" />-->
-					<!-- <el-table-column type="selection" width="30" /> -->
-					<el-table-column align="left" label="订单编号" prop="订单编号"  width="110"/>
-					<!-- <el-table-column align="left" label="客户编号" prop="客户编号"  width="100"/>
-					<el-table-column align="left" label="生产款号" prop="生产款号"  width="100"/>
-					<el-table-column align="left" label="款式" prop="款式"  width="90"/> -->
-					<el-table-column align="left" label="颜色" prop="颜色"  width="110"/>
-					<el-table-column align="left" label="物料编号" prop="物料编码"  width="220"/>
-					<el-table-column align="left" label="物料名称" prop="物料名称"  width="180"/>
-					<el-table-column align="left" label="定额用料" prop="定额用料"  width="90"/>
-					<el-table-column align="left" label="定额门幅" prop="定额门幅"  width="90"/>
-					<el-table-column align="left" label="入库总量" prop="入仓总量"  width="90"/>
-					<el-table-column align="left" label="领用数量" prop="领用数量"  width="90"/>
-					<el-table-column align="left" label="面料结余" prop="库存数量"  width="90"/>
-					<el-table-column align="left" label="单位" prop="单位"  width="60"/>
-					<el-table-column align="left" label="备注" prop="备注"  width="200"/>
-					<el-table-column align="left" label="关联订单" prop="关联订单"  width="200"/>
-					<el-table-column align="left" label="更新用户" prop="Sys_ID"  width="160"/>
-					<el-table-column align="left" label="更新日期" prop="Sys_rq"  width="160"/>
-				  </el-table>
-				</el-tab-pane>
-			  </el-tabs>
-  
-				
-		   <!-- 工艺资料详情弹窗 -->
-		   <el-dialog v-model="gyDetailDialogVisible" :before-close="closeGyDetailDialog" 
-		   style="width: 100vw; height: 100vh; margin: 0; padding: 0; top: 0; left: 0;"
-		   destroy-on-close class="gy-detail-dialog" :show-close="false">
-		     <template #header>
-		       <div class="gy-detail-dialog-header">
-		         <div class="gy-detail-dialog-title-row">
-		           <span class="gy-detail-dialog-title">工艺资料详情</span>
-		         </div>
-		         <div class="gy-detail-dialog-toolbar-row">
-		           <div class="gy-detail-dialog-actions-left">
-		             <el-button type="primary" @click="openGyDetailProcessAdd">增加</el-button>
-		             <el-button type="danger" :disabled="!gyDetailSelection.length || gyDetailDeleting" :loading="gyDetailDeleting" @click="handleGyDetailBatchDelete">删除</el-button>
-		             <el-button type="primary" @click="handleGyDetailPrintPreview">打印预览</el-button>
-             <el-button type="success" v-if="!gyDetailReadonly" :loading="gyDetailSaving" @click="handleGyDetailSave">保存</el-button>
-		           </div>
-		           <el-button type="danger" class="gy-detail-dialog-exit" @click="closeGyDetailDialog">退出</el-button>
-		         </div>
-		       </div>
-		     </template>
-		     <div class="gy-detail-dialog-body">
-		       <!-- 上方信息 -->
-		       <div style="margin-bottom: 15px; overflow-x: auto;">
-		         <el-row :gutter="20" style="width: max-content; display: flex; align-items: center;">
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 80px; text-align: right; margin-right: 8px;">订单编号:</span>
-		             <el-input v-model="gyDetailFormData.订单编号" disabled style="width: 100px;" />
-		           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 80px; text-align: right; margin-right: 8px;">客户编号:</span>
-		             <el-input v-model="gyDetailFormData.客户编号" disabled style="width: 70px;" />
-		           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 80px; text-align: right; margin-right: 8px;">生产款号:</span>
-		             <el-input v-model="gyDetailFormData.生产款号" disabled style="width: 280px;" />
-		           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 60px; text-align: right; margin-right: 8px;">款式:</span>
-		             <el-input v-model="gyDetailFormData.款式" disabled style="width: 200px;" />
-		           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 60px; text-align: right; margin-right: 8px;">接单日期:</span>
-		             <el-input v-model="gyDetailFormData.接单日期" disabled style="width: 120px;" />
-		           </div>
-				   <div style="display: flex; align-items: center; white-space: nowrap;">
-                     <span
-                       style="width: 60px; text-align: right; margin-right: 8px; cursor: pointer;"
-                       @click="startGyDetailPlanManufactureEdit"
-                     >备注:</span>
-                     <el-input
-                       v-model="gyDetailFormData.备注"
-                       style="width: 200px;"
-                       :readonly="!gyDetailPlanManufactureEditing"
-                       @click="startGyDetailPlanManufactureEdit"
-                     />
-                   </div>
-                 </el-row>
-		         <el-row :gutter="20" style="width: max-content; display: flex; align-items: center; margin-top: 10px;">
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 80px; text-align: right; margin-right: 8px;">落货日期:</span>
-		             <el-input v-model="gyDetailFormData.落货日期" disabled style="width: 120px;" />
-		           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span style="width: 80px; text-align: right; margin-right: 8px;">制单日期:</span>
-		             <el-input v-model="gyDetailFormData.制单日期" disabled style="width: 160px;" />
-		           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-             <span style="width: 60px; text-align: right; margin-right: 8px;">制单人:</span>
-             <el-input v-model="gyDetailFormData.制单人" disabled style="width: 70px;" />
-           </div>
-           <div style="display: flex; align-items: center; white-space: nowrap;">
-             <span style="width: 90px; text-align: right; margin-right: 8px;">工单完工日期:</span>
-             <el-date-picker
-               v-model="gyDetailFormData.工单完工日期"
-               type="date"
-               value-format="YYYY-MM-DD"
-               format="YYYY-MM-DD"
-               clearable
-               placeholder="选择日期"
-               style="width: 140px;"
-             />
-           </div>
-           <div style="display: flex; align-items: center; white-space: nowrap;">
-             <span style="width: 80px; text-align: right; margin-right: 8px;">订单数量:</span>
-             <el-input v-model="gyDetailFormData.订单数量" disabled style="width: 80px;" />
-           </div>
-		           <div style="display: flex; align-items: center; white-space: nowrap;">
-		             <span
-		               style="width: 100px; text-align: right; margin-right: 8px; cursor: pointer;"
-		               @click="startGyDetailPlanManufactureEdit"
-		             >计划制造工分:</span>
-		             <el-input
-		               :model-value="gyDetailFormData.计划制造工分"
-		               style="width: 80px;"
-		               :readonly="!gyDetailPlanManufactureEditing"
-		               inputmode="decimal"
-		               @click="startGyDetailPlanManufactureEdit"
-		               @update:model-value="onGyDetailPlanManufactureInput"
-		             />
-		             <template v-if="gyDetailPlanManufactureEditing">
-                       <el-button style="margin-left: 10px;" @click="cancelGyDetailPlanManufactureEdit">取消</el-button>
-                       <el-button type="primary" style="margin-left: 8px;" :loading="gyDetailPlanManufactureSaving" @click="confirmGyDetailPlanManufactureEdit">保存</el-button>
-                     </template>
-                   </div>
-                 </el-row>
-               </div>
-		       
-		       <!-- 工艺列表表格(虚拟滚动 + 底部横向滚动条) -->
-		       <div ref="gyDetailTableWrapRef" class="gy-detail-table-wrap">
-		         <vxe-table
-		           ref="gyDetailTableRef"
-		           border
-		           size="small"
-		           show-overflow
-		           auto-resize
-		           :height="gyDetailTableHeight"
-		           :min-width="gyDetailTableMinWidth"
-		           :data="gyDetailDisplayProcessList"
-		           :row-config="{ keyField: '_rowKey', isHover: true, isCurrent: true, height: 28 }"
-		           :cell-config="{ height: 28, padding: false }"
-		           :scroll-y="{ enabled: true, gt: 30 }"
-		           :scroll-x="{ enabled: true }"
-		           :column-config="{ resizable: true, minWidth: 56 }"
-		           :checkbox-config="{ trigger: 'default', highlight: false }"
-		           show-footer
-		           :footer-method="gyDetailFooterMethod"
-		           class="gy-detail-vxe-table"
-		           @checkbox-change="handleGyDetailCheckboxChange"
-		           @checkbox-all="handleGyDetailCheckboxChange"
-		         >
-		           <vxe-column type="checkbox" width="55" fixed="left" align="center" header-align="center" />
-		           <vxe-column field="部件编号" title="部件编号" width="75" align="center" header-align="center" />
-		           <vxe-column field="部件名称" width="120" align="center" header-align="center">
-		             <template #header>
-		               <div class="gy-detail-col-header">
-		                 <span>部件名称</span>
-		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
-		                   <template #reference>
-		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions) }" @click.stop>
-		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
-		                     </span>
-		                   </template>
-		                   <div class="gy-detail-filter-panel">
-		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailBuJianMingChengFilter" @change="handleGyDetailBuJianMingChengFilterChange">
-		                       <el-checkbox v-for="item in gyDetailBuJianMingChengFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
-		                     </el-checkbox-group>
-		                     </div>
-		                     <div class="gy-detail-filter-actions">
-		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailBuJianMingChengFilter">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailBuJianMingChengFilter">全选</span>
-		                     </div>
-		                   </div>
-		                 </el-popover>
-               </div>
-             </template>
-             <template #default="{ row }">
-               <span v-if="!isGyDetailCellEditable('部件名称') && !isGyDetailCellEditing(row, '部件名称')">{{ row.部件名称 }}</span>
-               <template v-else>
-                 <div v-if="!isGyDetailCellEditing(row, '部件名称')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '部件名称')">{{ formatGyDetailCellText(row.部件名称) }}</div>
-                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.部件名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '部件名称')" />
-               </template>
-             </template>
-           </vxe-column>
-           <vxe-column field="工序编号" title="工序编号" width="100" align="center" header-align="center" />
-		           <vxe-column field="工序名称" title="工序名称" width="320" align="left" header-align="center">
-		             <template #default="{ row }">
-               <span v-if="!isGyDetailCellEditable('工序名称') && !isGyDetailCellEditing(row, '工序名称')">{{ row.工序名称 }}</span>
-               <template v-else>
-                 <div v-if="!isGyDetailCellEditing(row, '工序名称')" class="gy-detail-cell gy-detail-cell--wide" @click.stop="startGyDetailCellEdit(row, '工序名称')">{{ formatGyDetailCellText(row.工序名称) }}</div>
-                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.工序名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '工序名称')" />
-               </template>
-             </template>
-		           </vxe-column>
-		           <vxe-column field="大工序" width="110" align="center" header-align="center">
-		             <template #header>
-		               <div class="gy-detail-col-header">
-		                 <span>生产工序</span>
-		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
-		                   <template #reference>
-		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailDaGongXuFilter, dagongxuFilters) }" @click.stop>
-		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
-		                     </span>
-		                   </template>
-		                   <div class="gy-detail-filter-panel">
-		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailDaGongXuFilter" @change="handleGyDetailDaGongXuFilterChange">
-		                       <el-checkbox v-for="item in dagongxuFilters" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
-		                     </el-checkbox-group>
-		                     </div>
-		                     <div class="gy-detail-filter-actions">
-		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailDaGongXuFilter">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailDaGongXuFilter">全选</span>
-		                     </div>
-		                   </div>
-		                 </el-popover>
-		               </div>
-		             </template>
-		             <template #default="{ row }">
-               <span v-if="!isGyDetailCellEditable('大工序') && !isGyDetailCellEditing(row, '大工序')">{{ row.大工序 }}</span>
-               <template v-else>
-                 <div v-if="!isGyDetailCellEditing(row, '大工序')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '大工序')">{{ formatGyDetailCellText(row.大工序) }}</div>
-                 <el-select
-                   v-else
-                   :ref="setGyDetailCellInputRef"
-                   v-model="row.大工序"
-                   size="small"
-                   class="gy-detail-cell-input gy-detail-cell-select"
-		                   filterable
-		                   @change="finishGyDetailCellEdit(row)"
-		                 >
-		                   <el-option v-for="opt in gyDetailDaGongXuOptions" :key="opt" :label="opt" :value="opt" />
-		                 </el-select>
-		               </template>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="秒" title="秒" width="80" align="center" header-align="center">
-		             <template #default="{ row }">
-		               <span v-if="gyDetailReadonly">{{ row.秒 }}</span>
-		               <template v-else>
-		                 <div v-if="!isGyDetailCellEditing(row, '秒')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '秒')">{{ formatGyDetailCellText(row.秒) }}</div>
-		                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.秒" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '秒', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '秒')" />
-		               </template>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="分" title="分" width="80" align="center" header-align="center">
-		             <template #default="{ row }">
-		               <span v-if="gyDetailReadonly">{{ row.分 }}</span>
-		               <template v-else>
-		                 <div v-if="!isGyDetailCellEditing(row, '分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '分')">{{ formatGyDetailCellText(row.分) }}</div>
-		                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '分')" />
-		               </template>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="定额分" title="工分" width="80" align="center" header-align="center">
-		             <template #default="{ row }">
-               <span v-if="!isGyDetailCellEditable('工分') && !isGyDetailCellEditing(row, '定额分')">{{ row.定额分 }}</span>
-               <template v-else>
-                 <div v-if="!isGyDetailCellEditing(row, '定额分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '定额分')">{{ formatGyDetailCellText(row.定额分) }}</div>
-                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.定额分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '定额分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '定额分')" />
-               </template>
-             </template>
-		           </vxe-column>
-		           <vxe-column field="金额" title="金额" width="80" align="center" header-align="center">
-		             <template #default="{ row }">
-		               <span v-if="gyDetailReadonly">{{ row.金额 }}</span>
-		               <template v-else>
-		                 <div v-if="!isGyDetailCellEditing(row, '金额')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '金额')">{{ formatGyDetailCellText(row.金额) }}</div>
-		                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.金额" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '金额', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '金额')" />
-		               </template>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="难度系数" width="110" align="center" header-align="center">
-		             <template #header>
-		               <div class="gy-detail-col-header">
-		                 <span>难度系数</span>
-		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
-		                   <template #reference>
-		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions) }" @click.stop>
-		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
-		                     </span>
-		                   </template>
-		                   <div class="gy-detail-filter-panel">
-		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailNanDuXiShuFilter" @change="handleGyDetailNanDuXiShuFilterChange">
-		                       <el-checkbox v-for="item in gyDetailDifficultyFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
-		                     </el-checkbox-group>
-		                     </div>
-		                     <div class="gy-detail-filter-actions">
-		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailNanDuXiShuFilter">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailNanDuXiShuFilter">全选</span>
-		                     </div>
-		                   </div>
-		                 </el-popover>
-		               </div>
-		             </template>
-		             <template #default="{ row }">
-		               <span v-if="gyDetailReadonly">{{ row.难度系数 }}</span>
-		               <template v-else>
-		                 <div v-if="!isGyDetailCellEditing(row, '难度系数')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '难度系数')">{{ formatGyDetailCellText(row.难度系数) }}</div>
-		                 <el-select
-		                   v-else
-		                   :ref="setGyDetailCellInputRef"
-		                   v-model="row.难度系数"
-		                   size="small"
-		                   class="gy-detail-cell-input gy-detail-cell-select"
-		                   @change="finishGyDetailCellEdit(row)"
-		                 >
-		                   <el-option v-for="opt in gyDetailDifficultyOptions" :key="opt" :label="opt" :value="opt" />
-		                 </el-select>
-		               </template>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="备注" title="备注" width="140" align="center" header-align="center">
-		             <template #default="{ row }">
-		               <span v-if="gyDetailReadonly">{{ row.备注 }}</span>
-		               <template v-else>
-		                 <div v-if="!isGyDetailCellEditing(row, '备注')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '备注')">{{ formatGyDetailCellText(row.备注) }}</div>
-		                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.备注" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" />
-		               </template>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="状态" width="80" align="center" header-align="center">
-		             <template #header>
-		               <div class="gy-detail-col-header">
-		                 <span>状态</span>
-		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
-		                   <template #reference>
-		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions) }" @click.stop>
-		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
-		                     </span>
-		                   </template>
-		                   <div class="gy-detail-filter-panel">
-		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailZhuangTaiFilter" @change="handleGyDetailZhuangTaiFilterChange">
-		                       <el-checkbox v-for="item in gyDetailStatusFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
-		                     </el-checkbox-group>
-		                     </div>
-		                     <div class="gy-detail-filter-actions">
-		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailZhuangTaiFilter">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailZhuangTaiFilter">全选</span>
-		                     </div>
-		                   </div>
-		                 </el-popover>
-		               </div>
-		             </template>
-		             <template #default="{ row }">
-		               <div class="gy-detail-status-cell">{{ formatGyDetailStatus(row.状态) }}</div>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="_gyAction" title="操作" width="100" fixed="right" align="center" header-align="center">
-		             <template #default="{ row }">
-		               <div class="gy-detail-action-cell">
-		               <el-button
-		                 v-if="isGyDetailRowSplit(row)"
-		                 size="small"
-		                 type="warning"
-		                 @click="handleUndoSplitProcess(row)"
-		               >撤销拆分</el-button>
-		               <el-button
-		                 v-else
-		                 size="small"
-		                 type="success"
-		                 @click="handleSplitProcess(row)"
-		               >拆分</el-button>
-		               </div>
-		             </template>
-		           </vxe-column>
-		         </vxe-table>
-		       </div>
-		     </div>
-		   </el-dialog>
-
-		   <!-- 拆分弹窗 -->
-		   <el-dialog v-model="splitDialogVisible" title="拆分工序" width="450px" style="top: 30%;" @close="splitDialogVisible = false">
-		     <div style="padding: 20px;">
-		       <div v-if="hasReportData" style="color: #f56c6c; margin-bottom: 15px; font-weight: bold; text-align: center;">
-		         ⚠️ 该工序已存在报工数据
-		       </div>
-		       <div style="margin-bottom: 15px; text-align: center;">
-		         <span>将复制 </span>
-		         <span class="gy-split-process-name">{{ currentSplitRow?.工序编号 || '' }}-{{ currentSplitRow?.工序名称 || '' }}</span>
-		         <span>,拆分数量为:</span>
-		       </div>
-		       <div style="display: flex; justify-content: center;">
-		         <el-input-number
-		           v-model="splitQuantity"
-		           :min="1"
-		           :step="1"
-		           :precision="0"
-		           controls-position="right"
-		           placeholder="请输入拆分数量"
-		           style="width: 200px;"
-		         />
-		       </div>
-		     </div>
-		     <template #footer>
-		       <el-button @click="splitDialogVisible = false">取消</el-button>
-		       <el-button type="primary" :loading="splitSubmitting" @click="confirmSplitProcess">确定</el-button>
-		     </template>
-		   </el-dialog>
-		   
-		   <!-- 修改颜色资料弹窗 -->
-		   <el-dialog v-model="dialogFormVisible" :before-close="edit_closeDialog" 
-		   style="width: 80%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
-		   title="颜色资料修改" destroy-on-close >
-			   <el-row :gutter="20" class="form-row">
-				   <el-col :span="10">
-					   <div style="display: flex; gap: 0px;">
-						   <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;">订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
-					   </div>
-				   </el-col>
-				   <el-col :span="10">
-					   <div style="display: flex; gap: 0px;">
-						   <el-form-item label="订单子编号:" class="mab" prop="keyOrder" label-width='110'>
-							   <el-input v-model="edit_formData['子订单编号']" disabled style="width: 250px;" id="订单子编号" />
-						   </el-form-item>
-					   </div>
-				   </el-col>
-			   </el-row>
-		   
-			   <el-row :gutter="20">
-				  <el-col :span="10">
-					   <div style="display: flex; gap: 0px;">
-						   <el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
-							  <el-select
-							  v-model=" edit_formData['颜色']" style="width: 150px;" id="色系名称" 
-							  @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
-							  <el-option 
-								v-for="color in getSuborderscolor.colorlist" 
-								:key="color.id" 
-								:label="color.colorname" 
-								:value="color.colorname"  
-								@click="xg_sxhandleSizeChange(color.colorname,color.colorcode)">
-							  </el-option>
-							  </el-select>
-						   </el-form-item>
-					   </div>
-				   </el-col>
-				   
-				   <el-col :span="10">
-					   <el-form-item label="PO号:" prop="deliveryDate" class="mab" label-width="110px" style="">
-						   <el-input v-model="edit_formData['款号']" style="width: 250px;" id="生产款号" />
-					   </el-form-item>
-				   </el-col>
-			   </el-row>
-		   
-			   <el-row :gutter="20">
-				   <el-col :span="8">
-					 <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
-					   <el-input v-model="edit_formData['颜色备注']" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
-					 </el-form-item>
-				   </el-col>
-				  <el-col :span="10">
-					   <div style="display: flex; gap: 0px;">
-						  <el-form-item label="是否船样:" prop="joinDate" label-width='200'>
-							   <el-select v-model="edit_formData['船样']" style="width: 150px;" id="是否船样" @keydown="add_gdzlent($event, '尺码规格', '是否船样', 'zds1')">
-								   <el-option label="是" value="是" @click="edit_cyChange('是')"></el-option>
-								   <el-option label="否" value="否" @click="edit_cyChange('否')"></el-option>
-							   </el-select>
-						   </el-form-item>
-					   </div>
-				   </el-col>
-			   </el-row>
-		   
-			   <el-row class="form-row">
-				   <el-col :span="20">
-					   <div style="display: flex; gap: 0px;">
-						   <el-form-item label="尺码:" class="mab" prop="keyOrder" label-width='110'>
-							   <el-input v-model="edit_cmformdata.cm1" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm2" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm3" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm4" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm5" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm6" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm7" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm8" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm9" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm10" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm11" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm12" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm13" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.cm14" readonly style="width: 80px;" />
-							   <el-input v-model="edit_cmformdata.sctotal" readonly style="width: 80px;" />
-						   </el-form-item>
-					   </div>
-				   </el-col>
-			   </el-row>
-		   
-			   <el-row class="form-row">
-				   <el-col :span="20">
-					   <div style="display: flex; gap: 0px;">
-						   <el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
-							   <el-input v-model="edit_zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1'  @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
-							   <el-input v-model="edit_zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2'  @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
-							   <el-input v-model="edit_zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3'  @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
-							   <el-input v-model="edit_zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4'  @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
-							   <el-input v-model="edit_zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5'  @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
-							   <el-input v-model="edit_zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6'  @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
-							   <el-input v-model="edit_zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7'  @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
-							   <el-input v-model="edit_zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8'  @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
-							   <el-input v-model="edit_zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9'  @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
-							   <el-input v-model="edit_zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10'  @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
-							   <el-input v-model="edit_zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11'  @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
-							   <el-input v-model="edit_zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12'  @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
-							   <el-input v-model="edit_zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13'  @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
-							   <el-input v-model="edit_zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14'  @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
-							   <el-input v-model="edit_zdsformdata.zdtotal" readonly style="width: 80px;" />
-						   </el-form-item>
-					   </div>
-				   </el-col>
-			   </el-row>
-			   
-			   <template #footer>
-				   <div class="dialog-footer" style="display: flex; justify-content: flex-end; margin-top: 20px;">
-					   <el-button @click="ys_edit_closeDialog" style="margin-left: 10px;">取消</el-button>
-					   <el-button type="primary" @click="ys_edit_Dialog" style="margin-left: 10px;">确认</el-button>
-				   </div>
-			   </template>
-  
-		   </el-dialog>
-		
-			  
-			  <!-- 新增订单资料弹窗 -->
-		  <el-dialog
-			v-model="add_gddialogFormVisible"
-			:before-close="add_gdcloseDialog"
-			title="新增订单资料"
-			class="add-order-dialog"
-			width="90%"
-			top="4vh"
-			destroy-on-close
-		  >
-			<el-row :gutter="20" class="add-order-dialog-body">
-			  <el-col :xs="24" :md="16" class="add-order-dialog-main">
-				<el-form :model="add_gdscgdformData" label-width="100px">
-				  <el-row :gutter="16">
-					<el-col :xs="24" :sm="12">
-					  <el-form-item label="订单编号">
-						<el-input v-model="add_gdscgdformData.订单编号" disabled />
-					  </el-form-item>
-					  <el-form-item label="生产款号">
-						<el-input v-model="add_gdscgdformData['生产款号']" id="生产款号"
-						  @keydown="add_gdzlent($event, '粘衬', '生产款号', '订单数量')" />
-					  </el-form-item>
-					  <el-form-item label="款式">
-						<el-input v-model="add_gdscgdformData['款式']" id="款式"
-						  @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
-					  </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12">
-					  <el-form-item label="客户编号">
-						<el-input v-model="add_gdscgdformData.客户编号" disabled />
-					  </el-form-item>
-					  <el-form-item label="订单数量">
-						<el-input v-model="add_gdscgdformData.订单数量" id="订单数量"
-						 @input="Input_handle()"
-						 @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')" />
-					  </el-form-item>
-					  <el-form-item label="落货日期">
-						<el-date-picker v-model="add_gdscgdformData['落货日期']" id="落货日期"
-						  type="date" @keydown="add_gdzlent($event, '款式', '落货日期', '面料')" />
-					  </el-form-item>
-					</el-col>
-				  </el-row>
-				  <el-form-item label="面料">
-					<el-input
-					  type="textarea"
-					  v-model="add_gdscgdformData['面料']" id="面料"
-					  rows="2"
-					  resize="none"
-					  @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
-					/>
-				  </el-form-item>
-				  <el-form-item label="箱唛要求">
-					<el-input
-					  type="textarea"
-					  v-model="add_gdscgdformData['箱唛要求']" id="箱唛要求"
-					  @keydown="add_gdzlent($event, '面料', '箱唛要求', '备注')"
-					  rows="2"
-					  resize="none"
-					/>
-				  </el-form-item>
-				  <el-form-item label="备注">
-					<el-input
-					  type="textarea"
-					  v-model="add_gdscgdformData['备注']" id="备注"
-					  @keydown="add_gdzlent($event, '箱唛要求', '备注', '船样描述')"
-					  rows="2"
-					  resize="none"
-					/>
-				  </el-form-item>
-				  <el-form-item label="船样描述">
-					<el-input
-					  type="textarea"
-					  v-model="add_gdscgdformData['船样描述']" id="船样描述"
-					  rows="1"
-					  resize="none"
-					  @keydown="add_gdzlent($event, '备注', '船样描述', '船样合计')"
-					/>
-				  </el-form-item>
-				  <el-row :gutter="10" class="add-order-bottom-row">
-					<el-col :xs="24" :sm="8">
-					  <el-form-item label="船样合计" label-width="100px">
-						<el-input v-model="add_gdscgdformData['船样合计']" id="船样合计"
-						  @input="Input_handle()"
-						  @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
-						/>
-					  </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="10">
-					  <el-form-item label="粘衬" label-width="60px">
-						<el-input v-model="add_gdscgdformData['粘衬']" id="粘衬"
-						  @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
-						/>
-					  </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="6">
-					  <el-form-item label="单位" label-width="70px">
-						<el-input v-model="add_gdscgdformData['单位']" id="单位"
-						  @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
-						/>
-					  </el-form-item>
-					</el-col>
-				  </el-row>
-				</el-form>
-			  </el-col>
-			  <el-col :xs="24" :md="8" class="add-order-dialog-side">
-				<div class="add-order-upload-wrap">
-				  <el-upload
-					ref="uploadRef"
-					class="upload-demo add-order-upload"
-					:action="uploadUrl"
-					:http-request="customUpload"
-					:headers="uploadHeaders"
-					list-type="picture-card"
-					:on-preview="handlePreview"
-					:on-remove="handleRemove"
-					:before-upload="beforeUpload"
-					:on-success="handleSuccess"
-					:on-error="handleError"
-					:file-list="fileList"
-					:limit="1"
-					accept="image/jpeg,image/png"
-				  >
-					<el-icon class="add-order-upload-plus"><Plus /></el-icon>
-				  </el-upload>
-				  <div class="add-order-upload-title">上传图片</div>
-				</div>
-				<el-form label-width="100px">
-				  <el-form-item label="制单人">
-					<el-input v-model="add_gdscgdformData['Sys_id']" disabled />
-				  </el-form-item>
-				  <el-form-item label="制单日期">
-					<el-date-picker v-model="add_gdscgdformData['制单日期']" disabled type="date" />
-				  </el-form-item>
-				</el-form>
-			  </el-col>
-			</el-row>
-			
-			<!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
-			<el-table ref="multipleTable"
-						:row-style="{ height: '30px' }"
-						:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-						:header-cell-style="{ padding: '0px' }"
-						:show-overflow-tooltip="true"
-						:cell-class-name="planUsageCellClass"
-						highlight-current-row="true"
-						style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="zsglddtableData" row-key="ID">
-				  <el-table-column align="left" label="订单编号" prop="订单编号"  width="110"/>
-				  <el-table-column align="left" label="物料编码" prop="物料编码"  width="200"/>
-				  <el-table-column align="left" label="生产款号" prop="生产款号"  width="200"/>
-				  <el-table-column align="left" label="颜色" prop="颜色"  width="115"/>
-				  <el-table-column align="left" label="物料名称" prop="物料名称"  width="170"/>
-				  <el-table-column align="left" label="计划门幅" prop="计划门幅"  width="115"/>
-				  <el-table-column align="left" label="定额门幅" prop="定额门幅"  width="115"/>
-				  <el-table-column align="left" label="款式" prop="款式"  width="115" />
-				  
-					<el-table-column fixed="right" label="操作" width="120">
-					  <template #default="{ row, $index }">
-						<el-button @click="deleteRow($index)" type="text" size="small">
-						  移除
-						</el-button>
-					  </template>
-					</el-table-column>
-					
-			  </el-table> -->
-				  
-			<!-- 底部操作按钮 -->
-			<template #footer>
-			  <div class="dialog-footer" style="text-align: right;">
-				<el-button @click="add_gdcloseDialog">取消</el-button>
-				<el-button type="primary" @click="add_gdenterDialog":disabled="!isClickable" v-loading.fullscreen.lock="fullscreenLoading">确定</el-button>
-			  </div>
-			</template>
-			
-		  </el-dialog>
-
-		  <!-- 订单图片页内放大预览 -->
-		  <el-image-viewer
-			v-if="imgPreviewVisible"
-			:url-list="imgPreviewList"
-			teleported
-			hide-on-click-modal
-			@close="closeImgPreview"
-		  />
-  
-		  <!-- 关联订单面料弹窗 -->
-		  <el-dialog v-model="Related_fabricsVisible" :before-close="Related_fabricscloseDialog" title="关联订单面料" 
-		  style="width: 70%;height: 80%;" top="2%" destroy-on-close>
-			  <el-form>
-				<div>
-					<el-space>
-					   
-					  <el-input v-model="glddzl_keyword" style="width: 300px;"  placeholder="请搜索要关联的订单编号或款号进行关联" @input="real_handleInput"/>
-					  <el-button type="primary" @click="ddsearchHandle(glddzl_keyword)">搜索</el-button>
-					  <!-- <el-button @click="Related_fabricscloseDialog">关闭</el-button> -->
-					  <el-button type="primary" @click="Related_fabricsenterDialog">确定关联</el-button>
-					  <span style="color: red;">请选择需要关联复用的颜色物料,在确定关联</span>
-					</el-space>
-					<br>
-					<br>
-				  <el-table ref="multipleTable"
-							:row-style="{ height: '30px' }"
-							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-							:header-cell-style="{ padding: '0px' }"
-							:show-overflow-tooltip="true"
-							:cell-class-name="planUsageCellClass"
-							highlight-current-row="true"
-							@row-dblclick="updateCompanyFunc2"
-							@selection-change="glddSelectionChange"
-							style="width: 100%;height: 65vh" border tooltip-effect="dark" :data="glddtableData" row-key="ID">
-				   <el-table-column type="selection" width="50" />
-					<el-table-column align="left" label="订单编号" prop="订单编号"  width="115"/>
-					<el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码"  width="200"/>
-					<el-table-column align="left" label="生产款号" prop="生产款号"  width="200"/>
-					<el-table-column align="left" label="颜色" prop="颜色"  width="115"/>
-					<el-table-column align="left" label="物料名称" prop="物料名称"  width="170"/>
-					<el-table-column align="left" label="计划门幅" prop="计划门幅"  width="115"/>
-					<el-table-column align="left" label="定额门幅" prop="定额门幅"  width="115"/>
-					<el-table-column align="left" label="款式" prop="款式"  width="115"/>
-					<el-table-column align="left" label="单位" prop="投料单位"  width="115"/>
-				  </el-table>
-				</div>
-			  </el-form>
-			  <template #footer>
-			  
-			</template>	
-		  </el-dialog>		
-		  
-		  
-		    <el-dialog
-		      v-model="order_viewVisible"
-		      title="选择打印格式"
-		      width="30%"
-		      top="10%"
-		      :before-close="order_viewCloseDialog"
-		      destroy-on-close
-		    >
-		      <el-form>
-		        <el-form-item label="打印方向" label-width="100px">
-		          <el-radio-group v-model="printDirection">
-		            <el-radio label="纵向">纵向</el-radio>
-		            <el-radio label="横向">横向</el-radio>
-		          </el-radio-group>
-		        </el-form-item>
-		      </el-form>
-		  
-		      <template #footer>
-		        <el-button @click="order_viewCloseDialog">关闭</el-button>
-		        <el-button type="primary" @click="confirmPrintDirection">确定打印</el-button>
-		      </template>
-		    </el-dialog>
-			
-		  <!-- 修改BOM资料 -->
-		  <el-dialog v-model="edit_bomdialogFormVisible" :before-close="edit_bomcloseDialog" title="修改BOM资料" width="60%" top="2%" destroy-on-close>
-			  <el-descriptions class="margin-top" :column="4"  :size="size" border>
-				  <el-descriptions-item label="订单编号" class="ddh">{{ ddhformData['ddh'] }}</el-descriptions-item>
-				  <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
-				  <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
-				  <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
-			  </el-descriptions>
-			  <el-divider content-position="left">
-				  <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
-			  </el-divider>
-			  <div style="margin-top: 5px;">
-				  <el-table ref="paichengRef"
-							:show-overflow-tooltip="true"
-							highlight-current-row="true"
-							:row-style="{ height: '0px' }"
-							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '0px' }"
-							:header-cell-style="{ padding: '0px' }"
-							style="width: 100%;height: 60vh" border tooltip-effect="dark"
-							:data="edit_resbomtableData" row-key="ID"
-							:cell-class-name="scfjfpxsCellClass">
-					<template v-for="(item, idx) in edit_resbom_tableColumns">
-					  <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width" >
-						<div v-if="['物料名称', '计划用料', '定额用料','计划门幅','定额门幅', '备注'].includes(item.prop)">
-						  <el-input v-model="row[item.prop]" :clearable="false"
-									:id="`input${idx}${$index}`" @keyup="resbom_handleKeyDown($event, idx, $index, item.prop)" @input="handleInput($event, row, item.prop)"/>
-						</div>
-						<div v-else>{{ row[item.prop] }}</div>
-					  </el-table-column>
-					</template>
-				  </el-table>
-			  </div>
-			  <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
-				<el-button @click="editres_bomcloseDialog">取 消</el-button>
-				<el-button type="primary"  @click="editres_bomenterDialog">修改</el-button>
-			  </div>
-		  </el-dialog>
-		  
-		  <!-- 批量修改BOM资料弹窗 -->
-		  <el-dialog v-model="res_bomdialogFormVisible" :before-close="res_bomcloseDialog" title="批量新增/更新BOM数据" width="70%" top="1%" destroy-on-close>
-			
-			 <el-descriptions class="margin-top" :column="4"  :size="size" border>
-			  <el-descriptions-item label="订单编号">{{ ddhformData['ddh'] }}</el-descriptions-item>
-			  <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
-			  <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
-			  <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
-			 </el-descriptions>
-			 <el-descriptions class="margin-top" :column="1"  :size="size" border>
-				  <el-descriptions-item label="面料" >{{ ddhformData['ml'] }}</el-descriptions-item>
-			 </el-descriptions>
-				
-			  <el-divider content-position="left">
-				  <el-button type="primary" icon="plus" @click="add_bomenterDialog">新增一行</el-button>
-				  <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
-			  </el-divider>
-			  <div style="margin-top: 5px;">
-				  <el-table ref="paichengRef"
-							:show-overflow-tooltip="true"
-							highlight-current-row="true"
-							:row-style="{ height: '0px' }"
-							:cell-style="{ padding: '0px' }" 
-							:header-row-style="{ height: '0px' }"
-							:header-cell-style="{ padding: '0px' }"
-							style="width: 100%;height: 58vh" 
-							border tooltip-effect="dark"
-							:data="resbomtableData" row-key="ID"
-							:cell-class-name="scfjfpxsCellClass">
-				  
-					<template v-for="(item, idx) in resbom_tableColumns">
-					  <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width">
-						
-						<!-- 如果是物料名称且UNIQID没有值,则显示输入框,否则显示内容 -->
-						<div v-if="item.prop === '物料名称'">
-						  <el-input
-							v-if="!row.UNIQID" 
-							v-model="row[item.prop]"
-							:clearable="false"
-							:id="`input${idx}${$index}`"
-							@input="handleInput($event, row, item.prop)"
-						  />
-						  <span v-else>{{ row[item.prop] }}</span>  <!-- 如果UNIQID有值,则直接显示内容 -->
-						</div>
-				  
-						<div v-else-if="item.prop === '计划入库时间'">
-						  <el-date-picker
-							v-model="row['计划入库时间']"
-							type="date"
-							value-format="YYYY-MM-DD"
-							placeholder="选择日期"
-							style="width: 100%"
-						  />
-						</div>
-				  
-						<!-- 其他列的处理 -->
-						<div v-else-if="['物料分类','计划用料', '定额用料', '计划门幅', '定额门幅', '备注'].includes(item.prop)">
-						  <el-input
-							v-model="row[item.prop]"
-							:clearable="false"
-							:id="`input${idx}${$index}`"
-							@input="handleInput($event, row, item.prop)"
-						  />
-						</div>
-						
-						<!-- 非输入框列 -->
-						<div v-else>{{ row[item.prop] }}</div>
-				  
-					  </el-table-column>
-					</template>
-				  
-					<el-table-column fixed="right" label="操作" width="80">
-					  <template #default="{ row, $index }">
-						<el-button @click="record_deleteRow(row,$index)" type="danger" size="small" 
-								   style="font-size: 16px;padding: 0px;width: 60px;background-color: red;">
-						  删除
-						</el-button>
-					  </template>
-					</el-table-column>
-					
-				  </el-table>
-			  </div>
-			  <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
-				<el-button @click="res_bomcloseDialog" style="width: 70px;height: 40px;">关闭</el-button>
-				<el-button type="primary"  @click="res_bomenterDialog" style="width: 70px;height: 40px;">一键修改</el-button>
-			  </div>
-		  </el-dialog>
-		  
-		  
-		  <el-dialog
-			v-model="ddzl_dialogFormVisible"
-			:before-close="dd_closeDialog"
-			title="修改订单资料"
-			class="add-order-dialog"
-			width="90%"
-			top="4vh"
-			destroy-on-close
-		  >
-			<el-row :gutter="20" class="add-order-dialog-body">
-			  <el-col :xs="24" :md="16" class="add-order-dialog-main">
-				<el-form :model="edit_ddformData" label-width="100px">
-				  <el-row :gutter="16">
-					<el-col :xs="24" :sm="12">
-					  <el-form-item label="订单编号">
-						<el-input v-model="edit_ddformData['订单编号']" disabled />
-					  </el-form-item>
-					  <el-form-item label="生产款号">
-						<el-input
-						  v-model="edit_ddformData['生产款号']" id="生产款号"
-						  @keydown="add_gdzlent($event, '单位', '生产款号', '订单数量')"
-						/>
-					  </el-form-item>
-					  <el-form-item label="款式">
-						<el-input v-model="edit_ddformData['款式']" id="款式"
-						  @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
-					  </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12">
-					  <el-form-item label="客户编号">
-						<el-input v-model="edit_ddformData['客户编号']" disabled />
-					  </el-form-item>
-					  <el-form-item label="订单数量">
-						<el-input v-model="edit_ddformData['订单数量']" id="订单数量"
-						  @input="Input_handle()"
-						  @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')"
-						/>
-					  </el-form-item>
-					  <el-form-item label="落货日期">
-						<el-date-picker
-						  v-model="edit_ddformData['落货日期']"
-						  id="落货日期"
-						  type="date"
-						  @keydown="add_gdzlent($event, '款式', '落货日期', '面料')"
-						/>
-					  </el-form-item>
-					</el-col>
-				  </el-row>
-				  <el-form-item label="面料">
-					<el-input
-					  type="textarea"
-					  v-model="edit_ddformData['面料']"
-					  id="面料"
-					  rows="2"
-					  resize="none"
-					  @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
-					/>
-				  </el-form-item>
-				  <el-form-item label="箱唛要求">
-					<el-input
-					  type="textarea"
-					  id="箱唛要求"
-					  v-model="edit_ddformData['箱唛要求']"
-					  @keydown="add_gdzlent($event, '面料', '箱唛要求', '要求')"
-					  rows="2"
-					  resize="none"
-					/>
-				  </el-form-item>
-				  <el-form-item label="备注">
-					<el-input
-					  type="textarea"
-					  v-model="edit_ddformData['要求']"
-					  id="要求"
-					  @keydown="add_gdzlent($event, '箱唛要求', '要求', '船样描述')"
-					  rows="2"
-					  resize="none"
-					/>
-				  </el-form-item>
-				  <el-form-item label="船样描述">
-					<el-input
-					  type="textarea"
-					  id="船样描述"
-					  @keydown="add_gdzlent($event, '要求', '船样描述', '船样合计')"
-					  v-model="edit_ddformData['船样描述']"
-					  rows="1"
-					  resize="none"
-					/>
-				  </el-form-item>
-				  <el-row :gutter="10" class="add-order-bottom-row">
-					<el-col :xs="24" :sm="8">
-					  <el-form-item label="船样合计" label-width="100px">
-						<el-input v-model="edit_ddformData['船样合计']" id="船样合计"
-						  @input="Input_handle()"
-						  @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
-						/>
-					  </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="10">
-					  <el-form-item label="粘衬" label-width="60px">
-						<el-input v-model="edit_ddformData['粘衬']" id="粘衬"
-						  @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
-						/>
-					  </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="6">
-					  <el-form-item label="单位" label-width="70px">
-						<el-input v-model="edit_ddformData['单位']" id="单位"
-						  @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
-						/>
-					  </el-form-item>
-					</el-col>
-				  </el-row>
-				</el-form>
-			  </el-col>
-			  <el-col :xs="24" :md="8" class="add-order-dialog-side">
-				<div class="add-order-upload-wrap">
-				  <el-upload
-					ref="uploadRef"
-					class="upload-demo add-order-upload"
-					:action="uploadUrl"
-					:http-request="customUpload"
-					:headers="uploadHeaders"
-					list-type="picture-card"
-					:on-preview="handlePreview"
-					:on-remove="handleRemove"
-					:before-upload="beforeUpload"
-					:on-success="handleSuccess"
-					:on-error="handleError"
-					:file-list="fileList"
-					:limit="1"
-					accept="image/jpeg,image/png"
-				  >
-					<el-icon class="add-order-upload-plus"><Plus /></el-icon>
-				  </el-upload>
-				  <div class="add-order-upload-title">上传图片</div>
-				</div>
-				<el-form label-width="100px">
-				  <el-form-item label="制单人">
-					<el-input v-model="edit_ddformData['Sys_id']" disabled />
-				  </el-form-item>
-				  <el-form-item label="制单日期">
-					<el-date-picker v-model="edit_ddformData['Sys_rq']" id="制单日期" disabled type="date" />
-				  </el-form-item>
-				</el-form>
-			  </el-col>
-			</el-row>
-		  <!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
-		  <el-table ref="multipleTable"
-								:row-style="{ height: '30px' }"
-								:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
-								:header-cell-style="{ padding: '0px' }"
-								:show-overflow-tooltip="true"
-								:cell-class-name="planUsageCellClass"
-								highlight-current-row="true"
-								style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="edit_zsglddtableData" row-key="ID">
-						  <el-table-column align="left" label="订单编号" prop="订单编号"  width="110"/>
-						  <el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码"  width="200"/>
-						  <el-table-column align="left" label="生产款号" prop="生产款号"  width="200"/>
-						  <el-table-column align="left" label="颜色" prop="颜色"  width="115"/>
-						  <el-table-column align="left" label="物料名称" prop="物料名称"  width="170"/>
-						  <el-table-column align="left" label="计划门幅" prop="计划门幅"  width="115"/>
-						  <el-table-column align="left" label="定额门幅" prop="定额门幅"  width="115"/>
-						  <el-table-column align="left" label="款式" prop="款式"  width="115" />
-						  
-							<el-table-column fixed="right" label="操作" width="120">
-							  <template #default="{ row, $index }">
-								<el-button @click="edit_deleteRow($index)" type="text" size="small">
-								  移除
-								</el-button>
-							  </template>
-							</el-table-column>
-							
-					  </el-table> -->
-			<!-- 底部操作按钮 -->
-			<template #footer>
-			  <div class="dialog-footer" style="text-align: right;">
-				<el-button @click="dd_closeDialog">取消</el-button>
-				<el-button type="primary" @click="dd_edit_Dialog">确定</el-button>
-			  </div>
-			</template>
-		  </el-dialog>
-			  
-			  
-			  <!-- 新增颜色资料弹窗 -->
-		   <el-dialog
-			  v-model="add_gdyjdialogFormVisible"
-			  :before-close="add_gdyjcloseDialog"
-			  style="width: 73%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
-			  :title="'新增颜色资料'"
-			  destroy-on-close>
-			  <el-form label-width="100px" :model="add_yszlformdata">
-				<el-row :gutter="24" class="form-row">
-				  <el-col :span="10">
-					<div style="display: flex; gap: 0px;">
-					  <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
-					</div>
-				  </el-col>
-				  <el-col :span="10">
-					<el-form-item label="订单子编号:" class="mab" prop="keyOrder" id ='订单子编号' label-width='110'>
-					  <el-input v-model="add_yszlformdata.ddzbh" disabled style="width: 250px;" />
-					</el-form-item>
-				  </el-col>
-				</el-row>
-		  
-				<el-row :gutter="24" class="form-row">
-				  <el-col :span="10">
-					<el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
-						<el-select
-						  v-model="add_yszlformdata.sxmc" style="width: 150px;" id="色系名称" 
-						  @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
-						  <el-option 
-							v-for="color in getSuborderscolor.colorlist" 
-							:key="color.id" 
-							:label="color.colorname" 
-							:value="color.colorname"  
-							@click="xz_sxhandleSizeChange(color.colorname,color.colorcode)">
-						  </el-option>
-						</el-select>
-					</el-form-item>
-				  </el-col>
-				  <el-col :span="10">
-					<el-form-item label="PO号:" class="mab" prop="keyOrder" label-width="110">
-					  <el-input v-model="add_yszlformdata.kh" style="width: 250px;" id ='款号:' @keydown="add_gdzlent($event, '色系名称', '款号:', '颜色备注')"/>
-					</el-form-item>
-				  </el-col>
-				</el-row>
-		  
-				<el-row :gutter="24" class="form-row">
-					<el-col :span="8">
-					  <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
-						<el-input v-model="add_yszlformdata.ysbz" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
-					  </el-form-item>
-					</el-col>
-	  
-				  <el-col :span="8">
-					<el-form-item label="是否船样:" prop="joinDate" label-width='230'>
-					  <el-select v-model="add_yszlformdata.sfcy" style="width: 150px;" id ='是否船样'  @keydown="add_gdzlent($event, '颜色备注', '是否船样', 'cm1')">
-						<el-option label="是" value="是" @click="cyChange('是')"></el-option>
-						<el-option label="否" value="否" @click="cyChange('否')"></el-option>
-					  </el-select>
-					</el-form-item>
-				  </el-col>
-				</el-row>
-		  
-				<el-row :gutter="24" class="form-row">
-					<el-col :span="24">
-					<el-form-item label="尺码:" class="mab" prop="keyOrder" label-width="110">
-						<el-input
-						v-model="cmformdata.cm1"
-						style="width: 80px;"
-						id="cm1"
-						@input="handleSizeInput('cm1')"
-						@keydown="add_gdzlent($event, '', 'cm1', 'cm2')"
-						/>
-						<el-input
-						v-model="cmformdata.cm2"
-						style="width: 80px;"
-						id="cm2"
-						@input="handleSizeInput('cm2')"
-						@keydown="add_gdzlent($event, 'cm1', 'cm2', 'cm3')"
-						/>
-						<el-input
-						v-model="cmformdata.cm3"
-						style="width: 80px;"
-						id="cm3"
-						@input="handleSizeInput('cm3')"
-						@keydown="add_gdzlent($event, 'cm2', 'cm3', 'cm4')"
-						/>
-						<el-input
-						v-model="cmformdata.cm4"
-						style="width: 80px;"
-						id="cm4"
-						@input="handleSizeInput('cm4')"
-						@keydown="add_gdzlent($event, 'cm3', 'cm4', 'cm5')"
-						/>
-						<el-input
-						v-model="cmformdata.cm5"
-						style="width: 80px;"
-						id="cm5"
-						@input="handleSizeInput('cm5')"
-						@keydown="add_gdzlent($event, 'cm4', 'cm5', 'cm6')"
-						/>
-						<el-input
-						v-model="cmformdata.cm6"
-						style="width: 80px;"
-						id="cm6"
-						@input="handleSizeInput('cm6')"
-						@keydown="add_gdzlent($event, 'cm5', 'cm6', 'cm7')"
-						/>
-						<el-input
-						v-model="cmformdata.cm7"
-						style="width: 80px;"
-						id="cm7"
-						@input="handleSizeInput('cm7')"
-						@keydown="add_gdzlent($event, 'cm6', 'cm7', 'cm8')"
-						/>
-						<el-input
-						v-model="cmformdata.cm8"
-						style="width: 80px;"
-						id="cm8"
-						@input="handleSizeInput('cm8')"
-						@keydown="add_gdzlent($event, 'cm7', 'cm8', 'cm9')"
-						/>
-						<el-input
-						v-model="cmformdata.cm9"
-						style="width: 80px;"
-						id="cm9"
-						@input="handleSizeInput('cm9')"
-						@keydown="add_gdzlent($event, 'cm8', 'cm9', 'cm10')"
-						/>
-						<el-input
-						v-model="cmformdata.cm10"
-						style="width: 80px;"
-						id="cm10"
-						@input="handleSizeInput('cm10')"
-						@keydown="add_gdzlent($event, 'cm9', 'cm10', 'cm11')"
-						/>
-						<el-input
-						v-model="cmformdata.cm11"
-						style="width: 80px;"
-						id="cm11"
-						@input="handleSizeInput('cm11')"
-						@keydown="add_gdzlent($event, 'cm10', 'cm11', 'cm12')"
-						/>
-						<el-input
-						v-model="cmformdata.cm12"
-						style="width: 80px;"
-						id="cm12"
-						@input="handleSizeInput('cm12')"
-						@keydown="add_gdzlent($event, 'cm11', 'cm12', 'cm13')"
-						/>
-						<el-input
-						v-model="cmformdata.cm13"
-						style="width: 80px;"
-						id="cm13"
-						@input="handleSizeInput('cm13')"
-						@keydown="add_gdzlent($event, 'cm12', 'cm13', 'cm14')"
-						/>
-						<el-input
-						v-model="cmformdata.cm14"
-						style="width: 80px;"
-						id="cm14"
-						@input="handleSizeInput('cm14')"
-						@keydown="add_gdzlent($event, 'cm13', 'cm14', 'sctotal')"
-						/>
-						<el-input
-						v-model="cmformdata.sctotal"
-						style="width: 80px;"
-						id="sctotal"
-						@input="handleSizeInput('sctotal')"
-						@keydown="add_gdzlent($event, 'cm14', 'sctotal', 'zds1')"
-						/>
-					</el-form-item>
-					</el-col>
-  				</el-row>
-		  
-				<el-row :gutter="24" class="form-row">
-				  <el-col :span="24">
-					<el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
-					  <el-input v-model="zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1'  @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
-					  <el-input v-model="zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2'  @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
-					  <el-input v-model="zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3'  @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
-					  <el-input v-model="zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4'  @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
-					  <el-input v-model="zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5'  @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
-					  <el-input v-model="zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6'  @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
-					  <el-input v-model="zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7'  @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
-					  <el-input v-model="zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8'  @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
-					  <el-input v-model="zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9'  @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
-					  <el-input v-model="zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10'  @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
-					  <el-input v-model="zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11'  @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
-					  <el-input v-model="zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12'  @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
-					  <el-input v-model="zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13'  @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
-					  <el-input v-model="zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14'  @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
-					  <el-input v-model="zdsformdata.zdtotal" readonly style="width: 80px;" />
-					</el-form-item>
-				  </el-col>
-				</el-row>
-  
-		  
-			  </el-form>
-		  
-			  <template #footer>
-				<div class="dialog-footer" style="display: flex; justify-content: flex-end; padding: 10px;">
-				  <el-button type="primary" @click="add_dyjcloseDialog">取消</el-button>
-				  <el-button type="primary" @click="add_gdyjenterDialog">确定</el-button>
-				</div>
-			  </template>
-			  
-			</el-dialog>
-			  
-		  <!-- 新增工序资料-->
-		  <el-dialog v-model="visible" :before-close="()=> visible = false" style="width: 25%;margin: 10% auto" :title="'新增工序资料'" destroy-on-close>
-	  <el-form>
-		<div>
-		  <div style="display: flex; gap: 0px;">
-			<h3 style="color:red;font-size: 24px;margin:0px 0px 0px 15px;">订单号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="仓库出库:"  class="mab" prop="isBanciSelected" label-width="110">
-		  <el-checkbox v-model="form['仓库出库']"></el-checkbox>
-			</el-form-item>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="裁切:"  class="mab" prop="isBanciSelected" label-width="110">
-			<el-checkbox v-model="form['裁切']"></el-checkbox>
-			</el-form-item>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="车缝:"  class="mab" prop="isBanciSelected" label-width="110">
-			<el-checkbox v-model="form['车缝']"></el-checkbox>
-			</el-form-item>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="后道收样:"  class="mab" prop="isBanciSelected" label-width="110">
-			<el-checkbox v-model="form['后道收样']"></el-checkbox>
-			</el-form-item>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="大烫:"  class="mab" prop="isBanciSelected" label-width="110">
-			<el-checkbox v-model="form['大烫']"></el-checkbox>
-			</el-form-item>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="总检:"  class="mab" prop="isBanciSelected" label-width="110">
-			<el-checkbox v-model="form['总检']"></el-checkbox>
-			</el-form-item>
-		  </div>
-  
-		  <div style="display: flex; gap: 0px;">
-			<el-form-item label="包装:"  class="mab" prop="isBanciSelected" label-width="110">
-			<el-checkbox v-model="form['包装']"></el-checkbox>
-			</el-form-item>
-		  </div>
-		</div>
-	  </el-form>
-	  <template #footer>
-		<div class="dialog-footer" style="text-align: right;top: auto;">
-		<el-button @click="add_gxcloseDialog">取 消</el-button>
-		<el-button type="primary"  @click="add_gxenterDialog">确 定</el-button>
-		</div>
-	  </template>
-		  </el-dialog>
-
-	  <!-- 新增部件资料弹窗 -->
-	  <el-dialog
-	v-model="partAddDialogVisible"
-	:title="partIsEdit ? '修改部件' : '新增部件'"
-	width="900px"
-	top="5%"
-	:fullscreen="false"
-	class="part-add-dialog"
-	destroy-on-close
-  >
-		<div v-if="_Gd_gdbh" class="list-dialog-context-header" style="margin-bottom: 15px;">
-	  <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0" style="width: 100%;">
-		<tbody>
-		  <tr>
-			<th scope="row" style="width: 80px;">订单编号</th>
-			<td>{{ _Gd_gdbh }}</td>
-		  </tr>
-		</tbody>
-	  </table>
-	</div>
-		<el-form
-		  v-if="partIsEdit"
-		  ref="partFormRef"
-		  :model="partAddForm"
-		  label-width="0"
-		  class="list-part-edit-form"
-		>
-		  <div class="list-part-edit-table-wrap">
-			<el-table
-			  :data="[partAddForm]"
-			  border
-			  class="list-part-add-table"
-			  style="width: 100%;"
-			>
-			  <el-table-column label="部件序号" width="120" align="center" header-align="center">
-				<template #default="{ row }">
-				  <el-input v-model="row.部件序号" disabled placeholder="已保存序号" style="width: 80px;" />
-				</template>
-			  </el-table-column>
-			  <el-table-column label="部件编号" width="150">
-				<template #default="{ row }">
-				  <el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
-				</template>
-			  </el-table-column>
-			  <el-table-column label="部件名称" min-width="200">
-				<template #default="{ row }">
-				  <el-select
-					v-model="row.部件名称"
-					placeholder="请选择或输入部件名称"
-					filterable
-					allow-create
-					reserve-keyword
-					clearable
-					style="width: 100%;"
-				  >
-					<el-option
-					  v-for="opt in partNameOptions"
-					  :key="opt"
-					  :label="opt"
-					  :value="opt"
-					/>
-				  </el-select>
-				</template>
-			  </el-table-column>
-			  <el-table-column label="部件类型" width="150">
-				<template #default="{ row }">
-				  <el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
-				</template>
-			  </el-table-column>
-			  <el-table-column label="部件备注" min-width="150">
-				<template #default="{ row }">
-				  <el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
-				</template>
-			  </el-table-column>
-			  <el-table-column label="操作" width="80" align="center">
-				<template #default="{ $index }">
-				  <el-button
-					type="danger"
-					size="small"
-					@click="removePartRow($index)"
-					:disabled="partAddRows.length <= 1"
-				  >
-					移除
-				  </el-button>
-				</template>
-			  </el-table-column>
-			</el-table>
-		  </div>
-		</el-form>
-		<div v-else class="list-part-add-batch">
-	  <p class="list-part-hint" style="color:red; margin-bottom: 15px;">在选择部件名称后会自动增加新行。</p>
-	  <el-table
-		:data="partAddRows"
-		border
-		style="width: 100%;"
-	  >
-		<el-table-column label="部件序号" width="120" align="center" header-align="center">
-		  <template #default="{ row }">
-			<el-input v-model="row.部件序号" disabled placeholder="部件序号" style="width: 80px;" />
-		  </template>
-		</el-table-column>
-		<el-table-column label="部件编号" width="150">
-		  <template #default="{ row }">
-			<el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
-		  </template>
-		</el-table-column>
-		<el-table-column label="部件名称" min-width="200">
-		  <template #default="{ row, $index }">
-			<el-select
-			  v-model="row.部件名称"
-			  placeholder="请选择或输入部件名称"
-			  filterable
-			  allow-create
-			  reserve-keyword
-			  clearable
-			  style="width: 100%;"
-			  @change="onPartNameChange($index)"
-			>
-			  <el-option
-				v-for="opt in partNameOptions"
-				:key="opt"
-				:label="opt"
-				:value="opt"
-			  />
-			</el-select>
-		  </template>
-		</el-table-column>
-		<el-table-column label="部件类型" width="150">
-		  <template #default="{ row }">
-			<el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
-		  </template>
-		</el-table-column>
-		<el-table-column label="部件备注" min-width="150">
-		  <template #default="{ row }">
-			<el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
-		  </template>
-		</el-table-column>
-		<el-table-column label="操作" width="80" align="center">
-		  <template #default="{ $index }">
-			<el-button
-			  type="danger"
-			  size="small"
-			  @click="removePartRow($index)"
-			  :disabled="partAddRows.length <= 1"
-			>
-			  移除
-			</el-button>
-		  </template>
-		</el-table-column>
-		  </el-table>
-		</div>
-		<template #footer>
-	  <div class="dialog-footer" style="text-align: right;">
-		<el-button @click="partAddCloseDialog">取消</el-button>
-		<el-button type="primary" @click="partAddConfirm">{{ partIsEdit ? '保存' : '确定' }}</el-button>
-	  </div>
-	</template>
-	  </el-dialog>
-
-  <!-- 新增工艺资料弹窗 -->
-  <el-dialog
-    v-model="processAddDialogVisible"
-    :title="processIsEdit ? '修改工艺' : '新增工艺'"
-    :width="'min(1280px, 90vw)'"
-    align-center
-    destroy-on-close
-    append-to-body
-    :class="['list-unified-dialog', 'list-process-add-dialog']"
-    @closed="resetProcessLibForm"
-  >
-    <div v-if="_Gd_gdbh" class="list-dialog-context-header">
-      <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
-        <tbody>
-          <tr>
-            <th scope="row">订单编号</th>
-            <td>{{ _Gd_gdbh }}</td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
-    <p class="list-process-add-split-hint">
-      <strong>车缝工艺选部件</strong>,工艺与部件绑定;<strong>其余工序工艺不选部件</strong>。选择查询工艺名称后自动带出标准工时、标准工分。
-    </p>
-    <div class="list-process-add-scroll-body">
-      <div class="list-process-add-split">
-        <div class="list-process-add-sidebar">
-          <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
-          <div class="list-process-add-part-list list-process-add-stage-list">
-            <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="st">
-              <div
-                class="list-process-add-stage-item"
-                :class="{
-                  'is-active':
-                    processAddSelectedStage === st && (st !== '车缝' || !processAddPartList.length),
-                }"
-                @click="onProcessAddSelectStage(st)"
-              >
-                {{ st }}
-              </div>
-              <div
-                v-if="st === '车缝' && processAddPartList.length"
-                class="list-process-add-sewing-nest"
-              >
-                <div
-                  v-for="(part, pi) in processAddPartList"
-                  :key="processAddPartBlockKey(part, pi)"
-                  class="list-process-add-part-item list-process-add-part-item--nest"
-                  :class="{
-                    'is-active':
-                      processAddSelectedStage === '车缝' &&
-                      processAddSelectedPartKey === processAddPartBlockKey(part, pi),
-                  }"
-                  @click.stop="onProcessAddSelectSewingPart(part, pi)"
-                >
-                  <div class="list-process-add-part-item-text">
-                    <span class="list-process-add-part-sort">序号 {{ part.part_sort ?? part['部件序号'] ?? '—' }}</span>
-                    <span
-                      class="list-process-add-part-name"
-                      :title="String(part.part_name ?? part['部件名称'] ?? '')"
-                    >
-                      {{ part.part_name ?? part['部件名称'] ?? '—' }}
-                    </span>
-                  </div>
-                </div>
-              </div>
-            </template>
-          </div>
-        </div>
-        <div class="list-process-add-main-panel">
-          <template v-if="processAddCurrentRowKey">
-            <div v-if="processAddSelectedStage !== '车缝'" class="list-process-add-main-head">
-              当前工序:<strong>{{ processAddSelectedStage }}</strong>
-              <span class="list-process-add-main-head-sub">(不关联部件)</span>
-            </div>
-            <div v-else class="list-process-add-main-head">
-              车缝 · 当前部件:<strong>{{
-                processAddActivePart?.part_name ?? processAddActivePart?.['部件名称'] ?? '—'
-              }}</strong>
-              <span class="list-process-add-main-head-sub">
-                (序号 {{ processAddActivePart?.part_sort ?? processAddActivePart?.['部件序号'] ?? '—' }})
-              </span>
-            </div>
-            <div class="list-process-add-table-wrap">
-              <el-table
-                :data="processAddByPartRows[processAddCurrentRowKey] ?? []"
-                border
-                class="list-process-add-table"
-                :row-key="(row) => row._key"
-                :height="processAddDialogTableHeight"
-              >
-                <el-table-column label="工艺序号" width="120" align="center" header-align="center">
-                  <template #default="{ row }">
-                    <span class="list-serial-cell-text">{{ row['工艺序号'] || '—' }}</span>
-                  </template>
-                </el-table-column>
-                <el-table-column label="工艺名称" min-width="200">
-                  <template #default="{ row, $index }">
-                    <el-select
-                      v-model="row['工艺名称']"
-                      class="list-lib-name-select"
-                      popper-class="process-lib-select-dropdown"
-                      placeholder="请选择或输入工艺名称"
-                      filterable
-                      remote
-                      reserve-keyword
-                      allow-create
-                      default-first-option
-                      clearable
-                      :remote-method="onProcessLibSelectFilter"
-                      @visible-change="onProcessLibSelectVisible"
-                      @change="onProcessLibNameSelectChangeForPart(processAddCurrentRowKey, $index)"
-                    >
-                      <el-option
-                        v-for="opt in filteredProcessLibNameOptionsForProcessAdd"
-                        :key="opt.value"
-                        :label="opt.value"
-                        :value="opt.value"
-                      >
-                        <div class="process-lib-opt-two-col">
-                          <span class="process-lib-opt-name" :title="String(opt.value)">{{ opt.value }}</span>
-                          <span class="process-lib-opt-stage">{{ processLibOptStageText(opt) }}</span>
-                        </div>
-                      </el-option>
-                    </el-select>
-                  </template>
-                </el-table-column>
-                <el-table-column label="生产工序" min-width="120" show-overflow-tooltip>
-                  <template #default="{ row }">
-                    <span class="list-process-cell-plain">{{ row['生产工序'] || '—' }}</span>
-                  </template>
-                </el-table-column>
-                <el-table-column label="标准工时" width="118">
-                  <template #default="{ row }">
-                    <el-input-number v-model="row['标准工时']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
-                  </template>
-                </el-table-column>
-                <el-table-column label="标准工分" width="118">
-                  <template #default="{ row }">
-                    <el-input-number v-model="row['标准工分']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
-                  </template>
-                </el-table-column>
-                <el-table-column label="难度系数" width="110">
-                  <template #default="{ row }">
-                    <el-input-number
-                      v-model="row['难度系数']"
-                      :min="0"
-                      :precision="2"
-                      :step="0.1"
-                      controls-position="right"
-                      style="width: 100%"
-                    />
-                  </template>
-                </el-table-column>
-                <el-table-column label="操作" width="72" align="center">
-                  <template #default="{ row, $index }">
-                    <el-button
-                      type="danger"
-                      link
-                      size="small"
-                      @click="removeProcessLibRowForPart(processAddCurrentRowKey, row, $index)"
-                    >
-                      移除
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </template>
-          <template v-else-if="processAddSelectedStage === '车缝' && !processAddPartList.length">
-            <el-empty
-              description="车缝需先有部件。请先在「部件资料」中新增部件后再编辑车缝工艺"
-              :image-size="72"
-              class="list-process-add-main-empty"
-            />
-          </template>
-          <el-empty
-            v-else
-            description="请在左侧选择生产工序;车缝时请选择具体部件"
-            :image-size="72"
-            class="list-process-add-main-empty"
-          />
-        </div>
-      </div>
-    </div>
-    <div class="list-process-meta">将提交 {{ processLibAddSubmitCount }} 条</div>
-    <template #footer>
-      <el-button @click="processAddCloseDialog">取消</el-button>
-      <el-button type="primary" :loading="processSubmitLoading" @click="processAddConfirm">确定</el-button>
-    </template>
-  </el-dialog>
-
-  <!-- 部件与工艺排序弹窗 -->
-      <el-dialog
-        v-model="sortPartGyDialogVisible"
-        title="调整部件 / 工艺序号排序"
-        :width="'min(1280px, 90vw)'"
-        :max-height="'85vh'"
-        align-center
-        destroy-on-close
-        append-to-body
-        :class="['list-unified-dialog', 'list-process-add-dialog', 'sort-part-gy-dialog']"
-        @closed="onSortPartGyDialogClosed"
-      >
-        <div v-if="_Gd_gdbh" class="list-dialog-context-header">
-          <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
-            <tbody>
-              <tr>
-                <th scope="row">订单编号</th>
-                <td>{{ _Gd_gdbh }}</td>
-              </tr>
-            </tbody>
-          </table>
-        </div>
-        <div class="sort-part-gy-hint" role="note">
-          <ul class="sort-part-gy-hint-list">
-            <li>
-              <strong>左侧</strong>:与「新增工艺」一致,一级为生产工序(裁剪 → 车缝 → 手工 → 大烫 → 总检);仅<strong>车缝</strong>下可拖拽调整部件先后,点击部件后右侧排该车缝工艺。
-            </li>
-            <li>
-              <strong>非车缝工序</strong>:点选后右侧为该工单下、不关联部件的工艺;<strong>右侧工艺表</strong>可拖拽「拖」列、改工艺名等。
-            </li>
-            <li>
-              <strong>保存</strong>:按当前顺序重编部件号与工艺号,并提交变更。
-            </li>
-          </ul>
-        </div>
-        <div v-loading="sortDialogLoading" class="sort-part-gy-body">
-          <template v-if="!sortDialogLoading && !sortDialogHasData">
-            <el-empty description="当前工单下暂无工艺数据" />
-          </template>
-          <div v-else class="sort-part-gy-split list-process-add-split">
-            <div class="list-process-add-sidebar sort-gy-left-nav">
-              <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
-              <div class="list-process-add-part-list list-process-add-stage-list list-sort-gy-nav-list">
-                <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="'sort-nav-' + st">
-                  <div
-                    class="list-process-add-stage-item"
-                    :class="{
-                      'is-active': sortDialogViewStage === st && (st !== '车缝' || !sortDialogSewingGroups.length),
-                    }"
-                    @click="onSortDialogViewStageSelect(st)"
-                  >
-                    {{ st }}
-                  </div>
-                  <div
-                    v-if="st === '车缝' && sortDialogSewingGroups.length"
-                    class="list-process-add-sewing-nest list-sort-gy-sewing-parts"
-                  >
-                    <div
-                      v-for="(sg, spi) in sortDialogSewingGroups"
-                      :key="String(sg.part?.id ?? `sg-${spi}`)"
-                      class="list-process-add-part-item list-process-add-part-item--nest sort-part-gy-part-item"
-                      :class="{
-                        'is-active':
-                          sortDialogViewStage === '车缝' &&
-                          sortDialogSelectedPartId != null &&
-                          String(sortDialogSelectedPartId) === String(sg.part?.id),
-                      }"
-                      title="拖拽或点击"
-                      @click.stop="onSortDialogSelectSewingPart(sg.part?.id)"
-                    >
-                      <span class="sort-part-gy-part-item-grip" aria-hidden="true">
-                        <el-icon><Rank /></el-icon>
-                      </span>
-                      <div class="list-process-add-part-item-text">
-                        <span class="list-process-add-part-sort">序号 {{ sg.part?.part_sort ?? '—' }}</span>
-                        <span
-                          class="list-process-add-part-name"
-                          :title="String(sg.part?.部件名称 ?? '')"
-                        >
-                          {{ sg.part?.部件名称 ?? '—' }}
-                        </span>
-                      </div>
-                    </div>
-                  </div>
-                </template>
-              </div>
-            </div>
-            <div class="sort-part-gy-main-panel">
-              <template v-if="sortDialogViewStage && sortDialogRightPanelReady">
-                <div v-if="sortDialogViewStage !== '车缝'" class="sort-part-gy-main-head list-process-add-main-head">
-                  当前工序:<strong>{{ sortDialogViewStage }}</strong>
-                  <span class="list-process-add-main-head-sub">(不关联部件)</span>
-                </div>
-                <div v-else-if="sortDialogRightActiveSewingGroup" class="sort-part-gy-main-head list-process-add-main-head">
-                  车缝 · 当前部件:<strong>{{
-                    sortDialogRightActiveSewingGroup.part?.部件名称 ?? '—'
-                  }}</strong>
-                  <span class="list-process-add-main-head-sub">
-                    (序号 {{ sortDialogRightActiveSewingGroup.part?.part_sort ?? '—' }})
-                  </span>
-                </div>
-                <div v-else class="sort-part-gy-main-head list-process-add-main-head--warn">请在「车缝」下选择一个部件,或先维护部件资料。</div>
-                <el-table
-                  v-if="sortDialogActiveGysList.length"
-                  :data="sortDialogActiveGysList"
-                  border
-                  size="small"
-                  class="sort-gy-table"
-                  :row-key="(row) => String(row.id ?? `${row.gy_sort}-${row.gy_name}`)"
-                >
-                  <el-table-column width="44" align="center" fixed="left">
-                    <template #header><span class="sort-drag-col-hint">拖</span></template>
-                    <template #default>
-                      <span class="sort-drag-handle" title="拖拽调整工艺顺序">
-                        <el-icon><Rank /></el-icon>
-                      </span>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="工艺序号" width="88" align="center">
-                    <template #default="{ row: r }"> {{ r.gy_sort ?? r['工艺序号'] ?? '—' }}</template>
-                  </el-table-column>
-                  <el-table-column label="工艺名称" min-width="220">
-                    <template #default="{ row: r }">
-                      <span :title="r['工艺名称'] || ''">{{ r['工艺名称'] || '—' }}</span>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="标准工时" width="100" align="center">
-                    <template #default="{ row: r }"> {{ r['标准工时'] || '—' }}</template>
-                  </el-table-column>
-                  <el-table-column label="标准工分" width="100" align="center">
-                    <template #default="{ row: r }"> {{ r['标准公分'] || r['标准工分'] || '—' }}</template>
-                  </el-table-column>
-                  <el-table-column label="难度系数" width="120" align="center">
-                    <template #default="{ row: r }"> {{ r['系数'] || r['难度系数'] || '—' }}</template>
-                  </el-table-column>
-                  <el-table-column label="生产工序" width="100" align="center" prop="big_process" show-overflow-tooltip />
-                </el-table>
-                <el-empty
-                  v-else
-                  :description="sortDialogViewStage === '车缝' ? '该部件下暂无车缝工艺' : '该工序下暂无工艺'"
-                  :image-size="64"
-                  class="sort-part-gy-main-empty"
-                />
-              </template>
-              <el-empty
-                v-else
-                description="请先在左侧选择生产工序,车缝时请选择具体部件"
-                :image-size="72"
-                class="sort-part-gy-main-empty"
-              />
-            </div>
-          </div>
-        </div>
-        <template #footer>
-          <div class="dialog-footer" style="text-align: right;">
-            <el-button @click="sortCloseDialog">取 消</el-button>
-            <el-button type="primary" :loading="sortDialogSubmitLoading" @click="submitSortPartGy">保存排序</el-button>
-          </div>
-        </template>
-      </el-dialog>
-		  
-		  <!-- 附件上传 -->
-		  <el-dialog v-model="jsfjdialogFormVisible" :before-close="jsfjcloseDialog"
-					  style="margin-top: 40px" height="500px" width="700px" destroy-on-close>
-				<el-form :model="jsfjformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
-				  <el-row :gutter="24">
-					  <el-col :span="10">
-					   <div style="display: flex; gap: 0px;">
-						 <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
-					   </div>
-					  </el-col>
-				  </el-row>
-				  <br />
-				  <el-row :gutter="24">  
-					<el-col :span="16">  
-					  <el-form-item label="附件备注:" prop="address" class="mab">  
-						<el-select v-model="jsfjformdata.附件备注" placeholder="请选择附件类型" id="附件备注">  
-						  <el-option label="订单附件" value="订单资料附件"></el-option>
-						  <el-option label="技术附件" value="技术附件"></el-option>
-						  <el-option label="发货单附件" value="发货单附件"></el-option>
-						</el-select>  
-					  </el-form-item>  
-					</el-col>  
-				  </el-row> 
-				  <br>
-				  <el-row :gutter="24">
-					  <!-- <el-col :span="8">
-						  <br>
-						  <p>s</p>
-					  </el-col> -->
-					  <el-col :span="12">
-						  <!-- <br> -->
-						  <el-form-item label="附件备注:" prop="address" class="mab">  
-						  <input style="font-size:16px;" type="file" @change="uploadExcel" >
-						  </el-form-item>  
-					  </el-col>
-				  <!-- 	<el-col :span="4">
-						  <br>
-						  <el-button @click="yulan">预览</el-button>
-					  </el-col> -->
-				  </el-row>
-				</el-form>
-				<template #footer>
-					<br>
-				  <div class="dialog-footer">
-					<el-button @click="jsfjcloseDialog">取 消</el-button>
-					<el-button type="primary"  @click="jsfjenterDialog">确 定</el-button>
-				  </div>
-				</template>
-			  </el-dialog>
-			  
-			  <!-- 复制工艺资料弹窗 -->
-			  <el-dialog v-model="copyProductDialogVisible" title="复制工艺资料">
-				<div style=" padding: 0px; align-items: center; display: flex; flex-wrap: wrap;">
-				  <el-form-item label="当前订单" prop="processName" class="mab">
-					<el-input v-model="copyProductFormData['gdbh']" disabled style="width: 150px;" />
-				  </el-form-item>
-				  <el-form-item label="生产款号" prop="生产款号" class="mab">
-					<el-input v-model="copyProductFormData['生产款号']" disabled style="width: 200px;" />
-				  </el-form-item>
-				  <el-form-item label="搜索订单" prop="processName" class="mab" style="width: 50%;">
-					<el-input v-model="copyProductSearchText" placeholder="请输入订单编号或生产款号搜索" style="width: 70%;" @keydown.enter.prevent="copyProductSearch" />
-					<el-button type="primary" @click="copyProductSearch" style="margin-left: 10px;">搜索</el-button>
-				  </el-form-item>
-				  <el-form-item prop="processName" class="mab" style="width: 100%;">
-					<span style="color:red">请选择要复制工艺的源订单</span>
-				  </el-form-item>
-				</div>
-				<div slot="footer" class="dialog-footer" style="text-align: right;margin-left: 25%">
-				  <el-button @click="copyProductHandleCancel">放弃</el-button>
-				  <el-button type="primary" @click="copyProductHandleConfirm" :disabled="!copyProductSelectedRow">复制</el-button>
-				</div>
-				<el-table ref="copyProductTableRef"
-						:show-overflow-tooltip="true"
-						:row-style="{ height: '0px' }"
-						:cell-style="{ padding: '0px' }"
-						:header-row-style="{ height: '0px' }"
-						:header-cell-style="{ padding: '0px' }"
-						@row-click="copyProductTableRowClick"
-						highlight-current-row="true"
-						style="width: 100%;height: 30vh;" border tooltip-effect="dark"
-						:data="copyProductTableData" row-key="订单编号">
-					<el-table-column align="left" label="订单编号" width="120">
-					  <template v-slot="{ row }"><span>{{ row.订单编号 }}</span></template>
-					</el-table-column>
-					<el-table-column align="left" label="生产款号" width="200">
-					  <template v-slot="{ row }"><span>{{ row.生产款号 }}</span></template>
-					</el-table-column>
-					<el-table-column align="left" label="客户编号" width="100">
-					  <template v-slot="{ row }"><span>{{ row.客户编号 }}</span></template>
-					</el-table-column>
-					<el-table-column align="left" label="款式" width="150">
-					  <template v-slot="{ row }"><span>{{ row.款式 }}</span></template>
-					</el-table-column>
-				  </el-table>
-			  </el-dialog>
-			  
-			  <!-- 面料库存弹窗 -->
-		<el-dialog v-model="mlinventoryVisible" :before-close="mlcloseDialog" title="面料库存出入库记录" 
-					  style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
-				<el-form :model="mlformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
-			<el-table
-				ref="table"
-				highlight-current-row
-				show-overflow-tooltip
-				border
-				:data="historytableData"
-				:row-style="{ height: '25px' }"
-				:cell-style="{ padding: '0px' }"
-				:header-row-style="{ height: '20px' }"
-				:header-cell-style="{ padding: '0px' }"
-				style="width: 100%;height: 75vh;" >
-		  
-			<el-table-column label="订单编号" prop="订单编号"width="110" ></el-table-column>
-			<el-table-column label="面料" prop="面料" width="110"></el-table-column>
-			<el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
-			<el-table-column label="入库数量" prop="入库数量" width="110"></el-table-column>
-			<el-table-column label="出库数量" prop="出库数量" width="110"></el-table-column>
-			<el-table-column label="领料部门" prop="领料部门" width="110"></el-table-column>
-			<el-table-column label="领料时间" prop="领料时间" width="110"></el-table-column>
-		  </el-table>
-				  <br>
-				</el-form>
-				<template #footer>
-					<br>
-				  <div class="dialog-footer">
-					<el-button @click="mlcloseDialog">取 消</el-button>
-					<el-button type="primary"  @click="mlenterDialog">确 定</el-button>
-				  </div>
-				</template>
-			  </el-dialog>
-			  
-			  
-			  <!-- 发货单页面 -->
-  
-			  <el-dialog v-model="InvoiceVisible" :before-close="InvoiceDialog" title="AI获取发货单出货信息"
-						  style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
-						  
-					<h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}&nbsp;&nbsp;&nbsp;{{_mesval}}</h3>
-					
-					<el-table
-							ref="table" highlight-current-row
-							show-overflow-tooltip border
-							:data="InvoicetableData"
-							:row-style="{ height: '25px' }"
-							:cell-style="{ padding: '0px' }"
-							:header-row-style="{ height: '20px' }"
-							:header-cell-style="{ padding: '0px' }"
-							style="width: 100%;height: 65vh;" >
-			
-						<el-table-column label="子订单编号" prop="子订单编号" width="160"></el-table-column>
-						<el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
-						<el-table-column label="尺码" prop="尺码" width="110"></el-table-column>
-						<el-table-column label="制单数量" prop="制单数量" width="110"></el-table-column>
-						<el-table-column label="发货箱数" prop="发货箱数" width="110">
-							<template #default="scope">
-								<el-input
-									v-model="scope.row.发货箱数"
-									size="mini"
-									@change="handleQuantityChange(scope.row)"
-									@blur="handleQuantityBlur(scope.row)"
-									placeholder="请输入数量"
-								/>
-							</template>
-						</el-table-column>
-							<el-table-column label="每箱件数" prop="每箱件数" width="110">
-							<template #default="scope">
-								<el-input
-									v-model="scope.row.每箱件数"
-									size="mini"
-									@change="handleQuantityChange(scope.row)"
-									@blur="handleQuantityBlur(scope.row)"
-									placeholder="请输入数量"
-								/>
-							</template>
-						</el-table-column>
-						<el-table-column label="发货数量" prop="发货数量" width="110"></el-table-column>
-					</el-table>
-					
-					<template #footer>
-						<br>
-					  <div class="dialog-footer">
-						<el-button @click="InvoiceDialog">取 消</el-button>
-						<el-button type="primary"  @click="InvoiceenterDialog">确 定</el-button>
-					  </div>
-					</template>
-			  </el-dialog>
-  
-  
-			</el-main>
-		  </layout-content>
-		</layout>
-	  </layout>
-	  
-	  <!-- 打印订单表预览 -->
-	  <PrintPage ref="printPageRef" />
-	  <!-- 子订单详情页 -->
-	  <luckyexcelPage ref="luckyexcelPageRef" />
-	  
-	  <!-- 工序产量核查 -->
-	  <el-dialog
-		v-model="processProductionVisible"
-		width="100%"
-		style="height: 100%;margin: 0px;"
-		top="2vh"
-		:close-on-click-modal="true"
-		:show-close="false"
-		destroy-on-close
-		class="process-production-dialog"
-	  >
-		<template #header>
-		  <div class="process-production-dialog-header">
-			<span class="process-production-dialog-title">工序产量核查</span>
-			<el-button
-			  type="danger"
-			  size="small"
-			  class="process-production-dialog-close"
-			  @click="processProductionVisible = false"
-			>
-			  关闭
-			</el-button>
-		  </div>
-		</template>
-		<ProcessProduction
-		  :key="processProductionDialogKey"
-		  :initial-workorder="processProductionWorkorder"
-		  in-dialog
-		  hide-amount-columns
-		/>
-	  </el-dialog>
-
-	  <!-- 导入工艺资料弹窗 -->
-	  <el-dialog
-		title="导入工艺资料"
-		v-model="importProcessDialogVisible"
-		width="400px"
-		:close-on-click-modal="false"
-		destroy-on-close
-	  >
-		<el-form :model="importProcessForm" label-width="100px">
-		  <el-form-item label="订单编号">
-			<el-input v-model="importProcessForm.workorderNo" disabled />
-		  </el-form-item>
-		  <el-form-item label="款号">
-			<el-input v-model="importProcessForm.styleNo" disabled />
-		  </el-form-item>
-		  <el-form-item label="Excel文件">
-			<el-upload
-			  ref="importProcessUploadRef"
-			  class="upload-demo import-process-upload"
-			  action="#"
-			  :auto-upload="false"
-			  :show-file-list="true"
-			  :file-list="importProcessFileList"
-			  accept=".xlsx,.xls"
-			  :on-change="handleImportProcessFileChange"
-			  :on-remove="handleImportProcessFileRemove"
-			  :before-upload="beforeImportProcessUpload"
-			  list-type="text"
-			>
-			  <el-button type="primary" icon="upload">选择文件</el-button>
-			</el-upload>
-		  </el-form-item>
-		</el-form>
-		<template #footer>
-		  <div class="dialog-footer">
-			<el-button @click="closeImportProcessDialog">取 消</el-button>
-			<el-button type="primary" @click="submitImportProcess">确 定</el-button>
-		  </div>
-		</template>
-	  </el-dialog>
-	  
-	</div>
-  </template>
-  <script>
-  //点击按钮显示下方表格
-  export default {
-	data() {
-	  return {
-		currentTable: '', // 当前展示的表格
-		activeName: 'first',
-		_ddhval:'',
-		 size: '',
-		add_gddialogFormVisible: true,
-	  };
-	}
-  };
-  </script> 
-  
-  <script setup> 
-  // 全量引入格式化工具 请按需保留
-  import $script from 'scriptjs'
-  import $ from 'jquery';
-  import LuckyExcel from 'luckyexcel';
-  import { toRaw } from 'vue';
-  import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
-  import { ElMessage, ElMessageBox, ElUpload, ElButton, ElLoading } from 'element-plus'
-  // 生产环境为按需引入,手动 import 组件不会带样式;补全 Upload,避免 picture-card 退化成原生「选择文件」
-  import 'element-plus/es/components/upload/style/css'
-  import 'element-plus/es/components/button/style/css'
-  import 'element-plus/es/components/image-viewer/style/css'
-  import { Plus } from '@element-plus/icons-vue'
-  import { ref, reactive, computed, nextTick, watch, onMounted, onBeforeUnmount, isRef } from 'vue'
-  import axios from 'axios';
-  import * as XLSX from 'xlsx';
-  import jsPDF from 'jspdf';
-  import 'vxe-table/lib/style.css';
-  import { VxeTable, VxeColumn } from 'vxe-table';
-  import Sortable from '@/utils/vendor/sortable.esm.js'
-  import {Datalist,WorkOrderList,WorkOrderAdd,PrintListData,
-  printDetailAdd,PrintDetailDel,orderDataDel,getWorkOrder,
-  getSuborder,PrintDataEdit,WorkOrderEdit,gdAnnexAdd,upload,OrderAttachments,
-  getPonumber,FabricEdit,orderBomList,FabricDetail,fabricList,Bomdel,delfujian,Read_File,Read_Add,PartList,GetProcessList,
-  AddPart,UpdatePartInfo,DeletePart,AddProcess,UpdateProcess,DeleteProcess,getproducttype,workorderprocessCopy,sortProcess,getProductStyleList,copyProcessToCurrentWorkOrder,
-  importProcess,getWorkOrderProcess,updateWorkOrderPlanManufacture,checkProcessReport,confirmProcessSplit,updateOrderRemarkAndFinishDate} from '@/api/mes/job'
-  import {ParList,ProcessList} from '@/api/yunyin/product'
-  import PrintPage from './components/print.vue'
-  import luckyexcelPage from './components/luckyexcel.vue'
-  import AddGongYi from './components/addGongYi.vue'
-  import ProcessProduction from '@/view/SalaryManage/ProcessProduction.vue'
-  import { ensureProcessProductionData } from '@/utils/processProductionDialog'
-  import { useUserStore } from '@/pinia/modules/user';
-  defineOptions({name: 'Company'})
-  //定义打印跳转页面
-  const printPageRef = ref()
-  const luckyexcelPageRef = ref()
-  //获取登录用户信息
-  const userStore = useUserStore()
-  const _username = ref('')
-  _username.value = userStore.userInfo.userName + '/' + userStore.userInfo.nickName
-  console.log('获取用户名称',_username.value)
-  //全局获取当前日期
-  const today = new Date();
-  const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始,需要补零
-  const day = String(today.getDate()).padStart(2, '0');
-  const hours = String(today.getHours()).padStart(2, '0');
-  const minutes = String(today.getMinutes()).padStart(2, '0');
-  const seconds = String(today.getSeconds()).padStart(2, '0');
-  const currentDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-  const currentDates = `${year}-${month}-${day}`;
-  
-  //==============图片上传=============
-  //测试环境前端
-  // const uploadUrl = ref('http://mes-dacheng-api:8083/index.php/api/work_order/ImgUpload') 
-  
-  // 获取环境变量
-  const basePath = import.meta.env.VITE_BASE_PATH;
-  const uploadsPort = import.meta.env.VITE_UPLOADS_PORT;
-  // 动态生成路径
-  let path = basePath && uploadsPort ? `${basePath}:${uploadsPort}` : undefined;
-  // 如果 path 是 undefined,则使用默认地址
-  if (!path || path.includes("undefined")) {
-	  console.log("第一路径获取失败,尝试使用备用地址 http://192.168.28.22:8082");
-	  path = "http://192.168.28.22:8082";
-  }
-  // 如果还是 undefined,再降级到本地地址
-  if (path.includes("undefined")) {
-	  console.log("备用地址获取失败,使用本地地址 http://127.0.0.1:58082");
-	  path = "http://127.0.0.1:58082";
-  }
-  console.log("最终获取地址:", path);
-  
-  /** 将接口返回的相对路径 img 转为可预览的完整 URL(与上传服务同源) */
-  const buildFullImageUrl = (imgRel) => {
-	if (!imgRel || typeof imgRel !== 'string') return '';
-	const trimmed = imgRel.trim();
-	if (/^https?:\/\//i.test(trimmed)) return trimmed;
-	const base = String(path).replace(/\/$/, '');
-	const rel = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
-	return `${base}${rel}`;
-  };
-
-  // 上传的URL
-  const uploadUrl = ref(`${path}/api/work_order/ImgUpload`);
-  // const uploadUrl = ref("http://192.168.28.22:8082/api/work_order/ImgUpload");
-  const uploadHeaders = { 'Content-Type': 'multipart/form-data' };
-  const fileList = reactive([]);
-  const uploadRef = ref(null);
-
-  /** 根据 img 相对/绝对路径同步 el-upload 展示列表(修改订单回显图片) */
-  const syncUploadFileList = (imgRel) => {
-	fileList.splice(0, fileList.length);
-	if (!imgRel || typeof imgRel !== 'string') return;
-	const url = buildFullImageUrl(imgRel);
-	if (!url) return;
-	fileList.push({
-	  uid: Date.now(),
-	  name: imgRel.split('/').pop() || 'image.jpg',
-	  url,
-	  status: 'success',
-	});
-  };
-
-  // 预览图片(页内放大,不新开标签页)
-  const imgPreviewVisible = ref(false)
-  const imgPreviewList = ref([])
-  const handlePreview = (file) => {
-	const previewUrl = file.url || buildFullImageUrl(file.response?.data?.data?.url)
-	if (!previewUrl) {
-	  ElMessage.warning('暂无可预览的图片')
-	  return
-	}
-	imgPreviewList.value = [previewUrl]
-	imgPreviewVisible.value = true
-  }
-  const closeImgPreview = () => {
-	imgPreviewVisible.value = false
-	imgPreviewList.value = []
-  }
-  // 移除图片
-  const handleRemove = () => {
-	fileList.splice(0, fileList.length);
-	add_gdscgdformData.img = '';
-	if (edit_ddformData.value) edit_ddformData.value.img = '';
-  };
-  // 上传错误处理
-  const handleError = (err, file, fileList) => {
-	console.error('上传失败:', err);
-	ElMessage.error(`图片上传失败: ${err.message || '未知错误'}`);
-  };
-  // 上传前的检查与图片压缩
-  const beforeUpload = (file) => {
-	const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png';
-	const isLt500K = file.size / 1024 < 500;
-	if (!isJPGOrPNG) {
-	  ElMessage.error('上传图片只能是 JPG 或 PNG 格式!');
-	  return false;
-	}
-	if (!isLt500K) {
-	  ElMessage.error('上传图片大小不能超过 500KB!');
-	  return false;
-	}
-	// 图片格式和大小符合,压缩图片
-	return new Promise((resolve, reject) => {
-	  const reader = new FileReader();
-	  reader.readAsDataURL(file);
-	  reader.onload = () => {
-		const img = new Image();
-		img.src = reader.result;
-		img.onload = () => {
-		  const canvas = document.createElement('canvas');
-		  const ctx = canvas.getContext('2d');
-		  const fixedWidth = 300;
-		  const fixedHeight = 300;
-		  canvas.width = fixedWidth;
-		  canvas.height = fixedHeight;
-		  ctx.drawImage(img, 0, 0, fixedWidth, fixedHeight);
-		  canvas.toBlob((blob) => {
-			const compressedFile = new File([blob], file.name, { type: file.type });
-			resolve(compressedFile);
-		  }, file.type);
-		};
-	  };
-	  reader.onerror = (error) => {
-		ElMessage.error('图片处理失败');
-		reject(error);
-	  };
-	});
-  };
-  // 上传成功处理
-  const handleSuccess = (response, file, fileList) => {
-	console.log('上传成功:', response, file, fileList);
-  };
-  // 自定义上传逻辑
-  const customUpload = async (options) => {
-	try {
-	  const formData = new FormData();
-	  formData.append('image', options.file);
-	  const response = await axios.post(uploadUrl.value, formData, {
-		headers: uploadHeaders,
-		onUploadProgress: (progressEvent) => {
-		  options.onProgress({
-			percent: Math.round((progressEvent.loaded * 100) / progressEvent.total),
-		  });
-		},
-	  });
-	  if (response.data.code === 0) {
-		const imgUrl = response.data.data.url;
-		options.onSuccess(response.data);
-		ElMessage.success('图片上传成功');
-		add_gdscgdformData.img = imgUrl;
-		if (edit_ddformData.value) edit_ddformData.value.img = imgUrl;
-		syncUploadFileList(imgUrl);
-	  } else {
-		throw new Error(response.data.msg);
-	  }
-	} catch (error) {
-	  console.error('上传失败:', error);
-	  options.onError(error);
-	  ElMessage.error(`上传失败: ${error.message}`);
-	}
-  };
-  
-
-
-
-
-  // =========== 左侧树侧形结构 =========== 
-  const treeData = ref([])
-  const tableData = ref([])
-  const _Gd_khdh = ref(null)
-  const defaultProps = {  
-		children: 'children',  
-		label: 'label'  
-	  };  
-  const Datalistdata = async () => {
-	try {
-	  const Datalists = await Datalist();
-	  console.log(Datalists)
-	Datalists.data.forEach(id => {  
-	  treeData.value.push({  
-		label: id,
-	  });  
-	}); 
-	} catch (error) {
-	  console.error(error);
-	}
-  };
-  Datalistdata();
-  
-  //点击左侧树形获取编号
-  const handleNodeClick = async (node) => {
-	  ystableData.splice(0, ystableData.length);
-	  parttableData.splice(0, parttableData.length);
-	  gytableData.splice(0, gytableData.length);
-	  ddtableData.splice(0, ddtableData.length);
-	  jstableData.splice(0, jstableData.length);
-	  fhdtableData.splice(0, fhdtableData.length);
-	  // 取消所有节点的颜色
-	  const allNodes = document.querySelectorAll('.treecolor .el-tree-node');
-		  allNodes.forEach(node => {
-		  node.querySelector('.el-tree-node__label').style.color = '';
-	  });
-	  // 获取点击的节点 给当前点击的节点改变颜色【红色】
-	  const clickedNodeId = node['$treeNodeId'];
-	  const clickedNode = document.querySelector(`.treecolor .el-tree-node[data-key="${clickedNodeId}"]`);
-	  if (clickedNode) {
-		  clickedNode.querySelector('.el-tree-node__label').style.color = 'red';
-	  }
-	  ystableData.length = 0
-	  searchInfo.value = '';
-	  _Gd_khdh.value = node.label.split('【')[0];
-	  _WorkList_page();
-  };
-  
-	const InvoiceVisible = ref(false)
-	const InvoicetableData = ref([])
-	const _mesval = ref('')
-
-	const fahuodan = async(row)=>{
-		
-	 const Read_Filelist = await Read_File({
-	     UniqId: row['UniqId'],
-	     order: row['关联编号'],
-	     url: path
-	 })
-	 if(Read_Filelist.code === 0){
-		 console.log(Read_Filelist)
-		 InvoiceVisible.value = true
-		 const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
-		 sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
-		 InvoicetableData.value = Read_Filelist.data
-		 _mesval.value = Read_Filelist.msg
-		 console.log(_mesval)
-	 }
-	}
-	//取消
-	const InvoiceDialog = () => {
-		InvoiceVisible.value = false
-	}
-	
-	const InvoiceenterDialog = async() => {
-		console.log(InvoicetableData.value)
-		// InvoiceVisible.value = false
-		
-		const rawValueArray = InvoicetableData.value;
-		const formattedData = rawValueArray
-		.map(item => {
-				return {
-				  sys_id: _username.value,
-				  订单编号: item.订单编号,
-				  子订单编号: item.子订单编号,
-				  尺码: item.尺码,
-				  制单数量: item.制单数量,
-				  发货数量: item.发货数量,
-				  发货箱数: item.发货箱数,
-				  每箱件数: item.每箱件数
-				}
-		});
-		console.log(formattedData);
-		const Read_Addres = await Read_Add(formattedData)
-		console.log(Read_Addres)
-		if(Read_Addres.msg === '成功'){
-			ElMessage({type: 'success',message: '处理成功'})
-			InvoiceVisible.value = false
-		}
-	}
-
-	
-  // 删除
-  const deleteItem = async (row) => {
-	console.log(_username.value.split('/')[1])
-	console.log(row.sys_id.split('/')[1])
-
-	const delfujian_del = await delfujian({UniqId:row['UniqId'],登录用户:_username.value.split('/')[1],建档用户:row.sys_id.split('/')[1]});
-	if(delfujian_del.code === 0){
-		ElMessage({type: 'success',message: '删除成功'})
-	}else{
-		ElMessage({type: 'error',message: '删除失败'})
-	}
-	tableRowClick (row)
-  }
-  
-  const showPdf = async (row) => {
-	  luckyexcelPageRef.value.open(row)
-  };
-  //调用订单资料列表
-  const _WorkList_page = async () => {
-	  console.log("page",page.value)
-	  console.log("pageSize",pageSize.value)
-	try {
-	  //通过客户编号获取
-	  const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
-	  tableData.value = WorkListdata.data.data
-	  total.value = WorkListdata.data.total
-	} catch (error) {
-	  console.error(error);
-	}
-  };
-  
-  //调用订单资料列表
-  const page_WorkList_page = async () => {
-	  console.log("page",page.value)
-	  console.log("pageSize",pageSize.value)
-	try {
-	  //通过客户编号获取
-	  const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
-	  tableData.value = WorkListdata.data.data
-	  total.value = WorkListdata.data.total
-	} catch (error) {
-	  console.error(error);
-	}
-  };
-  
-  //============订单资料============
-  //订单资料修改
-  const ddzl_dialogFormVisible = ref(false)
-  const edit_ddformData = ref({
-	   合并: false,
-  })
-  // 双击订单表格
-  const updateCompanyFunc = async (row) => {
-	  await getProductStyleData();
-	  if (row.water === '1') {
-		  edit_ddformData.value = { 合并: true };
-	  } else {
-		  edit_ddformData.value = { 合并: false };
-	  }
-	  Object.assign(edit_ddformData.value, row);
-	  ddzl_dialogFormVisible.value = true;
-	  await nextTick();
-	  syncUploadFileList(edit_ddformData.value.img);
-  }
-  
-  // Sys_id 形如「账号/角色」,安全取「/」后一段,避免空值或格式异常导致白屏
-  const getSysIdPart = (sysId) => {
-	  const parts = String(sysId ?? '').split('/')
-	  return parts.length > 1 ? parts[1] : ''
-  }
-
-  //订单资料修改确认
-  const dd_edit_Dialog = async () => {
-	  const orderSysPart = getSysIdPart(edit_ddformData.value?.Sys_id)
-	  const userSysPart = getSysIdPart(_username.value)
-	  if (orderSysPart !== userSysPart && userSysPart !== '超级管理员') {
-		  return ElMessage({ type: 'error', message: '无法修改其他用户订单数据' })
-	  }
-	  //日期转换
-	  let lhrq_formattedDeliveryDate = '';
-	  if (edit_ddformData.value.落货日期) {
-		  const date = new Date(edit_ddformData.value.落货日期);
-		  lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
-	  }
-	  let params = {};
-	  params.订单编号 = edit_ddformData.value.订单编号
-	  params.生产款号 = edit_ddformData.value.生产款号
-	  params.客户编号 = edit_ddformData.value.客户编号
-	  params.款式 = edit_ddformData.value.款式
-	  params.箱唛要求 = edit_ddformData.value.箱唛要求
-	  params.面料 = edit_ddformData.value.面料
-	  params.要求 = edit_ddformData.value.要求
-	  params.船样描述 = edit_ddformData.value.船样描述
-	  params.船样合计 = edit_ddformData.value.船样合计
-	  params.粘衬 = edit_ddformData.value.粘衬
-	  params.订单数量 = edit_ddformData.value.订单数量
-	  params.单位 = edit_ddformData.value.单位
-	  params.接单日期 = edit_ddformData.value.接单日期
-	  params.落货日期 = lhrq_formattedDeliveryDate
-	  params.Sys_id = edit_ddformData.value.Sys_id
-	  params.id = edit_ddformData.value.Uniqid
-	  params.img = edit_ddformData.value.img
-	  console.log(params)
-	  try {
-		  const WorkOrderEdit_list = await WorkOrderEdit(params);
-		  if (WorkOrderEdit_list.code === 0) {
-			  ddzl_dialogFormVisible.value = false;
-			  _WorkList_page()
-			  ElMessage({ type: 'success', message: '修改成功' })
-		  } else {
-			  ElMessage({ type: 'error', message: WorkOrderEdit_list.msg || WorkOrderEdit_list.message || '修改失败' })
-		  }
-	  } catch (error) {
-		  console.error(error);
-		  const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '修改失败,请重试'
-		  ElMessage({ type: 'error', message: msg })
-	  }
-  }
-  
-  //订单资料修改取消
-  const dd_closeDialog = async () => {
-	ddzl_dialogFormVisible.value = false;
-	syncUploadFileList('');
-  }
-  
-  
-  //=============颜色资料============
-  //颜色资料修改
-  const dialogFormVisible = ref(false)
-  //尺码
-  const edit_cmformdata = reactive({
-	cm1:'',
-	cm2:'',
-	cm3:'',
-	cm4:'',
-	cm5:'',
-	cm6:'',
-	cm7:'',
-	cm8:'',
-	cm9:'',
-	cm10:'',
-	cm11:'',
-	cm12:'',
-	cm13:'',
-	cm14:'',
-	sctotal:'总计',
-  });
-  //制单数
-  const edit_zdsformdata = reactive({
-	zds1:'',
-	zds2:'',
-	zds3:'',
-	zds4:'',
-	zds5:'',
-	zds6:'',
-	zds7:'',
-	zds8:'',
-	zds9:'',
-	zds10:'',
-	zds11:'',
-	zds12:'',
-	zds13:'',
-	zds14:'',
-	zdtotal:'',
-  });
-  const Uniqid = ref('')//颜色资料Uniqid
-  
-  
-  
-  //颜色资料表格双击
-  const ysupdateCompanyFunc = async (row) => {
-	  dialogFormVisible.value = true;
-	  edit_formData.value = { ...row };
-	  console.log(row)
-	  edit_formData['子订单编号'] = row['子订单编号']
-	  edit_formData['颜色备注'] = row['颜色备注']
-	  edit_formData['款号'] = row['款号']
-	  edit_formData['船样'] = row['船样']
-	  edit_formData['颜色'] = row['颜色']
-	  edit_colorcode.value =row['color_id']
-	  Uniqid.value = row['Uniqid']
-	  //获取色系名称列表
-	  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
-	  getSuborderscolor.colorlist = getSuborders.data.colorlist;
-	  let index = 1;  
-	  // 创建一个函数来构建尺码和数量的映射  
-	  function buildSizeQuantitiesMap(sizes, formData) {  
-		  const sizeQuantitiesMap = {};  
-		  sizes.forEach(size => {  
-			  // 使用逻辑或操作符确保所有尺码都有数量(默认为0,但如果有值则使用那个值)  
-			  const quantity = formData[size] || 0;  
-			  sizeQuantitiesMap[size] = quantity;  
-		  });  
-		  return sizeQuantitiesMap;  
-	  }  
-	  // 使用函数构建映射  
-	  let sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);  
-	  let edit_params = {};
-	  for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {  
-		  edit_params[`cm${index}`] = size;  
-		  edit_params[`cmsl${index++}`] = quantity;  
-	  }  
-	  for (let i = 1; i <= 14; i++) {
-		  edit_cmformdata[`cm${i}`] = edit_params[`cm${i}`] || '';
-		  edit_zdsformdata[`zds${i}`] = (edit_params[`cmsl${i}`] === 0 || edit_params[`cmsl${i}`] === null) ? '' : edit_params[`cmsl${i}`];
-	  }
-	  //计算尺码数量总数合计
-	  updateTotal()
-  };
-  
-  //自动计算制单数总计(仅数字,自动去掉空格及其他字符)
-  function updateTotal() {  
-	const relevantKeys = ['zds1', 'zds2', 'zds3', 'zds4', 'zds5', 'zds6', 'zds7', 'zds8', 'zds9', 'zds10', 'zds11', 'zds12', 'zds13', 'zds14'];
-	relevantKeys.forEach((key) => {
-	  zdsformdata[key] = String(zdsformdata[key] ?? '').replace(/[^\d]/g, '')
-	  edit_zdsformdata[key] = String(edit_zdsformdata[key] ?? '').replace(/[^\d]/g, '')
-	})
-	const values = relevantKeys.map(key => parseInt(zdsformdata[key], 10) || 0);
-	zdsformdata.zdtotal = values.reduce((sum, value) => sum + value, 0);
-	const valuess = relevantKeys.map(key => parseInt(edit_zdsformdata[key], 10) || 0);
-	edit_zdsformdata.zdtotal = valuess.reduce((sum, value) => sum + value, 0);
-  }  
-  
-  //点击是否船样 改变子订单编号
-  const edit_cyChange = async (value) => {
-	if (value === '是') {
-		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:edit_formData['颜色']});
-		  edit_formData['子订单编号'] = getSuborders.data;
-	  }else if(value === '否'){
-		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
-		  edit_formData['子订单编号'] = getSuborders.data.order;
-	}
-  };
-  
-  //修改颜色资料确认
-  const ys_edit_Dialog = async () => {
-	  updateTotal()
-	  if (!edit_formData.value) return;
-	  
-	  //获取颜色编号id
-	  const getPonumberdata = await getSuborder({colorname:edit_formData['颜色'],order:_ddhval.value,cy:edit_formData['船样']});
-	  // 从返回中提取 colorlist
-	  const colorlist = getPonumberdata.data.colorlist || [];
-	  // 获取匹配的颜色项
-	  const match = colorlist.find(item => item.colorname === edit_formData['颜色']);
-	  if (match) {
-	    edit_colorcode.value = match.colorcode;
-	  } else {
-	    console.warn('未找到匹配的颜色');
-	  }
-	  
-	  function buildSizeQuantitiesMap(sizes, formData) {  
-		  const sizeQuantitiesMap = {};  
-		  sizes.forEach(size => {  
-			// 使用逻辑或操作符确保所有尺码的数量  
-			const quantity = formData[size] || 0; 
-			sizeQuantitiesMap[size] = quantity;  
-		  });  
-		  return sizeQuantitiesMap;  
-	  }  
-	
-	// 使用函数构建映射  
-	const sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);  
-	let index = 1;  
-	const params = {  
-	  订单编号: edit_formData.value.订单编号,  
-	  子订单编号: edit_formData.子订单编号,  
-	  款号: edit_formData.款号,  
-	  颜色备注: edit_formData.颜色备注,
-	  船样: edit_formData.船样 === '是' ? '1' : '0', // 转换船样字段  
-	  颜色: edit_formData.颜色,  
-	  color_id:edit_colorcode.value,
-	  zdtotal: edit_zdsformdata.zdtotal,  
-	  Sys_id: edit_formData.value.Sys_id,  
-	  id: Uniqid.value,  
-	};  
-	for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {  
-	  params[`cm${index}`] = size;  
-	   const cmslValue = +edit_zdsformdata[`zds${index}`]; // 获取对应的数量
-	   params[`cmsl${index++}`] = cmslValue === 0 ? "" : cmslValue; // 如果为0,赋值为空字符串 
-	}  
-	console.log(params)
-	//颜色资料修改接口
-	const PrintDataEdit_list = await PrintDataEdit(params);
-	if(PrintDataEdit_list.code === 0){
-		dialogFormVisible.value = false;
-	  ElMessage({type: 'success',message: '修改成功'})
-	  //数据列表显示
-	  const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
-	  const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
-	  const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
-	  //颜色资料
-	  if(PrintListDatas.data.列表.length === 0 ){
-		ystableData.length = 0
-	  }else{
-		sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//型号数据
-		ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
-		// 使用 map 方法创建一个新数组,并转换船样字段  
-		const newData = PrintListDatas.data.列表.map(item => ({  
-			...item,  
-			船样: item.船样 === 1 ? '是' : '否'  
-		}));  
-		// 将新数组赋值给 ystableData,这会触发视图更新,清空旧数据(可选,如果不需要保留旧数据的话)  
-		ystableData.length = 0;  
-		ystableData.push(...newData);
-	  }
-	  tableRowClick(params)
-	}else{
-	  ElMessage({type: 'error',message: '修改失败'})
-	}
-  };
-  
-  //颜色资料修改取消
-  const ys_edit_closeDialog = async (row) => {
-	  dialogFormVisible.value = false;
-  };
-  
-  const mlinventoryVisible = ref(false)
-  const historytableData = ref([])
-  // //双击面料库存
-  // const mlupdateCompanyFunc = async (row) => {
-  //   mlinventoryVisible.value = true;
-  // }
-  
-  //库存测试
-  const CSclick = async (row) => {
-	mlinventoryVisible.value = true;
-  }
-  
-  //技术附件弹窗取消
-  const mlcloseDialog = () => {
-	mlinventoryVisible.value = false
-  }
-  // 分页
-  const page = ref(1)
-  const total = ref(0)
-  const pageSize = ref(50)
-  const handleCurrentChange = (val) => {
-	page.value = val;
-	_WorkList_page();
-  };
-  
-  // 修改页面容量 点击多少条/页
-  const handleSizeChange = (val) => {
-	pageSize.value = val;
-	_WorkList_page();
-  };
-  
-  // 款式列表数据
-  const productStyleList = ref([]);
-  
-  // 获取款式列表
-  const getProductStyleData = async () => {
-	try {
-	  const result = await getProductStyleList();
-	  if (result.code === 0) {
-		productStyleList.value = result.data;
-	  } else {
-		ElMessage.error('获取款式列表失败');
-	  }
-	} catch (error) {
-	  console.error('获取款式列表出错:', error);
-	  ElMessage.error('获取款式列表失败');
-	}
-  };
-  
-  // =========== 新增订单资料 ===========
-  const add_gdscgdformData = reactive({
-	订单编号: '',
-	生产款号: '',
-	款式: '',
-	客户编号: '',
-	落货日期: '',
-	箱唛要求: '',
-	面料: '',
-	要求: '',
-	船样描述: '',
-	船样合计: '',
-	粘衬: '',
-	订单数量: '',
-	单位: '件',
-	Sys_id: '',
-	制单日期: '',
-	审核日期: '',
-	合并: false,
-  });
-  
-  
-  const add_gddialogFormVisible = ref(false)
-  //点击新增订单资料按钮
-  const addgd_onclick = async () => {
-
-	console.log("用户信息", _username.value);
-	// 判断客户代号是否为空
-	if (!_Gd_khdh.value) {
-	  ElMessage({ type: 'warning', message: '请选择具体的客户后,再操作此功能' });
-	  return false;
-	}
-	  syncUploadFileList('');
-	  add_gdscgdformData.img = '';
-	  add_gddialogFormVisible.value = true;
-	  zsglddtableData.value = [];
-	  await getProductStyleData();
-	  //获取订单编号接口
-	  const getWorkOrder_list = await getWorkOrder();
-	  add_gdscgdformData['订单编号'] = getWorkOrder_list.data;
-	  add_gdscgdformData['客户编号'] = _Gd_khdh.value
-	  add_gdscgdformData['Sys_id'] = _username.value 
-	  add_gdscgdformData['制单日期'] = currentDates
-  }
-  
-  //操作移除按钮
-  const deleteRow = (index) => {
-	  //当前点击索引值
-	  console.log(index)
-	  console.log(zsglddtableData)
-	  //移除当前行
-	  zsglddtableData.value.splice(index, 1);
-  }
-  const fullscreenLoading = ref(false); // 控制全屏加载
-  const isClickable = ref(true); // 控制按钮是否可点击
-
-  const resetAddOrderForm = () => {
-	Object.assign(add_gdscgdformData, {
-	  订单编号: '',
-	  生产款号: '',
-	  款式: '',
-	  客户编号: '',
-	  落货日期: '',
-	  箱唛要求: '',
-	  面料: '',
-	  要求: '',
-	  备注: '',
-	  船样描述: '',
-	  船样合计: '',
-	  粘衬: '',
-	  订单数量: '',
-	  单位: '件',
-	  Sys_id: '',
-	  制单日期: '',
-	  审核日期: '',
-	  合并: false,
-	  img: '',
-	});
-	zsglddtableData.value = [];
-	syncUploadFileList('');
-  };
-
-  //新增工单资料确定
-  const add_gdenterDialog = async () => {
-	if (!isClickable.value) return;
-
-	// 先校验,通过后再 Loading,避免未填完就全屏卡住
-	const fields = [
-	  { key: '款式', message: '款式不能为空' },
-	  { key: '订单编号', message: '网络异常, 请重新打开' },
-	  { key: '客户编号', message: '网络异常, 请重新打开' },
-	  { key: '落货日期', message: '落货日期不能为空' },
-	  { key: '订单数量', message: '订单数量不能为空' },
-	  { key: '面料', message: '缺少面料信息,无法完成提交,请提供面料数据以便获取BOM资料数据' },
-	];
-	for (const field of fields) {
-	  if (!add_gdscgdformData[field.key]) {
-		ElMessage({ type: 'warning', message: field.message });
-		return;
-	  }
-	}
-	if (!add_gdscgdformData['制单日期']) {
-	  ElMessage({ type: 'warning', message: '制单日期不能为空' });
-	  return;
-	}
-
-	isClickable.value = false;
-	const loadingInstance = ElLoading.service({
-	  lock: true,
-	  text: '正在自动获取生成BOM面料资料,请稍候...',
-	  background: 'rgba(0, 0, 0, 0.8)',
-	  spinner: 'el-icon-loading',
-	});
-
-	try {
-	  let lhrq_formattedDeliveryDate = '';
-	  if (add_gdscgdformData['落货日期']) {
-		const date = new Date(add_gdscgdformData['落货日期']);
-		lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
-	  }
-
-	  const ids = zsglddtableData.value.map(item => item.UNIQID);
-	  const dds = zsglddtableData.value.map(item => item.订单编号);
-	  const uniqueIds = [...new Set(ids)];
-	  const uniqueDds = [...new Set(dds)];
-	  const formattedIds = uniqueIds.join(',');
-	  const formattedDds = uniqueDds.join(',');
-
-	  console.log('关联订单编号:', formattedDds);
-	  console.log('关联订单UNIQID:', formattedIds);
-
-	  const formattedData = {
-		订单编号: add_gdscgdformData['订单编号'],
-		生产款号: add_gdscgdformData['生产款号'],
-		款式: add_gdscgdformData['款式'],
-		客户编号: add_gdscgdformData['客户编号'],
-		落货日期: lhrq_formattedDeliveryDate,
-		箱唛要求: add_gdscgdformData['箱唛要求'],
-		面料: add_gdscgdformData['面料'],
-		要求: add_gdscgdformData['备注'],
-		船样描述: add_gdscgdformData['船样描述'],
-		船样合计: add_gdscgdformData['船样合计'],
-		粘衬: add_gdscgdformData['粘衬'],
-		订单数量: add_gdscgdformData['订单数量'],
-		单位: add_gdscgdformData['单位'],
-		Sys_id: _username.value,
-		接单日期: currentDates,
-		img: add_gdscgdformData.img,
-		关联订单: formattedDds,
-		关联面料ID: formattedIds,
-	  };
-
-	  console.log(formattedData);
-
-	  const edit_gdformdata_list = await WorkOrderAdd(formattedData);
-	  if (edit_gdformdata_list.code === 0) {
-		resetAddOrderForm();
-		add_gddialogFormVisible.value = false;
-		ElMessage({ type: 'success', message: '新增成功' });
-		const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: 1, limit: 50 });
-		tableData.value = WorkListdata.data.data;
-	  } else {
-		ElMessage({ type: 'error', message: edit_gdformdata_list.msg || edit_gdformdata_list.message || '新增失败' });
-	  }
-	} catch (error) {
-	  console.error('Error:', error);
-	  const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '操作失败,请重试'
-	  ElMessage({ type: 'error', message: msg });
-	} finally {
-	  isClickable.value = true;
-	  loadingInstance.close();
-	}
-  };
-  //新增工单资料取消 / 关闭
-  const add_gdcloseDialog = (done) => {
-	resetAddOrderForm();
-	add_gddialogFormVisible.value = false;
-	if (typeof done === 'function') done();
-  }
-  
-  
-  
-  // =========== 关联订单资料 ===========
-  const Related_fabricsVisible = ref(false)
-  const glddzl_keyword = ref('')
-  const glddtableData = reactive([])
-  // 关联订单面料按钮
-  const Related_fabrics = () => {
-	  Related_fabricsVisible.value = true
-	  // glddtableData.splice(0, glddtableData.length);//清空表格
-	  ddsearchHandle()
-  }
-  
-  //实时触发input
-  const real_handleInput = async ()=>{
-	  glddtableData.splice(0, glddtableData.length);//清空表格
-	  ddsearchHandle()
-  }
-  
-  // 关联订单面料搜索
-  const ddsearchHandle = async (v) => {
-	  console.log(v)
-	  glddtableData.splice(0, glddtableData.length);//清空表格
-
-	  //搜索面料库存数据列表接口
-	  const response = await fabricList({order:v});
-	if (response.data && response.data.length === 0) {
-	  ElMessage({type: 'warning',message: '未查询到搜索条件'})
-	}else{
-	   // 确保 response.data 和 response.data.table 存在
-	   if (response?.data?.table) {
-		glddtableData.value = response.data.table.map(item => ({
-		  ...item,
-		  checked: false, // 初始化时默认未勾选
-		}));
-		glddtableData.splice(0, response.data.table.total, ...response.data.table);
-	   } else {
-		console.error("response.data.table 不存在或为空:", response.data);
-	  }
-	}
-  }
-  
-  const gldd_Selection = ref('') // 存储选中Uniqid
-  const gldd_Selection_ddbh = ref('') // 存储选中订单编号
-  const zsglddtableData = ref([]) // 存储最终选择的订单数据
-  const currentSelectedRows = ref([]) // 新增:存储当前选中的行数据
-  
-  const glddSelectionChange = (selection) => {
-    console.log("当前选中的数据:", selection)
-    currentSelectedRows.value = selection // 存储当前选中的行数据
-    // 更新 glddtableData 中每一行的 checked 状态
-    glddtableData.value = glddtableData.value.map(item => {
-      return {
-        ...item,
-        checked: selection.some(selectedItem => selectedItem.UNIQID === item.UNIQID)
-      }
-    })
-  }
-  
-  // 关联订单取消
-  const Related_fabricscloseDialog = () => {
-    gldd_Selection.value = ''
-    Related_fabricsVisible.value = false
-  }
-  
-  // 关联订单确定
-  const Related_fabricsenterDialog = () => {
-    if (currentSelectedRows.value.length === 0) {
-      ElMessage.warning('请至少选择一条数据')
-      return
-    }
-    
-    console.log("确定选择的数据:", currentSelectedRows.value)
-    
-    // 将选中的数据添加到 zsglddtableData
-    zsglddtableData.value = [...zsglddtableData.value, ...currentSelectedRows.value]
-    
-    // 提取UNIQID和订单编号
-    gldd_Selection.value = currentSelectedRows.value.map(item => item.UNIQID).join(',')
-    gldd_Selection_ddbh.value = currentSelectedRows.value.map(item => item.订单编号).join(',')
-    
-    // 关闭弹窗
-    Related_fabricsVisible.value = false
-  }
-  
-  
-  // =========== 新增颜色资料 ===========
-  const add_gdyjdialogFormVisible = ref(false)
-  const add_yszlformdata = reactive({
-	ddh: '',
-	ddzbh: '',
-	sxmc: '',
-	cmgg: '',
-	sfcy: '',
-	ysbz: '',
-  });
-  const cmformdata = reactive({
-	cm1:'32',
-	cm2:'34',
-	cm3:'36',
-	cm4:'38',
-	cm5:'40',
-	cm6:'42',
-	cm7:'44',
-	cm8:'46',
-	cm9:'48',
-	cm10:'',
-	cm11:'',
-	cm12:'',
-	cm13:'',
-	cm14:'',
-	sctotal:'总计',
-  });
-  const zdsformdata = reactive({
-	zds1:'',
-	zds2:'',
-	zds3:'',
-	zds4:'',
-	zds5:'',
-	zds6:'',
-	zds7:'',
-	zds8:'',
-	zds9:'',
-	zds10:'',
-	zds11:'',
-	zds12:'',
-	zds13:'',
-	zds14:'',
-	zdtotal:'',
-  });
-  //记录色系编号
-  const add_colorcode = ref('')
-  
-  //选择色系名称获取子订单编号
-  const xz_sxhandleSizeChange =  async  (value,color_id) => {
-	  
-	  //获取子订单编号
-	  const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:add_yszlformdata.sfcy});
-	  console.log("获取子订单编号",getPonumberdata)
-	  add_yszlformdata.ddzbh = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
-	  
-	if (value === '红色系') {
-	  add_yszlformdata.sxmc = value
-	  add_colorcode.value = color_id
-	} else if(value === '黄色系'){
-	 add_yszlformdata.sxmc = value
-	 add_colorcode.value = color_id
-	}else if(value === '蓝色系'){
-	add_yszlformdata.sxmc = value
-	add_colorcode.value = color_id
-	}else if(value === '绿色系'){
-	 add_yszlformdata.sxmc = value
-	 add_colorcode.value = color_id
-	}else if(value === '紫色系'){
-	 add_yszlformdata.sxmc = value
-	 add_colorcode.value = color_id
-	}else if(value === '灰色系'){
-   add_yszlformdata.sxmc = value
-   add_colorcode.value = color_id
-	}else if(value === '咖啡色系'){
-	add_yszlformdata.sxmc = value
-	  add_colorcode.value = color_id
-	}else if(value === '黑色系'){
-	add_yszlformdata.sxmc = value
-	  add_colorcode.value = color_id
-	}else if(value === '经典色系'){
-	add_yszlformdata.sxmc = value
-	  add_colorcode.value = color_id
-	}else if(value === '白色系'){
-	add_yszlformdata.sxmc = value
-	  add_colorcode.value = color_id
-	}
-  };
-  
-  const edit_formData = reactive({
-	'颜色': ''
-  });
-  
-  //记录色系编号
-  const edit_colorcode = ref('')
-  const xg_sxhandleSizeChange =  async (value,color_id) => {
-	  
-	  const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:edit_formData['船样']});
-	  console.log(edit_formData.value)	
-	  if(edit_formData.value['颜色'] === edit_formData['颜色']){
-		  edit_formData['子订单编号'] = edit_formData.value['子订单编号']
-	  }else{
-		  edit_formData['子订单编号'] = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
-	  }
-	if (value === '红色系') {
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	} else if(value === '黄色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '蓝色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '绿色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '紫色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '灰色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '咖啡色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '黑色系'){
-	edit_formData['颜色'] = value
-	  edit_colorcode.value = color_id
-	}else if(value === '经典色系'){
-	edit_formData['颜色'] = value
-	}else if(value === '白色系'){
-	edit_formData['颜色'] = value
-	}
-  };
-  
-  //清空对象的属性值
-  const gdyj_clearFormData = () => {
-	Object.keys(zdsformdata).forEach(key => {
-	  zdsformdata[key] = '';
-	});
-  };
-  
-  
-  //点击是否船样 改变子订单编号
-  const cyChange = async (value) => {
-	if (value === '是') {
-		  add_yszlformdata.ddzbh = _Gd_gdbh.value + '-99'
-		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:add_yszlformdata['sxmc']});
-		  add_yszlformdata['ddzbh'] = getSuborders.data;
-	  }else if(value === '否'){
-		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:add_yszlformdata['sxmc']});
-		  add_yszlformdata['ddzbh'] = getSuborders.data.order;
-	}
-  };
-  
-  const getSuborderscolor = reactive({
-		colorlist: []
-  });
-	  
-  //新增颜色资料按钮
-  const addgdyj_onclick = async  () => {
-	if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
-	  ElMessage({type: 'warning',message: '请选择具体的订单后,再操作此功能'})
-	  return false;
-	}else{
-	  add_gdyjdialogFormVisible.value = true
-	  add_yszlformdata['sxmc'] = '红色系';
-	  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:'红色系'});
-	  console.log(getSuborders)
-	  
-	  
-	  getSuborderscolor.colorlist = getSuborders.data.colorlist;
-			  
-	  add_yszlformdata['ddzbh'] = getSuborders.data.order;
-	  // 假设获取的数据是 getSuborders.data
-	  if (getSuborders.data.cm) {
-		// 判断并赋值
-		cmformdata.cm1 = getSuborders.data.cm.cm1 || '';
-		cmformdata.cm2 = getSuborders.data.cm.cm2 || '';
-		cmformdata.cm3 = getSuborders.data.cm.cm3 || '';
-		cmformdata.cm4 = getSuborders.data.cm.cm4 || '';
-		cmformdata.cm5 = getSuborders.data.cm.cm5 || '';
-		cmformdata.cm6 = getSuborders.data.cm.cm6 || '';
-		cmformdata.cm7 = getSuborders.data.cm.cm7 || '';
-		cmformdata.cm8 = getSuborders.data.cm.cm8 || '';
-		cmformdata.cm9 = getSuborders.data.cm.cm9 || '';
-		cmformdata.cm10 = getSuborders.data.cm.cm10 || '';
-		cmformdata.cm11 = getSuborders.data.cm.cm11 || '';
-		cmformdata.cm12 = getSuborders.data.cm.cm12 || '';
-		cmformdata.cm13 = getSuborders.data.cm.cm13 || '';
-		cmformdata.cm14 = getSuborders.data.cm.cm14 || '';
-		cmformdata.sctotal = '合计';
-	  }
-  
-	  add_yszlformdata['ddh'] = _Gd_gdbh.value;
-	  add_yszlformdata['ys'] = '';
-	  add_yszlformdata['kh'] = '';
-	  add_yszlformdata['sfcy'] = '否';
-	  add_yszlformdata['颜色备注'] = '否';
-	  add_yszlformdata['kdy'] = _username.value;
-	  gdyj_clearFormData();
-	}
-  }
-  
-  
-  
-  const child_order = ref('')
-  //单机颜色资料表格
-  const ystableclick =  async  (row) => {
-	  // console.log(row.子订单编号)
-	  // child_order.value = row.子订单编号
-  }
-
-  //部件资料行点击
-  const partTableRowClick = async (row) => {
-	  // console.log(row.部件编号)
-  }
-
-  //部件资料行双击
-  const partRowDblclick = async (row) => {
-	  // console.log(row.部件编号)
-  }
-  
-//限制尺码输入规则
-function handleSizeInput(field) {
-  // 获取当前字段的值
-  let value = cmformdata[field];
-  // 使用正则表达式过滤,只保留字母和数字,并将字母转换为大写
-  const filteredValue = value.replace(/[^a-zA-Z0-9]/g, '').replace(/[a-z]/g, (match) => match.toUpperCase());
-  // 更新字段值
-  cmformdata[field] = filteredValue; // 直接更新 reactive 对象的属性
-}
-
-
-function Input_handle() {
-  add_gdscgdformData['订单数量'] = add_gdscgdformData['订单数量'].replace(/[^\d]/g, '')
-  add_gdscgdformData['船样合计'] = add_gdscgdformData['船样合计'].replace(/[^\d]/g, '')
-  
-  edit_ddformData.value['订单数量'] = String(edit_ddformData.value['订单数量'] ?? '').replace(/[^\d]/g, '')
-  edit_ddformData.value['船样合计'] = String(edit_ddformData.value['船样合计'] ?? '').replace(/[^\d]/g, '')
-}
-
-
-  //新增颜色资料确定
-  const add_gdyjenterDialog =  async  () => {
-	  updateTotal()
-	  //必填
-	  if(add_yszlformdata['kh'] === ''){
-		  ElMessage({type: 'warning',message: '款号不能为空'})
-		  return false;
-	  }
-	  if(add_yszlformdata['ysbz'] === ''){
-		  ElMessage({type: 'warning',message: '颜色备注不能为空'})
-		  return false;
-	  }
-	  if(add_yszlformdata['sxmc'] === ''){
-		  ElMessage({type: 'warning',message: '色系名称不能为空'})
-		  return false;
-	  }
-  
-	  let cy = '';
-	  if(add_yszlformdata['sfcy'] === '是'){
-		  cy = '1'
-	  }else if(add_yszlformdata['sfcy'] === '否'){
-		  cy = '0'
-	  }
-	  
-	  
-	  //获取颜色编号id
-	  const getPonumberdata = await getSuborder({colorname:add_yszlformdata['sxmc'],order:_ddhval.value,cy:add_yszlformdata['sfcy']});
-	  // 从返回中提取 colorlist
-	  const colorlist = getPonumberdata.data.colorlist || [];
-	  // 获取匹配的颜色项
-	  const match = colorlist.find(item => item.colorname === add_yszlformdata['sxmc']);
-	  if (match) {
-	  		add_colorcode.value = match.colorcode;
-	  } else {
-	  		console.warn('未找到匹配的颜色');
-	  }
-	  
-	const addyszltable = {
-	  订单编号: add_yszlformdata['ddh'],
-	  子订单编号: add_yszlformdata['ddzbh'],
-	  颜色: add_yszlformdata['sxmc'],
-	  款号: add_yszlformdata['kh'],
-	  颜色备注:add_yszlformdata.ysbz,
-	  船样: cy,
-	  Sys_id:add_yszlformdata['kdy'],
-	  color_id:add_colorcode.value,
-	  //尺码
-	  cm1: cmformdata['cm1'],
-	  cm2: cmformdata['cm2'],
-	  cm3: cmformdata['cm3'],
-	  cm4: cmformdata['cm4'],
-	  cm5: cmformdata['cm5'],
-	  cm6: cmformdata['cm6'],
-	  cm7: cmformdata['cm7'],
-	  cm8: cmformdata['cm8'],
-	  cm9: cmformdata['cm9'],
-	  cm10: cmformdata['cm10'],
-	  cm11: cmformdata['cm11'],
-	  cm12: cmformdata['cm12'],
-	  cm13: cmformdata['cm13'],
-	  cm14: cmformdata['cm14'],
-	  sctotal: cmformdata['sctotal'],
-	  //尺码数量
-	  cmsl1: zdsformdata['zds1'],
-	  cmsl2: zdsformdata['zds2'],
-	  cmsl3: zdsformdata['zds3'],
-	  cmsl4: zdsformdata['zds4'],
-	  cmsl5: zdsformdata['zds5'],
-	  cmsl6: zdsformdata['zds6'],
-	  cmsl7: zdsformdata['zds7'],
-	  cmsl8: zdsformdata['zds8'],
-	  cmsl9: zdsformdata['zds9'],
-	  cmsl10: zdsformdata['zds10'],
-	  cmsl11: zdsformdata['zds11'],
-	  cmsl12: zdsformdata['zds12'],
-	  cmsl13: zdsformdata['zds13'],
-	  cmsl14: zdsformdata['zds14'],
-	  zdtotal: zdsformdata['zdtotal'],
-	  };
-	  console.log(addyszltable)
-	  // return;
-	const printDetailAdds = await printDetailAdd(addyszltable);
-	if (printDetailAdds.code === 0) {
-		  add_gdyjdialogFormVisible.value = false;
-		  ElMessage({type: 'success',message: '新增成功'})
-	}
-	const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
-	  if(PrintListDatas.data.列表.length === 0){
-		  ystableData.length = 0
-	  }else{
-		  sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
-		  ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);
-		  
-		  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
-		  bomtableData.value = orderBomListdata.data
-		  bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
-		  
-		  const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
-		  console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
-		  
-		  if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
-			  // 如果 data.table 是数组且不为空,更新表格数据
-			  mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
-		  } else {
-			  // 如果 data.table 为空或无效,清空表格数据
-			  mltableData.splice(0, mltableData.length);
-		  }
-	  }
-	
-  }  
-  
-  
-	
-  
-  //新增颜色资料取消
-  const add_dyjcloseDialog = () => {
-	add_gdyjdialogFormVisible.value = false
-  }
-  //键盘input框跳转
-  const add_gdzlent = async (event,id1,id2,id3,idx) => {
-	if(event.keyCode === 40){
-	  if(id3!=''){
-		document.getElementById(id3).focus()
-	  }
-	}else if (event.keyCode === 13) { // Enter 或向下箭头
-	  if(id3!=''){
-		document.getElementById(id3).focus()
-	  }
-	} else if (event.keyCode === 38) { // 向上箭头
-	  if(id1!=''){
-		document.getElementById(id1).focus()
-	  }
-	}else if (event.keyCode === 8) { // 删除箭头
-	  if(id1!='' && document.getElementById(id2).value==''){
-		document.getElementById(id1).focus()
-	  }
-	}else if (event.keyCode === 37) { // 向左箭头
-	  if(id1!='' && document.getElementById(id2).selectionStart==0){
-		document.getElementById(id1).focus()
-	  }
-	}else if (event.keyCode === 39) { // 向右箭头
-	  if(id3!='' && document.getElementById(id2).selectionStart == document.getElementById(id2).value.length){
-		document.getElementById(id3).focus()
-	  }
-	}
-  }
-  
-  
-  // =========== 新增工序资料 ===========
-  const visible = ref(false)
-  // 新增部件资料相关
-  const partAddDialogVisible = ref(false)
-  const partIsEdit = ref(false)
-  const partAddForm = reactive({
-	  部件序号: '',
-	  部件名称: ''
-  })
-  const partAddRows = ref([])
-  const partAddExistingNames = ref(new Set())
-  const partAddMaxExistingSort = ref(0)
-  const partNameOptions = ref([])
-
-  // 排序相关状态
-const sortPartGyDialogVisible = ref(false)
-const sortDialogLoading = ref(false)
-const sortDialogSewingGroups = ref([])
-const sortDialogStageGys = ref({ 裁剪: [], 手工: [], 大烫: [], 总检: [] })
-const sortDialogViewStage = ref('裁剪')
-const sortDialogSelectedPartId = ref(null)
-const sortDialogInitialSnapshot = ref(null)
-const sortDialogSubmitLoading = ref(false)
-
-// 排序弹窗相关计算属性
-const sortDialogRightPanelReady = computed(() => {
-  const vs = sortDialogViewStage.value
-  if (!vs) return false
-  if (vs === '车缝') return sortDialogSelectedPartId.value != null
-  return true
-})
-
-const sortDialogRightActiveSewingGroup = computed(() => {
-  if (sortDialogViewStage.value !== '车缝' || sortDialogSelectedPartId.value == null) return null
-  return (
-    sortDialogSewingGroups.value.find(
-      (g) => String(g.part?.id) === String(sortDialogSelectedPartId.value)
-    ) ?? null
-  )
-})
-
-const sortDialogActiveGysList = computed(() => {
-  const vs = sortDialogViewStage.value
-  if (vs && vs !== '车缝') {
-    return sortDialogStageGys.value[vs] ?? []
-  }
-  if (vs === '车缝' && sortDialogRightActiveSewingGroup.value) {
-    return sortDialogRightActiveSewingGroup.value.gys ?? []
-  }
-  return []
-})
-
-
-// 复制产品资料相关状态
-const copyProductDialogVisible = ref(false)
-const copyProductFormData = ref({
-  gdbh: '',
-  ks: ''
-})
-const copyProductTableData = ref([])
-const copyProductSelectedRow = ref(null)
-const copyProductTableRef = ref(null)
-const copyProductSearchText = ref('')
-
-// 排序相关常量
-const PROCESS_ADD_STAGE_ORDER = ['裁剪', '车缝', '手工', '大烫', '总检']
-const SORT_NON_SEWING_STAGES = ['裁剪', '手工', '大烫', '总检']
-
-// 排序相关状态
-const sortDialogVisible = ref(false)
-const sortTableData = ref([])
-  
-  // 新增工艺资料相关
-  const processAddDialogVisible = ref(false)
-
-  watch(processAddDialogVisible, async (visible) => {
-    if (!visible && gyDetailDialogVisible.value) {
-      await refreshGyDetailProcessList()
-    }
-  })
-
-  const processIsEdit = ref(false)
-  const processSubmitLoading = ref(false)
-  const processFormRef = ref(null)
-  const processForm = reactive({
-    id: undefined,
-    工艺序号: '',
-    工艺名称: '',
-    生产工序: '',
-    标准工时: undefined,
-    标准工分: undefined,
-    难度系数: 1,
-  })
-  const processFormRules = {
-    工艺名称: [{ required: true, message: '请选择或输入工艺名称', trigger: 'change' }],
-    生产工序: [{ required: true, message: '请选择生产工序', trigger: 'change' }],
-  }
-
-  const processAddPartList = ref([])
-  const processAddSelectedStage = ref('裁剪')
-  const processAddSelectedPartKey = ref(null)
-  const processAddByPartRows = ref({})
-  const processAddActivePart = ref(null)
-  const processAddCurrentRowKey = ref(null)
-  const processLibAddSubmitCount = ref(0)
-
-  const processAddDialogTableHeight = ref(460)
-
-  function processAddStageKey(bigProcess) {
-    return `stg_${String(bigProcess ?? '').trim()}`
-  }
-  function isProcessAddStageListKey(k) {
-    return typeof k === 'string' && k.startsWith('stg_')
-  }
-
-  const PROCESS_LIB_LIST_LIMIT = 200
-  const processLibNameOptions = ref([])
-  const processLibByName = ref({})
-  const processLibFilterQuery = ref('')
-
-  const filteredProcessLibNameOptions = computed(() => {
-    const q = processLibFilterQuery.value.trim().toLowerCase()
-    const list = processLibNameOptions.value
-    if (!q) return list
-    return list.filter((opt) => {
-      const name = String(opt.value ?? '').toLowerCase()
-      const code = String(opt.code ?? '').toLowerCase()
-      const bp = String(opt.big_process ?? '').toLowerCase()
-      return name.includes(q) || code.includes(q) || bp.includes(q) || `${code} ${name}`.trim().includes(q)
-    })
-  })
-
-  const filteredProcessLibNameOptionsForProcessAdd = computed(() => filteredProcessLibNameOptions.value)
-
-  async function loadProcessLibNameOptions(req) {
-    const toNum = (v) => {
-      if (v === undefined || v === null || v === '') return undefined
-      const n = Number(v)
-      return Number.isFinite(n) ? n : undefined
-    }
-    const q = String(req?.search ?? '').trim()
-    try {
-      // 使用 GetProcessList 获取当前工单的工艺数据
-      const res = await GetProcessList({ workorder: _Gd_gdbh.value })
-      if (res?.code !== 0) {
-        processLibNameOptions.value = []
-        processLibByName.value = {}
-        return
-      }
-      const list = res?.data ?? []
-      
-      // 根据大工艺筛选数据
-      let filteredList = list
-      if (q) {
-        filteredList = list.filter((row) => {
-          const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
-          // 车缝包含车缝和烫工(小烫按部件算)
-          if (q === '车缝') {
-            return bp === '车缝' || bp === '烫工'
-          }
-          // 其他工序直接匹配
-          return bp === q
-        })
-      }
-      
-      const seen = new Set()
-      const opts = []
-      const byName = {}
-      for (const row of filteredList) {
-        const name = String(row.gy_name ?? row['工艺名称'] ?? '').trim()
-        if (!name || seen.has(name)) continue
-        seen.add(name)
-        const sort = String(row.gy_sort ?? row.gy_code ?? row['工艺序号'] ?? row['工艺编号'] ?? '').trim()
-        const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
-        opts.push({ value: name, code: sort, big_process: bp })
-        byName[name] = {
-          gy_sort: sort,
-          gy_code: String(row.gy_code ?? row['工艺编号'] ?? '').trim(),
-          big_process: bp,
-          standard_hour: toNum(row.standard_hour ?? row['标准工时']),
-          standard_score: toNum(row.standard_score ?? row['标准公分'] ?? row['标准工分']),
-          difficulty_coef: toNum(row.difficulty_coef ?? row['系数'] ?? row['难度系数']) ?? 1,
-        }
-      }
-      processLibNameOptions.value = opts
-      processLibByName.value = byName
-    } catch (e) {
-      console.error(e)
-      processLibNameOptions.value = []
-      processLibByName.value = {}
-    }
-  }
-
-  function processLibOptStageText(opt) {
-    const s = String(opt?.big_process ?? '').trim()
-    return s || '—'
-  }
-  function onProcessLibSelectFilter(query) {
-    processLibFilterQuery.value = query == null ? '' : String(query)
-  }
-  function onProcessLibSelectVisible(visible) {
-    if (visible) processLibFilterQuery.value = ''
-  }
-
-  function processAddPartBlockKey(part, index) {
-    return `p_${String(part?.id ?? part?.part_sort ?? part?.['部件序号'] ?? index)}`
-  }
-
-  function onProcessAddSelectStage(stage) {
-    processAddSelectedStage.value = stage
-    if (stage !== '车缝') {
-      processAddSelectedPartKey.value = null
-      processAddActivePart.value = null
-      const stgKey = processAddStageKey(stage)
-      processAddCurrentRowKey.value = stgKey
-      if (!processAddByPartRows.value[stgKey]) {
-        processAddByPartRows.value[stgKey] = [newProcessLibRow()]
-      }
-      loadProcessLibNameOptions({ search: stage })
-    } else {
-      const parts = processAddPartList.value
-      if (parts.length) {
-        const first = parts[0]
-        const key = processAddPartBlockKey(first, 0)
-        onProcessAddSelectSewingPart(first, 0)
-      } else {
-        processAddSelectedPartKey.value = null
-        processAddActivePart.value = null
-        processAddCurrentRowKey.value = null
-      }
-    }
-    syncProcessAddSubmitCount()
-  }
-
-  function onProcessAddSelectSewingPart(part, index) {
-    processAddSelectedStage.value = '车缝'
-    const key = processAddPartBlockKey(part, index)
-    processAddSelectedPartKey.value = key
-    processAddActivePart.value = part
-    processAddCurrentRowKey.value = key
-    if (!processAddByPartRows.value[key]) {
-      processAddByPartRows.value[key] = [newProcessLibRow()]
-    }
-    loadProcessLibNameOptions({ search: '车缝' })
-    syncProcessAddSubmitCount()
-  }
-
-  function newProcessLibRow() {
-    return {
-      _key: `proc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
-      工艺序号: '',
-      工艺名称: '',
-      生产工序: '',
-      标准工时: undefined,
-      标准工分: undefined,
-      难度系数: 1,
-    }
-  }
-
-  function onProcessLibNameSelectChangeForPart(key, index) {
-    const rows = processAddByPartRows.value[key]
-    if (!rows) return
-    const row = rows[index]
-    if (!row) return
-    const name = String(row['工艺名称'] ?? '').trim()
-    if (!name) {
-      row['生产工序'] = ''
-      row['标准工时'] = undefined
-      row['标准工分'] = undefined
-      row['难度系数'] = 1
-      return
-    }
-    const lib = processLibByName.value[name]
-    if (lib) {
-      row['生产工序'] = lib.big_process
-      row['标准工时'] = lib.standard_hour
-      row['标准工分'] = lib.standard_score
-      row['难度系数'] = lib.difficulty_coef ?? 1
-    } else {
-      row['生产工序'] = ''
-      row['标准工时'] = undefined
-      row['标准工分'] = undefined
-      row['难度系数'] = 1
-    }
-    if (index === rows.length - 1) {
-      rows.push(newProcessLibRow())
-    }
-    syncProcessAddSubmitCount()
-  }
-
-  function removeProcessLibRowForPart(key, row, index) {
-    const rows = processAddByPartRows.value[key]
-    if (!rows) return
-    if (rows.length <= 1) {
-      ElMessage.warning('至少保留一行')
-      return
-    }
-    rows.splice(index, 1)
-    syncProcessAddSubmitCount()
-  }
-
-  function syncProcessAddSubmitCount() {
-    let n = 0
-    for (const k in processAddByPartRows.value) {
-      const rows = processAddByPartRows.value[k]
-      if (!Array.isArray(rows)) continue
-      for (const r of rows) {
-        const name = String(r['工艺名称'] ?? '').trim()
-        if (name) n++
-      }
-    }
-    processLibAddSubmitCount.value = n
-  }
-
-  function resetProcessLibForm() {
-    processIsEdit.value = false
-    processForm.id = undefined
-    processForm['工艺序号'] = ''
-    processForm['工艺名称'] = ''
-    processForm['生产工序'] = ''
-    processForm['标准工时'] = undefined
-    processForm['标准工分'] = undefined
-    processForm['难度系数'] = 1
-    processAddPartList.value = []
-    processAddByPartRows.value = {}
-    processAddSelectedStage.value = '裁剪'
-    processAddSelectedPartKey.value = null
-    processAddActivePart.value = null
-    processAddCurrentRowKey.value = null
-    processLibAddSubmitCount.value = 0
-    processFormRef.value?.clearValidate?.()
-  }
-
-  // 打开新增工艺资料弹窗
-  const addgdgy_onclick = async () => {
-	if(!_Gd_gdbh.value){
-	  ElMessage.warning('请先选择具体的工单后,再操作此功能')
-	  return
-	}
-	// 初始化工艺添加相关数据
-	resetProcessLibForm()
-	try {
-	  // 获取部件列表
-	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
-	  if (partRes?.code !== 0 || !Array.isArray(partRes.data)) {
-		ElMessage.error('获取部件列表失败')
-		return
-	  }
-	  const parts = partRes.data
-	  processAddPartList.value = parts
-	  
-	  // 加载工艺库
-	  await loadProcessLibNameOptions({ search: '裁剪' })
-	  
-	  // 设置默认选中的工序
-	  processAddSelectedStage.value = '裁剪'
-	  const stgKey = processAddStageKey('裁剪')
-	  processAddCurrentRowKey.value = stgKey
-	  processAddByPartRows.value[stgKey] = [newProcessLibRow()]
-	  
-	  // 如果有部件,设置默认选中的部件
-	  if (parts.length) {
-		const first = parts[0]
-		const key = processAddPartBlockKey(first, 0)
-		processAddByPartRows.value[key] = [newProcessLibRow()]
-	  }
-	  
-	  processAddDialogVisible.value = true
-	} catch (e) {
-	  console.error('获取工艺名称列表失败', e)
-	  ElMessage.error('获取工艺名称列表失败')
-	}
-  }
-
-  // 打开新增工艺资料弹窗
-  const openProcessAdd = async () => {
-	await addgdgy_onclick()
-  }
-
-  // 部件列表数据
-  const partListData = ref([])
-
-  // 打开新增部件资料弹窗
-  const openPartAdd = async () => {
-	if(!_Gd_gdbh.value){
-	  ElMessage.warning('请先选择具体的工单后,再操作此功能')
-	  return
-	}
-	resetPartLibForm()
-	// 获取部件名称下拉列表
-	try {
-	  // 调用ParList获取部件列表
-	  const parRes = await ParList({ page: 1, limit: 100 })
-	  console.log('ParList接口返回数据:', parRes)
-	  if (parRes?.code === 0) {
-		  const list = parRes?.data?.list ?? []
-		  console.log('部件列表数据:', list)
-		  partListData.value = list
-		  // 提取部件名称
-		  const seen = new Set()
-		  const opts = []
-		  for (const row of list) {
-			const name = String(row.part_name ?? row['部件名称'] ?? '').trim()
-			if (!name || seen.has(name)) continue
-			seen.add(name)
-			opts.push(name)
-		  }
-		  partNameOptions.value = opts
-		  console.log('部件名称选项:', partNameOptions.value)
-	  }
-	  // 获取已存在的部件名称和最大序号
-	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
-	  if (partRes?.code === 0 && Array.isArray(partRes.data)) {
-		  partAddExistingNames.value = new Set(partRes.data.map(p => p.部件名称))
-		  // 计算已存在的最大部件序号
-		  let maxSort = 0
-		  for (const part of partRes.data) {
-			const sort = Number(part.部件序号) || 0
-			if (sort > maxSort) {
-			  maxSort = sort
-			}
-		  }
-		  partAddMaxExistingSort.value = maxSort
-	  }
-	} catch (e) {
-	  console.error('获取部件名称列表失败', e)
-	  ElMessage.error('获取部件名称列表失败')
-	}
-	// 初始化新增行
-	partAddRows.value = [newPartLibRow()]
-	syncPartAddRowSorts()
-	partAddDialogVisible.value = true
-  }
-
-  // 重置部件表单
-  const resetPartLibForm = () => {
-	partIsEdit.value = false
-	partAddForm.部件序号 = ''
-	partAddForm.部件名称 = ''
-	partAddForm.部件编号 = ''
-	partAddForm.部件类型 = ''
-	partAddForm.部件备注 = ''
-	partAddRows.value = []
-	partAddMaxExistingSort.value = 0
-	partAddExistingNames.value = new Set()
-	// 不要清空partNameOptions,因为它是通过ParList接口获取的
-  }
-
-  // 新建部件行
-  const newPartLibRow = () => {
-	return {
-	  _key: Date.now() + Math.random(),
-	  部件序号: '',
-	  部件名称: '',
-	  部件编号: '',
-	  部件类型: '',
-	  部件备注: ''
-	}
-  }
-
-  // 同步部件行序号
-  const syncPartAddRowSorts = () => {
-	const rows = partAddRows.value
-	const base = partAddMaxExistingSort.value
-	for (let i = 0; i < rows.length; i++) {
-	  rows[i].部件序号 = String(base + i + 1)
-	}
-  }
-
-  // 部件名称变化处理
-  const onPartNameChange = (index) => {
-	const row = partAddRows.value[index]
-	if (!row) return
-	const name = String(row.部件名称 ?? '').trim()
-	if (name) {
-	  // 检查是否重复
-	  if (partAddExistingNames.value.has(name)) {
-	    ElMessage.warning('该工单下已存在该部件名称,请勿重复添加')
-	    row.部件名称 = ''
-	    return
-	  }
-	  
-	  // 检查同批添加中是否重复
-	  for (let i = 0; i < partAddRows.value.length; i++) {
-	    if (i === index) continue
-	    if (String(partAddRows.value[i].部件名称 ?? '').trim() === name) {
-	      ElMessage.warning('该部件名称已在其他行选择,请勿重复')
-	      row.部件名称 = ''
-	      return
-	    }
-	  }
-	  
-	  // 根据部件名称填充部件编号、部件类型和部件备注
-	  const part = partListData.value.find(p => {
-	    return String(p.part_name ?? p['部件名称'] ?? '').trim() === name
-	  })
-	  if (part) {
-	    row.部件编号 = String(part.part_code ?? part['部件编码'] ?? '').trim()
-	    row.部件类型 = ''
-	    row.部件备注 = '' // 默认为空
-	  }
-	  
-	  // 自动添加新行
-	  if (index === partAddRows.value.length - 1) {
-	    partAddRows.value.push(newPartLibRow())
-	    syncPartAddRowSorts()
-	  }
-	} else {
-	  // 清空相关字段
-	  row.部件编号 = ''
-	  row.部件类型 = ''
-	  row.部件备注 = ''
-	}
-  }
-
-  // 删除部件行
-  const removePartRow = (index) => {
-	if (partAddRows.value.length <= 1) {
-	  ElMessage.warning('至少保留一行')
-	  return
-	}
-	partAddRows.value.splice(index, 1)
-	syncPartAddRowSorts()
-  }
-
-  // 关闭新增部件资料弹窗
-  const partAddCloseDialog = () => {
-	partAddDialogVisible.value = false
-  }
-
-  // 确认新增部件资料
-  const partAddConfirm = async () => {
-	// 收集有效行
-	const validRows = []
-	for (const row of partAddRows.value) {
-	  const name = String(row.部件名称 ?? '').trim()
-	  if (name) {
-		validRows.push({
-		  part_name: name,
-		  part_code: String(row.部件编号 ?? '').trim(),
-		  part_type: String(row.部件类型 ?? '').trim(),
-		  remark: String(row.部件备注 ?? '').trim(),
-		  part_sort: String(row.部件序号 ?? '').trim()
-		})
-	  }
-	}
-	
-	if (validRows.length === 0) {
-	  ElMessage.warning('请至少填写一个部件')
-	  return
-	}
-	
-	try {
-	  for (const row of validRows) {
-		const res = await AddPart({
-			workorder: _Gd_sckh.value,
-			part_name: row.part_name,
-			part_code: row.part_code,
-			part_type: row.part_type,
-			remark: row.remark,
-			sys_id: userStore.userInfo.nickName
-		})
-		if (res?.code !== 0) {
-		  throw new Error(res.msg || '新增部件资料失败')
-		}
-	  }
-	  ElMessage.success('新增部件资料成功')
-	  partAddDialogVisible.value = false
-	  // 刷新部件资料列表
-	  await loadPartAndProcessData()
-	} catch (e) {
-	  console.error('新增部件资料失败', e)
-	  ElMessage.error(e.message || '新增部件资料失败')
-	}
-  }
-
-  // 关闭新增工艺资料弹窗
-  const processAddCloseDialog = () => {
-	processAddDialogVisible.value = false
-  }
-
-  // 确认新增工艺资料
-  const processAddConfirm = async () => {
-	// 收集有效行
-	const validRows = []
-	for (const key in processAddByPartRows.value) {
-	  const rows = processAddByPartRows.value[key]
-	  if (!Array.isArray(rows)) continue
-	  for (const row of rows) {
-	    const name = String(row.工艺名称 ?? '').trim()
-	    const stage = String(row.生产工序 ?? '').trim()
-	    if (name && stage) {
-	      validRows.push({
-	        key: key,
-	        process_name: name,
-	        big_process: stage,
-	        process_code: String(row.工艺序号 ?? '').trim(),
-	        standard_hour: row.标准工时,
-	        standard_score: row.标准工分,
-	        coefficient: row.难度系数
-	      })
-	    }
-	  }
-	}
-	
-	if (validRows.length === 0) {
-	  ElMessage.warning('请至少填写一个工艺')
-	  return
-	}
-	
-	try {
-	  for (const row of validRows) {
-		// 确定部件号:如果是车缝工序,从部件中获取部件编号作为部件号
-		let part_code = ''
-		if (row.big_process === '车缝' && processAddActivePart.value) {
-		  part_code = String(processAddActivePart.value.part_code ?? processAddActivePart.value['部件编号'] ?? '').trim()
-		}
-		
-		const res = await AddProcess({
-			workorder: _Gd_gdbh.value,
-			part_code: part_code,
-			process_name: row.process_name,
-			process_code: row.process_code,
-			big_process: row.big_process,
-			standard_hour: row.standard_hour,
-			standard_score: row.standard_score,
-			coefficient: row.coefficient,
-			remark: '',
-			sys_id: userStore.userInfo?.nickName || ''
-		})
-		if (res?.code !== 0) {
-		  throw new Error(res.msg || '新增工艺资料失败')
-		}
-	  }
-	  ElMessage.success('新增工艺资料成功')
-	  processAddDialogVisible.value = false
-	  // 刷新工艺资料列表
-	  await loadPartAndProcessData()
-	} catch (e) {
-	  console.error('新增工艺资料失败', e)
-	  ElMessage.error(e.message || '新增工艺资料失败')
-	}
-  }
-
-  // 打开排序弹窗
-  const openSortDialog = async () => {
-	await openSortPartGyDialog()
-  }
-
-  // 打开排序弹窗(新)
-  const openSortPartGyDialog = async () => {
-	if(!_Gd_gdbh.value){
-	  ElMessage.warning('请先选择具体的工单后,再操作此功能')
-	  return
-	}
-	sortPartGyDialogVisible.value = true
-	sortDialogLoading.value = true
-	sortDialogSewingGroups.value = []
-	sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
-	try {
-	  // 获取部件列表
-	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
-	  const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
-	  
-	  // 获取工艺列表
-	  const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
-	  const rawGy = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
-	  const gyNorm = rawGy.map((r) => normalizeGyRow(r))
-	  
-	  // 构建排序数据
-	  sortDialogSewingGroups.value = buildSortSewingGroups(parts, rawGy)
-	  sortDialogStageGys.value = buildSortStageGys(gyNorm)
-	  reindexSortDialogGroupsDisplay()
-	  sortDialogViewStage.value = '裁剪'
-	  sortDialogSelectedPartId.value = sortDialogSewingGroups.value[0]?.part?.id ?? null
-	  sortDialogInitialSnapshot.value = JSON.stringify(snapshotSortDialogStateV2())
-	  
-	  // 加载工艺库数据
-	//   await loadProcessLibNameOptions({ search: '裁剪' })
-	} catch (e) {
-	  console.error('加载排序数据失败', e)
-	  ElMessage.error('加载排序数据失败')
-	} finally {
-	  sortDialogLoading.value = false
-	}
-	bindSortPartGyDrag()
-  }
-
-  // 关闭排序弹窗
-  const sortCloseDialog = () => {
-	sortPartGyDialogVisible.value = false
-  }
-
-  // 排序弹窗关闭时的清理
-  const onSortPartGyDialogClosed = () => {
-	destroySortPartGySortables()
-	sortDialogSewingGroups.value = []
-	sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
-	sortDialogViewStage.value = '裁剪'
-	sortDialogSelectedPartId.value = null
-	sortDialogInitialSnapshot.value = null
-  }
-
-  // 数字排序键
-  const numSortKey = (v) => {
-	if (v === undefined || v === null || v === '') return 0
-	const n = Number(v)
-	return Number.isFinite(n) ? n : 0
-  }
-
-  // 按部件序号升序排序
-  const sortByPartSortAsc = (parts) => {
-	return [...parts].sort((a, b) => numSortKey(a.部件序号) - numSortKey(b.部件序号))
-  }
-
-  // 标准化工艺行数据
-  const normalizeGyRow = (row) => {
-	return {
-	  id: row.工艺ID || row.id,
-	  gy_name: row.工艺名称 || row.gy_name,
-	  '工艺名称': row.工艺名称 || row.gy_name,
-	  big_process: row.大工艺 || row.生产工序 || row.big_process,
-	  '大工艺': row.大工艺 || row.生产工序 || row.big_process,
-	  part_sort: row.部件序号 || row.part_sort,
-	  '部件序号': row.部件序号 || row.part_sort,
-	  part_name: row.部件名称 || row.part_name,
-	  '部件名称': row.部件名称 || row.part_name,
-	  part_code: row.部件编号 || row.part_code,
-	  '部件编号': row.部件编号 || row.part_code,
-	  gy_sort: row.工艺序号 || row.gy_sort,
-	  '工艺序号': row.工艺序号 || row.gy_sort,
-	  gy_code: row.工艺编号 || row.gy_code,
-	  '工艺编号': row.工艺编号 || row.gy_code,
-	  standard_hour: row.标准工时 || row.standard_hour,
-	  '标准工时': row.标准工时 || row.standard_hour,
-	  standard_score: row.标准公分 || row.标准工分 || row.standard_score,
-	  '标准公分': row.标准公分 || row.标准工分 || row.standard_score,
-	  '标准工分': row.标准公分 || row.标准工分 || row.standard_score,
-	  difficulty_coef: row.系数 || row.难度系数 || row.difficulty_coef,
-	  '系数': row.系数 || row.难度系数 || row.difficulty_coef,
-	  '难度系数': row.系数 || row.难度系数 || row.difficulty_coef,
-	  remark: row.备注 || row.remark,
-	  '备注': row.备注 || row.remark
-	}
-  }
-
-  // 构建车缝工序的部件-工艺分组(包含车缝和烫工)
-  const buildSortSewingGroups = (parts, processes) => {
-	const list = sortByPartSortAsc(Array.isArray(parts) ? parts : [])
-	console.log('部件列表:', list)
-	console.log('工艺列表:', processes)
-	return list.map((part) => {
-	  const partName = String(part.部件名称 || '').trim()
-	  console.log('处理部件:', partName)
-	  const gys = processes
-		.map((g) => {
-		  const normalized = normalizeGyRow(g)
-		  // 保留原始字段
-		  return {
-			...g,
-			...normalized
-		  }
-		})
-		.filter((g) => {
-		  const bigProcess = String(g.big_process ?? g.大工艺 ?? '').trim()
-		  const processPartName = String(g.part_name ?? g.部件名称 ?? '').trim()
-		  // 车缝包含车缝和烫工(小烫按部件算)
-		  const match = (bigProcess === '车缝' || bigProcess === '烫工') && processPartName === partName
-		  console.log('过滤工艺:', { bigProcess, processPartName, partName, match })
-		  return match
-		})
-		.sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
-	  console.log('匹配的工艺:', gys)
-	  return { part: { ...part, id: part.部件ID || part.id }, gys }
-	})
-  }
-
-  // 构建非车缝工序的工艺列表
-  const buildSortStageGys = (processes) => {
-	const stages = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
-	for (const raw of processes) {
-	  const g = normalizeGyRow({ ...raw })
-	  const bp = String(g.big_process ?? '').trim()
-	  if (bp === '车缝' || !SORT_NON_SEWING_STAGES.includes(bp)) continue
-	  stages[bp].push(g)
-	}
-	for (const st of SORT_NON_SEWING_STAGES) {
-	  stages[st] = (stages[st] || []).sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
-	}
-	return stages
-  }
-
-  // 重新索引排序对话框中的显示序号
-  const reindexSortDialogGroupsDisplay = () => {
-	sortDialogSewingGroups.value.forEach((grp, i) => {
-	  const partSortStr = String(i + 1)
-	  if (grp.part && typeof grp.part === 'object') {
-		grp.part.part_sort = partSortStr
-	  }
-	  const partName = String(grp.part?.部件名称 ?? '').trim()
-	  const gys = grp.gys
-	  if (!Array.isArray(gys)) return
-	  gys.forEach((row, j) => {
-		const gyStr = String(j + 1)
-		row.gy_sort = gyStr
-		row['工艺序号'] = gyStr
-		row.part_sort = partSortStr
-		row['部件序号'] = partSortStr
-		row.part_name = partName
-		row['部件名称'] = partName
-		row.big_process = '车缝'
-		row['生产工序'] = '车缝'
-		// 确保工艺名称等属性存在
-		if (!row['工艺名称']) {
-		  row['工艺名称'] = row.gy_name || row.工艺名称 || ''
-		}
-		if (!row['标准工时']) {
-		  row['标准工时'] = row.standard_hour || row.标准工时 || ''
-		}
-		if (!row['标准工分']) {
-		  row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
-		}
-		if (!row['难度系数']) {
-		  row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
-		}
-	  })
-	})
-	for (const st of SORT_NON_SEWING_STAGES) {
-	  const gys = sortDialogStageGys.value[st] || []
-	  gys.forEach((row, j) => {
-		const gyStr = String(j + 1)
-		row.gy_sort = gyStr
-		row['工艺序号'] = gyStr
-		row.part_sort = ''
-		row['部件序号'] = ''
-		row.part_name = ''
-		row['部件名称'] = ''
-		row.big_process = st
-		row['生产工序'] = st
-		// 确保工艺名称等属性存在
-		if (!row['工艺名称']) {
-		  row['工艺名称'] = row.gy_name || row.工艺名称 || ''
-		}
-		if (!row['标准工时']) {
-		  row['标准工时'] = row.standard_hour || row.标准工时 || ''
-		}
-		if (!row['标准工分']) {
-		  row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
-		}
-		if (!row['难度系数']) {
-		  row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
-		}
-	  })
-	}
-  }
-
-  // 快照排序对话框状态
-  const snapshotSortDialogStateV2 = () => {
-	return {
-	  sewing: sortDialogSewingGroups.value.map((g) => ({
-		partId: g.part?.id,
-		partCode: g.part?.部件编号,
-		gyIds: g.gys.map((gy) => gy.id)
-	  })),
-	  stages: Object.fromEntries(
-		SORT_NON_SEWING_STAGES.map((st) => [
-		  st,
-		  sortDialogStageGys.value[st]?.map((gy) => gy.id) || []
-		])
-	  )
-	}
-  }
-
-  // 绑定部件和工艺的拖拽功能
-  const bindSortPartGyDrag = () => {
-	destroySortPartGySortables()
-	if (!sortPartGyDialogVisible.value) return
-	
-	// 绑定部件拖拽
-	const partListEl = document.querySelector('.sort-part-gy-sewing-parts')
-	if (partListEl) {
-		new Sortable(partListEl, {
-			draggable: '.sort-part-gy-part-item',
-			animation: 180,
-			onEnd: (event) => {
-				if (event.oldIndex !== event.newIndex) {
-					// 重新排序部件
-					const groups = [...sortDialogSewingGroups.value]
-					const [moved] = groups.splice(event.oldIndex, 1)
-					groups.splice(event.newIndex, 0, moved)
-					sortDialogSewingGroups.value = groups
-					// 重新索引
-					reindexSortDialogGroupsDisplay()
-				}
-			}
-		})
-	}
-	
-	// 绑定工艺拖拽
-	const processTableEl = document.querySelector('.sort-gy-table .el-table__body-wrapper tbody')
-	if (processTableEl) {
-		new Sortable(processTableEl, {
-			handle: '.sort-drag-handle',
-			animation: 180,
-			onEnd: (event) => {
-				if (event.oldIndex !== event.newIndex) {
-					const stage = sortDialogViewStage.value
-					if (stage === '车缝' && sortDialogSelectedPartId.value) {
-						// 车缝工艺排序
-						const group = sortDialogSewingGroups.value.find(
-							g => String(g.part?.id) === String(sortDialogSelectedPartId.value)
-						)
-						if (group && Array.isArray(group.gys)) {
-							const gys = [...group.gys]
-							const [moved] = gys.splice(event.oldIndex, 1)
-							gys.splice(event.newIndex, 0, moved)
-							group.gys = gys
-							// 重新索引
-							reindexSortDialogGroupsDisplay()
-						}
-					} else if (stage && SORT_NON_SEWING_STAGES.includes(stage)) {
-						// 非车缝工艺排序
-						const gys = [...sortDialogStageGys.value[stage]]
-						const [moved] = gys.splice(event.oldIndex, 1)
-						gys.splice(event.newIndex, 0, moved)
-						sortDialogStageGys.value[stage] = gys
-						// 重新索引
-						reindexSortDialogGroupsDisplay()
-					}
-				}
-			}
-		})
-	}
-  }
-
-  // 销毁拖拽实例
-  const destroySortPartGySortables = () => {
-	// 这里可以添加销毁拖拽实例的代码
-	// 由于我们使用的是局部变量创建Sortable实例,不需要显式销毁
-  }
-
-  // 选择排序对话框的视图工序
-  const onSortDialogViewStageSelect = async (stage) => {
-	sortDialogViewStage.value = stage
-	if (stage !== '车缝') {
-		sortDialogSelectedPartId.value = null
-	}
-	// 加载工艺库数据
-	const loadSt = stage === '车缝' ? '车缝' : stage
-	await loadProcessLibNameOptions({ search: loadSt })
-	// 重新绑定拖拽
-	nextTick(() => {
-		destroySortPartGySortables()
-		bindSortPartGyDrag()
-	})
-  }
-
-  // 选择车缝工序的部件
-  const onSortDialogSelectSewingPart = async (partId) => {
-	sortDialogSelectedPartId.value = partId
-	sortDialogViewStage.value = '车缝'
-	// 加载工艺库数据
-	await loadProcessLibNameOptions({ search: '车缝' })
-	// 重新绑定拖拽
-	nextTick(() => {
-		destroySortPartGySortables()
-		bindSortPartGyDrag()
-	})
-  }
-
-  // 排序弹窗中工艺名称变化处理
-  const onSortDialogGyNameChange = (row) => {
-	const name = String(row['工艺名称'] ?? '').trim()
-	if (!name) return
-	const info = processLibByName.value[name]
-	if (info) {
-		row['标准工时'] = info.standard_hour
-		row['标准工分'] = info.standard_score
-		row['难度系数'] = info.difficulty_coef ?? 1
-		if (!row['生产工序'] && info.big_process) {
-			row['生产工序'] = info.big_process
-			row.big_process = info.big_process
-		}
-	}
-  }
-
-  // 复制产品资料 - 打开弹窗
-  const copyProductData = () => {
-	if(!_Gd_gdbh.value){ 
-	  ElMessage.warning('请先选择具体的工单')
-	  return
-	}
-	
-	copyProductTableData.value = []
-	copyProductFormData.value.gdbh = _Gd_gdbh.value
-	copyProductFormData.value.ks = ''
-	copyProductSelectedRow.value = null
-	copyProductSearchText.value = ''
-	copyProductDialogVisible.value = true
-  }
-
-  // 复制产品资料搜索
-  const copyProductSearch = async () => {
-	if(!copyProductSearchText.value.trim()){
-	  ElMessage.warning('请输入搜索内容')
-	  return
-	}
-	
-	try {
-	  const res = await WorkOrderList({ search: copyProductSearchText.value, page: 1, limit: 100 })
-	  if (res?.code === 0 && res.data && Array.isArray(res.data.data)) {
-		copyProductTableData.value = res.data.data
-		copyProductSelectedRow.value = null
-	  } else {
-		copyProductTableData.value = []
-		ElMessage.info('未找到匹配的工单')
-	  }
-	} catch (e) {
-	  console.error('搜索工单失败', e)
-	  ElMessage.error('搜索工单失败')
-	}
-  }
-
-  // 复制产品资料表格行点击
-  const copyProductTableRowClick = (row) => {
-	copyProductSelectedRow.value = row
-	copyProductFormData.value['生产款号'] = row.生产款号 || ''
-  }
-
-  // 复制产品资料确认
-  const copyProductHandleConfirm = async () => {
-	if(!copyProductSelectedRow.value) {
-	  ElMessage.warning('请选择要复制的工单')
-	  return
-	}
-	
-	try {
-	  // 调用copyProcessToCurrentWorkOrder接口
-	  const res = await copyProcessToCurrentWorkOrder({
-		target_workorder: copyProductSelectedRow.value.订单编号,
-		current_workorder: _Gd_gdbh.value,
-		sys_id: userStore.userInfo.nickName
-	  })
-	  
-	  if (res?.code === 0) {
-		ElMessage.success('复制工艺资料成功')
-		copyProductDialogVisible.value = false
-		// 刷新数据
-		await loadPartAndProcessData()
-	  } else {
-		ElMessage.error('复制工艺资料失败')
-	  }
-	} catch (e) {
-	  console.error('复制工艺资料失败', e)
-	  ElMessage.error('复制工艺资料失败')
-	}
-  }
-
-  // 复制产品资料取消
-  const copyProductHandleCancel = () => {
-	copyProductDialogVisible.value = false
-	copyProductSelectedRow.value = null
-  }
-
-  // 保存排序
-  const submitSortPartGy = async () => {
-	if (!_Gd_gdbh.value) return
-	
-	sortDialogSubmitLoading.value = true
-	try {
-	  // 构建工艺排序数据
-	  const process_list = []
-	  
-	  // 处理车缝工艺
-	  sortDialogSewingGroups.value.forEach((g) => {
-		const rows = g.gys || []
-		for (let j = 0; j < rows.length; j++) {
-		  const r = rows[j]
-		  if (r.id == null) continue
-		  process_list.push({
-			id: r.id,
-			process_code: j + 1
-		  })
-		}
-	  })
-	  
-	  // 处理非车缝工艺
-	  for (const st of SORT_NON_SEWING_STAGES) {
-		const rows = sortDialogStageGys.value[st] || []
-		for (let j = 0; j < rows.length; j++) {
-		  const r = rows[j]
-		  if (r.id == null) continue
-		  process_list.push({
-			id: r.id,
-			process_code: j + 1
-		  })
-		}
-	  }
-	  
-	  if (process_list.length === 0) {
-		ElMessage.warning('无工艺数据可保存')
-		return
-	  }
-	  
-	  // 调用保存接口
-	  const res = await sortProcess(process_list)
-	  
-	  if (res?.code === 0) {
-		ElMessage.success('排序保存成功')
-		sortPartGyDialogVisible.value = false
-		// 刷新数据
-		await loadPartAndProcessData()
-	  } else {
-		ElMessage.error(res?.msg || '保存失败')
-	  }
-	} catch (e) {
-	  console.error('保存排序失败', e)
-	  ElMessage.error('保存排序失败')
-	} finally {
-	  sortDialogSubmitLoading.value = false
-	}
-  }
-
-  // 排序对话框是否有数据
-  const sortDialogHasData = computed(() => {
-	return sortDialogSewingGroups.value.length > 0 || 
-	  Object.values(sortDialogStageGys.value).some(gys => gys.length > 0)
-  })
-
-
-
-
-  // 加载排序表格数据
-  const loadSortTableData = async () => {
-	try {
-	  // 获取部件列表
-	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
-	  const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
-
-	  // 获取工艺列表
-	  const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
-	  const processes = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
-
-	  // 构建排序表格数据
-	  sortTableData.value = parts.map(part => ({
-		  部件ID: part.部件ID || part.id,
-		  部件编号: part.部件编号,
-		  部件名称: part.部件名称,
-		  gyList: processes.filter(gy => String(gy.部件编号) === String(part.部件编号))
-	  }))
-	} catch (e) {
-	  console.error('加载排序数据失败', e)
-	  ElMessage.error('加载排序数据失败')
-	}
-  }
-
-
-  // 确认排序
-  const sortConfirm = async () => {
-	try {
-	  // 按顺序更新部件序号
-	  for (let i = 0; i < sortTableData.value.length; i++) {
-		  const part = sortTableData.value[i]
-		  await UpdatePartInfo({
-			  workorder: _Gd_gdbh.value,
-			  part_code: part.部件编号,
-			  part_sort: i + 1
-		  })
-		  // 按顺序更新工艺序号
-		  const gyList = part.gyList
-		  for (let j = 0; j < gyList.length; j++) {
-			  const gy = gyList[j]
-			  await UpdateProcess({
-				  workorder: _Gd_gdbh.value,
-				  part_code: part.部件编号,
-				  process_code: gy.工艺编号,
-				  process_sort: j + 1
-			  })
-		  }
-	  }
-	  ElMessage.success('排序保存成功')
-	  sortDialogVisible.value = false
-	  // 刷新部件和工艺列表
-	  await loadPartAndProcessData()
-	} catch (e) {
-	  console.error('保存排序失败', e)
-	  ElMessage.error('保存排序失败')
-	}
-  }
-
-  // 刷新部件和工艺数据
-  const loadPartAndProcessData = async () => {
-	const partListData = await PartList({ workorder: _Gd_gdbh.value });
-	if (partListData?.code === 0 && Array.isArray(partListData.data)) {
-		parttableData.splice(0, parttableData.length, ...partListData.data);
-	} else {
-		parttableData.splice(0, parttableData.length);
-	}
-
-	const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
-	if (processListData?.code === 0 && Array.isArray(processListData.data)) {
-		gytableData.splice(0, gytableData.length, ...processListData.data);
-	} else {
-		gytableData.splice(0, gytableData.length);
-	}
-  }
-
-  //新增工序资料确定按钮
-  const add_gxenterDialog = () => {
-	  console.log(form)
-	  const formattedData = {
-		  ckck: form['仓库出库'],
-		  cq: form['裁剪'],
-		  cf: form['车缝'],
-		  hdsy: form['手工'],
-		  dt: form['大烫'],
-		  zj: form['总检'],
-		  bz: form['包装']
-	  };
-	  // true 选择 fasle 未选择
-	  for (let key in formattedData) {
-		  if (formattedData[key] === true) {
-			  formattedData[key] = 1;
-		  } else if (formattedData[key] === false) {
-			  formattedData[key] = 2;
-		  }
-	  }
-		console.log(formattedData)
-  }
-  
-  //新增工序资料取消按钮
-  const add_gxcloseDialog = () => {
-	  visible.value = false;
-  }
-  
-  // =========== 工艺资料详情弹窗 ===========
-  const gyDetailDialogVisible = ref(false)
-  const gyDetailFormData = reactive({
-    订单编号: '',
-    客户编号: '',
-    生产款号: '',
-    款式: '',
-    落货日期: '',
-    审核日期: '',
-    接单日期: '',
-    审核: '',
-    订单数量: '',
-    计划制造工分: '',
-    工单完工日期: null,
-    备注: '',
-    Sys_id: '',
-    Sys_rq: '',
-    img: '',
-    工艺列表: []
-  })
-  
-  // 工艺详情列筛选
-  const dagongxuFilters = computed(() => {
-    const processes = new Set(
-      gyDetailFormData.工艺列表
-        .filter((item) => !item._gyDetailNew)
-        .map((item) => item.大工序)
-        .filter(Boolean)
-    )
-    return Array.from(processes).map((process) => ({ text: process, value: process }))
-  })
-
-  const gyDetailBuJianMingChengFilterOptions = computed(() => {
-    const names = new Set(
-      gyDetailFormData.工艺列表
-        .filter((item) => !item._gyDetailNew)
-        .map((item) => item.部件名称)
-        .filter(Boolean)
-    )
-    return Array.from(names).map((name) => ({ text: name, value: name }))
-  })
-
-  const gyDetailDifficultyFilterOptions = computed(() => {
-    const values = new Set(gyDetailDifficultyOptions)
-    for (const item of gyDetailFormData.工艺列表 || []) {
-      if (item._gyDetailNew) continue
-      const v = normalizeGyDetailField(item?.难度系数)
-      if (v) values.add(v)
-    }
-    return Array.from(values).map((v) => ({ text: v, value: v }))
-  })
-
-  const gyDetailStatusFilterOptions = [
-    { text: '正常', value: '0' },
-    { text: '被拆分', value: '1' },
-  ]
-
-  const getGyDetailRowStatusFilterValue = (row) => {
-    const code = Number(row?.状态)
-    if (code === 1) return '1'
-    if (code === 0) return '0'
-    return normalizeGyDetailField(row?.状态)
-  }
-  
-  const gdgyupdateCompanyFunc = async (row) => {
-    const workorder = _Gd_gdbh.value || row['订单编号'] || ''
-    if (!workorder) {
-      ElMessage.warning('请先选择订单')
-      return
-    }
-    
-    try {
-      // 获取订单信息
-      const orderInfoRes = await WorkOrderList({ search: workorder, page: 1, limit: 1 })
-      if (orderInfoRes.code === 0 && orderInfoRes.data && orderInfoRes.data.data && orderInfoRes.data.data.length > 0) {
-        const data = orderInfoRes.data.data[0]
-        gyDetailFormData.订单编号 = data['订单编号'] || ''
-        gyDetailFormData.客户编号 = data['客户编号'] || ''
-        gyDetailFormData.生产款号 = data['生产款号'] || ''
-        gyDetailFormData.款式 = data['款式'] || ''
-        gyDetailFormData.落货日期 = data['落货日期'] || ''
-        gyDetailFormData.制单日期 = data['Sys_rq'] || ''
-        gyDetailFormData.接单日期 = data['接单日期'] || ''
-        // 制单人:如果有/则显示/后的值,否则全部显示
-        const sysId = data['Sys_id'] || ''
-        gyDetailFormData.制单人 = sysId.includes('/') ? sysId.split('/')[1] : sysId
-        gyDetailFormData.订单数量 = data['订单数量'] || ''
-        gyDetailFormData.计划制造工分 = data['计划制造工分'] || ''
-        const finishDateRaw = String(data['工单完工日期'] || '').trim()
-        gyDetailFormData.工单完工日期 = finishDateRaw || null
-        gyDetailFormData.备注 = data['remark'] || ''
-        gyDetailFormData.Sys_id = data['Sys_id'] || data['sys_id'] || row?.['Sys_id'] || row?.['sys_id'] || ''
-        gyDetailFormData.Sys_rq = data['Sys_rq'] || data['sys_rq'] || ''
-        gyDetailFormData.Uniqid = data['Uniqid'] || ''
-      }
-      
-      // 获取工艺列表
-      const processRes = await getWorkOrderProcess({ workorder })
-      if (processRes.code === 0 && Array.isArray(processRes.data)) {
-        gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
-      } else {
-        gyDetailFormData.工艺列表 = []
-      }
-      
-      initGyDetailFilters()
-      gyDetailPlanManufactureEditing.value = false
-      gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分
-      gyDetailDialogVisible.value = true
-      await nextTick()
-      updateGyDetailTableHeight()
-    } catch (error) {
-      console.error('获取工艺资料详情失败', error)
-      ElMessage.error('获取工艺资料详情失败')
-    }
-  }
-  
-  const gyDetailSelection = ref([])
-  const gyDetailDeleting = ref(false)
-  const gyDetailSaving = ref(false)
-  const gyDetailTableWrapRef = ref(null)
-  const gyDetailTableRef = ref(null)
-  const gyDetailTableHeight = ref(480)
-  const gyDetailTableMinWidth = 1320
-  let gyDetailResizeObserver = null
-
-  const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
-  
-  const isGyDetailCellEditable = (column) => {
-    const editableColumns = ['部件名称', '工序名称', '大工序', '工分', '定额分']
-    if (editableColumns.includes(column)) {
-      return true
-    }
-    return !gyDetailReadonly.value
-  }
-  const gyDetailEditingCell = ref(null)
-  const gyDetailCellInputRef = ref(null)
-  const gyDetailLastEditingField = ref(null)
-  const isGyDetailNavigating = ref(false)
-
-  const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
-  const gyDetailDifficultyOptions = ['A', 'B', 'C']
-
-  const sanitizeGyDetailDecimalInput = (val) => {
-    if (val === null || val === undefined) return ''
-    let s = String(val).replace(/[^\d.]/g, '')
-    const dotIndex = s.indexOf('.')
-    if (dotIndex !== -1) {
-      s = s.slice(0, dotIndex + 1) + s.slice(dotIndex + 1).replace(/\./g, '')
-    }
-    return s
-  }
-
-  /** 四舍五入保留两位;空/非法返回空串 */
-  const roundGyDetail2 = (n) => {
-    if (!Number.isFinite(n)) return ''
-    return (Math.round(n * 100) / 100).toFixed(2)
-  }
-
-  /**
-   * 工分 ↔ 金额 ↔ 秒/分 联动
-   * 秒 = 60/0.25 * 金额;分 = 秒/60
-   * 金额 = 工分 * 0.067;工分 = 金额 / 0.067
-   * (两式互为倒数;若都乘 0.067 无法双向换算)
-   */
-  const applyGyDetailScoreMoneyCalc = (row, sourceField) => {
-    if (!row || (sourceField !== '定额分' && sourceField !== '金额')) return
-    const raw = String(row[sourceField] ?? '').trim()
-    if (raw === '' || raw === '.') {
-      if (sourceField === '定额分') {
-        row.金额 = ''
-        row.秒 = ''
-        row.分 = ''
-      } else {
-        row.定额分 = ''
-        row.秒 = ''
-        row.分 = ''
-      }
-      return
-    }
-    const num = parseFloat(raw)
-    if (!Number.isFinite(num)) return
-
-    if (sourceField === '定额分') {
-      const money = num * 0.067
-      const seconds = (60 / 0.25) * money
-      row.金额 = roundGyDetail2(money)
-      row.秒 = roundGyDetail2(seconds)
-      row.分 = roundGyDetail2(seconds / 60)
-      return
-    }
-
-    const score = num / 0.067
-    const seconds = (60 / 0.25) * num
-    row.定额分 = roundGyDetail2(score)
-    row.秒 = roundGyDetail2(seconds)
-    row.分 = roundGyDetail2(seconds / 60)
-  }
-
-  const onGyDetailDecimalInput = (row, field, val) => {
-    row[field] = sanitizeGyDetailDecimalInput(val)
-    applyGyDetailScoreMoneyCalc(row, field)
-    refreshGyDetailTableFooter()
-  }
-
-  const formatGyDetailCellText = (val) => {
-    if (val === null || val === undefined) return ''
-    return String(val)
-  }
-
-  /** 工艺状态:0 正常,1 被拆分(接口可能为字符串) */
-  const formatGyDetailStatus = (status) => {
-    const code = Number(status)
-    if (code === 1) return '被拆分'
-    if (code === 0) return '正常'
-    return ''
-  }
-
-  const isGyDetailRowSplit = (row) => Number(row?.状态) === 1
-
-  const isGyDetailCellEditing = (row, field) => {
-    if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return false
-    const editing = gyDetailEditingCell.value
-    return editing?.rowKey === row._rowKey && editing?.field === field
-  }
-
-  const setGyDetailCellInputRef = (el) => {
-    gyDetailCellInputRef.value = el
-  }
-
-  const startGyDetailCellEdit = (row, field) => {
-    if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
-    // 先清除之前的输入框引用,确保新输入框能正确获取焦点
-    gyDetailCellInputRef.value = null
-    gyDetailEditingCell.value = { rowKey: row._rowKey, field }
-  }
-
-  // 键盘导航字段顺序
-  const navFields = ['部件名称', '工序名称', '秒', '分', '定额分', '金额']
-  
-  // 处理单元格键盘事件
-  const handleGyDetailCellKeydown = async (event, row, field) => {
-    const key = event.key
-    
-    // 只处理方向键
-    if (!['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp'].includes(key)) {
-      return
-    }
-    
-    // 阻止浏览器默认行为(页面滚动)
-    event.preventDefault()
-    
-    const fieldIndex = navFields.indexOf(field)
-    
-    // 如果不是导航字段,不处理
-    if (fieldIndex === -1) return
-    
-    const processList = gyDetailFormData.工艺列表
-    const rowIndex = processList.findIndex(r => r._rowKey === row._rowKey)
-    
-    if (rowIndex === -1) return
-    
-    let targetRow = row
-    let targetField = field
-    let shouldMove = false
-    
-    switch (key) {
-      case 'ArrowRight':
-        // 向右移动到下一个字段
-        if (fieldIndex < navFields.length - 1) {
-          targetField = navFields[fieldIndex + 1]
-          shouldMove = true
-        }
-        break
-      case 'ArrowLeft':
-        // 向左移动到上一个字段
-        if (fieldIndex > 0) {
-          targetField = navFields[fieldIndex - 1]
-          shouldMove = true
-        }
-        break
-      case 'ArrowDown':
-        // 向下移动到下一行
-        if (rowIndex < processList.length - 1) {
-          targetRow = processList[rowIndex + 1]
-          shouldMove = true
-        }
-        break
-      case 'ArrowUp':
-        // 向上移动到上一行
-        if (rowIndex > 0) {
-          targetRow = processList[rowIndex - 1]
-          shouldMove = true
-        }
-        break
-    }
-    
-    // 如果需要移动,切换焦点
-    if (shouldMove) {
-      // 先完成当前单元格的编辑(保存数据)
-      await finishGyDetailCellEdit(row)
-      // 然后移动到新单元格
-      startGyDetailCellEdit(targetRow, targetField)
-    }
-  }
-
-  const clearGyDetailCellEdit = () => {
-    gyDetailEditingCell.value = null
-    gyDetailCellInputRef.value = null
-  }
-
-
-
-  const finishGyDetailCellEdit = async (row) => {
-    if (!gyDetailEditingCell.value) return
-    const editingField = gyDetailEditingCell.value.field
-    gyDetailLastEditingField.value = editingField
-    
-    // 检查当前编辑字段的值是否变化
-    const currentValue = normalizeGyDetailField(row[editingField])
-    const originValue = normalizeGyDetailField(row._gyDetailOrigin?.[editingField])
-    const isFieldChanged = currentValue !== originValue
-    
-    clearGyDetailCellEdit()
-    
-    // 如果字段值没有变化,直接返回,不做任何操作
-    if (!isFieldChanged && !row._gyDetailNew) {
-      return
-    }
-
-    // 失焦时再按工分/金额公式落一次(四舍五入两位),并带上联动字段一起保存
-    if (editingField === '定额分' || editingField === '金额') {
-      applyGyDetailScoreMoneyCalc(row, editingField)
-      if (editingField === '定额分' && String(row.定额分 ?? '').trim() !== '') {
-        row.定额分 = roundGyDetail2(parseFloat(row.定额分))
-      }
-      if (editingField === '金额' && String(row.金额 ?? '').trim() !== '') {
-        row.金额 = roundGyDetail2(parseFloat(row.金额))
-      }
-      refreshGyDetailTableFooter()
-    }
-    
-    // 新行:未齐三个必填时,工分等字段暂不提交;已齐则继续(可能已新增过,由 handleUpdateProcess 决定增/改)
-    if (row._gyDetailNew && editingField !== '工序名称' && editingField !== '部件名称') {
-      const buJianMingCheng = String(row.部件名称 || '').trim()
-      const gongXuMingCheng = String(row.工序名称 || '').trim()
-      const daGongXu = String(row.大工序 || '').trim()
-      if (!buJianMingCheng || !gongXuMingCheng || !daGongXu) {
-        return
-      }
-    }
-    
-    if (editingField === '部件名称') {
-      const buJianMingCheng = String(row.部件名称 || '').trim()
-      if (!buJianMingCheng) {
-        row.部件编号 = ''
-      } else {
-        ensureGyDetailPartCode(row)
-      }
-      
-      // 自动填写生产工序
-      const autoFillOptions = ['裁剪', '手工', '大烫', '总检', '包装']
-      if (autoFillOptions.includes(buJianMingCheng)) {
-        row.大工序 = buJianMingCheng
-      } else if (buJianMingCheng) {
-        row.大工序 = '车缝'
-      }
-      
-      // 新行编辑部件名称时,检查工序名称是否已填写
-      if (row._gyDetailNew) {
-        const gongXuMingCheng = String(row.工序名称 || '').trim()
-        if (!gongXuMingCheng) {
-          ElMessage.warning('请先填写工序名称')
-          return
-        }
-      }
-    }
-    
-	if (editingField === '定额分') {
-  // 获取所有未拆分的数据
-  const unsplitData = gyDetailDisplayProcessList.value.filter(
-    row => !isGyDetailRowSplit(row)
-  );
-  
-  // 计算未拆分工序的总工分
-  const unsplitTotalScore = unsplitData.reduce(
-    (sum, row) => sum + (parseFloat(row.定额分) || 0), 
-    0
-  );
-  
-  // 获取计划制造工分
-  const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0;
-  
-  // 如果未拆分工序的总工分超过计划制造工分,回退并提示
-  if (unsplitTotalScore > planManufactureScore) {
-    ElMessage.warning(`未拆分工序总工分(${unsplitTotalScore.toFixed(2)})不能大于计划制造工分(${planManufactureScore.toFixed(2)})`);
-    row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分;
-    refreshGyDetailTableFooter();
-    return;
-  }
-}
-    
-    await handleUpdateProcess(row)
-    refreshGyDetailTableFooter()
-  }
-
-  watch(gyDetailEditingCell, async (cell) => {
-    if (!cell) return
-    await nextTick()
-    await nextTick() // 多等一个tick确保DOM更新
-    
-    // 优先使用ref引用
-    const comp = gyDetailCellInputRef.value
-    if (comp?.focus) {
-      comp.focus()
-      comp.select?.()
-      return
-    }
-    
-    // 如果ref没有值,尝试从DOM中查找当前编辑单元格的输入框
-    const inputEl = comp?.input || comp?.$el?.querySelector?.('input')
-    if (inputEl) {
-      inputEl.focus?.()
-      inputEl.select?.()
-      return
-    }
-    
-    // 最后的备选方案:查找所有可见的输入框
-    const allInputs = document.querySelectorAll('.gy-detail-cell-input input')
-    if (allInputs.length > 0) {
-      const lastInput = allInputs[allInputs.length - 1]
-      lastInput.focus()
-      lastInput.select()
-    }
-  })
-
-  const normalizeGyDetailField = (val) => String(val ?? '').trim()
-
-  const snapshotGyDetailRow = (row) => ({
-    部件编号: normalizeGyDetailField(row?.部件编号),
-    部件名称: normalizeGyDetailField(row?.部件名称),
-    工序编号: normalizeGyDetailField(row?.工序编号),
-    工序名称: normalizeGyDetailField(row?.工序名称),
-    大工序: normalizeGyDetailField(row?.大工序),
-    秒: normalizeGyDetailField(row?.秒),
-    分: normalizeGyDetailField(row?.分),
-    定额分: normalizeGyDetailField(row?.定额分),
-    金额: normalizeGyDetailField(row?.金额),
-    难度系数: normalizeGyDetailField(row?.难度系数),
-    备注: normalizeGyDetailField(row?.备注),
-  })
-
-  const isGyDetailRowChanged = (row) => {
-    const current = snapshotGyDetailRow(row)
-    const origin = row?._gyDetailOrigin || {}
-    return Object.keys(current).some((key) => current[key] !== origin[key])
-  }
-
-  const attachGyDetailRowMeta = (row, index) => {
-    const item = {
-      ...row,
-      _rowKey: row.id ? `id_${row.id}` : `idx_${index}_${row.工序编号 ?? ''}`,
-    }
-    item._gyDetailOrigin = snapshotGyDetailRow(item)
-    return item
-  }
-
-  const assignGyDetailRowKeys = (list) => {
-    if (!Array.isArray(list)) return []
-    return list.map((row, index) => attachGyDetailRowMeta(row, index))
-  }
-
-  const updateGyDetailTableHeight = () => {
-    const el = gyDetailTableWrapRef.value
-    if (el?.clientHeight > 0) {
-      // 预留底部横向滚动条高度
-      gyDetailTableHeight.value = Math.max(240, el.clientHeight - 16)
-    }
-    nextTick(() => {
-      gyDetailTableRef.value?.recalculate?.()
-    })
-  }
-
-  const gyDetailBuJianMingChengFilter = ref([])
-  const gyDetailDaGongXuFilter = ref([])
-  const gyDetailNanDuXiShuFilter = ref([])
-  const gyDetailZhuangTaiFilter = ref([])
-  
-  // 跟踪每个筛选是否被用户手动设置过
-  const gyDetailBuJianMingChengFilterManuallySet = ref(false)
-  const gyDetailDaGongXuFilterManuallySet = ref(false)
-  const gyDetailNanDuXiShuFilterManuallySet = ref(false)
-  const gyDetailZhuangTaiFilterManuallySet = ref(false)
-
-  const isGyDetailFilterActive = (selectedRef, options) => {
-    const optionList = Array.isArray(options) ? options : (options?.value || [])
-    const allValues = optionList.map((item) => item.value)
-    const selected = selectedRef?.value ?? selectedRef ?? []
-    if (!allValues.length) return false
-    return selected.length < allValues.length
-  }
-
-  /** 模板里 ref 会自动解包为数组,脚本里传的是 ref,需兼容两种写法 */
-  const setGyDetailFilterSelected = (filterRef, values) => {
-    const next = [...values]
-    if (isRef(filterRef)) {
-      filterRef.value = next
-      return
-    }
-    if (Array.isArray(filterRef)) {
-      filterRef.splice(0, filterRef.length, ...next)
-    }
-  }
-
-  const selectAllGyDetailFilter = (filterRef, options) => {
-    const optionList = Array.isArray(options) ? options : (options?.value || [])
-    setGyDetailFilterSelected(filterRef, optionList.map((item) => item.value))
-  }
-
-  const clearGyDetailFilter = (filterRef) => {
-    setGyDetailFilterSelected(filterRef, [])
-  }
-  
-  // 部件名称筛选操作
-  const selectAllGyDetailBuJianMingChengFilter = () => {
-    gyDetailBuJianMingChengFilterManuallySet.value = true
-    selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
-  }
-  const clearGyDetailBuJianMingChengFilter = () => {
-    gyDetailBuJianMingChengFilterManuallySet.value = true
-    clearGyDetailFilter(gyDetailBuJianMingChengFilter)
-  }
-  const handleGyDetailBuJianMingChengFilterChange = () => {
-    gyDetailBuJianMingChengFilterManuallySet.value = true
-  }
-  
-  // 大工序筛选操作
-  const selectAllGyDetailDaGongXuFilter = () => {
-    gyDetailDaGongXuFilterManuallySet.value = true
-    selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
-  }
-  const clearGyDetailDaGongXuFilter = () => {
-    gyDetailDaGongXuFilterManuallySet.value = true
-    clearGyDetailFilter(gyDetailDaGongXuFilter)
-  }
-  const handleGyDetailDaGongXuFilterChange = () => {
-    gyDetailDaGongXuFilterManuallySet.value = true
-  }
-  
-  // 难度系数筛选操作
-  const selectAllGyDetailNanDuXiShuFilter = () => {
-    gyDetailNanDuXiShuFilterManuallySet.value = true
-    selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
-  }
-  const clearGyDetailNanDuXiShuFilter = () => {
-    gyDetailNanDuXiShuFilterManuallySet.value = true
-    clearGyDetailFilter(gyDetailNanDuXiShuFilter)
-  }
-  const handleGyDetailNanDuXiShuFilterChange = () => {
-    gyDetailNanDuXiShuFilterManuallySet.value = true
-  }
-  
-  // 状态筛选操作
-  const selectAllGyDetailZhuangTaiFilter = () => {
-    gyDetailZhuangTaiFilterManuallySet.value = true
-    selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
-  }
-  const clearGyDetailZhuangTaiFilter = () => {
-    gyDetailZhuangTaiFilterManuallySet.value = true
-    clearGyDetailFilter(gyDetailZhuangTaiFilter)
-  }
-  const handleGyDetailZhuangTaiFilterChange = () => {
-    gyDetailZhuangTaiFilterManuallySet.value = true
-  }
-
-  const applyGyDetailColumnFilter = (list, filterRef, options, matchRow, isManuallySet) => {
-    // 如果没有被用户手动设置过筛选,直接返回所有数据
-    if (!isManuallySet) {
-      return list
-    }
-    const optionList = Array.isArray(options) ? options : (options?.value || [])
-    const selected = filterRef.value
-    if (!selected.length) return list
-    if (!optionList.length || selected.length >= optionList.length) return list
-    const set = new Set(selected.map((v) => normalizeGyDetailField(v)))
-    return list.filter((row) => row._gyDetailNew || set.has(matchRow(row)))
-  }
-
-  const gyDetailDisplayProcessList = computed(() => {
-    let list = gyDetailFormData.工艺列表 || []
-    list = applyGyDetailColumnFilter(
-      list,
-      gyDetailBuJianMingChengFilter,
-      gyDetailBuJianMingChengFilterOptions.value,
-      (row) => normalizeGyDetailField(row.部件名称),
-      gyDetailBuJianMingChengFilterManuallySet.value,
-    )
-    list = applyGyDetailColumnFilter(
-      list,
-      gyDetailDaGongXuFilter,
-      dagongxuFilters.value,
-      (row) => normalizeGyDetailField(row.大工序),
-      gyDetailDaGongXuFilterManuallySet.value,
-    )
-    list = applyGyDetailColumnFilter(
-      list,
-      gyDetailNanDuXiShuFilter,
-      gyDetailDifficultyFilterOptions.value,
-      (row) => normalizeGyDetailField(row.难度系数),
-      gyDetailNanDuXiShuFilterManuallySet.value,
-    )
-    list = applyGyDetailColumnFilter(
-      list,
-      gyDetailZhuangTaiFilter,
-      gyDetailStatusFilterOptions,
-      (row) => getGyDetailRowStatusFilterValue(row),
-      gyDetailZhuangTaiFilterManuallySet.value,
-    )
-    return list
-  })
-
-  const syncGyDetailFilterAfterDataChange = (filterRef, options) => {
-    // 禁用自动同步筛选,只在用户手动点击时才触发
-    // const optionList = Array.isArray(options) ? options : (options?.value || [])
-    // const allValues = optionList.map((item) => item.value)
-    // const selected = filterRef.value
-    // if (!selected.length) {
-    //   filterRef.value = [...allValues]
-    //   return
-    // }
-    // const wasAllSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v))
-    // if (wasAllSelected) {
-    //   filterRef.value = [...allValues]
-    //   return
-    // }
-    // filterRef.value = selected.filter((v) => allValues.includes(v))
-  }
-
-  /** 打开详情或刷新后:默认全选各列筛选项 */
-  const initGyDetailFilters = () => {
-    // 重置手动设置标志位为 false
-    gyDetailBuJianMingChengFilterManuallySet.value = false
-    gyDetailDaGongXuFilterManuallySet.value = false
-    gyDetailNanDuXiShuFilterManuallySet.value = false
-    gyDetailZhuangTaiFilterManuallySet.value = false
-    // 初始化筛选选项
-    selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
-    selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
-    selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
-    selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
-  }
-
-  const syncGyDetailFiltersAfterDataChange = () => {
-    syncGyDetailFilterAfterDataChange(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
-    syncGyDetailFilterAfterDataChange(gyDetailDaGongXuFilter, dagongxuFilters)
-    syncGyDetailFilterAfterDataChange(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
-    syncGyDetailFilterAfterDataChange(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
-  }
-
-  const sumGyDetailDisplayField = (field) => {
-    let total = 0
-    let count = 0
-    for (const item of gyDetailDisplayProcessList.value || []) {
-      const val = Number(item?.[field])
-      if (!Number.isNaN(val)) {
-        total += val
-        count++
-      }
-    }
-    return count > 0 ? total.toFixed(2) : '0.00'
-  }
-
-  const gyDetailFooterSums = computed(() => ({
-    秒: sumGyDetailDisplayField('秒'),
-    分: sumGyDetailDisplayField('分'),
-    定额分: sumGyDetailDisplayField('定额分'),
-    金额: sumGyDetailDisplayField('金额'),
-  }))
-
-  const gyDetailFooterMethod = () => {
-  // 与拆分判断一致:状态 1 为被拆分,其余(含数字 0 / 字符串 '0')都计入合计
-  const normalData = (gyDetailDisplayProcessList.value || []).filter(
-    (row) => !isGyDetailRowSplit(row)
-  )
-  
-  // 如果没有正常数据,合计全部为0
-  if (normalData.length === 0) {
-    return [['合计', '', '', '', '', '', '0.00', '0.00', '0.00', '0.00', '', '', '', '']]
-  }
-  
-  // 计算各项合计
-  const sums = {
-    秒: normalData.reduce((sum, row) => sum + (Number(row.秒) || 0), 0),
-    分: normalData.reduce((sum, row) => sum + (Number(row.分) || 0), 0),
-    定额分: normalData.reduce((sum, row) => sum + (Number(row.定额分) || 0), 0),
-    金额: normalData.reduce((sum, row) => sum + (Number(row.金额) || 0), 0),
-  }
-  
-  return [[
-    '合计',
-    '',
-    '',
-    '',
-    '',
-    '',
-    sums.秒.toFixed(2),
-    sums.分.toFixed(2),
-    sums.定额分.toFixed(2),
-    sums.金额.toFixed(2),
-    '',
-    '',
-    '',
-    '',
-  ]]
-}
-
-  const refreshGyDetailTableFooter = () => {
-    nextTick(() => {
-      const $table = gyDetailTableRef.value
-      $table?.updateFooter?.()
-      $table?.recalculate?.()
-    })
-  }
-
-  watch(
-    [gyDetailBuJianMingChengFilter, gyDetailDaGongXuFilter, gyDetailNanDuXiShuFilter, gyDetailZhuangTaiFilter],
-    refreshGyDetailTableFooter,
-    { deep: true },
-  )
-  watch(gyDetailDisplayProcessList, refreshGyDetailTableFooter)
-
-  const gyDetailPrintTableData = computed(() => {
-    return (gyDetailFormData.工艺列表 || []).map((row) => ({
-      部位编号: row.部件编号 ?? '',
-      部位名称: row.部件名称 ?? '',
-      工序编号: row.工序编号 ?? '',
-      工序名称: row.工序名称 ?? '',
-      生产工序: row.大工序 ?? '',
-    }))
-  })
-
-  const getNextGyDetailProcessCode = () => {
-    const list = gyDetailFormData.工艺列表 || []
-    let max = 0
-    for (const row of list) {
-      const n = parseInt(String(row.工序编号 ?? '').trim(), 10)
-      if (!Number.isNaN(n) && n > max) {
-        max = n
-      }
-    }
-    return max + 1
-  }
-
-  const handleGyDetailCheckboxChange = ({ records }) => {
-    gyDetailSelection.value = records || []
-  }
-
-  watch(gyDetailDialogVisible, async (visible) => {
-    if (visible) {
-      await nextTick()
-      updateGyDetailTableHeight()
-      if (!gyDetailResizeObserver && gyDetailTableWrapRef.value) {
-        gyDetailResizeObserver = new ResizeObserver(() => updateGyDetailTableHeight())
-        gyDetailResizeObserver.observe(gyDetailTableWrapRef.value)
-      }
-    }
-  })
-
-  onBeforeUnmount(() => {
-    gyDetailResizeObserver?.disconnect()
-    gyDetailResizeObserver = null
-  })
-
-  const clearGyDetailTableSelection = async () => {
-    gyDetailSelection.value = []
-    await nextTick()
-    const $table = gyDetailTableRef.value
-    if ($table?.clearCheckboxRow) {
-      $table.clearCheckboxRow()
-    }
-  }
-
-  const refreshGyDetailProcessList = async () => {
-    const workorder = gyDetailFormData.订单编号
-    if (!workorder) return
-    const processRes = await getWorkOrderProcess({ workorder })
-    if (processRes.code === 0 && Array.isArray(processRes.data)) {
-      gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
-    } else {
-      gyDetailFormData.工艺列表 = []
-    }
-    await clearGyDetailTableSelection()
-    // syncGyDetailFiltersAfterDataChange() // 禁用自动同步筛选,只在用户手动点击时才触发
-    await nextTick()
-    updateGyDetailTableHeight()
-  }
-
-  const scrollGyDetailTableToBottom = async (row) => {
-    await nextTick()
-    const $table = gyDetailTableRef.value
-    const visibleList = gyDetailDisplayProcessList.value
-    const targetRow = row && visibleList.includes(row) ? row : visibleList[visibleList.length - 1]
-    if (!targetRow) return
-
-    const scrollToTarget = () => {
-      if ($table?.scrollToRow) {
-        $table.scrollToRow(targetRow)
-      } else {
-        const body = gyDetailTableWrapRef.value?.querySelector('.vxe-table--body-wrapper')
-        if (body) body.scrollTop = body.scrollHeight
-      }
-      $table?.setCurrentRow?.(targetRow)
-    }
-
-    scrollToTarget()
-    requestAnimationFrame(scrollToTarget)
-  }
-
-  const openGyDetailProcessAdd = async () => {
-    const orderNo = String(gyDetailFormData.订单编号 || '').trim()
-    if (!orderNo) {
-      ElMessage.warning('无订单编号,无法新增工艺')
-      return
-    }
-    const batchCount = 10
-    const startIndex = gyDetailFormData.工艺列表.length
-    for (let i = 0; i < batchCount; i++) {
-      const nextCode = getNextGyDetailProcessCode()
-      const newRow = {
-        id: '',
-        部件编号: '',
-        部件名称: '',
-        工序编号: String(nextCode),
-        工序名称: '',
-        大工序: '',
-        秒: '',
-        分: '',
-        定额分: '',
-        金额: '',
-        难度系数: 'C',
-        备注: '',
-        状态: 0,
-        _gyDetailNew: true,
-        _rowKey: `new_${Date.now()}_${nextCode}_${i}`,
-      }
-      gyDetailFormData.工艺列表.push(newRow)
-      newRow._gyDetailOrigin = snapshotGyDetailRow(newRow)
-    }
-    // 聚焦本次新增的第一条空白行(不是最后一条)
-    const firstNewRow = gyDetailFormData.工艺列表[startIndex]
-    await scrollGyDetailTableToBottom(firstNewRow)
-    if (!gyDetailReadonly.value && firstNewRow) {
-      startGyDetailCellEdit(firstNewRow, '工序名称')
-    }
-  }
-
-
-
-  const handleGyDetailBatchDelete = async () => {
-    if (gyDetailDeleting.value) return
-    if (!gyDetailSelection.value.length) {
-      ElMessage.warning('请先勾选要删除的工序')
-      return
-    }
-    const selectedRows = [...gyDetailSelection.value]
-    try {
-      await ElMessageBox.confirm('确定删除选中的工序吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-        appendTo: document.body,
-      })
-    } catch {
-      return
-    }
-
-    gyDetailDeleting.value = true
-    let failCount = 0
-    try {
-      for (const row of selectedRows) {
-        if (!row.id || row._gyDetailNew) {
-          const index = gyDetailFormData.工艺列表.indexOf(row)
-          if (index > -1) {
-            gyDetailFormData.工艺列表.splice(index, 1)
-          }
-          continue
-        }
-        const result = await DeleteProcess({ id: row.id })
-        if (result?.code !== 0) {
-          failCount += 1
-        }
-      }
-      await refreshGyDetailProcessList()
-      if (failCount > 0) {
-        ElMessage.warning(`有 ${failCount} 条删除失败,列表已刷新`)
-      } else {
-        ElMessage.success('删除成功')
-      }
-    } catch (e) {
-      console.error('批量删除工艺失败', e)
-      ElMessage.error('删除失败')
-      try {
-        await refreshGyDetailProcessList()
-      } catch {
-        /* ignore */
-      }
-    } finally {
-      gyDetailDeleting.value = false
-      document.body.classList.remove('el-popup-parent--hidden')
-      document.body.style.overflow = ''
-    }
-  }
-
-  const escapeGyPrintHtml = (val) => {
-    return String(val ?? '')
-      .replace(/&/g, '&amp;')
-      .replace(/</g, '&lt;')
-      .replace(/>/g, '&gt;')
-      .replace(/"/g, '&quot;')
-  }
-
-  const GY_DETAIL_PRINT_PAGE_STYLE = `
-    @page { size: A4 portrait; margin: 5mm 6mm; }
-    * { box-sizing: border-box; }
-    body {
-      margin: 0;
-      padding: 0;
-      font-family: "Microsoft YaHei", SimSun, sans-serif;
-      font-size: 12px;
-      line-height: 1.25;
-      color: #000;
-    }
-    .gy-print-table {
-      width: 100%;
-      border-collapse: collapse;
-      table-layout: fixed;
-      font-size: 18px;
-    }
-    .gy-print-table th,
-    .gy-print-table td {
-      border: 1px solid #000;
-      padding: 2px 4px;
-      text-align: center;
-      vertical-align: middle;
-      word-break: break-word;
-      overflow-wrap: anywhere;
-    }
-    .gy-print-table th { font-weight: bold; padding: 3px 4px; }
-    .gy-print-sheet-head td {
-      border: none;
-      padding: 0 4px;
-      text-align: center;
-      vertical-align: middle;
-    }
-    .gy-print-sheet-head--company-cn td {
-      padding-top: 2px;
-      padding-bottom: 2px;
-      font-size: 18px;
-      font-weight: bold;
-      line-height: 1.35;
-      letter-spacing: 2px;
-    }
-    .gy-print-sheet-head--company-en td {
-      padding-bottom: 6px;
-      font-size: 11px;
-      font-weight: normal;
-      line-height: 1.3;
-      letter-spacing: 0.5px;
-    }
-    .gy-print-sheet-head--title td {
-      font-size: 24px;
-      font-weight: bold;
-      letter-spacing: 6px;
-      padding-bottom: 8px;
-      line-height: 1.2;
-      text-align: left;
-    }
-    .gy-print-sheet-head--meta td {
-      font-size: 13px;
-      font-weight: normal;
-      padding-bottom: 2px;
-      letter-spacing: 0.5px;
-    }
-    .gy-print-sheet-head--meta-last td {
-      padding-bottom: 6px;
-    }
-    .gy-print-meta-row {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      width: 100%;
-      text-align: left;
-    }
-    .gy-print-table col.col-part-no { width: 80px; }
-    .gy-print-table col.col-part-name { width: 80px; }
-    .gy-print-table col.col-process-no { width: 80px; }
-    .gy-print-table col.col-workshop { width: 12%; }
-    .gy-print-table col.col-process-name { width: auto; }
-    .gy-print-table .col-part-no,
-    .gy-print-table .col-part-name,
-    .gy-print-table .col-process-no {
-      padding: 2px 3px;
-      white-space: nowrap;
-    }
-    .gy-print-table .col-process-name { text-align: left; }
-    thead { display: table-header-group; }
-    tr { page-break-inside: avoid; }
-  `
-
-  const buildGyDetailPrintHtml = () => {
-    const rows = gyDetailPrintTableData.value
-    const rowHtml = rows.length
-      ? rows
-          .map(
-            (item) => `<tr>
-        <td class="col-part-no">${escapeGyPrintHtml(item.部位编号)}</td>
-        <td class="col-part-name">${escapeGyPrintHtml(item.部位名称)}</td>
-        <td class="col-process-no">${escapeGyPrintHtml(item.工序编号)}</td>
-        <td class="col-process-name">${escapeGyPrintHtml(item.工序名称)}</td>
-        <td class="col-workshop">${escapeGyPrintHtml(item.生产工序)}</td>
-      </tr>`
-          )
-          .join('')
-      : '<tr><td colspan="5" style="padding:16px;text-align:center;">暂无数据</td></tr>'
-    const orderNo = escapeGyPrintHtml(gyDetailFormData.订单编号)
-    const styleNo = escapeGyPrintHtml(gyDetailFormData.生产款号)
-    const customerNo = escapeGyPrintHtml(gyDetailFormData.客户编号)
-    const productStyle = escapeGyPrintHtml(gyDetailFormData.款式)
-
-    return `
-      <table class="gy-print-table">
-        <colgroup>
-          <col class="col-part-no" />
-          <col class="col-part-name" />
-          <col class="col-process-no" />
-          <col class="col-process-name" />
-          <col class="col-workshop" />
-        </colgroup>
-        <thead>
-          <tr class="gy-print-sheet-head gy-print-sheet-head--company-cn">
-            <td colspan="5">浙 江 达 成 凯 悦 纺 织 服 装 有 限 公 司</td>
-          </tr>
-          <tr class="gy-print-sheet-head gy-print-sheet-head--company-en">
-            <td colspan="5">ZHE JIANG REACHING KAYO TEXTILE &amp; GARMENTS CO LTD</td>
-          </tr>
-          <tr class="gy-print-sheet-head gy-print-sheet-head--title">
-            <td colspan="5">工序表</td>
-          </tr>
-          <tr class="gy-print-sheet-head gy-print-sheet-head--meta">
-            <td colspan="5">
-              <div class="gy-print-meta-row">
-                <span>订单编号:${orderNo}</span>
-                <span>生产款号:${styleNo}</span>
-              </div>
-            </td>
-          </tr>
-          <tr class="gy-print-sheet-head gy-print-sheet-head--meta gy-print-sheet-head--meta-last">
-            <td colspan="5">
-              <div class="gy-print-meta-row">
-                <span>客户编号:${customerNo}</span>
-                <span>款式:${productStyle}</span>
-              </div>
-            </td>
-          </tr>
-          <tr>
-            <th class="col-part-no">部位编号</th>
-            <th class="col-part-name">部件名称</th>
-            <th class="col-process-no">工序编号</th>
-            <th class="col-process-name">工序名称</th>
-            <th class="col-workshop">生产工序</th>
-          </tr>
-        </thead>
-        <tbody>${rowHtml}</tbody>
-      </table>
-    `
-  }
-
-  let gyDetailPrintIframe = null
-  let gyDetailPrintMql = null
-
-  const showGyDetailPrintMask = () => {
-    if (document.getElementById('gy-detail-print-mask')) return
-    const mask = document.createElement('div')
-    mask.id = 'gy-detail-print-mask'
-    mask.style.cssText = 'position:fixed;inset:0;background:#fff;z-index:99999;'
-    document.body.appendChild(mask)
-    document.body.style.overflow = 'hidden'
-  }
-
-  const cleanupGyDetailPrint = (restoreDetail = false) => {
-    document.getElementById('gy-detail-print-mask')?.remove()
-    document.body.style.overflow = ''
-    if (gyDetailPrintMql) {
-      if (gyDetailPrintMql.removeListener) {
-        gyDetailPrintMql.removeListener(gyDetailPrintMqlHandler)
-      } else {
-        gyDetailPrintMql.removeEventListener('change', gyDetailPrintMqlHandler)
-      }
-      gyDetailPrintMql = null
-    }
-    if (gyDetailPrintIframe) {
-      gyDetailPrintIframe.remove()
-      gyDetailPrintIframe = null
-    }
-    if (restoreDetail) {
-      gyDetailDialogVisible.value = true
-    }
-  }
-
-  const gyDetailPrintMqlHandler = (e) => {
-    if (!e.matches) {
-      cleanupGyDetailPrint(true)
-    }
-  }
-
-  const handleGyDetailSave = async () => {
-    if (gyDetailReadonly.value || gyDetailSaving.value) return
-    gyDetailSaving.value = true
-    try {
-      // 先结束当前单元格编辑(原先保存按钮只 blur,没有真正提交)
-      let hadEditingCell = false
-      if (gyDetailEditingCell.value) {
-        hadEditingCell = true
-        const editing = gyDetailEditingCell.value
-        const editingRow = (gyDetailFormData.工艺列表 || []).find((r) => r._rowKey === editing.rowKey)
-        if (editingRow) {
-          await finishGyDetailCellEdit(editingRow)
-        } else {
-          clearGyDetailCellEdit()
-        }
-      }
-
-      const pendingRows = (gyDetailFormData.工艺列表 || []).filter((row) => {
-        if (!isGyDetailRowChanged(row)) return false
-        // 完全空白的新行不提交
-        if (row._gyDetailNew && !row.id) {
-          const filled =
-            String(row.部件名称 || '').trim() ||
-            String(row.工序名称 || '').trim() ||
-            String(row.定额分 || '').trim() ||
-            String(row.金额 || '').trim() ||
-            String(row.秒 || '').trim() ||
-            String(row.分 || '').trim()
-          if (!filled) return false
-        }
-        return true
-      })
-
-      if (!pendingRows.length) {
-        // 编辑中的格子已在 finish 时保存并提示过,这里不再重复弹
-        if (!hadEditingCell) {
-          ElMessage.success('没有需要保存的修改')
-        }
-        return
-      }
-
-      let successCount = 0
-      let failCount = 0
-      let skipIncomplete = 0
-
-      for (const row of pendingRows) {
-        const requiredReady = !!(
-          String(row.部件名称 || '').trim() &&
-          String(row.工序名称 || '').trim() &&
-          String(row.大工序 || '').trim()
-        )
-        if (!row.id && !requiredReady) {
-          skipIncomplete++
-          continue
-        }
-        const ok = await handleUpdateProcess(row, { silent: true })
-        if (ok) successCount++
-        else failCount++
-      }
-
-      if (successCount > 0 && failCount === 0 && skipIncomplete === 0) {
-        ElMessage.success(successCount === 1 ? '保存成功' : `已保存 ${successCount} 条工序`)
-      } else if (successCount > 0) {
-        const parts = [`成功 ${successCount} 条`]
-        if (failCount) parts.push(`失败 ${failCount} 条`)
-        if (skipIncomplete) parts.push(`未填齐必填 ${skipIncomplete} 条`)
-        ElMessage.warning(parts.join(','))
-      } else if (skipIncomplete > 0 && failCount === 0) {
-        ElMessage.warning('请先填写部件名称、工序名称、生产工序后再保存')
-      } else {
-        ElMessage.error('保存失败')
-      }
-
-      refreshGyDetailTableFooter()
-    } catch (e) {
-      console.error('工艺资料保存失败', e)
-      ElMessage.error('保存失败')
-    } finally {
-      gyDetailSaving.value = false
-    }
-  }
-
-  const handleGyDetailPrintPreview = async () => {
-    if (!gyDetailFormData.工艺列表?.length) {
-      ElMessage.warning('暂无工艺数据,无法打印预览')
-      return
-    }
-    gyDetailDialogVisible.value = false
-    await nextTick()
-    showGyDetailPrintMask()
-
-    try {
-      gyDetailPrintIframe = document.createElement('iframe')
-      gyDetailPrintIframe.setAttribute(
-        'style',
-        'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;'
-      )
-      document.body.appendChild(gyDetailPrintIframe)
-
-      const printWin = gyDetailPrintIframe.contentWindow
-      if (!printWin) {
-        throw new Error('print iframe unavailable')
-      }
-
-      const html = `<!DOCTYPE html><html><head><meta charset="utf-8"><title>工艺资料</title>
-        <style>${GY_DETAIL_PRINT_PAGE_STYLE}</style></head><body>${buildGyDetailPrintHtml()}</body></html>`
-
-      const startPrint = () => {
-        printWin.focus()
-        printWin.print()
-      }
-
-      const onAfterPrint = () => cleanupGyDetailPrint(true)
-      printWin.addEventListener('afterprint', onAfterPrint, { once: true })
-
-      if (printWin.matchMedia) {
-        gyDetailPrintMql = printWin.matchMedia('print')
-        if (gyDetailPrintMql.addListener) {
-          gyDetailPrintMql.addListener(gyDetailPrintMqlHandler)
-        } else {
-          gyDetailPrintMql.addEventListener('change', gyDetailPrintMqlHandler)
-        }
-      }
-
-      printWin.document.open()
-      printWin.document.write(html)
-      printWin.document.close()
-
-      if (printWin.document.readyState === 'complete') {
-        startPrint()
-      } else {
-        gyDetailPrintIframe.onload = startPrint
-      }
-    } catch {
-      cleanupGyDetailPrint(true)
-      ElMessage.error('打印失败')
-    }
-  }
-
-  const gyDetailPlanManufactureEditing = ref(false)
-  const gyDetailPlanManufactureBackup = ref('')
-  const gyDetailRemarkBackup = ref('')
-  const gyDetailFinishDateBackup = ref('')
-  const gyDetailPlanManufactureSaving = ref(false)
-
-  const onGyDetailPlanManufactureInput = (val) => {
-    let s = String(val ?? '').replace(/[^\d.]/g, '')
-    const dot = s.indexOf('.')
-    if (dot !== -1) {
-      s = s.slice(0, dot + 1) + s.slice(dot + 1).replace(/\./g, '')
-    }
-    gyDetailFormData.计划制造工分 = s
-  }
-
-  const startGyDetailPlanManufactureEdit = () => {
-    if (gyDetailPlanManufactureEditing.value) return
-    // 邢科芳账号不能修改计划制造工分
-    if (gyDetailReadonly.value) {
-    //   ElMessage.warning('您没有权限修改计划制造工分')
-      return
-    }
-    gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
-    gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
-    gyDetailPlanManufactureEditing.value = true
-  }
-
-  const cancelGyDetailPlanManufactureEdit = () => {
-    gyDetailFormData.计划制造工分 = gyDetailPlanManufactureBackup.value
-    gyDetailFormData.备注 = gyDetailRemarkBackup.value
-    gyDetailPlanManufactureEditing.value = false
-  }
-
-  const confirmGyDetailPlanManufactureEdit = async () => {
-    gyDetailPlanManufactureSaving.value = true
-    try {
-      const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
-      
-      const updatePromises = []
-      
-      if (gyDetailFormData.计划制造工分 !== gyDetailPlanManufactureBackup.value) {
-        updatePromises.push(updateWorkOrderPlanManufacture({
-          id: gyDetailFormData.Uniqid,
-          number: gyDetailFormData.计划制造工分,
-          sys_id: userStore.userInfo.nickName
-        }))
-      }
-      
-      if (gyDetailFormData.备注 !== gyDetailRemarkBackup.value || finishDate) {
-        updatePromises.push(updateOrderRemarkAndFinishDate({
-          id: gyDetailFormData.Uniqid,
-          remark: gyDetailFormData.备注,
-          工单完工日期: finishDate,
-          sys_id: userStore.userInfo.nickName
-        }))
-      }
-      
-      if (updatePromises.length === 0) {
-        ElMessage.success('没有修改任何内容')
-        gyDetailPlanManufactureEditing.value = false
-        return
-      }
-      
-      const results = await Promise.all(updatePromises)
-      
-      const allSuccess = results.every(res => res?.code === 0)
-      
-      if (allSuccess) {
-        ElMessage.success('保存成功')
-        gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
-        gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
-        gyDetailPlanManufactureEditing.value = false
-      } else {
-        ElMessage.error('保存失败')
-      }
-    } catch (e) {
-      console.error('保存失败', e)
-      ElMessage.error('保存失败')
-    } finally {
-      gyDetailPlanManufactureSaving.value = false
-    }
-  }
-
-  // 工单完工日期仅前端选择,不在失焦时调接口(随保存一并提交)
-  const handleGyDetailFinishDateBlur = async () => {}
-
-  const handleGyDetailRemarkBlur = async () => {
-    try {
-      // 格式化日期为 YYYY-MM-DD 格式
-      const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
-      
-      await updateOrderRemarkAndFinishDate({
-        id: gyDetailFormData.Uniqid,
-        remark: gyDetailFormData.备注,
-        工单完工日期: finishDate,
-        sys_id: userStore.userInfo.nickName
-      })
-    } catch (e) {
-      console.error('更新备注和完工日期失败', e)
-    }
-  }
-
-  const closeGyDetailDialog = () => {
-    clearGyDetailCellEdit()
-    gyDetailPlanManufactureEditing.value = false
-    gyDetailBuJianMingChengFilter.value = []
-    gyDetailDaGongXuFilter.value = []
-    gyDetailNanDuXiShuFilter.value = []
-    gyDetailZhuangTaiFilter.value = []
-    gyDetailDialogVisible.value = false
-    gyDetailSelection.value = []
-    gyDetailDeleting.value = false
-    document.body.classList.remove('el-popup-parent--hidden')
-    document.body.style.overflow = ''
-  }
-  
-  // 修改计划制造工分
-  const handleUpdatePlanManufacture = async () => {
-    gyDetailPlanManufactureSaving.value = true
-    try {
-      const result = await updateWorkOrderPlanManufacture({
-        id: gyDetailFormData.Uniqid,
-        number: gyDetailFormData.计划制造工分,
-        sys_id: userStore.userInfo.nickName
-      })
-      if (result.code === 0) {
-        ElMessage.success('修改成功')
-        return true
-      }
-      ElMessage.error(result.msg || '修改失败')
-      return false
-    } catch (error) {
-      ElMessage.error('修改失败')
-      return false
-    } finally {
-      gyDetailPlanManufactureSaving.value = false
-    }
-  }
-  
-  // 拆分弹窗相关
-  const splitDialogVisible = ref(false)
-  const splitQuantity = ref(1)
-  const currentSplitRow = ref(null)
-  const hasReportData = ref(false)
-  const splitSubmitting = ref(false)
-
-  const submitProcessSplit = async (row, number) => {
-    if (!row?.id) {
-      ElMessage.warning('工序数据无效,无法操作')
-      return false
-    }
-    splitSubmitting.value = true
-    try {
-      const result = await confirmProcessSplit({
-        id: row.id,
-        number,
-        sys_id: userStore.userInfo.nickName,
-      })
-      if (result.code === 0) {
-        ElMessage.success(number === 0 ? '撤销拆分成功' : '拆分成功')
-        await refreshGyDetailProcessList()
-        return true
-      }
-      ElMessage.error(result.msg || (number === 0 ? '撤销拆分失败' : '拆分失败'))
-      return false
-    } catch (error) {
-      ElMessage.error(number === 0 ? '撤销拆分失败' : '拆分失败')
-      return false
-    } finally {
-      splitSubmitting.value = false
-    }
-  }
-
-  // 处理拆分工艺
-  const handleSplitProcess = async (row) => {
-    if (isGyDetailRowSplit(row)) return
-    currentSplitRow.value = row
-    splitQuantity.value = 1
-
-    try {
-      const result = await checkProcessReport({
-        workorder: gyDetailFormData.订单编号,
-        process_code: row.工序编号,
-      })
-
-      if (result.code === 0) {
-        hasReportData.value = false
-      } else if (result.code === 1) {
-        hasReportData.value = true
-      }
-
-      splitDialogVisible.value = true
-    } catch (error) {
-      ElMessage.error('检查工序报工状态失败')
-    }
-  }
-
-  const buildGySplitProcessLabel = (row) =>
-    `${row?.工序编号 || ''}-${row?.工序名称 || ''}`
-
-  const buildUndoSplitConfirmMessage = (row) => {
-    const label = escapeGyPrintHtml(buildGySplitProcessLabel(row))
-    return `确定撤销工序 <span class="gy-split-process-name" style="color:#f56c6c;font-weight:600;">${label}</span> 的拆分吗?`
-  }
-
-  // 撤销拆分
-  const handleUndoSplitProcess = async (row) => {
-    if (!isGyDetailRowSplit(row)) return
-    try {
-      await ElMessageBox.confirm(buildUndoSplitConfirmMessage(row), '撤销拆分', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-        dangerouslyUseHTMLString: true,
-        appendTo: document.body,
-      })
-    } catch {
-      return
-    }
-    await submitProcessSplit(row, 0)
-  }
-
-  // 确认拆分
-  const confirmSplitProcess = async () => {
-    const qty = Number(splitQuantity.value)
-    if (!Number.isFinite(qty) || qty < 1 || !Number.isInteger(qty)) {
-      ElMessage.warning('拆分数量必须为大于等于 1 的整数,不能为 0')
-      return
-    }
-
-    const ok = await submitProcessSplit(currentSplitRow.value, qty)
-    if (ok) {
-      splitDialogVisible.value = false
-      currentSplitRow.value = null
-    }
-  }
-  
-  // 修改工艺(未改动不请求接口)
-  // 新行填齐必填项后会先新增;再改工分等字段应走修改。若新增成功但未带回 id,或再次新增报工序编号已存在,则绑定 id 后改为 UpdateProcess。
-  const resolveGyDetailProcessId = (payload) => {
-    if (payload == null || payload === '') return ''
-    if (typeof payload === 'number' || typeof payload === 'string') return payload
-    return payload.id ?? payload.ID ?? payload.Id ?? ''
-  }
-
-  const isGyProcessCodeExistsError = (res) => {
-    const msg = String(res?.msg || res?.message || '')
-    return /工序编号/.test(msg) && /(已存在|已经有|重复)/.test(msg)
-  }
-
-  const bindGyDetailRowIdByProcessCode = async (row) => {
-    const orderNo = String(gyDetailFormData.订单编号 || '').trim()
-    const code = String(row?.工序编号 ?? '').trim()
-    if (!orderNo || !code) return false
-    try {
-      const processRes = await getWorkOrderProcess({ workorder: orderNo })
-      if (processRes?.code !== 0 || !Array.isArray(processRes.data)) return false
-      const found = processRes.data.find(
-        (item) => String(item.工序编号 ?? item.process_code ?? '').trim() === code
-      )
-      const id = resolveGyDetailProcessId(found)
-      if (!id) return false
-      row.id = id
-      row._gyDetailNew = false
-      return true
-    } catch {
-      return false
-    }
-  }
-
-  /**
-   * 按部件名称补齐部件编号:同名复用已有编号,否则取当前列表最大编号+1。
-   * 提交 Add/Update 前必须调用,避免后端报「部件编号不能为空」。
-   */
-  const ensureGyDetailPartCode = (row) => {
-    if (!row) return ''
-    const partName = String(row.部件名称 || '').trim()
-    if (!partName) {
-      row.部件编号 = ''
-      return ''
-    }
-    const currentCode = String(row.部件编号 || '').trim()
-    if (currentCode) return currentCode
-
-    const existingRow = (gyDetailFormData.工艺列表 || []).find(
-      (r) => r !== row && String(r.部件名称 || '').trim() === partName && String(r.部件编号 || '').trim()
-    )
-    if (existingRow) {
-      row.部件编号 = String(existingRow.部件编号).trim()
-      return row.部件编号
-    }
-
-    let maxCode = 0
-    ;(gyDetailFormData.工艺列表 || []).forEach((r) => {
-      const code = parseInt(String(r.部件编号 || ''), 10)
-      if (!isNaN(code) && code > maxCode) {
-        maxCode = code
-      }
-    })
-    row.部件编号 = String(maxCode + 1).padStart(2, '0')
-    return row.部件编号
-  }
-
-  const handleUpdateProcess = async (row, options = {}) => {
-    const silent = !!options.silent
-    const orderNo = String(gyDetailFormData.订单编号 || '').trim()
-    if (!orderNo) return false
-    if (!isGyDetailRowChanged(row)) return false
-    
-    if (row._gyDetailSaving) {
-      return false
-    }
-
-    const buJianMingCheng = String(row.部件名称 || '').trim()
-    const gongXuMingCheng = String(row.工序名称 || '').trim()
-    const daGongXu = String(row.大工序 || '').trim()
-    const requiredReady = !!(buJianMingCheng && gongXuMingCheng && daGongXu)
-
-    // 有部件名称时提交前补齐部件编号,避免偶发「部件编号不能为空」
-    if (buJianMingCheng) {
-      ensureGyDetailPartCode(row)
-    }
-
-    const runUpdate = async () => {
-      const partCode = ensureGyDetailPartCode(row) || String(row.部件编号 || '').trim()
-      if (buJianMingCheng && !partCode) {
-        if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
-        return false
-      }
-      const result = await UpdateProcess({
-        id: row.id,
-        process_name: row.工序名称 || '',
-        big_process: row.大工序 || '',
-        standard_hour: row.秒 || '',
-        standard_minutes: row.分 || '',
-        standard_score: row.定额分 || '',
-        money: row.金额 || '',
-        coefficient: row.难度系数 || '',
-        remark: row.备注 || '',
-        mod_id: userStore.userInfo.nickName,
-        part_code: partCode,
-        part_name: row.部件名称 || '',
-        process_code: row.工序编号 || '',
-      })
-      if (result.code === 0) {
-        row._gyDetailNew = false
-        row._gyDetailOrigin = snapshotGyDetailRow(row)
-        if (!silent) ElMessage.success('修改成功')
-        return true
-      }
-      if (!silent) ElMessage.error(result.msg || '修改失败')
-      return false
-    }
-
-    try {
-      // 已有 id:一律修改
-      if (row.id) {
-        row._gyDetailSaving = true
-        row._gyDetailNew = false
-        return await runUpdate()
-      }
-
-      // 无 id:需三个必填齐全才能新增
-      if (!requiredReady) {
-        if (!silent && (gyDetailLastEditingField.value === '工序名称' || gyDetailLastEditingField.value === '部件名称')) {
-          ElMessage.warning('部件名称、工序名称、生产工序三个字段都必须填写')
-        }
-        return false
-      }
-
-      const partCode = ensureGyDetailPartCode(row)
-      if (!partCode) {
-        if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
-        return false
-      }
-
-      row._gyDetailSaving = true
-
-      const addRes = await AddProcess({
-        workorder: orderNo,
-        part_code: partCode,
-        part_name: row.部件名称 || '',
-        process_name: row.工序名称 || '',
-        process_code: String(row.工序编号 ?? ''),
-        big_process: row.大工序 || '',
-        standard_hour: row.秒 || '',
-        standard_minutes: row.分 || '',
-        standard_score: row.定额分 || '',
-        money: row.金额 || '',
-        coefficient: row.难度系数 || '',
-        remark: row.备注 || '',
-        sys_id: userStore.userInfo?.nickName || '',
-      })
-
-      if (addRes?.code === 0) {
-        row._gyDetailNew = false
-        row.id = resolveGyDetailProcessId(addRes.data)
-        if (!row.id) {
-          await bindGyDetailRowIdByProcessCode(row)
-        }
-        row._gyDetailOrigin = snapshotGyDetailRow(row)
-        if (!silent) ElMessage.success('保存成功')
-        return true
-      }
-
-      // 工序已在库中(例如必填项保存时已新增):改为修改
-      if (isGyProcessCodeExistsError(addRes)) {
-        const bound = await bindGyDetailRowIdByProcessCode(row)
-        if (bound && row.id) {
-          return await runUpdate()
-        }
-      }
-
-      if (!silent) ElMessage.error(addRes?.msg || '保存失败')
-      return false
-    } catch {
-      return false
-    } finally {
-      row._gyDetailSaving = false
-    }
-  }
-  
-  // =========== 订单打印 ===========
-  //弹窗
-  const order_viewVisible = ref(false)
-  // 默认选择竖向
-  const printDirection = ref('纵向')
-  const cp_gdprintonClick = () => {
-	  order_viewVisible.value = true
-  }
-  
-  //确定打印
-  const confirmPrintDirection = () => {
-	 
-	  console.log(_Gd_gdbh.value)
-	  console.log(printDirection.value)
-	    
-	  if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
-	    ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
-	    return false;
-	  }else{
-	    if(ystableData.length >=1){
-	  	printPageRef.value.open(_Gd_gdbh.value,printDirection.value) 
-	    }else{
-	  	ElMessage({type: 'warning',message: '请新增颜色资料,再操作此功能'})
-	  	return false;
-	    }
-	  }
-  }
-  const order_viewCloseDialog = () => {
-	  order_viewVisible.value = false
-  }
-  
-  // =========== BOM资料 ===========
-  const res_bomdialogFormVisible = ref(false)
-  const resbomtableData = ref([]);
-  const ddhformData = reactive({
-	ddh: '',
-	kh: '',
-	sckh: '',
-	ks: '',
-	ml: '',
-  });
-  const getTodayYmd = () => {
-	const t = new Date()
-	return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(t.getDate()).padStart(2, '0')}`
-  }
-  const fillDefaultPlanRuku = (rows) => {
-	if (!Array.isArray(rows)) return
-	rows.forEach((row) => {
-	  const v = row['计划入库时间']
-	  if (v === undefined || v === null || String(v).trim() === '') {
-		row['计划入库时间'] = getTodayYmd()
-	  }
-	})
-  }
-  const resbom_tableColumns = ref(
-	  [
-		{ label: '物料分类', prop: '物料分类', width: '130' },
-		{ label: '物料名称', prop: '物料名称', width: '300' },
-		{ label: '计划入库时间', prop: '计划入库时间', width: '160' },
-		{ label: '计划用料', prop: '计划用料', width: '130' },
-		{ label: '计划门幅', prop: '计划门幅', width: '130' },
-		{ label: '定额用料', prop: '定额用料', width: '130' },
-		{ label: '定额门幅', prop: '定额门幅', width: '130' },
-		{ label: '备注', prop: '备注', width: '240' },
-	  ]
-  )
-  //批量修改BOM资料
-  const BOMclick = () => {
-	  if(bomtableData.value === ''){
-		  ElMessage({type: 'warning',message: 'BOM数据为空'})
-		  return;
-	  }
-	  if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
-		  ElMessage({type: 'warning',message: '请选择订单后,再操作此功能'})
-		  return;
-	  }else{
-		  res_bomdialogFormVisible.value = true
-		  ddhformData.ddh = _Gd_gdbh.value
-		  ddhformData.kh = _Gd_kh.value
-		  ddhformData.sckh = _Gd_sckh.value
-		  ddhformData.ks = _Gd_ks.value
-		  ddhformData.ml = _Gd_ML.value
-		  _TestCoefficient();
-	  }
-  }
-  
-  const handleInput = (value, row, prop) => {
-	  if(prop != "物料名称" && prop != "备注" && prop != "物料分类" && prop != "计划入库时间" ){
-		  // 使用正则表达式过滤非数字和小数点的字符
-		  let filteredValue = value.replace(/[^\d.]/g, '');
-  
-		  // 不允许以 . 开头
-		  if (filteredValue.startsWith('.')) {
-		  filteredValue = filteredValue.slice(1); // 去掉开头的 .
-		  }
-  
-		  // 确保只有一个小数点
-		  const parts = filteredValue.split('.');
-		  if (parts.length > 2) {
-		  // 如果超过一个小数点,只保留第一个
-		  row[prop] = `${parts[0]}.${parts.slice(1).join('')}`;
-		  } else {
-		  // 否则直接赋值
-		  row[prop] = filteredValue;
-		  }
-		  }
-  
-  };
-  
-  
-  //bom数据获取
-  const _TestCoefficient = async ()=>{
-	try {
-	  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
-	  console.log(orderBomListdata)
-	  resbomtableData.value = orderBomListdata.data;
-	  const formattedData = orderBomListdata.data.map(item=>{
-		item.BOM_desc = item.BOM_desc;
-		item.物料名称 = item.物料名称;
-		item.计划用料 = item.计划用料;
-		item.定额用料 = item.定额用料;
-		item.裁床实际用料 = item.裁床实际用料;
-		item.裁床领用面料 = item.裁床领用面料;
-		item.裁床退回仓库面料 = item.裁床退回仓库面料;
-		item.备注 = item.备注;
-		item.投料单位 = "米";
-		// item.UNIQID = item.UNIQID;
-		return item
-	  });
-	  fillDefaultPlanRuku(resbomtableData.value)
-	} catch (error) {
-	  console.error(error);
-	}
-  }
-  const resbom_handleKeyDown = (event, x, y, prop) => {
-	const currentElement = document.getElementById(`input${x}${y}`);
-	if (currentElement === null && currentElement === undefined) return
-	let move = 0
-	switch (event.keyCode) {
-	  case 13: // Enter
-	  case 40: // 向下箭头
-		if (y < resbomtableData.value.length )
-		  document.getElementById(`input${x}${y + 1}`).focus();
-		break;
-	  case 38: // 向上箭头
-		if ( y > 0) {
-		  document.getElementById(`input${x}${y - 1}`).focus();
-		}
-		break;
-	  case 39: // 向左箭头
-		if (x >= 0 && x <=6) {
-		  move = x + 1
-		}
-		document.getElementById(`input${move}${y}`).focus();
-		break;
-	  case 37: // 向右箭头
-		if (x = 0  && x <=6) {
-		  move = x - 1
-		}
-		document.getElementById(`input${move}${y}`).focus();
-		break;
-	  default:
-		break;
-	}
-  }
-  const scfjfpxsCellClass = ({row, column, rowIndex, columnIndex}) =>{
-	if (
-		  column.label === '物料分类' ||
-		  column.label === '计划门幅' ||
-		  column.label === '定额门幅' ||
-		  column.label === '计划用料' || 
-		  column.label === '备注' || 
-		  column.label === '物料名称' || 
-		  column.label === '计划用量' || 
-		  column.label === '定额用料' ||
-		  column.label === '计划入库时间' ) {
-	  return 'background-plan-usage-low';
-	}
-  }
-  
-  //新增
-  const add_bomenterDialog = async() => {
-	  // 创建一行空数据,字段值可以根据需求初始化
-		const newRow = {
-		  'BOM_desc': '',
-		  '物料名称': '',
-		  '计划入库时间': getTodayYmd(),
-		  '计划用料': '',
-		  '定额用料': '',
-		  '裁床实际用料': '',
-		  '裁床领用面料': '',
-		  '裁床退回仓库面料': '',
-		  '备注': '',
-		  '投料单位': '米',
-		  'UNIQID':''
-		};
-		if (!resbomtableData.value || !Array.isArray(resbomtableData.value)) {
-		  resbomtableData.value = []; // 重新初始化
-		}
-		// 将新增的行数据推入到表格数据中
-		resbomtableData.value.push(newRow);
-  }
-  
-  // BOM删除
-  const record_deleteRow = async (row, index) => {
-	  console.log(row.UNIQID);
-  
-	  // 使用 ElMessageBox 提示确认删除
-	  ElMessageBox.confirm('确定删除此行数据吗?', '提示', {
-		  confirmButtonText: '确定',
-		  cancelButtonText: '取消',
-		  type: 'warning'
-	  }).then(async () => {
-		  // 确认删除,检查UNIQID是否为空
-		  if (row.UNIQID === '' || row.UNIQID === null || row.UNIQID === undefined) {
-			  // 删除当前行数据
-			  resbomtableData.value.splice(index, 1);
-			  ElMessage({
-				  type: 'success',
-				  message: '删除成功'
-			  });
-		  } else {
-			  // 调用接口删除
-			  const Bomdel_del = await Bomdel({ UNIQID: row.UNIQID });
-			  console.log(Bomdel_del)
-			  if (Bomdel_del.code === 0) {
-			    ElMessage({
-			      type: 'success',
-			      message: '删除成功'
-			    });
-			  } else {
-			    const msg = Bomdel_del.msg || '';
-			    console.log('msg:', msg);
-			    
-			    // 初始化标题和内容
-			    let title = '提示';
-			    let content = msg;
-			    
-			    // 截取中文句号(。)分割
-			    const splitIndex = msg.indexOf('。');
-			    if (splitIndex !== -1) {
-			      title = msg.substring(0, splitIndex + 1); // 截取第一个句号前的作为标题(含句号)
-			      content = msg.substring(splitIndex + 1);  // 后面的作为内容
-			    }
-			    
-			    // 弹窗提示(注意参数顺序)
-			    ElMessageBox.confirm(
-			      `<p style="font-size:14px;">${content}</p>`, // 内容
-			      title, // 标题
-			      {
-			        type: 'warning',
-			        dangerouslyUseHTMLString: true
-			      }
-			    );
-
-			  }
-			  // 重新获取BOM列表数据
-			  const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
-			  //BOM资料列表
-			  bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
-			  //批量新增/更新BOM数据列表
-			  resbomtableData.value = orderBomListdata.data;
-			  fillDefaultPlanRuku(resbomtableData.value)
-		  }
-	  }).catch(() => {
-		  // 取消删除
-		  // ElMessage({
-			 //  type: 'info',
-			 //  message: '已取消删除'
-		  // });
-	  });
-  }
-  
-  //修改
-  const res_bomenterDialog = async () => {
-	  const rawValueArray = resbomtableData._rawValue;
-	  const formattedData = rawValueArray
-	  .filter(item => item.物料名称 !== null && item.物料名称 !== "")  // 过滤掉物料名称为空的行
-	  .map(item => {
-		return {
-		  BOM_工单编号: ddhformData['ddh'],
-		  UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
-		  物料分类: item.物料分类 !== null ? item.物料分类 : "",
-		  BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
-		  BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
-		  BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
-		  BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
-		  Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
-		  BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
-		  BOM_desc: item.备注 !== null ? item.备注 : "",
-		  BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
-		  BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
-		  BOM_投料单位: "",
-		  Sys_ID: userStore.userInfo.nickName,
-		  Sys_rq: currentDate,
-		  计划入库时间: item['计划入库时间'] != null && String(item['计划入库时间']).trim() !== ''
-			? String(item['计划入库时间']).trim()
-			: getTodayYmd(),
-			计划入库操作人:userStore.userInfo.nickName,
-		}
-	  });
-	  console.log(formattedData);
-	  const add_FabricEditdata = await FabricEdit(formattedData);
-	  if (add_FabricEditdata.code === 0) {
-		  res_bomdialogFormVisible.value = false;
-		  ElMessage({type: 'success',message: '修改成功'})
-		  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
-		  bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
-	  } else {
-		  ElMessage({ type: 'error',message: '修改失败'})
-	  }
-	  
-  }
-  
-  // 取消
-  const 
-  res_bomcloseDialog = () => {
-	  res_bomdialogFormVisible.value = false;
-  }
-  
-  
-  //BOM资料表格双击
-  const edit_bomdialogFormVisible = ref(false)
-  const edit_resbomtableData = ref([]);
-  const edit_resbom_tableColumns = ref(
-	  [
-		{ label: '物料名称', prop: '物料名称', width: '170' },
-		{ label: '计划用料', prop: '计划用料', width: '130' },
-		{ label: '定额用料', prop: '定额用料', width: '130' },
-		{ label: '计划门幅', prop: '计划门幅', width: '170' },
-		{ label: '定额门幅', prop: '定额门幅', width: '170' },
-	  //   { label: '裁床实际用料', prop: '裁床实际用料', width: '130' },
-	  //   { label: '裁床领用面料', prop: '裁床领用面料', width: '130' },
-	  //   { label: '裁床退回仓库面料', prop: '裁床退回仓库面料', width: '170' },
-		{ label: '备注', prop: '备注', width: '170' },
-		{ label: '投料单位', prop: '投料单位', width: '100' },
-	  ]
-  )
-  
-  const UNIQID = ref('')
-  const bombomupdateCompanyFunc = async (row) => {
-	  BOMclick()
-  // 	edit_bomdialogFormVisible.value = true
-  // 	ddhformData.ddh = _Gd_gdbh.value
-  // 	ddhformData.kh = _Gd_kh.value
-  // 	ddhformData.sckh = _Gd_sckh.value
-  // 	ddhformData.ks = _Gd_ks.value
-  // 	UNIQID.value = row.UNIQID
-  // 	_editTestCoefficient()
-  }
-  
-  
-  // BOM数据获取
-  const _editTestCoefficient = async () => {
-	try {
-	  // 获取 BOM 数据
-	  const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
-	  console.log(orderBomListdata);
-  
-	  // 过滤数据,只保留 UNIQID 相同的项
-	  const filteredData = orderBomListdata.data.filter(item => item.UNIQID === UNIQID.value);
-  
-	  // 处理数据
-	  edit_resbomtableData.value = filteredData.map(item => ({
-		物料名称: item.物料名称,
-		计划用料: item.计划用料,
-		定额用料: item.定额用料,
-		裁床实际用料: item.裁床实际用料,
-		裁床领用面料: item.裁床领用面料,
-		裁床退回仓库面料: item.裁床退回仓库面料,
-		备注: item.备注,
-		计划门幅: item.计划门幅,
-		定额门幅: item.定额门幅,
-		UNIQID: item.UNIQID // 保留 UNIQID 以便后续使用
-	  }));
-	} catch (error) {
-	  console.error(error);
-	}
-  };
-  
-  
-  //一键修改
-  const editres_bomenterDialog = async () => {
-	  const rawValueArray = edit_resbomtableData._rawValue;
-	  const formattedData = rawValueArray
-	  .filter(item => item.物料名称 !== null && item.物料名称 !== "")  // 过滤掉物料名称为空的行
-	  .map(item => {
-		return {
-		  BOM_工单编号: ddhformData['ddh'],
-		  UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
-		  BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
-		  BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
-		  BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
-		  BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
-		  Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
-		  BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
-		  BOM_desc: item.备注 !== null ? item.备注 : "",
-		  BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
-		  BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
-		  BOM_投料单位: "米",
-		  Sys_ID: userStore.userInfo.nickName,
-		  Sys_rq: currentDate
-		}
-	  });
-	  console.log(formattedData);
-	  
-	  const add_FabricEditdata = await FabricEdit(formattedData);
-	  if (add_FabricEditdata.code === 0) {
-		  edit_bomdialogFormVisible.value = false;
-		  ElMessage({type: 'success',message: '修改成功'})
-		  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
-		  bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
-	  } else {
-		  ElMessage({ type: 'error',message: '修改失败'})
-	  }
-  }
-  // 取消
-  const editres_bomcloseDialog = () => {
-	  edit_bomdialogFormVisible.value = false;
-  }
-  //点击表格行获取下方表格数据列表
-  // =========== 颜色资料、工艺资料、技术资料附件 ===========
-  //全局调用订单号编号
-  const _Gd_gdbh = ref('')
-  const _ddhval = ref('')
-  const _Gd_kh = ref('')
-  const _Gd_sckh = ref('')
-  const _Gd_ks = ref('')
-  const _Gd_ML = ref('')
-  //颜色资料
-  const ystableData = reactive([])
-  //尺寸列表
-  const sizeDatas = reactive([])
-  //部件资料
-  const parttableData = reactive([])
-  //工艺资料
-  const gytableData = reactive([])
-  //订单资料表
-  const ddtableData = reactive([])
-  //技术附件
-  const jstableData = reactive([])
-  
-  const fhdtableData = reactive([])
-  //BOM附件
-  const bomtableData = reactive([])
-  //面料附件
-  const mltableData = reactive([])
-  
-  // 工序产量核查
-  const processProductionVisible = ref(false)
-  const processProductionWorkorder = ref('')
-  const processProductionDialogKey = ref(0)
-  const processProductionChecking = ref(false)
-  const openProcessProductionDialog = async () => {
-    if (!_Gd_gdbh.value) {
-      ElMessage.warning('请先在表格中点击选择订单')
-      return
-    }
-    processProductionChecking.value = true
-    try {
-      const result = await ensureProcessProductionData(_Gd_gdbh.value)
-      if (!result.ok) return
-      processProductionWorkorder.value = result.workorder
-      processProductionDialogKey.value += 1
-      processProductionVisible.value = true
-    } finally {
-      processProductionChecking.value = false
-    }
-  }
-
-  // 导入工艺资料相关变量
-  const importProcessDialogVisible = ref(false)
-  const importProcessForm = reactive({
-    workorderNo: '',
-    styleNo: ''
-  })
-  const importProcessFileList = reactive([])
-  const importProcessUploadRef = ref(null)
-  let importProcessFile = null
-  
-  //点击订单资料行
-  const tableRowClick = async (row) => {
-	  //清空尺寸列表、颜色资料、部件资料、工艺资料、订单资料附件、技术附件
-	  sizeDatas.length = 0
-	  ystableData.splice(0, ystableData.length);
-	  parttableData.splice(0, parttableData.length);
-	  gytableData.splice(0, gytableData.length);
-	  ddtableData.splice(0, ddtableData.length);
-	  fhdtableData.splice(0, fhdtableData.length);
-	  jstableData.splice(0, jstableData.length);
-	  bomtableData.splice(0, bomtableData.length);
-	  mltableData.splice(0, mltableData.length);
-	  _Gd_gdbh.value = row.订单编号
-	  _ddhval.value = row.订单编号
-	  _Gd_kh.value = row.客户编号
-	  _Gd_sckh.value = row.生产款号
-	  _Gd_ks.value = row.款式
-	  _Gd_ML.value = row.面料
-	  
-	  //数据列表显示
-	  const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
-	  const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
-	  const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
-	  const fhdOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'发货单附件'})
-	  
-	  const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
-	  // console.log("orderBomListdata:", orderBomListdata); // 打印接口返回的数据
-	  // 确保 orderBomListdata.data 是数组,避免 undefined 错误
-	  if (orderBomListdata?.data && Array.isArray(orderBomListdata.data)) {
-		  bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
-	  } else {
-		  bomtableData.splice(0, bomtableData.length); // 如果数据无效,清空表格
-	  }
-	  
-	  // 获取部件资料
-	const partListData = await PartList({ workorder: _Gd_gdbh.value });
-	if (partListData?.code === 0 && Array.isArray(partListData.data)) {
-		parttableData.splice(0, parttableData.length, ...partListData.data);
-	} else {
-		parttableData.splice(0, parttableData.length);
-	}
-	
-	// 获取工艺资料
-	const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
-	if (processListData?.code === 0 && Array.isArray(processListData.data)) {
-		gytableData.splice(0, gytableData.length, ...processListData.data);
-	} else {
-		gytableData.splice(0, gytableData.length);
-	}
-	  
-	  
-	  const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
-	  // console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
-	  
-	  if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
-		  // 如果 data.table 是数组且不为空,更新表格数据
-		  mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
-	  } else {
-		  // 如果 data.table 为空或无效,清空表格数据
-		  mltableData.splice(0, mltableData.length);
-	  }
-	  
-	  //颜色资料
-	  if(PrintListDatas.data.列表.length === 0 ){
-		ystableData.length = 0
-	  }else{
-		sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//表格尺码投数据
-		ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
-		const newData = PrintListDatas.data.列表.map(item => ({  
-			...item,  
-			船样: item.船样 === 1 ? '是' : '否'  
-		}));  
-		ystableData.length = 0;  
-		ystableData.push(...newData);
-	  }
-	  //技术附件
-	  if(jsOrderAttachments.data === ''){
-		const WorkListdata = [];
-		jstableData.splice(0,jstableData.length,...WorkListdata);
-	  }
-	  if(jsOrderAttachments.code === 0 && ddOrderAttachments.code === 0){
-		jstableData.splice(0,jsOrderAttachments.data.list.length,...jsOrderAttachments.data.list);
-		ddtableData.splice(0,ddOrderAttachments.data.list.length,...ddOrderAttachments.data.list);
-		if(fhdOrderAttachments.data && fhdOrderAttachments.data.list && fhdOrderAttachments.data.list.length > 0){
-			if(_username.value === fhdOrderAttachments.data.list[0]['sys_id'] || _username.value === 'admin/超级管理员'){
-				fhdtableData.splice(0,fhdOrderAttachments.data.list.length,...fhdOrderAttachments.data.list);
-			}
-		}
-	  }
-  }
-  
-  
-  // //pdf
-  // const showPdfModal = ref(false);
-  // const pdfContainer = ref(null);
-  
-  // const closeModal = () => {
-  //   showPdfModal.value = false;
-  // };
-  
-  // const fetchAndConvertFile = async () => {
-  //   try {
-  //     // 从后端获取 Base64 编码的 XLSX 文件数据
-  //     const responses = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'});
-  //     const response= responses.data[0].附件内容
-  //     const base64Data = response.match(/base64,(.*)$/)?.[1]; 
-  
-  // if (!base64Data) {
-  //   throw new Error('Invalid Base64 data');
-  // }
-  
-  // const binaryString = atob(base64Data);
-  // const binaryLen = binaryString.length;
-  // const bytes = new Uint8Array(binaryLen);
-  
-  // for (let i = 0; i < binaryLen; i++) {
-  //   bytes[i] = binaryString.charCodeAt(i);
-  // }
-  
-  //        // 解析 XLSX 文件
-  //        const workbook = XLSX.read(bytes, { type: 'array' });
-  //     const worksheet = workbook.Sheets[workbook.SheetNames[0]];
-  //     console.log(121212,worksheet)
-  //     const jsonData = XLSX.utils.sheet_to_json(worksheet);
-	  
-  // 	let base64 = XLSX.write(worksheet, { type: 'base64' });
-	  
-  //     generatePdf(base64);
-  //   } catch (error) {
-  //     console.error('Error fetching and converting file:', error);
-  //   }
-  // };
-  
-  // const generatePdf = (data) => {
-  //  console/log('pdf data', data)
-  //  const pdfDoc = new jsPDF()
-  //  pdfDoc.text(data)
-  //  pdfDoc.save(a4.pdf)
-  // };
-  
-  // const previewPdf = (blob) => {
-  //   const fileURL = URL.createObjectURL(blob);
-  
-  //   // 通过 ref 引用 pdfContainer 来在指定容器中显示 PDF
-  //   const iframe = document.createElement('iframe');
-  //   iframe.src = fileURL;
-  //   iframe.width = '100%';
-  //   iframe.height = '600px';
-  
-  //   if (pdfContainer.value) {
-  //     pdfContainer.value.innerHTML = ''; // 清空之前的内容
-  //     pdfContainer.value.appendChild(iframe);
-  //   }
-  // };
-  
-  //表格复选框
-  const ddzlTableRowKey = (row) => {
-    const u = row.Uniqid
-    const id = row?.ID ?? row?.id
-    if (id != null && id !== '') return String(id)
-    return `dd-${row?.['订单编号'] ?? 'x'}-${row?.['生产款号'] ?? ''}-${row?.['客户编号'] ?? ''}`
-  }
-  const ysColorTableRowKey = (row) => {
-    const u = row.Uniqid
-    const id = row?.ID ?? row?.id
-    if (id != null && id !== '') return String(id)
-    return `ys-${row?.['子订单编号'] ?? ''}-${String(row?.['款号'] ?? '')}-${String(row?.['颜色'] ?? '')}`
-  }
-  const table_del = ref(true)//删除订单资料
-  const table_Selection = ref('')//存储选中Uniqid
-  const ddzlSelectionChange = (selection, type) => {
-	const ids = selection.map(item => {
-	  return item.Uniqid ?? item.UniqID ?? item.UniqId
-	})
-	console.log('[订单资料] 勾选 Uniqid:', ids)
-	table_Selection.value = ids.filter((v) => v != null && v !== '').join(',')
-  }
-  
-  // 删除按钮
-  const del_ddzlClick = async () => {
-	try {
-	  // 显示确认弹窗
-	  await ElMessageBox.confirm('确定要删除这条记录吗?', '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-	  });
-  
-	  // 如果用户点击了确定
-	  let params = {};
-	  params.Uniqid = table_Selection._value;
-	  console.log(params);
-	  const res1 = await orderDataDel(params);
-	  if (res1.code === 0) {
-		ElMessage.success('删除成功');
-  
-		// 重新加载工单列表
-		const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: "1", limit: "10" });
-		tableData.value = WorkListdata.data.data;
-  
-		// 清空相关数据
-		ystableData.splice(0, ystableData.length); // 颜色资料清空
-		parttableData.splice(0, parttableData.length); // 部件资料清空
-		gytableData.splice(0, gytableData.length); // 工艺资料清空
-		ddtableData.splice(0, ddtableData.length); // 订单资料附件清空
-		jstableData.splice(0, jstableData.length); // 技术附件清空
-	  }
-	} catch (error) {
-	  // 用户点击了取消或关闭了弹窗
-	  ElMessage.info('删除操作已取消');
-	}
-  };
-  
-  
-  const delall = ref(true)
-  //颜色复选框
-  const ysSelection = ref('')
-  //工艺复选框
-  const gySelection = ref('')
-    // 颜色资料多选、工艺资料多选
-	const selectionChange = (selection, type) => {
-	if (type === '颜色资料') {
-	  const ids = selection.map(item => item.Uniqid ?? item.UniqID ?? item.UniqId)
-	  console.log('[颜色资料] 勾选 Uniqid:', ids)
-	  ysSelection.value = ids.filter((v) => v != null && v !== '').join(',')
-	}
-	if (type === '工艺资料') {
-	  const ids = selection.map(item => item.id)
-	  console.log('[工艺资料] 勾选 id:', ids)
-	  gySelection.value = ids.filter((v) => v != null && v !== '').join(',')
-	}
-  }
-  
-	// ===========删除颜色资料、工艺资料 ===========
-	const delgd_delclick = async () => {
-		let changed = false;
-
-		try {
-			if (ysSelection.value !== '') {
-			  const res1 = await PrintDetailDel({ UniqId: ysSelection.value });
-			  if (res1.code === 0) {
-				ElMessage.success('颜色资料删除成功');
-				changed = true;
-			  }
-			}
-
-			if (gySelection.value !== '') {
-			  const res2 = await PrintDetailDel({ UniqId: gySelection.value });
-			  if (res2.code === 0) {
-				ElMessage.success('工艺资料删除成功');
-				changed = true;
-			  }
-			}
-
-			if (changed) {
-			  const PrintListDatas = await PrintListData({ order: _Gd_gdbh.value });
-			  sizeDatas.splice(0, sizeDatas.length, ...PrintListDatas.data.型号);
-			  ystableData.splice(0, ystableData.length, ...PrintListDatas.data.列表);
-			}
-		} catch (err) {
-			ElMessage.error(err);
-		}
-	};
-  
-  // 删除工艺资料
-  const delgy_delclick = async () => {
-    try {
-      if (gySelection.value !== '') {
-        const res = await DeleteProcess({ id: gySelection.value });
-        if (res.code === 0) {
-          ElMessage.success('工艺资料删除成功');
-          // 刷新工艺资料表格
-          const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
-          if (processListData?.code === 0 && Array.isArray(processListData.data)) {
-            gytableData.splice(0, gytableData.length, ...processListData.data);
-          } else {
-            gytableData.splice(0, gytableData.length);
-          }
-        }
-      }
-    } catch (err) {
-      ElMessage.error(err);
-    }
-  };
-  
-  const fj_Selection = ref('')//存储选中Uniqid
-  const fjSelection = ref('')
-  const fjdelall = ref(true)
-  const fjSelectionChange = (selection, type) => {
-	  // console.log(selection)
-	const ids = selection.map(item => {
-	  return item.UniqId
-	})
-	fj_Selection.value = ids.join(',')
-	console.log("附件复选框",fj_Selection.value)
-  }
-  
-  // //删除附件按钮
-  const fj_delclick = async () => {
-	let params = {};  
-	params.UniqId = fj_Selection._value; 
-	res1.code === 0 && ElMessage.success('删除成功')
-  }
-  
-  //BOM表格复选框
-  const del_bom = ref(true)//删除BOM资料
-  const bom_Selection = ref('')//存储选中Uniqid
-  const bomSelectionChange = (selection, type) => {
-	const ids = selection.map(item => {
-	  return item.UNIQID
-	})
-	bom_Selection.value = ids.join(',')
-	console.log("bom复选框",bom_Selection.value)
-  }
-  
-  // 删除BOM资料按钮
-  // const delbom_delclick = async () => {
-  //   try {
-  //     // 弹出确认框
-  //     await ElMessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示', {
-  //       confirmButtonText: '确定',
-  //       cancelButtonText: '取消',
-  //       type: 'warning',
-  //     });
-  //     // 用户点击“确定”后执行以下逻辑
-  //     const params = {
-  // 		UNIQID: bom_Selection._value,
-  //     };
-  //     console.log('删除参数:', params);
-  //     // 调用删除接口
-  //     const res1 = await Bomdel(params);
-  //     if (res1.code === 0) {
-  //       ElMessage.success('删除成功');
-  //     } else {
-  //       ElMessage.error('删除失败');
-  //       return; // 如果删除失败,直接返回
-  //     }
-  //     // 重新获取BOM列表数据
-  //     const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
-  //     bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
-  //   } catch (error) {
-  //     // 用户点击“取消”或弹框关闭
-  //     console.log('用户取消删除操作');
-  //   }
-  // };
-  
-	//合计
-	const getSummaries = (param) => {  
-	  const { columns, data } = param;  
-	  const sums = {};  
-	  //选择你希望合计的列
-	  const summableLabels = [...sizeDatas, "制单总数"];
-	  columns.forEach((column, index) => {  
-		  if (index === 1) {  
-			  sums[index] = '总数量合计';  
-			  return;  
-		  }  
-
-		  if (summableLabels.includes(column.label)) {  
-			  const values = data.map(item => Number(item[column.property]));  
-
-			  // 检查数组中是否所有值都是 NaN  
-			  if (!values.every(value => isNaN(value))) {  
-				  sums[index] = values.reduce((prev, curr) => {  
-					  const value = Number(curr);  
-					  if (!isNaN(value)) {  
-						  return prev + value; 
-					  }  
-					  return prev;  
-				  }, 0);  
-				  // 如果需要,可以在这里添加单位  
-				  // sums[index] += ' 件';  
-			  } else {  
-				   sums[index] = 'N/A';  
-			  }  
-		  }  
-	  });  
-
-	  return sums;  
-  };
-
-	//工艺资料合计
-	const gySummaries = ({ columns, data }) => {  
-	  // 只合计状态为0(正常)的行
-	  const normalData = data.filter(item => String(item.状态) === '0');
-	  const sums = [];  
-	  columns.forEach((column, index) => {  
-		  if (index === 1) {  
-			  sums[index] = '合计';  
-			  return;  
-		  }  
-
-		  if (column.label === '工分') {  
-			  const values = normalData.map(item => Number(item[column.property]));  
-
-			  if (!values.every(value => isNaN(value))) {  
-				  const total = values.reduce((prev, curr) => {  
-					  const value = Number(curr);  
-					  if (!isNaN(value)) {  
-						  return prev + value; 
-					  }  
-					  return prev;  
-				  }, 0);  
-				  sums[index] = total.toFixed(2);  
-			  } else {  
-				   sums[index] = 'N/A';  
-			  }  
-		  }  
-	  });  
-
-	  return sums;  
-  };  
-
-	//工艺详情弹窗合计
-	const gyDetailSummaries = (param) => {  
-	  const { columns, data } = param;  
-	  const sums = [];  
-	  let total = 0;  
-	  let count = 0;  
-	  
-	  data.forEach(item => {  
-		if (item && item['定额分'] !== undefined) {  
-		  const val = Number(item['定额分']);  
-		  if (!isNaN(val)) {  
-			total += val;  
-			count++;  
-		  }  
-		}  
-	  });  
-	  
-	  columns.forEach((column, index) => {  
-		if (column.prop === '工序名称') {  
-		  sums[index] = '合计';  
-		} else if (column.label === '工分') {  
-		  sums[index] = count > 0 ? total.toFixed(2) : '0.00';  
-		} else {  
-		  sums[index] = '';  
-		}  
-	  });  
-	  
-	  return sums;  
-  };
-  
-  // 面料合计
-  // const mlgetSummaries = (param) => {  
-  //     const { columns, data } = param;  
-  //     const sums = {};  
-  // 	//选择你希望合计的列
-  //     const summableLabels = ["库存总量"];
-  //     columns.forEach((column, index) => {  
-  //         if (index === 0) {  
-  //             sums[index] = '总数量合计';  
-  //             return;  
-  //         }  
-  //         if (summableLabels.includes(column.label)) {  
-  //             const values = data.map(item => Number(item[column.property]));  
-  //             if (!values.every(value => isNaN(value))) {  
-  //                 sums[index] = values.reduce((prev, curr) => {  
-  //                     const value = Number(curr);  
-  //                     if (!isNaN(value)) {  
-  //                         return prev + value; 
-  //                     }  
-  //                     return prev;  
-  //                 }, 0);  
-  //             } else {  
-  //                  sums[index] = 'N/A';  
-  //             }  
-  //         }  
-  //     });  
-  //     return sums;  
-  // };  
-  
-  
-  
-  //=========查询========
-  const searchInfo = ref('')
-  
-  //查询按钮
-  const onSubmit = async () => {
-	if(searchInfo.value === ''){
-	  ElMessage({type: 'warning',message: '请输入搜索的订单编号'})
-	  return false;
-	}else{
-	const WorkListdata = await WorkOrderList({search:searchInfo.value,page:page.value,limit:pageSize.value});
-	 tableData.value= WorkListdata.data.data
-	 ystableData.splice(0, ystableData.length);//颜色资料清空
-	 parttableData.splice(0, parttableData.length);//部件资料清空
-	 gytableData.splice(0, gytableData.length);//工艺资料情空
-	 ddtableData.splice(0, ddtableData.length);//订单资料附件清空
-	 jstableData.splice(0, jstableData.length);//技术附件清空
-	}
-  };
-  
-  
-  // 调用查询数据接口
-  const _cha_WorkList = async (node) => {
-	if(searchInfo.value === ''){
-	  ElMessage({type: 'warning',message: '请输入搜索的信息'})
-	  return false;
-	}
-	const search = searchInfo.value;
-	var regex = /^[a-zA-Z0-9]+$/;
-	try {
-	  if (regex.test(search)) {
-		// 符合条件,执行搜索操作
-		console.log('搜索内容为纯数字加字母');
-		// const WorkListdata = await WorkList({search:search,limit:100,page:1});//接口调用函数
-		if(WorkListdata.data.total === 0){
-		  ElMessage({type: 'warning',message: '未搜索具体查询条件'})
-		}
-		tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
-		total.value = WorkListdata.data.total;//共多少条
-	  } else {
-		// 不符合条件,给出提示
-		console.log('搜索内容包含非字母和数字的字符');
-		// const WorkListdata = await WorkList({Gd_khdh:'',search:search,limit:100,page:1});//接口调用函数
-		if(WorkListdata.data.total === 0){
-		  ElMessage({type: 'warning',message: '未搜索具体查询条件'})
-		}
-		tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
-		total.value = WorkListdata.data.total;//共多少条
-	  }
-	} catch (error) {
-	  console.error(error);
-	}
-  };
-  
-  
-  //===============附件上传===============
-  //附件上传按钮
-  const jsfjClick = () => {
-	if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
-		ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
-	  }else{
-		  jsfjdialogFormVisible.value = true
-		  initJsfjformdata();
-		  jsfjformdata.value.关联编号 = _Gd_gdbh.value
-	  }
-  }
-  //技术附件弹窗
-  const jsfjdialogFormVisible = ref(false)
-  const jsfjformdata = ref({
-	  sys_id: _username.value,
-	  附件备注: '',
-	  附件内容: '',
-	  附件类型: '',
-	  关联编号: '',
-  });
-  //技术附件弹窗取消
-  const initJsfjformdata = () => {
-	jsfjformdata.value = {
-	  sys_id: _username.value,
-	  附件备注: '',
-	  附件内容: '',
-	  附件类型: '',
-	  关联编号: '',
-	}
-  }
-  //技术附件弹窗取消
-  const jsfjcloseDialog = () => {
-	jsfjdialogFormVisible.value = false
-  }
-  const uploadExcel = (event) =>{
-	  const files = event.target.files;
-	  console.log(files)
-	  let suffixArr = name.split("."), suffix = suffixArr[suffixArr.length-1];
-	  jsfjformdata.value.附件内容 = files[0]
-	  jsfjformdata.value.附件类型 = files[0].name.split('.')[1]
-  }
-  
-  //技术附件弹窗确定
-  const jsfjenterDialog = () => {
-	  if(jsfjformdata.value.附件备注==''){
-		  ElMessage({type: 'error',message: '请选择附件备注'});
-		  return;
-	  }
-	  if(jsfjformdata.value.附件内容==''){
-		  ElMessage({type: 'error',message: '请上传文件'});
-		  return;
-	  }
-	  if(jsfjformdata.value.关联编号==''){
-		  ElMessage({type: 'error',message: '请关闭重新打开'});
-		  return;
-	  }
-	  let fr = new FileReader();
-	  fr.readAsDataURL(jsfjformdata.value.附件内容);
-	  fr.onload = function () {
-		const restoredData = new FormData();
-		restoredData.append('附件备注', jsfjformdata.value.附件备注);
-		restoredData.append('附件内容', fr.result);
-		restoredData.append('附件类型', jsfjformdata.value.附件类型);
-		restoredData.append('关联编号', jsfjformdata.value.关联编号);
-		restoredData.append('sys_id', jsfjformdata.value.sys_id);
-		
-		 //将restoredDta数据新增到接口
-		 gdAnnexAdd(restoredData).then(response => {
-		   if(response.code==0){
-			   ElMessage({type: 'success',message: '新增成功',})
-			   jsfjdialogFormVisible.value = false
-			   let row = {
-				   '订单编号':_Gd_gdbh.value,
-				  //  '产品代号':_Gd_cpdh.value,
-				  //  '产品名称':_Gd_cpmc.value,
-			   }
-			   tableRowClick (row)
-		   }
-		 })
-	  }
-  }
-
-  // 导入工艺资料弹窗相关方法
-  const openImportProcessDialog = () => {
-    importProcessForm.workorderNo = _Gd_gdbh.value
-    importProcessForm.styleNo = _Gd_sckh.value
-    importProcessFileList.length = 0
-    importProcessFile = null
-    importProcessDialogVisible.value = true
-	console.log(importProcessDialogVisible.value)
-  }
-
-  const closeImportProcessDialog = () => {
-    importProcessDialogVisible.value = false
-    importProcessFileList.length = 0
-    importProcessFile = null
-  }
-
-  const handleImportProcessFileChange = (file, fileList) => {
-    if (fileList.length > 0) {
-      const lastFile = fileList[fileList.length - 1]
-      importProcessFile = lastFile.raw || lastFile
-    }
-  }
-
-  const handleImportProcessFileRemove = () => {
-    importProcessFile = null
-  }
-
-  const beforeImportProcessUpload = (file) => {
-    const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || 
-                    file.type === 'application/vnd.ms-excel'
-    if (!isExcel) {
-      ElMessage.error('请选择Excel文件')
-      return false
-    }
-    return true
-  }
-
-  const submitImportProcess = async () => {
-    console.log('submitImportProcess called')
-    console.log('importProcessFile:', importProcessFile)
-    
-    if (!importProcessFile) {
-      ElMessage.error('请选择Excel文件')
-      return
-    }
-    
-    const formData = new FormData()
-    formData.append('workorder', _Gd_gdbh.value)
-    formData.append('file', importProcessFile)
-    formData.append('sys_id', userStore.userInfo.nickName)
-    
-    // 调试:检查 formData 内容
-    console.log('workorder:', _Gd_gdbh.value)
-    console.log('sys_id:', userStore.userInfo.nickName)
-    console.log('formData entries:', [...formData.entries()])
-    
-    try {
-      const baseURL = import.meta.env.VITE_BASE_API || ''
-      const response = await axios.post(`${baseURL}/mes_server/work_order_process/importProcess`, formData, {
-        headers: {
-          'x-token': userStore.token
-        }
-      })
-      console.log('response:', response.data)
-      if (response.data.code === 0) {
-        ElMessage.success('导入成功')
-        closeImportProcessDialog()
-        // 刷新工艺资料表格数据
-        const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
-        if (processListData?.code === 0 && Array.isArray(processListData.data)) {
-          gytableData.splice(0, gytableData.length, ...processListData.data);
-        } else {
-          gytableData.splice(0, gytableData.length);
-        }
-      } else {
-        ElMessage.error(response.data.msg || '导入失败')
-      }
-    } catch (error) {
-      console.error('导入工艺资料失败:', error)
-      ElMessage.error('导入失败,请稍后重试')
-    }
-  }
-  
-  </script>
-  <style scoped>
-  /* 在样式表中使用媒体查询 */
-  @media (max-width: 768px) {
-	/* 在小屏幕下的样式设置 */
-	.dialog-footer {
-	  text-align: center;
-	}
-  }
-  /*背景颜色*/
-  /*印件背景颜色变黄*/
-  :deep(.el-table__body .warning-row) {
-	background: #FFFF80 !important;
-  }
-  /*bom参数背景*/
-  :deep(.el-table__body .background-plan-usage-low div div div) {
-	background: #80FA80 !important;
-  }
-  /* 选中某行时的背景色 */
-  :deep(.el-table__body tr.current-row) > td {
-	background: #ff80ff !important;
-  }
-  :deep(.statusy-plan-usage-low div) {
-	color: #8c939d !important;
-  }
-  /* 在样式表中添加以下样式 */
-  .el-input__textarea {
-	resize: none; /* 禁止调整大小 */
-  }
-  .JKWTree-container {
-	display: flex;
-  }
-  .JKWTree-tree {
-	/*width: 300px;*/
-	background-color: #fff;
-	padding: 10px;
-	margin-right: 20px;
-  }
-  .JKWTree-tree h3 {
-	font-size: 15px;
-	font-weight: 700;
-	margin: 10px 0;
-  }
-  .JKWTree-content {
-	flex: 1;
-  }
-  /*关闭拖拽功能*/
-  .el-textarea textarea {
-	resize: none !important;
-  }
-  
-  /* 新增/修改订单资料弹窗 - 16/8 栅格布局(与原版一致,小屏自动换行) */
-  .add-order-dialog :deep(.el-dialog) {
-	width: min(90%, 1200px) !important;
-	max-height: 92vh;
-	display: flex;
-	flex-direction: column;
-	margin: 4vh auto !important;
-  }
-  .add-order-dialog :deep(.el-dialog__body) {
-	flex: 1;
-	min-height: 0;
-	overflow-x: hidden;
-	overflow-y: auto;
-	padding: 12px 20px 8px;
-  }
-  .add-order-dialog-body {
-	min-width: 0;
-  }
-  .add-order-dialog-main,
-  .add-order-dialog-side {
-	min-width: 0;
-  }
-  .add-order-upload-wrap {
-	display: flex;
-	flex-direction: column;
-	align-items: center;
-	margin-bottom: 16px;
-  }
-  .add-order-dialog-side :deep(.el-upload-list--picture-card) {
-	margin-left: 0;
-  }
-  .add-order-upload-title {
-	font-size: 16px;
-	margin-top: 8px;
-	text-align: center;
-	color: var(--el-text-color-regular);
-  }
-  /* 去掉「按 Delete 键可删除」及角标关闭,仅保留 picture-card 悬停放大/垃圾桶 */
-  .add-order-upload :deep(.el-icon--close-tip),
-  .add-order-upload :deep(.el-upload-list__item .el-icon--close),
-  .add-order-upload :deep(.el-upload-list__item-status-label) {
-	display: none !important;
-  }
-  .add-order-bottom-row {
-	margin-top: 4px;
-  }
-  .add-order-dialog-main :deep(.el-input),
-  .add-order-dialog-main :deep(.el-select),
-  .add-order-dialog-main :deep(.el-date-editor),
-  .add-order-dialog-side :deep(.el-input),
-  .add-order-dialog-side :deep(.el-date-editor) {
-	width: 100%;
-  }
-  .add-order-dialog-main :deep(.el-form-item__content),
-  .add-order-dialog-side :deep(.el-form-item__content) {
-	min-width: 0;
-  }
-  @media (max-width: 768px) {
-	.add-order-dialog-side {
-	  margin-top: 12px;
-	  padding-top: 12px;
-	  border-top: 1px solid var(--el-border-color-lighter);
-	}
-  }
-
-  /* 新增部件弹窗样式 */
-  .part-add-dialog {
-	max-height: 95vh;
-	height: 95vh;
-  }
-  
-  .part-add-dialog .el-dialog__body {
-	max-height: 85vh;
-	height: 85vh;
-	overflow-y: auto;
-	padding: 20px;
-  }
-  
-  .part-add-dialog .list-part-hint {
-	margin-bottom: 20px;
-	font-size: 14px;
-  }
-  
-  .part-add-dialog .el-table {
-	margin-bottom: 20px;
-  }
-  
-  .part-add-dialog .el-table th {
-	background-color: #f5f7fa;
-	font-weight: bold;
-  }
-  
-  .part-add-dialog .el-table td {
-	padding: 12px;
-  }
-  
-  .part-add-dialog .dialog-footer {
-	margin-top: 20px;
-	padding-top: 15px;
-	border-top: 1px solid #ebeef5;
-  }
-  </style>
-  <style scoped>
-  :deep(.el-table td .cell) {
-	line-height: 20px !important;
-  }
-  :deep(.el-tabs__header){
-	margin-bottom: 0;
-  }
-  .search{
-	margin-left: 0px !important;
-	margin-right: 10px !important;
-  }
-  .bt{
-	margin-left: 2px !important;
-	padding: 3px !important;
-	font-size: 12px;
-  }
-  .el-tabs__header{
-	margin: 0px !important;
-  }
-  .gva-table-box{
-	padding: 0px !important;
-  }
-  .el-pagination{
-	margin-top: 0px !important;
-  }
-  /* .upload-demo .el-upload {  
-	border: 1px dashed #d9d9d9;  
-	border-radius: 6px;  
-	cursor: pointer;  
-	position: relative;  
-	overflow: hidden;  
-  }  
-  .upload-demo .el-upload:hover {  
-	border-color: #409EFF;  
-  }   */
-  
-  .mab{
-	margin-bottom: 5px;
-  }
-  .fj-col-header {
-	display: inline-flex;
-	align-items: center;
-	gap: 2px;
-	cursor: help;
-  }
-  .fj-col-help {
-	font-size: 14px;
-	color: #909399;
-  }
-  /* 上下表头统一浅色 */
-  :deep(.el-table) {
-	--el-table-header-bg-color: #fafafa;
-  }
-  :deep(.el-table__header th.el-table__cell) {
-	background-color: #fafafa !important;
-  }
-  ::v-deep(.input_style .el-input__inner) {  
-	font-size: 18px; 
-  }  
-  ::v-deep(.el-form-item__label) {  
-	font-size: 18px; 
-  }
-  
-  ::v-deep(.el-upload-list--picture-card) {  
-	  margin-left: 0;
-  }
-  ::v-deep(.add-order-upload .el-upload__input),
-  ::v-deep(.import-process-upload .el-upload__input) {
-    display: none !important;
-  }
-  ::v-deep(.el-checkbox__inner) {  
-	  width: 20px;
-	  height: 20px;
-  }
-  ::v-deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {  
-	top: 30%; 
-	left: 30%;
-  }
-  ::v-deep(.el-descriptions__table tbody tr .is-bordered-label){
-	  width: 40px;
-  }
-  ::v-deep(.el-descriptions__table tbody tr .el-descriptions__content){
-	  width: 120px;
-  }
-  :deep(.el-descriptions__content) {
-	width: 80px !important;
-	min-width: 80px !important;
-	max-width: 100px !important;
-	overflow: hidden !important;
-	text-overflow: ellipsis !important;
-  }
-  
-  .big-error-message {
-    padding: 20px 30px !important;     /* 整体弹窗变大 */
-    font-size: 20px !important;        /* 文字更大 */
-    animation: scaleFadeIn 0.3s ease-out; /* 放大淡入动画 */
-  }
-  
-  .big-error-message .el-message__icon {
-    font-size: 26px !important; /* 图标变大 */
-  }
-  
-  @keyframes scaleFadeIn {
-    0% {
-      transform: scale(0.8);
-      opacity: 0;
-    }
-    100% {
-      transform: scale(1);
-      opacity: 1;
-    }
-  }
-  
-  /* 排序弹窗样式 */
-  .list-unified-dialog :deep(.el-dialog) {
-    max-height: 90vh;
-    display: flex;
-    flex-direction: column;
-    margin-top: 5vh !important;
-    margin-bottom: 5vh;
-  }
-  .list-unified-dialog :deep(.el-dialog__header) {
-    flex-shrink: 0;
-    padding-bottom: 12px;
-  }
-  .list-unified-dialog :deep(.el-dialog__body) {
-    flex: 1;
-    min-height: 320px;
-    max-height: min(720px, calc(90vh - 130px));
-    overflow-y: auto;
-    box-sizing: border-box;
-  }
-  .list-unified-dialog :deep(.el-dialog__footer) {
-    flex-shrink: 0;
-  }
-  .list-process-add-dialog.list-unified-dialog :deep(.el-dialog) {
-    width: min(1280px, 96vw) !important;
-    min-width: min(1280px, 96vw) !important;
-    max-width: min(1280px, 96vw) !important;
-    height: min(620px, 78vh) !important;
-    min-height: min(620px, 78vh) !important;
-    max-height: min(620px, 78vh) !important;
-    box-sizing: border-box !important;
-  }
-  .list-process-add-dialog.list-unified-dialog :deep(.el-dialog__body) {
-    max-height: none !important;
-    min-height: 0 !important;
-    flex: 1 1 auto !important;
-    display: flex !important;
-    flex-direction: column !important;
-    overflow: hidden !important;
-  }
-  .list-process-add-dialog.list-unified-dialog .list-process-add-by-part {
-    flex: 1 1 auto;
-    min-height: 0;
-    display: flex;
-    flex-direction: column;
-    overflow: hidden;
-  }
-  .list-process-add-dialog.list-unified-dialog .list-dialog-context-header {
-    flex-shrink: 0;
-  }
-  .list-dialog-context-header {
-    margin-bottom: 14px;
-  }
-  .list-dialog-kv-table {
-    width: 100%;
-    border-collapse: collapse;
-    font-size: 13px;
-    table-layout: fixed;
-  }
-  .list-dialog-kv-table th,
-  .list-dialog-kv-table td {
-    border: 1px solid var(--el-border-color);
-    padding: 8px 12px;
-    text-align: left;
-    vertical-align: middle;
-    line-height: 1.45;
-  }
-  .list-dialog-kv-table th {
-    width: 92px;
-    background: #f5f7fa;
-    font-weight: 500;
-    color: var(--el-text-color-regular);
-    white-space: nowrap;
-  }
-  .list-dialog-kv-table td {
-    background: #fff;
-    color: var(--el-text-color-primary);
-    word-break: break-word;
-  }
-  .list-process-add-split {
-    display: flex;
-    gap: 14px;
-    align-items: stretch;
-    flex: 1 1 auto;
-    min-height: 0;
-    overflow: hidden;
-  }
-  .list-process-add-sidebar {
-    flex: 0 0 240px;
-    max-width: 42%;
-    display: flex;
-    flex-direction: column;
-    min-height: 0;
-    border: 1px solid var(--el-border-color-lighter);
-    border-radius: 8px;
-    background: var(--el-fill-color-blank);
-    overflow: hidden;
-  }
-  .list-process-add-sidebar-title {
-    padding: 10px 12px;
-    font-size: 13px;
-    font-weight: 600;
-    color: var(--el-text-color-regular);
-    border-bottom: 1px solid var(--el-border-color-lighter);
-    background: #f5f7fa;
-  }
-  .list-process-add-part-list {
-    flex: 1;
-    min-height: 0;
-    overflow-y: auto;
-    padding: 8px;
-    display: flex;
-    flex-direction: column;
-    gap: 6px;
-  }
-  .list-process-add-stage-list {
-    gap: 2px;
-  }
-  .list-process-add-stage-item {
-    display: flex;
-    align-items: center;
-    padding: 9px 10px;
-    border-radius: 6px;
-    border: 1px solid var(--el-border-color-lighter);
-    background: var(--el-bg-color);
-    cursor: pointer;
-    font-size: 13px;
-    font-weight: 600;
-    color: var(--el-text-color-primary);
-    user-select: none;
-    -webkit-user-select: none;
-    transition: border-color 0.15s, background 0.15s;
-  }
-  .list-process-add-stage-item:hover {
-    border-color: var(--el-color-primary-light-5);
-  }
-  .list-process-add-stage-item.is-active {
-    border-color: var(--el-color-primary);
-    background: var(--el-color-primary-light-9);
-    color: var(--el-color-primary);
-  }
-  .list-process-add-sewing-nest {
-    margin: 0 0 8px 0;
-    padding: 0 0 0 10px;
-    border-left: 2px solid var(--el-border-color-lighter);
-    display: flex;
-    flex-direction: column;
-    gap: 5px;
-  }
-  .list-process-add-part-item--nest {
-    padding: 6px 8px;
-    font-size: 12px;
-  }
-  .list-process-add-part-item {
-    display: flex;
-    align-items: flex-start;
-    gap: 8px;
-    padding: 8px 10px;
-    border-radius: 6px;
-    border: 1px solid var(--el-border-color-lighter);
-    background: var(--el-bg-color);
-    cursor: pointer;
-    user-select: none;
-    -webkit-user-select: none;
-    transition: border-color 0.15s, background 0.15s;
-  }
-  .list-process-add-part-item:hover {
-    border-color: var(--el-color-primary-light-5);
-  }
-  .list-process-add-part-item.is-active {
-    border-color: var(--el-color-primary);
-    background: var(--el-color-primary-light-9);
-  }
-  .list-process-add-part-item-text {
-    flex: 1;
-    min-width: 0;
-    display: flex;
-    flex-direction: column;
-    gap: 2px;
-  }
-  .list-process-add-part-sort {
-    font-size: 12px;
-    color: var(--el-text-color-secondary);
-  }
-  .list-process-add-part-name {
-    font-size: 13px;
-    font-weight: 600;
-    color: var(--el-text-color-primary);
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-  }
-  .list-process-add-main-panel {
-    flex: 1;
-    min-width: 0;
-    display: flex;
-    flex-direction: column;
-    min-height: 0;
-    border: 1px solid var(--el-border-color-lighter);
-    border-radius: 8px;
-    padding: 10px 12px;
-    background: var(--el-bg-color);
-    overflow: hidden;
-  }
-  .list-process-add-main-head {
-    margin-bottom: 10px;
-    font-size: 13px;
-    color: var(--el-text-color-regular);
-  }
-  .list-process-add-main-head-sub {
-    margin-left: 6px;
-    color: var(--el-text-color-secondary);
-    font-weight: normal;
-  }
-  .list-process-add-main-empty {
-    flex: 1;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    min-height: 200px;
-  }
-  .sort-part-gy-part-item.is-active {
-    border-color: var(--el-color-primary);
-    background: var(--el-color-primary-light-9);
-  }
-  .sort-part-gy-body {
-    flex: 1;
-    min-height: 0;
-    display: flex;
-    flex-direction: column;
-    overflow: hidden;
-  }
-  .sort-part-gy-hint {
-    margin-bottom: 12px;
-    font-size: 13px;
-    line-height: 1.55;
-    color: var(--el-text-color-regular);
-  }
-  .sort-part-gy-hint-list {
-    margin: 0;
-    padding-left: 20px;
-  }
-  .sort-part-gy-hint-list li {
-    margin-bottom: 6px;
-  }
-  .sort-part-gy-split {
-    flex: 1;
-    min-height: 0;
-    display: flex;
-    gap: 14px;
-    align-items: stretch;
-    overflow: hidden;
-  }
-  .sort-gy-left-nav {
-    flex: 0 0 240px;
-    max-width: 42%;
-  }
-  .list-sort-gy-nav-list {
-    gap: 2px;
-  }
-  .list-sort-gy-sewing-parts {
-    margin: 0 0 8px 0;
-    padding: 0 0 0 10px;
-    border-left: 2px solid var(--el-border-color-lighter);
-    display: flex;
-    flex-direction: column;
-    gap: 5px;
-  }
-  .sort-part-gy-part-item {
-    display: flex;
-    align-items: flex-start;
-    gap: 8px;
-    padding: 8px 10px;
-    border-radius: 6px;
-    border: 1px solid var(--el-border-color-lighter);
-    background: var(--el-bg-color);
-    cursor: pointer;
-    user-select: none;
-    -webkit-user-select: none;
-    transition: border-color 0.15s, background 0.15s;
-  }
-  .sort-part-gy-part-item:hover {
-    border-color: var(--el-color-primary-light-5);
-  }
-  .sort-part-gy-part-item.is-active {
-    border-color: var(--el-color-primary);
-    background: var(--el-color-primary-light-9);
-  }
-  .sort-part-gy-part-item-grip {
-    color: var(--el-text-color-secondary);
-    margin-top: 2px;
-  }
-  .sort-part-gy-main-panel {
-    flex: 1;
-    min-width: 0;
-    display: flex;
-    flex-direction: column;
-    min-height: 0;
-    border: 1px solid var(--el-border-color-lighter);
-    border-radius: 8px;
-    padding: 10px 12px;
-    background: var(--el-bg-color);
-    overflow: hidden;
-  }
-  .sort-part-gy-main-head {
-    margin-bottom: 10px;
-    font-size: 13px;
-    color: var(--el-text-color-regular);
-  }
-  .sort-part-gy-main-head--warn {
-    color: var(--el-color-warning);
-  }
-  .sort-part-gy-main-empty {
-    flex: 1;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    min-height: 200px;
-  }
-  .sort-gy-table {
-    flex: 1;
-    min-height: 0;
-  }
-  .sort-drag-col-hint {
-    font-size: 12px;
-    color: var(--el-text-color-secondary);
-  }
-  .sort-drag-handle {
-    color: var(--el-text-color-secondary);
-    cursor: move;
-  }	
-  .list-lib-name-select {
-    width: 100%;
-  }
-  .sort-gy-num-input {
-    width: 100%;
-  }
-  :deep(.gy-detail-dialog.el-dialog) {
-    max-width: 100vw;
-  }
-
-  :deep(.gy-detail-dialog .el-dialog__header) {
-    padding: 12px 20px 8px;
-    margin-right: 0;
-  }
-
-  :deep(.gy-detail-dialog .el-dialog__body) {
-    padding: 0;
-    overflow: hidden;
-    max-width: 100%;
-  }
-
-  .gy-detail-dialog-header {
-    display: flex;
-    flex-direction: column;
-    align-items: stretch;
-    gap: 12px;
-    width: 100%;
-    box-sizing: border-box;
-  }
-
-  .gy-detail-dialog-title-row {
-    width: 100%;
-  }
-
-  .gy-detail-dialog-title {
-    font-size: 16px;
-    font-weight: 600;
-    color: var(--el-text-color-primary);
-  }
-
-  .gy-detail-dialog-toolbar-row {
-    display: flex;
-    align-items: center;
-    flex-wrap: nowrap;
-    width: 100%;
-  }
-
-  .gy-detail-dialog-actions-left {
-    display: flex;
-    align-items: center;
-    flex-wrap: nowrap;
-    gap: 10px;
-  }
-
-  .gy-detail-dialog-exit {
-    flex-shrink: 0;
-    margin-left: auto;
-  }
-
-  .gy-detail-dialog-body {
-    width: 100%;
-    max-width: 100%;
-    height: calc(100vh - 80px);
-    padding: 20px;
-    overflow: auto;
-    box-sizing: border-box;
-    display: flex;
-    flex-direction: column;
-    min-width: 0;
-  }
-
-  .gy-detail-dialog-body > .gy-detail-table-wrap {
-    flex: 1;
-    min-height: 0;
-  }
-
-  .gy-detail-table-wrap {
-    width: 100%;
-    max-width: 100%;
-    min-width: 0;
-    height: calc(100vh - 250px);
-    overflow: auto;
-    border: 1px solid #ebeef5;
-    border-radius: 4px;
-  }
-
-  .gy-detail-vxe-table {
-    width: 100%;
-    flex: 1;
-    min-height: 0;
-    --vxe-table-row-current-background-color: #ff80ff;
-    --vxe-table-row-hover-current-background-color: #ff80ff;
-    --vxe-ui-table-row-current-background-color: #ff80ff;
-    --vxe-table-row-height: 28px;
-    --vxe-table-cell-padding-left: 4px;
-    --vxe-table-cell-padding-right: 4px;
-    font-size: 13px;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--row),
-  :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--row),
-  :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--row) {
-    height: 28px !important;
-    line-height: 28px !important;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-header--column),
-  :deep(.gy-detail-vxe-table .vxe-body--column),
-  :deep(.gy-detail-vxe-table .vxe-footer--column),
-  :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--cell),
-  :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--cell),
-  :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--cell) {
-    font-size: 13px;
-    height: 28px !important;
-    line-height: 28px !important;
-    padding: 0 4px !important;
-    vertical-align: middle !important;
-  }
-
-  /* 单元格内容垂直居中,编辑框贴齐格子 */
-  :deep(.gy-detail-vxe-table .vxe-body--column .vxe-cell) {
-    display: flex !important;
-    align-items: center !important;
-    height: 100% !important;
-    min-height: 28px !important;
-    max-height: 28px !important;
-    overflow: hidden !important;
-    box-sizing: border-box !important;
-  }
-
-  /* align=center / 固定操作列:水平居中 */
-  :deep(.gy-detail-vxe-table .col--center .vxe-cell),
-  :deep(.gy-detail-vxe-table .vxe-header--column.col--center .vxe-cell),
-  :deep(.gy-detail-vxe-table .vxe-body--column.col--center .vxe-cell),
-  :deep(.gy-detail-vxe-table .vxe-footer--column.col--center .vxe-cell),
-  :deep(.gy-detail-vxe-table .col--fixed-right .vxe-cell),
-  :deep(.gy-detail-vxe-table .vxe-header--column.col--fixed-right .vxe-cell),
-  :deep(.gy-detail-vxe-table .vxe-body--column.col--fixed-right .vxe-cell),
-  :deep(.gy-detail-vxe-table .vxe-footer--column.col--fixed-right .vxe-cell) {
-    justify-content: center !important;
-    text-align: center !important;
-  }
-
-  .gy-detail-status-cell,
-  .gy-detail-action-cell {
-    width: 100%;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-
-  :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell),
-  :deep(.gy-detail-vxe-table .col--checkbox) {
-    text-align: center !important;
-    justify-content: center !important;
-  }
-
-  :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--checkbox),
-  :deep(.gy-detail-vxe-table .col--checkbox .vxe-checkbox--icon),
-  :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--title) {
-    margin-left: auto !important;
-    margin-right: auto !important;
-  }
-
-  .gy-detail-table-wrap ::-webkit-scrollbar,
-  .gy-detail-vxe-table ::-webkit-scrollbar,
-  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar,
-  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar {
-    display: block !important;
-    width: 14px;
-    height: 14px;
-  }
-
-  .gy-detail-table-wrap ::-webkit-scrollbar-track,
-  .gy-detail-vxe-table ::-webkit-scrollbar-track,
-  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-track,
-  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-track {
-    background: #f1f1f1;
-    border-radius: 7px;
-  }
-
-  .gy-detail-table-wrap ::-webkit-scrollbar-thumb,
-  .gy-detail-vxe-table ::-webkit-scrollbar-thumb,
-  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb,
-  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb {
-    background: #ccc;
-    border-radius: 7px;
-    border: 3px solid #f1f1f1;
-  }
-
-  .gy-detail-table-wrap ::-webkit-scrollbar-thumb:hover,
-  .gy-detail-vxe-table ::-webkit-scrollbar-thumb:hover,
-  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb:hover,
-  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb:hover {
-    background: #999;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper),
-  :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper) {
-    z-index: 4;
-  }
-
-  :deep(.gy-detail-vxe-table .col--fixed-right) {
-    background-color: #fff;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-right),
-  :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-left) {
-    background-color: #f5f7fa;
-  }
-
-  .gy-detail-cell {
-    min-height: 24px;
-    height: 24px;
-    line-height: 24px;
-    padding: 0 4px;
-    cursor: text;
-    border-radius: 2px;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    text-align: center;
-    color: var(--el-text-color-primary);
-    box-sizing: border-box;
-    width: 100%;
-  }
-
-  .gy-detail-cell--wide {
-    white-space: nowrap;
-    line-height: 24px;
-    min-height: 24px;
-    height: 24px;
-    display: flex;
-    align-items: center;
-    justify-content: flex-start;
-    text-align: left;
-    width: 100%;
-  }
-
-  .gy-detail-cell:hover {
-    background: #f5f7fa;
-    box-shadow: inset 0 0 0 1px #dcdfe6;
-  }
-
-  .gy-split-process-name {
-    color: #f56c6c;
-    font-weight: 600;
-  }
-
-  .gy-detail-cell-input {
-    width: 100%;
-    flex: 1;
-    min-width: 0;
-    position: relative;
-    z-index: 2;
-  }
-
-  .gy-detail-cell-select {
-    display: block;
-    width: 100%;
-  }
-
-  .gy-detail-vxe-table .gy-detail-cell-select .el-select__wrapper {
-    min-height: 24px !important;
-    height: 24px !important;
-    padding: 0 6px;
-    box-shadow: 0 0 0 1px var(--el-color-primary) inset;
-    box-sizing: border-box;
-  }
-
-  .gy-detail-vxe-table .gy-detail-cell-input .el-input__wrapper {
-    min-height: 24px !important;
-    height: 24px !important;
-    padding: 0 6px;
-    box-shadow: 0 0 0 1px var(--el-color-primary) inset;
-    box-sizing: border-box;
-  }
-
-  .gy-detail-vxe-table .gy-detail-cell-input .el-input__inner {
-    height: 22px !important;
-    line-height: 22px !important;
-  }
-
-  :deep(.gy-detail-vxe-table .el-button--small) {
-    --el-button-size: 20px;
-    height: 20px;
-    padding: 0 6px;
-    font-size: 12px;
-  }
-
-  .gy-detail-vxe-table .vxe-body--row.row--current .gy-detail-cell:hover {
-    background: rgba(255, 255, 255, 0.35);
-  }
-
-  /* 仅点击当前行显示 #ff80ff,勾选复选框不高亮行背景 */
-  :deep(.gy-detail-vxe-table .vxe-body--row.row--current),
-  :deep(.gy-detail-vxe-table .vxe-body--row.is--current) {
-    background-color: #ff80ff !important;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-body--row.row--current > .vxe-body--column),
-  :deep(.gy-detail-vxe-table .vxe-body--row.row--current.row--hover > .vxe-body--column),
-  :deep(.gy-detail-vxe-table .vxe-body--row.is--current > .vxe-body--column),
-  :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper .vxe-body--row.row--current > .vxe-body--column),
-  :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper .vxe-body--row.row--current > .vxe-body--column) {
-    background-color: #ff80ff !important;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-body--row.row--checked:not(.row--current) > .vxe-body--column),
-  :deep(.gy-detail-vxe-table .vxe-body--row.is--checked:not(.is--current) > .vxe-body--column) {
-    background-color: #fff !important;
-  }
-
-  :deep(.gy-detail-vxe-table .vxe-body--row.row--current .el-input__wrapper) {
-    background-color: transparent !important;
-  }
-
-  .gy-detail-col-header {
-    display: inline-flex;
-    align-items: center;
-    justify-content: center;
-    gap: 4px;
-    width: 100%;
-  }
-
-  .gy-detail-filter-btn {
-    display: inline-flex;
-    align-items: center;
-    justify-content: center;
-    width: 22px;
-    height: 22px;
-    cursor: pointer;
-    color: #909399;
-    border-radius: 2px;
-  }
-
-  .gy-detail-filter-btn:hover,
-  .gy-detail-filter-btn.is-active {
-    color: var(--el-color-primary);
-    background: #ecf5ff;
-  }
-
-  .gy-detail-filter-options {
-    max-height: 220px;
-    overflow-x: hidden;
-    overflow-y: auto;
-    margin-bottom: 4px;
-  }
-
-  .gy-detail-filter-panel .el-checkbox {
-    display: flex;
-    margin-right: 0;
-    margin-bottom: 6px;
-  }
-
-  .gy-detail-filter-actions {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-top: 4px;
-    padding-top: 8px;
-    border-top: 1px solid #ebeef5;
-    background: #fff;
-    position: relative;
-    z-index: 2;
-  }
-
-  .gy-detail-filter-link {
-    color: var(--el-color-primary);
-    font-size: 12px;
-    line-height: 1;
-    cursor: pointer;
-    user-select: none;
-    padding: 4px 2px;
-  }
-
-  .gy-detail-filter-link:hover {
-    opacity: 0.85;
-  }
-
-</style>
-
-<style>
-  .process-production-dialog .el-dialog__header {
-    display: block;
-    width: 100%;
-    margin-right: 0;
-    padding: 16px 20px 12px;
-    box-sizing: border-box;
-  }
-
-  .process-production-dialog .el-dialog__body {
-    padding: 0;
-    background: #fff;
-  }
-
-  .process-production-dialog-header {
-    display: flex;
-    align-items: center;
-    width: 100%;
-    box-sizing: border-box;
-  }
-
-  .process-production-dialog-title {
-    flex: 1;
-    font-size: 16px;
-    font-weight: 600;
-    color: #303133;
-  }
-
-  .process-production-dialog-close {
-    flex-shrink: 0;
-    margin-left: auto;
-    min-width: 56px;
-    font-weight: 500;
-  }
-
-  .gy-detail-filter-popper {
-    z-index: 10050 !important;
-    pointer-events: auto;
-    padding: 8px 10px !important;
-  }
-
-  .gy-detail-filter-popper .gy-detail-filter-panel {
-    pointer-events: auto;
-  }
-
-  .el-message-box .gy-split-process-name {
-    color: #f56c6c;
-    font-weight: 600;
-  }
-</style>
+<template>
+	<div>
+	  <layout>
+		<layout-header>
+		  <div class="">
+			<!--按钮部分-->
+			<el-form ref="elSearchFormRef" class="demo-form-inline" @submit.prevent="onSubmit">
+			  <el-form-item>
+				<el-input v-model="searchInfo" placeholder="查询订单编号、生产款号" style="width: 180px;" @keydown.enter.prevent="onSubmit" />
+				<el-button type="primary" native-type="button" icon="search" @click="onSubmit" title="查询">查询</el-button>
+				<el-button type="primary" icon="edit"   @click="cp_gdprintonClick" class="bt" title="打印生产订单" >订单打印</el-button>
+				<el-button type="primary" class="bt" icon="edit"  @click="jsfjClick">附件上传</el-button> 
+				<el-button type="primary" icon="edit"   @click="addgd_onclick"   class="bt"   title="新增工单资料">新增订单资料</el-button>
+				<el-button type="primary" icon="edit"   @click="addgdyj_onclick"   class="bt" title="新增颜色资料">新增颜色资料</el-button>
+				<!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openPartAdd">新增部件资料</el-button> -->
+				<!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openProcessAdd">新增工艺资料</el-button> -->
+				<!-- <el-button type="primary" icon="Sort" class="bt" :disabled="!_Gd_gdbh" @click="openSortDialog">部件与工艺排序</el-button> -->
+				<el-button type="primary" icon="edit"   @click="BOMclick"   class="bt"   title="BOM面料">批量修改新增BOM资料</el-button>
+				<el-button type="danger" icon="edit"   @click="del_ddzlClick" 	v-if="table_del=== true" :disabled="table_Selection === ''"  class="bt" title="选中复选框进行删除订单数据">删除订单资料</el-button>
+				<el-button type="danger" icon="edit"   @click="delgd_delclick"  	v-if="delall=== true" :disabled="ysSelection === ''"  class="bt" title="选中复选框进行删除颜色数据">删除颜色资料</el-button>
+				<!-- <el-button type="danger" icon="edit"   @click="delgy_delclick"  	v-if="delall=== true" :disabled="gySelection === ''"  class="bt" title="选中复选框进行删除工艺数据">删除工艺资料</el-button> -->
+				<el-button type="primary" icon="edit"   @click="copyProductData"  :disabled="!_Gd_gdbh"  class="bt" title="复制订单工艺">复制订单工艺</el-button>
+				<el-button type="primary" icon="upload" @click="openImportProcessDialog" :disabled="!_Gd_gdbh" class="bt" title="导入工艺资料">导入工艺资料</el-button>
+				<el-button type="primary" icon="search" :loading="processProductionChecking" @click="openProcessProductionDialog" :disabled="!_Gd_gdbh" class="bt" title="工序产量核查">工序产量核查</el-button>
+
+				<!-- <el-button type="primary" icon="edit"   @click="delbom_delclick"  	v-if="del_bom=== true" :disabled="bom_Selection === '' "  class="bt" title="选中复选框进行删除bom数据">删除bom资料</el-button> -->
+				
+				<!-- <el-button type="primary" icon="edit"   @click="CSclick"   class="bt"   title="库存测试">库存测试</el-button> -->
+			  </el-form-item>
+			</el-form>
+		  </div> 
+		</layout-header>
+		<layout>
+  
+		  <!-- 左侧树形结构 -->
+		  <layout-sider :resize-directions="['right']" :width="190" style="margin: 0px;">
+			<div class="JKWTree-tree" style="height: 200px">
+			  <h3>客户编号</h3>
+			  <el-tree :data="treeData" class="treecolor" @node-click="handleNodeClick"></el-tree>
+			</div>
+		  </layout-sider>
+  
+		  <!-- 右侧内容区域 -->
+		  <layout-content >
+			<el-main>
+			  <!-- 订单表格列表 -->
+			  <div class="gva-table-box">
+				<el-table ref="multipleTable" style="width: 100%;height: 28vh"
+						  :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
+						  :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+						  border tooltip-effect="dark" 
+						  v-loading="loading" 
+						  element-loading-text="拼命加载中"
+						  element-loading-spinner="el-icon-loading"
+						  element-loading-background="rgba(0, 0, 0, 0.8)"
+						  :data="tableData" :row-key="ddzlTableRowKey"
+						  highlight-current-row="true"
+						  :cell-class-name="tableDataCellClass"
+						  @row-click="tableRowClick" @row-dblclick="updateCompanyFunc"
+						  @selection-change="ddzlSelectionChange" :show-overflow-tooltip="true">
+				  <el-table-column align="center" type="selection" width="40"/>
+				  <el-table-column align="center" prop="status" width="75">
+					<template #header>
+					  <el-tooltip
+						content='「技术附件」列显示 “*” 表示该订单尚未上传对应附件'
+						placement="top"
+						effect="dark"
+					>
+						<span class="fj-col-header">
+						  附件
+						  <el-icon class="fj-col-help"><QuestionFilled /></el-icon>
+						</span>
+					  </el-tooltip>
+					</template>
+				  </el-table-column>
+				  <el-table-column align="left"   label="订单编号" prop="订单编号" 	width="105" sortable/>
+				  <el-table-column align="left"   label="客户"     prop="客户编号" 		width="68" />
+				  <el-table-column align="left"   label="款号"     prop="生产款号"  width="200" />
+				  <el-table-column align="left"   label="款式"     prop="款式"   	width="100"/> 
+				  <el-table-column align="left"   label="数量"     prop="订单数量" 	width="70" />
+				  <el-table-column align="center" label="状态" 	   prop="gd_statu" width="125" sortable>
+				      <template #default="{ row }">
+				        <el-tag :type="row.gd_statu === '1-计划中' ? 'warning' : 
+				                       (row.gd_statu === '已裁剪' ? 'primary' : 
+				                       (row.gd_statu === '已车缝' ? '' : 
+				                       (row.gd_statu === '2-生产中' ? 'success' :
+				                       (row.gd_statu.includes('总检已') ? 
+				                         (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? 'success' : 'info') : 
+				                       (row.gd_statu === '已完工' ? 'success' : 'info')))))">
+				              {{ row.gd_statu === '1-计划中' ? '计划中' : 
+				                 (row.gd_statu === '已裁剪' ? '已裁剪' : 
+				                 (row.gd_statu === '已车缝' ? '已车缝' : 
+				                 (row.gd_statu === '2-生产中' ? '生产中' :
+				                 (row.gd_statu.includes('总检已') ? 
+				                   (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? '已完工' : row.gd_statu.replace('总检已', '总检')) : 
+				                 row.gd_statu)))) }}
+				        </el-tag>
+				      </template>
+				  </el-table-column>
+				  <el-table-column align="left"  label="落货日期"   	prop="落货日期" 	width="98" />
+				  <el-table-column align="left"  label="船样"    		prop="船样合计" 	width="55" />
+				  <el-table-column align="left"  label="船样描述"    	prop="船样描述" 	width="130" />
+				  <el-table-column align="left"  label="单位"    		prop="单位" 		width="55" />
+				  <el-table-column align="left"  label="面料"       	prop="面料" 		width="180" />
+				  <el-table-column align="left"  label="备注"       	prop="要求" 		width="180" />
+				  <el-table-column align="left"  label="计划制造工分"    prop="计划制造工分"		width="180" />
+				  <el-table-column align="left"  label="粘衬"        	prop="粘衬"		width="180" />
+				  <el-table-column align="left"  label="箱唛要求"   	prop="箱唛要求" 	width="180" />
+				  <el-table-column align="left"  label="制单人"    	prop="Sys_id" 	width="160" />
+				  <el-table-column align="left"  label="制单日期"    	prop="Sys_rq" 	width="160" />
+				</el-table>
+				<!-- 分页 -->
+				<div class="gva-pagination">
+				<el-pagination
+					@size-change="handleSizeChange"
+					@current-change="handleCurrentChange"
+					:current-page="page"
+					:page-sizes="[10, 30, 50, 100]"
+					:page-size="pageSize"
+					layout="total, sizes, prev, pager, next, jumper"
+					:total="total">
+				</el-pagination>
+			  </div>
+			  </div>
+  
+			  <!-- 颜色资料列表、部件资料列表、工艺资料列表、BOM资料列表  -->
+			  <el-tabs v-model="activeName" @tab-click="handleClick">
+				<el-tab-pane label="颜色资料"   name="first">
+				  <el-table ref="multipleTable"
+						  :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
+						  :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+							:show-overflow-tooltip="true"
+							highlight-current-row="true"
+							@row-click="ystableclick"
+							@row-dblclick="ysupdateCompanyFunc"
+							@selection-change="selectionChange($event, '颜色资料')"
+							style="width: 100%;height: 36vh" border show-summary
+							:summary-method="getSummaries" tooltip-effect="dark" :data="ystableData" :row-key="ysColorTableRowKey">
+					<el-table-column type="selection" width="30" />
+					<el-table-column align="left" sortable label="子订单编号" prop="子订单编号"  width="140"/>
+					<el-table-column align="left" sortable label="PO号	" prop="款号"  width="180"/>
+					<el-table-column align="left" sortable label="颜色备注" prop="颜色备注"  width="110"/>
+					<el-table-column align="left" sortable label="色系名称" prop="颜色"  width="110"/>
+					<el-table-column align="left" sortable label="船样" prop="船样"  width="80"/>
+					<!-- 尺码列表 -->
+					<template v-for="item in sizeDatas">
+					  <el-table-column align="left" sortable :label=item :prop=item  width="80"/> 
+					</template>
+					<el-table-column align="left" sortable label="制单总数" prop="zdtotal"  width="110"/>
+					<el-table-column align="left" sortable label="创建用户" prop="Sys_id"  width="160"/>
+					<el-table-column align="left" sortable label="创建日期" prop="Sys_rq"  width="160"/>
+					<el-table-column align="left" sortable label="修改时间" prop="更新时间"  width="160"/>
+				  </el-table>
+				</el-tab-pane>
+
+				<!-- <el-tab-pane label="部件资料" name="part">
+				  <el-table ref="multipleTable"
+					:row-style="{ height: '20px' }"
+					:cell-style="{ padding: '0px' }"
+					:header-row-style="{ height: '20px' }"
+					:header-cell-style="{ padding: '0px' }"
+					highlight-current-row="true"
+					:show-overflow-tooltip="true"
+					size="small"
+					@row-click="partTableRowClick"
+					@row-dblclick="partRowDblclick"
+					@selection-change="selectionChange($event, '部件资料')"
+					style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="parttableData" row-key="部件ID">
+					<el-table-column type="selection" width="30" />
+					<el-table-column align="left" label="部件编号" prop="部件编号" width="80"/>
+					<el-table-column align="left" label="部件名称" prop="部件名称" width="150"/>
+					<el-table-column align="left" label="部件类型" prop="部件类型" width="120"/>
+					<el-table-column align="left" label="部件备注" prop="部件备注" width="150"/>
+					<el-table-column align="left" label="录入人" prop="操作人" width="100"/>
+					<el-table-column align="left" label="录入时间" prop="操作时间" width="160"/>
+					<el-table-column align="left" label="修改人" prop="修改人" width="100"/>
+					<el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
+				  </el-table>
+				</el-tab-pane> -->
+
+				<el-tab-pane label="工艺资料" name="second">
+				  <el-table ref="multipleTable"
+							:row-style="{ height: '20px' }"
+							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+							:header-cell-style="{ padding: '0px' }"
+							highlight-current-row="true"
+							:show-overflow-tooltip="true"
+							size="small"
+							:cell-class-name="gysatusCellClass"
+							@row-dblclick="gdgyupdateCompanyFunc"
+							@row-click="clickybupdate2"
+							:row-class-name="rowClassStyle2"
+							@selection-change="selectionChange($event, '工艺资料')"
+							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="gytableData" row-key="id"
+							:summary-method="gySummaries"
+							show-summary>
+					<!-- <el-table-column align="left" label="部件编号" prop="部件编号" width="80"/> -->
+					<el-table-column align="center" label="部件名称" prop="部件名称" width="80"/>
+					<el-table-column align="center" label="工序编号" prop="工艺编号" width="75"/>
+					<el-table-column align="left" label="工序名称" prop="工艺名称" width="200"/>
+					<el-table-column align="center" label="生产工序" prop="大工艺" width="75"/>
+					<!-- <el-table-column align="left" label="秒" prop="标准工时" width="80"/> -->
+					<el-table-column align="center" label="工分" prop="标准公分" width="75"/>
+					<el-table-column align="left" label="备注" prop="备注" width="150"/>
+					<el-table-column align="center" label="难度系数" prop="系数" width="80"/>
+					<el-table-column align="left" label="录入人" prop="系统人" width="100"/>
+					<el-table-column align="left" label="录入时间" prop="系统时间" width="160"/>
+					<el-table-column align="left" label="修改人" prop="修改人" width="100"/>
+					<el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
+				  </el-table>
+				</el-tab-pane>
+  
+				<el-tab-pane label="订单资料附件" name="third">
+				  <el-table ref="multipleTable"
+							:row-style="{ height: '30px' }"
+							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '30px' }"
+							:header-cell-style="{ padding: '0px' }"
+							:show-overflow-tooltip="true"
+							:cell-class-name="planUsageCellClass"
+							highlight-current-row="true"
+							@row-dblclick="gdbomupdateCompanyFunc"
+							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="ddtableData" row-key="ID"
+							 @selection-change="fjSelectionChange">
+					<el-table-column align="left" label="关联编号" prop="关联编号"  width="115"/>
+					<el-table-column align="left" label="附件备注" 	prop="附件备注"  width="110"/>
+					<el-table-column align="left" label="文件类型" prop="附件类型"  width="100"/>
+					<el-table-column align="left" label="版本号" prop="version"  width="80"/>
+					<el-table-column align="left" label="建档用户" prop="sys_id"  width="160"/>
+					<el-table-column align="left" label="建档时间" prop="sys_rq"  width="160"/>
+				  <!-- 操作列,新增修改和删除按钮 -->
+				  <el-table-column align="left" label="操作" width="230" fixed="right">
+					<template #default="scope">
+					  <!-- PDF预览按钮 -->
+					  <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
+					  <!-- 删除按钮 -->
+					  <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
+					</template>
+				  </el-table-column>
+				  </el-table>
+				</el-tab-pane> 
+				
+				
+  
+				<el-tab-pane label="技术附件" name="fourth">
+				  <el-table ref="multipleTable"
+					:row-style="{ height: '30px' }"
+					:cell-style="{ padding: '0px' }"
+					:header-row-style="{ height: '30px' }"
+					:header-cell-style="{ padding: '0px' }"
+					:show-overflow-tooltip="true"
+					:cell-class-name="planUsageCellClass"
+					highlight-current-row="true"
+					@row-dblclick="ExcelShow"
+					style="width: 100%;height: 36vh"
+					border tooltip-effect="dark"
+					:data="jstableData"
+					row-key="ID"
+					@selection-change="fjSelectionChange">
+				
+					<el-table-column align="left" label="关联编号" prop="关联编号" width="115"/>
+					<el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
+					<el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
+					<el-table-column align="left" label="版本号" prop="version" width="80"/>
+					<el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
+					<el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
+					
+					<!-- 操作列,新增修改和删除按钮 -->
+					<el-table-column align="left" label="操作" width="230" fixed="right">
+					  <template #default="scope">
+						<!-- PDF预览按钮 -->
+						<el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
+						<!-- 删除按钮 -->
+						<el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
+					  </template>
+					</el-table-column>
+				  </el-table>
+				</el-tab-pane>
+
+
+				<el-tab-pane label="发货单附件" name="fourths">
+				  <el-table ref="multipleTable"
+					:row-style="{ height: '30px' }"
+					:cell-style="{ padding: '0px' }"
+					:header-row-style="{ height: '30px' }"
+					:header-cell-style="{ padding: '0px' }"
+					:show-overflow-tooltip="true"
+					:cell-class-name="planUsageCellClass"
+					highlight-current-row="true"
+					@row-dblclick="ExcelShow"
+					style="width: 100%;height: 36vh"
+					border tooltip-effect="dark"
+					:data="fhdtableData"
+					row-key="ID"
+					@selection-change="fhdSelectionChange">
+					<el-table-column align="left" label="发货单号" prop="rand_number" width="160"/>
+					<el-table-column align="left" label="订单编号" prop="关联编号" width="115"/>
+					<el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
+					<el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
+					<el-table-column align="left" label="版本号" prop="version" width="80"/>
+					<el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
+					<el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
+					
+					<!-- 操作列,新增修改和删除按钮 -->
+					<el-table-column align="left" label="操作" width="330" fixed="right">
+					  <template #default="scope">
+						<!-- PDF预览按钮 -->
+						<el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
+						<el-button type="primary" size="small" @click="fahuodan(scope.row)">获取发货数量</el-button>
+						<!-- 删除按钮 -->
+						<el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
+					  </template>
+					</el-table-column>
+				  </el-table>
+				</el-tab-pane>
+  
+  
+			<el-tab-pane label="BOM资料"  name="six">
+				  <el-table ref="multipleTable"
+							:row-style="{ height: '20px' }"
+							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+							:header-cell-style="{ padding: '0px' }"
+							:show-overflow-tooltip="true"
+							:cell-class-name="planUsageCellClass"
+							highlight-current-row="true"
+							@row-dblclick="bombomupdateCompanyFunc"
+							@selection-change="bomSelectionChange"
+							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="bomtableData" row-key="ID">
+				   <!-- <el-table-column type="selection" width="30" /> -->
+					<el-table-column align="left" label="订单编号" prop="订单编号"  width="105"/>
+					<el-table-column align="left" label="物料分类" prop="物料分类"  width="100"/>
+					<el-table-column align="left" label="物料名称" prop="物料名称"  width="210"/>
+					<el-table-column align="left" label="计划入库时间" prop="计划入库时间"  width="160" />
+					<el-table-column align="left" label="计划用料" prop="计划用料"  width="90" />
+					<el-table-column align="left" label="计划门幅" prop="计划门幅"  width="90"/>
+					<el-table-column align="left" label="定额用料" prop="定额用料"  width="90"/>
+					<el-table-column align="left" label="定额门幅" prop="定额门幅"  width="90"/>
+					<el-table-column align="left" label="备注" prop="备注"  width="240"/>
+					<el-table-column align="left" label="更新用户" prop="ID"  width="90"/>
+					<el-table-column align="left" label="更新日期" prop="日期"  width="160"/>
+					<!-- <el-table-column align="left" label="UNIQID" prop="UNIQID"  width="80"/> -->
+				  </el-table>
+				</el-tab-pane>
+  
+				<el-tab-pane label="面料库存" name="seven">
+				  <el-table ref="multipleTable"
+						  :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
+						  :cell-style="{ padding: '0px' }" :header-row-style="{ height: '25px' }"
+							:show-overflow-tooltip="true"
+							:cell-class-name="planUsageCellClass"
+							highlight-current-row="true"
+							@row-dblclick="mlupdateCompanyFunc"
+							:summary-method="mlgetSummaries" 
+							style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="mltableData" row-key="ID" @selection-change="handleSelectionChange">
+  <!--                  <el-table-column type="selection" width="30" />-->
+					<!-- <el-table-column type="selection" width="30" /> -->
+					<el-table-column align="left" label="订单编号" prop="订单编号"  width="110"/>
+					<!-- <el-table-column align="left" label="客户编号" prop="客户编号"  width="100"/>
+					<el-table-column align="left" label="生产款号" prop="生产款号"  width="100"/>
+					<el-table-column align="left" label="款式" prop="款式"  width="90"/> -->
+					<el-table-column align="left" label="颜色" prop="颜色"  width="110"/>
+					<el-table-column align="left" label="物料编号" prop="物料编码"  width="220"/>
+					<el-table-column align="left" label="物料名称" prop="物料名称"  width="180"/>
+					<el-table-column align="left" label="定额用料" prop="定额用料"  width="90"/>
+					<el-table-column align="left" label="定额门幅" prop="定额门幅"  width="90"/>
+					<el-table-column align="left" label="入库总量" prop="入仓总量"  width="90"/>
+					<el-table-column align="left" label="领用数量" prop="领用数量"  width="90"/>
+					<el-table-column align="left" label="面料结余" prop="库存数量"  width="90"/>
+					<el-table-column align="left" label="单位" prop="单位"  width="60"/>
+					<el-table-column align="left" label="备注" prop="备注"  width="200"/>
+					<el-table-column align="left" label="关联订单" prop="关联订单"  width="200"/>
+					<el-table-column align="left" label="更新用户" prop="Sys_ID"  width="160"/>
+					<el-table-column align="left" label="更新日期" prop="Sys_rq"  width="160"/>
+				  </el-table>
+				</el-tab-pane>
+			  </el-tabs>
+  
+				
+		   <!-- 工艺资料详情弹窗 -->
+		   <el-dialog v-model="gyDetailDialogVisible" :before-close="closeGyDetailDialog" 
+		   style="width: 100vw; height: 100vh; margin: 0; padding: 0; top: 0; left: 0;"
+		   destroy-on-close class="gy-detail-dialog" :show-close="false">
+		     <template #header>
+		       <div class="gy-detail-dialog-header">
+		         <div class="gy-detail-dialog-title-row">
+		           <span class="gy-detail-dialog-title">工艺资料详情</span>
+		         </div>
+		         <div class="gy-detail-dialog-toolbar-row">
+		           <div class="gy-detail-dialog-actions-left">
+		             <el-button type="primary" @click="openGyDetailProcessAdd">增加</el-button>
+		             <el-button type="danger" :disabled="!gyDetailSelection.length || gyDetailDeleting" :loading="gyDetailDeleting" @click="handleGyDetailBatchDelete">删除</el-button>
+		             <el-button type="primary" @click="handleGyDetailPrintPreview">打印预览</el-button>
+             <el-button type="success" v-if="!gyDetailReadonly" :loading="gyDetailSaving" @click="handleGyDetailSave">保存</el-button>
+		           </div>
+		           <el-button type="danger" class="gy-detail-dialog-exit" @click="closeGyDetailDialog">退出</el-button>
+		         </div>
+		       </div>
+		     </template>
+		     <div class="gy-detail-dialog-body">
+		       <!-- 上方信息 -->
+		       <div style="margin-bottom: 15px; overflow-x: auto;">
+		         <el-row :gutter="20" style="width: max-content; display: flex; align-items: center;">
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 80px; text-align: right; margin-right: 8px;">订单编号:</span>
+		             <el-input v-model="gyDetailFormData.订单编号" disabled style="width: 100px;" />
+		           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 80px; text-align: right; margin-right: 8px;">客户编号:</span>
+		             <el-input v-model="gyDetailFormData.客户编号" disabled style="width: 70px;" />
+		           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 80px; text-align: right; margin-right: 8px;">生产款号:</span>
+		             <el-input v-model="gyDetailFormData.生产款号" disabled style="width: 280px;" />
+		           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 60px; text-align: right; margin-right: 8px;">款式:</span>
+		             <el-input v-model="gyDetailFormData.款式" disabled style="width: 200px;" />
+		           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 60px; text-align: right; margin-right: 8px;">接单日期:</span>
+		             <el-input v-model="gyDetailFormData.接单日期" disabled style="width: 120px;" />
+		           </div>
+				   <div style="display: flex; align-items: center; white-space: nowrap;">
+                     <span
+                       style="width: 60px; text-align: right; margin-right: 8px; cursor: pointer;"
+                       @click="startGyDetailPlanManufactureEdit"
+                     >备注:</span>
+                     <el-input
+                       v-model="gyDetailFormData.备注"
+                       style="width: 200px;"
+                       :readonly="!gyDetailPlanManufactureEditing"
+                       @click="startGyDetailPlanManufactureEdit"
+                     />
+                   </div>
+                 </el-row>
+		         <el-row :gutter="20" style="width: max-content; display: flex; align-items: center; margin-top: 10px;">
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 80px; text-align: right; margin-right: 8px;">落货日期:</span>
+		             <el-input v-model="gyDetailFormData.落货日期" disabled style="width: 120px;" />
+		           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span style="width: 80px; text-align: right; margin-right: 8px;">制单日期:</span>
+		             <el-input v-model="gyDetailFormData.制单日期" disabled style="width: 160px;" />
+		           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+             <span style="width: 60px; text-align: right; margin-right: 8px;">制单人:</span>
+             <el-input v-model="gyDetailFormData.制单人" disabled style="width: 70px;" />
+           </div>
+           <div style="display: flex; align-items: center; white-space: nowrap;">
+             <span style="width: 90px; text-align: right; margin-right: 8px;">工单完工日期:</span>
+             <el-date-picker
+               v-model="gyDetailFormData.工单完工日期"
+               type="date"
+               value-format="YYYY-MM-DD"
+               format="YYYY-MM-DD"
+               clearable
+               placeholder="选择日期"
+               style="width: 140px;"
+             />
+           </div>
+           <div style="display: flex; align-items: center; white-space: nowrap;">
+             <span style="width: 80px; text-align: right; margin-right: 8px;">订单数量:</span>
+             <el-input v-model="gyDetailFormData.订单数量" disabled style="width: 80px;" />
+           </div>
+		           <div style="display: flex; align-items: center; white-space: nowrap;">
+		             <span
+		               style="width: 100px; text-align: right; margin-right: 8px; cursor: pointer;"
+		               @click="startGyDetailPlanManufactureEdit"
+		             >计划制造工分:</span>
+		             <el-input
+		               :model-value="gyDetailFormData.计划制造工分"
+		               style="width: 80px;"
+		               :readonly="!gyDetailPlanManufactureEditing"
+		               inputmode="decimal"
+		               @click="startGyDetailPlanManufactureEdit"
+		               @update:model-value="onGyDetailPlanManufactureInput"
+		             />
+		             <template v-if="gyDetailPlanManufactureEditing">
+                       <el-button style="margin-left: 10px;" @click="cancelGyDetailPlanManufactureEdit">取消</el-button>
+                       <el-button type="primary" style="margin-left: 8px;" :loading="gyDetailPlanManufactureSaving" @click="confirmGyDetailPlanManufactureEdit">保存</el-button>
+                     </template>
+                   </div>
+                 </el-row>
+               </div>
+		       
+		       <!-- 工艺列表表格(虚拟滚动 + 底部横向滚动条) -->
+		       <div ref="gyDetailTableWrapRef" class="gy-detail-table-wrap">
+		         <vxe-table
+		           ref="gyDetailTableRef"
+		           border
+		           size="small"
+		           show-overflow
+		           auto-resize
+		           :height="gyDetailTableHeight"
+		           :min-width="gyDetailTableMinWidth"
+		           :data="gyDetailDisplayProcessList"
+		           :row-config="{ keyField: '_rowKey', isHover: true, isCurrent: true, height: 28 }"
+		           :cell-config="{ height: 28, padding: false }"
+		           :scroll-y="{ enabled: true, gt: 30 }"
+		           :scroll-x="{ enabled: true }"
+		           :column-config="{ resizable: true, minWidth: 56 }"
+		           :checkbox-config="{ trigger: 'default', highlight: false }"
+		           show-footer
+		           :footer-method="gyDetailFooterMethod"
+		           class="gy-detail-vxe-table"
+		           @checkbox-change="handleGyDetailCheckboxChange"
+		           @checkbox-all="handleGyDetailCheckboxChange"
+		         >
+		           <vxe-column type="checkbox" width="55" fixed="left" align="center" header-align="center" />
+		           <vxe-column field="部件编号" title="部件编号" width="75" align="center" header-align="center" />
+		           <vxe-column field="部件名称" width="120" align="center" header-align="center">
+		             <template #header>
+		               <div class="gy-detail-col-header">
+		                 <span>部件名称</span>
+		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+		                   <template #reference>
+		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions) }" @click.stop>
+		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+		                     </span>
+		                   </template>
+		                   <div class="gy-detail-filter-panel">
+		                     <div class="gy-detail-filter-options">
+		                     <el-checkbox-group v-model="gyDetailBuJianMingChengFilter" @change="handleGyDetailBuJianMingChengFilterChange">
+		                       <el-checkbox v-for="item in gyDetailBuJianMingChengFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+		                     </el-checkbox-group>
+		                     </div>
+		                     <div class="gy-detail-filter-actions">
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailBuJianMingChengFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailBuJianMingChengFilter">全选</span>
+		                     </div>
+		                   </div>
+		                 </el-popover>
+               </div>
+             </template>
+             <template #default="{ row }">
+               <span v-if="!isGyDetailCellEditable('部件名称') && !isGyDetailCellEditing(row, '部件名称')">{{ row.部件名称 }}</span>
+               <template v-else>
+                 <div v-if="!isGyDetailCellEditing(row, '部件名称')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '部件名称')">{{ formatGyDetailCellText(row.部件名称) }}</div>
+                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.部件名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '部件名称')" />
+               </template>
+             </template>
+           </vxe-column>
+           <vxe-column field="工序编号" title="工序编号" width="100" align="center" header-align="center" />
+		           <vxe-column field="工序名称" title="工序名称" width="320" align="left" header-align="center">
+		             <template #default="{ row }">
+               <span v-if="!isGyDetailCellEditable('工序名称') && !isGyDetailCellEditing(row, '工序名称')">{{ row.工序名称 }}</span>
+               <template v-else>
+                 <div v-if="!isGyDetailCellEditing(row, '工序名称')" class="gy-detail-cell gy-detail-cell--wide" @click.stop="startGyDetailCellEdit(row, '工序名称')">{{ formatGyDetailCellText(row.工序名称) }}</div>
+                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.工序名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '工序名称')" />
+               </template>
+             </template>
+		           </vxe-column>
+		           <vxe-column field="大工序" width="110" align="center" header-align="center">
+		             <template #header>
+		               <div class="gy-detail-col-header">
+		                 <span>生产工序</span>
+		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+		                   <template #reference>
+		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailDaGongXuFilter, dagongxuFilters) }" @click.stop>
+		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+		                     </span>
+		                   </template>
+		                   <div class="gy-detail-filter-panel">
+		                     <div class="gy-detail-filter-options">
+		                     <el-checkbox-group v-model="gyDetailDaGongXuFilter" @change="handleGyDetailDaGongXuFilterChange">
+		                       <el-checkbox v-for="item in dagongxuFilters" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+		                     </el-checkbox-group>
+		                     </div>
+		                     <div class="gy-detail-filter-actions">
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailDaGongXuFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailDaGongXuFilter">全选</span>
+		                     </div>
+		                   </div>
+		                 </el-popover>
+		               </div>
+		             </template>
+		             <template #default="{ row }">
+               <span v-if="!isGyDetailCellEditable('大工序') && !isGyDetailCellEditing(row, '大工序')">{{ row.大工序 }}</span>
+               <template v-else>
+                 <div v-if="!isGyDetailCellEditing(row, '大工序')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '大工序')">{{ formatGyDetailCellText(row.大工序) }}</div>
+                 <el-select
+                   v-else
+                   :ref="setGyDetailCellInputRef"
+                   v-model="row.大工序"
+                   size="small"
+                   class="gy-detail-cell-input gy-detail-cell-select"
+		                   filterable
+		                   @change="finishGyDetailCellEdit(row)"
+		                 >
+		                   <el-option v-for="opt in gyDetailDaGongXuOptions" :key="opt" :label="opt" :value="opt" />
+		                 </el-select>
+		               </template>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="秒" title="秒" width="80" align="center" header-align="center">
+		             <template #default="{ row }">
+		               <span v-if="gyDetailReadonly">{{ row.秒 }}</span>
+		               <template v-else>
+		                 <div v-if="!isGyDetailCellEditing(row, '秒')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '秒')">{{ formatGyDetailCellText(row.秒) }}</div>
+		                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.秒" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '秒', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '秒')" />
+		               </template>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="分" title="分" width="80" align="center" header-align="center">
+		             <template #default="{ row }">
+		               <span v-if="gyDetailReadonly">{{ row.分 }}</span>
+		               <template v-else>
+		                 <div v-if="!isGyDetailCellEditing(row, '分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '分')">{{ formatGyDetailCellText(row.分) }}</div>
+		                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '分')" />
+		               </template>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="定额分" title="工分" width="80" align="center" header-align="center">
+		             <template #default="{ row }">
+               <span v-if="!isGyDetailCellEditable('工分') && !isGyDetailCellEditing(row, '定额分')">{{ row.定额分 }}</span>
+               <template v-else>
+                 <div v-if="!isGyDetailCellEditing(row, '定额分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '定额分')">{{ formatGyDetailCellText(row.定额分) }}</div>
+                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.定额分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '定额分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '定额分')" />
+               </template>
+             </template>
+		           </vxe-column>
+		           <vxe-column field="金额" title="金额" width="80" align="center" header-align="center">
+		             <template #default="{ row }">
+		               <span v-if="gyDetailReadonly">{{ row.金额 }}</span>
+		               <template v-else>
+		                 <div v-if="!isGyDetailCellEditing(row, '金额')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '金额')">{{ formatGyDetailCellText(row.金额) }}</div>
+		                 <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.金额" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '金额', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '金额')" />
+		               </template>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="难度系数" width="110" align="center" header-align="center">
+		             <template #header>
+		               <div class="gy-detail-col-header">
+		                 <span>难度系数</span>
+		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+		                   <template #reference>
+		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions) }" @click.stop>
+		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+		                     </span>
+		                   </template>
+		                   <div class="gy-detail-filter-panel">
+		                     <div class="gy-detail-filter-options">
+		                     <el-checkbox-group v-model="gyDetailNanDuXiShuFilter" @change="handleGyDetailNanDuXiShuFilterChange">
+		                       <el-checkbox v-for="item in gyDetailDifficultyFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+		                     </el-checkbox-group>
+		                     </div>
+		                     <div class="gy-detail-filter-actions">
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailNanDuXiShuFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailNanDuXiShuFilter">全选</span>
+		                     </div>
+		                   </div>
+		                 </el-popover>
+		               </div>
+		             </template>
+		             <template #default="{ row }">
+		               <span v-if="gyDetailReadonly">{{ row.难度系数 }}</span>
+		               <template v-else>
+		                 <div v-if="!isGyDetailCellEditing(row, '难度系数')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '难度系数')">{{ formatGyDetailCellText(row.难度系数) }}</div>
+		                 <el-select
+		                   v-else
+		                   :ref="setGyDetailCellInputRef"
+		                   v-model="row.难度系数"
+		                   size="small"
+		                   class="gy-detail-cell-input gy-detail-cell-select"
+		                   @change="finishGyDetailCellEdit(row)"
+		                 >
+		                   <el-option v-for="opt in gyDetailDifficultyOptions" :key="opt" :label="opt" :value="opt" />
+		                 </el-select>
+		               </template>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="备注" title="备注" width="140" align="center" header-align="center">
+		             <template #default="{ row }">
+		               <span v-if="gyDetailReadonly">{{ row.备注 }}</span>
+		               <template v-else>
+		                 <div v-if="!isGyDetailCellEditing(row, '备注')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '备注')">{{ formatGyDetailCellText(row.备注) }}</div>
+		                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.备注" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" />
+		               </template>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="状态" width="80" align="center" header-align="center">
+		             <template #header>
+		               <div class="gy-detail-col-header">
+		                 <span>状态</span>
+		                 <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+		                   <template #reference>
+		                     <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions) }" @click.stop>
+		                       <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+		                     </span>
+		                   </template>
+		                   <div class="gy-detail-filter-panel">
+		                     <div class="gy-detail-filter-options">
+		                     <el-checkbox-group v-model="gyDetailZhuangTaiFilter" @change="handleGyDetailZhuangTaiFilterChange">
+		                       <el-checkbox v-for="item in gyDetailStatusFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+		                     </el-checkbox-group>
+		                     </div>
+		                     <div class="gy-detail-filter-actions">
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailZhuangTaiFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailZhuangTaiFilter">全选</span>
+		                     </div>
+		                   </div>
+		                 </el-popover>
+		               </div>
+		             </template>
+		             <template #default="{ row }">
+		               <div class="gy-detail-status-cell">{{ formatGyDetailStatus(row.状态) }}</div>
+		             </template>
+		           </vxe-column>
+		           <vxe-column field="_gyAction" title="操作" width="100" fixed="right" align="center" header-align="center">
+		             <template #default="{ row }">
+		               <div class="gy-detail-action-cell">
+		               <el-button
+		                 v-if="isGyDetailRowSplit(row)"
+		                 size="small"
+		                 type="warning"
+		                 @click="handleUndoSplitProcess(row)"
+		               >撤销拆分</el-button>
+		               <el-button
+		                 v-else
+		                 size="small"
+		                 type="success"
+		                 @click="handleSplitProcess(row)"
+		               >拆分</el-button>
+		               </div>
+		             </template>
+		           </vxe-column>
+		         </vxe-table>
+		       </div>
+		     </div>
+		   </el-dialog>
+
+		   <!-- 拆分弹窗 -->
+		   <el-dialog v-model="splitDialogVisible" title="拆分工序" width="450px" style="top: 30%;" @close="splitDialogVisible = false">
+		     <div style="padding: 20px;">
+		       <div v-if="hasReportData" style="color: #f56c6c; margin-bottom: 15px; font-weight: bold; text-align: center;">
+		         ⚠️ 该工序已存在报工数据
+		       </div>
+		       <div style="margin-bottom: 15px; text-align: center;">
+		         <span>将复制 </span>
+		         <span class="gy-split-process-name">{{ currentSplitRow?.工序编号 || '' }}-{{ currentSplitRow?.工序名称 || '' }}</span>
+		         <span>,拆分数量为:</span>
+		       </div>
+		       <div style="display: flex; justify-content: center;">
+		         <el-input-number
+		           v-model="splitQuantity"
+		           :min="1"
+		           :step="1"
+		           :precision="0"
+		           controls-position="right"
+		           placeholder="请输入拆分数量"
+		           style="width: 200px;"
+		         />
+		       </div>
+		     </div>
+		     <template #footer>
+		       <el-button @click="splitDialogVisible = false">取消</el-button>
+		       <el-button type="primary" :loading="splitSubmitting" @click="confirmSplitProcess">确定</el-button>
+		     </template>
+		   </el-dialog>
+		   
+		   <!-- 修改颜色资料弹窗 -->
+		   <el-dialog v-model="dialogFormVisible" :before-close="edit_closeDialog" 
+		   style="width: 80%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
+		   title="颜色资料修改" destroy-on-close >
+			   <el-row :gutter="20" class="form-row">
+				   <el-col :span="10">
+					   <div style="display: flex; gap: 0px;">
+						   <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;">订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
+					   </div>
+				   </el-col>
+				   <el-col :span="10">
+					   <div style="display: flex; gap: 0px;">
+						   <el-form-item label="订单子编号:" class="mab" prop="keyOrder" label-width='110'>
+							   <el-input v-model="edit_formData['子订单编号']" disabled style="width: 250px;" id="订单子编号" />
+						   </el-form-item>
+					   </div>
+				   </el-col>
+			   </el-row>
+		   
+			   <el-row :gutter="20">
+				  <el-col :span="10">
+					   <div style="display: flex; gap: 0px;">
+						   <el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
+							  <el-select
+							  v-model=" edit_formData['颜色']" style="width: 150px;" id="色系名称" 
+							  @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
+							  <el-option 
+								v-for="color in getSuborderscolor.colorlist" 
+								:key="color.id" 
+								:label="color.colorname" 
+								:value="color.colorname"  
+								@click="xg_sxhandleSizeChange(color.colorname,color.colorcode)">
+							  </el-option>
+							  </el-select>
+						   </el-form-item>
+					   </div>
+				   </el-col>
+				   
+				   <el-col :span="10">
+					   <el-form-item label="PO号:" prop="deliveryDate" class="mab" label-width="110px" style="">
+						   <el-input v-model="edit_formData['款号']" style="width: 250px;" id="生产款号" />
+					   </el-form-item>
+				   </el-col>
+			   </el-row>
+		   
+			   <el-row :gutter="20">
+				   <el-col :span="8">
+					 <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
+					   <el-input v-model="edit_formData['颜色备注']" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
+					 </el-form-item>
+				   </el-col>
+				  <el-col :span="10">
+					   <div style="display: flex; gap: 0px;">
+						  <el-form-item label="是否船样:" prop="joinDate" label-width='200'>
+							   <el-select v-model="edit_formData['船样']" style="width: 150px;" id="是否船样" @keydown="add_gdzlent($event, '尺码规格', '是否船样', 'zds1')">
+								   <el-option label="是" value="是" @click="edit_cyChange('是')"></el-option>
+								   <el-option label="否" value="否" @click="edit_cyChange('否')"></el-option>
+							   </el-select>
+						   </el-form-item>
+					   </div>
+				   </el-col>
+			   </el-row>
+		   
+			   <el-row class="form-row">
+				   <el-col :span="20">
+					   <div style="display: flex; gap: 0px;">
+						   <el-form-item label="尺码:" class="mab" prop="keyOrder" label-width='110'>
+							   <el-input v-model="edit_cmformdata.cm1" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm2" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm3" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm4" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm5" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm6" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm7" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm8" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm9" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm10" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm11" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm12" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm13" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.cm14" readonly style="width: 80px;" />
+							   <el-input v-model="edit_cmformdata.sctotal" readonly style="width: 80px;" />
+						   </el-form-item>
+					   </div>
+				   </el-col>
+			   </el-row>
+		   
+			   <el-row class="form-row">
+				   <el-col :span="20">
+					   <div style="display: flex; gap: 0px;">
+						   <el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
+							   <el-input v-model="edit_zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1'  @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
+							   <el-input v-model="edit_zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2'  @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
+							   <el-input v-model="edit_zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3'  @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
+							   <el-input v-model="edit_zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4'  @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
+							   <el-input v-model="edit_zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5'  @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
+							   <el-input v-model="edit_zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6'  @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
+							   <el-input v-model="edit_zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7'  @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
+							   <el-input v-model="edit_zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8'  @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
+							   <el-input v-model="edit_zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9'  @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
+							   <el-input v-model="edit_zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10'  @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
+							   <el-input v-model="edit_zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11'  @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
+							   <el-input v-model="edit_zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12'  @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
+							   <el-input v-model="edit_zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13'  @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
+							   <el-input v-model="edit_zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14'  @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
+							   <el-input v-model="edit_zdsformdata.zdtotal" readonly style="width: 80px;" />
+						   </el-form-item>
+					   </div>
+				   </el-col>
+			   </el-row>
+			   
+			   <template #footer>
+				   <div class="dialog-footer" style="display: flex; justify-content: flex-end; margin-top: 20px;">
+					   <el-button @click="ys_edit_closeDialog" style="margin-left: 10px;">取消</el-button>
+					   <el-button type="primary" @click="ys_edit_Dialog" style="margin-left: 10px;">确认</el-button>
+				   </div>
+			   </template>
+  
+		   </el-dialog>
+		
+			  
+			  <!-- 新增订单资料弹窗 -->
+		  <el-dialog
+			v-model="add_gddialogFormVisible"
+			:before-close="add_gdcloseDialog"
+			title="新增订单资料"
+			class="add-order-dialog"
+			width="90%"
+			top="4vh"
+			destroy-on-close
+		  >
+			<el-row :gutter="20" class="add-order-dialog-body">
+			  <el-col :xs="24" :md="16" class="add-order-dialog-main">
+				<el-form :model="add_gdscgdformData" label-width="100px">
+				  <el-row :gutter="16">
+					<el-col :xs="24" :sm="12">
+					  <el-form-item label="订单编号">
+						<el-input v-model="add_gdscgdformData.订单编号" disabled />
+					  </el-form-item>
+					  <el-form-item label="生产款号">
+						<el-input v-model="add_gdscgdformData['生产款号']" id="生产款号"
+						  @keydown="add_gdzlent($event, '粘衬', '生产款号', '订单数量')" />
+					  </el-form-item>
+					  <el-form-item label="款式">
+						<el-input v-model="add_gdscgdformData['款式']" id="款式"
+						  @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
+					  </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12">
+					  <el-form-item label="客户编号">
+						<el-input v-model="add_gdscgdformData.客户编号" disabled />
+					  </el-form-item>
+					  <el-form-item label="订单数量">
+						<el-input v-model="add_gdscgdformData.订单数量" id="订单数量"
+						 @input="Input_handle()"
+						 @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')" />
+					  </el-form-item>
+					  <el-form-item label="落货日期">
+						<el-date-picker v-model="add_gdscgdformData['落货日期']" id="落货日期"
+						  type="date" @keydown="add_gdzlent($event, '款式', '落货日期', '面料')" />
+					  </el-form-item>
+					</el-col>
+				  </el-row>
+				  <el-form-item label="面料">
+					<el-input
+					  type="textarea"
+					  v-model="add_gdscgdformData['面料']" id="面料"
+					  rows="2"
+					  resize="none"
+					  @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
+					/>
+				  </el-form-item>
+				  <el-form-item label="箱唛要求">
+					<el-input
+					  type="textarea"
+					  v-model="add_gdscgdformData['箱唛要求']" id="箱唛要求"
+					  @keydown="add_gdzlent($event, '面料', '箱唛要求', '备注')"
+					  rows="2"
+					  resize="none"
+					/>
+				  </el-form-item>
+				  <el-form-item label="备注">
+					<el-input
+					  type="textarea"
+					  v-model="add_gdscgdformData['备注']" id="备注"
+					  @keydown="add_gdzlent($event, '箱唛要求', '备注', '船样描述')"
+					  rows="2"
+					  resize="none"
+					/>
+				  </el-form-item>
+				  <el-form-item label="船样描述">
+					<el-input
+					  type="textarea"
+					  v-model="add_gdscgdformData['船样描述']" id="船样描述"
+					  rows="1"
+					  resize="none"
+					  @keydown="add_gdzlent($event, '备注', '船样描述', '船样合计')"
+					/>
+				  </el-form-item>
+				  <el-row :gutter="10" class="add-order-bottom-row">
+					<el-col :xs="24" :sm="8">
+					  <el-form-item label="船样合计" label-width="100px">
+						<el-input v-model="add_gdscgdformData['船样合计']" id="船样合计"
+						  @input="Input_handle()"
+						  @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
+						/>
+					  </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="10">
+					  <el-form-item label="粘衬" label-width="60px">
+						<el-input v-model="add_gdscgdformData['粘衬']" id="粘衬"
+						  @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
+						/>
+					  </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="6">
+					  <el-form-item label="单位" label-width="70px">
+						<el-input v-model="add_gdscgdformData['单位']" id="单位"
+						  @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
+						/>
+					  </el-form-item>
+					</el-col>
+				  </el-row>
+				</el-form>
+			  </el-col>
+			  <el-col :xs="24" :md="8" class="add-order-dialog-side">
+				<div class="add-order-upload-wrap">
+				  <el-upload
+					ref="uploadRef"
+					class="upload-demo add-order-upload"
+					:action="uploadUrl"
+					:http-request="customUpload"
+					:headers="uploadHeaders"
+					list-type="picture-card"
+					:on-preview="handlePreview"
+					:on-remove="handleRemove"
+					:before-upload="beforeUpload"
+					:on-success="handleSuccess"
+					:on-error="handleError"
+					:file-list="fileList"
+					:limit="1"
+					accept="image/jpeg,image/png"
+				  >
+					<el-icon class="add-order-upload-plus"><Plus /></el-icon>
+				  </el-upload>
+				  <div class="add-order-upload-title">上传图片</div>
+				</div>
+				<el-form label-width="100px">
+				  <el-form-item label="制单人">
+					<el-input v-model="add_gdscgdformData['Sys_id']" disabled />
+				  </el-form-item>
+				  <el-form-item label="制单日期">
+					<el-date-picker v-model="add_gdscgdformData['制单日期']" disabled type="date" />
+				  </el-form-item>
+				</el-form>
+			  </el-col>
+			</el-row>
+			
+			<!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
+			<el-table ref="multipleTable"
+						:row-style="{ height: '30px' }"
+						:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+						:header-cell-style="{ padding: '0px' }"
+						:show-overflow-tooltip="true"
+						:cell-class-name="planUsageCellClass"
+						highlight-current-row="true"
+						style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="zsglddtableData" row-key="ID">
+				  <el-table-column align="left" label="订单编号" prop="订单编号"  width="110"/>
+				  <el-table-column align="left" label="物料编码" prop="物料编码"  width="200"/>
+				  <el-table-column align="left" label="生产款号" prop="生产款号"  width="200"/>
+				  <el-table-column align="left" label="颜色" prop="颜色"  width="115"/>
+				  <el-table-column align="left" label="物料名称" prop="物料名称"  width="170"/>
+				  <el-table-column align="left" label="计划门幅" prop="计划门幅"  width="115"/>
+				  <el-table-column align="left" label="定额门幅" prop="定额门幅"  width="115"/>
+				  <el-table-column align="left" label="款式" prop="款式"  width="115" />
+				  
+					<el-table-column fixed="right" label="操作" width="120">
+					  <template #default="{ row, $index }">
+						<el-button @click="deleteRow($index)" type="text" size="small">
+						  移除
+						</el-button>
+					  </template>
+					</el-table-column>
+					
+			  </el-table> -->
+				  
+			<!-- 底部操作按钮 -->
+			<template #footer>
+			  <div class="dialog-footer" style="text-align: right;">
+				<el-button @click="add_gdcloseDialog">取消</el-button>
+				<el-button type="primary" @click="add_gdenterDialog":disabled="!isClickable" v-loading.fullscreen.lock="fullscreenLoading">确定</el-button>
+			  </div>
+			</template>
+			
+		  </el-dialog>
+
+		  <!-- 订单图片页内放大预览 -->
+		  <el-image-viewer
+			v-if="imgPreviewVisible"
+			:url-list="imgPreviewList"
+			teleported
+			hide-on-click-modal
+			@close="closeImgPreview"
+		  />
+  
+		  <!-- 关联订单面料弹窗 -->
+		  <el-dialog v-model="Related_fabricsVisible" :before-close="Related_fabricscloseDialog" title="关联订单面料" 
+		  style="width: 70%;height: 80%;" top="2%" destroy-on-close>
+			  <el-form>
+				<div>
+					<el-space>
+					   
+					  <el-input v-model="glddzl_keyword" style="width: 300px;"  placeholder="请搜索要关联的订单编号或款号进行关联" @input="real_handleInput"/>
+					  <el-button type="primary" @click="ddsearchHandle(glddzl_keyword)">搜索</el-button>
+					  <!-- <el-button @click="Related_fabricscloseDialog">关闭</el-button> -->
+					  <el-button type="primary" @click="Related_fabricsenterDialog">确定关联</el-button>
+					  <span style="color: red;">请选择需要关联复用的颜色物料,在确定关联</span>
+					</el-space>
+					<br>
+					<br>
+				  <el-table ref="multipleTable"
+							:row-style="{ height: '30px' }"
+							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+							:header-cell-style="{ padding: '0px' }"
+							:show-overflow-tooltip="true"
+							:cell-class-name="planUsageCellClass"
+							highlight-current-row="true"
+							@row-dblclick="updateCompanyFunc2"
+							@selection-change="glddSelectionChange"
+							style="width: 100%;height: 65vh" border tooltip-effect="dark" :data="glddtableData" row-key="ID">
+				   <el-table-column type="selection" width="50" />
+					<el-table-column align="left" label="订单编号" prop="订单编号"  width="115"/>
+					<el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码"  width="200"/>
+					<el-table-column align="left" label="生产款号" prop="生产款号"  width="200"/>
+					<el-table-column align="left" label="颜色" prop="颜色"  width="115"/>
+					<el-table-column align="left" label="物料名称" prop="物料名称"  width="170"/>
+					<el-table-column align="left" label="计划门幅" prop="计划门幅"  width="115"/>
+					<el-table-column align="left" label="定额门幅" prop="定额门幅"  width="115"/>
+					<el-table-column align="left" label="款式" prop="款式"  width="115"/>
+					<el-table-column align="left" label="单位" prop="投料单位"  width="115"/>
+				  </el-table>
+				</div>
+			  </el-form>
+			  <template #footer>
+			  
+			</template>	
+		  </el-dialog>		
+		  
+		  
+		    <el-dialog
+		      v-model="order_viewVisible"
+		      title="选择打印格式"
+		      width="30%"
+		      top="10%"
+		      :before-close="order_viewCloseDialog"
+		      destroy-on-close
+		    >
+		      <el-form>
+		        <el-form-item label="打印方向" label-width="100px">
+		          <el-radio-group v-model="printDirection">
+		            <el-radio label="纵向">纵向</el-radio>
+		            <el-radio label="横向">横向</el-radio>
+		          </el-radio-group>
+		        </el-form-item>
+		      </el-form>
+		  
+		      <template #footer>
+		        <el-button @click="order_viewCloseDialog">关闭</el-button>
+		        <el-button type="primary" @click="confirmPrintDirection">确定打印</el-button>
+		      </template>
+		    </el-dialog>
+			
+		  <!-- 修改BOM资料 -->
+		  <el-dialog v-model="edit_bomdialogFormVisible" :before-close="edit_bomcloseDialog" title="修改BOM资料" width="60%" top="2%" destroy-on-close>
+			  <el-descriptions class="margin-top" :column="4"  :size="size" border>
+				  <el-descriptions-item label="订单编号" class="ddh">{{ ddhformData['ddh'] }}</el-descriptions-item>
+				  <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
+				  <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
+				  <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
+			  </el-descriptions>
+			  <el-divider content-position="left">
+				  <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
+			  </el-divider>
+			  <div style="margin-top: 5px;">
+				  <el-table ref="paichengRef"
+							:show-overflow-tooltip="true"
+							highlight-current-row="true"
+							:row-style="{ height: '0px' }"
+							:cell-style="{ padding: '0px' }" :header-row-style="{ height: '0px' }"
+							:header-cell-style="{ padding: '0px' }"
+							style="width: 100%;height: 60vh" border tooltip-effect="dark"
+							:data="edit_resbomtableData" row-key="ID"
+							:cell-class-name="scfjfpxsCellClass">
+					<template v-for="(item, idx) in edit_resbom_tableColumns">
+					  <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width" >
+						<div v-if="['物料名称', '计划用料', '定额用料','计划门幅','定额门幅', '备注'].includes(item.prop)">
+						  <el-input v-model="row[item.prop]" :clearable="false"
+									:id="`input${idx}${$index}`" @keyup="resbom_handleKeyDown($event, idx, $index, item.prop)" @input="handleInput($event, row, item.prop)"/>
+						</div>
+						<div v-else>{{ row[item.prop] }}</div>
+					  </el-table-column>
+					</template>
+				  </el-table>
+			  </div>
+			  <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
+				<el-button @click="editres_bomcloseDialog">取 消</el-button>
+				<el-button type="primary"  @click="editres_bomenterDialog">修改</el-button>
+			  </div>
+		  </el-dialog>
+		  
+		  <!-- 批量修改BOM资料弹窗 -->
+		  <el-dialog v-model="res_bomdialogFormVisible" :before-close="res_bomcloseDialog" title="批量新增/更新BOM数据" width="70%" top="1%" destroy-on-close>
+			
+			 <el-descriptions class="margin-top" :column="4"  :size="size" border>
+			  <el-descriptions-item label="订单编号">{{ ddhformData['ddh'] }}</el-descriptions-item>
+			  <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
+			  <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
+			  <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
+			 </el-descriptions>
+			 <el-descriptions class="margin-top" :column="1"  :size="size" border>
+				  <el-descriptions-item label="面料" >{{ ddhformData['ml'] }}</el-descriptions-item>
+			 </el-descriptions>
+				
+			  <el-divider content-position="left">
+				  <el-button type="primary" icon="plus" @click="add_bomenterDialog">新增一行</el-button>
+				  <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
+			  </el-divider>
+			  <div style="margin-top: 5px;">
+				  <el-table ref="paichengRef"
+							:show-overflow-tooltip="true"
+							highlight-current-row="true"
+							:row-style="{ height: '0px' }"
+							:cell-style="{ padding: '0px' }" 
+							:header-row-style="{ height: '0px' }"
+							:header-cell-style="{ padding: '0px' }"
+							style="width: 100%;height: 58vh" 
+							border tooltip-effect="dark"
+							:data="resbomtableData" row-key="ID"
+							:cell-class-name="scfjfpxsCellClass">
+				  
+					<template v-for="(item, idx) in resbom_tableColumns">
+					  <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width">
+						
+						<!-- 如果是物料名称且UNIQID没有值,则显示输入框,否则显示内容 -->
+						<div v-if="item.prop === '物料名称'">
+						  <el-input
+							v-if="!row.UNIQID" 
+							v-model="row[item.prop]"
+							:clearable="false"
+							:id="`input${idx}${$index}`"
+							@input="handleInput($event, row, item.prop)"
+						  />
+						  <span v-else>{{ row[item.prop] }}</span>  <!-- 如果UNIQID有值,则直接显示内容 -->
+						</div>
+				  
+						<div v-else-if="item.prop === '计划入库时间'">
+						  <el-date-picker
+							v-model="row['计划入库时间']"
+							type="date"
+							value-format="YYYY-MM-DD"
+							placeholder="选择日期"
+							style="width: 100%"
+						  />
+						</div>
+				  
+						<!-- 其他列的处理 -->
+						<div v-else-if="['物料分类','计划用料', '定额用料', '计划门幅', '定额门幅', '备注'].includes(item.prop)">
+						  <el-input
+							v-model="row[item.prop]"
+							:clearable="false"
+							:id="`input${idx}${$index}`"
+							@input="handleInput($event, row, item.prop)"
+						  />
+						</div>
+						
+						<!-- 非输入框列 -->
+						<div v-else>{{ row[item.prop] }}</div>
+				  
+					  </el-table-column>
+					</template>
+				  
+					<el-table-column fixed="right" label="操作" width="80">
+					  <template #default="{ row, $index }">
+						<el-button @click="record_deleteRow(row,$index)" type="danger" size="small" 
+								   style="font-size: 16px;padding: 0px;width: 60px;background-color: red;">
+						  删除
+						</el-button>
+					  </template>
+					</el-table-column>
+					
+				  </el-table>
+			  </div>
+			  <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
+				<el-button @click="res_bomcloseDialog" style="width: 70px;height: 40px;">关闭</el-button>
+				<el-button type="primary"  @click="res_bomenterDialog" style="width: 70px;height: 40px;">一键修改</el-button>
+			  </div>
+		  </el-dialog>
+		  
+		  
+		  <el-dialog
+			v-model="ddzl_dialogFormVisible"
+			:before-close="dd_closeDialog"
+			title="修改订单资料"
+			class="add-order-dialog"
+			width="90%"
+			top="4vh"
+			destroy-on-close
+		  >
+			<el-row :gutter="20" class="add-order-dialog-body">
+			  <el-col :xs="24" :md="16" class="add-order-dialog-main">
+				<el-form :model="edit_ddformData" label-width="100px">
+				  <el-row :gutter="16">
+					<el-col :xs="24" :sm="12">
+					  <el-form-item label="订单编号">
+						<el-input v-model="edit_ddformData['订单编号']" disabled />
+					  </el-form-item>
+					  <el-form-item label="生产款号">
+						<el-input
+						  v-model="edit_ddformData['生产款号']" id="生产款号"
+						  @keydown="add_gdzlent($event, '单位', '生产款号', '订单数量')"
+						/>
+					  </el-form-item>
+					  <el-form-item label="款式">
+						<el-input v-model="edit_ddformData['款式']" id="款式"
+						  @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
+					  </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12">
+					  <el-form-item label="客户编号">
+						<el-input v-model="edit_ddformData['客户编号']" disabled />
+					  </el-form-item>
+					  <el-form-item label="订单数量">
+						<el-input v-model="edit_ddformData['订单数量']" id="订单数量"
+						  @input="Input_handle()"
+						  @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')"
+						/>
+					  </el-form-item>
+					  <el-form-item label="落货日期">
+						<el-date-picker
+						  v-model="edit_ddformData['落货日期']"
+						  id="落货日期"
+						  type="date"
+						  @keydown="add_gdzlent($event, '款式', '落货日期', '面料')"
+						/>
+					  </el-form-item>
+					</el-col>
+				  </el-row>
+				  <el-form-item label="面料">
+					<el-input
+					  type="textarea"
+					  v-model="edit_ddformData['面料']"
+					  id="面料"
+					  rows="2"
+					  resize="none"
+					  @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
+					/>
+				  </el-form-item>
+				  <el-form-item label="箱唛要求">
+					<el-input
+					  type="textarea"
+					  id="箱唛要求"
+					  v-model="edit_ddformData['箱唛要求']"
+					  @keydown="add_gdzlent($event, '面料', '箱唛要求', '要求')"
+					  rows="2"
+					  resize="none"
+					/>
+				  </el-form-item>
+				  <el-form-item label="备注">
+					<el-input
+					  type="textarea"
+					  v-model="edit_ddformData['要求']"
+					  id="要求"
+					  @keydown="add_gdzlent($event, '箱唛要求', '要求', '船样描述')"
+					  rows="2"
+					  resize="none"
+					/>
+				  </el-form-item>
+				  <el-form-item label="船样描述">
+					<el-input
+					  type="textarea"
+					  id="船样描述"
+					  @keydown="add_gdzlent($event, '要求', '船样描述', '船样合计')"
+					  v-model="edit_ddformData['船样描述']"
+					  rows="1"
+					  resize="none"
+					/>
+				  </el-form-item>
+				  <el-row :gutter="10" class="add-order-bottom-row">
+					<el-col :xs="24" :sm="8">
+					  <el-form-item label="船样合计" label-width="100px">
+						<el-input v-model="edit_ddformData['船样合计']" id="船样合计"
+						  @input="Input_handle()"
+						  @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
+						/>
+					  </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="10">
+					  <el-form-item label="粘衬" label-width="60px">
+						<el-input v-model="edit_ddformData['粘衬']" id="粘衬"
+						  @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
+						/>
+					  </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="6">
+					  <el-form-item label="单位" label-width="70px">
+						<el-input v-model="edit_ddformData['单位']" id="单位"
+						  @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
+						/>
+					  </el-form-item>
+					</el-col>
+				  </el-row>
+				</el-form>
+			  </el-col>
+			  <el-col :xs="24" :md="8" class="add-order-dialog-side">
+				<div class="add-order-upload-wrap">
+				  <el-upload
+					ref="uploadRef"
+					class="upload-demo add-order-upload"
+					:action="uploadUrl"
+					:http-request="customUpload"
+					:headers="uploadHeaders"
+					list-type="picture-card"
+					:on-preview="handlePreview"
+					:on-remove="handleRemove"
+					:before-upload="beforeUpload"
+					:on-success="handleSuccess"
+					:on-error="handleError"
+					:file-list="fileList"
+					:limit="1"
+					accept="image/jpeg,image/png"
+				  >
+					<el-icon class="add-order-upload-plus"><Plus /></el-icon>
+				  </el-upload>
+				  <div class="add-order-upload-title">上传图片</div>
+				</div>
+				<el-form label-width="100px">
+				  <el-form-item label="制单人">
+					<el-input v-model="edit_ddformData['Sys_id']" disabled />
+				  </el-form-item>
+				  <el-form-item label="制单日期">
+					<el-date-picker v-model="edit_ddformData['Sys_rq']" id="制单日期" disabled type="date" />
+				  </el-form-item>
+				</el-form>
+			  </el-col>
+			</el-row>
+		  <!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
+		  <el-table ref="multipleTable"
+								:row-style="{ height: '30px' }"
+								:cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
+								:header-cell-style="{ padding: '0px' }"
+								:show-overflow-tooltip="true"
+								:cell-class-name="planUsageCellClass"
+								highlight-current-row="true"
+								style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="edit_zsglddtableData" row-key="ID">
+						  <el-table-column align="left" label="订单编号" prop="订单编号"  width="110"/>
+						  <el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码"  width="200"/>
+						  <el-table-column align="left" label="生产款号" prop="生产款号"  width="200"/>
+						  <el-table-column align="left" label="颜色" prop="颜色"  width="115"/>
+						  <el-table-column align="left" label="物料名称" prop="物料名称"  width="170"/>
+						  <el-table-column align="left" label="计划门幅" prop="计划门幅"  width="115"/>
+						  <el-table-column align="left" label="定额门幅" prop="定额门幅"  width="115"/>
+						  <el-table-column align="left" label="款式" prop="款式"  width="115" />
+						  
+							<el-table-column fixed="right" label="操作" width="120">
+							  <template #default="{ row, $index }">
+								<el-button @click="edit_deleteRow($index)" type="text" size="small">
+								  移除
+								</el-button>
+							  </template>
+							</el-table-column>
+							
+					  </el-table> -->
+			<!-- 底部操作按钮 -->
+			<template #footer>
+			  <div class="dialog-footer" style="text-align: right;">
+				<el-button @click="dd_closeDialog">取消</el-button>
+				<el-button type="primary" @click="dd_edit_Dialog">确定</el-button>
+			  </div>
+			</template>
+		  </el-dialog>
+			  
+			  
+			  <!-- 新增颜色资料弹窗 -->
+		   <el-dialog
+			  v-model="add_gdyjdialogFormVisible"
+			  :before-close="add_gdyjcloseDialog"
+			  style="width: 73%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
+			  :title="'新增颜色资料'"
+			  destroy-on-close>
+			  <el-form label-width="100px" :model="add_yszlformdata">
+				<el-row :gutter="24" class="form-row">
+				  <el-col :span="10">
+					<div style="display: flex; gap: 0px;">
+					  <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
+					</div>
+				  </el-col>
+				  <el-col :span="10">
+					<el-form-item label="订单子编号:" class="mab" prop="keyOrder" id ='订单子编号' label-width='110'>
+					  <el-input v-model="add_yszlformdata.ddzbh" disabled style="width: 250px;" />
+					</el-form-item>
+				  </el-col>
+				</el-row>
+		  
+				<el-row :gutter="24" class="form-row">
+				  <el-col :span="10">
+					<el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
+						<el-select
+						  v-model="add_yszlformdata.sxmc" style="width: 150px;" id="色系名称" 
+						  @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
+						  <el-option 
+							v-for="color in getSuborderscolor.colorlist" 
+							:key="color.id" 
+							:label="color.colorname" 
+							:value="color.colorname"  
+							@click="xz_sxhandleSizeChange(color.colorname,color.colorcode)">
+						  </el-option>
+						</el-select>
+					</el-form-item>
+				  </el-col>
+				  <el-col :span="10">
+					<el-form-item label="PO号:" class="mab" prop="keyOrder" label-width="110">
+					  <el-input v-model="add_yszlformdata.kh" style="width: 250px;" id ='款号:' @keydown="add_gdzlent($event, '色系名称', '款号:', '颜色备注')"/>
+					</el-form-item>
+				  </el-col>
+				</el-row>
+		  
+				<el-row :gutter="24" class="form-row">
+					<el-col :span="8">
+					  <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
+						<el-input v-model="add_yszlformdata.ysbz" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
+					  </el-form-item>
+					</el-col>
+	  
+				  <el-col :span="8">
+					<el-form-item label="是否船样:" prop="joinDate" label-width='230'>
+					  <el-select v-model="add_yszlformdata.sfcy" style="width: 150px;" id ='是否船样'  @keydown="add_gdzlent($event, '颜色备注', '是否船样', 'cm1')">
+						<el-option label="是" value="是" @click="cyChange('是')"></el-option>
+						<el-option label="否" value="否" @click="cyChange('否')"></el-option>
+					  </el-select>
+					</el-form-item>
+				  </el-col>
+				</el-row>
+		  
+				<el-row :gutter="24" class="form-row">
+					<el-col :span="24">
+					<el-form-item label="尺码:" class="mab" prop="keyOrder" label-width="110">
+						<el-input
+						v-model="cmformdata.cm1"
+						style="width: 80px;"
+						id="cm1"
+						@input="handleSizeInput('cm1')"
+						@keydown="add_gdzlent($event, '', 'cm1', 'cm2')"
+						/>
+						<el-input
+						v-model="cmformdata.cm2"
+						style="width: 80px;"
+						id="cm2"
+						@input="handleSizeInput('cm2')"
+						@keydown="add_gdzlent($event, 'cm1', 'cm2', 'cm3')"
+						/>
+						<el-input
+						v-model="cmformdata.cm3"
+						style="width: 80px;"
+						id="cm3"
+						@input="handleSizeInput('cm3')"
+						@keydown="add_gdzlent($event, 'cm2', 'cm3', 'cm4')"
+						/>
+						<el-input
+						v-model="cmformdata.cm4"
+						style="width: 80px;"
+						id="cm4"
+						@input="handleSizeInput('cm4')"
+						@keydown="add_gdzlent($event, 'cm3', 'cm4', 'cm5')"
+						/>
+						<el-input
+						v-model="cmformdata.cm5"
+						style="width: 80px;"
+						id="cm5"
+						@input="handleSizeInput('cm5')"
+						@keydown="add_gdzlent($event, 'cm4', 'cm5', 'cm6')"
+						/>
+						<el-input
+						v-model="cmformdata.cm6"
+						style="width: 80px;"
+						id="cm6"
+						@input="handleSizeInput('cm6')"
+						@keydown="add_gdzlent($event, 'cm5', 'cm6', 'cm7')"
+						/>
+						<el-input
+						v-model="cmformdata.cm7"
+						style="width: 80px;"
+						id="cm7"
+						@input="handleSizeInput('cm7')"
+						@keydown="add_gdzlent($event, 'cm6', 'cm7', 'cm8')"
+						/>
+						<el-input
+						v-model="cmformdata.cm8"
+						style="width: 80px;"
+						id="cm8"
+						@input="handleSizeInput('cm8')"
+						@keydown="add_gdzlent($event, 'cm7', 'cm8', 'cm9')"
+						/>
+						<el-input
+						v-model="cmformdata.cm9"
+						style="width: 80px;"
+						id="cm9"
+						@input="handleSizeInput('cm9')"
+						@keydown="add_gdzlent($event, 'cm8', 'cm9', 'cm10')"
+						/>
+						<el-input
+						v-model="cmformdata.cm10"
+						style="width: 80px;"
+						id="cm10"
+						@input="handleSizeInput('cm10')"
+						@keydown="add_gdzlent($event, 'cm9', 'cm10', 'cm11')"
+						/>
+						<el-input
+						v-model="cmformdata.cm11"
+						style="width: 80px;"
+						id="cm11"
+						@input="handleSizeInput('cm11')"
+						@keydown="add_gdzlent($event, 'cm10', 'cm11', 'cm12')"
+						/>
+						<el-input
+						v-model="cmformdata.cm12"
+						style="width: 80px;"
+						id="cm12"
+						@input="handleSizeInput('cm12')"
+						@keydown="add_gdzlent($event, 'cm11', 'cm12', 'cm13')"
+						/>
+						<el-input
+						v-model="cmformdata.cm13"
+						style="width: 80px;"
+						id="cm13"
+						@input="handleSizeInput('cm13')"
+						@keydown="add_gdzlent($event, 'cm12', 'cm13', 'cm14')"
+						/>
+						<el-input
+						v-model="cmformdata.cm14"
+						style="width: 80px;"
+						id="cm14"
+						@input="handleSizeInput('cm14')"
+						@keydown="add_gdzlent($event, 'cm13', 'cm14', 'sctotal')"
+						/>
+						<el-input
+						v-model="cmformdata.sctotal"
+						style="width: 80px;"
+						id="sctotal"
+						@input="handleSizeInput('sctotal')"
+						@keydown="add_gdzlent($event, 'cm14', 'sctotal', 'zds1')"
+						/>
+					</el-form-item>
+					</el-col>
+  				</el-row>
+		  
+				<el-row :gutter="24" class="form-row">
+				  <el-col :span="24">
+					<el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
+					  <el-input v-model="zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1'  @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
+					  <el-input v-model="zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2'  @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
+					  <el-input v-model="zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3'  @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
+					  <el-input v-model="zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4'  @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
+					  <el-input v-model="zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5'  @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
+					  <el-input v-model="zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6'  @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
+					  <el-input v-model="zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7'  @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
+					  <el-input v-model="zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8'  @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
+					  <el-input v-model="zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9'  @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
+					  <el-input v-model="zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10'  @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
+					  <el-input v-model="zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11'  @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
+					  <el-input v-model="zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12'  @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
+					  <el-input v-model="zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13'  @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
+					  <el-input v-model="zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14'  @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
+					  <el-input v-model="zdsformdata.zdtotal" readonly style="width: 80px;" />
+					</el-form-item>
+				  </el-col>
+				</el-row>
+  
+		  
+			  </el-form>
+		  
+			  <template #footer>
+				<div class="dialog-footer" style="display: flex; justify-content: flex-end; padding: 10px;">
+				  <el-button type="primary" @click="add_dyjcloseDialog">取消</el-button>
+				  <el-button type="primary" @click="add_gdyjenterDialog">确定</el-button>
+				</div>
+			  </template>
+			  
+			</el-dialog>
+			  
+		  <!-- 新增工序资料-->
+		  <el-dialog v-model="visible" :before-close="()=> visible = false" style="width: 25%;margin: 10% auto" :title="'新增工序资料'" destroy-on-close>
+	  <el-form>
+		<div>
+		  <div style="display: flex; gap: 0px;">
+			<h3 style="color:red;font-size: 24px;margin:0px 0px 0px 15px;">订单号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="仓库出库:"  class="mab" prop="isBanciSelected" label-width="110">
+		  <el-checkbox v-model="form['仓库出库']"></el-checkbox>
+			</el-form-item>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="裁切:"  class="mab" prop="isBanciSelected" label-width="110">
+			<el-checkbox v-model="form['裁切']"></el-checkbox>
+			</el-form-item>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="车缝:"  class="mab" prop="isBanciSelected" label-width="110">
+			<el-checkbox v-model="form['车缝']"></el-checkbox>
+			</el-form-item>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="后道收样:"  class="mab" prop="isBanciSelected" label-width="110">
+			<el-checkbox v-model="form['后道收样']"></el-checkbox>
+			</el-form-item>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="大烫:"  class="mab" prop="isBanciSelected" label-width="110">
+			<el-checkbox v-model="form['大烫']"></el-checkbox>
+			</el-form-item>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="总检:"  class="mab" prop="isBanciSelected" label-width="110">
+			<el-checkbox v-model="form['总检']"></el-checkbox>
+			</el-form-item>
+		  </div>
+  
+		  <div style="display: flex; gap: 0px;">
+			<el-form-item label="包装:"  class="mab" prop="isBanciSelected" label-width="110">
+			<el-checkbox v-model="form['包装']"></el-checkbox>
+			</el-form-item>
+		  </div>
+		</div>
+	  </el-form>
+	  <template #footer>
+		<div class="dialog-footer" style="text-align: right;top: auto;">
+		<el-button @click="add_gxcloseDialog">取 消</el-button>
+		<el-button type="primary"  @click="add_gxenterDialog">确 定</el-button>
+		</div>
+	  </template>
+		  </el-dialog>
+
+	  <!-- 新增部件资料弹窗 -->
+	  <el-dialog
+	v-model="partAddDialogVisible"
+	:title="partIsEdit ? '修改部件' : '新增部件'"
+	width="900px"
+	top="5%"
+	:fullscreen="false"
+	class="part-add-dialog"
+	destroy-on-close
+  >
+		<div v-if="_Gd_gdbh" class="list-dialog-context-header" style="margin-bottom: 15px;">
+	  <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0" style="width: 100%;">
+		<tbody>
+		  <tr>
+			<th scope="row" style="width: 80px;">订单编号</th>
+			<td>{{ _Gd_gdbh }}</td>
+		  </tr>
+		</tbody>
+	  </table>
+	</div>
+		<el-form
+		  v-if="partIsEdit"
+		  ref="partFormRef"
+		  :model="partAddForm"
+		  label-width="0"
+		  class="list-part-edit-form"
+		>
+		  <div class="list-part-edit-table-wrap">
+			<el-table
+			  :data="[partAddForm]"
+			  border
+			  class="list-part-add-table"
+			  style="width: 100%;"
+			>
+			  <el-table-column label="部件序号" width="120" align="center" header-align="center">
+				<template #default="{ row }">
+				  <el-input v-model="row.部件序号" disabled placeholder="已保存序号" style="width: 80px;" />
+				</template>
+			  </el-table-column>
+			  <el-table-column label="部件编号" width="150">
+				<template #default="{ row }">
+				  <el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
+				</template>
+			  </el-table-column>
+			  <el-table-column label="部件名称" min-width="200">
+				<template #default="{ row }">
+				  <el-select
+					v-model="row.部件名称"
+					placeholder="请选择或输入部件名称"
+					filterable
+					allow-create
+					reserve-keyword
+					clearable
+					style="width: 100%;"
+				  >
+					<el-option
+					  v-for="opt in partNameOptions"
+					  :key="opt"
+					  :label="opt"
+					  :value="opt"
+					/>
+				  </el-select>
+				</template>
+			  </el-table-column>
+			  <el-table-column label="部件类型" width="150">
+				<template #default="{ row }">
+				  <el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
+				</template>
+			  </el-table-column>
+			  <el-table-column label="部件备注" min-width="150">
+				<template #default="{ row }">
+				  <el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
+				</template>
+			  </el-table-column>
+			  <el-table-column label="操作" width="80" align="center">
+				<template #default="{ $index }">
+				  <el-button
+					type="danger"
+					size="small"
+					@click="removePartRow($index)"
+					:disabled="partAddRows.length <= 1"
+				  >
+					移除
+				  </el-button>
+				</template>
+			  </el-table-column>
+			</el-table>
+		  </div>
+		</el-form>
+		<div v-else class="list-part-add-batch">
+	  <p class="list-part-hint" style="color:red; margin-bottom: 15px;">在选择部件名称后会自动增加新行。</p>
+	  <el-table
+		:data="partAddRows"
+		border
+		style="width: 100%;"
+	  >
+		<el-table-column label="部件序号" width="120" align="center" header-align="center">
+		  <template #default="{ row }">
+			<el-input v-model="row.部件序号" disabled placeholder="部件序号" style="width: 80px;" />
+		  </template>
+		</el-table-column>
+		<el-table-column label="部件编号" width="150">
+		  <template #default="{ row }">
+			<el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
+		  </template>
+		</el-table-column>
+		<el-table-column label="部件名称" min-width="200">
+		  <template #default="{ row, $index }">
+			<el-select
+			  v-model="row.部件名称"
+			  placeholder="请选择或输入部件名称"
+			  filterable
+			  allow-create
+			  reserve-keyword
+			  clearable
+			  style="width: 100%;"
+			  @change="onPartNameChange($index)"
+			>
+			  <el-option
+				v-for="opt in partNameOptions"
+				:key="opt"
+				:label="opt"
+				:value="opt"
+			  />
+			</el-select>
+		  </template>
+		</el-table-column>
+		<el-table-column label="部件类型" width="150">
+		  <template #default="{ row }">
+			<el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
+		  </template>
+		</el-table-column>
+		<el-table-column label="部件备注" min-width="150">
+		  <template #default="{ row }">
+			<el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
+		  </template>
+		</el-table-column>
+		<el-table-column label="操作" width="80" align="center">
+		  <template #default="{ $index }">
+			<el-button
+			  type="danger"
+			  size="small"
+			  @click="removePartRow($index)"
+			  :disabled="partAddRows.length <= 1"
+			>
+			  移除
+			</el-button>
+		  </template>
+		</el-table-column>
+		  </el-table>
+		</div>
+		<template #footer>
+	  <div class="dialog-footer" style="text-align: right;">
+		<el-button @click="partAddCloseDialog">取消</el-button>
+		<el-button type="primary" @click="partAddConfirm">{{ partIsEdit ? '保存' : '确定' }}</el-button>
+	  </div>
+	</template>
+	  </el-dialog>
+
+  <!-- 新增工艺资料弹窗 -->
+  <el-dialog
+    v-model="processAddDialogVisible"
+    :title="processIsEdit ? '修改工艺' : '新增工艺'"
+    :width="'min(1280px, 90vw)'"
+    align-center
+    destroy-on-close
+    append-to-body
+    :class="['list-unified-dialog', 'list-process-add-dialog']"
+    @closed="resetProcessLibForm"
+  >
+    <div v-if="_Gd_gdbh" class="list-dialog-context-header">
+      <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
+        <tbody>
+          <tr>
+            <th scope="row">订单编号</th>
+            <td>{{ _Gd_gdbh }}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <p class="list-process-add-split-hint">
+      <strong>车缝工艺选部件</strong>,工艺与部件绑定;<strong>其余工序工艺不选部件</strong>。选择查询工艺名称后自动带出标准工时、标准工分。
+    </p>
+    <div class="list-process-add-scroll-body">
+      <div class="list-process-add-split">
+        <div class="list-process-add-sidebar">
+          <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
+          <div class="list-process-add-part-list list-process-add-stage-list">
+            <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="st">
+              <div
+                class="list-process-add-stage-item"
+                :class="{
+                  'is-active':
+                    processAddSelectedStage === st && (st !== '车缝' || !processAddPartList.length),
+                }"
+                @click="onProcessAddSelectStage(st)"
+              >
+                {{ st }}
+              </div>
+              <div
+                v-if="st === '车缝' && processAddPartList.length"
+                class="list-process-add-sewing-nest"
+              >
+                <div
+                  v-for="(part, pi) in processAddPartList"
+                  :key="processAddPartBlockKey(part, pi)"
+                  class="list-process-add-part-item list-process-add-part-item--nest"
+                  :class="{
+                    'is-active':
+                      processAddSelectedStage === '车缝' &&
+                      processAddSelectedPartKey === processAddPartBlockKey(part, pi),
+                  }"
+                  @click.stop="onProcessAddSelectSewingPart(part, pi)"
+                >
+                  <div class="list-process-add-part-item-text">
+                    <span class="list-process-add-part-sort">序号 {{ part.part_sort ?? part['部件序号'] ?? '—' }}</span>
+                    <span
+                      class="list-process-add-part-name"
+                      :title="String(part.part_name ?? part['部件名称'] ?? '')"
+                    >
+                      {{ part.part_name ?? part['部件名称'] ?? '—' }}
+                    </span>
+                  </div>
+                </div>
+              </div>
+            </template>
+          </div>
+        </div>
+        <div class="list-process-add-main-panel">
+          <template v-if="processAddCurrentRowKey">
+            <div v-if="processAddSelectedStage !== '车缝'" class="list-process-add-main-head">
+              当前工序:<strong>{{ processAddSelectedStage }}</strong>
+              <span class="list-process-add-main-head-sub">(不关联部件)</span>
+            </div>
+            <div v-else class="list-process-add-main-head">
+              车缝 · 当前部件:<strong>{{
+                processAddActivePart?.part_name ?? processAddActivePart?.['部件名称'] ?? '—'
+              }}</strong>
+              <span class="list-process-add-main-head-sub">
+                (序号 {{ processAddActivePart?.part_sort ?? processAddActivePart?.['部件序号'] ?? '—' }})
+              </span>
+            </div>
+            <div class="list-process-add-table-wrap">
+              <el-table
+                :data="processAddByPartRows[processAddCurrentRowKey] ?? []"
+                border
+                class="list-process-add-table"
+                :row-key="(row) => row._key"
+                :height="processAddDialogTableHeight"
+              >
+                <el-table-column label="工艺序号" width="120" align="center" header-align="center">
+                  <template #default="{ row }">
+                    <span class="list-serial-cell-text">{{ row['工艺序号'] || '—' }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="工艺名称" min-width="200">
+                  <template #default="{ row, $index }">
+                    <el-select
+                      v-model="row['工艺名称']"
+                      class="list-lib-name-select"
+                      popper-class="process-lib-select-dropdown"
+                      placeholder="请选择或输入工艺名称"
+                      filterable
+                      remote
+                      reserve-keyword
+                      allow-create
+                      default-first-option
+                      clearable
+                      :remote-method="onProcessLibSelectFilter"
+                      @visible-change="onProcessLibSelectVisible"
+                      @change="onProcessLibNameSelectChangeForPart(processAddCurrentRowKey, $index)"
+                    >
+                      <el-option
+                        v-for="opt in filteredProcessLibNameOptionsForProcessAdd"
+                        :key="opt.value"
+                        :label="opt.value"
+                        :value="opt.value"
+                      >
+                        <div class="process-lib-opt-two-col">
+                          <span class="process-lib-opt-name" :title="String(opt.value)">{{ opt.value }}</span>
+                          <span class="process-lib-opt-stage">{{ processLibOptStageText(opt) }}</span>
+                        </div>
+                      </el-option>
+                    </el-select>
+                  </template>
+                </el-table-column>
+                <el-table-column label="生产工序" min-width="120" show-overflow-tooltip>
+                  <template #default="{ row }">
+                    <span class="list-process-cell-plain">{{ row['生产工序'] || '—' }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="标准工时" width="118">
+                  <template #default="{ row }">
+                    <el-input-number v-model="row['标准工时']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
+                  </template>
+                </el-table-column>
+                <el-table-column label="标准工分" width="118">
+                  <template #default="{ row }">
+                    <el-input-number v-model="row['标准工分']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
+                  </template>
+                </el-table-column>
+                <el-table-column label="难度系数" width="110">
+                  <template #default="{ row }">
+                    <el-input-number
+                      v-model="row['难度系数']"
+                      :min="0"
+                      :precision="2"
+                      :step="0.1"
+                      controls-position="right"
+                      style="width: 100%"
+                    />
+                  </template>
+                </el-table-column>
+                <el-table-column label="操作" width="72" align="center">
+                  <template #default="{ row, $index }">
+                    <el-button
+                      type="danger"
+                      link
+                      size="small"
+                      @click="removeProcessLibRowForPart(processAddCurrentRowKey, row, $index)"
+                    >
+                      移除
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </template>
+          <template v-else-if="processAddSelectedStage === '车缝' && !processAddPartList.length">
+            <el-empty
+              description="车缝需先有部件。请先在「部件资料」中新增部件后再编辑车缝工艺"
+              :image-size="72"
+              class="list-process-add-main-empty"
+            />
+          </template>
+          <el-empty
+            v-else
+            description="请在左侧选择生产工序;车缝时请选择具体部件"
+            :image-size="72"
+            class="list-process-add-main-empty"
+          />
+        </div>
+      </div>
+    </div>
+    <div class="list-process-meta">将提交 {{ processLibAddSubmitCount }} 条</div>
+    <template #footer>
+      <el-button @click="processAddCloseDialog">取消</el-button>
+      <el-button type="primary" :loading="processSubmitLoading" @click="processAddConfirm">确定</el-button>
+    </template>
+  </el-dialog>
+
+  <!-- 部件与工艺排序弹窗 -->
+      <el-dialog
+        v-model="sortPartGyDialogVisible"
+        title="调整部件 / 工艺序号排序"
+        :width="'min(1280px, 90vw)'"
+        :max-height="'85vh'"
+        align-center
+        destroy-on-close
+        append-to-body
+        :class="['list-unified-dialog', 'list-process-add-dialog', 'sort-part-gy-dialog']"
+        @closed="onSortPartGyDialogClosed"
+      >
+        <div v-if="_Gd_gdbh" class="list-dialog-context-header">
+          <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
+            <tbody>
+              <tr>
+                <th scope="row">订单编号</th>
+                <td>{{ _Gd_gdbh }}</td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="sort-part-gy-hint" role="note">
+          <ul class="sort-part-gy-hint-list">
+            <li>
+              <strong>左侧</strong>:与「新增工艺」一致,一级为生产工序(裁剪 → 车缝 → 手工 → 大烫 → 总检);仅<strong>车缝</strong>下可拖拽调整部件先后,点击部件后右侧排该车缝工艺。
+            </li>
+            <li>
+              <strong>非车缝工序</strong>:点选后右侧为该工单下、不关联部件的工艺;<strong>右侧工艺表</strong>可拖拽「拖」列、改工艺名等。
+            </li>
+            <li>
+              <strong>保存</strong>:按当前顺序重编部件号与工艺号,并提交变更。
+            </li>
+          </ul>
+        </div>
+        <div v-loading="sortDialogLoading" class="sort-part-gy-body">
+          <template v-if="!sortDialogLoading && !sortDialogHasData">
+            <el-empty description="当前工单下暂无工艺数据" />
+          </template>
+          <div v-else class="sort-part-gy-split list-process-add-split">
+            <div class="list-process-add-sidebar sort-gy-left-nav">
+              <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
+              <div class="list-process-add-part-list list-process-add-stage-list list-sort-gy-nav-list">
+                <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="'sort-nav-' + st">
+                  <div
+                    class="list-process-add-stage-item"
+                    :class="{
+                      'is-active': sortDialogViewStage === st && (st !== '车缝' || !sortDialogSewingGroups.length),
+                    }"
+                    @click="onSortDialogViewStageSelect(st)"
+                  >
+                    {{ st }}
+                  </div>
+                  <div
+                    v-if="st === '车缝' && sortDialogSewingGroups.length"
+                    class="list-process-add-sewing-nest list-sort-gy-sewing-parts"
+                  >
+                    <div
+                      v-for="(sg, spi) in sortDialogSewingGroups"
+                      :key="String(sg.part?.id ?? `sg-${spi}`)"
+                      class="list-process-add-part-item list-process-add-part-item--nest sort-part-gy-part-item"
+                      :class="{
+                        'is-active':
+                          sortDialogViewStage === '车缝' &&
+                          sortDialogSelectedPartId != null &&
+                          String(sortDialogSelectedPartId) === String(sg.part?.id),
+                      }"
+                      title="拖拽或点击"
+                      @click.stop="onSortDialogSelectSewingPart(sg.part?.id)"
+                    >
+                      <span class="sort-part-gy-part-item-grip" aria-hidden="true">
+                        <el-icon><Rank /></el-icon>
+                      </span>
+                      <div class="list-process-add-part-item-text">
+                        <span class="list-process-add-part-sort">序号 {{ sg.part?.part_sort ?? '—' }}</span>
+                        <span
+                          class="list-process-add-part-name"
+                          :title="String(sg.part?.部件名称 ?? '')"
+                        >
+                          {{ sg.part?.部件名称 ?? '—' }}
+                        </span>
+                      </div>
+                    </div>
+                  </div>
+                </template>
+              </div>
+            </div>
+            <div class="sort-part-gy-main-panel">
+              <template v-if="sortDialogViewStage && sortDialogRightPanelReady">
+                <div v-if="sortDialogViewStage !== '车缝'" class="sort-part-gy-main-head list-process-add-main-head">
+                  当前工序:<strong>{{ sortDialogViewStage }}</strong>
+                  <span class="list-process-add-main-head-sub">(不关联部件)</span>
+                </div>
+                <div v-else-if="sortDialogRightActiveSewingGroup" class="sort-part-gy-main-head list-process-add-main-head">
+                  车缝 · 当前部件:<strong>{{
+                    sortDialogRightActiveSewingGroup.part?.部件名称 ?? '—'
+                  }}</strong>
+                  <span class="list-process-add-main-head-sub">
+                    (序号 {{ sortDialogRightActiveSewingGroup.part?.part_sort ?? '—' }})
+                  </span>
+                </div>
+                <div v-else class="sort-part-gy-main-head list-process-add-main-head--warn">请在「车缝」下选择一个部件,或先维护部件资料。</div>
+                <el-table
+                  v-if="sortDialogActiveGysList.length"
+                  :data="sortDialogActiveGysList"
+                  border
+                  size="small"
+                  class="sort-gy-table"
+                  :row-key="(row) => String(row.id ?? `${row.gy_sort}-${row.gy_name}`)"
+                >
+                  <el-table-column width="44" align="center" fixed="left">
+                    <template #header><span class="sort-drag-col-hint">拖</span></template>
+                    <template #default>
+                      <span class="sort-drag-handle" title="拖拽调整工艺顺序">
+                        <el-icon><Rank /></el-icon>
+                      </span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="工艺序号" width="88" align="center">
+                    <template #default="{ row: r }"> {{ r.gy_sort ?? r['工艺序号'] ?? '—' }}</template>
+                  </el-table-column>
+                  <el-table-column label="工艺名称" min-width="220">
+                    <template #default="{ row: r }">
+                      <span :title="r['工艺名称'] || ''">{{ r['工艺名称'] || '—' }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="标准工时" width="100" align="center">
+                    <template #default="{ row: r }"> {{ r['标准工时'] || '—' }}</template>
+                  </el-table-column>
+                  <el-table-column label="标准工分" width="100" align="center">
+                    <template #default="{ row: r }"> {{ r['标准公分'] || r['标准工分'] || '—' }}</template>
+                  </el-table-column>
+                  <el-table-column label="难度系数" width="120" align="center">
+                    <template #default="{ row: r }"> {{ r['系数'] || r['难度系数'] || '—' }}</template>
+                  </el-table-column>
+                  <el-table-column label="生产工序" width="100" align="center" prop="big_process" show-overflow-tooltip />
+                </el-table>
+                <el-empty
+                  v-else
+                  :description="sortDialogViewStage === '车缝' ? '该部件下暂无车缝工艺' : '该工序下暂无工艺'"
+                  :image-size="64"
+                  class="sort-part-gy-main-empty"
+                />
+              </template>
+              <el-empty
+                v-else
+                description="请先在左侧选择生产工序,车缝时请选择具体部件"
+                :image-size="72"
+                class="sort-part-gy-main-empty"
+              />
+            </div>
+          </div>
+        </div>
+        <template #footer>
+          <div class="dialog-footer" style="text-align: right;">
+            <el-button @click="sortCloseDialog">取 消</el-button>
+            <el-button type="primary" :loading="sortDialogSubmitLoading" @click="submitSortPartGy">保存排序</el-button>
+          </div>
+        </template>
+      </el-dialog>
+		  
+		  <!-- 附件上传 -->
+		  <el-dialog v-model="jsfjdialogFormVisible" :before-close="jsfjcloseDialog"
+					  style="margin-top: 40px" height="500px" width="700px" destroy-on-close>
+				<el-form :model="jsfjformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
+				  <el-row :gutter="24">
+					  <el-col :span="10">
+					   <div style="display: flex; gap: 0px;">
+						 <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}</h3>
+					   </div>
+					  </el-col>
+				  </el-row>
+				  <br />
+				  <el-row :gutter="24">  
+					<el-col :span="16">  
+					  <el-form-item label="附件备注:" prop="address" class="mab">  
+						<el-select v-model="jsfjformdata.附件备注" placeholder="请选择附件类型" id="附件备注">  
+						  <el-option label="订单附件" value="订单资料附件"></el-option>
+						  <el-option label="技术附件" value="技术附件"></el-option>
+						  <el-option label="发货单附件" value="发货单附件"></el-option>
+						</el-select>  
+					  </el-form-item>  
+					</el-col>  
+				  </el-row> 
+				  <br>
+				  <el-row :gutter="24">
+					  <!-- <el-col :span="8">
+						  <br>
+						  <p>s</p>
+					  </el-col> -->
+					  <el-col :span="12">
+						  <!-- <br> -->
+						  <el-form-item label="附件备注:" prop="address" class="mab">  
+						  <input style="font-size:16px;" type="file" @change="uploadExcel" >
+						  </el-form-item>  
+					  </el-col>
+				  <!-- 	<el-col :span="4">
+						  <br>
+						  <el-button @click="yulan">预览</el-button>
+					  </el-col> -->
+				  </el-row>
+				</el-form>
+				<template #footer>
+					<br>
+				  <div class="dialog-footer">
+					<el-button @click="jsfjcloseDialog">取 消</el-button>
+					<el-button type="primary"  @click="jsfjenterDialog">确 定</el-button>
+				  </div>
+				</template>
+			  </el-dialog>
+			  
+			  <!-- 复制工艺资料弹窗 -->
+			  <el-dialog v-model="copyProductDialogVisible" title="复制工艺资料">
+				<div style=" padding: 0px; align-items: center; display: flex; flex-wrap: wrap;">
+				  <el-form-item label="当前订单" prop="processName" class="mab">
+					<el-input v-model="copyProductFormData['gdbh']" disabled style="width: 150px;" />
+				  </el-form-item>
+				  <el-form-item label="生产款号" prop="生产款号" class="mab">
+					<el-input v-model="copyProductFormData['生产款号']" disabled style="width: 200px;" />
+				  </el-form-item>
+				  <el-form-item label="搜索订单" prop="processName" class="mab" style="width: 50%;">
+					<el-input v-model="copyProductSearchText" placeholder="请输入订单编号或生产款号搜索" style="width: 70%;" @keydown.enter.prevent="copyProductSearch" />
+					<el-button type="primary" @click="copyProductSearch" style="margin-left: 10px;">搜索</el-button>
+				  </el-form-item>
+				  <el-form-item prop="processName" class="mab" style="width: 100%;">
+					<span style="color:red">请选择要复制工艺的源订单</span>
+				  </el-form-item>
+				</div>
+				<div slot="footer" class="dialog-footer" style="text-align: right;margin-left: 25%">
+				  <el-button @click="copyProductHandleCancel">放弃</el-button>
+				  <el-button type="primary" @click="copyProductHandleConfirm" :disabled="!copyProductSelectedRow">复制</el-button>
+				</div>
+				<el-table ref="copyProductTableRef"
+						:show-overflow-tooltip="true"
+						:row-style="{ height: '0px' }"
+						:cell-style="{ padding: '0px' }"
+						:header-row-style="{ height: '0px' }"
+						:header-cell-style="{ padding: '0px' }"
+						@row-click="copyProductTableRowClick"
+						highlight-current-row="true"
+						style="width: 100%;height: 30vh;" border tooltip-effect="dark"
+						:data="copyProductTableData" row-key="订单编号">
+					<el-table-column align="left" label="订单编号" width="120">
+					  <template v-slot="{ row }"><span>{{ row.订单编号 }}</span></template>
+					</el-table-column>
+					<el-table-column align="left" label="生产款号" width="200">
+					  <template v-slot="{ row }"><span>{{ row.生产款号 }}</span></template>
+					</el-table-column>
+					<el-table-column align="left" label="客户编号" width="100">
+					  <template v-slot="{ row }"><span>{{ row.客户编号 }}</span></template>
+					</el-table-column>
+					<el-table-column align="left" label="款式" width="150">
+					  <template v-slot="{ row }"><span>{{ row.款式 }}</span></template>
+					</el-table-column>
+				  </el-table>
+			  </el-dialog>
+			  
+			  <!-- 面料库存弹窗 -->
+		<el-dialog v-model="mlinventoryVisible" :before-close="mlcloseDialog" title="面料库存出入库记录" 
+					  style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
+				<el-form :model="mlformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
+			<el-table
+				ref="table"
+				highlight-current-row
+				show-overflow-tooltip
+				border
+				:data="historytableData"
+				:row-style="{ height: '25px' }"
+				:cell-style="{ padding: '0px' }"
+				:header-row-style="{ height: '20px' }"
+				:header-cell-style="{ padding: '0px' }"
+				style="width: 100%;height: 75vh;" >
+		  
+			<el-table-column label="订单编号" prop="订单编号"width="110" ></el-table-column>
+			<el-table-column label="面料" prop="面料" width="110"></el-table-column>
+			<el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
+			<el-table-column label="入库数量" prop="入库数量" width="110"></el-table-column>
+			<el-table-column label="出库数量" prop="出库数量" width="110"></el-table-column>
+			<el-table-column label="领料部门" prop="领料部门" width="110"></el-table-column>
+			<el-table-column label="领料时间" prop="领料时间" width="110"></el-table-column>
+		  </el-table>
+				  <br>
+				</el-form>
+				<template #footer>
+					<br>
+				  <div class="dialog-footer">
+					<el-button @click="mlcloseDialog">取 消</el-button>
+					<el-button type="primary"  @click="mlenterDialog">确 定</el-button>
+				  </div>
+				</template>
+			  </el-dialog>
+			  
+			  
+			  <!-- 发货单页面 -->
+  
+			  <el-dialog v-model="InvoiceVisible" :before-close="InvoiceDialog" title="AI获取发货单出货信息"
+						  style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
+						  
+					<h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号&nbsp;&nbsp;&nbsp;{{_ddhval}}&nbsp;&nbsp;&nbsp;{{_mesval}}</h3>
+					
+					<el-table
+							ref="table" highlight-current-row
+							show-overflow-tooltip border
+							:data="InvoicetableData"
+							:row-style="{ height: '25px' }"
+							:cell-style="{ padding: '0px' }"
+							:header-row-style="{ height: '20px' }"
+							:header-cell-style="{ padding: '0px' }"
+							style="width: 100%;height: 65vh;" >
+			
+						<el-table-column label="子订单编号" prop="子订单编号" width="160"></el-table-column>
+						<el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
+						<el-table-column label="尺码" prop="尺码" width="110"></el-table-column>
+						<el-table-column label="制单数量" prop="制单数量" width="110"></el-table-column>
+						<el-table-column label="发货箱数" prop="发货箱数" width="110">
+							<template #default="scope">
+								<el-input
+									v-model="scope.row.发货箱数"
+									size="mini"
+									@change="handleQuantityChange(scope.row)"
+									@blur="handleQuantityBlur(scope.row)"
+									placeholder="请输入数量"
+								/>
+							</template>
+						</el-table-column>
+							<el-table-column label="每箱件数" prop="每箱件数" width="110">
+							<template #default="scope">
+								<el-input
+									v-model="scope.row.每箱件数"
+									size="mini"
+									@change="handleQuantityChange(scope.row)"
+									@blur="handleQuantityBlur(scope.row)"
+									placeholder="请输入数量"
+								/>
+							</template>
+						</el-table-column>
+						<el-table-column label="发货数量" prop="发货数量" width="110"></el-table-column>
+					</el-table>
+					
+					<template #footer>
+						<br>
+					  <div class="dialog-footer">
+						<el-button @click="InvoiceDialog">取 消</el-button>
+						<el-button type="primary"  @click="InvoiceenterDialog">确 定</el-button>
+					  </div>
+					</template>
+			  </el-dialog>
+  
+  
+			</el-main>
+		  </layout-content>
+		</layout>
+	  </layout>
+	  
+	  <!-- 打印订单表预览 -->
+	  <PrintPage ref="printPageRef" />
+	  <!-- 子订单详情页 -->
+	  <luckyexcelPage ref="luckyexcelPageRef" />
+	  
+	  <!-- 工序产量核查 -->
+	  <el-dialog
+		v-model="processProductionVisible"
+		width="100%"
+		style="height: 100%;margin: 0px;"
+		top="2vh"
+		:close-on-click-modal="true"
+		:show-close="false"
+		destroy-on-close
+		class="process-production-dialog"
+	  >
+		<template #header>
+		  <div class="process-production-dialog-header">
+			<span class="process-production-dialog-title">工序产量核查</span>
+			<el-button
+			  type="danger"
+			  size="small"
+			  class="process-production-dialog-close"
+			  @click="processProductionVisible = false"
+			>
+			  关闭
+			</el-button>
+		  </div>
+		</template>
+		<ProcessProduction
+		  :key="processProductionDialogKey"
+		  :initial-workorder="processProductionWorkorder"
+		  in-dialog
+		  hide-amount-columns
+		/>
+	  </el-dialog>
+
+	  <!-- 导入工艺资料弹窗 -->
+	  <el-dialog
+		title="导入工艺资料"
+		v-model="importProcessDialogVisible"
+		width="520px"
+		:close-on-click-modal="false"
+		destroy-on-close
+		class="import-process-dialog"
+	  >
+		<div class="import-process-body">
+		  <el-form
+			:model="importProcessForm"
+			label-position="right"
+			class="import-process-form"
+		  >
+			<el-form-item label="订单编号" label-width="96px">
+			  <el-input v-model="importProcessForm.workorderNo" disabled />
+			</el-form-item>
+			<el-form-item label="款号" label-width="96px">
+			  <el-input v-model="importProcessForm.styleNo" disabled />
+			</el-form-item>
+			<el-form-item label="Excel文件" label-width="96px">
+			  <el-upload
+				ref="importProcessUploadRef"
+				class="upload-demo import-process-upload"
+				action="#"
+				:auto-upload="false"
+				:show-file-list="true"
+				:file-list="importProcessFileList"
+				accept=".xlsx,.xls"
+				:on-change="handleImportProcessFileChange"
+				:on-remove="handleImportProcessFileRemove"
+				:before-upload="beforeImportProcessUpload"
+				list-type="text"
+			  >
+				<el-button type="primary" icon="upload">选择文件</el-button>
+			  </el-upload>
+			</el-form-item>
+		  </el-form>
+		</div>
+		<template #footer>
+		  <div class="dialog-footer">
+			<el-button @click="closeImportProcessDialog">取 消</el-button>
+			<el-button type="primary" @click="submitImportProcess">确 定</el-button>
+		  </div>
+		</template>
+	  </el-dialog>
+
+	  <!-- 导入冲突对照:import_append_only,单表左右字段对比 -->
+	  <el-dialog
+		v-model="importConflictDialogVisible"
+		:title="importConflictTitle"
+		width="1100px"
+		top="6vh"
+		append-to-body
+		:close-on-click-modal="false"
+		destroy-on-close
+		class="import-process-conflict-dialog"
+	  >
+		<div
+		  v-if="importConflictMeta.suggest_min_new_code != null"
+		  class="import-conflict-summary"
+		>
+		</div>
+		<div class="import-process-tip">
+		  <div>1、Excel 中的工序号及工序名称必须和系统已有工序档案完全匹配,匹配不一致时不可导入。</div>
+		  <div>2、仅支持在工序列表末尾追加新工序,不支持在列表中间插入工序。</div>
+		</div>
+		<el-table
+		  :data="importConflictMergedList"
+		  border
+		  size="small"
+		  height="460"
+		  empty-text="暂无对照数据"
+		  :row-class-name="importConflictRowClassName"
+		>
+		  <el-table-column prop="old_part_name" label="原部件名称" min-width="110" show-overflow-tooltip />
+		  <el-table-column prop="old_process_code" label="原工序号" width="88" align="center" />
+		  <el-table-column prop="old_process_name" label="原工序名称" min-width="150" show-overflow-tooltip />
+		  <el-table-column prop="new_part_name" label="本次导入部件名称" min-width="120" show-overflow-tooltip />
+		  <el-table-column prop="new_process_code" label="本次导入工序号" width="120" align="center" />
+		  <el-table-column prop="new_process_name" label="本次导入工序名称" min-width="160" show-overflow-tooltip />
+		</el-table>
+		<template #footer>
+		  <el-button type="primary" @click="importConflictDialogVisible = false">关闭</el-button>
+		</template>
+	  </el-dialog>
+	  
+	</div>
+  </template>
+  <script>
+  //点击按钮显示下方表格
+  export default {
+	data() {
+	  return {
+		currentTable: '', // 当前展示的表格
+		activeName: 'first',
+		_ddhval:'',
+		 size: '',
+		add_gddialogFormVisible: true,
+	  };
+	}
+  };
+  </script> 
+  
+  <script setup> 
+  // 全量引入格式化工具 请按需保留
+  import $script from 'scriptjs'
+  import $ from 'jquery';
+  import LuckyExcel from 'luckyexcel';
+  import { toRaw } from 'vue';
+  import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
+  import { ElMessage, ElMessageBox, ElUpload, ElButton, ElLoading } from 'element-plus'
+  // 生产环境为按需引入,手动 import 组件不会带样式;补全 Upload,避免 picture-card 退化成原生「选择文件」
+  import 'element-plus/es/components/upload/style/css'
+  import 'element-plus/es/components/button/style/css'
+  import 'element-plus/es/components/image-viewer/style/css'
+  import { Plus } from '@element-plus/icons-vue'
+  import { ref, reactive, computed, nextTick, watch, onMounted, onBeforeUnmount, isRef } from 'vue'
+  import axios from 'axios';
+  import * as XLSX from 'xlsx';
+  import jsPDF from 'jspdf';
+  import 'vxe-table/lib/style.css';
+  import { VxeTable, VxeColumn } from 'vxe-table';
+  import Sortable from '@/utils/vendor/sortable.esm.js'
+  import {Datalist,WorkOrderList,WorkOrderAdd,PrintListData,
+  printDetailAdd,PrintDetailDel,orderDataDel,getWorkOrder,
+  getSuborder,PrintDataEdit,WorkOrderEdit,gdAnnexAdd,upload,OrderAttachments,
+  getPonumber,FabricEdit,orderBomList,FabricDetail,fabricList,Bomdel,delfujian,Read_File,Read_Add,PartList,GetProcessList,
+  AddPart,UpdatePartInfo,DeletePart,AddProcess,UpdateProcess,DeleteProcess,getproducttype,workorderprocessCopy,sortProcess,getProductStyleList,copyProcessToCurrentWorkOrder,
+  importProcess,getWorkOrderProcess,updateWorkOrderPlanManufacture,checkProcessReport,confirmProcessSplit,updateOrderRemarkAndFinishDate} from '@/api/mes/job'
+  import {ParList,ProcessList} from '@/api/yunyin/product'
+  import PrintPage from './components/print.vue'
+  import luckyexcelPage from './components/luckyexcel.vue'
+  import AddGongYi from './components/addGongYi.vue'
+  import ProcessProduction from '@/view/SalaryManage/ProcessProduction.vue'
+  import { ensureProcessProductionData } from '@/utils/processProductionDialog'
+  import { useUserStore } from '@/pinia/modules/user';
+  defineOptions({name: 'Company'})
+  //定义打印跳转页面
+  const printPageRef = ref()
+  const luckyexcelPageRef = ref()
+  //获取登录用户信息
+  const userStore = useUserStore()
+  const _username = ref('')
+  _username.value = userStore.userInfo.userName + '/' + userStore.userInfo.nickName
+  console.log('获取用户名称',_username.value)
+  //全局获取当前日期
+  const today = new Date();
+  const year = today.getFullYear();
+  const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始,需要补零
+  const day = String(today.getDate()).padStart(2, '0');
+  const hours = String(today.getHours()).padStart(2, '0');
+  const minutes = String(today.getMinutes()).padStart(2, '0');
+  const seconds = String(today.getSeconds()).padStart(2, '0');
+  const currentDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+  const currentDates = `${year}-${month}-${day}`;
+  
+  //==============图片上传=============
+  //测试环境前端
+  // const uploadUrl = ref('http://mes-dacheng-api:8083/index.php/api/work_order/ImgUpload') 
+  
+  // 获取环境变量
+  const basePath = import.meta.env.VITE_BASE_PATH;
+  const uploadsPort = import.meta.env.VITE_UPLOADS_PORT;
+  // 动态生成路径
+  let path = basePath && uploadsPort ? `${basePath}:${uploadsPort}` : undefined;
+  // 如果 path 是 undefined,则使用默认地址
+  if (!path || path.includes("undefined")) {
+	  console.log("第一路径获取失败,尝试使用备用地址 http://192.168.28.22:8082");
+	  path = "http://192.168.28.22:8082";
+  }
+  // 如果还是 undefined,再降级到本地地址
+  if (path.includes("undefined")) {
+	  console.log("备用地址获取失败,使用本地地址 http://127.0.0.1:58082");
+	  path = "http://127.0.0.1:58082";
+  }
+  console.log("最终获取地址:", path);
+  
+  /** 将接口返回的相对路径 img 转为可预览的完整 URL(与上传服务同源) */
+  const buildFullImageUrl = (imgRel) => {
+	if (!imgRel || typeof imgRel !== 'string') return '';
+	const trimmed = imgRel.trim();
+	if (/^https?:\/\//i.test(trimmed)) return trimmed;
+	const base = String(path).replace(/\/$/, '');
+	const rel = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
+	return `${base}${rel}`;
+  };
+
+  // 上传的URL
+  const uploadUrl = ref(`${path}/api/work_order/ImgUpload`);
+  // const uploadUrl = ref("http://192.168.28.22:8082/api/work_order/ImgUpload");
+  const uploadHeaders = { 'Content-Type': 'multipart/form-data' };
+  const fileList = reactive([]);
+  const uploadRef = ref(null);
+
+  /** 根据 img 相对/绝对路径同步 el-upload 展示列表(修改订单回显图片) */
+  const syncUploadFileList = (imgRel) => {
+	fileList.splice(0, fileList.length);
+	if (!imgRel || typeof imgRel !== 'string') return;
+	const url = buildFullImageUrl(imgRel);
+	if (!url) return;
+	fileList.push({
+	  uid: Date.now(),
+	  name: imgRel.split('/').pop() || 'image.jpg',
+	  url,
+	  status: 'success',
+	});
+  };
+
+  // 预览图片(页内放大,不新开标签页)
+  const imgPreviewVisible = ref(false)
+  const imgPreviewList = ref([])
+  const handlePreview = (file) => {
+	const previewUrl = file.url || buildFullImageUrl(file.response?.data?.data?.url)
+	if (!previewUrl) {
+	  ElMessage.warning('暂无可预览的图片')
+	  return
+	}
+	imgPreviewList.value = [previewUrl]
+	imgPreviewVisible.value = true
+  }
+  const closeImgPreview = () => {
+	imgPreviewVisible.value = false
+	imgPreviewList.value = []
+  }
+  // 移除图片
+  const handleRemove = () => {
+	fileList.splice(0, fileList.length);
+	add_gdscgdformData.img = '';
+	if (edit_ddformData.value) edit_ddformData.value.img = '';
+  };
+  // 上传错误处理
+  const handleError = (err, file, fileList) => {
+	console.error('上传失败:', err);
+	ElMessage.error(`图片上传失败: ${err.message || '未知错误'}`);
+  };
+  // 上传前的检查与图片压缩
+  const beforeUpload = (file) => {
+	const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png';
+	const isLt500K = file.size / 1024 < 500;
+	if (!isJPGOrPNG) {
+	  ElMessage.error('上传图片只能是 JPG 或 PNG 格式!');
+	  return false;
+	}
+	if (!isLt500K) {
+	  ElMessage.error('上传图片大小不能超过 500KB!');
+	  return false;
+	}
+	// 图片格式和大小符合,压缩图片
+	return new Promise((resolve, reject) => {
+	  const reader = new FileReader();
+	  reader.readAsDataURL(file);
+	  reader.onload = () => {
+		const img = new Image();
+		img.src = reader.result;
+		img.onload = () => {
+		  const canvas = document.createElement('canvas');
+		  const ctx = canvas.getContext('2d');
+		  const fixedWidth = 300;
+		  const fixedHeight = 300;
+		  canvas.width = fixedWidth;
+		  canvas.height = fixedHeight;
+		  ctx.drawImage(img, 0, 0, fixedWidth, fixedHeight);
+		  canvas.toBlob((blob) => {
+			const compressedFile = new File([blob], file.name, { type: file.type });
+			resolve(compressedFile);
+		  }, file.type);
+		};
+	  };
+	  reader.onerror = (error) => {
+		ElMessage.error('图片处理失败');
+		reject(error);
+	  };
+	});
+  };
+  // 上传成功处理
+  const handleSuccess = (response, file, fileList) => {
+	console.log('上传成功:', response, file, fileList);
+  };
+  // 自定义上传逻辑
+  const customUpload = async (options) => {
+	try {
+	  const formData = new FormData();
+	  formData.append('image', options.file);
+	  const response = await axios.post(uploadUrl.value, formData, {
+		headers: uploadHeaders,
+		onUploadProgress: (progressEvent) => {
+		  options.onProgress({
+			percent: Math.round((progressEvent.loaded * 100) / progressEvent.total),
+		  });
+		},
+	  });
+	  if (response.data.code === 0) {
+		const imgUrl = response.data.data.url;
+		options.onSuccess(response.data);
+		ElMessage.success('图片上传成功');
+		add_gdscgdformData.img = imgUrl;
+		if (edit_ddformData.value) edit_ddformData.value.img = imgUrl;
+		syncUploadFileList(imgUrl);
+	  } else {
+		throw new Error(response.data.msg);
+	  }
+	} catch (error) {
+	  console.error('上传失败:', error);
+	  options.onError(error);
+	  ElMessage.error(`上传失败: ${error.message}`);
+	}
+  };
+  
+
+
+
+
+  // =========== 左侧树侧形结构 =========== 
+  const treeData = ref([])
+  const tableData = ref([])
+  const _Gd_khdh = ref(null)
+  const defaultProps = {  
+		children: 'children',  
+		label: 'label'  
+	  };  
+  const Datalistdata = async () => {
+	try {
+	  const Datalists = await Datalist();
+	  console.log(Datalists)
+	Datalists.data.forEach(id => {  
+	  treeData.value.push({  
+		label: id,
+	  });  
+	}); 
+	} catch (error) {
+	  console.error(error);
+	}
+  };
+  Datalistdata();
+  
+  //点击左侧树形获取编号
+  const handleNodeClick = async (node) => {
+	  ystableData.splice(0, ystableData.length);
+	  parttableData.splice(0, parttableData.length);
+	  gytableData.splice(0, gytableData.length);
+	  ddtableData.splice(0, ddtableData.length);
+	  jstableData.splice(0, jstableData.length);
+	  fhdtableData.splice(0, fhdtableData.length);
+	  // 取消所有节点的颜色
+	  const allNodes = document.querySelectorAll('.treecolor .el-tree-node');
+		  allNodes.forEach(node => {
+		  node.querySelector('.el-tree-node__label').style.color = '';
+	  });
+	  // 获取点击的节点 给当前点击的节点改变颜色【红色】
+	  const clickedNodeId = node['$treeNodeId'];
+	  const clickedNode = document.querySelector(`.treecolor .el-tree-node[data-key="${clickedNodeId}"]`);
+	  if (clickedNode) {
+		  clickedNode.querySelector('.el-tree-node__label').style.color = 'red';
+	  }
+	  ystableData.length = 0
+	  searchInfo.value = '';
+	  _Gd_khdh.value = node.label.split('【')[0];
+	  _WorkList_page();
+  };
+  
+	const InvoiceVisible = ref(false)
+	const InvoicetableData = ref([])
+	const _mesval = ref('')
+
+	const fahuodan = async(row)=>{
+		
+	 const Read_Filelist = await Read_File({
+	     UniqId: row['UniqId'],
+	     order: row['关联编号'],
+	     url: path
+	 })
+	 if(Read_Filelist.code === 0){
+		 console.log(Read_Filelist)
+		 InvoiceVisible.value = true
+		 const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
+		 sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
+		 InvoicetableData.value = Read_Filelist.data
+		 _mesval.value = Read_Filelist.msg
+		 console.log(_mesval)
+	 }
+	}
+	//取消
+	const InvoiceDialog = () => {
+		InvoiceVisible.value = false
+	}
+	
+	const InvoiceenterDialog = async() => {
+		console.log(InvoicetableData.value)
+		// InvoiceVisible.value = false
+		
+		const rawValueArray = InvoicetableData.value;
+		const formattedData = rawValueArray
+		.map(item => {
+				return {
+				  sys_id: _username.value,
+				  订单编号: item.订单编号,
+				  子订单编号: item.子订单编号,
+				  尺码: item.尺码,
+				  制单数量: item.制单数量,
+				  发货数量: item.发货数量,
+				  发货箱数: item.发货箱数,
+				  每箱件数: item.每箱件数
+				}
+		});
+		console.log(formattedData);
+		const Read_Addres = await Read_Add(formattedData)
+		console.log(Read_Addres)
+		if(Read_Addres.msg === '成功'){
+			ElMessage({type: 'success',message: '处理成功'})
+			InvoiceVisible.value = false
+		}
+	}
+
+	
+  // 删除
+  const deleteItem = async (row) => {
+	console.log(_username.value.split('/')[1])
+	console.log(row.sys_id.split('/')[1])
+
+	const delfujian_del = await delfujian({UniqId:row['UniqId'],登录用户:_username.value.split('/')[1],建档用户:row.sys_id.split('/')[1]});
+	if(delfujian_del.code === 0){
+		ElMessage({type: 'success',message: '删除成功'})
+	}else{
+		ElMessage({type: 'error',message: '删除失败'})
+	}
+	tableRowClick (row)
+  }
+  
+  const showPdf = async (row) => {
+	  luckyexcelPageRef.value.open(row)
+  };
+  //调用订单资料列表
+  const _WorkList_page = async () => {
+	  console.log("page",page.value)
+	  console.log("pageSize",pageSize.value)
+	try {
+	  //通过客户编号获取
+	  const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
+	  tableData.value = WorkListdata.data.data
+	  total.value = WorkListdata.data.total
+	} catch (error) {
+	  console.error(error);
+	}
+  };
+  
+  //调用订单资料列表
+  const page_WorkList_page = async () => {
+	  console.log("page",page.value)
+	  console.log("pageSize",pageSize.value)
+	try {
+	  //通过客户编号获取
+	  const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
+	  tableData.value = WorkListdata.data.data
+	  total.value = WorkListdata.data.total
+	} catch (error) {
+	  console.error(error);
+	}
+  };
+  
+  //============订单资料============
+  //订单资料修改
+  const ddzl_dialogFormVisible = ref(false)
+  const edit_ddformData = ref({
+	   合并: false,
+  })
+  // 双击订单表格
+  const updateCompanyFunc = async (row) => {
+	  await getProductStyleData();
+	  if (row.water === '1') {
+		  edit_ddformData.value = { 合并: true };
+	  } else {
+		  edit_ddformData.value = { 合并: false };
+	  }
+	  Object.assign(edit_ddformData.value, row);
+	  ddzl_dialogFormVisible.value = true;
+	  await nextTick();
+	  syncUploadFileList(edit_ddformData.value.img);
+  }
+  
+  // Sys_id 形如「账号/角色」,安全取「/」后一段,避免空值或格式异常导致白屏
+  const getSysIdPart = (sysId) => {
+	  const parts = String(sysId ?? '').split('/')
+	  return parts.length > 1 ? parts[1] : ''
+  }
+
+  //订单资料修改确认
+  const dd_edit_Dialog = async () => {
+	  const orderSysPart = getSysIdPart(edit_ddformData.value?.Sys_id)
+	  const userSysPart = getSysIdPart(_username.value)
+	  if (orderSysPart !== userSysPart && userSysPart !== '超级管理员') {
+		  return ElMessage({ type: 'error', message: '无法修改其他用户订单数据' })
+	  }
+	  //日期转换
+	  let lhrq_formattedDeliveryDate = '';
+	  if (edit_ddformData.value.落货日期) {
+		  const date = new Date(edit_ddformData.value.落货日期);
+		  lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
+	  }
+	  let params = {};
+	  params.订单编号 = edit_ddformData.value.订单编号
+	  params.生产款号 = edit_ddformData.value.生产款号
+	  params.客户编号 = edit_ddformData.value.客户编号
+	  params.款式 = edit_ddformData.value.款式
+	  params.箱唛要求 = edit_ddformData.value.箱唛要求
+	  params.面料 = edit_ddformData.value.面料
+	  params.要求 = edit_ddformData.value.要求
+	  params.船样描述 = edit_ddformData.value.船样描述
+	  params.船样合计 = edit_ddformData.value.船样合计
+	  params.粘衬 = edit_ddformData.value.粘衬
+	  params.订单数量 = edit_ddformData.value.订单数量
+	  params.单位 = edit_ddformData.value.单位
+	  params.接单日期 = edit_ddformData.value.接单日期
+	  params.落货日期 = lhrq_formattedDeliveryDate
+	  params.Sys_id = edit_ddformData.value.Sys_id
+	  params.id = edit_ddformData.value.Uniqid
+	  params.img = edit_ddformData.value.img
+	  console.log(params)
+	  try {
+		  const WorkOrderEdit_list = await WorkOrderEdit(params);
+		  if (WorkOrderEdit_list.code === 0) {
+			  ddzl_dialogFormVisible.value = false;
+			  _WorkList_page()
+			  ElMessage({ type: 'success', message: '修改成功' })
+		  } else {
+			  ElMessage({ type: 'error', message: WorkOrderEdit_list.msg || WorkOrderEdit_list.message || '修改失败' })
+		  }
+	  } catch (error) {
+		  console.error(error);
+		  const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '修改失败,请重试'
+		  ElMessage({ type: 'error', message: msg })
+	  }
+  }
+  
+  //订单资料修改取消
+  const dd_closeDialog = async () => {
+	ddzl_dialogFormVisible.value = false;
+	syncUploadFileList('');
+  }
+  
+  
+  //=============颜色资料============
+  //颜色资料修改
+  const dialogFormVisible = ref(false)
+  //尺码
+  const edit_cmformdata = reactive({
+	cm1:'',
+	cm2:'',
+	cm3:'',
+	cm4:'',
+	cm5:'',
+	cm6:'',
+	cm7:'',
+	cm8:'',
+	cm9:'',
+	cm10:'',
+	cm11:'',
+	cm12:'',
+	cm13:'',
+	cm14:'',
+	sctotal:'总计',
+  });
+  //制单数
+  const edit_zdsformdata = reactive({
+	zds1:'',
+	zds2:'',
+	zds3:'',
+	zds4:'',
+	zds5:'',
+	zds6:'',
+	zds7:'',
+	zds8:'',
+	zds9:'',
+	zds10:'',
+	zds11:'',
+	zds12:'',
+	zds13:'',
+	zds14:'',
+	zdtotal:'',
+  });
+  const Uniqid = ref('')//颜色资料Uniqid
+  
+  
+  
+  //颜色资料表格双击
+  const ysupdateCompanyFunc = async (row) => {
+	  dialogFormVisible.value = true;
+	  edit_formData.value = { ...row };
+	  console.log(row)
+	  edit_formData['子订单编号'] = row['子订单编号']
+	  edit_formData['颜色备注'] = row['颜色备注']
+	  edit_formData['款号'] = row['款号']
+	  edit_formData['船样'] = row['船样']
+	  edit_formData['颜色'] = row['颜色']
+	  edit_colorcode.value =row['color_id']
+	  Uniqid.value = row['Uniqid']
+	  //获取色系名称列表
+	  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
+	  getSuborderscolor.colorlist = getSuborders.data.colorlist;
+	  let index = 1;  
+	  // 创建一个函数来构建尺码和数量的映射  
+	  function buildSizeQuantitiesMap(sizes, formData) {  
+		  const sizeQuantitiesMap = {};  
+		  sizes.forEach(size => {  
+			  // 使用逻辑或操作符确保所有尺码都有数量(默认为0,但如果有值则使用那个值)  
+			  const quantity = formData[size] || 0;  
+			  sizeQuantitiesMap[size] = quantity;  
+		  });  
+		  return sizeQuantitiesMap;  
+	  }  
+	  // 使用函数构建映射  
+	  let sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);  
+	  let edit_params = {};
+	  for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {  
+		  edit_params[`cm${index}`] = size;  
+		  edit_params[`cmsl${index++}`] = quantity;  
+	  }  
+	  for (let i = 1; i <= 14; i++) {
+		  edit_cmformdata[`cm${i}`] = edit_params[`cm${i}`] || '';
+		  edit_zdsformdata[`zds${i}`] = (edit_params[`cmsl${i}`] === 0 || edit_params[`cmsl${i}`] === null) ? '' : edit_params[`cmsl${i}`];
+	  }
+	  //计算尺码数量总数合计
+	  updateTotal()
+  };
+  
+  //自动计算制单数总计(仅数字,自动去掉空格及其他字符)
+  function updateTotal() {  
+	const relevantKeys = ['zds1', 'zds2', 'zds3', 'zds4', 'zds5', 'zds6', 'zds7', 'zds8', 'zds9', 'zds10', 'zds11', 'zds12', 'zds13', 'zds14'];
+	relevantKeys.forEach((key) => {
+	  zdsformdata[key] = String(zdsformdata[key] ?? '').replace(/[^\d]/g, '')
+	  edit_zdsformdata[key] = String(edit_zdsformdata[key] ?? '').replace(/[^\d]/g, '')
+	})
+	const values = relevantKeys.map(key => parseInt(zdsformdata[key], 10) || 0);
+	zdsformdata.zdtotal = values.reduce((sum, value) => sum + value, 0);
+	const valuess = relevantKeys.map(key => parseInt(edit_zdsformdata[key], 10) || 0);
+	edit_zdsformdata.zdtotal = valuess.reduce((sum, value) => sum + value, 0);
+  }  
+  
+  //点击是否船样 改变子订单编号
+  const edit_cyChange = async (value) => {
+	if (value === '是') {
+		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:edit_formData['颜色']});
+		  edit_formData['子订单编号'] = getSuborders.data;
+	  }else if(value === '否'){
+		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
+		  edit_formData['子订单编号'] = getSuborders.data.order;
+	}
+  };
+  
+  //修改颜色资料确认
+  const ys_edit_Dialog = async () => {
+	  updateTotal()
+	  if (!edit_formData.value) return;
+	  
+	  //获取颜色编号id
+	  const getPonumberdata = await getSuborder({colorname:edit_formData['颜色'],order:_ddhval.value,cy:edit_formData['船样']});
+	  // 从返回中提取 colorlist
+	  const colorlist = getPonumberdata.data.colorlist || [];
+	  // 获取匹配的颜色项
+	  const match = colorlist.find(item => item.colorname === edit_formData['颜色']);
+	  if (match) {
+	    edit_colorcode.value = match.colorcode;
+	  } else {
+	    console.warn('未找到匹配的颜色');
+	  }
+	  
+	  function buildSizeQuantitiesMap(sizes, formData) {  
+		  const sizeQuantitiesMap = {};  
+		  sizes.forEach(size => {  
+			// 使用逻辑或操作符确保所有尺码的数量  
+			const quantity = formData[size] || 0; 
+			sizeQuantitiesMap[size] = quantity;  
+		  });  
+		  return sizeQuantitiesMap;  
+	  }  
+	
+	// 使用函数构建映射  
+	const sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);  
+	let index = 1;  
+	const params = {  
+	  订单编号: edit_formData.value.订单编号,  
+	  子订单编号: edit_formData.子订单编号,  
+	  款号: edit_formData.款号,  
+	  颜色备注: edit_formData.颜色备注,
+	  船样: edit_formData.船样 === '是' ? '1' : '0', // 转换船样字段  
+	  颜色: edit_formData.颜色,  
+	  color_id:edit_colorcode.value,
+	  zdtotal: edit_zdsformdata.zdtotal,  
+	  Sys_id: edit_formData.value.Sys_id,  
+	  id: Uniqid.value,  
+	};  
+	for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {  
+	  params[`cm${index}`] = size;  
+	   const cmslValue = +edit_zdsformdata[`zds${index}`]; // 获取对应的数量
+	   params[`cmsl${index++}`] = cmslValue === 0 ? "" : cmslValue; // 如果为0,赋值为空字符串 
+	}  
+	console.log(params)
+	//颜色资料修改接口
+	const PrintDataEdit_list = await PrintDataEdit(params);
+	if(PrintDataEdit_list.code === 0){
+		dialogFormVisible.value = false;
+	  ElMessage({type: 'success',message: '修改成功'})
+	  //数据列表显示
+	  const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
+	  const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
+	  const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
+	  //颜色资料
+	  if(PrintListDatas.data.列表.length === 0 ){
+		ystableData.length = 0
+	  }else{
+		sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//型号数据
+		ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
+		// 使用 map 方法创建一个新数组,并转换船样字段  
+		const newData = PrintListDatas.data.列表.map(item => ({  
+			...item,  
+			船样: item.船样 === 1 ? '是' : '否'  
+		}));  
+		// 将新数组赋值给 ystableData,这会触发视图更新,清空旧数据(可选,如果不需要保留旧数据的话)  
+		ystableData.length = 0;  
+		ystableData.push(...newData);
+	  }
+	  tableRowClick(params)
+	}else{
+	  ElMessage({type: 'error',message: '修改失败'})
+	}
+  };
+  
+  //颜色资料修改取消
+  const ys_edit_closeDialog = async (row) => {
+	  dialogFormVisible.value = false;
+  };
+  
+  const mlinventoryVisible = ref(false)
+  const historytableData = ref([])
+  // //双击面料库存
+  // const mlupdateCompanyFunc = async (row) => {
+  //   mlinventoryVisible.value = true;
+  // }
+  
+  //库存测试
+  const CSclick = async (row) => {
+	mlinventoryVisible.value = true;
+  }
+  
+  //技术附件弹窗取消
+  const mlcloseDialog = () => {
+	mlinventoryVisible.value = false
+  }
+  // 分页
+  const page = ref(1)
+  const total = ref(0)
+  const pageSize = ref(50)
+  const handleCurrentChange = (val) => {
+	page.value = val;
+	_WorkList_page();
+  };
+  
+  // 修改页面容量 点击多少条/页
+  const handleSizeChange = (val) => {
+	pageSize.value = val;
+	_WorkList_page();
+  };
+  
+  // 款式列表数据
+  const productStyleList = ref([]);
+  
+  // 获取款式列表
+  const getProductStyleData = async () => {
+	try {
+	  const result = await getProductStyleList();
+	  if (result.code === 0) {
+		productStyleList.value = result.data;
+	  } else {
+		ElMessage.error('获取款式列表失败');
+	  }
+	} catch (error) {
+	  console.error('获取款式列表出错:', error);
+	  ElMessage.error('获取款式列表失败');
+	}
+  };
+  
+  // =========== 新增订单资料 ===========
+  const add_gdscgdformData = reactive({
+	订单编号: '',
+	生产款号: '',
+	款式: '',
+	客户编号: '',
+	落货日期: '',
+	箱唛要求: '',
+	面料: '',
+	要求: '',
+	船样描述: '',
+	船样合计: '',
+	粘衬: '',
+	订单数量: '',
+	单位: '件',
+	Sys_id: '',
+	制单日期: '',
+	审核日期: '',
+	合并: false,
+  });
+  
+  
+  const add_gddialogFormVisible = ref(false)
+  //点击新增订单资料按钮
+  const addgd_onclick = async () => {
+
+	console.log("用户信息", _username.value);
+	// 判断客户代号是否为空
+	if (!_Gd_khdh.value) {
+	  ElMessage({ type: 'warning', message: '请选择具体的客户后,再操作此功能' });
+	  return false;
+	}
+	  syncUploadFileList('');
+	  add_gdscgdformData.img = '';
+	  add_gddialogFormVisible.value = true;
+	  zsglddtableData.value = [];
+	  await getProductStyleData();
+	  //获取订单编号接口
+	  const getWorkOrder_list = await getWorkOrder();
+	  add_gdscgdformData['订单编号'] = getWorkOrder_list.data;
+	  add_gdscgdformData['客户编号'] = _Gd_khdh.value
+	  add_gdscgdformData['Sys_id'] = _username.value 
+	  add_gdscgdformData['制单日期'] = currentDates
+  }
+  
+  //操作移除按钮
+  const deleteRow = (index) => {
+	  //当前点击索引值
+	  console.log(index)
+	  console.log(zsglddtableData)
+	  //移除当前行
+	  zsglddtableData.value.splice(index, 1);
+  }
+  const fullscreenLoading = ref(false); // 控制全屏加载
+  const isClickable = ref(true); // 控制按钮是否可点击
+
+  const resetAddOrderForm = () => {
+	Object.assign(add_gdscgdformData, {
+	  订单编号: '',
+	  生产款号: '',
+	  款式: '',
+	  客户编号: '',
+	  落货日期: '',
+	  箱唛要求: '',
+	  面料: '',
+	  要求: '',
+	  备注: '',
+	  船样描述: '',
+	  船样合计: '',
+	  粘衬: '',
+	  订单数量: '',
+	  单位: '件',
+	  Sys_id: '',
+	  制单日期: '',
+	  审核日期: '',
+	  合并: false,
+	  img: '',
+	});
+	zsglddtableData.value = [];
+	syncUploadFileList('');
+  };
+
+  //新增工单资料确定
+  const add_gdenterDialog = async () => {
+	if (!isClickable.value) return;
+
+	// 先校验,通过后再 Loading,避免未填完就全屏卡住
+	const fields = [
+	  { key: '款式', message: '款式不能为空' },
+	  { key: '订单编号', message: '网络异常, 请重新打开' },
+	  { key: '客户编号', message: '网络异常, 请重新打开' },
+	  { key: '落货日期', message: '落货日期不能为空' },
+	  { key: '订单数量', message: '订单数量不能为空' },
+	  { key: '面料', message: '缺少面料信息,无法完成提交,请提供面料数据以便获取BOM资料数据' },
+	];
+	for (const field of fields) {
+	  if (!add_gdscgdformData[field.key]) {
+		ElMessage({ type: 'warning', message: field.message });
+		return;
+	  }
+	}
+	if (!add_gdscgdformData['制单日期']) {
+	  ElMessage({ type: 'warning', message: '制单日期不能为空' });
+	  return;
+	}
+
+	isClickable.value = false;
+	const loadingInstance = ElLoading.service({
+	  lock: true,
+	  text: '正在自动获取生成BOM面料资料,请稍候...',
+	  background: 'rgba(0, 0, 0, 0.8)',
+	  spinner: 'el-icon-loading',
+	});
+
+	try {
+	  let lhrq_formattedDeliveryDate = '';
+	  if (add_gdscgdformData['落货日期']) {
+		const date = new Date(add_gdscgdformData['落货日期']);
+		lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
+	  }
+
+	  const ids = zsglddtableData.value.map(item => item.UNIQID);
+	  const dds = zsglddtableData.value.map(item => item.订单编号);
+	  const uniqueIds = [...new Set(ids)];
+	  const uniqueDds = [...new Set(dds)];
+	  const formattedIds = uniqueIds.join(',');
+	  const formattedDds = uniqueDds.join(',');
+
+	  console.log('关联订单编号:', formattedDds);
+	  console.log('关联订单UNIQID:', formattedIds);
+
+	  const formattedData = {
+		订单编号: add_gdscgdformData['订单编号'],
+		生产款号: add_gdscgdformData['生产款号'],
+		款式: add_gdscgdformData['款式'],
+		客户编号: add_gdscgdformData['客户编号'],
+		落货日期: lhrq_formattedDeliveryDate,
+		箱唛要求: add_gdscgdformData['箱唛要求'],
+		面料: add_gdscgdformData['面料'],
+		要求: add_gdscgdformData['备注'],
+		船样描述: add_gdscgdformData['船样描述'],
+		船样合计: add_gdscgdformData['船样合计'],
+		粘衬: add_gdscgdformData['粘衬'],
+		订单数量: add_gdscgdformData['订单数量'],
+		单位: add_gdscgdformData['单位'],
+		Sys_id: _username.value,
+		接单日期: currentDates,
+		img: add_gdscgdformData.img,
+		关联订单: formattedDds,
+		关联面料ID: formattedIds,
+	  };
+
+	  console.log(formattedData);
+
+	  const edit_gdformdata_list = await WorkOrderAdd(formattedData);
+	  if (edit_gdformdata_list.code === 0) {
+		resetAddOrderForm();
+		add_gddialogFormVisible.value = false;
+		ElMessage({ type: 'success', message: '新增成功' });
+		const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: 1, limit: 50 });
+		tableData.value = WorkListdata.data.data;
+	  } else {
+		ElMessage({ type: 'error', message: edit_gdformdata_list.msg || edit_gdformdata_list.message || '新增失败' });
+	  }
+	} catch (error) {
+	  console.error('Error:', error);
+	  const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '操作失败,请重试'
+	  ElMessage({ type: 'error', message: msg });
+	} finally {
+	  isClickable.value = true;
+	  loadingInstance.close();
+	}
+  };
+  //新增工单资料取消 / 关闭
+  const add_gdcloseDialog = (done) => {
+	resetAddOrderForm();
+	add_gddialogFormVisible.value = false;
+	if (typeof done === 'function') done();
+  }
+  
+  
+  
+  // =========== 关联订单资料 ===========
+  const Related_fabricsVisible = ref(false)
+  const glddzl_keyword = ref('')
+  const glddtableData = reactive([])
+  // 关联订单面料按钮
+  const Related_fabrics = () => {
+	  Related_fabricsVisible.value = true
+	  // glddtableData.splice(0, glddtableData.length);//清空表格
+	  ddsearchHandle()
+  }
+  
+  //实时触发input
+  const real_handleInput = async ()=>{
+	  glddtableData.splice(0, glddtableData.length);//清空表格
+	  ddsearchHandle()
+  }
+  
+  // 关联订单面料搜索
+  const ddsearchHandle = async (v) => {
+	  console.log(v)
+	  glddtableData.splice(0, glddtableData.length);//清空表格
+
+	  //搜索面料库存数据列表接口
+	  const response = await fabricList({order:v});
+	if (response.data && response.data.length === 0) {
+	  ElMessage({type: 'warning',message: '未查询到搜索条件'})
+	}else{
+	   // 确保 response.data 和 response.data.table 存在
+	   if (response?.data?.table) {
+		glddtableData.value = response.data.table.map(item => ({
+		  ...item,
+		  checked: false, // 初始化时默认未勾选
+		}));
+		glddtableData.splice(0, response.data.table.total, ...response.data.table);
+	   } else {
+		console.error("response.data.table 不存在或为空:", response.data);
+	  }
+	}
+  }
+  
+  const gldd_Selection = ref('') // 存储选中Uniqid
+  const gldd_Selection_ddbh = ref('') // 存储选中订单编号
+  const zsglddtableData = ref([]) // 存储最终选择的订单数据
+  const currentSelectedRows = ref([]) // 新增:存储当前选中的行数据
+  
+  const glddSelectionChange = (selection) => {
+    console.log("当前选中的数据:", selection)
+    currentSelectedRows.value = selection // 存储当前选中的行数据
+    // 更新 glddtableData 中每一行的 checked 状态
+    glddtableData.value = glddtableData.value.map(item => {
+      return {
+        ...item,
+        checked: selection.some(selectedItem => selectedItem.UNIQID === item.UNIQID)
+      }
+    })
+  }
+  
+  // 关联订单取消
+  const Related_fabricscloseDialog = () => {
+    gldd_Selection.value = ''
+    Related_fabricsVisible.value = false
+  }
+  
+  // 关联订单确定
+  const Related_fabricsenterDialog = () => {
+    if (currentSelectedRows.value.length === 0) {
+      ElMessage.warning('请至少选择一条数据')
+      return
+    }
+    
+    console.log("确定选择的数据:", currentSelectedRows.value)
+    
+    // 将选中的数据添加到 zsglddtableData
+    zsglddtableData.value = [...zsglddtableData.value, ...currentSelectedRows.value]
+    
+    // 提取UNIQID和订单编号
+    gldd_Selection.value = currentSelectedRows.value.map(item => item.UNIQID).join(',')
+    gldd_Selection_ddbh.value = currentSelectedRows.value.map(item => item.订单编号).join(',')
+    
+    // 关闭弹窗
+    Related_fabricsVisible.value = false
+  }
+  
+  
+  // =========== 新增颜色资料 ===========
+  const add_gdyjdialogFormVisible = ref(false)
+  const add_yszlformdata = reactive({
+	ddh: '',
+	ddzbh: '',
+	sxmc: '',
+	cmgg: '',
+	sfcy: '',
+	ysbz: '',
+  });
+  const cmformdata = reactive({
+	cm1:'32',
+	cm2:'34',
+	cm3:'36',
+	cm4:'38',
+	cm5:'40',
+	cm6:'42',
+	cm7:'44',
+	cm8:'46',
+	cm9:'48',
+	cm10:'',
+	cm11:'',
+	cm12:'',
+	cm13:'',
+	cm14:'',
+	sctotal:'总计',
+  });
+  const zdsformdata = reactive({
+	zds1:'',
+	zds2:'',
+	zds3:'',
+	zds4:'',
+	zds5:'',
+	zds6:'',
+	zds7:'',
+	zds8:'',
+	zds9:'',
+	zds10:'',
+	zds11:'',
+	zds12:'',
+	zds13:'',
+	zds14:'',
+	zdtotal:'',
+  });
+  //记录色系编号
+  const add_colorcode = ref('')
+  
+  //选择色系名称获取子订单编号
+  const xz_sxhandleSizeChange =  async  (value,color_id) => {
+	  
+	  //获取子订单编号
+	  const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:add_yszlformdata.sfcy});
+	  console.log("获取子订单编号",getPonumberdata)
+	  add_yszlformdata.ddzbh = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
+	  
+	if (value === '红色系') {
+	  add_yszlformdata.sxmc = value
+	  add_colorcode.value = color_id
+	} else if(value === '黄色系'){
+	 add_yszlformdata.sxmc = value
+	 add_colorcode.value = color_id
+	}else if(value === '蓝色系'){
+	add_yszlformdata.sxmc = value
+	add_colorcode.value = color_id
+	}else if(value === '绿色系'){
+	 add_yszlformdata.sxmc = value
+	 add_colorcode.value = color_id
+	}else if(value === '紫色系'){
+	 add_yszlformdata.sxmc = value
+	 add_colorcode.value = color_id
+	}else if(value === '灰色系'){
+   add_yszlformdata.sxmc = value
+   add_colorcode.value = color_id
+	}else if(value === '咖啡色系'){
+	add_yszlformdata.sxmc = value
+	  add_colorcode.value = color_id
+	}else if(value === '黑色系'){
+	add_yszlformdata.sxmc = value
+	  add_colorcode.value = color_id
+	}else if(value === '经典色系'){
+	add_yszlformdata.sxmc = value
+	  add_colorcode.value = color_id
+	}else if(value === '白色系'){
+	add_yszlformdata.sxmc = value
+	  add_colorcode.value = color_id
+	}
+  };
+  
+  const edit_formData = reactive({
+	'颜色': ''
+  });
+  
+  //记录色系编号
+  const edit_colorcode = ref('')
+  const xg_sxhandleSizeChange =  async (value,color_id) => {
+	  
+	  const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:edit_formData['船样']});
+	  console.log(edit_formData.value)	
+	  if(edit_formData.value['颜色'] === edit_formData['颜色']){
+		  edit_formData['子订单编号'] = edit_formData.value['子订单编号']
+	  }else{
+		  edit_formData['子订单编号'] = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
+	  }
+	if (value === '红色系') {
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	} else if(value === '黄色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '蓝色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '绿色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '紫色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '灰色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '咖啡色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '黑色系'){
+	edit_formData['颜色'] = value
+	  edit_colorcode.value = color_id
+	}else if(value === '经典色系'){
+	edit_formData['颜色'] = value
+	}else if(value === '白色系'){
+	edit_formData['颜色'] = value
+	}
+  };
+  
+  //清空对象的属性值
+  const gdyj_clearFormData = () => {
+	Object.keys(zdsformdata).forEach(key => {
+	  zdsformdata[key] = '';
+	});
+  };
+  
+  
+  //点击是否船样 改变子订单编号
+  const cyChange = async (value) => {
+	if (value === '是') {
+		  add_yszlformdata.ddzbh = _Gd_gdbh.value + '-99'
+		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:add_yszlformdata['sxmc']});
+		  add_yszlformdata['ddzbh'] = getSuborders.data;
+	  }else if(value === '否'){
+		  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:add_yszlformdata['sxmc']});
+		  add_yszlformdata['ddzbh'] = getSuborders.data.order;
+	}
+  };
+  
+  const getSuborderscolor = reactive({
+		colorlist: []
+  });
+	  
+  //新增颜色资料按钮
+  const addgdyj_onclick = async  () => {
+	if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
+	  ElMessage({type: 'warning',message: '请选择具体的订单后,再操作此功能'})
+	  return false;
+	}else{
+	  add_gdyjdialogFormVisible.value = true
+	  add_yszlformdata['sxmc'] = '红色系';
+	  const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:'红色系'});
+	  console.log(getSuborders)
+	  
+	  
+	  getSuborderscolor.colorlist = getSuborders.data.colorlist;
+			  
+	  add_yszlformdata['ddzbh'] = getSuborders.data.order;
+	  // 假设获取的数据是 getSuborders.data
+	  if (getSuborders.data.cm) {
+		// 判断并赋值
+		cmformdata.cm1 = getSuborders.data.cm.cm1 || '';
+		cmformdata.cm2 = getSuborders.data.cm.cm2 || '';
+		cmformdata.cm3 = getSuborders.data.cm.cm3 || '';
+		cmformdata.cm4 = getSuborders.data.cm.cm4 || '';
+		cmformdata.cm5 = getSuborders.data.cm.cm5 || '';
+		cmformdata.cm6 = getSuborders.data.cm.cm6 || '';
+		cmformdata.cm7 = getSuborders.data.cm.cm7 || '';
+		cmformdata.cm8 = getSuborders.data.cm.cm8 || '';
+		cmformdata.cm9 = getSuborders.data.cm.cm9 || '';
+		cmformdata.cm10 = getSuborders.data.cm.cm10 || '';
+		cmformdata.cm11 = getSuborders.data.cm.cm11 || '';
+		cmformdata.cm12 = getSuborders.data.cm.cm12 || '';
+		cmformdata.cm13 = getSuborders.data.cm.cm13 || '';
+		cmformdata.cm14 = getSuborders.data.cm.cm14 || '';
+		cmformdata.sctotal = '合计';
+	  }
+  
+	  add_yszlformdata['ddh'] = _Gd_gdbh.value;
+	  add_yszlformdata['ys'] = '';
+	  add_yszlformdata['kh'] = '';
+	  add_yszlformdata['sfcy'] = '否';
+	  add_yszlformdata['颜色备注'] = '否';
+	  add_yszlformdata['kdy'] = _username.value;
+	  gdyj_clearFormData();
+	}
+  }
+  
+  
+  
+  const child_order = ref('')
+  //单机颜色资料表格
+  const ystableclick =  async  (row) => {
+	  // console.log(row.子订单编号)
+	  // child_order.value = row.子订单编号
+  }
+
+  //部件资料行点击
+  const partTableRowClick = async (row) => {
+	  // console.log(row.部件编号)
+  }
+
+  //部件资料行双击
+  const partRowDblclick = async (row) => {
+	  // console.log(row.部件编号)
+  }
+  
+//限制尺码输入规则
+function handleSizeInput(field) {
+  // 获取当前字段的值
+  let value = cmformdata[field];
+  // 使用正则表达式过滤,只保留字母和数字,并将字母转换为大写
+  const filteredValue = value.replace(/[^a-zA-Z0-9]/g, '').replace(/[a-z]/g, (match) => match.toUpperCase());
+  // 更新字段值
+  cmformdata[field] = filteredValue; // 直接更新 reactive 对象的属性
+}
+
+
+function Input_handle() {
+  add_gdscgdformData['订单数量'] = add_gdscgdformData['订单数量'].replace(/[^\d]/g, '')
+  add_gdscgdformData['船样合计'] = add_gdscgdformData['船样合计'].replace(/[^\d]/g, '')
+  
+  edit_ddformData.value['订单数量'] = String(edit_ddformData.value['订单数量'] ?? '').replace(/[^\d]/g, '')
+  edit_ddformData.value['船样合计'] = String(edit_ddformData.value['船样合计'] ?? '').replace(/[^\d]/g, '')
+}
+
+
+  //新增颜色资料确定
+  const add_gdyjenterDialog =  async  () => {
+	  updateTotal()
+	  //必填
+	  if(add_yszlformdata['kh'] === ''){
+		  ElMessage({type: 'warning',message: '款号不能为空'})
+		  return false;
+	  }
+	  if(add_yszlformdata['ysbz'] === ''){
+		  ElMessage({type: 'warning',message: '颜色备注不能为空'})
+		  return false;
+	  }
+	  if(add_yszlformdata['sxmc'] === ''){
+		  ElMessage({type: 'warning',message: '色系名称不能为空'})
+		  return false;
+	  }
+  
+	  let cy = '';
+	  if(add_yszlformdata['sfcy'] === '是'){
+		  cy = '1'
+	  }else if(add_yszlformdata['sfcy'] === '否'){
+		  cy = '0'
+	  }
+	  
+	  
+	  //获取颜色编号id
+	  const getPonumberdata = await getSuborder({colorname:add_yszlformdata['sxmc'],order:_ddhval.value,cy:add_yszlformdata['sfcy']});
+	  // 从返回中提取 colorlist
+	  const colorlist = getPonumberdata.data.colorlist || [];
+	  // 获取匹配的颜色项
+	  const match = colorlist.find(item => item.colorname === add_yszlformdata['sxmc']);
+	  if (match) {
+	  		add_colorcode.value = match.colorcode;
+	  } else {
+	  		console.warn('未找到匹配的颜色');
+	  }
+	  
+	const addyszltable = {
+	  订单编号: add_yszlformdata['ddh'],
+	  子订单编号: add_yszlformdata['ddzbh'],
+	  颜色: add_yszlformdata['sxmc'],
+	  款号: add_yszlformdata['kh'],
+	  颜色备注:add_yszlformdata.ysbz,
+	  船样: cy,
+	  Sys_id:add_yszlformdata['kdy'],
+	  color_id:add_colorcode.value,
+	  //尺码
+	  cm1: cmformdata['cm1'],
+	  cm2: cmformdata['cm2'],
+	  cm3: cmformdata['cm3'],
+	  cm4: cmformdata['cm4'],
+	  cm5: cmformdata['cm5'],
+	  cm6: cmformdata['cm6'],
+	  cm7: cmformdata['cm7'],
+	  cm8: cmformdata['cm8'],
+	  cm9: cmformdata['cm9'],
+	  cm10: cmformdata['cm10'],
+	  cm11: cmformdata['cm11'],
+	  cm12: cmformdata['cm12'],
+	  cm13: cmformdata['cm13'],
+	  cm14: cmformdata['cm14'],
+	  sctotal: cmformdata['sctotal'],
+	  //尺码数量
+	  cmsl1: zdsformdata['zds1'],
+	  cmsl2: zdsformdata['zds2'],
+	  cmsl3: zdsformdata['zds3'],
+	  cmsl4: zdsformdata['zds4'],
+	  cmsl5: zdsformdata['zds5'],
+	  cmsl6: zdsformdata['zds6'],
+	  cmsl7: zdsformdata['zds7'],
+	  cmsl8: zdsformdata['zds8'],
+	  cmsl9: zdsformdata['zds9'],
+	  cmsl10: zdsformdata['zds10'],
+	  cmsl11: zdsformdata['zds11'],
+	  cmsl12: zdsformdata['zds12'],
+	  cmsl13: zdsformdata['zds13'],
+	  cmsl14: zdsformdata['zds14'],
+	  zdtotal: zdsformdata['zdtotal'],
+	  };
+	  console.log(addyszltable)
+	  // return;
+	const printDetailAdds = await printDetailAdd(addyszltable);
+	if (printDetailAdds.code === 0) {
+		  add_gdyjdialogFormVisible.value = false;
+		  ElMessage({type: 'success',message: '新增成功'})
+	}
+	const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
+	  if(PrintListDatas.data.列表.length === 0){
+		  ystableData.length = 0
+	  }else{
+		  sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
+		  ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);
+		  
+		  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
+		  bomtableData.value = orderBomListdata.data
+		  bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
+		  
+		  const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
+		  console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
+		  
+		  if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
+			  // 如果 data.table 是数组且不为空,更新表格数据
+			  mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
+		  } else {
+			  // 如果 data.table 为空或无效,清空表格数据
+			  mltableData.splice(0, mltableData.length);
+		  }
+	  }
+	
+  }  
+  
+  
+	
+  
+  //新增颜色资料取消
+  const add_dyjcloseDialog = () => {
+	add_gdyjdialogFormVisible.value = false
+  }
+  //键盘input框跳转
+  const add_gdzlent = async (event,id1,id2,id3,idx) => {
+	if(event.keyCode === 40){
+	  if(id3!=''){
+		document.getElementById(id3).focus()
+	  }
+	}else if (event.keyCode === 13) { // Enter 或向下箭头
+	  if(id3!=''){
+		document.getElementById(id3).focus()
+	  }
+	} else if (event.keyCode === 38) { // 向上箭头
+	  if(id1!=''){
+		document.getElementById(id1).focus()
+	  }
+	}else if (event.keyCode === 8) { // 删除箭头
+	  if(id1!='' && document.getElementById(id2).value==''){
+		document.getElementById(id1).focus()
+	  }
+	}else if (event.keyCode === 37) { // 向左箭头
+	  if(id1!='' && document.getElementById(id2).selectionStart==0){
+		document.getElementById(id1).focus()
+	  }
+	}else if (event.keyCode === 39) { // 向右箭头
+	  if(id3!='' && document.getElementById(id2).selectionStart == document.getElementById(id2).value.length){
+		document.getElementById(id3).focus()
+	  }
+	}
+  }
+  
+  
+  // =========== 新增工序资料 ===========
+  const visible = ref(false)
+  // 新增部件资料相关
+  const partAddDialogVisible = ref(false)
+  const partIsEdit = ref(false)
+  const partAddForm = reactive({
+	  部件序号: '',
+	  部件名称: ''
+  })
+  const partAddRows = ref([])
+  const partAddExistingNames = ref(new Set())
+  const partAddMaxExistingSort = ref(0)
+  const partNameOptions = ref([])
+
+  // 排序相关状态
+const sortPartGyDialogVisible = ref(false)
+const sortDialogLoading = ref(false)
+const sortDialogSewingGroups = ref([])
+const sortDialogStageGys = ref({ 裁剪: [], 手工: [], 大烫: [], 总检: [] })
+const sortDialogViewStage = ref('裁剪')
+const sortDialogSelectedPartId = ref(null)
+const sortDialogInitialSnapshot = ref(null)
+const sortDialogSubmitLoading = ref(false)
+
+// 排序弹窗相关计算属性
+const sortDialogRightPanelReady = computed(() => {
+  const vs = sortDialogViewStage.value
+  if (!vs) return false
+  if (vs === '车缝') return sortDialogSelectedPartId.value != null
+  return true
+})
+
+const sortDialogRightActiveSewingGroup = computed(() => {
+  if (sortDialogViewStage.value !== '车缝' || sortDialogSelectedPartId.value == null) return null
+  return (
+    sortDialogSewingGroups.value.find(
+      (g) => String(g.part?.id) === String(sortDialogSelectedPartId.value)
+    ) ?? null
+  )
+})
+
+const sortDialogActiveGysList = computed(() => {
+  const vs = sortDialogViewStage.value
+  if (vs && vs !== '车缝') {
+    return sortDialogStageGys.value[vs] ?? []
+  }
+  if (vs === '车缝' && sortDialogRightActiveSewingGroup.value) {
+    return sortDialogRightActiveSewingGroup.value.gys ?? []
+  }
+  return []
+})
+
+
+// 复制产品资料相关状态
+const copyProductDialogVisible = ref(false)
+const copyProductFormData = ref({
+  gdbh: '',
+  ks: ''
+})
+const copyProductTableData = ref([])
+const copyProductSelectedRow = ref(null)
+const copyProductTableRef = ref(null)
+const copyProductSearchText = ref('')
+
+// 排序相关常量
+const PROCESS_ADD_STAGE_ORDER = ['裁剪', '车缝', '手工', '大烫', '总检']
+const SORT_NON_SEWING_STAGES = ['裁剪', '手工', '大烫', '总检']
+
+// 排序相关状态
+const sortDialogVisible = ref(false)
+const sortTableData = ref([])
+  
+  // 新增工艺资料相关
+  const processAddDialogVisible = ref(false)
+
+  watch(processAddDialogVisible, async (visible) => {
+    if (!visible && gyDetailDialogVisible.value) {
+      await refreshGyDetailProcessList()
+    }
+  })
+
+  const processIsEdit = ref(false)
+  const processSubmitLoading = ref(false)
+  const processFormRef = ref(null)
+  const processForm = reactive({
+    id: undefined,
+    工艺序号: '',
+    工艺名称: '',
+    生产工序: '',
+    标准工时: undefined,
+    标准工分: undefined,
+    难度系数: 1,
+  })
+  const processFormRules = {
+    工艺名称: [{ required: true, message: '请选择或输入工艺名称', trigger: 'change' }],
+    生产工序: [{ required: true, message: '请选择生产工序', trigger: 'change' }],
+  }
+
+  const processAddPartList = ref([])
+  const processAddSelectedStage = ref('裁剪')
+  const processAddSelectedPartKey = ref(null)
+  const processAddByPartRows = ref({})
+  const processAddActivePart = ref(null)
+  const processAddCurrentRowKey = ref(null)
+  const processLibAddSubmitCount = ref(0)
+
+  const processAddDialogTableHeight = ref(460)
+
+  function processAddStageKey(bigProcess) {
+    return `stg_${String(bigProcess ?? '').trim()}`
+  }
+  function isProcessAddStageListKey(k) {
+    return typeof k === 'string' && k.startsWith('stg_')
+  }
+
+  const PROCESS_LIB_LIST_LIMIT = 200
+  const processLibNameOptions = ref([])
+  const processLibByName = ref({})
+  const processLibFilterQuery = ref('')
+
+  const filteredProcessLibNameOptions = computed(() => {
+    const q = processLibFilterQuery.value.trim().toLowerCase()
+    const list = processLibNameOptions.value
+    if (!q) return list
+    return list.filter((opt) => {
+      const name = String(opt.value ?? '').toLowerCase()
+      const code = String(opt.code ?? '').toLowerCase()
+      const bp = String(opt.big_process ?? '').toLowerCase()
+      return name.includes(q) || code.includes(q) || bp.includes(q) || `${code} ${name}`.trim().includes(q)
+    })
+  })
+
+  const filteredProcessLibNameOptionsForProcessAdd = computed(() => filteredProcessLibNameOptions.value)
+
+  async function loadProcessLibNameOptions(req) {
+    const toNum = (v) => {
+      if (v === undefined || v === null || v === '') return undefined
+      const n = Number(v)
+      return Number.isFinite(n) ? n : undefined
+    }
+    const q = String(req?.search ?? '').trim()
+    try {
+      // 使用 GetProcessList 获取当前工单的工艺数据
+      const res = await GetProcessList({ workorder: _Gd_gdbh.value })
+      if (res?.code !== 0) {
+        processLibNameOptions.value = []
+        processLibByName.value = {}
+        return
+      }
+      const list = res?.data ?? []
+      
+      // 根据大工艺筛选数据
+      let filteredList = list
+      if (q) {
+        filteredList = list.filter((row) => {
+          const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
+          // 车缝包含车缝和烫工(小烫按部件算)
+          if (q === '车缝') {
+            return bp === '车缝' || bp === '烫工'
+          }
+          // 其他工序直接匹配
+          return bp === q
+        })
+      }
+      
+      const seen = new Set()
+      const opts = []
+      const byName = {}
+      for (const row of filteredList) {
+        const name = String(row.gy_name ?? row['工艺名称'] ?? '').trim()
+        if (!name || seen.has(name)) continue
+        seen.add(name)
+        const sort = String(row.gy_sort ?? row.gy_code ?? row['工艺序号'] ?? row['工艺编号'] ?? '').trim()
+        const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
+        opts.push({ value: name, code: sort, big_process: bp })
+        byName[name] = {
+          gy_sort: sort,
+          gy_code: String(row.gy_code ?? row['工艺编号'] ?? '').trim(),
+          big_process: bp,
+          standard_hour: toNum(row.standard_hour ?? row['标准工时']),
+          standard_score: toNum(row.standard_score ?? row['标准公分'] ?? row['标准工分']),
+          difficulty_coef: toNum(row.difficulty_coef ?? row['系数'] ?? row['难度系数']) ?? 1,
+        }
+      }
+      processLibNameOptions.value = opts
+      processLibByName.value = byName
+    } catch (e) {
+      console.error(e)
+      processLibNameOptions.value = []
+      processLibByName.value = {}
+    }
+  }
+
+  function processLibOptStageText(opt) {
+    const s = String(opt?.big_process ?? '').trim()
+    return s || '—'
+  }
+  function onProcessLibSelectFilter(query) {
+    processLibFilterQuery.value = query == null ? '' : String(query)
+  }
+  function onProcessLibSelectVisible(visible) {
+    if (visible) processLibFilterQuery.value = ''
+  }
+
+  function processAddPartBlockKey(part, index) {
+    return `p_${String(part?.id ?? part?.part_sort ?? part?.['部件序号'] ?? index)}`
+  }
+
+  function onProcessAddSelectStage(stage) {
+    processAddSelectedStage.value = stage
+    if (stage !== '车缝') {
+      processAddSelectedPartKey.value = null
+      processAddActivePart.value = null
+      const stgKey = processAddStageKey(stage)
+      processAddCurrentRowKey.value = stgKey
+      if (!processAddByPartRows.value[stgKey]) {
+        processAddByPartRows.value[stgKey] = [newProcessLibRow()]
+      }
+      loadProcessLibNameOptions({ search: stage })
+    } else {
+      const parts = processAddPartList.value
+      if (parts.length) {
+        const first = parts[0]
+        const key = processAddPartBlockKey(first, 0)
+        onProcessAddSelectSewingPart(first, 0)
+      } else {
+        processAddSelectedPartKey.value = null
+        processAddActivePart.value = null
+        processAddCurrentRowKey.value = null
+      }
+    }
+    syncProcessAddSubmitCount()
+  }
+
+  function onProcessAddSelectSewingPart(part, index) {
+    processAddSelectedStage.value = '车缝'
+    const key = processAddPartBlockKey(part, index)
+    processAddSelectedPartKey.value = key
+    processAddActivePart.value = part
+    processAddCurrentRowKey.value = key
+    if (!processAddByPartRows.value[key]) {
+      processAddByPartRows.value[key] = [newProcessLibRow()]
+    }
+    loadProcessLibNameOptions({ search: '车缝' })
+    syncProcessAddSubmitCount()
+  }
+
+  function newProcessLibRow() {
+    return {
+      _key: `proc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
+      工艺序号: '',
+      工艺名称: '',
+      生产工序: '',
+      标准工时: undefined,
+      标准工分: undefined,
+      难度系数: 1,
+    }
+  }
+
+  function onProcessLibNameSelectChangeForPart(key, index) {
+    const rows = processAddByPartRows.value[key]
+    if (!rows) return
+    const row = rows[index]
+    if (!row) return
+    const name = String(row['工艺名称'] ?? '').trim()
+    if (!name) {
+      row['生产工序'] = ''
+      row['标准工时'] = undefined
+      row['标准工分'] = undefined
+      row['难度系数'] = 1
+      return
+    }
+    const lib = processLibByName.value[name]
+    if (lib) {
+      row['生产工序'] = lib.big_process
+      row['标准工时'] = lib.standard_hour
+      row['标准工分'] = lib.standard_score
+      row['难度系数'] = lib.difficulty_coef ?? 1
+    } else {
+      row['生产工序'] = ''
+      row['标准工时'] = undefined
+      row['标准工分'] = undefined
+      row['难度系数'] = 1
+    }
+    if (index === rows.length - 1) {
+      rows.push(newProcessLibRow())
+    }
+    syncProcessAddSubmitCount()
+  }
+
+  function removeProcessLibRowForPart(key, row, index) {
+    const rows = processAddByPartRows.value[key]
+    if (!rows) return
+    if (rows.length <= 1) {
+      ElMessage.warning('至少保留一行')
+      return
+    }
+    rows.splice(index, 1)
+    syncProcessAddSubmitCount()
+  }
+
+  function syncProcessAddSubmitCount() {
+    let n = 0
+    for (const k in processAddByPartRows.value) {
+      const rows = processAddByPartRows.value[k]
+      if (!Array.isArray(rows)) continue
+      for (const r of rows) {
+        const name = String(r['工艺名称'] ?? '').trim()
+        if (name) n++
+      }
+    }
+    processLibAddSubmitCount.value = n
+  }
+
+  function resetProcessLibForm() {
+    processIsEdit.value = false
+    processForm.id = undefined
+    processForm['工艺序号'] = ''
+    processForm['工艺名称'] = ''
+    processForm['生产工序'] = ''
+    processForm['标准工时'] = undefined
+    processForm['标准工分'] = undefined
+    processForm['难度系数'] = 1
+    processAddPartList.value = []
+    processAddByPartRows.value = {}
+    processAddSelectedStage.value = '裁剪'
+    processAddSelectedPartKey.value = null
+    processAddActivePart.value = null
+    processAddCurrentRowKey.value = null
+    processLibAddSubmitCount.value = 0
+    processFormRef.value?.clearValidate?.()
+  }
+
+  // 打开新增工艺资料弹窗
+  const addgdgy_onclick = async () => {
+	if(!_Gd_gdbh.value){
+	  ElMessage.warning('请先选择具体的工单后,再操作此功能')
+	  return
+	}
+	// 初始化工艺添加相关数据
+	resetProcessLibForm()
+	try {
+	  // 获取部件列表
+	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
+	  if (partRes?.code !== 0 || !Array.isArray(partRes.data)) {
+		ElMessage.error('获取部件列表失败')
+		return
+	  }
+	  const parts = partRes.data
+	  processAddPartList.value = parts
+	  
+	  // 加载工艺库
+	  await loadProcessLibNameOptions({ search: '裁剪' })
+	  
+	  // 设置默认选中的工序
+	  processAddSelectedStage.value = '裁剪'
+	  const stgKey = processAddStageKey('裁剪')
+	  processAddCurrentRowKey.value = stgKey
+	  processAddByPartRows.value[stgKey] = [newProcessLibRow()]
+	  
+	  // 如果有部件,设置默认选中的部件
+	  if (parts.length) {
+		const first = parts[0]
+		const key = processAddPartBlockKey(first, 0)
+		processAddByPartRows.value[key] = [newProcessLibRow()]
+	  }
+	  
+	  processAddDialogVisible.value = true
+	} catch (e) {
+	  console.error('获取工艺名称列表失败', e)
+	  ElMessage.error('获取工艺名称列表失败')
+	}
+  }
+
+  // 打开新增工艺资料弹窗
+  const openProcessAdd = async () => {
+	await addgdgy_onclick()
+  }
+
+  // 部件列表数据
+  const partListData = ref([])
+
+  // 打开新增部件资料弹窗
+  const openPartAdd = async () => {
+	if(!_Gd_gdbh.value){
+	  ElMessage.warning('请先选择具体的工单后,再操作此功能')
+	  return
+	}
+	resetPartLibForm()
+	// 获取部件名称下拉列表
+	try {
+	  // 调用ParList获取部件列表
+	  const parRes = await ParList({ page: 1, limit: 100 })
+	  console.log('ParList接口返回数据:', parRes)
+	  if (parRes?.code === 0) {
+		  const list = parRes?.data?.list ?? []
+		  console.log('部件列表数据:', list)
+		  partListData.value = list
+		  // 提取部件名称
+		  const seen = new Set()
+		  const opts = []
+		  for (const row of list) {
+			const name = String(row.part_name ?? row['部件名称'] ?? '').trim()
+			if (!name || seen.has(name)) continue
+			seen.add(name)
+			opts.push(name)
+		  }
+		  partNameOptions.value = opts
+		  console.log('部件名称选项:', partNameOptions.value)
+	  }
+	  // 获取已存在的部件名称和最大序号
+	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
+	  if (partRes?.code === 0 && Array.isArray(partRes.data)) {
+		  partAddExistingNames.value = new Set(partRes.data.map(p => p.部件名称))
+		  // 计算已存在的最大部件序号
+		  let maxSort = 0
+		  for (const part of partRes.data) {
+			const sort = Number(part.部件序号) || 0
+			if (sort > maxSort) {
+			  maxSort = sort
+			}
+		  }
+		  partAddMaxExistingSort.value = maxSort
+	  }
+	} catch (e) {
+	  console.error('获取部件名称列表失败', e)
+	  ElMessage.error('获取部件名称列表失败')
+	}
+	// 初始化新增行
+	partAddRows.value = [newPartLibRow()]
+	syncPartAddRowSorts()
+	partAddDialogVisible.value = true
+  }
+
+  // 重置部件表单
+  const resetPartLibForm = () => {
+	partIsEdit.value = false
+	partAddForm.部件序号 = ''
+	partAddForm.部件名称 = ''
+	partAddForm.部件编号 = ''
+	partAddForm.部件类型 = ''
+	partAddForm.部件备注 = ''
+	partAddRows.value = []
+	partAddMaxExistingSort.value = 0
+	partAddExistingNames.value = new Set()
+	// 不要清空partNameOptions,因为它是通过ParList接口获取的
+  }
+
+  // 新建部件行
+  const newPartLibRow = () => {
+	return {
+	  _key: Date.now() + Math.random(),
+	  部件序号: '',
+	  部件名称: '',
+	  部件编号: '',
+	  部件类型: '',
+	  部件备注: ''
+	}
+  }
+
+  // 同步部件行序号
+  const syncPartAddRowSorts = () => {
+	const rows = partAddRows.value
+	const base = partAddMaxExistingSort.value
+	for (let i = 0; i < rows.length; i++) {
+	  rows[i].部件序号 = String(base + i + 1)
+	}
+  }
+
+  // 部件名称变化处理
+  const onPartNameChange = (index) => {
+	const row = partAddRows.value[index]
+	if (!row) return
+	const name = String(row.部件名称 ?? '').trim()
+	if (name) {
+	  // 检查是否重复
+	  if (partAddExistingNames.value.has(name)) {
+	    ElMessage.warning('该工单下已存在该部件名称,请勿重复添加')
+	    row.部件名称 = ''
+	    return
+	  }
+	  
+	  // 检查同批添加中是否重复
+	  for (let i = 0; i < partAddRows.value.length; i++) {
+	    if (i === index) continue
+	    if (String(partAddRows.value[i].部件名称 ?? '').trim() === name) {
+	      ElMessage.warning('该部件名称已在其他行选择,请勿重复')
+	      row.部件名称 = ''
+	      return
+	    }
+	  }
+	  
+	  // 根据部件名称填充部件编号、部件类型和部件备注
+	  const part = partListData.value.find(p => {
+	    return String(p.part_name ?? p['部件名称'] ?? '').trim() === name
+	  })
+	  if (part) {
+	    row.部件编号 = String(part.part_code ?? part['部件编码'] ?? '').trim()
+	    row.部件类型 = ''
+	    row.部件备注 = '' // 默认为空
+	  }
+	  
+	  // 自动添加新行
+	  if (index === partAddRows.value.length - 1) {
+	    partAddRows.value.push(newPartLibRow())
+	    syncPartAddRowSorts()
+	  }
+	} else {
+	  // 清空相关字段
+	  row.部件编号 = ''
+	  row.部件类型 = ''
+	  row.部件备注 = ''
+	}
+  }
+
+  // 删除部件行
+  const removePartRow = (index) => {
+	if (partAddRows.value.length <= 1) {
+	  ElMessage.warning('至少保留一行')
+	  return
+	}
+	partAddRows.value.splice(index, 1)
+	syncPartAddRowSorts()
+  }
+
+  // 关闭新增部件资料弹窗
+  const partAddCloseDialog = () => {
+	partAddDialogVisible.value = false
+  }
+
+  // 确认新增部件资料
+  const partAddConfirm = async () => {
+	// 收集有效行
+	const validRows = []
+	for (const row of partAddRows.value) {
+	  const name = String(row.部件名称 ?? '').trim()
+	  if (name) {
+		validRows.push({
+		  part_name: name,
+		  part_code: String(row.部件编号 ?? '').trim(),
+		  part_type: String(row.部件类型 ?? '').trim(),
+		  remark: String(row.部件备注 ?? '').trim(),
+		  part_sort: String(row.部件序号 ?? '').trim()
+		})
+	  }
+	}
+	
+	if (validRows.length === 0) {
+	  ElMessage.warning('请至少填写一个部件')
+	  return
+	}
+	
+	try {
+	  for (const row of validRows) {
+		const res = await AddPart({
+			workorder: _Gd_sckh.value,
+			part_name: row.part_name,
+			part_code: row.part_code,
+			part_type: row.part_type,
+			remark: row.remark,
+			sys_id: userStore.userInfo.nickName
+		})
+		if (res?.code !== 0) {
+		  throw new Error(res.msg || '新增部件资料失败')
+		}
+	  }
+	  ElMessage.success('新增部件资料成功')
+	  partAddDialogVisible.value = false
+	  // 刷新部件资料列表
+	  await loadPartAndProcessData()
+	} catch (e) {
+	  console.error('新增部件资料失败', e)
+	  ElMessage.error(e.message || '新增部件资料失败')
+	}
+  }
+
+  // 关闭新增工艺资料弹窗
+  const processAddCloseDialog = () => {
+	processAddDialogVisible.value = false
+  }
+
+  // 确认新增工艺资料
+  const processAddConfirm = async () => {
+	// 收集有效行
+	const validRows = []
+	for (const key in processAddByPartRows.value) {
+	  const rows = processAddByPartRows.value[key]
+	  if (!Array.isArray(rows)) continue
+	  for (const row of rows) {
+	    const name = String(row.工艺名称 ?? '').trim()
+	    const stage = String(row.生产工序 ?? '').trim()
+	    if (name && stage) {
+	      validRows.push({
+	        key: key,
+	        process_name: name,
+	        big_process: stage,
+	        process_code: String(row.工艺序号 ?? '').trim(),
+	        standard_hour: row.标准工时,
+	        standard_score: row.标准工分,
+	        coefficient: row.难度系数
+	      })
+	    }
+	  }
+	}
+	
+	if (validRows.length === 0) {
+	  ElMessage.warning('请至少填写一个工艺')
+	  return
+	}
+	
+	try {
+	  for (const row of validRows) {
+		// 确定部件号:如果是车缝工序,从部件中获取部件编号作为部件号
+		let part_code = ''
+		if (row.big_process === '车缝' && processAddActivePart.value) {
+		  part_code = String(processAddActivePart.value.part_code ?? processAddActivePart.value['部件编号'] ?? '').trim()
+		}
+		
+		const res = await AddProcess({
+			workorder: _Gd_gdbh.value,
+			part_code: part_code,
+			process_name: row.process_name,
+			process_code: row.process_code,
+			big_process: row.big_process,
+			standard_hour: row.standard_hour,
+			standard_score: row.standard_score,
+			coefficient: row.coefficient,
+			remark: '',
+			sys_id: userStore.userInfo?.nickName || ''
+		})
+		if (res?.code !== 0) {
+		  throw new Error(res.msg || '新增工艺资料失败')
+		}
+	  }
+	  ElMessage.success('新增工艺资料成功')
+	  processAddDialogVisible.value = false
+	  // 刷新工艺资料列表
+	  await loadPartAndProcessData()
+	} catch (e) {
+	  console.error('新增工艺资料失败', e)
+	  ElMessage.error(e.message || '新增工艺资料失败')
+	}
+  }
+
+  // 打开排序弹窗
+  const openSortDialog = async () => {
+	await openSortPartGyDialog()
+  }
+
+  // 打开排序弹窗(新)
+  const openSortPartGyDialog = async () => {
+	if(!_Gd_gdbh.value){
+	  ElMessage.warning('请先选择具体的工单后,再操作此功能')
+	  return
+	}
+	sortPartGyDialogVisible.value = true
+	sortDialogLoading.value = true
+	sortDialogSewingGroups.value = []
+	sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
+	try {
+	  // 获取部件列表
+	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
+	  const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
+	  
+	  // 获取工艺列表
+	  const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
+	  const rawGy = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
+	  const gyNorm = rawGy.map((r) => normalizeGyRow(r))
+	  
+	  // 构建排序数据
+	  sortDialogSewingGroups.value = buildSortSewingGroups(parts, rawGy)
+	  sortDialogStageGys.value = buildSortStageGys(gyNorm)
+	  reindexSortDialogGroupsDisplay()
+	  sortDialogViewStage.value = '裁剪'
+	  sortDialogSelectedPartId.value = sortDialogSewingGroups.value[0]?.part?.id ?? null
+	  sortDialogInitialSnapshot.value = JSON.stringify(snapshotSortDialogStateV2())
+	  
+	  // 加载工艺库数据
+	//   await loadProcessLibNameOptions({ search: '裁剪' })
+	} catch (e) {
+	  console.error('加载排序数据失败', e)
+	  ElMessage.error('加载排序数据失败')
+	} finally {
+	  sortDialogLoading.value = false
+	}
+	bindSortPartGyDrag()
+  }
+
+  // 关闭排序弹窗
+  const sortCloseDialog = () => {
+	sortPartGyDialogVisible.value = false
+  }
+
+  // 排序弹窗关闭时的清理
+  const onSortPartGyDialogClosed = () => {
+	destroySortPartGySortables()
+	sortDialogSewingGroups.value = []
+	sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
+	sortDialogViewStage.value = '裁剪'
+	sortDialogSelectedPartId.value = null
+	sortDialogInitialSnapshot.value = null
+  }
+
+  // 数字排序键
+  const numSortKey = (v) => {
+	if (v === undefined || v === null || v === '') return 0
+	const n = Number(v)
+	return Number.isFinite(n) ? n : 0
+  }
+
+  // 按部件序号升序排序
+  const sortByPartSortAsc = (parts) => {
+	return [...parts].sort((a, b) => numSortKey(a.部件序号) - numSortKey(b.部件序号))
+  }
+
+  // 标准化工艺行数据
+  const normalizeGyRow = (row) => {
+	return {
+	  id: row.工艺ID || row.id,
+	  gy_name: row.工艺名称 || row.gy_name,
+	  '工艺名称': row.工艺名称 || row.gy_name,
+	  big_process: row.大工艺 || row.生产工序 || row.big_process,
+	  '大工艺': row.大工艺 || row.生产工序 || row.big_process,
+	  part_sort: row.部件序号 || row.part_sort,
+	  '部件序号': row.部件序号 || row.part_sort,
+	  part_name: row.部件名称 || row.part_name,
+	  '部件名称': row.部件名称 || row.part_name,
+	  part_code: row.部件编号 || row.part_code,
+	  '部件编号': row.部件编号 || row.part_code,
+	  gy_sort: row.工艺序号 || row.gy_sort,
+	  '工艺序号': row.工艺序号 || row.gy_sort,
+	  gy_code: row.工艺编号 || row.gy_code,
+	  '工艺编号': row.工艺编号 || row.gy_code,
+	  standard_hour: row.标准工时 || row.standard_hour,
+	  '标准工时': row.标准工时 || row.standard_hour,
+	  standard_score: row.标准公分 || row.标准工分 || row.standard_score,
+	  '标准公分': row.标准公分 || row.标准工分 || row.standard_score,
+	  '标准工分': row.标准公分 || row.标准工分 || row.standard_score,
+	  difficulty_coef: row.系数 || row.难度系数 || row.difficulty_coef,
+	  '系数': row.系数 || row.难度系数 || row.difficulty_coef,
+	  '难度系数': row.系数 || row.难度系数 || row.difficulty_coef,
+	  remark: row.备注 || row.remark,
+	  '备注': row.备注 || row.remark
+	}
+  }
+
+  // 构建车缝工序的部件-工艺分组(包含车缝和烫工)
+  const buildSortSewingGroups = (parts, processes) => {
+	const list = sortByPartSortAsc(Array.isArray(parts) ? parts : [])
+	console.log('部件列表:', list)
+	console.log('工艺列表:', processes)
+	return list.map((part) => {
+	  const partName = String(part.部件名称 || '').trim()
+	  console.log('处理部件:', partName)
+	  const gys = processes
+		.map((g) => {
+		  const normalized = normalizeGyRow(g)
+		  // 保留原始字段
+		  return {
+			...g,
+			...normalized
+		  }
+		})
+		.filter((g) => {
+		  const bigProcess = String(g.big_process ?? g.大工艺 ?? '').trim()
+		  const processPartName = String(g.part_name ?? g.部件名称 ?? '').trim()
+		  // 车缝包含车缝和烫工(小烫按部件算)
+		  const match = (bigProcess === '车缝' || bigProcess === '烫工') && processPartName === partName
+		  console.log('过滤工艺:', { bigProcess, processPartName, partName, match })
+		  return match
+		})
+		.sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
+	  console.log('匹配的工艺:', gys)
+	  return { part: { ...part, id: part.部件ID || part.id }, gys }
+	})
+  }
+
+  // 构建非车缝工序的工艺列表
+  const buildSortStageGys = (processes) => {
+	const stages = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
+	for (const raw of processes) {
+	  const g = normalizeGyRow({ ...raw })
+	  const bp = String(g.big_process ?? '').trim()
+	  if (bp === '车缝' || !SORT_NON_SEWING_STAGES.includes(bp)) continue
+	  stages[bp].push(g)
+	}
+	for (const st of SORT_NON_SEWING_STAGES) {
+	  stages[st] = (stages[st] || []).sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
+	}
+	return stages
+  }
+
+  // 重新索引排序对话框中的显示序号
+  const reindexSortDialogGroupsDisplay = () => {
+	sortDialogSewingGroups.value.forEach((grp, i) => {
+	  const partSortStr = String(i + 1)
+	  if (grp.part && typeof grp.part === 'object') {
+		grp.part.part_sort = partSortStr
+	  }
+	  const partName = String(grp.part?.部件名称 ?? '').trim()
+	  const gys = grp.gys
+	  if (!Array.isArray(gys)) return
+	  gys.forEach((row, j) => {
+		const gyStr = String(j + 1)
+		row.gy_sort = gyStr
+		row['工艺序号'] = gyStr
+		row.part_sort = partSortStr
+		row['部件序号'] = partSortStr
+		row.part_name = partName
+		row['部件名称'] = partName
+		row.big_process = '车缝'
+		row['生产工序'] = '车缝'
+		// 确保工艺名称等属性存在
+		if (!row['工艺名称']) {
+		  row['工艺名称'] = row.gy_name || row.工艺名称 || ''
+		}
+		if (!row['标准工时']) {
+		  row['标准工时'] = row.standard_hour || row.标准工时 || ''
+		}
+		if (!row['标准工分']) {
+		  row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
+		}
+		if (!row['难度系数']) {
+		  row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
+		}
+	  })
+	})
+	for (const st of SORT_NON_SEWING_STAGES) {
+	  const gys = sortDialogStageGys.value[st] || []
+	  gys.forEach((row, j) => {
+		const gyStr = String(j + 1)
+		row.gy_sort = gyStr
+		row['工艺序号'] = gyStr
+		row.part_sort = ''
+		row['部件序号'] = ''
+		row.part_name = ''
+		row['部件名称'] = ''
+		row.big_process = st
+		row['生产工序'] = st
+		// 确保工艺名称等属性存在
+		if (!row['工艺名称']) {
+		  row['工艺名称'] = row.gy_name || row.工艺名称 || ''
+		}
+		if (!row['标准工时']) {
+		  row['标准工时'] = row.standard_hour || row.标准工时 || ''
+		}
+		if (!row['标准工分']) {
+		  row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
+		}
+		if (!row['难度系数']) {
+		  row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
+		}
+	  })
+	}
+  }
+
+  // 快照排序对话框状态
+  const snapshotSortDialogStateV2 = () => {
+	return {
+	  sewing: sortDialogSewingGroups.value.map((g) => ({
+		partId: g.part?.id,
+		partCode: g.part?.部件编号,
+		gyIds: g.gys.map((gy) => gy.id)
+	  })),
+	  stages: Object.fromEntries(
+		SORT_NON_SEWING_STAGES.map((st) => [
+		  st,
+		  sortDialogStageGys.value[st]?.map((gy) => gy.id) || []
+		])
+	  )
+	}
+  }
+
+  // 绑定部件和工艺的拖拽功能
+  const bindSortPartGyDrag = () => {
+	destroySortPartGySortables()
+	if (!sortPartGyDialogVisible.value) return
+	
+	// 绑定部件拖拽
+	const partListEl = document.querySelector('.sort-part-gy-sewing-parts')
+	if (partListEl) {
+		new Sortable(partListEl, {
+			draggable: '.sort-part-gy-part-item',
+			animation: 180,
+			onEnd: (event) => {
+				if (event.oldIndex !== event.newIndex) {
+					// 重新排序部件
+					const groups = [...sortDialogSewingGroups.value]
+					const [moved] = groups.splice(event.oldIndex, 1)
+					groups.splice(event.newIndex, 0, moved)
+					sortDialogSewingGroups.value = groups
+					// 重新索引
+					reindexSortDialogGroupsDisplay()
+				}
+			}
+		})
+	}
+	
+	// 绑定工艺拖拽
+	const processTableEl = document.querySelector('.sort-gy-table .el-table__body-wrapper tbody')
+	if (processTableEl) {
+		new Sortable(processTableEl, {
+			handle: '.sort-drag-handle',
+			animation: 180,
+			onEnd: (event) => {
+				if (event.oldIndex !== event.newIndex) {
+					const stage = sortDialogViewStage.value
+					if (stage === '车缝' && sortDialogSelectedPartId.value) {
+						// 车缝工艺排序
+						const group = sortDialogSewingGroups.value.find(
+							g => String(g.part?.id) === String(sortDialogSelectedPartId.value)
+						)
+						if (group && Array.isArray(group.gys)) {
+							const gys = [...group.gys]
+							const [moved] = gys.splice(event.oldIndex, 1)
+							gys.splice(event.newIndex, 0, moved)
+							group.gys = gys
+							// 重新索引
+							reindexSortDialogGroupsDisplay()
+						}
+					} else if (stage && SORT_NON_SEWING_STAGES.includes(stage)) {
+						// 非车缝工艺排序
+						const gys = [...sortDialogStageGys.value[stage]]
+						const [moved] = gys.splice(event.oldIndex, 1)
+						gys.splice(event.newIndex, 0, moved)
+						sortDialogStageGys.value[stage] = gys
+						// 重新索引
+						reindexSortDialogGroupsDisplay()
+					}
+				}
+			}
+		})
+	}
+  }
+
+  // 销毁拖拽实例
+  const destroySortPartGySortables = () => {
+	// 这里可以添加销毁拖拽实例的代码
+	// 由于我们使用的是局部变量创建Sortable实例,不需要显式销毁
+  }
+
+  // 选择排序对话框的视图工序
+  const onSortDialogViewStageSelect = async (stage) => {
+	sortDialogViewStage.value = stage
+	if (stage !== '车缝') {
+		sortDialogSelectedPartId.value = null
+	}
+	// 加载工艺库数据
+	const loadSt = stage === '车缝' ? '车缝' : stage
+	await loadProcessLibNameOptions({ search: loadSt })
+	// 重新绑定拖拽
+	nextTick(() => {
+		destroySortPartGySortables()
+		bindSortPartGyDrag()
+	})
+  }
+
+  // 选择车缝工序的部件
+  const onSortDialogSelectSewingPart = async (partId) => {
+	sortDialogSelectedPartId.value = partId
+	sortDialogViewStage.value = '车缝'
+	// 加载工艺库数据
+	await loadProcessLibNameOptions({ search: '车缝' })
+	// 重新绑定拖拽
+	nextTick(() => {
+		destroySortPartGySortables()
+		bindSortPartGyDrag()
+	})
+  }
+
+  // 排序弹窗中工艺名称变化处理
+  const onSortDialogGyNameChange = (row) => {
+	const name = String(row['工艺名称'] ?? '').trim()
+	if (!name) return
+	const info = processLibByName.value[name]
+	if (info) {
+		row['标准工时'] = info.standard_hour
+		row['标准工分'] = info.standard_score
+		row['难度系数'] = info.difficulty_coef ?? 1
+		if (!row['生产工序'] && info.big_process) {
+			row['生产工序'] = info.big_process
+			row.big_process = info.big_process
+		}
+	}
+  }
+
+  // 复制产品资料 - 打开弹窗
+  const copyProductData = () => {
+	if(!_Gd_gdbh.value){ 
+	  ElMessage.warning('请先选择具体的工单')
+	  return
+	}
+	
+	copyProductTableData.value = []
+	copyProductFormData.value.gdbh = _Gd_gdbh.value
+	copyProductFormData.value.ks = ''
+	copyProductSelectedRow.value = null
+	copyProductSearchText.value = ''
+	copyProductDialogVisible.value = true
+  }
+
+  // 复制产品资料搜索
+  const copyProductSearch = async () => {
+	if(!copyProductSearchText.value.trim()){
+	  ElMessage.warning('请输入搜索内容')
+	  return
+	}
+	
+	try {
+	  const res = await WorkOrderList({ search: copyProductSearchText.value, page: 1, limit: 100 })
+	  if (res?.code === 0 && res.data && Array.isArray(res.data.data)) {
+		copyProductTableData.value = res.data.data
+		copyProductSelectedRow.value = null
+	  } else {
+		copyProductTableData.value = []
+		ElMessage.info('未找到匹配的工单')
+	  }
+	} catch (e) {
+	  console.error('搜索工单失败', e)
+	  ElMessage.error('搜索工单失败')
+	}
+  }
+
+  // 复制产品资料表格行点击
+  const copyProductTableRowClick = (row) => {
+	copyProductSelectedRow.value = row
+	copyProductFormData.value['生产款号'] = row.生产款号 || ''
+  }
+
+  // 复制产品资料确认
+  const copyProductHandleConfirm = async () => {
+	if(!copyProductSelectedRow.value) {
+	  ElMessage.warning('请选择要复制的工单')
+	  return
+	}
+	
+	try {
+	  // 调用copyProcessToCurrentWorkOrder接口
+	  const res = await copyProcessToCurrentWorkOrder({
+		target_workorder: copyProductSelectedRow.value.订单编号,
+		current_workorder: _Gd_gdbh.value,
+		sys_id: userStore.userInfo.nickName
+	  })
+	  
+	  if (res?.code === 0) {
+		ElMessage.success('复制工艺资料成功')
+		copyProductDialogVisible.value = false
+		// 刷新数据
+		await loadPartAndProcessData()
+	  } else {
+		ElMessage.error('复制工艺资料失败')
+	  }
+	} catch (e) {
+	  console.error('复制工艺资料失败', e)
+	  ElMessage.error('复制工艺资料失败')
+	}
+  }
+
+  // 复制产品资料取消
+  const copyProductHandleCancel = () => {
+	copyProductDialogVisible.value = false
+	copyProductSelectedRow.value = null
+  }
+
+  // 保存排序
+  const submitSortPartGy = async () => {
+	if (!_Gd_gdbh.value) return
+	
+	sortDialogSubmitLoading.value = true
+	try {
+	  // 构建工艺排序数据
+	  const process_list = []
+	  
+	  // 处理车缝工艺
+	  sortDialogSewingGroups.value.forEach((g) => {
+		const rows = g.gys || []
+		for (let j = 0; j < rows.length; j++) {
+		  const r = rows[j]
+		  if (r.id == null) continue
+		  process_list.push({
+			id: r.id,
+			process_code: j + 1
+		  })
+		}
+	  })
+	  
+	  // 处理非车缝工艺
+	  for (const st of SORT_NON_SEWING_STAGES) {
+		const rows = sortDialogStageGys.value[st] || []
+		for (let j = 0; j < rows.length; j++) {
+		  const r = rows[j]
+		  if (r.id == null) continue
+		  process_list.push({
+			id: r.id,
+			process_code: j + 1
+		  })
+		}
+	  }
+	  
+	  if (process_list.length === 0) {
+		ElMessage.warning('无工艺数据可保存')
+		return
+	  }
+	  
+	  // 调用保存接口
+	  const res = await sortProcess(process_list)
+	  
+	  if (res?.code === 0) {
+		ElMessage.success('排序保存成功')
+		sortPartGyDialogVisible.value = false
+		// 刷新数据
+		await loadPartAndProcessData()
+	  } else {
+		ElMessage.error(res?.msg || '保存失败')
+	  }
+	} catch (e) {
+	  console.error('保存排序失败', e)
+	  ElMessage.error('保存排序失败')
+	} finally {
+	  sortDialogSubmitLoading.value = false
+	}
+  }
+
+  // 排序对话框是否有数据
+  const sortDialogHasData = computed(() => {
+	return sortDialogSewingGroups.value.length > 0 || 
+	  Object.values(sortDialogStageGys.value).some(gys => gys.length > 0)
+  })
+
+
+
+
+  // 加载排序表格数据
+  const loadSortTableData = async () => {
+	try {
+	  // 获取部件列表
+	  const partRes = await PartList({ workorder: _Gd_gdbh.value })
+	  const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
+
+	  // 获取工艺列表
+	  const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
+	  const processes = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
+
+	  // 构建排序表格数据
+	  sortTableData.value = parts.map(part => ({
+		  部件ID: part.部件ID || part.id,
+		  部件编号: part.部件编号,
+		  部件名称: part.部件名称,
+		  gyList: processes.filter(gy => String(gy.部件编号) === String(part.部件编号))
+	  }))
+	} catch (e) {
+	  console.error('加载排序数据失败', e)
+	  ElMessage.error('加载排序数据失败')
+	}
+  }
+
+
+  // 确认排序
+  const sortConfirm = async () => {
+	try {
+	  // 按顺序更新部件序号
+	  for (let i = 0; i < sortTableData.value.length; i++) {
+		  const part = sortTableData.value[i]
+		  await UpdatePartInfo({
+			  workorder: _Gd_gdbh.value,
+			  part_code: part.部件编号,
+			  part_sort: i + 1
+		  })
+		  // 按顺序更新工艺序号
+		  const gyList = part.gyList
+		  for (let j = 0; j < gyList.length; j++) {
+			  const gy = gyList[j]
+			  await UpdateProcess({
+				  workorder: _Gd_gdbh.value,
+				  part_code: part.部件编号,
+				  process_code: gy.工艺编号,
+				  process_sort: j + 1
+			  })
+		  }
+	  }
+	  ElMessage.success('排序保存成功')
+	  sortDialogVisible.value = false
+	  // 刷新部件和工艺列表
+	  await loadPartAndProcessData()
+	} catch (e) {
+	  console.error('保存排序失败', e)
+	  ElMessage.error('保存排序失败')
+	}
+  }
+
+  // 刷新部件和工艺数据
+  const loadPartAndProcessData = async () => {
+	const partListData = await PartList({ workorder: _Gd_gdbh.value });
+	if (partListData?.code === 0 && Array.isArray(partListData.data)) {
+		parttableData.splice(0, parttableData.length, ...partListData.data);
+	} else {
+		parttableData.splice(0, parttableData.length);
+	}
+
+	const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
+	if (processListData?.code === 0 && Array.isArray(processListData.data)) {
+		gytableData.splice(0, gytableData.length, ...processListData.data);
+	} else {
+		gytableData.splice(0, gytableData.length);
+	}
+  }
+
+  //新增工序资料确定按钮
+  const add_gxenterDialog = () => {
+	  console.log(form)
+	  const formattedData = {
+		  ckck: form['仓库出库'],
+		  cq: form['裁剪'],
+		  cf: form['车缝'],
+		  hdsy: form['手工'],
+		  dt: form['大烫'],
+		  zj: form['总检'],
+		  bz: form['包装']
+	  };
+	  // true 选择 fasle 未选择
+	  for (let key in formattedData) {
+		  if (formattedData[key] === true) {
+			  formattedData[key] = 1;
+		  } else if (formattedData[key] === false) {
+			  formattedData[key] = 2;
+		  }
+	  }
+		console.log(formattedData)
+  }
+  
+  //新增工序资料取消按钮
+  const add_gxcloseDialog = () => {
+	  visible.value = false;
+  }
+  
+  // =========== 工艺资料详情弹窗 ===========
+  const gyDetailDialogVisible = ref(false)
+  const gyDetailFormData = reactive({
+    订单编号: '',
+    客户编号: '',
+    生产款号: '',
+    款式: '',
+    落货日期: '',
+    审核日期: '',
+    接单日期: '',
+    审核: '',
+    订单数量: '',
+    计划制造工分: '',
+    工单完工日期: null,
+    备注: '',
+    Sys_id: '',
+    Sys_rq: '',
+    img: '',
+    工艺列表: []
+  })
+  
+  // 工艺详情列筛选
+  const dagongxuFilters = computed(() => {
+    const processes = new Set(
+      gyDetailFormData.工艺列表
+        .filter((item) => !item._gyDetailNew)
+        .map((item) => item.大工序)
+        .filter(Boolean)
+    )
+    return Array.from(processes).map((process) => ({ text: process, value: process }))
+  })
+
+  const gyDetailBuJianMingChengFilterOptions = computed(() => {
+    const names = new Set(
+      gyDetailFormData.工艺列表
+        .filter((item) => !item._gyDetailNew)
+        .map((item) => item.部件名称)
+        .filter(Boolean)
+    )
+    return Array.from(names).map((name) => ({ text: name, value: name }))
+  })
+
+  const gyDetailDifficultyFilterOptions = computed(() => {
+    const values = new Set(gyDetailDifficultyOptions)
+    for (const item of gyDetailFormData.工艺列表 || []) {
+      if (item._gyDetailNew) continue
+      const v = normalizeGyDetailField(item?.难度系数)
+      if (v) values.add(v)
+    }
+    return Array.from(values).map((v) => ({ text: v, value: v }))
+  })
+
+  const gyDetailStatusFilterOptions = [
+    { text: '正常', value: '0' },
+    { text: '被拆分', value: '1' },
+  ]
+
+  const getGyDetailRowStatusFilterValue = (row) => {
+    const code = Number(row?.状态)
+    if (code === 1) return '1'
+    if (code === 0) return '0'
+    return normalizeGyDetailField(row?.状态)
+  }
+  
+  const gdgyupdateCompanyFunc = async (row) => {
+    const workorder = _Gd_gdbh.value || row['订单编号'] || ''
+    if (!workorder) {
+      ElMessage.warning('请先选择订单')
+      return
+    }
+    
+    try {
+      // 获取订单信息
+      const orderInfoRes = await WorkOrderList({ search: workorder, page: 1, limit: 1 })
+      if (orderInfoRes.code === 0 && orderInfoRes.data && orderInfoRes.data.data && orderInfoRes.data.data.length > 0) {
+        const data = orderInfoRes.data.data[0]
+        gyDetailFormData.订单编号 = data['订单编号'] || ''
+        gyDetailFormData.客户编号 = data['客户编号'] || ''
+        gyDetailFormData.生产款号 = data['生产款号'] || ''
+        gyDetailFormData.款式 = data['款式'] || ''
+        gyDetailFormData.落货日期 = data['落货日期'] || ''
+        gyDetailFormData.制单日期 = data['Sys_rq'] || ''
+        gyDetailFormData.接单日期 = data['接单日期'] || ''
+        // 制单人:如果有/则显示/后的值,否则全部显示
+        const sysId = data['Sys_id'] || ''
+        gyDetailFormData.制单人 = sysId.includes('/') ? sysId.split('/')[1] : sysId
+        gyDetailFormData.订单数量 = data['订单数量'] || ''
+        gyDetailFormData.计划制造工分 = data['计划制造工分'] || ''
+        const finishDateRaw = String(data['工单完工日期'] || '').trim()
+        gyDetailFormData.工单完工日期 = finishDateRaw || null
+        gyDetailFormData.备注 = data['remark'] || ''
+        gyDetailFormData.Sys_id = data['Sys_id'] || data['sys_id'] || row?.['Sys_id'] || row?.['sys_id'] || ''
+        gyDetailFormData.Sys_rq = data['Sys_rq'] || data['sys_rq'] || ''
+        gyDetailFormData.Uniqid = data['Uniqid'] || ''
+      }
+      
+      // 获取工艺列表
+      const processRes = await getWorkOrderProcess({ workorder })
+      if (processRes.code === 0 && Array.isArray(processRes.data)) {
+        gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
+      } else {
+        gyDetailFormData.工艺列表 = []
+      }
+      
+      initGyDetailFilters()
+      gyDetailPlanManufactureEditing.value = false
+      gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分
+      gyDetailDialogVisible.value = true
+      await nextTick()
+      updateGyDetailTableHeight()
+    } catch (error) {
+      console.error('获取工艺资料详情失败', error)
+      ElMessage.error('获取工艺资料详情失败')
+    }
+  }
+  
+  const gyDetailSelection = ref([])
+  const gyDetailDeleting = ref(false)
+  const gyDetailSaving = ref(false)
+  const gyDetailTableWrapRef = ref(null)
+  const gyDetailTableRef = ref(null)
+  const gyDetailTableHeight = ref(480)
+  const gyDetailTableMinWidth = 1320
+  let gyDetailResizeObserver = null
+
+  const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
+  
+  const isGyDetailCellEditable = (column) => {
+    const editableColumns = ['部件名称', '工序名称', '大工序', '工分', '定额分']
+    if (editableColumns.includes(column)) {
+      return true
+    }
+    return !gyDetailReadonly.value
+  }
+  const gyDetailEditingCell = ref(null)
+  const gyDetailCellInputRef = ref(null)
+  const gyDetailLastEditingField = ref(null)
+  const isGyDetailNavigating = ref(false)
+
+  const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
+  const gyDetailDifficultyOptions = ['A', 'B', 'C']
+
+  const sanitizeGyDetailDecimalInput = (val) => {
+    if (val === null || val === undefined) return ''
+    let s = String(val).replace(/[^\d.]/g, '')
+    const dotIndex = s.indexOf('.')
+    if (dotIndex !== -1) {
+      s = s.slice(0, dotIndex + 1) + s.slice(dotIndex + 1).replace(/\./g, '')
+    }
+    return s
+  }
+
+  /** 四舍五入保留两位;空/非法返回空串 */
+  const roundGyDetail2 = (n) => {
+    if (!Number.isFinite(n)) return ''
+    return (Math.round(n * 100) / 100).toFixed(2)
+  }
+
+  /**
+   * 工分 ↔ 金额 ↔ 秒/分 联动
+   * 秒 = 60/0.25 * 金额;分 = 秒/60
+   * 金额 = 工分 * 0.067;工分 = 金额 / 0.067
+   * (两式互为倒数;若都乘 0.067 无法双向换算)
+   */
+  const applyGyDetailScoreMoneyCalc = (row, sourceField) => {
+    if (!row || (sourceField !== '定额分' && sourceField !== '金额')) return
+    const raw = String(row[sourceField] ?? '').trim()
+    if (raw === '' || raw === '.') {
+      if (sourceField === '定额分') {
+        row.金额 = ''
+        row.秒 = ''
+        row.分 = ''
+      } else {
+        row.定额分 = ''
+        row.秒 = ''
+        row.分 = ''
+      }
+      return
+    }
+    const num = parseFloat(raw)
+    if (!Number.isFinite(num)) return
+
+    if (sourceField === '定额分') {
+      const money = num * 0.067
+      const seconds = (60 / 0.25) * money
+      row.金额 = roundGyDetail2(money)
+      row.秒 = roundGyDetail2(seconds)
+      row.分 = roundGyDetail2(seconds / 60)
+      return
+    }
+
+    const score = num / 0.067
+    const seconds = (60 / 0.25) * num
+    row.定额分 = roundGyDetail2(score)
+    row.秒 = roundGyDetail2(seconds)
+    row.分 = roundGyDetail2(seconds / 60)
+  }
+
+  const onGyDetailDecimalInput = (row, field, val) => {
+    row[field] = sanitizeGyDetailDecimalInput(val)
+    applyGyDetailScoreMoneyCalc(row, field)
+    refreshGyDetailTableFooter()
+  }
+
+  const formatGyDetailCellText = (val) => {
+    if (val === null || val === undefined) return ''
+    return String(val)
+  }
+
+  /** 工艺状态:0 正常,1 被拆分(接口可能为字符串) */
+  const formatGyDetailStatus = (status) => {
+    const code = Number(status)
+    if (code === 1) return '被拆分'
+    if (code === 0) return '正常'
+    return ''
+  }
+
+  const isGyDetailRowSplit = (row) => Number(row?.状态) === 1
+
+  const isGyDetailCellEditing = (row, field) => {
+    if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return false
+    const editing = gyDetailEditingCell.value
+    return editing?.rowKey === row._rowKey && editing?.field === field
+  }
+
+  const setGyDetailCellInputRef = (el) => {
+    gyDetailCellInputRef.value = el
+  }
+
+  const startGyDetailCellEdit = (row, field) => {
+    if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
+    // 先清除之前的输入框引用,确保新输入框能正确获取焦点
+    gyDetailCellInputRef.value = null
+    gyDetailEditingCell.value = { rowKey: row._rowKey, field }
+  }
+
+  // 键盘导航字段顺序
+  const navFields = ['部件名称', '工序名称', '秒', '分', '定额分', '金额']
+  
+  // 处理单元格键盘事件
+  const handleGyDetailCellKeydown = async (event, row, field) => {
+    const key = event.key
+    
+    // 只处理方向键
+    if (!['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp'].includes(key)) {
+      return
+    }
+    
+    // 阻止浏览器默认行为(页面滚动)
+    event.preventDefault()
+    
+    const fieldIndex = navFields.indexOf(field)
+    
+    // 如果不是导航字段,不处理
+    if (fieldIndex === -1) return
+    
+    const processList = gyDetailFormData.工艺列表
+    const rowIndex = processList.findIndex(r => r._rowKey === row._rowKey)
+    
+    if (rowIndex === -1) return
+    
+    let targetRow = row
+    let targetField = field
+    let shouldMove = false
+    
+    switch (key) {
+      case 'ArrowRight':
+        // 向右移动到下一个字段
+        if (fieldIndex < navFields.length - 1) {
+          targetField = navFields[fieldIndex + 1]
+          shouldMove = true
+        }
+        break
+      case 'ArrowLeft':
+        // 向左移动到上一个字段
+        if (fieldIndex > 0) {
+          targetField = navFields[fieldIndex - 1]
+          shouldMove = true
+        }
+        break
+      case 'ArrowDown':
+        // 向下移动到下一行
+        if (rowIndex < processList.length - 1) {
+          targetRow = processList[rowIndex + 1]
+          shouldMove = true
+        }
+        break
+      case 'ArrowUp':
+        // 向上移动到上一行
+        if (rowIndex > 0) {
+          targetRow = processList[rowIndex - 1]
+          shouldMove = true
+        }
+        break
+    }
+    
+    // 如果需要移动,切换焦点
+    if (shouldMove) {
+      // 先完成当前单元格的编辑(保存数据)
+      await finishGyDetailCellEdit(row)
+      // 然后移动到新单元格
+      startGyDetailCellEdit(targetRow, targetField)
+    }
+  }
+
+  const clearGyDetailCellEdit = () => {
+    gyDetailEditingCell.value = null
+    gyDetailCellInputRef.value = null
+  }
+
+
+
+  const finishGyDetailCellEdit = async (row) => {
+    if (!gyDetailEditingCell.value) return
+    const editingField = gyDetailEditingCell.value.field
+    gyDetailLastEditingField.value = editingField
+    
+    // 检查当前编辑字段的值是否变化
+    const currentValue = normalizeGyDetailField(row[editingField])
+    const originValue = normalizeGyDetailField(row._gyDetailOrigin?.[editingField])
+    const isFieldChanged = currentValue !== originValue
+    
+    clearGyDetailCellEdit()
+    
+    // 如果字段值没有变化,直接返回,不做任何操作
+    if (!isFieldChanged && !row._gyDetailNew) {
+      return
+    }
+
+    // 失焦时再按工分/金额公式落一次(四舍五入两位),并带上联动字段一起保存
+    if (editingField === '定额分' || editingField === '金额') {
+      applyGyDetailScoreMoneyCalc(row, editingField)
+      if (editingField === '定额分' && String(row.定额分 ?? '').trim() !== '') {
+        row.定额分 = roundGyDetail2(parseFloat(row.定额分))
+      }
+      if (editingField === '金额' && String(row.金额 ?? '').trim() !== '') {
+        row.金额 = roundGyDetail2(parseFloat(row.金额))
+      }
+      refreshGyDetailTableFooter()
+    }
+    
+    // 新行:未齐三个必填时,工分等字段暂不提交;已齐则继续(可能已新增过,由 handleUpdateProcess 决定增/改)
+    if (row._gyDetailNew && editingField !== '工序名称' && editingField !== '部件名称') {
+      const buJianMingCheng = String(row.部件名称 || '').trim()
+      const gongXuMingCheng = String(row.工序名称 || '').trim()
+      const daGongXu = String(row.大工序 || '').trim()
+      if (!buJianMingCheng || !gongXuMingCheng || !daGongXu) {
+        return
+      }
+    }
+    
+    if (editingField === '部件名称') {
+      const buJianMingCheng = String(row.部件名称 || '').trim()
+      if (!buJianMingCheng) {
+        row.部件编号 = ''
+      } else {
+        ensureGyDetailPartCode(row)
+      }
+      
+      // 自动填写生产工序
+      const autoFillOptions = ['裁剪', '手工', '大烫', '总检', '包装']
+      if (autoFillOptions.includes(buJianMingCheng)) {
+        row.大工序 = buJianMingCheng
+      } else if (buJianMingCheng) {
+        row.大工序 = '车缝'
+      }
+      
+      // 新行编辑部件名称时,检查工序名称是否已填写
+      if (row._gyDetailNew) {
+        const gongXuMingCheng = String(row.工序名称 || '').trim()
+        if (!gongXuMingCheng) {
+          ElMessage.warning('请先填写工序名称')
+          return
+        }
+      }
+    }
+    
+	if (editingField === '定额分') {
+  // 获取所有未拆分的数据
+  const unsplitData = gyDetailDisplayProcessList.value.filter(
+    row => !isGyDetailRowSplit(row)
+  );
+  
+  // 计算未拆分工序的总工分
+  const unsplitTotalScore = unsplitData.reduce(
+    (sum, row) => sum + (parseFloat(row.定额分) || 0), 
+    0
+  );
+  
+  // 获取计划制造工分
+  const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0;
+  
+  // 如果未拆分工序的总工分超过计划制造工分,回退并提示
+  if (unsplitTotalScore > planManufactureScore) {
+    ElMessage.warning(`未拆分工序总工分(${unsplitTotalScore.toFixed(2)})不能大于计划制造工分(${planManufactureScore.toFixed(2)})`);
+    row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分;
+    refreshGyDetailTableFooter();
+    return;
+  }
+}
+    
+    await handleUpdateProcess(row)
+    refreshGyDetailTableFooter()
+  }
+
+  watch(gyDetailEditingCell, async (cell) => {
+    if (!cell) return
+    await nextTick()
+    await nextTick() // 多等一个tick确保DOM更新
+    
+    // 优先使用ref引用
+    const comp = gyDetailCellInputRef.value
+    if (comp?.focus) {
+      comp.focus()
+      comp.select?.()
+      return
+    }
+    
+    // 如果ref没有值,尝试从DOM中查找当前编辑单元格的输入框
+    const inputEl = comp?.input || comp?.$el?.querySelector?.('input')
+    if (inputEl) {
+      inputEl.focus?.()
+      inputEl.select?.()
+      return
+    }
+    
+    // 最后的备选方案:查找所有可见的输入框
+    const allInputs = document.querySelectorAll('.gy-detail-cell-input input')
+    if (allInputs.length > 0) {
+      const lastInput = allInputs[allInputs.length - 1]
+      lastInput.focus()
+      lastInput.select()
+    }
+  })
+
+  const normalizeGyDetailField = (val) => String(val ?? '').trim()
+
+  const snapshotGyDetailRow = (row) => ({
+    部件编号: normalizeGyDetailField(row?.部件编号),
+    部件名称: normalizeGyDetailField(row?.部件名称),
+    工序编号: normalizeGyDetailField(row?.工序编号),
+    工序名称: normalizeGyDetailField(row?.工序名称),
+    大工序: normalizeGyDetailField(row?.大工序),
+    秒: normalizeGyDetailField(row?.秒),
+    分: normalizeGyDetailField(row?.分),
+    定额分: normalizeGyDetailField(row?.定额分),
+    金额: normalizeGyDetailField(row?.金额),
+    难度系数: normalizeGyDetailField(row?.难度系数),
+    备注: normalizeGyDetailField(row?.备注),
+  })
+
+  const isGyDetailRowChanged = (row) => {
+    const current = snapshotGyDetailRow(row)
+    const origin = row?._gyDetailOrigin || {}
+    return Object.keys(current).some((key) => current[key] !== origin[key])
+  }
+
+  const attachGyDetailRowMeta = (row, index) => {
+    const item = {
+      ...row,
+      _rowKey: row.id ? `id_${row.id}` : `idx_${index}_${row.工序编号 ?? ''}`,
+    }
+    item._gyDetailOrigin = snapshotGyDetailRow(item)
+    return item
+  }
+
+  const assignGyDetailRowKeys = (list) => {
+    if (!Array.isArray(list)) return []
+    return list.map((row, index) => attachGyDetailRowMeta(row, index))
+  }
+
+  const updateGyDetailTableHeight = () => {
+    const el = gyDetailTableWrapRef.value
+    if (el?.clientHeight > 0) {
+      // 预留底部横向滚动条高度
+      gyDetailTableHeight.value = Math.max(240, el.clientHeight - 16)
+    }
+    nextTick(() => {
+      gyDetailTableRef.value?.recalculate?.()
+    })
+  }
+
+  const gyDetailBuJianMingChengFilter = ref([])
+  const gyDetailDaGongXuFilter = ref([])
+  const gyDetailNanDuXiShuFilter = ref([])
+  const gyDetailZhuangTaiFilter = ref([])
+  
+  // 跟踪每个筛选是否被用户手动设置过
+  const gyDetailBuJianMingChengFilterManuallySet = ref(false)
+  const gyDetailDaGongXuFilterManuallySet = ref(false)
+  const gyDetailNanDuXiShuFilterManuallySet = ref(false)
+  const gyDetailZhuangTaiFilterManuallySet = ref(false)
+
+  const isGyDetailFilterActive = (selectedRef, options) => {
+    const optionList = Array.isArray(options) ? options : (options?.value || [])
+    const allValues = optionList.map((item) => item.value)
+    const selected = selectedRef?.value ?? selectedRef ?? []
+    if (!allValues.length) return false
+    return selected.length < allValues.length
+  }
+
+  /** 模板里 ref 会自动解包为数组,脚本里传的是 ref,需兼容两种写法 */
+  const setGyDetailFilterSelected = (filterRef, values) => {
+    const next = [...values]
+    if (isRef(filterRef)) {
+      filterRef.value = next
+      return
+    }
+    if (Array.isArray(filterRef)) {
+      filterRef.splice(0, filterRef.length, ...next)
+    }
+  }
+
+  const selectAllGyDetailFilter = (filterRef, options) => {
+    const optionList = Array.isArray(options) ? options : (options?.value || [])
+    setGyDetailFilterSelected(filterRef, optionList.map((item) => item.value))
+  }
+
+  const clearGyDetailFilter = (filterRef) => {
+    setGyDetailFilterSelected(filterRef, [])
+  }
+  
+  // 部件名称筛选操作
+  const selectAllGyDetailBuJianMingChengFilter = () => {
+    gyDetailBuJianMingChengFilterManuallySet.value = true
+    selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
+  }
+  const clearGyDetailBuJianMingChengFilter = () => {
+    gyDetailBuJianMingChengFilterManuallySet.value = true
+    clearGyDetailFilter(gyDetailBuJianMingChengFilter)
+  }
+  const handleGyDetailBuJianMingChengFilterChange = () => {
+    gyDetailBuJianMingChengFilterManuallySet.value = true
+  }
+  
+  // 大工序筛选操作
+  const selectAllGyDetailDaGongXuFilter = () => {
+    gyDetailDaGongXuFilterManuallySet.value = true
+    selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
+  }
+  const clearGyDetailDaGongXuFilter = () => {
+    gyDetailDaGongXuFilterManuallySet.value = true
+    clearGyDetailFilter(gyDetailDaGongXuFilter)
+  }
+  const handleGyDetailDaGongXuFilterChange = () => {
+    gyDetailDaGongXuFilterManuallySet.value = true
+  }
+  
+  // 难度系数筛选操作
+  const selectAllGyDetailNanDuXiShuFilter = () => {
+    gyDetailNanDuXiShuFilterManuallySet.value = true
+    selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
+  }
+  const clearGyDetailNanDuXiShuFilter = () => {
+    gyDetailNanDuXiShuFilterManuallySet.value = true
+    clearGyDetailFilter(gyDetailNanDuXiShuFilter)
+  }
+  const handleGyDetailNanDuXiShuFilterChange = () => {
+    gyDetailNanDuXiShuFilterManuallySet.value = true
+  }
+  
+  // 状态筛选操作
+  const selectAllGyDetailZhuangTaiFilter = () => {
+    gyDetailZhuangTaiFilterManuallySet.value = true
+    selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
+  }
+  const clearGyDetailZhuangTaiFilter = () => {
+    gyDetailZhuangTaiFilterManuallySet.value = true
+    clearGyDetailFilter(gyDetailZhuangTaiFilter)
+  }
+  const handleGyDetailZhuangTaiFilterChange = () => {
+    gyDetailZhuangTaiFilterManuallySet.value = true
+  }
+
+  const applyGyDetailColumnFilter = (list, filterRef, options, matchRow, isManuallySet) => {
+    // 如果没有被用户手动设置过筛选,直接返回所有数据
+    if (!isManuallySet) {
+      return list
+    }
+    const optionList = Array.isArray(options) ? options : (options?.value || [])
+    const selected = filterRef.value
+    if (!selected.length) return list
+    if (!optionList.length || selected.length >= optionList.length) return list
+    const set = new Set(selected.map((v) => normalizeGyDetailField(v)))
+    return list.filter((row) => row._gyDetailNew || set.has(matchRow(row)))
+  }
+
+  const gyDetailDisplayProcessList = computed(() => {
+    let list = gyDetailFormData.工艺列表 || []
+    list = applyGyDetailColumnFilter(
+      list,
+      gyDetailBuJianMingChengFilter,
+      gyDetailBuJianMingChengFilterOptions.value,
+      (row) => normalizeGyDetailField(row.部件名称),
+      gyDetailBuJianMingChengFilterManuallySet.value,
+    )
+    list = applyGyDetailColumnFilter(
+      list,
+      gyDetailDaGongXuFilter,
+      dagongxuFilters.value,
+      (row) => normalizeGyDetailField(row.大工序),
+      gyDetailDaGongXuFilterManuallySet.value,
+    )
+    list = applyGyDetailColumnFilter(
+      list,
+      gyDetailNanDuXiShuFilter,
+      gyDetailDifficultyFilterOptions.value,
+      (row) => normalizeGyDetailField(row.难度系数),
+      gyDetailNanDuXiShuFilterManuallySet.value,
+    )
+    list = applyGyDetailColumnFilter(
+      list,
+      gyDetailZhuangTaiFilter,
+      gyDetailStatusFilterOptions,
+      (row) => getGyDetailRowStatusFilterValue(row),
+      gyDetailZhuangTaiFilterManuallySet.value,
+    )
+    return list
+  })
+
+  const syncGyDetailFilterAfterDataChange = (filterRef, options) => {
+    // 禁用自动同步筛选,只在用户手动点击时才触发
+    // const optionList = Array.isArray(options) ? options : (options?.value || [])
+    // const allValues = optionList.map((item) => item.value)
+    // const selected = filterRef.value
+    // if (!selected.length) {
+    //   filterRef.value = [...allValues]
+    //   return
+    // }
+    // const wasAllSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v))
+    // if (wasAllSelected) {
+    //   filterRef.value = [...allValues]
+    //   return
+    // }
+    // filterRef.value = selected.filter((v) => allValues.includes(v))
+  }
+
+  /** 打开详情或刷新后:默认全选各列筛选项 */
+  const initGyDetailFilters = () => {
+    // 重置手动设置标志位为 false
+    gyDetailBuJianMingChengFilterManuallySet.value = false
+    gyDetailDaGongXuFilterManuallySet.value = false
+    gyDetailNanDuXiShuFilterManuallySet.value = false
+    gyDetailZhuangTaiFilterManuallySet.value = false
+    // 初始化筛选选项
+    selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
+    selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
+    selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
+    selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
+  }
+
+  const syncGyDetailFiltersAfterDataChange = () => {
+    syncGyDetailFilterAfterDataChange(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
+    syncGyDetailFilterAfterDataChange(gyDetailDaGongXuFilter, dagongxuFilters)
+    syncGyDetailFilterAfterDataChange(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
+    syncGyDetailFilterAfterDataChange(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
+  }
+
+  const sumGyDetailDisplayField = (field) => {
+    let total = 0
+    let count = 0
+    for (const item of gyDetailDisplayProcessList.value || []) {
+      const val = Number(item?.[field])
+      if (!Number.isNaN(val)) {
+        total += val
+        count++
+      }
+    }
+    return count > 0 ? total.toFixed(2) : '0.00'
+  }
+
+  const gyDetailFooterSums = computed(() => ({
+    秒: sumGyDetailDisplayField('秒'),
+    分: sumGyDetailDisplayField('分'),
+    定额分: sumGyDetailDisplayField('定额分'),
+    金额: sumGyDetailDisplayField('金额'),
+  }))
+
+  const gyDetailFooterMethod = () => {
+  // 与拆分判断一致:状态 1 为被拆分,其余(含数字 0 / 字符串 '0')都计入合计
+  const normalData = (gyDetailDisplayProcessList.value || []).filter(
+    (row) => !isGyDetailRowSplit(row)
+  )
+  
+  // 如果没有正常数据,合计全部为0
+  if (normalData.length === 0) {
+    return [['合计', '', '', '', '', '', '0.00', '0.00', '0.00', '0.00', '', '', '', '']]
+  }
+  
+  // 计算各项合计
+  const sums = {
+    秒: normalData.reduce((sum, row) => sum + (Number(row.秒) || 0), 0),
+    分: normalData.reduce((sum, row) => sum + (Number(row.分) || 0), 0),
+    定额分: normalData.reduce((sum, row) => sum + (Number(row.定额分) || 0), 0),
+    金额: normalData.reduce((sum, row) => sum + (Number(row.金额) || 0), 0),
+  }
+  
+  return [[
+    '合计',
+    '',
+    '',
+    '',
+    '',
+    '',
+    sums.秒.toFixed(2),
+    sums.分.toFixed(2),
+    sums.定额分.toFixed(2),
+    sums.金额.toFixed(2),
+    '',
+    '',
+    '',
+    '',
+  ]]
+}
+
+  const refreshGyDetailTableFooter = () => {
+    nextTick(() => {
+      const $table = gyDetailTableRef.value
+      $table?.updateFooter?.()
+      $table?.recalculate?.()
+    })
+  }
+
+  watch(
+    [gyDetailBuJianMingChengFilter, gyDetailDaGongXuFilter, gyDetailNanDuXiShuFilter, gyDetailZhuangTaiFilter],
+    refreshGyDetailTableFooter,
+    { deep: true },
+  )
+  watch(gyDetailDisplayProcessList, refreshGyDetailTableFooter)
+
+  const gyDetailPrintTableData = computed(() => {
+    return (gyDetailFormData.工艺列表 || []).map((row) => ({
+      部位编号: row.部件编号 ?? '',
+      部位名称: row.部件名称 ?? '',
+      工序编号: row.工序编号 ?? '',
+      工序名称: row.工序名称 ?? '',
+      生产工序: row.大工序 ?? '',
+    }))
+  })
+
+  const getNextGyDetailProcessCode = () => {
+    const list = gyDetailFormData.工艺列表 || []
+    let max = 0
+    for (const row of list) {
+      const n = parseInt(String(row.工序编号 ?? '').trim(), 10)
+      if (!Number.isNaN(n) && n > max) {
+        max = n
+      }
+    }
+    return max + 1
+  }
+
+  const handleGyDetailCheckboxChange = ({ records }) => {
+    gyDetailSelection.value = records || []
+  }
+
+  watch(gyDetailDialogVisible, async (visible) => {
+    if (visible) {
+      await nextTick()
+      updateGyDetailTableHeight()
+      if (!gyDetailResizeObserver && gyDetailTableWrapRef.value) {
+        gyDetailResizeObserver = new ResizeObserver(() => updateGyDetailTableHeight())
+        gyDetailResizeObserver.observe(gyDetailTableWrapRef.value)
+      }
+    }
+  })
+
+  onBeforeUnmount(() => {
+    gyDetailResizeObserver?.disconnect()
+    gyDetailResizeObserver = null
+  })
+
+  const clearGyDetailTableSelection = async () => {
+    gyDetailSelection.value = []
+    await nextTick()
+    const $table = gyDetailTableRef.value
+    if ($table?.clearCheckboxRow) {
+      $table.clearCheckboxRow()
+    }
+  }
+
+  const refreshGyDetailProcessList = async () => {
+    const workorder = gyDetailFormData.订单编号
+    if (!workorder) return
+    const processRes = await getWorkOrderProcess({ workorder })
+    if (processRes.code === 0 && Array.isArray(processRes.data)) {
+      gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
+    } else {
+      gyDetailFormData.工艺列表 = []
+    }
+    await clearGyDetailTableSelection()
+    // syncGyDetailFiltersAfterDataChange() // 禁用自动同步筛选,只在用户手动点击时才触发
+    await nextTick()
+    updateGyDetailTableHeight()
+  }
+
+  const scrollGyDetailTableToBottom = async (row) => {
+    await nextTick()
+    const $table = gyDetailTableRef.value
+    const visibleList = gyDetailDisplayProcessList.value
+    const targetRow = row && visibleList.includes(row) ? row : visibleList[visibleList.length - 1]
+    if (!targetRow) return
+
+    const scrollToTarget = () => {
+      if ($table?.scrollToRow) {
+        $table.scrollToRow(targetRow)
+      } else {
+        const body = gyDetailTableWrapRef.value?.querySelector('.vxe-table--body-wrapper')
+        if (body) body.scrollTop = body.scrollHeight
+      }
+      $table?.setCurrentRow?.(targetRow)
+    }
+
+    scrollToTarget()
+    requestAnimationFrame(scrollToTarget)
+  }
+
+  const openGyDetailProcessAdd = async () => {
+    const orderNo = String(gyDetailFormData.订单编号 || '').trim()
+    if (!orderNo) {
+      ElMessage.warning('无订单编号,无法新增工艺')
+      return
+    }
+    const batchCount = 10
+    const startIndex = gyDetailFormData.工艺列表.length
+    for (let i = 0; i < batchCount; i++) {
+      const nextCode = getNextGyDetailProcessCode()
+      const newRow = {
+        id: '',
+        部件编号: '',
+        部件名称: '',
+        工序编号: String(nextCode),
+        工序名称: '',
+        大工序: '',
+        秒: '',
+        分: '',
+        定额分: '',
+        金额: '',
+        难度系数: 'C',
+        备注: '',
+        状态: 0,
+        _gyDetailNew: true,
+        _rowKey: `new_${Date.now()}_${nextCode}_${i}`,
+      }
+      gyDetailFormData.工艺列表.push(newRow)
+      newRow._gyDetailOrigin = snapshotGyDetailRow(newRow)
+    }
+    // 聚焦本次新增的第一条空白行(不是最后一条)
+    const firstNewRow = gyDetailFormData.工艺列表[startIndex]
+    await scrollGyDetailTableToBottom(firstNewRow)
+    if (!gyDetailReadonly.value && firstNewRow) {
+      startGyDetailCellEdit(firstNewRow, '工序名称')
+    }
+  }
+
+
+
+  const handleGyDetailBatchDelete = async () => {
+    if (gyDetailDeleting.value) return
+    if (!gyDetailSelection.value.length) {
+      ElMessage.warning('请先勾选要删除的工序')
+      return
+    }
+    const selectedRows = [...gyDetailSelection.value]
+    try {
+      await ElMessageBox.confirm('确定删除选中的工序吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+        appendTo: document.body,
+      })
+    } catch {
+      return
+    }
+
+    gyDetailDeleting.value = true
+    let failCount = 0
+    try {
+      for (const row of selectedRows) {
+        if (!row.id || row._gyDetailNew) {
+          const index = gyDetailFormData.工艺列表.indexOf(row)
+          if (index > -1) {
+            gyDetailFormData.工艺列表.splice(index, 1)
+          }
+          continue
+        }
+        const result = await DeleteProcess({ id: row.id })
+        if (result?.code !== 0) {
+          failCount += 1
+        }
+      }
+      await refreshGyDetailProcessList()
+      if (failCount > 0) {
+        ElMessage.warning(`有 ${failCount} 条删除失败,列表已刷新`)
+      } else {
+        ElMessage.success('删除成功')
+      }
+    } catch (e) {
+      console.error('批量删除工艺失败', e)
+      ElMessage.error('删除失败')
+      try {
+        await refreshGyDetailProcessList()
+      } catch {
+        /* ignore */
+      }
+    } finally {
+      gyDetailDeleting.value = false
+      document.body.classList.remove('el-popup-parent--hidden')
+      document.body.style.overflow = ''
+    }
+  }
+
+  const escapeGyPrintHtml = (val) => {
+    return String(val ?? '')
+      .replace(/&/g, '&amp;')
+      .replace(/</g, '&lt;')
+      .replace(/>/g, '&gt;')
+      .replace(/"/g, '&quot;')
+  }
+
+  const GY_DETAIL_PRINT_PAGE_STYLE = `
+    @page { size: A4 portrait; margin: 5mm 6mm; }
+    * { box-sizing: border-box; }
+    body {
+      margin: 0;
+      padding: 0;
+      font-family: "Microsoft YaHei", SimSun, sans-serif;
+      font-size: 12px;
+      line-height: 1.25;
+      color: #000;
+    }
+    .gy-print-table {
+      width: 100%;
+      border-collapse: collapse;
+      table-layout: fixed;
+      font-size: 18px;
+    }
+    .gy-print-table th,
+    .gy-print-table td {
+      border: 1px solid #000;
+      padding: 2px 4px;
+      text-align: center;
+      vertical-align: middle;
+      word-break: break-word;
+      overflow-wrap: anywhere;
+    }
+    .gy-print-table th { font-weight: bold; padding: 3px 4px; }
+    .gy-print-sheet-head td {
+      border: none;
+      padding: 0 4px;
+      text-align: center;
+      vertical-align: middle;
+    }
+    .gy-print-sheet-head--company-cn td {
+      padding-top: 2px;
+      padding-bottom: 2px;
+      font-size: 18px;
+      font-weight: bold;
+      line-height: 1.35;
+      letter-spacing: 2px;
+    }
+    .gy-print-sheet-head--company-en td {
+      padding-bottom: 6px;
+      font-size: 11px;
+      font-weight: normal;
+      line-height: 1.3;
+      letter-spacing: 0.5px;
+    }
+    .gy-print-sheet-head--title td {
+      font-size: 24px;
+      font-weight: bold;
+      letter-spacing: 6px;
+      padding-bottom: 8px;
+      line-height: 1.2;
+      text-align: left;
+    }
+    .gy-print-sheet-head--meta td {
+      font-size: 13px;
+      font-weight: normal;
+      padding-bottom: 2px;
+      letter-spacing: 0.5px;
+    }
+    .gy-print-sheet-head--meta-last td {
+      padding-bottom: 6px;
+    }
+    .gy-print-meta-row {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      width: 100%;
+      text-align: left;
+    }
+    .gy-print-table col.col-part-no { width: 80px; }
+    .gy-print-table col.col-part-name { width: 80px; }
+    .gy-print-table col.col-process-no { width: 80px; }
+    .gy-print-table col.col-workshop { width: 12%; }
+    .gy-print-table col.col-process-name { width: auto; }
+    .gy-print-table .col-part-no,
+    .gy-print-table .col-part-name,
+    .gy-print-table .col-process-no {
+      padding: 2px 3px;
+      white-space: nowrap;
+    }
+    .gy-print-table .col-process-name { text-align: left; }
+    thead { display: table-header-group; }
+    tr { page-break-inside: avoid; }
+  `
+
+  const buildGyDetailPrintHtml = () => {
+    const rows = gyDetailPrintTableData.value
+    const rowHtml = rows.length
+      ? rows
+          .map(
+            (item) => `<tr>
+        <td class="col-part-no">${escapeGyPrintHtml(item.部位编号)}</td>
+        <td class="col-part-name">${escapeGyPrintHtml(item.部位名称)}</td>
+        <td class="col-process-no">${escapeGyPrintHtml(item.工序编号)}</td>
+        <td class="col-process-name">${escapeGyPrintHtml(item.工序名称)}</td>
+        <td class="col-workshop">${escapeGyPrintHtml(item.生产工序)}</td>
+      </tr>`
+          )
+          .join('')
+      : '<tr><td colspan="5" style="padding:16px;text-align:center;">暂无数据</td></tr>'
+    const orderNo = escapeGyPrintHtml(gyDetailFormData.订单编号)
+    const styleNo = escapeGyPrintHtml(gyDetailFormData.生产款号)
+    const customerNo = escapeGyPrintHtml(gyDetailFormData.客户编号)
+    const productStyle = escapeGyPrintHtml(gyDetailFormData.款式)
+
+    return `
+      <table class="gy-print-table">
+        <colgroup>
+          <col class="col-part-no" />
+          <col class="col-part-name" />
+          <col class="col-process-no" />
+          <col class="col-process-name" />
+          <col class="col-workshop" />
+        </colgroup>
+        <thead>
+          <tr class="gy-print-sheet-head gy-print-sheet-head--company-cn">
+            <td colspan="5">浙 江 达 成 凯 悦 纺 织 服 装 有 限 公 司</td>
+          </tr>
+          <tr class="gy-print-sheet-head gy-print-sheet-head--company-en">
+            <td colspan="5">ZHE JIANG REACHING KAYO TEXTILE &amp; GARMENTS CO LTD</td>
+          </tr>
+          <tr class="gy-print-sheet-head gy-print-sheet-head--title">
+            <td colspan="5">工序表</td>
+          </tr>
+          <tr class="gy-print-sheet-head gy-print-sheet-head--meta">
+            <td colspan="5">
+              <div class="gy-print-meta-row">
+                <span>订单编号:${orderNo}</span>
+                <span>生产款号:${styleNo}</span>
+              </div>
+            </td>
+          </tr>
+          <tr class="gy-print-sheet-head gy-print-sheet-head--meta gy-print-sheet-head--meta-last">
+            <td colspan="5">
+              <div class="gy-print-meta-row">
+                <span>客户编号:${customerNo}</span>
+                <span>款式:${productStyle}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <th class="col-part-no">部位编号</th>
+            <th class="col-part-name">部件名称</th>
+            <th class="col-process-no">工序编号</th>
+            <th class="col-process-name">工序名称</th>
+            <th class="col-workshop">生产工序</th>
+          </tr>
+        </thead>
+        <tbody>${rowHtml}</tbody>
+      </table>
+    `
+  }
+
+  let gyDetailPrintIframe = null
+  let gyDetailPrintMql = null
+
+  const showGyDetailPrintMask = () => {
+    if (document.getElementById('gy-detail-print-mask')) return
+    const mask = document.createElement('div')
+    mask.id = 'gy-detail-print-mask'
+    mask.style.cssText = 'position:fixed;inset:0;background:#fff;z-index:99999;'
+    document.body.appendChild(mask)
+    document.body.style.overflow = 'hidden'
+  }
+
+  const cleanupGyDetailPrint = (restoreDetail = false) => {
+    document.getElementById('gy-detail-print-mask')?.remove()
+    document.body.style.overflow = ''
+    if (gyDetailPrintMql) {
+      if (gyDetailPrintMql.removeListener) {
+        gyDetailPrintMql.removeListener(gyDetailPrintMqlHandler)
+      } else {
+        gyDetailPrintMql.removeEventListener('change', gyDetailPrintMqlHandler)
+      }
+      gyDetailPrintMql = null
+    }
+    if (gyDetailPrintIframe) {
+      gyDetailPrintIframe.remove()
+      gyDetailPrintIframe = null
+    }
+    if (restoreDetail) {
+      gyDetailDialogVisible.value = true
+    }
+  }
+
+  const gyDetailPrintMqlHandler = (e) => {
+    if (!e.matches) {
+      cleanupGyDetailPrint(true)
+    }
+  }
+
+  const handleGyDetailSave = async () => {
+    if (gyDetailReadonly.value || gyDetailSaving.value) return
+    gyDetailSaving.value = true
+    try {
+      // 先结束当前单元格编辑(原先保存按钮只 blur,没有真正提交)
+      let hadEditingCell = false
+      if (gyDetailEditingCell.value) {
+        hadEditingCell = true
+        const editing = gyDetailEditingCell.value
+        const editingRow = (gyDetailFormData.工艺列表 || []).find((r) => r._rowKey === editing.rowKey)
+        if (editingRow) {
+          await finishGyDetailCellEdit(editingRow)
+        } else {
+          clearGyDetailCellEdit()
+        }
+      }
+
+      const pendingRows = (gyDetailFormData.工艺列表 || []).filter((row) => {
+        if (!isGyDetailRowChanged(row)) return false
+        // 完全空白的新行不提交
+        if (row._gyDetailNew && !row.id) {
+          const filled =
+            String(row.部件名称 || '').trim() ||
+            String(row.工序名称 || '').trim() ||
+            String(row.定额分 || '').trim() ||
+            String(row.金额 || '').trim() ||
+            String(row.秒 || '').trim() ||
+            String(row.分 || '').trim()
+          if (!filled) return false
+        }
+        return true
+      })
+
+      if (!pendingRows.length) {
+        // 编辑中的格子已在 finish 时保存并提示过,这里不再重复弹
+        if (!hadEditingCell) {
+          ElMessage.success('没有需要保存的修改')
+        }
+        return
+      }
+
+      let successCount = 0
+      let failCount = 0
+      let skipIncomplete = 0
+
+      for (const row of pendingRows) {
+        const requiredReady = !!(
+          String(row.部件名称 || '').trim() &&
+          String(row.工序名称 || '').trim() &&
+          String(row.大工序 || '').trim()
+        )
+        if (!row.id && !requiredReady) {
+          skipIncomplete++
+          continue
+        }
+        const ok = await handleUpdateProcess(row, { silent: true })
+        if (ok) successCount++
+        else failCount++
+      }
+
+      if (successCount > 0 && failCount === 0 && skipIncomplete === 0) {
+        ElMessage.success(successCount === 1 ? '保存成功' : `已保存 ${successCount} 条工序`)
+      } else if (successCount > 0) {
+        const parts = [`成功 ${successCount} 条`]
+        if (failCount) parts.push(`失败 ${failCount} 条`)
+        if (skipIncomplete) parts.push(`未填齐必填 ${skipIncomplete} 条`)
+        ElMessage.warning(parts.join(','))
+      } else if (skipIncomplete > 0 && failCount === 0) {
+        ElMessage.warning('请先填写部件名称、工序名称、生产工序后再保存')
+      } else {
+        ElMessage.error('保存失败')
+      }
+
+      refreshGyDetailTableFooter()
+    } catch (e) {
+      console.error('工艺资料保存失败', e)
+      ElMessage.error('保存失败')
+    } finally {
+      gyDetailSaving.value = false
+    }
+  }
+
+  const handleGyDetailPrintPreview = async () => {
+    if (!gyDetailFormData.工艺列表?.length) {
+      ElMessage.warning('暂无工艺数据,无法打印预览')
+      return
+    }
+    gyDetailDialogVisible.value = false
+    await nextTick()
+    showGyDetailPrintMask()
+
+    try {
+      gyDetailPrintIframe = document.createElement('iframe')
+      gyDetailPrintIframe.setAttribute(
+        'style',
+        'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;'
+      )
+      document.body.appendChild(gyDetailPrintIframe)
+
+      const printWin = gyDetailPrintIframe.contentWindow
+      if (!printWin) {
+        throw new Error('print iframe unavailable')
+      }
+
+      const html = `<!DOCTYPE html><html><head><meta charset="utf-8"><title>工艺资料</title>
+        <style>${GY_DETAIL_PRINT_PAGE_STYLE}</style></head><body>${buildGyDetailPrintHtml()}</body></html>`
+
+      const startPrint = () => {
+        printWin.focus()
+        printWin.print()
+      }
+
+      const onAfterPrint = () => cleanupGyDetailPrint(true)
+      printWin.addEventListener('afterprint', onAfterPrint, { once: true })
+
+      if (printWin.matchMedia) {
+        gyDetailPrintMql = printWin.matchMedia('print')
+        if (gyDetailPrintMql.addListener) {
+          gyDetailPrintMql.addListener(gyDetailPrintMqlHandler)
+        } else {
+          gyDetailPrintMql.addEventListener('change', gyDetailPrintMqlHandler)
+        }
+      }
+
+      printWin.document.open()
+      printWin.document.write(html)
+      printWin.document.close()
+
+      if (printWin.document.readyState === 'complete') {
+        startPrint()
+      } else {
+        gyDetailPrintIframe.onload = startPrint
+      }
+    } catch {
+      cleanupGyDetailPrint(true)
+      ElMessage.error('打印失败')
+    }
+  }
+
+  const gyDetailPlanManufactureEditing = ref(false)
+  const gyDetailPlanManufactureBackup = ref('')
+  const gyDetailRemarkBackup = ref('')
+  const gyDetailFinishDateBackup = ref('')
+  const gyDetailPlanManufactureSaving = ref(false)
+
+  const onGyDetailPlanManufactureInput = (val) => {
+    let s = String(val ?? '').replace(/[^\d.]/g, '')
+    const dot = s.indexOf('.')
+    if (dot !== -1) {
+      s = s.slice(0, dot + 1) + s.slice(dot + 1).replace(/\./g, '')
+    }
+    gyDetailFormData.计划制造工分 = s
+  }
+
+  const startGyDetailPlanManufactureEdit = () => {
+    if (gyDetailPlanManufactureEditing.value) return
+    // 邢科芳账号不能修改计划制造工分
+    if (gyDetailReadonly.value) {
+    //   ElMessage.warning('您没有权限修改计划制造工分')
+      return
+    }
+    gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
+    gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
+    gyDetailPlanManufactureEditing.value = true
+  }
+
+  const cancelGyDetailPlanManufactureEdit = () => {
+    gyDetailFormData.计划制造工分 = gyDetailPlanManufactureBackup.value
+    gyDetailFormData.备注 = gyDetailRemarkBackup.value
+    gyDetailPlanManufactureEditing.value = false
+  }
+
+  const confirmGyDetailPlanManufactureEdit = async () => {
+    gyDetailPlanManufactureSaving.value = true
+    try {
+      const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
+      
+      const updatePromises = []
+      
+      if (gyDetailFormData.计划制造工分 !== gyDetailPlanManufactureBackup.value) {
+        updatePromises.push(updateWorkOrderPlanManufacture({
+          id: gyDetailFormData.Uniqid,
+          number: gyDetailFormData.计划制造工分,
+          sys_id: userStore.userInfo.nickName
+        }))
+      }
+      
+      if (gyDetailFormData.备注 !== gyDetailRemarkBackup.value || finishDate) {
+        updatePromises.push(updateOrderRemarkAndFinishDate({
+          id: gyDetailFormData.Uniqid,
+          remark: gyDetailFormData.备注,
+          工单完工日期: finishDate,
+          sys_id: userStore.userInfo.nickName
+        }))
+      }
+      
+      if (updatePromises.length === 0) {
+        ElMessage.success('没有修改任何内容')
+        gyDetailPlanManufactureEditing.value = false
+        return
+      }
+      
+      const results = await Promise.all(updatePromises)
+      
+      const allSuccess = results.every(res => res?.code === 0)
+      
+      if (allSuccess) {
+        ElMessage.success('保存成功')
+        gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
+        gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
+        gyDetailPlanManufactureEditing.value = false
+      } else {
+        ElMessage.error('保存失败')
+      }
+    } catch (e) {
+      console.error('保存失败', e)
+      ElMessage.error('保存失败')
+    } finally {
+      gyDetailPlanManufactureSaving.value = false
+    }
+  }
+
+  // 工单完工日期仅前端选择,不在失焦时调接口(随保存一并提交)
+  const handleGyDetailFinishDateBlur = async () => {}
+
+  const handleGyDetailRemarkBlur = async () => {
+    try {
+      // 格式化日期为 YYYY-MM-DD 格式
+      const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
+      
+      await updateOrderRemarkAndFinishDate({
+        id: gyDetailFormData.Uniqid,
+        remark: gyDetailFormData.备注,
+        工单完工日期: finishDate,
+        sys_id: userStore.userInfo.nickName
+      })
+    } catch (e) {
+      console.error('更新备注和完工日期失败', e)
+    }
+  }
+
+  const closeGyDetailDialog = () => {
+    clearGyDetailCellEdit()
+    gyDetailPlanManufactureEditing.value = false
+    gyDetailBuJianMingChengFilter.value = []
+    gyDetailDaGongXuFilter.value = []
+    gyDetailNanDuXiShuFilter.value = []
+    gyDetailZhuangTaiFilter.value = []
+    gyDetailDialogVisible.value = false
+    gyDetailSelection.value = []
+    gyDetailDeleting.value = false
+    document.body.classList.remove('el-popup-parent--hidden')
+    document.body.style.overflow = ''
+  }
+  
+  // 修改计划制造工分
+  const handleUpdatePlanManufacture = async () => {
+    gyDetailPlanManufactureSaving.value = true
+    try {
+      const result = await updateWorkOrderPlanManufacture({
+        id: gyDetailFormData.Uniqid,
+        number: gyDetailFormData.计划制造工分,
+        sys_id: userStore.userInfo.nickName
+      })
+      if (result.code === 0) {
+        ElMessage.success('修改成功')
+        return true
+      }
+      ElMessage.error(result.msg || '修改失败')
+      return false
+    } catch (error) {
+      ElMessage.error('修改失败')
+      return false
+    } finally {
+      gyDetailPlanManufactureSaving.value = false
+    }
+  }
+  
+  // 拆分弹窗相关
+  const splitDialogVisible = ref(false)
+  const splitQuantity = ref(1)
+  const currentSplitRow = ref(null)
+  const hasReportData = ref(false)
+  const splitSubmitting = ref(false)
+
+  const submitProcessSplit = async (row, number) => {
+    if (!row?.id) {
+      ElMessage.warning('工序数据无效,无法操作')
+      return false
+    }
+    splitSubmitting.value = true
+    try {
+      const result = await confirmProcessSplit({
+        id: row.id,
+        number,
+        sys_id: userStore.userInfo.nickName,
+      })
+      if (result.code === 0) {
+        ElMessage.success(number === 0 ? '撤销拆分成功' : '拆分成功')
+        await refreshGyDetailProcessList()
+        return true
+      }
+      ElMessage.error(result.msg || (number === 0 ? '撤销拆分失败' : '拆分失败'))
+      return false
+    } catch (error) {
+      ElMessage.error(number === 0 ? '撤销拆分失败' : '拆分失败')
+      return false
+    } finally {
+      splitSubmitting.value = false
+    }
+  }
+
+  // 处理拆分工艺
+  const handleSplitProcess = async (row) => {
+    if (isGyDetailRowSplit(row)) return
+    currentSplitRow.value = row
+    splitQuantity.value = 1
+
+    try {
+      const result = await checkProcessReport({
+        workorder: gyDetailFormData.订单编号,
+        process_code: row.工序编号,
+      })
+
+      if (result.code === 0) {
+        hasReportData.value = false
+      } else if (result.code === 1) {
+        hasReportData.value = true
+      }
+
+      splitDialogVisible.value = true
+    } catch (error) {
+      ElMessage.error('检查工序报工状态失败')
+    }
+  }
+
+  const buildGySplitProcessLabel = (row) =>
+    `${row?.工序编号 || ''}-${row?.工序名称 || ''}`
+
+  const buildUndoSplitConfirmMessage = (row) => {
+    const label = escapeGyPrintHtml(buildGySplitProcessLabel(row))
+    return `确定撤销工序 <span class="gy-split-process-name" style="color:#f56c6c;font-weight:600;">${label}</span> 的拆分吗?`
+  }
+
+  // 撤销拆分
+  const handleUndoSplitProcess = async (row) => {
+    if (!isGyDetailRowSplit(row)) return
+    try {
+      await ElMessageBox.confirm(buildUndoSplitConfirmMessage(row), '撤销拆分', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+        dangerouslyUseHTMLString: true,
+        appendTo: document.body,
+      })
+    } catch {
+      return
+    }
+    await submitProcessSplit(row, 0)
+  }
+
+  // 确认拆分
+  const confirmSplitProcess = async () => {
+    const qty = Number(splitQuantity.value)
+    if (!Number.isFinite(qty) || qty < 1 || !Number.isInteger(qty)) {
+      ElMessage.warning('拆分数量必须为大于等于 1 的整数,不能为 0')
+      return
+    }
+
+    const ok = await submitProcessSplit(currentSplitRow.value, qty)
+    if (ok) {
+      splitDialogVisible.value = false
+      currentSplitRow.value = null
+    }
+  }
+  
+  // 修改工艺(未改动不请求接口)
+  // 新行填齐必填项后会先新增;再改工分等字段应走修改。若新增成功但未带回 id,或再次新增报工序编号已存在,则绑定 id 后改为 UpdateProcess。
+  const resolveGyDetailProcessId = (payload) => {
+    if (payload == null || payload === '') return ''
+    if (typeof payload === 'number' || typeof payload === 'string') return payload
+    return payload.id ?? payload.ID ?? payload.Id ?? ''
+  }
+
+  const isGyProcessCodeExistsError = (res) => {
+    const msg = String(res?.msg || res?.message || '')
+    return /工序编号/.test(msg) && /(已存在|已经有|重复)/.test(msg)
+  }
+
+  const bindGyDetailRowIdByProcessCode = async (row) => {
+    const orderNo = String(gyDetailFormData.订单编号 || '').trim()
+    const code = String(row?.工序编号 ?? '').trim()
+    if (!orderNo || !code) return false
+    try {
+      const processRes = await getWorkOrderProcess({ workorder: orderNo })
+      if (processRes?.code !== 0 || !Array.isArray(processRes.data)) return false
+      const found = processRes.data.find(
+        (item) => String(item.工序编号 ?? item.process_code ?? '').trim() === code
+      )
+      const id = resolveGyDetailProcessId(found)
+      if (!id) return false
+      row.id = id
+      row._gyDetailNew = false
+      return true
+    } catch {
+      return false
+    }
+  }
+
+  /**
+   * 按部件名称补齐部件编号:同名复用已有编号,否则取当前列表最大编号+1。
+   * 提交 Add/Update 前必须调用,避免后端报「部件编号不能为空」。
+   */
+  const ensureGyDetailPartCode = (row) => {
+    if (!row) return ''
+    const partName = String(row.部件名称 || '').trim()
+    if (!partName) {
+      row.部件编号 = ''
+      return ''
+    }
+    const currentCode = String(row.部件编号 || '').trim()
+    if (currentCode) return currentCode
+
+    const existingRow = (gyDetailFormData.工艺列表 || []).find(
+      (r) => r !== row && String(r.部件名称 || '').trim() === partName && String(r.部件编号 || '').trim()
+    )
+    if (existingRow) {
+      row.部件编号 = String(existingRow.部件编号).trim()
+      return row.部件编号
+    }
+
+    let maxCode = 0
+    ;(gyDetailFormData.工艺列表 || []).forEach((r) => {
+      const code = parseInt(String(r.部件编号 || ''), 10)
+      if (!isNaN(code) && code > maxCode) {
+        maxCode = code
+      }
+    })
+    row.部件编号 = String(maxCode + 1).padStart(2, '0')
+    return row.部件编号
+  }
+
+  const handleUpdateProcess = async (row, options = {}) => {
+    const silent = !!options.silent
+    const orderNo = String(gyDetailFormData.订单编号 || '').trim()
+    if (!orderNo) return false
+    if (!isGyDetailRowChanged(row)) return false
+    
+    if (row._gyDetailSaving) {
+      return false
+    }
+
+    const buJianMingCheng = String(row.部件名称 || '').trim()
+    const gongXuMingCheng = String(row.工序名称 || '').trim()
+    const daGongXu = String(row.大工序 || '').trim()
+    const requiredReady = !!(buJianMingCheng && gongXuMingCheng && daGongXu)
+
+    // 有部件名称时提交前补齐部件编号,避免偶发「部件编号不能为空」
+    if (buJianMingCheng) {
+      ensureGyDetailPartCode(row)
+    }
+
+    const runUpdate = async () => {
+      const partCode = ensureGyDetailPartCode(row) || String(row.部件编号 || '').trim()
+      if (buJianMingCheng && !partCode) {
+        if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
+        return false
+      }
+      const result = await UpdateProcess({
+        id: row.id,
+        process_name: row.工序名称 || '',
+        big_process: row.大工序 || '',
+        standard_hour: row.秒 || '',
+        standard_minutes: row.分 || '',
+        standard_score: row.定额分 || '',
+        money: row.金额 || '',
+        coefficient: row.难度系数 || '',
+        remark: row.备注 || '',
+        mod_id: userStore.userInfo.nickName,
+        part_code: partCode,
+        part_name: row.部件名称 || '',
+        process_code: row.工序编号 || '',
+      })
+      if (result.code === 0) {
+        row._gyDetailNew = false
+        row._gyDetailOrigin = snapshotGyDetailRow(row)
+        if (!silent) ElMessage.success('修改成功')
+        return true
+      }
+      if (!silent) ElMessage.error(result.msg || '修改失败')
+      return false
+    }
+
+    try {
+      // 已有 id:一律修改
+      if (row.id) {
+        row._gyDetailSaving = true
+        row._gyDetailNew = false
+        return await runUpdate()
+      }
+
+      // 无 id:需三个必填齐全才能新增
+      if (!requiredReady) {
+        if (!silent && (gyDetailLastEditingField.value === '工序名称' || gyDetailLastEditingField.value === '部件名称')) {
+          ElMessage.warning('部件名称、工序名称、生产工序三个字段都必须填写')
+        }
+        return false
+      }
+
+      const partCode = ensureGyDetailPartCode(row)
+      if (!partCode) {
+        if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
+        return false
+      }
+
+      row._gyDetailSaving = true
+
+      const addRes = await AddProcess({
+        workorder: orderNo,
+        part_code: partCode,
+        part_name: row.部件名称 || '',
+        process_name: row.工序名称 || '',
+        process_code: String(row.工序编号 ?? ''),
+        big_process: row.大工序 || '',
+        standard_hour: row.秒 || '',
+        standard_minutes: row.分 || '',
+        standard_score: row.定额分 || '',
+        money: row.金额 || '',
+        coefficient: row.难度系数 || '',
+        remark: row.备注 || '',
+        sys_id: userStore.userInfo?.nickName || '',
+      })
+
+      if (addRes?.code === 0) {
+        row._gyDetailNew = false
+        row.id = resolveGyDetailProcessId(addRes.data)
+        if (!row.id) {
+          await bindGyDetailRowIdByProcessCode(row)
+        }
+        row._gyDetailOrigin = snapshotGyDetailRow(row)
+        if (!silent) ElMessage.success('保存成功')
+        return true
+      }
+
+      // 工序已在库中(例如必填项保存时已新增):改为修改
+      if (isGyProcessCodeExistsError(addRes)) {
+        const bound = await bindGyDetailRowIdByProcessCode(row)
+        if (bound && row.id) {
+          return await runUpdate()
+        }
+      }
+
+      if (!silent) ElMessage.error(addRes?.msg || '保存失败')
+      return false
+    } catch {
+      return false
+    } finally {
+      row._gyDetailSaving = false
+    }
+  }
+  
+  // =========== 订单打印 ===========
+  //弹窗
+  const order_viewVisible = ref(false)
+  // 默认选择竖向
+  const printDirection = ref('纵向')
+  const cp_gdprintonClick = () => {
+	  order_viewVisible.value = true
+  }
+  
+  //确定打印
+  const confirmPrintDirection = () => {
+	 
+	  console.log(_Gd_gdbh.value)
+	  console.log(printDirection.value)
+	    
+	  if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
+	    ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
+	    return false;
+	  }else{
+	    if(ystableData.length >=1){
+	  	printPageRef.value.open(_Gd_gdbh.value,printDirection.value) 
+	    }else{
+	  	ElMessage({type: 'warning',message: '请新增颜色资料,再操作此功能'})
+	  	return false;
+	    }
+	  }
+  }
+  const order_viewCloseDialog = () => {
+	  order_viewVisible.value = false
+  }
+  
+  // =========== BOM资料 ===========
+  const res_bomdialogFormVisible = ref(false)
+  const resbomtableData = ref([]);
+  const ddhformData = reactive({
+	ddh: '',
+	kh: '',
+	sckh: '',
+	ks: '',
+	ml: '',
+  });
+  const getTodayYmd = () => {
+	const t = new Date()
+	return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(t.getDate()).padStart(2, '0')}`
+  }
+  const fillDefaultPlanRuku = (rows) => {
+	if (!Array.isArray(rows)) return
+	rows.forEach((row) => {
+	  const v = row['计划入库时间']
+	  if (v === undefined || v === null || String(v).trim() === '') {
+		row['计划入库时间'] = getTodayYmd()
+	  }
+	})
+  }
+  const resbom_tableColumns = ref(
+	  [
+		{ label: '物料分类', prop: '物料分类', width: '130' },
+		{ label: '物料名称', prop: '物料名称', width: '300' },
+		{ label: '计划入库时间', prop: '计划入库时间', width: '160' },
+		{ label: '计划用料', prop: '计划用料', width: '130' },
+		{ label: '计划门幅', prop: '计划门幅', width: '130' },
+		{ label: '定额用料', prop: '定额用料', width: '130' },
+		{ label: '定额门幅', prop: '定额门幅', width: '130' },
+		{ label: '备注', prop: '备注', width: '240' },
+	  ]
+  )
+  //批量修改BOM资料
+  const BOMclick = () => {
+	  if(bomtableData.value === ''){
+		  ElMessage({type: 'warning',message: 'BOM数据为空'})
+		  return;
+	  }
+	  if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
+		  ElMessage({type: 'warning',message: '请选择订单后,再操作此功能'})
+		  return;
+	  }else{
+		  res_bomdialogFormVisible.value = true
+		  ddhformData.ddh = _Gd_gdbh.value
+		  ddhformData.kh = _Gd_kh.value
+		  ddhformData.sckh = _Gd_sckh.value
+		  ddhformData.ks = _Gd_ks.value
+		  ddhformData.ml = _Gd_ML.value
+		  _TestCoefficient();
+	  }
+  }
+  
+  const handleInput = (value, row, prop) => {
+	  if(prop != "物料名称" && prop != "备注" && prop != "物料分类" && prop != "计划入库时间" ){
+		  // 使用正则表达式过滤非数字和小数点的字符
+		  let filteredValue = value.replace(/[^\d.]/g, '');
+  
+		  // 不允许以 . 开头
+		  if (filteredValue.startsWith('.')) {
+		  filteredValue = filteredValue.slice(1); // 去掉开头的 .
+		  }
+  
+		  // 确保只有一个小数点
+		  const parts = filteredValue.split('.');
+		  if (parts.length > 2) {
+		  // 如果超过一个小数点,只保留第一个
+		  row[prop] = `${parts[0]}.${parts.slice(1).join('')}`;
+		  } else {
+		  // 否则直接赋值
+		  row[prop] = filteredValue;
+		  }
+		  }
+  
+  };
+  
+  
+  //bom数据获取
+  const _TestCoefficient = async ()=>{
+	try {
+	  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
+	  console.log(orderBomListdata)
+	  resbomtableData.value = orderBomListdata.data;
+	  const formattedData = orderBomListdata.data.map(item=>{
+		item.BOM_desc = item.BOM_desc;
+		item.物料名称 = item.物料名称;
+		item.计划用料 = item.计划用料;
+		item.定额用料 = item.定额用料;
+		item.裁床实际用料 = item.裁床实际用料;
+		item.裁床领用面料 = item.裁床领用面料;
+		item.裁床退回仓库面料 = item.裁床退回仓库面料;
+		item.备注 = item.备注;
+		item.投料单位 = "米";
+		// item.UNIQID = item.UNIQID;
+		return item
+	  });
+	  fillDefaultPlanRuku(resbomtableData.value)
+	} catch (error) {
+	  console.error(error);
+	}
+  }
+  const resbom_handleKeyDown = (event, x, y, prop) => {
+	const currentElement = document.getElementById(`input${x}${y}`);
+	if (currentElement === null && currentElement === undefined) return
+	let move = 0
+	switch (event.keyCode) {
+	  case 13: // Enter
+	  case 40: // 向下箭头
+		if (y < resbomtableData.value.length )
+		  document.getElementById(`input${x}${y + 1}`).focus();
+		break;
+	  case 38: // 向上箭头
+		if ( y > 0) {
+		  document.getElementById(`input${x}${y - 1}`).focus();
+		}
+		break;
+	  case 39: // 向左箭头
+		if (x >= 0 && x <=6) {
+		  move = x + 1
+		}
+		document.getElementById(`input${move}${y}`).focus();
+		break;
+	  case 37: // 向右箭头
+		if (x = 0  && x <=6) {
+		  move = x - 1
+		}
+		document.getElementById(`input${move}${y}`).focus();
+		break;
+	  default:
+		break;
+	}
+  }
+  const scfjfpxsCellClass = ({row, column, rowIndex, columnIndex}) =>{
+	if (
+		  column.label === '物料分类' ||
+		  column.label === '计划门幅' ||
+		  column.label === '定额门幅' ||
+		  column.label === '计划用料' || 
+		  column.label === '备注' || 
+		  column.label === '物料名称' || 
+		  column.label === '计划用量' || 
+		  column.label === '定额用料' ||
+		  column.label === '计划入库时间' ) {
+	  return 'background-plan-usage-low';
+	}
+  }
+  
+  //新增
+  const add_bomenterDialog = async() => {
+	  // 创建一行空数据,字段值可以根据需求初始化
+		const newRow = {
+		  'BOM_desc': '',
+		  '物料名称': '',
+		  '计划入库时间': getTodayYmd(),
+		  '计划用料': '',
+		  '定额用料': '',
+		  '裁床实际用料': '',
+		  '裁床领用面料': '',
+		  '裁床退回仓库面料': '',
+		  '备注': '',
+		  '投料单位': '米',
+		  'UNIQID':''
+		};
+		if (!resbomtableData.value || !Array.isArray(resbomtableData.value)) {
+		  resbomtableData.value = []; // 重新初始化
+		}
+		// 将新增的行数据推入到表格数据中
+		resbomtableData.value.push(newRow);
+  }
+  
+  // BOM删除
+  const record_deleteRow = async (row, index) => {
+	  console.log(row.UNIQID);
+  
+	  // 使用 ElMessageBox 提示确认删除
+	  ElMessageBox.confirm('确定删除此行数据吗?', '提示', {
+		  confirmButtonText: '确定',
+		  cancelButtonText: '取消',
+		  type: 'warning'
+	  }).then(async () => {
+		  // 确认删除,检查UNIQID是否为空
+		  if (row.UNIQID === '' || row.UNIQID === null || row.UNIQID === undefined) {
+			  // 删除当前行数据
+			  resbomtableData.value.splice(index, 1);
+			  ElMessage({
+				  type: 'success',
+				  message: '删除成功'
+			  });
+		  } else {
+			  // 调用接口删除
+			  const Bomdel_del = await Bomdel({ UNIQID: row.UNIQID });
+			  console.log(Bomdel_del)
+			  if (Bomdel_del.code === 0) {
+			    ElMessage({
+			      type: 'success',
+			      message: '删除成功'
+			    });
+			  } else {
+			    const msg = Bomdel_del.msg || '';
+			    console.log('msg:', msg);
+			    
+			    // 初始化标题和内容
+			    let title = '提示';
+			    let content = msg;
+			    
+			    // 截取中文句号(。)分割
+			    const splitIndex = msg.indexOf('。');
+			    if (splitIndex !== -1) {
+			      title = msg.substring(0, splitIndex + 1); // 截取第一个句号前的作为标题(含句号)
+			      content = msg.substring(splitIndex + 1);  // 后面的作为内容
+			    }
+			    
+			    // 弹窗提示(注意参数顺序)
+			    ElMessageBox.confirm(
+			      `<p style="font-size:14px;">${content}</p>`, // 内容
+			      title, // 标题
+			      {
+			        type: 'warning',
+			        dangerouslyUseHTMLString: true
+			      }
+			    );
+
+			  }
+			  // 重新获取BOM列表数据
+			  const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
+			  //BOM资料列表
+			  bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
+			  //批量新增/更新BOM数据列表
+			  resbomtableData.value = orderBomListdata.data;
+			  fillDefaultPlanRuku(resbomtableData.value)
+		  }
+	  }).catch(() => {
+		  // 取消删除
+		  // ElMessage({
+			 //  type: 'info',
+			 //  message: '已取消删除'
+		  // });
+	  });
+  }
+  
+  //修改
+  const res_bomenterDialog = async () => {
+	  const rawValueArray = resbomtableData._rawValue;
+	  const formattedData = rawValueArray
+	  .filter(item => item.物料名称 !== null && item.物料名称 !== "")  // 过滤掉物料名称为空的行
+	  .map(item => {
+		return {
+		  BOM_工单编号: ddhformData['ddh'],
+		  UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
+		  物料分类: item.物料分类 !== null ? item.物料分类 : "",
+		  BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
+		  BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
+		  BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
+		  BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
+		  Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
+		  BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
+		  BOM_desc: item.备注 !== null ? item.备注 : "",
+		  BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
+		  BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
+		  BOM_投料单位: "",
+		  Sys_ID: userStore.userInfo.nickName,
+		  Sys_rq: currentDate,
+		  计划入库时间: item['计划入库时间'] != null && String(item['计划入库时间']).trim() !== ''
+			? String(item['计划入库时间']).trim()
+			: getTodayYmd(),
+			计划入库操作人:userStore.userInfo.nickName,
+		}
+	  });
+	  console.log(formattedData);
+	  const add_FabricEditdata = await FabricEdit(formattedData);
+	  if (add_FabricEditdata.code === 0) {
+		  res_bomdialogFormVisible.value = false;
+		  ElMessage({type: 'success',message: '修改成功'})
+		  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
+		  bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
+	  } else {
+		  ElMessage({ type: 'error',message: '修改失败'})
+	  }
+	  
+  }
+  
+  // 取消
+  const 
+  res_bomcloseDialog = () => {
+	  res_bomdialogFormVisible.value = false;
+  }
+  
+  
+  //BOM资料表格双击
+  const edit_bomdialogFormVisible = ref(false)
+  const edit_resbomtableData = ref([]);
+  const edit_resbom_tableColumns = ref(
+	  [
+		{ label: '物料名称', prop: '物料名称', width: '170' },
+		{ label: '计划用料', prop: '计划用料', width: '130' },
+		{ label: '定额用料', prop: '定额用料', width: '130' },
+		{ label: '计划门幅', prop: '计划门幅', width: '170' },
+		{ label: '定额门幅', prop: '定额门幅', width: '170' },
+	  //   { label: '裁床实际用料', prop: '裁床实际用料', width: '130' },
+	  //   { label: '裁床领用面料', prop: '裁床领用面料', width: '130' },
+	  //   { label: '裁床退回仓库面料', prop: '裁床退回仓库面料', width: '170' },
+		{ label: '备注', prop: '备注', width: '170' },
+		{ label: '投料单位', prop: '投料单位', width: '100' },
+	  ]
+  )
+  
+  const UNIQID = ref('')
+  const bombomupdateCompanyFunc = async (row) => {
+	  BOMclick()
+  // 	edit_bomdialogFormVisible.value = true
+  // 	ddhformData.ddh = _Gd_gdbh.value
+  // 	ddhformData.kh = _Gd_kh.value
+  // 	ddhformData.sckh = _Gd_sckh.value
+  // 	ddhformData.ks = _Gd_ks.value
+  // 	UNIQID.value = row.UNIQID
+  // 	_editTestCoefficient()
+  }
+  
+  
+  // BOM数据获取
+  const _editTestCoefficient = async () => {
+	try {
+	  // 获取 BOM 数据
+	  const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
+	  console.log(orderBomListdata);
+  
+	  // 过滤数据,只保留 UNIQID 相同的项
+	  const filteredData = orderBomListdata.data.filter(item => item.UNIQID === UNIQID.value);
+  
+	  // 处理数据
+	  edit_resbomtableData.value = filteredData.map(item => ({
+		物料名称: item.物料名称,
+		计划用料: item.计划用料,
+		定额用料: item.定额用料,
+		裁床实际用料: item.裁床实际用料,
+		裁床领用面料: item.裁床领用面料,
+		裁床退回仓库面料: item.裁床退回仓库面料,
+		备注: item.备注,
+		计划门幅: item.计划门幅,
+		定额门幅: item.定额门幅,
+		UNIQID: item.UNIQID // 保留 UNIQID 以便后续使用
+	  }));
+	} catch (error) {
+	  console.error(error);
+	}
+  };
+  
+  
+  //一键修改
+  const editres_bomenterDialog = async () => {
+	  const rawValueArray = edit_resbomtableData._rawValue;
+	  const formattedData = rawValueArray
+	  .filter(item => item.物料名称 !== null && item.物料名称 !== "")  // 过滤掉物料名称为空的行
+	  .map(item => {
+		return {
+		  BOM_工单编号: ddhformData['ddh'],
+		  UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
+		  BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
+		  BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
+		  BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
+		  BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
+		  Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
+		  BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
+		  BOM_desc: item.备注 !== null ? item.备注 : "",
+		  BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
+		  BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
+		  BOM_投料单位: "米",
+		  Sys_ID: userStore.userInfo.nickName,
+		  Sys_rq: currentDate
+		}
+	  });
+	  console.log(formattedData);
+	  
+	  const add_FabricEditdata = await FabricEdit(formattedData);
+	  if (add_FabricEditdata.code === 0) {
+		  edit_bomdialogFormVisible.value = false;
+		  ElMessage({type: 'success',message: '修改成功'})
+		  const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
+		  bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
+	  } else {
+		  ElMessage({ type: 'error',message: '修改失败'})
+	  }
+  }
+  // 取消
+  const editres_bomcloseDialog = () => {
+	  edit_bomdialogFormVisible.value = false;
+  }
+  //点击表格行获取下方表格数据列表
+  // =========== 颜色资料、工艺资料、技术资料附件 ===========
+  //全局调用订单号编号
+  const _Gd_gdbh = ref('')
+  const _ddhval = ref('')
+  const _Gd_kh = ref('')
+  const _Gd_sckh = ref('')
+  const _Gd_ks = ref('')
+  const _Gd_ML = ref('')
+  //颜色资料
+  const ystableData = reactive([])
+  //尺寸列表
+  const sizeDatas = reactive([])
+  //部件资料
+  const parttableData = reactive([])
+  //工艺资料
+  const gytableData = reactive([])
+  //订单资料表
+  const ddtableData = reactive([])
+  //技术附件
+  const jstableData = reactive([])
+  
+  const fhdtableData = reactive([])
+  //BOM附件
+  const bomtableData = reactive([])
+  //面料附件
+  const mltableData = reactive([])
+  
+  // 工序产量核查
+  const processProductionVisible = ref(false)
+  const processProductionWorkorder = ref('')
+  const processProductionDialogKey = ref(0)
+  const processProductionChecking = ref(false)
+  const openProcessProductionDialog = async () => {
+    if (!_Gd_gdbh.value) {
+      ElMessage.warning('请先在表格中点击选择订单')
+      return
+    }
+    processProductionChecking.value = true
+    try {
+      const result = await ensureProcessProductionData(_Gd_gdbh.value)
+      if (!result.ok) return
+      processProductionWorkorder.value = result.workorder
+      processProductionDialogKey.value += 1
+      processProductionVisible.value = true
+    } finally {
+      processProductionChecking.value = false
+    }
+  }
+
+  // 导入工艺资料相关变量
+  const importProcessDialogVisible = ref(false)
+  const importProcessForm = reactive({
+    workorderNo: '',
+    styleNo: ''
+  })
+  const importProcessFileList = reactive([])
+  const importProcessUploadRef = ref(null)
+  let importProcessFile = null
+
+  // 导入冲突对照弹窗(error_type === import_append_only)
+  const importConflictDialogVisible = ref(false)
+  const importConflictTitle = ref('导入失败')
+  const importConflictOldList = ref([])
+  const importConflictNewList = ref([])
+  const importConflictMeta = reactive({
+    conflict_count: null,
+    suggest_min_new_code: null,
+  })
+
+  const mapImportCompareRow = (item = {}) => ({
+    process_code: item.process_code ?? item.序号 ?? '',
+    process_name: item.process_name ?? item.工序名称 ?? '',
+    part_name: item.part_name ?? item.部件名称 ?? '',
+    diff: item.diff === true || item.diff === 1 || item.diff === 'true',
+  })
+
+  const alignImportCompareLists = (oldList, newList) => {
+    const oldArr = (Array.isArray(oldList) ? oldList : []).map(mapImportCompareRow)
+    const newArr = (Array.isArray(newList) ? newList : []).map(mapImportCompareRow)
+    if (!oldArr.length && !newArr.length) {
+      return { oldAligned: [], newAligned: [] }
+    }
+    // 两边序号集合一致时,按返回顺序展示;否则按序号对齐
+    const sameLen = oldArr.length === newArr.length
+    const sameCodes = sameLen && oldArr.every((row, i) => String(row.process_code) === String(newArr[i]?.process_code))
+    if (sameCodes) {
+      return { oldAligned: oldArr, newAligned: newArr }
+    }
+    const oldMap = new Map(oldArr.map((row) => [String(row.process_code), row]))
+    const newMap = new Map(newArr.map((row) => [String(row.process_code), row]))
+    const codes = [...new Set([...oldMap.keys(), ...newMap.keys()])]
+    codes.sort((a, b) => {
+      const na = Number(a)
+      const nb = Number(b)
+      if (Number.isFinite(na) && Number.isFinite(nb)) return na - nb
+      return String(a).localeCompare(String(b))
+    })
+    const emptyRow = (code) => ({
+      process_code: code,
+      process_name: '',
+      part_name: '',
+      diff: false,
+    })
+    return {
+      oldAligned: codes.map((code) => oldMap.get(code) || emptyRow(code)),
+      newAligned: codes.map((code) => newMap.get(code) || emptyRow(code)),
+    }
+  }
+
+  const buildCompareListsFromConflicts = (conflicts = []) => {
+    const oldAligned = []
+    const newAligned = []
+    conflicts.forEach((item) => {
+      const code = item?.process_code ?? item?.序号 ?? ''
+      oldAligned.push({
+        process_code: code,
+        process_name: item?.old_value ?? item?.原值 ?? '',
+        part_name: item?.part_name ?? item?.部件名称 ?? '',
+        diff: true,
+      })
+      newAligned.push({
+        process_code: code,
+        process_name: item?.new_value ?? item?.新值 ?? '',
+        part_name: item?.part_name ?? item?.部件名称 ?? '',
+        diff: true,
+      })
+    })
+    return { oldAligned, newAligned }
+  }
+
+  const importConflictRowClassName = ({ row }) =>
+    row?.diff ? 'import-conflict-diff-row' : ''
+
+  const importConflictMergedList = computed(() => {
+    const oldArr = importConflictOldList.value || []
+    const newArr = importConflictNewList.value || []
+    const len = Math.max(oldArr.length, newArr.length)
+    const rows = []
+    for (let i = 0; i < len; i++) {
+      const oldRow = oldArr[i] || {}
+      const newRow = newArr[i] || {}
+      const diff =
+        oldRow.diff === true ||
+        newRow.diff === true ||
+        String(oldRow.part_name ?? '') !== String(newRow.part_name ?? '') ||
+        String(oldRow.process_code ?? '') !== String(newRow.process_code ?? '') ||
+        String(oldRow.process_name ?? '') !== String(newRow.process_name ?? '')
+      rows.push({
+        old_part_name: oldRow.part_name ?? '',
+        old_process_code: oldRow.process_code ?? '',
+        old_process_name: oldRow.process_name ?? '',
+        new_part_name: newRow.part_name ?? '',
+        new_process_code: newRow.process_code ?? '',
+        new_process_name: newRow.process_name ?? '',
+        diff,
+      })
+    }
+    return rows
+  })
+
+  const openImportAppendOnlyConflictDialog = (payload = {}) => {
+    const data = payload?.data && typeof payload.data === 'object' ? payload.data : {}
+    const conflicts = Array.isArray(data.conflicts) ? data.conflicts : []
+    importConflictTitle.value = payload?.msg || '该工单已有报工,仅允许末尾追加工序'
+    importConflictMeta.conflict_count = data.conflict_count ?? conflicts.length
+    importConflictMeta.suggest_min_new_code = data.suggest_min_new_code ?? null
+
+    let aligned
+    if ((Array.isArray(data.old_list) && data.old_list.length) || (Array.isArray(data.new_list) && data.new_list.length)) {
+      aligned = alignImportCompareLists(data.old_list, data.new_list)
+    } else {
+      aligned = buildCompareListsFromConflicts(conflicts)
+    }
+    importConflictOldList.value = aligned.oldAligned
+    importConflictNewList.value = aligned.newAligned
+    importConflictDialogVisible.value = true
+  }
+
+  const handleImportProcessFail = (payload) => {
+    const data = payload?.data
+    if (data && typeof data === 'object' && data.error_type === 'import_append_only') {
+      openImportAppendOnlyConflictDialog(payload)
+      return
+    }
+    ElMessage.error(payload?.msg || '导入失败')
+  }
+ 
+  //点击订单资料行
+  const tableRowClick = async (row) => {
+	  //清空尺寸列表、颜色资料、部件资料、工艺资料、订单资料附件、技术附件
+	  sizeDatas.length = 0
+	  ystableData.splice(0, ystableData.length);
+	  parttableData.splice(0, parttableData.length);
+	  gytableData.splice(0, gytableData.length);
+	  ddtableData.splice(0, ddtableData.length);
+	  fhdtableData.splice(0, fhdtableData.length);
+	  jstableData.splice(0, jstableData.length);
+	  bomtableData.splice(0, bomtableData.length);
+	  mltableData.splice(0, mltableData.length);
+	  _Gd_gdbh.value = row.订单编号
+	  _ddhval.value = row.订单编号
+	  _Gd_kh.value = row.客户编号
+	  _Gd_sckh.value = row.生产款号
+	  _Gd_ks.value = row.款式
+	  _Gd_ML.value = row.面料
+	  
+	  //数据列表显示
+	  const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
+	  const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
+	  const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
+	  const fhdOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'发货单附件'})
+	  
+	  const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
+	  // console.log("orderBomListdata:", orderBomListdata); // 打印接口返回的数据
+	  // 确保 orderBomListdata.data 是数组,避免 undefined 错误
+	  if (orderBomListdata?.data && Array.isArray(orderBomListdata.data)) {
+		  bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
+	  } else {
+		  bomtableData.splice(0, bomtableData.length); // 如果数据无效,清空表格
+	  }
+	  
+	  // 获取部件资料
+	const partListData = await PartList({ workorder: _Gd_gdbh.value });
+	if (partListData?.code === 0 && Array.isArray(partListData.data)) {
+		parttableData.splice(0, parttableData.length, ...partListData.data);
+	} else {
+		parttableData.splice(0, parttableData.length);
+	}
+	
+	// 获取工艺资料
+	const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
+	if (processListData?.code === 0 && Array.isArray(processListData.data)) {
+		gytableData.splice(0, gytableData.length, ...processListData.data);
+	} else {
+		gytableData.splice(0, gytableData.length);
+	}
+	  
+	  
+	  const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
+	  // console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
+	  
+	  if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
+		  // 如果 data.table 是数组且不为空,更新表格数据
+		  mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
+	  } else {
+		  // 如果 data.table 为空或无效,清空表格数据
+		  mltableData.splice(0, mltableData.length);
+	  }
+	  
+	  //颜色资料
+	  if(PrintListDatas.data.列表.length === 0 ){
+		ystableData.length = 0
+	  }else{
+		sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//表格尺码投数据
+		ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
+		const newData = PrintListDatas.data.列表.map(item => ({  
+			...item,  
+			船样: item.船样 === 1 ? '是' : '否'  
+		}));  
+		ystableData.length = 0;  
+		ystableData.push(...newData);
+	  }
+	  //技术附件
+	  if(jsOrderAttachments.data === ''){
+		const WorkListdata = [];
+		jstableData.splice(0,jstableData.length,...WorkListdata);
+	  }
+	  if(jsOrderAttachments.code === 0 && ddOrderAttachments.code === 0){
+		jstableData.splice(0,jsOrderAttachments.data.list.length,...jsOrderAttachments.data.list);
+		ddtableData.splice(0,ddOrderAttachments.data.list.length,...ddOrderAttachments.data.list);
+		if(fhdOrderAttachments.data && fhdOrderAttachments.data.list && fhdOrderAttachments.data.list.length > 0){
+			if(_username.value === fhdOrderAttachments.data.list[0]['sys_id'] || _username.value === 'admin/超级管理员'){
+				fhdtableData.splice(0,fhdOrderAttachments.data.list.length,...fhdOrderAttachments.data.list);
+			}
+		}
+	  }
+  }
+  
+  
+  // //pdf
+  // const showPdfModal = ref(false);
+  // const pdfContainer = ref(null);
+  
+  // const closeModal = () => {
+  //   showPdfModal.value = false;
+  // };
+  
+  // const fetchAndConvertFile = async () => {
+  //   try {
+  //     // 从后端获取 Base64 编码的 XLSX 文件数据
+  //     const responses = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'});
+  //     const response= responses.data[0].附件内容
+  //     const base64Data = response.match(/base64,(.*)$/)?.[1]; 
+  
+  // if (!base64Data) {
+  //   throw new Error('Invalid Base64 data');
+  // }
+  
+  // const binaryString = atob(base64Data);
+  // const binaryLen = binaryString.length;
+  // const bytes = new Uint8Array(binaryLen);
+  
+  // for (let i = 0; i < binaryLen; i++) {
+  //   bytes[i] = binaryString.charCodeAt(i);
+  // }
+  
+  //        // 解析 XLSX 文件
+  //        const workbook = XLSX.read(bytes, { type: 'array' });
+  //     const worksheet = workbook.Sheets[workbook.SheetNames[0]];
+  //     console.log(121212,worksheet)
+  //     const jsonData = XLSX.utils.sheet_to_json(worksheet);
+	  
+  // 	let base64 = XLSX.write(worksheet, { type: 'base64' });
+	  
+  //     generatePdf(base64);
+  //   } catch (error) {
+  //     console.error('Error fetching and converting file:', error);
+  //   }
+  // };
+  
+  // const generatePdf = (data) => {
+  //  console/log('pdf data', data)
+  //  const pdfDoc = new jsPDF()
+  //  pdfDoc.text(data)
+  //  pdfDoc.save(a4.pdf)
+  // };
+  
+  // const previewPdf = (blob) => {
+  //   const fileURL = URL.createObjectURL(blob);
+  
+  //   // 通过 ref 引用 pdfContainer 来在指定容器中显示 PDF
+  //   const iframe = document.createElement('iframe');
+  //   iframe.src = fileURL;
+  //   iframe.width = '100%';
+  //   iframe.height = '600px';
+  
+  //   if (pdfContainer.value) {
+  //     pdfContainer.value.innerHTML = ''; // 清空之前的内容
+  //     pdfContainer.value.appendChild(iframe);
+  //   }
+  // };
+  
+  //表格复选框
+  const ddzlTableRowKey = (row) => {
+    const u = row.Uniqid
+    const id = row?.ID ?? row?.id
+    if (id != null && id !== '') return String(id)
+    return `dd-${row?.['订单编号'] ?? 'x'}-${row?.['生产款号'] ?? ''}-${row?.['客户编号'] ?? ''}`
+  }
+  const ysColorTableRowKey = (row) => {
+    const u = row.Uniqid
+    const id = row?.ID ?? row?.id
+    if (id != null && id !== '') return String(id)
+    return `ys-${row?.['子订单编号'] ?? ''}-${String(row?.['款号'] ?? '')}-${String(row?.['颜色'] ?? '')}`
+  }
+  const table_del = ref(true)//删除订单资料
+  const table_Selection = ref('')//存储选中Uniqid
+  const ddzlSelectionChange = (selection, type) => {
+	const ids = selection.map(item => {
+	  return item.Uniqid ?? item.UniqID ?? item.UniqId
+	})
+	console.log('[订单资料] 勾选 Uniqid:', ids)
+	table_Selection.value = ids.filter((v) => v != null && v !== '').join(',')
+  }
+  
+  // 删除按钮
+  const del_ddzlClick = async () => {
+	try {
+	  // 显示确认弹窗
+	  await ElMessageBox.confirm('确定要删除这条记录吗?', '提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning',
+	  });
+  
+	  // 如果用户点击了确定
+	  let params = {};
+	  params.Uniqid = table_Selection._value;
+	  console.log(params);
+	  const res1 = await orderDataDel(params);
+	  if (res1.code === 0) {
+		ElMessage.success('删除成功');
+  
+		// 重新加载工单列表
+		const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: "1", limit: "10" });
+		tableData.value = WorkListdata.data.data;
+  
+		// 清空相关数据
+		ystableData.splice(0, ystableData.length); // 颜色资料清空
+		parttableData.splice(0, parttableData.length); // 部件资料清空
+		gytableData.splice(0, gytableData.length); // 工艺资料清空
+		ddtableData.splice(0, ddtableData.length); // 订单资料附件清空
+		jstableData.splice(0, jstableData.length); // 技术附件清空
+	  }
+	} catch (error) {
+	  // 用户点击了取消或关闭了弹窗
+	  ElMessage.info('删除操作已取消');
+	}
+  };
+  
+  
+  const delall = ref(true)
+  //颜色复选框
+  const ysSelection = ref('')
+  //工艺复选框
+  const gySelection = ref('')
+    // 颜色资料多选、工艺资料多选
+	const selectionChange = (selection, type) => {
+	if (type === '颜色资料') {
+	  const ids = selection.map(item => item.Uniqid ?? item.UniqID ?? item.UniqId)
+	  console.log('[颜色资料] 勾选 Uniqid:', ids)
+	  ysSelection.value = ids.filter((v) => v != null && v !== '').join(',')
+	}
+	if (type === '工艺资料') {
+	  const ids = selection.map(item => item.id)
+	  console.log('[工艺资料] 勾选 id:', ids)
+	  gySelection.value = ids.filter((v) => v != null && v !== '').join(',')
+	}
+  }
+  
+	// ===========删除颜色资料、工艺资料 ===========
+	const delgd_delclick = async () => {
+		let changed = false;
+
+		try {
+			if (ysSelection.value !== '') {
+			  const res1 = await PrintDetailDel({ UniqId: ysSelection.value });
+			  if (res1.code === 0) {
+				ElMessage.success('颜色资料删除成功');
+				changed = true;
+			  }
+			}
+
+			if (gySelection.value !== '') {
+			  const res2 = await PrintDetailDel({ UniqId: gySelection.value });
+			  if (res2.code === 0) {
+				ElMessage.success('工艺资料删除成功');
+				changed = true;
+			  }
+			}
+
+			if (changed) {
+			  const PrintListDatas = await PrintListData({ order: _Gd_gdbh.value });
+			  sizeDatas.splice(0, sizeDatas.length, ...PrintListDatas.data.型号);
+			  ystableData.splice(0, ystableData.length, ...PrintListDatas.data.列表);
+			}
+		} catch (err) {
+			ElMessage.error(err);
+		}
+	};
+  
+  // 删除工艺资料
+  const delgy_delclick = async () => {
+    try {
+      if (gySelection.value !== '') {
+        const res = await DeleteProcess({ id: gySelection.value });
+        if (res.code === 0) {
+          ElMessage.success('工艺资料删除成功');
+          // 刷新工艺资料表格
+          const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
+          if (processListData?.code === 0 && Array.isArray(processListData.data)) {
+            gytableData.splice(0, gytableData.length, ...processListData.data);
+          } else {
+            gytableData.splice(0, gytableData.length);
+          }
+        }
+      }
+    } catch (err) {
+      ElMessage.error(err);
+    }
+  };
+  
+  const fj_Selection = ref('')//存储选中Uniqid
+  const fjSelection = ref('')
+  const fjdelall = ref(true)
+  const fjSelectionChange = (selection, type) => {
+	  // console.log(selection)
+	const ids = selection.map(item => {
+	  return item.UniqId
+	})
+	fj_Selection.value = ids.join(',')
+	console.log("附件复选框",fj_Selection.value)
+  }
+  
+  // //删除附件按钮
+  const fj_delclick = async () => {
+	let params = {};  
+	params.UniqId = fj_Selection._value; 
+	res1.code === 0 && ElMessage.success('删除成功')
+  }
+  
+  //BOM表格复选框
+  const del_bom = ref(true)//删除BOM资料
+  const bom_Selection = ref('')//存储选中Uniqid
+  const bomSelectionChange = (selection, type) => {
+	const ids = selection.map(item => {
+	  return item.UNIQID
+	})
+	bom_Selection.value = ids.join(',')
+	console.log("bom复选框",bom_Selection.value)
+  }
+  
+  // 删除BOM资料按钮
+  // const delbom_delclick = async () => {
+  //   try {
+  //     // 弹出确认框
+  //     await ElMessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示', {
+  //       confirmButtonText: '确定',
+  //       cancelButtonText: '取消',
+  //       type: 'warning',
+  //     });
+  //     // 用户点击“确定”后执行以下逻辑
+  //     const params = {
+  // 		UNIQID: bom_Selection._value,
+  //     };
+  //     console.log('删除参数:', params);
+  //     // 调用删除接口
+  //     const res1 = await Bomdel(params);
+  //     if (res1.code === 0) {
+  //       ElMessage.success('删除成功');
+  //     } else {
+  //       ElMessage.error('删除失败');
+  //       return; // 如果删除失败,直接返回
+  //     }
+  //     // 重新获取BOM列表数据
+  //     const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
+  //     bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
+  //   } catch (error) {
+  //     // 用户点击“取消”或弹框关闭
+  //     console.log('用户取消删除操作');
+  //   }
+  // };
+  
+	//合计
+	const getSummaries = (param) => {  
+	  const { columns, data } = param;  
+	  const sums = {};  
+	  //选择你希望合计的列
+	  const summableLabels = [...sizeDatas, "制单总数"];
+	  columns.forEach((column, index) => {  
+		  if (index === 1) {  
+			  sums[index] = '总数量合计';  
+			  return;  
+		  }  
+
+		  if (summableLabels.includes(column.label)) {  
+			  const values = data.map(item => Number(item[column.property]));  
+
+			  // 检查数组中是否所有值都是 NaN  
+			  if (!values.every(value => isNaN(value))) {  
+				  sums[index] = values.reduce((prev, curr) => {  
+					  const value = Number(curr);  
+					  if (!isNaN(value)) {  
+						  return prev + value; 
+					  }  
+					  return prev;  
+				  }, 0);  
+				  // 如果需要,可以在这里添加单位  
+				  // sums[index] += ' 件';  
+			  } else {  
+				   sums[index] = 'N/A';  
+			  }  
+		  }  
+	  });  
+
+	  return sums;  
+  };
+
+	//工艺资料合计
+	const gySummaries = ({ columns, data }) => {  
+	  // 只合计状态为0(正常)的行
+	  const normalData = data.filter(item => String(item.状态) === '0');
+	  const sums = [];  
+	  columns.forEach((column, index) => {  
+		  if (index === 1) {  
+			  sums[index] = '合计';  
+			  return;  
+		  }  
+
+		  if (column.label === '工分') {  
+			  const values = normalData.map(item => Number(item[column.property]));  
+
+			  if (!values.every(value => isNaN(value))) {  
+				  const total = values.reduce((prev, curr) => {  
+					  const value = Number(curr);  
+					  if (!isNaN(value)) {  
+						  return prev + value; 
+					  }  
+					  return prev;  
+				  }, 0);  
+				  sums[index] = total.toFixed(2);  
+			  } else {  
+				   sums[index] = 'N/A';  
+			  }  
+		  }  
+	  });  
+
+	  return sums;  
+  };  
+
+	//工艺详情弹窗合计
+	const gyDetailSummaries = (param) => {  
+	  const { columns, data } = param;  
+	  const sums = [];  
+	  let total = 0;  
+	  let count = 0;  
+	  
+	  data.forEach(item => {  
+		if (item && item['定额分'] !== undefined) {  
+		  const val = Number(item['定额分']);  
+		  if (!isNaN(val)) {  
+			total += val;  
+			count++;  
+		  }  
+		}  
+	  });  
+	  
+	  columns.forEach((column, index) => {  
+		if (column.prop === '工序名称') {  
+		  sums[index] = '合计';  
+		} else if (column.label === '工分') {  
+		  sums[index] = count > 0 ? total.toFixed(2) : '0.00';  
+		} else {  
+		  sums[index] = '';  
+		}  
+	  });  
+	  
+	  return sums;  
+  };
+  
+  // 面料合计
+  // const mlgetSummaries = (param) => {  
+  //     const { columns, data } = param;  
+  //     const sums = {};  
+  // 	//选择你希望合计的列
+  //     const summableLabels = ["库存总量"];
+  //     columns.forEach((column, index) => {  
+  //         if (index === 0) {  
+  //             sums[index] = '总数量合计';  
+  //             return;  
+  //         }  
+  //         if (summableLabels.includes(column.label)) {  
+  //             const values = data.map(item => Number(item[column.property]));  
+  //             if (!values.every(value => isNaN(value))) {  
+  //                 sums[index] = values.reduce((prev, curr) => {  
+  //                     const value = Number(curr);  
+  //                     if (!isNaN(value)) {  
+  //                         return prev + value; 
+  //                     }  
+  //                     return prev;  
+  //                 }, 0);  
+  //             } else {  
+  //                  sums[index] = 'N/A';  
+  //             }  
+  //         }  
+  //     });  
+  //     return sums;  
+  // };  
+  
+  
+  
+  //=========查询========
+  const searchInfo = ref('')
+  
+  //查询按钮
+  const onSubmit = async () => {
+	if(searchInfo.value === ''){
+	  ElMessage({type: 'warning',message: '请输入搜索的订单编号'})
+	  return false;
+	}else{
+	const WorkListdata = await WorkOrderList({search:searchInfo.value,page:page.value,limit:pageSize.value});
+	 tableData.value= WorkListdata.data.data
+	 ystableData.splice(0, ystableData.length);//颜色资料清空
+	 parttableData.splice(0, parttableData.length);//部件资料清空
+	 gytableData.splice(0, gytableData.length);//工艺资料情空
+	 ddtableData.splice(0, ddtableData.length);//订单资料附件清空
+	 jstableData.splice(0, jstableData.length);//技术附件清空
+	}
+  };
+  
+  
+  // 调用查询数据接口
+  const _cha_WorkList = async (node) => {
+	if(searchInfo.value === ''){
+	  ElMessage({type: 'warning',message: '请输入搜索的信息'})
+	  return false;
+	}
+	const search = searchInfo.value;
+	var regex = /^[a-zA-Z0-9]+$/;
+	try {
+	  if (regex.test(search)) {
+		// 符合条件,执行搜索操作
+		console.log('搜索内容为纯数字加字母');
+		// const WorkListdata = await WorkList({search:search,limit:100,page:1});//接口调用函数
+		if(WorkListdata.data.total === 0){
+		  ElMessage({type: 'warning',message: '未搜索具体查询条件'})
+		}
+		tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
+		total.value = WorkListdata.data.total;//共多少条
+	  } else {
+		// 不符合条件,给出提示
+		console.log('搜索内容包含非字母和数字的字符');
+		// const WorkListdata = await WorkList({Gd_khdh:'',search:search,limit:100,page:1});//接口调用函数
+		if(WorkListdata.data.total === 0){
+		  ElMessage({type: 'warning',message: '未搜索具体查询条件'})
+		}
+		tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
+		total.value = WorkListdata.data.total;//共多少条
+	  }
+	} catch (error) {
+	  console.error(error);
+	}
+  };
+  
+  
+  //===============附件上传===============
+  //附件上传按钮
+  const jsfjClick = () => {
+	if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
+		ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
+	  }else{
+		  jsfjdialogFormVisible.value = true
+		  initJsfjformdata();
+		  jsfjformdata.value.关联编号 = _Gd_gdbh.value
+	  }
+  }
+  //技术附件弹窗
+  const jsfjdialogFormVisible = ref(false)
+  const jsfjformdata = ref({
+	  sys_id: _username.value,
+	  附件备注: '',
+	  附件内容: '',
+	  附件类型: '',
+	  关联编号: '',
+  });
+  //技术附件弹窗取消
+  const initJsfjformdata = () => {
+	jsfjformdata.value = {
+	  sys_id: _username.value,
+	  附件备注: '',
+	  附件内容: '',
+	  附件类型: '',
+	  关联编号: '',
+	}
+  }
+  //技术附件弹窗取消
+  const jsfjcloseDialog = () => {
+	jsfjdialogFormVisible.value = false
+  }
+  const uploadExcel = (event) =>{
+	  const files = event.target.files;
+	  console.log(files)
+	  let suffixArr = name.split("."), suffix = suffixArr[suffixArr.length-1];
+	  jsfjformdata.value.附件内容 = files[0]
+	  jsfjformdata.value.附件类型 = files[0].name.split('.')[1]
+  }
+  
+  //技术附件弹窗确定
+  const jsfjenterDialog = () => {
+	  if(jsfjformdata.value.附件备注==''){
+		  ElMessage({type: 'error',message: '请选择附件备注'});
+		  return;
+	  }
+	  if(jsfjformdata.value.附件内容==''){
+		  ElMessage({type: 'error',message: '请上传文件'});
+		  return;
+	  }
+	  if(jsfjformdata.value.关联编号==''){
+		  ElMessage({type: 'error',message: '请关闭重新打开'});
+		  return;
+	  }
+	  let fr = new FileReader();
+	  fr.readAsDataURL(jsfjformdata.value.附件内容);
+	  fr.onload = function () {
+		const restoredData = new FormData();
+		restoredData.append('附件备注', jsfjformdata.value.附件备注);
+		restoredData.append('附件内容', fr.result);
+		restoredData.append('附件类型', jsfjformdata.value.附件类型);
+		restoredData.append('关联编号', jsfjformdata.value.关联编号);
+		restoredData.append('sys_id', jsfjformdata.value.sys_id);
+		
+		 //将restoredDta数据新增到接口
+		 gdAnnexAdd(restoredData).then(response => {
+		   if(response.code==0){
+			   ElMessage({type: 'success',message: '新增成功',})
+			   jsfjdialogFormVisible.value = false
+			   let row = {
+				   '订单编号':_Gd_gdbh.value,
+				  //  '产品代号':_Gd_cpdh.value,
+				  //  '产品名称':_Gd_cpmc.value,
+			   }
+			   tableRowClick (row)
+		   }
+		 })
+	  }
+  }
+
+  // 导入工艺资料弹窗相关方法
+  const openImportProcessDialog = () => {
+    importProcessForm.workorderNo = _Gd_gdbh.value
+    importProcessForm.styleNo = _Gd_sckh.value
+    importProcessFileList.length = 0
+    importProcessFile = null
+    importProcessDialogVisible.value = true
+	console.log(importProcessDialogVisible.value)
+  }
+
+  const closeImportProcessDialog = () => {
+    importProcessDialogVisible.value = false
+    importProcessFileList.length = 0
+    importProcessFile = null
+  }
+
+  const handleImportProcessFileChange = (file, fileList) => {
+    if (fileList.length > 0) {
+      const lastFile = fileList[fileList.length - 1]
+      importProcessFile = lastFile.raw || lastFile
+    }
+  }
+
+  const handleImportProcessFileRemove = () => {
+    importProcessFile = null
+  }
+
+  const beforeImportProcessUpload = (file) => {
+    const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || 
+                    file.type === 'application/vnd.ms-excel'
+    if (!isExcel) {
+      ElMessage.error('请选择Excel文件')
+      return false
+    }
+    return true
+  }
+
+  const submitImportProcess = async () => {
+    if (!importProcessFile) {
+      ElMessage.error('请选择Excel文件')
+      return
+    }
+
+    const formData = new FormData()
+    formData.append('workorder', _Gd_gdbh.value)
+    formData.append('file', importProcessFile)
+    formData.append('sys_id', userStore.userInfo.nickName)
+
+    try {
+      const baseURL = import.meta.env.VITE_BASE_API || ''
+      const response = await axios.post(`${baseURL}/mes_server/work_order_process/importProcess`, formData, {
+        headers: {
+          'x-token': userStore.token
+        }
+      })
+      const res = response?.data || {}
+      if (res.code === 0) {
+        ElMessage.success('导入成功')
+        closeImportProcessDialog()
+        const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
+        if (processListData?.code === 0 && Array.isArray(processListData.data)) {
+          gytableData.splice(0, gytableData.length, ...processListData.data);
+        } else {
+          gytableData.splice(0, gytableData.length);
+        }
+      } else {
+        handleImportProcessFail(res)
+      }
+    } catch (error) {
+      console.error('导入工艺资料失败:', error)
+      const res = error?.response?.data
+      if (res && typeof res === 'object') {
+        handleImportProcessFail(res)
+        return
+      }
+      ElMessage.error(error?.message || '导入失败,请稍后重试')
+    }
+  }
+  
+  </script>
+  <style scoped>
+  /* 在样式表中使用媒体查询 */
+  @media (max-width: 768px) {
+	/* 在小屏幕下的样式设置 */
+  .dialog-footer {
+	  text-align: center;
+	}
+  }
+  .import-conflict-summary {
+	margin-bottom: 10px;
+	font-size: 14px;
+	color: #606266;
+	line-height: 1.5;
+  }
+  .import-conflict-summary strong {
+	color: #e6a23c;
+  }
+  .import-process-tip {
+	margin: 0 0 14px;
+	padding: 0;
+	font-size: 13px;
+	line-height: 1.7;
+	color: #f56c6c;
+	background: none;
+	border: none;
+	text-align: left;
+  }
+  /*背景颜色*/
+  /*印件背景颜色变黄*/
+  :deep(.el-table__body .warning-row) {
+	background: #FFFF80 !important;
+  }
+  /*bom参数背景*/
+  :deep(.el-table__body .background-plan-usage-low div div div) {
+	background: #80FA80 !important;
+  }
+  /* 选中某行时的背景色 */
+  :deep(.el-table__body tr.current-row) > td {
+	background: #ff80ff !important;
+  }
+  :deep(.statusy-plan-usage-low div) {
+	color: #8c939d !important;
+  }
+  /* 在样式表中添加以下样式 */
+  .el-input__textarea {
+	resize: none; /* 禁止调整大小 */
+  }
+  .JKWTree-container {
+	display: flex;
+  }
+  .JKWTree-tree {
+	/*width: 300px;*/
+	background-color: #fff;
+	padding: 10px;
+	margin-right: 20px;
+  }
+  .JKWTree-tree h3 {
+	font-size: 15px;
+	font-weight: 700;
+	margin: 10px 0;
+  }
+  .JKWTree-content {
+	flex: 1;
+  }
+  /*关闭拖拽功能*/
+  .el-textarea textarea {
+	resize: none !important;
+  }
+  
+  /* 新增/修改订单资料弹窗 - 16/8 栅格布局(与原版一致,小屏自动换行) */
+  .add-order-dialog :deep(.el-dialog) {
+	width: min(90%, 1200px) !important;
+	max-height: 92vh;
+	display: flex;
+	flex-direction: column;
+	margin: 4vh auto !important;
+  }
+  .add-order-dialog :deep(.el-dialog__body) {
+	flex: 1;
+	min-height: 0;
+	overflow-x: hidden;
+	overflow-y: auto;
+	padding: 12px 20px 8px;
+  }
+  .add-order-dialog-body {
+	min-width: 0;
+  }
+  .add-order-dialog-main,
+  .add-order-dialog-side {
+	min-width: 0;
+  }
+  .add-order-upload-wrap {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	margin-bottom: 16px;
+  }
+  .add-order-dialog-side :deep(.el-upload-list--picture-card) {
+	margin-left: 0;
+  }
+  .add-order-upload-title {
+	font-size: 16px;
+	margin-top: 8px;
+	text-align: center;
+	color: var(--el-text-color-regular);
+  }
+  /* 去掉「按 Delete 键可删除」及角标关闭,仅保留 picture-card 悬停放大/垃圾桶 */
+  .add-order-upload :deep(.el-icon--close-tip),
+  .add-order-upload :deep(.el-upload-list__item .el-icon--close),
+  .add-order-upload :deep(.el-upload-list__item-status-label) {
+	display: none !important;
+  }
+  .add-order-bottom-row {
+	margin-top: 4px;
+  }
+  .add-order-dialog-main :deep(.el-input),
+  .add-order-dialog-main :deep(.el-select),
+  .add-order-dialog-main :deep(.el-date-editor),
+  .add-order-dialog-side :deep(.el-input),
+  .add-order-dialog-side :deep(.el-date-editor) {
+	width: 100%;
+  }
+  .add-order-dialog-main :deep(.el-form-item__content),
+  .add-order-dialog-side :deep(.el-form-item__content) {
+	min-width: 0;
+  }
+  @media (max-width: 768px) {
+	.add-order-dialog-side {
+	  margin-top: 12px;
+	  padding-top: 12px;
+	  border-top: 1px solid var(--el-border-color-lighter);
+	}
+  }
+
+  /* 新增部件弹窗样式 */
+  .part-add-dialog {
+	max-height: 95vh;
+	height: 95vh;
+  }
+  
+  .part-add-dialog .el-dialog__body {
+	max-height: 85vh;
+	height: 85vh;
+	overflow-y: auto;
+	padding: 20px;
+  }
+  
+  .part-add-dialog .list-part-hint {
+	margin-bottom: 20px;
+	font-size: 14px;
+  }
+  
+  .part-add-dialog .el-table {
+	margin-bottom: 20px;
+  }
+  
+  .part-add-dialog .el-table th {
+	background-color: #f5f7fa;
+	font-weight: bold;
+  }
+  
+  .part-add-dialog .el-table td {
+	padding: 12px;
+  }
+  
+  .part-add-dialog .dialog-footer {
+	margin-top: 20px;
+	padding-top: 15px;
+	border-top: 1px solid #ebeef5;
+  }
+  </style>
+  <style scoped>
+  :deep(.el-table td .cell) {
+	line-height: 20px !important;
+  }
+  :deep(.el-tabs__header){
+	margin-bottom: 0;
+  }
+  .search{
+	margin-left: 0px !important;
+	margin-right: 10px !important;
+  }
+  .bt{
+	margin-left: 2px !important;
+	padding: 3px !important;
+	font-size: 12px;
+  }
+  .el-tabs__header{
+	margin: 0px !important;
+  }
+  .gva-table-box{
+	padding: 0px !important;
+  }
+  .el-pagination{
+	margin-top: 0px !important;
+  }
+  /* .upload-demo .el-upload {  
+	border: 1px dashed #d9d9d9;  
+	border-radius: 6px;  
+	cursor: pointer;  
+	position: relative;  
+	overflow: hidden;  
+  }  
+  .upload-demo .el-upload:hover {  
+	border-color: #409EFF;  
+  }   */
+  
+  .mab{
+	margin-bottom: 5px;
+  }
+  .fj-col-header {
+	display: inline-flex;
+	align-items: center;
+	gap: 2px;
+	cursor: help;
+  }
+  .fj-col-help {
+	font-size: 14px;
+	color: #909399;
+  }
+  /* 上下表头统一浅色 */
+  :deep(.el-table) {
+	--el-table-header-bg-color: #fafafa;
+  }
+  :deep(.el-table__header th.el-table__cell) {
+	background-color: #fafafa !important;
+  }
+  ::v-deep(.input_style .el-input__inner) {  
+	font-size: 18px; 
+  }  
+  ::v-deep(.el-form-item__label) {  
+	font-size: 18px; 
+  }
+  
+  ::v-deep(.el-upload-list--picture-card) {  
+	  margin-left: 0;
+  }
+  ::v-deep(.add-order-upload .el-upload__input),
+  ::v-deep(.import-process-upload .el-upload__input) {
+    display: none !important;
+  }
+  ::v-deep(.el-checkbox__inner) {  
+	  width: 20px;
+	  height: 20px;
+  }
+  ::v-deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {  
+	top: 30%; 
+	left: 30%;
+  }
+  ::v-deep(.el-descriptions__table tbody tr .is-bordered-label){
+	  width: 40px;
+  }
+  ::v-deep(.el-descriptions__table tbody tr .el-descriptions__content){
+	  width: 120px;
+  }
+  :deep(.el-descriptions__content) {
+	width: 80px !important;
+	min-width: 80px !important;
+	max-width: 100px !important;
+	overflow: hidden !important;
+	text-overflow: ellipsis !important;
+  }
+  
+  .big-error-message {
+    padding: 20px 30px !important;     /* 整体弹窗变大 */
+    font-size: 20px !important;        /* 文字更大 */
+    animation: scaleFadeIn 0.3s ease-out; /* 放大淡入动画 */
+  }
+  
+  .big-error-message .el-message__icon {
+    font-size: 26px !important; /* 图标变大 */
+  }
+  
+  @keyframes scaleFadeIn {
+    0% {
+      transform: scale(0.8);
+      opacity: 0;
+    }
+    100% {
+      transform: scale(1);
+      opacity: 1;
+    }
+  }
+  
+  /* 排序弹窗样式 */
+  .list-unified-dialog :deep(.el-dialog) {
+    max-height: 90vh;
+    display: flex;
+    flex-direction: column;
+    margin-top: 5vh !important;
+    margin-bottom: 5vh;
+  }
+  .list-unified-dialog :deep(.el-dialog__header) {
+    flex-shrink: 0;
+    padding-bottom: 12px;
+  }
+  .list-unified-dialog :deep(.el-dialog__body) {
+    flex: 1;
+    min-height: 320px;
+    max-height: min(720px, calc(90vh - 130px));
+    overflow-y: auto;
+    box-sizing: border-box;
+  }
+  .list-unified-dialog :deep(.el-dialog__footer) {
+    flex-shrink: 0;
+  }
+  .list-process-add-dialog.list-unified-dialog :deep(.el-dialog) {
+    width: min(1280px, 96vw) !important;
+    min-width: min(1280px, 96vw) !important;
+    max-width: min(1280px, 96vw) !important;
+    height: min(620px, 78vh) !important;
+    min-height: min(620px, 78vh) !important;
+    max-height: min(620px, 78vh) !important;
+    box-sizing: border-box !important;
+  }
+  .list-process-add-dialog.list-unified-dialog :deep(.el-dialog__body) {
+    max-height: none !important;
+    min-height: 0 !important;
+    flex: 1 1 auto !important;
+    display: flex !important;
+    flex-direction: column !important;
+    overflow: hidden !important;
+  }
+  .list-process-add-dialog.list-unified-dialog .list-process-add-by-part {
+    flex: 1 1 auto;
+    min-height: 0;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+  .list-process-add-dialog.list-unified-dialog .list-dialog-context-header {
+    flex-shrink: 0;
+  }
+  .list-dialog-context-header {
+    margin-bottom: 14px;
+  }
+  .list-dialog-kv-table {
+    width: 100%;
+    border-collapse: collapse;
+    font-size: 13px;
+    table-layout: fixed;
+  }
+  .list-dialog-kv-table th,
+  .list-dialog-kv-table td {
+    border: 1px solid var(--el-border-color);
+    padding: 8px 12px;
+    text-align: left;
+    vertical-align: middle;
+    line-height: 1.45;
+  }
+  .list-dialog-kv-table th {
+    width: 92px;
+    background: #f5f7fa;
+    font-weight: 500;
+    color: var(--el-text-color-regular);
+    white-space: nowrap;
+  }
+  .list-dialog-kv-table td {
+    background: #fff;
+    color: var(--el-text-color-primary);
+    word-break: break-word;
+  }
+  .list-process-add-split {
+    display: flex;
+    gap: 14px;
+    align-items: stretch;
+    flex: 1 1 auto;
+    min-height: 0;
+    overflow: hidden;
+  }
+  .list-process-add-sidebar {
+    flex: 0 0 240px;
+    max-width: 42%;
+    display: flex;
+    flex-direction: column;
+    min-height: 0;
+    border: 1px solid var(--el-border-color-lighter);
+    border-radius: 8px;
+    background: var(--el-fill-color-blank);
+    overflow: hidden;
+  }
+  .list-process-add-sidebar-title {
+    padding: 10px 12px;
+    font-size: 13px;
+    font-weight: 600;
+    color: var(--el-text-color-regular);
+    border-bottom: 1px solid var(--el-border-color-lighter);
+    background: #f5f7fa;
+  }
+  .list-process-add-part-list {
+    flex: 1;
+    min-height: 0;
+    overflow-y: auto;
+    padding: 8px;
+    display: flex;
+    flex-direction: column;
+    gap: 6px;
+  }
+  .list-process-add-stage-list {
+    gap: 2px;
+  }
+  .list-process-add-stage-item {
+    display: flex;
+    align-items: center;
+    padding: 9px 10px;
+    border-radius: 6px;
+    border: 1px solid var(--el-border-color-lighter);
+    background: var(--el-bg-color);
+    cursor: pointer;
+    font-size: 13px;
+    font-weight: 600;
+    color: var(--el-text-color-primary);
+    user-select: none;
+    -webkit-user-select: none;
+    transition: border-color 0.15s, background 0.15s;
+  }
+  .list-process-add-stage-item:hover {
+    border-color: var(--el-color-primary-light-5);
+  }
+  .list-process-add-stage-item.is-active {
+    border-color: var(--el-color-primary);
+    background: var(--el-color-primary-light-9);
+    color: var(--el-color-primary);
+  }
+  .list-process-add-sewing-nest {
+    margin: 0 0 8px 0;
+    padding: 0 0 0 10px;
+    border-left: 2px solid var(--el-border-color-lighter);
+    display: flex;
+    flex-direction: column;
+    gap: 5px;
+  }
+  .list-process-add-part-item--nest {
+    padding: 6px 8px;
+    font-size: 12px;
+  }
+  .list-process-add-part-item {
+    display: flex;
+    align-items: flex-start;
+    gap: 8px;
+    padding: 8px 10px;
+    border-radius: 6px;
+    border: 1px solid var(--el-border-color-lighter);
+    background: var(--el-bg-color);
+    cursor: pointer;
+    user-select: none;
+    -webkit-user-select: none;
+    transition: border-color 0.15s, background 0.15s;
+  }
+  .list-process-add-part-item:hover {
+    border-color: var(--el-color-primary-light-5);
+  }
+  .list-process-add-part-item.is-active {
+    border-color: var(--el-color-primary);
+    background: var(--el-color-primary-light-9);
+  }
+  .list-process-add-part-item-text {
+    flex: 1;
+    min-width: 0;
+    display: flex;
+    flex-direction: column;
+    gap: 2px;
+  }
+  .list-process-add-part-sort {
+    font-size: 12px;
+    color: var(--el-text-color-secondary);
+  }
+  .list-process-add-part-name {
+    font-size: 13px;
+    font-weight: 600;
+    color: var(--el-text-color-primary);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .list-process-add-main-panel {
+    flex: 1;
+    min-width: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 0;
+    border: 1px solid var(--el-border-color-lighter);
+    border-radius: 8px;
+    padding: 10px 12px;
+    background: var(--el-bg-color);
+    overflow: hidden;
+  }
+  .list-process-add-main-head {
+    margin-bottom: 10px;
+    font-size: 13px;
+    color: var(--el-text-color-regular);
+  }
+  .list-process-add-main-head-sub {
+    margin-left: 6px;
+    color: var(--el-text-color-secondary);
+    font-weight: normal;
+  }
+  .list-process-add-main-empty {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    min-height: 200px;
+  }
+  .sort-part-gy-part-item.is-active {
+    border-color: var(--el-color-primary);
+    background: var(--el-color-primary-light-9);
+  }
+  .sort-part-gy-body {
+    flex: 1;
+    min-height: 0;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+  .sort-part-gy-hint {
+    margin-bottom: 12px;
+    font-size: 13px;
+    line-height: 1.55;
+    color: var(--el-text-color-regular);
+  }
+  .sort-part-gy-hint-list {
+    margin: 0;
+    padding-left: 20px;
+  }
+  .sort-part-gy-hint-list li {
+    margin-bottom: 6px;
+  }
+  .sort-part-gy-split {
+    flex: 1;
+    min-height: 0;
+    display: flex;
+    gap: 14px;
+    align-items: stretch;
+    overflow: hidden;
+  }
+  .sort-gy-left-nav {
+    flex: 0 0 240px;
+    max-width: 42%;
+  }
+  .list-sort-gy-nav-list {
+    gap: 2px;
+  }
+  .list-sort-gy-sewing-parts {
+    margin: 0 0 8px 0;
+    padding: 0 0 0 10px;
+    border-left: 2px solid var(--el-border-color-lighter);
+    display: flex;
+    flex-direction: column;
+    gap: 5px;
+  }
+  .sort-part-gy-part-item {
+    display: flex;
+    align-items: flex-start;
+    gap: 8px;
+    padding: 8px 10px;
+    border-radius: 6px;
+    border: 1px solid var(--el-border-color-lighter);
+    background: var(--el-bg-color);
+    cursor: pointer;
+    user-select: none;
+    -webkit-user-select: none;
+    transition: border-color 0.15s, background 0.15s;
+  }
+  .sort-part-gy-part-item:hover {
+    border-color: var(--el-color-primary-light-5);
+  }
+  .sort-part-gy-part-item.is-active {
+    border-color: var(--el-color-primary);
+    background: var(--el-color-primary-light-9);
+  }
+  .sort-part-gy-part-item-grip {
+    color: var(--el-text-color-secondary);
+    margin-top: 2px;
+  }
+  .sort-part-gy-main-panel {
+    flex: 1;
+    min-width: 0;
+    display: flex;
+    flex-direction: column;
+    min-height: 0;
+    border: 1px solid var(--el-border-color-lighter);
+    border-radius: 8px;
+    padding: 10px 12px;
+    background: var(--el-bg-color);
+    overflow: hidden;
+  }
+  .sort-part-gy-main-head {
+    margin-bottom: 10px;
+    font-size: 13px;
+    color: var(--el-text-color-regular);
+  }
+  .sort-part-gy-main-head--warn {
+    color: var(--el-color-warning);
+  }
+  .sort-part-gy-main-empty {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    min-height: 200px;
+  }
+  .sort-gy-table {
+    flex: 1;
+    min-height: 0;
+  }
+  .sort-drag-col-hint {
+    font-size: 12px;
+    color: var(--el-text-color-secondary);
+  }
+  .sort-drag-handle {
+    color: var(--el-text-color-secondary);
+    cursor: move;
+  }	
+  .list-lib-name-select {
+    width: 100%;
+  }
+  .sort-gy-num-input {
+    width: 100%;
+  }
+  :deep(.gy-detail-dialog.el-dialog) {
+    max-width: 100vw;
+  }
+
+  :deep(.gy-detail-dialog .el-dialog__header) {
+    padding: 12px 20px 8px;
+    margin-right: 0;
+  }
+
+  :deep(.gy-detail-dialog .el-dialog__body) {
+    padding: 0;
+    overflow: hidden;
+    max-width: 100%;
+  }
+
+  .gy-detail-dialog-header {
+    display: flex;
+    flex-direction: column;
+    align-items: stretch;
+    gap: 12px;
+    width: 100%;
+    box-sizing: border-box;
+  }
+
+  .gy-detail-dialog-title-row {
+    width: 100%;
+  }
+
+  .gy-detail-dialog-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: var(--el-text-color-primary);
+  }
+
+  .gy-detail-dialog-toolbar-row {
+    display: flex;
+    align-items: center;
+    flex-wrap: nowrap;
+    width: 100%;
+  }
+
+  .gy-detail-dialog-actions-left {
+    display: flex;
+    align-items: center;
+    flex-wrap: nowrap;
+    gap: 10px;
+  }
+
+  .gy-detail-dialog-exit {
+    flex-shrink: 0;
+    margin-left: auto;
+  }
+
+  .gy-detail-dialog-body {
+    width: 100%;
+    max-width: 100%;
+    height: calc(100vh - 80px);
+    padding: 20px;
+    overflow: auto;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    min-width: 0;
+  }
+
+  .gy-detail-dialog-body > .gy-detail-table-wrap {
+    flex: 1;
+    min-height: 0;
+  }
+
+  .gy-detail-table-wrap {
+    width: 100%;
+    max-width: 100%;
+    min-width: 0;
+    height: calc(100vh - 250px);
+    overflow: auto;
+    border: 1px solid #ebeef5;
+    border-radius: 4px;
+  }
+
+  .gy-detail-vxe-table {
+    width: 100%;
+    flex: 1;
+    min-height: 0;
+    --vxe-table-row-current-background-color: #ff80ff;
+    --vxe-table-row-hover-current-background-color: #ff80ff;
+    --vxe-ui-table-row-current-background-color: #ff80ff;
+    --vxe-table-row-height: 28px;
+    --vxe-table-cell-padding-left: 4px;
+    --vxe-table-cell-padding-right: 4px;
+    font-size: 13px;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--row),
+  :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--row),
+  :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--row) {
+    height: 28px !important;
+    line-height: 28px !important;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-header--column),
+  :deep(.gy-detail-vxe-table .vxe-body--column),
+  :deep(.gy-detail-vxe-table .vxe-footer--column),
+  :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--cell),
+  :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--cell),
+  :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--cell) {
+    font-size: 13px;
+    height: 28px !important;
+    line-height: 28px !important;
+    padding: 0 4px !important;
+    vertical-align: middle !important;
+  }
+
+  /* 单元格内容垂直居中,编辑框贴齐格子 */
+  :deep(.gy-detail-vxe-table .vxe-body--column .vxe-cell) {
+    display: flex !important;
+    align-items: center !important;
+    height: 100% !important;
+    min-height: 28px !important;
+    max-height: 28px !important;
+    overflow: hidden !important;
+    box-sizing: border-box !important;
+  }
+
+  /* align=center / 固定操作列:水平居中 */
+  :deep(.gy-detail-vxe-table .col--center .vxe-cell),
+  :deep(.gy-detail-vxe-table .vxe-header--column.col--center .vxe-cell),
+  :deep(.gy-detail-vxe-table .vxe-body--column.col--center .vxe-cell),
+  :deep(.gy-detail-vxe-table .vxe-footer--column.col--center .vxe-cell),
+  :deep(.gy-detail-vxe-table .col--fixed-right .vxe-cell),
+  :deep(.gy-detail-vxe-table .vxe-header--column.col--fixed-right .vxe-cell),
+  :deep(.gy-detail-vxe-table .vxe-body--column.col--fixed-right .vxe-cell),
+  :deep(.gy-detail-vxe-table .vxe-footer--column.col--fixed-right .vxe-cell) {
+    justify-content: center !important;
+    text-align: center !important;
+  }
+
+  .gy-detail-status-cell,
+  .gy-detail-action-cell {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+  :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell),
+  :deep(.gy-detail-vxe-table .col--checkbox) {
+    text-align: center !important;
+    justify-content: center !important;
+  }
+
+  :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--checkbox),
+  :deep(.gy-detail-vxe-table .col--checkbox .vxe-checkbox--icon),
+  :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--title) {
+    margin-left: auto !important;
+    margin-right: auto !important;
+  }
+
+  .gy-detail-table-wrap ::-webkit-scrollbar,
+  .gy-detail-vxe-table ::-webkit-scrollbar,
+  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar,
+  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar {
+    display: block !important;
+    width: 14px;
+    height: 14px;
+  }
+
+  .gy-detail-table-wrap ::-webkit-scrollbar-track,
+  .gy-detail-vxe-table ::-webkit-scrollbar-track,
+  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-track,
+  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-track {
+    background: #f1f1f1;
+    border-radius: 7px;
+  }
+
+  .gy-detail-table-wrap ::-webkit-scrollbar-thumb,
+  .gy-detail-vxe-table ::-webkit-scrollbar-thumb,
+  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb,
+  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb {
+    background: #ccc;
+    border-radius: 7px;
+    border: 3px solid #f1f1f1;
+  }
+
+  .gy-detail-table-wrap ::-webkit-scrollbar-thumb:hover,
+  .gy-detail-vxe-table ::-webkit-scrollbar-thumb:hover,
+  .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb:hover,
+  .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb:hover {
+    background: #999;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper),
+  :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper) {
+    z-index: 4;
+  }
+
+  :deep(.gy-detail-vxe-table .col--fixed-right) {
+    background-color: #fff;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-right),
+  :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-left) {
+    background-color: #f5f7fa;
+  }
+
+  .gy-detail-cell {
+    min-height: 24px;
+    height: 24px;
+    line-height: 24px;
+    padding: 0 4px;
+    cursor: text;
+    border-radius: 2px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    text-align: center;
+    color: var(--el-text-color-primary);
+    box-sizing: border-box;
+    width: 100%;
+  }
+
+  .gy-detail-cell--wide {
+    white-space: nowrap;
+    line-height: 24px;
+    min-height: 24px;
+    height: 24px;
+    display: flex;
+    align-items: center;
+    justify-content: flex-start;
+    text-align: left;
+    width: 100%;
+  }
+
+  .gy-detail-cell:hover {
+    background: #f5f7fa;
+    box-shadow: inset 0 0 0 1px #dcdfe6;
+  }
+
+  .gy-split-process-name {
+    color: #f56c6c;
+    font-weight: 600;
+  }
+
+  .gy-detail-cell-input {
+    width: 100%;
+    flex: 1;
+    min-width: 0;
+    position: relative;
+    z-index: 2;
+  }
+
+  .gy-detail-cell-select {
+    display: block;
+    width: 100%;
+  }
+
+  .gy-detail-vxe-table .gy-detail-cell-select .el-select__wrapper {
+    min-height: 24px !important;
+    height: 24px !important;
+    padding: 0 6px;
+    box-shadow: 0 0 0 1px var(--el-color-primary) inset;
+    box-sizing: border-box;
+  }
+
+  .gy-detail-vxe-table .gy-detail-cell-input .el-input__wrapper {
+    min-height: 24px !important;
+    height: 24px !important;
+    padding: 0 6px;
+    box-shadow: 0 0 0 1px var(--el-color-primary) inset;
+    box-sizing: border-box;
+  }
+
+  .gy-detail-vxe-table .gy-detail-cell-input .el-input__inner {
+    height: 22px !important;
+    line-height: 22px !important;
+  }
+
+  :deep(.gy-detail-vxe-table .el-button--small) {
+    --el-button-size: 20px;
+    height: 20px;
+    padding: 0 6px;
+    font-size: 12px;
+  }
+
+  .gy-detail-vxe-table .vxe-body--row.row--current .gy-detail-cell:hover {
+    background: rgba(255, 255, 255, 0.35);
+  }
+
+  /* 仅点击当前行显示 #ff80ff,勾选复选框不高亮行背景 */
+  :deep(.gy-detail-vxe-table .vxe-body--row.row--current),
+  :deep(.gy-detail-vxe-table .vxe-body--row.is--current) {
+    background-color: #ff80ff !important;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-body--row.row--current > .vxe-body--column),
+  :deep(.gy-detail-vxe-table .vxe-body--row.row--current.row--hover > .vxe-body--column),
+  :deep(.gy-detail-vxe-table .vxe-body--row.is--current > .vxe-body--column),
+  :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper .vxe-body--row.row--current > .vxe-body--column),
+  :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper .vxe-body--row.row--current > .vxe-body--column) {
+    background-color: #ff80ff !important;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-body--row.row--checked:not(.row--current) > .vxe-body--column),
+  :deep(.gy-detail-vxe-table .vxe-body--row.is--checked:not(.is--current) > .vxe-body--column) {
+    background-color: #fff !important;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-body--row.row--current .el-input__wrapper) {
+    background-color: transparent !important;
+  }
+
+  .gy-detail-col-header {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    gap: 4px;
+    width: 100%;
+  }
+
+  .gy-detail-filter-btn {
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    width: 22px;
+    height: 22px;
+    cursor: pointer;
+    color: #909399;
+    border-radius: 2px;
+  }
+
+  .gy-detail-filter-btn:hover,
+  .gy-detail-filter-btn.is-active {
+    color: var(--el-color-primary);
+    background: #ecf5ff;
+  }
+
+  .gy-detail-filter-options {
+    max-height: 220px;
+    overflow-x: hidden;
+    overflow-y: auto;
+    margin-bottom: 4px;
+  }
+
+  .gy-detail-filter-panel .el-checkbox {
+    display: flex;
+    margin-right: 0;
+    margin-bottom: 6px;
+  }
+
+  .gy-detail-filter-actions {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-top: 4px;
+    padding-top: 8px;
+    border-top: 1px solid #ebeef5;
+    background: #fff;
+    position: relative;
+    z-index: 2;
+  }
+
+  .gy-detail-filter-link {
+    color: var(--el-color-primary);
+    font-size: 12px;
+    line-height: 1;
+    cursor: pointer;
+    user-select: none;
+    padding: 4px 2px;
+  }
+
+  .gy-detail-filter-link:hover {
+    opacity: 0.85;
+  }
+
+</style>
+
+<style>
+  /* 导入工艺资料弹窗:标签与输入紧凑排列,避免 label 宽 + content margin-left 叠成大空隙 */
+  .import-process-dialog .el-dialog__body {
+    padding: 12px 24px 8px;
+  }
+  .import-process-dialog .import-process-body {
+    width: 100%;
+  }
+  .import-process-dialog .import-process-form {
+    width: 100%;
+  }
+  .import-process-dialog .import-process-form .el-form-item {
+    display: flex;
+    margin-bottom: 16px;
+    align-items: flex-start;
+  }
+  .import-process-dialog .import-process-form .el-form-item__label {
+    flex: 0 0 96px !important;
+    width: 96px !important;
+    max-width: 96px !important;
+    justify-content: flex-end;
+    text-align: right;
+    padding-right: 8px;
+    box-sizing: border-box;
+    white-space: nowrap;
+  }
+  .import-process-dialog .import-process-form .el-form-item__content,
+  .import-process-form .el-form-item__content {
+    margin-left: 0 !important;
+    flex: 1;
+    min-width: 0;
+  }
+  .import-process-dialog .import-process-upload {
+    width: 100%;
+  }
+  .import-process-dialog .import-process-upload .el-upload-list {
+    margin-top: 6px;
+  }
+
+  /* 导入冲突左右对照弹窗(append-to-body):提示在表格上方通栏 */
+  .import-process-conflict-dialog .import-conflict-summary:empty {
+    display: none;
+  }
+  .import-process-conflict-dialog .import-conflict-summary {
+    margin-bottom: 12px;
+    font-size: 14px;
+    color: #606266;
+    line-height: 1.5;
+  }
+  .import-process-conflict-dialog .import-conflict-summary strong {
+    color: #e6a23c;
+    font-size: 15px;
+  }
+  .import-process-conflict-dialog .import-process-tip {
+    width: 100%;
+    margin: 0 0 12px;
+    padding: 0;
+    font-size: 13px;
+    line-height: 1.7;
+    color: #f56c6c;
+    text-align: left;
+  }
+  .import-process-conflict-dialog .el-table .import-conflict-diff-row > td.el-table__cell {
+    background-color: #fef0f0 !important;
+  }
+  .import-process-conflict-dialog .el-table .import-conflict-diff-row:hover > td.el-table__cell {
+    background-color: #fde2e2 !important;
+  }
+
+  .process-production-dialog .el-dialog__header {
+    display: block;
+    width: 100%;
+    margin-right: 0;
+    padding: 16px 20px 12px;
+    box-sizing: border-box;
+  }
+
+  .process-production-dialog .el-dialog__body {
+    padding: 0;
+    background: #fff;
+  }
+
+  .process-production-dialog-header {
+    display: flex;
+    align-items: center;
+    width: 100%;
+    box-sizing: border-box;
+  }
+
+  .process-production-dialog-title {
+    flex: 1;
+    font-size: 16px;
+    font-weight: 600;
+    color: #303133;
+  }
+
+  .process-production-dialog-close {
+    flex-shrink: 0;
+    margin-left: auto;
+    min-width: 56px;
+    font-weight: 500;
+  }
+
+  .gy-detail-filter-popper {
+    z-index: 10050 !important;
+    pointer-events: auto;
+    padding: 8px 10px !important;
+  }
+
+  .gy-detail-filter-popper .gy-detail-filter-panel {
+    pointer-events: auto;
+  }
+
+  .el-message-box .gy-split-process-name {
+    color: #f56c6c;
+    font-weight: 600;
+  }
+</style>