Compare commits
3 Commits
e803102263
...
6432325387
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6432325387 | ||
|
|
9e821e1bd2 | ||
|
|
728ff095cb |
@ -52,6 +52,8 @@ export default {
|
|||||||
getInvoiceById: (params = {}) => request.get(`/transactions/receipts/${params.id}`, { params }),
|
getInvoiceById: (params = {}) => request.get(`/transactions/receipts/${params.id}`, { params }),
|
||||||
// 后端接口要求请求体包裹在 data 字段下
|
// 后端接口要求请求体包裹在 data 字段下
|
||||||
sendInvoice: (data = {}) => request.post('/transactions/send-email', { data }),
|
sendInvoice: (data = {}) => request.post('/transactions/send-email', { data }),
|
||||||
|
// invoice headers
|
||||||
|
getInvoiceHeaders: (params = {}) => request.get('/invoice/list', { params }),
|
||||||
// valuation (估值评估)
|
// valuation (估值评估)
|
||||||
getValuationList: (params = {}) => request.get('/valuations/', { params }),
|
getValuationList: (params = {}) => request.get('/valuations/', { params }),
|
||||||
getValuationById: (params = {}) => request.get(`/valuations/${params.valuation_id || params.id}`),
|
getValuationById: (params = {}) => request.get(`/valuations/${params.valuation_id || params.id}`),
|
||||||
|
|||||||
@ -45,11 +45,20 @@ watch(() => props.userData, (newData) => {
|
|||||||
|
|
||||||
// 保存设置
|
// 保存设置
|
||||||
function handleSave() {
|
function handleSave() {
|
||||||
|
const oldVal = currentRemaining.value
|
||||||
|
const newVal = Number(limitForm.value.targetCount || 0)
|
||||||
|
const changeStr = `(${oldVal} > ${newVal})`
|
||||||
|
const separator = ' || '
|
||||||
|
|
||||||
|
const finalRemark = limitForm.value.remark
|
||||||
|
? `${limitForm.value.remark}${separator}${changeStr}`
|
||||||
|
: changeStr
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
user_id: props.userData.id,
|
user_id: props.userData.id,
|
||||||
target_count: Number(limitForm.value.targetCount || 0),
|
target_count: newVal,
|
||||||
op_type: limitForm.value.quotaType,
|
op_type: limitForm.value.quotaType,
|
||||||
remark: limitForm.value.remark
|
remark: finalRemark
|
||||||
}
|
}
|
||||||
emit('save', data)
|
emit('save', data)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,39 +1,44 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed, ref, watch, h } from 'vue'
|
import { computed, ref, watch, h } from 'vue'
|
||||||
import { NModal, NButton, NTabs, NTabPane, NDataTable, NSpin } from 'naive-ui'
|
import { NModal, NButton, NTabs, NTabPane, NDataTable, NSpin, useMessage } from 'naive-ui'
|
||||||
import { formatDate } from '@/utils'
|
import { formatDate } from '@/utils'
|
||||||
|
import api from '@/api'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
visible: {
|
visible: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
data: {
|
userId: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
baseInfo: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => ({}),
|
default: () => ({}),
|
||||||
},
|
},
|
||||||
loading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['update:visible'])
|
const emit = defineEmits(['update:visible'])
|
||||||
|
|
||||||
|
const message = useMessage()
|
||||||
const activeTab = ref('basic')
|
const activeTab = ref('basic')
|
||||||
|
const invoiceLoading = ref(false)
|
||||||
|
const logLoading = ref(false)
|
||||||
|
const invoiceList = ref([])
|
||||||
|
const logList = ref([])
|
||||||
|
|
||||||
watch(
|
const logPagination = ref({
|
||||||
() => props.visible,
|
page: 1,
|
||||||
(show) => {
|
pageSize: 5,
|
||||||
if (!show) {
|
itemCount: 0,
|
||||||
activeTab.value = 'basic'
|
})
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const baseInfo = computed(() => props.data?.baseInfo || {})
|
const invoicePagination = ref({
|
||||||
const invoiceHeaders = computed(() => props.data?.invoiceHeaders || [])
|
page: 1,
|
||||||
const operationLogs = computed(() => props.data?.operationLogs || [])
|
pageSize: 5,
|
||||||
|
itemCount: 0,
|
||||||
|
})
|
||||||
|
|
||||||
const invoiceColumns = [
|
const invoiceColumns = [
|
||||||
{ title: '公司名称', key: 'company_name', ellipsis: { tooltip: true } },
|
{ title: '公司名称', key: 'company_name', ellipsis: { tooltip: true } },
|
||||||
@ -55,9 +60,111 @@ const logColumns = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ title: '操作人', key: 'operator_name', width: 120 },
|
{ title: '操作人', key: 'operator_name', width: 120 },
|
||||||
{ title: '操作记录', key: 'operation_detail', ellipsis: { tooltip: true } },
|
{
|
||||||
|
title: '操作记录',
|
||||||
|
key: 'remark',
|
||||||
|
render(row) {
|
||||||
|
const fullRemark = row.remark || ''
|
||||||
|
const separator = ' || '
|
||||||
|
let remark = '-'
|
||||||
|
let countChange = '-'
|
||||||
|
|
||||||
|
if (fullRemark.includes(separator)) {
|
||||||
|
const parts = fullRemark.split(separator)
|
||||||
|
remark = parts[0]
|
||||||
|
countChange = parts[1]
|
||||||
|
} else if (fullRemark.match(/^\(\d+\s*>\s*\d+\)$/)) {
|
||||||
|
countChange = fullRemark
|
||||||
|
remark = '-'
|
||||||
|
} else {
|
||||||
|
remark = fullRemark
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format count change: (0 > 1) => 0 -> 1
|
||||||
|
if (countChange !== '-') {
|
||||||
|
countChange = countChange.replace(/[()]/g, '').replace('>', '->')
|
||||||
|
}
|
||||||
|
|
||||||
|
return h('div', { style: 'line-height: 1.6;' }, [
|
||||||
|
h('div', `剩余估值次数:${countChange}`),
|
||||||
|
h('div', `类型:${row.op_type || '-'}`),
|
||||||
|
h('div', `备注:${remark}`)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// Reset state when modal opens or user changes
|
||||||
|
watch(
|
||||||
|
() => props.visible,
|
||||||
|
(show) => {
|
||||||
|
if (show) {
|
||||||
|
activeTab.value = 'basic'
|
||||||
|
// Reset lists but don't clear immediately to avoid flicker if same user?
|
||||||
|
// Actually safe to clear or just let the tab watcher handle it.
|
||||||
|
// If we want to force refresh on re-open:
|
||||||
|
invoiceList.value = []
|
||||||
|
logList.value = []
|
||||||
|
logPagination.value.page = 1
|
||||||
|
invoicePagination.value.page = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
watch(activeTab, (tab) => {
|
||||||
|
if (!props.userId) return
|
||||||
|
|
||||||
|
if (tab === 'invoice' && invoiceList.value.length === 0) {
|
||||||
|
fetchInvoices()
|
||||||
|
} else if (tab === 'logs' && logList.value.length === 0) {
|
||||||
|
fetchLogs()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
async function fetchInvoices() {
|
||||||
|
invoiceLoading.value = true
|
||||||
|
try {
|
||||||
|
const { data = [], total = 0 } = await api.getInvoiceHeaders({
|
||||||
|
user_id: props.baseInfo.id,
|
||||||
|
page: invoicePagination.value.page,
|
||||||
|
page_size: invoicePagination.value.pageSize
|
||||||
|
})
|
||||||
|
invoiceList.value = data
|
||||||
|
invoicePagination.value.itemCount = total
|
||||||
|
} catch (error) {
|
||||||
|
message.error(error?.message || '获取发票抬头失败')
|
||||||
|
} finally {
|
||||||
|
invoiceLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleInvoicePageChange(page) {
|
||||||
|
invoicePagination.value.page = page
|
||||||
|
fetchInvoices()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fetchLogs() {
|
||||||
|
logLoading.value = true
|
||||||
|
try {
|
||||||
|
const { data: logs = [], total = 0 } = await api.getAppUserQuotaLogs({
|
||||||
|
user_id: props.userId,
|
||||||
|
page: logPagination.value.page,
|
||||||
|
page_size: logPagination.value.pageSize,
|
||||||
|
})
|
||||||
|
logList.value = logs
|
||||||
|
logPagination.value.itemCount = total
|
||||||
|
} catch (error) {
|
||||||
|
message.error(error?.message || '获取操作记录失败')
|
||||||
|
} finally {
|
||||||
|
logLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleLogPageChange(page) {
|
||||||
|
logPagination.value.page = page
|
||||||
|
fetchLogs()
|
||||||
|
}
|
||||||
|
|
||||||
function handleClose() {
|
function handleClose() {
|
||||||
emit('update:visible', false)
|
emit('update:visible', false)
|
||||||
}
|
}
|
||||||
@ -74,7 +181,6 @@ function handleClose() {
|
|||||||
:mask-closable="false"
|
:mask-closable="false"
|
||||||
@update:show="$emit('update:visible', $event)"
|
@update:show="$emit('update:visible', $event)"
|
||||||
>
|
>
|
||||||
<NSpin :show="loading">
|
|
||||||
<div class="user-detail-modal">
|
<div class="user-detail-modal">
|
||||||
<NTabs v-model:value="activeTab" type="card" size="large" class="detail-tabs">
|
<NTabs v-model:value="activeTab" type="card" size="large" class="detail-tabs">
|
||||||
<NTabPane name="basic" tab="基础信息">
|
<NTabPane name="basic" tab="基础信息">
|
||||||
@ -104,32 +210,40 @@ function handleClose() {
|
|||||||
</div>
|
</div>
|
||||||
</NTabPane>
|
</NTabPane>
|
||||||
<NTabPane name="invoice" tab="发票抬头">
|
<NTabPane name="invoice" tab="发票抬头">
|
||||||
|
<NSpin :show="invoiceLoading">
|
||||||
<NDataTable
|
<NDataTable
|
||||||
class="section-table"
|
class="section-table"
|
||||||
:columns="invoiceColumns"
|
:columns="invoiceColumns"
|
||||||
:data="invoiceHeaders"
|
:data="invoiceList"
|
||||||
:pagination="false"
|
:pagination="invoicePagination"
|
||||||
|
:remote="true"
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
:single-line="false"
|
:single-line="false"
|
||||||
|
@update:page="handleInvoicePageChange"
|
||||||
>
|
>
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<div class="empty">暂无发票抬头信息</div>
|
<div class="empty">暂无发票抬头信息</div>
|
||||||
</template>
|
</template>
|
||||||
</NDataTable>
|
</NDataTable>
|
||||||
|
</NSpin>
|
||||||
</NTabPane>
|
</NTabPane>
|
||||||
<NTabPane name="logs" tab="操作记录">
|
<NTabPane name="logs" tab="操作记录">
|
||||||
|
<NSpin :show="logLoading">
|
||||||
<NDataTable
|
<NDataTable
|
||||||
class="section-table"
|
class="section-table"
|
||||||
:columns="logColumns"
|
:columns="logColumns"
|
||||||
:data="operationLogs"
|
:data="logList"
|
||||||
:pagination="false"
|
:pagination="logPagination"
|
||||||
|
:remote="true"
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
:single-line="false"
|
:single-line="false"
|
||||||
|
@update:page="handleLogPageChange"
|
||||||
>
|
>
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<div class="empty">暂无操作记录</div>
|
<div class="empty">暂无操作记录</div>
|
||||||
</template>
|
</template>
|
||||||
</NDataTable>
|
</NDataTable>
|
||||||
|
</NSpin>
|
||||||
</NTabPane>
|
</NTabPane>
|
||||||
</NTabs>
|
</NTabs>
|
||||||
|
|
||||||
@ -138,7 +252,6 @@ function handleClose() {
|
|||||||
<NButton type="primary" @click="handleClose">确定</NButton>
|
<NButton type="primary" @click="handleClose">确定</NButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</NSpin>
|
|
||||||
</NModal>
|
</NModal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -71,16 +71,16 @@ const columns = [
|
|||||||
align: 'center',
|
align: 'center',
|
||||||
ellipsis: { tooltip: true },
|
ellipsis: { tooltip: true },
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
title: '微信号',
|
// title: '微信号',
|
||||||
key: 'wechat',
|
// key: 'wechat',
|
||||||
width: 140,
|
// width: 140,
|
||||||
align: 'center',
|
// align: 'center',
|
||||||
ellipsis: { tooltip: true },
|
// ellipsis: { tooltip: true },
|
||||||
render(row) {
|
// render(row) {
|
||||||
return row.wechat || '-'
|
// return row.wechat || '-'
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
title: '注册时间',
|
title: '注册时间',
|
||||||
key: 'created_at',
|
key: 'created_at',
|
||||||
@ -158,13 +158,8 @@ const columns = [
|
|||||||
// 查看用户详情
|
// 查看用户详情
|
||||||
async function handleViewDetail(row) {
|
async function handleViewDetail(row) {
|
||||||
detailModalVisible.value = true
|
detailModalVisible.value = true
|
||||||
detailLoading.value = true
|
currentUser.value = row
|
||||||
try {
|
|
||||||
const { data: logs = [] } = await api.getAppUserQuotaLogs({
|
|
||||||
user_id: row.id,
|
|
||||||
page: 1,
|
|
||||||
page_size: 50,
|
|
||||||
})
|
|
||||||
userDetail.value = {
|
userDetail.value = {
|
||||||
baseInfo: {
|
baseInfo: {
|
||||||
id: row.id,
|
id: row.id,
|
||||||
@ -174,14 +169,7 @@ async function handleViewDetail(row) {
|
|||||||
notes: row.notes,
|
notes: row.notes,
|
||||||
remaining_count: row.remaining_count,
|
remaining_count: row.remaining_count,
|
||||||
user_type: row.user_type || '-',
|
user_type: row.user_type || '-',
|
||||||
},
|
|
||||||
invoiceHeaders: [],
|
|
||||||
operationLogs: logs,
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
|
||||||
$message.error(error?.message || '获取用户详情失败')
|
|
||||||
} finally {
|
|
||||||
detailLoading.value = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,7 +244,7 @@ const validateForm = {
|
|||||||
@keypress.enter="$table?.handleSearch()"
|
@keypress.enter="$table?.handleSearch()"
|
||||||
/>
|
/>
|
||||||
</QueryBarItem>
|
</QueryBarItem>
|
||||||
<QueryBarItem label="微信号" :label-width="60">
|
<!-- <QueryBarItem label="微信号" :label-width="60">
|
||||||
<NInput
|
<NInput
|
||||||
v-model:value="queryItems.wechat"
|
v-model:value="queryItems.wechat"
|
||||||
clearable
|
clearable
|
||||||
@ -265,7 +253,7 @@ const validateForm = {
|
|||||||
style="width: 200px"
|
style="width: 200px"
|
||||||
@keypress.enter="$table?.handleSearch()"
|
@keypress.enter="$table?.handleSearch()"
|
||||||
/>
|
/>
|
||||||
</QueryBarItem>
|
</QueryBarItem> -->
|
||||||
<QueryBarItem label="ID" :label-width="60">
|
<QueryBarItem label="ID" :label-width="60">
|
||||||
<NInput
|
<NInput
|
||||||
v-model:value="queryItems.id"
|
v-model:value="queryItems.id"
|
||||||
@ -325,8 +313,8 @@ const validateForm = {
|
|||||||
<!-- 用户详情弹窗 -->
|
<!-- 用户详情弹窗 -->
|
||||||
<UserDetailModal
|
<UserDetailModal
|
||||||
v-model:visible="detailModalVisible"
|
v-model:visible="detailModalVisible"
|
||||||
:data="userDetail"
|
:user-id="currentUser?.id"
|
||||||
:loading="detailLoading"
|
:base-info="userDetail.baseInfo"
|
||||||
/>
|
/>
|
||||||
</CommonPage>
|
</CommonPage>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -195,84 +195,7 @@ const detailSections = computed(() => {
|
|||||||
|
|
||||||
const calcFlow = computed(() => props.detailData?.calculation_result?.flow || [])
|
const calcFlow = computed(() => props.detailData?.calculation_result?.flow || [])
|
||||||
|
|
||||||
// 证书相关功能
|
const mockFlowHtml = ref(`
|
||||||
const handleUploadCertificate = () => {
|
|
||||||
certificateModalMode.value = 'upload'
|
|
||||||
certificateData.value = {}
|
|
||||||
certificateModalVisible.value = true
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleViewCertificate = () => {
|
|
||||||
certificateModalMode.value = 'view'
|
|
||||||
// 这里可以从 props.detailData 中获取已上传的证书数据
|
|
||||||
certificateData.value = {
|
|
||||||
title: '非遗传承人等级证书',
|
|
||||||
description: '非遗传承人等级证书相关文件',
|
|
||||||
files: props.detailData?.certificates || []
|
|
||||||
}
|
|
||||||
certificateModalVisible.value = true
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleCertificateConfirm = (data) => {
|
|
||||||
console.log('证书数据:', data)
|
|
||||||
// 这里可以调用 API 保存证书数据
|
|
||||||
$message?.success('证书上传成功')
|
|
||||||
certificateModalVisible.value = false
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="audit-detail">
|
|
||||||
<div class="detail-header">
|
|
||||||
<div>
|
|
||||||
<button type="button" class="back-btn" @click="emit('back')">
|
|
||||||
<TheIcon icon="mdi:arrow-left" :size="16" class="mr-4" />
|
|
||||||
返回审核列表
|
|
||||||
</button>
|
|
||||||
<!-- <div class="detail-title">
|
|
||||||
<h2>{{ detailData?.asset_name || '审核详情' }}</h2>
|
|
||||||
<NTag size="small" :type="getStatusConfig(detailData?.status).type">
|
|
||||||
{{ getStatusConfig(detailData?.status).text }}
|
|
||||||
</NTag>
|
|
||||||
</div>
|
|
||||||
<p class="detail-meta">
|
|
||||||
<span>手机号:{{ detailData?.phone || '-' }}</span>
|
|
||||||
<span>微信号:{{ detailData?.wechat || '-' }}</span>
|
|
||||||
<span>提交时间:{{ formatDate(detailData?.created_at) }}</span>
|
|
||||||
<span>审核时间:{{ detailData?.reviewed_at ? formatDate(detailData?.reviewed_at) : '-' }}</span>
|
|
||||||
</p> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<NTabs
|
|
||||||
v-model:value="activeDetailTab"
|
|
||||||
type="line"
|
|
||||||
size="large"
|
|
||||||
class="audit-tabs"
|
|
||||||
>
|
|
||||||
<NTabPane name="audit" tab="审核信息">
|
|
||||||
<NSpin :show="loading">
|
|
||||||
<div v-for="section in detailSections" :key="section.key" class="detail-section">
|
|
||||||
<div class="section-title">
|
|
||||||
<span class="dot" />
|
|
||||||
<span>{{ section.title }}</span>
|
|
||||||
</div>
|
|
||||||
<NDataTable
|
|
||||||
:columns="section.columns"
|
|
||||||
:data="section.data"
|
|
||||||
:bordered="true"
|
|
||||||
:single-line="false"
|
|
||||||
:scroll-x="section.fields.length * 200 + 120"
|
|
||||||
>
|
|
||||||
<template #empty>
|
|
||||||
<span>暂无数据</span>
|
|
||||||
</template>
|
|
||||||
</NDataTable>
|
|
||||||
</div>
|
|
||||||
</NSpin>
|
|
||||||
</NTabPane>
|
|
||||||
<NTabPane name="flow" tab="计算流程">
|
|
||||||
<NSpin :show="loading">
|
|
||||||
<div class="calc-flow-container">
|
<div class="calc-flow-container">
|
||||||
<!-- 左侧:详细计算流程 -->
|
<!-- 左侧:详细计算流程 -->
|
||||||
<div class="calc-flow-left">
|
<div class="calc-flow-left">
|
||||||
@ -369,6 +292,88 @@ const handleCertificateConfirm = (data) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
`)
|
||||||
|
|
||||||
|
|
||||||
|
// 证书相关功能
|
||||||
|
const handleUploadCertificate = () => {
|
||||||
|
certificateModalMode.value = 'upload'
|
||||||
|
certificateData.value = {}
|
||||||
|
certificateModalVisible.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleViewCertificate = () => {
|
||||||
|
certificateModalMode.value = 'view'
|
||||||
|
// 这里可以从 props.detailData 中获取已上传的证书数据
|
||||||
|
certificateData.value = {
|
||||||
|
title: '非遗传承人等级证书',
|
||||||
|
description: '非遗传承人等级证书相关文件',
|
||||||
|
files: props.detailData?.certificates || []
|
||||||
|
}
|
||||||
|
certificateModalVisible.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleCertificateConfirm = (data) => {
|
||||||
|
console.log('证书数据:', data)
|
||||||
|
// 这里可以调用 API 保存证书数据
|
||||||
|
$message?.success('证书上传成功')
|
||||||
|
certificateModalVisible.value = false
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="audit-detail">
|
||||||
|
<div class="detail-header">
|
||||||
|
<div>
|
||||||
|
<button type="button" class="back-btn" @click="emit('back')">
|
||||||
|
<TheIcon icon="mdi:arrow-left" :size="16" class="mr-4" />
|
||||||
|
返回审核列表
|
||||||
|
</button>
|
||||||
|
<!-- <div class="detail-title">
|
||||||
|
<h2>{{ detailData?.asset_name || '审核详情' }}</h2>
|
||||||
|
<NTag size="small" :type="getStatusConfig(detailData?.status).type">
|
||||||
|
{{ getStatusConfig(detailData?.status).text }}
|
||||||
|
</NTag>
|
||||||
|
</div>
|
||||||
|
<p class="detail-meta">
|
||||||
|
<span>手机号:{{ detailData?.phone || '-' }}</span>
|
||||||
|
<span>微信号:{{ detailData?.wechat || '-' }}</span>
|
||||||
|
<span>提交时间:{{ formatDate(detailData?.created_at) }}</span>
|
||||||
|
<span>审核时间:{{ detailData?.reviewed_at ? formatDate(detailData?.reviewed_at) : '-' }}</span>
|
||||||
|
</p> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<NTabs
|
||||||
|
v-model:value="activeDetailTab"
|
||||||
|
type="line"
|
||||||
|
size="large"
|
||||||
|
class="audit-tabs"
|
||||||
|
>
|
||||||
|
<NTabPane name="audit" tab="审核信息">
|
||||||
|
<NSpin :show="loading">
|
||||||
|
<div v-for="section in detailSections" :key="section.key" class="detail-section">
|
||||||
|
<div class="section-title">
|
||||||
|
<span class="dot" />
|
||||||
|
<span>{{ section.title }}</span>
|
||||||
|
</div>
|
||||||
|
<NDataTable
|
||||||
|
:columns="section.columns"
|
||||||
|
:data="section.data"
|
||||||
|
:bordered="true"
|
||||||
|
:single-line="false"
|
||||||
|
:scroll-x="section.fields.length * 200 + 120"
|
||||||
|
>
|
||||||
|
<template #empty>
|
||||||
|
<span>暂无数据</span>
|
||||||
|
</template>
|
||||||
|
</NDataTable>
|
||||||
|
</div>
|
||||||
|
</NSpin>
|
||||||
|
</NTabPane>
|
||||||
|
<NTabPane name="flow" tab="计算流程">
|
||||||
|
<NSpin :show="loading">
|
||||||
|
<div v-html="mockFlowHtml"></div>
|
||||||
</NSpin>
|
</NSpin>
|
||||||
</NTabPane>
|
</NTabPane>
|
||||||
</NTabs>
|
</NTabs>
|
||||||
@ -532,14 +537,14 @@ const handleCertificateConfirm = (data) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 计算流程容器 */
|
/* 计算流程容器 */
|
||||||
.calc-flow-container {
|
:deep(.calc-flow-container) {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 24px;
|
gap: 24px;
|
||||||
min-height: 600px;
|
min-height: 600px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 左侧详细流程 */
|
/* 左侧详细流程 */
|
||||||
.calc-flow-left {
|
:deep(.calc-flow-left) {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
background: #f8f9fa;
|
background: #f8f9fa;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
@ -548,7 +553,7 @@ const handleCertificateConfirm = (data) => {
|
|||||||
max-height: 800px;
|
max-height: 800px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-formula-header {
|
:deep(.calc-formula-header) {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1d2129;
|
color: #1d2129;
|
||||||
@ -557,11 +562,11 @@ const handleCertificateConfirm = (data) => {
|
|||||||
border-bottom: 2px solid #e5e7eb;
|
border-bottom: 2px solid #e5e7eb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-section {
|
:deep(.calc-section) {
|
||||||
margin-bottom: 24px;
|
margin-bottom: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-section-title {
|
:deep(.calc-section-title) {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1d2129;
|
color: #1d2129;
|
||||||
@ -569,12 +574,12 @@ const handleCertificateConfirm = (data) => {
|
|||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-subsection {
|
:deep(.calc-subsection) {
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-subsection-title {
|
:deep(.calc-subsection-title) {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #374151;
|
color: #374151;
|
||||||
@ -582,24 +587,24 @@ const handleCertificateConfirm = (data) => {
|
|||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-item {
|
:deep(.calc-item) {
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-item-label {
|
:deep(.calc-item-label) {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #4b5563;
|
color: #4b5563;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-detail {
|
:deep(.calc-detail) {
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-detail-item {
|
:deep(.calc-detail-item) {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
color: #6b7280;
|
color: #6b7280;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
@ -607,7 +612,7 @@ const handleCertificateConfirm = (data) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 右侧大纲 */
|
/* 右侧大纲 */
|
||||||
.calc-flow-right {
|
:deep(.calc-flow-right) {
|
||||||
width: 320px;
|
width: 320px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border: 1px solid #e5e7eb;
|
border: 1px solid #e5e7eb;
|
||||||
@ -617,7 +622,7 @@ const handleCertificateConfirm = (data) => {
|
|||||||
max-height: 800px;
|
max-height: 800px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-outline-title {
|
:deep(.calc-outline-title) {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1d2129;
|
color: #1d2129;
|
||||||
@ -626,41 +631,41 @@ const handleCertificateConfirm = (data) => {
|
|||||||
border-bottom: 2px solid #e5e7eb;
|
border-bottom: 2px solid #e5e7eb;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calc-outline {
|
:deep(.calc-outline) {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.outline-section {
|
:deep(.outline-section) {
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.outline-title {
|
:deep(.outline-title) {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #1d2129;
|
color: #1d2129;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.outline-subsection {
|
:deep(.outline-subsection) {
|
||||||
margin-left: 12px;
|
margin-left: 12px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.outline-subtitle {
|
:deep(.outline-subtitle) {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #374151;
|
color: #374151;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.outline-item {
|
:deep(.outline-item) {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #4b5563;
|
color: #4b5563;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
margin-left: 12px;
|
margin-left: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.outline-detail {
|
:deep(.outline-detail) {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
color: #6b7280;
|
color: #6b7280;
|
||||||
margin-left: 24px;
|
margin-left: 24px;
|
||||||
|
|||||||
@ -93,7 +93,7 @@ const columns = [
|
|||||||
// },
|
// },
|
||||||
{
|
{
|
||||||
title: '评估结果',
|
title: '评估结果',
|
||||||
key: 'valuation_result',
|
key: 'final_value_ab',
|
||||||
width: 120,
|
width: 120,
|
||||||
align: 'center',
|
align: 'center',
|
||||||
render(row) {
|
render(row) {
|
||||||
@ -112,11 +112,11 @@ const columns = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '审核时间',
|
title: '审核时间',
|
||||||
key: 'reviewed_at',
|
key: 'updated_at',
|
||||||
width: 160,
|
width: 160,
|
||||||
align: 'center',
|
align: 'center',
|
||||||
render(row) {
|
render(row) {
|
||||||
return row.reviewed_at ? formatDate(row.reviewed_at) : '-'
|
return row.updated_at ? formatDate(row.updated_at) : '-'
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user