feat: 会议提交剩余时间+解冻 + 会务/劳务材料批量下载 + 多角色人员/账号模块完善
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="page-card manager-plans">
|
||||
<div class="breadcrumb">首页 / 项目策划方案</div>
|
||||
<div class="breadcrumb">首页 / 策划方案管理</div>
|
||||
|
||||
<!-- ========== 筛选区 (与 People.vue 风格一致) ========== -->
|
||||
<el-form inline :model="q" class="filter-form">
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
<!-- ========== 批量按钮 (与 People.vue 风格一致) ========== -->
|
||||
<div class="batch-bar">
|
||||
<el-button type="primary" :disabled="!selection.length" @click="openBatchAudit">批量审核</el-button>
|
||||
<el-button type="primary" :disabled="!selection.length" @click="batchSettle">批量结算</el-button>
|
||||
<span v-if="selection.length" class="filter-tip">已选 {{ selection.length }} 条</span>
|
||||
</div>
|
||||
@@ -70,7 +71,7 @@
|
||||
<el-table-column label="操作" width="200" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button link type="primary" @click="onAudit(row)">审核</el-button>
|
||||
<el-button link type="primary" @click="onEdit(row)">修改</el-button>
|
||||
<el-button link type="primary" @click="goEdit(row)">修改</el-button>
|
||||
<el-button link type="primary" @click="onSettle(row)" v-if="row.isSettled!=='Y'">结算</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -104,32 +105,27 @@
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 编辑 dialog -->
|
||||
<el-dialog v-model="editOpen" title="修改策划方案" width="640px" @closed="resetEditForm">
|
||||
<el-form :model="editForm" label-width="120px" :rules="editRules" ref="editFormRef">
|
||||
<el-form-item label="方案名称" prop="planName"><el-input v-model="editForm.planName" /></el-form-item>
|
||||
<el-form-item label="项目编号" prop="projectNo"><el-input v-model="editForm.projectNo" /></el-form-item>
|
||||
<el-form-item label="项目方向">
|
||||
<el-select v-model="editForm.planDirectionId" placeholder="请选择" style="width:100%">
|
||||
<el-option v-for="opt in planDirectionOptions" :key="opt.id" :label="opt.title" :value="opt.id" />
|
||||
<!-- 批量审核 dialog: 审核结果(通过/退回 radio) + 项目编号(仅通过时必填) + 审核意见(可选), 批量应用于所有选中方案 -->
|
||||
<el-dialog v-model="batchAuditOpen" title="批量审核策划方案" width="500px">
|
||||
<el-form :model="batchAuditForm" :rules="batchAuditRules" ref="batchAuditFormRef" label-width="100px">
|
||||
<el-form-item label="审核结果" prop="result">
|
||||
<el-radio-group v-model="batchAuditForm.result">
|
||||
<el-radio value="2">通过</el-radio>
|
||||
<el-radio value="3">退回</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="batchAuditForm.result === '2'" label="项目编号" prop="projectNo">
|
||||
<el-select v-model="batchAuditForm.projectNo" placeholder="请选择项目编号" filterable style="width:100%">
|
||||
<el-option v-for="opt in projectNoOptions" :key="opt.projectNo" :label="opt.projectNo + (opt.projectName ? ' / ' + opt.projectName : '')" :value="opt.projectNo" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目类别">
|
||||
<dict-select v-model="editForm.planCategory" dict-type="biz_project_category" value-field="label" style="width:100%" />
|
||||
<el-form-item label="审核意见">
|
||||
<el-input v-model="batchAuditForm.opinion" type="textarea" rows="3" placeholder="请填写审核意见 (可选)" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目形式">
|
||||
<el-select v-model="editForm.projectForm" placeholder="请选择" style="width:100%">
|
||||
<el-option label="线上" value="线上" /><el-option label="线下" value="线下" /><el-option label="线上+线下" value="线上+线下" /><el-option label="其他" value="其他" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="设计方案">
|
||||
<el-input v-model="editForm.designFileUrl" placeholder="文件 URL(暂以文本输入)" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注"><el-input v-model="editForm.remark" type="textarea" rows="2" /></el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="editOpen=false">取消</el-button>
|
||||
<el-button type="primary" :loading="submitting" @click="submitEdit">保存</el-button>
|
||||
<el-button @click="batchAuditOpen=false">取消</el-button>
|
||||
<el-button type="primary" :loading="submitting" @click="submitBatchAudit">确认</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
@@ -147,6 +143,7 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, watch, onMounted } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { bizList, bizUpdate } from '@/api/public'
|
||||
import request from '@/utils/request'
|
||||
import { ElMessage } from 'element-plus'
|
||||
@@ -171,6 +168,7 @@ async function loadProjectNoOptions() {
|
||||
} catch { projectNoOptions.value = [] }
|
||||
}
|
||||
|
||||
const router = useRouter()
|
||||
const q = ref({ planName: '', projectNo: '', planDirectionId: '', planCategory: '', status: '', isSettled: '', remark: '' })
|
||||
const rows = ref([]); const selection = ref([])
|
||||
const loading = ref(false)
|
||||
@@ -249,31 +247,56 @@ async function submitAudit() {
|
||||
finally { submitting.value = false }
|
||||
}
|
||||
|
||||
const editOpen = ref(false)
|
||||
const editFormRef = ref(null)
|
||||
const editForm = reactive({ planId:'', planName:'', projectNo:'', planDirectionId:'', planCategory:'', projectForm:'', designFileUrl:'', remark:'' })
|
||||
const editRules = { planName:[{required:true,message:'请输入方案名称',trigger:'blur'}] }
|
||||
function onEdit(row) {
|
||||
Object.assign(editForm, {
|
||||
planId: row.planId, planName: row.planName, projectNo: row.projectNo,
|
||||
planDirectionId: row.planDirectionId ?? null, planCategory: row.planCategory,
|
||||
projectForm: row.projectForm, designFileUrl: row.designFileUrl || '', remark: row.remark || ''
|
||||
})
|
||||
editOpen.value = true
|
||||
// 批量审核: 与单独审核字段一致 (审核结果/项目编号/审核意见), 批量应用于所有选中方案
|
||||
const batchAuditOpen = ref(false)
|
||||
const batchAuditFormRef = ref(null)
|
||||
const batchAuditForm = reactive({ result: '2', projectNo: '', opinion: '' })
|
||||
const batchAuditRules = reactive({
|
||||
result: [{ required: true, message: '请选择审核结果', trigger: 'change' }],
|
||||
projectNo: [{ required: false }]
|
||||
})
|
||||
// 通过时: projectNo 必填; 退回时: projectNo 非必填且隐藏 (同时清掉校验状态)
|
||||
watch(() => batchAuditForm.result, (val) => {
|
||||
if (val === '2') {
|
||||
batchAuditRules.projectNo = [{ required: true, message: '请填写项目编号', trigger: 'blur' }]
|
||||
} else {
|
||||
batchAuditRules.projectNo = [{ required: false }]
|
||||
batchAuditFormRef.value?.clearValidate(['projectNo'])
|
||||
}
|
||||
})
|
||||
function openBatchAudit() {
|
||||
if (!selection.value.length) return ElMessage.warning('请先勾选行')
|
||||
batchAuditForm.result = '2'
|
||||
batchAuditForm.projectNo = ''
|
||||
batchAuditForm.opinion = ''
|
||||
loadProjectNoOptions()
|
||||
batchAuditOpen.value = true
|
||||
}
|
||||
function resetEditForm() { Object.assign(editForm, { planId:'', planName:'', projectNo:'', planDirectionId:'', planCategory:'', projectForm:'', designFileUrl:'', remark:'' }) }
|
||||
async function submitEdit() {
|
||||
await editFormRef.value.validate()
|
||||
async function submitBatchAudit() {
|
||||
try {
|
||||
await batchAuditFormRef.value.validate()
|
||||
submitting.value = true
|
||||
await bizUpdate('projectPlan', { ...editForm })
|
||||
ElMessage.success('已保存')
|
||||
editOpen.value = false
|
||||
const isPass = batchAuditForm.result === '2'
|
||||
const payload = { status: batchAuditForm.result, auditOpinion: batchAuditForm.opinion }
|
||||
if (isPass) payload.projectNo = batchAuditForm.projectNo
|
||||
let ok = 0
|
||||
for (const r of selection.value) {
|
||||
try { await bizUpdate('projectPlan', { ...payload, planId: r.planId }); ok++ } catch {}
|
||||
}
|
||||
submitting.value = false
|
||||
ElMessage.success(`批量审核 ${ok}/${selection.value.length} 条`)
|
||||
batchAuditOpen.value = false
|
||||
selection.value = []
|
||||
load()
|
||||
} catch (e) { ElMessage.error(e?.msg || '保存失败') }
|
||||
} catch (e) { if (e?.message) ElMessage.error(e.message) }
|
||||
finally { submitting.value = false }
|
||||
}
|
||||
|
||||
// 修改: 跳转到独立页面 PlanEdit.vue
|
||||
function goEdit(row) {
|
||||
router.push({ path: `/manager/plans/edit/${row.planId}` })
|
||||
}
|
||||
|
||||
const settleOpen = ref(false)
|
||||
const settleForm = reactive({ planId:'', planName:'' })
|
||||
function onSettle(row) { settleForm.planId = row.planId; settleForm.planName = row.planName; settleOpen.value = true }
|
||||
|
||||
Reference in New Issue
Block a user