履约验收

This commit is contained in:
吴红兵
2026-02-06 15:42:51 +08:00
parent 0704b79b32
commit 591bad2318
3 changed files with 238 additions and 111 deletions

View File

@@ -1,16 +1,16 @@
<template>
<el-form ref="formRef" :model="form" :rules="rules" label-width="160px" class="accept-batch-form">
<el-form ref="formRef" :model="form" :rules="rules" label-width="160px" >
<el-row :gutter="24">
<el-col :span="12">
<el-col :span="12" class="mb20">
<el-form-item label="验收方式" prop="acceptType">
<el-radio-group v-model="form.acceptType" :disabled="readonly">
<el-radio label="1">填写履约验收评价表</el-radio>
<el-radio label="2" :disabled="!canFill">上传履约验收评价表</el-radio>
<el-radio label="1" :disabled="!canFill">填写履约验收评价表</el-radio>
<el-radio label="2">上传履约验收评价表</el-radio>
</el-radio-group>
<div v-if="!canFill" class="el-form-item__tip">金额30万仅支持上传模版</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" class="mb20">
<el-form-item label="验收日期" prop="acceptDate">
<el-date-picker
v-model="form.acceptDate"
@@ -26,23 +26,26 @@
<!-- 填报方式验收内容表格 -->
<template v-if="form.acceptType === '1' && canFill">
<el-col :span="24">
<el-col :span="12" class="mb20">
<el-form-item label="验收内容" prop="acceptContents">
<el-table :data="form.acceptContents" border size="small" max-height="260" class="accept-content-table">
<el-table :data="form.acceptContents" border size="small" class="accept-content-table">
<el-table-column prop="itemName" label="验收项" >
<template #default="{ row }">
{{row.itemName}}
<el-input
v-if="row.type === 'input'"
v-model="row.remark"
placeholder="请输入"
size="small"
:disabled="readonly"
/>
<div>
<span>{{row.itemName}}</span>
<el-input
v-if="row.type === 'input'"
v-model="row.remark"
placeholder="请输入"
size="small"
:disabled="readonly"
/>
</div>
</template>
</el-table-column>
<el-table-column prop="isQualified" label="合格/不合格" width="140" align="center">
<el-table-column prop="isQualified" label="合格/不合格" align="center">
<template #default="{ row }">
<el-radio-group v-model="row.isQualified" size="small" :disabled="readonly">
<el-radio label="1">合格</el-radio>
@@ -58,7 +61,7 @@
<!-- 上传方式 -->
<template v-if="form.acceptType === '2'">
<el-col :span="24">
<el-col :span="12">
<el-form-item label="履约验收模版" prop="templateFileIds">
<UploadFile
v-model="templateFileIdsStr"
@@ -72,7 +75,7 @@
</template>
<!-- 验收小组 -->
<el-col :span="24">
<el-col :span="12">
<el-form-item label="验收小组" prop="acceptTeam">
<div class="team-list">
<div v-for="(m, idx) in form.acceptTeam" :key="idx" class="team-row">
@@ -82,7 +85,30 @@
</div>
<el-button v-if="!readonly" type="primary" link size="small" @click="addTeam">+ 增加成员</el-button>
</div>
<div class="el-form-item__tip">至少3人且为单数</div>
<div class="el-form-item__tip">
至少3人且为单数
<template v-if="(previousBatchesTeams || []).length > 0">
<span class="copy-from-inline">
从往期带入
<el-select
v-model="copyFromBatch"
placeholder="同第N期"
clearable
size="small"
style="width: 100px"
@change="onCopyFromBatch"
>
<el-option
v-for="item in (previousBatchesTeams || [])"
:key="item.batch"
:label="`同第${item.batch}期`"
:value="item.batch"
/>
</el-select>
</span>
</template>
</div>
</el-form-item>
</el-col>
@@ -106,14 +132,17 @@ const props = withDefaults(
readonly?: boolean
purchaseId?: string
acceptanceItems?: any[]
batchNum?: number
previousBatchesTeams?: { batch: number; team: any[] }[]
}>(),
{ readonly: false, canFill: true, purchaseId: '' }
{ readonly: false, canFill: true, purchaseId: '', batchNum: 1, previousBatchesTeams: () => [] }
)
const emit = defineEmits(['update:modelValue'])
const formRef = ref<FormInstance>()
const templateFileIdsStr = ref('')
const copyFromBatch = ref<number | null>(null)
const form = reactive({
acceptType: '1',
@@ -129,8 +158,20 @@ const form = reactive({
...props.modelValue,
})
watch(() => props.modelValue, (val) => Object.assign(form, val || {}), { deep: true })
watch(() => props.modelValue, (val) => {
Object.assign(form, val || {})
// 金额≥30万时强制为上传方式
if (!props.canFill && form.acceptType === '1') {
form.acceptType = '2'
}
}, { deep: true })
watch(form, () => emit('update:modelValue', { ...form }), { deep: true })
// 金额≥30万时默认选中上传方式
watch(() => props.canFill, (val) => {
if (!val && form.acceptType === '1') {
form.acceptType = '2'
}
}, { immediate: true })
watch(() => props.acceptanceItems, (items) => {
if (items?.length && form.acceptContents.length === 0) {
@@ -163,6 +204,19 @@ const removeTeam = (idx: number) => {
form.acceptTeam.splice(idx, 1)
}
const onCopyFromBatch = (n: number | null) => {
if (!n) return
const item = props.previousBatchesTeams?.find((x) => x.batch === n)
if (item?.team?.length) {
form.acceptTeam = item.team.map((m: any) => ({
name: m.name || '',
deptCode: m.deptCode || '',
deptName: m.deptName || '',
}))
}
copyFromBatch.value = null
}
const rules: FormRules = {
acceptType: [{ required: true, message: '请选择验收方式', trigger: 'change' }],
acceptDate: [{ required: true, message: '请选择验收日期', trigger: 'change' }],
@@ -174,26 +228,16 @@ defineExpose({ validate, form })
</script>
<style scoped>
.accept-batch-form :deep(.el-form-item) {
margin-bottom: 24px;
.mb20 {
margin-bottom: 20px;
}
.accept-content-table :deep(.el-table__body td) {
padding: 10px 0;
width: 200px;
}
.team-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.team-row {
display: flex;
.copy-from-inline {
display: inline-flex;
align-items: center;
gap: 12px;
gap: 6px;
margin-left: 4px;
}
.el-form-item__tip {
font-size: 12px;
color: #909399;
margin-top: 6px;
.copy-from-inline :deep(.el-select) {
vertical-align: middle;
}
</style>