csi-financial-front/src/views/pages/dashboard/indexNew.vue

775 lines
21 KiB
Vue
Raw Normal View History

2026-03-23 15:21:53 +08:00
<template>
<div class="all" v-loading="loading">
<div class="tabs">
<div
v-for="item in tabList"
:key="item.value"
class="tab_item"
:class="{ active: item.value === activeTab }"
@click="handleTabClick(item.value)"
>
{{ item.label }}
</div>
</div>
<!--transform: scale(0.9); transform-origin: top left -->
<!-- 全部 start -->
<div class="content" v-if="!activeTab">
<div class="card_view" style="display: flex; width: 100%; height: 486px">
<div class="top_left">
<div class="bg_view">
<div style="margin-top: -20px">
<text class="bg_view_title">已使用企业量</text>
<el-tooltip content="历史上曾登录财报页面的用户。" effect="dark" placement="top">
<img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" />
</el-tooltip>
</div>
<text class="bg_view_num">{{ stTotal.companyNumsUsed || 0 }}/{{ stTotal.companyNumsAll || 0 }}</text>
</div>
<div class="top_left_item" style="margin-top: 20px">
<div style="display: flex; align-items: center">
<div class="line_point" style="background: #ffb100"></div>
<text class="left_item_title">今日新增用户</text>
<el-tooltip content="当天第一次登录财保的企业。" effect="dark" placement="top">
<img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" style="margin-left: 5px" />
</el-tooltip>
</div>
<div>
<text class="left_item_num">{{ stTotal.todayNewCompanyNums ? stTotal.todayNewCompanyNums : 0 }}</text>
<text class="left_item_unit"></text>
</div>
</div>
<div class="top_left_item">
<div style="display: flex; align-items: center">
<div class="line_point" style="background: #00be67"></div>
<text class="left_item_title">尝试使用ESG企业数</text>
<img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" style="margin-left: 5px" />
</div>
<div>
<text class="left_item_num">{{ stTotal.esgNums ? stTotal.esgNums : 0 }}</text>
<text class="left_item_unit"></text>
</div>
</div>
</div>
<!-- 各运营中心使用分布 -->
<div class="top_right" style="flex: 1; margin-left: 30px">
<DashboardBar :data="stTotal.fenbu" v-if="Session.get('roleName') != 'operate'" />
</div>
</div>
<div style="display: flex; gap: 20px; width: 100%; height: 438px; margin-top: 20px">
<div class="card_view" style="width: 50%; height: 100%">
<DashboardLine :data="stTotal.user"></DashboardLine>
</div>
<div class="card_view" style="width: 50%; height: 100%; display: flex; padding: 20px">
<div class="nums" style="border-right: 1px solid #e5e5e5; padding-left: 30px">
<NumView
style="height: 33%"
icon="icon_yuqing"
title="已使用企业舆情"
numType="0"
tips="点击进入舆情页面。"
:num="stTotal.yqNums"
></NumView>
<NumView
style="height: 33%"
icon="icon_dianziqian"
title="已使用电子签"
numType="1"
tips="电子签功能激活。"
:num="stTotal.esignNums"
></NumView>
<NumView
style="height: 33%"
icon="icon_jianjiao"
title="已使用文件检校"
numType="2"
tips="2024年8月1日后上传文件。2024年7月19日批量上传过一各文件"
:num="stTotal.reportCheckNums"
></NumView>
</div>
<div class="nums" style="padding-left: 60px">
<NumView style="height: 33%" icon="icon_baogao" title="已使用报告生成" numType="3" tips="下载插件。" :num="stTotal.reportNums"></NumView>
<NumView
style="height: 33%"
icon="icon_xuanfa"
title="已使用报告宣发"
numType="4"
tips="点击分享或点击资讯链接。"
:num="stTotal.infoNums"
></NumView>
<NumView
style="height: 33%"
icon="icon_duanxin"
title="企业短信触达率"
numType="5"
tips="发送舆情/信披短信到企业。"
:num="stTotal.smsNums"
></NumView>
</div>
</div>
</div>
</div>
<!-- 全部 end -->
<!-- esg start -->
<div class="content" v-if="activeTab == 'esg'">
<div class="card_view" style="display: flex; width: 100%; height: 486px; flex-direction: column; gap: 30px">
<div style="width: 100%; gap: 30px; display: flex">
<EsgItem
label="尝试使用企业"
:value="stEsg.tryUsedNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#DFECFD"
tips="点击ESG进入。"
></EsgItem>
<EsgItem
label="已使用企业"
:value="stEsg.alreadyUsedNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#DFECFD"
tips="完成初级问卷填写数量、标准问卷填写数量、诊断报告下载数量、ESG报告下载四项之一。"
></EsgItem>
<EsgItem
label="初级问卷填写数量"
:value="stEsg.chuNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#DFECFD"
tips="开始填写初级问卷内容。"
></EsgItem>
<EsgItem
label="初级问卷填写完成数量"
:value="stEsg.chuFinishNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#DFECFD"
tips="初级问卷内容填写完成。"
></EsgItem>
</div>
<div style="width: 100%; gap: 30px; display: flex">
<EsgItem
label="标准问卷填写数量"
:value="stEsg.biaoNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#FCF6E3"
tips="开始填写标准问卷内容。"
></EsgItem>
<EsgItem
label="标准问卷填写完成数量"
:value="stEsg.biaoFinishNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#FCF6E3"
tips="标准问卷填写完成。"
></EsgItem>
<EsgItem
label="诊断报告导出数量"
:value="stEsg.exportNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#FCF6E3"
tips="下载诊断报告。"
></EsgItem>
<EsgItem
label="ESG报告导出数量"
:value="stEsg.esgExportNums"
:companyTotal="stTotal.companyNumsAll || 0"
color="#FCF6E3"
tips="下载ESG报告。"
></EsgItem>
</div>
</div>
</div>
<!-- esg end -->
<!-- 舆情 start -->
<div class="content" style="display: flex; gap: 30px" v-if="activeTab == 'yuqing'">
<div class="yq_left" style="gap: 30px">
<div class="card_view" style="display: flex; width: 400px; height: 208px; flex-direction: column; gap: 15px; justify-content: center">
<div>
<text class="yq_title">已使用企业数</text>
<el-tooltip content="点击进入舆情页面。" effect="dark" placement="top">
<img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" />
</el-tooltip>
</div>
<text class="yq_content">{{ stYq.companyNumsUsed || 0 }}</text>
<text class="yq_sub_content">企业总数{{ stYq.companyNumsAll || 0 }}</text>
</div>
<div class="card_view" style="display: flex; width: 400px; height: 208px; flex-direction: column; gap: 15px; justify-content: center">
<div>
<text class="yq_title">重度使用用户数</text>
<el-tooltip content="点击搜索或查看详情。" effect="dark" placement="top">
<img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" />
</el-tooltip>
</div>
<text class="yq_content">{{ stYq.companyNmusUsedZhong || 0 }}</text>
<text class="yq_sub_content">企业总数{{ stYq.companyNumsUsed || 0 }}</text>
</div>
</div>
<div class="yq_right" style="flex: 1">
<div class="card_view" style="width: 100%; height: 100%">
<DashboardLine :data="stYq.user"></DashboardLine>
</div>
</div>
</div>
<!-- 舆情 end -->
<!-- 检校 start -->
<div style="min-height: 100vh; width: 80vw; margin-left: -12vw" v-if="activeTab == 'jianjiao'">
<!-- :style="{ scale: isScaleDown ? '0.87' : '1', transformOrigin: 'top center' }" -->
<div>
<component :is="com[stroes.userInfos.roles[0]]" :key="stroes.userInfos.roles[0]" />
</div>
</div>
<!-- 检校 end -->
<!-- 其他 start -->
<div class="content" style="display: flex; flex-direction: column; gap: 30px" v-if="activeTab == 'qita'">
<div class="qita_row">
<div class="card_view" style="display: flex; width: 50vw; height: 630px; flex-direction: column; gap: 15px">
<CardViewTitle
linePointColor="#0779ff"
title="报告宣发(智能财讯)"
subTitle="已使用企业"
:subNum="stQita?.reportXuan?.nums"
titleType="0"
></CardViewTitle>
<DashboardLine style="margin-top: 50px" :data="stQita?.reportXuan?.user" lineType="0"> </DashboardLine>
</div>
<div class="card_view" style="display: flex; width: 50vw; height: 630px; flex-direction: column; gap: 15px">
<CardViewTitle
linePointColor="#FFB100"
title="智能信披库"
subTitle="已使用企业数"
:subNum="stQita?.smartInfo?.nums"
subTitle2="重度使用企业数"
:subNum2="stQita?.smartInfo?.numsZhong"
titleType="1"
></CardViewTitle>
<DashboardLine style="margin-top: 50px" :data="stQita?.smartInfo?.user" lineType="1"> </DashboardLine>
</div>
</div>
<div class="qita_row">
<div class="card_view" style="display: flex; width: 50vw; height: 630px; flex-direction: column; gap: 15px">
<CardViewTitle
titleType="2"
linePointColor="#01BE66"
title="报告生成"
subTitle="已使用企业数"
:subNum="stQita?.report?.nums"
></CardViewTitle>
<DashboardLine style="margin-top: 50px" :data="stQita?.report?.user" lineType="2"></DashboardLine>
</div>
<div class="card_view" style="display: flex; width: 50vw; height: 630px; flex-direction: column; gap: 15px">
<CardViewTitle
titleType="3"
linePointColor="#F64458"
title="电子签"
subTitle="已使用企业数"
:subNum="stQita?.esign?.companyNmusUsed"
></CardViewTitle>
<div class="r_item">
<div>
<text class="qita_tiem_title">已使用企业数</text>
<!-- <img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" /> -->
</div>
<text class="qita_tiem_content">{{ stQita?.esign?.companyNmusUsed || 0 }}</text>
<text class="qita_tiem_sub_content">企业总数{{ stQita?.esign?.companyNumsAll || 0 }}</text>
</div>
<div class="r_item">
<div>
<text class="qita_tiem_title">重度使用企业数</text>
<!-- <img src="../../../assets/icon_qustion.png" alt="" class="icon_qustion" /> -->
</div>
<text class="qita_tiem_content">{{ stQita?.esign?.companyNmusUsedZhong || 0 }}</text>
<text class="qita_tiem_sub_content">企业总数{{ stQita?.esign?.companyNmusUsed || 0 }}</text>
</div>
</div>
</div>
</div>
<!-- 其他 end -->
</div>
</template>
<script setup>
import { onMounted, ref, onUnmounted } from 'vue';
import DashboardBar from './charts/DashboardBar.vue';
import DashboardLine from './charts/DashboardLine.vue';
import NumView from './components/NumView.vue';
import CardViewTitle from './components/CardViewTitle.vue';
import { Session } from '/@/utils/storage';
import { defineAsyncComponent } from 'vue';
import { getStTotal, getStYq, getStOther, getStEsg } from '/@/api/api';
import { useUserInfo } from '/@/stores/userInfo';
import EsgItem from './components/EsgItem.vue';
// 定义需要缩小的分辨率阈值例如小于1024px时缩小
const SCALE_THRESHOLD = 1480;
// 缩小比例例如缩小到原来的0.8倍
const SCALE_RATIO = 0.8;
// 判断是否需要缩小
const isScaleDown = ref(window.innerWidth < SCALE_THRESHOLD);
const inWidth = ref(window.innerWidth);
// 处理窗口大小变化
const handleResize = () => {
isScaleDown.value = window.innerWidth < SCALE_THRESHOLD;
};
// 引入组件
const com = {
// 中证报监管
Director: defineAsyncComponent(() => import('/@/views/pages/dashboard/components/index.vue')),
// 分中心
subCenter: defineAsyncComponent(() => import('/@/views/pages/dashboard/components/index.vue')),
operate: defineAsyncComponent(() => import('/@/views/pages/dashboard/components/index.vue')),
// 证监会
CSRC: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
// 全国监管
QJJG: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
// 全国监管子账号
QJJGC: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
// 地方监管主账号
DFJG: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
// 地方监管子账号
DFJGC: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
// 交易所主账号
JYS: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
// 交易所子账号
JYSC: defineAsyncComponent(() => import('/@/views/pages/dashboard/jianguan/index.vue')),
};
// 获取账号信息
const stroes = useUserInfo();
const activeTab = ref(null);
const tabList = ref([
{
label: '总体',
value: null,
},
{
label: 'ESG',
value: 'esg',
},
{
label: '舆情',
value: 'yuqing',
},
{
label: '检校',
value: 'jianjiao',
},
{
label: '其他',
value: 'qita',
},
]);
const stTotal = ref({
companyNumsAll: 0, // 总企业数
companyNmusUsed: 0, // 已使用企业数
todayNewCompanyNums: 0, // 今日新增数
// 各运营中心使用分布
fenbu: {
// name: ['string1', 'string2', 'string3', 'string4', 'string5'],
// usedNums: ['100', '300', '500', '600', '700'],
// usedRate: ['80', '90', '30', '20', '50'],
},
// 近三月用户趋势
user: {
// time: ['80', '90', '30', '20', '50'],
// data: ['100', '300', '500', '600', '700'],
},
yqNums: 0, // 已使用企业舆情
reportNums: 0, // 已使用报告生成
esignNums: 0, // 已使用电子签
infoNums: 0, // 已使用报告宣发
reportCheckNums: 0, // 已使用文件检校
smsNums: 0, // 短信触达
});
// 运营账号看板-总体
async function getStTotalFn() {
loading.value = true;
let { code, data } = await getStTotal({});
if (code == 200) {
stTotal.value = data;
console.log('🚀 ~ getStTotalFn ~ stTotal.value:', stTotal.value);
}
loading.value = false;
}
const stYq = ref({
companyNumsAll: 0, // 总企业数
companyNmusUsed: 0, // 已使用企业数
companyNmusUsedZhong: 0, // 重度使用数
user: {
// time: ['80', '90', '30', '20', '50'],
// data: ['100', '300', '500', '600', '700'],
},
});
// 运营账号看板-舆情
async function getStYqFn() {
loading.value = true;
let { code, data } = await getStYq({});
if (code == 200) {
stYq.value = data;
}
loading.value = false;
}
const stQita = ref({
reportXuan: {
nums: 0, // 已使用报告宣发总数
user: {
// time: ['80', '90', '30', '20', '50'],
// data: ['100', '300', '500', '600', '700'],
},
},
smartInfo: {
nums: 0, // 已使用智能信披库总数
numsZhong: 0, // 重度使用数
user: {
// time: ['80', '90', '30', '20', '50'],
// data: ['100', '300', '500', '600', '700'],
},
},
report: {
nums: 0, // 已使用报告生成总数
user: {
// time: ['80', '90', '30', '20', '50'],
// data: ['100', '300', '500', '600', '700'],
},
},
esign: {
companyNumsAll: 0, // 总企业数
companyNmusUsed: 0, // 使用企业数
companyNmusUsedZhong: 0, // 重度使用企业数
},
});
const stEsg = ref({
tryUsedNums: 0, // 尝试使用esg企业数
alreadyUsedNums: 0, // 已使用esg企业数
chuNums: 0, // 初级问卷填写数量
chuFinishNums: 0, // 初级问卷填写完成数量
biaoNums: 0, // 标准问卷填写数量
biaoFinishNums: 0, // 标准问卷填写完成数量
exportNums: 0, // 诊断报告导出数量
esgExportNums: 0, // esg报告导出数量
});
const loading = ref(false);
// 运营账号看板-其他
async function getStOtherFn() {
loading.value = true;
let { code, data } = await getStOther({});
if (code == 200) {
stQita.value = data;
}
loading.value = false;
}
// 处理tab点击事件
const handleTabClick = (tabValue) => {
activeTab.value = tabValue;
if (tabValue === null) {
getStTotalFn();
} else if (tabValue === 'yuqing') {
getStYqFn();
} else if (tabValue === 'qita') {
getStOtherFn();
} else if (tabValue === 'esg') {
getStEsgFn();
}
};
async function getStEsgFn() {
loading.value = true;
let { code, data } = await getStEsg({});
loading.value = false;
if (code == 200) {
stEsg.value = data;
}
}
onMounted(() => {
// 运营账号看板-总体
getStTotalFn();
// // 运营账号看板-舆情
// getStYqFn();
// // 运营账号看板-其他
// getStOtherFn();
window.addEventListener('resize', handleResize);
});
onUnmounted(() => {
window.removeEventListener('resize', handleResize);
});
</script>
<style scoped lang="scss">
$minWidth: 68.75rem;
$contentWidth: 85vw;
.all {
background-color: #f5f7fd;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 20px;
padding: 20px;
width: 100vw;
align-items: center;
overflow: auto;
}
.tabs {
width: $contentWidth;
min-width: $minWidth;
display: flex;
justify-content: flex-start;
gap: 20px;
.tab_item {
padding: 10px 20px;
cursor: pointer;
width: 98px;
height: 32px;
background: #ffffff;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1);
border-radius: 4px;
display: flex;
text-align: center;
justify-content: center;
align-items: center;
}
.active {
background: #0779ff;
color: white;
}
}
.content {
width: $contentWidth;
min-width: $minWidth;
}
.card_view {
background: #ffffff;
box-shadow: 0px 2px 8px 4px rgba(0, 0, 0, 0.1);
border-radius: 4px;
padding: 30px;
}
.bg_view {
width: 397px;
height: 186px;
box-shadow: 0px 2px 12px 0px rgba(128, 131, 134, 0.2);
border-radius: 8px;
background: url('../../../assets/dashboard/bg_pic.png') no-repeat;
background-size: 100% 100%;
display: flex;
flex-direction: column;
justify-content: center;
padding: 1.875rem;
gap: 1.25rem;
}
.bg_view_title {
width: 140px;
height: 28px;
font-family: PingFangSC, PingFang SC;
font-weight: normal;
font-size: 20px;
color: #5f6063;
line-height: 28px;
text-align: left;
font-style: normal;
}
.bg_view_num {
width: 236px;
height: 56px;
font-family: PingFangSC, PingFang SC;
font-weight: bold;
font-size: 40px;
color: #1a1a1a;
line-height: 56px;
text-align: left;
font-style: normal;
}
.icon_qustion {
width: 12px;
height: 12px;
margin-left: 8px;
}
.top_left {
width: 397px;
display: flex;
flex-direction: column;
.line_point {
width: 10px;
height: 36px;
}
.top_left_item {
display: flex;
justify-content: space-between;
align-items: center;
height: 80px;
}
.left_item_title {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 16px;
color: #5f6063;
line-height: 22px;
text-align: left;
font-style: normal;
margin-left: 20px;
}
.left_item_num {
width: 84px;
height: 40px;
font-family: PingFangSC, PingFang SC;
font-weight: 500;
font-size: 28px;
color: #1a1a1a;
line-height: 40px;
text-align: left;
font-style: normal;
}
}
.top_right {
width: 50%;
height: 100%;
}
.nums {
display: flex;
flex-direction: column;
justify-content: center;
// align-items: center;
width: 50%;
height: 100%;
}
.yq_left {
display: flex;
flex-direction: column;
}
.yq_title {
font-family: PingFangSC, PingFang SC;
font-weight: bold;
font-size: 20px;
color: #222222;
line-height: 28px;
text-align: left;
font-style: normal;
}
.yq_content {
font-family: PingFangSC, PingFang SC;
font-weight: bold;
font-size: 32px;
color: #1a1a1a;
line-height: 45px;
text-align: left;
font-style: normal;
}
.yq_sub_content {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 20px;
color: #5f6063;
line-height: 28px;
text-align: left;
font-style: normal;
}
.qita_row {
display: flex;
gap: 30px;
}
.r_item {
// width: 605px;
height: 208px;
background: #dfecfd;
border-radius: 4px;
display: flex;
flex-direction: column;
justify-content: center;
gap: 15px;
padding: 30px;
}
.qita_tiem_title {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 16px;
color: #5f6063;
line-height: 22px;
text-align: left;
font-style: normal;
}
.qita_tiem_content {
font-family: PingFangSC, PingFang SC;
font-weight: bold;
font-size: 32px;
color: #1a1a1a;
line-height: 45px;
text-align: left;
font-style: normal;
}
.qita_tiem_sub_content {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 20px;
color: #5f6063;
line-height: 28px;
text-align: left;
font-style: normal;
}
/* 缩小状态 */
.scale-down {
/* 缩放内容 */
transform: scale(var(--scale-ratio, 0.8));
/* 计算缩放后的偏移量,使内容居中 */
transform-origin: top center;
/* 调整容器宽度,避免边缘被截断 */
width: calc(1 / var(--scale-ratio, 0.8) * 100%);
margin: 0 auto;
}
</style>