zck 1 tuần trước cách đây
mục cha
commit
99c88de433

+ 95 - 11
src/view/yunyin/shengchanguanli/gongdanziliao.vue

@@ -517,14 +517,14 @@
                  <div v-if="!isGyDetailCellEditing(row, '部件名称')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '部件名称')">{{ formatGyDetailCellText(row.部件名称) }}</div>
                  <div v-if="!isGyDetailCellEditing(row, '部件名称')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '部件名称')">{{ formatGyDetailCellText(row.部件名称) }}</div>
                  <el-select
                  <el-select
                    v-else
                    v-else
-                   :ref="setGyDetailCellInputRef"
+                   :ref="setGyDetailBuJianMingChengSelectRef"
                    v-model="row.部件名称"
                    v-model="row.部件名称"
                    size="small"
                    size="small"
                    class="gy-detail-cell-input gy-detail-cell-select"
                    class="gy-detail-cell-input gy-detail-cell-select"
                    filterable
                    filterable
                    allow-create
                    allow-create
                    @change="handleGyDetailBuJianMingChengChange(row)"
                    @change="handleGyDetailBuJianMingChengChange(row)"
-                   @blur="finishGyDetailCellEdit(row)"
+                   @blur="finishGyDetailBuJianMingChengEdit(row)"
                  >
                  >
                    <el-option v-for="opt in gyDetailBuJianMingChengOptions" :key="opt" :label="opt" :value="opt" />
                    <el-option v-for="opt in gyDetailBuJianMingChengOptions" :key="opt" :label="opt" :value="opt" />
                  </el-select>
                  </el-select>
@@ -5021,6 +5021,7 @@ const sortTableData = ref([])
   
   
   // =========== 工艺资料详情弹窗 ===========
   // =========== 工艺资料详情弹窗 ===========
   const gyDetailDialogVisible = ref(false)
   const gyDetailDialogVisible = ref(false)
