zck 1 неделя назад
Родитель
Сommit
89be3af7bf
1 измененных файлов с 180 добавлено и 59 удалено
  1. 180 59
      src/view/yunyin/shengchanguanli/gongdanziliao.vue

+ 180 - 59
src/view/yunyin/shengchanguanli/gongdanziliao.vue

@@ -509,18 +509,37 @@
 		                     </div>
 		                   </div>
 		                 </el-popover>
-		               </div>
-		             </template>
-		           </vxe-column>
-		           <vxe-column field="工序编号" title="工序编号" width="100"/>
+               </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
+                   allow-create
+                   @change="handleGyDetailBuJianMingChengChange(row)"
+                   @blur="finishGyDetailCellEdit(row)"
+                 >
+                   <el-option v-for="opt in gyDetailBuJianMingChengOptions" :key="opt" :label="opt" :value="opt" />
+                 </el-select>
+               </template>
+             </template>
+           </vxe-column>
+           <vxe-column field="工序编号" title="工序编号" width="100"/>
 		           <vxe-column field="工序名称" title="工序名称" width="320">
 		             <template #default="{ row }">
-		               <span v-if="gyDetailReadonly">{{ 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)" />
-		               </template>
-		             </template>
+               <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)" />
+               </template>
+             </template>
 		           </vxe-column>
 		           <vxe-column field="大工序" width="110">
 		             <template #header>
@@ -547,15 +566,15 @@
 		               </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"
+               <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)"
 		                 >
@@ -584,9 +603,12 @@
 		           </vxe-column>
 		           <vxe-column field="定额分" title="工分" width="80">
 		             <template #default="{ row }">
-		               <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)" />
-		             </template>
+               <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)" />
+               </template>
+             </template>
 		           </vxe-column>
 		           <vxe-column field="金额" title="金额" width="80">
 		             <template #default="{ row }">
@@ -5110,10 +5132,19 @@ const sortTableData = ref([])
   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 gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
+  const gyDetailBuJianMingChengOptions = ['裁剪', '手工', '大烫', '总检', '包装']
   const gyDetailDifficultyOptions = ['A', 'B', 'C']
 
   const sanitizeGyDetailDecimalInput = (val) => {
@@ -5146,7 +5177,7 @@ const sortTableData = ref([])
   const isGyDetailRowSplit = (row) => Number(row?.状态) === 1
 
   const isGyDetailCellEditing = (row, field) => {
-    if (gyDetailReadonly.value) return false
+    if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return false
     const editing = gyDetailEditingCell.value
     return editing?.rowKey === row._rowKey && editing?.field === field
   }
@@ -5156,7 +5187,7 @@ const sortTableData = ref([])
   }
 
   const startGyDetailCellEdit = (row, field) => {
-    if (gyDetailReadonly.value) return
+    if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
     gyDetailEditingCell.value = { rowKey: row._rowKey, field }
   }
 
@@ -5484,31 +5515,67 @@ const sortTableData = ref([])
       ElMessage.warning('无订单编号,无法新增工艺')
       return
     }
-    const nextCode = getNextGyDetailProcessCode()
-    const lastRow = gyDetailFormData.工艺列表[gyDetailFormData.工艺列表.length - 1]
-    gyDetailFormData.工艺列表.push({
-      id: '',
-      部件编号: lastRow?.部件编号 || '',
-      部件名称: lastRow?.部件名称 || '',
-      工序编号: String(nextCode),
-      工序名称: '',
-      大工序: lastRow?.大工序 || '',
-      秒: '',
-      分: '',
-      定额分: '',
-      金额: '',
-      难度系数: lastRow?.难度系数 || 'C',
-      备注: '',
-      状态: 0,
-      _gyDetailNew: true,
-      _rowKey: `new_${Date.now()}_${nextCode}`,
-    })
-    const newRow = gyDetailFormData.工艺列表[gyDetailFormData.工艺列表.length - 1]
-    newRow._gyDetailOrigin = snapshotGyDetailRow(newRow)
-    await scrollGyDetailTableToBottom(newRow)
+    const batchCount = 5
+    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 lastNewRow = gyDetailFormData.工艺列表[gyDetailFormData.工艺列表.length - 1]
+    await scrollGyDetailTableToBottom(lastNewRow)
     if (!gyDetailReadonly.value) {
-      startGyDetailCellEdit(newRow, '工序名称')
+      startGyDetailCellEdit(lastNewRow, '工序名称')
+    }
+  }
+
+  const handleGyDetailBuJianMingChengChange = (row) => {
+    const buJianMingCheng = String(row.部件名称 || '').trim()
+    if (!buJianMingCheng) {
+      row.部件编号 = ''
+      finishGyDetailCellEdit(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.部件编号 = ''
+      }
+    } 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')
     }
+    
+    finishGyDetailCellEdit(row)
   }
 
   const handleGyDetailBatchDelete = async () => {
@@ -5856,14 +5923,36 @@ const sortTableData = ref([])
         finishDate = `${year}-${month}-${day}`
       }
       
-      const res = await updateOrderRemarkAndFinishDate({
-        id: gyDetailFormData.Uniqid,
-        remark: gyDetailFormData.备注,
-        工单完工日期: finishDate,
-        sys_id: userStore.userInfo.nickName
-      })
+      const updatePromises = []
       
-      if (res?.code === 0) {
+      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.备注 ?? ''
@@ -6088,7 +6177,9 @@ const sortTableData = ref([])
         })
         if (addRes?.code === 0) {
           row._gyDetailNew = false
-          await refreshGyDetailProcessList()
+          if (addRes.data) {
+            row.id = addRes.data.id || addRes.data
+          }
           ElMessage.success('保存成功')
         }
         return
@@ -7924,7 +8015,7 @@ const sortTableData = ref([])
     max-width: 100%;
     height: calc(100vh - 80px);
     padding: 20px;
-    overflow: hidden;
+    overflow: auto;
     box-sizing: border-box;
     display: flex;
     flex-direction: column;
@@ -7941,11 +8032,9 @@ const sortTableData = ref([])
     max-width: 100%;
     min-width: 0;
     height: calc(100vh - 250px);
-    overflow: hidden;
+    overflow: auto;
     border: 1px solid #ebeef5;
     border-radius: 4px;
-    display: flex;
-    flex-direction: column;
   }
 
   .gy-detail-vxe-table {
@@ -7957,6 +8046,38 @@ const sortTableData = ref([])
     --vxe-ui-table-row-current-background-color: #ff80ff;
   }
 
+  .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: 8px;
+    height: 8px;
+  }
+
+  .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: 4px;
+  }
+
+  .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: 4px;
+  }
+
+  .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;