Files
cog_streamer_web/src/views/user/OrganizationAssetApplicationCreate.vue
T
unknown c2d72d891f assets
2026-08-01 16:17:33 +08:00

1120 lines
47 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<UserShell
title="MCN机构数字资产评估申请"
subtitle="填写以下评估信息,系统将生成专业的资产评估报告。该报告可用于银行信贷、投融资等金融服务场景。"
:profile="profile"
:menu-items="menuItems"
active-key="asset"
center-path="/user/org"
>
<div class="notice-box">
<img class="notice-icon" :src="tipIcon" alt="提示" />
<div>
<strong>资产评估报告的价值</strong>
<p>MCN机构的核心资产在于旗下主播的粉丝规模内容转化率以及机构的商业化流水能力本评估报告将从主播孵化能力内容影响力账号资产积累运营数据及商业化表现五大维度进行综合评估为银行信贷审批提供权威数据支持</p>
</div>
</div>
<div class="stepper">
<button
v-for="step in steps"
:key="step.no"
type="button"
:class="['step-item', stepState(step.no)]"
@click="jumpToStep(step.no)"
>
<span class="step-no">{{ step.no }}</span>
<span>{{ step.label }}</span>
</button>
</div>
<section class="panel">
<template v-if="currentStep === 1">
<div class="panel-title">数字资产基本信息</div>
<div class="panel-sub">填写MCN机构的基本工商信息及资产概况</div>
<div class="form-grid top-grid">
<div class="field-item wide"><label>MCN机构全称 <span class="required">*</span></label><el-input v-model.trim="form.companyName" placeholder="请输入机构工商注册全称" class="control" :disabled="readonlyMode" /></div>
<div class="field-item wide"><label>统一社会信用代码 <span class="required">*</span></label><el-input v-model.trim="form.creditCode" placeholder="18位统一社会信用代码" class="control" :disabled="readonlyMode" /></div>
<div class="field-item wide"><label>资产类别</label><el-select v-model="form.assetType" placeholder="请选择资产类别" class="control" :disabled="readonlyMode"><el-option label="机构资产" value="机构资产" /></el-select></div>
</div>
<div class="sub-section">权属人股权及融资信息</div>
<div class="form-grid">
<div class="field-item"><label>注册资本万元 <span class="required">*</span></label><el-input v-model.trim="form.registerCapital" placeholder="请输入注册资本" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>实缴资本万元</label><el-input v-model.trim="form.paidCapital" placeholder="请输入实缴资本" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="textarea-item"><label>股权结构 <span class="minor-tip">持股比例主要股东及实际控制人</span></label><el-input v-model.trim="form.shareholders" type="textarea" :rows="3" resize="none" placeholder="请详细描述股权结构,例如:实际控制人张三持股60%,李四持股30%,员工持股平台持股10%" class="control textarea" :disabled="readonlyMode" /></div>
<div class="textarea-item"><label>融资历史 <span class="minor-tip">轮次金额投资方估值</span></label><el-input v-model.trim="form.financeHistory" type="textarea" :rows="3" resize="none" placeholder="例如:2023年A轮融资5000万元,投资方为XX资本,投后估值5亿元" class="control textarea" :disabled="readonlyMode" /></div>
<div class="textarea-item"><label>控股子公司/关联公司 <span class="minor-tip">与主营业务相关的关联主体</span></label><el-input v-model.trim="form.relatedCompanies" type="textarea" :rows="3" resize="none" placeholder="列出与主播业务相关的控股子公司或关联公司" class="control textarea" :disabled="readonlyMode" /></div>
<div class="sub-section">机构基本情况</div>
<div class="form-grid">
<div class="field-item"><label>成立时间 <span class="required">*</span></label><el-date-picker v-model="form.foundedAt" type="date" value-format="yyyy-MM-dd" placeholder="yyyy/mm/日" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>全职员工人数 <span class="required">*</span></label><el-input v-model.trim="form.staffCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>签约主播人数 <span class="required">*</span></label><el-input v-model.trim="form.anchorCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="chips-block">
<label>主营业务范围 <span class="required">*</span></label>
<el-checkbox-group v-model="form.businessScopes" class="chips-group" :disabled="readonlyMode">
<el-checkbox v-for="item in businessScopeOptions" :key="item" :label="item">{{ item }}</el-checkbox>
</el-checkbox-group>
</div>
<div class="chips-block">
<label>核心合作平台 <span class="required">*</span></label>
<el-checkbox-group v-model="form.corePlatforms" class="chips-group" :disabled="readonlyMode">
<el-checkbox v-for="item in corePlatformOptions" :key="item" :label="item">{{ item }}</el-checkbox>
</el-checkbox-group>
</div>
<div class="chips-block">
<label>经营资质</label>
<el-checkbox-group v-model="form.certificates" class="chips-group" :disabled="readonlyMode">
<el-checkbox v-for="item in certificateOptions" :key="item" :label="item">{{ item }}</el-checkbox>
</el-checkbox-group>
</div>
<div class="form-grid bottom-grid">
<div class="field-item wide"><label>机构办公地址 <span class="required">*</span></label><el-input v-model.trim="form.officeAddress" placeholder="省/市" class="control" :disabled="readonlyMode" /></div>
<div class="field-item wide"><label>行业荣誉认证 <span class="minor-tip">MCN等级行业奖项</span></label><el-input v-model.trim="form.honors" placeholder="如:抖音金牌MCN、快手年度影响力机构" class="control" :disabled="readonlyMode" /></div>
</div>
</template>
<template v-if="currentStep === 2">
<div class="panel-title">主播孵化数据情况</div>
<div class="panel-sub">填写MCN机构旗下主播的培养与梯队建设信息</div>
<div class="sub-section">主播签约结构</div>
<div class="form-grid three-grid">
<div class="field-item"><label>签约主播总数 <span class="required">*</span></label><el-input v-model.trim="form.step2.signedAnchorCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>独家签约主播 <span class="required">*</span></label><el-input v-model.trim="form.step2.exclusiveAnchorCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item contract-group">
<label>合同类型分布</label>
<div class="dual-inputs">
<el-input v-model.trim="form.step2.fullTimeContractCount" placeholder="全约人" class="control" :disabled="readonlyMode" />
<el-input v-model.trim="form.step2.businessContractCount" placeholder="商务约人" class="control" :disabled="readonlyMode" />
</div>
</div>
</div>
<div class="sub-section">主播梯队结构</div>
<div class="form-grid three-grid">
<div class="field-item"><label>头部主播 <span class="minor-tip">粉丝500</span></label><el-input v-model.trim="form.step2.topAnchorCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>腰部主播 <span class="minor-tip">100-500</span></label><el-input v-model.trim="form.step2.midAnchorCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>成长型主播 <span class="minor-tip">100</span></label><el-input v-model.trim="form.step2.growthAnchorCount" placeholder="人" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="chips-block">
<label>主播覆盖垂类 <span class="required">*</span> <span class="minor-tip">列出TOP3垂类赛道</span></label>
<el-checkbox-group v-model="form.step2.coverCategories" class="chips-group" :disabled="readonlyMode">
<el-checkbox v-for="item in extendedCategoryOptions" :key="item" :label="item">{{ item }}</el-checkbox>
</el-checkbox-group>
</div>
<div class="sub-section">孵化投入成本</div>
<div class="textarea-item"><label>孵化周期与过程描述</label><el-input v-model.trim="form.step2.incubationDescription" type="textarea" :rows="4" resize="none" placeholder="描述主播从签约到成熟的标准孵化流程、典型周期(月)、各阶段的投入资源(培训、流量投放、内容团队配置等)" class="control textarea" :disabled="readonlyMode" /></div>
<div class="form-grid">
<div class="field-item"><label>单主播平均孵化成本万元</label><el-input v-model.trim="form.step2.avgIncubationCost" placeholder="万元/人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>年度孵化总投入万元</label><el-input v-model.trim="form.step2.totalIncubationCost" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
</div>
</template>
<template v-if="currentStep === 3">
<div class="panel-title">主播内容与影响力评估</div>
<div class="panel-sub">填写MCN机构旗下主播的内容能力数据及资产估值信息</div>
<div class="sub-section">主播资产综合估值</div>
<div class="field-item estimate-row"><label>主播资产综合估值万元 <span class="required">*</span></label><el-input v-model.trim="form.step3.assetValuation" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
<div class="textarea-item"><label>估值说明</label><el-input v-model.trim="form.step3.valuationDescription" type="textarea" :rows="3" resize="none" placeholder="基于主播粉丝规模、商业化效率、内容创作能力、平台生态适配度等多维度综合测算的估值说明" class="control textarea" :disabled="readonlyMode" /></div>
<div class="sub-section">内容创作与粉丝质量数据</div>
<div class="form-grid three-grid">
<div class="field-item"><label>短视频月均更新量</label><el-input v-model.trim="form.step3.monthlyUpdateCount" placeholder="条" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>短视频爆款率 <span class="minor-tip">播放100</span></label><el-input v-model.trim="form.step3.viralRate" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>直播间平均停留时长</label><el-input v-model.trim="form.step3.avgStaySeconds" placeholder="秒" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>粉丝互动率</label><el-input v-model.trim="form.step3.fanInteractionRate" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>直播间互动率</label><el-input v-model.trim="form.step3.liveInteractionRate" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>跨平台账号总数</label><el-input v-model.trim="form.step3.crossPlatformAccountCount" placeholder="个" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="sub-section">合规与风控体系说明</div>
<div class="textarea-item"><label>选品审核流程说明</label><el-input v-model.trim="form.step3.selectionProcess" type="textarea" :rows="3" resize="none" placeholder="描述机构的选品审核流程、标准及执行情况..." class="control textarea" :disabled="readonlyMode" /></div>
<div class="textarea-item"><label>内容合规机制</label><el-input v-model.trim="form.step3.contentCompliance" type="textarea" :rows="3" resize="none" placeholder="描述内容审核机制、合规团队配置及相关制度建设情况..." class="control textarea" :disabled="readonlyMode" /></div>
</template>
<template v-if="currentStep === 4">
<div class="panel-title">主播账号资产与权益数据</div>
<div class="panel-sub">上传主播账号权属证明作品著作权及商业合约等文件</div>
<div class="sub-section">主播账号权属信息</div>
<div class="field-item upload-top-field"><label>账号归属主体 <span class="minor-tip">可多选</span></label><el-select v-model="form.step4.ownershipSubjects" multiple collapse-tags placeholder="请选择" class="control upload-select" :disabled="readonlyMode"><el-option v-for="item in ownershipSubjectOptions" :key="item" :label="item" :value="item" /></el-select></div>
<div class="upload-block"><div class="upload-title">上传授权文件 <span class="required">*</span></div><button type="button" class="upload-area" :disabled="readonlyMode" @click="triggerFile('authorizationFile')"><div class="upload-emoji folder">📁</div><div class="upload-text">点击上传或拖拽文件到此区域</div><div class="upload-sub">支持 PDFJPGPNG单个文件不超过 10MB</div><div v-if="form.step4.authorizationFileName" class="upload-file-name">{{ form.step4.authorizationFileName }}</div></button><input ref="authorizationFile" type="file" class="hidden-input" accept=".pdf,.jpg,.jpeg,.png" @change="handleFileChange($event, 'authorizationFileName', 10)" /></div>
<div class="sub-section">使用权内主播账号</div>
<div class="upload-block"><div class="upload-title">上传授权文件 <span class="required">*</span></div><button type="button" class="upload-area" :disabled="readonlyMode" @click="triggerFile('usageFile')"><div class="upload-emoji folder">📁</div><div class="upload-text">点击上传主播账号使用权授权文件</div><div class="upload-sub">上传主播账号在授权期内的使用权证明支持 PDFJPGPNG单个文件不超过 10MB</div><div v-if="form.step4.usageFileName" class="upload-file-name">{{ form.step4.usageFileName }}</div></button><input ref="usageFile" type="file" class="hidden-input" accept=".pdf,.jpg,.jpeg,.png" @change="handleFileChange($event, 'usageFileName', 10)" /></div>
<div class="sub-section">收益权内主播账号</div>
<div class="upload-block"><div class="upload-title">上传授权文件 <span class="required">*</span></div><button type="button" class="upload-area" :disabled="readonlyMode" @click="triggerFile('incomeFile')"><div class="upload-emoji folder">📁</div><div class="upload-text">点击上传主播账号收益权授权文件</div><div class="upload-sub">上传主播账号在授权期内的收益权证明支持 PDFJPGPNG单个文件不超过 10MB</div><div v-if="form.step4.incomeFileName" class="upload-file-name">{{ form.step4.incomeFileName }}</div></button><input ref="incomeFile" type="file" class="hidden-input" accept=".pdf,.jpg,.jpeg,.png" @change="handleFileChange($event, 'incomeFileName', 10)" /></div>
<div class="sub-section">作品著作权与内容资产处置权</div>
<div class="upload-block"><div class="upload-title">上传证明文件 <span class="required">*</span></div><button type="button" class="upload-area" :disabled="readonlyMode" @click="triggerFile('copyrightFile')"><div class="upload-emoji doc">📄</div><div class="upload-text">点击上传著作权登记证书内容版权证明等</div><div class="upload-sub">支持 PDFJPGPNG单个文件不超过 10MB</div><div v-if="form.step4.copyrightFileName" class="upload-file-name">{{ form.step4.copyrightFileName }}</div></button><input ref="copyrightFile" type="file" class="hidden-input" accept=".pdf,.jpg,.jpeg,.png" @change="handleFileChange($event, 'copyrightFileName', 10)" /></div>
<div class="sub-section">商业合约与品牌合作</div>
<div class="upload-block"><div class="upload-title">上传证明文件 <span class="required">*</span></div><button type="button" class="upload-area" :disabled="readonlyMode" @click="triggerFile('commercialFile')"><div class="upload-emoji doc">📋</div><div class="upload-text">点击上传品牌合作协议商业合同摘要等</div><div class="upload-sub">支持 PDFJPGPNG单个文件不超过 10MB敏感信息可脱敏处理</div><div v-if="form.step4.commercialFileName" class="upload-file-name">{{ form.step4.commercialFileName }}</div></button><input ref="commercialFile" type="file" class="hidden-input" accept=".pdf,.jpg,.jpeg,.png" @change="handleFileChange($event, 'commercialFileName', 10)" /></div>
</template>
<template v-if="currentStep === 5">
<div class="panel-title">主播运营数据情况</div>
<div class="panel-sub">录入旗下核心主播的运营数据至少添加一位主播信息</div>
<div v-for="(item, index) in form.step5.anchorMetrics" :key="item.id" class="anchor-card">
<div class="anchor-card-head">
<strong>主播 #{{ index + 1 }}</strong>
<button v-if="!readonlyMode && form.step5.anchorMetrics.length > 1" type="button" class="remove-anchor-btn" @click="removeAnchorMetric(index)">×</button>
</div>
<div class="form-grid three-grid anchor-grid">
<div class="field-item wide-two"><label>全网各平台ID账号</label><el-input v-model.trim="item.platformAccounts" placeholder="请填写,例:抖音:dy123454552,小红书:34455666767" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>主播名称 <span class="required">*</span></label><el-select v-model="item.anchorName" placeholder="请选择主播" class="control" :disabled="readonlyMode"><el-option v-for="option in anchorNameOptions" :key="option" :label="option" :value="option" /></el-select></div>
<div class="field-item"><label>全网粉丝总数</label><el-input v-model.trim="item.totalFans" placeholder="万" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>全网作品点击量</label><el-input v-model.trim="item.totalViews" placeholder="万" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>近一年直播场次</label><el-input v-model.trim="item.liveSessions" placeholder="场" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>近一年利润万元</label><el-input v-model.trim="item.annualProfit" placeholder="万" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>场均观看</label><el-input v-model.trim="item.avgViewers" placeholder="万" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>粉丝增长率月均%</label><el-input v-model.trim="item.fanGrowthRate" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>直播转化率%</label><el-input v-model.trim="item.conversionRate" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>场均GMV万元</label><el-input v-model.trim="item.avgGmv" placeholder="万" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>客单价</label><el-input v-model.trim="item.unitPrice" placeholder="元" class="control" :disabled="readonlyMode" /></div>
<div class="field-item wide-two"><label>近12个月GMV万元</label><el-input v-model.trim="item.last12MonthGmv" placeholder="万" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>垂类赛道</label><el-input v-model.trim="item.category" placeholder="如:美妆护肤、服饰穿搭" class="control" :disabled="readonlyMode" /></div>
</div>
</div>
<button v-if="!readonlyMode" type="button" class="add-anchor-btn" @click="addAnchorMetric">+ 添加主播</button>
<div class="sub-section">总体运营指标汇总</div>
<div class="form-grid three-grid">
<div class="field-item"><label>机构年度总GMV万元 <span class="required">*</span></label><el-input v-model.trim="form.step5.summary.annualGMV" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>机构年度总营收万元 <span class="required">*</span></label><el-input v-model.trim="form.step5.summary.annualRevenue" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>机构年度净利润万元 <span class="required">*</span></label><el-input v-model.trim="form.step5.summary.annualNetProfit" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>近12个月直播场次</label><el-input v-model.trim="form.step5.summary.last12MonthsSessions" placeholder="场" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>场均观看人数</label><el-input v-model.trim="form.step5.summary.avgViewersCount" placeholder="万人" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>总粉丝覆盖量</label><el-input v-model.trim="form.step5.summary.totalFanCoverage" placeholder="万人" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="sub-section">收入结构与成本分析</div>
<div class="form-grid two-grid">
<div class="field-item"><label>佣金收入占比%</label><el-input v-model.trim="form.step5.incomeStructure.commissionRatio" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>坑位费收入占比%</label><el-input v-model.trim="form.step5.incomeStructure.slotFeeRatio" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>品牌营销收入占比%</label><el-input v-model.trim="form.step5.incomeStructure.brandIncomeRatio" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>其他收入占比%</label><el-input v-model.trim="form.step5.incomeStructure.otherIncomeRatio" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>运营成本率%</label><el-input v-model.trim="form.step5.incomeStructure.costRatio" placeholder="%" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>净利润率%</label><el-input v-model.trim="form.step5.incomeStructure.netProfitRatio" placeholder="%" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="sub-section">收入预测 <span class="minor-tip">综合多平台数据测算</span></div>
<div class="form-grid two-grid">
<div class="field-item"><label>短期收益-未来6个月万元</label><el-input v-model.trim="form.step5.forecast.shortTermIncome6" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>全生命周期收益-3年预估万元</label><el-input v-model.trim="form.step5.forecast.lifecycleIncome3" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="textarea-item"><label>收益测算依据</label><el-input v-model.trim="form.step5.forecast.forecastBasis" type="textarea" :rows="3" resize="none" placeholder="说明上述收益预测的测算方法和依据..." class="control textarea" :disabled="readonlyMode" /></div>
<div class="textarea-item"><label>第三方支撑与生态协作 <span class="minor-tip">如带货数据平台第三方监测报告等</span></label><el-input v-model.trim="form.step5.forecast.thirdPartySupport" type="textarea" :rows="3" resize="none" placeholder="列出提供数据支撑的第三方平台或机构..." class="control textarea" :disabled="readonlyMode" /></div>
</template>
<template v-if="currentStep === 6">
<div class="panel-title">商业化情况评估</div>
<div class="panel-sub">汇总MCN机构的商业化能力及未来收益预测</div>
<div class="sub-section">收入预测</div>
<div class="form-grid two-grid">
<div class="field-item"><label>短期收益-未来12个月万元 <span class="required">*</span></label><el-input v-model.trim="form.step6.shortTermIncome12" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
<div class="field-item"><label>全生命周期收益-5万元 <span class="required">*</span></label><el-input v-model.trim="form.step6.lifecycleIncome5" placeholder="万元" class="control" :disabled="readonlyMode" /></div>
</div>
<div class="sub-section">评估申请确认与提交</div>
<div class="confirm-box">
<div class="confirm-title">提交前确认</div>
<ul>
<li>以上所填信息真实准确完整如有虚假愿承担相应法律责任</li>
<li>授权四川数字世界文化科技有限公司对提交数据进行核验</li>
<li>评估报告仅供银行信贷投融资等金融服务参考使用</li>
<li>上传的权属文件及商业合约将严格保密仅用于本次资产评估</li>
</ul>
</div>
<el-checkbox v-model="form.step6.confirmAgreement" class="push-t-10" :disabled="readonlyMode">我已阅读并同意资产评估服务协议数据授权协议</el-checkbox>
</template>
</section>
<div v-if="!readonlyMode" class="footer-actions" :class="{ split: currentStep > 1 }">
<button v-if="currentStep > 1" type="button" class="footer-btn back" @click="goPrev"> 上一步</button>
<div class="right-actions">
<button type="button" class="footer-btn ghost" @click="saveDraft">保存草稿</button>
<button v-if="currentStep < 6" type="button" class="footer-btn primary" @click="goNext">下一步 </button>
<button v-else type="button" class="footer-btn submit" @click="submitApplication">提交评估申请</button>
</div>
</div>
</UserShell>
</template>
<script>
import UserShell from './components/UserShell.vue';
import sidebarBg from '@/assets/img/user/背景卡图.png';
import userAvatar from '@/assets/img/user/avatar.png';
import overviewActiveIcon from '@/assets/img/user/griconxz.png';
import overviewActiveIconIn from '@/assets/img/user/gricon.png';
import talentActiveIcon from '@/assets/img/user/zbglxz.png';
import talentInactiveIcon from '@/assets/img/user/zbgl.png';
import assetActiveIcon from '@/assets/img/user/申请icon.png';
import assetInactiveIcon from '@/assets/img/user/申请未选中.png';
import tipIcon from '@/assets/img/user/提示.png';
const LIST_STORAGE_KEY = 'cog.org.assetApplications';
const DRAFT_STORAGE_KEY = 'cog.org.assetDraft';
const TALENT_STORAGE_KEY = 'cog.org.talents';
const API_ENDPOINTS = {
saveDraft: '/api/mcn/assets/save-draft',
stepSave: '/api/mcn/assets/step-save',
submit: '/api/mcn/assets/submit',
detail: '/api/mcn/assets/detail'
};
function createMenu() {
return [
{ key: 'overview', label: '首页概览', path: '/user/org', activeIcon: overviewActiveIcon,inactiveIcon: overviewActiveIconIn},
{ key: 'talent', label: '主播管理', path: '/user/org/talents', activeIcon: talentActiveIcon, inactiveIcon: talentInactiveIcon },
{ key: 'asset', label: '资产评估申请', path: '/user/org/assets', activeIcon: assetActiveIcon, inactiveIcon: assetInactiveIcon }
];
}
function createAnchorMetric() {
return {
id: `${Date.now()}-${Math.random()}`,
platformAccounts: '',
anchorName: '',
totalFans: '',
totalViews: '',
liveSessions: '',
annualProfit: '',
avgViewers: '',
fanGrowthRate: '',
conversionRate: '',
avgGmv: '',
unitPrice: '',
last12MonthGmv: '',
category: ''
};
}
function createEmptyForm() {
return {
companyName: '星辰传媒有限公司',
creditCode: '91110108MA01X000X',
assetType: '机构资产',
registerCapital: '',
paidCapital: '',
shareholders: '',
financeHistory: '',
relatedCompanies: '',
foundedAt: '',
staffCount: '',
anchorCount: '',
businessScopes: [],
corePlatforms: [],
certificates: [],
officeAddress: '',
honors: '',
step2: {
signedAnchorCount: '',
exclusiveAnchorCount: '',
fullTimeContractCount: '',
businessContractCount: '',
topAnchorCount: '',
midAnchorCount: '',
growthAnchorCount: '',
coverCategories: [],
incubationDescription: '',
avgIncubationCost: '',
totalIncubationCost: ''
},
step3: {
assetValuation: '',
valuationDescription: '',
monthlyUpdateCount: '',
viralRate: '',
avgStaySeconds: '',
fanInteractionRate: '',
liveInteractionRate: '',
crossPlatformAccountCount: '',
selectionProcess: '',
contentCompliance: ''
},
step4: {
ownershipSubjects: [],
authorizationFileName: '',
usageFileName: '',
incomeFileName: '',
copyrightFileName: '',
commercialFileName: ''
},
step5: {
anchorMetrics: [createAnchorMetric()],
summary: {
annualGMV: '',
annualRevenue: '',
annualNetProfit: '',
last12MonthsSessions: '',
avgViewersCount: '',
totalFanCoverage: ''
},
incomeStructure: {
commissionRatio: '',
slotFeeRatio: '',
brandIncomeRatio: '',
otherIncomeRatio: '',
costRatio: '',
netProfitRatio: ''
},
forecast: {
shortTermIncome6: '',
lifecycleIncome3: '',
forecastBasis: '',
thirdPartySupport: ''
}
},
step6: {
shortTermIncome12: '',
lifecycleIncome5: '',
confirmAgreement: false
}
};
}
function readJson(key, fallback) {
try {
const raw = window.localStorage.getItem(key);
return raw ? JSON.parse(raw) : fallback;
} catch (error) {
return fallback;
}
}
function writeJson(key, value) {
window.localStorage.setItem(key, JSON.stringify(value));
}
function cloneDeep(value) {
return JSON.parse(JSON.stringify(value));
}
export default {
name: 'OrganizationAssetApplicationCreate',
components: { UserShell },
data() {
return {
apiEndpoints: API_ENDPOINTS,
tipIcon,
profile: {
name: '星辰传媒有限公司',
role: 'MCN机构',
avatar: userAvatar,
background: sidebarBg
},
menuItems: createMenu(),
readonlyMode: false,
currentId: '',
currentStep: 1,
form: createEmptyForm(),
steps: [
{ no: 1, label: '基本信息' },
{ no: 2, label: '孵化数据' },
{ no: 3, label: '内容影响力' },
{ no: 4, label: '账号资产' },
{ no: 5, label: '运营数据' },
{ no: 6, label: '商业化评估' }
],
businessScopeOptions: ['直播带货', '内容创作', '艺人经纪', '品牌代运营', '知识付费', 'IP授权'],
corePlatformOptions: ['抖音', '快手', '视频号', '小红书', '淘宝直播', 'B站', 'YouTube', 'TikTok'],
certificateOptions: ['营业性演出许可证', '网络文化经营许可证', 'ICP许可证', '广播电视节目制作'],
extendedCategoryOptions: ['美妆护肤', '服饰穿搭', '食品饮料', '3C数码', '家居生活', '母婴育儿', '教育知识', '运动户外', '游戏电竞', '汽车房产', '珠宝文玩', '本地生活'],
ownershipSubjectOptions: ['机构主体', '主播个人', '联合持有']
};
},
computed: {
anchorNameOptions() {
const talents = readJson(TALENT_STORAGE_KEY, []);
return talents.map(item => item.name).filter(Boolean);
}
},
created() {
this.initPage();
},
methods: {
initPage() {
const { mode, id, step } = this.$route.query;
this.readonlyMode = mode === 'view';
this.currentId = id || '';
this.currentStep = Number(step || 1);
if (this.currentId) {
const list = readJson(LIST_STORAGE_KEY, []);
const target = list.find(item => String(item.id) === String(this.currentId));
if (target && (target.formData || target.formStep1)) {
this.form = this.hydrateForm(target.formData || target.formStep1);
return;
}
}
this.form = this.hydrateForm(readJson(DRAFT_STORAGE_KEY, createEmptyForm()));
},
hydrateForm(source) {
const base = createEmptyForm();
const form = source || base;
return {
...base,
...form,
businessScopes: Array.isArray(form.businessScopes) ? form.businessScopes : [],
corePlatforms: Array.isArray(form.corePlatforms) ? form.corePlatforms : [],
certificates: Array.isArray(form.certificates) ? form.certificates : [],
step2: {
...base.step2,
...(form.step2 || {}),
coverCategories: Array.isArray(form.step2 && form.step2.coverCategories) ? form.step2.coverCategories : []
},
step3: {
...base.step3,
...(form.step3 || {})
},
step4: {
...base.step4,
...(form.step4 || {}),
ownershipSubjects: Array.isArray(form.step4 && form.step4.ownershipSubjects) ? form.step4.ownershipSubjects : []
},
step5: {
...base.step5,
...(form.step5 || {}),
anchorMetrics: Array.isArray(form.step5 && form.step5.anchorMetrics) && form.step5.anchorMetrics.length
? form.step5.anchorMetrics.map(item => ({ ...createAnchorMetric(), ...item }))
: [createAnchorMetric()],
summary: {
...base.step5.summary,
...((form.step5 && form.step5.summary) || {})
},
incomeStructure: {
...base.step5.incomeStructure,
...((form.step5 && form.step5.incomeStructure) || {})
},
forecast: {
...base.step5.forecast,
...((form.step5 && form.step5.forecast) || {})
}
},
step6: {
...base.step6,
...(form.step6 || {})
}
};
},
stepState(no) {
if (no < this.currentStep) {
return 'done';
}
if (no === this.currentStep) {
return 'active';
}
return 'pending';
},
jumpToStep(no) {
this.currentStep = no;
this.syncStepQuery();
},
syncStepQuery() {
this.$router.replace({ query: { ...this.$route.query, step: String(this.currentStep) } });
},
triggerFile(refName) {
if (this.readonlyMode) {
return;
}
const ref = this.$refs[refName];
const target = Array.isArray(ref) ? ref[0] : ref;
if (target) {
target.click();
}
},
handleFileChange(event, field, maxSizeMb) {
const file = event.target.files && event.target.files[0];
if (!file) {
return;
}
if (file.size > maxSizeMb * 1024 * 1024) {
this.$message.warning(`文件大小不能超过${maxSizeMb}M`);
event.target.value = '';
return;
}
this.form.step4[field] = file.name;
event.target.value = '';
},
addAnchorMetric() {
this.form.step5.anchorMetrics.push(createAnchorMetric());
},
removeAnchorMetric(index) {
this.form.step5.anchorMetrics.splice(index, 1);
},
validateCurrentStep() {
if (this.currentStep === 1) {
const checks = [
['companyName', '请输入MCN机构全称'],
['creditCode', '请输入统一社会信用代码'],
['registerCapital', '请输入注册资本'],
['foundedAt', '请选择成立时间'],
['staffCount', '请输入全职员工人数'],
['anchorCount', '请输入签约主播人数'],
['officeAddress', '请输入机构办公地址']
];
for (let index = 0; index < checks.length; index += 1) {
const [field, message] = checks[index];
if (!this.form[field]) {
this.$message.warning(message);
return false;
}
}
if (!this.form.businessScopes.length) {
this.$message.warning('请选择主营业务范围');
return false;
}
if (!this.form.corePlatforms.length) {
this.$message.warning('请选择核心合作平台');
return false;
}
}
if (this.currentStep === 2) {
if (!this.form.step2.signedAnchorCount || !this.form.step2.exclusiveAnchorCount) {
this.$message.warning('请完整填写主播签约结构');
return false;
}
if (!this.form.step2.coverCategories.length) {
this.$message.warning('请选择主播覆盖垂类');
return false;
}
}
if (this.currentStep === 3) {
if (!this.form.step3.assetValuation) {
this.$message.warning('请输入主播资产综合估值');
return false;
}
}
if (this.currentStep === 4) {
const requiredFiles = ['authorizationFileName', 'usageFileName', 'incomeFileName', 'copyrightFileName', 'commercialFileName'];
const missing = requiredFiles.some(field => !this.form.step4[field]);
if (missing) {
this.$message.warning('请完整上传账号资产相关证明文件');
return false;
}
}
if (this.currentStep === 5) {
if (!this.form.step5.anchorMetrics.length) {
this.$message.warning('请至少添加一位主播');
return false;
}
const invalidAnchor = this.form.step5.anchorMetrics.some(item => !item.anchorName);
if (invalidAnchor) {
this.$message.warning('请至少为每位主播选择主播名称');
return false;
}
if (!this.form.step5.summary.annualGMV || !this.form.step5.summary.annualRevenue || !this.form.step5.summary.annualNetProfit) {
this.$message.warning('请填写总体运营指标汇总');
return false;
}
}
if (this.currentStep === 6) {
if (!this.form.step6.shortTermIncome12 || !this.form.step6.lifecycleIncome5) {
this.$message.warning('请填写收入预测');
return false;
}
if (!this.form.step6.confirmAgreement) {
this.$message.warning('请先勾选协议确认');
return false;
}
}
return true;
},
buildRecord(status) {
return {
id: this.currentId ? Number(this.currentId) : Date.now(),
applyNo: this.currentId ? `EV-${this.currentId}` : `EV-${Date.now().toString().slice(-9)}`,
assetName: this.form.companyName,
assetType: this.form.assetType || '机构资产',
submitTime: new Date().toISOString().slice(0, 16).replace('T', ' '),
status,
formData: cloneDeep(this.form),
formStep1: cloneDeep(this.form)
};
},
upsertListRecord(status) {
const list = readJson(LIST_STORAGE_KEY, []);
const payload = this.buildRecord(status);
const index = list.findIndex(item => String(item.id) === String(payload.id));
if (index === -1) {
list.unshift(payload);
} else {
list.splice(index, 1, payload);
}
writeJson(LIST_STORAGE_KEY, list);
this.currentId = payload.id;
},
saveDraft() {
writeJson(DRAFT_STORAGE_KEY, this.form);
this.upsertListRecord('草稿');
this.$message.success(`草稿已保存,接口待接入:${this.apiEndpoints.saveDraft}`);
},
goPrev() {
if (this.currentStep > 1) {
this.currentStep -= 1;
this.syncStepQuery();
}
},
goNext() {
if (!this.validateCurrentStep()) {
return;
}
writeJson(DRAFT_STORAGE_KEY, this.form);
this.upsertListRecord('草稿');
if (this.currentStep < 6) {
this.currentStep += 1;
this.syncStepQuery();
this.$message.success(`当前步骤已保存,接口待接入:${this.apiEndpoints.stepSave}`);
}
},
submitApplication() {
if (!this.validateCurrentStep()) {
return;
}
this.upsertListRecord('审核中');
writeJson(DRAFT_STORAGE_KEY, this.form);
this.$message.success(`评估申请已提交,接口待接入:${this.apiEndpoints.submit}`);
this.$router.push('/user/org/assets');
}
},
watch: {
'$route.fullPath'() {
this.initPage();
}
}
};
</script>
<style lang="scss" scoped>
.notice-box {
display: flex;
gap: 12px;
padding: 16px 18px;
border: 1px solid #a89eff;
border-radius: 12px;
background: rgba(111, 104, 243, 0.04);
margin-top: 34px;
color: #6f68f3;
font-size: 15px;
}
.notice-icon {
width: 20px;
height: 20px;
margin-top: 2px;
}
.notice-box strong {
display: block;
color: #6f68f3;
font-size: 15px;
}
.notice-box p {
margin-top: 8px;
color: #7b87a4;
font-size: 14px;
line-height: 1.8;
}
.stepper {
display: flex;
justify-content: center;
gap: 18px;
margin-top: 28px;
flex-wrap: wrap;
}
.step-item {
border: 0;
background: transparent;
display: inline-flex;
align-items: center;
gap: 10px;
color: #c1c7d7;
font-size: 14px;
cursor: pointer;
}
.step-no {
width: 32px;
height: 32px;
border-radius: 50%;
border: 1px solid #dde3ef;
line-height: 32px;
text-align: center;
}
.step-item.done {
color: #18b79b;
}
.step-item.done .step-no {
border: 0;
background: #18b79b;
color: #fff;
}
.step-item.active {
color: #3a425a;
font-weight: 600;
}
.step-item.active .step-no {
border: 0;
background: #6f68f3;
color: #fff;
}
.panel {
margin-top: 34px;
padding: 24px 24px 18px;
border-radius: 14px;
background: #fff;
box-shadow: inset 0 0 0 1px #eef1f7;
}
.panel-title {
color: #3D3D3D;
font-size: 20px;
font-weight: 700;
}
.panel-sub {
margin-top: 8px;
color: #98a2b3;
font-size: 14px;
}
.sub-section {
margin-top: 24px;
padding-left: 10px;
border-left: 2px solid #4F46E5;
color: #4F46E5;
font-size: 18px;
font-weight: 600;
}
.form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
margin-top: 18px;
}
.three-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.two-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.top-grid .wide {
grid-column: span 2;
}
.anchor-grid .wide-two {
grid-column: span 2;
}
.field-item label,
.textarea-item label,
.chips-block label,
.upload-title {
display: block;
margin-bottom: 10px;
color: #3D3D3D;
font-size: 16px;
font-weight: 600;
}
.minor-tip {
color: #98a2b3;
font-size: 12px;
font-weight: 400;
}
.required {
color: #ff6a6a;
}
.control {
width: 100%;
}
.control ::v-deep .el-input__inner,
.control ::v-deep .el-textarea__inner,
.control ::v-deep .el-select .el-input__inner {
border-radius: 8px;
border: 1px solid #e2e8f0;
background: #f8fafc;
}
.control ::v-deep .el-input__inner {
height: 42px;
}
.textarea-item {
margin-top: 18px;
}
.textarea ::v-deep .el-textarea__inner {
min-height: 72px !important;
}
.chips-block {
margin-top: 22px;
}
.chips-group {
display: flex;
flex-wrap: wrap;
gap: 12px 10px;
}
.chips-group ::v-deep .el-checkbox {
margin-right: 0;
}
.chips-group ::v-deep .el-checkbox__label {
padding: 0 14px;
height: 32px;
border: 1px solid #dce2ef;
border-radius: 999px;
line-height: 32px;
color: #667085;
}
.chips-group ::v-deep .el-checkbox__input {
display: none;
}
.chips-group ::v-deep .el-checkbox__input.is-checked + .el-checkbox__label {
border-color: #6f68f3;
background: #f0edff;
color: #5f66ec;
}
.push-t-10{
margin-top: 10px;
}
.dual-inputs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.estimate-row {
margin-top: 18px;
max-width: 50%;
}
.upload-top-field {
margin-top: 18px;
max-width: 520px;
}
.upload-select {
max-width: 420px;
}
.upload-block {
margin-top: 20px;
}
.upload-area {
width: 100%;
min-height: 144px;
border: 1px dashed #d9dfeb;
border-radius: 10px;
background: #fff;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
cursor: pointer;
}
.upload-area:disabled {
cursor: default;
}
.upload-emoji {
font-size: 34px;
line-height: 1;
}
.upload-text {
color: #68758e;
font-size: 16px;
}
.upload-sub,
.upload-file-name {
color: #a1a9c0;
font-size: 13px;
}
.upload-file-name {
color: #5f66ec;
}
.hidden-input {
display: none;
}
.anchor-card {
margin-top: 18px;
padding: 16px 16px 18px;
border: 1px solid #dfe4f0;
border-radius: 12px;
background: #fff;
}
.anchor-card-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 14px;
}
.anchor-card-head strong {
color: #1e293b;
font-size: 18px;
}
.remove-anchor-btn {
border: 0;
background: transparent;
color: #f26666;
font-size: 28px;
line-height: 1;
cursor: pointer;
}
.add-anchor-btn {
margin-top: 16px;
min-width: 110px;
height: 38px;
border: 1px dashed #9b8bff;
border-radius: 8px;
background: #fff;
color: #6f68f3;
cursor: pointer;
}
.confirm-box {
margin-top: 18px;
padding: 18px;
border: 1px solid #efe6ff;
border-radius: 12px;
background: rgba(255, 166, 166, 0.04);
}
.confirm-title {
color: #5f66ec;
font-size: 18px;
font-weight: 600;
}
.confirm-box ul {
margin: 14px 0 0 18px;
padding: 0;
color: #6d758c;
font-size: 14px;
line-height: 2;
}
.footer-actions {
display: flex;
justify-content: flex-end;
gap: 14px;
margin-top: 30px;
}
.footer-actions.split {
justify-content: space-between;
}
.right-actions {
display: flex;
gap: 14px;
}
.footer-btn {
min-width: 110px;
height: 40px;
border-radius: 8px;
cursor: pointer;
}
.footer-btn.back {
border: 1px solid #d9dfeb;
background: #fff;
color: #6b7280;
}
.footer-btn.ghost {
border: 1px solid #eac47f;
background: #fffdf7;
color: #d4982b;
}
.footer-btn.primary {
border: 0;
background: #6f68f3;
color: #fff;
}
.footer-btn.submit {
border: 0;
color: #fff;
width: 114px;
height: 40px;
background: #6F68F3;
border-radius: 8px 8px 8px 8px;
color: #fff;
}
@media (max-width: 960px) {
.form-grid,
.three-grid,
.two-grid,
.dual-inputs {
grid-template-columns: 1fr;
}
.top-grid .wide,
.anchor-grid .wide-two,
.estimate-row {
grid-column: auto;
max-width: 100%;
}
.footer-actions,
.footer-actions.split,
.right-actions {
flex-direction: column;
align-items: flex-start;
}
}
</style>