feat(manager/plans): 加项目ID列 + 项目编号debounce搜索 + 审核dialog动态规则

表格:
- 加项目ID 列 (width=80, 居中)
- 项目编号 input 加 @input/@clear 触发 onProjectNoSearch (debounce 300ms)

审核 dialog:
- 加项目编号 input (v-if result==='2' 通过时显示, 退回时隐藏)
- 审核意见去掉 prop='opinion' (永远非必填, placeholder 改'可选')
- auditForm 加 projectNo 字段
- auditRules 改 reactive + watch result 切换 projectNo 校验 (通过必填, 退回清校验状态)
- onAudit 重置 projectNo
- submitAudit: isPass 时 payload 加 projectNo
This commit is contained in:
郭庆泰
2026-08-18 01:05:22 +08:00
parent 6eccc6eab2
commit 1d288fbe6c
+33 -11
View File
@@ -4,7 +4,7 @@
<!-- ========== 筛选区 ( People.vue 风格一致) ========== -->
<el-form inline :model="q" class="filter-form">
<el-form-item label="项目编号"><el-input v-model="q.projectNo" placeholder="输入项目编号" clearable /></el-form-item>
<el-form-item label="项目编号"><el-input v-model="q.projectNo" placeholder="输入项目编号" clearable @input="onProjectNoSearch" @clear="onProjectNoSearch" /></el-form-item>
<el-form-item label="策划方案名称"><el-input v-model="q.planName" placeholder="输入策划方案名称" clearable /></el-form-item>
<el-form-item label="项目方向">
<el-select v-model="q.planDirectionId" placeholder="请选择" clearable style="width:200px">
@@ -40,6 +40,7 @@
<!-- ========== 表格 ( People.vue 风格一致, page-card 包裹) ========== -->
<el-table :data="rows" v-loading="loading" stripe border @selection-change="onSel">
<el-table-column type="selection" width="44" />
<el-table-column prop="planId" label="项目ID" width="80" align="center" />
<el-table-column prop="planName" label="策划方案名称" min-width="200" fixed show-overflow-tooltip />
<el-table-column prop="planDirectionTitle" label="项目方向" min-width="220" show-overflow-tooltip />
<el-table-column prop="planCategory" label="项目类别" width="100" align="center" />
@@ -80,7 +81,7 @@
<el-pagination v-model:current-page="page.pageNum" v-model:page-size="page.pageSize" :total="page.total" :page-sizes="[10,20,50]" layout="total, sizes, prev, pager, next, jumper" @current-change="load" @size-change="load" />
</div>
<!-- 审核 dialog: 策划案名称 + 审核结果(通过/退回 radio) + 审核意见 -->
<!-- 审核 dialog: 策划案名称 + 审核结果(通过/退回 radio) + 项目编号(仅通过时必填) + 审核意见(可选) -->
<el-dialog v-model="auditOpen" title="审核策划方案" width="500px">
<el-form :model="auditForm" :rules="auditRules" ref="auditFormRef" label-width="100px">
<el-form-item label="策划案名称"><span>{{ auditForm.planName }}</span></el-form-item>
@@ -90,8 +91,11 @@
<el-radio value="3">退回</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核意见" prop="opinion">
<el-input v-model="auditForm.opinion" type="textarea" rows="3" placeholder="请填写审核意见" />
<el-form-item v-if="auditForm.result === '2'" label="项目编号" prop="projectNo">
<el-input v-model="auditForm.projectNo" placeholder="请填写项目编号" />
</el-form-item>
<el-form-item label="审核意见">
<el-input v-model="auditForm.opinion" type="textarea" rows="3" placeholder="请填写审核意见 (可选)" />
</el-form-item>
</el-form>
<template #footer>
@@ -143,7 +147,7 @@
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ref, reactive, watch, onMounted } from 'vue'
import { bizList, bizUpdate } from '@/api/public'
import request from '@/utils/request'
import { ElMessage } from 'element-plus'
@@ -175,6 +179,12 @@ async function load() {
} catch { rows.value = []; page.total = 0 }
finally { loading.value = false }
}
// 项目编号: 边输入边搜索 (debounce 300ms)
let projectNoTimer = null
function onProjectNoSearch() {
if (projectNoTimer) clearTimeout(projectNoTimer)
projectNoTimer = setTimeout(() => { page.pageNum = 1; load() }, 300)
}
function reset() { q.value = { planName:'', projectNo:'', planDirectionId:'', planCategory:'', status:'', isSettled:'', remark:'' }; page.pageNum = 1; load() }
function onSel(rs) { selection.value = rs }
@@ -193,16 +203,26 @@ async function batchSettle() {
const auditOpen = ref(false)
const auditFormRef = ref(null)
// 审核: 通过 '2' / 退回 '3' (BizAuditStatusEnum)
const auditForm = reactive({ planId: '', planName: '', result: '2', opinion: '' })
const auditRules = {
// 审核: 通过 '2' / 退回 '3' (BizAuditStatusEnum); 通过时必填项目编号, 退回时不填; 审核意见可选
const auditForm = reactive({ planId: '', planName: '', result: '2', projectNo: '', opinion: '' })
const auditRules = reactive({
result: [{ required: true, message: '请选择审核结果', trigger: 'change' }],
opinion: [{ required: true, message: '请填写审核意见', trigger: 'blur' }]
}
projectNo: [{ required: false }]
})
// 通过时: projectNo 必填; 退回时: projectNo 非必填且隐藏 (同时清掉校验状态)
watch(() => auditForm.result, (val) => {
if (val === '2') {
auditRules.projectNo = [{ required: true, message: '请填写项目编号', trigger: 'blur' }]
} else {
auditRules.projectNo = [{ required: false }]
auditFormRef.value?.clearValidate(['projectNo'])
}
})
function onAudit(row) {
auditForm.planId = row.planId
auditForm.planName = row.planName
auditForm.result = '2'
auditForm.projectNo = ''
auditForm.opinion = ''
auditOpen.value = true
}
@@ -211,7 +231,9 @@ async function submitAudit() {
await auditFormRef.value.validate()
submitting.value = true
const isPass = auditForm.result === '2'
await bizUpdate('projectPlan', { planId: auditForm.planId, status: auditForm.result, auditOpinion: auditForm.opinion })
const payload = { planId: auditForm.planId, status: auditForm.result, auditOpinion: auditForm.opinion }
if (isPass) payload.projectNo = auditForm.projectNo
await bizUpdate('projectPlan', payload)
ElMessage.success(isPass ? '已通过' : '已退回')
auditOpen.value = false
load()