zck пре 21 часа
родитељ
комит
327c048e2f

+ 37 - 1
src/view/performance/WorkScoreReporting/gongfenbaogong.vue

@@ -94,6 +94,11 @@
                                   <el-table-column align="center" label="完工数量" prop="number" :width="100" />
                                   <el-table-column align="center" label="组别" prop="sys_id" :width="120" show-overflow-tooltip />
                                   <el-table-column align="center" label="报工时间" prop="sys_rq" :width="180" show-overflow-tooltip />
+                                  <el-table-column align="center" label="操作" :width="100" fixed="right">
+                                    <template #default="scope">
+                                      <el-button type="danger" size="small" @click.stop="deleteReportingWork(scope.row)">删除</el-button>
+                                    </template>
+                                  </el-table-column>
                         </el-table>
                       </el-tab-pane>
 
@@ -446,7 +451,7 @@ import $ from 'jquery';
 import LuckyExcel from 'luckyexcel';
 import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
 import {ref, reactive, computed, watch, nextTick, onUnmounted} from 'vue';
-import {getSpotList,getInfo,OrderAttachments,WorkOrderList} from '@/api/mes/job';
+import {getSpotList,getInfo,OrderAttachments,WorkOrderList,DeleteReportingWork} from '@/api/mes/job';
 import {getMac,getMajorprocessAndPerson,GetOrderProcess,GetCarProcess,ReportingWork,GetReportingWorkRecord} from '@/api/jixiaoguanli/baogong'
 import {getMachineMac} from '@/api/jixiaoguanli/jitairibaobiao'
 import {ElMessage,ElMessageBox} from "element-plus";
@@ -1501,6 +1506,33 @@ const getGongfenHistory = async () => {
   }
 };
 
+const deleteReportingWork = async (row) => {
+  try {
+    await ElMessageBox.confirm('确定要删除这条报工记录吗?', '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
+    
+    const response = await DeleteReportingWork({
+      id: row.id
+    });
+    
+    if (response.code === 0) {
+      ElMessage.success('删除成功');
+      // 刷新数据
+      getGongfenHistory();
+    } else {
+      ElMessage.error(response.msg || '删除失败');
+    }
+  } catch (error) {
+    if (error !== 'cancel') {
+      console.error('删除报工记录失败:', error);
+      ElMessage.error('删除失败');
+    }
+  }
+};
+
 // 复选框选择
 const fjSelectionChange = (selection) => {
   console.log('选中的附件:', selection);
@@ -1721,6 +1753,10 @@ const warningres = (arr) => {
 :deep(.el-table__body tr.current-row) > td {
   background: #ff80ff !important;
 }
+/* 鼠标悬停时的背景色 */
+:deep(.el-table__body tr:hover) > td {
+  background: #ff80ff !important;
+}
 
 /* 员工选择区域样式 */
 .employee-grid {

+ 294 - 131
src/view/yunyin/shengchanguanli/gongdanziliao.vue

@@ -181,15 +181,15 @@
 							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="left" label="部件编号" prop="部件编号" width="80"/> -->
 					<el-table-column align="left" label="部件名称" prop="部件名称" width="150"/>
 					<el-table-column align="left" label="工序编号" prop="工艺编号" width="80"/>
 					<el-table-column align="left" label="工序名称" prop="工艺名称" width="200"/>
 					<el-table-column align="left" label="生产工序" prop="大工艺" width="80"/>
-					<el-table-column align="left" label="秒" prop="标准工时" width="80"/>
+					<!-- <el-table-column align="left" label="秒" prop="标准工时" width="80"/> -->
 					<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="60"/>
+					<el-table-column align="left" 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"/>
@@ -499,13 +499,13 @@
 		                   </template>
 		                   <div class="gy-detail-filter-panel">
 		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailBuJianMingChengFilter">
+		                     <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="clearGyDetailFilter(gyDetailBuJianMingChengFilter)">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)">全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailBuJianMingChengFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailBuJianMingChengFilter">全选</span>
 		                     </div>
 		                   </div>
 		                 </el-popover>
@@ -515,19 +515,7 @@
                <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="setGyDetailBuJianMingChengSelectRef"
-                   v-model="row.部件名称"
-                   size="small"
-                   class="gy-detail-cell-input gy-detail-cell-select"
-                   filterable
-                   allow-create
-                   @change="handleGyDetailBuJianMingChengChange(row)"
-                   @blur="finishGyDetailBuJianMingChengEdit(row)"
-                 >
-                   <el-option v-for="opt in gyDetailBuJianMingChengOptions" :key="opt" :label="opt" :value="opt" />
-                 </el-select>
+                 <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>
@@ -537,7 +525,7 @@
                <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)" />
+                 <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>
@@ -553,13 +541,13 @@
 		                   </template>
 		                   <div class="gy-detail-filter-panel">
 		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailDaGongXuFilter">
+		                     <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="clearGyDetailFilter(gyDetailDaGongXuFilter)">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)">全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailDaGongXuFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailDaGongXuFilter">全选</span>
 		                     </div>
 		                   </div>
 		                 </el-popover>
@@ -588,7 +576,7 @@
 		               <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)" />
