✨ 新增认证审核-司机/车辆页,审核详情按字段级 diff 对比待审值与生效值
审核对象由「司机行 / 车辆行」改为「一条认证记录」,故新增两个待审列表页
(挂在运力管理下,path /transportCapacity/cert-audit-driver|vehicle,与页面
文件名一一对应)与审核详情弹窗:
- api/transportCapacity/certification-audit.js:pending-page / detail / audit 三个接口
- utils/cert-audit.js:快照字段元数据(中文名、控件类型、分组)与两侧快照的
字段级 diff 计算。两侧字段名一致(同一套快照结构),故逐键比较;日期归一化后
判等、长期有效联动展示、未登记字段兜底进「其他字段」
- components/cert-audit-diff:当前生效值与待审提交值并排展示,差异行高亮并标注
新增 / 已修改 / 已清空,支持切换只看变更项;从未认证通过(生效快照为空)时
显示「无对比基准」,不报错
- components/cert-audit-detail:审核详情弹窗(提交信息 + diff + 审核意见),
通过 / 驳回动作。驳回原因前端先拦一道(必填且不超过 200 字),通过时不提交原因;
已终态记录不可再审
- components/cert-audit-list + 两个菜单页:分页与按展示键(司机姓名 / 车牌号)筛选,
审核链接按 cert_certification_audit_{driver,vehicle}_audit 权限点控制
检索过的现有实现:driver.vue / vehicle.vue 的列表与弹窗写法(Avue option + search、
权限点 hasPermission 写法)、image-upload-field、section-card、utils/table-menu.js。
未找到可复用的快照或 diff 实现,故新增 utils/cert-audit.js 纯函数承担比对;
两个列表页除 bizType 与权限点外完全相同,故抽出通用列表组件承接分页/搜索,
避免两页逻辑各自演化。
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<cert-audit-list
|
||||
:option="option"
|
||||
biz-type="driver"
|
||||
audit-permission-code="cert_certification_audit_driver_audit"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { option } from '@/option/transportCapacity/cert-audit-driver';
|
||||
import CertAuditList from './components/cert-audit-list/main.vue';
|
||||
|
||||
/**
|
||||
* 认证审核-司机
|
||||
*
|
||||
* 菜单挂在运力管理下(path: /transportCapacity/cert-audit-driver),
|
||||
* 列表与审核详情由通用组件承接,本页只固定认证对象类型与审核权限点。
|
||||
*/
|
||||
export default {
|
||||
name: 'CertAuditDriver',
|
||||
components: {
|
||||
CertAuditList,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
option,
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,31 @@
|
||||
<template>
|
||||
<cert-audit-list
|
||||
:option="option"
|
||||
biz-type="vehicle"
|
||||
audit-permission-code="cert_certification_audit_vehicle_audit"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { option } from '@/option/transportCapacity/cert-audit-vehicle';
|
||||
import CertAuditList from './components/cert-audit-list/main.vue';
|
||||
|
||||
/**
|
||||
* 认证审核-车辆
|
||||
*
|
||||
* 菜单挂在运力管理下(path: /transportCapacity/cert-audit-vehicle),
|
||||
* 车辆认证审核已从「车辆管理」页迁到本页:审核对象由「车辆行」改为「认证记录」,
|
||||
* 生效值与待审值分离后,原「看当前值直接通过/驳回」的模型不再成立。
|
||||
*/
|
||||
export default {
|
||||
name: 'CertAuditVehicle',
|
||||
components: {
|
||||
CertAuditList,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
option,
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,279 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
:title="dialogTitle"
|
||||
width="92%"
|
||||
top="4vh"
|
||||
append-to-body
|
||||
class="cert-audit-detail-dialog"
|
||||
@closed="handleClosed"
|
||||
>
|
||||
<div v-loading="loading" class="cert-audit-detail">
|
||||
<el-alert
|
||||
v-if="loadFailed"
|
||||
type="error"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="认证记录详情加载失败,请刷新后重试"
|
||||
class="cert-audit-detail__notice"
|
||||
/>
|
||||
|
||||
<section-card title="提交信息">
|
||||
<el-descriptions :column="3" border size="small">
|
||||
<el-descriptions-item label="认证对象">
|
||||
{{ detail.bizKey || '-' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="审核状态">
|
||||
<el-tag :type="statusTag.type" size="small">
|
||||
{{ detail.statusText || statusTag.label }}
|
||||
</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="该对象当前是否已认证">
|
||||
<el-tag :type="detail.certified ? 'success' : 'info'" size="small">
|
||||
{{ detail.certified ? '已认证' : '未认证' }}
|
||||
</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="提交人">
|
||||
{{ detail.submitUserName || '-' }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="提交时间">
|
||||
{{ formatCertDateTime(detail.submitTime) }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="认证类型">
|
||||
{{ bizTypeLabel }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</section-card>
|
||||
|
||||
<section-card v-if="!loading && !loadFailed" title="待审内容 vs 当前生效值">
|
||||
<cert-audit-diff
|
||||
:key="diffKey"
|
||||
:biz-type="bizType"
|
||||
:pending-json="detail.pendingSnapshotJson"
|
||||
:effective-json="detail.effectiveSnapshotJson"
|
||||
/>
|
||||
</section-card>
|
||||
|
||||
<section-card title="审核意见">
|
||||
<el-form label-position="right" label-width="90px" class="cert-audit-detail__form">
|
||||
<el-form-item label="驳回原因">
|
||||
<el-input
|
||||
v-model="rejectReason"
|
||||
type="textarea"
|
||||
:rows="3"
|
||||
maxlength="200"
|
||||
show-word-limit
|
||||
:disabled="!auditable"
|
||||
placeholder="驳回时必填,不超过 200 字;通过时无需填写"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</section-card>
|
||||
</div>
|
||||
|
||||
<template #footer>
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button
|
||||
type="danger"
|
||||
:disabled="!auditable || loadFailed"
|
||||
:loading="rejectLoading"
|
||||
@click="handleReject"
|
||||
>
|
||||
驳回
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
:disabled="!auditable || loadFailed"
|
||||
:loading="approveLoading"
|
||||
@click="handleApprove"
|
||||
>
|
||||
通过
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAuditDetail, auditCertification } from '@/api/transportCapacity/certification-audit';
|
||||
import { CERT_RECORD_STATUS, certStatusTag, formatCertDateTime } from '@/utils/cert-audit';
|
||||
import CertAuditDiff from '../cert-audit-diff/main.vue';
|
||||
|
||||
export default {
|
||||
name: 'CertAuditDetail',
|
||||
components: {
|
||||
CertAuditDiff,
|
||||
},
|
||||
props: {
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
// 认证记录主键
|
||||
recordId: {
|
||||
type: [String, Number],
|
||||
default: '',
|
||||
},
|
||||
// 认证对象类型:driver / vehicle
|
||||
bizType: {
|
||||
type: String,
|
||||
default: 'driver',
|
||||
},
|
||||
},
|
||||
emits: ['update:modelValue', 'success'],
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
loadFailed: false,
|
||||
detail: {},
|
||||
rejectReason: '',
|
||||
approveLoading: false,
|
||||
rejectLoading: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
visible: {
|
||||
get() {
|
||||
return this.modelValue;
|
||||
},
|
||||
set(value) {
|
||||
this.$emit('update:modelValue', value);
|
||||
},
|
||||
},
|
||||
bizTypeLabel() {
|
||||
return this.bizType === 'vehicle' ? '车辆认证' : '司机认证';
|
||||
},
|
||||
dialogTitle() {
|
||||
const bizKey = this.detail.bizKey ? `:${this.detail.bizKey}` : '';
|
||||
return `${this.bizTypeLabel}审核${bizKey}`;
|
||||
},
|
||||
statusTag() {
|
||||
return certStatusTag(this.detail.status);
|
||||
},
|
||||
// 只有「审核中」的记录可审;已通过/已驳回/已作废都是终态
|
||||
auditable() {
|
||||
return String(this.detail.status) === String(CERT_RECORD_STATUS.PENDING);
|
||||
},
|
||||
diffKey() {
|
||||
return `${this.detail.id || this.recordId || ''}-${this.detail.submitTime || ''}`;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
modelValue(value) {
|
||||
if (value) {
|
||||
this.resetState();
|
||||
this.loadDetail();
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
formatCertDateTime,
|
||||
resetState() {
|
||||
this.detail = {};
|
||||
this.rejectReason = '';
|
||||
this.loadFailed = false;
|
||||
this.approveLoading = false;
|
||||
this.rejectLoading = false;
|
||||
},
|
||||
loadDetail() {
|
||||
if (!this.recordId) {
|
||||
this.loadFailed = true;
|
||||
return;
|
||||
}
|
||||
this.loading = true;
|
||||
getAuditDetail(this.recordId)
|
||||
.then(res => {
|
||||
this.detail = res.data.data || {};
|
||||
this.loadFailed = false;
|
||||
})
|
||||
.catch(() => {
|
||||
this.detail = {};
|
||||
this.loadFailed = true;
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
handleClosed() {
|
||||
this.resetState();
|
||||
},
|
||||
// 通过:只提交是否通过,不带驳回原因
|
||||
handleApprove() {
|
||||
const bizKey = this.detail.bizKey || '该认证对象';
|
||||
this.$confirm(`通过后本次提交将立即成为「${bizKey}」的当前生效值,是否确认通过?`, {
|
||||
confirmButtonText: '确认通过',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
})
|
||||
.then(() => {
|
||||
this.approveLoading = true;
|
||||
return auditCertification(this.detail.id, true);
|
||||
})
|
||||
.then(() => {
|
||||
this.$message.success('认证已通过');
|
||||
this.visible = false;
|
||||
this.$emit('success');
|
||||
})
|
||||
.catch(() => {})
|
||||
.finally(() => {
|
||||
this.approveLoading = false;
|
||||
});
|
||||
},
|
||||
// 驳回:原因必填且不超过 200 字,前端先拦一道
|
||||
handleReject() {
|
||||
const rejectReason = String(this.rejectReason || '').trim();
|
||||
if (!rejectReason) {
|
||||
this.$message.warning('请输入驳回原因');
|
||||
return;
|
||||
}
|
||||
if (rejectReason.length > 200) {
|
||||
this.$message.warning('驳回原因不能超过 200 字');
|
||||
return;
|
||||
}
|
||||
const bizKey = this.detail.bizKey || '该认证对象';
|
||||
this.$confirm(
|
||||
`驳回后本次提交的内容不会生效,「${bizKey}」的当前生效值保持不变,是否确认驳回?`,
|
||||
{
|
||||
confirmButtonText: '确认驳回',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}
|
||||
)
|
||||
.then(() => {
|
||||
this.rejectLoading = true;
|
||||
return auditCertification(this.detail.id, false, rejectReason);
|
||||
})
|
||||
.then(() => {
|
||||
this.$message.success('认证已驳回');
|
||||
this.visible = false;
|
||||
this.$emit('success');
|
||||
})
|
||||
.catch(() => {})
|
||||
.finally(() => {
|
||||
this.rejectLoading = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.cert-audit-detail {
|
||||
&__notice {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
:deep(.section-card) {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
:deep(.el-descriptions__label) {
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
&__form {
|
||||
:deep(.el-form-item) {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,246 @@
|
||||
<template>
|
||||
<div class="cert-audit-diff">
|
||||
<el-alert
|
||||
v-if="diff.effectiveInvalid"
|
||||
type="error"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="当前生效快照内容无法解析,本次不展示对比结果"
|
||||
class="cert-audit-diff__notice"
|
||||
/>
|
||||
<el-alert
|
||||
v-else-if="!diff.hasBaseline"
|
||||
type="warning"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="该认证对象从未审核通过,没有生效快照可对比(无对比基准)"
|
||||
class="cert-audit-diff__notice"
|
||||
>
|
||||
下方为本次提交的全部内容,审核通过后即成为该对象的当前生效值。
|
||||
</el-alert>
|
||||
<el-alert
|
||||
v-else-if="diff.changedCount === 0"
|
||||
type="success"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="本次提交内容与当前生效值完全一致,没有任何字段发生变化"
|
||||
class="cert-audit-diff__notice"
|
||||
/>
|
||||
<el-alert
|
||||
v-else
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
:title="`共 ${diff.changedCount} / ${diff.totalCount} 项内容与当前生效值不同,已在下方高亮标记`"
|
||||
class="cert-audit-diff__notice"
|
||||
/>
|
||||
|
||||
<div class="cert-audit-diff__toolbar">
|
||||
<el-switch
|
||||
v-model="onlyChanged"
|
||||
:disabled="!diff.hasBaseline"
|
||||
active-text="仅看变更项"
|
||||
inactive-text="展示全部"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<section-card
|
||||
v-for="group in visibleGroups"
|
||||
:key="group.title"
|
||||
:title="group.title"
|
||||
class="cert-audit-diff__group"
|
||||
>
|
||||
<template #extra>
|
||||
<span v-if="diff.hasBaseline" class="cert-audit-diff__extra">
|
||||
变更 {{ group.changedCount }} 项
|
||||
</span>
|
||||
</template>
|
||||
<el-table
|
||||
:data="group.rows"
|
||||
border
|
||||
size="small"
|
||||
:row-class-name="rowClassName"
|
||||
class="cert-audit-diff__table"
|
||||
>
|
||||
<el-table-column label="字段" prop="label" width="190" />
|
||||
<el-table-column :label="effectiveColumnLabel" min-width="240">
|
||||
<template #default="{ row }">
|
||||
<el-image
|
||||
v-if="diff.hasBaseline && row.type === 'image' && row.effective.raw"
|
||||
:src="row.effective.raw"
|
||||
:preview-src-list="[row.effective.raw]"
|
||||
preview-teleported
|
||||
:z-index="3000"
|
||||
fit="contain"
|
||||
class="cert-audit-diff__image"
|
||||
/>
|
||||
<span
|
||||
v-else-if="diff.hasBaseline && row.type !== 'image'"
|
||||
class="cert-audit-diff__value"
|
||||
>
|
||||
{{ row.effective.text }}
|
||||
</span>
|
||||
<span v-else class="cert-audit-diff__absent">—</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="待审提交值" min-width="240">
|
||||
<template #default="{ row }">
|
||||
<el-image
|
||||
v-if="row.type === 'image' && row.pending.raw"
|
||||
:src="row.pending.raw"
|
||||
:preview-src-list="[row.pending.raw]"
|
||||
preview-teleported
|
||||
:z-index="3000"
|
||||
fit="contain"
|
||||
class="cert-audit-diff__image"
|
||||
/>
|
||||
<span v-else-if="row.type === 'image'" class="cert-audit-diff__absent">—</span>
|
||||
<span
|
||||
v-else
|
||||
class="cert-audit-diff__value"
|
||||
:class="{ 'cert-audit-diff__value--changed': row.changed }"
|
||||
>
|
||||
{{ row.pending.text }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="差异" width="96" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.changeType" :type="changeTag(row.changeType).type" size="small">
|
||||
{{ changeTag(row.changeType).label }}
|
||||
</el-tag>
|
||||
<span v-else class="cert-audit-diff__absent">—</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</section-card>
|
||||
|
||||
<el-empty v-if="!visibleGroups.length" :description="emptyText" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { buildSnapshotDiff, CERT_CHANGE_TAG } from '@/utils/cert-audit';
|
||||
|
||||
export default {
|
||||
name: 'CertAuditDiff',
|
||||
props: {
|
||||
// 认证对象类型:driver / vehicle
|
||||
bizType: {
|
||||
type: String,
|
||||
default: 'driver',
|
||||
},
|
||||
// 本次待审快照 JSON
|
||||
pendingJson: {
|
||||
type: [String, Object],
|
||||
default: '',
|
||||
},
|
||||
// 该对象当前生效快照 JSON,从未认证通过时为空
|
||||
effectiveJson: {
|
||||
type: [String, Object],
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 默认并排展示两侧全部字段(差异行高亮),审核员可切换为只看变更项
|
||||
onlyChanged: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
diff() {
|
||||
return buildSnapshotDiff(this.bizType, this.pendingJson, this.effectiveJson);
|
||||
},
|
||||
visibleGroups() {
|
||||
// 无对比基准时不存在「变更项」,强制展示全部内容
|
||||
const onlyChanged = this.onlyChanged && this.diff.hasBaseline;
|
||||
return this.diff.groups
|
||||
.map(group => ({
|
||||
...group,
|
||||
rows: onlyChanged ? group.rows.filter(row => row.changed) : group.rows,
|
||||
}))
|
||||
.filter(group => group.rows.length);
|
||||
},
|
||||
emptyText() {
|
||||
if (this.diff.hasBaseline && this.onlyChanged && this.diff.changedCount === 0) {
|
||||
return '本次提交与当前生效值完全一致,切换为「展示全部」可查看明细';
|
||||
}
|
||||
return '本次提交没有可对比的内容';
|
||||
},
|
||||
// 无对比基准时在列头直接写明,避免逐行重复「无对比基准」
|
||||
effectiveColumnLabel() {
|
||||
return this.diff.hasBaseline ? '当前生效值' : '当前生效值(无对比基准)';
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
pendingJson() {
|
||||
this.onlyChanged = false;
|
||||
},
|
||||
effectiveJson() {
|
||||
this.onlyChanged = false;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
changeTag(changeType) {
|
||||
return CERT_CHANGE_TAG[changeType] || { label: changeType, type: 'info' };
|
||||
},
|
||||
rowClassName({ row }) {
|
||||
return row.changed ? 'cert-audit-diff__row--changed' : '';
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.cert-audit-diff {
|
||||
&__notice {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
&__toolbar {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
padding: 0 0 8px;
|
||||
}
|
||||
|
||||
&__group {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
&__extra {
|
||||
color: #909399;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
&__value {
|
||||
word-break: break-all;
|
||||
|
||||
&--changed {
|
||||
color: #e6a23c;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
|
||||
&__absent {
|
||||
color: #c0c4cc;
|
||||
}
|
||||
|
||||
&__image {
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
border: 1px solid #eff1f7;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&__table {
|
||||
:deep(.el-table__row.cert-audit-diff__row--changed) {
|
||||
background-color: #fdf6ec;
|
||||
}
|
||||
|
||||
:deep(.el-table__row.cert-audit-diff__row--changed td.el-table__cell) {
|
||||
background-color: #fdf6ec;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,144 @@
|
||||
<template>
|
||||
<basic-container class="cert-audit-list-page">
|
||||
<avue-crud
|
||||
:option="option"
|
||||
:table-loading="loading"
|
||||
:data="data"
|
||||
v-model:page="page"
|
||||
ref="crud"
|
||||
@search-change="searchChange"
|
||||
@search-reset="searchReset"
|
||||
@current-change="currentChange"
|
||||
@size-change="sizeChange"
|
||||
@refresh-change="refreshChange"
|
||||
@on-load="onLoad"
|
||||
>
|
||||
<template #statusText="{ row }">
|
||||
<el-tag :type="certStatusTag(row.status).type" class="status-text">
|
||||
{{ row.statusText || certStatusTag(row.status).label }}
|
||||
</el-tag>
|
||||
</template>
|
||||
<template #submitTime="{ row }">
|
||||
{{ formatCertDateTime(row.submitTime) }}
|
||||
</template>
|
||||
<template #menu="{ row }">
|
||||
<el-link type="primary" v-if="canAudit" @click="openDetail(row)">审核</el-link>
|
||||
</template>
|
||||
</avue-crud>
|
||||
|
||||
<cert-audit-detail
|
||||
v-model="detailVisible"
|
||||
:record-id="detailRecordId"
|
||||
:biz-type="bizType"
|
||||
@success="handleAuditSuccess"
|
||||
/>
|
||||
</basic-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapGetters } from 'vuex';
|
||||
import { getPendingPage } from '@/api/transportCapacity/certification-audit';
|
||||
import { certStatusTag, formatCertDateTime } from '@/utils/cert-audit';
|
||||
import { isAdministrator } from '@/utils/auth';
|
||||
import CertAuditDetail from '../cert-audit-detail/main.vue';
|
||||
|
||||
/**
|
||||
* 认证待审列表(司机 / 车辆共用)
|
||||
*
|
||||
* 审核对象是「一条认证记录」,只有审核中的记录会出现在这里;
|
||||
* 列表只负责挑选记录,具体改了什么由审核详情弹窗做字段级对比。
|
||||
*/
|
||||
export default {
|
||||
name: 'CertAuditList',
|
||||
components: {
|
||||
CertAuditDetail,
|
||||
},
|
||||
props: {
|
||||
// Avue 列表配置,按认证对象类型分别放在 src/option/transportCapacity/ 下
|
||||
option: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
// 认证对象类型:driver / vehicle,由列表页固定传入
|
||||
bizType: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
// 审核动作权限点,如 cert_certification_audit_driver_audit
|
||||
auditPermissionCode: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
data: [],
|
||||
query: {},
|
||||
page: {
|
||||
pageSize: 10,
|
||||
currentPage: 1,
|
||||
total: 0,
|
||||
},
|
||||
detailVisible: false,
|
||||
detailRecordId: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['permission', 'userInfo']),
|
||||
isAdmin() {
|
||||
return isAdministrator(this.userInfo);
|
||||
},
|
||||
canAudit() {
|
||||
return this.isAdmin || this.permission?.[this.auditPermissionCode] === true;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
certStatusTag,
|
||||
formatCertDateTime,
|
||||
onLoad(page, params = {}) {
|
||||
this.loading = true;
|
||||
getPendingPage(this.bizType, page.currentPage, page.pageSize, {
|
||||
...this.query,
|
||||
...params,
|
||||
})
|
||||
.then(res => {
|
||||
const data = res.data.data || {};
|
||||
this.page.total = data.total || 0;
|
||||
this.data = data.records || [];
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
searchChange(params, done) {
|
||||
this.query = params;
|
||||
this.page.currentPage = 1;
|
||||
this.onLoad(this.page, params);
|
||||
done();
|
||||
},
|
||||
searchReset() {
|
||||
this.query = {};
|
||||
this.page.currentPage = 1;
|
||||
this.onLoad(this.page);
|
||||
},
|
||||
currentChange(currentPage) {
|
||||
this.page.currentPage = currentPage;
|
||||
},
|
||||
sizeChange(pageSize) {
|
||||
this.page.pageSize = pageSize;
|
||||
},
|
||||
refreshChange() {
|
||||
this.onLoad(this.page, this.query);
|
||||
},
|
||||
openDetail(row) {
|
||||
this.detailRecordId = row.id;
|
||||
this.detailVisible = true;
|
||||
},
|
||||
// 审核后该记录已是终态,重新拉取待审列表
|
||||
handleAuditSuccess() {
|
||||
this.onLoad(this.page, this.query);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
Reference in New Issue
Block a user