1.26 个股详情业务结构,发展历程模块完善

This commit is contained in:
尚政杰
2026-01-26 17:53:08 +08:00
parent f296e005b3
commit 67a673cd4d
508 changed files with 44334 additions and 305 deletions

View File

@@ -1,120 +1,101 @@
<template>
<view style="padding: 25rpx 20rpx; box-sizing: border-box;">
<view style="display: flex; align-items: center; font-size: 28rpx;"><text>关键因素</text><text
style="font-size: 24rpx; color: #070707; padding: 0rpx 10rpx; border-radius: 3rpx; background-color: #F2C369; margin-left: 10rpx;">19</text>
<view v-if="keyFactorsInfo" class="flex" style="font-size: 28rpx;"><text>关键因素</text><text
style="font-size: 24rpx; color: #070707; padding: 0rpx 10rpx; border-radius: 3rpx; background-color: #F2C369; margin-left: 10rpx;">{{keyFactorsInfo.total_factors}}</text>
</view>
<view class="keyFactorsList">
<view class="item" v-for="(item, index) in keyFactorsList" :key="index" @click="item.show = !item.show"
style="margin: 20rpx 0; background-color: #FAFAFC; border-radius: 10rpx; padding: 25rpx 20rpx; color: #2B2B2B;">
<view style="display: flex; align-items: center; justify-content: space-between;">
<view style="flex: 1; font-size: 26rpx;"><text>{{item.category_name}}</text><text
style="font-size: 24rpx; color: #070707; padding: 0rpx 10rpx; border-radius: 3rpx; background-color: #F2C369; margin-left: 10rpx;">{{item.factors.length}}</text>
</view>
<image v-if="item.show" style="width: 20rpx; height: 12rpx;"
src="/pagesStock/static/icon/shangJiantou.png" mode="widthFix"></image>
<image v-else style="width: 20rpx; height: 12rpx;" src="/pagesStock/static/icon/xiaJiantou.png"
mode="widthFix"></image>
</view>
<template v-if="item.show">
<view class="fitem" v-for="(fitem,findex) in item.factors" :key="findex"
style="margin: 20rpx 0; padding: 20rpx; background-color: white; border-radius: 10rpx; border: 1rpx solid #E7E7E7; color: #2B2B2B; font-weight: 500; font-size: 26rpx;">
<view class="titleImpactC flex between">
<view>{{fitem.factor_name}}</view>
<view v-if="fitem.impact_direction=='negative'" class="impact negative">负面</view>
<view v-if="fitem.impact_direction=='neutral'" class="impact neutral">中性</view>
<view v-if="fitem.impact_direction=='positive'" class="impact positive">正面</view>
</view>
<view class="valueChgC flex" style="margin-top: 10rpx;">
<view :class="'value '+(fitem.impact_direction)">{{fitem.factor_value}}{{fitem.factor_unit}}
</view>
<view :class="'chgC flex '+(getRateUpOrDown(fitem.year_on_year)?'down':'up')">
<image v-if="getRateUpOrDown(fitem.year_on_year)" class="icon" src="/pagesStock/static/icon/downArrow.png" mode="widthFix"></image>
<image v-else class="icon" src="/pagesStock/static/icon/upArrow.png" mode="widthFix"></image>
<view>{{fitem.year_on_year?fitem.year_on_year:0}}%</view>
</view>
</view>
<view style="margin-top: 10rpx; color: #999999; font-size: 22rpx;">{{fitem.factor_desc}}</view>
<view style="margin-top: 10rpx; color: #999999; font-size: 22rpx;">影响权重: {{fitem.impact_weight}}</view>
</view>
</template>
</view>
</view>
<view v-for="(item, index) in gj_list" :key="index" @click="item.show = !item.show"
style="margin: 20rpx 0; background-color: #FAFAFC; border-radius: 10rpx; padding: 25rpx 20rpx; color: #2B2B2B;">
<view style="display: flex; align-items: center; justify-content: space-between;">
<view style="flex: 1; font-size: 26rpx;"><text>{{item.title}}</text><text
style="font-size: 24rpx; color: #070707; padding: 0rpx 10rpx; border-radius: 3rpx; background-color: #F2C369; margin-left: 10rpx;">{{item.count}}</text>
</view>
<image v-if="item.show" style="width: 20rpx; height: 12rpx;"
src="/pagesStock/static/icon/shangJiantou.png" mode="widthFix"></image>
<image v-else style="width: 20rpx; height: 12rpx;" src="/pagesStock/static/icon/xiaJiantou.png"
mode="widthFix"></image>
</view>
<template v-if="item.show">
<view v-for="child in item.count"
style="margin: 20rpx 0; padding: 20rpx; box-sizing: border-box; background-color: white; border-radius: 10rpx; border: 1rpx solid #E7E7E7; color: #2B2B2B; font-weight: 500; font-size: 26rpx;">
<view style="display: flex; align-items: center; justify-content: space-between;">
<view>净息差</view>
<view
style="background-color: #345423; border-radius: 5rpx; color: white; padding: 0 10rpx; text-align: center; font-size: 20rpx;">
负面</view>
</view>
<view style="display: flex;align-items: center; margin-top: 10rpx;">
<view style="color: #345423; font-weight: bold; font-size: 30rpx; margin-right: 10rpx;">1.79亿元
</view>
<view
style="display: flex; align-items: center; border: 1rpx solid #345423; padding: 0 10rpx; text-align: center; font-size: 20rpx; color: #345423; border-radius: 5rpx;">
<image style="width: 11rpx; height: 15rpx; margin-right: 5rpx;"
src="/pagesStock/static/icon/upArrow.png" mode="widthFix"></image>0.51%
</view>
</view>
<view style="margin-top: 10rpx; color: #999999; font-size: 22rpx;">银行核心盈利能力指标反映存贷利差水平</view>
<view style="margin-top: 10rpx; color: #999999; font-size: 22rpx;">影响权重: 90</view>
</view>
</template>
</view>
<view style="display: flex; align-items: center; font-size: 28rpx;"><text>发展时间线</text>
<view v-if="timelineInfo" class="flex" style="font-size: 28rpx;"><text>发展时间线</text>
<text
style="font-size: 24rpx; color: white; padding: 0rpx 10rpx; border-radius: 3rpx; background-color: #EC3440; margin-left: 10rpx;">正面
19</text>
{{timelineInfo.positive_events}}</text>
<text
style="font-size: 24rpx; color: white; padding: 0rpx 10rpx; border-radius: 3rpx; background-color: #345423; margin-left: 10rpx;">负面
1</text>
{{timelineInfo.negative_events}}</text>
</view>
<view class="timelineList">
<view class="item" v-for="(item,index) in timelineList" :key="index" @click="clickAction">
<view class="impactC flexColumnCenter">
<image v-if="item.impact_metrics.is_positive==1" class="icon" style="margin-top: 20rpx;"
src="/pagesStock/static/icon/yuan_shang.png" mode="widthFix"></image>
<image v-else class="icon" src="/pagesStock/static/icon/yuan_jiang.png" mode="widthFix"></image>
<view :class="'line flex1 '+(item.impact_metrics.is_positive==1?'up':'down')"></view>
</view>
<view
style="flex: 1; margin-left: 10rpx; background-color: #FAFAFC; padding: 24rpx 15rpx; border-radius: 10rpx; font-weight: 500;">
<view class="titleTypeC">
<text class="title">{{item.event_title}}</text>
<text :class="'eventType '+(item.impact_metrics.is_positive==1?'up':'down')">{{item.event_type}}</text>
</view>
<view style="color: #999999; font-size: 20rpx; margin: 15rpx 0;">{{item.event_date}}</view>
<view style="color: #71675D; font-size: 22rpx;">{{item.event_desc}}</view>
<view style="display: flex; align-items: center; margin-top: 30rpx;">
<view style="color: #71675D; font-size: 22rpx; font-weight: 500;">影响度</view>
<view class="progressBgC">
<view :class="'progress '+(item.impact_metrics.is_positive==1?'up':'down')" :style="{width: `${item.impact_metrics.impact_score}%`}">
</view>
</view>
<view style="color: #71675D; font-size: 24rpx; font-weight: 500;">{{item.impact_metrics.impact_score}}</view>
</view>
</view>
</view>
</view>
<view v-for="item in 3" @click="clickAction"
style="display: flex; margin: 20rpx 0; border-radius: 10rpx; box-sizing: border-box; color: #2B2B2B;">
<view style="display: flex; flex-direction: column; align-items: center;">
<image style="width: 30rpx; height: 30rpx; margin-top: 20rpx;"
src="/pagesStock/static/icon/yuan_shang.png" mode="widthFix"></image>
<view
style="flex: 1; width: 1rpx; border-left: 1rpx dashed #EC3440; margin-top: 10rpx; margin-bottom: -30rpx;">
</view>
</view>
<view
style="flex: 1; margin-left: 10rpx; background-color: #FAFAFC; padding: 24rpx 15rpx; border-radius: 10rpx; font-weight: 500;">
<view>
<text style="color: #2A2A2A; font-weight: bold; font-size: 24rpx; margin-right: 10rpx;">不良贷款率连续四年低于1.1%</text>
<text
style="background-color: #FFE7E9; color: #EC3440; padding: 5rpx 10rpx; border-radius: 5rpx; font-size: 20rpx; ">Achievement</text>
</view>
<view style="color: #999999; font-size: 20rpx; margin: 15rpx 0;">2025-06-30</view>
<view style="color: #71675D; font-size: 22rpx;">2025年中报不良率1.06%拨备覆盖率290%资产质量保持股份行领先</view>
<view style="display: flex; align-items: center; margin-top: 30rpx;">
<view style="color: #71675D; font-size: 22rpx; font-weight: 500;">影响度</view>
<view
style="width: 200rpx; height: 10rpx; background-color: #EFEFEF; border-radius: 5rpx; margin: 0 15rpx; overflow: hidden;">
<view
style="height: 100%; border-radius: 5rpx; background:linear-gradient(to right, #FF525D, #EC3440)"
:style="{width: `${95}%`}">
</view>
</view>
<view style="color: #71675D; font-size: 24rpx; font-weight: 500;">95</view>
</view>
</view>
</view>
</view>
</template>
<script>
<script>
import { getRateUpOrDown } from '@/utils/util';
export default {
name: "fzlc-view",
data() {
return {
gj_list: [{
title: '产量与销量指标',
count: 8,
show: false
},
{
title: '价格与成本驱动',
count: 3,
show: false
},
{
title: '市场与客户指标',
count: 2,
show: false
},
{
title: '行业特定指标',
count: 4,
show: false
},
{
title: '风险与异常指标',
count: 2,
show: false
}
]
getRateUpOrDown:getRateUpOrDown
};
},
props: {
keyFactorsInfo:null,
keyFactorsList:Array, //关键因素数组
timelineInfo:null,
timelineList:Array, //发展时间线数组
},
methods: {
clickAction() {
this.$emit('detail')
@@ -123,6 +104,159 @@
}
</script>
<style lang="less">
<style lang="less">
.keyFactorsList
{
.item
{
.fitem
{
.impact
{
border-radius: 5rpx;
padding: 0 10rpx;
font-size: 20rpx;
font-weight: 500;
color: white;
}
.impact.negative
{
background-color: #345423;
}
.impact.neutral
{
background-color: #345423;
}
.impact.positive
{
background-color: #EC3440;
}
.valueChgC
{
.value
{
font-size: 30rpx;
font-weight: bold;
margin-right: 10rpx;
}
.value.negative
{
color: #345423;
}
.value.neutral
{
color:#345423;
}
.value.positive
{
color: #EC3440;
}
.chgC
{
padding: 0 10rpx;
border-radius: 5rpx;
font-size: 20rpx;
.icon
{
margin-right: 5rpx;
width: 11rpx;
height: auto;
}
}
.chgC.down
{
border: 1rpx solid #345423;
color: #345423;
}
.chgC.up
{
border: 1rpx solid #EC3440;
color: #EC3440;
}
}
}
}
}
.timelineList
{
.item
{
display: flex;
margin: 20rpx 0;
border-radius: 10rpx;
.impactC
{
.icon
{
width: 30rpx;
height: auto;
}
.line
{
margin: 10rpx 0 -30rpx;
width: 1rpx;
}
.line.up
{
border-left: 1rpx dashed #EC3440;
}
.line.down
{
border-left: 1rpx dashed #345423;
}
}
.titleTypeC
{
.title
{
margin-right: 10rpx;
font-size: 24rpx;
font-weight: bold;
color: #2A2A2A;
}
.eventType
{
padding: 5rpx 10rpx;
border-radius: 5rpx;
font-size: 20rpx;
font-weight: 500;
}
.eventType.up
{
background-color: #FFE7E9;
color: #EC3440;
}
.eventType.down
{
background-color:#DEEED6;
color: #345423;
}
}
.progressBgC
{
background-color: #EFEFEF;
margin: 0 15rpx;
width: 200rpx;
height: 10rpx;
border-radius: 5rpx;
overflow: hidden;
.progress
{
height: 100%;
border-radius: 5rpx;
}
.progress.up
{
background:linear-gradient(to right, #FF525D, #EC3440)
}
.progress.down
{
background:linear-gradient(to right, #537D3D, #345423)
}
}
}
}
</style>

View File

@@ -4,7 +4,7 @@
<view class="flex">
<view class="title">实际控制人</view>
</view>
<view class="com_info">
<view v-if="actualControlInfo" class="com_info">
<view class="left">
<view class="l_top">{{actualControlInfo.actual_controller_name}}</view>
<view class="l_bottom">
@@ -14,7 +14,7 @@
</view>
<view class="right">
<view class="r_top">控制比例</view>
<view class="r_center">{{actualControlInfo.holding_ratio.toFixed(2)}}%</view>
<view v-if="actualControlInfo.holding_ratio" class="r_center">{{actualControlInfo.holding_ratio.toFixed(2)}}%</view>
<view class="r_bottom">{{getNumStr(actualControlInfo.holding_shares)}}</view>
</view>
</view>
@@ -26,10 +26,8 @@
<view class="top">2025-09-30 00:00:00</view>
<view class="bottom">
<view class="b_item">
<view v-for="(item, index) in 4" class="item_info">
<view class="left">
前1大股东
</view>
<view v-for="(item, index) in concentrationList" :key="index" class="item_info flexWrap">
<view class="left">{{item.stat_item}}</view>
<view class="right">
<view class="bili">49.56%</view>
<view class="shengjiang" :class="{action : index % 2 == 0}">
@@ -40,7 +38,7 @@
</view>
</view>
</view>
<view style="width: 15rpx;"></view>
<!-- <view style="width: 15rpx;"></view>
<view class="b_item">
<view v-for="(item, index) in 4" class="item_info">
<view class="left">
@@ -55,7 +53,7 @@
</view>
</view>
</view>
</view>
</view> -->
</view>
</view>
@@ -65,21 +63,19 @@
<view class="gudong">
<view class="back">
<view class="top action" style="height: 54rpx;">
<view>股东名称</view>
<view>股东类型</view>
<view style="text-align: center;">持股数量</view>
<view style="text-align: center;">持股比例</view>
<view style="text-align: center;">股份性质</view>
<view class="top action">
<view class="head">股东名称</view>
<view class="head">股东类型</view>
<view class="head" style="text-align: center;">持股数量</view>
<view class="head" style="text-align: center;">持股比例</view>
<view class="head" style="text-align: center;">股份性质</view>
</view>
<view v-for="(item, index) in shareholdersList" :key="index" class="top" :class="{action: index % 2 == 1}">
<view class="child">{{item.shareholder_name}}</view>
<view class="child">{{item.shareholder_type}}</view>
<view class="child" style="text-align: center;">{{getNumStr(item.holding_shares)}}</view>
<view class="child" style="color: #3E87CF; font-weight: bold; text-align: center;">{{item.total_share_ratio}}%</view>
<view class="child"
style="background-color: #FFF7E9; color: #E0AC4A; border-radius: 5rpx; padding: 5rpx 10rpx; text-align: center;">
{{item.share_nature}}</view>
<view class="nature">{{item.share_nature}}</view>
</view>
</view>
</view>
@@ -90,21 +86,19 @@
<view class="gudong">
<view class="back">
<view class="top action" style="height: 54rpx;">
<view>股东名称</view>
<view>股东类型</view>
<view style="text-align: center;">持股数量</view>
<view style="text-align: center;">流通股比例</view>
<view style="text-align: center;">股份性质</view>
<view class="top action">
<view class="head">股东名称</view>
<view class="head">股东类型</view>
<view class="head" style="text-align: center;">持股数量</view>
<view class="head" style="text-align: center;">流通股比例</view>
<view class="head" style="text-align: center;">股份性质</view>
</view>
<view v-for="(item, index) in circulatingShareholdersList" :key="index" class="top" :class="{action: index % 2 == 1}">
<view class="child">{{item.shareholder_name}}</view>
<view class="child">{{item.shareholder_type?item.shareholder_type:'-'}}</view>
<view class="child" style="text-align: center;">{{getNumStr(item.holding_shares)}}</view>
<view class="child" style="color: #893ECF; font-weight: bold; text-align: center;">{{item.total_share_ratio}}%</view>
<view class="child"
style="background-color: #FFF7E9; color: #E0AC4A; border-radius: 5rpx; padding: 5rpx 10rpx; text-align: center;">
{{item.share_nature}}</view>
<view class="nature">{{item.share_nature}}</view>
</view>
</view>
</view>
@@ -125,6 +119,7 @@
},
props:{
actualControlInfo:Object, //实际控制人信息
concentrationList:[], //股权集中度列表
shareholdersList:Array, //十大股东列表
circulatingShareholdersList:Array, //十大流通股东列表
competitivePositionInfo:Object, //竞争地位信息
@@ -275,31 +270,43 @@
.back {
margin: 25rpx 0;
font-weight: 500;
background-color: #FAFAFC;
border-radius: 10rpx;
padding: 25rpx 13rpx;
box-sizing: border-box;
color: #666666;
.top {
width: 100%;
display: grid;
display: grid;
align-items: center;
grid-template-columns: 166rpx repeat(4, 1fr);
font-size: 22rpx;
background-color: white;
background-color: white;
height: 60rpx;
&.action {
background-color: #FAFAFC;
background-color: #FAFAFC;
}
.child {
.head
{
padding: 0 10rpx;
font-size: 22rpx;
}
.child {
padding: 0 10rpx;
font-size: 18rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin: 10rpx 0;
text-overflow: ellipsis;
}
.child:first-child {
margin-right: 20rpx;
.nature
{
background-color: #FFF7E9;
margin: 10rpx;
line-height: 36rpx;
border-radius: 5rpx;
font-size: 18rpx;
color: #E0AC4A;
text-align: center;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}

View File

@@ -1,10 +1,11 @@
<template>
<view class="ywjg_list">
<view v-for="(item,index) in ywjg" :key="index">
<view>
<block v-for="(item,index) in businessStructureList" :key="index"></block>
<view style="margin: 25rpx 20rpx; color: #2B2B2B; font-size: 28rpx; font-weight: bold;">
{{item.title}}
</view>
<view v-if="index == 0" v-for="(child, row) in item.list" :key="row" class="ywjg_item_1">
<view v-for="(child, row) in item.list" :key="row" class="ywjg_item_1">
<view style="display: flex; align-items: center;">
<view style="font-size: 28rpx; font-weight: bold; margin-right: 10rpx;">
{{child.title}}
@@ -36,14 +37,16 @@
</view>
</view>
</view>
<view v-else style="font-weight: 500;">
<view v-for="(child,row) in item.list" :key="row"
<view style="font-weight: 500;">
<view v-for="(item,index) in businessSegmentList" :key="item"
style="background-color: #FAFAFC; color: #2B2B2B; font-size: 22rpx; margin: 20rpx; background-color: #FAFAFC; border-radius: 10rpx; padding: 25rpx 20rpx;">
<view style="font-size: 24rpx;">{{child.title}}</view>
<view v-for="(model, j) in child.list" :key="j">
<view style="color: #BB8520; font-weight: bold; margin: 10rpx 0;">{{model.title}}</view>
<view style="color: #71675D;">{{model.info}}</view>
</view>
<view style="font-size: 24rpx;">{{item.segment_name}}</view>
<view style="color: #BB8520; font-weight: bold; margin: 10rpx 0;">业务描述</view>
<view style="color: #71675D;">{{item.segment_description}}</view>
<view style="color: #BB8520; font-weight: bold; margin: 10rpx 0;">竞争地位</view>
<view style="color: #71675D;">{{item.competitive_position}}</view>
<view style="color: #BB8520; font-weight: bold; margin: 10rpx 0;">未来潜力</view>
<view style="color: #71675D;">{{item.future_potential}}</view>
</view>
</view>
</view>
@@ -55,107 +58,13 @@
name: "ywjg-view",
data() {
return {
ywjg: [{
title: '业务结构分析',
list: [{
title: '零售业务',
is_hexin: 1,
yszb: 55.16,
mlv: 78.21,
yysr: 17900,
zz: -8.20
}, {
title: '科技金融',
is_hexin: 1,
yszb: 41.121,
mlv: 89.11,
yysr: 13400,
zz: 24.60
}, {
title: '绿色金融',
is_hexin: 0,
yszb: 2.37,
mlv: 9.11,
yysr: 771,
zz: 36.90
}, {
title: '零售业务',
is_hexin: 0,
yszb: 2.37,
mlv: 9.11,
yysr: 396,
zz: -16.90
}]
},
{
title: '业务板块详情',
list: [{
title: '零售银行业务',
list: [{
title: '业务描述',
info: '平安银行对公业务践行'
},
{
title: '竞争地位',
info: '平安银行零售业务在同行业中保持较强竞争力,凭借其数字化创新优势和综合金融背景,构建了差异化竞争优势。'
},
{
title: '未来潜力',
info: '平安银行零售业务未来发展潜力巨大,随着中国财富管理市场的快速扩张和中产阶级规模的持续增长,零售银行...展开查看'
}
]
}, {
title: '对公业务',
list: [{
title: '业务描述',
info: '平安银行对公业务践行'
},
{
title: '竞争地位',
info: '平安银行对公业务在市场中保持较强竞争力,贷款规模实现两位数增长,远高于行业平均水平。通过差异化战略...展开查看'
},
{
title: '未来潜力',
info: '随着国家对科创、绿色经济的持续支持,以及对普惠金融的政策倾斜,平安银行对公业务面临广阔发展空间...展开查看'
}
]
},
{
title: '同业业务',
list: [{
title: '业务描述',
info: '平安银行同业业务主要包括债券交易、同业拆借、票据业务等。'
},
{
title: '竞争地位',
info: '平安银行同业业务在股份制银行中位居前列债券交易市场份额达4.4%,显示出较强的市场竞争力。'
},
{
title: '未来潜力',
info: '随着金融市场深化改革和利率市场化推进,同业业务面临新的发展机遇。平安银行同业业务凭借其债券...展开查看'
}
]
},
{
title: '普惠金融',
list: [{
title: '业务描述',
info: '普惠金融是平安银行'
},
{
title: '竞争地位',
info: '平安银行普惠金融业务在行业内保持领先地位,小微企业贷款规模较大且客户基础广泛。通过优化产品体系、提...展开查看'
},
{
title: '未来潜力',
info: '随着国家持续推动普惠金融发展战略,平安银行该业务具有广阔发展空间。通过数字化转型深化、客户体验...展开查看'
}
]
}
]
}
]
};
};
},
props:{
businessStructureList:Array, //业务结构分析
businessSegmentList:Array //业务板块详情
}
}
</script>