+		                 <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>
@@ -597,7 +585,7 @@
 		               <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)" />
+		                 <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>
@@ -606,7 +594,7 @@
                <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)" />
+                 <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>
@@ -615,7 +603,7 @@
 		               <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)" />
+		                 <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.金额" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '金额')" />
 		               </template>
 		             </template>
 		           </vxe-column>
@@ -631,13 +619,13 @@
 		                   </template>
 		                   <div class="gy-detail-filter-panel">
 		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailNanDuXiShuFilter">
+		                     <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="clearGyDetailFilter(gyDetailNanDuXiShuFilter)">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)">全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailNanDuXiShuFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailNanDuXiShuFilter">全选</span>
 		                     </div>
 		                   </div>
 		                 </el-popover>
@@ -681,13 +669,13 @@
 		                   </template>
 		                   <div class="gy-detail-filter-panel">
 		                     <div class="gy-detail-filter-options">
-		                     <el-checkbox-group v-model="gyDetailZhuangTaiFilter">
+		                     <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="clearGyDetailFilter(gyDetailZhuangTaiFilter)">取消全选</span>
-		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)">全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="clearGyDetailZhuangTaiFilter">取消全选</span>
+		                       <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailZhuangTaiFilter">全选</span>
 		                     </div>
 		                   </div>
 		                 </el-popover>
@@ -5021,7 +5009,6 @@ const sortTableData = ref([])
   
   // =========== 工艺资料详情弹窗 ===========
   const gyDetailDialogVisible = ref(false)
