Merge branch 'main' of https://git.1024tool.vip/zfc/guzhi
This commit is contained in:
commit
62d9fb8516
@ -52,6 +52,8 @@ export default {
|
||||
getInvoiceById: (params = {}) => request.get(`/transactions/receipts/${params.id}`, { params }),
|
||||
// 后端接口要求请求体包裹在 data 字段下
|
||||
sendInvoice: (data = {}) => request.post('/transactions/send-email', { data }),
|
||||
// invoice headers
|
||||
getInvoiceHeaders: (params = {}) => request.get('/invoice/list', { params }),
|
||||
// valuation (估值评估)
|
||||
getValuationList: (params = {}) => request.get('/valuations/', { params }),
|
||||
getValuationById: (params = {}) => request.get(`/valuations/${params.valuation_id || params.id}`),
|
||||
|
||||
@ -45,11 +45,20 @@ watch(() => props.userData, (newData) => {
|
||||
|
||||
// 保存设置
|
||||
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 = {
|
||||
user_id: props.userData.id,
|
||||
target_count: Number(limitForm.value.targetCount || 0),
|
||||
target_count: newVal,
|
||||
op_type: limitForm.value.quotaType,
|
||||
remark: limitForm.value.remark
|
||||
remark: finalRemark
|
||||
}
|
||||
emit('save', data)
|
||||
}
|
||||
|
||||
@ -1,39 +1,44 @@
|
||||
<script setup>
|
||||
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 api from '@/api'
|
||||
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
data: {
|
||||
userId: {
|
||||
type: [String, Number],
|
||||
default: null,
|
||||
},
|
||||
baseInfo: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
loading: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
})
|
||||
|
||||
const emit = defineEmits(['update:visible'])
|
||||
|
||||
const message = useMessage()
|
||||
const activeTab = ref('basic')
|
||||
const invoiceLoading = ref(false)
|
||||
const logLoading = ref(false)
|
||||
const invoiceList = ref([])
|
||||
const logList = ref([])
|
||||
|
||||
watch(
|
||||
() => props.visible,
|
||||
(show) => {
|
||||
if (!show) {
|
||||
activeTab.value = 'basic'
|
||||
}
|
||||
}
|
||||
)
|
||||
const logPagination = ref({
|
||||
page: 1,
|
||||
pageSize: 5,
|
||||
itemCount: 0,
|
||||
})
|
||||
|
||||
const baseInfo = computed(() => props.data?.baseInfo || {})
|
||||
const invoiceHeaders = computed(() => props.data?.invoiceHeaders || [])
|
||||
const operationLogs = computed(() => props.data?.operationLogs || [])
|
||||
const invoicePagination = ref({
|
||||
page: 1,
|
||||
pageSize: 5,
|
||||
itemCount: 0,
|
||||
})
|
||||
|
||||
const invoiceColumns = [
|
||||
{ title: '公司名称', key: 'company_name', ellipsis: { tooltip: true } },
|
||||
@ -55,9 +60,111 @@ const logColumns = [
|
||||
},
|
||||
},
|
||||
{ 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() {
|
||||
emit('update:visible', false)
|
||||
}
|
||||
@ -74,71 +181,77 @@ function handleClose() {
|
||||
:mask-closable="false"
|
||||
@update:show="$emit('update:visible', $event)"
|
||||
>
|
||||
<NSpin :show="loading">
|
||||
<div class="user-detail-modal">
|
||||
<NTabs v-model:value="activeTab" type="card" size="large" class="detail-tabs">
|
||||
<NTabPane name="basic" tab="基础信息">
|
||||
<div class="basic-info">
|
||||
<div class="info-row">
|
||||
<span class="label">ID:</span>
|
||||
<span class="value">{{ baseInfo.id || '-' }}</span>
|
||||
<span class="label">手机号:</span>
|
||||
<span class="value">{{ baseInfo.phone || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="label">微信号:</span>
|
||||
<span class="value">{{ baseInfo.wechat || '-' }}</span>
|
||||
<span class="label">注册时间:</span>
|
||||
<span class="value">{{ baseInfo.register_time || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="label">剩余次数:</span>
|
||||
<span class="value">{{ baseInfo.remaining_count ?? '-' }}</span>
|
||||
<span class="label">用户类型:</span>
|
||||
<span class="value">{{ baseInfo.user_type || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row notes">
|
||||
<span class="label">备注:</span>
|
||||
<div class="notes-content">{{ baseInfo.notes || '暂无备注' }}</div>
|
||||
</div>
|
||||
<div class="user-detail-modal">
|
||||
<NTabs v-model:value="activeTab" type="card" size="large" class="detail-tabs">
|
||||
<NTabPane name="basic" tab="基础信息">
|
||||
<div class="basic-info">
|
||||
<div class="info-row">
|
||||
<span class="label">ID:</span>
|
||||
<span class="value">{{ baseInfo.id || '-' }}</span>
|
||||
<span class="label">手机号:</span>
|
||||
<span class="value">{{ baseInfo.phone || '-' }}</span>
|
||||
</div>
|
||||
</NTabPane>
|
||||
<NTabPane name="invoice" tab="发票抬头">
|
||||
<div class="info-row">
|
||||
<span class="label">微信号:</span>
|
||||
<span class="value">{{ baseInfo.wechat || '-' }}</span>
|
||||
<span class="label">注册时间:</span>
|
||||
<span class="value">{{ baseInfo.register_time || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="label">剩余次数:</span>
|
||||
<span class="value">{{ baseInfo.remaining_count ?? '-' }}</span>
|
||||
<span class="label">用户类型:</span>
|
||||
<span class="value">{{ baseInfo.user_type || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-row notes">
|
||||
<span class="label">备注:</span>
|
||||
<div class="notes-content">{{ baseInfo.notes || '暂无备注' }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</NTabPane>
|
||||
<NTabPane name="invoice" tab="发票抬头">
|
||||
<NSpin :show="invoiceLoading">
|
||||
<NDataTable
|
||||
class="section-table"
|
||||
:columns="invoiceColumns"
|
||||
:data="invoiceHeaders"
|
||||
:pagination="false"
|
||||
:data="invoiceList"
|
||||
:pagination="invoicePagination"
|
||||
:remote="true"
|
||||
:bordered="false"
|
||||
:single-line="false"
|
||||
@update:page="handleInvoicePageChange"
|
||||
>
|
||||
<template #empty>
|
||||
<div class="empty">暂无发票抬头信息</div>
|
||||
</template>
|
||||
</NDataTable>
|
||||
</NTabPane>
|
||||
<NTabPane name="logs" tab="操作记录">
|
||||
</NSpin>
|
||||
</NTabPane>
|
||||
<NTabPane name="logs" tab="操作记录">
|
||||
<NSpin :show="logLoading">
|
||||
<NDataTable
|
||||
class="section-table"
|
||||
:columns="logColumns"
|
||||
:data="operationLogs"
|
||||
:pagination="false"
|
||||
:data="logList"
|
||||
:pagination="logPagination"
|
||||
:remote="true"
|
||||
:bordered="false"
|
||||
:single-line="false"
|
||||
@update:page="handleLogPageChange"
|
||||
>
|
||||
<template #empty>
|
||||
<div class="empty">暂无操作记录</div>
|
||||
</template>
|
||||
</NDataTable>
|
||||
</NTabPane>
|
||||
</NTabs>
|
||||
</NSpin>
|
||||
</NTabPane>
|
||||
</NTabs>
|
||||
|
||||
<div class="action-buttons">
|
||||
<NButton @click="handleClose">取消</NButton>
|
||||
<NButton type="primary" @click="handleClose">确定</NButton>
|
||||
</div>
|
||||
<div class="action-buttons">
|
||||
<NButton @click="handleClose">取消</NButton>
|
||||
<NButton type="primary" @click="handleClose">确定</NButton>
|
||||
</div>
|
||||
</NSpin>
|
||||
</div>
|
||||
</NModal>
|
||||
</template>
|
||||
|
||||
|
||||
@ -71,16 +71,16 @@ const columns = [
|
||||
align: 'center',
|
||||
ellipsis: { tooltip: true },
|
||||
},
|
||||
{
|
||||
title: '微信号',
|
||||
key: 'wechat',
|
||||
width: 140,
|
||||
align: 'center',
|
||||
ellipsis: { tooltip: true },
|
||||
render(row) {
|
||||
return row.wechat || '-'
|
||||
},
|
||||
},
|
||||
// {
|
||||
// title: '微信号',
|
||||
// key: 'wechat',
|
||||
// width: 140,
|
||||
// align: 'center',
|
||||
// ellipsis: { tooltip: true },
|
||||
// render(row) {
|
||||
// return row.wechat || '-'
|
||||
// },
|
||||
// },
|
||||
{
|
||||
title: '注册时间',
|
||||
key: 'created_at',
|
||||
@ -158,30 +158,18 @@ const columns = [
|
||||
// 查看用户详情
|
||||
async function handleViewDetail(row) {
|
||||
detailModalVisible.value = true
|
||||
detailLoading.value = true
|
||||
try {
|
||||
const { data: logs = [] } = await api.getAppUserQuotaLogs({
|
||||
user_id: row.id,
|
||||
page: 1,
|
||||
page_size: 50,
|
||||
})
|
||||
userDetail.value = {
|
||||
baseInfo: {
|
||||
id: row.id,
|
||||
phone: row.phone,
|
||||
wechat: row.wechat,
|
||||
register_time: row.created_at ? formatDate(row.created_at) : '-',
|
||||
notes: row.notes,
|
||||
remaining_count: row.remaining_count,
|
||||
user_type: row.user_type || '-',
|
||||
},
|
||||
invoiceHeaders: [],
|
||||
operationLogs: logs,
|
||||
currentUser.value = row
|
||||
|
||||
userDetail.value = {
|
||||
baseInfo: {
|
||||
id: row.id,
|
||||
phone: row.phone,
|
||||
wechat: row.wechat,
|
||||
register_time: row.created_at ? formatDate(row.created_at) : '-',
|
||||
notes: row.notes,
|
||||
remaining_count: row.remaining_count,
|
||||
user_type: row.user_type || '-',
|
||||
}
|
||||
} catch (error) {
|
||||
$message.error(error?.message || '获取用户详情失败')
|
||||
} finally {
|
||||
detailLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
@ -256,7 +244,7 @@ const validateForm = {
|
||||
@keypress.enter="$table?.handleSearch()"
|
||||
/>
|
||||
</QueryBarItem>
|
||||
<QueryBarItem label="微信号" :label-width="60">
|
||||
<!-- <QueryBarItem label="微信号" :label-width="60">
|
||||
<NInput
|
||||
v-model:value="queryItems.wechat"
|
||||
clearable
|
||||
@ -265,7 +253,7 @@ const validateForm = {
|
||||
style="width: 200px"
|
||||
@keypress.enter="$table?.handleSearch()"
|
||||
/>
|
||||
</QueryBarItem>
|
||||
</QueryBarItem> -->
|
||||
<QueryBarItem label="ID" :label-width="60">
|
||||
<NInput
|
||||
v-model:value="queryItems.id"
|
||||
@ -325,8 +313,8 @@ const validateForm = {
|
||||
<!-- 用户详情弹窗 -->
|
||||
<UserDetailModal
|
||||
v-model:visible="detailModalVisible"
|
||||
:data="userDetail"
|
||||
:loading="detailLoading"
|
||||
:user-id="currentUser?.id"
|
||||
:base-info="userDetail.baseInfo"
|
||||
/>
|
||||
</CommonPage>
|
||||
</template>
|
||||
|
||||
@ -195,6 +195,106 @@ const detailSections = computed(() => {
|
||||
|
||||
const calcFlow = computed(() => props.detailData?.calculation_result?.flow || [])
|
||||
|
||||
const mockFlowHtml = ref(`
|
||||
<div class="calc-flow-container">
|
||||
<!-- 左侧:详细计算流程 -->
|
||||
<div class="calc-flow-left">
|
||||
<div class="calc-formula-header">
|
||||
最终估值A12000=模型估值B12*0.7+市场估值C33*0.3
|
||||
</div>
|
||||
|
||||
<div class="calc-section">
|
||||
<div class="calc-section-title">一、模型估值B12=(经济价值B143*0.7+文化价值B255*0.3)*风险调整系数B343</div>
|
||||
|
||||
<div class="calc-subsection">
|
||||
<div class="calc-subsection-title">1、经济价值B143=基础价值B1173*(1+流量因子B1212)*政策驱动B1345</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(1) 基础价值B1173=财务价值P2000*(0.45+0.05*行业系数I0.8)+法律强度L0.3*(0.35+0.05*行业系数I0.8)+发展潜力D0.5*0.2</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 财务价值P2000=[3年内均收益10000*(1+增长率23%)*5]/5</div>
|
||||
<div class="calc-detail-item">• 法律强度L12=专利分*12*0.4+商标分*12*0.3+版权分*12*0.3</div>
|
||||
<div class="calc-detail-item">• 发展潜力D=专利分*0.5+ESG分*0.2+创新投入比*0.3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(2) 流量因子B1212</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 近 30 天搜索指数M1</div>
|
||||
<div class="calc-detail-item">• 行业均值S2</div>
|
||||
<div class="calc-detail-item">• 社交媒体传播度S3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(3) 政策驱动B13</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 政策契合度P</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-subsection">
|
||||
<div class="calc-subsection-title">2、文化价值B2</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(1) 活态传承系数B21</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 传承人等级系数</div>
|
||||
<div class="calc-detail-item">• 教学传播频次</div>
|
||||
<div class="calc-detail-item">• 跨界合作深度</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(2) 纹样基因值B22</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 纹样复杂度SC</div>
|
||||
<div class="calc-detail-item">• 归一化稀缺H</div>
|
||||
<div class="calc-detail-item">• 历史承载度HI</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧:计算流程大纲 -->
|
||||
<div class="calc-flow-right">
|
||||
<div class="calc-outline-title">最终估值A</div>
|
||||
<div class="calc-outline">
|
||||
<div class="outline-section">
|
||||
<div class="outline-title">一、模型估值B</div>
|
||||
<div class="outline-subsection">
|
||||
<div class="outline-subtitle">1、经济价值B1</div>
|
||||
<div class="outline-item">(1) 基础价值B11</div>
|
||||
<div class="outline-detail">• 基础价值B1173=财务价值P2000*(0.45+0.05*行业系数I0.8)+法律强度L0.3*(0.35+0.05*行业系数I0.8)+发展潜力D0.5*0.2</div>
|
||||
<div class="outline-item">(2) 流量因子B12</div>
|
||||
<div class="outline-detail">• 近 30 天搜索指数M1</div>
|
||||
<div class="outline-detail">• 行业均值S2</div>
|
||||
<div class="outline-detail">• 社交媒体传播度S3</div>
|
||||
<div class="outline-item">(3) 政策驱动B13</div>
|
||||
<div class="outline-detail">• 政策契合度P</div>
|
||||
</div>
|
||||
|
||||
<div class="outline-subsection">
|
||||
<div class="outline-subtitle">2、文化价值B2</div>
|
||||
<div class="outline-item">(1) 活态传承系数B21</div>
|
||||
<div class="outline-detail">• 传承人等级系数</div>
|
||||
<div class="outline-detail">• 教学传播频次</div>
|
||||
<div class="outline-detail">• 跨界合作深度</div>
|
||||
<div class="outline-item">(2) 纹样基因值B22</div>
|
||||
<div class="outline-detail">• 纹样复杂度SC</div>
|
||||
<div class="outline-detail">• 归一化稀缺H</div>
|
||||
<div class="outline-detail">• 历史承载度HI</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`)
|
||||
|
||||
|
||||
// 证书相关功能
|
||||
const handleUploadCertificate = () => {
|
||||
certificateModalMode.value = 'upload'
|
||||
@ -273,102 +373,7 @@ const handleCertificateConfirm = (data) => {
|
||||
</NTabPane>
|
||||
<NTabPane name="flow" tab="计算流程">
|
||||
<NSpin :show="loading">
|
||||
<div class="calc-flow-container">
|
||||
<!-- 左侧:详细计算流程 -->
|
||||
<div class="calc-flow-left">
|
||||
<div class="calc-formula-header">
|
||||
最终估值A12000=模型估值B12*0.7+市场估值C33*0.3
|
||||
</div>
|
||||
|
||||
<div class="calc-section">
|
||||
<div class="calc-section-title">一、模型估值B12=(经济价值B143*0.7+文化价值B255*0.3)*风险调整系数B343</div>
|
||||
|
||||
<div class="calc-subsection">
|
||||
<div class="calc-subsection-title">1、经济价值B143=基础价值B1173*(1+流量因子B1212)*政策驱动B1345</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(1) 基础价值B1173=财务价值P2000*(0.45+0.05*行业系数I0.8)+法律强度L0.3*(0.35+0.05*行业系数I0.8)+发展潜力D0.5*0.2</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 财务价值P2000=[3年内均收益10000*(1+增长率23%)*5]/5</div>
|
||||
<div class="calc-detail-item">• 法律强度L12=专利分*12*0.4+商标分*12*0.3+版权分*12*0.3</div>
|
||||
<div class="calc-detail-item">• 发展潜力D=专利分*0.5+ESG分*0.2+创新投入比*0.3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(2) 流量因子B1212</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 近 30 天搜索指数M1</div>
|
||||
<div class="calc-detail-item">• 行业均值S2</div>
|
||||
<div class="calc-detail-item">• 社交媒体传播度S3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(3) 政策驱动B13</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 政策契合度P</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-subsection">
|
||||
<div class="calc-subsection-title">2、文化价值B2</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(1) 活态传承系数B21</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 传承人等级系数</div>
|
||||
<div class="calc-detail-item">• 教学传播频次</div>
|
||||
<div class="calc-detail-item">• 跨界合作深度</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="calc-item">
|
||||
<div class="calc-item-label">(2) 纹样基因值B22</div>
|
||||
<div class="calc-detail">
|
||||
<div class="calc-detail-item">• 纹样复杂度SC</div>
|
||||
<div class="calc-detail-item">• 归一化稀缺H</div>
|
||||
<div class="calc-detail-item">• 历史承载度HI</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧:计算流程大纲 -->
|
||||
<div class="calc-flow-right">
|
||||
<div class="calc-outline-title">最终估值A</div>
|
||||
<div class="calc-outline">
|
||||
<div class="outline-section">
|
||||
<div class="outline-title">一、模型估值B</div>
|
||||
<div class="outline-subsection">
|
||||
<div class="outline-subtitle">1、经济价值B1</div>
|
||||
<div class="outline-item">(1) 基础价值B11</div>
|
||||
<div class="outline-detail">• 基础价值B1173=财务价值P2000*(0.45+0.05*行业系数I0.8)+法律强度L0.3*(0.35+0.05*行业系数I0.8)+发展潜力D0.5*0.2</div>
|
||||
<div class="outline-item">(2) 流量因子B12</div>
|
||||
<div class="outline-detail">• 近 30 天搜索指数M1</div>
|
||||
<div class="outline-detail">• 行业均值S2</div>
|
||||
<div class="outline-detail">• 社交媒体传播度S3</div>
|
||||
<div class="outline-item">(3) 政策驱动B13</div>
|
||||
<div class="outline-detail">• 政策契合度P</div>
|
||||
</div>
|
||||
|
||||
<div class="outline-subsection">
|
||||
<div class="outline-subtitle">2、文化价值B2</div>
|
||||
<div class="outline-item">(1) 活态传承系数B21</div>
|
||||
<div class="outline-detail">• 传承人等级系数</div>
|
||||
<div class="outline-detail">• 教学传播频次</div>
|
||||
<div class="outline-detail">• 跨界合作深度</div>
|
||||
<div class="outline-item">(2) 纹样基因值B22</div>
|
||||
<div class="outline-detail">• 纹样复杂度SC</div>
|
||||
<div class="outline-detail">• 归一化稀缺H</div>
|
||||
<div class="outline-detail">• 历史承载度HI</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-html="mockFlowHtml"></div>
|
||||
</NSpin>
|
||||
</NTabPane>
|
||||
</NTabs>
|
||||
@ -532,14 +537,14 @@ const handleCertificateConfirm = (data) => {
|
||||
}
|
||||
|
||||
/* 计算流程容器 */
|
||||
.calc-flow-container {
|
||||
:deep(.calc-flow-container) {
|
||||
display: flex;
|
||||
gap: 24px;
|
||||
min-height: 600px;
|
||||
}
|
||||
|
||||
/* 左侧详细流程 */
|
||||
.calc-flow-left {
|
||||
:deep(.calc-flow-left) {
|
||||
flex: 1;
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
@ -548,7 +553,7 @@ const handleCertificateConfirm = (data) => {
|
||||
max-height: 800px;
|
||||
}
|
||||
|
||||
.calc-formula-header {
|
||||
:deep(.calc-formula-header) {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
color: #1d2129;
|
||||
@ -557,11 +562,11 @@ const handleCertificateConfirm = (data) => {
|
||||
border-bottom: 2px solid #e5e7eb;
|
||||
}
|
||||
|
||||
.calc-section {
|
||||
:deep(.calc-section) {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.calc-section-title {
|
||||
:deep(.calc-section-title) {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #1d2129;
|
||||
@ -569,12 +574,12 @@ const handleCertificateConfirm = (data) => {
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.calc-subsection {
|
||||
:deep(.calc-subsection) {
|
||||
margin-left: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.calc-subsection-title {
|
||||
:deep(.calc-subsection-title) {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #374151;
|
||||
@ -582,24 +587,24 @@ const handleCertificateConfirm = (data) => {
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.calc-item {
|
||||
:deep(.calc-item) {
|
||||
margin-left: 20px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.calc-item-label {
|
||||
:deep(.calc-item-label) {
|
||||
font-size: 14px;
|
||||
color: #4b5563;
|
||||
margin-bottom: 8px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.calc-detail {
|
||||
:deep(.calc-detail) {
|
||||
margin-left: 20px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.calc-detail-item {
|
||||
:deep(.calc-detail-item) {
|
||||
font-size: 13px;
|
||||
color: #6b7280;
|
||||
margin-bottom: 4px;
|
||||
@ -607,7 +612,7 @@ const handleCertificateConfirm = (data) => {
|
||||
}
|
||||
|
||||
/* 右侧大纲 */
|
||||
.calc-flow-right {
|
||||
:deep(.calc-flow-right) {
|
||||
width: 320px;
|
||||
background: #fff;
|
||||
border: 1px solid #e5e7eb;
|
||||
@ -617,7 +622,7 @@ const handleCertificateConfirm = (data) => {
|
||||
max-height: 800px;
|
||||
}
|
||||
|
||||
.calc-outline-title {
|
||||
:deep(.calc-outline-title) {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #1d2129;
|
||||
@ -626,41 +631,41 @@ const handleCertificateConfirm = (data) => {
|
||||
border-bottom: 2px solid #e5e7eb;
|
||||
}
|
||||
|
||||
.calc-outline {
|
||||
:deep(.calc-outline) {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.outline-section {
|
||||
:deep(.outline-section) {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.outline-title {
|
||||
:deep(.outline-title) {
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #1d2129;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.outline-subsection {
|
||||
:deep(.outline-subsection) {
|
||||
margin-left: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.outline-subtitle {
|
||||
:deep(.outline-subtitle) {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: #374151;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.outline-item {
|
||||
:deep(.outline-item) {
|
||||
font-size: 12px;
|
||||
color: #4b5563;
|
||||
margin-bottom: 4px;
|
||||
margin-left: 12px;
|
||||
}
|
||||
|
||||
.outline-detail {
|
||||
:deep(.outline-detail) {
|
||||
font-size: 11px;
|
||||
color: #6b7280;
|
||||
margin-left: 24px;
|
||||
|
||||
@ -93,7 +93,7 @@ const columns = [
|
||||
// },
|
||||
{
|
||||
title: '评估结果',
|
||||
key: 'valuation_result',
|
||||
key: 'final_value_ab',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
render(row) {
|
||||
@ -112,11 +112,11 @@ const columns = [
|
||||
},
|
||||
{
|
||||
title: '审核时间',
|
||||
key: 'reviewed_at',
|
||||
key: 'updated_at',
|
||||
width: 160,
|
||||
align: 'center',
|
||||
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