|
|
@@ -13,28 +13,93 @@
|
|
|
|
|
|
<el-card class="section-card" shadow="never">
|
|
|
<template #header>
|
|
|
- <div class="section-title">主表信息(A/B/C/D 占位)</div>
|
|
|
+ <div class="section-header">
|
|
|
+ <div class="section-title">主表信息</div>
|
|
|
+ <div class="default-form-info header-default-info">
|
|
|
+ <div>表单编号:{{ mainForm.bdbh || '-' }}</div>
|
|
|
+ <div>表单版本:{{ mainForm.bb || '-' }}</div>
|
|
|
+ <div>表单生效日期:{{ formatFormDate(mainForm.sxrq) }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
<el-form label-width="100px">
|
|
|
<el-row :gutter="16">
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="A">
|
|
|
- <el-input v-model="mainForm.mainA" placeholder="请输入 A" />
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="检规编号">
|
|
|
+ <el-input v-model="mainForm.jgbh" placeholder="请输入检规编号" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="检规版本">
|
|
|
+ <el-input v-model="mainForm.jgbb" placeholder="请输入检规版本" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="检验员">
|
|
|
+ <el-input v-model="mainForm.jyr" placeholder="请输入检验员" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="检验数量">
|
|
|
+ <el-input v-model="mainForm.jysl" placeholder="请输入检验数量" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="合格数量">
|
|
|
+ <el-input
|
|
|
+ :model-value="mainForm.jyhgsl"
|
|
|
+ placeholder="请输入合格数量"
|
|
|
+ @update:model-value="(val) => (mainForm.jyhgsl = sanitizeInt(val))"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="不合格数量">
|
|
|
+ <el-input
|
|
|
+ :model-value="mainForm.bhgsl"
|
|
|
+ placeholder="请输入不合格数量"
|
|
|
+ @update:model-value="(val) => (mainForm.bhgsl = sanitizeInt(val))"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="处理方式">
|
|
|
+ <el-select v-model="mainForm.clfs" placeholder="请选择处理方式" style="width: 100%">
|
|
|
+ <el-option label="退货" value="退货" />
|
|
|
+ <el-option label="挑选" value="挑选" />
|
|
|
+ <el-option label="让步接收" value="让步接收" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="留样数量">
|
|
|
+ <el-input
|
|
|
+ :model-value="mainForm.lysl"
|
|
|
+ placeholder="请输入留样数量"
|
|
|
+ @update:model-value="(val) => (mainForm.lysl = sanitizeInt(val))"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="B">
|
|
|
- <el-input v-model="mainForm.mainB" placeholder="请输入 B" />
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="破坏数量">
|
|
|
+ <el-input
|
|
|
+ :model-value="mainForm.phsl"
|
|
|
+ placeholder="请输入破坏数量"
|
|
|
+ @update:model-value="(val) => (mainForm.phsl = sanitizeInt(val))"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="C">
|
|
|
- <el-input v-model="mainForm.mainC" placeholder="请输入 C" />
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="附件">
|
|
|
+ <UploadFile v-model="mainForm.fj" :limit="1" :file-type="[]" :is-show-tip="false" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="D">
|
|
|
- <el-input v-model="mainForm.mainD" placeholder="请输入 D" />
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="判断">
|
|
|
+ <el-select v-model="mainForm.jgpd" placeholder="请选择判断" style="width: 100%">
|
|
|
+ <el-option label="合格" value="合格" />
|
|
|
+ <el-option label="不合格" value="不合格" />
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -44,36 +109,241 @@
|
|
|
<el-card class="section-card" shadow="never">
|
|
|
<template #header>
|
|
|
<div class="section-title">
|
|
|
- 检验明细(A/B/C/D 占位)
|
|
|
+ 检验明细
|
|
|
<div class="section-actions">
|
|
|
<el-button type="primary" size="small" @click="handleAddRow">新增行</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
<el-table :data="detailRows" border>
|
|
|
- <el-table-column label="A" width="220">
|
|
|
+ <el-table-column label="操作" width="100">
|
|
|
+ <template #default="{ $index }">
|
|
|
+ <el-button link type="danger" size="small" @click="handleDeleteRow($index)">删除</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="检验项目" min-width="200">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.a" placeholder="请输入 A" />
|
|
|
+ <el-input v-model="row.jyxm" placeholder="请输入检验项目" disabled />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="B" width="220">
|
|
|
+ <el-table-column label="检验标准" min-width="200">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.b" placeholder="请输入 B" />
|
|
|
+ <el-input v-model="row.bz" placeholder="请输入检验标准" disabled />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="C" width="180">
|
|
|
+ <el-table-column label="上限" width="140">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.c" placeholder="请输入 C" />
|
|
|
+ <el-input
|
|
|
+ :model-value="row.sx"
|
|
|
+ placeholder="请输入上限"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'sx', val)"
|
|
|
+ />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="D" width="180">
|
|
|
+ <el-table-column label="下限" width="140">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model="row.d" placeholder="请输入 D" />
|
|
|
+ <el-input
|
|
|
+ :model-value="row.xx"
|
|
|
+ placeholder="请输入下限"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'xx', val)"
|
|
|
+ />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作" width="100">
|
|
|
- <template #default="{ $index }">
|
|
|
- <el-button link type="danger" size="small" @click="handleDeleteRow($index)">删除</el-button>
|
|
|
+ <el-table-column label="判断" width="140">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-select v-model="row.pd" placeholder="请选择判断" style="width: 100%">
|
|
|
+ <el-option label="合格" :value="1" />
|
|
|
+ <el-option label="不合格" :value="0" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="样本量" width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.sampleCount"
|
|
|
+ placeholder="数量"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'sampleCount', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 1" label="样本1" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j1"
|
|
|
+ placeholder="请输入样本1"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j1', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 2" label="样本2" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j2"
|
|
|
+ placeholder="请输入样本2"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j2', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 3" label="样本3" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j3"
|
|
|
+ placeholder="请输入样本3"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j3', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 4" label="样本4" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j4"
|
|
|
+ placeholder="请输入样本4"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j4', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 5" label="样本5" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j5"
|
|
|
+ placeholder="请输入样本5"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j5', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 6" label="样本6" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j6"
|
|
|
+ placeholder="请输入样本6"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j6', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 7" label="样本7" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j7"
|
|
|
+ placeholder="请输入样本7"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j7', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 8" label="样本8" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j8"
|
|
|
+ placeholder="请输入样本8"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j8', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 9" label="样本9" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j9"
|
|
|
+ placeholder="请输入样本9"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j9', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 10" label="样本10" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j10"
|
|
|
+ placeholder="请输入样本10"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j10', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 11" label="样本11" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j11"
|
|
|
+ placeholder="请输入样本11"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j11', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 12" label="样本12" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j12"
|
|
|
+ placeholder="请输入样本12"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j12', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 13" label="样本13" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j13"
|
|
|
+ placeholder="请输入样本13"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j13', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 14" label="样本14" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j14"
|
|
|
+ placeholder="请输入样本14"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j14', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 15" label="样本15" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j15"
|
|
|
+ placeholder="请输入样本15"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j15', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 16" label="样本16" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j16"
|
|
|
+ placeholder="请输入样本16"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j16', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 17" label="样本17" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j17"
|
|
|
+ placeholder="请输入样本17"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j17', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 18" label="样本18" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j18"
|
|
|
+ placeholder="请输入样本18"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j18', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 19" label="样本19" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j19"
|
|
|
+ placeholder="请输入样本19"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j19', val)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="maxSampleCount >= 20" label="样本20" width="120">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input
|
|
|
+ :model-value="row.j20"
|
|
|
+ placeholder="请输入样本20"
|
|
|
+ @update:model-value="(val) => updateRowInt(row, 'j20', val)"
|
|
|
+ />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
@@ -87,13 +357,18 @@ defineOptions({ name: 'IqcInspectBillEdit' })
|
|
|
import { computed, ref, watch } from 'vue'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import { useIqcInspectBillStore } from '@/store/modules/qms/inspectBill'
|
|
|
+import { getIqcTaskDetail } from '@/api/qms/iqc/task'
|
|
|
+import { useUserStore } from '@/store/modules/user'
|
|
|
+import { UploadFile } from '@/components/UploadFile'
|
|
|
|
|
|
const route = useRoute()
|
|
|
const router = useRouter()
|
|
|
const inspectBillStore = useIqcInspectBillStore()
|
|
|
+const userStore = useUserStore()
|
|
|
|
|
|
const loading = ref(false)
|
|
|
const saving = ref(false)
|
|
|
+const isSyncing = ref(false)
|
|
|
|
|
|
const taskId = computed(() => String(route.params.taskId || ''))
|
|
|
|
|
|
@@ -107,16 +382,105 @@ const detailRows = computed(() => {
|
|
|
return inspectBillStore.ensureDraft(taskId.value).details
|
|
|
})
|
|
|
|
|
|
+const maxSampleCount = ref(0)
|
|
|
+
|
|
|
+const toSampleCount = (value: any) => {
|
|
|
+ if (value === null || value === undefined || value === '') return 0
|
|
|
+ const num = Number(value)
|
|
|
+ if (Number.isNaN(num)) return 0
|
|
|
+ return Math.max(0, Math.min(20, Math.floor(num)))
|
|
|
+}
|
|
|
+
|
|
|
+const sanitizeInt = (value: any) => {
|
|
|
+ if (value === null || value === undefined) return ''
|
|
|
+ const text = String(value).replace(/[^\d]/g, '')
|
|
|
+ if (text === '') return ''
|
|
|
+ return String(parseInt(text, 10))
|
|
|
+}
|
|
|
+
|
|
|
+const updateRowInt = (row: any, key: string, value: any) => {
|
|
|
+ row[key] = sanitizeInt(value)
|
|
|
+}
|
|
|
+
|
|
|
+const refreshMaxSampleCount = () => {
|
|
|
+ const currentMax = detailRows.value.reduce((max: number, row: any) => {
|
|
|
+ const count = toSampleCount(row?.sampleCount)
|
|
|
+ return count > max ? count : max
|
|
|
+ }, 0)
|
|
|
+ if (currentMax > maxSampleCount.value) {
|
|
|
+ maxSampleCount.value = currentMax
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const toNumber = (value: any) => {
|
|
|
+ if (value === null || value === undefined || value === '') return undefined
|
|
|
+ const num = Number(value)
|
|
|
+ return Number.isNaN(num) ? undefined : num
|
|
|
+}
|
|
|
+
|
|
|
+const syncComplement = (changedKey: 'jyhgsl' | 'bhgsl') => {
|
|
|
+ if (isSyncing.value) return
|
|
|
+ const total = toNumber(mainForm.value.jysl)
|
|
|
+ if (total === undefined) return
|
|
|
+ const current = toNumber(mainForm.value[changedKey])
|
|
|
+ if (current === undefined) return
|
|
|
+ const otherKey = changedKey === 'jyhgsl' ? 'bhgsl' : 'jyhgsl'
|
|
|
+ const next = Math.max(0, total - current)
|
|
|
+ isSyncing.value = true
|
|
|
+ mainForm.value[otherKey] = Number.isNaN(next) ? '' : String(next)
|
|
|
+ isSyncing.value = false
|
|
|
+}
|
|
|
+
|
|
|
const fetchData = async () => {
|
|
|
if (!taskId.value) return
|
|
|
loading.value = true
|
|
|
try {
|
|
|
await inspectBillStore.load(taskId.value)
|
|
|
+ if (!mainForm.value.jyr) {
|
|
|
+ mainForm.value.jyr = userStore.getUser.nickname || ''
|
|
|
+ }
|
|
|
+ const result = await getIqcTaskDetail(taskId.value)
|
|
|
+ const detail = (result as any)?.data ?? result
|
|
|
+ if ((mainForm.value.jysl === 0 || mainForm.value.jysl === '' || mainForm.value.jysl === null || mainForm.value.jysl === undefined)
|
|
|
+ && detail?.quantity !== undefined && detail?.quantity !== null) {
|
|
|
+ mainForm.value.jysl = detail.quantity
|
|
|
+ }
|
|
|
+ if (mainForm.value.jyhgsl) {
|
|
|
+ syncComplement('jyhgsl')
|
|
|
+ } else if (mainForm.value.bhgsl) {
|
|
|
+ syncComplement('bhgsl')
|
|
|
+ }
|
|
|
+ refreshMaxSampleCount()
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const resolveProcessInstanceId = async () => {
|
|
|
+ const fromQuery = String(route.query.processInstanceId || '')
|
|
|
+ if (fromQuery) return fromQuery
|
|
|
+ if (!taskId.value) return ''
|
|
|
+ try {
|
|
|
+ const result = await getIqcTaskDetail(taskId.value)
|
|
|
+ const detail = (result as any)?.data ?? result
|
|
|
+ return String(detail?.processInstanceId || '')
|
|
|
+ } catch {
|
|
|
+ return ''
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const goToProcessDetail = async () => {
|
|
|
+ const processInstanceId = await resolveProcessInstanceId()
|
|
|
+ if (processInstanceId) {
|
|
|
+ await router.replace({
|
|
|
+ path: '/bpm/process-instance/detail',
|
|
|
+ query: { id: processInstanceId }
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ router.back()
|
|
|
+}
|
|
|
+
|
|
|
const handleAddRow = () => {
|
|
|
if (!taskId.value) return
|
|
|
inspectBillStore.addDetailRow(taskId.value)
|
|
|
@@ -127,12 +491,28 @@ const handleDeleteRow = (index: number) => {
|
|
|
inspectBillStore.deleteDetailRow(taskId.value, index)
|
|
|
}
|
|
|
|
|
|
+const formatFormDate = (value: any) => {
|
|
|
+ if (!value) return '-'
|
|
|
+ const text = String(value)
|
|
|
+ if (/^\d{4}-\d{2}-\d{2}$/.test(text)) return text.replaceAll('-', '.')
|
|
|
+ return text
|
|
|
+}
|
|
|
+
|
|
|
+const getSampleCount = (row: any) => {
|
|
|
+ const keys = ['j1','j2','j3','j4','j5','j6','j7','j8','j9','j10','j11','j12','j13','j14','j15','j16','j17','j18','j19','j20']
|
|
|
+ return keys.reduce((count, key) => {
|
|
|
+ const val = row?.[key]
|
|
|
+ return val !== null && val !== undefined && String(val).trim() !== '' ? count + 1 : count
|
|
|
+ }, 0)
|
|
|
+}
|
|
|
+
|
|
|
const handleSave = async () => {
|
|
|
if (!taskId.value) return
|
|
|
saving.value = true
|
|
|
try {
|
|
|
await inspectBillStore.save(taskId.value)
|
|
|
ElMessage.success('保存成功')
|
|
|
+ await goToProcessDetail()
|
|
|
} catch {
|
|
|
ElMessage.error('保存失败')
|
|
|
} finally {
|
|
|
@@ -140,11 +520,15 @@ const handleSave = async () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-const handleBack = () => {
|
|
|
- router.back()
|
|
|
+const handleBack = async () => {
|
|
|
+ await goToProcessDetail()
|
|
|
}
|
|
|
|
|
|
watch(taskId, () => { fetchData() }, { immediate: true })
|
|
|
+
|
|
|
+watch(() => mainForm.value.jyhgsl, () => { syncComplement('jyhgsl') })
|
|
|
+watch(() => mainForm.value.bhgsl, () => { syncComplement('bhgsl') })
|
|
|
+watch(detailRows, () => { refreshMaxSampleCount() }, { deep: true })
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@@ -178,4 +562,19 @@ watch(taskId, () => { fetchData() }, { immediate: true })
|
|
|
margin-left: auto;
|
|
|
}
|
|
|
}
|
|
|
+.section-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ justify-content: space-between;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+.default-form-info {
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 20px;
|
|
|
+}
|
|
|
+.header-default-info {
|
|
|
+ text-align: right;
|
|
|
+ min-width: 220px;
|
|
|
+}
|
|
|
</style>
|