-  const gyDetailBuJianMingChengSelectRef = ref(null)
   const gyDetailFormData = reactive({
     订单编号: '',
     客户编号: '',
@@ -5043,18 +5030,29 @@ const sortTableData = ref([])
   
   // 工艺详情列筛选
   const dagongxuFilters = computed(() => {
-    const processes = new Set(gyDetailFormData.工艺列表.map((item) => item.大工序).filter(Boolean))
+    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.工艺列表.map((item) => item.部件名称).filter(Boolean))
+    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)
     }
@@ -5135,7 +5133,7 @@ const sortTableData = ref([])
   const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
   
   const isGyDetailCellEditable = (column) => {
-    const editableColumns = ['部件名称', '工序名称', '大工序', '工分']
+    const editableColumns = ['部件名称', '工序名称', '大工序', '工分', '定额分']
     if (editableColumns.includes(column)) {
       return true
     }
@@ -5143,9 +5141,10 @@ const sortTableData = ref([])
   }
   const gyDetailEditingCell = ref(null)
   const gyDetailCellInputRef = ref(null)
+  const gyDetailLastEditingField = ref(null)
+  const isGyDetailNavigating = ref(false)
 
   const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
-  const gyDetailBuJianMingChengOptions = ['裁剪', '手工', '大烫', '总检', '包装']
   const gyDetailDifficultyOptions = ['A', 'B', 'C']
 
   const sanitizeGyDetailDecimalInput = (val) => {
@@ -5188,57 +5187,158 @@ const sortTableData = ref([])
     gyDetailCellInputRef.value = el
   }
 
-  const setGyDetailBuJianMingChengSelectRef = (el) => {
-    setGyDetailCellInputRef(el)
-    if (el) {
-      gyDetailBuJianMingChengSelectRef.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
-    gyDetailBuJianMingChengSelectRef.value = null
   }
 
-  const finishGyDetailBuJianMingChengEdit = (row) => {
-    if (!gyDetailEditingCell.value) return
-    
-    const selectRef = gyDetailBuJianMingChengSelectRef.value
-    if (selectRef) {
-      const inputValue = selectRef.$el?.querySelector?.('input')?.value?.trim()
-      if (inputValue && !row.部件名称 && gyDetailEditingCell.value?.field === '部件名称') {
-        row.部件名称 = inputValue
-        handleGyDetailBuJianMingChengChange(row)
-      }
-    }
-    
-    clearGyDetailCellEdit()
-  }
+
 
   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 (row._gyDetailNew && editingField !== '工序名称') {
+    // 如果字段值没有变化,直接返回,不做任何操作
+    if (!isFieldChanged && !row._gyDetailNew) {
       return
     }
     
-    if (editingField === '定额分') {
-      const totalScore = parseFloat(sumGyDetailDisplayField('定额分')) || 0
-      const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0
+    if (row._gyDetailNew && editingField !== '工序名称' && editingField !== '部件名称') {
+      return
+    }
+    
+    if (editingField === '部件名称') {
+      const buJianMingCheng = String(row.部件名称 || '').trim()
+      if (!buJianMingCheng) {
+        row.部件编号 = ''
+      } else {
+        // 查找是否有相同的部件名称
+        const existingRow = gyDetailFormData.工艺列表.find(
+          (r) => r !== row && String(r.部件名称 || '').trim() === buJianMingCheng && r.部件编号
+        )
+        if (existingRow) {
+          // 有相同的,使用相同的部件编号
+          row.部件编号 = existingRow.部件编号
+        } else {
+          // 没有相同的,找最大的部件编号+1
+          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')
+        }
+      }
       
-      if (totalScore > planManufactureScore) {
-        ElMessage.warning('总工分不能大于计划制造工分')
-        row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分
-        refreshGyDetailTableFooter()
-        return
+      // 自动填写生产工序
+      const autoFillOptions = ['裁剪', '手工', '大烫', '总检', '包装']
+      if (autoFillOptions.includes(buJianMingCheng)) {
+        row.大工序 = buJianMingCheng
+      } else {
+        row.大工序 = '车缝'
+      }
+      // 编辑部件名称时,不调用handleUpdateProcess,不新增
+      return
+    }
+    
+    if (editingField === '定额分') {
+      // 只有非拆分状态的工序才检查总工分限制
+      if (!isGyDetailRowSplit(row)) {
+        const totalScore = parseFloat(sumGyDetailDisplayField('定额分')) || 0
+        const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0
+        
+        if (totalScore > planManufactureScore) {
+          ElMessage.warning('总工分不能大于计划制造工分')
+          row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分
+          refreshGyDetailTableFooter()
+          return
+        }
       }
     }
     
@@ -5248,14 +5348,31 @@ const sortTableData = ref([])
   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')
-    inputEl?.focus?.()
-    inputEl?.select?.()
+    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()
@@ -5309,6 +5426,12 @@ const sortTableData = 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 || [])
@@ -5338,14 +5461,70 @@ const sortTableData = ref([])
   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) => {
+  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) => set.has(matchRow(row)))
+    return list.filter((row) => row._gyDetailNew || set.has(matchRow(row)))
   }
 
   const gyDetailDisplayProcessList = computed(() => {
@@ -5355,46 +5534,57 @@ const sortTableData = ref([])
       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 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)
@@ -5526,7 +5716,7 @@ const sortTableData = ref([])
       gyDetailFormData.工艺列表 = []
     }
     await clearGyDetailTableSelection()
-    syncGyDetailFiltersAfterDataChange()
+    // syncGyDetailFiltersAfterDataChange() // 禁用自动同步筛选,只在用户手动点击时才触发
     await nextTick()
     updateGyDetailTableHeight()
   }