+  const gyDetailBuJianMingChengSelectRef = ref(null)
   const gyDetailFormData = reactive({
   const gyDetailFormData = reactive({
     订单编号: '',
     订单编号: '',
     客户编号: '',
     客户编号: '',
@@ -5159,6 +5160,7 @@ const sortTableData = ref([])
 
 
   const onGyDetailDecimalInput = (row, field, val) => {
   const onGyDetailDecimalInput = (row, field, val) => {
     row[field] = sanitizeGyDetailDecimalInput(val)
     row[field] = sanitizeGyDetailDecimalInput(val)
+    refreshGyDetailTableFooter()
   }
   }
 
 
   const formatGyDetailCellText = (val) => {
   const formatGyDetailCellText = (val) => {
@@ -5186,6 +5188,13 @@ const sortTableData = ref([])
     gyDetailCellInputRef.value = el
     gyDetailCellInputRef.value = el
   }
   }
 
 
+  const setGyDetailBuJianMingChengSelectRef = (el) => {
+    setGyDetailCellInputRef(el)
+    if (el) {
+      gyDetailBuJianMingChengSelectRef.value = el
+    }
+  }
+
   const startGyDetailCellEdit = (row, field) => {
   const startGyDetailCellEdit = (row, field) => {
     if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
     if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
     gyDetailEditingCell.value = { rowKey: row._rowKey, field }
     gyDetailEditingCell.value = { rowKey: row._rowKey, field }
@@ -5194,11 +5203,45 @@ const sortTableData = ref([])
   const clearGyDetailCellEdit = () => {
   const clearGyDetailCellEdit = () => {
     gyDetailEditingCell.value = null
     gyDetailEditingCell.value = null
     gyDetailCellInputRef.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) => {
   const finishGyDetailCellEdit = async (row) => {
     if (!gyDetailEditingCell.value) return
     if (!gyDetailEditingCell.value) return
+    const editingField = gyDetailEditingCell.value.field
     clearGyDetailCellEdit()
     clearGyDetailCellEdit()
+    
+    if (row._gyDetailNew && editingField !== '工序名称') {
+      return
+    }
+    
+    if (editingField === '定额分') {
+      const totalScore = parseFloat(sumGyDetailDisplayField('定额分')) || 0
+      const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0
+      
+      if (totalScore > planManufactureScore) {
+        ElMessage.warning('总工分不能大于计划制造工分')
+        row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分
+        refreshGyDetailTableFooter()
+        return
+      }
+    }
+    
     await handleUpdateProcess(row)
     await handleUpdateProcess(row)
   }
   }
 
 
@@ -5299,7 +5342,7 @@ const sortTableData = ref([])
   const applyGyDetailColumnFilter = (list, filterRef, options, matchRow) => {
   const applyGyDetailColumnFilter = (list, filterRef, options, matchRow) => {
     const optionList = Array.isArray(options) ? options : (options?.value || [])
     const optionList = Array.isArray(options) ? options : (options?.value || [])
     const selected = filterRef.value
     const selected = filterRef.value
-    if (!selected.length) return []
+    if (!selected.length) return list
     if (!optionList.length || selected.length >= optionList.length) return list
     if (!optionList.length || selected.length >= optionList.length) return list
     const set = new Set(selected.map((v) => normalizeGyDetailField(v)))
     const set = new Set(selected.map((v) => normalizeGyDetailField(v)))
     return list.filter((row) => set.has(matchRow(row)))
     return list.filter((row) => set.has(matchRow(row)))
@@ -5515,7 +5558,7 @@ const sortTableData = ref([])
       ElMessage.warning('无订单编号,无法新增工艺')
       ElMessage.warning('无订单编号,无法新增工艺')
       return
       return
     }
     }
-    const batchCount = 5
+    const batchCount = 10
     for (let i = 0; i < batchCount; i++) {
     for (let i = 0; i < batchCount; i++) {
       const nextCode = getNextGyDetailProcessCode()
       const nextCode = getNextGyDetailProcessCode()
       const newRow = {
       const newRow = {
@@ -5549,7 +5592,7 @@ const sortTableData = ref([])
     const buJianMingCheng = String(row.部件名称 || '').trim()
     const buJianMingCheng = String(row.部件名称 || '').trim()
     if (!buJianMingCheng) {
     if (!buJianMingCheng) {
       row.部件编号 = ''
       row.部件编号 = ''
-      finishGyDetailCellEdit(row)
+      row.大工序 = ''
       return
       return
     }
     }
     
     
@@ -5564,6 +5607,7 @@ const sortTableData = ref([])
       } else {
       } else {
         row.部件编号 = ''
         row.部件编号 = ''
       }
       }
+      row.大工序 = buJianMingCheng
     } else {
     } else {
       let maxCode = 0
       let maxCode = 0
       gyDetailFormData.工艺列表.forEach((r) => {
       gyDetailFormData.工艺列表.forEach((r) => {
@@ -5573,9 +5617,12 @@ const sortTableData = ref([])
         }
         }
       })
       })
       row.部件编号 = String(maxCode + 1).padStart(2, '0')
       row.部件编号 = String(maxCode + 1).padStart(2, '0')
+      row.大工序 = '车缝'
+      
+      if (!gyDetailBuJianMingChengFilter.value.includes(buJianMingCheng)) {
+        gyDetailBuJianMingChengFilter.value.push(buJianMingCheng)
+      }
     }
     }
-    
-    finishGyDetailCellEdit(row)
   }
   }
 
 
   const handleGyDetailBatchDelete = async () => {
   const handleGyDetailBatchDelete = async () => {
@@ -6160,12 +6207,28 @@ const sortTableData = ref([])
     const orderNo = String(gyDetailFormData.订单编号 || '').trim()
     const orderNo = String(gyDetailFormData.订单编号 || '').trim()
     if (!orderNo) return
     if (!orderNo) return
     if (!isGyDetailRowChanged(row)) return
     if (!isGyDetailRowChanged(row)) return
+    
+    if (row._gyDetailSaving) {
+      return
+    }
 
 
     try {
     try {
       if (row._gyDetailNew || !row.id) {
       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
+        }
+        
+        row._gyDetailSaving = true
+        
         const addRes = await AddProcess({
         const addRes = await AddProcess({
           workorder: orderNo,
           workorder: orderNo,
           part_code: row.部件编号 || '',
           part_code: row.部件编号 || '',
+		  part_name: row.部件名称 || '',
           process_name: row.工序名称 || '',
           process_name: row.工序名称 || '',
           process_code: String(row.工序编号 ?? ''),
           process_code: String(row.工序编号 ?? ''),
           big_process: row.大工序 || '',
           big_process: row.大工序 || '',
@@ -6180,10 +6243,14 @@ const sortTableData = ref([])
           if (addRes.data) {
           if (addRes.data) {
             row.id = addRes.data.id || addRes.data
             row.id = addRes.data.id || addRes.data
           }
           }
+          row._gyDetailOrigin = snapshotGyDetailRow(row)
           ElMessage.success('保存成功')
           ElMessage.success('保存成功')
         }
         }
         return
         return
       }
       }
+      
+      row._gyDetailSaving = true
+      
       const result = await UpdateProcess({
       const result = await UpdateProcess({
         id: row.id,
         id: row.id,
         process_name: row.工序名称 || '',
         process_name: row.工序名称 || '',
@@ -6205,6 +6272,8 @@ const sortTableData = ref([])
       }
       }
     } catch {
     } catch {
       /* 忽略 */
       /* 忽略 */
+    } finally {
+      row._gyDetailSaving = false
     }
     }
   }
   }
   
   
@@ -8044,6 +8113,20 @@ const sortTableData = ref([])
     --vxe-table-row-current-background-color: #ff80ff;
     --vxe-table-row-current-background-color: #ff80ff;
     --vxe-table-row-hover-current-background-color: #ff80ff;
     --vxe-table-row-hover-current-background-color: #ff80ff;
     --vxe-ui-table-row-current-background-color: #ff80ff;
     --vxe-ui-table-row-current-background-color: #ff80ff;
+    --vxe-table-row-height: 28px;
+    font-size: 14px;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--row),
+  :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--row) {
+    height: 28px;
+    line-height: 28px;
+  }
+
+  :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--cell),
+  :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--cell) {
+    font-size: 14px;
+    padding: 0 8px;
   }
   }
 
 
   .gy-detail-table-wrap ::-webkit-scrollbar,
   .gy-detail-table-wrap ::-webkit-scrollbar,
