|
|
@@ -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;
|