@@ -5588,42 +5778,7 @@ const sortTableData = ref([])
     }
   }
 
-  const handleGyDetailBuJianMingChengChange = (row) => {
-    const buJianMingCheng = String(row.部件名称 || '').trim()
-    if (!buJianMingCheng) {
-      row.部件编号 = ''
-      row.大工序 = ''
-      return
-    }
-    
-    const isPresetOption = gyDetailBuJianMingChengOptions.includes(buJianMingCheng)
-    
-    if (isPresetOption) {
-      const existingRow = gyDetailFormData.工艺列表.find(
-        (r) => r !== row && String(r.部件名称 || '').trim() === buJianMingCheng && r.部件编号
-      )
-      if (existingRow) {
-        row.部件编号 = existingRow.部件编号
-      } else {
-        row.部件编号 = ''
-      }
-      row.大工序 = buJianMingCheng
-    } else {
-      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')
-      row.大工序 = '车缝'
-      
-      if (!gyDetailBuJianMingChengFilter.value.includes(buJianMingCheng)) {
-        gyDetailBuJianMingChengFilter.value.push(buJianMingCheng)
-      }
-    }
-  }
+
 
   const handleGyDetailBatchDelete = async () => {
     if (gyDetailDeleting.value) return
@@ -5947,6 +6102,11 @@ const sortTableData = ref([])
 
   const startGyDetailPlanManufactureEdit = () => {
     if (gyDetailPlanManufactureEditing.value) return
+    // 邢科芳账号不能修改计划制造工分
+    if (gyDetailReadonly.value) {
+    //   ElMessage.warning('您没有权限修改计划制造工分')
+      return
+    }
     gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
     gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
     gyDetailPlanManufactureEditing.value = true
@@ -6214,13 +6374,16 @@ const sortTableData = ref([])
 
     try {
       if (row._gyDetailNew || !row.id) {
-        const buJianMingCheng = String(row.部件名称 || '').trim()
-        const gongXuMingCheng = String(row.工序名称 || '').trim()
-        const daGongXu = String(row.大工序 || '').trim()
-        
-        if (!buJianMingCheng || !gongXuMingCheng || !daGongXu) {
-          ElMessage.warning('部件名称、工序名称、生产工序三个字段都必须填写')
-          return
+        // 只有在编辑工序名称时,才检查三个字段是否都填写
+        if (gyDetailLastEditingField.value === '工序名称') {
+          const buJianMingCheng = String(row.部件名称 || '').trim()
+          const gongXuMingCheng = String(row.工序名称 || '').trim()
+          const daGongXu = String(row.大工序 || '').trim()
+          
+          if (!buJianMingCheng || !gongXuMingCheng || !daGongXu) {
+            ElMessage.warning('部件名称、工序名称、生产工序三个字段都必须填写')
+            return
+          }
         }
         
         row._gyDetailSaving = true
@@ -7142,7 +7305,7 @@ const sortTableData = ref([])
 	const gySummaries = ({ columns, data }) => {  
 	  const sums = [];  
 	  columns.forEach((column, index) => {  
-		  if (index === 6) {  
+		  if (index === 1) {  
 			  sums[index] = '合计';  
 			  return;  
 		  }