|
@@ -181,15 +181,15 @@
|
|
|
style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="gytableData" row-key="id"
|
|
style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="gytableData" row-key="id"
|
|
|
:summary-method="gySummaries"
|
|
:summary-method="gySummaries"
|
|
|
show-summary>
|
|
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="150"/>
|
|
|
<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="200"/>
|
|
<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="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="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="100"/>
|
|
|
<el-table-column align="left" label="录入时间" prop="系统时间" width="160"/>
|
|
<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="100"/>
|
|
@@ -499,13 +499,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
<div class="gy-detail-filter-panel">
|
|
<div class="gy-detail-filter-panel">
|
|
|
<div class="gy-detail-filter-options">
|
|
<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 v-for="item in gyDetailBuJianMingChengFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="gy-detail-filter-actions">
|
|
<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>
|
|
|
</div>
|
|
</div>
|
|
|
</el-popover>
|
|
</el-popover>
|
|
@@ -515,19 +515,7 @@
|
|
|
<span v-if="!isGyDetailCellEditable('部件名称') && !isGyDetailCellEditing(row, '部件名称')">{{ row.部件名称 }}</span>
|
|
<span v-if="!isGyDetailCellEditable('部件名称') && !isGyDetailCellEditing(row, '部件名称')">{{ row.部件名称 }}</span>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<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
|
|
|
|
|
- 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>
|
|
|
</template>
|
|
</template>
|
|
|
</vxe-column>
|
|
</vxe-column>
|
|
@@ -537,7 +525,7 @@
|
|
|
<span v-if="!isGyDetailCellEditable('工序名称') && !isGyDetailCellEditing(row, '工序名称')">{{ row.工序名称 }}</span>
|
|
<span v-if="!isGyDetailCellEditable('工序名称') && !isGyDetailCellEditing(row, '工序名称')">{{ row.工序名称 }}</span>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<div v-if="!isGyDetailCellEditing(row, '工序名称')" class="gy-detail-cell gy-detail-cell--wide" @click.stop="startGyDetailCellEdit(row, '工序名称')">{{ formatGyDetailCellText(row.工序名称) }}</div>
|
|
<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>
|
|
|
</template>
|
|
</template>
|
|
|
</vxe-column>
|
|
</vxe-column>
|
|
@@ -553,13 +541,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
<div class="gy-detail-filter-panel">
|
|
<div class="gy-detail-filter-panel">
|
|
|
<div class="gy-detail-filter-options">
|
|
<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 v-for="item in dagongxuFilters" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="gy-detail-filter-actions">
|
|
<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>
|
|
|
</div>
|
|
</div>
|
|
|
</el-popover>
|
|
</el-popover>
|
|
@@ -588,7 +576,7 @@
|
|
|
<span v-if="gyDetailReadonly">{{ row.秒 }}</span>
|
|
<span v-if="gyDetailReadonly">{{ row.秒 }}</span>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<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-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>
|
|
|
</template>
|
|
</template>
|
|
|
</vxe-column>
|
|
</vxe-column>
|
|
@@ -597,7 +585,7 @@
|
|
|
<span v-if="gyDetailReadonly">{{ row.分 }}</span>
|
|
<span v-if="gyDetailReadonly">{{ row.分 }}</span>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<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-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>
|
|
|
</template>
|
|
</template>
|
|
|
</vxe-column>
|
|
</vxe-column>
|
|
@@ -606,7 +594,7 @@
|
|
|
<span v-if="!isGyDetailCellEditable('工分') && !isGyDetailCellEditing(row, '定额分')">{{ row.定额分 }}</span>
|
|
<span v-if="!isGyDetailCellEditable('工分') && !isGyDetailCellEditing(row, '定额分')">{{ row.定额分 }}</span>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<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-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>
|
|
|
</template>
|
|
</template>
|
|
|
</vxe-column>
|
|
</vxe-column>
|
|
@@ -615,7 +603,7 @@
|
|
|
<span v-if="gyDetailReadonly">{{ row.金额 }}</span>
|
|
<span v-if="gyDetailReadonly">{{ row.金额 }}</span>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<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-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>
|
|
|
</template>
|
|
</template>
|
|
|
</vxe-column>
|
|
</vxe-column>
|
|
@@ -631,13 +619,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
<div class="gy-detail-filter-panel">
|
|
<div class="gy-detail-filter-panel">
|
|
|
<div class="gy-detail-filter-options">
|
|
<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 v-for="item in gyDetailDifficultyFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="gy-detail-filter-actions">
|
|
<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>
|
|
|
</div>
|
|
</div>
|
|
|
</el-popover>
|
|
</el-popover>
|
|
@@ -681,13 +669,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
<div class="gy-detail-filter-panel">
|
|
<div class="gy-detail-filter-panel">
|
|
|
<div class="gy-detail-filter-options">
|
|
<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 v-for="item in gyDetailStatusFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="gy-detail-filter-actions">
|
|
<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>
|
|
|
</div>
|
|
</div>
|
|
|
</el-popover>
|
|
</el-popover>
|
|
@@ -5021,7 +5009,6 @@ const sortTableData = ref([])
|
|
|
|
|
|
|
|
// =========== 工艺资料详情弹窗 ===========
|
|
// =========== 工艺资料详情弹窗 ===========
|
|
|
const gyDetailDialogVisible = ref(false)
|
|
const gyDetailDialogVisible = ref(false)
|
|
|
- const gyDetailBuJianMingChengSelectRef = ref(null)
|
|
|
|
|
const gyDetailFormData = reactive({
|
|
const gyDetailFormData = reactive({
|
|
|
订单编号: '',
|
|
订单编号: '',
|
|
|
客户编号: '',
|
|
客户编号: '',
|
|
@@ -5043,18 +5030,29 @@ const sortTableData = ref([])
|
|
|
|
|
|
|
|
// 工艺详情列筛选
|
|
// 工艺详情列筛选
|
|
|
const dagongxuFilters = computed(() => {
|
|
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 }))
|
|
return Array.from(processes).map((process) => ({ text: process, value: process }))
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const gyDetailBuJianMingChengFilterOptions = computed(() => {
|
|
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 }))
|
|
return Array.from(names).map((name) => ({ text: name, value: name }))
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const gyDetailDifficultyFilterOptions = computed(() => {
|
|
const gyDetailDifficultyFilterOptions = computed(() => {
|
|
|
const values = new Set(gyDetailDifficultyOptions)
|
|
const values = new Set(gyDetailDifficultyOptions)
|
|
|
for (const item of gyDetailFormData.工艺列表 || []) {
|
|
for (const item of gyDetailFormData.工艺列表 || []) {
|
|
|
|
|
+ if (item._gyDetailNew) continue
|
|
|
const v = normalizeGyDetailField(item?.难度系数)
|
|
const v = normalizeGyDetailField(item?.难度系数)
|
|
|
if (v) values.add(v)
|
|
if (v) values.add(v)
|
|
|
}
|
|
}
|
|
@@ -5135,7 +5133,7 @@ const sortTableData = ref([])
|
|
|
const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
|
|
const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
|
|
|
|
|
|
|
|
const isGyDetailCellEditable = (column) => {
|
|
const isGyDetailCellEditable = (column) => {
|
|
|
- const editableColumns = ['部件名称', '工序名称', '大工序', '工分']
|
|
|
|
|
|
|
+ const editableColumns = ['部件名称', '工序名称', '大工序', '工分', '定额分']
|
|
|
if (editableColumns.includes(column)) {
|
|
if (editableColumns.includes(column)) {
|
|
|
return true
|
|
return true
|
|
|
}
|
|
}
|
|
@@ -5143,9 +5141,10 @@ const sortTableData = ref([])
|
|
|
}
|
|
}
|
|
|
const gyDetailEditingCell = ref(null)
|
|
const gyDetailEditingCell = ref(null)
|
|
|
const gyDetailCellInputRef = ref(null)
|
|
const gyDetailCellInputRef = ref(null)
|
|
|
|
|
+ const gyDetailLastEditingField = ref(null)
|
|
|
|
|
+ const isGyDetailNavigating = ref(false)
|
|
|
|
|
|
|
|
const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
|
|
const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
|
|
|
- const gyDetailBuJianMingChengOptions = ['裁剪', '手工', '大烫', '总检', '包装']
|
|
|
|
|
const gyDetailDifficultyOptions = ['A', 'B', 'C']
|
|
const gyDetailDifficultyOptions = ['A', 'B', 'C']
|
|
|
|
|
|
|
|
const sanitizeGyDetailDecimalInput = (val) => {
|
|
const sanitizeGyDetailDecimalInput = (val) => {
|
|
@@ -5188,57 +5187,158 @@ 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
|
|
|
|
|
+ // 先清除之前的输入框引用,确保新输入框能正确获取焦点
|
|
|
|
|
+ gyDetailCellInputRef.value = null
|
|
|
gyDetailEditingCell.value = { rowKey: row._rowKey, field }
|
|
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 = () => {
|
|
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
|
|
const editingField = gyDetailEditingCell.value.field
|
|
|
|
|
+ gyDetailLastEditingField.value = editingField
|
|
|
|
|
+
|
|
|
|
|
+ // 检查当前编辑字段的值是否变化
|
|
|
|
|
+ const currentValue = normalizeGyDetailField(row[editingField])
|
|
|
|
|
+ const originValue = normalizeGyDetailField(row._gyDetailOrigin?.[editingField])
|
|
|
|
|
+ const isFieldChanged = currentValue !== originValue
|
|
|
|
|
+
|
|
|
clearGyDetailCellEdit()
|
|
clearGyDetailCellEdit()
|
|
|
|
|
|
|
|
- if (row._gyDetailNew && editingField !== '工序名称') {
|
|
|
|
|
|
|
+ // 如果字段值没有变化,直接返回,不做任何操作
|
|
|
|
|
+ if (!isFieldChanged && !row._gyDetailNew) {
|
|
|
return
|
|
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) => {
|
|
watch(gyDetailEditingCell, async (cell) => {
|
|
|
if (!cell) return
|
|
if (!cell) return
|
|
|
await nextTick()
|
|
await nextTick()
|
|
|
|
|
+ await nextTick() // 多等一个tick确保DOM更新
|
|
|
|
|
+
|
|
|
|
|
+ // 优先使用ref引用
|
|
|
const comp = gyDetailCellInputRef.value
|
|
const comp = gyDetailCellInputRef.value
|
|
|
if (comp?.focus) {
|
|
if (comp?.focus) {
|
|
|
comp.focus()
|
|
comp.focus()
|
|
|
|
|
+ comp.select?.()
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 如果ref没有值,尝试从DOM中查找当前编辑单元格的输入框
|
|
|
const inputEl = comp?.input || comp?.$el?.querySelector?.('input')
|
|
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()
|
|
const normalizeGyDetailField = (val) => String(val ?? '').trim()
|
|
@@ -5309,6 +5426,12 @@ const sortTableData = ref([])
|
|
|
const gyDetailDaGongXuFilter = ref([])
|
|
const gyDetailDaGongXuFilter = ref([])
|
|
|
const gyDetailNanDuXiShuFilter = ref([])
|
|
const gyDetailNanDuXiShuFilter = ref([])
|
|
|
const gyDetailZhuangTaiFilter = 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 isGyDetailFilterActive = (selectedRef, options) => {
|
|
|
const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
@@ -5338,14 +5461,70 @@ const sortTableData = ref([])
|
|
|
const clearGyDetailFilter = (filterRef) => {
|
|
const clearGyDetailFilter = (filterRef) => {
|
|
|
setGyDetailFilterSelected(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 optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
const selected = filterRef.value
|
|
const selected = filterRef.value
|
|
|
if (!selected.length) return list
|
|
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) => row._gyDetailNew || set.has(matchRow(row)))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const gyDetailDisplayProcessList = computed(() => {
|
|
const gyDetailDisplayProcessList = computed(() => {
|
|
@@ -5355,46 +5534,57 @@ const sortTableData = ref([])
|
|
|
gyDetailBuJianMingChengFilter,
|
|
gyDetailBuJianMingChengFilter,
|
|
|
gyDetailBuJianMingChengFilterOptions.value,
|
|
gyDetailBuJianMingChengFilterOptions.value,
|
|
|
(row) => normalizeGyDetailField(row.部件名称),
|
|
(row) => normalizeGyDetailField(row.部件名称),
|
|
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value,
|
|
|
)
|
|
)
|
|
|
list = applyGyDetailColumnFilter(
|
|
list = applyGyDetailColumnFilter(
|
|
|
list,
|
|
list,
|
|
|
gyDetailDaGongXuFilter,
|
|
gyDetailDaGongXuFilter,
|
|
|
dagongxuFilters.value,
|
|
dagongxuFilters.value,
|
|
|
(row) => normalizeGyDetailField(row.大工序),
|
|
(row) => normalizeGyDetailField(row.大工序),
|
|
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value,
|
|
|
)
|
|
)
|
|
|
list = applyGyDetailColumnFilter(
|
|
list = applyGyDetailColumnFilter(
|
|
|
list,
|
|
list,
|
|
|
gyDetailNanDuXiShuFilter,
|
|
gyDetailNanDuXiShuFilter,
|
|
|
gyDetailDifficultyFilterOptions.value,
|
|
gyDetailDifficultyFilterOptions.value,
|
|
|
(row) => normalizeGyDetailField(row.难度系数),
|
|
(row) => normalizeGyDetailField(row.难度系数),
|
|
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value,
|
|
|
)
|
|
)
|
|
|
list = applyGyDetailColumnFilter(
|
|
list = applyGyDetailColumnFilter(
|
|
|
list,
|
|
list,
|
|
|
gyDetailZhuangTaiFilter,
|
|
gyDetailZhuangTaiFilter,
|
|
|
gyDetailStatusFilterOptions,
|
|
gyDetailStatusFilterOptions,
|
|
|
(row) => getGyDetailRowStatusFilterValue(row),
|
|
(row) => getGyDetailRowStatusFilterValue(row),
|
|
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value,
|
|
|
)
|
|
)
|
|
|
return list
|
|
return list
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const syncGyDetailFilterAfterDataChange = (filterRef, options) => {
|
|
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 = () => {
|
|
const initGyDetailFilters = () => {
|
|
|
|
|
+ // 重置手动设置标志位为 false
|
|
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value = false
|
|
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value = false
|
|
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value = false
|
|
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value = false
|
|
|
|
|
+ // 初始化筛选选项
|
|
|
selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
@@ -5526,7 +5716,7 @@ const sortTableData = ref([])
|
|
|
gyDetailFormData.工艺列表 = []
|
|
gyDetailFormData.工艺列表 = []
|
|
|
}
|
|
}
|
|
|
await clearGyDetailTableSelection()
|
|
await clearGyDetailTableSelection()
|
|
|
- syncGyDetailFiltersAfterDataChange()
|
|
|
|
|
|
|
+ // syncGyDetailFiltersAfterDataChange() // 禁用自动同步筛选,只在用户手动点击时才触发
|
|
|
await nextTick()
|
|
await nextTick()
|
|
|
updateGyDetailTableHeight()
|
|
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 () => {
|
|
const handleGyDetailBatchDelete = async () => {
|
|
|
if (gyDetailDeleting.value) return
|
|
if (gyDetailDeleting.value) return
|
|
@@ -5947,6 +6102,11 @@ const sortTableData = ref([])
|
|
|
|
|
|
|
|
const startGyDetailPlanManufactureEdit = () => {
|
|
const startGyDetailPlanManufactureEdit = () => {
|
|
|
if (gyDetailPlanManufactureEditing.value) return
|
|
if (gyDetailPlanManufactureEditing.value) return
|
|
|
|
|
+ // 邢科芳账号不能修改计划制造工分
|
|
|
|
|
+ if (gyDetailReadonly.value) {
|
|
|
|
|
+ // ElMessage.warning('您没有权限修改计划制造工分')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
|
|
gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
|
|
|
gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
|
|
gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
|
|
|
gyDetailPlanManufactureEditing.value = true
|
|
gyDetailPlanManufactureEditing.value = true
|
|
@@ -6214,13 +6374,16 @@ const sortTableData = ref([])
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
+ // 只有在编辑工序名称时,才检查三个字段是否都填写
|
|
|
|
|
+ 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
|
|
row._gyDetailSaving = true
|
|
@@ -7142,7 +7305,7 @@ const sortTableData = ref([])
|
|
|
const gySummaries = ({ columns, data }) => {
|
|
const gySummaries = ({ columns, data }) => {
|
|
|
const sums = [];
|
|
const sums = [];
|
|
|
columns.forEach((column, index) => {
|
|
columns.forEach((column, index) => {
|
|
|
- if (index === 6) {
|
|
|
|
|
|
|
+ if (index === 1) {
|
|
|
sums[index] = '合计';
|
|
sums[index] = '合计';
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|