chore: biz_org 合并 / BizProject 重构 / 各角色页面调整 (上次重构遗留)

涵盖改动范围:
- 后端 BizOrg / BizProject / BizProjectRating / BizSpecialPlan controller + domain + mapper + service
- 前端 admin (BizSpecialPlanAdmin, ProjectCategory) / executor / leader / manager / sponsor 多页调整
- api/dict.js + AdminLayout.vue 同步
This commit is contained in:
郭庆泰
2026-08-18 00:30:34 +08:00
parent c9fc6ebdb8
commit b52a334184
32 changed files with 744 additions and 454 deletions
+10 -86
View File
@@ -38,8 +38,8 @@
</el-form-item>
<el-form-item label="是否结算">
<el-select v-model="q.isSettled" placeholder="全部" clearable style="width:100px">
<el-option label="已结算" value="1" />
<el-option label="未结算" value="0" />
<el-option label="已结算" value="Y" />
<el-option label="未结算" value="N" />
</el-select>
</el-form-item>
<el-form-item>
@@ -53,7 +53,7 @@
<!-- 批量按钮 (按原型 left 顺序): 项目分配 / 批量评价 -->
<div class="batch-bar">
<el-button type="primary" @click="openBatchAssign">项目分配</el-button>
<el-button type="primary" :disabled="!selected.length" @click="onBatchRate">批量评价</el-button>
<!-- 评价入口仅 manager / sponsor 可见, leader 不可评分 -->
<span class="hint">已选 {{ selected.length }} </span>
</div>
@@ -80,7 +80,7 @@
<el-table-column label="已支付会务费" width="120" align="right">
<template #default="{ row }">¥{{ formatMoney(row.paidMeetingAmount) }}</template>
</el-table-column>
<el-table-column prop="ratingScore" label="执行单位评价(支持方)" width="150" align="center" />
<el-table-column prop="managerScore" label="执行单位评价(合规)" width="150" align="center" />
<el-table-column label="是否结题" width="90" align="center">
<template #default="{ row }">
<el-tag :type="row.isFinished === '1' ? 'success' : 'info'" size="small">
@@ -90,12 +90,11 @@
</el-table-column>
<el-table-column prop="startTime" label="项目开始时间" min-width="160" />
<el-table-column prop="endTime" label="项目结束时间" min-width="160" />
<!-- 操作列按原型 left 顺序: 查看 / 分配 / 项目评价 -->
<el-table-column label="操作" width="240" fixed="right">
<!-- 操作列按原型 left 顺序: 查看 / 分配 -->
<el-table-column label="操作" width="200" fixed="right">
<template #default="{ row }">
<el-button size="small" link type="primary" @click="openDetail(row)">查看</el-button>
<el-button size="small" link type="primary" @click="openAssign(row)">分配</el-button>
<el-button size="small" link type="primary" @click="openRate(row)">项目评价</el-button>
</template>
</el-table-column>
</el-table>
@@ -118,7 +117,7 @@
<el-descriptions-item label="可用金额">¥{{ formatMoney(detail.availableAmount) }}</el-descriptions-item>
<el-descriptions-item label="已支付劳务费">¥{{ formatMoney(detail.paidLaborAmount) }}</el-descriptions-item>
<el-descriptions-item label="已支付会务费">¥{{ formatMoney(detail.paidMeetingAmount) }}</el-descriptions-item>
<el-descriptions-item label="执行单位评价(支持方)">{{ detail.ratingScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="执行单位评价(合规)">{{ detail.managerScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="是否结题">
<el-tag :type="detail.isFinished === '1' ? 'success' : 'info'">
{{ detail.isFinished === '1' ? '已结题' : '未结题' }}
@@ -154,31 +153,7 @@
</template>
</el-dialog>
<!-- 项目评价 dialog -->
<el-dialog v-model="rateOpen" :title="rateMode==='batch' ? '批量项目评价' : '项目评价'" width="520px">
<el-form :model="rateForm" label-width="100px">
<el-form-item v-if="rateMode==='single'" label="项目编号 / 名称">
<span>{{ rateForm.projectNo }} / {{ rateForm.projectName }}</span>
</el-form-item>
<el-form-item v-else label="评价项目">
<span> {{ rateForm.projectIds.length }} 个项目</span>
</el-form-item>
<el-form-item label="评价维度">
<div class="score-row"><span style="width:90px">履约质量:</span><el-rate v-model="rateForm.q1" :max="5" /></div>
<div class="score-row"><span style="width:90px">时效响应:</span><el-rate v-model="rateForm.q2" :max="5" /></div>
<div class="score-row"><span style="width:90px">配合度:</span><el-rate v-model="rateForm.q3" :max="5" /></div>
<div class="score-row"><span style="width:90px">合规安全:</span><el-rate v-model="rateForm.q4" :max="5" /></div>
</el-form-item>
<el-form-item label="评价备注">
<el-input v-model="rateForm.remark" type="textarea" rows="3" placeholder="可选" />
</el-form-item>
</el-form>
<p class="dialog-hint">*评价标准与供应商系统保持一致</p>
<template #footer>
<el-button @click="rateOpen = false">取消</el-button>
<el-button type="primary" @click="submitRate">提交评价</el-button>
</template>
</el-dialog>
<!-- 项目评价 dialog 已移除: leader 不可评分 -->
</div>
</template>
@@ -205,13 +180,7 @@ const assignForm = reactive({
})
const personList = ref([])
// 评价
const rateOpen = ref(false)
const rateMode = ref('single') // 'single' | 'batch'
const rateForm = reactive({
projectId: null, projectNo: '', projectName: '',
projectIds: [], q1: 0, q2: 0, q3: 0, q4: 0, remark: ''
})
// 评价相关状态已移除: leader 不可评分
function formatMoney(v) { return Number(v || 0).toFixed(2) }
@@ -289,52 +258,7 @@ async function submitAssign() {
load()
}
// ─── 项目评价 ───────────────────────────────────────────
function openRate(row) {
rateMode.value = 'single'
Object.assign(rateForm, {
projectId: row.projectId,
projectNo: row.projectNo,
projectName: row.projectName,
projectIds: [],
q1: 0, q2: 0, q3: 0, q4: 0,
remark: ''
})
rateOpen.value = true
}
async function onBatchRate() {
if (!selected.value.length) return
rateMode.value = 'batch'
Object.assign(rateForm, {
projectId: null, projectNo: '', projectName: '',
projectIds: selected.value.map(r => r.projectId),
q1: 3, q2: 3, q3: 3, q4: 3,
remark: '批量评价'
})
rateOpen.value = true
}
async function submitRate() {
if (!rateForm.q1 && !rateForm.q2 && !rateForm.q3 && !rateForm.q4) {
ElMessage.warning('请至少完成一项评分'); return
}
const items = rateMode.value === 'single'
? [{ ...rateForm }]
: rateForm.projectIds.map(pid => ({
projectId: pid,
q1: rateForm.q1, q2: rateForm.q2,
q3: rateForm.q3, q4: rateForm.q4,
remark: rateForm.remark
}))
let ok = 0
for (const it of items) {
try { await bizAdd('projectRating', it); ok++ } catch (e) { /* 跳过失败项 */ }
}
ElMessage.success(`已提交评价 ${ok}`)
rateOpen.value = false
load()
}
// 项目评价相关函数已移除: leader 不可评分
onMounted(() => { load(); loadPersons() })
</script>