2.6 盈利能力模块表格完善

This commit is contained in:
尚政杰
2026-02-06 18:01:05 +08:00
parent 890be2e3e9
commit 6dc7d00e6a
48 changed files with 2831 additions and 697 deletions

View File

@@ -96,21 +96,16 @@ const _sfc_main = {
};
},
computed: {
// 筛选后的股票列表
// 筛选后的股票列表按板块codes匹配 + 连板排序/筛选
filteredStocks() {
var _a;
if (!this.allStocks.length)
if (!((_a = this.originData) == null ? void 0 : _a.stocks) || !this.bkList.length)
return [];
let stocks = [...this.allStocks];
if (this.activeIndex >= 0 && this.bkList.length) {
const currentSector = (_a = this.bkList[this.activeIndex]) == null ? void 0 : _a.title;
if (currentSector) {
stocks = stocks.filter((stock) => {
const sectorMatch = stock.core_sectors.some((s) => s.includes(currentSector)) || (Array.isArray(stock.sector_category) ? stock.sector_category.includes(currentSector) : stock.sector_category === currentSector);
return sectorMatch;
});
}
}
const currentBk = this.bkList[this.activeIndex];
if (!(currentBk == null ? void 0 : currentBk.codes) || currentBk.codes.length === 0)
return [];
const targetCodes = new Set(currentBk.codes);
let stocks = this.originData.stocks.filter((stock) => targetCodes.has(stock.scode));
switch (this.filterIndex) {
case 0:
stocks.sort((a, b) => {
@@ -134,7 +129,7 @@ const _sfc_main = {
onLoad(e) {
this.activeIndex = e.index;
this.selectedFullDate = e.data;
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/bkydmx.vue:237", "selectedFullDate", this.selectedFullDate);
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/bkydmx.vue:229", "selectedFullDate", this.selectedFullDate);
this.contentTop = this.navH + 20 / 750 * common_vendor.inject("windowWidth");
this.fetchData();
},
@@ -230,7 +225,6 @@ const _sfc_main = {
setStockRoles() {
if (!this.originData || !this.originData.stocks || !this.bkList.length)
return;
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/bkydmx.vue:357", "setStockRoles", JSON.stringify(this.originData.stocks));
this.allStocks = this.originData.stocks.map((stock) => {
let sectorIndex = -1;
const stockSectors = Array.isArray(stock.sector_category) ? stock.sector_category : [stock.sector_category];
@@ -263,28 +257,20 @@ const _sfc_main = {
const formattedDate = this.selectedFullDate;
const baseURL = request_http.getBaseURL1();
const requestUrl = `${baseURL}/data/zt/daily/${formattedDate}.json?t=${timestamp}`;
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/bkydmx.vue:401", "请求URL", requestUrl);
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/bkydmx.vue:390", "请求URL", requestUrl);
const res = await common_vendor.index.request({
url: requestUrl,
method: "GET"
});
if (res.statusCode === 200 && res.data) {
this.originData = res.data;
const chartData = this.originData.chart_data || {};
const labels = chartData.labels || [];
const counts = chartData.counts || [];
const maxCount = counts.length > 0 ? Math.max(...counts) : 0;
const maxLen = Math.min(labels.length, counts.length);
let bkList = [];
for (let i = 0; i < maxLen; i++) {
const title = labels[i];
const count = counts[i] || 0;
bkList.push({
title,
count
});
}
this.bkList = bkList;
const { sector_data } = this.originData;
this.bkList = Object.entries(sector_data).filter(([sectorName]) => sectorName !== "其他").map(([sectorName, sectorInfo]) => ({
title: sectorName,
codes: sectorInfo.stock_codes || []
// 取板块对应的股票代码
}));
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/bkydmx.vue:408", "生成板块列表:", this.bkList);
this.setStockRoles();
} else {
common_vendor.index.showToast({
@@ -293,7 +279,7 @@ const _sfc_main = {
});
}
} catch (error) {
common_vendor.index.__f__("error", "at pagesStock/stockCenterDetails/bkydmx.vue:440", "请求异常:", error);
common_vendor.index.__f__("error", "at pagesStock/stockCenterDetails/bkydmx.vue:418", "请求异常:", error);
common_vendor.index.showToast({
title: "网络异常",
icon: "none"

View File

@@ -0,0 +1,313 @@
"use strict";
const common_vendor = require("../../../common/vendor.js");
const request_api = require("../../../request/api.js");
const common_assets = require("../../../common/assets.js");
const _sfc_main = {
data() {
return {
navH: common_vendor.inject("navHeight"),
windowWidth: common_vendor.inject("windowWidth"),
contentTop: "",
otherTop: "",
stockCode: "000001",
//股票代码
tabList: ["盈利能力", "每股指标", "成长能力", "资产负债表", "现金流量指标", "现金流量表"],
activeIndex: 0,
topScrollWidth: 0,
topScrollLeft: 0,
filterList: ["全部", "年报", "中报", "一季度", "三季度"],
filterIndex: 0,
secondScrollWidth: 0,
secondScrollLeft: 0,
periodList: [
{
title: "最近4期",
period: 4
},
{
title: "最近8期",
period: 8
},
{
title: "最近12期",
period: 12
},
{
title: "最近16期",
period: 16
}
],
periodIndex: 1,
periodTop: "",
periodShow: false,
//是否显示弹窗
leftList: [
["净资产收益率(ROE)%", "净资产收益率(扣非)%", "净资产收益率(加权)%", "总资产报酬率(ROA)%", "毛利率%", "净利率%", "营业利润率%", "成本费用利润率%", "EBIT"],
["每股收益(EPS)%", "基本每股收益", "稀释每股收益", "扣非每股收益", "每股净资产", "每股经营现金流", "每股资本公积", "每股未分配利润"],
["营收增长率%", "净利润增长率%", "扣非净利润增长率%", "归母净利润增长率%", "经营现金流增长率%", "总资产增长率%", "净资产增长率%", "固定资产增长率%"],
["营收增长率%", "净利润增长率%", "扣非净利润增长率%", "归母净利润增长率%", "经营现金流增长率%", "总资产增长率%", "净资产增长率%", "固定资产增长率%"],
["货币资金", "交易性金融资产", "应收票据", "营收账款", "预付款项", "其他应收款", "存货", "存货", "其他流动资产"],
["经营现金流净额", "销售收现", "购买支付现金", "投资现金流净额", "筹资现金流净额", "现金净增加额", "期末现金余额", "自由现金流"]
],
financialMetricsList: [],
showDataList: []
};
},
onLoad(e) {
if (e.index) {
this.activeIndex = e.index;
}
if (e.code) {
this.stockCode = e.code;
}
this.contentTop = this.navH + 20 / 750 * common_vendor.inject("windowWidth");
this.otherTop = this.navH + 204 / 750 * common_vendor.inject("windowWidth");
this.getFinancialMetricsData();
},
onReady() {
common_vendor.index.createSelectorQuery().select("#topCategory").boundingClientRect((rect) => {
this.topScrollWidth = Math.round(rect.width);
}).exec();
common_vendor.index.createSelectorQuery().select("#filterList").boundingClientRect((rect) => {
if (rect) {
this.secondScrollWidth = Math.round(rect.width);
}
}).exec();
},
methods: {
clickTabItem(e, index) {
if (this.activeIndex != index) {
this.activeIndex = index;
let offsetLeft = e.currentTarget.offsetLeft;
this.topScrollLeft = offsetLeft - this.topScrollWidth / 2;
}
},
/**
* 点击选择筛选项
* @param {Object} index
*/
clickFilterItem(e, index) {
if (this.filterIndex != index) {
this.filterIndex = index;
let offsetLeft = e.currentTarget.offsetLeft;
this.secondScrollLeft = offsetLeft - this.secondScrollWidth / 2;
if (this.activeIndex == 0 || this.activeIndex == 1 || this.activeIndex == 2 || this.activeIndex == 4) {
this.getFinancialMetricsData();
}
}
},
/**
* 点击选择期数
* @param {Object} e
*/
clickSelectPeriod(e) {
this.periodTop = e.currentTarget.offsetTop + this.navH + (70 + 10) / 750 * this.windowWidth;
this.periodShow = true;
},
/**
* 点击选择期数
* @param {Object} index
*/
clickPeriodItem(index) {
if (this.periodIndex != index) {
this.periodIndex = index;
this.periodShow = false;
}
},
/**
* 获取财务指标数据
*/
getFinancialMetricsData() {
let code = this.stockCode;
let period = this.periodList[this.periodIndex].period;
let param = { limit: period };
request_api.financialMetrics(code, param).then((res) => {
this.financialMetricsList = res.data;
this.getFinancialMetricsShowData();
}).catch((error) => {
});
},
getFinancialMetricsShowData() {
let data = [];
if (this.filterIndex == 0) {
data = this.financialMetricsList;
} else if (this.filterIndex == 1) {
for (let item of this.financialMetricsList) {
if (item.report_type.indexOf("年报") > -1) {
data.push(item);
}
}
} else if (this.filterIndex == 2) {
for (let item of this.financialMetricsList) {
if (item.report_type.indexOf("中报") > -1) {
data.push(item);
}
}
} else if (this.filterIndex == 3) {
for (let item of this.financialMetricsList) {
if (item.report_type.indexOf("一季报") > -1) {
data.push(item);
}
}
} else if (this.filterIndex == 4) {
for (let item of this.financialMetricsList) {
if (item.report_type.indexOf("三季报") > -1) {
data.push(item);
}
}
}
this.showDataList = data;
common_vendor.index.__f__("log", "at pagesStock/stockCenterDetails/cwDetails/cwDetails.vue:272", this.showDataList);
},
/**
* 获取资产负债表数据
*/
getFinancialBalanceSheetData() {
let code = this.stockCode;
let period = this.periodList[this.periodIndex].period;
let param = { limit: period };
request_api.financialBalanceSheet(code, param).then((res) => {
this.financialBalanceList = res.data;
}).catch((error) => {
});
},
/**
* 获取现金流量表数据
*/
getCashFlowSheetData() {
let code = this.stockCode;
let period = this.periodList[this.periodIndex].period;
let param = { limit: period };
request_api.cashflowSheet(code, param).then((res) => {
this.cashFlowList = res.data;
}).catch((error) => {
});
},
/**
* 获取利润表数据
*/
getIncomeStatementSheetData() {
let code = this.stockCode;
let period = this.periodList[this.periodIndex].period;
let param = { limit: period };
request_api.incomeStatementSheet(code, param).then((res) => {
this.incomeStatementList = res.data;
}).catch((error) => {
});
}
}
};
if (!Array) {
const _easycom_navBar2 = common_vendor.resolveComponent("navBar");
_easycom_navBar2();
}
const _easycom_navBar = () => "../../../components/navBar/navBar.js";
if (!Math) {
_easycom_navBar();
}
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return common_vendor.e({
a: common_vendor.p({
leftText: "平安银行(000001)",
hideNavBg: true
}),
b: common_assets._imports_0,
c: common_vendor.f($data.tabList, (item, index, i0) => {
return {
a: common_vendor.t(item),
b: index,
c: "tab-" + index,
d: index == $data.tabList.length - 1 ? "0" : "40rpx",
e: $data.activeIndex == index ? "#2B2B2B" : "#999999",
f: $data.activeIndex == index ? "28rpx" : "26rpx",
g: $data.activeIndex == index ? "1rpx solid #F2C369" : "none",
h: $data.activeIndex == index ? "bold" : "500",
i: common_vendor.o(($event) => $options.clickTabItem($event, index), index)
};
}),
d: $data.topScrollLeft,
e: common_vendor.f($data.filterList, (item, index, i0) => {
return {
a: common_vendor.t(item),
b: common_vendor.n("item flexCenter " + ($data.filterIndex == index ? "select" : "")),
c: index,
d: common_vendor.o(($event) => $options.clickFilterItem($event, index), index)
};
}),
f: $data.secondScrollLeft,
g: common_vendor.t($data.periodList[$data.periodIndex].title),
h: common_assets._imports_4$10,
i: common_vendor.o(($event) => $options.clickSelectPeriod($event)),
j: common_vendor.s("top:" + $data.contentTop + "px;"),
k: common_vendor.f($data.leftList[$data.activeIndex], (item, index, i0) => {
return {
a: common_vendor.t(item),
b: index,
c: index % 2 == 0 ? "#fff" : "#FAFAFC"
};
}),
l: common_vendor.f($data.showDataList, (item, index, i0) => {
return {
a: common_vendor.t(item.report_type),
b: common_vendor.f($data.leftList[$data.activeIndex], (litem, lindex, i1) => {
return common_vendor.e($data.activeIndex == 0 ? common_vendor.e({
a: lindex == 0
}, lindex == 0 ? {
b: common_vendor.t($data.showDataList[index].profitability.roe ? $data.showDataList[index].profitability.roe.toFixed(2) : "-")
} : {}, {
c: lindex == 1
}, lindex == 1 ? {
d: common_vendor.t($data.showDataList[index].profitability.roe_deducted ? $data.showDataList[index].profitability.roe_deducted.toFixed(2) : "-")
} : {}, {
e: lindex == 2
}, lindex == 2 ? {
f: common_vendor.t($data.showDataList[index].profitability.roe_weighted ? $data.showDataList[index].profitability.roe_weighted.toFixed(2) : "-")
} : {}, {
g: lindex == 3
}, lindex == 3 ? {
h: common_vendor.t($data.showDataList[index].profitability.roa ? $data.showDataList[index].profitability.roa.toFixed(2) : "-")
} : {}, {
i: lindex == 4
}, lindex == 4 ? {
j: common_vendor.t($data.showDataList[index].profitability.gross_margin ? $data.showDataList[index].profitability.gross_margin.toFixed(2) : "-")
} : {}, {
k: lindex == 5
}, lindex == 5 ? {
l: common_vendor.t($data.showDataList[index].profitability.net_profit_margin ? $data.showDataList[index].profitability.net_profit_margin.toFixed(2) : "-")
} : {}, {
m: lindex == 6
}, lindex == 6 ? {
n: common_vendor.t($data.showDataList[index].profitability.operating_profit_margin ? $data.showDataList[index].profitability.operating_profit_margin.toFixed(2) : "-")
} : {}, {
o: lindex == 7
}, lindex == 7 ? {
p: common_vendor.t($data.showDataList[index].profitability.cost_profit_ratio ? $data.showDataList[index].profitability.cost_profit_ratio.toFixed(2) : "-")
} : {}, {
q: lindex == 8
}, lindex == 8 ? {
r: common_vendor.t($data.showDataList[index].profitability.ebit ? $data.showDataList[index].profitability.ebit.toFixed(2) : "-")
} : {}) : {}, {
s: lindex,
t: lindex % 2 == 0 ? "#fff" : "#FAFAFC"
});
}),
c: index
};
}),
m: $data.activeIndex == 0,
n: common_vendor.s("top:" + $data.otherTop + "px;"),
o: $data.periodShow
}, $data.periodShow ? {
p: common_vendor.f($data.periodList, (item, index, i0) => {
return {
a: common_vendor.t(item.title),
b: index,
c: common_vendor.o(($event) => $options.clickPeriodItem(index), index)
};
}),
q: common_vendor.s("top:" + $data.periodTop + "px")
} : {});
}
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pagesStock/stockCenterDetails/cwDetails/cwDetails.js.map

View File

@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "",
"usingComponents": {
"nav-bar": "../../../components/navBar/navBar"
}
}

View File

@@ -0,0 +1 @@
<view><nav-bar wx:if="{{a}}" u-i="9030b988-0" bind:__l="__l" u-p="{{a}}"></nav-bar><image class="topBg absolute" src="{{b}}" mode="widthFix"></image><view class="stockDetailsC fixed" style="{{j}}"><view style="margin:0 20rpx;height:99rpx"><scroll-view id="topCategory" scroll-x style="white-space:nowrap" scroll-with-animation scroll-left="{{d}}" show-scrollbar="false"><view style="display:inline-block"><view wx:for="{{c}}" wx:for-item="item" wx:key="b" id="{{item.c}}" style="{{'display:inline-block;text-align:center;line-height:98rpx' + ';' + ('margin-right:' + item.d + ';' + ('color:' + item.e) + ';' + ('font-size:' + item.f) + ';' + ('border-bottom:' + item.g) + ';' + ('font-weight:' + item.h))}}" bindtap="{{item.i}}">{{item.a}}</view></view></scroll-view></view><view style="height:1rpx;background-color:#E7E7E7;margin:0 20rpx"></view><view class="flex" style="margin:20rpx 20rpx 0"><scroll-view id="filterList" class="filterList" scroll-x scroll-left="{{f}}"><view wx:for="{{e}}" wx:for-item="item" wx:key="c" class="{{item.b}}" bindtap="{{item.d}}">{{item.a}}</view></scroll-view><view class="flexCenter" style="color:#F2C369;font-size:22rpx;font-weight:500;border:1rpx solid #F2C369;border-radius:5rpx;padding:0 10rpx;height:43rpx" bindtap="{{i}}"><text>{{g}}</text><image style="width:11rpx;height:6rpx;margin-left:10rpx" src="{{h}}" mode="widthFix"></image></view></view></view><scroll-view scroll-y class="stockDetailsC fixed" style="{{n}}"><view style="display:flex;color:#666666;font-size:20rpx;font-weight:500;margin:0 20rpx"><view><view style="height:60rpx;background-color:#FAFAFC"></view><view wx:for="{{k}}" wx:for-item="item" wx:key="b" style="{{'line-height:60rpx;padding-right:20rpx' + ';' + ('background-color:' + item.c)}}">{{item.a}}</view></view><view style="flex:1;white-space:nowrap;overflow:scroll;display:flex"><view wx:for="{{l}}" wx:for-item="item" wx:key="c" style="font-size:18rpx;text-align:center"><view style="padding:0 10rpx;line-height:60rpx;background-color:#FAFAFC">{{item.a}}</view><view wx:for="{{item.b}}" wx:for-item="litem" wx:key="s" style="{{'line-height:60rpx' + ';' + ('background-color:' + litem.t)}}"><block wx:if="{{m}}"><block wx:if="{{litem.a}}">{{litem.b}}</block><block wx:if="{{litem.c}}">{{litem.d}}</block><block wx:if="{{litem.e}}">{{litem.f}}</block><block wx:if="{{litem.g}}">{{litem.h}}</block><block wx:if="{{litem.i}}">{{litem.j}}</block><block wx:if="{{litem.k}}">{{litem.l}}</block><block wx:if="{{litem.m}}">{{litem.n}}</block><block wx:if="{{litem.o}}">{{litem.p}}</block><block wx:if="{{litem.q}}">{{litem.r}}</block></block></view></view></view></view></scroll-view><view wx:if="{{o}}" class="periodList fixed" style="{{q}}"><view wx:for="{{p}}" wx:for-item="item" wx:key="b" class="item" bindtap="{{item.c}}">{{item.a}}</view></view></view>

View File

@@ -0,0 +1,85 @@
page {
background-color: #070707;
}
.topBg {
top: 0;
left: 0;
width: 100%;
height: auto;
}
.stockDetailsC {
left: 25rpx;
width: calc(100vw - 50rpx);
background-color: white;
border-radius: 10rpx 10rpx 0 0;
overflow: hidden;
bottom: calc(20rpx + 70rpx + 20rpx + env(safe-area-inset-bottom));
}
.bottomC {
background-color: black;
padding: 20rpx 25rpx calc(20rpx + env(safe-area-inset-bottom));
left: 0;
right: 0;
bottom: 0;
}
.bottomC .inputC {
background-color: #424143;
margin-right: 20rpx;
padding: 0 33rpx;
height: 70rpx;
border-radius: 35rpx;
}
.bottomC .inputC input {
height: 100%;
font-size: 26rpx;
font-weight: 500;
}
.bottomC .contrastShareC .item {
font-size: 24rpx;
font-weight: 500;
color: #FEFAF6;
text-align: center;
}
.bottomC .contrastShareC .item .icon {
margin: 0 30rpx;
width: auto;
height: 26rpx;
}
.filterList {
margin-right: 20rpx;
white-space: nowrap;
width: calc(100% - 150rpx);
}
.filterList .item {
display: inline-block;
margin-right: 28rpx;
background-color: #F6F6F6;
padding: 0 10rpx;
min-width: 110rpx;
line-height: 45rpx;
border-radius: 5rpx;
font-size: 24rpx;
font-weight: 500;
color: #939393;
text-align: center;
}
.filterList .item.select {
background-color: #F2C369;
font-weight: bold;
color: #070707;
}
.periodList {
right: 25rpx;
margin: 0 25rpx;
width: 130rpx;
}
.periodList .item {
line-height: 40rpx;
font-size: 22rpx;
font-weight: 500;
color: #999;
text-align: center;
}
.periodList .item.select {
color: #F2C369;
}

View File

@@ -775,7 +775,7 @@ const _sfc_main = {
if (this.selectSearchStockInfo) {
code = this.selectSearchStockInfo.stock_code;
}
let param = { limit: 8 };
let param = { limit: 16 };
request_api.financialMetrics(code, param).then((res) => {
this.financialMetricsList = res.data;
}).catch((error) => {

View File

@@ -161,7 +161,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
a: index
};
}),
k: common_assets._imports_4$12,
k: common_assets._imports_4$11,
l: common_assets._imports_5$4,
m: common_assets._imports_5$4,
n: common_vendor.s("top:" + $data.contentTop + "px;")