@@ -8051,8 +8134,8 @@ const sortTableData = ref([])
   .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar,
   .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar,
   .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar {
   .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar {
     display: block !important;
     display: block !important;
-    width: 8px;
-    height: 8px;
+    width: 14px;
+    height: 14px;
   }
   }
 
 
   .gy-detail-table-wrap ::-webkit-scrollbar-track,
   .gy-detail-table-wrap ::-webkit-scrollbar-track,
@@ -8060,7 +8143,7 @@ const sortTableData = ref([])
   .gy-detail-vxe-table .vxe-table--body-wrapper::-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 {
   .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-track {
     background: #f1f1f1;
     background: #f1f1f1;
-    border-radius: 4px;
+    border-radius: 7px;
   }
   }
 
 
   .gy-detail-table-wrap ::-webkit-scrollbar-thumb,
   .gy-detail-table-wrap ::-webkit-scrollbar-thumb,
@@ -8068,7 +8151,8 @@ const sortTableData = ref([])
   .gy-detail-vxe-table .vxe-table--body-wrapper::-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 {
   .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb {
     background: #ccc;
     background: #ccc;
-    border-radius: 4px;
+    border-radius: 7px;
+    border: 3px solid #f1f1f1;
   }
   }
 
 
   .gy-detail-table-wrap ::-webkit-scrollbar-thumb:hover,
   .gy-detail-table-wrap ::-webkit-scrollbar-thumb:hover,