From 68069cd92bbcb9ad10523c4d514679945298c1af Mon Sep 17 00:00:00 2001 From: zdzerg Date: Thu, 11 Sep 2025 10:13:03 +0800 Subject: [PATCH] Initial commit with all project files including zzbdataprod --- .gitignore | 6 + milvus_init.py | 33 + monitor_milvus.py | 125 + restart_app.sh | 76 + zzb_data_prod/.DS_Store | Bin 0 -> 6148 bytes zzb_data_prod/.Mil_unit.py.swp | Bin 0 -> 12288 bytes zzb_data_prod/.config.py.swp | Bin 0 -> 12288 bytes zzb_data_prod/LICENSE | 674 +++ zzb_data_prod/Mil_unit.py | 73 + .../__pycache__/Mil_unit.cpython-310.pyc | Bin 0 -> 1094 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 843 bytes .../__pycache__/db_service.cpython-310.pyc | Bin 0 -> 29238 bytes .../__pycache__/llm_service.cpython-310.pyc | Bin 0 -> 5880 bytes .../__pycache__/log_config.cpython-310.pyc | Bin 0 -> 1003 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 27636 bytes .../__pycache__/pdf_title.cpython-310.pyc | Bin 0 -> 5320 bytes .../__pycache__/redis_service.cpython-310.pyc | Bin 0 -> 703 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 21438 bytes zzb_data_prod/app.py | 254 + zzb_data_prod/combined_v61.pdf | Bin 0 -> 395661 bytes zzb_data_prod/config.py | 24 + zzb_data_prod/db_service.py | 1110 +++++ zzb_data_prod/delete_pdf.py | 84 + zzb_data_prod/excel.py | 121 + zzb_data_prod/insert_redis.py | 246 + zzb_data_prod/llm_service.py | 98 + zzb_data_prod/log_config.py | 51 + zzb_data_prod/main.py | 1134 +++++ zzb_data_prod/measure_config_all.txt | 2768 +++++++++++ zzb_data_prod/not_match.txt | 4164 +++++++++++++++++ zzb_data_prod/pdf_company.py | 108 + zzb_data_prod/pdf_company_0824.py | 268 ++ zzb_data_prod/pdf_delete.py | 98 + zzb_data_prod/pdf_title.py | 240 + zzb_data_prod/put_code.sh | 24 + zzb_data_prod/redis_service.py | 16 + zzb_data_prod/requirements.txt | 15 + zzb_data_prod/requirements_lite.txt | 6 + zzb_data_prod/test.pdf | 3 + zzb_data_prod/test.py | 154 + zzb_data_prod/test0710.py | 1 + zzb_data_prod/test_0711.py | 92 + zzb_data_prod/test_0711_v2.py | 325 ++ zzb_data_prod/utils.py | 780 +++ zzb_data_prod/wget-log | 3 + zzb_data_word/Mil_unit.py | 30 + .../__pycache__/config.cpython-310.pyc | Bin 0 -> 812 bytes .../db_service_word.cpython-310.pyc | Bin 0 -> 27993 bytes .../__pycache__/main_word.cpython-310.pyc | Bin 0 -> 21084 bytes .../__pycache__/parse_word.cpython-310.pyc | Bin 0 -> 7782 bytes .../__pycache__/redis_service.cpython-310.pyc | Bin 0 -> 503 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 22401 bytes .../__pycache__/word_title.cpython-310.pyc | Bin 0 -> 1054 bytes .../__pycache__/zzb_logger.cpython-310.pyc | Bin 0 -> 829 bytes zzb_data_word/app_word.py | 225 + zzb_data_word/config.py | 23 + zzb_data_word/db_service_word.py | 1054 +++++ zzb_data_word/main_word.py | 823 ++++ zzb_data_word/parse_word.py | 269 ++ zzb_data_word/redis_service.py | 17 + zzb_data_word/requirements.txt | 14 + zzb_data_word/utils.py | 818 ++++ zzb_data_word/word_title.py | 16 + zzb_data_word/zzb_logger.py | 39 + 64 files changed, 16502 insertions(+) create mode 100644 .gitignore create mode 100644 milvus_init.py create mode 100644 monitor_milvus.py create mode 100755 restart_app.sh create mode 100644 zzb_data_prod/.DS_Store create mode 100644 zzb_data_prod/.Mil_unit.py.swp create mode 100644 zzb_data_prod/.config.py.swp create mode 100644 zzb_data_prod/LICENSE create mode 100644 zzb_data_prod/Mil_unit.py create mode 100644 zzb_data_prod/__pycache__/Mil_unit.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/config.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/db_service.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/llm_service.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/log_config.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/main.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/pdf_title.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/redis_service.cpython-310.pyc create mode 100644 zzb_data_prod/__pycache__/utils.cpython-310.pyc create mode 100644 zzb_data_prod/app.py create mode 100644 zzb_data_prod/combined_v61.pdf create mode 100644 zzb_data_prod/config.py create mode 100644 zzb_data_prod/db_service.py create mode 100644 zzb_data_prod/delete_pdf.py create mode 100644 zzb_data_prod/excel.py create mode 100644 zzb_data_prod/insert_redis.py create mode 100644 zzb_data_prod/llm_service.py create mode 100644 zzb_data_prod/log_config.py create mode 100644 zzb_data_prod/main.py create mode 100644 zzb_data_prod/measure_config_all.txt create mode 100644 zzb_data_prod/not_match.txt create mode 100644 zzb_data_prod/pdf_company.py create mode 100644 zzb_data_prod/pdf_company_0824.py create mode 100644 zzb_data_prod/pdf_delete.py create mode 100644 zzb_data_prod/pdf_title.py create mode 100644 zzb_data_prod/put_code.sh create mode 100644 zzb_data_prod/redis_service.py create mode 100644 zzb_data_prod/requirements.txt create mode 100644 zzb_data_prod/requirements_lite.txt create mode 100644 zzb_data_prod/test.pdf create mode 100644 zzb_data_prod/test.py create mode 100644 zzb_data_prod/test0710.py create mode 100644 zzb_data_prod/test_0711.py create mode 100644 zzb_data_prod/test_0711_v2.py create mode 100644 zzb_data_prod/utils.py create mode 100644 zzb_data_prod/wget-log create mode 100644 zzb_data_word/Mil_unit.py create mode 100644 zzb_data_word/__pycache__/config.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/db_service_word.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/main_word.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/parse_word.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/redis_service.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/utils.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/word_title.cpython-310.pyc create mode 100644 zzb_data_word/__pycache__/zzb_logger.cpython-310.pyc create mode 100644 zzb_data_word/app_word.py create mode 100644 zzb_data_word/config.py create mode 100644 zzb_data_word/db_service_word.py create mode 100644 zzb_data_word/main_word.py create mode 100644 zzb_data_word/parse_word.py create mode 100644 zzb_data_word/redis_service.py create mode 100644 zzb_data_word/requirements.txt create mode 100644 zzb_data_word/utils.py create mode 100644 zzb_data_word/word_title.py create mode 100644 zzb_data_word/zzb_logger.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e4be9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +logs/ +*.log +pdf/ +zzb_data_prod/nohup.out +zzb_data_prod/logs/ +zzb_data_prod/app.log diff --git a/milvus_init.py b/milvus_init.py new file mode 100644 index 0000000..3cfcf12 --- /dev/null +++ b/milvus_init.py @@ -0,0 +1,33 @@ +from pymilvus import connections, CollectionSchema, Collection,utility,FieldSchema,DataType +# 连接到 B 服务器上的 Milvus +# connections.connect(host='124.70.129.232', port='19530')# 测试服务器 +connections.connect(host='127.0.0.1', port='19530')# 测试服务器 +# # 获取集合列表 +utility.drop_collection("pdf_measure_v4") + +# 定义字段 +fields = [ + FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), + FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=1536), + FieldSchema(name="table_num", dtype=DataType.INT16), + FieldSchema(name="table_index", dtype=DataType.INT16), + FieldSchema(name="measure_name", dtype=DataType.VARCHAR, max_length=200), + FieldSchema(name="measure_value", dtype=DataType.VARCHAR, max_length=200), + FieldSchema(name="file_id", dtype=DataType.VARCHAR, max_length=200), + FieldSchema(name="measure_unit", dtype=DataType.VARCHAR, max_length=200) +] + +# 定义集合的 schema +schema = CollectionSchema(fields=fields, description="My Milvus collection") + +# 创建集合 +collection = Collection(name="pdf_measure_v4", schema=schema) + +collection = Collection("pdf_measure_v4") +index_params = { + "index_type": "IVF_FLAT", + "metric_type": "COSINE", + "params": {"nlist": 128} +} +collection.create_index(field_name="vector", index_params=index_params) +collection.load() \ No newline at end of file diff --git a/monitor_milvus.py b/monitor_milvus.py new file mode 100644 index 0000000..5ac7859 --- /dev/null +++ b/monitor_milvus.py @@ -0,0 +1,125 @@ +import socket +import subprocess +import time +from datetime import datetime +import os +import mysql.connector +from zzb_data_prod.config import MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB + +def get_time(): + return datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + +def check_port(host, port): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(5) + result = sock.connect_ex((host, port)) + sock.close() + return result == 0 # 返回布尔值,表示端口是否可用 + except Exception as e: + print(f"[{get_time()}] 端口检测异常: {str(e)}") + return False + + +def restart_service(): + try: + subprocess.run(["bash", "/root/docker/milvus/standalone_embed.sh", "restart"]) + print(f"[{get_time()}] milvus服务重启成功") + return True + except subprocess.CalledProcessError as e: + print(f"[{get_time()}] 服务重启失败: {str(e)}") + return False + + +def start_application_process(): + """启动8000端口对应的应用进程""" + try: + # 先尝试停止可能存在的旧进程 + time.sleep(2) # 给进程停止的时间 + # 进入应用目录 + # 启动新进程 + subprocess.run( + ["bash", "/root/pdf_parser/restart_app.sh"], + ) + print(f"[{get_time()}] 应用进程(8000端口)已成功启动") + return True + + except Exception as e: + print(f"[{get_time()}] 启动应用进程失败: {str(e)}") + return False + + +def get_local_ip(): + try: + # 创建一个 UDP 套接字 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + # 连接到一个外部地址(这里使用 Google 的公共 DNS 服务器) + s.connect(("8.8.8.8", 80)) + # 获取本地套接字的 IP 地址 + local_ip = s.getsockname()[0] + except Exception as e: + print(f"[{get_time()}] 获取内网 IP 失败: {e}") + local_ip = "127.0.0.1" # 如果失败,返回本地回环地址 + finally: + s.close() # 关闭套接字 + return local_ip + +def monitor_port_8000(): + """监控8000端口,如果异常则启动应用进程""" + print(f"[{get_time()}] 检查8000端口状态...") + port_available = check_port("127.0.0.1", 8000) + + if not port_available: + print(f"[{get_time()}] 检测到8000端口异常,尝试启动应用进程...") + success = start_application_process() + + if success: + # 启动后检查是否成功 + time.sleep(10) # 等待应用启动 + if check_port("127.0.0.1", 8000): + print(f"[{get_time()}] 应用进程启动成功,8000端口已正常") + # INSERT_YOUR_CODE + # 检查并修改数据库字段 + try: + + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, # 请替换为实际密码 + database=MYSQL_DB # 请替换为实际数据库名 + ) + cursor = conn.cursor() + local_ip = get_local_ip() + sql = f"update model_ip set status = 0 where ip = '{local_ip}:8000';" + print(f"[{get_time()}] 执行sql: {sql}") + cursor.execute(sql) + conn.commit() + print(f"[{get_time()}] 数据库字段已成功修改") + except Exception as e: + print(f"[{get_time()}] 修改数据库字段失败: {str(e)}") + finally: + try: + cursor.close() + conn.close() + except: + pass + else: + print(f"[{get_time()}] 应用进程启动后,8000端口仍未正常") + else: + print(f"[{get_time()}] 8000端口状态正常") + + + +if __name__ == '__main__': + print(f"[{get_time()}] 启动Milvus监控服务") + port_ok = check_port("127.0.0.1", 19530) + if not port_ok: + print("检测到Milvus服务异常,尝试重启...") + restart_service() + + print(f"[{get_time()}] 启动 8000 端口监控服务") + # 开始监控8000端口,每60秒检查一次 + monitor_port_8000() + + diff --git a/restart_app.sh b/restart_app.sh new file mode 100755 index 0000000..a84fce0 --- /dev/null +++ b/restart_app.sh @@ -0,0 +1,76 @@ +#!/bin/bash + + + +# 切换到 /root/docker/milvus 目录 +cd /root/docker/milvus || { echo "无法进入目录 /root/docker/milvus"; exit 1; } +# 运行 standalone_embed.sh restart 指令 +bash standalone_embed.sh restart + + +#!/bin/bash + +# 目标目录(根据实际路径修改) +TARGET_DIR="/root/pdf_parser/pdf" +LOG_FILE="/root/pdf_parser/logs/pdf_clean.log" + +# 创建日志目录 +mkdir -p "$(dirname "$LOG_FILE")" + +# 带时间戳的日志函数 +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" +} + +# 检查目标目录是否存在 +if [ ! -d "$TARGET_DIR" ]; then + log "错误:目标目录不存在 $TARGET_DIR" + exit 1 +fi + +# 执行清理并记录 +log "开始清理PDF文件..." +find "$TARGET_DIR" -iname "*.pdf" -print0 | while IFS= read -r -d $'\0' file; do + log "删除文件: $file" + rm -f "$file" +done + +log "清理完成,共删除 $(find "$TARGET_DIR" -iname "*.pdf" | wc -l) 个残留文件" + +# 设置工作目录和日志路径 +WORK_DIR="/root/pdf_parser/zzb_data_prod" +LOG_FILE="$WORK_DIR/app.log" + +# 终止现有进程 +pids=$(ps -ef | grep app.py | grep -v grep | awk '{print $2}') +if [ -n "$pids" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 正在停止现有进程: $pids" + kill -9 $pids +else + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未找到正在运行的进程" +fi + +# 进入工作目录 +cd $WORK_DIR || { echo "无法进入目录 $WORK_DIR"; exit 1; } + +# 启动服务 +echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动服务..." +nohup python3 app.py > $LOG_FILE 2>&1 & + +# 等待进程启动 +sleep 2 + +# 检查进程状态 +new_pid=$(ps -ef | grep app.py | grep -v grep | awk '{print $2}') +if [ -n "$new_pid" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务启动成功,进程ID: $new_pid" + echo "--------------------------------" + tail -n 10 $LOG_FILE +else + echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服务启动失败!" + echo "--------------------------------" + cat $LOG_FILE + exit 1 +fi + + diff --git a/zzb_data_prod/.DS_Store b/zzb_data_prod/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b458accaf440d5ea9dbe72bbbbfc515f66d89235 GIT binary patch literal 6148 zcmeHKJ8r`;3?L*h_|Px=4>xAUDZ1`uOQ5s9T^Y zP!t6TNROgOnSO>viHLY{*vyHhL{y;(vM2*0=E13vJCA{^YqWGrEp6$Jnt_G>qDgX} zAlrs|dO+@P`8T`!`Ks;qy`?=me(t&N>UzEF*6^rKkIT#D>FMe#@69*7`|bNI3r&j==9HUjB>lqc8!~o2W z#Sj(LE;jkz7%Z|m+!in|CSjV6Ia(Q7tA#+l9;%pdwFc1u!GjL(Usnq{# z{7QqD{PU0)1p~prKVyK$^{QUrrM$L&cs;4L3GD_=MEr^<5a?Qpfm(_&kbPvPlQy43 Z$9#4yhO&y-H5?cR0VO25VBi-Rcm^YMGx`7k literal 0 HcmV?d00001 diff --git a/zzb_data_prod/.Mil_unit.py.swp b/zzb_data_prod/.Mil_unit.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..4326fac94931362ea6b949133d99d9fc3e204959 GIT binary patch literal 12288 zcmeHNTWl0n7(N(85mBST+tYFS&~37r?rsZ0lYOWwmBwC>F4b_!WV$m;M`w37b15vf z>Vs+8%Ef4~ax;)%;){qT6a)<~#s_>QlK9+NiizRD7kx2)XKp*Yy@-*Rkeo@r&dh(# ze>va(pZ{dj8A%QI_S4N`ir{*JkYCc}eRuY(A**k!BBo*3O#DxmwkxH-mD=cxq~(;Q z>GnvvG+NPjEmC`j8Emg8MX4g2mTI;iJUAjLvMoy$(@@&`HC=Mbnk`nUi&VLQGr$@6 z&kU?59htPZ)mwxY=u=Pb{LdD-0nPwtfHS}u;0$mEI0Kvk&H!iN{$aqbtRn9s+y{b? zw*~iAP50oH-#7!D0nPwtfHS}u;0$mEI0Kvk&H!hCGr$?R4;hdZLdI7Ua_KC3sSPT5IhLFp^954gy2VMs@1J3~)fS`N@UWM$(o%+dtFF2Nrcy6Cu2)-}tXNCSM#iwgy zjup!Zi;;Oae`5aIY2U-G6YmE>c)s>x0=s%xZUQfU=;2D)w{Xal!syGsjL+oqco2uX zcjUHp??}>;d_dCG@;-Ysn@OdZzopF;H63-J+`XkRd&@^QChLxRFAcJV-wS)TJi->s zihi-V-hq62Q`_>Z^Oeg^>EEkHo2n^UJ$-}Sd1-iSEo}|SiB>cbUA0w3M6ZZz)Dz<;3LV(jOfbF1xfL|TXk0X5P_|SY z1#x=~b5I;H`;lssX{|_^FIqNi920c6ASr55c68Q`A|3BM+1o{t$oXrhZyh^+`|76) z=g+xQlkTA_Q3RfyY+Xxa0&lcvm~}C86Ir&pya}v9pSgYfTy6Tj+No*Z?w#+ZAep~1 z8F%J>bjbbwV|V&+IA_|^uiIN@)mGrfuk*MY;*C&Tk&*C}WkPmE1IrjsL=!xs>NyE3 zBIljZO5G67*hZa+SY^br798!-+$BA+6e4>uwNV)jB&wz8$&b!wyitgS71{akSD!Rq za7vlKwb?oBx1a{RDfI|oFIPX*>+%>sO+siipZ$T`cxwvW zEN)9eRJD$&W&3;khIbB0xxU`519?9kXmL@~2#)Zma}X%gW~!x;s<-?^oQt+D{Jdm+ z1)s93wuXHZ^p)^ENtqPe-Ihr(#00()dT3GG7pgP_=}%a(Tg4kujNPzxg}teviTNwd J=^Bzr{sumb|26;s literal 0 HcmV?d00001 diff --git a/zzb_data_prod/.config.py.swp b/zzb_data_prod/.config.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..ca6051b34ed4383cb15546e7d97b5579b82883fa GIT binary patch literal 12288 zcmeI&$!^*}7zgl44?R?+`yod{4n75sF^fUU0kA2S*lJ@EaQ`-z@%F91vsEp4v=GX-eRDLdfrLqv8J3 z`=ovPfXrvJkTu_Q_-AxHqPYuOu;{`chqf>|55{NLy1ius@`3A_fi+(Y=KSTQZMs%y znZbPK^3H7P`NMRuyw(vLPyhvPCvXvZM^eHNGs5btewaE)K7VH1ZcOZr0w{n2D1ZVe zfC4Ch0w{2&1j1mCyn_|ri&niKo%eRm(MLR?01BW03ZMWApa2S>01BW03ZMWA+(7}$ zCFJTMA%g@g9{&H2fB*k_Ovn$&7sv<58;A)hKwdz8J|g5R01BW03ZTG$CtwA>IT|dJ$H~-UbmU1{LG&EY z%8OQ(4zfkpwk69ET$&M!UfxX+((LQ68m3$^%bgDN;yiz9O&#AFoAW_1n}@3n(_B>6 zDeL-4Ta)AB$)sDGI + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/zzb_data_prod/Mil_unit.py b/zzb_data_prod/Mil_unit.py new file mode 100644 index 0000000..d03879d --- /dev/null +++ b/zzb_data_prod/Mil_unit.py @@ -0,0 +1,73 @@ +from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection,MilvusClient +from config import MILVUS_CLIENT +import time +from datetime import datetime, timedelta +from log_config import logger + +def create_partition_by_hour(file_id): + # 连接到 Milvus 服务器 + connections.connect(uri=MILVUS_CLIENT) + # 获取集合 + collection_name = "pdf_measure_v4" + collection = Collection(collection_name) + + # 创建当前id的分区 + partition_name = f"partition_{file_id}" + if not collection.has_partition(partition_name): + collection.create_partition(partition_name) + logger.info(f"Created partition: {partition_name}") + partition = collection.partition(partition_name) + partition.load() + + # 获取所有分区 + partitions = collection.partitions + # 删除所有分区(除了默认分区和当前分区) + for partition in partitions: + name = partition.name + if name not in ["_default", partition_name]: # 保留默认分区 + pre_partition = collection.partition(name) + pre_partition.release() + collection.drop_partition(name) + logger.info(f"Partition '{name}' deleted.") + connections.disconnect("default") + + + + + + + + +# from pymilvus import connections, CollectionSchema, Collection,utility,FieldSchema,DataType +# # 连接到 B 服务器上的 Milvus +# # connections.connect(host='124.70.129.232', port='19530')# 测试服务器 +# connections.connect(host='1.94.60.103', port='19530')# 测试服务器 +# # # 获取集合列表 +# utility.drop_collection("pdf_measure_v4") +# +# # 定义字段 +# fields = [ +# FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), +# FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=1536), +# FieldSchema(name="table_num", dtype=DataType.INT16), +# FieldSchema(name="table_index", dtype=DataType.INT16), +# FieldSchema(name="measure_name", dtype=DataType.VARCHAR, max_length=200), +# FieldSchema(name="measure_value", dtype=DataType.VARCHAR, max_length=200), +# FieldSchema(name="file_id", dtype=DataType.VARCHAR, max_length=200), +# FieldSchema(name="measure_unit", dtype=DataType.VARCHAR, max_length=200) +# ] +# +# # 定义集合的 schema +# schema = CollectionSchema(fields=fields, description="My Milvus collection") +# +# # 创建集合 +# collection = Collection(name="pdf_measure_v4", schema=schema) +# +# collection = Collection("pdf_measure_v4") +# index_params = { +# "index_type": "IVF_FLAT", +# "metric_type": "COSINE", +# "params": {"nlist": 128} +# } +# collection.create_index(field_name="vector", index_params=index_params) +# collection.load() diff --git a/zzb_data_prod/__pycache__/Mil_unit.cpython-310.pyc b/zzb_data_prod/__pycache__/Mil_unit.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b1d1d00b7694bda70893761735671593991ed56 GIT binary patch literal 1094 zcmZ8gL2KJE6qaPib{snm8)H3YJ*;GmhQUr_j6u3Vp)G@SJD3gQMoQx##h$Db5*!$8 z*ZqRhkskL0wtuldpzBWi3p?$}O_MT#o}a$=={@Pwa~6g^g7NL-$LJS$zs=(IAh37| zvv?1NB8oW@IKqNNL|Bm}?8p|is3x4q!6r_)E4;|7e2dqkI$$>Ug&+B%5j85j#sd*X zA@~k;zo4i|tv>2_f1m>DIJz;&CKEPLX*MZz<8{h7?GHvwB)ZkhIKPgp5N|(G$;m8d z+TX-7mvZK84n}n zEL{qyVVE^UJQG>irM;|QA%l$lMXjvuqYpa<9XA$E=}_1|B^<$S7@aL?T1LC8N0dfBY4p?KC@JD~ zTHP8{l{ScM7?zz*hMBH!cs9=xdh3jZwkHWZoGYPrQZU`5GRrq!}Okuj7~XwVg8IF0MkYR9I*w*3&=ktgf0I7 literal 0 HcmV?d00001 diff --git a/zzb_data_prod/__pycache__/config.cpython-310.pyc b/zzb_data_prod/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44de287d060358117eea6c0721bbf295395f6041 GIT binary patch literal 843 zcmaJ<%Wm306dfMnZ9+(>y6d8wCQ@S?2mw@8Au$vp^Qa9;xEsrGaboeXYg|?MSNaA0 zp6=Lo)%Fj%>exVmR_cuA>YjVgoH?2qgJEKXjN$wgh1-u1cbJIHKV*2pw0+ao*t=G?7pwp`>nj#W*awMSIh zW>*{7nPKbN!pX3fVc4vRnqsQfd}O&PyXUN=|9noJrLbw)`SJ9VeqRuU+lPgI^@5P^ zL3)*Y^dhAGcIUjDk6&xWJfG8snp()Id2W<1;b2fyhdgrGTuCcn>ofyQvmxH~WaUO| zR9jt$uVK9{Z$YOmbs^U5%kM?SYpnC#dQYxOkX&&(6kTm zAT6V{hFDcPm2MqkQdMZkYt>cmsV3L?T4@>ds!X$5k$X~AxoP*P+4XU*C8g5oY_Ln+ z#jZ6Er}yo7wZz7viq)mFVfzz&U>razvWi)G}^ a)WDCE(OdW1&(CNGlA!NDGqCAJ{J#O+0pS1u literal 0 HcmV?d00001 diff --git a/zzb_data_prod/__pycache__/db_service.cpython-310.pyc b/zzb_data_prod/__pycache__/db_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd0136e863e5fb60b21f613f6c935e683d1a39a3 GIT binary patch literal 29238 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⋙%-4s}Z)8!AxT>B(tOwa_;p0nP=aDYS{T- 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%0AZ)cn6hXR%&mK^g#p|riwAqFI~ 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 literal 0 HcmV?d00001 diff --git a/zzb_data_prod/__pycache__/main.cpython-310.pyc b/zzb_data_prod/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ecd0db664da0a9989276c036b4c12dd395caf45 GIT binary patch literal 27636 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 literal 0 HcmV?d00001 diff --git a/zzb_data_prod/__pycache__/pdf_title.cpython-310.pyc b/zzb_data_prod/__pycache__/pdf_title.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6f8ce2a764a6805bba278afb32e84a1c3fd50a9 GIT binary patch literal 5320 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 W=Q%j;P$3I>7=(V`>+r7U|M?3DO0BE_ literal 0 HcmV?d00001 diff --git a/zzb_data_prod/__pycache__/utils.cpython-310.pyc b/zzb_data_prod/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0230e4b0e0a1a3476ffd965323fd4f026b47043 GIT binary patch literal 21438 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 literal 0 HcmV?d00001 diff --git a/zzb_data_prod/app.py b/zzb_data_prod/app.py new file mode 100644 index 0000000..0271bd1 --- /dev/null +++ b/zzb_data_prod/app.py @@ -0,0 +1,254 @@ +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +import os +import utils +import queue +from multiprocessing import Process,Manager +import pdf_title +import main +import time +import threading +import config +import requests +import db_service +import threading +from Mil_unit import create_partition_by_hour +from datetime import datetime, timedelta +from log_config import logger + +app = FastAPI() +cpu_count = 4 +job_queue = queue.Queue() + +# 定义请求体模型 +class FileItem(BaseModel): + file_path: str + file_id: str + +def run_job(): + #判断是否有任务在执行 + if_run = True + + if job_queue.empty(): + logger.info(f"job_queue为空: {file_path}") + if_run = False + + if if_run: + job_config = job_queue.get() + page_list = [] + file_path = job_config['file_path'] + file_id = job_config['file_id'] + job_status = True + continue_execution = True + try: + #下载pdf + start_time = time.time() + logger.info(f"开始启动文件解析任务: {file_path}") + if file_path.startswith('http'): + file_path = utils.save_pdf_from_url(file_path, config.FILE_PATH) + try: + file_info = pdf_title.create_text_outline(file_path,file_id) + except Exception as e: + response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id,'status': 7}) + logger.info(f'通知任务状态url:{file_id}:{response.url}') + logger.info(f'通知任务状态任务:{file_id}:{response.text}') + logger.info(f"{file_id}运行失败: {e}") + continue_execution = False + + # + db_service.delete_MYSQL_DB_APP(file_id) + db_service.delete_MYSQL_DB(file_id) + + if continue_execution: + parent_table_pages = file_info['parent_table_pages'] + page_num = file_info['page_count'] + if page_num < cpu_count: + p_count = page_num + else : + p_count = cpu_count + + for i in range(p_count): + page_list.append({ + 'type': 'table', + 'page_num': file_info['split_parts']['table_split_parts'][i], + # 'page_num': page_nums[i], + 'path': file_path, + 'file_id': file_id, + 'parent_table_pages': parent_table_pages, + 'page_count': file_info['page_count'], + 'tables_range': {}, + }) + + + # 通知开始解析 + response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id,'status': 5}) + logger.info(f'通知pdf开始解析url:{file_id}:{response.url}') + logger.info(f'通知pdf开始解析状态:{file_id}:{response.text}') + parser_start_time = time.time() + processes = [] + time_dispatch_job = time.time() + + for job_info in page_list: + p = Process(target=main.dispatch_job, args=(job_info,)) + processes.append(p) + p.start() + + logger.info(f'等待所有子任务完成,任务ID:{file_id}') + for p in processes: + p.join() + logger.info(f'pdf解析任务完成任务完成,任务ID:{file_id}') + time_dispatch_job_end = time.time() + process_time = time_dispatch_job_end - time_dispatch_job + db_service.process_time(file_id,'1',process_time,time_dispatch_job,time_dispatch_job_end) + parser_end_time = time.time() + logger.info(f"解析任务 {file_id} 完成,耗时{(parser_end_time - parser_start_time):.2f} 秒。") + #这里做一步判断,看看是否还要继续。 + if db_service.file_type_check(file_id): + logger.info(f"文本较真表格生成已结束") + else: + # 通知抽取指标 + response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id,'status': 6}) + logger.info(f'通知开始抽取指标url:{file_id}:{response.url}') + logger.info(f'通知开始抽取指标状态:{file_id}:{response.text}') + + parser_start_time = time.time() + logger.info(f'开始表格指标抽取,任务ID:{file_id}') + time_start = time.time() + + + # 获取当前时间 + + partition_name = f"partition_{file_id}" + # 判断是否创建新的分区 + create_partition_by_hour(file_id) + time.sleep(10) + # 判断是否为3季报 + + if db_service.file_type_check_v2(file_id) == 3: + main.start_table_measure_job(file_id,partition_name) + time_start_end = time.time() + process_time = time_start_end - time_start + db_service.process_time(file_id,'2',process_time,time_start,time_start_end) + logger.info(f'表格指标抽取完成,任务ID:{file_id}') + parser_end_time = time.time() + logger.info(f"表格指标抽取 {file_id} 完成,耗时{(parser_end_time - parser_start_time):.2f} 秒。") + + logger.info(f'启动这个指标归一化任务ID-修改测试:{file_id}') + time_update = time.time() + main.update_measure_data(file_id,file_path,parent_table_pages,partition_name) + + logger.info(f'归一化完成任务ID:{file_id}') + end_time = time.time() + logger.info(f"任务 {file_id} 完成,耗时{(end_time - start_time):.2f} 秒。") + time_update_end = time.time() + process_time = time_update_end - time_update + db_service.process_time(file_id,'3',process_time,time_update,time_update_end) + # 不是三季报就直接按照年报和半年报走 + else: + main.start_table_measure_job(file_id,partition_name) + time_start_end = time.time() + process_time = time_start_end - time_start + db_service.process_time(file_id,'2',process_time,time_start,time_start_end) + logger.info(f'表格指标抽取完成,任务ID:{file_id}') + parser_end_time = time.time() + logger.info(f"表格指标抽取 {file_id} 完成,耗时{(parser_end_time - parser_start_time):.2f} 秒。") + + logger.info(f'启动这个指标归一化任务ID-修改测试:{file_id}') + time_update = time.time() + main.update_measure_data(file_id,file_path,parent_table_pages,partition_name) + + logger.info(f'归一化完成任务ID:{file_id}') + end_time = time.time() + logger.info(f"任务 {file_id} 完成,耗时{(end_time - start_time):.2f} 秒。") + time_update_end = time.time() + process_time = time_update_end - time_update + db_service.process_time(file_id,'3',process_time,time_update,time_update_end) + #通知任务完成 + response_time = time.time() + response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id,'status': 1}) + logger.info(f'通知任务状态url:{file_id}:{response.url}') + logger.info(f'通知任务状态任务:{file_id}:{response.text}') + response_time_end = time.time() + process_time = response_time_end - response_time + db_service.process_time(file_id,'4',process_time,response_time,response_time_end) + except Exception as e: + #通知任务完成 + response_time = time.time() + if "integer division or modulo by zero" in str(e): + response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id, 'status': 4}) + else: + response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id, 'status': 4}) + #response = requests.get(config.NOTIFY_ADDR, params={'fileId': file_id,'status': 4}) + response_time_end = time.time() + process_time = response_time_end - response_time + db_service.process_time(file_id,'4',process_time,response_time,response_time_end) + logger.info(f'通知任务状态url:{file_id}:{response.url}') + logger.info(f'通知任务状态任务:{file_id}:{response.text}') + logger.info(f"Response status code: {response.status_code}") + logger.info(f"{file_id}运行失败: {e}") + finally: + logger.info(f"任务 {file_id} 完成,运行状态:{job_status}") + + #pdf_company_0824.name_code_fix(file_id,file_path) + #print('公司名与编码填充完毕') + else: + logger.info(f"有任务运行中,需要等待.....") + +def parse_pdf_route(fileItem: FileItem): + + # 创建一个队列,保证每次只执行一个文件解析任务 + job_queue.put({ + 'file_path' : fileItem.file_path, + 'file_id' : fileItem.file_id + }) + logger.info(f"增加 {fileItem.file_id} 到队列.") + + threading.Thread(target=run_job, args=()).start() + + return {"success": True, "msg": "文件解析开始"} + +app.post("/parser/start", + tags=["parser"], + summary="解析Pdf文件", + )(parse_pdf_route) + +def get_local_ip(): + try: + # 创建一个 UDP 套接字 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + # 连接到一个外部地址(这里使用 Google 的公共 DNS 服务器) + s.connect(("8.8.8.8", 80)) + # 获取本地套接字的 IP 地址 + local_ip = s.getsockname()[0] + except Exception as e: + logger.info(f"获取内网 IP 失败: {e}") + local_ip = "127.0.0.1" # 如果失败,返回本地回环地址 + finally: + s.close() # 关闭套接字 + return local_ip + +# 运行 FastAPI 应用 +if __name__ == "__main__": + # 服务器启动服务 + import uvicorn + uvicorn.run(app, host="0.0.0.0", port=config.PORT) + try: + # 获取内网IP + ip = get_local_ip() + logger.info(f"内网IP地址: {ip}") + # 假设 config.NOTIFY_ADDR 是一个字符串,我们可以使用 rpartition 方法来替换最后一个 / 后面的值 + url = config.NOTIFY_ADDR.rpartition('/')[0] + '/restart?address' + address = f"{ip}:{config.PORT}" + logger.info(address) + response = requests.get(url, params={'address':address}) + logger.info(f"Response status code: {response.status_code}") + except KeyboardInterrupt: + logger.info("Shutdown server") + + # 本地调试任务 + # job_queue.put({ + # 'file_path' : '1.pdf', + # 'file_id' : '2222222' + # }) + + # run_job() diff --git a/zzb_data_prod/combined_v61.pdf b/zzb_data_prod/combined_v61.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d33d0add685aa301ab159c8674eaf183208039ae GIT binary patch literal 395661 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

F=jyak9F#b%K2VFgGs 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 z WQxz`S%p#15+1PM-CeubsjlQdSor=&3DT8W;n?@l}#kw;=`=$;i`;>)N&`#X7 zVbi^xq0m?MLJs0{hF`|QOSA@w_hq?Ij(meuCs6-j7v7)X^^LBjhhFu0wPei&a@Ks9Yr~7Ae{E z!jx1i&|3{*%k*Ru-1aR~8kHv*Q{|fG{OW!|`|gjZ|11UiipEzvq_ex>@QfynG$;@w zkdRY--vIIlpwjawFg2>H=-!wzH49w?yu52zR;c>iYj_UP z7_)#2YPT0D7y3IqO+Wg<_0|`9(xjbRjbE2THQXqey5j(fUA>y44xlkEUhAI_Y2lQB z_hX%zEQK!FrruH%27diq`44OshAwF;cG4yHl!>Qez%F1`i?}y0NhJA z7Ji?H+u{P;%32=t7Kf3ArrRV2f7@^S%#gG#^!>fQ(DTKVM)a_e2jt_JQZp4hmjpKd zFZefB7J$vyVBbc&8FFc?phCe+F&K~uglLu;jlS7`S(M3RvVTxjrzid@|9*i8#xo)q z4Z{m-`_n6TV8cR`F_wh4S4zD5%D3bwCIC4lfKA*3memkeHCx^~ICz}h57}{KvW`rT zOrc*6_0az`rk~>${qaY%_NHd(>sLFtdwu2I(9$T^%>W!*S16qKXUeCFktF;oIMG98 zVb?l}ap6NXh zO^<3wCHS|*tSVV8B> zv|2?3V7c~TUz2KJQ&olNa~64AnWUR%j_IY+`)@M`hU8>W%GPnq*iw5Oa__j|>HE7h z-3q|WO-s+$(ij`rMv<6qs9FB0W7w+c=)}PApSgyu8Et83lDkN!1VpHA`pQ`OwsLp3lLt^3_MSbvedFLu^>%x(a{BIrlaqT<>tlhs zr$`)}wpynL&_NzQT$~~2)T>UvGWDpz%TEbXj9%A8&SVF|9mL{=NElVi1vwFX8% zBwV`40$0MD$VN?f2ld@LwKQE7Q4#EL2RN<@_Zo{WpuPz&4@xe)ODhYuF1sQ(8yK?9u70* zVgLK!AMZnIBKw1tj6t`To3NZ{JCBH}nUz24F4db3E7cqemzJgQRIHXnsw`5NmoZ;Z zV;}lmx&`TB>1{#xw%06uwLqXJ){4XsJ~14~Ss(i1zhIjkr3@^$qZ|RLJXXfL+4mkj z7)+K~eX_{16IVT$Oqi*v$L#oGd|ddM=EqdfYqKPUV>kfD)#;2y>KE)clwh-!rD!w+ z>Pzgve|6^Ka5S%6zj1E3f$F4nfZ1!zlbNLZ&9aEtf#IE$Wivjz!P>L}aubSqkB;3rg6|4(SciZfuj8d zy-3mj&|c-DK+((gTOK6JaS4eeB(8-0-g&?Gd4HD-Od0T(DF(OYlm~0Kpg~IwveP=| z`G(3c=74*eoQ_9Kplk(Z2p>S?bv)-0%C#|9yL720w2`=@Vl@&Z#}&eaP^m4!oDG=s zzoCl~$$=BOChbax(us7Tm56V(>n%~%3S*NaljU+jf`5GL_U)s>(Hl8^I_KV`dxvj0 z&Kl7$m2zVKHOF;+)1jnWJ5mHP z3@J(k_H-Ri>kdL5L1|{yk+YaVB9Y+SL=nwHo~}|ewHF9rPg&tKkC2$w4GkG^;)yaZ z7tpuV!b!#<cQQn5~` zscVr(F2E?cmC#;&`B*3OTT^)QML2cV<)XiJ8N32?@S*gH^i;apnruBf_TS%@r<>#Q zSTike)^60AO*2qcSvI+&JHBt;J2+T1SBDw>+}Pn@ JI}$N&a|0_ea?{`;^x6)+y9u+Ks zr0&WD21_W!VNdhzV;OFSa%CJI$|XxnTxz*=yyY@EsKtb$8DO4l&K87Z1GT=8zLuW0mVdhN*=M(_(&WR7pMU<7 zCwtA^*75Q4Q2J9zG;5f{7Vym^8igYAM9Ax&V%NpI{oTKafD2VPC28_ z%Km;IGUta(bN=;QV``i~`QaYw@%^bMdO{CD(b?NGEeDFjyY6*;KnNLD>wh=;uf@Iv zici9zKj92s&vLl7J%Wj1k3Prj?JAFMg)_CoW|?tQQL_WqEdcyt5dn zogFn@E+%lMjA;VX6sE8t4WAj%uY zS5=-rCd&C0xPMO0b1z*z2Z28rc-L338wc65F#O#0W=}3C5~Pc3jrnNTlYI#8KJ``9 z&W^%>-{c|c`*JD^NT#ry>z7KUGG*#@g{r?swOAg+S`QT~8t_z(5K!0Ws{RMfRKgDS zd+OLGt40iKrY!7@kp&yad>NVRCQ4lObsU)uP@=^27$yh|YuZ$JVW0Ra5{Y|Wf-;40 zvaBQ^$zVsq*7S%9)1#xq!_Eiqp1gbieg`q;b>6aV&z9`~yNBrmG#!dGuxIo%)uQKr zF`R_aVZP|mVSQjf@b{TrhyL!MWx^5a$r*@>X6i`H3X}pf*5oO4O{{`7kysN*3v^%( z8B?NoU_%+n3M8GX=|VP_*Vfh!L=y(-QA-=uLN-4T$e1#wew%{nA_c4NpLK}7TY>iC zB`MsHIcZ#(#xqwc%R2COCD6D|+{?c)46JgES#;6ha>$CplntaqUGc7f-_q${>1JRU ziqFF)iKOW ztK;+Dn|U+u&Aj>X=7-1j_*XpfkJxcyJGRrLP246;o0fLlH0(A&yDgLoX;+I@NJvPC zBUcurMH~=<0}>KQs5dT1d)dn#K!`tp8xkOnyVvDAPMjub%jIRPM2hG0K0hsa)i#RU z9_GJQm8gEN6NrGgBGL)**a9H2DRuKxTWyzvlF!{J>DEYdwOhms#j=z4OF`i|cu=Int#^gmnnulj-+!z^A4hDL1CIt*}~6hm%SApnI>ox|$Lx z)1&6w%}ys}lG6R zp{@>(*jeIOQ<>rSbJqbpS2*3A<*nO>C){3gv?x*O_NKIaA{ne3;yQHz?@9>A@|D0C z5XQN_YE!W#5lXqt5eK1<5|0}IVB3<0UbAH10{nC0(tlM( z%2fG*vOisT?|ypu;W&Nr>{)tr^U=-g*V9@v%D8&>@b=-uhaaXNzE;;SW91}2z?Z@x z2Z1oIFPv&Tn@6+9tnZy-4#Gc}5oTKa-Z*%bV_|M+4JcsXa+OR64jM zg-cu>P=x9&loO7IF(sl{k|bA2*58r1ARMCKf&UV7y(#>qq#`uenU_2HvO?NG}0 zy~D$HF^=2&>vz^iqc*G6%H_72rtPiW&E1Y@VPB#F5v&pOyCk1sa2W7cO# zH(#-lH{Q@pMB&VUei<6fXfV&p*Joz416aR1hU4He96fKzlsNe@7z>Ul!49ir7vjLt zfeZ01cO??;MquPDXHdWDB%v(dzU+&?31SP=MT^|j_e1It)*!4-*rMa%)+e~K9 zIk$f4C|QY_&zNHqIGfg|6rIO)J-qv!?*k*B&uU6<==yJ$OF=n6!;z{vd07pCaxZ|k>Gi-GH?X!*_&R;L1i{6~f z?tXH1$%TJFxNFP3a3GAHfvrP)i$}1a)^HHl$J}wM9}PUuw3phbS7)Y;LL&^b71oFL z_s3Gz4jy|d@7{mBNO}i^Rf`0oUFsgDcrv-cyQbHNmJOk#UW07Drah-xv0Bifk8J}E z7P#6M;A%u^D2K|`X?e3$tF`wAJ7C@I1PReT?B0SbZu^R|-QIpRfX_Y;PHy+?TQ**~ z=nRR;sRn{Mj@f`Y3uFBy3p&eR@sLjg3EqwDB_^QaI-EQ82D&SL0*p^gcY<4%cUATU z?Qnh{UFSJShD*3)y4bXEpi%Y3c>H^^5iz=@Ju|cjCJqy{C8^Qk?vSfR{_B>s^rq?M z5=-9lVLhfd9wcgQ9}*-icsLw*ToXc3G(hd2GpEsDJ&u(P<*{;Qnh4!-DnoFny9WoA zJL_9pmAa-?b|(|B;+?_moE+w;WyW5gjlGu>?l=f$Kjv#76T}Hn8LG1pd5%mMU_K$- zPq}o&8XgH`k8ETYP`e_y}`Sd(lVrSyE(d-Om3)S1U z>7a<6NRbPMgv@aIxu&XF!|)fZ`WoujxK^ROhfze?BEgZ4@G_VC2=}>nn?lGDm*tq7 zD^d#Ks_NE@(dbt~wI!EiH#GHK`drt-<&XoY8Ezow8;b~fEYS+G=&C_Etf?B;@=!&Y z+A4FJFKU)!h=>Z8rKTBD2ggSKPbTa$rs}4p0M;Jx_rJ>D0c%|m&}hK_M6;QuJgaI&f6pfpsGk%!ez<8dO51u}KDoy?AcSGv3 zg&Zp79i;6aqJxe1A-h(Q;|tX{qCLYkepf2hlLWYBmdgdT)GB>WklG6 z3X6q>VpC8BR%E8hY)kZ%;WSr~34~Ek7YoAkdbmS7tyaF5e^Vhl^>h6~I0JFU^XQ)0 z(XlyAex%z+j{n2O35t!L?Z36}1n(mc9l%?B02S1X%u+U#Z2T!M*uk}i%Z=0t`%YLX zX#ZopN_yKy&oDoJB)^UOB2p4XZPaGjmTXy;m)MrGOxAG{PnO1QCJyRDrY$<16jKZa zy%oK7fI-hid+n+H1w9w&A#G3n16|HDKcFuu+p!b7C?!*{L;>RSJn!>9PpgR861TKg z1a8gp7W8lFTj`C|l0M3Qdm?Y^VYvOlz2$ok9&GP!-q>7Q>uvWgD~a&iA!HDe305nN zM$iEBqSFM8Pl!K@d!TNT-%C!+`FnxyzI*GF@Ye{EAgZVqm61?*rf8~~j*oDqmde$V zPk4eX)Kvsus1lPIDgdt)+Lj218NH^-QrM`QUd8t)5X5{9ei!riGjJ_HEn5VzW8 z0zFR1uyR^d_B38IoSi5}0WpQy>7k+QpY)qO!&y#DXA8~u1GSmhsw?wFVpeOIl?*P& zhPM-hoR);s=gOnfOU&+Krn`3y?=Z+Q_!p@B?|{Lf^x-tU?jLUK?HyK{3~cgn{B-^4 zqeq9s=PS<-4h|zHc1-gSTyt<)2|25x@Vq!q(6|T=kkaHtG{>hbs}+t761LgojKWTk zouZB+lBmdpCWsDVQI%{hmvnp0ErMDgnRe&V0{WDbn&D2xis?QUBkCHFh`>{^!m6Qc zNAWT>z{xOR+2$0^a|9P#iK#(3=u-=qW6S_SY&yET>4kZQ?Q(3-2mc@m^bEsmFc(*C zVHzrrOsw${Gm&rRnKv$gC-S`M{Z*QmHl?T1cp6REW_suG<8)pvs*I(bdLJ5uo!Xa- zWbP;L;B{7PlXoX?LeAu$)d|VJJKH>gHW@9ijzJyvxG`Z7~>#_P0q@t#}ebtY%E-UPXF6w1t zjUjTEsX=v(1GZiIx*A#X!q`ylKzJze4DHB+h|_yG+H~Y_W$8zT$~@iOb`n7h%^UTMxH(cNdorRu7&& zU1XYeYw^}aq5EtA%D30azRi(KVqRR;EfHqgmZV9w$X^t%Bh>emGW;u$P6TX2N zy&?Tn`e@qubgq$#-QkswkM113dX+xgf4+bJernN?HyRGpb-aoRNu{ino=5WC<&Zx| z8LFpAAPa_mI4dg0i4cOM_D+yIvm#a|;D$K^9df*3-VXi$LjO)cJlz>yL4YAzvb=q) z``n|JZ^cZ3fCvveHL7j78=1-{;C@pRPJ>T;=z9o5@%xRrP$z=AzyRx0>=LZD4Esh< z1AcsA4>E_f(1QAg5??r_Zkdz1V|e|v)-*`165I2rT%xKPhpC6-w7Cv@3CuvI!UFo- z-y>4ij3#D|5Ln^h9hSw2sk=oDi=wGj1tXHAfrtJlPh$(xnzSR`gkGrhoU1hI- z%e~&8y5p@uRPPv_em{zXTHw0T`qtKq=*7iiKl8|4;&MlQAKV@JG`y49B!t;znZnPc z`tVG*8fR=yX6gU)4#3q`x!o#JgE`r~4a=S)jFsg>-FZnx z(P4flo8Bm4knFLlbJH}7T|=!0^~pGfDk&T)RDaX#__Pzj`jUY!lYsNKgwS}v?RC%R zq`<5${}tv!Q5ZL%nPSz#p^eQ7u}lbEL|A;WU#Kz|Br9nO#cfm;P^W0sBLmXC4pZ_? z-l~WsBn!Igb?GP4tLZ8;jADRPmFhn}+OH0WlG5t;8-o|mo_+u7li%up(B(kiR|Zd> z43vF6(8`*}qno3#o+*#vrPU)UeCnL#x`oj42=Md6QP zWTI5jMK7U(212m90CGjZtzn^pe4=tIiN8$XNSknc2P3UNCRcVy^tn%AFk)Yj1m=ht z+83NErt%lU6-=-Y{FlaxMG6B)wUOD?bY&H@rr@N)?G4vwq`>Wz1261&8_Y{X>9urg znubb!GQ4{A<tr2{oMYsai^8na0c-wA!pr@x)65dz@%ZHLj9H;lraE)ME1=k5pREm-xYISiUqjrOVe2eAyX8fTG6h`kxXPPV@_gRm5WH`8VnCYDhuSOqtJP3ssLlf z5(EPBrWY_4>TZW%eQ48eY|_vAeeG+S{GdkrS!(XX_WmN6^~V1)UL`+{TxI+%Rqs{3 zSM^@4Uc23HcemY(+r7ALkEeUO-Lv#eXeP5TVHT2MHfA6SBti_)kU4}PB%}ls0U~0P zxPcHSa^b**69|w1!N0&60*W{e-z$51V~`@*<#M}R?r-^R@?n^!fh)Ccl*#NVnR7jh zIYP;LN@lwVIipGZHN#2{w0RW`(5vXnMqBQyOSR*j=F&rZeqLeAQXhNu#tl_QNWJ#( zp?dl57w+D=l~?)yH8%S)J@nZ?U#m}nVL;Iv5>b9cKEn}Y7|8m*YS7Z_W-}XF%G~Jh zjgR7f_WgU$92@zE6B83bb%{V=NSw;Dri~XcR%2XoO#|UgY+)R;6!sn`xEQM+0;$&{SD3nGzK1E3*ARo2XnH=tpG zJ=gB_!b>-wzj^0Qh%BobR{yW3dX|?Tsm6hTb3iw;)*q1m?p}s8(`mqr%_T<&uQM8Z zjqUT^7jMeoB}YQo5!k}Su?i`5;EXbwhwg_!W2*%?>~KL-r#vZxljAb@^@@+xipE$c zc>q*fRdA^udOQ+F?X~OwLWb0dQ&{zwuS-E0$hfe6x}@!y3U!;Hi!yA=u+s0_ z-GD_2E3TEC7JN*IZAlSR(vo4z^^wTjt4W{|{A(4>qmQF2=tXoFy@lRE4+g6*KYsk+ z%{TieJDn}N|Jv)XfBua(+RrU5-PoCHzjXWd3zuspROz=Xm3E&d=e@7pTTc#YilMN! zd7qt_{x9t_+vts%NY3=X-dXEqnx9XG;b5&X8r5(@^+tWq5hU4h-zRtXre&O(Q5krJ zFEpOs;_y)S?vsrx$v3heFx2-YiXEGRkj4qam`^rvxgs9z$lwf&gJ_#^jOQZ=yh^AU z;t5^ni@<_5OtOI?^tvmyxEHw82)KwSXP9trAoK}Gj$varY77od561waoX|}lZh?Os zFmq$~>+YB!*kbN|$%_*cC)%+U%=gYZFmypYFbxhCBJWudfJcmppgl%wkaPVaJS&^7 zl(r{jS7{eZ=|>`g z<>b~@r3~yHMXQz7BP{qdp%_|IBvW=nPzOcGo2V8e3hjjTmi|Ykq?9 zl2Dv;tyuwAe21^_Q{)&cLw~?97rshjg&ks18}w(ZTTGVL>k?F*D_t~=o`n(oMvuWQ zHd~RU9gCBx=dU#A!g=a8Qh}+^KKJzZL_#sKY(cf}r_y)z6^JW}XSM$m6ynd2Zx_%x zQ~Ru#BB!^v$t0^VA=b#+Gi&eeh1LVnY!n+zagDvSFe;z72wZTu`fn4Qhl#Ix(M7`2 zx@&`}()wBI4yYRdMF&3;34!`84-;qrO+(+;m!JchK?lT>e?bR+2eWUZ3us{wcilRx zBebx4?%cwR_Pq6l^}QbK6Rh#ybGdZe7)_OzAJlGA>jBFQ;JGYN_8NaWLG6oTy%FCwTGrwDd&LQen|C`@jSDm92y|7pc1q z>+Laly2rvh z_oD@9p)>2puSm}dxJ8`@)P+U?_PpQ+LQ#^f2pCsi&A@fL%@)KXFLd0`Ce$v1kYJ4E zwRfG;S0YDv?9(Av);EY$no{Y1QzRDPLK<8YIP~HIz(R89g?RFB=*4frq0NGmzJO*1 zK?g`;J_eGQ2NSkFzkbMs8AR-PExt*fj(#d%1M=+E_W{r_Z8}Ps>9bhk&Q%q?$bt8w z#F_>KJl652B1Z?&b@01so-z|Q=-QNfmL`e-RS>G(>WN-4U0k1m2$#2^F&THlZoKcu z^byI`6o4T0(;P@hNc=o_V29fd`#BLxbD`b^5jXggL`y+TPlRDle~1mko__%6GzHlL zIo`hog*`|1aZZ@*7D~M)8b{Tp}VPBKOSN7gv?5%3FD>vR&Qn zsqUU$?6!Mzw`qFRAV6?vao~V7j5G%%#9=N2Y6*}=niHHx8VRu+xxxh+A^r{)A(kV2 zky%CA9=9}>yk4w)`M&pl@A9fRiU^X)Hh1H+(74B3>N-tg=un@5sIH^sLPhFH!LyH1 zw~IZAZ3NZol7)U4wo?@9E8{j7c0zo;B;0nnYO1PjNqz03DYWxQh^AB19T(PPhDz*0OCAxn5 z=FN`BDIIl2XMLf1BU5X5E+Sh>Ewu!9W-PV%S+2NDpAS)GS?~9ZRdpcTKlZ61rG;F* z)Br*kqe6&sO;SsGsnVniZV{_*FV}GIj=+=$j$svS>#6@`EYiTH zyzq6Mc+ec~Pq?Sj(-7DJ)07>-{fD_}@*e${_8NLrrRROEHF4KEeRO!|4pe=oGe+Z! z=W(_zMe3{Mi2`7@43M;^-GCqnO2cDmi0kYDC+INGj9@SUk}_o zE+X34A0_e1UY?_Fn9i!?_fQzZqP*rM?OK$?I-?cR_HnJ61~`_r3LZmZc#s%BR*3;Z za|03sr^FTXL?s3RO~`-$3W@O=E^1ZVfu(h8(zqM&?c#us(Q2u^RI1hZ!{cM_(paSal zH$A+rFY2DsMGrwY1V)lh9bz`s*Y+Af6rL1*GBeVvUHHJXT;_JGQgTR(2fI8NOFOzU zDB?;V)0aAPC79_W>cgutECxaf@&_5k*04o)!Oz+BKv3vK{t*%qG zTdgj%&~A74Yzv)dl4%!Zx>)HJP{|emtJP{P>}2^n>b}`o7pnQi7p4EgcFNzC;hru5 z9FSo!+bgGf4PVpO;ZM#6_5=oiM>tTXQgGH|j1*J{&2aVCGQvF>-3|~c`Lcjy;pnJ_ z8+Y)5&K117uhe~kmmCbCoPaFOJ%|}@YZ<#MMg9oneocF>-JI0N{b5xuIZLKlJv}+8 zMjgM??^jEWw9#(guHHV6tFuWn{V`VvNNw1<2=-@PrFh_dquWTo)v&ySuhWmNBXZ z*MNjKFs)(Q#I)c!Rw}|K4{DCE77K}b(y@11A!=l>68*MUNO{H z$FLk}qI;~8(GT&+w<6FjiKSVP(M}Lk*cRcUj0&+;EMdAxz2|@hoN)I?G=N+L^{~sG zk}XN_c)FBKaNxhSf5JAvTBJ3#eeJI5x@t1s*_psSOt_{kO_t6wvQlZ5S6SOlnHcmK z+R$?|Hn7j?aA6h9)q4NlJ=E2Gj^qIo00kpG?ZZlgimQARPHwyCGrxQWi*ox6r>hA_Xl|f< zS>>z2x+J*g+v=yrasl3*No#H})OX1e800SQ@IdDRhnC%fNm=Fo7y%9Xzn}}J!vGBw zH`)bTgs}jCXmj5wA~&$%eVSkKqKF!l%A&Ir;@SYyv;ey+>cq?pq8hW|`l9H{ap7wQ&rHr2dF>?GJIHH!0-ptE+oi9#Z7%H zYDy;ntw!-0Koe()DM2bb-xLj;g9J8y1F{Q3oMu0D>@^wrQPnYR#@t5u#3$898!fys z!Y@gLErT#Mw<0Da%Wlhhrc=+gg{N+eX1nV(wB9Nt)D!JX%4K)oIX+Fd2TP0Q6`+MQ zs5IP)X-?9!urOoGIgcmF5Qb=!d1{zHeGZjzl$T<*Ow;@_=h$hVS*VxXVy^awGH%u@ zdNGOM%pMxl)+?Bd9B+t1TSf}r{SJqq{u2oks6&`^W)NRZ0-w!R<{)S^VBOJ6amXS*-PfyJ#^PO61C~_t9 zo@Pw`95bO{HA}3&L1O(0F4qPsy$M(Q)}(qE-y%z9y-pHf{zQE3CW|A?Aud`kc`<0 zxNZwr{YndL2U9jk)rBgIXkrm$uKQW9ciQiN4^|0>h^~8sCnNFln9B`ZkjrezP-0w1tD%!d>)=sspNm}0QRM2_Y~HvK@0l`6o4GPOxehAD0I`PC$iFZK71*EaLB*xkC6@cn!NGws$8Q zAudVJV(+;UK>eYI81sc?z%AA}CNzGD2`o1ze@GK-VcS6_aa}!DY4&K^hKlX~G2J^O z?UDA5c5PC57Mw6EKrC78|3dO+HSh< zcW0=l?Iwi85d>{?c)oLf#~I0i41is(yq+V@q+2G2BCYg3quC}p-h*eVB7K0Q$0_&5 z-u#eAAEk5WYM#2hCW9LovTh%dT1-p?X;<~a6+AIJ;IA9F3hz_#qxy?+v~sB-gp=1@ zuc*AIP^?A*iK*HEp997V%Mm3>asl&MMMjn@!jRg$^uOAdsozvDfJRS84}0ba_12OwDV2KA4ZVex*2-wK+1vcaek-UlO_j;~ z1^;+fuSX_ZJLSk@Qd89bM!`OYxrl58!G9a&EF?R0125CMEliZR6Wj%L?m3)9G+-SO z+{W+O4Zybu_13GtZPOz0yb^~$0xqRZ=!f*O|Arl|j`HIbk6P`L<#m0MYf@n>I1{#Jb>y zOKz)W-QC@_bZ6j5dDXi58bObK&J;~mI=7q5$?@*&G~1ISjk76`7Vpe~uUSzi7yMCV z>qY|esUrMKT@hSF(xV^=p+-0tq9VD7dnB*!wn-%sYz6!{0~T7;U1$zd0gFe=#N$|f zFyv35jMMZTyCK3w5ncr|`^6x@@C>fs$dk%tLKlH<^4;IC06N5E2n){iBJ{E<5%A^# zVy-kDk$UrApyU_Yyf)R|(|(|BY*jv>@9*p_t*`HGwzjwTzWwakUd<>Qli`q7r<%l4qWW`lx*o?r`4MkFy!8-GlnUvtP5{v2{4_fZ;Zyj2-_$(-Ta)exgXomdLR%Ri&>IA}CO=fvZ#{ z`cv5|8`9SG&_1W-x&?~T8y{C-`W=_t8?x2H)^Jo~I-56~I*2FwO(bH={!5 zn@qyrb{-lXgbF>1N2@X0D??g|yW^jpKHb{J7d{6i8C10!LNYM3jdX@ffy@niQBilnOHl zO`5>eX$Gb+bRApGNmy`l5G)2mx)6etm|z}|0dvjADOre=PBVi4N|Rbo8)}=W$ERD# z-t^t_;l^~_8BF_~Yg4GEW~Va++fN(ya(Svvk2B`g^7D^5pP)hsG?|=G?AI)%>=b^Ta~cC_EL5N}Yps&+p(bbax=SErwwbrs<=$I3SH?aq z7jbQh8`6ZuWQ0GZ$-%(KOAzA1$pQZ7(<3lFdrqxRxD}#*#m$keBPSdUs-!sh6w?u* zbw~)W&VzBml*Y)#MNSF<nI%>%fKs0M}C@iaP#fxcuiNR|?cF^!5YDkj_Bh38 z!`Wg;pZQg_R!{gW-3Uiv)V5}$)yhWevB77{;dLLu_j_Xbd+;55-m>Vaep|vh;IaC3 zh@bD!!0RBRZ@CtVQ0Ws4b4U?#~X@nsge)}`RqT>DS@IaB*x=YavV_! zJWnw(gvdD|U+d*RqcR!b1UD+U7NSDHOS%Y(rqTs)j&gxy3p_fP>oIo@{eeh@yjYLy z#-lYK4?s!=R4k)VNeL8Uv)Y}T^CVeYY6=o;d9dqrjLea1yCw&WOG3wLa)W*Ex8F36d($h}NX1JwNIY(rSuMeQ08^7dA|sjtV|$Ow(WAbxUi z5EmA-1znG8%`)W0PP}to*wcnR?^FolqtphU9%c3!;G2atv}LD#e%@wLeU6zwnis7W z@^HP4`(a&(`32DE7LZA=1`?+psi@@+9U1yR)Tz6OBNPd_b2=LYPG)<`&w&1{vYFI_Zr7_hVeOPX3jY? zXU>`Lon5U~vn%arEh$=QzimmDWXoT%9m}?iBgIxsjZ^Gc)JX$rF$4@Q4h|(BkkI6= z^eU7>3#H_)|3C}2dYxVj$XCX)jQH8}d|G;%8 zc1#ir|AY)w-wTfH>qA(u$qnwDWqb*FgzLmKP(ZPZ!WBcJ zDS?ovP)T8>-HOZNuFz*ol@6}VJ;A=jG#$HZlvmru;Q~jx?G~~HW;S~-ic0zX5@7GV z=@_I*ZG?zi*@(oG2_6;XhGmXI7Y^eJ4P>G}so#YE1K>LK& zqT1O~JN#P4d7#0ts|?faHRW~XJ!Nw}xwWym@J9R6{u9-aD#JRgFBF=VzmO>t>W(u|#x?(( zhsQ+v@(i)lP+uqptI%OK0-{eXU)O`yILi|)nvR&k>Ab6(d1xwU93s`PF;7*I9}6Gg zgPA&rf+GM9{u-zv`>OOg&rpQo!j<%tGs->X>iV?bu%RW~*{=0^W^rL4 zr_F8YHORz;E2q%JA@uH>&LQHZUZ2yaFggY< zc8yE(FDkVKZ1Wn7zF4dj3g>||CVZ(nj_{$q(E0H^k(^8|$Lu2byrWt2D>HzAR4qh= zl&Cx%YZ&eje{VdW7v< z&i8R8DI`+jSTF0<>Ro*I_`uvhfaZuZ4ek73nFpTUA8R8A&r4YM9__V>2` z*z)-+6w)aMI47qUh4T_v`APzlmWh~#q2Eg1ZV~%pK-enosbahchoMnkeujNJ%T>*# z)$O*67ngv!%t*7H0sFbepKNLB(vVufH5NdHG+@TQFDXe6VsqRhy*BYHJ~b@P^&ST! zDihAJP7KTWN;PenqKgP%`E^sZxv3T?koS!=XIWpDgN#V`zoCkdrYKKk&(gy-`Kx>xtKI%CP?TQkc2nfdvr$x|aY{*{CWS27Ik09sNf!+4M@6Yh}SLtdJuKSa*Yopyvy zAP#?T2Tkon4qn6|rLl!QB56gqt9dFY5}qJM%jtPzzBuEk28fEO3F7aaO?@t3GPuz- z?_ejrHZ{$j$=kgE)mN*T!AV&leJC})_PqQQ&l?sB8bUNmhAxpK*Ra7=okoIVn+e}D zIH^;cFaRdYD?7SWHDu(u!%W*$4TorQ*`u%@%){7_f*RrrGf2^ZYtpiC1Ya}L0su+G zfDBT)`bVa^t4u-*c%b}5`6yNWapT9nd~S@ttDipYUw!k{H}Bu~+nVOz+}YgO-SuBQ zf9|73!_UX@__%*UQQr68A7zCjN*{gOJgR!D)7x(Xy@A$)bA_7QJ(Nm>jwBQiaU0eo z>UIWN54@BfY{{Tz98&xkdV4Dl3OURLI4FYD%Bd`8+N+!!GnhRwIT9si8(78&%f9jj zfv^_7i=ZVKRS7Q*fqX`!&z-tw+H>f)*n{qs60>VmwtJq|I0=}?T%fal6#<9+<14S+ zX*4ciz%97dHPtc@Ato%6W&bAET#lf@=~Y3Pknm&l8IKA>_i8>Z#}nl-)ksvMYH{6& zxSNTd17JF0nYaLjbnfx9%9%e2c@fWjx*AYZEqttS<%mhD7sUtvPiZ5hFt zly9QJhXE>~3XLWwfXnxo@<(%Xb9q~*WGvHlEY7ZQ0G~DGm%uj2giuy}qdeo3JO14^6w-i7 zyO8B9VCV0AzYvBiOk)Nd_zX|)J2#PM?loe;Hc$h!FQr!v4iXnaT%7KCupkK{=_pS0D<*&-P zQifj80_y3m7bhnstcqIdG-uj>vyfG4w%g5;rH#$mV`;M*sJuHOYd>rclnkO)uG?t^ zxro%JraMCxtsSPz4t!}A$rmII%@5sYQq^_Ca6gO0vRHcodHFU?zq7ZuYx#y@k(x`b zs*6x8-JA+}8r@rjM-Wt92A~&v#H8Js83il+yMF`A{Y#lpURBPnS1R>-GS|6qp&2iq zIdk$nDSZ;7x%hmkbUvQbYO4SuNB*kT=*waQ%%#)+#R0tf>jp>+Nz;X0gX$Oz7V-at zm)ma}X&J`9Zw}u#$8TmlNt^VLH0{#OQnoaxw9uk1 zlx4fS;+C5tZgvq8H(Vg@;i3pF5)z0%ftwYG3l0+8mUnC?aY~nUB*(FmNPgb;eV*R~ zJJq+JVJ|w;DW79()~T(inx3V)A$pcW3@h1M<#L)iFVAyL>cUD)aSWcT;mZ#8q>O6L z#8h*n5cyCY(NvT7Mn+NzqS(YB0`K_N@^9aZCbUR9BjjqloU(bj#LF3`(4=aWR0|Q5 zdifXh&w__wP zIJE$e8>VsJu;jF(N*UOShq5O+_B&^OEv5Bmwyh|pPy$*NO@}v#$l=r|5|9EL@h{*T zifq(H+vs>Vd14;U8pVp8*+M54tCs7fdb?dcy|tC9re5>ud+PvfS+B$A?;~Qnb6`Ei zfc7dbG|XV0``r15j8Y7|{WCbCN2}S}Cf|`<1M14Aqe)?PQfLjZegu71Goc#@gP10X}21@=B2r+{y zXbzo68)%`Mx;VX3PAxC{Cz46OH8(ds?T=-%<+3lt<30j8kAlG=9`p~abtuTeZ4LAY zLf-%g2qS#J1m0o3gTmfXQwjEyz8HLh*`&T#2c$}-Dn<~Je36VQ#O647MSrR@jZoQCz;PMq7m{`Yt)We{g>ItdZg6Af z>h`g%iItV=xwTyG!nzRuc>5RI+|2gYx%GH_{oK~}3`x&{j`iw(#J*xw10jbttFL3@ zP{{pFZ1;Vv?^#Dks%K&FYXcwaEwC2_oa$kC`1BK4vofG&CMOt7bPb|PlI@mvVHqW; zgCqh*;sB1e6}u!cnKL>J>n?T-tVOgM=sTyv?oLytPIanMCtiP2l@&u=Cx4*=9to1~;I68{pzLl4M z1ARY5IW&tFz~wHWbd%Y>{&v%-(J*dz`IUQ<~)E&wB7U8 zKV#N5$0PxZf=tb39K>%2px+s4+{J7utdy1xKfk4!lO|;gOry#~YKfV6!m^fr*^Cjk z6~Rt2>T(9=;#WNRBo9Ga{&t4OqGINLP67vj8X;?iY_?dDJFO^ljm9abcB5EC8nnXC z(BIJ?ATc692xF**reJF~&^2@esBsV7>Q;`WO68`vYwwx6+8)_Odsi-AY<_ujvw3%S zw|VLK($4jzy}jny^~G+t&@3Dl!`EthoMz!{EU@XWA5789t%m zQHp?HLI4SQmmbhv$4~sEl$PMIjvbL)@bDYh^ACK7jABCeCg!;?8gWL231zj?piIgF+01Fsjcmzm5NN3o8?@WgiLe<=|iZu`a>Hw zonfZ$TMUfK%Y(s0LDBZ$9twrL_rLJ>|A*wkR0?j0{Dt1QNT)xzAI~piSGKaUA(>Vd zL-7%?00&|O*fw>W)85U_coN`6bCfXkMlN@2^iH1o;koz#n~!p2#QxOx?^*R`n#&y9 ziY=CPJoRQShv06)jQkJKRt)-80ZpPhYNM+#k#C@Hq3@w*=xg1nruhBuys;TH^5YL@ zXWx5#Yia8G!h?jXs-x-3SMJ86785rc<5LeRcNx1|c`!BJ*c9c}`>Wvv4UNPafJx(^ zYBd^%v+3h&=L@`tgzvh&J1F+Nr*A%9r_ZweJPH4#9~u2zfry|%XBdFU0R^}Fe?a%U zR{%fU!+JODRi*$3v!R(~M%a|9Vi`0|cU6lkN|M=4Qmo1@(VKvRyr{CYKsA=qnC2Q7Xqu1^UHL>)QItHK9y1)yj0V{V7XM3mwf44=mEoB=b31d+nVBuj5T%L4veN?xx!^485q`aXK zam;5b@g*<#My#tEl*uh(RhSB)fGrF#C>1plF<)Rzj11XaxP$|qNPNvSO(Ih&xdg(a ztg8~3kV4xODW!-d2sN3m=q^n%(Zo#2dx0X0#0*jxISDVcEaZ=Varix7FCc8#1>I1; z46%xTQYe&1nb;bLD9?!Y_!=wtcZP>SZOOr3p|^i0ghC`N3+te^H+nAaJz=ji`}RXl z^NR_gK0V!P(bwL6m(EwuS0^Uu)!VmerL?$6-&ozfaC!IUO==mQta+dok5(SsyZ1VM z{pGXqWW!GflKz3&o0NX9$y+_+7WNwWFpGu#Ot-a@D01YVn|*2Jm}SjV&zcdfb+$Bm z|M+`aq?F*Cs})_abyk<-WW|yqp2~|(F272wvTazSIci_$1Wzi!YXn1cgA&nDBi-px zON=b5^9r@%YuAWXV$l7x^8>Dio|;5BtE+Yvs}|@pQ}a5KjBs!i!d-RRu!jkc2uC9jr#Jc@-q_i^Z@PbWa&Ap#zrT6}tX zxzTCwXBAzPkzy~Pv=SQ)rR(FAi;@!}7xNdT&hQ){@_8}TE}QP%!h)$!C!e~a0_vn0 zk!wjRCU&4pHj`9B?WCzj92KTM8));@`Mex;5N0;jvFTkVvdFRm=*!Onm*Z`rI zX^S=$%M@VJS8m6k^cF8HodFHDt$2_`;3p3A%HiF8z#nhl`i#c0%hMwc$_}JQ#32l9&br=VFgM4iP1wyg5Sos<EJ?CD zFWDLpBTB!-rjm7hQI-tD4;ga(U=T?uC*glOFobXhVaGNUmpU2hMC`$OL8~nkGN?X+ z@Enq4ndw|q>q(P|7+Ww(9F?fDp|fie0l$fL3e1p$e+vH+{sca55pv5#P?l?*k%_6P zxynqXRtwg}j#w@S%NuLJW1tT$4RyPLnI`F6ZZeoWrsqEpbX>`YPOV?*PoP#$C^^#o zmkPz9cY`zjr6-NAh@w^R#6Ea3tY5J#%FNu7<=(Bwp37{snR9K!_I?XDJZi$SRfmH$ zwo|FGL^aeygcA~U0n;5(lu*+2LW64M0ga}Zo3#Vze}q%&dNP?yrEI1(kM>H*jk(*sNq_$b9I zxw=knb1*fIU!YJ7%qx z7xKqqc+&6BJ;Jt=r`%4jE@`;L!mtERG8C~k0*z5Ed#V_awn9pSpL(8*jLTCB|uwQH3k=0+lsRZ(bX(OCR6Ns3yObqK6mYg zI<;-rM2rqV;3Y;ftI0G&UBnF!x{N``Jp+f!gap*ds&HA@7VgFRv|GKs*{xpMnyYrU ze2YvAo9T1;{ODvfIX%7AtW~R9H#RqOTe-eAI}K{=Ud|-R(-qZ+;!9yJouZ=D?oAdi zobuy|0w2O2yhjxE{o0pYTv=jjd$h7HT?!=!YZ7?VHw{W^%=tOsy)z8UGI$ldM(pwg zu{T^(eIkk>7Ar76M89enva5T#qO~bsMj5qNo!?~gxPl~VHYY-Pa9Y9y$%aO-Y?7FP z@m_Bd4xo<@I9EuM8`#XLi}o%q zS9m16FMMD4q3~1T+nx3I@4vZMyg#t#*Z3N(scV(>Mx$2SpI&M$t*!09diVO>`}g-3 z=VoU1cXw{x+W(&XlMg=F+uMKg@ppdo)sGR{|JFwzet32N>Z!UvwwldmKXESzBX2hO znHR7KgWT^Y54K08uRY(z%!KL-q@Lw8PB*^Vqw!^Tz(0jOhM{VPdsTC2A;5T?t&m>$ zDfQhMJK`YFnyr0V&E1nMRf)spw&chv6eE$&Nzsq7h8=3(i#>$}%LJU0 z*vf{)oG^%VhoDTUjdW5(aG`*)K89J^!mOwnim8p;wmwj%D4kA>?!^VRsHjBm#09oO zczJ|a8LG2U^Hpw4ELd`5yt*P5XR=h)GmkaXzbVC51i}o3oU1Fw9mu7I4aP6SP-5oa zjF;PQ+twY&Ngnc$hv$%oN4!YZExJ>Zt;mrryRjozQS2nP>bm*S?n1^B*2JH4WV2}F;_FoKWu?x0guicNN6v+#Q`Nfb7!vH`0-hQgV zOa~FTVnAbt?ZVz&Ak@^5ikZq~6-EloWWt4Emt@DLl}yo8eN8pZY=&P&#L*NZ70qOb zQ#iQTL#pNwWJIa#sI+oTrP!Aw1)4XybpIr|(x!B6SSYQp7d9byu)Ef)E-i1m)#c@? zyQw19%pj?|(w*M1lfsx52goDdd*`R1z8-ruoO*lSxK%u>mfy*aoHZy}lQX1li|y|$ zq7Iw}vJJm$yVOLNSlTeuvgHg3Y1yI`*rHDvH+qi{={Bf-!}iW{DC7=~0=cv1pS`Va71M>>|ahQ*DeqxIv%I|Iy^l)JfiJjm_s=rRUWR?RIjy}ku8V4;zz$jIssu2LpgP3ZvRJ0|GFF%+51}&SGmZh;Y8kPq4 z?{AFnePy_Nkjdv&Z#+Ekyo2FbWjpo7#lFO(^;5J(pF}L(|BmtlpSOg`C_UN35 z`!m3^Ac+r+i=lf83+e%}b%UaX3^|c?*QJW5gKwCOWv~o&awyBJU}sUO+e}RWniQ36 zNPAqO&cHM}CJ%k;Ec@MOZ9**V*Se*0IL&13SI}avY zUiMg`x^ul}D+xhJ)AiZy6qDOh;=j5eyPt{_jC5bu^<9(0Y_PbND+)syuVSbxLLe>W zHaB(CQqrcs-&U%esTu%mcxI%)w4rNdCWeUuGt^o6wCpLZ8x(WbLuUH+ib0p7OcrLVNP+o*qf(8nu0f4Ks12zJEF{1A=hPV+J zNGr-|BX6ZPWun*f|ZH(bt=n;Z4A_}?!6JY2?<}_1` zcRtQJ%B2kuZK_;g`l9U>7Hn_VQDs`Yai@qH*AdC)f0RKLKG7jHmD+8lrlxL=C`Q-l zU!}i;4w00S%2FM!(fwhg>h*Say9e3I?d`s-ZH=hp9aQ?-NRmcczj6R!w$UyJaT-oh zCNSrLPH!lG?hJx9NT2^2A50e{_>-L-*kk;LE)1EIlj!q9!-3ByC!f}o7GkOn#G1ZA zP)_(n*NPT6m@G4A$z}ZV@7LC@QLR|X8gO|o`uaBo&UY#%we)D)khWPs4*<4 z`K1xV+_GHPPNEORt@t@84#9PCD(wyHa!|G`X>@Y(>go9Y&TDt|S|FY7+^yB_?wm>i z&g}I!yv(`Mm|~hAQwgSU;^5@x^nC0ma|nX4if0v)1mQ)oeSE7yG`(*KvsN1zT$lMR zE(d{}7iL&|1?z&uWnv4C%E61`@(j%c~~Eh6Yo@w9`zfZU50jMTieN;o7>vpo1eTCtOv~;1}`ThNM>P z=G((s>}KDQ%i!fj>E@o^J}wWWy>@#~8kCQ5W7I1&&g*YZeshfsTxVMAgMT3z)6Pj0yODB=2 zQ7^S<6bFz4Ol3o?YKk45Pq)`2Dpf z-+j7NuS=Di;+}Z6#hyH^RGvOzThGKjqxsbbyRW^y+)U&;%gAnYD$F{2Wxl?9y-8fo zax(rg8-4w%9>Q=>l5(QWaHeA&w4Drh7)!xQ5B9$fZPln&0R9DE$1h>qLZAvJE(exa zh0&M-<|{efB06Q1R1C$3rU{wzv4^3zWQDmNBb4NIZm?P^sBw8vC8`RGs8Cj_8oWOR z{sU|_T?x2{4K-k*Pe{mk)uKFnp3P^tY4}uxELC!Gx`Ie(*qQ_5JI|R$IZLGlLzoad z_=BY%!63Kr9m`Nvm2y)Rq~f3j+n&5mtki}~bxhk!@ub{vd({O*oA-9|2+ ztn-!EJv|lkZ8wYRmu73&pG5WC3ya@jxTZ&T`Jc)C@;mwrCj6x+sspsZefcno?o^r? zimGVhZI3!B=)c3m!%r%x0vjtyA23bMiAe~>b`rpi|N zRXz9Zyt!#xn#N2XUWJ!^X}_AHK5{hx5_n9zWs)PsxX zOgbEfx8Hc%8hys`SWCm|O+0cz#^1}BI`CA*n=a7}N41Z59Yi+%Y& zlvmqt8(A4YXD;W=Idf*t%-EiZ9ouniC*#;jojATUahp19wxyKqCNv7Aw{&|U?W(jY zl}Zt)h+QOBTTr175#oWa7FKjoVfP6M#0$KFwEH(KVps6Q!;07P&Dcqt?#u2ZV~xiz z=lj0j_q)uNnANm3RV8NSR;bp9&|}q1P>8H?aERK?BHK0Z(weu=SqfZwYr8@+;cu1Js#xq3!~8t z++izn-rbMyeP8;rFzi8Er9JBE_qhL=>O}A0re8oEo|az0*!~)I7`96p>2)j8`yn*= z1Xx$rD#A5aDxE4`D5zsx=tKJ80QV7yupQ6`)0vQ_oO-QNIb4}9MtSJQmNcYfU*FUL_V2|$Y5)h9Lj5beE$!9fU>9n>M)NwXcOJ+Ew(1-nk#3| zE^kiH=DF+IXEu(lu4jE+&n4LVP5k~Wo@{Q;+Q-%zTR&#cZZ;>4^r3R)t4eyH5JLhH zamr`<><*!SzdXbZj6R~*Ic2^T?BahA1iu)&{0XNBEdGQi+&d9-aFgZXRWXm{GBAyE zgxjZ=mzUotDC34j_Q=JKT(u9;gd3BlQ*=#d`t6)#B*&ea@Kjb)Sza1sjMQrDy?{6t z$t~mm&2 zjFMzzK|zx{eYp;rt>IO9?r~2_25w+@!;(SxIgRU|gCJNMtce30`3F4}w!q!c|OaW;Q!Dee&wn6W1py(O z{%;xA3phJ{y;5E)Tp;8^VXa)bKAmOe(dN>I86#yMRBoTYJ%p3}0NLTncqK~%lNQg0 z?oJlo?m%bv?i+;8bAtCdrhO0F0c@1Xy5QH8vgNI)dFmLtkar`FT5 z&Nm;OZ=WxT*_Wo0L1)MW`tjkqc@kMQ&GRsv4jxeqgf zzV3>@K>%MspuZ@5JYu+1Qxxl0DllRA>_6xuI0r!^F|Io(?0FM2^JR&|Oj(HXjH;!5 zEkbA?pL@0xjshnO1}7Or1=8(e#>4ImdO%_IK{WSxw9^Xrwz3dS`(eOOL0xx*+?oHvAJnl?m z`(?wNG|f`X<(CzoP(@X=_XK%rOug|71slIpqxzoqk~cUlorn-rvNXoh-GRnzIQ zOr|iVjlQm!rb@VBLB$2|ET2H~7}TR-^^I6 zhRI$9LcqaelW96Pgu7M10=qNgMN4(cX-b@uZDf){cPws_QK_*h3%g$_6fR3sfi;m{ z!K6=V`Dc$ch5sI!FX$iAx20taA_@LOpZ>t)p+EtG&*6GMOJ)T3k$& z+l|KI1+HnW>ACZ#Ch3`53lA5RXA6LOJW^hmJ9B1kp**55uU>g;884&y{~52g-#D%^ zK4&iHGM6)R=DM@9JKpu)Y_HexuGhP965HFvPVA&1P0~;rQW2Gls8lXegm9}ADhd@U zQbF)g@qmPo0;mXRfbs?iAvFc0^1#19K|CQ9RXmn&X4hWZSV7l-e!Wy7onUHej*cgI|M31_1CeUrzeLA+{vS5ap6j`+e z!`Vh0HGse88`Q-FDM&GJ!>m0HUwg1`0%sL2X9^CUi|otri_e09kx!#FcRpZc(?lg` zU`tFRi6K&xxHAe%v}X-nR&`>CP6$^id$_~FtYB4jyWj8}T6?K#+*1&{pR4C&k7`PpPoTs8LawzPNc%9R`EPn@`V^~UNWy+^jU zZ#=WNcl*ZeqqaUJ{Io*#j`E#Mp9Z~^FkfGy5Z-96_J;$|Lq3)X{+O(SAfnmns&vRD zTmM&5pLdvwAOuWXPz|1_CM=aCRstCz2nQyss#pg_czIhkN`(%!NTp!dJ%@0DtZw(N zXXdi7AnQYlhM&z85z0wuU$KmPm})8`x>?6m)v_leM7Pj|$hH-t$(rt{tNxr%DhjJ) z|4_%aTGgEj%&%!P1 zK+5!_XvAjBICg@BI{E4e6Ija_?Wb~9rIzFtmq}|w226&B8UQA#jB{wfNSZ$)W;x+B z44HzwMon(bn5giXLdTX7U({`#MP{fvz6$GxW})8{dffq6SfRf%KeyWvYT?vl>&CUM zKalzFJFprMr^AYAOdO)B>O$7EiomP)ATyHOH5((RT{$&3w{f!H?QW>W;zriF4w#b# z1n?x9-f9@)>|TfYy|&;OLpW3R8Yq)H<%Ya3v~g!XM28}TVpHdgghC+4RUO22!qhOB zdxOD5lo+|8MpsqX5b9N8!{G0l;-d(y=={2`XZlmEIQ`yiCKG+hPGS$+SXEiQc;>Ay zJZT%6t*e@1-8|iQ)Tq0aLP>I+Sm&SOT*bQKcv&MV!}yGER zvIq8Ss_{>Ec0Tmzqt`+l{=nD4kYBEtIC=eTTKZPbV)(THRjZ0ci$w&{g@Rdxe2l)>EO<&#L3V?|hUal1b6@fKTUuHr3Nm;rY0Mf* za)v+CYnDyLo8R<|uhe%drglw;-+zhV`NEwy9LBf?OG~j3V2hk1*$ERk;eVtDaK4IE zm*yaihNGl8KR=jlq}5J25`#vyEJV557--&!*vr<1{g@Glye@Y-IB*|EG8nA(bK*|t zb!0VM*&pk8Z#*j;;%u;I* zgpMwYvg}dQFq4=DAjSa-h_2f;YGVIu$gaY$Zi~RMgDy>(b-Ibuhzc2ks zGN8dXpxbUr=cScV)K7SKzJsO6tJS)u<8*sx&n|VBj)@gWztV$*JF+%5$8~m=kSQ3e z6O<+!?eIX;``jO9*bMr=owYF719q&-Hx1`WYLs3u#SRs6QZj3n(P8BoIf&KUz>Yeg zQgSV%2Z}HJMr_}zMpV;HQT9G=2&HejcbJ7a)HcLEr_ADEsKk9|ulHI6{Ko?~jC{zq zi{Ctb7pt|*uOmR>-=Oji^stN4=~1G!p%#)fXu8dXg*2%as*Oh4KYMmLUH;$HKZyNt z&(BjDdiay+2=2Rs?P19{6oOaPRS*6Kiw?HC?T!KRQuuJC^tKy0%NoZ*m<_DwTM# z>?!uw?_xSzN;CH^fMWgy=|zAS>(WQ0wNbIpsVXfu7tbs%FPAIDdNGR1Ph7ovy?p)Q zaAf2dqcI-(R7Cqr>_Pj?66~0M#*`tgTtUa8a17XsKATIBUpZHGG^7zDyhVjc0iU)m z`&2(|ikptT1X`+@Vni$&&5$KhuxR3PWVo7#Yzm?1d(GTzE^@7BsiH#ykE%?B-i%r= zL#?z-Ei&C!spK9XkB2-i2F!f*MNNlZ zQ_MJ8${W@nLA!H+@+IlyD0NY7S7JLW?Vn4(1HV^l(oVa*Bh^%6?!>B*+xsN9p4!i> z{jvc_jN!?(n}H6!`@d{g$!{E48LwBb>eYMo-m87-u3p^k)$VkhxSj5{V^7+Nmn@!m zCdouj2As(TLe?CTAS5_MgIErTWf%?!q`4r$VMb`g0S<5h36udwVi@=*I3OXA=FV5u zi|tHW>T-AWa~*!)Z~LZk4*d(Lnv(B%Ap4{G0XU|Qd24%5L)I2#6|y_JmAH=8_F5*G z^a&$qsugk0sik1qRVHcPva#?{WD}EUr?|AFs@aI<> z8ykMPTJ>|bt*ZY1-rjBh_EGK~@%5~brpZ@JMN6{XWUv$ir!pC*WF#YlpZfd&Ko~3q zQA}zzkZ)~VfKn<>I{_Ry-U*D4=zXM8rWvY+7NqJEqeE?Be}0oY=Oj-KgtKS?;~*3m z@n#$ps`GVJnN@YkJHCUY8%RO{Fs~+IiK$YXem^pFP1h0DbkjFoPvsn@WLh`^PT{if zE?KDP`2n_(^Gbi7VR2#spKt+Z9U@hQ?I}3>jMm?`86XT=&X2Y1DyN_qZ76q?-g@rj z@NDn&eA0*;^Yd=KQYyKZ_V+j4&0|jZoDY7s8&12!w8%voQp#jTBe5iY_j%O@WULi^Hb#$Kr;v4*ilv?TL91bej}>%lc>A0((hmP zqUiF~ix)2|mjTb?o57K$89xu`gpY?wlQy@}hYZZo?+`o2M6$=YIFj>^11cM{mY%Pe zUOiN!dhKQCAd+(&5fh}ShB(nU&{aJXGcH8rcuxW2H=>_f1Y~GAS$VB9hb7!oMSwmL zBx+C%`uTi*wjr_CyC6KAs0B}>rgS@M1y-k^B}t)Bv_s5>M8n_*#oX#&jQj^V#%+CB z6iT5c$6MvUGyDe1P35Ka;u&wY->1b&g|_N-da~W7Tvh3CWo4DFzG$}^zq=!Kj{_uw z20+Z9fbY#oa2%)S$Qr}eam-S>j>QdJe814k<*-|z0p(rhnW4W9Zs(bjmqFL<+XS#` zak#Wu>XElk*HgG^hRX_;BxVo_lMs!1k9*BXjm{LL8gUQD#cwCOd4qBXu{QJFnD!g;ZnESBzW)P+XJ*V=r-}ghq&1ttdYu%N($k4(K!+s(@RD~FuABT$>+}o zG~6E%FMhuJjp;Z6d2|@25WXO)ql~UUllIw=nJbVlo@-TeQlBjq7g4()r0uGS@EaSZ zvnF{3vbiAKrd`&z5d#3cdj+j+N1oF zt!ry**S4PIACbXcI1plx#<#n4IFD=wM@KSR)iS}SQ&>=2%~~}>wKpbkisQsWjQO5T!n0MHN!+SW=%+wIxaZu7Knvg$|+LjOCg~X;_ zt^GTz3`pk;lVLN0`dM&iBxDl4*&QO&Qez47U?*u{(2j7f5UQObj-dvDOS|3oRL_BJ z@FyA;2(pZDhjV@f5}%W8hoEPSapNo#!qLq@_~Zeq0%%KMaw*jDFujrQvexAdU|}PbCt*dG-9wFl$*$hpKtJ|M<|ivym;0CpB^D z@rE$o8{_^o4uiOr4dZAt3t?_4^3%JcxNIFpV=#@ziNk+Wm6Rfk)Q(GqiFIS=0eAK# zKY=g+zi!&|s5;n$6zo%BAURm@>@TE!;(;j{6?*V4l120Xy^3}!sRh`#=ql(%P7r@95vY3um6HZyH~ zEiOckVL|;Mx>n7ve@Iic#GsZmD=~a-f!|*M_c~A>toJLvUy41whBT&J+}$1SEY8hs ztn|Kk_haopn)>$6$2)3V)0Caw-MhUVMXSX|(z&0cbD2)%)c*ct98(QV^fWHS@IDIr zXdXs?;#S!JmYRo!Fdf~|p^~G4J1s2z{_)WL+Kn4G?pfCj8#dj>Y3c4lJ8r{Jc4jTa zmXT0hgVecuM{=oJCiE4Amt882mUO=X$8O7~j)SF*JloX-x5}xlm8s3X6h*}_Y(q^Z zEmt>V>6bVO^O(iD?ss-9N2MkvIt&c@r+@~{q$@O=rG{2&+B1oR1q3lF73|eNlZCG@ zQ1CPb@`Qm>K2`p%%qZufUtdcbx?&jR~T&J_!s%>oS zDy7o$?(&PO;o+aLeN94S4B{k42I)EiNDjs&=D837G<&^ql*1ikGQGp+1e*}BLP|l9 zh6yiJ)oLgU(1uO3F8Q~pPB$#~4A{e>FTHNjat|!zNbJUXb@U>U4sn1m{{_^#g^Hag zgj<2vNpP(b)N$3yE&QMHYU^#|xWY3#yE8j`zmiLelxa#bY3i~|N)#~LgWG)QQfq_aC{nk_nQ&iJ}Ix5iJ z{{>wp-~)$H1&yLLwA2`wSX*l>cVnC%Nu^LW^1R`oEd&z*R6|Sr2gP=Q+xM70Jgf>kCgb+o}W-5l9DV&$Q}VM;Fm1+Cr<1QYunMS%kN;QM7V*Yiniv;>DHW(b1J!y}q(|d;0dJODk)) zZr&`c6b{<;M30_cM;7Q<`A*vMYTK6QWs^3$C#p2(!17-n|IM)uEClXPd zG5wy8u*<0+fY93985y)lw(4}%y9@R4rfjQcye*-05eCwX=ZaA8&kcM2x@;R(y=D!o%c;? zm0GeR__|rtd-Q?{4u5rMNHy_-Kn;*riQt7Y9Dc65i*wwjrcSi^xxqm=v>rtbU}4?0 zIM-O+l=Rq#)EaF1GMl-^{7GHDKncxsD`w0$67#tmA9odp+CnnQ0s;;NMbx0q{{nR! zL?h?|T5omuBlNU!J!dGTp^C(-7cN|U1WmqqZF%|9_^lfYyQRI->(YKn+^y_YURU-j z;x6CgulYU~_aEW?O}syjOBMcTb9`Z8eDe{nl-S^VeO-e9!b#ibk{rn1xw^=@OMCaW)=>r@B2mFI$@T zi!fY`qO~YWdVObyl@^b?hND^7(PbD5FhXbCQC)O&131kuTHgottkPt%Phs7Gp~VJ^ z$v(GZylifRlu>H6vHCmuH~KTmqbq0{eSo%GzWQW+gI1tu5RxH61g*0VI+p<2%i(s zw6QtZ+gP;+rOo4q4*w{a9r>4UW&ijscqxXV&;cy}HrhG|huAT|mZ0>BUZLN#q3R=` z2a0O-B_XK_BAtYZrEKcua0ukKrltcef~t0(X0p^D4^?lzh_HPk2Q8 zdo^klUCzMT%680Xz_K_YBrE{YqzKf+YN7a7(CY%~Mi28dDFq z?u<{a-nungpIcuq&wTpi$p8t9{r$ZKJCmWPE9ouN@m~FP{Y{ z--P64h^OvM)@Q;3@;p=sXX=x8rg&=S@w+L|qGN%g1@hyKI90q2=VRk|4C|g4*SCtx zX_VM0&)acWBe9LB9X@NDV6eRLd>7j35=3q|Zj}Su7XQVk*uV>zSd=l~xy3#JZdbRj zEpo^7i2A#7`A!sVmdlPlDw%QeIIo&lN~-l89c#7jX=cb+FTgujVS}jR=o4I?sRsu*jM?8FEM&r0|?yO3sjco^}7OS?Wwss;O4p&?L1NOoGM(>^||_pz>l#)I*6 z`d13GP2ba;wCTq)5t}<_UFI5H^5DXvfN3&hiDec9NI(Y6MC`OvC_?WvGFd-2m`>*? zAvp+tIgRt2W16|1LLrCX!r#`}@lBJX)ocoHXaO-EO;O={CDr+SzVPSY~%914{>P7#NsYhFfMBX1L)7 zX80AHh6|SEPrw~J@CSIMIHxu(Q;+jmlBFcy^FHtMJZ}%SaJvr6wRu>s(^*6>(K-#E zi;{7@BWc@1MbG&Kmh@P%0G=F3=r_&fwt{=Vaz)gT%>~Km$tK0a#PBcZ?Jv@O+(@(3 zlj+i4#1cV>U`G+`Cema%f}KRRX-4nexf9)c_uXh^eSLK`x)E>2<8dh}T`cOWdpWJ} zIeorl^Umcv4=!Fhe&o1!p$ATy`mFnpz&n=!p*s~=rY%_ZXuAa$X&Wsm#;s7&x39>? zGjQN}+1RjcSgrUG|t5i_nU)5=&?1rc*f*2F|%Y#Szp1oebHELEfCs1_vI9(8S6 z$py6M6$T_H+>gm7mXEQR*2xhu;dO!s3qt#&WhY<-s(Mdc-|t<*4Dnezxa8d{`@H&9M+He>Ql0~NS>lcI7=m?X;nrb3G2gtb(2_)c zU9?3WDjCXS0Pr;NelvTTBc z)?Aj9;V*gyF7dpXWeEjbPgwsY^$&_rP3n-^p4O_u0kyfXAMPId`>li>Ig`Fu_`VHiuFj+SE3 z2HSEzgTX@*Icz*knw{kgg?0@c3qEdim`;J$6={>!k|F@!q?H~)E4Y##S+d$~0N4!C zXaiJ@W9d2iXSob!A*+bjL`fK|FJ@SUz!&1N75OLiZ@@EAkrB*`-6H`wXFB?Fg?RzxGlmZ@!`@G_ z3H%!SC4Sc(jYe5;B?oXG*@@xUCLBiKQl_ZQ+Zbj6HCvT**G6?wTPcZJ+`@`L^9G-> zM79mjO7K7ka{_6kCHqOCP%9QUnlkosEGcrxjIsza4Ji<0iFzI@d@LbSl#JgKlo54b z)Eh7l)Qd>rIhL`?v2BwGD%MDgCPQ74#PcPnyFqoSWonaJnA+2E$IE6ror7 zir!uXv>Yx~?2lDrD#$&e6I#7B#D?Es7V?PE+d2mv$CfoxxPro4jQDX9Xn&aBEaRdC z=_n(XL`Ar2nE2??9*$c@k+mCx;44{$@CuS0BX#UVxBm*$P=+dlYHv}uso^wtV|(lr zLrDz;DqQru@i^?ZgJ3OOJC8yN!08*10K!-a6mj1qrN&2WNl|4BsEtx1jX9{4|M z?bV2IAZCkQ18a@qOuB5;RH3I3;|$hxB%64Ea$XE>~U)2rlxHYEe`+!!KFNlx>fJaD*5Ewr2h-h;GvsmC6y=AZr@F-*N z8nl~J+06XUHO8_nHq&V7j;pbm_Ja$YlF^J)XzUjx0BWUvFRKzx5@b8c-Xh@iAL?(E z49>Ah-GcNDD3Q0{+!%K{8ym4+t;RIZ$D@9)w;%6cK?D=CnGl-oMK`O|8lE)k&|n zvr{d3`D7BiG8zotsJ?ND{ho8*)5+uvw1J0$Su%P-{F7nj)tIWx3y^*Tf=P#2;3dvQ z3W8S6DS%#=wsBF^26@^_(zn5SmtaZbZ^6?;u2I5_1jI09Gnm{0Tu3>7?yDKXb1Jeyu$sD^J@8RBd_DX zdHo*qoB7Rq#`gG;%*1x$#BO3Iah+saw~f-0G|e{YZks-`Y}J-(QN=#ct`G|sE{HP+ zByOO+BLNpKt3`+l5=i_J2*hax+ADl#Y{yBv9H<>z(fF5W{P})AFE8Cn-t{b^QjG;x z#$X-#$yczM6#1a`d+2TS7!8J{M|Z7+X=tl7mn2)mUT=4I>(WNQe|zipOB5b~*`2hK z31jd6c?1hQaRnE76VcS zH%7R|l(T07a5a{g#d2IlT30ey%_Xi$vaH#q&qbk7lKs^n1`{`QYsUVyQWcxCpGerNAJM%gqdV=1|Fn#(?oCb$h>TQF~Y~R@2JUraqxqA8X@%Hhn>*`FJ zQHCidRe20SbF{c*y1HZpalWwt{N!@;HPXx-jLVLyfi%)`I43(*LgWB5S&`(bWyeXD zabR;GxqqRpF%xWGKpO5!9%Z9MO=4?x9RWwOoav|JVBsGYq%9Tvfb{ z%B~^|1?x;~Q@)bnt?CU9CpdSjY=XGqo=rof+p3s~TL;y3fI^0*dmg9)1H``qhwlR3 z8|V@^{5yd8$LQhkf|aJ6TIRAjWxyJRixYIOn1~ok?@tO(z}oH6p`4gsEUw zp0P5C?iZm{iY*ETXBNwbGng?n2?i6?i$?Jhyb}1>(=r-7Htlto&zJ^OB=b29^ri(} zN5*at6-`#AEAz23*MeGviGMMm%)qJbQhgT2;0dB}!wo*Iz$4AxzMBoHWM;Hr)l+NS zCB4P6kz3=jZ_{i@A>=Ruy!Z#?us`KZDug-R1r>jRo(`9TgZDa5;*-w3;XYr zfb<+_rg?C*vojnXK(#u!y}!GA0RLz8VD%LVn$qT_OXKIXL5-dCbWUM(3jSnR{Qw8J zF=1MS&;7~Ed?L|gO3{>(>##beBrastsZFeX?gTJ_dxpK@ajWgWyWqXmtAZyehAH{< zSCZJsPD1!K;MiTmUQ^8mu}CkZdZjE^BZbRN0yNU-?*RF7dA1V~hP9|0P~G^M;5Rdx zq}*vTNmB`vbSIqi*eNavuFX zPcIZ*fUbK5?V@j?577_N-QmJLk$mr?>sK!g)|S;8YR3x;wVHT%aPaJz@L0s!ZE^qY zqoWt%#s7>m6G0n2N4X{p$HeG0GP3{xN#4Y8j&5$p&{R)>pJwgpFL>hIk_~hh!>VBT=DAt^sR!0bH4c_zWps%MFrK+ zKBUnP(5L9fXn#2O*#FTFkaY8=e+?nOdvxSKJ3fB@eZOc~82eAY`RLIn{wH5+N#~+| zcfzZFKgBp{^w;~KX=mq{U;+x63*;%C2$>kw#Lsdbj^@-1BbYOO4ePo%PuZSCb(IiJ ztxFnHJVI;K#=1F_z}J(CVOzRvd$Nm30)okO-vR$uS%Ldn6H0_+&NCKLGN&Dl8brp~ z$HE?9y_GkJ?Jl#@s+2;5Fza^aYMSTwI-L{WWE5jp*I}xLA#0e~n)OR>K$+sgy+b?j z=DDsK)Km?Vaz|yBX{*%G<}9k~-iqoD`qE@*qYid14veP&fec6ksuo6Jnsnr~bd2WOSP*d-{?upO z3ZNrFoR3P2ay>RGN)S@xNLL}_ONv@7s~@XQtOP(1=R*d~l-NJFR6h;_s86~zyHHVT zZEHq$LQ(n2k`z~{VzzgOM@yZuTV~*z1>fQNHR4dodY%>54`*f?@RKBmjt%M3Hx({0p@ouAZQBa| zOL&$2wvpHI`Tb_*cg_69bNY(y#BOZoaFfQ)*om9NJt8+pv!R=A(j3r24>c?Gv30vdqH+C|g-}iHw zfnn0GN{1zFDxU>Bx>_0c%ugZ1Pbk-vTgsJAVKv|0np`Ja*xcCK%8vwrY394@>-nK{ zdMrP7Dv6xW?(sx4<30pZ1s4h%4Q>`o;9#cXOSCX;R{NuUp02dV%w9gBRhbI0J%h8Z zC-iyHEvyBUl{nNOzCvxzIYd02NDrld=`zEF-Wlb2;b+yHlqu|_tW9LyFzx%R(s{sS z2`5zI6H`~q(;!K_?hAV5uF4_#9SW093};knd}!&(j2%c}dG<(FEftaloX8Eo^Ug9@ z(Z`VfWYi>G@SA@se^-jin9^0=Qud;0DOD=%w3NEu_H4Vod;4~~wK%&tHPznO*%@vR zpNVp>jEWOWKr7jdp&OXT8RP)kC_Df#rKl1$dqnD;)2yDrJE%j)P7}iHeOPdG{9T&R zsqS;S$?gDz-{BUg1p!uJrq!YE{m68FAi=*~ic7SKC&5k(Uc)F!@d%fIJ(GH{4vegE za1iU_MMQ9_#0^bmOg$I}7$qGAF4eNc;yKe*pJPl*jjURzsXU;DZgNR-7S|=Qy{Zd& zTQ51p}Uf zZ)I+GcSTtNSkGX2W-9xW8HL{H?n_Rf_^C| zNibd59OV#Tqs>rB83bjP7X@k9egn;GpPTx!P_f9*Efm!B(gr}A!UbC=CUV^>F6Nl9 ziqcZcHPA+W>nT|34l~JO*1+(K1m#0!YV)o^7WUMaSZEH5@OEH={{s`u6SeN_TZ9g)_x3OGiw44HJi~ot>x`Mr&;@w-)}U z5|~eB1OU^oRKzy#(Zb~d7Z%wRhGx-+b|JyI)YDQo=y)!-pY~v0sZ(+&m$+C|01*~z ztpGaQ@Ge(|3$G?hgvuap;R}^@Q;7G6WNa(;Bo9reXkT z1aYfTZ-$LzGDR+2sI)@T`^s^n>yJ15J|tLp8Pd2^wEC6=e=O{iq)MZJT8+L_>gU-0 z_8tp1{3rLMV2pvS)>0P4M68>e$tFeu*Rw(<+h}kIICm6Pi_ZY%+o{Mnjkr{(Z}`7}+RO2Mb36-6;}Z*EloPgK20;c$7uW?!r1AmI52-v0r(+Qm;fAkUOmL=OmMCx` zGMmV`GCIX@xl5?nPOzlp81k-BD`!mKDK9|d6b51hGoh+fB`VV-${HC}P1wYP!ULn_ zS`f`STw}pjgCU~jAaC_^>_5PHnPLLxeB}~o+-2yUo63G?vOB-Jn%|h4%Xh$VXTmV= zTGsS*9z<9;PQHS5%y}M$b0NQQ-bY^FTKcSvHawzKsvkod(Q|K>j`K%vDEc()vo}8N z99MUxdELL=lyh&x@k8XeI6EeMrqQ;r?Q}ivgKxJ!NhJTujPU3gWRph>GP8Ab^synJ z^d(Uc40&)XXUow1oH1Wwm5KyPf(wrsloJUm*2re3vuy@EB@GKa;zlMD@sa~C{|zlK z1=!6hbIO9!0cL(%d7*r*Gkt$@o#q>d+_8*x4pR7t%qTE?fUio z{cdJ{zKdpN+^+ljIP0vi1|!jVKpm-u$+i4sfQMV<@_3^$KRrDkKaSlonFBEbx)jMcj;S)Ls>r-_hfA$B zWT*zybbPT$#h0W7DZ%`fuvK6|)Iq)gm9;@bJUlW_09z?RVsz1ZHEWD+uJv8 zgj*ZSJ8v%U?}zP~r8j2Q*Vn?efv^rJa1z4LdQ#jls&U(hfQ(X8Kw6FFu}YFwyx45f zW<2i4>3mRb;^9xy)_^oMYYKZSw4V6)^MO^ElX$D1gDo@tCr#$@Wg>E^@Z{oG?^$(6`|#|lzrtZ%8_!XGx6~5 zSSge2dW(qzv8WwfTU+aP_qLX9E?vF4cZl9Zi;H{8?!iH0uW`Eko%gE2y&m2BP3NSp z#>!G{(&%jkI1*{isnt_2d)jiG`eS$NKZ0!?CxTPoe!29_6AVM?wGMrj6srHoBpOp8 z*%y6XL?bO8c`k$ap!;c*SgK3!)>S+C2XLgvAw0ZwIVw%>io{2kJ(mLquxkAN>Q!h~ zx^5T=PqWmFfiJumO{m~$#PQJon6H-DHjXpAv*f;)+~s4re25f9iKHZ2q#hLYvLsrz zELpTITeg$BmhGeo0=seH1ZmSIhtwzv^iZ@wZUF)W=%MJT>8a=~ITYxnKm+(zz=vLP z$tjnjhXPUmpZr!_D|PDtJ(R%5nVtFPpZTBjPs$aVZo6KD%45~C-0b^JPcueise+q{ z7<8qKQc%z8l*hKVK8QJrYTAh;y{+t{&!x|$zeq*OR_Ed6uXb0mj@K$Fg^A{s?Th=n zz0*5iZi`R1#b^8C%bxhO_gPQ&N`>b3es5=|x4+#ilsrAL(HXN75_@_p=~L7Vez*De zbiGRvK;{TMUh7v5p|=7j7cLlBwM=xZ{{dya^R@B}m?CFxYK|csQ8ea6UEv%4dQ*$P zCs>^=;Zg3NZPBZOzJE-2`X1G4B7U*|JD7J3twZ^|>uafIJ03|lNN<{5ol59SEBb84 z(C2N<%o}mF7S|H3cKbAywdz(imwBT(sQf9I4Uq3L`N!lc~(e zlNHz2^@d9tABnk%_%Dg9Y&t7B)9KOJOqTw>OBFB~!d*6E`>UIdstSq_V=<+>3*t@1 zPImMU>yDvUtpp_?r8-j5qGr5McA`$L(2#X{!7bK3zq*r1>3Z69OO&OJQpDKvUDed0 z0q~k+Ia08uiqqnwKPnvN^ve9#f^`NOh@68K=;-Cfn1aRw0{h({(*~ zru7pwzjTkK@7I|cl!+Jbcwfn?S7U{dEAn6eQhnVwHJQTN@jNdRA8&5U-G-MelJvii zd+k)Nv6bAEh46K8Cu@w=4b+En`R=FJV)SCn*m z!*ZN^8~4HmMQ|1MJqT~mfoFWpKgjMwUG%l!`$1R^udb(Gu>Mee-V#)%hWK!T9ixiM z7rvRW+*3K*J+v)jSB@rBRgO@4jHTp^>cxph#Jak{H<O?#{8Y!Eyr%{R( zkz$=zZktInlXO)|lu@malrukR&@*hhOYW4l5@jnvu}s-Brl@qkdzGX-wrbwq@C)D$;mY}61Sp?X~b^LMhrVC=du==%GB(Uc*K%qiu8d; zEl3;ER5!VrZ%-<&J6UbCDvf-;I9WVV0zl8|@hd1z_q#^-`{3O~IdD+(_7yg?11Y>d zw7}!hOsZlj3KcD>xx6S9S4@sVtG3eT$0yLpOaRmrm}E#T0TN!+))sDyD>= zbMg_2zf8fS8_ECn&Q3Ox-#rsCMkXwM#?4&LRa18?TT@Iko|H(w!qGqJZuo?9nj=Y_ zjH*^@HEPmS0M=^1U6z+$ToxdVx4t;~>gWlLKA}&Wc4Gp@lcOingpg?VA7U^P`n|AzJn-lk zbA%+pAS4J8AWm2!SeUagrh|^hY(kL`BRCjyFz#XvW0tUhv0y!~F$ppuigAUY5mdB1 zo&{eOG%^q#)3HymCJLH>7t_uYQrNo$**&aNac&1^j03#BKuBYc9CV{YMh$Z4;N^z) z6Cu6vo*lwzoWUeJWC{C(1Hu?#lJFfuGo&{+ge1WG*+e%1eFd;i&<1+3L-Wbd_eu2a zOnk56Os5E^30(sF%_90u!Ybi5VIKVn^tbTMvMdui_+~y+glR$z{LT_K!Sf2?7WA=8 zxIuWGut(S-Tp;vtt}CG7wcCX27~23HuUW$Wa~NO6J}t;m04<-V0eY6VitiPiw}X9F zAYTLH4ZsF?Yy@y#tA6cNt^j=&t~maMmX90Bx|Y80wE;efWC!rm+g*9aG2U%rd>u-7Kee+J{@*nbhcMqsB^$ld_|3Cv|eI%$XO zzlHrqVXrpYF7%(o8JpOz1o?6yUSr@L=x!A41L%#{JXeklYDDljiHaD;RVjoq%&{Hs zLiR13Cy1H%q5DOw9}TSw?xh>(??KN&Uf+SuE{kEFDZ&P0Xjvyyuu%tXfK!;e1%1uJ z)`3q2bjxTr&`tqG@R-5*e<22OH;yxNj{6wr3+e%mN3KO)ggmT|SD_=e_se3K&-O6J z^oJn?e$9KI15d7VekKO_kmX?iXyNR94)%*XVo>9L4`&&JO!vVn1>001e---X*!&^* z2KCAe_&y}Oi}s;-`d;{^HhCa`HIi5IX_#Igcy=^tT7is+HDDG2L`6VEQ?-|W6F6AcOQOy(8oo1oIOc_h{E)j|INU%MJIWkMfkK<=UK=by6VO%<|NE<3Fe5Di2P-5;7); zD|tJSg2^zw1Y+A&=BC0QznW8~;X$`YZXCX%&p1KsuKcpJnEU(C@yi#2&&R(6?-JFg5(2IGxPOeCOg;2iuvHOK0M1Dptw&~Y;&M|D}HJKuhB1!G~!5P1P9 z=W6G;rgQiniueuA!QEeXk<_#vm1h((s4((Fjj6FR+D$tlk(i29tO>VUUJjj&8^PIb zC9;oheoOW9bgczZ^dJG9eB5mM>zGd570PGfZ8MAZG|(oNEOjEqs@35SOWwfy(#>{* z2j91TYN@g`U9}^b=t=ti)Mo|FOYGJ4kb_w;2(w%ui><2#Aa5u&yKW5DIcZ8U-A!f{ z8Q8V5xVvKR!V*8q&A?%kFwjW3Cw9+-I7sRo8Zb~h3Ruo%-Z{2N99Vb~p`=s2sMg7IYV<8p?~AtlCVQ#P%tk%JmWne1|5!N-{Esho3WX z1-GKOfA9>C-r{4;H=s>`cw)lY)!uQ#hK(}v4wkDR`^Io>BUMM7uvj@%MkW0rkD@q2 z>hN51N2v=XKB{7a~{<>1%C1HD~OHNhN z2DcT%!#;2DgYuV(s^abyP733r1Sm=+6x5iKuI4ZtGdsa^!Mqq6^AN}CIw#V3L+YaH z=_M55ywTDq!}D|PeuMRM4AZq^5nTAoIW`GF6rv!B29^eeOA(oXd` z#r%#4nk@Ak&MwBwuKIDHWT9V67Q~ zwuS6#aY>xQ#A7In8`l?GgD9Fw57p@U=GW3``;gwO{Ek=Jr=F^wE*hJ$kn)#;mZIRI zCZGLgJ^C6M(;zSwv7U)@OxEPRg0N^*6f%&bM``h|RO2D+)xGMefdknI(l>BE;>LFd zw-#kr4d$U0C+=)HK{MhQCxDFnFc7JnSJXaC^l9e3m#F(F_o&M4D;XgVsY2oQIn)HP$wJ9DNm41qFo{k{l zip>1IK!3I9^)cxJ;oJi_sJ$V5{X^1B2ByQ6x{dwCz>s%fb z(1YlfGZI+$8JmtYX-OneQ1%h3cFzd@-`I;&{%+xqMuoYsdyV}@o@$T|b^gcVU>^Mp zI-1e=(Pp>*_rH!8c_U6&kGbNs0{ldq)i>C_VR=r_Xz`S*8>iOPXaQ3q6*MMD4TTn% zxWv{x*_sE1m!7iA8deYvXl!(k&>^9}wT=^)p|t;Z>xZv?&3ySjZXdipxtomvuYKnHW_+*PInj$j(iVpq~$Be`L);i!tS@csfG#Zai&Q?OU&=WFRtOT+CXgTVqz{OF=ZY*a=_`%%kSJa)^t z>x>NP0CW8=F%9m*1Q$fx1PBStLj-PEOUJJ=O__^b9-)j8DDBvX;iD|_hPQ5zRx(NJiL!m>FKvLCs+$CN&2 zw6WE%ruZmt7{(b1L|b^+DGXwxUzW;HOBZi*OO|QLjr7%Tesm@Nu<0yZO);8Ol-caM7@9C56|NajQj!YxcWA7pi=z_Os)D2OPLqKu zK|RNnjeQG)0>?19XgNm#uNu zqug(-;fj>g8l;ZEdmmTsdFvT@``}%^?YgNaycu+b2Jkc>a;^CUC-4$K~+VQPo!We(`C5cX@?!%EWb7v8O^H=BheHHg~*7 zms+0W(SM9mPa7KZqD;0Lgk9e!)y?3R-4*Uqqu1LsJfD^uR{xaq zApKi!G!%OmJS=*chR+1p+*SW=Hk|5`4h^k-*jo;-bOBr-6zu;*Z?j1|YROHXQ%6lT zkZ%m-s`K+9TG(5N+t3U(hH9RgcRUnZL9;fROQ6W`j?>GLzi*BY6lTWjaTj8BW6~sW z+&hJ%YopPE#5bviHe~k*)MSODMVad&-5jbiGt*6HI%6wM0fn#paNN<~aOW86%^h2T zIF)X9T^oR%VD>1}K8tI{MlKdD5P$7P-%S`UQuQ$%k288iKatxYST^VwaAtYHk(_hX zQbAq=b+J>Ijs`(YvyCzmW=veFQ;`IbC^iuEDwe=Eq zRU9xmml&a77M!XQ{&=Fn5)t|t&=n#6{pV?=x9(acUptXf#Yp{I1*(x=S&hi*koB0( z;zWv+?nB4N$=Ts!T;;%dySdyrx@*52bArC`X?369im$x;EgfDNvi8*Th3 zG0jD^ns`84#)R~b!p667eZzgG^Z)fe658XFEuGc5HyekcUsp7?*7k-!Gn-nE z{WO_EfZA+ata%&!^I`G+#%Wu%*LI{Fal+?{dj+G<5dOAnk1gZX*3xC}u?MA&-u`wO z$~OO|$M+rjXYV7ne+(t-G>u-O?%Gr|7z;U%l{YP1;$&Qe9uv6E z2X0`R(ore2#}k`QHSfl)rAv>?ty5#4AcQi%eFO6GFcWdx?{k7be-evg4oVMf#QJWH zE$Q){E_KSy9ww;1LQB!7Q-`z5Rsi+dOXa$`QNIy0+|LHYC&DJcViETgvaF%rsd~;M zTUbgl3DKPF@|+fqef-my#Zs@+=nYm!mjNHCf8}l+BwWobfCfE=e6`KIGN~?h>(DCb z^e^(?j0;{c`@tGpT94$;33tbS)WvGs#~kiG6VPX_^^-M1k>$|D_pE$lLRU`XM?|&> zooI4!s^BFc^5IgrE;7Vp+!Tq9OcJ{kuWZB%ZgqwS2;FPCw@N2rgB3v;5>-N{@PlFe z;fs0LuXVxdPgT=wnEN1yH`es4uOt&7XmGua?jul<)vKiDP7|Uka}RrcY^jO1=D^u{ zk^h8hjmIrm2-HuTZ@y^gy`QU_Bqr+x9Q-SI_G4#^e%`T|^&*otod!u+G*>})IwBy( z!dKR~E?BMIKj~`B>PI+?-K|jg*noDW&2%-*%X>KI{Up73t;1#|JUvWzr|$3*Y_J{| z|J))giYO`MOIx;FDt*d70RCl?>G@?<4(-d{9S(xFwRP~DISZ3*{nRnYS#ym4D%$8)%b zaG15}#vB$^O*JN3Hp1;^03C(DxJ9HZj^op(A?>lKu?EepRp8e0V=n`upCnrL!K7(z zWN~`G1(g1)FlIk%X%A!VHygk8Qi^xv^zj z)r*i!@LLlxHHSB}5t5NOPu~*eRqN?^`ATs#8D*_Y-;r} zmA)RK;C>tHUD|0M?(L%shluBYHzYckGg?y0z8FgYF>a@lZn5-LJXp-TNnEd|9MyFK)~Qp}i$Di_9XgG#ba+ii9xl#IxKZ5YncGs8 z$Gbab>i30Kq^9b>PS1Q-Kii$tZrt}?CF6NCmcx**9J5$DVxRI>l+Q3g*7z^Dop~H*KtffjD~1 zV>TVs-)g~y5|Cd>TU}H{HE9fLTI4w3;AYj5+h9?zjjzqs2!%io)6a)$q?6F222O|^ z*u9~W;wRDxHNWnJh59e@enB$km(u^7ALdNjA?@1}8Kc~V-Gq;RfC|qdNiV7;>8s?5 z8S-QEig&-Y|M-_Ls$1%7_Ug`SKac6l244^#x|H6#R>CF!Ou}}r*~YsPRfsw+f>ZEy zJtG+oWc-_hlI5~dh$9M8X@3PCkg1?LT%p*j=O-C;QVNsyZP% zhENt-3adU-{GJtacFD=4%4b2?x%?qYxRr)MNZb+@0K?{(s-=|>?u^|?=mGDiOFGjF zW`M@3%*?Q1)>KSJZ8Bl4oTnC(8;!Bcj`SXz@re4JnDcZp30D_9dEZieEc~*-NQA~k zEt-g4F zuBn2z0pOxdUJQHAJ>}qe&yQ$DI*kaX6LqI^01pLstC8^dkAORtK4Br5@ff4{{e*Xe z1yG#<;Yl=FERAR;{`qWbvhonwb8JoP!X*dJisX4Of^L$qBwg0G-}*VHvYG4LL!dSB z;Ykg>hFv8orv_IDbI}gw#NpV&F+hk!rn~4ZS0(ncf|mXFRR~fBgA7PW~`gjDG{C4s2jyf)aMCMV5KHQD{rph;H!SUsC`=*yL%Ws zNSG|x9XdW5>O38PI2akB2o+%bR*&)NFadK2NR~~QPvfhO%hP8U>*VxJxW(hn!zY4X#~K}EuKlLhl!aa> z8vpcQ95OzJ`2b}{bclvSt(LwoeRm;w1|@c+QT$Nu)1E^Y7^tv$?|#1IORbzXCEbz@ zffwk8`Iu3A8#)w-Ch$I`rLhKb-lyd1+%B_IaKj0O{06_yi6X3p91k~Pu?s+4!~&+N zk*cyI?ItHXcw7yqg-j}^spM=82Ed>Uhm0`#K7^9lV$Ew>u~q$?Aeyws8$5BC)$IS9S&GnO(o3e=6!e<5<54ao&7f0xra>F6n<1HTjPi4#!2PPwy zRrY_k9S8Q{&xpNgugjj~vcd&>6PQncamYjJ!L=L*|QIW!ZSDZ8mcU;8sTGafe#Mhq9jfh z*i(RBt?`yfNjjZ9v;L$UJ%cu2Q$a4LykwMR~h&Jb*~NM zu4&YPiT(&TYMt;nepW~LE+csDN^aS!ibW^=-Rnh=`G4zF8{G=~dqOoMU75pEoE9$a zZ&6ED^yrN3n}AAtV)OYoLX>YS@~5df{KUMQf7On$s*2<%v)WQAa&F($V_>n4VD|AX zV>e|O;I#h{ox8oaufyUqUfC(jbOGt7l|BXegbx1{Y&^^07V`1*6pK;v`l46O*4CZ* zyj5JgkwPYx&sCo8ns8Ccn=LZT<$op%+9OgCbfM?q0iK9!G7P&kSZ4lJbHIU7>_4lt zIeoj>G-M$KjY9>r?ybq;jvdv8YX{G@cQ5LJsNk)9kHYRoZbe6u76Amq zNmNn->!Q(yJ@P_FO@zMLN|;RKr@@GyyeD<9?dadR5Ax`GJ@-2<$5>vW1=Zw@(9iTd z4w9(_!foer z8q=J0qT(Oq zRkfHtaoHLwI(D4tNxc(0YrNu>Qe+;~A`d6~fm@)RfE>iA{uRM3fr*PQ7Fptlds=Hz z$h7*EJ#-u0S;=?D1P`_EK^=g^>aLFdGF#m^EG_Enxmb{>{+0RGkcBa9i8*T*F7pcU zDD7!i_<_+UD10e*p;<#9_(n2%-xVOK>K{>qTvy(BMxTS4n3j}gKn2w4`NSyiG1Iq2 zTF@pN1WC!#r5dzel~_yNulzaf-r-j^)U zZV-J@65mNA$fNRngxU>CJZHg2*e>+aX{Bz^ENf=amRf%su0gpLm5`{Vs_^xPNDq6YX->OG9;{{qf(g zbjX>_6{^KMn4HSJ1Ly$_kIa;u5ky=Wx$$irYbhRi88K=7?U~7K$?e+B(F8IBL+DSS zJ-qH0p*7xfF@5GNQr6EP(rA)$@f~Fk(J{jfHj?^{5?l%v;d$^twciZf%p@OP+1Wqw z5FP*vty^;pjqjvvijkXEl_qT^00*K9UmPwEjWucY$8*D!e7MR4UG8LuGo)=hWjTNN z_KUx?fn_tjl~k|cpVL>>4<^e{^N4rE5VqvQ2y3g7NG6Yz)u618iJTD0T#H68lTKcb zIE5KdC3s%GtCA`hOYvlE=gzG6^D02G^(s5QTTpH7!5mU>XSh{F_gr1FR%S5O3Z>nT zdW}FES0cy;1Y^jIsU}`moh2r2l(vbK$tKX}#pZ05XsQS6b;)$3l1OjaA% zXz7ftQHi$nv+$N}QRY?%2MY!-2sZa8?k}kpYUYCV*#C-!9XG^kV&PDI-(Cgual6R8 zBUU)fGi=$a*svj{U2%N;Mf88W^VaOK_oF%GiO=7Iu*evab;l78j@_q?Db-8+ed!R( zl4l%K8%8&BZuObOw81pC;ca}HwWiem-F?t;%T`#1FX)|F03x&e1_Do-a{4f--He@H=?a1{U(S)dKe<_9qxzz1|=t0U0VY zOvDqDR$ekQW9RtDV%3W#l?&ew2xLcJ@i(H1Pe3mo8wgViK-YUT4`x1OWeQ-Io^t#) z$2`to+VXx_lwZZKP8y-S<~QRtpXIrhq3qalY1!d!3G8H&@?VHexC*@;n9-)1f&P7g z|Du0uyVoydMxlzO`O+&SzuHH20;-@yrUiK3IjGGq66p%dvv#ELZi{UvdILOg{6aRn3m3KgGbbr@T9kD zmrLlO{s!VnP_*$-2^F-C*oh8WO3yHRWBeO&5s@^)%n}^)VB6WVc{PS(Puty%mWBQ7 zSGo_HHzPmKGilrOWnT4cm|t#K4Z5VtGRqHQdVP&u`Dc|v){ z&!U~ho8X)v%z9)4YQUIg=V~*j{bEsl}d+NCo-@f0foE`z*(X zo8P$J7Ajw1CdQ=McqCwI0o`!|!Fxd4_wL)s#v{b=&}Rn*9){(L^L;>Zbu6DXE*6sm zOGnxIJv2QxOqk`WUEwpQWXy|{M6{o`!5Zkr_@WXk&*bluW z3$QEWBl*O)M$4Q$+&K$P6>tRVTM@#u4kG{F_?4M(-mI4&6rDoGrUn&H_h*bLHzp%c`(>-e=oHZN zEIz|yL3&iV!&T%Bk)l>i=OtjH&13Kh$wB5XL_9PQUlH0&ur?kC>b+q6@=f@jxAB}B zP+@RPe9pBCiB=Hdsu zruC3-GgH#TeL9)~BtHLZ^FCXgVFRLNApmZg02np3a? zR_GybH>@|BKP~Xt;=%1ZtO#iWAX`WQUhwswH2Ki&cWA%$a z6x&nVV~2KR$f>eHY)D;mCei$WM$)AU(ovtL%WANPT44&9i&`w+-6c$dZ_6aTG8?*5 zArYGI?J4qMy{AP4#(z&ik)ns2+e#?Sv331(zQXw#J(t?IuM2F&9965o?>%z-8tUDXcMxn zjtnD^Cgo`ST22B=yzY)So&E20YJKP$p3OB7ICGg0t@@rhrF0$W=dsNxocC%xne;Hd zUdF02YMEyI3+%2ASr~Mj)z2c{ec$8F((~p$Xdo{tBeF(|ZdEiZEn&l*3-bb)?2O?H zV_CHZ%nIf{-Ju?v8r37HEi~@jH;UN|_N>X%T`&cSgGB8yrQyw~63f%{l47xPol%dO zFV`WjUSkLSUbAb@yAi%|IU%?vrpRX|K+I+(5`$f85#Y=5uwDb|59;#wf68|3LC1Ra zCkgts9=_y{_s%Kaq{2jM-FTX!<3!JYTW^MEZdshQg3?LRPgi&eGeL!2H3soAJ0AX5 zVn~QfpLKudTEGrbhe^rsgR>ga;>j?P_?z(O-GDHSWw#)gCQQL)C7Y>$C1~1N1({FT zo9u>JWhdD1ZT{b}jg`xu3kw@2_86R6E#glP|5gHMLzB0|Z+7!)oU3N7=Y5@v1OU}f zsI`=D>E^jdFaib7r$hZihqyXaBY{Z?X?Lse7^CUZ40y)dvg7r5KWBmOjb$~(x8<)l zhN)xHJQzH^+>IXB!wyL}l1)fVmu}P8cC|e8WB2qa{Ng`zg7rQZGp}i&k?tJa(AzK{ zykdFAgu;lJD`Fh#N3U${^jLZ*Rk5Q(?B9i2OAiz|YSkX+J&)MQdzV_@YtdNa8Hp6* ziP13lhBRxUhfQu`8DI?*aoVN;h1!k5GvdT8rMQ;s`sngnA%xkk5_B}Nx`M^3@8AI2 za5Un#yogJ9pn?gZKs^xHvspZPw$>1;jLuSP2X(|um{8)e;$fIM$4;bC(v&GyTzSiy zrh$QFeV7mMFZ1a3NNpl4j3FR}pH3Z2yB_V_!(`v&?h;%@k8AAcVjFCSF+s^{;=Ppe)`Gg*LnT*U$twpg7Tfw`lX# z{ErdTkpi7UpGP$--mvv2B~=en6KA~rvnd-7QoTQE!dNBn8Fkd{JR37XbS{7OCaB6U zsqvWt>SB4^P=r-fp26#EmtIuhW?pix7T>Ff(_|(IN9T>;T#t)k28*E*Z z?Pz|*Hbh6=a_kcCZ4iCTa*iAb38r(0VxwQ2+NxAn0$_50!_?(j7pi{yF1W5FA14Wr zo}l6tU&Dco7o$zk>&hg^r`>;NNj|hHUH?{DUqHz@^`@O==@$g4f`_he(e8)(Okf4# zmUqqYlGeDN@I!0R{hYs|`a>nOH7`IZrE>f|iD+-+$W8 za_yzMS;nWpB_=b5SQH_)V@$8(h%!6%&C}2WLt5zG{3KMWmsWk65a+$(MIA@2qL_7O zB0OTq$-U2o2MXBR>TIeS29UeW(f4XAbEBgjiY-DuLLmvG>a}lI)mjV+b_AHH2^*)Q z{_$!|?pX|N&{+je1566H<+r+7a?>2Nub&NdCc^45&c<)eNioc3C*;OHP9-WVQIJq7 z14`CW8}`;c-E%a+XsTh0domcyNlleYU=pDl7f>Ri3iW#QVoPG zfHmi@Pttu+UN*u%A__MR1Bwa4!FSCgY0yx z$~k`Hz}w|1Wy;*@=oP(|RCx14`FTzez^3MFqoZ>NX4n7WN*{>XlUF8ezC)R#=3Pt?W;;CQpbfOZbcAlu9MV7b%dfZSKpBSJ zxL14NE@ln5kw5lYG%<(pg*S4XB_D%4_>ZHfZ}yK9gc@W0QLD`@GYu<9q}bQM&VN6n zGc6|B0=&@)K{u==^w74w8H_4n2iI@~%Z*Q%53-j-)4X$ImUd)XV~WG)^t}VYAy4(=*21q6~Xf$9~VGL{1PqnppVoxEj~q9}rH(rIs?^xEu-c6Ztp$ z)f~tfR=XLEGHg;`DB?8VL=FtcMCYyiF!oKyNQXCUwL{)E8%mMw4uF9NGBDYk~+Qxam*><-{(|x-HkK)6LFciwqdz?BJxZ7|qJ+a)@^;#w^S?grVBz zl&fpamr72UVivj-*YFn=IR&bLd^YIOYMkun-knN`^1Akwb1{YH94)m#iv&=3uOw2I z-v4(%PWGu?jm^3;_$P=hy<{;>4X~IN?kU?f`IMKL5+Xyl+@_u*rCjBZE$76>g2Wuj zD3#mgRqaOrTjz!LE#UgzuFxM6qqeqvx4bOHY*&8{T%o6D&eC)EjWu|A8iw$vG=U%& zTg$%?i_hcbts*YK={>ZaF|phd_EDxYwJ{tF|A65uS%jFtxBZu4JU%>HKY`oMEa}vc zfO|w2=2PjV?9>qQRq)$&6#8no@SjmmG*l6D2g~C+`*SSdXy=_Ghac4TvzZ$dk;3 z#=ekYu3ENkW4)i^?Caez@4dg*an#Y`=GSqLKWA{VbL5@j-0rPC$mr)>x#<34$3J1) zs&;G|KceoB%;JPtf67~xtMU*b&#lo?IR7f=h12rj#`C%!sK+r{(i&;gl&yai2s_*E zN=;E{|IcMU6Pu{K2b4IoY1Itcd7Uk4X^RWJIKM0xl8U2k)#i6V4cnitnY6_lt%yz+ zR=m;u{UGg3nT(01ijTIPk&B}@gC4N{#eaJ0sGUBy9tDDoXg_PWg_ z_YphZq+af~h~^=N(@-`(fhndR1cfa|pCbPY6AdYwL@cE@j@#<#&ib4c*O$#@dx7mNM zVo<1LQfC^ml*_hN%XDft@{(4}%jNga!LF^f?dCAsHC0$8 zsd62g<|dSy!_tTxXu_Wr!||46Kbf%Dl&GNCNz|VJD6r9&pV-4Zx>R9V8|qtoI8Mc9 z91OZnIM;WKoXrWIL-STV1B0~3qdUsVJ2^%V-K$mte6(#Kb?10p2`+^IkE!A`JkeEt zzvFMe;jQc{QSls;BzQArYc%i5-dmTi?)i7G z|6%0MvooZVdQ%na|NGmljjj(x@9$j1Nwo5MoGNmeOP}pv!_-XjD%&xBVAx%Uwiw&N zF?1P(%k&mWUu0GhPA9g-z+QnMC+RQQXa~I8XoxeSw(`{O8RclFnN)X!a>Lq<`J>+H z9z(>K?R@6A?`v#ng{K2+4m9RzReY959cm;g^8u*3L1EY?zCwV|G4syJm`E}^l3fR` z$3H}dV?cA|23n>)1P>ulioV<2zUCaFta)rVKQ>jOo!Agt!Rxk8&kR>TmOVbP`hGL~ zMOd&0^XMcJv*BSub%noZO0z`B(4taD5iuc+2KdXkZ;WvL#13oCQfa;?q5+>Z)D3L? zByUVve?@ELiv%Rl+;^(+nlvAr(5X`u+GvKFdsa5)zAK`hfr>{_ZN}fvJ%O5GCi^k& zZlK97$JqYGepJ(3G;V|WJ(_Ez+fZ}PYTTcl5nmU6DYFmw#+TEp=vO@V(;y*eTw8}X z{)S`}6S1WvRV-Mk1yFoAX(f#<4Y*mO;2CbSJlRz@?PF|IpZj<$D?nPX+G&45y52!o^y{T#RP*UR~#s-pF0|iH0w-1rXwe* zP3I$RS}b~aX5je=P{wD34P8zWMj!h_|ub312G`i;)3f z911cPVqrWSpcTsdkuS?qqyoz$Zn7c@PN5M+6qQ8~qwd?gxXO+r8!ucU>ZAe19xDBc z{>n|BjV})_eLr@JZO2<0N+^!_D;be7pdR;@0X5TopfYWVc;fjg{&b~7(faLT^96p~ zCNO8^uku@zp-@8=9g`E$pQu}k-pXCuyf(|jM;l(RUcD+9DiTJy#69T%qLN)H<{uI9 zqF8WfvkGOw0v%<@5ar&4>3H$8nwJ!L1;SUMmPc_R;nhq=sH+(Jrf~%h@h-9Wzz@h> zpDd*GnnxI*6+;;#ypw_!Bdbm1C3*p-*OFuj5p^W^RWrz&8V!Vus?c6SpEO65Dw5my zJGk@ewey5eoN6iHt!4fpyWbbd-wdQiNFzde6_{9$G$t4jE?F8_Ua~Ys8d@eJ2*${Z zmPVF_;5M!eqi1C6*XFNHy$rZPet+fd0Uz&n)ymNlTDcHN^{N!DtNXxH>Hor2;)5zZ zDpjX9w@J!#uJ3S%sHh+BvLzTIf)2i&gp^v_0#3!-{1&^~LDT>M|F!wBvz403kbL9r z3;-VgALUH%a-i>zAdmQOA!p%UDQWLXc2b2i(2MF_mEYrEMN=(2=3eBBKGIs=WV^dY zzIF`mJ3FqIbNtj%2gMILs+EncpRQ;<%vOcgsmyYHh;`g2_#oBYaDGjMtk~;oQVy;* zeKp;~&oOn&H`RJ6@R5!!Lk_R^YyTbY0S<9wn27cG?VrhSURPdr%i1)OSBC@~>T+zN zv$xq+M1E0fKF~i?HQ^?x`q+LRZ+J}7LKPqey#IOnVpP!u%t{&qoF z=Ex1E>pg;;I5ez7P7<*h^%5Vs12avqfn6vmuf*azR@Ml|_36itq3+Ypo6Ra22V|{z zPSYN=XRMqfd*83U;LkmIfdg4-ejnOiZBW;JjLDaEHEh=%)e+JzO3ycc+yL|~ICQ_r zvcE*pbUUG$p4R94G*Y)A>hROCJ6R{_*+eflQPdMf?euOJuS4jy(~CwO`4>Vgicb-(ew@>P4ZrqYA@jf;|Ng-| z{i{bc%hV4OMbB{8e!q;X{(ZgZ*Z$m5eb}>1kY9RhY^KsSrcYRs;rCcRYu4Z7*VyXp z;^D9=4?elZuegq7?|wz)!dY*k)@oXgSaDysOKRn-d_BFFy%DfoR~=r1<4u#3EbYS$ z@FQnmmX*@k{iiN!`!(z?>Qd_-sUzPA7|Sk~zws9PKbY|~n%%o8dAFbP`K>QjZ*Ccr ziqA~@uSb}%_U(n0mtp@mD)U*avY!6|cp|1i*@wFwa|6Z7%9p>^v;Cv@JC9twpXB{1 zNqJ0MbQ(o}_&#I%?7_b9N0MxuH>55Jr+}S1fKX}a|C75tB;fS{iHuky75uo+LVCc$ z_89IFBXw%@ye6oj>E6=zyWqn@RJ!mlo_f^V+$yY`AYva~qGX3p)D%Tr*O0Bg>XN-)M_`RFPu#b4|(?YdjyD+kuMW@VB-dUr(Z;!lT`{CDh(u46=evaz99ADZ@J z;%lIpT1QYe^5r|Lta6*8^}kZkWJdvxFFN>VXw==a+PRZdhu5quZ~D(8P{DMELs#Q7 zn<7&;Y-;K5{%2C>kEKz@Qzya4RZf(BJrZTL^2n`j&k?r=n<*0%wtjNk;%)Sa7|x5d z`>Frc?6v6$(tn59ZNR@5V9TwzchkQrUrE!}xD($Mzr`?~lCuz{$YnqD2RP=*5uEw4 z>>S^J{eFb6Hj2hr`17ju0j41PL2Cn3;!~LK@a;a|l-8_U zkZmaQ>t^TO1N44%aSKVu5d zRCj(Zx98`iyvcWy-FfCg*oQJ*+|XiS=X}=VXwu#%Iy-!7j5nTNwPf2f_WqpBdqD)G zwOLX<3!mT5deA#iJ7q~BqYQc~i(tFij2<&E z`*Vb51nq8kjT|iY3Uu{|;92VpS=ke>Yh%pTmIWF=6Wq)7`HK~8NO!FNarY>l{HIz3 zhCcqdMoWW6>x5&3i#EwOyUyQ`sDSKOs`l!k-kKG!9w9a686KD(N;v1#vhPgB(-T}z zl3uEtsbjmTrmk)J%k1+1@2?-GO98*H z$K`wq&#DYP^J(%*c&}VRg)gRf&hQPWS+VA8|105PM}w=2383acbHCrVtNtYsPJVEw z+9p%1)0p2HIu-Zw2k&Rd)BEz>YB@}qPJr!G`>*;ET0Y6WrL$nBGPQE~%-C+;;bnpO zh-LlucvIM+p0txyx@Mru!)!0%)G65JfStZ*E}})~+~PebrsU-PNs9>y6n580kR!T6 z#ilQ28PbiBCa$@VT%142+5fq|TyFT2PkB8x<)z%=+c0bE${XiT`c&|0 z@A{*Wy>+GQg_GCYh7N5VZ+rDZ5wb_`~uA+%PqR+UDB22kr*&)qGrL z1cfJDS0hIphOU3TU=+!ELTh*TTC`Y+TDcqikH*F|hpJZwP4hRK_K{Mk>*FW9vr7Z5 z$8Lz`7A=OIVI`n6Ih5WJ>LbGp{08fUlTY2k|4ti!Vi*5wu77mr5y4PHywQh5k9}T| z$b&GUtoTJzU%z0K+S9Xu{+|C*_bmKIg3VL z9i9?OSsD#xF$hKGh_CjX4T67C+#i3+G^Uh zQJ_dmi@O$gDekmDf?IH>cyMs;sTllw|C zvu5U*XU%$MCYgH#7?uu!hgJiE5zXgZs)j-I@BWY@9nxaMwr$NSSD?1jr|R<1echSW zzwl$^6_mQdT+YEoL;JuzxTQI6B+A9jhjJ$?3=ghUrMwnLDXArHz&tjrF=*Zayq-+* zXN8|3Zn_FG((aU%G4r~k)11w*uLImsx-W<9vSYXLr9yRBL%nZh)Pa1HPX}U|rBS2K zyMXPAKkcT;NCKNF82RpEpe(wP=`xixAGfrz|27{?tBY!o#A{%7yQE=DQ-V#c<~OPG zg;q*Lr4EDp!#(~k-@T>XYGMVQYp2!kWhc_S_UhB})Pv;ta6f|FbxXJ`X;rm)#*h`PFZnPs-cWd@d1s#b)7|d zhD6sj%rH>yC@>*C;FkBJFq{yw)rL=* z*8^qdmv`$GR*Z1vPjUH)Gsik2N_)IeYehc*@mooK<#hXGwZ1UtvRWZ_RgI&DdhR^Q z+ctKPnCO!M_w7<2iW_66f)Bxw8u;rz;G|At=L=jq`Oy*b9==zONtLvk37are;pGlNwU z7;9!h9GU4FDJfuGjB7&I!z?I)=TT^(D! zu@5A|sp82fDRB-(l!`TaCv#RB6-5-y_478x=}B<4=eBT^oz_qPj~>%yQM_|z_cgD7 zienpXpO^1UZ&qyB$dfb)hr!l-P7aJ&Wi`+gAm2}JEmi0=On*^uFwstUYE^v# z(YWMWT2TdF-48?Fl+F#7G6=-pyO_k0bm*zeVkOS%^iok5X*Y_E)?P-tg^nsUtTAel zEv)IK-`f7XqdizedXf3vEyFjtukw4f|F!fhH43cR=z$pPde+(txjWh&zBEmC`0|XE z_%yzF9tj5}IsqO1pQ5o)y2$Yz29!4KQWza%UWs^U;I30dwpLQF2}u(hoTI&wFtI)z zpzjt)An2}$EKpJr*hoQ(hXp-!$V1GGm=t(HRWY_01lO$J#6m$yP)KgSR?F0_#fD+j-4fF5H*)`<$E| zyu*H6CwRUBP+pir-*pvx-EEUN~^ z8+0%w%2|}WTN=~?25B!8XwbV4**W@&B)u9mWLKM& zlaRC|<3O%mVG*6=TYPHPUnBf@BVVLWGmMh7ce~7My;?CxIn2~*2_qT=!k-j1!HCl* zR5p%Z9|(KS-jz>wucm8Be)sa~xi-qT{Mst6h-fz;Q^$5IME-l9}sFlliO7#CQaAxXm`rK33d@1!KiD&GBzBANl7E7--}CXL{!F;LO$_{*W@JrRFB$d816a(FB*~HRe^@{K29xX8=f{<1>cX{KmD4|*l z&AL9G;-0UX-`r@-ABEdpFUUR9X@Q=AG-x?Me#eBE~Z~R z6-&=FTZ1Xp8%~P%yQ=v5DsD*+o7HGF?NtsbH3gVB%wFH$XVhB~ADd;ueOUdwy+%r`D5FwS%h5a`mPq-FVwW~*{|}vl4@JvU(IONTMpWRV{47`IH2pP zPmbt=G)HN(4W!XO>>NEn6f|8fqLYUGy`1-OL{FAc92VSi+$$;A499;+(D$|Vc{}$2 z;Z8t~e>!-2rdHZdJOggVj(!8|n;y&g-g^x14AT3G-jt*w{`_F>oNbN!`tFVBmfVkcgeU6U1SBu@q-k+&*-ztA1 zAM=NWUuX#(cZX+FeLKlmLbEqxJ15!M?4$=dBj1F0Y|j$25U_t{UDmP+no(1mGI*37!7XC+t0kS%iZc&?cgG4rGBI8s2d~6t=0RY zbVF)R>$>FOy*>5yF^wPRALlXEl|zz)5heFa^Or7Glw&VXQlIYg`Y6$x=#k+ucFNKS#vhYY9^5=k{2%Z20;tPd?-cTseLv>T-ZlHb@;D`0cke6S zzA?gx#_-$0L8w51Ayi^& zfIvh|Xd))mv|Kt?IZzfWNm&*TjWQ7vJ@2atCRQ8;wpx_|Wo zU_R45n;zbSno;x&gamlWUVK|RMhV3&&E;Edd%L6vWh<-6;KI=M|LLAH?Pv#`htR(o}N z;#86!w*L|7ohxNlcjjsS2*rr9CVBJmEO@rVwC>@Dv^!@$HiR&vuCdrk@4-sRN?e0Pi+RdI7LsL*?cbB&HR`1#~m*^Zgx; zNrNOgh1zsi`+Rv{$)?0dGQfi*Ht}s^B!4rU`N$i|4X%rf0Aju1|CXwR*1= zc#^TXEY!cWr;C~E%iHS^8z;Q3*=t$k`?V{epvLufvwlRv95`rxlethE+fi>*-9mvb zUM4_yE}$r8(5w=jP`N$an5@L0GScp_ooQ0Cz0qnSmbkAc$n$IF&1d_N7*ad+^sVDU zBKwr`IV!`e(^zGQc$)U%$U~P?87*Y_{GE7m$kau+#-Tn6r@eET8PWM2q1={g2SMPi z4#v53+haxEO%VKcPO0|L4p+T6pmEZ`9r5;{=%eWXffh!My6vTg_l3u=xpX#i`%P^U z8T`XYpU+4&v5sHi>y$~n{GG&q2BvCT{QSZM_C>%Y53q4SnwPZL{3S-Uy!im;z}`df zwSli;;0k!^A%oDJZzK=~^Z?)vr);)*nkXH4`z`!T&kErltfPE#s`FB`da@Mm($9c& ziGb;yZ60YSx`r+8nOR5E(o(f0mV)rO25E2`U!o||{bXt$^0nL7ngp5YV?`l`A;kMZ z!UZHS=8J6;8JA(TGE1>|)5;l(YuR=N>Qz50Cjc>FXQg+ZZf=yQnst&wHDss)MPBkFcH}`SP+I8Fo^d$Jh8b+?dABSY6u(e6{ ztQ6Y=CLp+nQG+t2TBnaQr0(?P6jpnPptdA~x~xmdvU5`*+PI@g6s{Qs>bV8VvV8CuOkgm02O`OH}6Rq}XJEetDk{f9;IW0ncIK z@Vio|2Kfqy-#Xf$+W0>1Qu4}bZkKx|5;9v=E51cUP_p(7pIoUq>ICid$*9n zPTomHJkG~F3C>?2OTbyT)W$2px1{J>-G@)+M(jM_vkOHzXTD}9z5ZQ|%wOe0NFm@I4RY2_` zd?2%YuVW&FMeDUgirQwgz_N1(ngbtoS+g+3jrcYGB7;4Mn2Q`XXr9Hk^)!mAP5NUr zo^wQtSbSSu>10LJYbY@F%o5;(legxM@aRj>|55#hh2CpTR%r$)bE@Lg$0Kc56R=Je zG_%p**BVOl@?CzXai01<9zNTepis6VIL_9W4Lcjo_Vg2P2*RVpdoL{bekrp$U()aL zY9#6n7&G)q;l4~X5l55}OG8;>%cbiF^Kz;Em17cl-Bbbg*qjuUa@YgS0%-zBcWN6id}|b1YmVxJ^dv`4XX+eN{O+wV+S&iL;06&||K%|21$vIB<^UGL`Ku%zM4Zq52#7^l1g|BW5m~ zBMLJUosfrwKxoB)tO}lx4Fk|rrIa9#L?9kL34$wRMZd;j7~sD%tk)vqvi$ltUI5Y? zCn$EA4YiPVlp179Xr`)t>XmXMlGAKdmh-mLJLN37eo$J$aQ1HrZOaFRgi^ zdYwaWl!LUMh|%UB2;vA70HS(~z;2OYX*zLDlTGW(0cfhv|;Zt~zYOFl? z-xxx!LnbHzH)a@UO84`g$-fl+;V+$;&*i?qybhrJ!zjYy?D2Ds5`lT!04}Wa<4lPL z1z{GzK9U)e&{Z``fsX6iY#WGC=14d0@ruV1KJZQVeUbQ92X6Oj_ljDA3eQ*t7N`5~ zUQ?_N#))xeyf9$ay;k~o#=gv08Qkj%v{*~3Zu5MfDc$)DMw)sw3v&$-p?cdS6GMru z51>u~%Wwe=N=3>3Wd!r>J?c@);SNw~D-xY48}L%^Dvr-O)q5y7+nWuueWlPdLOjp? zT`CqHWdv}Tm62MPxSzG!?dtRzkPO-D*a2=Y^+g(zIzOA2X=fuKG6ySvqU`wO>s5}5 zr<+wlW<3%b^Sih%*wl&IMbz7_rtv-h!1MC)ig&bTRS%{^{^>P0w}##1HMFZl1uuJ(^66PlJ&3YGrZuV*#vJes|n z)Xj@jzHwWfgoms@ zn8vFy!z1V^<*5}TqHJ&j&hL8*HIxcFp3*@IKtm|?$r;O#7z;L_iG??yhr2m~1;&>d z@fp`MDb<_n3!5jW;*v-i=5f+a(VA;?;=q|2kF+uCqj4(LGE8XqJ{=adIC0(?eIPk) zyYM-F$`;spJRW-F*vW2{_nBlnc1am0GK7|f2`(9lT=*VW>ee&6idkhw zh|XRGFQ2hhx|6f2e3nZ=5zxwa?5vtP3C{_$nrg74epa^?NtcLrZJgqsTMk}KOuoAY zE?IUd>5aX5nZg42tbNXYFZb>trhTWSw7^d8;hThyI}_P~UHvz2r?T?z*M6P$$5_|8M&(mpRmb}n+vLB`o+W_o{ z>GIs+fO(1GI7u;2b4x_C$8E`zRkll({d4%7^%sFMd}aHJIa>@rd(ZkZ3y<>e-1co) zGmX6hzkyGAW$tAl)syah_YdFUqI}zzEYm)=f%V@V#1w%rgf#BSy1tw zcXTW9H36UF)xhk<54tICaOPU==cNbTFLr&p0hO83O<5R2wg(&h5B%C@>5^&ALh2UT zQ?h*m8^~}UW*78!T5ycGnnO+WS1d^8PKm23v#fH=(oU`sem_>(Q$6diHM^F?Za!RfV@QR) z*Oi}IFmEBbx^}NegnP1+gNM6z(Od|1p&U?}>Fz-C(Z{Jl@67oq9{=F+^i!P@84ruC zu(hQu%&+t-P4H(~Olnrzdka;&j4=3xMDHR?WDQg_a)9UUYcxoauqLHBxW&jIN_m1b5@oP;4{$C|C)fXew-L?`U{WM&_4P*2ZpUj_xMvR$GkRY)vfMK1@|6$4CM45@cXHE7NWvl?}4USKr-MZ4u$%;6B+qd3<^5Ah6YKWLkgvwI01(Q`riB zxOXlxi{>TNI4N60QRp@-rr0L*>+O58**P(ry)nu^@~t>tQA9^ktd?!|$35jS$1cY1 z@x`{!obrxzr%S9Z9q_Pd))}*yZ$aE|7vFWp_?0e!=}d{uL6FoG<+jb=a(fj>q4$;Fa|)>?p!X$^nrai`-yzxX&$lXrlw=$Z(%AFd8%L=5a4>r{PqEeXuVzI{o0_ z#_OY`U%^T!p!N|@MEBF18ss$1H7-sGhMMvdqM7-&NX3TE&q#3QD)6vK|G!?BsBEwC zxWCzmVU>701GB-TOh5jV{~!yqA>aLcQ-ZSO5xMCH{$Ll!@6hXH&5~4)xJ*Z`2N~7tbi!$_i3?&8L4&L zHlWc(;K6w}$-sURQTbezT6Nr(MR;QJkg>+j=Juvp-jj5Qd9III051j4pqMrT3EujN z3Wzj427AJ$;oZoOqcrJYjeM8o;@MZgLE@x+w$!HzrXBmY0|dlfHt=KCI#4iP^_ zt4Fe$_l4lqpVz#^%diQcz2YDwS0YEFwUhuEpqc&5FK_vjf@Kp6jnf&Fc8%9feB}}} ztx!&G_7m0amx4F~MCRGo8Za94jH`82s+I7B{&%}P^o94IwEiP_o!>N~Te8S7C-|H}A- z*6FJRciiu^ngY6#hFD|q6c;JHCum4=5wg!uNc-ubiSkE_K^=V5YpYH>9{sJsWoD`i zV^w(4vm*zJ`cV0-*$nq6?l8Qp^5pmU{Lnmiu;V`VzH7O|)4Ank zN%Zmh{`~2D=rr?zGcfPF$LU680Q&1 zjFa|pjR;f$i^iO7BeIaa>6!9!!FKu&evAATiIt!TUDDoU$==LE#{)G%kJ#6h8UTf1 z2pXswZjz8l>_)|DK`d>mIzS~(W9Q27^6<_GBI^WsdYz@_@pj(tywj?Ga7;r0u>2&^ z@Py~3yK9@r7TlVNTUkQB+)$Lw7XvB<6k;d2!yrm}`R8*TI^998EQ-3|z`Lo@3`_3) z$r8DI=BO&}*2&%Qk_e}-HSx9UbcsNrI!V*0y*+s)`cOr5C<~Kh!?cTs&~$>7c=UXwyMfuj;+;p4b>e|4jF25c7$^C3Nd1g<&? ztUJxS&!;pAfGnY8g_?;598wXJ3f0vbxE)}Wy@63VN?@VW)O-M*9M7wncl)%Pxv$QZ z8?gLA2{hra%AlLM=s>WzClsO_8VKAix}iVBRE$LCB>=ewCOyC zMRF!`J0f*qwW3ze89aYH|D;GJqPz-xGrS{GCIPip&+(BURB|=t>0F9)pc;$CkgUa! zjgNiQNu^P}$v?ocpdU>jP0SMs+Fb?I=F%(@p>Yylg2$;R;648;o<08cRQVJWyCK(n zLav=&=5hyF&U&AjXW>$H#*8#0_?K-n^6pNJC(BNeo@`J~XCt?1eu>mO1MJOz`rQth z7A&saQ0}5!7{o-Twnq^fL^^*%`arG$wVp2gQ~jqJOPjh*GKpB-YS_c17f8Mj{oeMo zZDmig*q&F2cL5eP8{Eek7R)-DXFd+IN^+R-Jsgnu_y(mB4kHpHv4+)K`OTXa>n1>Q zc#~QzqZO-OJK8g!1O2w5@hsC4F|9}fe517H?n z9Quu@r6s=!FjB43Pr@q!{v?se#hpiWuEnVJM!5qNw2pCteiDr;$h3QUe0t0+0_`9X zvJr#=x^3Ff=IQ<8)`{YnkfRL5aG!)enhPz_~&$o33Y)+g~Z z^D^@S$z($+K@A%f^A+=e0bm<89tH}zF!?<3h*%|t6>RHaxrQ~K)fE@`M&2lPBw$Dg z*q?Ei%O$KSDLP47GAmNBCEec#yJdR^ zyZ-?VKDSnbbLu9=y7?dTNN9(#0@JsW-_XDa)H?d`Yxcz+7FKha@Zpi}k(CT!pNq4% z;8^BN2tlsp#AHCS&NNqUwsL6v)|}ZV9M&#u;Di_oE{oS2*RTvo#)D>INf;@g>Wk5o z5l#;(L$X=?D`K-kS^dQLekqUv^tC#;>uvj60Dc$?tSivx2DXH?2d9Jku)~6*Fl6T= z#qJwfUSbe=Mau=szpUkr2bKX-a$&uM6Xpr_iJRYUycr4ZOyme5r@j~jK^9THKOz(3 zFa)}CBfrK4>puR0BmO$eM|IPo@^0ps9-n$b1VPig!Z)l85a<`wO+X&RYLf-Ap||ct z>@5@YDSE9yxv>O$8tBbFfo=(aFWU}H3Q6i!<15m6Sj8+H)_(n1*Qk;$kr=o&XHBRT z7l;TJmr0Cd@Bk5ES|o892CDsBkeQ>`&)Mwk_XYg`A^~3w{?%Fx0TscOL9AV_eQB+C zeF>8X6phKp#pjOxIQjK?#J$6Gs7zc8_b49WK~pXEnQt$ycC>tTofP83dg z`w=yPC$>!DJPz@Ev;0CQaN2$zI7?K>*G{&RtOef+{qi*h51eQF{7XQuc*@B0_v1!| zgFKOUFf%1;=6)EUc#|Eveh~kF;I5mGY&9@SFQhbMq9!uA$F-;GRany-r7r6yL`_5e zXv&s#@OsbEREb$bt)hf~Z@oZnkFKX^>w{BioE%urU3PU`{EKMfq(E&bj`!u2+<>!% z`KAhW%J>QK!x+Fo(s-}5{yZh=De<9MSbrv8y%uC%~8$I0e{I;p1d7q@$8qfMw6*3FqwiaJDUb4!gHRAS98JSdzX`Y!MH9e zH3@;>{Js`EXjGYMhCn0HedeP4{w4M$XKP}FfvBc|Ip4PBaDsQ9GyCCSho;lPW_E(N zO0n7Gc}2fAR#G~1m(Gr4sEXhQ(ng%QV!EppOL6c1w3cF2Fgdqiv&dzhk|1@g3z$kr zkQKI`pTrlvczb`aB!2V@p1sDIIi3*c5Wr!;VNi?Hqlin5OC9U2cG<>=Wn;Yk$-B`+7dgQcLfRGjD7q~`gS?Ib(K4Ns$!wIioZNXVahE_>R*TE_WSX1> zTh@-?n5z!DPP~K|dLGd-77CBP@)X*Jz=nW{dG9cd4l(PArc=VGAMt}_SK(4?`s)S>ub5c{?Slfn6Wjy!op~aSu&|qWb9wc>A&IXX|M1fciFlPfOnS(VT zEF;EUP=9TDR6rqHdZBl|tSwQ8?8M&R0g6d?aS)@=jYAa%Lav@KI+s#JdZg&5eG$&#!Z>Y+QLZRI;t2 z#{iOG=PaG#wDj!k9hl?yOu;{yG|rCjWb0%)ZkmiD<;ix=K2QjUi0(z^F2;&Rh>qQ{ zj>fQ{)wwuK0ZEcvM#YGT;@7}=gr+n)8*30@aLU2U1aH1=XUNE04Usq3wIQ9IVirt4 z)jHiWSW9!ZEL|q4>a`l*Q9^S9&inLUwlp-6Z@p!+g`?1E;GHeCMM5SI?Plm?346l5 z%6>C0J7>d0;-u%O%0R2az<#`;BwE^Z?BvWvN_H{L_%21B%&0^-;AXBTRjZuy%nhFAvQe*1m60W+Lto4>1xo)(x}4VTh`m7^Mb{O z(3|@|9YxmwSk;*HOd(&T-5)CG1YD+FE?A~D2p69_F!@sjMGMt3)ACI0cOa=tXavnGR1TUvet}3 zUgNN*SbSaaqZ8wv^isxGdpc!utB|xc^B#Le(Jv2@?4l@kuPkeUXo9$x^b=O3uGw3eVcymrR)qv3WEq4TgkLa^R(l+TH&>-z{i=9h zn7cV7(+ah^OyS$yLW_g-1VmTG-wMv8dB8+GduHdyimUo&)AT@Di`fKiIbls?^$-JVC!z3*KoOL zOd%%&&sGC)EV5}3>y6PuFm1I9{HKWnQ%SuA#%6=5yxw>bJyFU{B$uVi39H#Ta@A*~ zG2RiU_m3wpUd0y0=ZW8VB&HfR_|u)=y|)!iFl?)DR^i<{)UxPH)C%E6-5XBhmLP*Y za0PZr_6`}2mlLybSd*H&^?42Dq3Y`)ScbaL>M=Ryygayes#j5tZH88VCr3(~cy#wa zAoRQal?pV3&Z*Q;Mfl}RA2tV-R1A0Z0oV7H<`!Ygu%pEqyqK=>4~lm;?$Zy%l%78j zAl3DpR8C$mZ$VV%ZT{vZrX>}5bs@4@NrFJt>G1xWsd**pA}k#H*@?VxbXS*>$sKWt z#HN0I^L(pi(2?3oX{+;bmh;K*!LUS2WXIci2&1?;9 z!aKTM*{WKHr%?uhCvpxT}OkSCnD5g6H% zGT#--c}CL0e!_qCGtv()oXSw&-1V|${LA%s9%3EAag{LkDE4Y^VOfIgoPwQZH?|2nUdTw8+^Mu9#B@Y zDyby6s|+-_%C!Y_iU80S$^U^2CC#VcXU2dSQAG?7P$CEWk2Ve>|JsqS= z`a_ArgyG5n@o}eb6B4K$fc(+UV;M~8_s3c@UYAoy?*eE5vwaiDngtv(sNM@jlGVMh z%b&$GsWL=)5?r4BWee1%A6#_s$GM?LeX|H<9+nyzZP|qa_ADK9oC%WPV4{Cw&al89 zTvabg#utXk4!K03zqe_OIm6g`e8-^C&X)P7JBCMaMW%RZyb00-@i8zq_zZ;LojCyv z-j3R?FB3l<6!_!awGX%VrlhfREpROqvRlZ$)nPWRHsyn=L3io6lBHBp2DGwaMQECE zjIE=LcW0n^-TJ&rZRj({!yMlhFJueiikq{UUM^WE@l=6;-Vh@JL7PK@l)bRC$v&HY z;N<3XfxUO1H9^;Q3SHn>$YYC4ejS5b94%-R>Xy1=4tW>!F6&)8Ra}nO4z6Hv0F#1R zX`bx(m;G)DabzU0nEIxL0PNT1+l$2~E>y2cWlZp=H;d!gNlf9xT-zpZIo@mxD7zc zu)(je2Rz(12b8xAft*jJi+1@zlLhZ)M^at>goH34g3_Sknv>mp zHw+sT$uOrqSv@;Z9qcED7EZNRILx+3Kv4m8ce&8Ow=0#~OJb34=rHSwpoQ{~ zo|BzpIS&bl*d9!M`9$XgRPQ1N?%^*G?#@Yeh2UC8EQdk0#sh9AZ#j7x(Di0|)zM1j z@U}=e8Q!%HDDW|c15M{X)#jdY$z3RWy4I8UV>i20_`?QObH1X zXF+J1YrlA@FdoR{lFO?cA|enfW0o*Tw?Mz($V*bp;W3rLhjxc&WTQG%gzqY>9E@#9 zYp|Jtj)$?to1Q5oaGPl7-CH5CeL-{Lq-SUAliX`zH5Y$9T!D!0qajd!pX?Jp)w z#&$e?Ry%gzND!f_tDOvRi3qFquFF)Ay>+Ug7{~HNW_isG&=l0}0OFw5@C3+Bw6ufIc(O{vBLLcEfzo{%Lj7p&EXpzXFG4uVvjp zc#XQ7#m1T86#%T6x3Iw)Px(z#V;1yYV`EeF5F=h=7&NA}u*}y#)7?&@;R>y#&85u^ ztPZTU#AT5zXv0c$J~YTTHEc*sFZUHsT+YPrNK-mC(2jXkAPpe)DVGvv0xA6` zzc!eH=lj35Y|;3q_j>+0%x&~5+L6QNt-R=WrcQ9za%!QNszALLD<1dV@b zDj~Yq|M69xD1?p)wAn~%^}~%c@pWC$5hg8^8+b=+{@itwv+C=c=HKyff77N^&3@wV z^KgBC_YfL$($)2N_jtAS>)_-2k6nJ=Pd7s`_9uphoql)s>-E|G{*UzE;h0W5KmXrw zDZKy2rHC6jn@QT+xlpjH>qv{K0hv`TZB3U)Oo zS2H!33zc2XUfs^}FLy)1A@Hvxf3L$>9hf{+Sf-{fU}p+l3Z4%iV4?rQU-!TK|EKFe zul!HG|9AQS6B+++)BNiW{yp}8-P`{e_TS_EyYJuK|2^G*`TpJYHVXPe7 z956$(F|u%`;DTNMYa-&}_8u_vVCDZOl;WQ}U@|E5{}n80WNT^TNx|^^qQ}9-rN_y^ zrKHOEA3>HjW}Flp{4gD0cKTPAqLD4k@cy?7@HapeMnbxnfGOA&?VW6mZ2lEn^IsZr zfB1mPF5_ZkV`(C0XJKPT0rRT5nAvJj@bJQ{`+wQ;f7K0CcCG)oJ8mAXe=m-|s{Chh z{6CPJ92A_~eB3^~~^d!RiUz zF;IrUuyZGUgVv#k5xntSj__(knF?M%x}2QK7^MU?llVg7p6*`R$nZfqs0<=L0FAd2 zzmX@j=8ek(jCYY%)2a0{={o7xVP`5HX+^fUflLYduSOhC6lz&>)g zJYIqDkQv|a1T5}sR$e@_l_R}0F-KlFaw*xt!Te+IV|X8{q!}gIdTG5(IgB15c++>j zMY0V@n;*hO4QZns$cUMLyxG+sj79iR$6K}m$@sB|JIf|uslopho_Qs}t&|MmJJUM~ zU4Vd(x&BCqsYFw)3u_srJrnn@+_-4YG@k7<$*j~k=0nK^A%4LqH#bLDk`2+>UsKl0 z9`-qJI{ltm`j}rKCV3hEb{6}Qz@5-Ynb*pwS}gMNGos6DZ%fnQ$#wpc=nt0#a5y?L z9Y=)EeD!hu+wIqGr2F8Ig3ZL~24F-~kreaR&O*q~Kq>~tqCsrqjwennRBbpS39+Np>DnzWvZZiVQra;!Y4PBOCszUPDYHTQ77jCN@nBF;+(4%tKK7 zvI>kUA<_q|L5Fs|U62~{MYS`BX@sbS*dN4Zqi=pc-O^N9U~=U^O!T#tW;3o#JT-c( zw8?~$d?6zJMv9{g&e^16cn(7?mCJ5^xFzz!$I?b`vW(POSN6SU9nxv zabgw79puiqeUXaOCOYqGnKG?9e_=4TknPRK^$_@wd}DiXu-7(qGI=ulvB_WWwRT zyCDqKA((L_*4?hZ#upgv$Fh5Sv-%p}*OsM>F+w#&oBKS?=j=6p6#N##>)M~hM&&iS zxA_iw{0iDOxUK5veOf-=h!IjYEZ0_I%yaiv0)y)=N9af7N1wuk6B}!9Nmfomv}`8y z(-AnNwtrM%xa$|O*zF5UO*v1QAVw%A0^J9p{#|v3tgYcXAbLp%#5g{cnX*(azQB4? z5YDnRk+D$bqQEj~OWB*sR#6 z7+P+S)qtw!+92F;sY|YPtZk=TrCa6Zss+w!$lSN8KdiCYW2#4N@Sj^9&z^Iv+;Ebz zZj*xTW0=t7ZQEhnEX3PHcF=EEZlhaSrI`cDQJE{Xo_UygUwTvOUhZDzUcy(p-82o~ zzy?-O7HF_}1uliwK|OtkuD6*LIuzzIS~H%PT^jZ-iX``?dhUXt&7&kiUPv3)|UhoZn zrkuIQMtAjn99PMNRR88(juxsxa$jfD$*Dh6UyiE&b8w5i`TM;iMknMY(Eq1@kN>ac zQ`<-P<%pBtZMWplD9`krG5)<64)2fqFwWqfks@HnKX)E+B6Gdl6eyaqos zcj_C^{*%S-N5h!Wyo+4~tK6CLH#{4(CBd^b8ah2}e~_2M*w;0D;Q9WT*JV~vR3{{D zqSb|0&?T9oY0J&VU75b}OfZd=j|c7=ecg-~j#rA8L6xDkG{w@EkL(7lQmLC#Gg1T> zgyAM&$1A?p7MGPFVx*TF;5;WT9j8A~y<)uQexiCZ?f}_O79VicU}Oi3eKz#LfA|5~ zgMZo|vQe>nfMP^U%amXIcApB@-({2#W4F+)uA$WQLU1g^7xEGa68SdaD4aB*=3dl6 zKqj(l3}l!M_Z9MB5+@^$3U7$nK)0!(y~5=UBO@CVOaIu=$iV2}urwbL0lTc6f{Y?3%QU;R zd{{)*M|N|&%gmDg1uUE=eX_$KP*lFeH%{RpBb5)+{QN32jw&BGnSYMB@#cH_VOpa{ za5+qzg=lm6^0N&{4W#`Vj{GphR5ZLFDHTnV9ykhhwhZ4zG;`6b`;w(@+aOR%d&a@N z>u)sASCD4*2ZHPjzywmC+K`Zk#3_BtCvQorATlm5=dy--J59c=8e|hL{CGrjPa`Ai z>=hfYN?ZrFK`YFb;|@_B*^3LAU*M+JJwV-48|}roebFzYfAp5f+wOXPVE&Aih{A*}n<7LH?M+db{3~7=3Y!4L zg^Jii{x<{@bxD|NGgNs=8oGaX^U7Te<;b<2r`Irkf1T&MTr7H7TZwD=5_EZ!#ifV< zRhQ!0IbRud?_3hNV4~|`YbMa`;P{IW&a zGhB{)?OXJzhYt`}cM}Bj@L;{p*qGb><3WUtn^LpyF7Vz1Mvq^}K6`&Gy=~3;zW_l% zzQ6EOv2+a9CeSNDzQ=izkl5>#l$NX>xNdRquJp2(@GU{{5){7B@Q)jZOK;q5zD_Z) z@fHg$(lc?U-izJvoWpp$*@W5aJ?Vzm<}n$s)NMp#=-+M~^@>_As=~M$jPNb%>f3 zda-z=C&?A*61#-GtEn*QY%hj}vv`16U<(4H5=L_tL#ZGvS9j`m>0!`yHW4TOTJyfO z)9OHW=sTTIb{4Ik%oY*VB?+6T_t*^&ySau)`OI7U9H~S*w}aq{-ScI))9ujwN*R_2 zB9wFGO6v$m-3~&((`|#I-r~f_7Xa%{$KHZTv0d2ewu9l_yTr48w;80ioGk|i_5GlO zZCiG?Wd*G+H!%328k;zy9M+Jigv2N_E8QJ5yEfZwJDUPPIrK5?{>OkFP#uLiE3_Q% zCEf=sPJIg$^mVqvID)HeZ?!~xur;3D|CLBOLS)0ITzFvqsy~yW876px@cxI>2M5yz zeQj86Qp8FqyA*59a`?y!AGf>%l1}(?(++IYx!_R4nXl5<4iyYub~{u;REj+SRsgV@ zn}}WrY_x-Z#DPtA4^|3)>wO>+g-=??(y z&2BZrwLXc)UkrZdg|Xs!AZhc`Et~-|cN7^mxh@i$Qk^$Hvv%FsceHQLT$5MT_Y1y7u-D>i^Jma-!Z-$*-} z$dzrrCvj-mR4s9wcO3ex-TilKI5pc2eXSNPuk(e7gNqJ?U^16V$WNIfT1mVHy~}(H zN5M({YFuZ+i7hD~8a}e#+x>S;SgssB6f?BTZ=$S>@^0G-AGEwJ!KFqO+(t!31^vIiGg5#(fx%&TJ zDlQzfBHXnS6Ova%odDGB1_70}-n{|J(3G12JPXxoP_h86o7 z!fh1;2otnFh|o5GG@;E8mY~A>78m+wUY}YR0eUAZBF-ap#4V!px!1y|L0=mr4f>)? zGNLR^eN^=$@xrHx50TD+Fgoa+1Bo>2Nh#b^WlO<|u5H3x7q~rLsET=Tp(kl>M4%8s zta2d;jDG#6^8XgsM8>axtQC9=2w%V-@OApr82w{tnu8-Rrw@7pM(L2e92%GD{z7L{ zf&yR?{(bRdRCD-s;)r25h*I$=v_!Vo`X%9s*XQlqZHK3H#QPC+z4-!Aveb`sl7td^ z#Vylkk?Htq6ys04=(75Py!#aw_myYc4{^`BEaA3=gYqFARW?!UE-!KcE<6uA9bSj{ z&qfJ%satfz#Xa3IZRsMrD1KR-=x+dLfLv)_v}!Hf{&)BPb*v>yRSbtbzV*Pi%?wb1 zoyG4!_%%0ggmX9yr?~1yRJ4Pyk(@+_`}*M%o1U3wOkr_cnE!x3R0Ds94x3_C_UgNn zr9zQiw|Dpd`Gy9^Fz|~s8sP}Tq*mjtvb+BaCz3GmvoxBXot_=bo|yDczbj3S;V|%L z(|LA%>|A2fPrZvzW~=$x>HN%idE@c;j5K3SY~-b<(#)Vr{mf9FZ9LAKY{6UbJoCMm z$<}J-dueKKx~s{7E&RD^zFa&Yg9OIn_Doo;y2Noh=m4x=tT8 ze*`|RjnAJ@^@O5nN;Wl^8Z?d6;8|4{p!7i6FbR@hQm_8mEDR533)$Rw)+*%-rQrve z!ccB_Ad}Ax59bQQBagm~e+w&;9lwMf&#_;#Rq42I44MVDdde)a)vGYgYxG$%5dlt~ z%4FH~OD47F2nkBw53<$syZirmGib8wQ#3Fz80Lc%yB;TggGQcdq}lZ<`DHB4R++N@SfZQFQ6%+@uVs9 z=f8T~E#{uNm#t0hWvUtA=<^OeCEPVfj&huH)jZszsj61s9xAHjqH#5H)Vv$HE1x5Z zap6Xn2gwj z8$+6^O)9!#$g+_f*NX#+qTt;Ijjwhs)d}Qrkx=* zdoyJigUNhCDI%xl_y5hFvcIu38-1g)_(T#R|Cbb7O|rDAv8n1*Rhshl-p@|Y%&S~w zjqhvzX%UZd49`!c`4gjaC1to~kJd&QWEzmUBxL%g&Ws7!C%? z&TVRNc?tyoq>R)??b@(Xnj1Ya&t)>3{hs{^{knfLuCj!pCe<^EL^`GUW(EoELuoCU zR3942JCBji@80}}?yBjHBPqkx)7{n8-__qWA3dHAXYBFV9%p9lNtUo_vVby9d_n9g z8;G=8p&(m>*o`e#EN8S5zknkrK2AuR5XglS8&2jFR?CTq8;3}H^aX|Yt?6+bW8%zI zb#--5)$=^>Q}2tzO1T|d-B)Zfd@31)z=X(DfaPO;3`CD%A;2c^nRK_i+g~?FBXjh@ z)vG4_$KUo|{)=2D9m2__BKEllQZ!rEmQ_KJh-Io|_?M9~{QKwp={?xgU~Jh7bYmohA*`OmOUIv z1q}wr5_$-&vb%LTTbX3sxNk(-7aI7F1E0gv%Reouwg5A|Z3_py!jOGK_H{INyp$ar zQ5GZE0j0r^nI~%QCqVu~SeK8jH*bp&)R0tthfZgX8kn znvSo1_DjYnW$dS5Cyc=gTv)+}fN7un`3XtDiIM5xPh|%X{PIx%z^wvs$h2%>K^^qe z3{|pcET=r>-7ew`mu=iw2Y_!6x~pn;`PQt_I_NfT z%|xVh-RKZL>U0*(aSzdegR67+1GL~^3@i*@(Lj)h(lRqdzk7xW^j}0`Y;?DGcEFqO zaqa|~3Z7^*1CiNIzNCK5bSjkI)3YexKMy0QcISz^^ev0Z}>{0P|_a&)*Q>@G>9VkA2j7&fsS(BzDrYMPTg zAFt#al71g0k<;pUV`E%ZDaEl(fRMaNcWTw?tR|haR#UfjT9KlzZ5?j4rZY8~&J@*z z3ta`NTt}23s|aLt&7ll3KyoN?oF8eYq9$`?zXqf6O6J||d2=z^Y5HNK8rGOb^-9Gz z!!WAFkD##l|nRpu(+^KW>Ryyo2-%(l3Li!yOe-UKg31IA z1IjG}%3TatI6H{JmzbQX$?poj3-B`@J{jamQhI$-dXc~IB7c|+ zOjWD`o?%lQDqxtqLOBw82woJr^OXG*O*{xj^Gxtu`X`mM!0&(Ho%bhilo7PEvy}Kg z4;(vM5=kD_8=c$>bgJtLWr3i{&1O4o#;KdN;%44o*}Tj_Y&ygi#?#Upu8Vr(fbK`2 zw~XBUW6A(3P7K`EGIWjHMW=D)vEo9hQcdDyKZp-3Hw|vhQffC9l31(Uff zK3)8z6vIbJRe|Lh!KIPys?@mq+s-$HW-yCU!;G%H?Rm-?WD&Mp5%LXHm-6dB47Xqn z>&OQr;(J|=Jhd>*kjpjkMhoJA;c>!NCABS>$XdvwaRsyYbxhfkvhy&KuY3M5E8BS9 zKEg8K>}geiH1>KJeLcaYDWAxp4tLOgp_j{~0CiOr_|0)K7J?`*J-l6&vcuV|1<%Ql z*6^}Yt^vjOaDM$&QNz$~Cr-GWH)-yy<$~lOsip|SQheAJCcG(Job!)CfzIV{V^MH! zl&RE){CU`|iF?>+C#G6ona=9E532O%s)WeKQf076Q5K;-|HEqXyhLC9BNqu5N|4h! z^L&|drZlN0JPHIPU3VH;(hRug*RrGrYUZ2=5zi9G+2C>PyTW3^iE6bV5T=p1@J!$& z%o4j^65DpdXowzxnt32KvrbN)kQ6rF2S`1XNne(mLVkI`#i~I25Yjua8gZiA8!vY!Iqg-!++e zXGU2?xihOU_^GD@{uK24pYeEv^$MK3iP6PoH_Kehva$TwX3Fu@(zNy@O zLW-9sNL&HLAvu>ZU}|U^8!g~$0}Ge|N@&1Q3r)OzAA4d8T}2@IF?WG*4=q8g!g(PW zCRI8Haq{GHr{UL_64^}q( zb{`efhRWx5zccDBy*pd4zB99}eVcBZ07q{Wy}Pa)T}OSvTd{ojpdCC?cua$%pe7z zucrm`{v@O4RRPYi0yic*<*W&{|I2r^#5j&sQGedE9mk13v12DG$8mn{R4S>iq^fH& zEm1}qgj%#@^&TWp^irz6H{XT%}$6MNCE?qrc=j-&YA(PVaeIPIrKt!5a_=8>k&lA0lD z#0o|%ek>)@KuV<{Rh~>4AW4;n@|jo?=!SiKt7 zM@ixtxa=)a=}=s9+@2h;BN{4@P_f528RH^uC1Gym8eMTI3(rKePNiTDWKy-?D(F%m)`qN{(ocIH&SU5AsmCT9glu^9<8259<#NYEiEv82rZ9BuQk#6gQ zZGRed3eSz&MP$07Wku7Y+OkT%3lRYr?OqpWSt}O5}k1<|=qPDw$nb{WAsPy7T?VnSNKv zM*8}zi<+$J>O^IloY_-_Oz@m(iu`5si|$$u_TQOOA46Q_+AsJo=}65FQ=32kI%ysg zy~`u&T*lIEdGJ)~5r|C}&d0+66;9ZnfU5o>D3v+jYBz!n=z^79r`)K^$DW8{n_D}l zaKj$|1KZcAN?}9z7;wl7(n&0eR!D!e?Q|~=7HP~)IS+dTKSzOkLOL0&cqKH5`G%(W zQGK>Km&TiOZ?O;_a*;bOnKv;Wh_NgU7Mr^Kux=K0MUo5Z*GjWo?%iC5{!s06Ue2HI zT=N{h&2TFY;Gy54nsa@DPN@Fm86?AeTc&Vz$SokEA%m;RkQJ(78<2}DQ* z`i|xVe8mokz5;{12G;=@XaRS-jCl`uyGXo-<70CSuZ2qD2}u8$x4?2-w71u^n?bBL z2Pz;Zq($_~n9pg6+Jk)bJSi&d=GKObw{zUzMu+R!h30L}8yXpzS9!w=u@9#9KvShM zcZBFyTR_T>9U#SDJI_}C4f{^(!&27u>FXl@g}rpt*L9sUuGBQmcY@Flosem~r|d7L zD@9e*1Eu9Jhm-xVr3O7hlUKaANRR)M*Tc7{&W6U0z^-V(1Yars8FoGpsL}#!&=Q_l ztdfPswSbyiil-nw1^~-PR`?>8KVXm_1N1slr|tweI5?F1Nqki>l;XA?CvGok=O*Q0 znpDhBM4tH2?QV}`t>~JY^KQ*kDFc*>*Vlx84u}03o;M8jX;~{v9J3pg9+mR)oo=Y> z8gKW%LIhqUlksRy5PxGn5`;}ZAkyC2U(SiY#892^{2}4Fkb@@)WMTvX@Tz_{?_%Wo ztyY(*!*pnMjR0u&md#>RWVk@cswc6;Wkc-alAS2_=V*b9ibB)p%a!ETcu`)AC7BG-5RWr zjm^0%6*3^E&)NJjdClZ+Gt0V15DG>sgyHX~|M*v)9XNQM z1H%t+^x!cl>Bk0T>HsxzKy4-oDL9Werok)Zzl{7ZW#Up;ljWiox7B#~$M)aa%AlRM zzt#Rh`zLMQUV+?spZ+sES}wLrpuf!NCij=%wzMn`CX^DdF7N~x&njfeZvXYY_aG9Vk=@fPeXS4<1iC_a z^=n&wEy$m@JFRxTA#0kp;#?!iRhXhRjQ(EQp*~AdHH8d__uJY2-l|p`YWVOKnQn!% zlfmRfrO!eMT0ovv>|IM2dGkQeQMB~>A(K)MAng(8Ub7!`vT3s(OU<|=u(jw^>eo**cA^VN#CXpW|il!GDD>R>Y z`D{l_z*e#GFXEhVBi{y@eK~(t1vI1A7VTsd+&sI9<@)B?_o;RraL(>lk#V+9hr3nu zh@`~Td-uxtVHxtgjKC}+%-$!=LTUYbBW_h588P<>uU6A8npV*ypIBV!*x6iEUMdi$ zyNCMB!$$9hjGiWZH!M}>`rf6^)IRx$dfi9V&-^NP8?X_HC}D|Vm%b56K=BeDK8>vi zb{<|J^1Mpty~h_Vgm*X0ZUtlhDQ!8(VVP~DIm zgm%T#W9dY?Bb~}Go=QuS0OaTr4uRflS@|y!Em6EK;fK?mR$u^)NQD6-y)|G8M8l<{ zw>pHcYue(9;-3c)lbGaZgoQeqD_yjN8jQqJUl@zZV=s31Ku38s$eVPNEFwgQaDqcz z&ZNsNhM9UxI>ck(n*28X$fKYQgD6DpP=bjU*0PZrvF}%zmbr-HA>}YL zB&{^L@!#TibX_shyXS_!JzW~d>(i}rXFEOF&W^W-OL<)^yY|A!X2ocjO^d8Mw7Yvn zw^P_oVK)lH?kciU$hOGJGf#9?-e%W%k!7#?ub&!oMs1a1Y$#u;bX0u!c(tOoYhC7Y zxY`*|??&%+!yi%eg+$0Q{eR~0>7A<+T^FrcHVW21nv>eGp~IQB6y=%%*)WW*3O0pj{TmWEHdu!epW4Yz$sz=iGbiwWdc=B&Oc$S5>d7?mhRMbBA+D z6P3seWL4L0XR9kkefyhWy5Qfz4^-vTPs#gt&Z^HodJF}3(U>u$MAKQ}c{~9gPk_fu z$Ky3cO%(!3$1Lb*xb(ssBw3rpZ6cahtLbZPu9we&e{%oHXb}oNkVl z;Gi*{P~Qk|Iq~s?kLdNF4m=$Xeh{)dF0UvDD+l}5dTa6o15~3vM>JkMu;CWmm97}0 zK_AgfNAgj18;+Seo=iQr22WP7a8RJSU@4N^L|kqjd2l6L6d1-I!J8J>r(}YrjUAya z>MRn@r>-*z{ITy%Zru`G=Y89$9d~;3roi3<=+{*>URS$qCFZ?0PrL34YR=2KDCM0f zbt=wVseqm0U!b3|jcFp0B8|#c8%V#1^Q&5=RrSmCDmz_vS^XL0at?YR?y5VW+fpf! zQWb@`GrUx(-+cVhuP-5e|Nd5{KY&b+*%z4UCrIgIOs3(Zlk(`-#RC+35Ay|Tf|IYB z81w9*-|~F8C&#WffB`aw{>rQ)hL4uydW`Jo&b02vpF$laI%oHPe0P16DrATW=O zeMo`uUKep5@7&OgR#RK85=K6e^m!d{@qeMYT3%80*Mz~G|^FSV|`N#h;9?ds2dv>D<6HT zj0X`Ti|r>)8V7@|7B(wFyZ16dZbDS#Fi#ASTgd}bKJ@?ewmd-<#Ky!|}mvwzoK%)kmlBm8ht{0F3n5gnjm~%;7Z#C^-c> ziyRTr&#{d9G%t#DA{2H?$%cAQk>G63i8klNZ9CDt3HzkAJq<^zvoHYmYc&O$7l`Ae z3Gv|JffOsjLx=~DtC*m%$to1iLs5euT&BX4JI-D>n}kS5EBJk3HKkpGDKCF^Rk#=c6SjI z71Clw@YvB&%XesA3^9x;5@m;`uMjXa+8w$cAg%~zsP{2aFYxIz+?~dVMzT2jm?ATw zymTsb(O9@Y)GGoEH`&La4)Fz;57}Tu-qYjbdem2$Cx`j|augPIUW`UOVIz)19GlmH zBkG%@SIg!4$S7|dzIt|}++U8%zGRFOK&5NAX);@oh)ZG%OTJlFcC9EwAOnz!p_WRs~ryHO0^b)$$_U z(5%BCP^zNdo6X|BY8W?Wi`n9EzZx4F7!J|4)IdP2aGyG2yX?B~?!y^!DTMVI8PzRA z`X6pkFOZvun8w#25tAWgVQ&cc>|sG#KBiW(s=8o?i6+sU0fx*WG7sk8%#nL^RAL$T zf+ZOtU}MT<)2N&x&v}*Ryh?MP^qi;~?lic<;z+M)Y@cb?P?W||z9{FbGktem7Ht%_ zQPA4f8e*ikW+YV=DQ?xEK35IGxgsx7AtY=%Y12uYPTF*mkRwEPwJL@4QjA`x^njbq z=S9EiHL&ctwWMGFM$F7N%||D-YG)Duk1Cv`T77y+3U8-wDJqgW7-g3}a+UR@H&QPS zBTH63j8pL~SyJ!5dC3y-$9Kahh&si!fKlHDj#vnPdCZ3B@*z)yAqFwS#6Y|=&Hx!_ z0308nkD-Zabt!BTyhqd_`@#^Tw7|w;hWB)2(|M<2({A)Qk2ombDXw@f#oIkB`bi;8 z>**A;h}tx5GCV-k`#j}+;&XJQ{p0Bo^&<(q;sV>t1@Xr24Bw~6!PVp6K%-9>qTe)n zd^AW7pEfz(DNGisdZLLJbd%-)?%S{1a({IuOm@|G$_cqK zG^U}~s^RL)QH6=AzB4gY38B)NvhFzVdW$PP#fDYj)T#e3pq9_(CmSZ&x(=9xxFYLl zLfa4v0En8`8h>l`GUZ}>s~`6=(=cR70drwQUgScRCB59#4FHj>t6I+wg6OUtMqXc% zC3#Owyu`K~$Ls~+02ZWUu@}V=bbf=&Z9(3` zpy#-~LdAHkAfu{Kv|+Fg8&ssQK?jk9t(mMHckR%kLyM-$YPD1N7lW-3glLSl)=Z@apX zp)P(2UpHZYYn&uUqy^OBiii|IS&2YK=|V&|2RMs!_)>%POsAuOR40%Rkp_NMq-oPB zDe)P35)->#A04Q_AupUX0|2F8r_({%4*IQOwT9jr12JN&vxwsG*;S;>uedBk$@0ZU zv@=>)m(th01UO?1QqT{=zN{z*imU`??45UnaUN%J%1!6J*kuYtMh2&ec`w-x8?uq` z`^E}<7v2{S0&0fiQM=Pkauf}SSi-GAf)*ajD8W$1v;Ynw0LPh_xt8K(KDX~)XE+`N z+=(;^fXAc)H+19^1D%4ws~X4V8kt#$vrZxe-WN93bJ$7el%pXjbR*q{;{)6hCrt=m z=8kFTsit^hgYPL~!aOp@e}4oi7Ar61JOtxEcrKrCm-KAolA2?5l3<2MYiYQ4ch*6< z?iq0aM5URo;RVpOL0Z>_AxN#jTEXM31m^^D8l8@y*XR&WVzSk&ZOIOF9$Thk+2vS+ zer@_Z;~BJRNCk88wEE6imNjutod}Ae%weBzd{%2KH^-n(0G#Hh8KbJ*G zfqLI`XV=++9kF9}!cN%@@%Cf32Op2-3oRiAY)TzOOp}Yv%Ee#7YVG0~$L|~kO|D^@ zQ?4!xqSC`}hJDf3Ssk#m88v0l@CyVo>EQ-yvOiMt7Us&r;uH1_Va9Naveq_%%6=Pn#GQ ze0X8)2=~=;xLm~(yZ`08YI@@~&hU^!4nLQ}kL8ECEA5xED`~Zotd+D~c^y%1)HrqA zCUxV+s8jgT1KEY$z;5B9Kyzw+Dthdtt%0IB^i&l62$XYR6i9+x(yP-;fnMD7AGq&3 zhg@oA-sgGV=fz?awSj#JZ!lp;W6MlZU1O_js_hXJ1N?uYgVVsydnhVo z-xK)aZ(D%#zm z-74B%9HgmdH~MROGSFPh3kuIIEHl?wu1cC^Y)ZwZC*XPb!2*(TiBOTpyypS=|8RQt z^SnQvECAbseA zg7!`443Q-N2_!9BJ#Z@YSVD z5*>7&*vSk)B0*^*6>0FCtqPpDm}LlJ)oJ4kJC4+n+MJB09X;Lc@AlIa^UB+RU6#4n zIM|rbd^x>1$`7-Hc7Aa20?%JOni061U3lRrU(Is$FxOwqcP{38vpl(wHxBac@lKI8 zit%1C?x#u7f1%LyLUOpY&{ner`YigmTh5$_k1%Z`??-@SOhx+gV8~_)Q z#k}csYYUz{m9qbViLgJD$|8$&zdIOcOk-!v@?`Ry;+0^j#Be<6h2uf*D?O?y6hu#! z8Zmeaa0Y!v)#Y{<;G(QiCd)}eWyS^!imKO)E4KHFd+Q1Vpio(sFKnw+fkF$^QF-aB zP;|j(Z;WcGD8GF8@FDmI1F-Z1z!E2aIU&4qM;yZ?TtrP5il9RbRg7%ShtO-BDYjxW zR#mm)?3U+jB*KN^^%$5W%g!xfm#wS@@X)P7*YcVUUQ?z@PKA8HE3uQ+P%Akt7@y7= zng{$WjMVdcKVBHkiLjKtNoA$9%e8

(-mSTBtMo+i#klCk@`^T<*RLtKE6}gxn?{ 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�)y2;!@G9OOit; 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 30 : + continue + ori_measure_value = measure_obj.split(':')[1].replace('+', '').replace(',', '').replace('元', '').replace('%', '') + if '-' in ori_measure_value: + ori_measure_value = "-" + if '.' in ori_measure_name: + ori_measure_name = ori_measure_name.split('.')[1] + ori_measure_id = utils.get_md5(ori_measure_name) + if re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', ori_measure_value): + # 判断数据库中是否有数据 + check_query_data = (file_id, 'text', int(page_num), ori_measure_value) + cursor.execute(check_query, check_query_data) + check_records = cursor.fetchall() + if(len(check_records)) > 0: + continue + data_to_insert = (file_id, file_name, type, int(page_num), int(table_index), ori_measure_id, ori_measure_name, ori_measure_value, create_time, create_time) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def insert_measure_parser_info(parser_info,conn,cursor): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO measure_parser_info + (file_id, type, content, create_time) + VALUES (%s, %s, %s, %s) + ''' + file_id = parser_info['file_id'] + type = parser_info['type'] + content = parser_info['content'] + data_to_insert = (file_id, type, content, create_time) + cursor.execute(insert_query, data_to_insert) + conn.commit() +def insert_measure_parser_info_measure(parser_info, conn, cursor, line_text): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + insert_query = ''' + INSERT INTO measure_parser_info_linetext + (file_id, type, content,text, create_time) + VALUES (%s, %s, %s, %s,%s) + ''' + file_id = parser_info['file_id'] + type = parser_info['type'] + content = parser_info['content'] + text = line_text + data_to_insert = (file_id, type, content,text, create_time) + cursor.execute(insert_query, data_to_insert) + conn.commit() +def insert_table_unit_info(table_info,conn,cursor): + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO table_unit_info + (file_id, page_num, table_index, unit) + VALUES (%s, %s, %s, %s) + ''' + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + table_index = int(table_info['table_index']) + unit = table_info['unit'] + data_to_insert = (file_id, page_num, table_index, unit) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def insert_table_unit_info_v1(table_info, conn, cursor): + """ + 插入数据到 table_unit_info 表之前,检查是否存在相同的 file_id, page_num 和 table_index。 + 如果存在且 unit 不同,更新现有记录,否则插入新记录。 + """ + + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + table_index = int(table_info['table_index']) + unit = table_info['unit'] + + # 查询现有记录 + check_query = ''' + SELECT unit + FROM table_unit_info + WHERE file_id = %s AND page_num = %s AND table_index = %s + ''' + cursor.execute(check_query, (file_id, page_num, table_index)) + existing_record = cursor.fetchone() + + if existing_record: + existing_unit = existing_record[0] + + if unit != existing_unit: + # 更新现有记录 + update_query = ''' + UPDATE table_unit_info + SET unit = %s + WHERE file_id = %s AND page_num = %s AND table_index = %s + ''' + cursor.execute(update_query, (unit, file_id, page_num, table_index)) + logger.info(f'Updated existing record with file_id={file_id}, page_num={page_num}, table_index={table_index}.') + else: + logger.info(f'No change needed. Existing unit={existing_unit} is the same as new unit={unit}.') + else: + # 插入新的记录 + insert_query = ''' + INSERT INTO table_unit_info + (file_id, page_num, table_index, unit) + VALUES (%s, %s, %s, %s) + ''' + data_to_insert = (file_id, page_num, table_index, unit) + cursor.execute(insert_query, data_to_insert) + logger.info(f'Inserted new record with file_id={file_id}, page_num={page_num}, table_index={table_index}, unit={unit}.') + + conn.commit() + +def insert_table_text_info(table_info,conn,cursor): + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO table_text_info + (file_id, page_num, table_index, text) + VALUES (%s, %s, %s, %s) + ''' + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + table_index = int(table_info['table_index']) + text = table_info['text_info'] + data_to_insert = (file_id, page_num, table_index, text) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def update_ori_measure(conn,cursor,file_id): + + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + # 执行SQL语句,更新数据 + update_query = ''' + UPDATE ori_measure_list + SET measure_id = %s, measure_name = %s + WHERE ori_measure_id = %s and file_id = %s + ''' + + select_query = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + select_query_first = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config_first_quarter t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + select_query_half_year = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config_half_year t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + select_query_thrid = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config_third_quarter t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + + if report_type == 1:#半年报 + start_time = time.time() + cursor.execute(select_query_half_year) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'update_ori_measure方法走的是半年报') + elif report_type == 2: # 一季报 + start_time = time.time() + cursor.execute(select_query_first) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'update_ori_measure方法走的是一季报') + elif report_type == 3: # 三季报 + start_time = time.time() + cursor.execute(select_query_thrid) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'update_ori_measure方法走的是三季报') + else:# 年报 + start_time = time.time() + cursor.execute(select_query) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'update_ori_measure方法走的是全年报') + start_time = time.time() + for record in records: + data_to_update = (record[0], record[1], record[2], file_id) + cursor.execute(update_query, data_to_update) + conn.commit() + end_time = time.time() + logger.info(f"更新数据更新 {(end_time - start_time):.2f} 秒。") + #更新measure_list表,增加此次文件的显示指标 + start_time = time.time() + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + if report_type == 0:#全年报 + insert_query = ''' + INSERT INTO measure_list + (measure_id, measure_name, create_time, update_time, file_id) + select distinct measure_id,measure_name, %s,%s,%s from measure_config + where year = '{year}' + '''.format(year=report_year) + elif report_type == 2:# 一季报 + insert_query = ''' + INSERT INTO measure_list + (measure_id, measure_name, create_time, update_time, file_id) + select distinct measure_id,measure_name, %s,%s,%s from measure_config_first_quarter + where year = '{year}' + '''.format(year=report_year) + elif report_type == 3:# 三季报 + insert_query = ''' + INSERT INTO measure_list + (measure_id, measure_name, create_time, update_time, file_id) + select distinct measure_id,measure_name, %s,%s,%s from measure_config_third_quarter + where year = '{year}' + '''.format(year=report_year) + else:# 半年报 + insert_query = ''' + INSERT INTO measure_list + (measure_id, measure_name, create_time, update_time, file_id) + select distinct measure_id,measure_name, %s,%s,%s from measure_config_half_year + where year = '{year}' + '''.format(year=report_year) + + data_to_update = (create_time, create_time, file_id) + cursor.execute(insert_query, data_to_update) + conn.commit() + end_time = time.time() + logger.info(f"更新数据写入 {(end_time - start_time):.2f} 秒。") + +def insert_table_from_vector_mul_process(parent_table_pages,file_id,file_name,records,record_range,black_array,partition_name,): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + logger.info(f'Run task {record_range} ({os.getpid()})...') + logger.info(f"插入数据 {len(records)}") + + + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + cursor_app = conn_app.cursor(buffered=True) + + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + check_query = ''' + select id from ori_measure_list + WHERE file_id = %s and measure_name = %s and page_number = %s and table_index = %s and ori_measure_value = %s + ''' + insert_query = ''' + INSERT INTO ori_measure_list + (file_id, file_name, type, page_number, table_index, ori_measure_id, ori_measure_name, ori_measure_value, create_time, update_time, distance, pdf_measure,measure_id,measure_name,unit) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ''' + #获取表格上方文字包含母公司字样的页码 + select_parent_query = ''' + select distinct content from measure_parser_info WHERE file_id = '{file_id}' and type='parent_com' + '''.format(file_id=file_id) + + #获取表格上方文字黑名单关键词的页码和表格下标 + select_table_index_query = ''' + select distinct content from measure_parser_info WHERE file_id = '{file_id}' and type='table_index' + '''.format(file_id=file_id) + # #获取表格上方文字黑名单关键词的页码和表格下标----标题下的详细指标 + select_measure_index_query = ''' + SELECT content FROM measure_parser_info_linetext WHERE file_id = %s AND type = 'measure_index' + ''' + unit_query = ''' + select unit from table_unit_info + WHERE file_id = %s and page_num = %s and table_index = %s + ''' + + cursor_app.execute(select_parent_query) + parent_records = cursor_app.fetchall() + + + for parent_record in parent_records: + parent_id = parent_record[0] + parent_table_pages.append(int(parent_id)) + + + #表格上方文字黑名单关键词的页码和表格下标转成数组 + table_index_array = [] + cursor_app.execute(select_table_index_query) + table_index_records = cursor_app.fetchall() + for table_index_record in table_index_records: + table_index_array.append(table_index_record[0]) + # #仿照写法,指标的黑名单转化 + measure_index_array = [] + cursor_app.execute(select_measure_index_query, (file_id,)) + measure_index_records = cursor_app.fetchall() + logger.info(f"Executing SQL:{select_measure_index_query}") + logger.info(f"With file_id:{file_id}") + for measure_index_record in measure_index_records: + measure_index_array.append(measure_index_record[0]) + logger.info(f'黑名单的值是{parent_table_pages}和{table_index_array}以及新增的{measure_index_array}') + #print(f'黑名单的值是{parent_table_pages}和{table_index_array}') + record_start = record_range.split('-')[0] + record_end = record_range.split('-')[1] + + if str(report_type) == "2": + table_index_array = [] + measure_index_array = [] + + client = MilvusClient( + uri=MILVUS_CLIENT, + ) + + try: + for index in range(int(record_start),int(record_end)): + record = records[index] + ori_measure_name = record[0] + measure_name = record[1] + distance = record[2] + ori_measure_id = record[3] + measure_id = record[4] + measure_vector = redis_service.read_from_redis(redis_client,ori_measure_id) + + + measure_list = ast.literal_eval(measure_vector) + data = [measure_list] + filter_str = 'file_id == "'+file_id+'"' + res = client.search( + collection_name="pdf_measure_v4", # Replace with the actual name of your collection + # Replace with your query vector + data=data, + limit=3, # Max. number of search results to return + search_params={"metric_type": "COSINE", "params": {}}, # Search parameters + output_fields=["measure_name", "measure_value", "table_num", "table_index", "measure_unit"], + filter=filter_str, + partition_name=partition_name + ) + + # Convert the output to a formatted JSON string + # for i in range(len(res[0])): + + for i in range(len(res[0])): + + vector_distance = float(res[0][i]["distance"]) + pdf_measure = res[0][i]["entity"]["measure_name"] + measure_value = res[0][i]["entity"]["measure_value"] + table_num = res[0][i]["entity"]["table_num"] + table_index = res[0][i]["entity"]["table_index"] + unit = res[0][i]["entity"]["measure_unit"] + # if pdf_measure == '2023年6月30日货币资金合计': + # print(f'{pdf_measure} 的相似度是 {vector_distance},其值为 {measure_value},页码在 {table_num}') + + #先过滤页码为0的情况,暂时不知道原因 + if table_num == 0: + continue + + #过滤表格上方文字黑名单关键词的页码和表格下标 + if f"{table_num}_{table_index}" in table_index_array: + continue + #if f"{table_num}_{table_index}" in table_index_array and pdf_measure in (): + + #过滤指标中包含黑名单关键词 + if utils.check_pdf_measure_black_list(pdf_measure): + continue + if f"{table_num}_{table_index}" in measure_index_array and utils.check_pdf_measure_black_list_v3(file_id,table_num,table_index,pdf_measure,conn_app,cursor_app): + logger.info(f'经过第三层规则去除了{table_num}页的{pdf_measure}指标') + continue + + + + if vector_distance > distance and table_num not in parent_table_pages: + #检测规则开始 + #判断抽取指标和财报指标周期是否相同 + ori_period = utils.get_period_type(ori_measure_name, report_year) + pdf_period = utils.get_period_type(pdf_measure, report_year) + if pdf_measure == '2023年6月30日货币资金合计': + logger.info(f'第1处{ori_period}和{pdf_period}') + if(ori_period != pdf_period): + continue + + #判断抽取指标和财报指标是否期初指标 + start_ori_period = utils.get_start_period_type(ori_measure_name) + start_pdf_period = utils.get_start_period_type(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + logger.info(f'第2处{start_ori_period}和{start_pdf_period}') + if(start_ori_period != start_pdf_period): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是季度 + ori_season_type = utils.get_season_flag(ori_measure_name) + pdf_season_type = utils.get_season_flag(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + logger.info(f'第3处{ori_season_type}和{pdf_season_type}') + if(ori_season_type != pdf_season_type): + continue + + #判断是否都是扣非指标 + ori_kf_type = utils.get_kf_flag(ori_measure_name) + pdf_kf_type = utils.get_kf_flag(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + logger.info(f'第4处{ori_kf_type}和{pdf_kf_type}') + if(ori_kf_type != pdf_kf_type): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是百分比 + ori_type = utils.get_percent_flag(ori_measure_name) + pdf_type = utils.get_percent_flag(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + logger.info(f'第5处{ori_type}和{pdf_type}') + if(ori_type != pdf_type): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是占比同比变动类 + ori_growth_type = utils.get_percent_growth(ori_measure_name) + pdf_growth_type = utils.get_percent_growth(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + logger.info(f'第6处{ori_growth_type}和{pdf_growth_type}') + if(ori_growth_type != pdf_growth_type): + continue + + #解决指标语义是比率,但值为非比率的情况 + if ori_growth_type == '1': + check_measure_value = abs(float(measure_value)) + if(check_measure_value > 10000): + continue + + # 判断数据库中是否有数据 + check_query_data = (file_id, measure_name, int(table_num), int(table_index), measure_value) + cursor.execute(check_query, check_query_data) + check_records = cursor.fetchall() + if(len(check_records)) > 0: + continue + + #判断是否包含黑名单 + if(utils.check_black_list(measure_name,pdf_measure,black_array)): + continue + if(utils.check_white_list(measure_name,pdf_measure)): + continue + + #判断抽取指标和财报指标类型是否都是增长类,比如同比变动为增长类 + ori_change_type = utils.get_change_rate_flag(ori_measure_name) + pdf_change_type = utils.get_change_rate_flag(pdf_measure) + if(ori_change_type != pdf_change_type): + continue + + #处理调整前,调整前、后同时出现,如果有调整前过滤 + if pdf_measure.find('调整前') != -1 or pdf_measure.find('重述前') != -1: + continue + + #判断指标是否报告期初 + ori_report_start = utils.get_report_start(ori_measure_name) + pdf_report_start = utils.get_report_start(pdf_measure) + # if pdf_measure == '2023年6月30日货币资金合计': + # print(f'第7处{ori_report_start}和{pdf_report_start}') + if(ori_report_start != pdf_report_start): + continue + + # #表格描述文字黑名单判断 + # text_query_data = (file_id, int(table_num), int(table_index)) + # cursor.execute(text_query, text_query_data) + # text_records = cursor.fetchall() + # if(len(text_records)) > 0: + # text_info = '' + # for text_record in text_records: + # text_info += text_record[0] + + # if(utils.check_title_black_list(measure_name,text_info)): + # continue + + #检测规则结束 + #获取指标单位数据,除了百分比 + if(utils.get_percent_flag(measure_name) == '0'): + unit_query_data = (file_id, int(table_num), int(table_index)) + cursor.execute(unit_query, unit_query_data) + unit_records = cursor.fetchall() + if unit != '' : + pass + elif unit == '' and (len(unit_records)) > 0: + unit = unit_records[0][0] + else: + unit = '元' + + data_to_insert = (file_id, file_name, "table", int(table_num), int(table_index), ori_measure_id, ori_measure_name, measure_value, create_time, create_time, vector_distance, pdf_measure,measure_id,measure_name,unit) + cursor.execute(insert_query, data_to_insert) + conn.commit() + except Exception as e: + logger.info(e) + finally: + parent_table_pages = [] + client.close() + redis_client.close() + cursor.close() + conn.close() + +def insert_table_measure_from_vector_async_process(cursor,parent_table_pages,file_id,file_name, partition_name): + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + select_query = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config + where year = '{year}' + '''.format(year=report_year) + select_query_first_quarter = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config_first_quarter + where year = '{year}' + '''.format(year=report_year) + select_query_half_year = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config_half_year + where year = '{year}' + '''.format(year=report_year) + select_query_thrid = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config_third_quarter + where year = '{year}' + '''.format(year=report_year) + select_black_array_query = ''' + SELECT measure_name, keywords FROM measure_black_list where isdel = 0 and find_in_set('{year}',year) and find_in_set('{flag}',flag) + '''.format(year=report_year,flag = report_type) + black_array = [] + cursor.execute(select_black_array_query) + results = cursor.fetchall() + for row in results: + category = row[0] + keywords = row[1].split(',') + black_array.append(f"{category}:{','.join(keywords)}") + + if report_type == 1: + start_time = time.time() + cursor.execute(select_query_half_year) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'insert_table_measure_from_vector_async_process方法走的半年报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array, partition_name)) + processes.append(p) + p.start() + elif report_type == 2: + start_time = time.time() + cursor.execute(select_query_first_quarter) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'insert_table_measure_from_vector_async_process方法走的一季报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,partition_name)) + processes.append(p) + p.start() + elif report_type == 3: + start_time = time.time() + cursor.execute(select_query_thrid) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'insert_table_measure_from_vector_async_process方法走的三季报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,partition_name)) + processes.append(p) + p.start() + # p.apply_async(insert_table_from_vector_mul, args=(parent_table_pages,file_id,file_name,records,record_range,)) + else: + start_time = time.time() + cursor.execute(select_query) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + logger.info(f'insert_table_measure_from_vector_async_process方法走的全年报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,partition_name)) + processes.append(p) + p.start() + + logger.info(f'等待所有子任务完成,任务ID:{file_id}' ) + for p in processes: + p.join() + logger.info(f'所有子任务完成,任务ID:{file_id}') + logger.info(f'启动指标归一化任务ID:{file_id}') + end_time = time.time() + logger.info(f"向量更新时间 {(end_time - start_time):.2f} 秒。") + +def insert_table_measure_from_vector(conn,cursor,client,parent_table_pages,file_id,file_name): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + select_query = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config + ''' + + check_query = ''' + select id from ori_measure_list + WHERE file_id = %s and measure_name = %s and page_number = %s and table_index = %s and ori_measure_value = %s + ''' + insert_query = ''' + INSERT INTO ori_measure_list + (file_id, file_name, type, page_number, table_index, ori_measure_id, ori_measure_name, ori_measure_value, create_time, update_time, distance, pdf_measure,measure_id,measure_name,unit) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s ,%s) + ''' + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + start_time = time.time() + cursor.execute(select_query) + records = cursor.fetchall() + end_time = time.time() + logger.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + start_time = time.time() + + + + try: + for record in records: + ori_measure_name = record[0] + measure_name = record[1] + distance = record[2] + ori_measure_id = record[3] + measure_id = record[4] + measure_vector = redis_service.read_from_redis(ori_measure_id) + measure_list = ast.literal_eval(measure_vector) + data = [measure_list] + filter_str = 'file_id == "'+file_id+'"' + res = client.search( + collection_name="pdf_measure_v4", # Replace with the actual name of your collection + # Replace with your query vector + data=data, + limit=3, # Max. number of search results to return + search_params={"metric_type": "COSINE", "params": {}}, # Search parameters + output_fields=["measure_name","measure_value","table_num","table_index","measure_unit"], + filter=filter_str + ) + + # Convert the output to a formatted JSON string + for i in range(len(res[0])): + + vector_distance = float(res[0][i]["distance"]) + pdf_measure = res[0][i]["entity"]["measure_name"] + measure_value = res[0][i]["entity"]["measure_value"] + table_num = res[0][i]["entity"]["table_num"] + table_index = res[0][i]["entity"]["table_index"] + measure_unit = res[0][i]["entity"]["measure_unit"] + + if vector_distance > distance and table_num not in parent_table_pages: + #检测规则开始 + #判断抽取指标和财报指标周期是否相同 + ori_period = utils.get_period_type(ori_measure_name, report_year) + pdf_period = utils.get_period_type(pdf_measure, report_year) + if(ori_period != pdf_period): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是百分比 + ori_type = utils.get_percent_flag(ori_measure_name) + pdf_type = utils.get_percent_flag(pdf_measure) + if(ori_type != pdf_type): + continue + + # 判断数据库中是否有数据 + check_query_data = (file_id, measure_name, int(table_num), int(table_index), measure_value) + cursor.execute(check_query, check_query_data) + check_records = cursor.fetchall() + if(len(check_records)) > 0: + continue + #检测规则结束 + + data_to_insert = (file_id, file_name, "table", int(table_num), int(table_index), ori_measure_id, ori_measure_name, measure_value, create_time, create_time, vector_distance, pdf_measure,measure_id,measure_name,measure_unit) + cursor.execute(insert_query, data_to_insert) + conn.commit() + except Exception as e: + logger.info(e) + end_time = time.time() + logger.info(f"向量更新数据时间 {(end_time - start_time):.2f} 秒。") + start_time = time.time() + + +def insert_measure_data_to_milvus(client,partition_name,table_info,cursor,conn): + insert_query = ''' + INSERT INTO measure_parse_process + (file_id, page_num, content) + VALUES (%s, %s, %s) + ''' + + for table in table_info: + try: + data=[] + table_num = table['page_num'].split("_")[0] + file_id = table['file_id'] + table_index = table['page_num'].split("_")[1] + + measure_list = table['measure_list'] + for measure in measure_list: + measure_name = measure['measure_name'] + + # 需要跳过的一些指标 + black_list = ["营业总成本"] + if any(black in measure_name for black in black_list): + continue + + measure_value = measure['measure_value'].replace("(", "").replace(")", "") + measure_name = utils.get_clean_text(measure_name) + measure_name = measure_name.replace('2023','2023年').replace('2022','2022年').replace('(','').replace(')','')#这个真绝了,怎么都删不掉 + #measure_name_1 = measure_name.replace('调整后','') + quarters = ['第一季度', '第二季度', '第三季度', '第四季度','增减','2023年','2022年','2021年','年'] + for quarter in quarters: + measure_name = measure_name.replace(quarter * 2, quarter) + pattern_dup = re.compile(r'(\w{3,})\1+')#去掉任意超过两个字且重复的字符 + matches = pattern_dup.findall(measure_name) + # for match in matches: + # print(f"被删除的字符: {match * 2}") + measure_name = pattern_dup.sub(r'\1', measure_name) + measure_name_1 = measure_name.replace('调整后','').replace('上年期末数','上年期末').replace('上年期末','上年年末') + measure_unit = measure['measure_unit'] + if re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', measure_value) and any(key_word in measure_name for key_word in measure_name_keywords): + + vector_obj = utils.embed_with_str(measure_name_1) + + vector = vector_obj.output["embeddings"][0]["embedding"] + measure_data = {} + measure_data['vector'] = vector + measure_data['table_num'] = int(table_num) + measure_data['table_index'] = int(table_index) + measure_data['measure_name'] = measure_name + measure_data['measure_value'] = measure_value + measure_data['measure_unit'] = measure_unit + measure_data['file_id'] = file_id + + + data.append(measure_data) + + # 指标数据写入指标解析过程表,用于前端展示 + content = f"{measure_name}:{measure_value}" + data_to_insert = (file_id, table_num, content) + cursor.execute(insert_query, data_to_insert) + conn.commit() + elif re.match(r'(增加|减少|下降|上升)[了]?(\d+\.\d+)[个]?百分点', measure_value) and any(key_word in measure_name for key_word in measure_name_keywords): + #特殊处理指标值为增加了/减少了 XXX 个百分点 + unit_pattern = re.compile(r'(增加|减少|下降|上升)[了]?(\d+\.\d+)[个]?百分点') + match = unit_pattern.search(measure_value) + if match and len(match.groups()) == 2: + crease_type = match.group(1) + measure_value = match.group(2) + if crease_type == '减少' or crease_type == '下降': + measure_value = f'-{match.group(2)}' + + vector_obj = utils.embed_with_str(measure_name_1) + vector = vector_obj.output["embeddings"][0]["embedding"] + measure_data = {} + measure_data['vector'] = vector + measure_data['table_num'] = int(table_num) + measure_data['table_index'] = int(table_index) + measure_data['measure_name'] = measure_name + measure_data['measure_value'] = measure_value + measure_data['measure_unit'] = measure_unit + measure_data['file_id'] = file_id + + data.append(measure_data) + + # 指标数据写入指标解析过程表,用于前端展示 + content = f"{measure_name}:{measure_value}" + data_to_insert = (file_id, table_num, content) + cursor.execute(insert_query, data_to_insert) + conn.commit() + + else: + pass#print(f"数据值的格式错误:{measure_value}。或者字段名不在名单内{measure_name}") + res = client.insert( + collection_name="pdf_measure_v4", + data=data, + partition_name=partition_name + ) + logger.info(f"向量插入结束") + + except Exception as e: + logger.info(e) + +def runing_job(): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + select_query = ''' + SELECT * FROM report_check where status = 0 and isdel=0 + ''' + cursor.execute(select_query) + records = cursor.fetchall() + if(len(records)) > 1: + return True + return False + +def insert_pdf_parse_process(parser_info,conn,cursor): + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO pdf_parse_process + (file_id, page_num, page_count, content, type) + VALUES (%s, %s, %s, %s, %s) + ''' + file_id = parser_info['file_id'] + page_num = int(parser_info['page_num']) + page_count = int(parser_info['page_count']) + content = json.dumps(parser_info['content'], ensure_ascii=False) + type = parser_info['type'] + data_to_insert = (file_id, page_num, page_count, content, type) + cursor.execute(insert_query, data_to_insert) + conn.commit() + + +def delete_MYSQL_DB_APP(file_id): + conn = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + try: + truncate_query = [ + "delete from ori_measure_list where file_id = %s;", + "delete from measure_list where file_id = %s;", + "delete from check_measure_list where file_id = %s;", + "delete from check_measure_detail_list where file_id = %s;", + "delete from measure_parse_process where file_id = %s;", + "delete from measure_parser_info where file_id = %s;", + "delete from pdf_parse_process where file_id = %s;", + "delete from table_unit_info where file_id = %s;", + ] + #file_id = file_id + for truncate in truncate_query: + cursor.execute(truncate,(file_id,)) + conn.commit() + except Exception as e: + logger.info(f'删除失败,原因是{e}') + +def delete_MYSQL_DB(file_id): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + try: + truncate_query = [ + + "delete from measure_list where file_id = %s;", + "delete from check_measure_list where file_id = %s;", + "delete from check_measure_detail_list where file_id = %s;", + "delete from measure_parse_process where file_id = %s;", + "delete from measure_parser_info where file_id = %s;", + "delete from pdf_parse_process where file_id = %s;", + "delete from table_unit_info where file_id = %s;", + ] + #file_id = file_id + for truncate in truncate_query: + cursor.execute(truncate,(file_id,)) + conn.commit() + except Exception as e: + logger.info(f'删除失败,原因是{e}') + +def insert_pdf_text_info(table_info,conn,cursor): + + insert_query = ''' + INSERT INTO pdf_text_info + (file_id, page_num, text) + VALUES (%s, %s, %s) + ''' + file_id = table_info['file_id'] + page_num = table_info['page_num'] + text = table_info['text'] + data_to_insert = (file_id, page_num, text) + cursor.execute(insert_query, data_to_insert) + conn.commit() + + +def process_time(file_id,type,time,start_time,end_time): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + time = round(time, 2) + start_time = datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S') + end_time = datetime.fromtimestamp(end_time).strftime('%Y-%m-%d %H:%M:%S') + insert_query = ''' + insert into pdf_process_time + (file_id,type,time,start_time,end_time) + values (%s, %s, %s,%s,%s) + ''' + data_insert = (file_id,type,time,start_time,end_time) + cursor.execute(insert_query,data_insert) + conn.commit() + +def batch_insert_page_text_nocheck(table_info, conn, cursor): + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + text_lines = table_info['text'] + insert_query = ''' + INSERT INTO pdf_text_info + (file_id, page_num, text) + VALUES (%s, %s, %s) + ''' + data_to_insert = [(file_id, page_num, text) for text in text_lines] + cursor.executemany(insert_query, data_to_insert) + conn.commit() + +def batch_insert_page_text(table_info, conn, cursor): + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + text_lines = table_info['text'] + + # 1. 检查表是否为空 + check_if_empty_query = f"SELECT COUNT(*) FROM pdf_text_info where file_id = '{file_id}' and page_num = {page_num}" + cursor.execute(check_if_empty_query) + is_table_empty = cursor.fetchone()[0] == 0 + + if is_table_empty: + # 表为空,直接插入数据 + insert_query = ''' + INSERT INTO pdf_text_info + (file_id, page_num, text) + VALUES (%s, %s, %s) + ''' + data_to_insert = [(file_id, page_num, text) for text in text_lines] + cursor.executemany(insert_query, data_to_insert) + else: + pass + conn.commit() + +def file_type_check(file_id): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + try: + select_query = ''' + SELECT report_type FROM report_check WHERE id = %s + ''' + cursor.execute(select_query, (file_id,)) + record = cursor.fetchone() + if record and record[0] == 5: + return True + return False + finally: + cursor.close() + conn.close() + +def file_type_check_v2(file_id): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + try: + select_query = ''' + SELECT report_type FROM report_check WHERE id = %s + ''' + cursor.execute(select_query, (file_id,)) + record = cursor.fetchone() + return record[0] + # if record and == 5: + # return True + # return False + finally: + cursor.close() + conn.close() + +def pdf_title_insert_mysql(file_id,title_array): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + for item in title_array: + # 注意这里的缩进,它是循环体的一部分 + cursor.execute("INSERT INTO pdf_title_info (file_id,title, page_num, depth) VALUES (%s,%s, %s, %s)", + (file_id,item['title'], item['page_num'], item['depth'])) + conn.commit() + cursor.close() + conn.close() + +def get_file_info_from_mysql(file_id): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + #cursor = conn.cursor(buffered=True) + cursor = conn.cursor(dictionary=True) + select_query = """ + SELECT title, page_num, depth + FROM pdf_title_info + WHERE file_id = %s + """ + + cursor.execute(select_query, (file_id,)) + result = cursor.fetchall() + cursor.close() + conn.close() + return result diff --git a/zzb_data_prod/delete_pdf.py b/zzb_data_prod/delete_pdf.py new file mode 100644 index 0000000..a85e6e6 --- /dev/null +++ b/zzb_data_prod/delete_pdf.py @@ -0,0 +1,84 @@ +#报错提示 +import paramiko +import time +import threading + +# 执行命令的函数 +def execute_commands_on_server(hostname, username, password, host): + try: + # 连接到服务器 + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + client.connect(hostname=hostname, username=username, password=password) + + # 执行命令 + shell = client.invoke_shell() + #启动docker + shell.send("cd /root/pdf_parser/pdf\n") + time.sleep(1) + shell.send("rm -f *.pdf\n") + time.sleep(10) + shell.send("rm -f *.PDF\n") + time.sleep(10) + # 读取输出 + output = shell.recv(2048).decode() + print(f"Output from {hostname}:\n{output}") + + except paramiko.SSHException as e: + print(f"SSH connection error with {hostname}: {e}") + + finally: + client.close() + +# 创建线程函数 +def thread_function(server): + execute_commands_on_server(server['hostname'], server['username'], server['password'], server['host']) + +# 服务器列表 +# servers = [ +# {'hostname': 'server1.example.com', 'username': 'user1', 'password': 'pass1', 'host': 'host1'}, +# {'hostname': 'server2.example.com', 'username': 'user2', 'password': 'pass2', 'host': 'host2'}, +# # 添加更多服务器 +# ] +servers = [ + #{'hostname': '124.70.129.232', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'测试服务器'}, + # {'hostname': '1.94.179.121', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器'},#废弃 + +#旧10台 + {'hostname': '113.44.72.157', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器1'}, + {'hostname': '1.94.101.237', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器2'}, + {'hostname': '123.60.16.225', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器3'}, + {'hostname': '124.71.157.162', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器4'}, + + {'hostname': '1.94.60.103', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器5'}, + {'hostname': '1.94.143.23', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器6'},#都往这里存 + {'hostname': '124.71.149.225', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器7'}, + {'hostname': '113.44.52.221', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器8'}, + {'hostname': '121.37.137.13', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器9'}, + {'hostname': '123.60.28.83', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器10'}, +#新10台 + {'hostname': '192.168.0.19', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器1'}, + {'hostname': '192.168.0.53', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器2'}, + {'hostname': '192.168.0.150', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器3'}, + {'hostname': '192.168.0.210', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器4'}, + + {'hostname': '192.168.0.129', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器5'}, + {'hostname': '192.168.0.24', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器6'}, + {'hostname': '192.168.0.250', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器7'}, + {'hostname': '192.168.0.162', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器8'}, + {'hostname': '192.168.0.86', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器9'}, + {'hostname': '192.168.0.88', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器10'}, +] + +# 创建并启动线程 +threads = [] +for server in servers: + thread = threading.Thread(target=thread_function, args=(server,)) + threads.append(thread) + thread.start() + +# 等待所有线程完成 +for thread in threads: + thread.join() + +print("All commands executed.") diff --git a/zzb_data_prod/excel.py b/zzb_data_prod/excel.py new file mode 100644 index 0000000..e497120 --- /dev/null +++ b/zzb_data_prod/excel.py @@ -0,0 +1,121 @@ +import pandas as pd +import json +import utils +from config import MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB +import mysql.connector + +# 读取 Excel 文件 +df = pd.read_excel('/Users/zhengfei/Desktop/ttt.xlsx', header=0) + +# 将 DataFrame 转换为字典列表 +data_list = df.to_dict(orient='records') + +period_exra_arr =['当期:本期,本报告期,报告期,报告期内,本年度,本期发生额,2023年,2023年全年,2023年金额','上年同期:上期,上年度,2022年,2022年全年,2022年金额','前年同期:2021年,2021年全年,2021年金额','同比变动:同比增减,同比上升,同比下降,变化幅度,变动比例,本期比上年同期增减,本年比上年增减','报告期末:本报告期末,期末,期末数,期末金额,2023年年末,2023年12月31日','年初至报告期末:上年年末,上年末,2022年年末,2022年12月31日','报告期初:期初,期初数,期初金额,2023年1月1日','当期第一季度:第一季度,1-3月,第一季度(1-3月),2023年第一季度','当期第二季度:第二季度,4-6月,第二季度(4-6月),2023年第二季度','当期第三季度:第三季度,7-9月,第三季度(7-9月),2023年第三季度','当期第四季度:第四季度,10-12月,第四季度(10-12月),2023年第四季度'] + +year = 2023 + +conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB +) + +# 创建一个cursor对象来执行SQL语句 +cursor = conn.cursor() + +# insert_query = ''' +# INSERT INTO measure_create_config +# (config_id, meta_measure, same_mean_measure, measure_period, change_type, black_list) +# VALUES (%s, %s, %s, %s, %s, %s) +# ''' + +# for data in data_list: +# show_measure = str(data['指标']) +# same_mean_measure = str(data['同义表述']) +# period_measure = str(data['周期']) +# change_measure = str(data['变动']) +# black_list = str(data['黑名单词']) +# config_id = utils.get_md5(show_measure) +# insert_query_data = (config_id, show_measure, same_mean_measure, period_measure, change_measure, black_list) +# cursor.execute(insert_query, insert_query_data) +# conn.commit() + +# 读取 Excel 文件 +# df_period = pd.read_excel('/Users/zhengfei/Desktop/period.xlsx', header=0) + +# # 将 DataFrame 转换为字典列表 +# period_list = df_period.to_dict(orient='records') + +# period_insert_query = ''' +# INSERT INTO measure_create_period +# (period_name, same_mean_period) +# VALUES (%s, %s) +# ''' + +# for data in period_list: +# period_name = str(data['标准表述']) +# same_mean_period = str(data['同义表述']) + +# insert_query_data = (period_name, same_mean_period) +# cursor.execute(period_insert_query, insert_query_data) +# conn.commit() + +data_query = ''' + SELECT * FROM measure_create_config where delete_status = 0 + ''' +period_query = ''' + SELECT * FROM measure_create_period + ''' + +cursor.execute(data_query) +data_list = cursor.fetchall() + +cursor.execute(period_query) +period_list = cursor.fetchall() + +for data in data_list: + config_id = data[0] + show_measure = data[1] + same_mean_measure = data[2] + period_measure = data[3] + change_measure = data[4] + same_mean_measure_arr = [] + period_measure_arr = [] + change_measure_arr = [] + if same_mean_measure != 'nan' : + same_mean_measure_arr = same_mean_measure.split(',') + + if period_measure != 'nan' : + period_measure_arr = period_measure.split(',') + if change_measure != 'nan' : + change_measure_arr = change_measure.split(',') + + for c in change_measure_arr: + period_measure_arr.append(c) + + for x in period_measure_arr: + if x in change_measure_arr: + show_name = show_measure+x + else: + show_name = x+show_measure + for y in same_mean_measure_arr: + if x in change_measure: + parser_name = y+x + else: + parser_name = x+y + + print(f'{show_name},{parser_name}') + for p in period_list: + period_exra_name = p[0] + period_exra_value = p[1] + if x.find(period_exra_name) != -1: + for v in period_exra_value.split(','): + if x in change_measure: + parser_name = y + x.replace(period_exra_name, v) + else: + parser_name = x.replace(period_exra_name, v) + y + print(f'{show_name},{parser_name}') + +cursor.close() +conn.close() \ No newline at end of file diff --git a/zzb_data_prod/insert_redis.py b/zzb_data_prod/insert_redis.py new file mode 100644 index 0000000..16bf992 --- /dev/null +++ b/zzb_data_prod/insert_redis.py @@ -0,0 +1,246 @@ +import pandas as pd +import mysql.connector +import utils +#from config import MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB +import re +import redis + +def process_excel_and_db(input_excel_path1, input_excel_path2, output_file_path): + # 读取第一个 Excel 文件 + df = pd.read_excel(input_excel_path1, sheet_name='Sheet2', header=0)#对应ttt表 + # 将 DataFrame 转换为字典列表 + data_list = df.to_dict(orient='records') + + # 连接到 MySQL 数据库 + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + cursor = conn.cursor() + + # 插入数据到 measure_create_config 表 + insert_query = ''' + INSERT INTO measure_create_config + (config_id, meta_measure, same_mean_measure, measure_period, change_type, black_list) + VALUES (%s, %s, %s, %s, %s, %s) + ''' + for data in data_list: + show_measure = str(data['指标']) + same_mean_measure = str(data['同义表述']) + period_measure = str(data['周期']) + change_measure = str(data['变动']) + black_list = str(data['黑名单词']) + config_id = utils.get_md5(show_measure) + insert_query_data = (config_id, show_measure, same_mean_measure, period_measure, change_measure, black_list) + cursor.execute(insert_query, insert_query_data) + conn.commit() + + # 读取第二个 Excel 文件 + df_period = pd.read_excel(input_excel_path2, sheet_name='Sheet2', header=0)#对应周期表 + # 将 DataFrame 转换为字典列表 + period_list = df_period.to_dict(orient='records') + + # 插入数据到 measure_create_period 表 + period_insert_query = ''' + INSERT INTO measure_create_period + (period_name, same_mean_period) + VALUES (%s, %s) + ''' + for data in period_list: + period_name = str(data['标准表述']) + same_mean_period = str(data['同义表述']) + insert_query_data = (period_name, same_mean_period) + cursor.execute(period_insert_query, insert_query_data) + conn.commit() + + # 查询数据库 + data_query = ''' + SELECT * FROM measure_create_config WHERE delete_status = 0 + ''' + period_query = ''' + SELECT * FROM measure_create_period + ''' + + cursor.execute(data_query) + data_list = cursor.fetchall() + + cursor.execute(period_query) + period_list = cursor.fetchall() + + # 输出到文件 + with open(output_file_path, 'w', encoding='utf-8') as file: + for data in data_list: + config_id = data[0] + show_measure = data[1] + same_mean_measure = data[2] + period_measure = data[3] + change_measure = data[4] + same_mean_measure_arr = [] + period_measure_arr = [] + change_measure_arr = [] + + if same_mean_measure != 'nan': + same_mean_measure_arr = same_mean_measure.split(',') + same_mean_measure_arr.append(show_measure) + if period_measure != 'nan': + period_measure_arr = period_measure.split(',') + if change_measure != 'nan': + change_measure_arr = change_measure.split(',') + + for c in change_measure_arr: + period_measure_arr.append(c) + + for x in period_measure_arr: + if x in change_measure_arr: + show_name = show_measure + x + else: + show_name = x + show_measure + for y in same_mean_measure_arr: + if x in change_measure: + parser_name = y + x + else: + parser_name = x + y + + file.write(f'{show_name},{parser_name}\n') + + for p in period_list: + period_exra_name = p[0] + period_exra_value = p[1] + if period_exra_name in x: + for v in period_exra_value.split(','): + if x in change_measure: + parser_name = y + x.replace(period_exra_name, v) + else: + parser_name = x.replace(period_exra_name, v) + y + file.write(f'{show_name},{parser_name}\n') + + cursor.close() + conn.close() + + +# 根据老指标配置表生成新指标配置表 +def create_new_config(conn, cursor, table_name,old_year,new_year): + + select_query = f''' + SELECT measure_id, measure_name,ori_measure_id,ori_measure_name,delete_status,measure_vector,distance,year + FROM {table_name} + WHERE year = '{old_year}' + ''' + cursor.execute(select_query) + data_list = cursor.fetchall() + + insert_query = f''' + INSERT INTO {table_name} + (measure_id, measure_name,ori_measure_id,ori_measure_name,delete_status,measure_vector,distance, year) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s) + ''' + for data in data_list: + ori_measure_name = data[3] + if re.match(r'^\d{4}',ori_measure_name): + year = int(re.match(r'^\d{4}',ori_measure_name).group(0)) + year += 1 + ori_measure_name = str(year) + ori_measure_name[4:] + insert_data = (data[0],data[1],data[2],ori_measure_name,data[4],data[5],data[6],new_year) + cursor.execute(insert_query, insert_data) + conn.commit() + +def measure_config_to_db(conn, cursor, table_name): + year_list = ["2021","2022","2023","2024","2025"] + for year in year_list: + insert_query = f''' + INSERT INTO {table_name} + (measure_id, measure_name, ori_measure_id, ori_measure_name,delete_status,distance,year) + VALUES (%s, %s, %s, %s,%s,%s,%s) + ''' + check_query = f''' + SELECT ori_measure_id FROM {table_name} + WHERE year = '{year}' + ''' + # 新增指标 + lines = [ + f"当期营业收入,{year}年第一季度营业收入", + f"当期归母净利润,{year}年第一季度归母净利润", + f"当期扣非净利润,{year}年第一季度扣非净利润", + f"当期经营活动现金流净额,{year}年第一季度经营活动现金流净额", + f"当期筹资活动现金流净额,{year}年第一季度筹资活动现金流净额", + f"当期投资活动现金流净额,{year}年第一季度投资活动现金流净额", + f"当期非经常性损益,{year}年第一季度非经常性损益", + f"当期基本每股收益,{year}年第一季度基本每股收益", + f"当期稀释每股收益,{year}年第一季度稀释每股收益", + f"当期加权平均净资产收益率,{year}年第一季度加权平均净资产收益率", + f"当期扣非加权平均净资产收益率,{year}年第一季度扣非加权平均净资产收益率", + f"当期营业成本 ,{year}年第一季度营业成本", + f"当期销售费用,{year}年第一季度销售费用", + f"当期管理费用,{year}年第一季度管理费用", + f"当期财务费用,{year}年第一季度财务费用", + f"当期研发费用,{year}年第一季度研发费用"] + # 打印每一行 + for line in lines: + config_list = line.strip().split(',') + measure = config_list[0] + ori_measure = config_list[1] + ori_measure_id = utils.get_md5(ori_measure) + + # 判断数据库中是否有数据 + cursor.execute(check_query) + check_records = cursor.fetchall() + if any(record[0] == ori_measure_id for record in check_records): + continue + + data_to_insert = (utils.get_md5(measure), measure, ori_measure_id, ori_measure,0,0.94,year) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def insert_measure_vector(conn,cursor,table_name): + from config import REDIS_HOST,REDIS_PASSWORD,REDIS_PORT + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6)# 192.168.0.172 #测试123.60.153.169 + # 执行SQL语句,更新数据 + select_query = f''' + SELECT ori_measure_id,ori_measure_name FROM {table_name} + ''' + cursor.execute(select_query) + records = cursor.fetchall() + print(f"总计{len(records)}条数据") + for record in records: + if redis_client.hexists('measure_config', record[0]): + measure_vector = redis_client.hget('measure_config', record[0]) + else: + print('新增指标',record[1]) + vector_obj = utils.embed_with_str(record[1]) + measure_vector = str(vector_obj.output["embeddings"][0]["embedding"]) + + redis_client.hset('measure_config', record[0], measure_vector) + redis_client.close() + conn.close() +#from config import MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB +if __name__ == "__main__": + #需要先清空本地数据库的 measure_create_config 和 measure_create_period 表 + + # process_excel_and_db( + # 'F:\\11_pdf\\ttt_1.xlsx',#ttt文件 + # 'F:\\11_pdf\\period_1.xlsx',#period文件 + # 'F:\\11_pdf\\out_2022_new_year.txt'#输出文件 + # ) + from config import MYSQL_HOST_APP, MYSQL_USER_APP, MYSQL_PASSWORD_APP, MYSQL_DB_APP + conn = mysql.connector.connect( + host=MYSQL_HOST_APP, + user=MYSQL_USER_APP, + password=MYSQL_PASSWORD_APP, + database=MYSQL_DB_APP + ) + cursor = conn.cursor() + #file_path = r'F:\\11_pdf\\out_2022_new_year.txt' + + + + # 更新第一季度的measure_vector + table_name = 'measure_config_first_quarter' + # 写入mysql + measure_config_to_db(conn, cursor, table_name) + # create_new_config(conn, cursor, table_name,'2024','2025') + # 插入redies + insert_measure_vector(conn,cursor,table_name) + + diff --git a/zzb_data_prod/llm_service.py b/zzb_data_prod/llm_service.py new file mode 100644 index 0000000..632a3a5 --- /dev/null +++ b/zzb_data_prod/llm_service.py @@ -0,0 +1,98 @@ +#coding=utf-8 + +import random +from http import HTTPStatus +from dashscope import Generation +from datetime import datetime + +# 文本和表格数据给大模型,返回大模型抽取原始指标列表 +def get_measure_from_llm(user_prompt): + """ + :return: 文本和表格数据给大模型,返回大模型抽取原始指标列表 + """ + llm_measure_list = [] + system_prompt = ''' + 你是一个优秀的金融分析师,从给定的数据报告中自动提取以下关键财务指标。指标包括: + 2023年营业收入 + 2022年营业收入 + 2021年营业收入 + 2023年第一季度营业收入 + 2023年第二季度营业收入 + 2023年第三季度营业收入 + 2023年第四季度营业收入 + 营业收入同比变动 + 2023年归母净利润 + 2022年归母净利润 + 2021年归母净利润 + 2023年第一季度归母净利润 + 2023年第二季度归母净利润 + 2023年第三季度归母净利润 + 2023年第四季度归母净利润 + 归母净利润同比变动 + 2023年扣非净利润 + 2022年扣非净利润 + 2021年扣非净利润 + 2023年第一季度扣非净利润 + 2023年第二季度扣非净利润 + 2023年第三季度扣非净利润 + 2023年第四季度扣非净利润 + 扣非净利润同比变动 + 2023年经营活动现金流净额 + 2022年经营活动现金流净额 + 2021年经营活动现金流净额 + 经营活动现金流净额同比变动 + 2023年筹资活动现金流净额 + 2022年筹资活动现金流净额 + 2021年筹资活动现金流净额 + 2023年投资活动现金流净额 + 2022年投资活动现金流净额 + 2021年投资活动现金流净额 + 2023年非经常性损益 + 2022年非经常性损益 + 2021年非经常性损益 + 2023年基本每股收益 + 2022年基本每股收益 + 2021年基本每股收益 + 2023年稀释每股收益 + 2022年稀释每股收益 + 2021年稀释每股收益 + 2023年加权平均净资产收益率 + 2022年加权平均净资产收益率 + 2021年加权平均净资产收益率 + 2023年扣非加权平均净资产收益率 + 2022年扣非加权平均净资产收益率 + 2021年扣非加权平均净资产收益率 + <数据报告> + + + ''' + system_prompt = system_prompt.replace('', user_prompt) + response = Generation.call( + model='qwen-plus', + prompt = system_prompt, + seed=random.randint(1, 10000), + top_p=0.8, + result_format='message', + enable_search=False, + max_tokens=1500, + temperature=0.85, + repetition_penalty=1.0 + ) + if response.status_code == HTTPStatus.OK: + result = response['output']['choices'][0]['message']['content'] + llm_measure_list = result.split('\n') + return llm_measure_list + else: + print('Request id: %s, Status code: %s, error code: %s, error message: %s' % ( + response.request_id, response.status_code, + response.code, response.message + )) + + return "llm_error" + +if __name__ == '__main__': + user_prompt = ''' + 二、 经营情况回顾 (一) 经营计划 2023 年,在国际环境复杂多变以及全球经济依旧下行的形势下,公司严格按照既定发展战略和经营计划,狠抓落实,迎难而上,业务经营整体保持稳定,如期完成全年既定经营目标。在全体职员的共同努力下,公司的营业收入、净利润等各项指标再创历史新高,营业收入较上年同期实现15.43%的增长,归属于上市公司股东的净利润较上年同期实现 26.47%的增长。 1、财务状况 报告期末,公司资产总额为 1,473,271,310.23 元,增幅为 19.17%,主要系:一方面随着销售规模的不断增长,公司应收账款及合同资产等流动资产增幅较大,另一方面,为解决基于销售规模扩大引致的产能跟不上的瓶颈,公司上马扩产建设项目,导致在建工程、固定资产等非流动资产增幅较报告期末公司负债总额为 800,619,067.70 元,增幅为 26.12%,主要系随着销售规模增加、工程建设项目推进、固定资产购置等,公司采购数额大幅增加,公司通过银行借款等方式筹集资金,导致长短期贷款期末余额增幅较大。 报告期末,归属于上市公司股东的净资产为 670,316,339.35 元,增幅为 11.45%,主要系报告期内经营积累。 2、经营成果 报告期内,公司实现营业收入 1,003,535,799.51 元,增幅为 15.43%。主要系公司本期持续优化生产经营,大力推进产品研发和创新,抓住“双碳”政策以及“能效”提升产生的市场需求旺盛的有利时机,且随着公司北交所上市,产品品牌效应凸显,产能增加,订单获取能力增强,变压器及户外成套设备销售增长较多。 营业成本为 810,779,075.89 元,增幅为 15.33%,主要系报告期内销售增长及主要原材料价格变动所致。归属于上市公司股东的净利润为 73,033,633.31 元,增幅为 26.47%,主要系:1)公司持续优化生产经营,大力推进产品研发和创新,抓住“双碳”政策以及“能效”提升产生的市场需求旺盛的有利时机,生产和销售均呈稳定增长;2)本期处置开源路 1-1 号土地及建筑物及其他附属物等,结转资产处置收益同比增加。 + ''' + measure_list = get_measure_from_llm(user_prompt) + print(measure_list) \ No newline at end of file diff --git a/zzb_data_prod/log_config.py b/zzb_data_prod/log_config.py new file mode 100644 index 0000000..8d1b177 --- /dev/null +++ b/zzb_data_prod/log_config.py @@ -0,0 +1,51 @@ +import logging +import os +from logging.handlers import RotatingFileHandler + +def setup_logging(): + # 创建logs目录(如果不存在) + log_dir = 'logs' + if not os.path.exists(log_dir): + os.makedirs(log_dir) + + # 配置根日志记录器 + root_logger = logging.getLogger() + + # 如果已经有handlers,先移除它们以防重复 + if root_logger.handlers: + for handler in root_logger.handlers[:]: + root_logger.removeHandler(handler) + + root_logger.setLevel(logging.INFO) + + # 创建格式化器 + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + # 创建文件处理器 + file_handler = RotatingFileHandler( + os.path.join(log_dir, 'app.log'), + maxBytes=10*1024*1024, # 10MB + backupCount=5 + ) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(formatter) + + # 创建控制台处理器 + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + console_handler.setFormatter(formatter) + + # 添加处理器到根日志记录器 + root_logger.addHandler(file_handler) + root_logger.addHandler(console_handler) + + # 设置propagate=False以防止日志消息向上传播 + for logger_name in logging.root.manager.loggerDict: + logger = logging.getLogger(logger_name) + logger.propagate = False + + return root_logger + +logger = setup_logging() \ No newline at end of file diff --git a/zzb_data_prod/main.py b/zzb_data_prod/main.py new file mode 100644 index 0000000..fae52fa --- /dev/null +++ b/zzb_data_prod/main.py @@ -0,0 +1,1134 @@ +import camelot +import re +from multiprocessing import Pool +import os, time, random +import json +from config import MILVUS_CLIENT,MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB,MEASURE_COUNT,MYSQL_HOST_APP,MYSQL_USER_APP,MYSQL_PASSWORD_APP,MYSQL_DB_APP +from datetime import datetime +# 读取PDF +import PyPDF2 +# 分析PDF的layout,提取文本 +from pdfminer.high_level import extract_pages +from pdfminer.layout import LTTextBoxHorizontal +import pdfplumber +import mysql.connector +import utils +from Mil_unit import create_partition_by_hour +import llm_service +import db_service +import pdf_title +import numpy as np +from multiprocessing import Process +from config import REDIS_HOST,REDIS_PORT,REDIS_PASSWORD +import redis +from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection,MilvusClient +from log_config import logger + +''' +已知发现问题: +1.表格和文本提取错误,表格和文本内容在同一页,文本在前表格在后的,文本数据提取不出来 +2.大模型抽取错,抽取2023年营业收入:主营业务收入、分产品的营业收入、变动比例被错误抽取 +3.表格中的指标被抽取成文本中 +4.大模型抽取指标时,语义完全不同的指标被放一起,考虑用向量相似度来判断 +''' + +# 数据处理流程 +# 1. get_table_range多进程获取所有表格及表格上下文,输出为一个完整的列表 +# 2. 单进程进行表格分页合并,输出一个新的表格对象数组 +# 3. 新表格对象数组多进程开始原来的解析指标流程 + + +STR_PATTERN = '营业收入|净利润|变动比例|损益|现金流量净额|现金净流量|现金流|每股收益|总资产|资产总额|收益率|货币资金|应收账款|存货|固定资产|在建工程|商誉|短期借款|应付账款|合同负债|长期借款|营业成本|销售费用|管理费用|财务费用|研发费用|研发投入|计入当期损益的政府补助' +PATTERN = '品牌类型|分门店|销售渠道|行业名称|产品名称|地区名称|子公司名称|业绩快报|调整情况说明|调整年初资产负债表|主要子公司|分部|母公司资产负债表|显示服务|渠道|商品类型|合同分类|会计政策变更|地区分类|研发项目名称|分类产品|表头不合规的表格|内部控制评价|关联方|国内地区|国外地区|销售区域|存货库龄|外币|逾期60天以上|欧元|英镑|(?<=\d)美元|\美元(?=\d)|日元' +MUILT_PATTERN = '调整前' +#unit_pattern = re.compile(r'单位[:|:]?(百万元|千万元|亿元|万元|千元|元)') +unit_pattern = re.compile(r'(单位|单元|人民币).{0,6}?(百万元|千万元|亿元|万元|千元|元).{0,3}?')#修改单位匹配规则,不限制冒号,只限制距离 +#获取指标的表头信息 +def get_col_num_info(array,row_num,col_num,x,y): + num_info="" + for j in range(col_num): + if len(str(array[x][j])) > 50: + continue + num_info += str(array[x][j]) + + return num_info.replace('%','') + +#获取指标的表头信息 +def get_row_num_info(array,row_num,col_num,x,y): + num_info="" + + for i in range(row_num): + if len(str(array[i][y])) > 50: + continue + num_info += str(array[i][y]) + + return num_info + +def table_converter(table): + table_string = '' + # 遍历表格的每一行 + for row_num in range(len(table)): + row = table[row_num] + # 从warp的文字删除线路断路器 + cleaned_row = [item.replace('\n', ' ') if item is not None and '\n' in item else 'None' if item is None else item for item in row] + # 将表格转换为字符串,注意'|'、'\n' + table_string+=(','.join(cleaned_row)) + # 删除最后一个换行符 + table_string = table_string[:-1] + return table_string +def safe_process_array(func, arr): + try: + return func(arr) + except Exception as e: + logger.info(f"这个函数出现了报错{func.__name__}: {e}") + return arr # 返回原数组以便继续后续处理 + +#单独针对三季报的资产负债表识别合并问题 + +def process_array(arr, years=['2022', '2023', '2024'], keyword='项目'): + # 确保 row 有足够的列来存储分割后的数据 + def ensure_columns(row, num_columns): + while len(row) < num_columns: + row.append('') + + def is_valid_header(header, years, keyword): + header_text = header.lower() # 转小写以提高匹配的鲁棒性 + return any(year in header_text for year in years) and keyword in header_text + + # 对字符串进行清理 + def clean_text(text): + # 去除“年”和“月”相邻的空格 + text = re.sub(r'\s*(年|月)\s*', r'\1', text) + # 去除“日”左侧相邻的空格 + text = re.sub(r'\s*日', '日', text) + return text + + # 将 numpy 数组转换为列表 + arr = arr.tolist() if isinstance(arr, np.ndarray) else arr + + if len(arr[0]) == 1 and is_valid_header(arr[0][0], years, keyword): + remaining_value = arr[0][0] + + # 清理字符串 + remaining_value = clean_text(remaining_value) + + parts = remaining_value.split() + + ensure_columns(arr[0], len(parts)) + for i in range(len(parts)): + arr[0][i] = parts[i] + + header_columns = len(arr[0]) + + for i in range(1, len(arr)): + if len(arr[i]) == 1: + remaining_value = arr[i][0] + parts = remaining_value.split() + if len(parts) > header_columns: + parts = parts[:header_columns] + ensure_columns(arr[i], header_columns) + for j in range(len(parts)): + arr[i][j] = parts[j] + # 如果分割出的值不足,填充空值 + if len(parts) < header_columns: + for j in range(len(parts), header_columns): + arr[i][j] = '' + + return arr +#三季报中针对性修改,本报告期和年初至报告期末的两个上年同期进行区分 +def process_array_with_annual_comparison(arr, keywords=['本报告期', '年初至报告期末', '上年同期']): + def contains_all_keywords(header, keywords): + return all(keyword in header for keyword in keywords) + + def split_and_replace_occurrences(header, target, replacement): + # 找到所有 target 出现的位置 + indices = [i for i, x in enumerate(header) if x == target] + if len(indices) > 1: + split_index = len(indices) // 2 + for i in range(split_index): + header[indices[i]] = replacement + return header + + # 将 numpy 数组转换为列表 + arr = arr.tolist() if isinstance(arr, np.ndarray) else arr + + if len(arr) > 0 and len(arr[0]) > 0: + first_row = arr[0] + + if contains_all_keywords(first_row, keywords): + # 将 "上年同期" 拆分并替换 + first_row = split_and_replace_occurrences(first_row, '上年同期', '三季报中无需识别的上年同期') + arr[0] = first_row + + return arr + + +#三季报的非经常损益的单独处理 +def process_array_with_grants(arr, keywords=['本报告期', '年初至报告期'], target='计入当期损益的政府补助', replacement='非经常性损益'): + # 检查第一行是否包含所有关键词 + def contains_all_keywords(header, keywords): + #return all(keyword in header for keyword in keywords) + return all(any(keyword in str(cell) for cell in header) for keyword in keywords) + + + # 检查第一列中是否存在目标文本 + def contains_target_in_first_column(arr, target): + return any(target in str(item[0]) for item in arr) + + # 替换第一列中的特定值 + def replace_in_first_column(arr, target, replacement): + for i in range(len(arr)): + if arr[i][0] == target: + + arr[i][0] = replacement + return arr + + # 将 numpy 数组转换为列表 + arr = arr.tolist() if isinstance(arr, np.ndarray) else arr + + if len(arr) > 0 and len(arr[0]) > 0: + first_row = arr[0] + + # 检查第一行和第一列的条件 + if contains_all_keywords(first_row, keywords) and contains_target_in_first_column(arr, target): + # 替换第一列中的 "合计" + arr = replace_in_first_column(arr, '合计', replacement) + + return arr + +def get_table_range(file_path, file_id, pages, tables_range): + + logger.info(f'Run task 解析表格--{pages} {os.getpid()}') + start = time.time() + + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + conn_app = mysql.connector.connect( + host= MYSQL_HOST_APP, + user= MYSQL_USER_APP, + password= MYSQL_PASSWORD_APP, + database= MYSQL_DB_APP + ) + cursor_app = conn_app.cursor(buffered=True) + + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + try: + tables = camelot.read_pdf(file_path, pages=pages, strip_text=',\n', copy_text=['v','h'],shift_text = ['l']) + for t in tables: + + top = t._bbox[3] + buttom = t._bbox[1] + page_num = int(t.page) + table_index = int(t.order) + arr = np.array(t.data) + + + if page_num != 0: + # 表格数据写入 + line_texts = [] + for lines in t.data: + for line in lines: + line_texts.append(line) + + db_service.batch_insert_page_text_nocheck({ + 'file_id': file_id, + 'page_num' : page_num, + 'text' : line_texts + },conn,cursor) + + arr = safe_process_array(process_array, arr) #部分资产负债表合并问题 + arr = safe_process_array(process_array_with_annual_comparison, arr) #复杂表格的优化"多个上年同期时处理" + arr = safe_process_array(process_array_with_grants, arr) #三季报的非经常损益 + if len(arr[0]) == 6 and arr[0][0]== "项目" and arr[0][1] == '' and '2022' in arr[0][2] and '2021' in arr[0][2]: + remaining_value = arr[0][2]#initial_value.replace("项目", "", 1) + split_index = len(remaining_value) // 2 + arr[0][1] = remaining_value[:split_index] + arr[0][2] = remaining_value[split_index:] + if len(arr[0]) == 3 and arr[0][0]== "项目" and arr[0][1] == '' and '2022' in arr[0][2] and '2023' in arr[0][2]: + remaining_value = arr[0][2]#initial_value.replace("项目", "", 1) + split_index = len(remaining_value) // 2 + arr[0][1] = remaining_value[:split_index] + arr[0][2] = remaining_value[split_index:] + if len(arr[0]) == 5 and arr[0][0]== "项目" and arr[0][2] == arr[0][4] and '同比' in arr[0][2] and arr[0][1] != arr[0][3]: + arr[0][2] = arr[0][1]+arr[0][2] + arr[0][4] = arr[0][3]+arr[0][4] + if len(arr[0]) == 4 and all(value == arr[0][0] for value in arr[0]) and all("项目" in arr[0][0] and "附注" in arr[0][0] for value in arr[0]): + initial_value = arr[0][0].replace(' ','') + project_value = "项目" + note_value = "附注" + remaining_value = initial_value.replace("项目", "", 1).replace("附注", "", 1) + split_index = len(remaining_value) // 2 + first_half = remaining_value[:split_index] + second_half = remaining_value[split_index:] + # 判断 "项目" 在 original_value 中的位置 + if "项目" in initial_value and first_half in initial_value and second_half in initial_value : + project_index = initial_value.index("项目") + year_index = initial_value.index(first_half) + year_index_2 = initial_value.index(second_half) + + # 判断 "项目" 是否在 first_half 的前面 + if project_index > year_index and project_index < year_index_2: + first_half, second_half = second_half, first_half + arr[0] = [project_value, note_value, first_half, second_half] + if len(arr[0]) == 3 and all(value == arr[0][0] for value in arr[0]) and all("项目" in arr[0][0] for value in arr[0]): + initial_value = arr[0][0] + project_value = "项目" + #note_value = "附注" + remaining_value = initial_value.replace("项目", "", 1).replace("(1-9 月) (1-9 月)","") + split_index = len(remaining_value) // 2 + first_half = remaining_value[:split_index] + second_half = remaining_value[split_index:] + arr[0] = [project_value, first_half, second_half] + #for i in range(len(arr[0])): + #if arr[0][i] == arr[1][i] and len(arr[0][i])<5: + #print(f'{arr[0][i]}') + #arr[1][i] = '' + #保留camelot中的空格,在这里依据空格进行手动表格拆分 + #for line in arr: + for line in arr: + if not line[0].replace('.', '', 1).isdigit() and any(line[i] == line[i+1] and ' ' in line[i] for i in range(1, len(line) - 1)): + for i in range(1, len(line) - 1): + if line[i] == line[i+1] and ' ' in line[i]: + split_value = line[i] + split_parts = split_value.split(' ', 1) # 使用 split 方法进行分割 + if len(split_parts) == 2: # 确保确实进行了分割 + first_half, second_half = split_parts + line[i] = first_half + line[i+1] = second_half + break + + #处理完之后保证arr中不再存在空格 + #arr = [[item.rieplace(' ', '') for item in line] for line in arr] + arr = np.char.replace(arr, ' ', '') + + #这里是防止出现表格左右拼接的情况 + first_row = arr[0] + if len(first_row) % 2 == 0 and all(cell.strip() for cell in first_row): + mid_point = len(first_row) // 2 + if np.array_equal(first_row[:mid_point], first_row[mid_point:]): + new_arr = [] + for i in range(mid_point): + new_row = np.concatenate([arr[:, i], arr[:, i + mid_point]]) + new_arr.append(new_row) + arr = np.array(new_arr).T + #这里开始对无效的表头进行处理 + try: + invalid_headers = ["上年年末余额"] + non_empty_values = [value for value in first_row if value]#要求就是首行除了空值外的值都必须是一致的 + if len(set(non_empty_values)) == 1 and non_empty_values[0] in invalid_headers: + arr[0] = ["表头不合规的表格"] * len(first_row) + except Exception as e: + print(f'在识别表头是否合规时出现了报错:{e}') + #这里是防止出现'2023年度2022年度'camelot识别错误 + if not arr[0][0].replace('.', '', 1).isdigit() and any(arr[0][i] == arr[0][i+1] and '2023' in arr[0][i] and '2022' in arr[0][i] for i in range(1, len(arr[0])-1)): + for i in range(1, len(arr[0])-1): + if arr[0][i] == arr[0][i+1] and '2023' in arr[0][i] and '2022' in arr[0][i]: + split_value = arr[0][i] + split_index = len(split_value) // 2 + first_half = split_value[:split_index] + second_half = split_value[split_index:] + arr[0][i] = first_half + arr[0][i+1] = second_half + break + #防止2023与2022同时出现 + if not arr[0][0].replace('.', '', 1).isdigit(): + # 遍历第一行的值 + for i in range(1, len(arr[0]) - 1): + # 检查相邻的两个值是否同时包含 '2023' 和 '2022'(且 '2023' 在 '2022' 之前) + if (('2023' in arr[0][i] and '2022' in arr[0][i+1]) and + (arr[0][i].index('2023') < arr[0][i+1].index('2022'))): + # 更新这两个值 + arr[0][i] = '2023年' + arr[0][i+1] = '2022年' + break + #这里开始对可能解析错误的值做判断: + for i, row in enumerate(arr): + if len(row) >= 4: + # 检查条件:第一列不为数字,第二列和第四列为空,第三列有三个小数点【三列的数字被识别到一起了】 + if (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 4 and len(row[2].rsplit('.', 1)[-1]) == 2) and (row[3] == ''): + split_values = row[2].split('.') + # 确保可以正确拆分成三个数值 + if len(split_values) == 4: + new_value1 = f"{split_values[0]}.{split_values[1][:2]}" + new_value2 = f"{split_values[1][2:]}.{split_values[2][:2]}" + new_value3 = f"{split_values[2][2:]}.{split_values[3]}" + row[1] = new_value1 + row[2] = new_value2 + row[3] = new_value3 + #检查条件:第一列不为数字,第二列第四列为空,第三列两个小数点,第五列两个小数点【两列的数字被识别到一起了】 + if len(row) >= 5 and (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 3) and (row[3] == '') and (len(row[4].split('.')) == 3) and len(row[2].rsplit('.', 1)[-1]) == 2 and len(row[4].rsplit('.', 1)[-1]) == 2: + split_value_3 = row[2].split('.') + split_value_5 = row[4].split('.') + + if len(split_value_3) == 3: + new_value2 = f"{split_value_3[0]}.{split_value_3[1][:2]}" + new_value3 = f"{split_value_3[1][2:]}.{split_value_3[2]}" + + if len(split_value_5) == 3: + new_value4 = f"{split_value_5[0]}.{split_value_5[1][:2]}" + new_value5 = f"{split_value_5[1][2:]}.{split_value_5[2]}" + + row[1] = new_value2 + row[2] = new_value3 + row[3] = new_value4 + row[4] = new_value5 + #检查条件:第一列不为数字,第二列为空,第三列有两个小数点,第四列为正常数字【两列的数字被识别到一起了】 + if len(row) >= 4 and (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 3) and len(row[2].rsplit('.', 1)[-1]) == 2 and (row[3].replace('-', '', 1).replace('.', '', 1).isdigit()): + split_values = row[2].split('.') + if len(split_values) == 3: + new_value2 = f"{split_values[0]}.{split_values[1][:2]}" + new_value3 = f"{split_values[1][2:]}.{split_values[2]}" + row[1] = new_value2 + row[2] = new_value3 + #检查条件:第一列不位数字,后面有一列中的值存在“%”并且"%"不是结尾,就进行拆分 + if not row[0].replace('.', '', 1).isdigit(): + for i in range(1, len(row) - 1): + if row[i] == '' and '%' in row[i + 1] and len(row[i + 1].split('%')) == 2: + split_values = row[i + 1].split('%') + new_value1 = f"{split_values[0]}%" + new_value2 = f"{split_values[1]}" + row[i] = new_value1 + row[i + 1] = new_value2 + break + + + new_data = arr.tolist()#用于后面保存到数据库中 + new_data = utils.check_black_table_list(new_data) + rows, cols = arr.shape + if rows == 1 and cols == 1: + continue + arr_str = ''.join([''.join(map(str, row)) for row in arr]) + + #过滤掉不包含需抽取指标表格的文本 + matches = re.findall(STR_PATTERN, arr_str) + pattern = re.findall(PATTERN,arr_str) + muilt_pattern = re.findall(MUILT_PATTERN,arr_str) + if len(matches) > 0 and len(pattern) == 0 and len(muilt_pattern)<5: + + if not tables_range.get(page_num): + tables_range[page_num] = [] + + tables_range[page_num].append({ + 'top' : top, + 'buttom' : buttom, + 'table_index' : table_index, + 'page_num' : page_num, + }) + + db_service.insert_pdf_parse_process({ + 'file_id': file_id, + 'page_num' : page_num, + 'page_count' : 100, + 'type' : 'parse_table', + 'content':{ + 'top' : top, + 'buttom' : buttom, + 'page_num' : page_num, + 'table_index' : table_index, + "type" : "table", + "data" : new_data, + 'sort_num' : page_num*1000 - top + }},conn_app,cursor_app) + + + + except Exception as e: + logger.info(f'camelot解析表格时出现了{e}') + + + + get_text_content(file_path, file_id, tables_range, pages, conn, cursor, redis_client, conn_app, cursor_app) + + cursor.close() + conn.close() + cursor_app.close() + conn_app.close() + redis_client.close() + + end = time.time() + logger.info('Task %s runs %0.2f seconds.' % (f'解析表格{pages}', (end - start))) + +def text_in_table(top, tables_range, page_num): + if tables_range.get(page_num): + for range in tables_range[page_num]: + if top < range['top'] and top > range['buttom']: + return True + return False + +def get_text_type(text: str): + text = re.sub(r"\s", "", text) + first_re = r'年度报告|季度报告' + page_number_pattern = re.compile(r'^\d+(/\d+)?$') + + if re.search(first_re, text.strip()): + return 'page_header' + + if page_number_pattern.match(text.strip()): + return 'page_footer' + + if len(text) < 20 and text.endswith('页'): + return 'page_footer' + + return 'text' + +# 读取pdf文件中文本内容,不包括表格 +def get_text_content(pdf_path,file_id,tables_range,pages,conn,cursor,redis_client, conn_app, cursor_app): + """ + :return: 返回pdf文件中文本内容,不包括表格 + """ + #print(f'tables_range 的值为{tables_range}') + #print('----------------') + #print(pages) + + page_start = pages.split('-')[0] + page_end = pages.split('-')[1] + logger.info(f'pages的值为{pages}') + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + select_pdf_text_check = f"""select count(1) from pdf_text_info where file_id = {file_id}""" + #check_if_empty_query = f"SELECT COUNT(*) FROM pdf_text_info where file_id = {file_id} and page_num = {page_num}" + cursor.execute(select_pdf_text_check) + is_empty = cursor.fetchone()[0] == 0 + query = "SELECT title_list,button_list FROM table_title_list WHERE report_year = %s" + cursor_dict = conn.cursor(dictionary=True) + cursor_dict.execute(query, (report_year,)) + result = cursor_dict.fetchone() + title_list = result['title_list'] + button_list = result['button_list'] + + + # 我们从PDF中提取页面,page_numbers=[4,5,6] + for pagenum, page in enumerate(extract_pages(pdf_path)): + try: + if pagenum+1 < int(page_start) or pagenum+1 > int(page_end): + continue + #更新redis已解析页码 + if not redis_client.exists(f'parsed_page_count_{file_id}'): + redis_client.set(f'parsed_page_count_{file_id}', 0) + + redis_client.incr(f'parsed_page_count_{file_id}') + + # 找到所有的元素 + page_elements = [(element.y1, element) for element in page._objs] + # 查找组成页面的元素 + line_texts = [] + #if not utils.pdf_text_flag(line_text): + # line_texts.append(line_text) + for i,component in enumerate(page_elements): + # 提取页面布局的元素 + element = component[1] + # 检查该元素是否为文本元素 + if isinstance(element, LTTextBoxHorizontal): + # 检查文本是否出现在表中 + line_text = element.get_text().replace('\n','') + line_text = re.sub(r"\s", "", line_text) + + #提取符合要求的文本写入pdf_text_info,用于文本书写错误识别 + # if not utils.pdf_text_flag(line_text): + line_texts.append(line_text) + #db_service.insert_pdf_text_info({ + # 'file_id': file_id, + # 'page_num' : pagenum+1, + # 'text' : line_text + # },conn,cursor) + + element_top = element.bbox[3] + element_buttom = element.bbox[1] + out_table_list = ['母公司现金流量表','母公司利润表','母公司资产负债表','子公司'] + + # 检查该文本是否出现在表中 + if tables_range.get(pagenum+1): + for range in tables_range[pagenum+1]: + if element_top < range['top'] and element_top > range['buttom']:#总是有母公司表被识别到上一个表里面: + pass + else: + if element_top - range['top'] < 150 and element_top - range['top'] > 5 and (not text_in_table(element_top, tables_range, pagenum+1) or any(word in line_text for word in out_table_list)):#or any(word in line_text for word in out_table_list) + text_type = get_text_type(line_text) + if text_type in ('page_header','page_footer'): + break + if pagenum ==44: + logger.info(f'line_text在第44页的值有{line_text}') + #这个对一整页都有用,会去掉很多正确的表 + # 记录需要过滤掉的页码 + if len(re.findall('母公司|现金流量表补充', line_text)) > 0 : + db_service.insert_measure_parser_info({ + 'file_id': file_id, + 'content': pagenum+1, + 'type': 'parent_com', + },conn_app,cursor_app) + + # 保存每个表格上方小范围区域的文字,这部分内容包含了表格的标题和指标单位 + table_info = {} + + if utils.check_table_title_black_list(line_text,title_list): + + db_service.insert_measure_parser_info({ + 'file_id': file_id, + 'content': f"{range['page_num']}_{range['table_index']}", + 'type': 'table_index', + },conn_app,cursor_app) + if utils.check_table_title_black_list_measure(line_text): + db_service.insert_measure_parser_info_measure({ + 'file_id': file_id, + 'content': f"{range['page_num']}_{range['table_index']}", + 'type': 'measure_index', + },conn_app,cursor_app,line_text) + + if re.findall(unit_pattern, line_text): + range['unit_flag'] = True + table_info = get_table_unit_info(file_id,line_text,range['page_num'],range['table_index']) + db_service.insert_table_unit_info_v1(table_info,conn,cursor) + # if utils.check_table_title_black_list(line_text): + # db_service.insert_measure_parser_info({ + # 'file_id': file_id, + # 'content': f"{range['page_num']}_{range['table_index']}", + # 'type': 'table_index', + # },conn,cursor) + else: + if len(line_text) <= 5 or len(re.findall('单位|适用', line_text)) > 0 : + pass + #else: + # table_info = get_table_text_info(file_id,line_text,range['page_num'],range['table_index']) + # db_service.insert_table_text_info(table_info,conn,cursor) + #通过关键词黑名单匹配表格上方的文本区域,提取需要过滤的表格 + # if utils.check_table_title_black_list(line_text): + # db_service.insert_measure_parser_info({ + # 'file_id': file_id, + # 'content': f"{range['page_num']}_{range['table_index']}", + # 'type': 'table_index', + # },conn,cursor) + if utils.check_line_text(line_text): + + db_service.insert_pdf_parse_process({ + 'file_id': file_id, + 'page_num' : pagenum+1, + 'page_count' : 100, + 'type' : 'parse_table', + 'content':{ + 'top' : element_top, + 'buttom' : element_buttom, + 'page_num' : range['page_num'], + 'table_index' : range['table_index'], + "type" : text_type, + 'content' : line_text, + 'sort_num' : range['page_num']*1000 - element_top + }},conn_app,cursor_app) + + break + #处理母公司表格标题在页面底部,完整表格在下一页 + if element_buttom < 150 and not text_in_table(element_top, tables_range, pagenum+1): + text_type = get_text_type(line_text) + + if text_type == 'page_footer': + continue + + table_info = {} + # 记录需要过滤掉的页码 + if len(re.findall('母公司|现金流量表补充', line_text)) > 0: + logger.info(f'line_text{line_text}') + logger.info(f'pagenum{pagenum}') + db_service.insert_measure_parser_info({ + 'file_id': file_id, + 'content': pagenum+2, + 'type': 'parent_com', + },conn_app,cursor_app) + + #通过关键词黑名单匹配本页面末尾文字,如果出现 + if utils.check_table_title_black_list_button(line_text,button_list): + db_service.insert_measure_parser_info({ + 'file_id': file_id, + 'content': f"{pagenum+2}_1", + 'type': 'table_index', + },conn_app,cursor_app) + if utils.check_table_title_black_list_measure(line_text): + db_service.insert_measure_parser_info_measure({ + 'file_id': file_id, + 'content': f"{pagenum+2}_1", + 'type': 'measure_index', + },conn_app,cursor_app,line_text) + + if re.findall(unit_pattern, line_text): + table_info = get_table_unit_info(file_id,line_text,pagenum+2,1) + db_service.insert_table_unit_info(table_info,conn,cursor) + + if utils.check_line_text(line_text): + db_service.insert_pdf_parse_process({ + 'file_id': file_id, + 'page_num' : pagenum+1, + 'page_count' : 100, + 'type' : 'parse_table', + 'content':{ + 'top' : element_top, + 'buttom' : element_buttom, + 'page_num' : pagenum+1, + "type" : text_type, + 'content' : line_text, + 'sort_num' : (pagenum+1)*1000 - element_top + }},conn_app,cursor_app) + if is_empty: + db_service.batch_insert_page_text_nocheck({ + 'file_id': file_id, + 'page_num' : pagenum+1, + 'text' : line_texts + },conn,cursor) + #print('文本这里没有重跑') + else: + db_service.batch_insert_page_text({ + 'file_id': file_id, + 'page_num' : pagenum+1, + 'text' : line_texts + },conn,cursor) + except Exception as e: + logger.info(f'{pagenum}页处理异常') + logger.info(e) + + +def get_table_unit_info(file_id,line_text,page_num,table_index): + table_info = {} + table_info['file_id'] = file_id + match = unit_pattern.search(line_text) + if match: + unit = match.group(2) + table_info['unit'] = unit + + table_info['page_num'] = page_num + table_info['table_index'] = table_index + #print(table_info) + return table_info + + +def get_table_text_info(file_id,line_text,page_num,table_index): + table_info = {} + table_info['file_id'] = file_id + table_info['text_info'] = line_text + table_info['page_num'] = page_num + table_info['table_index'] = table_index + #print(table_info) + return table_info + +# 读取pdf中的表格,并将表格中指标和表头合并,eg: 2022年1季度营业收入为xxxxx +def get_table_measure(file_id, pdf_tables, record_range,partition_name,): + """ + :return: pdf中的表格,并将表格中指标和表头合并,eg: 2022年1季度营业收入为xxxxx + """ + try: + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + # 创建一个cursor对象来执行SQL语句 + cursor_app = conn_app.cursor(buffered=True) + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + client = MilvusClient( + uri=MILVUS_CLIENT, + ) + + logger.info('提取指标任务 %s (%s)...' % (record_range, os.getpid())) + start = time.time() + record_start = record_range.split('-')[0] + record_end = record_range.split('-')[1] + for index in range(int(record_start),int(record_end)): + t = pdf_tables[index] + measure_obj =[] + data_dict = {} + measure_list = [] + try: + arr = np.array(t['data']) + rows, cols = arr.shape + if rows == 1 and cols == 1: + continue + row_num , col_num = -1 , -1 + # 使用嵌套循环遍历数组,获取第一个数值位置 + for i in range(rows): + for j in range(cols): + if j == 0 or i == 0:#防止第一列识别出数字 + continue + measure_value_config = str(arr[i, j]).replace('(','').replace(')','') + + if re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', measure_value_config): + if j == cols-1: + row_num , col_num = i , j + break + elif (re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', measure_value_config) + or measure_value_config == '-'): + row_num , col_num = i , j + break + else: + continue + break + # 遍历数值二维数组,转成带语义的指标 + if row_num != -1 and col_num != -1: + for i in range(row_num,arr.shape[0]): + for j in range(col_num,arr.shape[1]): + measure_value = str(arr[i, j]).replace('%','').replace('(','-').replace(')','') + if measure_value == '-' or measure_value == '' or len(measure_value) > 20: + continue + else: + row_num_info = get_row_num_info(arr,row_num,col_num,i,j) + col_num_info = get_col_num_info(arr,row_num,col_num,i,j) + + #如果上表头为空则认为是被截断,除了研发投入特殊处理其它过滤 + if row_num_info in ('','-',')',')'): + continue + + #特殊处理非经常性损益合计和非经常性损益净额同时出现时保留净额 + if col_num_info == '非经常性损益合计': + continue + + if utils.check_pdf_measure_black_list(f"{col_num_info}{row_num_info}"): + continue + + #去掉没有周期的指标 + if utils.check_pdf_measure(f"{col_num_info}{row_num_info}"): + continue + + #判断上表头和左表头周期是否一致,不一致过滤 + row_period = utils.get_period_type_other(row_num_info, report_year) + col_period = utils.get_period_type_other(col_num_info, report_year) + if(row_period != col_period and row_period != 'c_n' and col_period != 'c_n'): + continue + units_mapping = { + "百万元": "百万元", + "千万元": "千万元", + "亿元": "亿元", + "万元": "万元", + "千元": "千元", + "元": "元", + "元/股": "元" + } + row_num_info = row_num_info.replace('%','增减') + #num_info = f"{col_num_info}{row_num_info}".replace('()','').replace('加:','').replace('减:','').replace('%','') + num_info = utils.get_clean_text(f"{row_num_info}{col_num_info}") + num_info_bak = utils.get_clean_text(f"{col_num_info}{row_num_info}") + measure_unit = '' + #"%": "同期增减" + combined_info = f"{row_num_info} {col_num_info}" + # for unit in units_mapping: + # if unit in row_num_info: + # measure_unit = units_mapping[unit] + # break + if utils.get_percent_flag(row_num_info) == '1': + measure_unit = '' + else: + for unit in units_mapping: + if re.search(rf'\(\s*{unit}(\s*人民币)?\s*\)|\(\s*{unit}(\s*人民币)?\s*\)', combined_info) or (re.search(rf'{unit}', combined_info) and any(re.search('单位', item) for item in arr[0])): + measure_unit = units_mapping[unit] + break + measure_list.append({ + 'measure_name': num_info, + 'measure_value': measure_value, + 'measure_unit':measure_unit, + }) + measure_list.append({ + 'measure_name': num_info_bak, + 'measure_value': measure_value, + 'measure_unit':measure_unit, + }) + + if not redis_client.exists(f'parsed_measure_count_{file_id}'): + redis_client.set(f'parsed_measure_count_{file_id}', 0) + + redis_client.incr(f'parsed_measure_count_{file_id}') + + + + if len(measure_list) > 0: + data_dict["measure_list"] = measure_list + data_dict["page_num"] = f"{str(t['page_num'])}_{str(t['table_index'])}" + data_dict['file_id'] = file_id + measure_obj.append(data_dict) + db_service.insert_measure_data_to_milvus(client,partition_name,measure_obj,cursor_app,conn_app) + except Exception as e: + logger.info(f"循环获取表格数据这里报错了,数据是{t['data']},位置在{index}") + logger.info(f"错误是:{e}") + end = time.time() + logger.info('提取指标 %s runs %0.2f seconds.' % (record_range, (end - start))) + except Exception as e: + logger.info(f'这个错误是{e},所在的位置是{record_start}-{record_end}') + record_start = record_range.split('-')[0] + record_end = record_range.split('-')[1] + for index in range(int(record_start),int(record_end)): + t = pdf_tables[index] + measure_obj =[] + data_dict = {} + measure_list = [] + try: + arr = np.array(t['data']) + except Exception as e: + logger.info(f'这个错误是{e}的arr的值是{arr}') + finally: + redis_client.close() + cursor.close() + conn.close() + cursor_app.close() + conn_app.close() + +#多进程任务分发,根据参数判断是调表格还是正文 +def dispatch_job(job_info): + try: + type = job_info['type'] + path = job_info['path'] + file_id = job_info['file_id'] + page_num = job_info['page_num'] + tables_range = job_info['tables_range'] + if type == 'table': + get_table_range(path, file_id, page_num, tables_range) + + except Exception as e: + logger.info(e) + +#指标归一化处理 + +def update_measure_data(file_id,file_path,parent_table_pages,partition_name): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + # #通过向量查询指标 + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + + # 创建一个cursor对象来执行SQL语句 + cursor_app = conn_app.cursor(buffered=True) + logger.info(f'目录黑名单为:{parent_table_pages}') + db_service.insert_table_measure_from_vector_async_process(cursor,parent_table_pages,file_id,file_path, partition_name) + + db_service.delete_MYSQL_DB_APP(file_id) + db_service.delete_MYSQL_DB(file_id) + + + # #指标归一化处理 + db_service.update_ori_measure(conn,cursor,file_id) + + cursor.close() + conn.close() + cursor_app.close() + conn_app.close() + + +# def merge_consecutive_arrays(word_info): +# merged_objects = [] +# temp_list = [] + +# for info_obj in word_info: +# try: +# if info_obj['type'] == 'table': +# # 如果对象是表格,将其元素添加到临时列表中 +# data = info_obj['data'] +# if not data: +# continue +# first_row = data[0] +# if all(re.search(r'[\u4e00-\u9fa5]', cell) for cell in first_row[1:]) and len(temp_list) == 0: +# temp_list.append(info_obj) +# elif all(re.search(r'[\u4e00-\u9fa5]', cell) for cell in first_row[1:]) and len(temp_list) > 0: +# merged_objects.append(temp_list) +# temp_list = [] +# temp_list.append(info_obj) +# elif not all(re.search(r'[\u4e00-\u9fa5]', cell) for cell in first_row[1:]) and len(temp_list) > 0: +# temp_data = temp_list[-1]['data'] +# temp_data = list(temp_data) +# for row in list(info_obj['data']): +# temp_data.append(row) +# info_obj['data'] = temp_data +# temp_list.clear() +# temp_list.append(info_obj) + + +# except Exception as e: + +# applog.error(f"解析数据错误: {e}") + +# if temp_list: +# merged_objects.append(temp_list) + +# return merged_objects + +def merge_consecutive_arrays(pdf_info): + merged_objects = [] + temp_array = {} + + for info_obj in pdf_info: + + try: + if info_obj['type'] == 'table': + # 如果对象是表格,将其元素添加到临时列表中 + if not temp_array.get('page_num'): + temp_array = info_obj + #else: + # temp_array['data'].extend(info_obj['data']) + elif len(temp_array['data'][0]) == len(info_obj['data'][0]): + temp_array['data'].extend(info_obj['data']) + else: + if temp_array: + # 将临时列表中的元素合并成一个数组,并添加到新的对象列表中 + merged_objects.append(temp_array) + temp_array = {} # 重置临时列表 + else: + # 如果对象不是表格,检查临时列表是否为空 + if temp_array: + # 将临时列表中的元素合并成一个数组,并添加到新的对象列表中 + merged_objects.append(temp_array) + temp_array = {} # 重置临时列表 + except Exception as e: + #print(info_obj) + logger.info(f"解析数据错误: {e}") + + if temp_array: + merged_objects.append(temp_array) + + return merged_objects + +def merge_consecutive_arrays_v1(pdf_info): + merged_objects = [] + temp_array = {} + + def is_same_dimension(data1, data2): + # 检查两个表的每行长度是否相同 + if len(data1) != len(data2): + return False + return all(len(row1) == len(row2) for row1, row2 in zip(data1, data2)) + + for info_obj in pdf_info: + try: + if info_obj['type'] == 'table': + if not temp_array: + # 如果临时列表为空,则初始化临时列表 + temp_array = info_obj + else: + # 检查当前表与临时列表中的表是否同维度 + if is_same_dimension(temp_array['data'], info_obj['data']): + # 如果是同维度,则合并数据 + temp_array['data'].extend(info_obj['data']) + else: + # 如果不是同维度,将现有临时列表添加到结果中,并重置临时列表 + merged_objects.append(temp_array) + temp_array = info_obj + else: + # 如果对象不是表格,检查临时列表是否非空 + if temp_array: + # 将临时列表中的元素合并成一个数组,并添加到新的对象列表中 + merged_objects.append(temp_array) + temp_array = {} # 重置临时列表 + except Exception as e: + logger.info(f"解析数据错误: {e}") + + # 循环结束后,检查临时列表是否非空,如果非空,则添加到结果中 + if temp_array: + merged_objects.append(temp_array) + + return merged_objects +def start_table_measure_job(file_id,partition_name): + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + # 创建一个cursor对象来执行SQL语句 + cursor_app = conn_app.cursor(buffered=True) + + select_process_query = ''' + select content from pdf_parse_process WHERE file_id = '{file_id}' and type='parse_table' + '''.format(file_id=file_id) + cursor_app.execute(select_process_query) + records = cursor_app.fetchall() + pdf_info = [] + + for record in records: + try: + pdf_info.append(eval(record[0])) + except Exception as e: + logger.info(f'文本报错{e}') + + sorted_pdf_info = sorted(pdf_info, key=lambda k: k['sort_num']) + pdf_tables = merge_consecutive_arrays(sorted_pdf_info) + + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + redis_client.set(f'measure_count_{file_id}', len(pdf_tables)) + + cursor_app.close() + conn_app.close() + redis_client.close() + + records_range_parts = utils.get_range(len(pdf_tables),MEASURE_COUNT) + logger.info(f'records_range_part识别页码的值为{records_range_parts}') + processes = [] + + + + for record_range in records_range_parts: + p = Process(target=get_table_measure, args=(file_id,pdf_tables,record_range,partition_name,)) + processes.append(p) + p.start() + + for p in processes: + p.join() + +if __name__ == "__main__": + + file_id = '1778' + page_num = 11 + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + + select_process_query = ''' + select content from pdf_parse_process WHERE file_id = '{file_id}' and type='parse_table' + and page_num in(41,42,43) + '''.format(file_id=file_id, page_num=page_num) + cursor.execute(select_process_query) + records = cursor.fetchall() + pdf_info = [] + for record in records: + pdf_info.append(eval(record[0])) + + sorted_pdf_info = sorted(pdf_info, key=lambda k: k['sort_num']) + pdf_tables = merge_consecutive_arrays(sorted_pdf_info) + + get_table_measure(file_id,pdf_tables,'0-2') + # sorted_pdf_info = sorted(pdf_info, key=lambda k: k['sort_num']) + + # pdf_tables = merge_consecutive_arrays(sorted_pdf_info) + # for table in pdf_tables: + # print(table)#修改测试 diff --git a/zzb_data_prod/measure_config_all.txt b/zzb_data_prod/measure_config_all.txt new file mode 100644 index 0000000..dc901d0 --- /dev/null +++ b/zzb_data_prod/measure_config_all.txt @@ -0,0 +1,2768 @@ +当期营业收入,当期营业收入 +当期营业收入,本期营业收入 +当期营业收入,本报告期营业收入 +当期营业收入,报告期营业收入 +当期营业收入,报告期内营业收入 +当期营业收入,本年度营业收入 +当期营业收入,本期金额营业收入 +当期营业收入,本期发生额营业收入 +当期营业收入,2023年营业收入 +当期营业收入,2023年全年营业收入 +当期营业收入,2023年金额营业收入 +当期营业收入,当期营业收入总额 +当期营业收入,本期营业收入总额 +当期营业收入,本报告期营业收入总额 +当期营业收入,报告期营业收入总额 +当期营业收入,报告期内营业收入总额 +当期营业收入,本年度营业收入总额 +当期营业收入,本期金额营业收入总额 +当期营业收入,本期发生额营业收入总额 +当期营业收入,2023年营业收入总额 +当期营业收入,2023年全年营业收入总额 +当期营业收入,2023年金额营业收入总额 +当期营业收入,当期营业收入金额 +当期营业收入,本期营业收入金额 +当期营业收入,本报告期营业收入金额 +当期营业收入,报告期营业收入金额 +当期营业收入,报告期内营业收入金额 +当期营业收入,本年度营业收入金额 +当期营业收入,本期金额营业收入金额 +当期营业收入,本期发生额营业收入金额 +当期营业收入,2023年营业收入金额 +当期营业收入,2023年全年营业收入金额 +当期营业收入,2023年金额营业收入金额 +当期营业收入,当期调整后营业收入 +当期营业收入,本期调整后营业收入 +当期营业收入,本报告期调整后营业收入 +当期营业收入,报告期调整后营业收入 +当期营业收入,报告期内调整后营业收入 +当期营业收入,本年度调整后营业收入 +当期营业收入,本期金额调整后营业收入 +当期营业收入,本期发生额调整后营业收入 +当期营业收入,2023年调整后营业收入 +当期营业收入,2023年全年调整后营业收入 +当期营业收入,2023年金额调整后营业收入 +上年同期营业收入,上年同期营业收入 +上年同期营业收入,上期营业收入 +上年同期营业收入,上期金额营业收入 +上年同期营业收入,上年营业收入 +上年同期营业收入,上年度营业收入 +上年同期营业收入,2022年营业收入 +上年同期营业收入,2022年全年营业收入 +上年同期营业收入,2022年金额营业收入 +上年同期营业收入,上年同期营业收入总额 +上年同期营业收入,上期营业收入总额 +上年同期营业收入,上期金额营业收入总额 +上年同期营业收入,上年营业收入总额 +上年同期营业收入,上年度营业收入总额 +上年同期营业收入,2022年营业收入总额 +上年同期营业收入,2022年全年营业收入总额 +上年同期营业收入,2022年金额营业收入总额 +上年同期营业收入,上年同期营业收入金额 +上年同期营业收入,上期营业收入金额 +上年同期营业收入,上期金额营业收入金额 +上年同期营业收入,上年营业收入金额 +上年同期营业收入,上年度营业收入金额 +上年同期营业收入,2022年营业收入金额 +上年同期营业收入,2022年全年营业收入金额 +上年同期营业收入,2022年金额营业收入金额 +上年同期营业收入,上年同期调整后营业收入 +上年同期营业收入,上期调整后营业收入 +上年同期营业收入,上期金额调整后营业收入 +上年同期营业收入,上年调整后营业收入 +上年同期营业收入,上年度调整后营业收入 +上年同期营业收入,2022年调整后营业收入 +上年同期营业收入,2022年全年调整后营业收入 +上年同期营业收入,2022年金额调整后营业收入 +前年同期营业收入,前年同期营业收入 +前年同期营业收入,2021年营业收入 +前年同期营业收入,2021年全年营业收入 +前年同期营业收入,2021年金额营业收入 +前年同期营业收入,前年同期营业收入总额 +前年同期营业收入,2021年营业收入总额 +前年同期营业收入,2021年全年营业收入总额 +前年同期营业收入,2021年金额营业收入总额 +前年同期营业收入,前年同期营业收入金额 +前年同期营业收入,2021年营业收入金额 +前年同期营业收入,2021年全年营业收入金额 +前年同期营业收入,2021年金额营业收入金额 +前年同期营业收入,前年同期调整后营业收入 +前年同期营业收入,2021年调整后营业收入 +前年同期营业收入,2021年全年调整后营业收入 +前年同期营业收入,2021年金额调整后营业收入 +当期第一季度营业收入,当期第一季度营业收入 +当期第一季度营业收入,本期第一季度营业收入 +当期第一季度营业收入,本报告期第一季度营业收入 +当期第一季度营业收入,报告期第一季度营业收入 +当期第一季度营业收入,报告期内第一季度营业收入 +当期第一季度营业收入,本年度第一季度营业收入 +当期第一季度营业收入,本期金额第一季度营业收入 +当期第一季度营业收入,本期发生额第一季度营业收入 +当期第一季度营业收入,2023年第一季度营业收入 +当期第一季度营业收入,2023年全年第一季度营业收入 +当期第一季度营业收入,2023年金额第一季度营业收入 +当期第一季度营业收入,第一季度营业收入 +当期第一季度营业收入,1-3月营业收入 +当期第一季度营业收入,第一季度(1-3月)营业收入 +当期第一季度营业收入,2023年第一季度营业收入 +当期第一季度营业收入,当期第一季度营业收入总额 +当期第一季度营业收入,本期第一季度营业收入总额 +当期第一季度营业收入,本报告期第一季度营业收入总额 +当期第一季度营业收入,报告期第一季度营业收入总额 +当期第一季度营业收入,报告期内第一季度营业收入总额 +当期第一季度营业收入,本年度第一季度营业收入总额 +当期第一季度营业收入,本期金额第一季度营业收入总额 +当期第一季度营业收入,本期发生额第一季度营业收入总额 +当期第一季度营业收入,2023年第一季度营业收入总额 +当期第一季度营业收入,2023年全年第一季度营业收入总额 +当期第一季度营业收入,2023年金额第一季度营业收入总额 +当期第一季度营业收入,第一季度营业收入总额 +当期第一季度营业收入,1-3月营业收入总额 +当期第一季度营业收入,第一季度(1-3月)营业收入总额 +当期第一季度营业收入,2023年第一季度营业收入总额 +当期第一季度营业收入,当期第一季度营业收入金额 +当期第一季度营业收入,本期第一季度营业收入金额 +当期第一季度营业收入,本报告期第一季度营业收入金额 +当期第一季度营业收入,报告期第一季度营业收入金额 +当期第一季度营业收入,报告期内第一季度营业收入金额 +当期第一季度营业收入,本年度第一季度营业收入金额 +当期第一季度营业收入,本期金额第一季度营业收入金额 +当期第一季度营业收入,本期发生额第一季度营业收入金额 +当期第一季度营业收入,2023年第一季度营业收入金额 +当期第一季度营业收入,2023年全年第一季度营业收入金额 +当期第一季度营业收入,2023年金额第一季度营业收入金额 +当期第一季度营业收入,第一季度营业收入金额 +当期第一季度营业收入,1-3月营业收入金额 +当期第一季度营业收入,第一季度(1-3月)营业收入金额 +当期第一季度营业收入,2023年第一季度营业收入金额 +当期第一季度营业收入,当期第一季度调整后营业收入 +当期第一季度营业收入,本期第一季度调整后营业收入 +当期第一季度营业收入,本报告期第一季度调整后营业收入 +当期第一季度营业收入,报告期第一季度调整后营业收入 +当期第一季度营业收入,报告期内第一季度调整后营业收入 +当期第一季度营业收入,本年度第一季度调整后营业收入 +当期第一季度营业收入,本期金额第一季度调整后营业收入 +当期第一季度营业收入,本期发生额第一季度调整后营业收入 +当期第一季度营业收入,2023年第一季度调整后营业收入 +当期第一季度营业收入,2023年全年第一季度调整后营业收入 +当期第一季度营业收入,2023年金额第一季度调整后营业收入 +当期第一季度营业收入,第一季度调整后营业收入 +当期第一季度营业收入,1-3月调整后营业收入 +当期第一季度营业收入,第一季度(1-3月)调整后营业收入 +当期第一季度营业收入,2023年第一季度调整后营业收入 +当期第二季度营业收入,当期第二季度营业收入 +当期第二季度营业收入,本期第二季度营业收入 +当期第二季度营业收入,本报告期第二季度营业收入 +当期第二季度营业收入,报告期第二季度营业收入 +当期第二季度营业收入,报告期内第二季度营业收入 +当期第二季度营业收入,本年度第二季度营业收入 +当期第二季度营业收入,本期金额第二季度营业收入 +当期第二季度营业收入,本期发生额第二季度营业收入 +当期第二季度营业收入,2023年第二季度营业收入 +当期第二季度营业收入,2023年全年第二季度营业收入 +当期第二季度营业收入,2023年金额第二季度营业收入 +当期第二季度营业收入,第二季度营业收入 +当期第二季度营业收入,4-6月营业收入 +当期第二季度营业收入,第二季度(4-6月)营业收入 +当期第二季度营业收入,2023年第二季度营业收入 +当期第二季度营业收入,当期第二季度营业收入总额 +当期第二季度营业收入,本期第二季度营业收入总额 +当期第二季度营业收入,本报告期第二季度营业收入总额 +当期第二季度营业收入,报告期第二季度营业收入总额 +当期第二季度营业收入,报告期内第二季度营业收入总额 +当期第二季度营业收入,本年度第二季度营业收入总额 +当期第二季度营业收入,本期金额第二季度营业收入总额 +当期第二季度营业收入,本期发生额第二季度营业收入总额 +当期第二季度营业收入,2023年第二季度营业收入总额 +当期第二季度营业收入,2023年全年第二季度营业收入总额 +当期第二季度营业收入,2023年金额第二季度营业收入总额 +当期第二季度营业收入,第二季度营业收入总额 +当期第二季度营业收入,4-6月营业收入总额 +当期第二季度营业收入,第二季度(4-6月)营业收入总额 +当期第二季度营业收入,2023年第二季度营业收入总额 +当期第二季度营业收入,当期第二季度营业收入金额 +当期第二季度营业收入,本期第二季度营业收入金额 +当期第二季度营业收入,本报告期第二季度营业收入金额 +当期第二季度营业收入,报告期第二季度营业收入金额 +当期第二季度营业收入,报告期内第二季度营业收入金额 +当期第二季度营业收入,本年度第二季度营业收入金额 +当期第二季度营业收入,本期金额第二季度营业收入金额 +当期第二季度营业收入,本期发生额第二季度营业收入金额 +当期第二季度营业收入,2023年第二季度营业收入金额 +当期第二季度营业收入,2023年全年第二季度营业收入金额 +当期第二季度营业收入,2023年金额第二季度营业收入金额 +当期第二季度营业收入,第二季度营业收入金额 +当期第二季度营业收入,4-6月营业收入金额 +当期第二季度营业收入,第二季度(4-6月)营业收入金额 +当期第二季度营业收入,2023年第二季度营业收入金额 +当期第二季度营业收入,当期第二季度调整后营业收入 +当期第二季度营业收入,本期第二季度调整后营业收入 +当期第二季度营业收入,本报告期第二季度调整后营业收入 +当期第二季度营业收入,报告期第二季度调整后营业收入 +当期第二季度营业收入,报告期内第二季度调整后营业收入 +当期第二季度营业收入,本年度第二季度调整后营业收入 +当期第二季度营业收入,本期金额第二季度调整后营业收入 +当期第二季度营业收入,本期发生额第二季度调整后营业收入 +当期第二季度营业收入,2023年第二季度调整后营业收入 +当期第二季度营业收入,2023年全年第二季度调整后营业收入 +当期第二季度营业收入,2023年金额第二季度调整后营业收入 +当期第二季度营业收入,第二季度调整后营业收入 +当期第二季度营业收入,4-6月调整后营业收入 +当期第二季度营业收入,第二季度(4-6月)调整后营业收入 +当期第二季度营业收入,2023年第二季度调整后营业收入 +当期第三季度营业收入,当期第三季度营业收入 +当期第三季度营业收入,本期第三季度营业收入 +当期第三季度营业收入,本报告期第三季度营业收入 +当期第三季度营业收入,报告期第三季度营业收入 +当期第三季度营业收入,报告期内第三季度营业收入 +当期第三季度营业收入,本年度第三季度营业收入 +当期第三季度营业收入,本期金额第三季度营业收入 +当期第三季度营业收入,本期发生额第三季度营业收入 +当期第三季度营业收入,2023年第三季度营业收入 +当期第三季度营业收入,2023年全年第三季度营业收入 +当期第三季度营业收入,2023年金额第三季度营业收入 +当期第三季度营业收入,第三季度营业收入 +当期第三季度营业收入,7-9月营业收入 +当期第三季度营业收入,第三季度(7-9月)营业收入 +当期第三季度营业收入,2023年第三季度营业收入 +当期第三季度营业收入,当期第三季度营业收入总额 +当期第三季度营业收入,本期第三季度营业收入总额 +当期第三季度营业收入,本报告期第三季度营业收入总额 +当期第三季度营业收入,报告期第三季度营业收入总额 +当期第三季度营业收入,报告期内第三季度营业收入总额 +当期第三季度营业收入,本年度第三季度营业收入总额 +当期第三季度营业收入,本期金额第三季度营业收入总额 +当期第三季度营业收入,本期发生额第三季度营业收入总额 +当期第三季度营业收入,2023年第三季度营业收入总额 +当期第三季度营业收入,2023年全年第三季度营业收入总额 +当期第三季度营业收入,2023年金额第三季度营业收入总额 +当期第三季度营业收入,第三季度营业收入总额 +当期第三季度营业收入,7-9月营业收入总额 +当期第三季度营业收入,第三季度(7-9月)营业收入总额 +当期第三季度营业收入,2023年第三季度营业收入总额 +当期第三季度营业收入,当期第三季度营业收入金额 +当期第三季度营业收入,本期第三季度营业收入金额 +当期第三季度营业收入,本报告期第三季度营业收入金额 +当期第三季度营业收入,报告期第三季度营业收入金额 +当期第三季度营业收入,报告期内第三季度营业收入金额 +当期第三季度营业收入,本年度第三季度营业收入金额 +当期第三季度营业收入,本期金额第三季度营业收入金额 +当期第三季度营业收入,本期发生额第三季度营业收入金额 +当期第三季度营业收入,2023年第三季度营业收入金额 +当期第三季度营业收入,2023年全年第三季度营业收入金额 +当期第三季度营业收入,2023年金额第三季度营业收入金额 +当期第三季度营业收入,第三季度营业收入金额 +当期第三季度营业收入,7-9月营业收入金额 +当期第三季度营业收入,第三季度(7-9月)营业收入金额 +当期第三季度营业收入,2023年第三季度营业收入金额 +当期第三季度营业收入,当期第三季度调整后营业收入 +当期第三季度营业收入,本期第三季度调整后营业收入 +当期第三季度营业收入,本报告期第三季度调整后营业收入 +当期第三季度营业收入,报告期第三季度调整后营业收入 +当期第三季度营业收入,报告期内第三季度调整后营业收入 +当期第三季度营业收入,本年度第三季度调整后营业收入 +当期第三季度营业收入,本期金额第三季度调整后营业收入 +当期第三季度营业收入,本期发生额第三季度调整后营业收入 +当期第三季度营业收入,2023年第三季度调整后营业收入 +当期第三季度营业收入,2023年全年第三季度调整后营业收入 +当期第三季度营业收入,2023年金额第三季度调整后营业收入 +当期第三季度营业收入,第三季度调整后营业收入 +当期第三季度营业收入,7-9月调整后营业收入 +当期第三季度营业收入,第三季度(7-9月)调整后营业收入 +当期第三季度营业收入,2023年第三季度调整后营业收入 +当期第四季度营业收入,当期第四季度营业收入 +当期第四季度营业收入,本期第四季度营业收入 +当期第四季度营业收入,本报告期第四季度营业收入 +当期第四季度营业收入,报告期第四季度营业收入 +当期第四季度营业收入,报告期内第四季度营业收入 +当期第四季度营业收入,本年度第四季度营业收入 +当期第四季度营业收入,本期金额第四季度营业收入 +当期第四季度营业收入,本期发生额第四季度营业收入 +当期第四季度营业收入,2023年第四季度营业收入 +当期第四季度营业收入,2023年全年第四季度营业收入 +当期第四季度营业收入,2023年金额第四季度营业收入 +当期第四季度营业收入,第四季度营业收入 +当期第四季度营业收入,10-12月营业收入 +当期第四季度营业收入,第四季度(10-12月)营业收入 +当期第四季度营业收入,2023年第四季度营业收入 +当期第四季度营业收入,当期第四季度营业收入总额 +当期第四季度营业收入,本期第四季度营业收入总额 +当期第四季度营业收入,本报告期第四季度营业收入总额 +当期第四季度营业收入,报告期第四季度营业收入总额 +当期第四季度营业收入,报告期内第四季度营业收入总额 +当期第四季度营业收入,本年度第四季度营业收入总额 +当期第四季度营业收入,本期金额第四季度营业收入总额 +当期第四季度营业收入,本期发生额第四季度营业收入总额 +当期第四季度营业收入,2023年第四季度营业收入总额 +当期第四季度营业收入,2023年全年第四季度营业收入总额 +当期第四季度营业收入,2023年金额第四季度营业收入总额 +当期第四季度营业收入,第四季度营业收入总额 +当期第四季度营业收入,10-12月营业收入总额 +当期第四季度营业收入,第四季度(10-12月)营业收入总额 +当期第四季度营业收入,2023年第四季度营业收入总额 +当期第四季度营业收入,当期第四季度营业收入金额 +当期第四季度营业收入,本期第四季度营业收入金额 +当期第四季度营业收入,本报告期第四季度营业收入金额 +当期第四季度营业收入,报告期第四季度营业收入金额 +当期第四季度营业收入,报告期内第四季度营业收入金额 +当期第四季度营业收入,本年度第四季度营业收入金额 +当期第四季度营业收入,本期金额第四季度营业收入金额 +当期第四季度营业收入,本期发生额第四季度营业收入金额 +当期第四季度营业收入,2023年第四季度营业收入金额 +当期第四季度营业收入,2023年全年第四季度营业收入金额 +当期第四季度营业收入,2023年金额第四季度营业收入金额 +当期第四季度营业收入,第四季度营业收入金额 +当期第四季度营业收入,10-12月营业收入金额 +当期第四季度营业收入,第四季度(10-12月)营业收入金额 +当期第四季度营业收入,2023年第四季度营业收入金额 +当期第四季度营业收入,当期第四季度调整后营业收入 +当期第四季度营业收入,本期第四季度调整后营业收入 +当期第四季度营业收入,本报告期第四季度调整后营业收入 +当期第四季度营业收入,报告期第四季度调整后营业收入 +当期第四季度营业收入,报告期内第四季度调整后营业收入 +当期第四季度营业收入,本年度第四季度调整后营业收入 +当期第四季度营业收入,本期金额第四季度调整后营业收入 +当期第四季度营业收入,本期发生额第四季度调整后营业收入 +当期第四季度营业收入,2023年第四季度调整后营业收入 +当期第四季度营业收入,2023年全年第四季度调整后营业收入 +当期第四季度营业收入,2023年金额第四季度调整后营业收入 +当期第四季度营业收入,第四季度调整后营业收入 +当期第四季度营业收入,10-12月调整后营业收入 +当期第四季度营业收入,第四季度(10-12月)调整后营业收入 +当期第四季度营业收入,2023年第四季度调整后营业收入 +营业收入同比变动,营业收入同比变动 +营业收入同比变动,营业收入同比增减 +营业收入同比变动,营业收入同比上升 +营业收入同比变动,营业收入同比下降 +营业收入同比变动,营业收入变化幅度 +营业收入同比变动,营业收入变动比例 +营业收入同比变动,营业收入本期比上年同期增减 +营业收入同比变动,营业收入本年比上年增减 +营业收入同比变动,营业收入本期期末金额较上期期末变动比例 +营业收入同比变动,营业收入总额同比变动 +营业收入同比变动,营业收入总额同比增减 +营业收入同比变动,营业收入总额同比上升 +营业收入同比变动,营业收入总额同比下降 +营业收入同比变动,营业收入总额变化幅度 +营业收入同比变动,营业收入总额变动比例 +营业收入同比变动,营业收入总额本期比上年同期增减 +营业收入同比变动,营业收入总额本年比上年增减 +营业收入同比变动,营业收入总额本期期末金额较上期期末变动比例 +营业收入同比变动,营业收入金额同比变动 +营业收入同比变动,营业收入金额同比增减 +营业收入同比变动,营业收入金额同比上升 +营业收入同比变动,营业收入金额同比下降 +营业收入同比变动,营业收入金额变化幅度 +营业收入同比变动,营业收入金额变动比例 +营业收入同比变动,营业收入金额本期比上年同期增减 +营业收入同比变动,营业收入金额本年比上年增减 +营业收入同比变动,营业收入金额本期期末金额较上期期末变动比例 +营业收入同比变动,调整后营业收入同比变动 +营业收入同比变动,调整后营业收入同比增减 +营业收入同比变动,调整后营业收入同比上升 +营业收入同比变动,调整后营业收入同比下降 +营业收入同比变动,调整后营业收入变化幅度 +营业收入同比变动,调整后营业收入变动比例 +营业收入同比变动,调整后营业收入本期比上年同期增减 +营业收入同比变动,调整后营业收入本年比上年增减 +营业收入同比变动,调整后营业收入本期期末金额较上期期末变动比例 +当期归母净利润,当期归母净利润 +当期归母净利润,本期归母净利润 +当期归母净利润,本报告期归母净利润 +当期归母净利润,报告期归母净利润 +当期归母净利润,报告期内归母净利润 +当期归母净利润,本年度归母净利润 +当期归母净利润,本期金额归母净利润 +当期归母净利润,本期发生额归母净利润 +当期归母净利润,2023年归母净利润 +当期归母净利润,2023年全年归母净利润 +当期归母净利润,2023年金额归母净利润 +当期归母净利润,当期归属于上市公司股东的净利润 +当期归母净利润,本期归属于上市公司股东的净利润 +当期归母净利润,本报告期归属于上市公司股东的净利润 +当期归母净利润,报告期归属于上市公司股东的净利润 +当期归母净利润,报告期内归属于上市公司股东的净利润 +当期归母净利润,本年度归属于上市公司股东的净利润 +当期归母净利润,本期金额归属于上市公司股东的净利润 +当期归母净利润,本期发生额归属于上市公司股东的净利润 +当期归母净利润,2023年归属于上市公司股东的净利润 +当期归母净利润,2023年全年归属于上市公司股东的净利润 +当期归母净利润,2023年金额归属于上市公司股东的净利润 +当期归母净利润,当期归属于母公司所有者的净利润 +当期归母净利润,本期归属于母公司所有者的净利润 +当期归母净利润,本报告期归属于母公司所有者的净利润 +当期归母净利润,报告期归属于母公司所有者的净利润 +当期归母净利润,报告期内归属于母公司所有者的净利润 +当期归母净利润,本年度归属于母公司所有者的净利润 +当期归母净利润,本期金额归属于母公司所有者的净利润 +当期归母净利润,本期发生额归属于母公司所有者的净利润 +当期归母净利润,2023年归属于母公司所有者的净利润 +当期归母净利润,2023年全年归属于母公司所有者的净利润 +当期归母净利润,2023年金额归属于母公司所有者的净利润 +当期归母净利润,当期归属于母公司股东的净利润 +当期归母净利润,本期归属于母公司股东的净利润 +当期归母净利润,本报告期归属于母公司股东的净利润 +当期归母净利润,报告期归属于母公司股东的净利润 +当期归母净利润,报告期内归属于母公司股东的净利润 +当期归母净利润,本年度归属于母公司股东的净利润 +当期归母净利润,本期金额归属于母公司股东的净利润 +当期归母净利润,本期发生额归属于母公司股东的净利润 +当期归母净利润,2023年归属于母公司股东的净利润 +当期归母净利润,2023年全年归属于母公司股东的净利润 +当期归母净利润,2023年金额归属于母公司股东的净利润 +上年同期归母净利润,上年同期归母净利润 +上年同期归母净利润,上期归母净利润 +上年同期归母净利润,上期金额归母净利润 +上年同期归母净利润,上年归母净利润 +上年同期归母净利润,上年度归母净利润 +上年同期归母净利润,2022年归母净利润 +上年同期归母净利润,2022年全年归母净利润 +上年同期归母净利润,2022年金额归母净利润 +上年同期归母净利润,上年同期归属于上市公司股东的净利润 +上年同期归母净利润,上期归属于上市公司股东的净利润 +上年同期归母净利润,上期金额归属于上市公司股东的净利润 +上年同期归母净利润,上年归属于上市公司股东的净利润 +上年同期归母净利润,上年度归属于上市公司股东的净利润 +上年同期归母净利润,2022年归属于上市公司股东的净利润 +上年同期归母净利润,2022年全年归属于上市公司股东的净利润 +上年同期归母净利润,2022年金额归属于上市公司股东的净利润 +上年同期归母净利润,上年同期归属于母公司所有者的净利润 +上年同期归母净利润,上期归属于母公司所有者的净利润 +上年同期归母净利润,上期金额归属于母公司所有者的净利润 +上年同期归母净利润,上年归属于母公司所有者的净利润 +上年同期归母净利润,上年度归属于母公司所有者的净利润 +上年同期归母净利润,2022年归属于母公司所有者的净利润 +上年同期归母净利润,2022年全年归属于母公司所有者的净利润 +上年同期归母净利润,2022年金额归属于母公司所有者的净利润 +上年同期归母净利润,上年同期归属于母公司股东的净利润 +上年同期归母净利润,上期归属于母公司股东的净利润 +上年同期归母净利润,上期金额归属于母公司股东的净利润 +上年同期归母净利润,上年归属于母公司股东的净利润 +上年同期归母净利润,上年度归属于母公司股东的净利润 +上年同期归母净利润,2022年归属于母公司股东的净利润 +上年同期归母净利润,2022年全年归属于母公司股东的净利润 +上年同期归母净利润,2022年金额归属于母公司股东的净利润 +前年同期归母净利润,前年同期归母净利润 +前年同期归母净利润,2021年归母净利润 +前年同期归母净利润,2021年全年归母净利润 +前年同期归母净利润,2021年金额归母净利润 +前年同期归母净利润,前年同期归属于上市公司股东的净利润 +前年同期归母净利润,2021年归属于上市公司股东的净利润 +前年同期归母净利润,2021年全年归属于上市公司股东的净利润 +前年同期归母净利润,2021年金额归属于上市公司股东的净利润 +前年同期归母净利润,前年同期归属于母公司所有者的净利润 +前年同期归母净利润,2021年归属于母公司所有者的净利润 +前年同期归母净利润,2021年全年归属于母公司所有者的净利润 +前年同期归母净利润,2021年金额归属于母公司所有者的净利润 +前年同期归母净利润,前年同期归属于母公司股东的净利润 +前年同期归母净利润,2021年归属于母公司股东的净利润 +前年同期归母净利润,2021年全年归属于母公司股东的净利润 +前年同期归母净利润,2021年金额归属于母公司股东的净利润 +当期第一季度归母净利润,当期第一季度归母净利润 +当期第一季度归母净利润,本期第一季度归母净利润 +当期第一季度归母净利润,本报告期第一季度归母净利润 +当期第一季度归母净利润,报告期第一季度归母净利润 +当期第一季度归母净利润,报告期内第一季度归母净利润 +当期第一季度归母净利润,本年度第一季度归母净利润 +当期第一季度归母净利润,本期金额第一季度归母净利润 +当期第一季度归母净利润,本期发生额第一季度归母净利润 +当期第一季度归母净利润,2023年第一季度归母净利润 +当期第一季度归母净利润,2023年全年第一季度归母净利润 +当期第一季度归母净利润,2023年金额第一季度归母净利润 +当期第一季度归母净利润,第一季度归母净利润 +当期第一季度归母净利润,1-3月归母净利润 +当期第一季度归母净利润,第一季度(1-3月)归母净利润 +当期第一季度归母净利润,2023年第一季度归母净利润 +当期第一季度归母净利润,当期第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,本期第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,本报告期第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,报告期第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,报告期内第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,本年度第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,本期金额第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,本期发生额第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,2023年第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,2023年全年第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,2023年金额第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,1-3月归属于上市公司股东的净利润 +当期第一季度归母净利润,第一季度(1-3月)归属于上市公司股东的净利润 +当期第一季度归母净利润,2023年第一季度归属于上市公司股东的净利润 +当期第一季度归母净利润,当期第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,本期第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,本报告期第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,报告期第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,报告期内第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,本年度第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,本期金额第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,本期发生额第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,2023年第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,2023年全年第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,2023年金额第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,1-3月归属于母公司所有者的净利润 +当期第一季度归母净利润,第一季度(1-3月)归属于母公司所有者的净利润 +当期第一季度归母净利润,2023年第一季度归属于母公司所有者的净利润 +当期第一季度归母净利润,当期第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,本期第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,本报告期第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,报告期第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,报告期内第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,本年度第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,本期金额第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,本期发生额第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,2023年第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,2023年全年第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,2023年金额第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,第一季度归属于母公司股东的净利润 +当期第一季度归母净利润,1-3月归属于母公司股东的净利润 +当期第一季度归母净利润,第一季度(1-3月)归属于母公司股东的净利润 +当期第一季度归母净利润,2023年第一季度归属于母公司股东的净利润 +当期第二季度归母净利润,当期第二季度归母净利润 +当期第二季度归母净利润,本期第二季度归母净利润 +当期第二季度归母净利润,本报告期第二季度归母净利润 +当期第二季度归母净利润,报告期第二季度归母净利润 +当期第二季度归母净利润,报告期内第二季度归母净利润 +当期第二季度归母净利润,本年度第二季度归母净利润 +当期第二季度归母净利润,本期金额第二季度归母净利润 +当期第二季度归母净利润,本期发生额第二季度归母净利润 +当期第二季度归母净利润,2023年第二季度归母净利润 +当期第二季度归母净利润,2023年全年第二季度归母净利润 +当期第二季度归母净利润,2023年金额第二季度归母净利润 +当期第二季度归母净利润,第二季度归母净利润 +当期第二季度归母净利润,4-6月归母净利润 +当期第二季度归母净利润,第二季度(4-6月)归母净利润 +当期第二季度归母净利润,2023年第二季度归母净利润 +当期第二季度归母净利润,当期第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,本期第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,本报告期第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,报告期第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,报告期内第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,本年度第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,本期金额第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,本期发生额第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,2023年第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,2023年全年第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,2023年金额第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,4-6月归属于上市公司股东的净利润 +当期第二季度归母净利润,第二季度(4-6月)归属于上市公司股东的净利润 +当期第二季度归母净利润,2023年第二季度归属于上市公司股东的净利润 +当期第二季度归母净利润,当期第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,本期第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,本报告期第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,报告期第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,报告期内第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,本年度第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,本期金额第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,本期发生额第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,2023年第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,2023年全年第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,2023年金额第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,4-6月归属于母公司所有者的净利润 +当期第二季度归母净利润,第二季度(4-6月)归属于母公司所有者的净利润 +当期第二季度归母净利润,2023年第二季度归属于母公司所有者的净利润 +当期第二季度归母净利润,当期第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,本期第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,本报告期第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,报告期第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,报告期内第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,本年度第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,本期金额第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,本期发生额第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,2023年第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,2023年全年第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,2023年金额第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,第二季度归属于母公司股东的净利润 +当期第二季度归母净利润,4-6月归属于母公司股东的净利润 +当期第二季度归母净利润,第二季度(4-6月)归属于母公司股东的净利润 +当期第二季度归母净利润,2023年第二季度归属于母公司股东的净利润 +当期第三季度归母净利润,当期第三季度归母净利润 +当期第三季度归母净利润,本期第三季度归母净利润 +当期第三季度归母净利润,本报告期第三季度归母净利润 +当期第三季度归母净利润,报告期第三季度归母净利润 +当期第三季度归母净利润,报告期内第三季度归母净利润 +当期第三季度归母净利润,本年度第三季度归母净利润 +当期第三季度归母净利润,本期金额第三季度归母净利润 +当期第三季度归母净利润,本期发生额第三季度归母净利润 +当期第三季度归母净利润,2023年第三季度归母净利润 +当期第三季度归母净利润,2023年全年第三季度归母净利润 +当期第三季度归母净利润,2023年金额第三季度归母净利润 +当期第三季度归母净利润,第三季度归母净利润 +当期第三季度归母净利润,7-9月归母净利润 +当期第三季度归母净利润,第三季度(7-9月)归母净利润 +当期第三季度归母净利润,2023年第三季度归母净利润 +当期第三季度归母净利润,当期第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,本期第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,本报告期第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,报告期第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,报告期内第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,本年度第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,本期金额第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,本期发生额第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,2023年第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,2023年全年第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,2023年金额第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,7-9月归属于上市公司股东的净利润 +当期第三季度归母净利润,第三季度(7-9月)归属于上市公司股东的净利润 +当期第三季度归母净利润,2023年第三季度归属于上市公司股东的净利润 +当期第三季度归母净利润,当期第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,本期第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,本报告期第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,报告期第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,报告期内第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,本年度第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,本期金额第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,本期发生额第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,2023年第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,2023年全年第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,2023年金额第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,7-9月归属于母公司所有者的净利润 +当期第三季度归母净利润,第三季度(7-9月)归属于母公司所有者的净利润 +当期第三季度归母净利润,2023年第三季度归属于母公司所有者的净利润 +当期第三季度归母净利润,当期第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,本期第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,本报告期第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,报告期第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,报告期内第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,本年度第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,本期金额第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,本期发生额第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,2023年第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,2023年全年第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,2023年金额第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,第三季度归属于母公司股东的净利润 +当期第三季度归母净利润,7-9月归属于母公司股东的净利润 +当期第三季度归母净利润,第三季度(7-9月)归属于母公司股东的净利润 +当期第三季度归母净利润,2023年第三季度归属于母公司股东的净利润 +当期第四季度归母净利润,当期第四季度归母净利润 +当期第四季度归母净利润,本期第四季度归母净利润 +当期第四季度归母净利润,本报告期第四季度归母净利润 +当期第四季度归母净利润,报告期第四季度归母净利润 +当期第四季度归母净利润,报告期内第四季度归母净利润 +当期第四季度归母净利润,本年度第四季度归母净利润 +当期第四季度归母净利润,本期金额第四季度归母净利润 +当期第四季度归母净利润,本期发生额第四季度归母净利润 +当期第四季度归母净利润,2023年第四季度归母净利润 +当期第四季度归母净利润,2023年全年第四季度归母净利润 +当期第四季度归母净利润,2023年金额第四季度归母净利润 +当期第四季度归母净利润,第四季度归母净利润 +当期第四季度归母净利润,10-12月归母净利润 +当期第四季度归母净利润,第四季度(10-12月)归母净利润 +当期第四季度归母净利润,2023年第四季度归母净利润 +当期第四季度归母净利润,当期第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,本期第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,本报告期第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,报告期第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,报告期内第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,本年度第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,本期金额第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,本期发生额第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,2023年第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,2023年全年第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,2023年金额第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,10-12月归属于上市公司股东的净利润 +当期第四季度归母净利润,第四季度(10-12月)归属于上市公司股东的净利润 +当期第四季度归母净利润,2023年第四季度归属于上市公司股东的净利润 +当期第四季度归母净利润,当期第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,本期第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,本报告期第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,报告期第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,报告期内第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,本年度第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,本期金额第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,本期发生额第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,2023年第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,2023年全年第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,2023年金额第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,10-12月归属于母公司所有者的净利润 +当期第四季度归母净利润,第四季度(10-12月)归属于母公司所有者的净利润 +当期第四季度归母净利润,2023年第四季度归属于母公司所有者的净利润 +当期第四季度归母净利润,当期第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,本期第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,本报告期第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,报告期第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,报告期内第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,本年度第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,本期金额第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,本期发生额第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,2023年第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,2023年全年第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,2023年金额第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,第四季度归属于母公司股东的净利润 +当期第四季度归母净利润,10-12月归属于母公司股东的净利润 +当期第四季度归母净利润,第四季度(10-12月)归属于母公司股东的净利润 +当期第四季度归母净利润,2023年第四季度归属于母公司股东的净利润 +归母净利润同比变动,归母净利润同比变动 +归母净利润同比变动,归母净利润同比增减 +归母净利润同比变动,归母净利润同比上升 +归母净利润同比变动,归母净利润同比下降 +归母净利润同比变动,归母净利润变化幅度 +归母净利润同比变动,归母净利润变动比例 +归母净利润同比变动,归母净利润本期比上年同期增减 +归母净利润同比变动,归母净利润本年比上年增减 +归母净利润同比变动,归母净利润本期期末金额较上期期末变动比例 +归母净利润同比变动,归属于上市公司股东的净利润同比变动 +归母净利润同比变动,归属于上市公司股东的净利润同比增减 +归母净利润同比变动,归属于上市公司股东的净利润同比上升 +归母净利润同比变动,归属于上市公司股东的净利润同比下降 +归母净利润同比变动,归属于上市公司股东的净利润变化幅度 +归母净利润同比变动,归属于上市公司股东的净利润变动比例 +归母净利润同比变动,归属于上市公司股东的净利润本期比上年同期增减 +归母净利润同比变动,归属于上市公司股东的净利润本年比上年增减 +归母净利润同比变动,归属于上市公司股东的净利润本期期末金额较上期期末变动比例 +归母净利润同比变动,归属于母公司所有者的净利润同比变动 +归母净利润同比变动,归属于母公司所有者的净利润同比增减 +归母净利润同比变动,归属于母公司所有者的净利润同比上升 +归母净利润同比变动,归属于母公司所有者的净利润同比下降 +归母净利润同比变动,归属于母公司所有者的净利润变化幅度 +归母净利润同比变动,归属于母公司所有者的净利润变动比例 +归母净利润同比变动,归属于母公司所有者的净利润本期比上年同期增减 +归母净利润同比变动,归属于母公司所有者的净利润本年比上年增减 +归母净利润同比变动,归属于母公司所有者的净利润本期期末金额较上期期末变动比例 +归母净利润同比变动,归属于母公司股东的净利润同比变动 +归母净利润同比变动,归属于母公司股东的净利润同比增减 +归母净利润同比变动,归属于母公司股东的净利润同比上升 +归母净利润同比变动,归属于母公司股东的净利润同比下降 +归母净利润同比变动,归属于母公司股东的净利润变化幅度 +归母净利润同比变动,归属于母公司股东的净利润变动比例 +归母净利润同比变动,归属于母公司股东的净利润本期比上年同期增减 +归母净利润同比变动,归属于母公司股东的净利润本年比上年增减 +归母净利润同比变动,归属于母公司股东的净利润本期期末金额较上期期末变动比例 +当期扣非净利润,当期扣非净利润 +当期扣非净利润,本期扣非净利润 +当期扣非净利润,本报告期扣非净利润 +当期扣非净利润,报告期扣非净利润 +当期扣非净利润,报告期内扣非净利润 +当期扣非净利润,本年度扣非净利润 +当期扣非净利润,本期金额扣非净利润 +当期扣非净利润,本期发生额扣非净利润 +当期扣非净利润,2023年扣非净利润 +当期扣非净利润,2023年全年扣非净利润 +当期扣非净利润,2023年金额扣非净利润 +当期扣非净利润,当期归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本期归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本报告期归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,报告期归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,报告期内归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本年度归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本期金额归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本期发生额归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,2023年归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,2023年全年归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,2023年金额归属于上市公司股东的扣除非经常性损益的净利润 +当期扣非净利润,当期归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,本期归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,本报告期归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,报告期归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,报告期内归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,本年度归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,本期金额归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,本期发生额归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,2023年归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,2023年全年归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,2023年金额归属于母公司所有者的扣除非经常性损益的净利润 +当期扣非净利润,当期归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本期归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本报告期归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,报告期归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,报告期内归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本年度归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本期金额归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,本期发生额归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,2023年归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,2023年全年归属于母公司股东的扣除非经常性损益的净利润 +当期扣非净利润,2023年金额归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上年同期扣非净利润 +上年同期扣非净利润,上期扣非净利润 +上年同期扣非净利润,上期金额扣非净利润 +上年同期扣非净利润,上年扣非净利润 +上年同期扣非净利润,上年度扣非净利润 +上年同期扣非净利润,2022年扣非净利润 +上年同期扣非净利润,2022年全年扣非净利润 +上年同期扣非净利润,2022年金额扣非净利润 +上年同期扣非净利润,上年同期归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上期归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上期金额归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上年归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上年度归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年全年归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年金额归属于上市公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上年同期归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,上期归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,上期金额归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,上年归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,上年度归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年全年归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年金额归属于母公司所有者的扣除非经常性损益的净利润 +上年同期扣非净利润,上年同期归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上期归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上期金额归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上年归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,上年度归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年全年归属于母公司股东的扣除非经常性损益的净利润 +上年同期扣非净利润,2022年金额归属于母公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,前年同期扣非净利润 +前年同期扣非净利润,2021年扣非净利润 +前年同期扣非净利润,2021年全年扣非净利润 +前年同期扣非净利润,2021年金额扣非净利润 +前年同期扣非净利润,前年同期归属于上市公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年归属于上市公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年全年归属于上市公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年金额归属于上市公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,前年同期归属于母公司所有者的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年归属于母公司所有者的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年全年归属于母公司所有者的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年金额归属于母公司所有者的扣除非经常性损益的净利润 +前年同期扣非净利润,前年同期归属于母公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年归属于母公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年全年归属于母公司股东的扣除非经常性损益的净利润 +前年同期扣非净利润,2021年金额归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,当期第一季度扣非净利润 +当期第一季度扣非净利润,本期第一季度扣非净利润 +当期第一季度扣非净利润,本报告期第一季度扣非净利润 +当期第一季度扣非净利润,报告期第一季度扣非净利润 +当期第一季度扣非净利润,报告期内第一季度扣非净利润 +当期第一季度扣非净利润,本年度第一季度扣非净利润 +当期第一季度扣非净利润,本期金额第一季度扣非净利润 +当期第一季度扣非净利润,本期发生额第一季度扣非净利润 +当期第一季度扣非净利润,2023年第一季度扣非净利润 +当期第一季度扣非净利润,2023年全年第一季度扣非净利润 +当期第一季度扣非净利润,2023年金额第一季度扣非净利润 +当期第一季度扣非净利润,第一季度扣非净利润 +当期第一季度扣非净利润,1-3月扣非净利润 +当期第一季度扣非净利润,第一季度(1-3月)扣非净利润 +当期第一季度扣非净利润,2023年第一季度扣非净利润 +当期第一季度扣非净利润,当期第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本报告期第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,报告期第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,报告期内第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本年度第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期金额第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期发生额第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年全年第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年金额第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,1-3月归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,第一季度(1-3月)归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年第一季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,当期第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本报告期第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,报告期第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,报告期内第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本年度第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期金额第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期发生额第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年全年第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年金额第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,1-3月归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,第一季度(1-3月)归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年第一季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第一季度扣非净利润,当期第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本报告期第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,报告期第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,报告期内第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本年度第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期金额第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,本期发生额第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年全年第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年金额第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,1-3月归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,第一季度(1-3月)归属于母公司股东的扣除非经常性损益的净利润 +当期第一季度扣非净利润,2023年第一季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,当期第二季度扣非净利润 +当期第二季度扣非净利润,本期第二季度扣非净利润 +当期第二季度扣非净利润,本报告期第二季度扣非净利润 +当期第二季度扣非净利润,报告期第二季度扣非净利润 +当期第二季度扣非净利润,报告期内第二季度扣非净利润 +当期第二季度扣非净利润,本年度第二季度扣非净利润 +当期第二季度扣非净利润,本期金额第二季度扣非净利润 +当期第二季度扣非净利润,本期发生额第二季度扣非净利润 +当期第二季度扣非净利润,2023年第二季度扣非净利润 +当期第二季度扣非净利润,2023年全年第二季度扣非净利润 +当期第二季度扣非净利润,2023年金额第二季度扣非净利润 +当期第二季度扣非净利润,第二季度扣非净利润 +当期第二季度扣非净利润,4-6月扣非净利润 +当期第二季度扣非净利润,第二季度(4-6月)扣非净利润 +当期第二季度扣非净利润,2023年第二季度扣非净利润 +当期第二季度扣非净利润,当期第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本报告期第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,报告期第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,报告期内第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本年度第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期金额第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期发生额第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年全年第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年金额第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,4-6月归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,第二季度(4-6月)归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年第二季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,当期第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本报告期第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,报告期第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,报告期内第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本年度第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期金额第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期发生额第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年全年第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年金额第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,4-6月归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,第二季度(4-6月)归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年第二季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第二季度扣非净利润,当期第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本报告期第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,报告期第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,报告期内第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本年度第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期金额第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,本期发生额第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年全年第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年金额第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,4-6月归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,第二季度(4-6月)归属于母公司股东的扣除非经常性损益的净利润 +当期第二季度扣非净利润,2023年第二季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,当期第三季度扣非净利润 +当期第三季度扣非净利润,本期第三季度扣非净利润 +当期第三季度扣非净利润,本报告期第三季度扣非净利润 +当期第三季度扣非净利润,报告期第三季度扣非净利润 +当期第三季度扣非净利润,报告期内第三季度扣非净利润 +当期第三季度扣非净利润,本年度第三季度扣非净利润 +当期第三季度扣非净利润,本期金额第三季度扣非净利润 +当期第三季度扣非净利润,本期发生额第三季度扣非净利润 +当期第三季度扣非净利润,2023年第三季度扣非净利润 +当期第三季度扣非净利润,2023年全年第三季度扣非净利润 +当期第三季度扣非净利润,2023年金额第三季度扣非净利润 +当期第三季度扣非净利润,第三季度扣非净利润 +当期第三季度扣非净利润,7-9月扣非净利润 +当期第三季度扣非净利润,第三季度(7-9月)扣非净利润 +当期第三季度扣非净利润,2023年第三季度扣非净利润 +当期第三季度扣非净利润,当期第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本报告期第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,报告期第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,报告期内第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本年度第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期金额第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期发生额第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年全年第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年金额第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,7-9月归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,第三季度(7-9月)归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年第三季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,当期第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本报告期第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,报告期第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,报告期内第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本年度第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期金额第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期发生额第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年全年第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年金额第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,7-9月归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,第三季度(7-9月)归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年第三季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第三季度扣非净利润,当期第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本报告期第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,报告期第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,报告期内第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本年度第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期金额第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,本期发生额第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年全年第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年金额第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,7-9月归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,第三季度(7-9月)归属于母公司股东的扣除非经常性损益的净利润 +当期第三季度扣非净利润,2023年第三季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,当期第四季度扣非净利润 +当期第四季度扣非净利润,本期第四季度扣非净利润 +当期第四季度扣非净利润,本报告期第四季度扣非净利润 +当期第四季度扣非净利润,报告期第四季度扣非净利润 +当期第四季度扣非净利润,报告期内第四季度扣非净利润 +当期第四季度扣非净利润,本年度第四季度扣非净利润 +当期第四季度扣非净利润,本期金额第四季度扣非净利润 +当期第四季度扣非净利润,本期发生额第四季度扣非净利润 +当期第四季度扣非净利润,2023年第四季度扣非净利润 +当期第四季度扣非净利润,2023年全年第四季度扣非净利润 +当期第四季度扣非净利润,2023年金额第四季度扣非净利润 +当期第四季度扣非净利润,第四季度扣非净利润 +当期第四季度扣非净利润,10-12月扣非净利润 +当期第四季度扣非净利润,第四季度(10-12月)扣非净利润 +当期第四季度扣非净利润,2023年第四季度扣非净利润 +当期第四季度扣非净利润,当期第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本报告期第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,报告期第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,报告期内第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本年度第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期金额第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期发生额第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年全年第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年金额第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,10-12月归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,第四季度(10-12月)归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年第四季度归属于上市公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,当期第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本报告期第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,报告期第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,报告期内第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本年度第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期金额第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期发生额第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年全年第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年金额第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,10-12月归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,第四季度(10-12月)归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年第四季度归属于母公司所有者的扣除非经常性损益的净利润 +当期第四季度扣非净利润,当期第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本报告期第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,报告期第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,报告期内第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本年度第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期金额第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,本期发生额第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年全年第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年金额第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,第四季度归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,10-12月归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,第四季度(10-12月)归属于母公司股东的扣除非经常性损益的净利润 +当期第四季度扣非净利润,2023年第四季度归属于母公司股东的扣除非经常性损益的净利润 +扣非净利润同比变动,扣非净利润同比变动 +扣非净利润同比变动,扣非净利润同比增减 +扣非净利润同比变动,扣非净利润同比上升 +扣非净利润同比变动,扣非净利润同比下降 +扣非净利润同比变动,扣非净利润变化幅度 +扣非净利润同比变动,扣非净利润变动比例 +扣非净利润同比变动,扣非净利润本期比上年同期增减 +扣非净利润同比变动,扣非净利润本年比上年增减 +扣非净利润同比变动,扣非净利润本期期末金额较上期期末变动比例 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润同比变动 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润同比增减 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润同比上升 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润同比下降 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润变化幅度 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润变动比例 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润本期比上年同期增减 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润本年比上年增减 +扣非净利润同比变动,归属于上市公司股东的扣除非经常性损益的净利润本期期末金额较上期期末变动比例 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润同比变动 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润同比增减 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润同比上升 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润同比下降 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润变化幅度 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润变动比例 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润本期比上年同期增减 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润本年比上年增减 +扣非净利润同比变动,归属于母公司所有者的扣除非经常性损益的净利润本期期末金额较上期期末变动比例 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润同比变动 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润同比增减 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润同比上升 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润同比下降 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润变化幅度 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润变动比例 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润本期比上年同期增减 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润本年比上年增减 +扣非净利润同比变动,归属于母公司股东的扣除非经常性损益的净利润本期期末金额较上期期末变动比例 +当期经营活动现金流净额,当期经营活动产生的现金流量净额 +当期经营活动现金流净额,本期经营活动产生的现金流量净额 +当期经营活动现金流净额,本报告期经营活动产生的现金流量净额 +当期经营活动现金流净额,报告期经营活动产生的现金流量净额 +当期经营活动现金流净额,报告期内经营活动产生的现金流量净额 +当期经营活动现金流净额,本年度经营活动产生的现金流量净额 +当期经营活动现金流净额,本期金额经营活动产生的现金流量净额 +当期经营活动现金流净额,本期发生额经营活动产生的现金流量净额 +当期经营活动现金流净额,2023年经营活动产生的现金流量净额 +当期经营活动现金流净额,2023年全年经营活动产生的现金流量净额 +当期经营活动现金流净额,2023年金额经营活动产生的现金流量净额 +当期经营活动现金流净额,当期经营活动现金净流量 +当期经营活动现金流净额,本期经营活动现金净流量 +当期经营活动现金流净额,本报告期经营活动现金净流量 +当期经营活动现金流净额,报告期经营活动现金净流量 +当期经营活动现金流净额,报告期内经营活动现金净流量 +当期经营活动现金流净额,本年度经营活动现金净流量 +当期经营活动现金流净额,本期金额经营活动现金净流量 +当期经营活动现金流净额,本期发生额经营活动现金净流量 +当期经营活动现金流净额,2023年经营活动现金净流量 +当期经营活动现金流净额,2023年全年经营活动现金净流量 +当期经营活动现金流净额,2023年金额经营活动现金净流量 +当期经营活动现金流净额,当期经营性活动现金流 +当期经营活动现金流净额,本期经营性活动现金流 +当期经营活动现金流净额,本报告期经营性活动现金流 +当期经营活动现金流净额,报告期经营性活动现金流 +当期经营活动现金流净额,报告期内经营性活动现金流 +当期经营活动现金流净额,本年度经营性活动现金流 +当期经营活动现金流净额,本期金额经营性活动现金流 +当期经营活动现金流净额,本期发生额经营性活动现金流 +当期经营活动现金流净额,2023年经营性活动现金流 +当期经营活动现金流净额,2023年全年经营性活动现金流 +当期经营活动现金流净额,2023年金额经营性活动现金流 +上年同期经营活动现金流净额,上年同期经营活动产生的现金流量净额 +上年同期经营活动现金流净额,上期经营活动产生的现金流量净额 +上年同期经营活动现金流净额,上期金额经营活动产生的现金流量净额 +上年同期经营活动现金流净额,上年经营活动产生的现金流量净额 +上年同期经营活动现金流净额,上年度经营活动产生的现金流量净额 +上年同期经营活动现金流净额,2022年经营活动产生的现金流量净额 +上年同期经营活动现金流净额,2022年全年经营活动产生的现金流量净额 +上年同期经营活动现金流净额,2022年金额经营活动产生的现金流量净额 +上年同期经营活动现金流净额,上年同期经营活动现金净流量 +上年同期经营活动现金流净额,上期经营活动现金净流量 +上年同期经营活动现金流净额,上期金额经营活动现金净流量 +上年同期经营活动现金流净额,上年经营活动现金净流量 +上年同期经营活动现金流净额,上年度经营活动现金净流量 +上年同期经营活动现金流净额,2022年经营活动现金净流量 +上年同期经营活动现金流净额,2022年全年经营活动现金净流量 +上年同期经营活动现金流净额,2022年金额经营活动现金净流量 +上年同期经营活动现金流净额,上年同期经营性活动现金流 +上年同期经营活动现金流净额,上期经营性活动现金流 +上年同期经营活动现金流净额,上期金额经营性活动现金流 +上年同期经营活动现金流净额,上年经营性活动现金流 +上年同期经营活动现金流净额,上年度经营性活动现金流 +上年同期经营活动现金流净额,2022年经营性活动现金流 +上年同期经营活动现金流净额,2022年全年经营性活动现金流 +上年同期经营活动现金流净额,2022年金额经营性活动现金流 +前年同期经营活动现金流净额,前年同期经营活动产生的现金流量净额 +前年同期经营活动现金流净额,2021年经营活动产生的现金流量净额 +前年同期经营活动现金流净额,2021年全年经营活动产生的现金流量净额 +前年同期经营活动现金流净额,2021年金额经营活动产生的现金流量净额 +前年同期经营活动现金流净额,前年同期经营活动现金净流量 +前年同期经营活动现金流净额,2021年经营活动现金净流量 +前年同期经营活动现金流净额,2021年全年经营活动现金净流量 +前年同期经营活动现金流净额,2021年金额经营活动现金净流量 +前年同期经营活动现金流净额,前年同期经营性活动现金流 +前年同期经营活动现金流净额,2021年经营性活动现金流 +前年同期经营活动现金流净额,2021年全年经营性活动现金流 +前年同期经营活动现金流净额,2021年金额经营性活动现金流 +当期第一季度经营活动现金流净额,当期第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,本期第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,本报告期第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,报告期第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,报告期内第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,本年度第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,本期金额第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,本期发生额第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,2023年第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,2023年全年第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,2023年金额第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,1-3月经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,第一季度(1-3月)经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,2023年第一季度经营活动产生的现金流量净额 +当期第一季度经营活动现金流净额,当期第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,本期第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,本报告期第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,报告期第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,报告期内第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,本年度第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,本期金额第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,本期发生额第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,2023年第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,2023年全年第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,2023年金额第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,1-3月经营活动现金净流量 +当期第一季度经营活动现金流净额,第一季度(1-3月)经营活动现金净流量 +当期第一季度经营活动现金流净额,2023年第一季度经营活动现金净流量 +当期第一季度经营活动现金流净额,当期第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,本期第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,本报告期第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,报告期第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,报告期内第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,本年度第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,本期金额第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,本期发生额第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,2023年第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,2023年全年第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,2023年金额第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,第一季度经营性活动现金流 +当期第一季度经营活动现金流净额,1-3月经营性活动现金流 +当期第一季度经营活动现金流净额,第一季度(1-3月)经营性活动现金流 +当期第一季度经营活动现金流净额,2023年第一季度经营性活动现金流 +当期第二季度经营活动现金流净额,当期第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,本期第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,本报告期第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,报告期第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,报告期内第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,本年度第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,本期金额第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,本期发生额第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,2023年第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,2023年全年第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,2023年金额第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,4-6月经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,第二季度(4-6月)经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,2023年第二季度经营活动产生的现金流量净额 +当期第二季度经营活动现金流净额,当期第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,本期第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,本报告期第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,报告期第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,报告期内第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,本年度第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,本期金额第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,本期发生额第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,2023年第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,2023年全年第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,2023年金额第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,4-6月经营活动现金净流量 +当期第二季度经营活动现金流净额,第二季度(4-6月)经营活动现金净流量 +当期第二季度经营活动现金流净额,2023年第二季度经营活动现金净流量 +当期第二季度经营活动现金流净额,当期第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,本期第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,本报告期第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,报告期第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,报告期内第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,本年度第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,本期金额第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,本期发生额第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,2023年第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,2023年全年第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,2023年金额第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,第二季度经营性活动现金流 +当期第二季度经营活动现金流净额,4-6月经营性活动现金流 +当期第二季度经营活动现金流净额,第二季度(4-6月)经营性活动现金流 +当期第二季度经营活动现金流净额,2023年第二季度经营性活动现金流 +当期第三季度经营活动现金流净额,当期第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,本期第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,本报告期第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,报告期第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,报告期内第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,本年度第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,本期金额第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,本期发生额第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,2023年第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,2023年全年第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,2023年金额第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,7-9月经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,第三季度(7-9月)经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,2023年第三季度经营活动产生的现金流量净额 +当期第三季度经营活动现金流净额,当期第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,本期第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,本报告期第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,报告期第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,报告期内第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,本年度第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,本期金额第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,本期发生额第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,2023年第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,2023年全年第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,2023年金额第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,7-9月经营活动现金净流量 +当期第三季度经营活动现金流净额,第三季度(7-9月)经营活动现金净流量 +当期第三季度经营活动现金流净额,2023年第三季度经营活动现金净流量 +当期第三季度经营活动现金流净额,当期第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,本期第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,本报告期第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,报告期第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,报告期内第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,本年度第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,本期金额第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,本期发生额第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,2023年第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,2023年全年第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,2023年金额第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,第三季度经营性活动现金流 +当期第三季度经营活动现金流净额,7-9月经营性活动现金流 +当期第三季度经营活动现金流净额,第三季度(7-9月)经营性活动现金流 +当期第三季度经营活动现金流净额,2023年第三季度经营性活动现金流 +当期第四季度经营活动现金流净额,当期第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,本期第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,本报告期第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,报告期第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,报告期内第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,本年度第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,本期金额第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,本期发生额第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,2023年第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,2023年全年第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,2023年金额第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,10-12月经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,第四季度(10-12月)经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,2023年第四季度经营活动产生的现金流量净额 +当期第四季度经营活动现金流净额,当期第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,本期第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,本报告期第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,报告期第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,报告期内第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,本年度第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,本期金额第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,本期发生额第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,2023年第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,2023年全年第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,2023年金额第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,10-12月经营活动现金净流量 +当期第四季度经营活动现金流净额,第四季度(10-12月)经营活动现金净流量 +当期第四季度经营活动现金流净额,2023年第四季度经营活动现金净流量 +当期第四季度经营活动现金流净额,当期第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,本期第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,本报告期第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,报告期第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,报告期内第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,本年度第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,本期金额第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,本期发生额第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,2023年第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,2023年全年第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,2023年金额第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,第四季度经营性活动现金流 +当期第四季度经营活动现金流净额,10-12月经营性活动现金流 +当期第四季度经营活动现金流净额,第四季度(10-12月)经营性活动现金流 +当期第四季度经营活动现金流净额,2023年第四季度经营性活动现金流 +经营活动现金流净额同比变动,经营活动产生的现金流量净额同比变动 +经营活动现金流净额同比变动,经营活动产生的现金流量净额同比增减 +经营活动现金流净额同比变动,经营活动产生的现金流量净额同比上升 +经营活动现金流净额同比变动,经营活动产生的现金流量净额同比下降 +经营活动现金流净额同比变动,经营活动产生的现金流量净额变化幅度 +经营活动现金流净额同比变动,经营活动产生的现金流量净额变动比例 +经营活动现金流净额同比变动,经营活动产生的现金流量净额本期比上年同期增减 +经营活动现金流净额同比变动,经营活动产生的现金流量净额本年比上年增减 +经营活动现金流净额同比变动,经营活动产生的现金流量净额本期期末金额较上期期末变动比例 +经营活动现金流净额同比变动,经营活动现金净流量同比变动 +经营活动现金流净额同比变动,经营活动现金净流量同比增减 +经营活动现金流净额同比变动,经营活动现金净流量同比上升 +经营活动现金流净额同比变动,经营活动现金净流量同比下降 +经营活动现金流净额同比变动,经营活动现金净流量变化幅度 +经营活动现金流净额同比变动,经营活动现金净流量变动比例 +经营活动现金流净额同比变动,经营活动现金净流量本期比上年同期增减 +经营活动现金流净额同比变动,经营活动现金净流量本年比上年增减 +经营活动现金流净额同比变动,经营活动现金净流量本期期末金额较上期期末变动比例 +经营活动现金流净额同比变动,经营性活动现金流同比变动 +经营活动现金流净额同比变动,经营性活动现金流同比增减 +经营活动现金流净额同比变动,经营性活动现金流同比上升 +经营活动现金流净额同比变动,经营性活动现金流同比下降 +经营活动现金流净额同比变动,经营性活动现金流变化幅度 +经营活动现金流净额同比变动,经营性活动现金流变动比例 +经营活动现金流净额同比变动,经营性活动现金流本期比上年同期增减 +经营活动现金流净额同比变动,经营性活动现金流本年比上年增减 +经营活动现金流净额同比变动,经营性活动现金流本期期末金额较上期期末变动比例 +当期筹资活动现金流净额,当期筹资活动产生的现金流量净额 +当期筹资活动现金流净额,本期筹资活动产生的现金流量净额 +当期筹资活动现金流净额,本报告期筹资活动产生的现金流量净额 +当期筹资活动现金流净额,报告期筹资活动产生的现金流量净额 +当期筹资活动现金流净额,报告期内筹资活动产生的现金流量净额 +当期筹资活动现金流净额,本年度筹资活动产生的现金流量净额 +当期筹资活动现金流净额,本期金额筹资活动产生的现金流量净额 +当期筹资活动现金流净额,本期发生额筹资活动产生的现金流量净额 +当期筹资活动现金流净额,2023年筹资活动产生的现金流量净额 +当期筹资活动现金流净额,2023年全年筹资活动产生的现金流量净额 +当期筹资活动现金流净额,2023年金额筹资活动产生的现金流量净额 +当期筹资活动现金流净额,当期筹资活动现金净流量 +当期筹资活动现金流净额,本期筹资活动现金净流量 +当期筹资活动现金流净额,本报告期筹资活动现金净流量 +当期筹资活动现金流净额,报告期筹资活动现金净流量 +当期筹资活动现金流净额,报告期内筹资活动现金净流量 +当期筹资活动现金流净额,本年度筹资活动现金净流量 +当期筹资活动现金流净额,本期金额筹资活动现金净流量 +当期筹资活动现金流净额,本期发生额筹资活动现金净流量 +当期筹资活动现金流净额,2023年筹资活动现金净流量 +当期筹资活动现金流净额,2023年全年筹资活动现金净流量 +当期筹资活动现金流净额,2023年金额筹资活动现金净流量 +当期筹资活动现金流净额,当期筹资性活动现金流 +当期筹资活动现金流净额,本期筹资性活动现金流 +当期筹资活动现金流净额,本报告期筹资性活动现金流 +当期筹资活动现金流净额,报告期筹资性活动现金流 +当期筹资活动现金流净额,报告期内筹资性活动现金流 +当期筹资活动现金流净额,本年度筹资性活动现金流 +当期筹资活动现金流净额,本期金额筹资性活动现金流 +当期筹资活动现金流净额,本期发生额筹资性活动现金流 +当期筹资活动现金流净额,2023年筹资性活动现金流 +当期筹资活动现金流净额,2023年全年筹资性活动现金流 +当期筹资活动现金流净额,2023年金额筹资性活动现金流 +上年同期筹资活动现金流净额,上年同期筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,上期筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,上期金额筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,上年筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,上年度筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,2022年筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,2022年全年筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,2022年金额筹资活动产生的现金流量净额 +上年同期筹资活动现金流净额,上年同期筹资活动现金净流量 +上年同期筹资活动现金流净额,上期筹资活动现金净流量 +上年同期筹资活动现金流净额,上期金额筹资活动现金净流量 +上年同期筹资活动现金流净额,上年筹资活动现金净流量 +上年同期筹资活动现金流净额,上年度筹资活动现金净流量 +上年同期筹资活动现金流净额,2022年筹资活动现金净流量 +上年同期筹资活动现金流净额,2022年全年筹资活动现金净流量 +上年同期筹资活动现金流净额,2022年金额筹资活动现金净流量 +上年同期筹资活动现金流净额,上年同期筹资性活动现金流 +上年同期筹资活动现金流净额,上期筹资性活动现金流 +上年同期筹资活动现金流净额,上期金额筹资性活动现金流 +上年同期筹资活动现金流净额,上年筹资性活动现金流 +上年同期筹资活动现金流净额,上年度筹资性活动现金流 +上年同期筹资活动现金流净额,2022年筹资性活动现金流 +上年同期筹资活动现金流净额,2022年全年筹资性活动现金流 +上年同期筹资活动现金流净额,2022年金额筹资性活动现金流 +前年同期筹资活动现金流净额,前年同期筹资活动产生的现金流量净额 +前年同期筹资活动现金流净额,2021年筹资活动产生的现金流量净额 +前年同期筹资活动现金流净额,2021年全年筹资活动产生的现金流量净额 +前年同期筹资活动现金流净额,2021年金额筹资活动产生的现金流量净额 +前年同期筹资活动现金流净额,前年同期筹资活动现金净流量 +前年同期筹资活动现金流净额,2021年筹资活动现金净流量 +前年同期筹资活动现金流净额,2021年全年筹资活动现金净流量 +前年同期筹资活动现金流净额,2021年金额筹资活动现金净流量 +前年同期筹资活动现金流净额,前年同期筹资性活动现金流 +前年同期筹资活动现金流净额,2021年筹资性活动现金流 +前年同期筹资活动现金流净额,2021年全年筹资性活动现金流 +前年同期筹资活动现金流净额,2021年金额筹资性活动现金流 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额同比变动 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额同比增减 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额同比上升 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额同比下降 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额变化幅度 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额变动比例 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额本期比上年同期增减 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额本年比上年增减 +筹资活动现金流净额同比变动,筹资活动产生的现金流量净额本期期末金额较上期期末变动比例 +筹资活动现金流净额同比变动,筹资活动现金净流量同比变动 +筹资活动现金流净额同比变动,筹资活动现金净流量同比增减 +筹资活动现金流净额同比变动,筹资活动现金净流量同比上升 +筹资活动现金流净额同比变动,筹资活动现金净流量同比下降 +筹资活动现金流净额同比变动,筹资活动现金净流量变化幅度 +筹资活动现金流净额同比变动,筹资活动现金净流量变动比例 +筹资活动现金流净额同比变动,筹资活动现金净流量本期比上年同期增减 +筹资活动现金流净额同比变动,筹资活动现金净流量本年比上年增减 +筹资活动现金流净额同比变动,筹资活动现金净流量本期期末金额较上期期末变动比例 +筹资活动现金流净额同比变动,筹资性活动现金流同比变动 +筹资活动现金流净额同比变动,筹资性活动现金流同比增减 +筹资活动现金流净额同比变动,筹资性活动现金流同比上升 +筹资活动现金流净额同比变动,筹资性活动现金流同比下降 +筹资活动现金流净额同比变动,筹资性活动现金流变化幅度 +筹资活动现金流净额同比变动,筹资性活动现金流变动比例 +筹资活动现金流净额同比变动,筹资性活动现金流本期比上年同期增减 +筹资活动现金流净额同比变动,筹资性活动现金流本年比上年增减 +筹资活动现金流净额同比变动,筹资性活动现金流本期期末金额较上期期末变动比例 +当期投资活动现金流净额,当期投资活动产生的现金流量净额 +当期投资活动现金流净额,本期投资活动产生的现金流量净额 +当期投资活动现金流净额,本报告期投资活动产生的现金流量净额 +当期投资活动现金流净额,报告期投资活动产生的现金流量净额 +当期投资活动现金流净额,报告期内投资活动产生的现金流量净额 +当期投资活动现金流净额,本年度投资活动产生的现金流量净额 +当期投资活动现金流净额,本期金额投资活动产生的现金流量净额 +当期投资活动现金流净额,本期发生额投资活动产生的现金流量净额 +当期投资活动现金流净额,2023年投资活动产生的现金流量净额 +当期投资活动现金流净额,2023年全年投资活动产生的现金流量净额 +当期投资活动现金流净额,2023年金额投资活动产生的现金流量净额 +当期投资活动现金流净额,当期投资活动现金净流量 +当期投资活动现金流净额,本期投资活动现金净流量 +当期投资活动现金流净额,本报告期投资活动现金净流量 +当期投资活动现金流净额,报告期投资活动现金净流量 +当期投资活动现金流净额,报告期内投资活动现金净流量 +当期投资活动现金流净额,本年度投资活动现金净流量 +当期投资活动现金流净额,本期金额投资活动现金净流量 +当期投资活动现金流净额,本期发生额投资活动现金净流量 +当期投资活动现金流净额,2023年投资活动现金净流量 +当期投资活动现金流净额,2023年全年投资活动现金净流量 +当期投资活动现金流净额,2023年金额投资活动现金净流量 +当期投资活动现金流净额,当期投资性活动现金流 +当期投资活动现金流净额,本期投资性活动现金流 +当期投资活动现金流净额,本报告期投资性活动现金流 +当期投资活动现金流净额,报告期投资性活动现金流 +当期投资活动现金流净额,报告期内投资性活动现金流 +当期投资活动现金流净额,本年度投资性活动现金流 +当期投资活动现金流净额,本期金额投资性活动现金流 +当期投资活动现金流净额,本期发生额投资性活动现金流 +当期投资活动现金流净额,2023年投资性活动现金流 +当期投资活动现金流净额,2023年全年投资性活动现金流 +当期投资活动现金流净额,2023年金额投资性活动现金流 +上年同期投资活动现金流净额,上年同期投资活动产生的现金流量净额 +上年同期投资活动现金流净额,上期投资活动产生的现金流量净额 +上年同期投资活动现金流净额,上期金额投资活动产生的现金流量净额 +上年同期投资活动现金流净额,上年投资活动产生的现金流量净额 +上年同期投资活动现金流净额,上年度投资活动产生的现金流量净额 +上年同期投资活动现金流净额,2022年投资活动产生的现金流量净额 +上年同期投资活动现金流净额,2022年全年投资活动产生的现金流量净额 +上年同期投资活动现金流净额,2022年金额投资活动产生的现金流量净额 +上年同期投资活动现金流净额,上年同期投资活动现金净流量 +上年同期投资活动现金流净额,上期投资活动现金净流量 +上年同期投资活动现金流净额,上期金额投资活动现金净流量 +上年同期投资活动现金流净额,上年投资活动现金净流量 +上年同期投资活动现金流净额,上年度投资活动现金净流量 +上年同期投资活动现金流净额,2022年投资活动现金净流量 +上年同期投资活动现金流净额,2022年全年投资活动现金净流量 +上年同期投资活动现金流净额,2022年金额投资活动现金净流量 +上年同期投资活动现金流净额,上年同期投资性活动现金流 +上年同期投资活动现金流净额,上期投资性活动现金流 +上年同期投资活动现金流净额,上期金额投资性活动现金流 +上年同期投资活动现金流净额,上年投资性活动现金流 +上年同期投资活动现金流净额,上年度投资性活动现金流 +上年同期投资活动现金流净额,2022年投资性活动现金流 +上年同期投资活动现金流净额,2022年全年投资性活动现金流 +上年同期投资活动现金流净额,2022年金额投资性活动现金流 +前年同期投资活动现金流净额,前年同期投资活动产生的现金流量净额 +前年同期投资活动现金流净额,2021年投资活动产生的现金流量净额 +前年同期投资活动现金流净额,2021年全年投资活动产生的现金流量净额 +前年同期投资活动现金流净额,2021年金额投资活动产生的现金流量净额 +前年同期投资活动现金流净额,前年同期投资活动现金净流量 +前年同期投资活动现金流净额,2021年投资活动现金净流量 +前年同期投资活动现金流净额,2021年全年投资活动现金净流量 +前年同期投资活动现金流净额,2021年金额投资活动现金净流量 +前年同期投资活动现金流净额,前年同期投资性活动现金流 +前年同期投资活动现金流净额,2021年投资性活动现金流 +前年同期投资活动现金流净额,2021年全年投资性活动现金流 +前年同期投资活动现金流净额,2021年金额投资性活动现金流 +投资活动现金流净额同比变动,投资活动产生的现金流量净额同比变动 +投资活动现金流净额同比变动,投资活动产生的现金流量净额同比增减 +投资活动现金流净额同比变动,投资活动产生的现金流量净额同比上升 +投资活动现金流净额同比变动,投资活动产生的现金流量净额同比下降 +投资活动现金流净额同比变动,投资活动产生的现金流量净额变化幅度 +投资活动现金流净额同比变动,投资活动产生的现金流量净额变动比例 +投资活动现金流净额同比变动,投资活动产生的现金流量净额本期比上年同期增减 +投资活动现金流净额同比变动,投资活动产生的现金流量净额本年比上年增减 +投资活动现金流净额同比变动,投资活动产生的现金流量净额本期期末金额较上期期末变动比例 +投资活动现金流净额同比变动,投资活动现金净流量同比变动 +投资活动现金流净额同比变动,投资活动现金净流量同比增减 +投资活动现金流净额同比变动,投资活动现金净流量同比上升 +投资活动现金流净额同比变动,投资活动现金净流量同比下降 +投资活动现金流净额同比变动,投资活动现金净流量变化幅度 +投资活动现金流净额同比变动,投资活动现金净流量变动比例 +投资活动现金流净额同比变动,投资活动现金净流量本期比上年同期增减 +投资活动现金流净额同比变动,投资活动现金净流量本年比上年增减 +投资活动现金流净额同比变动,投资活动现金净流量本期期末金额较上期期末变动比例 +投资活动现金流净额同比变动,投资性活动现金流同比变动 +投资活动现金流净额同比变动,投资性活动现金流同比增减 +投资活动现金流净额同比变动,投资性活动现金流同比上升 +投资活动现金流净额同比变动,投资性活动现金流同比下降 +投资活动现金流净额同比变动,投资性活动现金流变化幅度 +投资活动现金流净额同比变动,投资性活动现金流变动比例 +投资活动现金流净额同比变动,投资性活动现金流本期比上年同期增减 +投资活动现金流净额同比变动,投资性活动现金流本年比上年增减 +投资活动现金流净额同比变动,投资性活动现金流本期期末金额较上期期末变动比例 +当期非经常性损益,当期非经常性损益 +当期非经常性损益,本期非经常性损益 +当期非经常性损益,本报告期非经常性损益 +当期非经常性损益,报告期非经常性损益 +当期非经常性损益,报告期内非经常性损益 +当期非经常性损益,本年度非经常性损益 +当期非经常性损益,本期金额非经常性损益 +当期非经常性损益,本期发生额非经常性损益 +当期非经常性损益,2023年非经常性损益 +当期非经常性损益,2023年全年非经常性损益 +当期非经常性损益,2023年金额非经常性损益 +当期非经常性损益,当期非经常性损益合计 +当期非经常性损益,本期非经常性损益合计 +当期非经常性损益,本报告期非经常性损益合计 +当期非经常性损益,报告期非经常性损益合计 +当期非经常性损益,报告期内非经常性损益合计 +当期非经常性损益,本年度非经常性损益合计 +当期非经常性损益,本期金额非经常性损益合计 +当期非经常性损益,本期发生额非经常性损益合计 +当期非经常性损益,2023年非经常性损益合计 +当期非经常性损益,2023年全年非经常性损益合计 +当期非经常性损益,2023年金额非经常性损益合计 +当期非经常性损益,当期非经常性损益项目合计 +当期非经常性损益,本期非经常性损益项目合计 +当期非经常性损益,本报告期非经常性损益项目合计 +当期非经常性损益,报告期非经常性损益项目合计 +当期非经常性损益,报告期内非经常性损益项目合计 +当期非经常性损益,本年度非经常性损益项目合计 +当期非经常性损益,本期金额非经常性损益项目合计 +当期非经常性损益,本期发生额非经常性损益项目合计 +当期非经常性损益,2023年非经常性损益项目合计 +当期非经常性损益,2023年全年非经常性损益项目合计 +当期非经常性损益,2023年金额非经常性损益项目合计 +当期非经常性损益,当期非经常性损益项目净额 +当期非经常性损益,本期非经常性损益项目净额 +当期非经常性损益,本报告期非经常性损益项目净额 +当期非经常性损益,报告期非经常性损益项目净额 +当期非经常性损益,报告期内非经常性损益项目净额 +当期非经常性损益,本年度非经常性损益项目净额 +当期非经常性损益,本期金额非经常性损益项目净额 +当期非经常性损益,本期发生额非经常性损益项目净额 +当期非经常性损益,2023年非经常性损益项目净额 +当期非经常性损益,2023年全年非经常性损益项目净额 +当期非经常性损益,2023年金额非经常性损益项目净额 +上年同期非经常性损益,上年同期非经常性损益 +上年同期非经常性损益,上期非经常性损益 +上年同期非经常性损益,上期金额非经常性损益 +上年同期非经常性损益,上年非经常性损益 +上年同期非经常性损益,上年度非经常性损益 +上年同期非经常性损益,2022年非经常性损益 +上年同期非经常性损益,2022年全年非经常性损益 +上年同期非经常性损益,2022年金额非经常性损益 +上年同期非经常性损益,上年同期非经常性损益合计 +上年同期非经常性损益,上期非经常性损益合计 +上年同期非经常性损益,上期金额非经常性损益合计 +上年同期非经常性损益,上年非经常性损益合计 +上年同期非经常性损益,上年度非经常性损益合计 +上年同期非经常性损益,2022年非经常性损益合计 +上年同期非经常性损益,2022年全年非经常性损益合计 +上年同期非经常性损益,2022年金额非经常性损益合计 +上年同期非经常性损益,上年同期非经常性损益项目合计 +上年同期非经常性损益,上期非经常性损益项目合计 +上年同期非经常性损益,上期金额非经常性损益项目合计 +上年同期非经常性损益,上年非经常性损益项目合计 +上年同期非经常性损益,上年度非经常性损益项目合计 +上年同期非经常性损益,2022年非经常性损益项目合计 +上年同期非经常性损益,2022年全年非经常性损益项目合计 +上年同期非经常性损益,2022年金额非经常性损益项目合计 +上年同期非经常性损益,上年同期非经常性损益项目净额 +上年同期非经常性损益,上期非经常性损益项目净额 +上年同期非经常性损益,上期金额非经常性损益项目净额 +上年同期非经常性损益,上年非经常性损益项目净额 +上年同期非经常性损益,上年度非经常性损益项目净额 +上年同期非经常性损益,2022年非经常性损益项目净额 +上年同期非经常性损益,2022年全年非经常性损益项目净额 +上年同期非经常性损益,2022年金额非经常性损益项目净额 +前年同期非经常性损益,前年同期非经常性损益 +前年同期非经常性损益,2021年非经常性损益 +前年同期非经常性损益,2021年全年非经常性损益 +前年同期非经常性损益,2021年金额非经常性损益 +前年同期非经常性损益,前年同期非经常性损益合计 +前年同期非经常性损益,2021年非经常性损益合计 +前年同期非经常性损益,2021年全年非经常性损益合计 +前年同期非经常性损益,2021年金额非经常性损益合计 +前年同期非经常性损益,前年同期非经常性损益项目合计 +前年同期非经常性损益,2021年非经常性损益项目合计 +前年同期非经常性损益,2021年全年非经常性损益项目合计 +前年同期非经常性损益,2021年金额非经常性损益项目合计 +前年同期非经常性损益,前年同期非经常性损益项目净额 +前年同期非经常性损益,2021年非经常性损益项目净额 +前年同期非经常性损益,2021年全年非经常性损益项目净额 +前年同期非经常性损益,2021年金额非经常性损益项目净额 +非经常性损益同比变动,非经常性损益同比变动 +非经常性损益同比变动,非经常性损益同比增减 +非经常性损益同比变动,非经常性损益同比上升 +非经常性损益同比变动,非经常性损益同比下降 +非经常性损益同比变动,非经常性损益变化幅度 +非经常性损益同比变动,非经常性损益变动比例 +非经常性损益同比变动,非经常性损益本期比上年同期增减 +非经常性损益同比变动,非经常性损益本年比上年增减 +非经常性损益同比变动,非经常性损益本期期末金额较上期期末变动比例 +非经常性损益同比变动,非经常性损益合计同比变动 +非经常性损益同比变动,非经常性损益合计同比增减 +非经常性损益同比变动,非经常性损益合计同比上升 +非经常性损益同比变动,非经常性损益合计同比下降 +非经常性损益同比变动,非经常性损益合计变化幅度 +非经常性损益同比变动,非经常性损益合计变动比例 +非经常性损益同比变动,非经常性损益合计本期比上年同期增减 +非经常性损益同比变动,非经常性损益合计本年比上年增减 +非经常性损益同比变动,非经常性损益合计本期期末金额较上期期末变动比例 +非经常性损益同比变动,非经常性损益项目合计同比变动 +非经常性损益同比变动,非经常性损益项目合计同比增减 +非经常性损益同比变动,非经常性损益项目合计同比上升 +非经常性损益同比变动,非经常性损益项目合计同比下降 +非经常性损益同比变动,非经常性损益项目合计变化幅度 +非经常性损益同比变动,非经常性损益项目合计变动比例 +非经常性损益同比变动,非经常性损益项目合计本期比上年同期增减 +非经常性损益同比变动,非经常性损益项目合计本年比上年增减 +非经常性损益同比变动,非经常性损益项目合计本期期末金额较上期期末变动比例 +非经常性损益同比变动,非经常性损益项目净额同比变动 +非经常性损益同比变动,非经常性损益项目净额同比增减 +非经常性损益同比变动,非经常性损益项目净额同比上升 +非经常性损益同比变动,非经常性损益项目净额同比下降 +非经常性损益同比变动,非经常性损益项目净额变化幅度 +非经常性损益同比变动,非经常性损益项目净额变动比例 +非经常性损益同比变动,非经常性损益项目净额本期比上年同期增减 +非经常性损益同比变动,非经常性损益项目净额本年比上年增减 +非经常性损益同比变动,非经常性损益项目净额本期期末金额较上期期末变动比例 +当期基本每股收益,当期基本每股收益 +当期基本每股收益,本期基本每股收益 +当期基本每股收益,本报告期基本每股收益 +当期基本每股收益,报告期基本每股收益 +当期基本每股收益,报告期内基本每股收益 +当期基本每股收益,本年度基本每股收益 +当期基本每股收益,本期金额基本每股收益 +当期基本每股收益,本期发生额基本每股收益 +当期基本每股收益,2023年基本每股收益 +当期基本每股收益,2023年全年基本每股收益 +当期基本每股收益,2023年金额基本每股收益 +当期基本每股收益,当期归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,本期归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,本报告期归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,报告期归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,报告期内归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,本年度归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,本期金额归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,本期发生额归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,2023年归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,2023年全年归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,2023年金额归属于公司普通股股东的净利润基本每股收益 +当期基本每股收益,当期归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,本期归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,本报告期归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,报告期归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,报告期内归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,本年度归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,本期金额归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,本期发生额归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,2023年归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,2023年全年归属于公司普通股股东的净利润每股收益基本每股收益 +当期基本每股收益,2023年金额归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,上年同期基本每股收益 +上年同期基本每股收益,上期基本每股收益 +上年同期基本每股收益,上期金额基本每股收益 +上年同期基本每股收益,上年基本每股收益 +上年同期基本每股收益,上年度基本每股收益 +上年同期基本每股收益,2022年基本每股收益 +上年同期基本每股收益,2022年全年基本每股收益 +上年同期基本每股收益,2022年金额基本每股收益 +上年同期基本每股收益,上年同期归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,上期归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,上期金额归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,上年归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,上年度归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,2022年归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,2022年全年归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,2022年金额归属于公司普通股股东的净利润基本每股收益 +上年同期基本每股收益,上年同期归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,上期归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,上期金额归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,上年归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,上年度归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,2022年归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,2022年全年归属于公司普通股股东的净利润每股收益基本每股收益 +上年同期基本每股收益,2022年金额归属于公司普通股股东的净利润每股收益基本每股收益 +前年同期基本每股收益,前年同期基本每股收益 +前年同期基本每股收益,2021年基本每股收益 +前年同期基本每股收益,2021年全年基本每股收益 +前年同期基本每股收益,2021年金额基本每股收益 +前年同期基本每股收益,前年同期归属于公司普通股股东的净利润基本每股收益 +前年同期基本每股收益,2021年归属于公司普通股股东的净利润基本每股收益 +前年同期基本每股收益,2021年全年归属于公司普通股股东的净利润基本每股收益 +前年同期基本每股收益,2021年金额归属于公司普通股股东的净利润基本每股收益 +前年同期基本每股收益,前年同期归属于公司普通股股东的净利润每股收益基本每股收益 +前年同期基本每股收益,2021年归属于公司普通股股东的净利润每股收益基本每股收益 +前年同期基本每股收益,2021年全年归属于公司普通股股东的净利润每股收益基本每股收益 +前年同期基本每股收益,2021年金额归属于公司普通股股东的净利润每股收益基本每股收益 +基本每股收益同比变动,基本每股收益同比变动 +基本每股收益同比变动,基本每股收益同比增减 +基本每股收益同比变动,基本每股收益同比上升 +基本每股收益同比变动,基本每股收益同比下降 +基本每股收益同比变动,基本每股收益变化幅度 +基本每股收益同比变动,基本每股收益变动比例 +基本每股收益同比变动,基本每股收益本期比上年同期增减 +基本每股收益同比变动,基本每股收益本年比上年增减 +基本每股收益同比变动,基本每股收益本期期末金额较上期期末变动比例 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益同比变动 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益同比增减 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益同比上升 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益同比下降 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益变化幅度 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益变动比例 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益本期比上年同期增减 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益本年比上年增减 +基本每股收益同比变动,归属于公司普通股股东的净利润基本每股收益本期期末金额较上期期末变动比例 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益同比变动 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益同比增减 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益同比上升 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益同比下降 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益变化幅度 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益变动比例 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益本期比上年同期增减 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益本年比上年增减 +基本每股收益同比变动,归属于公司普通股股东的净利润每股收益基本每股收益本期期末金额较上期期末变动比例 +当期稀释每股收益,当期稀释每股收益 +当期稀释每股收益,本期稀释每股收益 +当期稀释每股收益,本报告期稀释每股收益 +当期稀释每股收益,报告期稀释每股收益 +当期稀释每股收益,报告期内稀释每股收益 +当期稀释每股收益,本年度稀释每股收益 +当期稀释每股收益,本期金额稀释每股收益 +当期稀释每股收益,本期发生额稀释每股收益 +当期稀释每股收益,2023年稀释每股收益 +当期稀释每股收益,2023年全年稀释每股收益 +当期稀释每股收益,2023年金额稀释每股收益 +当期稀释每股收益,当期归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,本期归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,本报告期归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,报告期归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,报告期内归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,本年度归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,本期金额归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,本期发生额归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,2023年归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,2023年全年归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,2023年金额归属于公司普通股股东的净利润稀释每股收益 +当期稀释每股收益,当期归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,本期归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,本报告期归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,报告期归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,报告期内归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,本年度归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,本期金额归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,本期发生额归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,2023年归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,2023年全年归属于公司普通股股东的净利润每股收益稀释每股收益 +当期稀释每股收益,2023年金额归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,上年同期稀释每股收益 +上年同期稀释每股收益,上期稀释每股收益 +上年同期稀释每股收益,上期金额稀释每股收益 +上年同期稀释每股收益,上年稀释每股收益 +上年同期稀释每股收益,上年度稀释每股收益 +上年同期稀释每股收益,2022年稀释每股收益 +上年同期稀释每股收益,2022年全年稀释每股收益 +上年同期稀释每股收益,2022年金额稀释每股收益 +上年同期稀释每股收益,上年同期归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,上期归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,上期金额归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,上年归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,上年度归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,2022年归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,2022年全年归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,2022年金额归属于公司普通股股东的净利润稀释每股收益 +上年同期稀释每股收益,上年同期归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,上期归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,上期金额归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,上年归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,上年度归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,2022年归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,2022年全年归属于公司普通股股东的净利润每股收益稀释每股收益 +上年同期稀释每股收益,2022年金额归属于公司普通股股东的净利润每股收益稀释每股收益 +前年同期稀释每股收益,前年同期稀释每股收益 +前年同期稀释每股收益,2021年稀释每股收益 +前年同期稀释每股收益,2021年全年稀释每股收益 +前年同期稀释每股收益,2021年金额稀释每股收益 +前年同期稀释每股收益,前年同期归属于公司普通股股东的净利润稀释每股收益 +前年同期稀释每股收益,2021年归属于公司普通股股东的净利润稀释每股收益 +前年同期稀释每股收益,2021年全年归属于公司普通股股东的净利润稀释每股收益 +前年同期稀释每股收益,2021年金额归属于公司普通股股东的净利润稀释每股收益 +前年同期稀释每股收益,前年同期归属于公司普通股股东的净利润每股收益稀释每股收益 +前年同期稀释每股收益,2021年归属于公司普通股股东的净利润每股收益稀释每股收益 +前年同期稀释每股收益,2021年全年归属于公司普通股股东的净利润每股收益稀释每股收益 +前年同期稀释每股收益,2021年金额归属于公司普通股股东的净利润每股收益稀释每股收益 +稀释每股收益同比变动,稀释每股收益同比变动 +稀释每股收益同比变动,稀释每股收益同比增减 +稀释每股收益同比变动,稀释每股收益同比上升 +稀释每股收益同比变动,稀释每股收益同比下降 +稀释每股收益同比变动,稀释每股收益变化幅度 +稀释每股收益同比变动,稀释每股收益变动比例 +稀释每股收益同比变动,稀释每股收益本期比上年同期增减 +稀释每股收益同比变动,稀释每股收益本年比上年增减 +稀释每股收益同比变动,稀释每股收益本期期末金额较上期期末变动比例 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益同比变动 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益同比增减 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益同比上升 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益同比下降 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益变化幅度 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益变动比例 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益本期比上年同期增减 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益本年比上年增减 +稀释每股收益同比变动,归属于公司普通股股东的净利润稀释每股收益本期期末金额较上期期末变动比例 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益同比变动 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益同比增减 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益同比上升 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益同比下降 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益变化幅度 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益变动比例 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益本期比上年同期增减 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益本年比上年增减 +稀释每股收益同比变动,归属于公司普通股股东的净利润每股收益稀释每股收益本期期末金额较上期期末变动比例 +当期加权平均净资产收益率,当期加权平均净资产收益率 +当期加权平均净资产收益率,本期加权平均净资产收益率 +当期加权平均净资产收益率,本报告期加权平均净资产收益率 +当期加权平均净资产收益率,报告期加权平均净资产收益率 +当期加权平均净资产收益率,报告期内加权平均净资产收益率 +当期加权平均净资产收益率,本年度加权平均净资产收益率 +当期加权平均净资产收益率,本期金额加权平均净资产收益率 +当期加权平均净资产收益率,本期发生额加权平均净资产收益率 +当期加权平均净资产收益率,2023年加权平均净资产收益率 +当期加权平均净资产收益率,2023年全年加权平均净资产收益率 +当期加权平均净资产收益率,2023年金额加权平均净资产收益率 +当期加权平均净资产收益率,当期归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本期归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本报告期归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,报告期归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,报告期内归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本年度归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本期金额归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本期发生额归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,2023年归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,2023年全年归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,2023年金额归属于公司普通股股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,当期归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本期归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本报告期归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,报告期归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,报告期内归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本年度归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本期金额归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,本期发生额归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,2023年归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,2023年全年归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,2023年金额归属于上市公司股东的净利润加权平均净资产收益率 +当期加权平均净资产收益率,当期加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,本期加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,本报告期加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,报告期加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,报告期内加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,本年度加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,本期金额加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,本期发生额加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,2023年加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,2023年全年加权平均净资产收益率(扣非前) +当期加权平均净资产收益率,2023年金额加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,上年同期加权平均净资产收益率 +上年同期加权平均净资产收益率,上期加权平均净资产收益率 +上年同期加权平均净资产收益率,上期金额加权平均净资产收益率 +上年同期加权平均净资产收益率,上年加权平均净资产收益率 +上年同期加权平均净资产收益率,上年度加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年全年加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年金额加权平均净资产收益率 +上年同期加权平均净资产收益率,上年同期归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上期归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上期金额归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上年归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上年度归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年全年归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年金额归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上年同期归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上期归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上期金额归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上年归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上年度归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年全年归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,2022年金额归属于上市公司股东的净利润加权平均净资产收益率 +上年同期加权平均净资产收益率,上年同期加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,上期加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,上期金额加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,上年加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,上年度加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,2022年加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,2022年全年加权平均净资产收益率(扣非前) +上年同期加权平均净资产收益率,2022年金额加权平均净资产收益率(扣非前) +前年同期加权平均净资产收益率,前年同期加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年全年加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年金额加权平均净资产收益率 +前年同期加权平均净资产收益率,前年同期归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年全年归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年金额归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,前年同期归属于上市公司股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年归属于上市公司股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年全年归属于上市公司股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,2021年金额归属于上市公司股东的净利润加权平均净资产收益率 +前年同期加权平均净资产收益率,前年同期加权平均净资产收益率(扣非前) +前年同期加权平均净资产收益率,2021年加权平均净资产收益率(扣非前) +前年同期加权平均净资产收益率,2021年全年加权平均净资产收益率(扣非前) +前年同期加权平均净资产收益率,2021年金额加权平均净资产收益率(扣非前) +加权平均净资产收益率同比变动,加权平均净资产收益率同比变动 +加权平均净资产收益率同比变动,加权平均净资产收益率同比增减 +加权平均净资产收益率同比变动,加权平均净资产收益率同比上升 +加权平均净资产收益率同比变动,加权平均净资产收益率同比下降 +加权平均净资产收益率同比变动,加权平均净资产收益率变化幅度 +加权平均净资产收益率同比变动,加权平均净资产收益率变动比例 +加权平均净资产收益率同比变动,加权平均净资产收益率本期比上年同期增减 +加权平均净资产收益率同比变动,加权平均净资产收益率本年比上年增减 +加权平均净资产收益率同比变动,加权平均净资产收益率本期期末金额较上期期末变动比例 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率同比变动 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率同比增减 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率同比上升 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率同比下降 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率变化幅度 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率变动比例 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率本期比上年同期增减 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率本年比上年增减 +加权平均净资产收益率同比变动,归属于公司普通股股东的净利润加权平均净资产收益率本期期末金额较上期期末变动比例 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率同比变动 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率同比增减 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率同比上升 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率同比下降 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率变化幅度 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率变动比例 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率本期比上年同期增减 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率本年比上年增减 +加权平均净资产收益率同比变动,归属于上市公司股东的净利润加权平均净资产收益率本期期末金额较上期期末变动比例 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)同比变动 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)同比增减 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)同比上升 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)同比下降 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)变化幅度 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)变动比例 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)本期比上年同期增减 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)本年比上年增减 +加权平均净资产收益率同比变动,加权平均净资产收益率(扣非前)本期期末金额较上期期末变动比例 +当期扣非加权平均净资产收益率,当期扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,本报告期扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期内扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,本年度扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期金额扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期发生额扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年全年扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年金额扣非加权平均净资产收益率 +当期扣非加权平均净资产收益率,当期扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,本报告期扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期内扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,本年度扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期金额扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期发生额扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年全年扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年金额扣除非经常性损益后的加权平均净资产收益率 +当期扣非加权平均净资产收益率,当期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本报告期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期内扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本年度扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期发生额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年全年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,当期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本报告期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,报告期内归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本年度归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,本期发生额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年全年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,2023年金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +当期扣非加权平均净资产收益率,当期加权平均净资产收益率( +当期扣非加权平均净资产收益率,本期加权平均净资产收益率( +当期扣非加权平均净资产收益率,本报告期加权平均净资产收益率( +当期扣非加权平均净资产收益率,报告期加权平均净资产收益率( +当期扣非加权平均净资产收益率,报告期内加权平均净资产收益率( +当期扣非加权平均净资产收益率,本年度加权平均净资产收益率( +当期扣非加权平均净资产收益率,本期金额加权平均净资产收益率( +当期扣非加权平均净资产收益率,本期发生额加权平均净资产收益率( +当期扣非加权平均净资产收益率,2023年加权平均净资产收益率( +当期扣非加权平均净资产收益率,2023年全年加权平均净资产收益率( +当期扣非加权平均净资产收益率,2023年金额加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,上年同期扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期金额扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年度扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年全年扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年金额扣非加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年同期扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期金额扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年度扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年全年扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年金额扣除非经常性损益后的加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年同期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年度扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年全年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年同期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上期金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年度归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年全年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,2022年金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +上年同期扣非加权平均净资产收益率,上年同期加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,上期加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,上期金额加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,上年加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,上年度加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,2022年加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,2022年全年加权平均净资产收益率( +上年同期扣非加权平均净资产收益率,2022年金额加权平均净资产收益率( +前年同期扣非加权平均净资产收益率,前年同期扣非加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年扣非加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年全年扣非加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年金额扣非加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,前年同期扣除非经常性损益后的加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年扣除非经常性损益后的加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年全年扣除非经常性损益后的加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年金额扣除非经常性损益后的加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,前年同期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年全年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,前年同期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年全年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,2021年金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率 +前年同期扣非加权平均净资产收益率,前年同期加权平均净资产收益率( +前年同期扣非加权平均净资产收益率,2021年加权平均净资产收益率( +前年同期扣非加权平均净资产收益率,2021年全年加权平均净资产收益率( +前年同期扣非加权平均净资产收益率,2021年金额加权平均净资产收益率( +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率同比变动 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率同比增减 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率同比上升 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率同比下降 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率变化幅度 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率变动比例 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率本期比上年同期增减 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率本年比上年增减 +扣非加权平均净资产收益率同比变动,扣非加权平均净资产收益率本期期末金额较上期期末变动比例 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率同比变动 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率同比增减 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率同比上升 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率同比下降 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率变化幅度 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率变动比例 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率本期比上年同期增减 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率本年比上年增减 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后的加权平均净资产收益率本期期末金额较上期期末变动比例 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率同比变动 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率同比增减 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率同比上升 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率同比下降 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率变化幅度 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率变动比例 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率本期比上年同期增减 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率本年比上年增减 +扣非加权平均净资产收益率同比变动,扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率本期期末金额较上期期末变动比例 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率同比变动 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率同比增减 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率同比上升 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率同比下降 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率变化幅度 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率变动比例 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率本期比上年同期增减 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率本年比上年增减 +扣非加权平均净资产收益率同比变动,归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率本期期末金额较上期期末变动比例 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(同比变动 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(同比增减 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(同比上升 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(同比下降 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(变化幅度 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(变动比例 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(本期比上年同期增减 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(本年比上年增减 +扣非加权平均净资产收益率同比变动,加权平均净资产收益率(本期期末金额较上期期末变动比例 +报告期末总资产,报告期末总资产 +报告期末总资产,本报告期末总资产 +报告期末总资产,期末总资产 +报告期末总资产,期末数总资产 +报告期末总资产,期末金额总资产 +报告期末总资产,2023年年末总资产 +报告期末总资产,2023年12月31日总资产 +报告期末总资产,2023年总资产 +报告期末总资产,报告期末资产总计 +报告期末总资产,本报告期末资产总计 +报告期末总资产,期末资产总计 +报告期末总资产,期末数资产总计 +报告期末总资产,期末金额资产总计 +报告期末总资产,2023年年末资产总计 +报告期末总资产,2023年12月31日资产总计 +报告期末总资产,2023年资产总计 +报告期末总资产,报告期末资产总额 +报告期末总资产,本报告期末资产总额 +报告期末总资产,期末资产总额 +报告期末总资产,期末数资产总额 +报告期末总资产,期末金额资产总额 +报告期末总资产,2023年年末资产总额 +报告期末总资产,2023年12月31日资产总额 +报告期末总资产,2023年资产总额 +报告期末总资产,报告期末公司总资产 +报告期末总资产,本报告期末公司总资产 +报告期末总资产,期末公司总资产 +报告期末总资产,期末数公司总资产 +报告期末总资产,期末金额公司总资产 +报告期末总资产,2023年年末公司总资产 +报告期末总资产,2023年12月31日公司总资产 +报告期末总资产,2023年公司总资产 +上年年末总资产,上年年末总资产 +上年年末总资产,上年末总资产 +上年年末总资产,2022年年末总资产 +上年年末总资产,2022年12月31日总资产 +上年年末总资产,2022年总资产 +上年年末总资产,上年年末资产总计 +上年年末总资产,上年末资产总计 +上年年末总资产,2022年年末资产总计 +上年年末总资产,2022年12月31日资产总计 +上年年末总资产,2022年资产总计 +上年年末总资产,上年年末资产总额 +上年年末总资产,上年末资产总额 +上年年末总资产,2022年年末资产总额 +上年年末总资产,2022年12月31日资产总额 +上年年末总资产,2022年资产总额 +上年年末总资产,上年年末公司总资产 +上年年末总资产,上年末公司总资产 +上年年末总资产,2022年年末公司总资产 +上年年末总资产,2022年12月31日公司总资产 +上年年末总资产,2022年公司总资产 +报告期初总资产,报告期初总资产 +报告期初总资产,期初总资产 +报告期初总资产,期初数总资产 +报告期初总资产,期初金额总资产 +报告期初总资产,2023年1月1日总资产 +报告期初总资产,报告期初资产总计 +报告期初总资产,期初资产总计 +报告期初总资产,期初数资产总计 +报告期初总资产,期初金额资产总计 +报告期初总资产,2023年1月1日资产总计 +报告期初总资产,报告期初资产总额 +报告期初总资产,期初资产总额 +报告期初总资产,期初数资产总额 +报告期初总资产,期初金额资产总额 +报告期初总资产,2023年1月1日资产总额 +报告期初总资产,报告期初公司总资产 +报告期初总资产,期初公司总资产 +报告期初总资产,期初数公司总资产 +报告期初总资产,期初金额公司总资产 +报告期初总资产,2023年1月1日公司总资产 +总资产同比变动,总资产同比变动 +总资产同比变动,总资产同比增减 +总资产同比变动,总资产同比上升 +总资产同比变动,总资产同比下降 +总资产同比变动,总资产变化幅度 +总资产同比变动,总资产变动比例 +总资产同比变动,总资产本期比上年同期增减 +总资产同比变动,总资产本年比上年增减 +总资产同比变动,总资产本期期末金额较上期期末变动比例 +总资产同比变动,资产总计同比变动 +总资产同比变动,资产总计同比增减 +总资产同比变动,资产总计同比上升 +总资产同比变动,资产总计同比下降 +总资产同比变动,资产总计变化幅度 +总资产同比变动,资产总计变动比例 +总资产同比变动,资产总计本期比上年同期增减 +总资产同比变动,资产总计本年比上年增减 +总资产同比变动,资产总计本期期末金额较上期期末变动比例 +总资产同比变动,资产总额同比变动 +总资产同比变动,资产总额同比增减 +总资产同比变动,资产总额同比上升 +总资产同比变动,资产总额同比下降 +总资产同比变动,资产总额变化幅度 +总资产同比变动,资产总额变动比例 +总资产同比变动,资产总额本期比上年同期增减 +总资产同比变动,资产总额本年比上年增减 +总资产同比变动,资产总额本期期末金额较上期期末变动比例 +总资产同比变动,公司总资产同比变动 +总资产同比变动,公司总资产同比增减 +总资产同比变动,公司总资产同比上升 +总资产同比变动,公司总资产同比下降 +总资产同比变动,公司总资产变化幅度 +总资产同比变动,公司总资产变动比例 +总资产同比变动,公司总资产本期比上年同期增减 +总资产同比变动,公司总资产本年比上年增减 +总资产同比变动,公司总资产本期期末金额较上期期末变动比例 +当期研发投入,当期研发投入 +当期研发投入,本期研发投入 +当期研发投入,本报告期研发投入 +当期研发投入,报告期研发投入 +当期研发投入,报告期内研发投入 +当期研发投入,本年度研发投入 +当期研发投入,本期金额研发投入 +当期研发投入,本期发生额研发投入 +当期研发投入,2023年研发投入 +当期研发投入,2023年全年研发投入 +当期研发投入,2023年金额研发投入 +当期研发投入,当期研发投入金额 +当期研发投入,本期研发投入金额 +当期研发投入,本报告期研发投入金额 +当期研发投入,报告期研发投入金额 +当期研发投入,报告期内研发投入金额 +当期研发投入,本年度研发投入金额 +当期研发投入,本期金额研发投入金额 +当期研发投入,本期发生额研发投入金额 +当期研发投入,2023年研发投入金额 +当期研发投入,2023年全年研发投入金额 +当期研发投入,2023年金额研发投入金额 +当期研发投入,当期研发支出金额 +当期研发投入,本期研发支出金额 +当期研发投入,本报告期研发支出金额 +当期研发投入,报告期研发支出金额 +当期研发投入,报告期内研发支出金额 +当期研发投入,本年度研发支出金额 +当期研发投入,本期金额研发支出金额 +当期研发投入,本期发生额研发支出金额 +当期研发投入,2023年研发支出金额 +当期研发投入,2023年全年研发支出金额 +当期研发投入,2023年金额研发支出金额 +当期研发投入,当期研发投入合计 +当期研发投入,本期研发投入合计 +当期研发投入,本报告期研发投入合计 +当期研发投入,报告期研发投入合计 +当期研发投入,报告期内研发投入合计 +当期研发投入,本年度研发投入合计 +当期研发投入,本期金额研发投入合计 +当期研发投入,本期发生额研发投入合计 +当期研发投入,2023年研发投入合计 +当期研发投入,2023年全年研发投入合计 +当期研发投入,2023年金额研发投入合计 +上年同期研发投入,上年同期研发投入 +上年同期研发投入,上期研发投入 +上年同期研发投入,上期金额研发投入 +上年同期研发投入,上年研发投入 +上年同期研发投入,上年度研发投入 +上年同期研发投入,2022年研发投入 +上年同期研发投入,2022年全年研发投入 +上年同期研发投入,2022年金额研发投入 +上年同期研发投入,上年同期研发投入金额 +上年同期研发投入,上期研发投入金额 +上年同期研发投入,上期金额研发投入金额 +上年同期研发投入,上年研发投入金额 +上年同期研发投入,上年度研发投入金额 +上年同期研发投入,2022年研发投入金额 +上年同期研发投入,2022年全年研发投入金额 +上年同期研发投入,2022年金额研发投入金额 +上年同期研发投入,上年同期研发支出金额 +上年同期研发投入,上期研发支出金额 +上年同期研发投入,上期金额研发支出金额 +上年同期研发投入,上年研发支出金额 +上年同期研发投入,上年度研发支出金额 +上年同期研发投入,2022年研发支出金额 +上年同期研发投入,2022年全年研发支出金额 +上年同期研发投入,2022年金额研发支出金额 +上年同期研发投入,上年同期研发投入合计 +上年同期研发投入,上期研发投入合计 +上年同期研发投入,上期金额研发投入合计 +上年同期研发投入,上年研发投入合计 +上年同期研发投入,上年度研发投入合计 +上年同期研发投入,2022年研发投入合计 +上年同期研发投入,2022年全年研发投入合计 +上年同期研发投入,2022年金额研发投入合计 +前年同期研发投入,前年同期研发投入 +前年同期研发投入,2021年研发投入 +前年同期研发投入,2021年全年研发投入 +前年同期研发投入,2021年金额研发投入 +前年同期研发投入,前年同期研发投入金额 +前年同期研发投入,2021年研发投入金额 +前年同期研发投入,2021年全年研发投入金额 +前年同期研发投入,2021年金额研发投入金额 +前年同期研发投入,前年同期研发支出金额 +前年同期研发投入,2021年研发支出金额 +前年同期研发投入,2021年全年研发支出金额 +前年同期研发投入,2021年金额研发支出金额 +前年同期研发投入,前年同期研发投入合计 +前年同期研发投入,2021年研发投入合计 +前年同期研发投入,2021年全年研发投入合计 +前年同期研发投入,2021年金额研发投入合计 +研发投入同比变动,研发投入同比变动 +研发投入同比变动,研发投入同比增减 +研发投入同比变动,研发投入同比上升 +研发投入同比变动,研发投入同比下降 +研发投入同比变动,研发投入变化幅度 +研发投入同比变动,研发投入变动比例 +研发投入同比变动,研发投入本期比上年同期增减 +研发投入同比变动,研发投入本年比上年增减 +研发投入同比变动,研发投入本期期末金额较上期期末变动比例 +研发投入同比变动,研发投入金额同比变动 +研发投入同比变动,研发投入金额同比增减 +研发投入同比变动,研发投入金额同比上升 +研发投入同比变动,研发投入金额同比下降 +研发投入同比变动,研发投入金额变化幅度 +研发投入同比变动,研发投入金额变动比例 +研发投入同比变动,研发投入金额本期比上年同期增减 +研发投入同比变动,研发投入金额本年比上年增减 +研发投入同比变动,研发投入金额本期期末金额较上期期末变动比例 +研发投入同比变动,研发支出金额同比变动 +研发投入同比变动,研发支出金额同比增减 +研发投入同比变动,研发支出金额同比上升 +研发投入同比变动,研发支出金额同比下降 +研发投入同比变动,研发支出金额变化幅度 +研发投入同比变动,研发支出金额变动比例 +研发投入同比变动,研发支出金额本期比上年同期增减 +研发投入同比变动,研发支出金额本年比上年增减 +研发投入同比变动,研发支出金额本期期末金额较上期期末变动比例 +研发投入同比变动,研发投入合计同比变动 +研发投入同比变动,研发投入合计同比增减 +研发投入同比变动,研发投入合计同比上升 +研发投入同比变动,研发投入合计同比下降 +研发投入同比变动,研发投入合计变化幅度 +研发投入同比变动,研发投入合计变动比例 +研发投入同比变动,研发投入合计本期比上年同期增减 +研发投入同比变动,研发投入合计本年比上年增减 +研发投入同比变动,研发投入合计本期期末金额较上期期末变动比例 +当期资本化研发投入,当期资本化研发投入 +当期资本化研发投入,本期资本化研发投入 +当期资本化研发投入,本报告期资本化研发投入 +当期资本化研发投入,报告期资本化研发投入 +当期资本化研发投入,报告期内资本化研发投入 +当期资本化研发投入,本年度资本化研发投入 +当期资本化研发投入,本期金额资本化研发投入 +当期资本化研发投入,本期发生额资本化研发投入 +当期资本化研发投入,2023年资本化研发投入 +当期资本化研发投入,2023年全年资本化研发投入 +当期资本化研发投入,2023年金额资本化研发投入 +当期资本化研发投入,当期研发投入资本化的金额 +当期资本化研发投入,本期研发投入资本化的金额 +当期资本化研发投入,本报告期研发投入资本化的金额 +当期资本化研发投入,报告期研发投入资本化的金额 +当期资本化研发投入,报告期内研发投入资本化的金额 +当期资本化研发投入,本年度研发投入资本化的金额 +当期资本化研发投入,本期金额研发投入资本化的金额 +当期资本化研发投入,本期发生额研发投入资本化的金额 +当期资本化研发投入,2023年研发投入资本化的金额 +当期资本化研发投入,2023年全年研发投入资本化的金额 +当期资本化研发投入,2023年金额研发投入资本化的金额 +当期资本化研发投入,当期研发支出资本化的金额 +当期资本化研发投入,本期研发支出资本化的金额 +当期资本化研发投入,本报告期研发支出资本化的金额 +当期资本化研发投入,报告期研发支出资本化的金额 +当期资本化研发投入,报告期内研发支出资本化的金额 +当期资本化研发投入,本年度研发支出资本化的金额 +当期资本化研发投入,本期金额研发支出资本化的金额 +当期资本化研发投入,本期发生额研发支出资本化的金额 +当期资本化研发投入,2023年研发支出资本化的金额 +当期资本化研发投入,2023年全年研发支出资本化的金额 +当期资本化研发投入,2023年金额研发支出资本化的金额 +当期资本化研发投入,当期资本化研发投入 +当期资本化研发投入,本期资本化研发投入 +当期资本化研发投入,本报告期资本化研发投入 +当期资本化研发投入,报告期资本化研发投入 +当期资本化研发投入,报告期内资本化研发投入 +当期资本化研发投入,本年度资本化研发投入 +当期资本化研发投入,本期金额资本化研发投入 +当期资本化研发投入,本期发生额资本化研发投入 +当期资本化研发投入,2023年资本化研发投入 +当期资本化研发投入,2023年全年资本化研发投入 +当期资本化研发投入,2023年金额资本化研发投入 +当期资本化研发投入,当期本期资本化研发投入 +当期资本化研发投入,本期本期资本化研发投入 +当期资本化研发投入,本报告期本期资本化研发投入 +当期资本化研发投入,报告期本期资本化研发投入 +当期资本化研发投入,报告期内本期资本化研发投入 +当期资本化研发投入,本年度本期资本化研发投入 +当期资本化研发投入,本期金额本期资本化研发投入 +当期资本化研发投入,本期发生额本期资本化研发投入 +当期资本化研发投入,2023年本期资本化研发投入 +当期资本化研发投入,2023年全年本期资本化研发投入 +当期资本化研发投入,2023年金额本期资本化研发投入 +上年同期资本化研发投入,上年同期资本化研发投入 +上年同期资本化研发投入,上期资本化研发投入 +上年同期资本化研发投入,上期金额资本化研发投入 +上年同期资本化研发投入,上年资本化研发投入 +上年同期资本化研发投入,上年度资本化研发投入 +上年同期资本化研发投入,2022年资本化研发投入 +上年同期资本化研发投入,2022年全年资本化研发投入 +上年同期资本化研发投入,2022年金额资本化研发投入 +上年同期资本化研发投入,上年同期研发投入资本化的金额 +上年同期资本化研发投入,上期研发投入资本化的金额 +上年同期资本化研发投入,上期金额研发投入资本化的金额 +上年同期资本化研发投入,上年研发投入资本化的金额 +上年同期资本化研发投入,上年度研发投入资本化的金额 +上年同期资本化研发投入,2022年研发投入资本化的金额 +上年同期资本化研发投入,2022年全年研发投入资本化的金额 +上年同期资本化研发投入,2022年金额研发投入资本化的金额 +上年同期资本化研发投入,上年同期研发支出资本化的金额 +上年同期资本化研发投入,上期研发支出资本化的金额 +上年同期资本化研发投入,上期金额研发支出资本化的金额 +上年同期资本化研发投入,上年研发支出资本化的金额 +上年同期资本化研发投入,上年度研发支出资本化的金额 +上年同期资本化研发投入,2022年研发支出资本化的金额 +上年同期资本化研发投入,2022年全年研发支出资本化的金额 +上年同期资本化研发投入,2022年金额研发支出资本化的金额 +上年同期资本化研发投入,上年同期资本化研发投入 +上年同期资本化研发投入,上期资本化研发投入 +上年同期资本化研发投入,上期金额资本化研发投入 +上年同期资本化研发投入,上年资本化研发投入 +上年同期资本化研发投入,上年度资本化研发投入 +上年同期资本化研发投入,2022年资本化研发投入 +上年同期资本化研发投入,2022年全年资本化研发投入 +上年同期资本化研发投入,2022年金额资本化研发投入 +上年同期资本化研发投入,上年同期本期资本化研发投入 +上年同期资本化研发投入,上期本期资本化研发投入 +上年同期资本化研发投入,上期金额本期资本化研发投入 +上年同期资本化研发投入,上年本期资本化研发投入 +上年同期资本化研发投入,上年度本期资本化研发投入 +上年同期资本化研发投入,2022年本期资本化研发投入 +上年同期资本化研发投入,2022年全年本期资本化研发投入 +上年同期资本化研发投入,2022年金额本期资本化研发投入 +前年同期资本化研发投入,前年同期资本化研发投入 +前年同期资本化研发投入,2021年资本化研发投入 +前年同期资本化研发投入,2021年全年资本化研发投入 +前年同期资本化研发投入,2021年金额资本化研发投入 +前年同期资本化研发投入,前年同期研发投入资本化的金额 +前年同期资本化研发投入,2021年研发投入资本化的金额 +前年同期资本化研发投入,2021年全年研发投入资本化的金额 +前年同期资本化研发投入,2021年金额研发投入资本化的金额 +前年同期资本化研发投入,前年同期研发支出资本化的金额 +前年同期资本化研发投入,2021年研发支出资本化的金额 +前年同期资本化研发投入,2021年全年研发支出资本化的金额 +前年同期资本化研发投入,2021年金额研发支出资本化的金额 +前年同期资本化研发投入,前年同期资本化研发投入 +前年同期资本化研发投入,2021年资本化研发投入 +前年同期资本化研发投入,2021年全年资本化研发投入 +前年同期资本化研发投入,2021年金额资本化研发投入 +前年同期资本化研发投入,前年同期本期资本化研发投入 +前年同期资本化研发投入,2021年本期资本化研发投入 +前年同期资本化研发投入,2021年全年本期资本化研发投入 +前年同期资本化研发投入,2021年金额本期资本化研发投入 +资本化研发投入同比变动,资本化研发投入同比变动 +资本化研发投入同比变动,资本化研发投入同比增减 +资本化研发投入同比变动,资本化研发投入同比上升 +资本化研发投入同比变动,资本化研发投入同比下降 +资本化研发投入同比变动,资本化研发投入变化幅度 +资本化研发投入同比变动,资本化研发投入变动比例 +资本化研发投入同比变动,资本化研发投入本期比上年同期增减 +资本化研发投入同比变动,资本化研发投入本年比上年增减 +资本化研发投入同比变动,资本化研发投入本期期末金额较上期期末变动比例 +资本化研发投入同比变动,研发投入资本化的金额同比变动 +资本化研发投入同比变动,研发投入资本化的金额同比增减 +资本化研发投入同比变动,研发投入资本化的金额同比上升 +资本化研发投入同比变动,研发投入资本化的金额同比下降 +资本化研发投入同比变动,研发投入资本化的金额变化幅度 +资本化研发投入同比变动,研发投入资本化的金额变动比例 +资本化研发投入同比变动,研发投入资本化的金额本期比上年同期增减 +资本化研发投入同比变动,研发投入资本化的金额本年比上年增减 +资本化研发投入同比变动,研发投入资本化的金额本期期末金额较上期期末变动比例 +资本化研发投入同比变动,研发支出资本化的金额同比变动 +资本化研发投入同比变动,研发支出资本化的金额同比增减 +资本化研发投入同比变动,研发支出资本化的金额同比上升 +资本化研发投入同比变动,研发支出资本化的金额同比下降 +资本化研发投入同比变动,研发支出资本化的金额变化幅度 +资本化研发投入同比变动,研发支出资本化的金额变动比例 +资本化研发投入同比变动,研发支出资本化的金额本期比上年同期增减 +资本化研发投入同比变动,研发支出资本化的金额本年比上年增减 +资本化研发投入同比变动,研发支出资本化的金额本期期末金额较上期期末变动比例 +资本化研发投入同比变动,资本化研发投入同比变动 +资本化研发投入同比变动,资本化研发投入同比增减 +资本化研发投入同比变动,资本化研发投入同比上升 +资本化研发投入同比变动,资本化研发投入同比下降 +资本化研发投入同比变动,资本化研发投入变化幅度 +资本化研发投入同比变动,资本化研发投入变动比例 +资本化研发投入同比变动,资本化研发投入本期比上年同期增减 +资本化研发投入同比变动,资本化研发投入本年比上年增减 +资本化研发投入同比变动,资本化研发投入本期期末金额较上期期末变动比例 +资本化研发投入同比变动,本期资本化研发投入同比变动 +资本化研发投入同比变动,本期资本化研发投入同比增减 +资本化研发投入同比变动,本期资本化研发投入同比上升 +资本化研发投入同比变动,本期资本化研发投入同比下降 +资本化研发投入同比变动,本期资本化研发投入变化幅度 +资本化研发投入同比变动,本期资本化研发投入变动比例 +资本化研发投入同比变动,本期资本化研发投入本期比上年同期增减 +资本化研发投入同比变动,本期资本化研发投入本年比上年增减 +资本化研发投入同比变动,本期资本化研发投入本期期末金额较上期期末变动比例 +当期资本化研发投入占比,当期资本化研发投入占比 +当期资本化研发投入占比,本期资本化研发投入占比 +当期资本化研发投入占比,本报告期资本化研发投入占比 +当期资本化研发投入占比,报告期资本化研发投入占比 +当期资本化研发投入占比,报告期内资本化研发投入占比 +当期资本化研发投入占比,本年度资本化研发投入占比 +当期资本化研发投入占比,本期金额资本化研发投入占比 +当期资本化研发投入占比,本期发生额资本化研发投入占比 +当期资本化研发投入占比,2023年资本化研发投入占比 +当期资本化研发投入占比,2023年全年资本化研发投入占比 +当期资本化研发投入占比,2023年金额资本化研发投入占比 +当期资本化研发投入占比,当期资本化研发投入占研发投入的比例 +当期资本化研发投入占比,本期资本化研发投入占研发投入的比例 +当期资本化研发投入占比,本报告期资本化研发投入占研发投入的比例 +当期资本化研发投入占比,报告期资本化研发投入占研发投入的比例 +当期资本化研发投入占比,报告期内资本化研发投入占研发投入的比例 +当期资本化研发投入占比,本年度资本化研发投入占研发投入的比例 +当期资本化研发投入占比,本期金额资本化研发投入占研发投入的比例 +当期资本化研发投入占比,本期发生额资本化研发投入占研发投入的比例 +当期资本化研发投入占比,2023年资本化研发投入占研发投入的比例 +当期资本化研发投入占比,2023年全年资本化研发投入占研发投入的比例 +当期资本化研发投入占比,2023年金额资本化研发投入占研发投入的比例 +当期资本化研发投入占比,当期资本化研发支出占研发支出的比例 +当期资本化研发投入占比,本期资本化研发支出占研发支出的比例 +当期资本化研发投入占比,本报告期资本化研发支出占研发支出的比例 +当期资本化研发投入占比,报告期资本化研发支出占研发支出的比例 +当期资本化研发投入占比,报告期内资本化研发支出占研发支出的比例 +当期资本化研发投入占比,本年度资本化研发支出占研发支出的比例 +当期资本化研发投入占比,本期金额资本化研发支出占研发支出的比例 +当期资本化研发投入占比,本期发生额资本化研发支出占研发支出的比例 +当期资本化研发投入占比,2023年资本化研发支出占研发支出的比例 +当期资本化研发投入占比,2023年全年资本化研发支出占研发支出的比例 +当期资本化研发投入占比,2023年金额资本化研发支出占研发支出的比例 +当期资本化研发投入占比,当期研发投入资本化的比重 +当期资本化研发投入占比,本期研发投入资本化的比重 +当期资本化研发投入占比,本报告期研发投入资本化的比重 +当期资本化研发投入占比,报告期研发投入资本化的比重 +当期资本化研发投入占比,报告期内研发投入资本化的比重 +当期资本化研发投入占比,本年度研发投入资本化的比重 +当期资本化研发投入占比,本期金额研发投入资本化的比重 +当期资本化研发投入占比,本期发生额研发投入资本化的比重 +当期资本化研发投入占比,2023年研发投入资本化的比重 +当期资本化研发投入占比,2023年全年研发投入资本化的比重 +当期资本化研发投入占比,2023年金额研发投入资本化的比重 +上年同期资本化研发投入占比,上年同期资本化研发投入占比 +上年同期资本化研发投入占比,上期资本化研发投入占比 +上年同期资本化研发投入占比,上期金额资本化研发投入占比 +上年同期资本化研发投入占比,上年资本化研发投入占比 +上年同期资本化研发投入占比,上年度资本化研发投入占比 +上年同期资本化研发投入占比,2022年资本化研发投入占比 +上年同期资本化研发投入占比,2022年全年资本化研发投入占比 +上年同期资本化研发投入占比,2022年金额资本化研发投入占比 +上年同期资本化研发投入占比,上年同期资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,上期资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,上期金额资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,上年资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,上年度资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,2022年资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,2022年全年资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,2022年金额资本化研发投入占研发投入的比例 +上年同期资本化研发投入占比,上年同期资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,上期资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,上期金额资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,上年资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,上年度资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,2022年资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,2022年全年资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,2022年金额资本化研发支出占研发支出的比例 +上年同期资本化研发投入占比,上年同期研发投入资本化的比重 +上年同期资本化研发投入占比,上期研发投入资本化的比重 +上年同期资本化研发投入占比,上期金额研发投入资本化的比重 +上年同期资本化研发投入占比,上年研发投入资本化的比重 +上年同期资本化研发投入占比,上年度研发投入资本化的比重 +上年同期资本化研发投入占比,2022年研发投入资本化的比重 +上年同期资本化研发投入占比,2022年全年研发投入资本化的比重 +上年同期资本化研发投入占比,2022年金额研发投入资本化的比重 +前年同期资本化研发投入占比,前年同期资本化研发投入占比 +前年同期资本化研发投入占比,2021年资本化研发投入占比 +前年同期资本化研发投入占比,2021年全年资本化研发投入占比 +前年同期资本化研发投入占比,2021年金额资本化研发投入占比 +前年同期资本化研发投入占比,前年同期资本化研发投入占研发投入的比例 +前年同期资本化研发投入占比,2021年资本化研发投入占研发投入的比例 +前年同期资本化研发投入占比,2021年全年资本化研发投入占研发投入的比例 +前年同期资本化研发投入占比,2021年金额资本化研发投入占研发投入的比例 +前年同期资本化研发投入占比,前年同期资本化研发支出占研发支出的比例 +前年同期资本化研发投入占比,2021年资本化研发支出占研发支出的比例 +前年同期资本化研发投入占比,2021年全年资本化研发支出占研发支出的比例 +前年同期资本化研发投入占比,2021年金额资本化研发支出占研发支出的比例 +前年同期资本化研发投入占比,前年同期研发投入资本化的比重 +前年同期资本化研发投入占比,2021年研发投入资本化的比重 +前年同期资本化研发投入占比,2021年全年研发投入资本化的比重 +前年同期资本化研发投入占比,2021年金额研发投入资本化的比重 +资本化研发投入占比同比变动,资本化研发投入占比同比变动 +资本化研发投入占比同比变动,资本化研发投入占比同比增减 +资本化研发投入占比同比变动,资本化研发投入占比同比上升 +资本化研发投入占比同比变动,资本化研发投入占比同比下降 +资本化研发投入占比同比变动,资本化研发投入占比变化幅度 +资本化研发投入占比同比变动,资本化研发投入占比变动比例 +资本化研发投入占比同比变动,资本化研发投入占比本期比上年同期增减 +资本化研发投入占比同比变动,资本化研发投入占比本年比上年增减 +资本化研发投入占比同比变动,资本化研发投入占比本期期末金额较上期期末变动比例 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例同比变动 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例同比增减 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例同比上升 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例同比下降 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例变化幅度 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例变动比例 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例本期比上年同期增减 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例本年比上年增减 +资本化研发投入占比同比变动,资本化研发投入占研发投入的比例本期期末金额较上期期末变动比例 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例同比变动 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例同比增减 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例同比上升 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例同比下降 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例变化幅度 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例变动比例 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例本期比上年同期增减 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例本年比上年增减 +资本化研发投入占比同比变动,资本化研发支出占研发支出的比例本期期末金额较上期期末变动比例 +资本化研发投入占比同比变动,研发投入资本化的比重同比变动 +资本化研发投入占比同比变动,研发投入资本化的比重同比增减 +资本化研发投入占比同比变动,研发投入资本化的比重同比上升 +资本化研发投入占比同比变动,研发投入资本化的比重同比下降 +资本化研发投入占比同比变动,研发投入资本化的比重变化幅度 +资本化研发投入占比同比变动,研发投入资本化的比重变动比例 +资本化研发投入占比同比变动,研发投入资本化的比重本期比上年同期增减 +资本化研发投入占比同比变动,研发投入资本化的比重本年比上年增减 +资本化研发投入占比同比变动,研发投入资本化的比重本期期末金额较上期期末变动比例 +当期研发投入占营业收入比例,当期研发投入占营业收入比例 +当期研发投入占营业收入比例,本期研发投入占营业收入比例 +当期研发投入占营业收入比例,本报告期研发投入占营业收入比例 +当期研发投入占营业收入比例,报告期研发投入占营业收入比例 +当期研发投入占营业收入比例,报告期内研发投入占营业收入比例 +当期研发投入占营业收入比例,本年度研发投入占营业收入比例 +当期研发投入占营业收入比例,本期金额研发投入占营业收入比例 +当期研发投入占营业收入比例,本期发生额研发投入占营业收入比例 +当期研发投入占营业收入比例,2023年研发投入占营业收入比例 +当期研发投入占营业收入比例,2023年全年研发投入占营业收入比例 +当期研发投入占营业收入比例,2023年金额研发投入占营业收入比例 +当期研发投入占营业收入比例,当期研发投入总额占营业收入比例 +当期研发投入占营业收入比例,本期研发投入总额占营业收入比例 +当期研发投入占营业收入比例,本报告期研发投入总额占营业收入比例 +当期研发投入占营业收入比例,报告期研发投入总额占营业收入比例 +当期研发投入占营业收入比例,报告期内研发投入总额占营业收入比例 +当期研发投入占营业收入比例,本年度研发投入总额占营业收入比例 +当期研发投入占营业收入比例,本期金额研发投入总额占营业收入比例 +当期研发投入占营业收入比例,本期发生额研发投入总额占营业收入比例 +当期研发投入占营业收入比例,2023年研发投入总额占营业收入比例 +当期研发投入占营业收入比例,2023年全年研发投入总额占营业收入比例 +当期研发投入占营业收入比例,2023年金额研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,上年同期研发投入占营业收入比例 +上年同期研发投入占营业收入比例,上期研发投入占营业收入比例 +上年同期研发投入占营业收入比例,上期金额研发投入占营业收入比例 +上年同期研发投入占营业收入比例,上年研发投入占营业收入比例 +上年同期研发投入占营业收入比例,上年度研发投入占营业收入比例 +上年同期研发投入占营业收入比例,2022年研发投入占营业收入比例 +上年同期研发投入占营业收入比例,2022年全年研发投入占营业收入比例 +上年同期研发投入占营业收入比例,2022年金额研发投入占营业收入比例 +上年同期研发投入占营业收入比例,上年同期研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,上期研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,上期金额研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,上年研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,上年度研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,2022年研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,2022年全年研发投入总额占营业收入比例 +上年同期研发投入占营业收入比例,2022年金额研发投入总额占营业收入比例 +前年同期研发投入占营业收入比例,前年同期研发投入占营业收入比例 +前年同期研发投入占营业收入比例,2021年研发投入占营业收入比例 +前年同期研发投入占营业收入比例,2021年全年研发投入占营业收入比例 +前年同期研发投入占营业收入比例,2021年金额研发投入占营业收入比例 +前年同期研发投入占营业收入比例,前年同期研发投入总额占营业收入比例 +前年同期研发投入占营业收入比例,2021年研发投入总额占营业收入比例 +前年同期研发投入占营业收入比例,2021年全年研发投入总额占营业收入比例 +前年同期研发投入占营业收入比例,2021年金额研发投入总额占营业收入比例 +研发投入占营业收入比例同比变动,研发投入占营业收入比例同比变动 +研发投入占营业收入比例同比变动,研发投入占营业收入比例同比增减 +研发投入占营业收入比例同比变动,研发投入占营业收入比例同比上升 +研发投入占营业收入比例同比变动,研发投入占营业收入比例同比下降 +研发投入占营业收入比例同比变动,研发投入占营业收入比例变化幅度 +研发投入占营业收入比例同比变动,研发投入占营业收入比例变动比例 +研发投入占营业收入比例同比变动,研发投入占营业收入比例本期比上年同期增减 +研发投入占营业收入比例同比变动,研发投入占营业收入比例本年比上年增减 +研发投入占营业收入比例同比变动,研发投入占营业收入比例本期期末金额较上期期末变动比例 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例同比变动 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例同比增减 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例同比上升 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例同比下降 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例变化幅度 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例变动比例 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例本期比上年同期增减 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例本年比上年增减 +研发投入占营业收入比例同比变动,研发投入总额占营业收入比例本期期末金额较上期期末变动比例 \ No newline at end of file diff --git a/zzb_data_prod/not_match.txt b/zzb_data_prod/not_match.txt new file mode 100644 index 0000000..079ac57 --- /dev/null +++ b/zzb_data_prod/not_match.txt @@ -0,0 +1,4164 @@ +当期营业收入:当期营业收入:合计合计营业收入:0.8610458970069885:1529440280.25:200:3 +当期营业收入:当期营业收入:合计合计营业收入:0.8610458970069885:1908540816.12:160:1 +当期营业收入:本期营业收入:合计合计营业收入:0.9017857909202576:1529440280.25:200:3 +当期营业收入:本期营业收入:合计合计营业收入:0.9017857909202576:1908540816.12:160:1 +当期营业收入:本报告期营业收入:合计合计营业收入:0.8669588565826416:1529440280.25:200:3 +当期营业收入:本报告期营业收入:合计合计营业收入:0.8669588565826416:1908540816.12:160:1 +当期营业收入:报告期营业收入:合计合计营业收入:0.867494523525238:1529440280.25:200:3 +当期营业收入:报告期营业收入:合计合计营业收入:0.867494523525238:1908540816.12:160:1 +当期营业收入:报告期内营业收入:合计合计营业收入:0.839704692363739:1529440280.25:200:3 +当期营业收入:报告期内营业收入:合计合计营业收入:0.839704692363739:1908540816.12:160:1 +当期营业收入:本年度营业收入:合计合计营业收入:0.8656280636787415:1529440280.25:200:3 +当期营业收入:本年度营业收入:合计合计营业收入:0.8656280636787415:1908540816.12:160:1 +当期营业收入:本期发生额营业收入:合计本期发生额收入:0.8915550708770752:1529440280.25:200:2 +当期营业收入:本期发生额营业收入:合计上期发生额收入:0.8578814268112183:1316036204.14:200:2 +当期营业收入:2023年营业收入:一、营业收入2023年度:0.9160630106925964:1529440280.25:82:1 +当期营业收入:2023年营业收入:一、营业收入2022年度:0.8875380754470825:1316036204.14:82:1 +当期营业收入:2023年全年营业收入:一、营业收入2023年度:0.8905119895935059:1529440280.25:82:1 +当期营业收入:2023年全年营业收入:一、营业收入2022年度:0.86033695936203:1316036204.14:82:1 +当期营业收入:2023年金额营业收入:一、营业收入2023年度:0.8880469799041748:1529440280.25:82:1 +当期营业收入:2023年金额营业收入:一、营业收入2022年度:0.8613478541374207:1316036204.14:82:1 +当期营业收入:当期营业收入合计:合计合计营业收入:0.89673912525177:1529440280.25:200:3 +当期营业收入:当期营业收入合计:合计合计营业收入:0.89673912525177:1908540816.12:160:1 +当期营业收入:本期营业收入合计:合计合计营业收入:0.9155963659286499:1529440280.25:200:3 +当期营业收入:本期营业收入合计:合计合计营业收入:0.9155963659286499:1908540816.12:160:1 +当期营业收入:本报告期营业收入合计:合计合计营业收入:0.8868198394775391:1529440280.25:200:3 +当期营业收入:本报告期营业收入合计:合计合计营业收入:0.8868198394775391:1908540816.12:160:1 +当期营业收入:报告期营业收入合计:合计合计营业收入:0.8908512592315674:1529440280.25:200:3 +当期营业收入:报告期营业收入合计:合计合计营业收入:0.8908512592315674:1908540816.12:160:1 +当期营业收入:报告期内营业收入合计:合计合计营业收入:0.8486268520355225:1529440280.25:200:3 +当期营业收入:报告期内营业收入合计:合计合计营业收入:0.8486268520355225:1908540816.12:160:1 +当期营业收入:本年度营业收入合计:合计合计营业收入:0.8922575116157532:1529440280.25:200:3 +当期营业收入:本年度营业收入合计:合计合计营业收入:0.8922575116157532:1908540816.12:160:1 +当期营业收入:本期发生额营业收入合计:合计本期发生额收入:0.9093244671821594:1529440280.25:200:2 +当期营业收入:本期发生额营业收入合计:合计上期发生额收入:0.873894214630127:1316036204.14:200:2 +当期营业收入:2023年营业收入合计:一、营业收入2023年度:0.9312591552734375:1529440280.25:82:1 +当期营业收入:2023年营业收入合计:一、营业收入2022年度:0.903525710105896:1316036204.14:82:1 +当期营业收入:2023年全年营业收入合计:一、营业收入2023年度:0.906334638595581:1529440280.25:82:1 +当期营业收入:2023年全年营业收入合计:一、营业收入2022年度:0.876448392868042:1316036204.14:82:1 +当期营业收入:2023年金额营业收入合计:一、营业收入2023年度:0.9001771807670593:1529440280.25:82:1 +当期营业收入:2023年金额营业收入合计:一、营业收入2022年度:0.8718213438987732:1316036204.14:82:1 +当期营业收入:当期营业收入总额:合计合计营业收入:0.8806697130203247:1529440280.25:200:3 +当期营业收入:当期营业收入总额:合计合计营业收入:0.8806697130203247:1908540816.12:160:1 +当期营业收入:本期营业收入总额:合计合计营业收入:0.9177300930023193:1529440280.25:200:3 +当期营业收入:本期营业收入总额:合计合计营业收入:0.9177300930023193:1908540816.12:160:1 +当期营业收入:本报告期营业收入总额:合计合计营业收入:0.8722314238548279:1529440280.25:200:3 +当期营业收入:本报告期营业收入总额:合计合计营业收入:0.8722314238548279:1908540816.12:160:1 +当期营业收入:报告期营业收入总额:合计合计营业收入:0.8806651830673218:1529440280.25:200:3 +当期营业收入:报告期营业收入总额:合计合计营业收入:0.8806651830673218:1908540816.12:160:1 +当期营业收入:报告期内营业收入总额:合计合计营业收入:0.8475635051727295:1529440280.25:200:3 +当期营业收入:报告期内营业收入总额:合计合计营业收入:0.8475635051727295:1908540816.12:160:1 +当期营业收入:本年度营业收入总额:合计合计营业收入:0.8710759878158569:1529440280.25:200:3 +当期营业收入:本年度营业收入总额:合计合计营业收入:0.8710759878158569:1908540816.12:160:1 +当期营业收入:本期发生额营业收入总额:合计本期发生额收入:0.8800533413887024:1529440280.25:200:2 +当期营业收入:本期发生额营业收入总额:合计上期发生额收入:0.8599944114685059:1316036204.14:200:2 +当期营业收入:2023年营业收入总额:一、营业收入2023年度:0.8955725431442261:1529440280.25:82:1 +当期营业收入:2023年营业收入总额:一、营业收入2022年度:0.8661902546882629:1316036204.14:82:1 +当期营业收入:2023年全年营业收入总额:一、营业收入2023年度:0.8664432764053345:1529440280.25:82:1 +当期营业收入:2023年全年营业收入总额:一、营业收入2022年度:0.8337422609329224:1316036204.14:82:1 +当期营业收入:2023年金额营业收入总额:一、营业收入2023年度:0.8738443851470947:1529440280.25:82:1 +当期营业收入:2023年金额营业收入总额:一、营业收入2022年度:0.8441925048828125:1316036204.14:82:1 +当期营业收入:当期营业收入金额:合计合计营业收入:0.8530008792877197:1529440280.25:200:3 +当期营业收入:当期营业收入金额:合计合计营业收入:0.8530008792877197:1908540816.12:160:1 +当期营业收入:本期营业收入金额:合计合计营业收入:0.896445631980896:1529440280.25:200:3 +当期营业收入:本期营业收入金额:合计合计营业收入:0.896445631980896:1908540816.12:160:1 +当期营业收入:本报告期营业收入金额:合计合计营业收入:0.8719156980514526:1529440280.25:200:3 +当期营业收入:本报告期营业收入金额:合计合计营业收入:0.8719156980514526:1908540816.12:160:1 +当期营业收入:报告期营业收入金额:合计合计营业收入:0.8575512170791626:1529440280.25:200:3 +当期营业收入:报告期营业收入金额:合计合计营业收入:0.8575512170791626:1908540816.12:160:1 +当期营业收入:报告期内营业收入金额:合计合计营业收入:0.831983208656311:1529440280.25:200:3 +当期营业收入:报告期内营业收入金额:合计合计营业收入:0.831983208656311:1908540816.12:160:1 +当期营业收入:本年度营业收入金额:合计合计营业收入:0.8666725754737854:1529440280.25:200:3 +当期营业收入:本年度营业收入金额:合计合计营业收入:0.8666725754737854:1908540816.12:160:1 +当期营业收入:本期发生额营业收入金额:合计本期发生额收入:0.8912511467933655:1529440280.25:200:2 +当期营业收入:本期发生额营业收入金额:合计上期发生额收入:0.8549070358276367:1316036204.14:200:2 +当期营业收入:2023年营业收入金额:一、营业收入2023年度:0.912598729133606:1529440280.25:82:1 +当期营业收入:2023年营业收入金额:一、营业收入2022年度:0.8884025812149048:1316036204.14:82:1 +当期营业收入:2023年全年营业收入金额:一、营业收入2023年度:0.8916991949081421:1529440280.25:82:1 +当期营业收入:2023年全年营业收入金额:一、营业收入2022年度:0.8640561103820801:1316036204.14:82:1 +当期营业收入:2023年金额营业收入金额:一、营业收入2023年度:0.8787837624549866:1529440280.25:82:1 +当期营业收入:2023年金额营业收入金额:一、营业收入2022年度:0.8538839221000671:1316036204.14:82:1 +当期营业收入:当期调整后营业收入:合计上期发生额收入:0.7667926549911499:1316036204.14:200:2 +当期营业收入:当期调整后营业收入:合计本期发生额收入:0.7629632353782654:1529440280.25:200:2 +当期营业收入:本期调整后营业收入:其他合计营业收入:0.8122152090072632:199722062.45:200:3 +当期营业收入:本期调整后营业收入:其他合计营业收入:0.8118422627449036:130449651.32:160:1 +当期营业收入:本报告期调整后营业收入:合计合计营业收入:0.7881966829299927:1529440280.25:200:3 +当期营业收入:本报告期调整后营业收入:合计合计营业收入:0.7881966829299927:1908540816.12:160:1 +当期营业收入:报告期调整后营业收入:合计合计营业收入:0.741988480091095:1529440280.25:200:3 +当期营业收入:报告期调整后营业收入:合计合计营业收入:0.741988480091095:1908540816.12:160:1 +当期营业收入:报告期内调整后营业收入:其他合计营业收入:0.7605239152908325:199722062.45:200:3 +当期营业收入:报告期内调整后营业收入:其他合计营业收入:0.7602180242538452:130449651.32:160:1 +当期营业收入:本年度调整后营业收入:其他合计营业收入:0.8297399282455444:199722062.45:200:3 +当期营业收入:本年度调整后营业收入:其他合计营业收入:0.8294879794120789:130449651.32:160:1 +当期营业收入:本期发生额调整后营业收入:合计本期发生额收入:0.7762886881828308:1529440280.25:200:2 +当期营业收入:本期发生额调整后营业收入:合计上期发生额收入:0.763839066028595:1316036204.14:200:2 +当期营业收入:2023年调整后营业收入:一、营业收入2023年度:0.8640714883804321:1529440280.25:82:1 +当期营业收入:2023年调整后营业收入:一、营业收入2022年度:0.8288634419441223:1316036204.14:82:1 +当期营业收入:2023年全年调整后营业收入:一、营业收入2023年度:0.85761559009552:1529440280.25:82:1 +当期营业收入:2023年全年调整后营业收入:一、营业收入2022年度:0.8226447105407715:1316036204.14:82:1 +当期营业收入:2023年金额调整后营业收入:一、营业收入2023年度:0.847604513168335:1529440280.25:82:1 +当期营业收入:2023年金额调整后营业收入:一、营业收入2022年度:0.8176367282867432:1316036204.14:82:1 +上年同期营业收入:上年同期营业收入:合计合计营业收入:0.8060787320137024:1529440280.25:200:3 +上年同期营业收入:上年同期营业收入:合计合计营业收入:0.8060787320137024:1908540816.12:160:1 +上年同期营业收入:上期营业收入:合计合计营业收入:0.8613735437393188:1529440280.25:200:3 +上年同期营业收入:上期营业收入:合计合计营业收入:0.8613735437393188:1908540816.12:160:1 +上年同期营业收入:上年度营业收入:合计合计营业收入:0.8574678897857666:1529440280.25:200:3 +上年同期营业收入:上年度营业收入:合计合计营业收入:0.8574678897857666:1908540816.12:160:1 +上年同期营业收入:2022年营业收入:一、营业收入2022年度:0.914231538772583:1316036204.14:82:1 +上年同期营业收入:2022年营业收入:一、营业收入2023年度:0.8908048272132874:1529440280.25:82:1 +上年同期营业收入:2022年全年营业收入:一、营业收入2022年度:0.8867119550704956:1316036204.14:82:1 +上年同期营业收入:2022年全年营业收入:一、营业收入2023年度:0.8636507987976074:1529440280.25:82:1 +上年同期营业收入:2022年金额营业收入:一、营业收入2022年度:0.8848048448562622:1316036204.14:82:1 +上年同期营业收入:2022年金额营业收入:一、营业收入2023年度:0.8598030805587769:1529440280.25:82:1 +上年同期营业收入:上年同期营业收入合计:合计合计营业收入:0.8287221789360046:1529440280.25:200:3 +上年同期营业收入:上年同期营业收入合计:合计合计营业收入:0.8287221789360046:1908540816.12:160:1 +上年同期营业收入:上期营业收入合计:合计合计营业收入:0.871444821357727:1529440280.25:200:3 +上年同期营业收入:上期营业收入合计:合计合计营业收入:0.871444821357727:1908540816.12:160:1 +上年同期营业收入:上年度营业收入合计:合计合计营业收入:0.8706979751586914:1529440280.25:200:3 +上年同期营业收入:上年度营业收入合计:合计合计营业收入:0.8706979751586914:1908540816.12:160:1 +上年同期营业收入:2022年营业收入合计:一、营业收入2022年度:0.9328346848487854:1316036204.14:82:1 +上年同期营业收入:2022年营业收入合计:一、营业收入2023年度:0.9121715426445007:1529440280.25:82:1 +上年同期营业收入:2022年全年营业收入合计:一、营业收入2022年度:0.9026998281478882:1316036204.14:82:1 +上年同期营业收入:2022年全年营业收入合计:一、营业收入2023年度:0.8838035464286804:1529440280.25:82:1 +上年同期营业收入:2022年金额营业收入合计:一、营业收入2022年度:0.8977106809616089:1316036204.14:82:1 +上年同期营业收入:2022年金额营业收入合计:一、营业收入2023年度:0.8735229969024658:1529440280.25:82:1 +上年同期营业收入:上年同期营业收入总额:合计合计营业收入:0.8015921711921692:1529440280.25:200:3 +上年同期营业收入:上年同期营业收入总额:合计合计营业收入:0.8015921711921692:1908540816.12:160:1 +上年同期营业收入:上期营业收入总额:合计合计营业收入:0.8666763305664062:1529440280.25:200:3 +上年同期营业收入:上期营业收入总额:合计合计营业收入:0.8666763305664062:1908540816.12:160:1 +上年同期营业收入:上年度营业收入总额:合计合计营业收入:0.8517194986343384:1529440280.25:200:3 +上年同期营业收入:上年度营业收入总额:合计合计营业收入:0.8517194986343384:1908540816.12:160:1 +上年同期营业收入:2022年营业收入总额:一、营业收入2022年度:0.8954847455024719:1316036204.14:82:1 +上年同期营业收入:2022年营业收入总额:一、营业收入2023年度:0.8717348575592041:1529440280.25:82:1 +上年同期营业收入:2022年全年营业收入总额:一、营业收入2022年度:0.8614148497581482:1316036204.14:82:1 +上年同期营业收入:2022年全年营业收入总额:一、营业收入2023年度:0.839020848274231:1529440280.25:82:1 +上年同期营业收入:2022年金额营业收入总额:一、营业收入2022年度:0.8681352138519287:1316036204.14:82:1 +上年同期营业收入:2022年金额营业收入总额:一、营业收入2023年度:0.8430963158607483:1529440280.25:82:1 +上年同期营业收入:上年同期营业收入金额:合计合计营业收入:0.8020575046539307:1529440280.25:200:3 +上年同期营业收入:上年同期营业收入金额:合计合计营业收入:0.8020575046539307:1908540816.12:160:1 +上年同期营业收入:上期营业收入金额:合计合计营业收入:0.8557167053222656:1529440280.25:200:3 +上年同期营业收入:上期营业收入金额:合计合计营业收入:0.8557167053222656:1908540816.12:160:1 +上年同期营业收入:上年度营业收入金额:合计合计营业收入:0.8484126329421997:1529440280.25:200:3 +上年同期营业收入:上年度营业收入金额:合计合计营业收入:0.8484126329421997:1908540816.12:160:1 +上年同期营业收入:2022年营业收入金额:一、营业收入2022年度:0.9142215251922607:1316036204.14:82:1 +上年同期营业收入:2022年营业收入金额:一、营业收入2023年度:0.8867112994194031:1529440280.25:82:1 +上年同期营业收入:2022年全年营业收入金额:一、营业收入2022年度:0.8891880512237549:1316036204.14:82:1 +上年同期营业收入:2022年全年营业收入金额:一、营业收入2023年度:0.8633373975753784:1529440280.25:82:1 +上年同期营业收入:2022年金额营业收入金额:一、营业收入2022年度:0.8767227530479431:1316036204.14:82:1 +上年同期营业收入:2022年金额营业收入金额:一、营业收入2023年度:0.8487356901168823:1529440280.25:82:1 +上年同期营业收入:上年同期调整后营业收入:合计上期发生额收入:0.732888400554657:1316036204.14:200:2 +上年同期营业收入:上年同期调整后营业收入:其他合计营业收入:0.7136104702949524:199722062.45:200:3 +上年同期营业收入:上期调整后营业收入:合计上期发生额收入:0.7804560661315918:1316036204.14:200:2 +上年同期营业收入:上期调整后营业收入:主营业务上期发生额收入:0.7750575542449951:1197550470.11:200:2 +上年同期营业收入:上年度调整后营业收入:其他合计营业收入:0.790281355381012:199722062.45:200:3 +上年同期营业收入:上年度调整后营业收入:其他合计营业收入:0.7898871898651123:130449651.32:160:1 +上年同期营业收入:2022年调整后营业收入:一、营业收入2022年度:0.860779881477356:1316036204.14:82:1 +上年同期营业收入:2022年调整后营业收入:一、营业收入2023年度:0.8434334397315979:1529440280.25:82:1 +上年同期营业收入:2022年全年调整后营业收入:一、营业收入2022年度:0.8514148592948914:1316036204.14:82:1 +上年同期营业收入:2022年全年调整后营业收入:一、营业收入2023年度:0.8355211615562439:1529440280.25:82:1 +上年同期营业收入:2022年金额调整后营业收入:一、营业收入2022年度:0.8458725810050964:1316036204.14:82:1 +上年同期营业收入:2022年金额调整后营业收入:一、营业收入2023年度:0.8251128196716309:1529440280.25:82:1 +前年同期营业收入:前年同期营业收入:合计合计营业收入:0.7806070446968079:1529440280.25:200:3 +前年同期营业收入:前年同期营业收入:合计合计营业收入:0.7806070446968079:1908540816.12:160:1 +前年同期营业收入:2021年营业收入:一、营业收入2022年度:0.855738639831543:1316036204.14:82:1 +前年同期营业收入:2021年营业收入:一、营业收入2023年度:0.8386956453323364:1529440280.25:82:1 +前年同期营业收入:2021年全年营业收入:一、营业收入2022年度:0.8338724374771118:1316036204.14:82:1 +前年同期营业收入:2021年全年营业收入:一、营业收入2023年度:0.8168089985847473:1529440280.25:82:1 +前年同期营业收入:2021年金额营业收入:一、营业收入2022年度:0.8244103789329529:1316036204.14:82:1 +前年同期营业收入:2021年金额营业收入:合计合计营业收入:0.8073233366012573:1908540816.12:160:1 +前年同期营业收入:前年同期营业收入合计:合计合计营业收入:0.7979026436805725:1529440280.25:200:3 +前年同期营业收入:前年同期营业收入合计:合计合计营业收入:0.7979026436805725:1908540816.12:160:1 +前年同期营业收入:2021年营业收入合计:一、营业收入2022年度:0.8727076053619385:1316036204.14:82:1 +前年同期营业收入:2021年营业收入合计:一、营业收入2023年度:0.8574000597000122:1529440280.25:82:1 +前年同期营业收入:2021年全年营业收入合计:一、营业收入2022年度:0.8482247591018677:1316036204.14:82:1 +前年同期营业收入:2021年全年营业收入合计:一、营业收入2023年度:0.8331912755966187:1529440280.25:82:1 +前年同期营业收入:2021年金额营业收入合计:一、营业收入2022年度:0.8368359208106995:1316036204.14:82:1 +前年同期营业收入:2021年金额营业收入合计:合计合计营业收入:0.8322687149047852:1908540816.12:160:1 +前年同期营业收入:前年同期营业收入总额:合计合计营业收入:0.7826546430587769:1529440280.25:200:3 +前年同期营业收入:前年同期营业收入总额:合计合计营业收入:0.7826546430587769:1908540816.12:160:1 +前年同期营业收入:2021年营业收入总额:一、营业收入2022年度:0.8376330733299255:1316036204.14:82:1 +前年同期营业收入:2021年营业收入总额:一、营业收入2023年度:0.8197631239891052:1529440280.25:82:1 +前年同期营业收入:2021年全年营业收入总额:一、营业收入2022年度:0.809916079044342:1316036204.14:82:1 +前年同期营业收入:2021年全年营业收入总额:一、营业收入2023年度:0.7929474711418152:1529440280.25:82:1 +前年同期营业收入:2021年金额营业收入总额:一、营业收入2022年度:0.8078598380088806:1316036204.14:82:1 +前年同期营业收入:2021年金额营业收入总额:合计合计营业收入:0.7985869646072388:1908540816.12:160:1 +前年同期营业收入:前年同期营业收入金额:合计合计营业收入:0.7736518979072571:1529440280.25:200:3 +前年同期营业收入:前年同期营业收入金额:合计合计营业收入:0.7736518979072571:1908540816.12:160:1 +前年同期营业收入:2021年营业收入金额:一、营业收入2022年度:0.8542253971099854:1316036204.14:82:1 +前年同期营业收入:2021年营业收入金额:一、营业收入2023年度:0.8339762687683105:1529440280.25:82:1 +前年同期营业收入:2021年全年营业收入金额:一、营业收入2022年度:0.8372402191162109:1316036204.14:82:1 +前年同期营业收入:2021年全年营业收入金额:一、营业收入2023年度:0.8180217742919922:1529440280.25:82:1 +前年同期营业收入:2021年金额营业收入金额:一、营业收入2022年度:0.8158104419708252:1316036204.14:82:1 +前年同期营业收入:2021年金额营业收入金额:一、营业收入2023年度:0.7961994409561157:1529440280.25:82:1 +前年同期营业收入:前年同期调整后营业收入:合计上期发生额收入:0.7168758511543274:1316036204.14:200:2 +前年同期营业收入:前年同期调整后营业收入:合计合计营业收入:0.6960475444793701:1908540816.12:160:1 +前年同期营业收入:2021年调整后营业收入:一、营业收入2022年度:0.8079087138175964:1316036204.14:82:1 +前年同期营业收入:2021年调整后营业收入:一、营业收入2023年度:0.7973334789276123:1529440280.25:82:1 +前年同期营业收入:2021年全年调整后营业收入:一、营业收入2022年度:0.7959243059158325:1316036204.14:82:1 +前年同期营业收入:2021年全年调整后营业收入:一、营业收入2023年度:0.7849537134170532:1529440280.25:82:1 +前年同期营业收入:2021年金额调整后营业收入:一、营业收入2022年度:0.7939000129699707:1316036204.14:82:1 +前年同期营业收入:2021年金额调整后营业收入:一、营业收入2023年度:0.7781789302825928:1529440280.25:82:1 +当期第一季度营业收入:当期第一季度营业收入:合计合计营业收入:0.7697231769561768:1529440280.25:200:3 +当期第一季度营业收入:当期第一季度营业收入:合计合计营业收入:0.7697231769561768:1908540816.12:160:1 +当期第一季度营业收入:本期第一季度营业收入:合计合计营业收入:0.8152278661727905:1529440280.25:200:3 +当期第一季度营业收入:本期第一季度营业收入:合计合计营业收入:0.8152278661727905:1908540816.12:160:1 +当期第一季度营业收入:本报告期第一季度营业收入:一、营业收入2023年度:0.7537218332290649:1529440280.25:82:1 +当期第一季度营业收入:本报告期第一季度营业收入:一、营业收入2022年度:0.7472591996192932:1316036204.14:82:1 +当期第一季度营业收入:报告期第一季度营业收入:一、营业收入2023年度:0.7371903657913208:1529440280.25:82:1 +当期第一季度营业收入:报告期第一季度营业收入:一、营业收入2022年度:0.7287268042564392:1316036204.14:82:1 +当期第一季度营业收入:报告期内第一季度营业收入:一、营业收入2022年度:0.7574669122695923:1316036204.14:82:1 +当期第一季度营业收入:报告期内第一季度营业收入:一、营业收入2023年度:0.7564677000045776:1529440280.25:82:1 +当期第一季度营业收入:本年度第一季度营业收入:一、营业收入2023年度:0.8088279962539673:1529440280.25:82:1 +当期第一季度营业收入:本年度第一季度营业收入:合计合计营业收入:0.8056900501251221:1908540816.12:160:1 +当期第一季度营业收入:本期发生额第一季度营业收入:合计本期发生额收入:0.7815280556678772:1529440280.25:200:2 +当期第一季度营业收入:本期发生额第一季度营业收入:合计上期发生额收入:0.7723479270935059:1316036204.14:200:2 +当期第一季度营业收入:2023年第一季度营业收入:一、营业收入2023年度:0.8834003210067749:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入:一、营业收入2022年度:0.8478075265884399:1316036204.14:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入:一、营业收入2023年度:0.8552464246749878:1529440280.25:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入:一、营业收入2022年度:0.8176230192184448:1316036204.14:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入:一、营业收入2023年度:0.8435201644897461:1529440280.25:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入:一、营业收入2022年度:0.8087093830108643:1316036204.14:82:1 +当期第一季度营业收入:第一季度营业收入:合计合计营业收入:0.80265212059021:1529440280.25:200:3 +当期第一季度营业收入:第一季度营业收入:合计合计营业收入:0.80265212059021:1908540816.12:160:1 +当期第一季度营业收入:1-3月营业收入:合计合计营业收入:0.8387395143508911:1529440280.25:200:3 +当期第一季度营业收入:1-3月营业收入:合计合计营业收入:0.8387395143508911:1908540816.12:160:1 +当期第一季度营业收入:第一季度(1-3月)营业收入:一、营业收入2023年度:0.7705226540565491:1529440280.25:82:1 +当期第一季度营业收入:第一季度(1-3月)营业收入:合计合计营业收入:0.7654190063476562:1908540816.12:160:1 +当期第一季度营业收入:2023年第一季度营业收入:一、营业收入2023年度:0.8834003210067749:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入:一、营业收入2022年度:0.8478075265884399:1316036204.14:82:1 +当期第一季度营业收入:当期第一季度营业收入合计:合计合计营业收入:0.7799856662750244:1529440280.25:200:3 +当期第一季度营业收入:当期第一季度营业收入合计:合计合计营业收入:0.7799856662750244:1908540816.12:160:1 +当期第一季度营业收入:本期第一季度营业收入合计:合计合计营业收入:0.8200230002403259:1529440280.25:200:3 +当期第一季度营业收入:本期第一季度营业收入合计:合计合计营业收入:0.8200230002403259:1908540816.12:160:1 +当期第一季度营业收入:本报告期第一季度营业收入合计:合计合计营业收入:0.7485299110412598:1529440280.25:200:3 +当期第一季度营业收入:本报告期第一季度营业收入合计:合计合计营业收入:0.7485299110412598:1908540816.12:160:1 +当期第一季度营业收入:报告期第一季度营业收入合计:一、营业收入2023年度:0.7333774566650391:1529440280.25:82:1 +当期第一季度营业收入:报告期第一季度营业收入合计:合计合计营业收入:0.7319813966751099:1908540816.12:160:1 +当期第一季度营业收入:报告期内第一季度营业收入合计:一、营业收入2023年度:0.739218533039093:1529440280.25:82:1 +当期第一季度营业收入:报告期内第一季度营业收入合计:一、营业收入2022年度:0.7388214468955994:1316036204.14:82:1 +当期第一季度营业收入:本年度第一季度营业收入合计:合计合计营业收入:0.8091668486595154:1529440280.25:200:3 +当期第一季度营业收入:本年度第一季度营业收入合计:合计合计营业收入:0.8091668486595154:1908540816.12:160:1 +当期第一季度营业收入:本期发生额第一季度营业收入合计:合计本期发生额收入:0.7877371311187744:1529440280.25:200:2 +当期第一季度营业收入:本期发生额第一季度营业收入合计:合计上期发生额收入:0.7841843366622925:1316036204.14:200:2 +当期第一季度营业收入:2023年第一季度营业收入合计:一、营业收入2023年度:0.8855074644088745:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入合计:一、营业收入2022年度:0.8490433692932129:1316036204.14:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入合计:一、营业收入2023年度:0.8593831062316895:1529440280.25:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入合计:一、营业收入2022年度:0.8207172155380249:1316036204.14:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入合计:一、营业收入2023年度:0.8379248380661011:1529440280.25:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入合计:一、营业收入2022年度:0.800845205783844:1316036204.14:82:1 +当期第一季度营业收入:第一季度营业收入合计:合计合计营业收入:0.8174300193786621:1529440280.25:200:3 +当期第一季度营业收入:第一季度营业收入合计:合计合计营业收入:0.8174300193786621:1908540816.12:160:1 +当期第一季度营业收入:1-3月营业收入合计:合计合计营业收入:0.8656914234161377:1529440280.25:200:3 +当期第一季度营业收入:1-3月营业收入合计:合计合计营业收入:0.8656914234161377:1908540816.12:160:1 +当期第一季度营业收入:第一季度(1-3月)营业收入合计:合计合计营业收入:0.7723628282546997:1529440280.25:200:3 +当期第一季度营业收入:第一季度(1-3月)营业收入合计:合计合计营业收入:0.7723628282546997:1908540816.12:160:1 +当期第一季度营业收入:2023年第一季度营业收入合计:一、营业收入2023年度:0.8855074644088745:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入合计:一、营业收入2022年度:0.8490433692932129:1316036204.14:82:1 +当期第一季度营业收入:当期第一季度营业收入总额:合计合计营业收入:0.7583635449409485:1529440280.25:200:3 +当期第一季度营业收入:当期第一季度营业收入总额:合计合计营业收入:0.7583635449409485:1908540816.12:160:1 +当期第一季度营业收入:本期第一季度营业收入总额:合计合计营业收入:0.8089246153831482:1529440280.25:200:3 +当期第一季度营业收入:本期第一季度营业收入总额:合计合计营业收入:0.8089246153831482:1908540816.12:160:1 +当期第一季度营业收入:本报告期第一季度营业收入总额:合计合计营业收入:0.7500815391540527:1529440280.25:200:3 +当期第一季度营业收入:本报告期第一季度营业收入总额:合计合计营业收入:0.7500815391540527:1908540816.12:160:1 +当期第一季度营业收入:报告期第一季度营业收入总额:合计合计营业收入:0.72684246301651:1529440280.25:200:3 +当期第一季度营业收入:报告期第一季度营业收入总额:合计合计营业收入:0.72684246301651:1908540816.12:160:1 +当期第一季度营业收入:报告期内第一季度营业收入总额:一、营业收入2022年度:0.735292375087738:1316036204.14:82:1 +当期第一季度营业收入:报告期内第一季度营业收入总额:一、营业收入2023年度:0.7336913347244263:1529440280.25:82:1 +当期第一季度营业收入:本年度第一季度营业收入总额:合计合计营业收入:0.7954764366149902:1529440280.25:200:3 +当期第一季度营业收入:本年度第一季度营业收入总额:合计合计营业收入:0.7954764366149902:1908540816.12:160:1 +当期第一季度营业收入:本期发生额第一季度营业收入总额:合计上期发生额收入:0.7692383527755737:1316036204.14:200:2 +当期第一季度营业收入:本期发生额第一季度营业收入总额:合计本期发生额收入:0.7645208835601807:1529440280.25:200:2 +当期第一季度营业收入:2023年第一季度营业收入总额:一、营业收入2023年度:0.8623106479644775:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入总额:一、营业收入2022年度:0.8253326416015625:1316036204.14:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入总额:一、营业收入2023年度:0.8307556509971619:1529440280.25:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入总额:一、营业收入2022年度:0.7919290065765381:1316036204.14:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入总额:一、营业收入2023年度:0.8188217878341675:1529440280.25:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入总额:一、营业收入2022年度:0.7819104194641113:1316036204.14:82:1 +当期第一季度营业收入:第一季度营业收入总额:合计合计营业收入:0.7851467132568359:1529440280.25:200:3 +当期第一季度营业收入:第一季度营业收入总额:合计合计营业收入:0.7851467132568359:1908540816.12:160:1 +当期第一季度营业收入:1-3月营业收入总额:合计合计营业收入:0.8494647741317749:1529440280.25:200:3 +当期第一季度营业收入:1-3月营业收入总额:合计合计营业收入:0.8494647741317749:1908540816.12:160:1 +当期第一季度营业收入:第一季度(1-3月)营业收入总额:合计合计营业收入:0.7452437281608582:1529440280.25:200:3 +当期第一季度营业收入:第一季度(1-3月)营业收入总额:合计合计营业收入:0.7452437281608582:1908540816.12:160:1 +当期第一季度营业收入:2023年第一季度营业收入总额:一、营业收入2023年度:0.8623106479644775:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入总额:一、营业收入2022年度:0.8253326416015625:1316036204.14:82:1 +当期第一季度营业收入:当期第一季度营业收入金额:合计本期发生额收入:0.765932559967041:1529440280.25:200:2 +当期第一季度营业收入:当期第一季度营业收入金额:合计合计营业收入:0.764467716217041:1908540816.12:160:1 +当期第一季度营业收入:本期第一季度营业收入金额:合计合计营业收入:0.8108253479003906:1529440280.25:200:3 +当期第一季度营业收入:本期第一季度营业收入金额:合计合计营业收入:0.8108253479003906:1908540816.12:160:1 +当期第一季度营业收入:本报告期第一季度营业收入金额:一、营业收入2023年度:0.7475394010543823:1529440280.25:82:1 +当期第一季度营业收入:本报告期第一季度营业收入金额:一、营业收入2022年度:0.7443409562110901:1316036204.14:82:1 +当期第一季度营业收入:报告期第一季度营业收入金额:一、营业收入2023年度:0.7268572449684143:1529440280.25:82:1 +当期第一季度营业收入:报告期第一季度营业收入金额:一、营业收入2022年度:0.7239212393760681:1316036204.14:82:1 +当期第一季度营业收入:报告期内第一季度营业收入金额:一、营业收入2022年度:0.7445072531700134:1316036204.14:82:1 +当期第一季度营业收入:报告期内第一季度营业收入金额:一、营业收入2023年度:0.7396459579467773:1529440280.25:82:1 +当期第一季度营业收入:本年度第一季度营业收入金额:一、营业收入2023年度:0.7978973388671875:1529440280.25:82:1 +当期第一季度营业收入:本年度第一季度营业收入金额:合计合计营业收入:0.7968685626983643:1908540816.12:160:1 +当期第一季度营业收入:本期发生额第一季度营业收入金额:合计本期发生额收入:0.7903047800064087:1529440280.25:200:2 +当期第一季度营业收入:本期发生额第一季度营业收入金额:合计上期发生额收入:0.782638669013977:1316036204.14:200:2 +当期第一季度营业收入:2023年第一季度营业收入金额:一、营业收入2023年度:0.8811375498771667:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入金额:一、营业收入2022年度:0.8500213623046875:1316036204.14:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入金额:一、营业收入2023年度:0.8536269068717957:1529440280.25:82:1 +当期第一季度营业收入:2023年全年第一季度营业收入金额:一、营业收入2022年度:0.8204106092453003:1316036204.14:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入金额:一、营业收入2023年度:0.8287789225578308:1529440280.25:82:1 +当期第一季度营业收入:2023年金额第一季度营业收入金额:一、营业收入2022年度:0.7971701622009277:1316036204.14:82:1 +当期第一季度营业收入:第一季度营业收入金额:合计合计营业收入:0.7936832308769226:1529440280.25:200:3 +当期第一季度营业收入:第一季度营业收入金额:合计合计营业收入:0.7936832308769226:1908540816.12:160:1 +当期第一季度营业收入:1-3月营业收入金额:合计合计营业收入:0.8434877395629883:1529440280.25:200:3 +当期第一季度营业收入:1-3月营业收入金额:合计合计营业收入:0.8434877395629883:1908540816.12:160:1 +当期第一季度营业收入:第一季度(1-3月)营业收入金额:一、营业收入2023年度:0.7523388862609863:1529440280.25:82:1 +当期第一季度营业收入:第一季度(1-3月)营业收入金额:合计合计营业收入:0.7487790584564209:1908540816.12:160:1 +当期第一季度营业收入:2023年第一季度营业收入金额:一、营业收入2023年度:0.8811375498771667:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度营业收入金额:一、营业收入2022年度:0.8500213623046875:1316036204.14:82:1 +当期第一季度营业收入:当期第一季度调整后营业收入:主营业务上期发生额收入:0.6975336670875549:1197550470.11:200:2 +当期第一季度营业收入:当期第一季度调整后营业收入:主营业务本期发生额收入:0.6885730624198914:1375217915.12:200:2 +当期第一季度营业收入:本期第一季度调整后营业收入:主营业务本期发生额收入:0.730546772480011:1375217915.12:200:2 +当期第一季度营业收入:本期第一季度调整后营业收入:主营业务上期发生额收入:0.7030433416366577:1197550470.11:200:2 +当期第一季度营业收入:本报告期第一季度调整后营业收入:主营业务本期发生额收入:0.6922404766082764:1375217915.12:200:2 +当期第一季度营业收入:本报告期第一季度调整后营业收入:一、营业收入2023年度:0.6787075996398926:1529440280.25:82:1 +当期第一季度营业收入:报告期第一季度调整后营业收入:主营业务上期发生额收入:0.652681827545166:1197550470.11:200:2 +当期第一季度营业收入:报告期第一季度调整后营业收入:主营业务本期发生额收入:0.652046263217926:1375217915.12:200:2 +当期第一季度营业收入:报告期内第一季度调整后营业收入:主营业务本期发生额收入:0.6876260042190552:1375217915.12:200:2 +当期第一季度营业收入:报告期内第一季度调整后营业收入:一、营业收入2023年度:0.671130895614624:1529440280.25:82:1 +当期第一季度营业收入:本年度第一季度调整后营业收入:主营业务本期发生额收入:0.7529772520065308:1375217915.12:200:2 +当期第一季度营业收入:本年度第一季度调整后营业收入:一、营业收入2023年度:0.7504528760910034:1529440280.25:82:1 +当期第一季度营业收入:本期发生额第一季度调整后营业收入:主营业务本期发生额收入:0.7152487635612488:1375217915.12:200:2 +当期第一季度营业收入:本期发生额第一季度调整后营业收入:主营业务上期发生额收入:0.709247350692749:1197550470.11:200:2 +当期第一季度营业收入:2023年第一季度调整后营业收入:一、营业收入2023年度:0.816794753074646:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度调整后营业收入:二、营业利润2023年度:0.7783002853393555:168108294.15:82:1 +当期第一季度营业收入:2023年全年第一季度调整后营业收入:一、营业收入2023年度:0.803075909614563:1529440280.25:82:1 +当期第一季度营业收入:2023年全年第一季度调整后营业收入:二、营业利润2023年度:0.7689988613128662:168108294.15:82:1 +当期第一季度营业收入:2023年金额第一季度调整后营业收入:一、营业收入2023年度:0.7715905904769897:1529440280.25:82:1 +当期第一季度营业收入:2023年金额第一季度调整后营业收入:二、营业利润2023年度:0.7457960844039917:168108294.15:82:1 +当期第一季度营业收入:第一季度调整后营业收入:一、营业收入2023年度:0.6810765266418457:1529440280.25:82:1 +当期第一季度营业收入:第一季度调整后营业收入:一、营业收入2022年度:0.6661894917488098:1316036204.14:82:1 +当期第一季度营业收入:1-3月调整后营业收入:合计合计营业收入:0.7766377925872803:1529440280.25:200:3 +当期第一季度营业收入:1-3月调整后营业收入:合计合计营业收入:0.7766377925872803:1908540816.12:160:1 +当期第一季度营业收入:第一季度(1-3月)调整后营业收入:一、营业收入2023年度:0.6824878454208374:1529440280.25:82:1 +当期第一季度营业收入:第一季度(1-3月)调整后营业收入:二、营业利润2023年度:0.6608095765113831:168108294.15:82:1 +当期第一季度营业收入:2023年第一季度调整后营业收入:一、营业收入2023年度:0.816794753074646:1529440280.25:82:1 +当期第一季度营业收入:2023年第一季度调整后营业收入:二、营业利润2023年度:0.7783002853393555:168108294.15:82:1 +当期第二季度营业收入:当期第二季度营业收入:一、营业收入2022年度:0.7499927878379822:1316036204.14:82:1 +当期第二季度营业收入:当期第二季度营业收入:合计合计营业收入:0.7478433847427368:1908540816.12:160:1 +当期第二季度营业收入:本期第二季度营业收入:一、营业收入2022年度:0.7947524785995483:1316036204.14:82:1 +当期第二季度营业收入:本期第二季度营业收入:合计合计营业收入:0.7798612117767334:1908540816.12:160:1 +当期第二季度营业收入:本报告期第二季度营业收入:一、营业收入2022年度:0.7616323828697205:1316036204.14:82:1 +当期第二季度营业收入:本报告期第二季度营业收入:二、营业利润2022年度:0.7258411049842834:140290776.93:82:1 +当期第二季度营业收入:报告期第二季度营业收入:一、营业收入2022年度:0.7443479299545288:1316036204.14:82:1 +当期第二季度营业收入:报告期第二季度营业收入:二、营业利润2022年度:0.7303050756454468:140290776.93:82:1 +当期第二季度营业收入:报告期内第二季度营业收入:一、营业收入2022年度:0.7629543542861938:1316036204.14:82:1 +当期第二季度营业收入:报告期内第二季度营业收入:一、营业收入2023年度:0.7259098887443542:1529440280.25:82:1 +当期第二季度营业收入:本年度第二季度营业收入:一、营业收入2022年度:0.8174691796302795:1316036204.14:82:1 +当期第二季度营业收入:本年度第二季度营业收入:合计合计营业收入:0.795146644115448:1908540816.12:160:1 +当期第二季度营业收入:本期发生额第二季度营业收入:合计本期发生额收入:0.7458164095878601:1529440280.25:200:2 +当期第二季度营业收入:本期发生额第二季度营业收入:主营业务本期发生额收入:0.7422898411750793:1375217915.12:200:2 +当期第二季度营业收入:2023年第二季度营业收入:一、营业收入2023年度:0.8507882356643677:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入:一、营业收入2022年度:0.844813346862793:1316036204.14:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入:一、营业收入2023年度:0.8153694868087769:1529440280.25:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入:一、营业收入2022年度:0.8123082518577576:1316036204.14:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入:一、营业收入2023年度:0.8177069425582886:1529440280.25:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入:二、营业利润2023年度:0.8068555593490601:168108294.15:82:1 +当期第二季度营业收入:第二季度营业收入:一、营业收入2022年度:0.7727704048156738:1316036204.14:82:1 +当期第二季度营业收入:第二季度营业收入:合计合计营业收入:0.7596870064735413:1908540816.12:160:1 +当期第二季度营业收入:4-6月营业收入:合计合计营业收入:0.8240814208984375:1529440280.25:200:3 +当期第二季度营业收入:4-6月营业收入:合计合计营业收入:0.8240814208984375:1908540816.12:160:1 +当期第二季度营业收入:第二季度(4-6月)营业收入:合计合计营业收入:0.7300079464912415:1529440280.25:200:3 +当期第二季度营业收入:第二季度(4-6月)营业收入:合计合计营业收入:0.7300079464912415:1908540816.12:160:1 +当期第二季度营业收入:2023年第二季度营业收入:一、营业收入2023年度:0.8507882356643677:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入:一、营业收入2022年度:0.844813346862793:1316036204.14:82:1 +当期第二季度营业收入:当期第二季度营业收入合计:合计合计营业收入:0.7526664733886719:1529440280.25:200:3 +当期第二季度营业收入:当期第二季度营业收入合计:合计合计营业收入:0.7526664733886719:1908540816.12:160:1 +当期第二季度营业收入:本期第二季度营业收入合计:一、营业收入2022年度:0.788034975528717:1316036204.14:82:1 +当期第二季度营业收入:本期第二季度营业收入合计:合计合计营业收入:0.7869771122932434:1908540816.12:160:1 +当期第二季度营业收入:本报告期第二季度营业收入合计:一、营业收入2022年度:0.7516578435897827:1316036204.14:82:1 +当期第二季度营业收入:本报告期第二季度营业收入合计:合计合计营业收入:0.7332464456558228:1908540816.12:160:1 +当期第二季度营业收入:报告期第二季度营业收入合计:一、营业收入2022年度:0.7387418150901794:1316036204.14:82:1 +当期第二季度营业收入:报告期第二季度营业收入合计:合计合计营业收入:0.725396990776062:1908540816.12:160:1 +当期第二季度营业收入:报告期内第二季度营业收入合计:一、营业收入2022年度:0.7430994510650635:1316036204.14:82:1 +当期第二季度营业收入:报告期内第二季度营业收入合计:主营业务本期发生额收入:0.7191089987754822:1375217915.12:200:2 +当期第二季度营业收入:本年度第二季度营业收入合计:一、营业收入2022年度:0.8172376155853271:1316036204.14:82:1 +当期第二季度营业收入:本年度第二季度营业收入合计:合计合计营业收入:0.8059536218643188:1908540816.12:160:1 +当期第二季度营业收入:本期发生额第二季度营业收入合计:合计本期发生额收入:0.7550836801528931:1529440280.25:200:2 +当期第二季度营业收入:本期发生额第二季度营业收入合计:合计上期发生额收入:0.7542705535888672:1316036204.14:200:2 +当期第二季度营业收入:2023年第二季度营业收入合计:一、营业收入2023年度:0.8483396768569946:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入合计:一、营业收入2022年度:0.8451250195503235:1316036204.14:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入合计:一、营业收入2023年度:0.8185504674911499:1529440280.25:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入合计:一、营业收入2022年度:0.8174605965614319:1316036204.14:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入合计:一、营业收入2023年度:0.8076238632202148:1529440280.25:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入合计:二、营业利润2023年度:0.8000048398971558:168108294.15:82:1 +当期第二季度营业收入:第二季度营业收入合计:合计合计营业收入:0.7834554314613342:1529440280.25:200:3 +当期第二季度营业收入:第二季度营业收入合计:合计合计营业收入:0.7834554314613342:1908540816.12:160:1 +当期第二季度营业收入:4-6月营业收入合计:合计合计营业收入:0.8484752774238586:1529440280.25:200:3 +当期第二季度营业收入:4-6月营业收入合计:合计合计营业收入:0.8484752774238586:1908540816.12:160:1 +当期第二季度营业收入:第二季度(4-6月)营业收入合计:合计合计营业收入:0.7500355243682861:1529440280.25:200:3 +当期第二季度营业收入:第二季度(4-6月)营业收入合计:合计合计营业收入:0.7500355243682861:1908540816.12:160:1 +当期第二季度营业收入:2023年第二季度营业收入合计:一、营业收入2023年度:0.8483396768569946:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入合计:一、营业收入2022年度:0.8451250195503235:1316036204.14:82:1 +当期第二季度营业收入:当期第二季度营业收入总额:合计合计营业收入:0.7338167428970337:1529440280.25:200:3 +当期第二季度营业收入:当期第二季度营业收入总额:合计合计营业收入:0.7338167428970337:1908540816.12:160:1 +当期第二季度营业收入:本期第二季度营业收入总额:合计合计营业收入:0.7710273265838623:1529440280.25:200:3 +当期第二季度营业收入:本期第二季度营业收入总额:合计合计营业收入:0.7710273265838623:1908540816.12:160:1 +当期第二季度营业收入:本报告期第二季度营业收入总额:一、营业收入2022年度:0.7423689961433411:1316036204.14:82:1 +当期第二季度营业收入:本报告期第二季度营业收入总额:合计合计营业收入:0.7265745401382446:1908540816.12:160:1 +当期第二季度营业收入:报告期第二季度营业收入总额:一、营业收入2022年度:0.7217438817024231:1316036204.14:82:1 +当期第二季度营业收入:报告期第二季度营业收入总额:二、营业利润2022年度:0.7133337259292603:140290776.93:82:1 +当期第二季度营业收入:报告期内第二季度营业收入总额:一、营业收入2022年度:0.7412555813789368:1316036204.14:82:1 +当期第二季度营业收入:报告期内第二季度营业收入总额:主营业务本期发生额收入:0.7150699496269226:1375217915.12:200:2 +当期第二季度营业收入:本年度第二季度营业收入总额:一、营业收入2022年度:0.7823840379714966:1316036204.14:82:1 +当期第二季度营业收入:本年度第二季度营业收入总额:合计合计营业收入:0.7819265127182007:1908540816.12:160:1 +当期第二季度营业收入:本期发生额第二季度营业收入总额:合计上期发生额收入:0.737359881401062:1316036204.14:200:2 +当期第二季度营业收入:本期发生额第二季度营业收入总额:合计本期发生额收入:0.7289069890975952:1529440280.25:200:2 +当期第二季度营业收入:2023年第二季度营业收入总额:一、营业收入2023年度:0.825644314289093:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入总额:一、营业收入2022年度:0.8193683624267578:1316036204.14:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入总额:一、营业收入2023年度:0.7884039878845215:1529440280.25:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入总额:二、营业利润2023年度:0.7865155935287476:168108294.15:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入总额:一、营业收入2023年度:0.7900369763374329:1529440280.25:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入总额:二、营业利润2023年度:0.7863979339599609:168108294.15:82:1 +当期第二季度营业收入:第二季度营业收入总额:合计合计营业收入:0.7447060346603394:1529440280.25:200:3 +当期第二季度营业收入:第二季度营业收入总额:合计合计营业收入:0.7447060346603394:1908540816.12:160:1 +当期第二季度营业收入:4-6月营业收入总额:合计合计营业收入:0.8334307670593262:1529440280.25:200:3 +当期第二季度营业收入:4-6月营业收入总额:合计合计营业收入:0.8334307670593262:1908540816.12:160:1 +当期第二季度营业收入:第二季度(4-6月)营业收入总额:合计合计营业收入:0.723671019077301:1529440280.25:200:3 +当期第二季度营业收入:第二季度(4-6月)营业收入总额:合计合计营业收入:0.723671019077301:1908540816.12:160:1 +当期第二季度营业收入:2023年第二季度营业收入总额:一、营业收入2023年度:0.825644314289093:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入总额:一、营业收入2022年度:0.8193683624267578:1316036204.14:82:1 +当期第二季度营业收入:当期第二季度营业收入金额:合计本期发生额收入:0.7495960593223572:1529440280.25:200:2 +当期第二季度营业收入:当期第二季度营业收入金额:合计上期发生额收入:0.7492785453796387:1316036204.14:200:2 +当期第二季度营业收入:本期第二季度营业收入金额:一、营业收入2022年度:0.787724494934082:1316036204.14:82:1 +当期第二季度营业收入:本期第二季度营业收入金额:合计合计营业收入:0.775987982749939:1908540816.12:160:1 +当期第二季度营业收入:本报告期第二季度营业收入金额:一、营业收入2022年度:0.7568432092666626:1316036204.14:82:1 +当期第二季度营业收入:本报告期第二季度营业收入金额:主营业务本期发生额收入:0.7351803183555603:1375217915.12:200:2 +当期第二季度营业收入:报告期第二季度营业收入金额:一、营业收入2022年度:0.7350449562072754:1316036204.14:82:1 +当期第二季度营业收入:报告期第二季度营业收入金额:二、营业利润2022年度:0.7158986926078796:140290776.93:82:1 +当期第二季度营业收入:报告期内第二季度营业收入金额:一、营业收入2022年度:0.7480529546737671:1316036204.14:82:1 +当期第二季度营业收入:报告期内第二季度营业收入金额:主营业务本期发生额收入:0.7207555770874023:1375217915.12:200:2 +当期第二季度营业收入:本年度第二季度营业收入金额:一、营业收入2022年度:0.8088082671165466:1316036204.14:82:1 +当期第二季度营业收入:本年度第二季度营业收入金额:合计合计营业收入:0.7861825227737427:1908540816.12:160:1 +当期第二季度营业收入:本期发生额第二季度营业收入金额:合计本期发生额收入:0.7586398720741272:1529440280.25:200:2 +当期第二季度营业收入:本期发生额第二季度营业收入金额:合计上期发生额收入:0.754821240901947:1316036204.14:200:2 +当期第二季度营业收入:2023年第二季度营业收入金额:一、营业收入2023年度:0.8457608222961426:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入金额:一、营业收入2022年度:0.8448918461799622:1316036204.14:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入金额:一、营业收入2022年度:0.8145211935043335:1316036204.14:82:1 +当期第二季度营业收入:2023年全年第二季度营业收入金额:一、营业收入2023年度:0.8122960329055786:1529440280.25:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入金额:一、营业收入2023年度:0.8008171319961548:1529440280.25:82:1 +当期第二季度营业收入:2023年金额第二季度营业收入金额:二、营业利润2023年度:0.7947495579719543:168108294.15:82:1 +当期第二季度营业收入:第二季度营业收入金额:一、营业收入2022年度:0.7657380700111389:1316036204.14:82:1 +当期第二季度营业收入:第二季度营业收入金额:合计合计营业收入:0.7592512369155884:1908540816.12:160:1 +当期第二季度营业收入:4-6月营业收入金额:合计合计营业收入:0.8379848003387451:1529440280.25:200:3 +当期第二季度营业收入:4-6月营业收入金额:合计合计营业收入:0.8379848003387451:1908540816.12:160:1 +当期第二季度营业收入:第二季度(4-6月)营业收入金额:合计合计营业收入:0.7242875099182129:1529440280.25:200:3 +当期第二季度营业收入:第二季度(4-6月)营业收入金额:合计合计营业收入:0.7242875099182129:1908540816.12:160:1 +当期第二季度营业收入:2023年第二季度营业收入金额:一、营业收入2023年度:0.8457608222961426:1529440280.25:82:1 +当期第二季度营业收入:2023年第二季度营业收入金额:一、营业收入2022年度:0.8448918461799622:1316036204.14:82:1 +当期第二季度营业收入:当期第二季度调整后营业收入:二、营业利润2022年度:0.6747086644172668:140290776.93:82:1 +当期第二季度营业收入:当期第二季度调整后营业收入:主营业务上期发生额收入:0.6746410131454468:1197550470.11:200:2 +当期第二季度营业收入:本期第二季度调整后营业收入:主营业务本期发生额收入:0.7074909806251526:1375217915.12:200:2 +当期第二季度营业收入:本期第二季度调整后营业收入:二、营业利润2022年度:0.6946765780448914:140290776.93:82:1 +当期第二季度营业收入:本报告期第二季度调整后营业收入:二、营业利润2022年度:0.6885138750076294:140290776.93:82:1 +当期第二季度营业收入:本报告期第二季度调整后营业收入:主营业务本期发生额收入:0.6884127259254456:1375217915.12:200:2 +当期第二季度营业收入:报告期第二季度调整后营业收入:二、营业利润2022年度:0.6760711073875427:140290776.93:82:1 +当期第二季度营业收入:报告期第二季度调整后营业收入:主营业务本期发生额收入:0.653654932975769:1375217915.12:200:2 +当期第二季度营业收入:报告期内第二季度调整后营业收入:主营业务本期发生额收入:0.6870577931404114:1375217915.12:200:2 +当期第二季度营业收入:报告期内第二季度调整后营业收入:二、营业利润2022年度:0.6811116337776184:140290776.93:82:1 +当期第二季度营业收入:本年度第二季度调整后营业收入:一、营业收入2022年度:0.7471107840538025:1316036204.14:82:1 +当期第二季度营业收入:本年度第二季度调整后营业收入:主营业务本期发生额收入:0.7469735741615295:1375217915.12:200:2 +当期第二季度营业收入:本期发生额第二季度调整后营业收入:主营业务本期发生额收入:0.6911863684654236:1375217915.12:200:2 +当期第二季度营业收入:本期发生额第二季度调整后营业收入:主营业务上期发生额收入:0.6795547008514404:1197550470.11:200:2 +当期第二季度营业收入:2023年第二季度调整后营业收入:二、营业利润2023年度:0.7828860878944397:168108294.15:82:1 +当期第二季度营业收入:2023年第二季度调整后营业收入:一、营业收入2023年度:0.7736827731132507:1529440280.25:82:1 +当期第二季度营业收入:2023年全年第二季度调整后营业收入:二、营业利润2023年度:0.7750164270401001:168108294.15:82:1 +当期第二季度营业收入:2023年全年第二季度调整后营业收入:二、营业利润2022年度:0.7677729725837708:140290776.93:82:1 +当期第二季度营业收入:2023年金额第二季度调整后营业收入:二、营业利润2023年度:0.7565282583236694:168108294.15:82:1 +当期第二季度营业收入:2023年金额第二季度调整后营业收入:一、营业收入2023年度:0.748762845993042:1529440280.25:82:1 +当期第二季度营业收入:第二季度调整后营业收入:二、营业利润2022年度:0.6847309470176697:140290776.93:82:1 +当期第二季度营业收入:第二季度调整后营业收入:一、营业收入2022年度:0.664497435092926:1316036204.14:82:1 +当期第二季度营业收入:4-6月调整后营业收入:合计合计营业收入:0.7378706932067871:1529440280.25:200:3 +当期第二季度营业收入:4-6月调整后营业收入:合计合计营业收入:0.7378706932067871:1908540816.12:160:1 +当期第二季度营业收入:第二季度(4-6月)调整后营业收入:二、营业利润2022年度:0.6652938723564148:140290776.93:82:1 +当期第二季度营业收入:第二季度(4-6月)调整后营业收入:二、营业利润2023年度:0.6523925065994263:168108294.15:82:1 +当期第二季度营业收入:2023年第二季度调整后营业收入:二、营业利润2023年度:0.7828860878944397:168108294.15:82:1 +当期第二季度营业收入:2023年第二季度调整后营业收入:一、营业收入2023年度:0.7736827731132507:1529440280.25:82:1 +当期第三季度营业收入:当期第三季度营业收入:合计合计营业收入:0.769263505935669:1529440280.25:200:3 +当期第三季度营业收入:当期第三季度营业收入:合计合计营业收入:0.769263505935669:1908540816.12:160:1 +当期第三季度营业收入:本期第三季度营业收入:一、营业收入2023年度:0.7927300930023193:1529440280.25:82:1 +当期第三季度营业收入:本期第三季度营业收入:合计合计营业收入:0.791613757610321:1908540816.12:160:1 +当期第三季度营业收入:本报告期第三季度营业收入:一、营业收入2023年度:0.7477922439575195:1529440280.25:82:1 +当期第三季度营业收入:本报告期第三季度营业收入:合计合计营业收入:0.721315324306488:1908540816.12:160:1 +当期第三季度营业收入:报告期第三季度营业收入:一、营业收入2023年度:0.7363279461860657:1529440280.25:82:1 +当期第三季度营业收入:报告期第三季度营业收入:合计合计营业收入:0.7129923701286316:1908540816.12:160:1 +当期第三季度营业收入:报告期内第三季度营业收入:一、营业收入2023年度:0.7613742351531982:1529440280.25:82:1 +当期第三季度营业收入:报告期内第三季度营业收入:一、营业收入2022年度:0.7329131960868835:1316036204.14:82:1 +当期第三季度营业收入:本年度第三季度营业收入:一、营业收入2023年度:0.8162500858306885:1529440280.25:82:1 +当期第三季度营业收入:本年度第三季度营业收入:合计合计营业收入:0.8092461824417114:1908540816.12:160:1 +当期第三季度营业收入:本期发生额第三季度营业收入:合计本期发生额收入:0.7406390309333801:1529440280.25:200:2 +当期第三季度营业收入:本期发生额第三季度营业收入:合计上期发生额收入:0.7384792566299438:1316036204.14:200:2 +当期第三季度营业收入:2023年第三季度营业收入:一、营业收入2023年度:0.8720533847808838:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入:一、营业收入2022年度:0.8199886679649353:1316036204.14:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入:一、营业收入2023年度:0.8407455682754517:1529440280.25:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入:二、营业利润2023年度:0.7892609238624573:168108294.15:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入:一、营业收入2023年度:0.834031879901886:1529440280.25:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入:二、营业利润2023年度:0.7901297807693481:168108294.15:82:1 +当期第三季度营业收入:第三季度营业收入:一、营业收入2023年度:0.8007388114929199:1529440280.25:82:1 +当期第三季度营业收入:第三季度营业收入:合计合计营业收入:0.7866935729980469:1908540816.12:160:1 +当期第三季度营业收入:7-9月营业收入:合计合计营业收入:0.789618968963623:1529440280.25:200:3 +当期第三季度营业收入:7-9月营业收入:合计合计营业收入:0.789618968963623:1908540816.12:160:1 +当期第三季度营业收入:第三季度(7-9月)营业收入:合计合计营业收入:0.7456334233283997:1529440280.25:200:3 +当期第三季度营业收入:第三季度(7-9月)营业收入:合计合计营业收入:0.7456334233283997:1908540816.12:160:1 +当期第三季度营业收入:2023年第三季度营业收入:一、营业收入2023年度:0.8720533847808838:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入:一、营业收入2022年度:0.8199886679649353:1316036204.14:82:1 +当期第三季度营业收入:当期第三季度营业收入合计:合计合计营业收入:0.7686006426811218:1529440280.25:200:3 +当期第三季度营业收入:当期第三季度营业收入合计:合计合计营业收入:0.7686006426811218:1908540816.12:160:1 +当期第三季度营业收入:本期第三季度营业收入合计:合计合计营业收入:0.7919051647186279:1529440280.25:200:3 +当期第三季度营业收入:本期第三季度营业收入合计:合计合计营业收入:0.7919051647186279:1908540816.12:160:1 +当期第三季度营业收入:本报告期第三季度营业收入合计:一、营业收入2023年度:0.7381394505500793:1529440280.25:82:1 +当期第三季度营业收入:本报告期第三季度营业收入合计:合计合计营业收入:0.7331779599189758:1908540816.12:160:1 +当期第三季度营业收入:报告期第三季度营业收入合计:合计合计营业收入:0.7329857349395752:1529440280.25:200:3 +当期第三季度营业收入:报告期第三季度营业收入合计:合计合计营业收入:0.7329857349395752:1908540816.12:160:1 +当期第三季度营业收入:报告期内第三季度营业收入合计:一、营业收入2023年度:0.7388105392456055:1529440280.25:82:1 +当期第三季度营业收入:报告期内第三季度营业收入合计:合计合计营业收入:0.7207770347595215:1908540816.12:160:1 +当期第三季度营业收入:本年度第三季度营业收入合计:一、营业收入2023年度:0.8094370365142822:1529440280.25:82:1 +当期第三季度营业收入:本年度第三季度营业收入合计:合计合计营业收入:0.8080731630325317:1908540816.12:160:1 +当期第三季度营业收入:本期发生额第三季度营业收入合计:合计上期发生额收入:0.7480552196502686:1316036204.14:200:2 +当期第三季度营业收入:本期发生额第三季度营业收入合计:合计本期发生额收入:0.7478901743888855:1529440280.25:200:2 +当期第三季度营业收入:2023年第三季度营业收入合计:一、营业收入2023年度:0.8664562702178955:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入合计:一、营业收入2022年度:0.812240719795227:1316036204.14:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入合计:一、营业收入2023年度:0.8405865430831909:1529440280.25:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入合计:二、营业利润2023年度:0.7887902855873108:168108294.15:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入合计:一、营业收入2023年度:0.8251793384552002:1529440280.25:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入合计:二、营业利润2023年度:0.7828586101531982:168108294.15:82:1 +当期第三季度营业收入:第三季度营业收入合计:合计合计营业收入:0.8011897802352905:1529440280.25:200:3 +当期第三季度营业收入:第三季度营业收入合计:合计合计营业收入:0.8011897802352905:1908540816.12:160:1 +当期第三季度营业收入:7-9月营业收入合计:合计合计营业收入:0.7989908456802368:1529440280.25:200:3 +当期第三季度营业收入:7-9月营业收入合计:合计合计营业收入:0.7989908456802368:1908540816.12:160:1 +当期第三季度营业收入:第三季度(7-9月)营业收入合计:合计合计营业收入:0.7625550031661987:1529440280.25:200:3 +当期第三季度营业收入:第三季度(7-9月)营业收入合计:合计合计营业收入:0.7625550031661987:1908540816.12:160:1 +当期第三季度营业收入:2023年第三季度营业收入合计:一、营业收入2023年度:0.8664562702178955:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入合计:一、营业收入2022年度:0.812240719795227:1316036204.14:82:1 +当期第三季度营业收入:当期第三季度营业收入总额:合计合计营业收入:0.7570466995239258:1529440280.25:200:3 +当期第三季度营业收入:当期第三季度营业收入总额:合计合计营业收入:0.7570466995239258:1908540816.12:160:1 +当期第三季度营业收入:本期第三季度营业收入总额:合计合计营业收入:0.7855948805809021:1529440280.25:200:3 +当期第三季度营业收入:本期第三季度营业收入总额:合计合计营业收入:0.7855948805809021:1908540816.12:160:1 +当期第三季度营业收入:本报告期第三季度营业收入总额:合计合计营业收入:0.733095645904541:1529440280.25:200:3 +当期第三季度营业收入:本报告期第三季度营业收入总额:合计合计营业收入:0.733095645904541:1908540816.12:160:1 +当期第三季度营业收入:报告期第三季度营业收入总额:合计合计营业收入:0.724324643611908:1529440280.25:200:3 +当期第三季度营业收入:报告期第三季度营业收入总额:合计合计营业收入:0.724324643611908:1908540816.12:160:1 +当期第三季度营业收入:报告期内第三季度营业收入总额:一、营业收入2023年度:0.7395795583724976:1529440280.25:82:1 +当期第三季度营业收入:报告期内第三季度营业收入总额:合计合计营业收入:0.7300584316253662:1908540816.12:160:1 +当期第三季度营业收入:本年度第三季度营业收入总额:合计合计营业收入:0.7921741008758545:1529440280.25:200:3 +当期第三季度营业收入:本年度第三季度营业收入总额:合计合计营业收入:0.7921741008758545:1908540816.12:160:1 +当期第三季度营业收入:本期发生额第三季度营业收入总额:合计上期发生额收入:0.7384077310562134:1316036204.14:200:2 +当期第三季度营业收入:本期发生额第三季度营业收入总额:合计本期发生额收入:0.7277502417564392:1529440280.25:200:2 +当期第三季度营业收入:2023年第三季度营业收入总额:一、营业收入2023年度:0.8452322483062744:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入总额:一、营业收入2022年度:0.791549801826477:1316036204.14:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入总额:一、营业收入2023年度:0.8138190507888794:1529440280.25:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入总额:三、利润总额2023年度:0.7784105539321899:167670367.08:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入总额:一、营业收入2023年度:0.8080453872680664:1529440280.25:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入总额:三、利润总额2023年度:0.7795206904411316:167670367.08:82:1 +当期第三季度营业收入:第三季度营业收入总额:合计合计营业收入:0.7695404291152954:1529440280.25:200:3 +当期第三季度营业收入:第三季度营业收入总额:合计合计营业收入:0.7695404291152954:1908540816.12:160:1 +当期第三季度营业收入:7-9月营业收入总额:合计合计营业收入:0.7842753529548645:1529440280.25:200:3 +当期第三季度营业收入:7-9月营业收入总额:合计合计营业收入:0.7842753529548645:1908540816.12:160:1 +当期第三季度营业收入:第三季度(7-9月)营业收入总额:合计合计营业收入:0.7400246858596802:1529440280.25:200:3 +当期第三季度营业收入:第三季度(7-9月)营业收入总额:合计合计营业收入:0.7400246858596802:1908540816.12:160:1 +当期第三季度营业收入:2023年第三季度营业收入总额:一、营业收入2023年度:0.8452322483062744:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入总额:一、营业收入2022年度:0.791549801826477:1316036204.14:82:1 +当期第三季度营业收入:当期第三季度营业收入金额:合计合计营业收入:0.768082857131958:1529440280.25:200:3 +当期第三季度营业收入:当期第三季度营业收入金额:合计合计营业收入:0.768082857131958:1908540816.12:160:1 +当期第三季度营业收入:本期第三季度营业收入金额:合计合计营业收入:0.7909643650054932:1529440280.25:200:3 +当期第三季度营业收入:本期第三季度营业收入金额:合计合计营业收入:0.7909643650054932:1908540816.12:160:1 +当期第三季度营业收入:本报告期第三季度营业收入金额:一、营业收入2023年度:0.7463234663009644:1529440280.25:82:1 +当期第三季度营业收入:本报告期第三季度营业收入金额:合计合计营业收入:0.7316365838050842:1908540816.12:160:1 +当期第三季度营业收入:报告期第三季度营业收入金额:一、营业收入2023年度:0.7307418584823608:1529440280.25:82:1 +当期第三季度营业收入:报告期第三季度营业收入金额:合计合计营业收入:0.7188594937324524:1908540816.12:160:1 +当期第三季度营业收入:报告期内第三季度营业收入金额:一、营业收入2023年度:0.7476052045822144:1529440280.25:82:1 +当期第三季度营业收入:报告期内第三季度营业收入金额:一、营业收入2022年度:0.7246643900871277:1316036204.14:82:1 +当期第三季度营业收入:本年度第三季度营业收入金额:一、营业收入2023年度:0.8054132461547852:1529440280.25:82:1 +当期第三季度营业收入:本年度第三季度营业收入金额:合计合计营业收入:0.7970657348632812:1908540816.12:160:1 +当期第三季度营业收入:本期发生额第三季度营业收入金额:合计本期发生额收入:0.7572265267372131:1529440280.25:200:2 +当期第三季度营业收入:本期发生额第三季度营业收入金额:合计上期发生额收入:0.7552800178527832:1316036204.14:200:2 +当期第三季度营业收入:2023年第三季度营业收入金额:一、营业收入2023年度:0.8679349422454834:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入金额:一、营业收入2022年度:0.8199768662452698:1316036204.14:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入金额:一、营业收入2023年度:0.8384668231010437:1529440280.25:82:1 +当期第三季度营业收入:2023年全年第三季度营业收入金额:一、营业收入2022年度:0.7875922918319702:1316036204.14:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入金额:一、营业收入2023年度:0.8213504552841187:1529440280.25:82:1 +当期第三季度营业收入:2023年金额第三季度营业收入金额:二、营业利润2023年度:0.7790818214416504:168108294.15:82:1 +当期第三季度营业收入:第三季度营业收入金额:一、营业收入2023年度:0.7889006733894348:1529440280.25:82:1 +当期第三季度营业收入:第三季度营业收入金额:合计合计营业收入:0.7851214408874512:1908540816.12:160:1 +当期第三季度营业收入:7-9月营业收入金额:合计合计营业收入:0.7897228002548218:1529440280.25:200:3 +当期第三季度营业收入:7-9月营业收入金额:合计合计营业收入:0.7897228002548218:1908540816.12:160:1 +当期第三季度营业收入:第三季度(7-9月)营业收入金额:合计合计营业收入:0.7413833141326904:1529440280.25:200:3 +当期第三季度营业收入:第三季度(7-9月)营业收入金额:合计合计营业收入:0.7413833141326904:1908540816.12:160:1 +当期第三季度营业收入:2023年第三季度营业收入金额:一、营业收入2023年度:0.8679349422454834:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度营业收入金额:一、营业收入2022年度:0.8199768662452698:1316036204.14:82:1 +当期第三季度营业收入:当期第三季度调整后营业收入:主营业务上期发生额收入:0.6910350918769836:1197550470.11:200:2 +当期第三季度营业收入:当期第三季度调整后营业收入:主营业务本期发生额收入:0.6798544526100159:1375217915.12:200:2 +当期第三季度营业收入:本期第三季度调整后营业收入:主营业务本期发生额收入:0.7100983262062073:1375217915.12:200:2 +当期第三季度营业收入:本期第三季度调整后营业收入:一、营业收入2023年度:0.6951716542243958:1529440280.25:82:1 +当期第三季度营业收入:本报告期第三季度调整后营业收入:一、营业收入2023年度:0.6885741949081421:1529440280.25:82:1 +当期第三季度营业收入:本报告期第三季度调整后营业收入:主营业务本期发生额收入:0.6819039583206177:1375217915.12:200:2 +当期第三季度营业收入:报告期第三季度调整后营业收入:一、营业收入2023年度:0.662473201751709:1529440280.25:82:1 +当期第三季度营业收入:报告期第三季度调整后营业收入:主营业务上期发生额收入:0.6561844348907471:1197550470.11:200:2 +当期第三季度营业收入:报告期内第三季度调整后营业收入:一、营业收入2023年度:0.6937515139579773:1529440280.25:82:1 +当期第三季度营业收入:报告期内第三季度调整后营业收入:主营业务本期发生额收入:0.6888586282730103:1375217915.12:200:2 +当期第三季度营业收入:本年度第三季度调整后营业收入:一、营业收入2023年度:0.7615238428115845:1529440280.25:82:1 +当期第三季度营业收入:本年度第三季度调整后营业收入:主营业务本期发生额收入:0.7385498881340027:1375217915.12:200:2 +当期第三季度营业收入:本期发生额第三季度调整后营业收入:主营业务本期发生额收入:0.7050449252128601:1375217915.12:200:2 +当期第三季度营业收入:本期发生额第三季度调整后营业收入:主营业务上期发生额收入:0.7003759741783142:1197550470.11:200:2 +当期第三季度营业收入:2023年第三季度调整后营业收入:一、营业收入2023年度:0.803479790687561:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度调整后营业收入:二、营业利润2023年度:0.7725194692611694:168108294.15:82:1 +当期第三季度营业收入:2023年全年第三季度调整后营业收入:一、营业收入2023年度:0.7982802987098694:1529440280.25:82:1 +当期第三季度营业收入:2023年全年第三季度调整后营业收入:二、营业利润2023年度:0.7716906070709229:168108294.15:82:1 +当期第三季度营业收入:2023年金额第三季度调整后营业收入:一、营业收入2023年度:0.7748178839683533:1529440280.25:82:1 +当期第三季度营业收入:2023年金额第三季度调整后营业收入:二、营业利润2023年度:0.7517119646072388:168108294.15:82:1 +当期第三季度营业收入:第三季度调整后营业收入:一、营业收入2023年度:0.7038530111312866:1529440280.25:82:1 +当期第三季度营业收入:第三季度调整后营业收入:二、营业利润2023年度:0.6789634227752686:168108294.15:82:1 +当期第三季度营业收入:7-9月调整后营业收入:合计合计营业收入:0.6678023338317871:1529440280.25:200:3 +当期第三季度营业收入:7-9月调整后营业收入:合计合计营业收入:0.6678023338317871:1908540816.12:160:1 +当期第三季度营业收入:第三季度(7-9月)调整后营业收入:一、营业收入2023年度:0.6416842341423035:1529440280.25:82:1 +当期第三季度营业收入:第三季度(7-9月)调整后营业收入:二、营业利润2023年度:0.6365066766738892:168108294.15:82:1 +当期第三季度营业收入:2023年第三季度调整后营业收入:一、营业收入2023年度:0.803479790687561:1529440280.25:82:1 +当期第三季度营业收入:2023年第三季度调整后营业收入:二、营业利润2023年度:0.7725194692611694:168108294.15:82:1 +当期第四季度营业收入:当期第四季度营业收入:合计合计营业收入:0.7603604793548584:1529440280.25:200:3 +当期第四季度营业收入:当期第四季度营业收入:合计合计营业收入:0.7603604793548584:1908540816.12:160:1 +当期第四季度营业收入:本期第四季度营业收入:合计合计营业收入:0.7972708344459534:1529440280.25:200:3 +当期第四季度营业收入:本期第四季度营业收入:合计合计营业收入:0.7972708344459534:1908540816.12:160:1 +当期第四季度营业收入:本报告期第四季度营业收入:其他合计营业收入:0.7203537821769714:199722062.45:200:3 +当期第四季度营业收入:本报告期第四季度营业收入:其他合计营业收入:0.7200483679771423:130449651.32:160:1 +当期第四季度营业收入:报告期第四季度营业收入:合计合计营业收入:0.7143528461456299:1529440280.25:200:3 +当期第四季度营业收入:报告期第四季度营业收入:合计合计营业收入:0.7143528461456299:1908540816.12:160:1 +当期第四季度营业收入:报告期内第四季度营业收入:其他合计营业收入:0.724917471408844:199722062.45:200:3 +当期第四季度营业收入:报告期内第四季度营业收入:其他合计营业收入:0.7246915698051453:130449651.32:160:1 +当期第四季度营业收入:本年度第四季度营业收入:合计合计营业收入:0.8142565488815308:1529440280.25:200:3 +当期第四季度营业收入:本年度第四季度营业收入:合计合计营业收入:0.8142565488815308:1908540816.12:160:1 +当期第四季度营业收入:本期发生额第四季度营业收入:合计本期发生额收入:0.7373542189598083:1529440280.25:200:2 +当期第四季度营业收入:本期发生额第四季度营业收入:主营业务本期发生额收入:0.7337989211082458:1375217915.12:200:2 +当期第四季度营业收入:2023年第四季度营业收入:一、营业收入2023年度:0.8597952723503113:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入:一、营业收入2022年度:0.8199125528335571:1316036204.14:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入:一、营业收入2023年度:0.8296882510185242:1529440280.25:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入:二、营业利润2023年度:0.7868268489837646:168108294.15:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入:一、营业收入2023年度:0.825751781463623:1529440280.25:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入:二、营业利润2023年度:0.7912517786026001:168108294.15:82:1 +当期第四季度营业收入:第四季度营业收入:合计合计营业收入:0.7910569906234741:1529440280.25:200:3 +当期第四季度营业收入:第四季度营业收入:合计合计营业收入:0.7910569906234741:1908540816.12:160:1 +当期第四季度营业收入:10-12月营业收入:合计合计营业收入:0.8215368986129761:1529440280.25:200:3 +当期第四季度营业收入:10-12月营业收入:合计合计营业收入:0.8215368986129761:1908540816.12:160:1 +当期第四季度营业收入:第四季度(10-12月)营业收入:合计合计营业收入:0.7315033674240112:1529440280.25:200:3 +当期第四季度营业收入:第四季度(10-12月)营业收入:合计合计营业收入:0.7315033674240112:1908540816.12:160:1 +当期第四季度营业收入:2023年第四季度营业收入:一、营业收入2023年度:0.8597952723503113:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入:一、营业收入2022年度:0.8199125528335571:1316036204.14:82:1 +当期第四季度营业收入:当期第四季度营业收入合计:合计合计营业收入:0.7503138780593872:1529440280.25:200:3 +当期第四季度营业收入:当期第四季度营业收入合计:合计合计营业收入:0.7503138780593872:1908540816.12:160:1 +当期第四季度营业收入:本期第四季度营业收入合计:合计合计营业收入:0.7854681015014648:1529440280.25:200:3 +当期第四季度营业收入:本期第四季度营业收入合计:合计合计营业收入:0.7854681015014648:1908540816.12:160:1 +当期第四季度营业收入:本报告期第四季度营业收入合计:合计合计营业收入:0.7257453203201294:1529440280.25:200:3 +当期第四季度营业收入:本报告期第四季度营业收入合计:合计合计营业收入:0.7257453203201294:1908540816.12:160:1 +当期第四季度营业收入:报告期第四季度营业收入合计:合计合计营业收入:0.7250546216964722:1529440280.25:200:3 +当期第四季度营业收入:报告期第四季度营业收入合计:合计合计营业收入:0.7250546216964722:1908540816.12:160:1 +当期第四季度营业收入:报告期内第四季度营业收入合计:合计合计营业收入:0.7136080861091614:1529440280.25:200:3 +当期第四季度营业收入:报告期内第四季度营业收入合计:合计合计营业收入:0.7136080861091614:1908540816.12:160:1 +当期第四季度营业收入:本年度第四季度营业收入合计:合计合计营业收入:0.8028281927108765:1529440280.25:200:3 +当期第四季度营业收入:本年度第四季度营业收入合计:合计合计营业收入:0.8028281927108765:1908540816.12:160:1 +当期第四季度营业收入:本期发生额第四季度营业收入合计:合计本期发生额收入:0.7409648299217224:1529440280.25:200:2 +当期第四季度营业收入:本期发生额第四季度营业收入合计:合计上期发生额收入:0.7384856939315796:1316036204.14:200:2 +当期第四季度营业收入:2023年第四季度营业收入合计:一、营业收入2023年度:0.84425288438797:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入合计:一、营业收入2022年度:0.8034347891807556:1316036204.14:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入合计:一、营业收入2023年度:0.8218407034873962:1529440280.25:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入合计:二、营业利润2023年度:0.7795587778091431:168108294.15:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入合计:一、营业收入2023年度:0.8096730709075928:1529440280.25:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入合计:二、营业利润2023年度:0.7782320380210876:168108294.15:82:1 +当期第四季度营业收入:第四季度营业收入合计:合计合计营业收入:0.7957438230514526:1529440280.25:200:3 +当期第四季度营业收入:第四季度营业收入合计:合计合计营业收入:0.7957438230514526:1908540816.12:160:1 +当期第四季度营业收入:10-12月营业收入合计:合计合计营业收入:0.8334983587265015:1529440280.25:200:3 +当期第四季度营业收入:10-12月营业收入合计:合计合计营业收入:0.8334983587265015:1908540816.12:160:1 +当期第四季度营业收入:第四季度(10-12月)营业收入合计:合计合计营业收入:0.7381260395050049:1529440280.25:200:3 +当期第四季度营业收入:第四季度(10-12月)营业收入合计:合计合计营业收入:0.7381260395050049:1908540816.12:160:1 +当期第四季度营业收入:2023年第四季度营业收入合计:一、营业收入2023年度:0.84425288438797:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入合计:一、营业收入2022年度:0.8034347891807556:1316036204.14:82:1 +当期第四季度营业收入:当期第四季度营业收入总额:合计合计营业收入:0.741837203502655:1529440280.25:200:3 +当期第四季度营业收入:当期第四季度营业收入总额:合计合计营业收入:0.741837203502655:1908540816.12:160:1 +当期第四季度营业收入:本期第四季度营业收入总额:合计合计营业收入:0.7835760116577148:1529440280.25:200:3 +当期第四季度营业收入:本期第四季度营业收入总额:合计合计营业收入:0.7835760116577148:1908540816.12:160:1 +当期第四季度营业收入:本报告期第四季度营业收入总额:合计合计营业收入:0.7252967357635498:1529440280.25:200:3 +当期第四季度营业收入:本报告期第四季度营业收入总额:合计合计营业收入:0.7252967357635498:1908540816.12:160:1 +当期第四季度营业收入:报告期第四季度营业收入总额:合计合计营业收入:0.7185975313186646:1529440280.25:200:3 +当期第四季度营业收入:报告期第四季度营业收入总额:合计合计营业收入:0.7185975313186646:1908540816.12:160:1 +当期第四季度营业收入:报告期内第四季度营业收入总额:合计合计营业收入:0.7248662710189819:1529440280.25:200:3 +当期第四季度营业收入:报告期内第四季度营业收入总额:合计合计营业收入:0.7248662710189819:1908540816.12:160:1 +当期第四季度营业收入:本年度第四季度营业收入总额:合计合计营业收入:0.7930546402931213:1529440280.25:200:3 +当期第四季度营业收入:本年度第四季度营业收入总额:合计合计营业收入:0.7930546402931213:1908540816.12:160:1 +当期第四季度营业收入:本期发生额第四季度营业收入总额:合计上期发生额收入:0.7289645671844482:1316036204.14:200:2 +当期第四季度营业收入:本期发生额第四季度营业收入总额:合计本期发生额收入:0.7224181294441223:1529440280.25:200:2 +当期第四季度营业收入:2023年第四季度营业收入总额:一、营业收入2023年度:0.8300965428352356:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入总额:三、利润总额2023年度:0.7919918298721313:167670367.08:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入总额:一、营业收入2023年度:0.8002972602844238:1529440280.25:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入总额:三、利润总额2023年度:0.7805718779563904:167670367.08:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入总额:一、营业收入2023年度:0.795529305934906:1529440280.25:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入总额:三、利润总额2023年度:0.7797204852104187:167670367.08:82:1 +当期第四季度营业收入:第四季度营业收入总额:合计合计营业收入:0.7699557542800903:1529440280.25:200:3 +当期第四季度营业收入:第四季度营业收入总额:合计合计营业收入:0.7699557542800903:1908540816.12:160:1 +当期第四季度营业收入:10-12月营业收入总额:合计合计营业收入:0.8208649158477783:1529440280.25:200:3 +当期第四季度营业收入:10-12月营业收入总额:合计合计营业收入:0.8208649158477783:1908540816.12:160:1 +当期第四季度营业收入:第四季度(10-12月)营业收入总额:合计合计营业收入:0.7240397930145264:1529440280.25:200:3 +当期第四季度营业收入:第四季度(10-12月)营业收入总额:合计合计营业收入:0.7240397930145264:1908540816.12:160:1 +当期第四季度营业收入:2023年第四季度营业收入总额:一、营业收入2023年度:0.8300965428352356:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入总额:三、利润总额2023年度:0.7919918298721313:167670367.08:82:1 +当期第四季度营业收入:当期第四季度营业收入金额:合计合计营业收入:0.7504016757011414:1529440280.25:200:3 +当期第四季度营业收入:当期第四季度营业收入金额:合计合计营业收入:0.7504016757011414:1908540816.12:160:1 +当期第四季度营业收入:本期第四季度营业收入金额:合计合计营业收入:0.7863020896911621:1529440280.25:200:3 +当期第四季度营业收入:本期第四季度营业收入金额:合计合计营业收入:0.7863020896911621:1908540816.12:160:1 +当期第四季度营业收入:本报告期第四季度营业收入金额:合计合计营业收入:0.7201334834098816:1529440280.25:200:3 +当期第四季度营业收入:本报告期第四季度营业收入金额:合计合计营业收入:0.7201334834098816:1908540816.12:160:1 +当期第四季度营业收入:报告期第四季度营业收入金额:合计合计营业收入:0.7123322486877441:1529440280.25:200:3 +当期第四季度营业收入:报告期第四季度营业收入金额:合计合计营业收入:0.7123322486877441:1908540816.12:160:1 +当期第四季度营业收入:报告期内第四季度营业收入金额:合计合计营业收入:0.7159790396690369:1529440280.25:200:3 +当期第四季度营业收入:报告期内第四季度营业收入金额:合计合计营业收入:0.7159790396690369:1908540816.12:160:1 +当期第四季度营业收入:本年度第四季度营业收入金额:合计合计营业收入:0.7975038886070251:1529440280.25:200:3 +当期第四季度营业收入:本年度第四季度营业收入金额:合计合计营业收入:0.7975038886070251:1908540816.12:160:1 +当期第四季度营业收入:本期发生额第四季度营业收入金额:合计本期发生额收入:0.751495897769928:1529440280.25:200:2 +当期第四季度营业收入:本期发生额第四季度营业收入金额:合计上期发生额收入:0.7463408708572388:1316036204.14:200:2 +当期第四季度营业收入:2023年第四季度营业收入金额:一、营业收入2023年度:0.8537982702255249:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入金额:一、营业收入2022年度:0.8174853324890137:1316036204.14:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入金额:一、营业收入2023年度:0.8260546922683716:1529440280.25:82:1 +当期第四季度营业收入:2023年全年第四季度营业收入金额:一、营业收入2022年度:0.7866559624671936:1316036204.14:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入金额:一、营业收入2023年度:0.8113242387771606:1529440280.25:82:1 +当期第四季度营业收入:2023年金额第四季度营业收入金额:二、营业利润2023年度:0.778986930847168:168108294.15:82:1 +当期第四季度营业收入:第四季度营业收入金额:合计合计营业收入:0.7804969549179077:1529440280.25:200:3 +当期第四季度营业收入:第四季度营业收入金额:合计合计营业收入:0.7804969549179077:1908540816.12:160:1 +当期第四季度营业收入:10-12月营业收入金额:合计合计营业收入:0.8265209794044495:1529440280.25:200:3 +当期第四季度营业收入:10-12月营业收入金额:合计合计营业收入:0.8265209794044495:1908540816.12:160:1 +当期第四季度营业收入:第四季度(10-12月)营业收入金额:合计合计营业收入:0.7268815040588379:1529440280.25:200:3 +当期第四季度营业收入:第四季度(10-12月)营业收入金额:合计合计营业收入:0.7268815040588379:1908540816.12:160:1 +当期第四季度营业收入:2023年第四季度营业收入金额:一、营业收入2023年度:0.8537982702255249:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度营业收入金额:一、营业收入2022年度:0.8174853324890137:1316036204.14:82:1 +当期第四季度营业收入:当期第四季度调整后营业收入:主营业务本期发生额收入:0.6726846098899841:1375217915.12:200:2 +当期第四季度营业收入:当期第四季度调整后营业收入:主营业务上期发生额收入:0.6724674105644226:1197550470.11:200:2 +当期第四季度营业收入:本期第四季度调整后营业收入:主营业务本期发生额收入:0.7064892649650574:1375217915.12:200:2 +当期第四季度营业收入:本期第四季度调整后营业收入:主营业务上期发生额收入:0.6737675070762634:1197550470.11:200:2 +当期第四季度营业收入:本报告期第四季度调整后营业收入:主营业务本期发生额收入:0.6824942231178284:1375217915.12:200:2 +当期第四季度营业收入:本报告期第四季度调整后营业收入:其他合计营业收入:0.6499877572059631:199722062.45:200:3 +当期第四季度营业收入:报告期第四季度调整后营业收入:主营业务本期发生额收入:0.6565211415290833:1375217915.12:200:2 +当期第四季度营业收入:报告期第四季度调整后营业收入:主营业务上期发生额收入:0.6483442783355713:1197550470.11:200:2 +当期第四季度营业收入:报告期内第四季度调整后营业收入:主营业务本期发生额收入:0.6822859644889832:1375217915.12:200:2 +当期第四季度营业收入:报告期内第四季度调整后营业收入:主营业务上期发生额收入:0.6469816565513611:1197550470.11:200:2 +当期第四季度营业收入:本年度第四季度调整后营业收入:主营业务本期发生额收入:0.7385895848274231:1375217915.12:200:2 +当期第四季度营业收入:本年度第四季度调整后营业收入:其他合计营业收入:0.7271462082862854:199722062.45:200:3 +当期第四季度营业收入:本期发生额第四季度调整后营业收入:主营业务本期发生额收入:0.7025066018104553:1375217915.12:200:2 +当期第四季度营业收入:本期发生额第四季度调整后营业收入:主营业务上期发生额收入:0.687468409538269:1197550470.11:200:2 +当期第四季度营业收入:2023年第四季度调整后营业收入:一、营业收入2023年度:0.7873923778533936:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度调整后营业收入:二、营业利润2023年度:0.7684570550918579:168108294.15:82:1 +当期第四季度营业收入:2023年全年第四季度调整后营业收入:一、营业收入2023年度:0.7854971885681152:1529440280.25:82:1 +当期第四季度营业收入:2023年全年第四季度调整后营业收入:二、营业利润2023年度:0.7677143812179565:168108294.15:82:1 +当期第四季度营业收入:2023年金额第四季度调整后营业收入:一、营业收入2023年度:0.7653443217277527:1529440280.25:82:1 +当期第四季度营业收入:2023年金额第四季度调整后营业收入:二、营业利润2023年度:0.7518373131752014:168108294.15:82:1 +当期第四季度营业收入:第四季度调整后营业收入:主营业务本期发生额收入:0.6608868837356567:1375217915.12:200:2 +当期第四季度营业收入:第四季度调整后营业收入:其他合计营业收入:0.6530666947364807:199722062.45:200:3 +当期第四季度营业收入:10-12月调整后营业收入:合计合计营业收入:0.7260074019432068:1529440280.25:200:3 +当期第四季度营业收入:10-12月调整后营业收入:合计合计营业收入:0.7260074019432068:1908540816.12:160:1 +当期第四季度营业收入:第四季度(10-12月)调整后营业收入:主营业务上期发生额收入:0.6270554065704346:1197550470.11:200:2 +当期第四季度营业收入:第四季度(10-12月)调整后营业收入:主营业务本期发生额收入:0.624918520450592:1375217915.12:200:2 +当期第四季度营业收入:2023年第四季度调整后营业收入:一、营业收入2023年度:0.7873923778533936:1529440280.25:82:1 +当期第四季度营业收入:2023年第四季度调整后营业收入:二、营业利润2023年度:0.7684570550918579:168108294.15:82:1 +营业收入同比变动:营业收入同比变动:其他合计营业收入:0.7964301109313965:199722062.45:200:3 +营业收入同比变动:营业收入同比变动:其他合计营业收入:0.7959229946136475:130449651.32:160:1 +营业收入同比变动:营业收入同比增减:主营业务本期发生额收入:0.7442557215690613:1375217915.12:200:2 +营业收入同比变动:营业收入同比增减:其他合计营业收入:0.7367358803749084:199722062.45:200:3 +营业收入同比变动:营业收入同比上升:合计合计营业收入:0.7325971126556396:1529440280.25:200:3 +营业收入同比变动:营业收入同比上升:合计合计营业收入:0.7325971126556396:1908540816.12:160:1 +营业收入同比变动:营业收入同比下降:其他合计营业收入:0.727997362613678:199722062.45:200:3 +营业收入同比变动:营业收入同比下降:其他合计营业收入:0.7272600531578064:130449651.32:160:1 +营业收入同比变动:营业收入变化幅度:其他合计营业收入:0.7663354277610779:199722062.45:200:3 +营业收入同比变动:营业收入变化幅度:其他合计营业收入:0.7656325101852417:130449651.32:160:1 +营业收入同比变动:营业收入变动比例:其他合计营业收入:0.7564198970794678:199722062.45:200:3 +营业收入同比变动:营业收入变动比例:其他合计营业收入:0.7556273937225342:130449651.32:160:1 +营业收入同比变动:营业收入本期比上年同期增减:主营业务本期发生额收入:0.7713901996612549:1375217915.12:200:2 +营业收入同比变动:营业收入本期比上年同期增减:主营业务上期发生额收入:0.7349048852920532:1197550470.11:200:2 +营业收入同比变动:营业收入本年比上年增减:主营业务本期发生额收入:0.7583015561103821:1375217915.12:200:2 +营业收入同比变动:营业收入本年比上年增减:主营业务上期发生额收入:0.7375572919845581:1197550470.11:200:2 +营业收入同比变动:营业收入合计同比变动:合计合计营业收入:0.8081464767456055:1529440280.25:200:3 +营业收入同比变动:营业收入合计同比变动:合计合计营业收入:0.8081464767456055:1908540816.12:160:1 +营业收入同比变动:营业收入合计同比增减:合计合计营业收入:0.7611291408538818:1529440280.25:200:3 +营业收入同比变动:营业收入合计同比增减:合计合计营业收入:0.7611291408538818:1908540816.12:160:1 +营业收入同比变动:营业收入合计同比上升:合计合计营业收入:0.7756347060203552:1529440280.25:200:3 +营业收入同比变动:营业收入合计同比上升:合计合计营业收入:0.7756347060203552:1908540816.12:160:1 +营业收入同比变动:营业收入合计同比下降:其他合计营业收入:0.741646945476532:199722062.45:200:3 +营业收入同比变动:营业收入合计同比下降:合计合计营业收入:0.7410433292388916:1908540816.12:160:1 +营业收入同比变动:营业收入合计变化幅度:合计合计营业收入:0.7935448884963989:1529440280.25:200:3 +营业收入同比变动:营业收入合计变化幅度:合计合计营业收入:0.7935448884963989:1908540816.12:160:1 +营业收入同比变动:营业收入合计变动比例:合计合计营业收入:0.7641727328300476:1529440280.25:200:3 +营业收入同比变动:营业收入合计变动比例:合计合计营业收入:0.7641727328300476:1908540816.12:160:1 +营业收入同比变动:营业收入合计本期比上年同期增减:主营业务本期发生额收入:0.7555931806564331:1375217915.12:200:2 +营业收入同比变动:营业收入合计本期比上年同期增减:合计上期发生额收入:0.7304872870445251:1316036204.14:200:2 +营业收入同比变动:营业收入合计本年比上年增减:主营业务本期发生额收入:0.7561755776405334:1375217915.12:200:2 +营业收入同比变动:营业收入合计本年比上年增减:其他合计营业收入:0.74008709192276:199722062.45:200:3 +营业收入同比变动:营业收入总额同比变动:合计合计营业收入:0.7866408228874207:1529440280.25:200:3 +营业收入同比变动:营业收入总额同比变动:合计合计营业收入:0.7866408228874207:1908540816.12:160:1 +营业收入同比变动:营业收入总额同比增减:主营业务本期发生额收入:0.7469238638877869:1375217915.12:200:2 +营业收入同比变动:营业收入总额同比增减:合计合计营业收入:0.7435719966888428:1908540816.12:160:1 +营业收入同比变动:营业收入总额同比上升:合计合计营业收入:0.7519562840461731:1529440280.25:200:3 +营业收入同比变动:营业收入总额同比上升:合计合计营业收入:0.7519562840461731:1908540816.12:160:1 +营业收入同比变动:营业收入总额同比下降:合计合计营业收入:0.7205502986907959:1529440280.25:200:3 +营业收入同比变动:营业收入总额同比下降:合计合计营业收入:0.7205502986907959:1908540816.12:160:1 +营业收入同比变动:营业收入总额变化幅度:合计合计营业收入:0.7583358287811279:1529440280.25:200:3 +营业收入同比变动:营业收入总额变化幅度:合计合计营业收入:0.7583358287811279:1908540816.12:160:1 +营业收入同比变动:营业收入总额变动比例:利润总额本期发生额:0.7305872440338135:180147657.60:165:1 +营业收入同比变动:营业收入总额变动比例:合计合计营业收入:0.7294603586196899:1529440280.25:200:3 +营业收入同比变动:营业收入总额本期比上年同期增减:主营业务本期发生额收入:0.7695547342300415:1375217915.12:200:2 +营业收入同比变动:营业收入总额本期比上年同期增减:主营业务上期发生额收入:0.730354368686676:1197550470.11:200:2 +营业收入同比变动:营业收入总额本年比上年增减:主营业务本期发生额收入:0.7630562782287598:1375217915.12:200:2 +营业收入同比变动:营业收入总额本年比上年增减:主营业务上期发生额收入:0.7329850196838379:1197550470.11:200:2 +营业收入同比变动:营业收入金额同比变动:其他合计营业收入:0.7794734239578247:199722062.45:200:3 +营业收入同比变动:营业收入金额同比变动:其他合计营业收入:0.7788528800010681:130449651.32:160:1 +营业收入同比变动:营业收入金额同比增减:主营业务本期发生额收入:0.7543478012084961:1375217915.12:200:2 +营业收入同比变动:营业收入金额同比增减:主营业务上期发生额收入:0.7453909516334534:1197550470.11:200:2 +营业收入同比变动:营业收入金额同比上升:主营业务上期发生额收入:0.7364201545715332:1197550470.11:200:2 +营业收入同比变动:营业收入金额同比上升:合计合计营业收入:0.7230720520019531:1908540816.12:160:1 +营业收入同比变动:营业收入金额同比下降:其他合计营业收入:0.7163727879524231:199722062.45:200:3 +营业收入同比变动:营业收入金额同比下降:其他合计营业收入:0.715494692325592:130449651.32:160:1 +营业收入同比变动:营业收入金额变化幅度:其他合计营业收入:0.7605170011520386:199722062.45:200:3 +营业收入同比变动:营业收入金额变化幅度:其他合计营业收入:0.7597715854644775:130449651.32:160:1 +营业收入同比变动:营业收入金额变动比例:其他合计营业收入:0.7345818877220154:199722062.45:200:3 +营业收入同比变动:营业收入金额变动比例:其他合计营业收入:0.7337643504142761:130449651.32:160:1 +营业收入同比变动:营业收入金额本期比上年同期增减:主营业务本期发生额收入:0.7647278308868408:1375217915.12:200:2 +营业收入同比变动:营业收入金额本期比上年同期增减:合计上期发生额收入:0.7222485542297363:1316036204.14:200:2 +营业收入同比变动:营业收入金额本年比上年增减:主营业务本期发生额收入:0.7637135982513428:1375217915.12:200:2 +营业收入同比变动:营业收入金额本年比上年增减:主营业务上期发生额收入:0.7325354814529419:1197550470.11:200:2 +营业收入同比变动:调整后营业收入同比变动:主营业务本期发生额收入:0.6880272626876831:1375217915.12:200:2 +营业收入同比变动:调整后营业收入同比变动:其他合计营业收入:0.6830971837043762:199722062.45:200:3 +营业收入同比变动:调整后营业收入同比增减:主营业务本期发生额收入:0.6582975387573242:1375217915.12:200:2 +营业收入同比变动:调整后营业收入同比增减:主营业务上期发生额收入:0.6478844881057739:1197550470.11:200:2 +营业收入同比变动:调整后营业收入同比上升:主营业务上期发生额收入:0.6459109783172607:1197550470.11:200:2 +营业收入同比变动:调整后营业收入同比上升:主营业务本期发生额收入:0.6372413039207458:1375217915.12:200:2 +营业收入同比变动:调整后营业收入同比下降:主营业务本期发生额收入:0.635448157787323:1375217915.12:200:2 +营业收入同比变动:调整后营业收入同比下降:其他合计营业收入:0.6316241025924683:199722062.45:200:3 +营业收入同比变动:调整后营业收入变化幅度:其他合计营业收入:0.682273805141449:199722062.45:200:3 +营业收入同比变动:调整后营业收入变化幅度:其他合计营业收入:0.6815574765205383:130449651.32:160:1 +营业收入同比变动:调整后营业收入变动比例:利润总额本期发生额:0.6578234434127808:180147657.60:165:1 +营业收入同比变动:调整后营业收入变动比例:其他合计营业收入:0.6540434956550598:199722062.45:200:3 +营业收入同比变动:调整后营业收入本期比上年同期增减:主营业务本期发生额收入:0.6927846074104309:1375217915.12:200:2 +营业收入同比变动:调整后营业收入本期比上年同期增减:主营业务上期发生额收入:0.659822404384613:1197550470.11:200:2 +营业收入同比变动:调整后营业收入本年比上年增减:主营业务本期发生额收入:0.6867462992668152:1375217915.12:200:2 +营业收入同比变动:调整后营业收入本年比上年增减:主营业务上期发生额收入:0.6611533164978027:1197550470.11:200:2 +当期归母净利润:当期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.8028674721717834:0.60:202:3 +当期归母净利润:当期归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.785799503326416:15.47:202:3 +当期归母净利润:本期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.8064982891082764:0.60:202:3 +当期归母净利润:本期归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.802304208278656:129475371.52:159:1 +当期归母净利润:本报告期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7749238014221191:0.60:202:3 +当期归母净利润:本报告期归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7704647183418274:129475371.52:159:1 +当期归母净利润:报告期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7713543772697449:0.60:202:3 +当期归母净利润:报告期归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7594220638275146:129475371.52:159:1 +当期归母净利润:报告期内归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7350048422813416:0.60:202:3 +当期归母净利润:报告期内归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7205787301063538:129475371.52:159:1 +当期归母净利润:本年度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7849406003952026:0.60:202:3 +当期归母净利润:本年度归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.7508789896965027:15.47:202:3 +当期归母净利润:本期发生额归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7408241033554077:0.60:202:3 +当期归母净利润:本期发生额归属于上市公司股东的净利润:利润总额本期发生额:0.7298848628997803:180147657.60:165:1 +当期归母净利润:2023年归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7957285642623901:5585927.73:202:2 +当期归母净利润:2023年归属于上市公司股东的净利润:持续经营净利润2023年度:0.7938098907470703:153819180.44:82:1 +当期归母净利润:2023年全年归属于上市公司股东的净利润:持续经营净利润2023年度:0.8055073618888855:153819180.44:82:1 +当期归母净利润:2023年全年归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7838633060455322:5585927.73:202:2 +当期归母净利润:2023年金额归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7900206446647644:5585927.73:202:2 +当期归母净利润:2023年金额归属于上市公司股东的净利润:持续经营净利润2023年度:0.7754835486412048:153819180.44:82:1 +当期归母净利润:当期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8290497660636902:129475371.52:159:1 +当期归母净利润:当期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8180009126663208:161483822.70:159:1 +当期归母净利润:本期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8935956954956055:129475371.52:159:1 +当期归母净利润:本期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8917974829673767:161483822.70:159:1 +当期归母净利润:本报告期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8475449681282043:129475371.52:159:1 +当期归母净利润:本报告期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8385649919509888:161483822.70:159:1 +当期归母净利润:报告期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8342593908309937:129475371.52:159:1 +当期归母净利润:报告期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8186957240104675:161483822.70:159:1 +当期归母净利润:报告期内归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8065775036811829:129475371.52:159:1 +当期归母净利润:报告期内归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8009099960327148:161483822.70:159:1 +当期归母净利润:本年度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8437925577163696:161483822.70:159:1 +当期归母净利润:本年度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8415836095809937:129475371.52:159:1 +当期归母净利润:本期发生额归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8222904205322266:129475371.52:159:1 +当期归母净利润:本期发生额归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.811489462852478:161483822.70:159:1 +当期归母净利润:2023年归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.834814190864563:5585927.73:202:2 +当期归母净利润:2023年归属于母公司所有者的净利润:持续经营净利润2023年度:0.7693860530853271:153819180.44:82:1 +当期归母净利润:2023年全年归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8276131749153137:5585927.73:202:2 +当期归母净利润:2023年全年归属于母公司所有者的净利润:持续经营净利润2023年度:0.8085770010948181:153819180.44:82:1 +当期归母净利润:2023年金额归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8432153463363647:5585927.73:202:2 +当期归母净利润:2023年金额归属于母公司所有者的净利润:持续经营净利润2023年度:0.7801703214645386:153819180.44:82:1 +当期归母净利润:当期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.8107418417930603:129475371.52:159:1 +当期归母净利润:当期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7943345904350281:161483822.70:159:1 +当期归母净利润:本期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.8577258586883545:129475371.52:159:1 +当期归母净利润:本期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.8516240119934082:161483822.70:159:1 +当期归母净利润:本报告期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.8147250413894653:129475371.52:159:1 +当期归母净利润:本报告期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.8033404350280762:161483822.70:159:1 +当期归母净利润:报告期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.8070048093795776:129475371.52:159:1 +当期归母净利润:报告期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.788409948348999:161483822.70:159:1 +当期归母净利润:报告期内归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7778647541999817:129475371.52:159:1 +当期归母净利润:报告期内归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7700713872909546:161483822.70:159:1 +当期归母净利润:本年度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.8051185011863708:129475371.52:159:1 +当期归母净利润:本年度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.8046579360961914:161483822.70:159:1 +当期归母净利润:本期发生额归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7906359434127808:129475371.52:159:1 +当期归母净利润:本期发生额归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7764902114868164:161483822.70:159:1 +当期归母净利润:2023年归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.833087682723999:5585927.73:202:2 +当期归母净利润:2023年归属于母公司股东的净利润:持续经营净利润2023年度:0.7738577723503113:153819180.44:82:1 +当期归母净利润:2023年全年归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8208580017089844:5585927.73:202:2 +当期归母净利润:2023年全年归属于母公司股东的净利润:持续经营净利润2023年度:0.8044244647026062:153819180.44:82:1 +当期归母净利润:2023年金额归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8311514854431152:5585927.73:202:2 +当期归母净利润:2023年金额归属于母公司股东的净利润:持续经营净利润2023年度:0.7732164263725281:153819180.44:82:1 +上年同期归母净利润:上年同期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7249244451522827:0.60:202:3 +上年同期归母净利润:上年同期归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7163729071617126:129475371.52:159:1 +上年同期归母净利润:上期归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7886401414871216:129475371.52:159:1 +上年同期归母净利润:上期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7564921379089355:0.60:202:3 +上年同期归母净利润:上年度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7570856809616089:0.60:202:3 +上年同期归母净利润:上年度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7459165453910828:129475371.52:159:1 +上年同期归母净利润:2022年归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8441194891929626:5585927.73:202:2 +上年同期归母净利润:2022年归属于上市公司股东的净利润:持续经营净利润2022年度:0.7847490310668945:132340330.02:82:1 +上年同期归母净利润:2022年全年归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8334119319915771:5585927.73:202:2 +上年同期归母净利润:2022年全年归属于上市公司股东的净利润:持续经营净利润2022年度:0.8003338575363159:132340330.02:82:1 +上年同期归母净利润:2022年金额归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8363657593727112:5585927.73:202:2 +上年同期归母净利润:2022年金额归属于上市公司股东的净利润:持续经营净利润2022年度:0.7643235325813293:132340330.02:82:1 +上年同期归母净利润:上年同期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8037625551223755:129475371.52:159:1 +上年同期归母净利润:上年同期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7750084400177002:161483822.70:159:1 +上年同期归母净利润:上期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.868194580078125:129475371.52:159:1 +上年同期归母净利润:上期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.8264331221580505:161483822.70:159:1 +上年同期归母净利润:上年度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.8369626998901367:129475371.52:159:1 +上年同期归母净利润:上年度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.814411997795105:161483822.70:159:1 +上年同期归母净利润:2022年归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8771682977676392:5585927.73:202:2 +上年同期归母净利润:2022年归属于母公司所有者的净利润:持续经营净利润2022年度:0.7637945413589478:132340330.02:82:1 +上年同期归母净利润:2022年全年归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8709458112716675:5585927.73:202:2 +上年同期归母净利润:2022年全年归属于母公司所有者的净利润:持续经营净利润2022年度:0.8039829730987549:132340330.02:82:1 +上年同期归母净利润:2022年金额归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8834580183029175:5585927.73:202:2 +上年同期归母净利润:2022年金额归属于母公司所有者的净利润:持续经营净利润2022年度:0.7696642279624939:132340330.02:82:1 +上年同期归母净利润:上年同期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7724498510360718:129475371.52:159:1 +上年同期归母净利润:上年同期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7405427098274231:161483822.70:159:1 +上年同期归母净利润:上期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.8462290167808533:129475371.52:159:1 +上年同期归母净利润:上期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7987242937088013:161483822.70:159:1 +上年同期归母净利润:上年度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.803996205329895:129475371.52:159:1 +上年同期归母净利润:上年度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7781832218170166:161483822.70:159:1 +上年同期归母净利润:2022年归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8777350187301636:5585927.73:202:2 +上年同期归母净利润:2022年归属于母公司股东的净利润:持续经营净利润2022年度:0.7635823488235474:132340330.02:82:1 +上年同期归母净利润:2022年全年归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8667734265327454:5585927.73:202:2 +上年同期归母净利润:2022年全年归属于母公司股东的净利润:持续经营净利润2022年度:0.7977515459060669:132340330.02:82:1 +上年同期归母净利润:2022年金额归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8715700507164001:5585927.73:202:2 +上年同期归母净利润:2022年金额归属于母公司股东的净利润:持续经营净利润2022年度:0.7589723467826843:132340330.02:82:1 +前年同期归母净利润:前年同期归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7100985050201416:0.60:202:3 +前年同期归母净利润:前年同期归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.696662962436676:15.47:202:3 +前年同期归母净利润:2021年归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.770248293876648:0.60:202:3 +前年同期归母净利润:2021年归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.7561279535293579:15.47:202:3 +前年同期归母净利润:2021年全年归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7370827794075012:0.60:202:3 +前年同期归母净利润:2021年全年归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7356768250465393:5585927.73:202:2 +前年同期归母净利润:2021年金额归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7368848919868469:5585927.73:202:2 +前年同期归母净利润:2021年金额归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6992290019989014:15.47:202:3 +前年同期归母净利润:前年同期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7666953802108765:129475371.52:159:1 +前年同期归母净利润:前年同期归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7450094819068909:161483822.70:159:1 +前年同期归母净利润:2021年归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7787916660308838:5585927.73:202:2 +前年同期归母净利润:2021年归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7558644413948059:129475371.52:159:1 +前年同期归母净利润:2021年全年归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.779625654220581:5585927.73:202:2 +前年同期归母净利润:2021年全年归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7409384846687317:129475371.52:159:1 +前年同期归母净利润:2021年金额归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7891783714294434:5585927.73:202:2 +前年同期归母净利润:2021年金额归属于母公司所有者的净利润:利润分配2022年度所有者权益合计:0.7018505930900574:-63250000.00:90:1 +前年同期归母净利润:前年同期归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7314403653144836:129475371.52:159:1 +前年同期归母净利润:前年同期归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7090657353401184:0.60:202:3 +前年同期归母净利润:2021年归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7812971472740173:5585927.73:202:2 +前年同期归母净利润:2021年归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7440325021743774:0.60:202:3 +前年同期归母净利润:2021年全年归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7726505994796753:5585927.73:202:2 +前年同期归母净利润:2021年全年归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7151908874511719:0.60:202:3 +前年同期归母净利润:2021年金额归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7759644985198975:5585927.73:202:2 +前年同期归母净利润:2021年金额归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6903880834579468:0.60:202:3 +当期第一季度归母净利润:当期第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7187562584877014:0.60:202:3 +当期第一季度归母净利润:当期第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6968415975570679:129475371.52:159:1 +当期第一季度归母净利润:本期第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.716156542301178:0.60:202:3 +当期第一季度归母净利润:本期第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7059796452522278:129475371.52:159:1 +当期第一季度归母净利润:本报告期第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6866360306739807:0.60:202:3 +当期第一季度归母净利润:本报告期第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6839459538459778:129475371.52:159:1 +当期第一季度归母净利润:报告期第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6691415905952454:0.60:202:3 +当期第一季度归母净利润:报告期第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6600385308265686:129475371.52:159:1 +当期第一季度归母净利润:报告期内第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6604865789413452:0.60:202:3 +当期第一季度归母净利润:报告期内第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6533492207527161:129475371.52:159:1 +当期第一季度归母净利润:本年度第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7148755788803101:0.60:202:3 +当期第一季度归母净利润:本年度第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.67888343334198:129475371.52:159:1 +当期第一季度归母净利润:本期发生额第一季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6717690825462341:129475371.52:159:1 +当期第一季度归母净利润:本期发生额第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6701218485832214:0.60:202:3 +当期第一季度归母净利润:2023年第一季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7816153168678284:153819180.44:82:1 +当期第一季度归母净利润:2023年第一季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.753075122833252:5585927.73:202:2 +当期第一季度归母净利润:2023年全年第一季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7828239798545837:153819180.44:82:1 +当期第一季度归母净利润:2023年全年第一季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.74666428565979:5585927.73:202:2 +当期第一季度归母净利润:2023年金额第一季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7562834024429321:5585927.73:202:2 +当期第一季度归母净利润:2023年金额第一季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7547509074211121:153819180.44:82:1 +当期第一季度归母净利润:第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7239022254943848:0.60:202:3 +当期第一季度归母净利润:第一季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6959034204483032:15.47:202:3 +当期第一季度归母净利润:1-3月归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7045990228652954:0.60:202:3 +当期第一季度归母净利润:1-3月归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6879079937934875:15.47:202:3 +当期第一季度归母净利润:第一季度(1-3月)归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6878000497817993:0.60:202:3 +当期第一季度归母净利润:第一季度(1-3月)归属于上市公司股东的净利润:持续经营净利润2023年度:0.6704537272453308:153819180.44:82:1 +当期第一季度归母净利润:2023年第一季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7816153168678284:153819180.44:82:1 +当期第一季度归母净利润:2023年第一季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.753075122833252:5585927.73:202:2 +当期第一季度归母净利润:当期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7737770080566406:129475371.52:159:1 +当期第一季度归母净利润:当期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7513977289199829:161483822.70:159:1 +当期第一季度归母净利润:本期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7875482439994812:129475371.52:159:1 +当期第一季度归母净利润:本期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7731223702430725:161483822.70:159:1 +当期第一季度归母净利润:本报告期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7515453696250916:129475371.52:159:1 +当期第一季度归母净利润:本报告期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7349542379379272:161483822.70:159:1 +当期第一季度归母净利润:报告期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7239340543746948:129475371.52:159:1 +当期第一季度归母净利润:报告期第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.701576292514801:161483822.70:159:1 +当期第一季度归母净利润:报告期内第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7159051299095154:129475371.52:159:1 +当期第一季度归母净利润:报告期内第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7016980648040771:161483822.70:159:1 +当期第一季度归母净利润:本年度第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7577534914016724:129475371.52:159:1 +当期第一季度归母净利润:本年度第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7482946515083313:161483822.70:159:1 +当期第一季度归母净利润:本期发生额第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7502695322036743:129475371.52:159:1 +当期第一季度归母净利润:本期发生额第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7277587652206421:161483822.70:159:1 +当期第一季度归母净利润:2023年第一季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7915817499160767:5585927.73:202:2 +当期第一季度归母净利润:2023年第一季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7769023776054382:153819180.44:82:1 +当期第一季度归母净利润:2023年全年第一季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7875904440879822:153819180.44:82:1 +当期第一季度归母净利润:2023年全年第一季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7873051166534424:5585927.73:202:2 +当期第一季度归母净利润:2023年金额第一季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8021488189697266:5585927.73:202:2 +当期第一季度归母净利润:2023年金额第一季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.765546977519989:153819180.44:82:1 +当期第一季度归母净利润:第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.74302738904953:129475371.52:159:1 +当期第一季度归母净利润:第一季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7282759547233582:161483822.70:159:1 +当期第一季度归母净利润:1-3月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7545367479324341:129475371.52:159:1 +当期第一季度归母净利润:1-3月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7413634061813354:161483822.70:159:1 +当期第一季度归母净利润:第一季度(1-3月)归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.6948752403259277:129475371.52:159:1 +当期第一季度归母净利润:第一季度(1-3月)归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.6754453778266907:161483822.70:159:1 +当期第一季度归母净利润:2023年第一季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7915817499160767:5585927.73:202:2 +当期第一季度归母净利润:2023年第一季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7769023776054382:153819180.44:82:1 +当期第一季度归母净利润:当期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7447994351387024:129475371.52:159:1 +当期第一季度归母净利润:当期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7207556962966919:161483822.70:159:1 +当期第一季度归母净利润:本期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7502148747444153:129475371.52:159:1 +当期第一季度归母净利润:本期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7341763973236084:161483822.70:159:1 +当期第一季度归母净利润:本报告期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7200952172279358:129475371.52:159:1 +当期第一季度归母净利润:本报告期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7022727131843567:161483822.70:159:1 +当期第一季度归母净利润:报告期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6993361115455627:129475371.52:159:1 +当期第一季度归母净利润:报告期第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6761243343353271:161483822.70:159:1 +当期第一季度归母净利润:报告期内第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6915109753608704:129475371.52:159:1 +当期第一季度归母净利润:报告期内第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6760281920433044:161483822.70:159:1 +当期第一季度归母净利润:本年度第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7205243706703186:129475371.52:159:1 +当期第一季度归母净利润:本年度第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7093966603279114:161483822.70:159:1 +当期第一季度归母净利润:本期发生额第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7232764363288879:129475371.52:159:1 +当期第一季度归母净利润:本期发生额第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6996036171913147:161483822.70:159:1 +当期第一季度归母净利润:2023年第一季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7855675220489502:5585927.73:202:2 +当期第一季度归母净利润:2023年第一季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7723284363746643:153819180.44:82:1 +当期第一季度归母净利润:2023年全年第一季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7809089422225952:5585927.73:202:2 +当期第一季度归母净利润:2023年全年第一季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7782613635063171:153819180.44:82:1 +当期第一季度归母净利润:2023年金额第一季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7917386293411255:5585927.73:202:2 +当期第一季度归母净利润:2023年金额第一季度归属于母公司股东的净利润:持续经营净利润2023年度:0.753246009349823:153819180.44:82:1 +当期第一季度归母净利润:第一季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7126432061195374:129475371.52:159:1 +当期第一季度归母净利润:第一季度归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7052251696586609:0.60:202:3 +当期第一季度归母净利润:1-3月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7331128716468811:129475371.52:159:1 +当期第一季度归母净利润:1-3月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7156203389167786:161483822.70:159:1 +当期第一季度归母净利润:第一季度(1-3月)归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6792692542076111:0.60:202:3 +当期第一季度归母净利润:第一季度(1-3月)归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6724595427513123:129475371.52:159:1 +当期第一季度归母净利润:2023年第一季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7855675220489502:5585927.73:202:2 +当期第一季度归母净利润:2023年第一季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7723284363746643:153819180.44:82:1 +当期第二季度归母净利润:当期第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7086758613586426:5585927.73:202:2 +当期第二季度归母净利润:当期第二季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6911107301712036:0.60:202:3 +当期第二季度归母净利润:本期第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7079583406448364:5585927.73:202:2 +当期第二季度归母净利润:本期第二季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6958333253860474:0.60:202:3 +当期第二季度归母净利润:本报告期第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7039374709129333:5585927.73:202:2 +当期第二季度归母净利润:本报告期第二季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6735385656356812:0.60:202:3 +当期第二季度归母净利润:报告期第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7110356688499451:5585927.73:202:2 +当期第二季度归母净利润:报告期第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.6786938309669495:132340330.02:82:1 +当期第二季度归母净利润:报告期内第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6864894032478333:5585927.73:202:2 +当期第二季度归母净利润:报告期内第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.6630820035934448:132340330.02:82:1 +当期第二季度归母净利润:本年度第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7230498790740967:5585927.73:202:2 +当期第二季度归母净利润:本年度第二季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7102383375167847:0.60:202:3 +当期第二季度归母净利润:本期发生额第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7008306384086609:5585927.73:202:2 +当期第二季度归母净利润:本期发生额第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.6661792397499084:132340330.02:82:1 +当期第二季度归母净利润:2023年第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8029505014419556:5585927.73:202:2 +当期第二季度归母净利润:2023年第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.7647544741630554:132340330.02:82:1 +当期第二季度归母净利润:2023年全年第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7966136336326599:5585927.73:202:2 +当期第二季度归母净利润:2023年全年第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.7725580930709839:132340330.02:82:1 +当期第二季度归母净利润:2023年金额第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7972257137298584:5585927.73:202:2 +当期第二季度归母净利润:2023年金额第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.74419766664505:132340330.02:82:1 +当期第二季度归母净利润:第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7103371620178223:5585927.73:202:2 +当期第二季度归母净利润:第二季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7033981084823608:0.60:202:3 +当期第二季度归母净利润:4-6月归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7338278889656067:0.60:202:3 +当期第二季度归母净利润:4-6月归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6973808407783508:15.47:202:3 +当期第二季度归母净利润:第二季度(4-6月)归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.668260931968689:5585927.73:202:2 +当期第二季度归母净利润:第二季度(4-6月)归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6679310202598572:0.60:202:3 +当期第二季度归母净利润:2023年第二季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8029505014419556:5585927.73:202:2 +当期第二季度归母净利润:2023年第二季度归属于上市公司股东的净利润:持续经营净利润2022年度:0.7647544741630554:132340330.02:82:1 +当期第二季度归母净利润:当期第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7470957636833191:5585927.73:202:2 +当期第二季度归母净利润:当期第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7443849444389343:129475371.52:159:1 +当期第二季度归母净利润:本期第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7576596736907959:129475371.52:159:1 +当期第二季度归母净利润:本期第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7475774884223938:161483822.70:159:1 +当期第二季度归母净利润:本报告期第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7293089628219604:129475371.52:159:1 +当期第二季度归母净利润:本报告期第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7282747626304626:5585927.73:202:2 +当期第二季度归母净利润:报告期第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7366414070129395:5585927.73:202:2 +当期第二季度归母净利润:报告期第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7101609110832214:129475371.52:159:1 +当期第二季度归母净利润:报告期内第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7137160897254944:5585927.73:202:2 +当期第二季度归母净利润:报告期内第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7000223994255066:129475371.52:159:1 +当期第二季度归母净利润:本年度第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7607619166374207:5585927.73:202:2 +当期第二季度归母净利润:本年度第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7468956112861633:129475371.52:159:1 +当期第二季度归母净利润:本期发生额第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7409271001815796:5585927.73:202:2 +当期第二季度归母净利润:本期发生额第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7168562412261963:129475371.52:159:1 +当期第二季度归母净利润:2023年第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8401396870613098:5585927.73:202:2 +当期第二季度归母净利润:2023年第二季度归属于母公司所有者的净利润:持续经营净利润2022年度:0.7657784223556519:132340330.02:82:1 +当期第二季度归母净利润:2023年全年第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8319931626319885:5585927.73:202:2 +当期第二季度归母净利润:2023年全年第二季度归属于母公司所有者的净利润:持续经营净利润2022年度:0.7785845994949341:132340330.02:82:1 +当期第二季度归母净利润:2023年金额第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8391985297203064:5585927.73:202:2 +当期第二季度归母净利润:2023年金额第二季度归属于母公司所有者的净利润:持续经营净利润2022年度:0.7553006410598755:132340330.02:82:1 +当期第二季度归母净利润:第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7419966459274292:5585927.73:202:2 +当期第二季度归母净利润:第二季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7262850403785706:129475371.52:159:1 +当期第二季度归母净利润:4-6月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7645702958106995:129475371.52:159:1 +当期第二季度归母净利润:4-6月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7570635080337524:161483822.70:159:1 +当期第二季度归母净利润:第二季度(4-6月)归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7038043737411499:5585927.73:202:2 +当期第二季度归母净利润:第二季度(4-6月)归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.6938727498054504:129475371.52:159:1 +当期第二季度归母净利润:2023年第二季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8401396870613098:5585927.73:202:2 +当期第二季度归母净利润:2023年第二季度归属于母公司所有者的净利润:持续经营净利润2022年度:0.7657784223556519:132340330.02:82:1 +当期第二季度归母净利润:当期第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7378498315811157:5585927.73:202:2 +当期第二季度归母净利润:当期第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7118373513221741:129475371.52:159:1 +当期第二季度归母净利润:本期第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7366816997528076:5585927.73:202:2 +当期第二季度归母净利润:本期第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7184471487998962:129475371.52:159:1 +当期第二季度归母净利润:本报告期第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7246233820915222:5585927.73:202:2 +当期第二季度归母净利润:本报告期第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6958752274513245:129475371.52:159:1 +当期第二季度归母净利润:报告期第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.732404887676239:5585927.73:202:2 +当期第二季度归母净利润:报告期第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6823998093605042:129475371.52:159:1 +当期第二季度归母净利润:报告期内第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7128849029541016:5585927.73:202:2 +当期第二季度归母净利润:报告期内第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6720611453056335:129475371.52:159:1 +当期第二季度归母净利润:本年度第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7501725554466248:5585927.73:202:2 +当期第二季度归母净利润:本年度第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7070726752281189:129475371.52:159:1 +当期第二季度归母净利润:本期发生额第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7329778671264648:5585927.73:202:2 +当期第二季度归母净利润:本期发生额第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6878337264060974:129475371.52:159:1 +当期第二季度归母净利润:2023年第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8307589292526245:5585927.73:202:2 +当期第二季度归母净利润:2023年第二季度归属于母公司股东的净利润:持续经营净利润2022年度:0.7570165991783142:132340330.02:82:1 +当期第二季度归母净利润:2023年全年第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.823672354221344:5585927.73:202:2 +当期第二季度归母净利润:2023年全年第二季度归属于母公司股东的净利润:持续经营净利润2022年度:0.7667562961578369:132340330.02:82:1 +当期第二季度归母净利润:2023年金额第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8272571563720703:5585927.73:202:2 +当期第二季度归母净利润:2023年金额第二季度归属于母公司股东的净利润:持续经营净利润2022年度:0.7429331541061401:132340330.02:82:1 +当期第二季度归母净利润:第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7353835701942444:5585927.73:202:2 +当期第二季度归母净利润:第二季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6915437579154968:129475371.52:159:1 +当期第二季度归母净利润:4-6月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7426586747169495:129475371.52:159:1 +当期第二季度归母净利润:4-6月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7305812239646912:161483822.70:159:1 +当期第二季度归母净利润:第二季度(4-6月)归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6982223987579346:5585927.73:202:2 +当期第二季度归母净利润:第二季度(4-6月)归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6687219738960266:129475371.52:159:1 +当期第二季度归母净利润:2023年第二季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8307589292526245:5585927.73:202:2 +当期第二季度归母净利润:2023年第二季度归属于母公司股东的净利润:持续经营净利润2022年度:0.7570165991783142:132340330.02:82:1 +当期第三季度归母净利润:当期第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6926841139793396:153819180.44:82:1 +当期第三季度归母净利润:当期第三季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6912212371826172:0.60:202:3 +当期第三季度归母净利润:本期第三季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6836984157562256:0.60:202:3 +当期第三季度归母净利润:本期第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6803387999534607:153819180.44:82:1 +当期第三季度归母净利润:本报告期第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.679696261882782:153819180.44:82:1 +当期第三季度归母净利润:本报告期第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.6701368093490601:153819180.44:82:1 +当期第三季度归母净利润:报告期第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6882501244544983:153819180.44:82:1 +当期第三季度归母净利润:报告期第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.6631377935409546:153819180.44:82:1 +当期第三季度归母净利润:报告期内第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.6831995248794556:153819180.44:82:1 +当期第三季度归母净利润:报告期内第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6811846494674683:153819180.44:82:1 +当期第三季度归母净利润:本年度第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6978244185447693:153819180.44:82:1 +当期第三季度归母净利润:本年度第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.6965727210044861:153819180.44:82:1 +当期第三季度归母净利润:本期发生额第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6797056794166565:153819180.44:82:1 +当期第三季度归母净利润:本期发生额第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.6436919569969177:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7893810868263245:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.7543668150901794:153819180.44:82:1 +当期第三季度归母净利润:2023年全年第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7969455718994141:153819180.44:82:1 +当期第三季度归母净利润:2023年全年第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.7533584833145142:153819180.44:82:1 +当期第三季度归母净利润:2023年金额第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7747374773025513:153819180.44:82:1 +当期第三季度归母净利润:2023年金额第三季度归属于上市公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7537038922309875:5585927.73:202:2 +当期第三季度归母净利润:第三季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7038630247116089:0.60:202:3 +当期第三季度归母净利润:第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.6927933692932129:153819180.44:82:1 +当期第三季度归母净利润:7-9月归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.68834388256073:0.60:202:3 +当期第三季度归母净利润:7-9月归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6585885882377625:15.47:202:3 +当期第三季度归母净利润:第三季度(7-9月)归属于上市公司股东的净利润:持续经营净利润2023年度:0.6820962429046631:153819180.44:82:1 +当期第三季度归母净利润:第三季度(7-9月)归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6667340993881226:0.60:202:3 +当期第三季度归母净利润:2023年第三季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7893810868263245:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于上市公司股东的净利润:四、净利润2023年度:0.7543668150901794:153819180.44:82:1 +当期第三季度归母净利润:当期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7409422993659973:129475371.52:159:1 +当期第三季度归母净利润:当期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7177186608314514:161483822.70:159:1 +当期第三季度归母净利润:本期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7520835399627686:129475371.52:159:1 +当期第三季度归母净利润:本期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.736441433429718:161483822.70:159:1 +当期第三季度归母净利润:本报告期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7152828574180603:129475371.52:159:1 +当期第三季度归母净利润:本报告期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.6982182860374451:161483822.70:159:1 +当期第三季度归母净利润:报告期第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7028361558914185:129475371.52:159:1 +当期第三季度归母净利润:报告期第三季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.6864389181137085:153819180.44:82:1 +当期第三季度归母净利润:报告期内第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.6982385516166687:129475371.52:159:1 +当期第三季度归母净利润:报告期内第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.6831712126731873:161483822.70:159:1 +当期第三季度归母净利润:本年度第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7333389520645142:129475371.52:159:1 +当期第三季度归母净利润:本年度第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7231953740119934:161483822.70:159:1 +当期第三季度归母净利润:本期发生额第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7144978046417236:129475371.52:159:1 +当期第三季度归母净利润:本期发生额第三季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.6915976405143738:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7845614552497864:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7793440818786621:5585927.73:202:2 +当期第三季度归母净利润:2023年全年第三季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7993225455284119:153819180.44:82:1 +当期第三季度归母净利润:2023年全年第三季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7751630544662476:5585927.73:202:2 +当期第三季度归母净利润:2023年金额第三季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7955163717269897:5585927.73:202:2 +当期第三季度归母净利润:2023年金额第三季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.782647967338562:153819180.44:82:1 +当期第三季度归母净利润:第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7219532132148743:129475371.52:159:1 +当期第三季度归母净利润:第三季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7071595788002014:161483822.70:159:1 +当期第三季度归母净利润:7-9月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7075353264808655:129475371.52:159:1 +当期第三季度归母净利润:7-9月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.702448308467865:161483822.70:159:1 +当期第三季度归母净利润:第三季度(7-9月)归属于母公司所有者的净利润:持续经营净利润2023年度:0.6845756769180298:153819180.44:82:1 +当期第三季度归母净利润:第三季度(7-9月)归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.6832063794136047:129475371.52:159:1 +当期第三季度归母净利润:2023年第三季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7845614552497864:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7793440818786621:5585927.73:202:2 +当期第三季度归母净利润:当期第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.713043212890625:129475371.52:159:1 +当期第三季度归母净利润:当期第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6878709197044373:161483822.70:159:1 +当期第三季度归母净利润:本期第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7181746363639832:129475371.52:159:1 +当期第三季度归母净利润:本期第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7008261680603027:161483822.70:159:1 +当期第三季度归母净利润:本报告期第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6849614977836609:129475371.52:159:1 +当期第三季度归母净利润:本报告期第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.670137882232666:153819180.44:82:1 +当期第三季度归母净利润:报告期第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.6795235276222229:153819180.44:82:1 +当期第三季度归母净利润:报告期第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6773868203163147:129475371.52:159:1 +当期第三季度归母净利润:报告期内第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.6720688939094543:153819180.44:82:1 +当期第三季度归母净利润:报告期内第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6714288592338562:129475371.52:159:1 +当期第三季度归母净利润:本年度第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.696815013885498:129475371.52:159:1 +当期第三季度归母净利润:本年度第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.6871383190155029:153819180.44:82:1 +当期第三季度归母净利润:本期发生额第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6880837678909302:129475371.52:159:1 +当期第三季度归母净利润:本期发生额第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.6786707043647766:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7782911658287048:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7714003324508667:5585927.73:202:2 +当期第三季度归母净利润:2023年全年第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7894948720932007:153819180.44:82:1 +当期第三季度归母净利润:2023年全年第三季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7662340998649597:5585927.73:202:2 +当期第三季度归母净利润:2023年金额第三季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7842385172843933:5585927.73:202:2 +当期第三季度归母净利润:2023年金额第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7714957594871521:153819180.44:82:1 +当期第三季度归母净利润:第三季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6912115216255188:129475371.52:159:1 +当期第三季度归母净利润:第三季度归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6801078915596008:0.60:202:3 +当期第三季度归母净利润:7-9月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.681071937084198:129475371.52:159:1 +当期第三季度归母净利润:7-9月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6713521480560303:161483822.70:159:1 +当期第三季度归母净利润:第三季度(7-9月)归属于母公司股东的净利润:持续经营净利润2023年度:0.6752702593803406:153819180.44:82:1 +当期第三季度归母净利润:第三季度(7-9月)归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6556637287139893:129475371.52:159:1 +当期第三季度归母净利润:2023年第三季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7782911658287048:153819180.44:82:1 +当期第三季度归母净利润:2023年第三季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7714003324508667:5585927.73:202:2 +当期第四季度归母净利润:当期第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6910527944564819:0.60:202:3 +当期第四季度归母净利润:当期第四季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6794469952583313:129475371.52:159:1 +当期第四季度归母净利润:本期第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6960679888725281:0.60:202:3 +当期第四季度归母净利润:本期第四季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6899072527885437:129475371.52:159:1 +当期第四季度归母净利润:本报告期第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6702765226364136:0.60:202:3 +当期第四季度归母净利润:本报告期第四季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6696900129318237:129475371.52:159:1 +当期第四季度归母净利润:报告期第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6642804741859436:0.60:202:3 +当期第四季度归母净利润:报告期第四季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6580012440681458:129475371.52:159:1 +当期第四季度归母净利润:报告期内第四季度归属于上市公司股东的净利润:四、净利润2023年度:0.6671268343925476:153819180.44:82:1 +当期第四季度归母净利润:报告期内第四季度归属于上市公司股东的净利润:四、净利润2022年度:0.6616407632827759:132340330.02:82:1 +当期第四季度归母净利润:本年度第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7036772966384888:0.60:202:3 +当期第四季度归母净利润:本年度第四季度归属于上市公司股东的净利润:四、净利润2023年度:0.6917981505393982:153819180.44:82:1 +当期第四季度归母净利润:本期发生额第四季度归属于上市公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6525300741195679:129475371.52:159:1 +当期第四季度归母净利润:本期发生额第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6493793725967407:0.60:202:3 +当期第四季度归母净利润:2023年第四季度归属于上市公司股东的净利润:四、净利润2023年度:0.787380039691925:153819180.44:82:1 +当期第四季度归母净利润:2023年第四季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7833274602890015:153819180.44:82:1 +当期第四季度归母净利润:2023年全年第四季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7927423715591431:153819180.44:82:1 +当期第四季度归母净利润:2023年全年第四季度归属于上市公司股东的净利润:四、净利润2023年度:0.7887088656425476:153819180.44:82:1 +当期第四季度归母净利润:2023年金额第四季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7734578251838684:153819180.44:82:1 +当期第四季度归母净利润:2023年金额第四季度归属于上市公司股东的净利润:四、净利润2023年度:0.7664165496826172:153819180.44:82:1 +当期第四季度归母净利润:第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7132358551025391:0.60:202:3 +当期第四季度归母净利润:第四季度归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6849732995033264:15.47:202:3 +当期第四季度归母净利润:10-12月归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7161235809326172:0.60:202:3 +当期第四季度归母净利润:10-12月归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.7067767977714539:15.47:202:3 +当期第四季度归母净利润:第四季度(10-12月)归属于上市公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.680266261100769:0.60:202:3 +当期第四季度归母净利润:第四季度(10-12月)归属于上市公司股东的净利润:归属于公司普通股股东的净利润加权平均净资产收益率:0.6575480699539185:15.47:202:3 +当期第四季度归母净利润:2023年第四季度归属于上市公司股东的净利润:四、净利润2023年度:0.787380039691925:153819180.44:82:1 +当期第四季度归母净利润:2023年第四季度归属于上市公司股东的净利润:持续经营净利润2023年度:0.7833274602890015:153819180.44:82:1 +当期第四季度归母净利润:当期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.745606005191803:129475371.52:159:1 +当期第四季度归母净利润:当期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.727260172367096:161483822.70:159:1 +当期第四季度归母净利润:本期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7558269500732422:129475371.52:159:1 +当期第四季度归母净利润:本期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7453409433364868:161483822.70:159:1 +当期第四季度归母净利润:本报告期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7233520150184631:129475371.52:159:1 +当期第四季度归母净利润:本报告期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7114351391792297:161483822.70:159:1 +当期第四季度归母净利润:报告期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7121344804763794:129475371.52:159:1 +当期第四季度归母净利润:报告期第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.6955616474151611:161483822.70:159:1 +当期第四季度归母净利润:报告期内第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7053281664848328:129475371.52:159:1 +当期第四季度归母净利润:报告期内第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.6952465176582336:161483822.70:159:1 +当期第四季度归母净利润:本年度第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7427846789360046:129475371.52:159:1 +当期第四季度归母净利润:本年度第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7363105416297913:161483822.70:159:1 +当期第四季度归母净利润:本期发生额第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7190817594528198:129475371.52:159:1 +当期第四季度归母净利润:本期发生额第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7008680105209351:161483822.70:159:1 +当期第四季度归母净利润:2023年第四季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7749979496002197:5585927.73:202:2 +当期第四季度归母净利润:2023年第四季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7716075778007507:153819180.44:82:1 +当期第四季度归母净利润:2023年全年第四季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7888966202735901:153819180.44:82:1 +当期第四季度归母净利润:2023年全年第四季度归属于母公司所有者的净利润:四、净利润2023年度:0.7756247520446777:153819180.44:82:1 +当期第四季度归母净利润:2023年金额第四季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7895681858062744:5585927.73:202:2 +当期第四季度归母净利润:2023年金额第四季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7771846652030945:153819180.44:82:1 +当期第四季度归母净利润:第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.7345982193946838:129475371.52:159:1 +当期第四季度归母净利润:第四季度归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7246183753013611:161483822.70:159:1 +当期第四季度归母净利润:10-12月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.72686368227005:129475371.52:159:1 +当期第四季度归母净利润:10-12月归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.7188295722007751:161483822.70:159:1 +当期第四季度归母净利润:第四季度(10-12月)归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润上期:0.6951080560684204:129475371.52:159:1 +当期第四季度归母净利润:第四季度(10-12月)归属于母公司所有者的净利润:加:本期归属于母公司所有者的净利润本期:0.6793581247329712:161483822.70:159:1 +当期第四季度归母净利润:2023年第四季度归属于母公司所有者的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7749979496002197:5585927.73:202:2 +当期第四季度归母净利润:2023年第四季度归属于母公司所有者的净利润:持续经营净利润2023年度:0.7716075778007507:153819180.44:82:1 +当期第四季度归母净利润:当期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7205035090446472:129475371.52:159:1 +当期第四季度归母净利润:当期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7004092335700989:161483822.70:159:1 +当期第四季度归母净利润:本期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7255468964576721:129475371.52:159:1 +当期第四季度归母净利润:本期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7133107781410217:161483822.70:159:1 +当期第四季度归母净利润:本报告期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6979462504386902:129475371.52:159:1 +当期第四季度归母净利润:本报告期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6846320033073425:161483822.70:159:1 +当期第四季度归母净利润:报告期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6900572180747986:129475371.52:159:1 +当期第四季度归母净利润:报告期第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6721572279930115:161483822.70:159:1 +当期第四季度归母净利润:报告期内第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6827349662780762:129475371.52:159:1 +当期第四季度归母净利润:报告期内第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6710553765296936:161483822.70:159:1 +当期第四季度归母净利润:本年度第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7098951935768127:129475371.52:159:1 +当期第四季度归母净利润:本年度第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.7015925645828247:161483822.70:159:1 +当期第四季度归母净利润:本期发生额第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6970845460891724:129475371.52:159:1 +当期第四季度归母净利润:本期发生额第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.6775472164154053:161483822.70:159:1 +当期第四季度归母净利润:2023年第四季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7698075771331787:5585927.73:202:2 +当期第四季度归母净利润:2023年第四季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7691933512687683:153819180.44:82:1 +当期第四季度归母净利润:2023年全年第四季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7824531197547913:153819180.44:82:1 +当期第四季度归母净利润:2023年全年第四季度归属于母公司股东的净利润:四、净利润2023年度:0.7680412530899048:153819180.44:82:1 +当期第四季度归母净利润:2023年金额第四季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7808513045310974:5585927.73:202:2 +当期第四季度归母净利润:2023年金额第四季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7680474519729614:153819180.44:82:1 +当期第四季度归母净利润:第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.7088702321052551:129475371.52:159:1 +当期第四季度归母净利润:第四季度归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润本期:0.697106659412384:161483822.70:159:1 +当期第四季度归母净利润:10-12月归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6920111775398254:129475371.52:159:1 +当期第四季度归母净利润:10-12月归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.690847635269165:0.60:202:3 +当期第四季度归母净利润:第四季度(10-12月)归属于母公司股东的净利润:加:本期归属于母公司所有者的净利润上期:0.6691854596138:129475371.52:159:1 +当期第四季度归母净利润:第四季度(10-12月)归属于母公司股东的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.667631208896637:0.60:202:3 +当期第四季度归母净利润:2023年第四季度归属于母公司股东的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7698075771331787:5585927.73:202:2 +当期第四季度归母净利润:2023年第四季度归属于母公司股东的净利润:持续经营净利润2023年度:0.7691933512687683:153819180.44:82:1 +归母净利润同比变动:归属于上市公司股东的净利润同比变动:归属于公司普通股股东的净利润每股收益基本每股收益:0.8128572106361389:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比变动:归属于公司普通股股东的净利润加权平均净资产收益率:0.7952916622161865:15.47:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比增减:归属于公司普通股股东的净利润每股收益基本每股收益:0.7923576831817627:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比增减:归属于公司普通股股东的净利润加权平均净资产收益率:0.781089723110199:15.47:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比上升:归属于公司普通股股东的净利润每股收益基本每股收益:0.7905913591384888:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比上升:归属于公司普通股股东的净利润加权平均净资产收益率:0.7887871861457825:15.47:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比下降:归属于公司普通股股东的净利润每股收益基本每股收益:0.7994415163993835:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润同比下降:归属于公司普通股股东的净利润加权平均净资产收益率:0.7787846326828003:15.47:202:3 +归母净利润同比变动:归属于上市公司股东的净利润变化幅度:归属于公司普通股股东的净利润每股收益基本每股收益:0.7935919165611267:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润变化幅度:归属于公司普通股股东的净利润加权平均净资产收益率:0.7919749617576599:15.47:202:3 +归母净利润同比变动:归属于上市公司股东的净利润变动比例:归属于公司普通股股东的净利润加权平均净资产收益率:0.7985426783561707:15.47:202:3 +归母净利润同比变动:归属于上市公司股东的净利润变动比例:归属于公司普通股股东的净利润每股收益基本每股收益:0.7850022315979004:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润上期:0.7956866025924683:129475371.52:159:1 +归母净利润同比变动:归属于上市公司股东的净利润本期比上年同期增减:归属于公司普通股股东的净利润每股收益基本每股收益:0.7880350351333618:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润本年比上年增减:归属于公司普通股股东的净利润每股收益基本每股收益:0.7922088503837585:0.60:202:3 +归母净利润同比变动:归属于上市公司股东的净利润本年比上年增减:归属于公司普通股股东的净利润加权平均净资产收益率:0.7753792405128479:15.47:202:3 +归母净利润同比变动:归属于母公司所有者的净利润同比变动:加:本期归属于母公司所有者的净利润上期:0.7952879071235657:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比变动:加:本期归属于母公司所有者的净利润本期:0.7875750660896301:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比增减:加:本期归属于母公司所有者的净利润上期:0.7835025787353516:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比增减:加:本期归属于母公司所有者的净利润本期:0.7750980257987976:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比上升:加:本期归属于母公司所有者的净利润上期:0.7802532315254211:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比上升:加:本期归属于母公司所有者的净利润本期:0.7709714770317078:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比下降:加:本期归属于母公司所有者的净利润上期:0.7454100847244263:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润同比下降:加:本期归属于母公司所有者的净利润本期:0.7367985248565674:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润变化幅度:加:本期归属于母公司所有者的净利润上期:0.784371018409729:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润变化幅度:加:本期归属于母公司所有者的净利润本期:0.7733875513076782:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润变动比例:加:本期归属于母公司所有者的净利润上期:0.7778427600860596:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润变动比例:加:本期归属于母公司所有者的净利润本期:0.7696747779846191:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润上期:0.8588618636131287:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润本期:0.8472709655761719:161483822.70:159:1 +归母净利润同比变动:归属于母公司所有者的净利润本年比上年增减:加:本期归属于母公司所有者的净利润上期:0.8193546533584595:129475371.52:159:1 +归母净利润同比变动:归属于母公司所有者的净利润本年比上年增减:加:本期归属于母公司所有者的净利润本期:0.812470555305481:161483822.70:159:1 +归母净利润同比变动:归属于母公司股东的净利润同比变动:归属于公司普通股股东的净利润每股收益基本每股收益:0.7871293425559998:0.60:202:3 +归母净利润同比变动:归属于母公司股东的净利润同比变动:加:本期归属于母公司所有者的净利润上期:0.7699754238128662:129475371.52:159:1 +归母净利润同比变动:归属于母公司股东的净利润同比增减:加:本期归属于母公司所有者的净利润上期:0.7636816501617432:129475371.52:159:1 +归母净利润同比变动:归属于母公司股东的净利润同比增减:归属于公司普通股股东的净利润每股收益基本每股收益:0.7625918984413147:0.60:202:3 +归母净利润同比变动:归属于母公司股东的净利润同比上升:加:本期归属于母公司所有者的净利润上期:0.7620748281478882:129475371.52:159:1 +归母净利润同比变动:归属于母公司股东的净利润同比上升:归属于公司普通股股东的净利润每股收益基本每股收益:0.7558120489120483:0.60:202:3 +归母净利润同比变动:归属于母公司股东的净利润同比下降:归属于公司普通股股东的净利润每股收益基本每股收益:0.7579268217086792:0.60:202:3 +归母净利润同比变动:归属于母公司股东的净利润同比下降:归属于公司普通股股东的净利润加权平均净资产收益率:0.7346307635307312:15.47:202:3 +归母净利润同比变动:归属于母公司股东的净利润变化幅度:归属于公司普通股股东的净利润每股收益基本每股收益:0.7762891054153442:0.60:202:3 +归母净利润同比变动:归属于母公司股东的净利润变化幅度:归属于公司普通股股东的净利润加权平均净资产收益率:0.7704852223396301:15.47:202:3 +归母净利润同比变动:归属于母公司股东的净利润变动比例:归属于公司普通股股东的净利润加权平均净资产收益率:0.7788648009300232:15.47:202:3 +归母净利润同比变动:归属于母公司股东的净利润变动比例:归属于公司普通股股东的净利润每股收益基本每股收益:0.7717896699905396:0.60:202:3 +归母净利润同比变动:归属于母公司股东的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润上期:0.8289036154747009:129475371.52:159:1 +归母净利润同比变动:归属于母公司股东的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润本期:0.8133425116539001:161483822.70:159:1 +归母净利润同比变动:归属于母公司股东的净利润本年比上年增减:加:本期归属于母公司所有者的净利润上期:0.7906356453895569:129475371.52:159:1 +归母净利润同比变动:归属于母公司股东的净利润本年比上年增减:加:本期归属于母公司所有者的净利润本期:0.7806462645530701:161483822.70:159:1 +当期扣非净利润:当期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8260324001312256:0.68:202:3 +当期扣非净利润:当期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8218532800674438:17.47:202:3 +当期扣非净利润:本期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8214054107666016:0.68:202:3 +当期扣非净利润:本期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8058961629867554:17.47:202:3 +当期扣非净利润:本报告期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8208826184272766:0.68:202:3 +当期扣非净利润:本报告期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.801645040512085:17.47:202:3 +当期扣非净利润:报告期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8050671815872192:0.68:202:3 +当期扣非净利润:报告期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7943629026412964:17.47:202:3 +当期扣非净利润:报告期内归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.788760781288147:0.68:202:3 +当期扣非净利润:报告期内归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7711490988731384:17.47:202:3 +当期扣非净利润:本年度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8230684995651245:0.68:202:3 +当期扣非净利润:本年度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8013383150100708:17.47:202:3 +当期扣非净利润:本期发生额归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.77236008644104:0.68:202:3 +当期扣非净利润:本期发生额归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7714359760284424:17.47:202:3 +当期扣非净利润:2023年归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8290841579437256:5585927.73:202:2 +当期扣非净利润:2023年归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7567102313041687:153819180.44:82:1 +当期扣非净利润:2023年全年归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.809709906578064:5585927.73:202:2 +当期扣非净利润:2023年全年归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7687634825706482:153819180.44:82:1 +当期扣非净利润:2023年金额归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.803936243057251:5585927.73:202:2 +当期扣非净利润:2023年金额归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7419195175170898:153819180.44:82:1 +当期扣非净利润:当期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.778207540512085:129475371.52:159:1 +当期扣非净利润:当期归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7714349031448364:5585927.73:202:2 +当期扣非净利润:本期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.8236414194107056:129475371.52:159:1 +当期扣非净利润:本期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润本期:0.8185257911682129:161483822.70:159:1 +当期扣非净利润:本报告期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7740985751152039:129475371.52:159:1 +当期扣非净利润:本报告期归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7649232745170593:5585927.73:202:2 +当期扣非净利润:报告期归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7847274541854858:5585927.73:202:2 +当期扣非净利润:报告期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7648850679397583:129475371.52:159:1 +当期扣非净利润:报告期内归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7634366154670715:5585927.73:202:2 +当期扣非净利润:报告期内归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7536602020263672:0.68:202:3 +当期扣非净利润:本年度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7952741384506226:5585927.73:202:2 +当期扣非净利润:本年度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7863665223121643:0.68:202:3 +当期扣非净利润:本期发生额归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.754381537437439:129475371.52:159:1 +当期扣非净利润:本期发生额归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7467377781867981:5585927.73:202:2 +当期扣非净利润:2023年归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8770966529846191:5585927.73:202:2 +当期扣非净利润:2023年归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.747880756855011:153819180.44:82:1 +当期扣非净利润:2023年全年归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8592305779457092:5585927.73:202:2 +当期扣非净利润:2023年全年归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7856741547584534:153819180.44:82:1 +当期扣非净利润:2023年金额归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8641873598098755:5585927.73:202:2 +当期扣非净利润:2023年金额归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7590561509132385:153819180.44:82:1 +当期扣非净利润:当期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7940608263015747:0.68:202:3 +当期扣非净利润:当期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7888748645782471:17.47:202:3 +当期扣非净利润:本期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7899999618530273:0.68:202:3 +当期扣非净利润:本期归属于母公司股东的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7864871621131897:129475371.52:159:1 +当期扣非净利润:本报告期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7955249547958374:0.68:202:3 +当期扣非净利润:本报告期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7764073610305786:17.47:202:3 +当期扣非净利润:报告期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7829486727714539:0.68:202:3 +当期扣非净利润:报告期归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7747037410736084:5585927.73:202:2 +当期扣非净利润:报告期内归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7759708166122437:0.68:202:3 +当期扣非净利润:报告期内归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7585774660110474:17.47:202:3 +当期扣非净利润:本年度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8041948080062866:0.68:202:3 +当期扣非净利润:本年度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7822554707527161:17.47:202:3 +当期扣非净利润:本期发生额归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7604752779006958:17.47:202:3 +当期扣非净利润:本期发生额归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7589712142944336:0.68:202:3 +当期扣非净利润:2023年归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.862610936164856:5585927.73:202:2 +当期扣非净利润:2023年归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7451398968696594:153819180.44:82:1 +当期扣非净利润:2023年全年归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8424838781356812:5585927.73:202:2 +当期扣非净利润:2023年全年归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7717002034187317:153819180.44:82:1 +当期扣非净利润:2023年金额归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8391104936599731:5585927.73:202:2 +当期扣非净利润:2023年金额归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.741020917892456:153819180.44:82:1 +上年同期扣非净利润:上年同期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7548560500144958:0.68:202:3 +上年同期扣非净利润:上年同期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7452707290649414:17.47:202:3 +上年同期扣非净利润:上期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7942405939102173:0.68:202:3 +上年同期扣非净利润:上期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7885165214538574:17.47:202:3 +上年同期扣非净利润:上年度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7981031537055969:0.68:202:3 +上年同期扣非净利润:上年度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7868907451629639:17.47:202:3 +上年同期扣非净利润:2022年归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.872164249420166:5585927.73:202:2 +上年同期扣非净利润:2022年归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7621406316757202:0.68:202:3 +上年同期扣非净利润:2022年全年归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8538346886634827:5585927.73:202:2 +上年同期扣非净利润:2022年全年归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7638880610466003:132340330.02:82:1 +上年同期扣非净利润:2022年金额归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8466895222663879:5585927.73:202:2 +上年同期扣非净利润:2022年金额归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.729620635509491:132340330.02:82:1 +上年同期扣非净利润:上年同期归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.741065263748169:5585927.73:202:2 +上年同期扣非净利润:上年同期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7352265119552612:129475371.52:159:1 +上年同期扣非净利润:上期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.8193849325180054:129475371.52:159:1 +上年同期扣非净利润:上期归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润本期:0.7746807932853699:161483822.70:159:1 +上年同期扣非净利润:上年度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.773900032043457:5585927.73:202:2 +上年同期扣非净利润:上年度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7657840251922607:0.68:202:3 +上年同期扣非净利润:2022年归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.910628080368042:5585927.73:202:2 +上年同期扣非净利润:2022年归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7426932454109192:132340330.02:82:1 +上年同期扣非净利润:2022年全年归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.897840142250061:5585927.73:202:2 +上年同期扣非净利润:2022年全年归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7821420431137085:132340330.02:82:1 +上年同期扣非净利润:2022年金额归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.899556040763855:5585927.73:202:2 +上年同期扣非净利润:2022年金额归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7486404180526733:132340330.02:82:1 +上年同期扣非净利润:上年同期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7373479604721069:0.68:202:3 +上年同期扣非净利润:上年同期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7291423678398132:17.47:202:3 +上年同期扣非净利润:上期归属于母公司股东的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7872282266616821:129475371.52:159:1 +上年同期扣非净利润:上期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7547740340232849:0.68:202:3 +上年同期扣非净利润:上年度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7793703675270081:0.68:202:3 +上年同期扣非净利润:上年度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7672699689865112:17.47:202:3 +上年同期扣非净利润:2022年归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.9012906551361084:5585927.73:202:2 +上年同期扣非净利润:2022年归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7357385754585266:132340330.02:82:1 +上年同期扣非净利润:2022年全年归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8855236768722534:5585927.73:202:2 +上年同期扣非净利润:2022年全年归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7669968605041504:132340330.02:82:1 +上年同期扣非净利润:2022年金额归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8773795366287231:5585927.73:202:2 +上年同期扣非净利润:2022年金额归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7259218692779541:132340330.02:82:1 +前年同期扣非净利润:前年同期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7573065161705017:0.68:202:3 +前年同期扣非净利润:前年同期归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7463235259056091:17.47:202:3 +前年同期扣非净利润:2021年归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7877549529075623:5585927.73:202:2 +前年同期扣非净利润:2021年归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7589492201805115:0.68:202:3 +前年同期扣非净利润:2021年全年归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7659774422645569:5585927.73:202:2 +前年同期扣非净利润:2021年全年归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7461708784103394:0.68:202:3 +前年同期扣非净利润:2021年金额归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7524067163467407:5585927.73:202:2 +前年同期扣非净利润:2021年金额归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7118262648582458:17.47:202:3 +前年同期扣非净利润:前年同期归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.733273983001709:0.68:202:3 +前年同期扣非净利润:前年同期归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7300455570220947:5585927.73:202:2 +前年同期扣非净利润:2021年归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8297970294952393:5585927.73:202:2 +前年同期扣非净利润:2021年归属于母公司所有者的扣除非经常性损益的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.7191462516784668:0.60:202:3 +前年同期扣非净利润:2021年全年归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.818113386631012:5585927.73:202:2 +前年同期扣非净利润:2021年全年归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7108972072601318:0.68:202:3 +前年同期扣非净利润:2021年金额归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8113875985145569:5585927.73:202:2 +前年同期扣非净利润:2021年金额归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6956484317779541:17.47:202:3 +前年同期扣非净利润:前年同期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7437196373939514:0.68:202:3 +前年同期扣非净利润:前年同期归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7336279153823853:17.47:202:3 +前年同期扣非净利润:2021年归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8224283456802368:5585927.73:202:2 +前年同期扣非净利润:2021年归属于母公司股东的扣除非经常性损益的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.729047417640686:0.60:202:3 +前年同期扣非净利润:2021年全年归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8030088543891907:5585927.73:202:2 +前年同期扣非净利润:2021年全年归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7223715782165527:0.68:202:3 +前年同期扣非净利润:2021年金额归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7889076471328735:5585927.73:202:2 +前年同期扣非净利润:2021年金额归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6948143243789673:17.47:202:3 +当期第一季度扣非净利润:当期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.767905056476593:0.68:202:3 +当期第一季度扣非净利润:当期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7549147605895996:17.47:202:3 +当期第一季度扣非净利润:本期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7416095733642578:0.68:202:3 +当期第一季度扣非净利润:本期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7218694686889648:17.47:202:3 +当期第一季度扣非净利润:本报告期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7334794402122498:0.68:202:3 +当期第一季度扣非净利润:本报告期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7100176811218262:17.47:202:3 +当期第一季度扣非净利润:报告期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7095497250556946:0.68:202:3 +当期第一季度扣非净利润:报告期第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6926803588867188:17.47:202:3 +当期第一季度扣非净利润:报告期内第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.713228702545166:0.68:202:3 +当期第一季度扣非净利润:报告期内第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6933720111846924:17.47:202:3 +当期第一季度扣非净利润:本年度第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7324343323707581:0.68:202:3 +当期第一季度扣非净利润:本年度第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7056698799133301:17.47:202:3 +当期第一季度扣非净利润:本期发生额第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7226996421813965:0.68:202:3 +当期第一季度扣非净利润:本期发生额第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7168682813644409:17.47:202:3 +当期第一季度扣非净利润:2023年第一季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7794428467750549:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.751716673374176:153819180.44:82:1 +当期第一季度扣非净利润:2023年全年第一季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7669144868850708:5585927.73:202:2 +当期第一季度扣非净利润:2023年全年第一季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.75190669298172:153819180.44:82:1 +当期第一季度扣非净利润:2023年金额第一季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7741759419441223:5585927.73:202:2 +当期第一季度扣非净利润:2023年金额第一季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.730492115020752:153819180.44:82:1 +当期第一季度扣非净利润:第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7544645667076111:0.68:202:3 +当期第一季度扣非净利润:第一季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7398481369018555:17.47:202:3 +当期第一季度扣非净利润:1-3月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7202138900756836:0.68:202:3 +当期第一季度扣非净利润:1-3月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7153781056404114:17.47:202:3 +当期第一季度扣非净利润:第一季度(1-3月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7132245302200317:0.68:202:3 +当期第一季度扣非净利润:第一季度(1-3月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7011710405349731:17.47:202:3 +当期第一季度扣非净利润:2023年第一季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7794428467750549:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.751716673374176:153819180.44:82:1 +当期第一季度扣非净利润:当期第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7409253716468811:0.68:202:3 +当期第一季度扣非净利润:当期第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7359491586685181:5585927.73:202:2 +当期第一季度扣非净利润:本期第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7252757549285889:5585927.73:202:2 +当期第一季度扣非净利润:本期第一季度归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7202525734901428:129475371.52:159:1 +当期第一季度扣非净利润:本报告期第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7075161933898926:0.68:202:3 +当期第一季度扣非净利润:本报告期第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7012758255004883:5585927.73:202:2 +当期第一季度扣非净利润:报告期第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7004905939102173:5585927.73:202:2 +当期第一季度扣非净利润:报告期第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6869458556175232:0.68:202:3 +当期第一季度扣非净利润:报告期内第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6961095929145813:5585927.73:202:2 +当期第一季度扣非净利润:报告期内第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6882385611534119:0.68:202:3 +当期第一季度扣非净利润:本年度第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7115415334701538:0.68:202:3 +当期第一季度扣非净利润:本年度第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7086257934570312:5585927.73:202:2 +当期第一季度扣非净利润:本期发生额第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7133246660232544:5585927.73:202:2 +当期第一季度扣非净利润:本期发生额第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7128772139549255:0.68:202:3 +当期第一季度扣非净利润:2023年第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8176008462905884:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7595938444137573:153819180.44:82:1 +当期第一季度扣非净利润:2023年全年第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8045014142990112:5585927.73:202:2 +当期第一季度扣非净利润:2023年全年第一季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7661638855934143:153819180.44:82:1 +当期第一季度扣非净利润:2023年金额第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8162972331047058:5585927.73:202:2 +当期第一季度扣非净利润:2023年金额第一季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7479175925254822:153819180.44:82:1 +当期第一季度扣非净利润:第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7403302192687988:5585927.73:202:2 +当期第一季度扣非净利润:第一季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7166064977645874:0.68:202:3 +当期第一季度扣非净利润:1-3月归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7220721244812012:5585927.73:202:2 +当期第一季度扣非净利润:1-3月归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7072504162788391:129475371.52:159:1 +当期第一季度扣非净利润:第一季度(1-3月)归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.698861837387085:5585927.73:202:2 +当期第一季度扣非净利润:第一季度(1-3月)归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.689150333404541:0.68:202:3 +当期第一季度扣非净利润:2023年第一季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8176008462905884:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7595938444137573:153819180.44:82:1 +当期第一季度扣非净利润:当期第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7562214732170105:0.68:202:3 +当期第一季度扣非净利润:当期第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7436284422874451:17.47:202:3 +当期第一季度扣非净利润:本期第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7320147752761841:0.68:202:3 +当期第一季度扣非净利润:本期第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7169272303581238:5585927.73:202:2 +当期第一季度扣非净利润:本报告期第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7248311042785645:0.68:202:3 +当期第一季度扣非净利润:本报告期第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7015214562416077:17.47:202:3 +当期第一季度扣非净利润:报告期第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7032231092453003:0.68:202:3 +当期第一季度扣非净利润:报告期第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6945376396179199:5585927.73:202:2 +当期第一季度扣非净利润:报告期内第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.707632839679718:0.68:202:3 +当期第一季度扣非净利润:报告期内第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6937413215637207:5585927.73:202:2 +当期第一季度扣非净利润:本年度第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7249913811683655:0.68:202:3 +当期第一季度扣非净利润:本年度第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7008354663848877:5585927.73:202:2 +当期第一季度扣非净利润:本期发生额第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.724163830280304:0.68:202:3 +当期第一季度扣非净利润:本期发生额第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7193063497543335:17.47:202:3 +当期第一季度扣非净利润:2023年第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.808871328830719:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7487149834632874:153819180.44:82:1 +当期第一季度扣非净利润:2023年全年第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.79681795835495:5585927.73:202:2 +当期第一季度扣非净利润:2023年全年第一季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7522115111351013:153819180.44:82:1 +当期第一季度扣非净利润:2023年金额第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8046144843101501:5585927.73:202:2 +当期第一季度扣非净利润:2023年金额第一季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7319774627685547:153819180.44:82:1 +当期第一季度扣非净利润:第一季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7345343828201294:0.68:202:3 +当期第一季度扣非净利润:第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.73394376039505:5585927.73:202:2 +当期第一季度扣非净利润:1-3月归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7153244018554688:5585927.73:202:2 +当期第一季度扣非净利润:1-3月归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6941787004470825:0.68:202:3 +当期第一季度扣非净利润:第一季度(1-3月)归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.702540397644043:0.68:202:3 +当期第一季度扣非净利润:第一季度(1-3月)归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6943689584732056:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.808871328830719:5585927.73:202:2 +当期第一季度扣非净利润:2023年第一季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7487149834632874:153819180.44:82:1 +当期第二季度扣非净利润:当期第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7488448619842529:17.47:202:3 +当期第二季度扣非净利润:当期第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.747643232345581:0.68:202:3 +当期第二季度扣非净利润:本期第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7248224020004272:5585927.73:202:2 +当期第二季度扣非净利润:本期第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7232562303543091:0.68:202:3 +当期第二季度扣非净利润:本报告期第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7226262092590332:0.68:202:3 +当期第二季度扣非净利润:本报告期第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7219334840774536:5585927.73:202:2 +当期第二季度扣非净利润:报告期第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7297585010528564:5585927.73:202:2 +当期第二季度扣非净利润:报告期第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7118540406227112:17.47:202:3 +当期第二季度扣非净利润:报告期内第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7137273550033569:5585927.73:202:2 +当期第二季度扣非净利润:报告期内第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.706540584564209:0.68:202:3 +当期第二季度扣非净利润:本年度第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7381573915481567:5585927.73:202:2 +当期第二季度扣非净利润:本年度第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7372666597366333:0.68:202:3 +当期第二季度扣非净利润:本期发生额第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7189936637878418:17.47:202:3 +当期第二季度扣非净利润:本期发生额第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7110331058502197:0.68:202:3 +当期第二季度扣非净利润:2023年第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8224098086357117:5585927.73:202:2 +当期第二季度扣非净利润:2023年第二季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7318723201751709:132340330.02:82:1 +当期第二季度扣非净利润:2023年全年第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8118973970413208:5585927.73:202:2 +当期第二季度扣非净利润:2023年全年第二季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7386520504951477:132340330.02:82:1 +当期第二季度扣非净利润:2023年金额第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8122127056121826:5585927.73:202:2 +当期第二季度扣非净利润:2023年金额第二季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7177448868751526:132340330.02:82:1 +当期第二季度扣非净利润:第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7471832036972046:5585927.73:202:2 +当期第二季度扣非净利润:第二季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7448639869689941:0.68:202:3 +当期第二季度扣非净利润:4-6月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7709733247756958:0.68:202:3 +当期第二季度扣非净利润:4-6月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7548789978027344:17.47:202:3 +当期第二季度扣非净利润:第二季度(4-6月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7278618812561035:0.68:202:3 +当期第二季度扣非净利润:第二季度(4-6月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7191697359085083:17.47:202:3 +当期第二季度扣非净利润:2023年第二季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8224098086357117:5585927.73:202:2 +当期第二季度扣非净利润:2023年第二季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7318723201751709:132340330.02:82:1 +当期第二季度扣非净利润:当期第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7655659914016724:5585927.73:202:2 +当期第二季度扣非净利润:当期第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7234159111976624:17.47:202:3 +当期第二季度扣非净利润:本期第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7634021043777466:5585927.73:202:2 +当期第二季度扣非净利润:本期第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7002172470092773:17.47:202:3 +当期第二季度扣非净利润:本报告期第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7496358156204224:5585927.73:202:2 +当期第二季度扣非净利润:本报告期第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6953058838844299:0.68:202:3 +当期第二季度扣非净利润:报告期第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7584412097930908:5585927.73:202:2 +当期第二季度扣非净利润:报告期第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6888888478279114:17.47:202:3 +当期第二季度扣非净利润:报告期内第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7404178380966187:5585927.73:202:2 +当期第二季度扣非净利润:报告期内第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6787667870521545:0.68:202:3 +当期第二季度扣非净利润:本年度第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7726746797561646:5585927.73:202:2 +当期第二季度扣非净利润:本年度第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7132642865180969:0.68:202:3 +当期第二季度扣非净利润:本期发生额第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7480325698852539:5585927.73:202:2 +当期第二季度扣非净利润:本期发生额第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7078745365142822:17.47:202:3 +当期第二季度扣非净利润:2023年第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.860842227935791:5585927.73:202:2 +当期第二季度扣非净利润:2023年第二季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7453109622001648:132340330.02:82:1 +当期第二季度扣非净利润:2023年全年第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8482345342636108:5585927.73:202:2 +当期第二季度扣非净利润:2023年全年第二季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7555850744247437:132340330.02:82:1 +当期第二季度扣非净利润:2023年金额第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8516152501106262:5585927.73:202:2 +当期第二季度扣非净利润:2023年金额第二季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7358811497688293:132340330.02:82:1 +当期第二季度扣非净利润:第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7838269472122192:5585927.73:202:2 +当期第二季度扣非净利润:第二季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7089864015579224:17.47:202:3 +当期第二季度扣非净利润:4-6月归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.7216601371765137:129475371.52:159:1 +当期第二季度扣非净利润:4-6月归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.714760959148407:5585927.73:202:2 +当期第二季度扣非净利润:第二季度(4-6月)归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.735552191734314:5585927.73:202:2 +当期第二季度扣非净利润:第二季度(4-6月)归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7027977705001831:0.68:202:3 +当期第二季度扣非净利润:2023年第二季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.860842227935791:5585927.73:202:2 +当期第二季度扣非净利润:2023年第二季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7453109622001648:132340330.02:82:1 +当期第二季度扣非净利润:当期第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7581855654716492:5585927.73:202:2 +当期第二季度扣非净利润:当期第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7363142371177673:17.47:202:3 +当期第二季度扣非净利润:本期第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7543686032295227:5585927.73:202:2 +当期第二季度扣非净利润:本期第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7131959199905396:0.68:202:3 +当期第二季度扣非净利润:本报告期第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7441877126693726:5585927.73:202:2 +当期第二季度扣非净利润:本报告期第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7129217386245728:0.68:202:3 +当期第二季度扣非净利润:报告期第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7526469826698303:5585927.73:202:2 +当期第二季度扣非净利润:报告期第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7033296227455139:17.47:202:3 +当期第二季度扣非净利润:报告期内第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.737880289554596:5585927.73:202:2 +当期第二季度扣非净利润:报告期内第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6988483667373657:0.68:202:3 +当期第二季度扣非净利润:本年度第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7637202739715576:5585927.73:202:2 +当期第二季度扣非净利润:本年度第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7278707027435303:0.68:202:3 +当期第二季度扣非净利润:本期发生额第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7417184114456177:5585927.73:202:2 +当期第二季度扣非净利润:本期发生额第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7179303169250488:17.47:202:3 +当期第二季度扣非净利润:2023年第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8480798006057739:5585927.73:202:2 +当期第二季度扣非净利润:2023年第二季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7302036285400391:132340330.02:82:1 +当期第二季度扣非净利润:2023年全年第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8385475873947144:5585927.73:202:2 +当期第二季度扣非净利润:2023年全年第二季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7391971945762634:132340330.02:82:1 +当期第二季度扣非净利润:2023年金额第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8387558460235596:5585927.73:202:2 +当期第二季度扣非净利润:2023年金额第二季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7187263369560242:132340330.02:82:1 +当期第二季度扣非净利润:第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7740365266799927:5585927.73:202:2 +当期第二季度扣非净利润:第二季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7255761623382568:0.68:202:3 +当期第二季度扣非净利润:4-6月归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7342696189880371:0.68:202:3 +当期第二季度扣非净利润:4-6月归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7170719504356384:17.47:202:3 +当期第二季度扣非净利润:第二季度(4-6月)归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7315372228622437:5585927.73:202:2 +当期第二季度扣非净利润:第二季度(4-6月)归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7153224945068359:0.68:202:3 +当期第二季度扣非净利润:2023年第二季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8480798006057739:5585927.73:202:2 +当期第二季度扣非净利润:2023年第二季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2022年度:0.7302036285400391:132340330.02:82:1 +当期第三季度扣非净利润:当期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.743847131729126:0.68:202:3 +当期第三季度扣非净利润:当期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.734261155128479:17.47:202:3 +当期第三季度扣非净利润:本期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7099366784095764:0.68:202:3 +当期第三季度扣非净利润:本期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6950927972793579:17.47:202:3 +当期第三季度扣非净利润:本报告期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6966383457183838:0.68:202:3 +当期第三季度扣非净利润:本报告期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6782435774803162:17.47:202:3 +当期第三季度扣非净利润:报告期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6925972700119019:0.68:202:3 +当期第三季度扣非净利润:报告期第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6803387403488159:17.47:202:3 +当期第三季度扣非净利润:报告期内第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6944278478622437:0.68:202:3 +当期第三季度扣非净利润:报告期内第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6782753467559814:17.47:202:3 +当期第三季度扣非净利润:本年度第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7104353904724121:0.68:202:3 +当期第三季度扣非净利润:本年度第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6895853281021118:17.47:202:3 +当期第三季度扣非净利润:本期发生额第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6953012347221375:0.68:202:3 +当期第三季度扣非净利润:本期发生额第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6929285526275635:17.47:202:3 +当期第三季度扣非净利润:2023年第三季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7626144886016846:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7530378699302673:153819180.44:82:1 +当期第三季度扣非净利润:2023年全年第三季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.76097172498703:153819180.44:82:1 +当期第三季度扣非净利润:2023年全年第三季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7523415684700012:5585927.73:202:2 +当期第三季度扣非净利润:2023年金额第三季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7654486894607544:5585927.73:202:2 +当期第三季度扣非净利润:2023年金额第三季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7453370690345764:153819180.44:82:1 +当期第三季度扣非净利润:第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7388668060302734:0.68:202:3 +当期第三季度扣非净利润:第三季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7269162535667419:17.47:202:3 +当期第三季度扣非净利润:7-9月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7313854098320007:0.68:202:3 +当期第三季度扣非净利润:7-9月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7186033725738525:17.47:202:3 +当期第三季度扣非净利润:第三季度(7-9月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7079127430915833:0.68:202:3 +当期第三季度扣非净利润:第三季度(7-9月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6961119771003723:17.47:202:3 +当期第三季度扣非净利润:2023年第三季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7626144886016846:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7530378699302673:153819180.44:82:1 +当期第三季度扣非净利润:当期第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7180739045143127:0.68:202:3 +当期第三季度扣非净利润:当期第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7121220827102661:5585927.73:202:2 +当期第三季度扣非净利润:本期第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.698891818523407:5585927.73:202:2 +当期第三季度扣非净利润:本期第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6872739195823669:0.68:202:3 +当期第三季度扣非净利润:本报告期第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6714487075805664:0.68:202:3 +当期第三季度扣非净利润:本报告期第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6712555885314941:5585927.73:202:2 +当期第三季度扣非净利润:报告期第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6865938901901245:5585927.73:202:2 +当期第三季度扣非净利润:报告期第三季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.6732601523399353:153819180.44:82:1 +当期第三季度扣非净利润:报告期内第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6799982786178589:5585927.73:202:2 +当期第三季度扣非净利润:报告期内第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6696537137031555:0.68:202:3 +当期第三季度扣非净利润:本年度第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6987884044647217:5585927.73:202:2 +当期第三季度扣非净利润:本年度第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.690321683883667:0.68:202:3 +当期第三季度扣非净利润:本期发生额第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6886657476425171:5585927.73:202:2 +当期第三季度扣非净利润:本期发生额第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6867343783378601:17.47:202:3 +当期第三季度扣非净利润:2023年第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.797795832157135:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7602532505989075:153819180.44:82:1 +当期第三季度扣非净利润:2023年全年第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7876362800598145:5585927.73:202:2 +当期第三季度扣非净利润:2023年全年第三季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7733147740364075:153819180.44:82:1 +当期第三季度扣非净利润:2023年金额第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.8030797839164734:5585927.73:202:2 +当期第三季度扣非净利润:2023年金额第三季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7591418027877808:153819180.44:82:1 +当期第三季度扣非净利润:第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7285078763961792:5585927.73:202:2 +当期第三季度扣非净利润:第三季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7024917602539062:0.68:202:3 +当期第三季度扣非净利润:7-9月归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6892725229263306:5585927.73:202:2 +当期第三季度扣非净利润:7-9月归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.6714909076690674:129475371.52:159:1 +当期第三季度扣非净利润:第三季度(7-9月)归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6883418560028076:5585927.73:202:2 +当期第三季度扣非净利润:第三季度(7-9月)归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6854289770126343:0.68:202:3 +当期第三季度扣非净利润:2023年第三季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.797795832157135:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7602532505989075:153819180.44:82:1 +当期第三季度扣非净利润:当期第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7323101162910461:0.68:202:3 +当期第三季度扣非净利润:当期第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.722990870475769:17.47:202:3 +当期第三季度扣非净利润:本期第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7002736926078796:0.68:202:3 +当期第三季度扣非净利润:本期第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6927783489227295:5585927.73:202:2 +当期第三季度扣非净利润:本报告期第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6873817443847656:0.68:202:3 +当期第三季度扣非净利润:本报告期第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6690260767936707:17.47:202:3 +当期第三季度扣非净利润:报告期第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6849058866500854:0.68:202:3 +当期第三季度扣非净利润:报告期第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6814860105514526:5585927.73:202:2 +当期第三季度扣非净利润:报告期内第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6874883770942688:0.68:202:3 +当期第三季度扣非净利润:报告期内第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6791142225265503:5585927.73:202:2 +当期第三季度扣非净利润:本年度第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7025926113128662:0.68:202:3 +当期第三季度扣非净利润:本年度第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6920628547668457:5585927.73:202:2 +当期第三季度扣非净利润:本期发生额第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6968339085578918:0.68:202:3 +当期第三季度扣非净利润:本期发生额第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6949604153633118:17.47:202:3 +当期第三季度扣非净利润:2023年第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7887687683105469:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7493119239807129:153819180.44:82:1 +当期第三季度扣非净利润:2023年全年第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7795279026031494:5585927.73:202:2 +当期第三季度扣非净利润:2023年全年第三季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.760225236415863:153819180.44:82:1 +当期第三季度扣非净利润:2023年金额第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7926426529884338:5585927.73:202:2 +当期第三季度扣非净利润:2023年金额第三季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7450754046440125:153819180.44:82:1 +当期第三季度扣非净利润:第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7239104509353638:5585927.73:202:2 +当期第三季度扣非净利润:第三季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7207947373390198:0.68:202:3 +当期第三季度扣非净利润:7-9月归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6994860172271729:0.68:202:3 +当期第三季度扣非净利润:7-9月归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.687427282333374:5585927.73:202:2 +当期第三季度扣非净利润:第三季度(7-9月)归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6938578486442566:0.68:202:3 +当期第三季度扣非净利润:第三季度(7-9月)归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6828607320785522:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7887687683105469:5585927.73:202:2 +当期第三季度扣非净利润:2023年第三季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7493119239807129:153819180.44:82:1 +当期第四季度扣非净利润:当期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7406319379806519:0.68:202:3 +当期第四季度扣非净利润:当期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7278617024421692:17.47:202:3 +当期第四季度扣非净利润:本期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7199193239212036:0.68:202:3 +当期第四季度扣非净利润:本期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7014930844306946:17.47:202:3 +当期第四季度扣非净利润:本报告期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7105863094329834:0.68:202:3 +当期第四季度扣非净利润:本报告期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6907421946525574:17.47:202:3 +当期第四季度扣非净利润:报告期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7018581628799438:0.68:202:3 +当期第四季度扣非净利润:报告期第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6868033409118652:17.47:202:3 +当期第四季度扣非净利润:报告期内第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6983160972595215:0.68:202:3 +当期第四季度扣非净利润:报告期内第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6805451512336731:17.47:202:3 +当期第四季度扣非净利润:本年度第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7238023281097412:0.68:202:3 +当期第四季度扣非净利润:本年度第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.700843095779419:17.47:202:3 +当期第四季度扣非净利润:本期发生额第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7065432667732239:0.68:202:3 +当期第四季度扣非净利润:本期发生额第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6997087001800537:17.47:202:3 +当期第四季度扣非净利润:2023年第四季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7595480680465698:5585927.73:202:2 +当期第四季度扣非净利润:2023年第四季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7497620582580566:153819180.44:82:1 +当期第四季度扣非净利润:2023年全年第四季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7602201700210571:153819180.44:82:1 +当期第四季度扣非净利润:2023年全年第四季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7498235106468201:5585927.73:202:2 +当期第四季度扣非净利润:2023年金额第四季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7599033713340759:5585927.73:202:2 +当期第四季度扣非净利润:2023年金额第四季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7468363642692566:153819180.44:82:1 +当期第四季度扣非净利润:第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7459908723831177:0.68:202:3 +当期第四季度扣非净利润:第四季度归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7312794923782349:17.47:202:3 +当期第四季度扣非净利润:10-12月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7385393977165222:0.68:202:3 +当期第四季度扣非净利润:10-12月归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.737189769744873:17.47:202:3 +当期第四季度扣非净利润:第四季度(10-12月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7133760452270508:0.68:202:3 +当期第四季度扣非净利润:第四季度(10-12月)归属于上市公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7007712125778198:17.47:202:3 +当期第四季度扣非净利润:2023年第四季度归属于上市公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7595480680465698:5585927.73:202:2 +当期第四季度扣非净利润:2023年第四季度归属于上市公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7497620582580566:153819180.44:82:1 +当期第四季度扣非净利润:当期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7142255306243896:0.68:202:3 +当期第四季度扣非净利润:当期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7037301659584045:17.47:202:3 +当期第四季度扣非净利润:本期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6955821514129639:0.68:202:3 +当期第四季度扣非净利润:本期第四季度归属于母公司所有者的扣除非经常性损益的净利润:加:本期归属于母公司所有者的净利润上期:0.6896200776100159:129475371.52:159:1 +当期第四季度扣非净利润:本报告期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6837426424026489:0.68:202:3 +当期第四季度扣非净利润:本报告期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6663782596588135:17.47:202:3 +当期第四季度扣非净利润:报告期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6796470284461975:0.68:202:3 +当期第四季度扣非净利润:报告期第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6675900220870972:17.47:202:3 +当期第四季度扣非净利润:报告期内第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6720786094665527:0.68:202:3 +当期第四季度扣非净利润:报告期内第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6555536389350891:17.47:202:3 +当期第四季度扣非净利润:本年度第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.700650691986084:0.68:202:3 +当期第四季度扣非净利润:本年度第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6806323528289795:17.47:202:3 +当期第四季度扣非净利润:本期发生额第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6932766437530518:0.68:202:3 +当期第四季度扣非净利润:本期发生额第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6890180706977844:17.47:202:3 +当期第四季度扣非净利润:2023年第四季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7926119565963745:5585927.73:202:2 +当期第四季度扣非净利润:2023年第四季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.752826452255249:153819180.44:82:1 +当期第四季度扣非净利润:2023年全年第四季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7830111980438232:5585927.73:202:2 +当期第四季度扣非净利润:2023年全年第四季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7681547999382019:153819180.44:82:1 +当期第四季度扣非净利润:2023年金额第四季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7962586879730225:5585927.73:202:2 +当期第四季度扣非净利润:2023年金额第四季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7582496404647827:153819180.44:82:1 +当期第四季度扣非净利润:第四季度归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7078337073326111:0.68:202:3 +当期第四季度扣非净利润:第四季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.701402485370636:5585927.73:202:2 +当期第四季度扣非净利润:10-12月归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.6979886293411255:5585927.73:202:2 +当期第四季度扣非净利润:10-12月归属于母公司所有者的扣除非经常性损益的净利润:归属于公司普通股股东的净利润每股收益基本每股收益:0.6903701424598694:0.60:202:3 +当期第四季度扣非净利润:第四季度(10-12月)归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6909375786781311:0.68:202:3 +当期第四季度扣非净利润:第四季度(10-12月)归属于母公司所有者的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.680225133895874:17.47:202:3 +当期第四季度扣非净利润:2023年第四季度归属于母公司所有者的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7926119565963745:5585927.73:202:2 +当期第四季度扣非净利润:2023年第四季度归属于母公司所有者的扣除非经常性损益的净利润:持续经营净利润2023年度:0.752826452255249:153819180.44:82:1 +当期第四季度扣非净利润:当期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7301681041717529:0.68:202:3 +当期第四季度扣非净利润:当期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7175829410552979:17.47:202:3 +当期第四季度扣非净利润:本期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7110024690628052:0.68:202:3 +当期第四季度扣非净利润:本期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6929327845573425:17.47:202:3 +当期第四季度扣非净利润:本报告期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7017512321472168:0.68:202:3 +当期第四季度扣非净利润:本报告期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6815284490585327:17.47:202:3 +当期第四季度扣非净利润:报告期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6956130862236023:0.68:202:3 +当期第四季度扣非净利润:报告期第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6809860467910767:17.47:202:3 +当期第四季度扣非净利润:报告期内第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.6918914318084717:0.68:202:3 +当期第四季度扣非净利润:报告期内第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6733983159065247:17.47:202:3 +当期第四季度扣非净利润:本年度第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.715309202671051:0.68:202:3 +当期第四季度扣非净利润:本年度第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6929366588592529:17.47:202:3 +当期第四季度扣非净利润:本期发生额第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7060917615890503:0.68:202:3 +当期第四季度扣非净利润:本期发生额第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6997462511062622:17.47:202:3 +当期第四季度扣非净利润:2023年第四季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7851074934005737:5585927.73:202:2 +当期第四季度扣非净利润:2023年第四季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7449992299079895:153819180.44:82:1 +当期第四季度扣非净利润:2023年全年第四季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7767080664634705:5585927.73:202:2 +当期第四季度扣非净利润:2023年全年第四季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7579862475395203:153819180.44:82:1 +当期第四季度扣非净利润:2023年金额第四季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7869263887405396:5585927.73:202:2 +当期第四季度扣非净利润:2023年金额第四季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7459722757339478:153819180.44:82:1 +当期第四季度扣非净利润:第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7276483774185181:0.68:202:3 +当期第四季度扣非净利润:第四季度归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7128092050552368:17.47:202:3 +当期第四季度扣非净利润:10-12月归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7057144045829773:0.68:202:3 +当期第四季度扣非净利润:10-12月归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7027064561843872:17.47:202:3 +当期第四季度扣非净利润:第四季度(10-12月)归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.701322078704834:0.68:202:3 +当期第四季度扣非净利润:第四季度(10-12月)归属于母公司股东的扣除非经常性损益的净利润:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.6890910863876343:17.47:202:3 +当期第四季度扣非净利润:2023年第四季度归属于母公司股东的扣除非经常性损益的净利润:2022年度归属于母公司所有者的非经常性损益净额金额:0.7851074934005737:5585927.73:202:2 +当期第四季度扣非净利润:2023年第四季度归属于母公司股东的扣除非经常性损益的净利润:持续经营净利润2023年度:0.7449992299079895:153819180.44:82:1 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比变动:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7988709211349487:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比变动:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7967780232429504:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比增减:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7778099179267883:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比增减:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7777659893035889:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比上升:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7829717397689819:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比上升:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7731540203094482:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比下降:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7857997417449951:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润同比下降:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7800267934799194:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润变化幅度:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7991597056388855:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润变化幅度:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7882792949676514:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润变动比例:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8018311858177185:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润变动比例:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7752537727355957:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润本期比上年同期增减:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7700045704841614:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润本期比上年同期增减:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7663306593894958:17.47:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润本年比上年增减:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7764275074005127:0.68:202:3 +扣非净利润同比变动:归属于上市公司股东的扣除非经常性损益的净利润本年比上年增减:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7739900350570679:17.47:202:3 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比变动:2022年度归属于母公司所有者的非经常性损益净额金额:0.7842721343040466:5585927.73:202:2 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比变动:加:本期归属于母公司所有者的净利润上期:0.7538594007492065:129475371.52:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比增减:2022年度归属于母公司所有者的非经常性损益净额金额:0.765417218208313:5585927.73:202:2 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比增减:加:本期归属于母公司所有者的净利润上期:0.765049934387207:129475371.52:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比上升:加:本期归属于母公司所有者的净利润上期:0.7592365145683289:129475371.52:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比上升:2022年度归属于母公司所有者的非经常性损益净额金额:0.7539896965026855:5585927.73:202:2 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比下降:2022年度归属于母公司所有者的非经常性损益净额金额:0.766386866569519:5585927.73:202:2 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润同比下降:加:本期归属于母公司所有者的净利润上期:0.7299516797065735:129475371.52:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润变化幅度:2022年度归属于母公司所有者的非经常性损益净额金额:0.7786229252815247:5585927.73:202:2 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润变化幅度:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.741756796836853:17.47:202:3 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润变动比例:2022年度归属于母公司所有者的非经常性损益净额金额:0.7646045684814453:5585927.73:202:2 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润变动比例:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.739445686340332:17.47:202:3 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润上期:0.8032207489013672:129475371.52:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润本期:0.7885921001434326:161483822.70:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润本年比上年增减:加:本期归属于母公司所有者的净利润上期:0.7794903516769409:129475371.52:159:1 +扣非净利润同比变动:归属于母公司所有者的扣除非经常性损益的净利润本年比上年增减:2022年度归属于母公司所有者的非经常性损益净额金额:0.7764232158660889:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比变动:2022年度归属于母公司所有者的非经常性损益净额金额:0.7844582200050354:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比变动:归属于公司普通股股东的净利润每股收益基本每股收益:0.7669461965560913:0.60:202:3 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比增减:2022年度归属于母公司所有者的非经常性损益净额金额:0.7629066705703735:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比增减:归属于公司普通股股东的净利润每股收益基本每股收益:0.7503648996353149:0.60:202:3 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比上升:2022年度归属于母公司所有者的非经常性损益净额金额:0.7517353296279907:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比上升:归属于公司普通股股东的净利润每股收益基本每股收益:0.744448184967041:0.60:202:3 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比下降:2022年度归属于母公司所有者的非经常性损益净额金额:0.7646483182907104:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润同比下降:归属于公司普通股股东的净利润每股收益基本每股收益:0.7505547404289246:0.60:202:3 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润变化幅度:2022年度归属于母公司所有者的非经常性损益净额金额:0.7761825323104858:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润变化幅度:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7695308327674866:17.47:202:3 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润变动比例:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7678375244140625:17.47:202:3 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润变动比例:2022年度归属于母公司所有者的非经常性损益净额金额:0.7601466774940491:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润本期比上年同期增减:加:本期归属于母公司所有者的净利润上期:0.7736004590988159:129475371.52:159:1 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润本期比上年同期增减:2022年度归属于母公司所有者的非经常性损益净额金额:0.7571174502372742:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润本年比上年增减:2022年度归属于母公司所有者的非经常性损益净额金额:0.7703106999397278:5585927.73:202:2 +扣非净利润同比变动:归属于母公司股东的扣除非经常性损益的净利润本年比上年增减:归属于公司普通股股东的净利润每股收益基本每股收益:0.7524517774581909:0.60:202:3 +当期经营活动现金流净额:当期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8399946689605713:72206529.17:84:2 +当期经营活动现金流净额:当期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8399946689605713:96403230.58:83:2 +当期经营活动现金流净额:本期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8516885638237:72206529.17:84:2 +当期经营活动现金流净额:本期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8516885638237:96403230.58:83:2 +当期经营活动现金流净额:本报告期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8163775205612183:103460734.18:84:2 +当期经营活动现金流净额:本报告期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8163775205612183:137243172.01:83:2 +当期经营活动现金流净额:报告期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8194200396537781:103460734.18:84:2 +当期经营活动现金流净额:报告期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8194200396537781:137243172.01:83:2 +当期经营活动现金流净额:报告期内经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7884940505027771:103460734.18:84:2 +当期经营活动现金流净额:报告期内经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7884940505027771:137243172.01:83:2 +当期经营活动现金流净额:本年度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8303256630897522:103460734.18:84:2 +当期经营活动现金流净额:本年度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8303256630897522:137243172.01:83:2 +当期经营活动现金流净额:本期发生额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8410243988037109:72206529.17:84:2 +当期经营活动现金流净额:本期发生额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8410243988037109:96403230.58:83:2 +当期经营活动现金流净额:2023年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8690390586853027:103460734.18:84:2 +当期经营活动现金流净额:2023年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8690390586853027:137243172.01:83:2 +当期经营活动现金流净额:2023年全年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8255732655525208:103460734.18:84:2 +当期经营活动现金流净额:2023年全年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8255732655525208:137243172.01:83:2 +当期经营活动现金流净额:2023年金额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8542194366455078:72206529.17:84:2 +当期经营活动现金流净额:2023年金额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8542194366455078:96403230.58:83:2 +当期经营活动现金流净额:当期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7695506811141968:72206529.17:84:2 +当期经营活动现金流净额:当期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7695506811141968:96403230.58:83:2 +当期经营活动现金流净额:本期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7731218338012695:72206529.17:84:2 +当期经营活动现金流净额:本期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7731218338012695:96403230.58:83:2 +当期经营活动现金流净额:本报告期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7481679916381836:103460734.18:84:2 +当期经营活动现金流净额:本报告期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7481679916381836:137243172.01:83:2 +当期经营活动现金流净额:报告期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7557547092437744:72206529.17:84:2 +当期经营活动现金流净额:报告期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7557547092437744:96403230.58:83:2 +当期经营活动现金流净额:报告期内经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7225486636161804:103460734.18:84:2 +当期经营活动现金流净额:报告期内经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7225486636161804:137243172.01:83:2 +当期经营活动现金流净额:本年度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7647061944007874:103460734.18:84:2 +当期经营活动现金流净额:本年度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7647061944007874:137243172.01:83:2 +当期经营活动现金流净额:本期发生额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7815693616867065:72206529.17:84:2 +当期经营活动现金流净额:本期发生额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7815693616867065:96403230.58:83:2 +当期经营活动现金流净额:2023年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8210266828536987:72206529.17:84:2 +当期经营活动现金流净额:2023年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8210266828536987:96403230.58:83:2 +当期经营活动现金流净额:2023年全年经营活动现金净流量:持续经营净利润2023年度:0.7826700210571289:153819180.44:82:1 +当期经营活动现金流净额:2023年全年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7726075649261475:137243172.01:83:2 +当期经营活动现金流净额:2023年金额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8120062351226807:72206529.17:84:2 +当期经营活动现金流净额:2023年金额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8120062351226807:96403230.58:83:2 +当期经营活动现金流净额:当期经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6946997046470642:1266437216.92:84:2 +当期经营活动现金流净额:当期经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6946997046470642:1809494459.14:83:2 +当期经营活动现金流净额:本期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7033042907714844:72206529.17:84:2 +当期经营活动现金流净额:本期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7033042907714844:96403230.58:83:2 +当期经营活动现金流净额:本报告期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7131535410881042:103460734.18:84:2 +当期经营活动现金流净额:本报告期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7131535410881042:137243172.01:83:2 +当期经营活动现金流净额:报告期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7156774401664734:72206529.17:84:2 +当期经营活动现金流净额:报告期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7156774401664734:96403230.58:83:2 +当期经营活动现金流净额:报告期内经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7021319270133972:103460734.18:84:2 +当期经营活动现金流净额:报告期内经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7021319270133972:137243172.01:83:2 +当期经营活动现金流净额:本年度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7216082215309143:103460734.18:84:2 +当期经营活动现金流净额:本年度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7216082215309143:137243172.01:83:2 +当期经营活动现金流净额:本期发生额经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7391992807388306:72206529.17:84:2 +当期经营活动现金流净额:本期发生额经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7391992807388306:96403230.58:83:2 +当期经营活动现金流净额:2023年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7620757818222046:72206529.17:84:2 +当期经营活动现金流净额:2023年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7620757818222046:96403230.58:83:2 +当期经营活动现金流净额:2023年全年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7345247864723206:103460734.18:84:2 +当期经营活动现金流净额:2023年全年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7345247864723206:137243172.01:83:2 +当期经营活动现金流净额:2023年金额经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7684880495071411:1266437216.92:84:2 +当期经营活动现金流净额:2023年金额经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7684880495071411:1809494459.14:83:2 +上年同期经营活动现金流净额:上年同期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7772907018661499:103460734.18:84:2 +上年同期经营活动现金流净额:上年同期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7772907018661499:137243172.01:83:2 +上年同期经营活动现金流净额:上期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8271266222000122:72206529.17:84:2 +上年同期经营活动现金流净额:上期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8271266222000122:96403230.58:83:2 +上年同期经营活动现金流净额:上年度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8149641752243042:103460734.18:84:2 +上年同期经营活动现金流净额:上年度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8149641752243042:137243172.01:83:2 +上年同期经营活动现金流净额:2022年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8791653513908386:103460734.18:84:2 +上年同期经营活动现金流净额:2022年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8791653513908386:137243172.01:83:2 +上年同期经营活动现金流净额:2022年全年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8355849981307983:103460734.18:84:2 +上年同期经营活动现金流净额:2022年全年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8355849981307983:137243172.01:83:2 +上年同期经营活动现金流净额:2022年金额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8612352609634399:72206529.17:84:2 +上年同期经营活动现金流净额:2022年金额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8612352609634399:96403230.58:83:2 +上年同期经营活动现金流净额:上年同期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7167509198188782:103460734.18:84:2 +上年同期经营活动现金流净额:上年同期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7167509198188782:137243172.01:83:2 +上年同期经营活动现金流净额:上期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7547105550765991:72206529.17:84:2 +上年同期经营活动现金流净额:上期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7547105550765991:96403230.58:83:2 +上年同期经营活动现金流净额:上年度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.750397801399231:72206529.17:84:2 +上年同期经营活动现金流净额:上年度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.750397801399231:96403230.58:83:2 +上年同期经营活动现金流净额:2022年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8301065564155579:103460734.18:84:2 +上年同期经营活动现金流净额:2022年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8301065564155579:137243172.01:83:2 +上年同期经营活动现金流净额:2022年全年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7811682224273682:103460734.18:84:2 +上年同期经营活动现金流净额:2022年全年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7811682224273682:137243172.01:83:2 +上年同期经营活动现金流净额:2022年金额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8148775100708008:72206529.17:84:2 +上年同期经营活动现金流净额:2022年金额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8148775100708008:96403230.58:83:2 +上年同期经营活动现金流净额:上年同期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6886841654777527:103460734.18:84:2 +上年同期经营活动现金流净额:上年同期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6886841654777527:137243172.01:83:2 +上年同期经营活动现金流净额:上期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7039361596107483:72206529.17:84:2 +上年同期经营活动现金流净额:上期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7039361596107483:96403230.58:83:2 +上年同期经营活动现金流净额:上年度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7153657674789429:72206529.17:84:2 +上年同期经营活动现金流净额:上年度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7153657674789429:96403230.58:83:2 +上年同期经营活动现金流净额:2022年经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7808305025100708:1266437216.92:84:2 +上年同期经营活动现金流净额:2022年经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7808305025100708:1809494459.14:83:2 +上年同期经营活动现金流净额:2022年全年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7442411780357361:103460734.18:84:2 +上年同期经营活动现金流净额:2022年全年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7442411780357361:137243172.01:83:2 +上年同期经营活动现金流净额:2022年金额经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7775881290435791:1266437216.92:84:2 +上年同期经营活动现金流净额:2022年金额经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7775881290435791:1809494459.14:83:2 +前年同期经营活动现金流净额:前年同期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7609868049621582:72206529.17:84:2 +前年同期经营活动现金流净额:前年同期经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7609868049621582:96403230.58:83:2 +前年同期经营活动现金流净额:2021年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8282190561294556:72206529.17:84:2 +前年同期经营活动现金流净额:2021年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8282190561294556:96403230.58:83:2 +前年同期经营活动现金流净额:2021年全年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7900218367576599:72206529.17:84:2 +前年同期经营活动现金流净额:2021年全年经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7900218367576599:96403230.58:83:2 +前年同期经营活动现金流净额:2021年金额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.804916262626648:72206529.17:84:2 +前年同期经营活动现金流净额:2021年金额经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.804916262626648:96403230.58:83:2 +前年同期经营活动现金流净额:前年同期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7006931304931641:72206529.17:84:2 +前年同期经营活动现金流净额:前年同期经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7006931304931641:96403230.58:83:2 +前年同期经营活动现金流净额:2021年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7760300636291504:72206529.17:84:2 +前年同期经营活动现金流净额:2021年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7760300636291504:96403230.58:83:2 +前年同期经营活动现金流净额:2021年全年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7295911312103271:72206529.17:84:2 +前年同期经营活动现金流净额:2021年全年经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7295911312103271:96403230.58:83:2 +前年同期经营活动现金流净额:2021年金额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7556101679801941:72206529.17:84:2 +前年同期经营活动现金流净额:2021年金额经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7556101679801941:96403230.58:83:2 +前年同期经营活动现金流净额:前年同期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6842694282531738:72206529.17:84:2 +前年同期经营活动现金流净额:前年同期经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6842694282531738:96403230.58:83:2 +前年同期经营活动现金流净额:2021年经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7176082134246826:1266437216.92:84:2 +前年同期经营活动现金流净额:2021年经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7176082134246826:1809494459.14:83:2 +前年同期经营活动现金流净额:2021年全年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6877075433731079:72206529.17:84:2 +前年同期经营活动现金流净额:2021年全年经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6877075433731079:96403230.58:83:2 +前年同期经营活动现金流净额:2021年金额经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7203717231750488:1266437216.92:84:2 +前年同期经营活动现金流净额:2021年金额经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7203717231750488:1809494459.14:83:2 +当期第一季度经营活动现金流净额:当期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7834084033966064:72206529.17:84:2 +当期第一季度经营活动现金流净额:当期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7834084033966064:96403230.58:83:2 +当期第一季度经营活动现金流净额:本期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7789040207862854:103460734.18:84:2 +当期第一季度经营活动现金流净额:本期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7789040207862854:137243172.01:83:2 +当期第一季度经营活动现金流净额:本报告期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7495941519737244:103460734.18:84:2 +当期第一季度经营活动现金流净额:本报告期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7495941519737244:137243172.01:83:2 +当期第一季度经营活动现金流净额:报告期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7442473769187927:72206529.17:84:2 +当期第一季度经营活动现金流净额:报告期第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7442473769187927:96403230.58:83:2 +当期第一季度经营活动现金流净额:报告期内第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7249159812927246:103460734.18:84:2 +当期第一季度经营活动现金流净额:报告期内第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7249159812927246:137243172.01:83:2 +当期第一季度经营活动现金流净额:本年度第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7687292695045471:103460734.18:84:2 +当期第一季度经营活动现金流净额:本年度第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7687292695045471:137243172.01:83:2 +当期第一季度经营活动现金流净额:本期发生额第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8114621043205261:72206529.17:84:2 +当期第一季度经营活动现金流净额:本期发生额第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8114621043205261:96403230.58:83:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8257237672805786:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8257237672805786:137243172.01:83:2 +当期第一季度经营活动现金流净额:2023年全年第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7925756573677063:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年全年第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7925756573677063:137243172.01:83:2 +当期第一季度经营活动现金流净额:2023年金额第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8288159370422363:72206529.17:84:2 +当期第一季度经营活动现金流净额:2023年金额第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8288159370422363:96403230.58:83:2 +当期第一季度经营活动现金流净额:第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.772646427154541:72206529.17:84:2 +当期第一季度经营活动现金流净额:第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.772646427154541:96403230.58:83:2 +当期第一季度经营活动现金流净额:1-3月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7851661443710327:72206529.17:84:2 +当期第一季度经营活动现金流净额:1-3月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7851661443710327:96403230.58:83:2 +当期第一季度经营活动现金流净额:第一季度(1-3月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7881900072097778:72206529.17:84:2 +当期第一季度经营活动现金流净额:第一季度(1-3月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7881900072097778:96403230.58:83:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8257237672805786:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8257237672805786:137243172.01:83:2 +当期第一季度经营活动现金流净额:当期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7153689861297607:72206529.17:84:2 +当期第一季度经营活动现金流净额:当期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7153689861297607:96403230.58:83:2 +当期第一季度经营活动现金流净额:本期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7053120732307434:72206529.17:84:2 +当期第一季度经营活动现金流净额:本期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7053120732307434:96403230.58:83:2 +当期第一季度经营活动现金流净额:本报告期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6858313679695129:103460734.18:84:2 +当期第一季度经营活动现金流净额:本报告期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6858313679695129:137243172.01:83:2 +当期第一季度经营活动现金流净额:报告期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6791421175003052:72206529.17:84:2 +当期第一季度经营活动现金流净额:报告期第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6791421175003052:96403230.58:83:2 +当期第一季度经营活动现金流净额:报告期内第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6615161299705505:103460734.18:84:2 +当期第一季度经营活动现金流净额:报告期内第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6615161299705505:137243172.01:83:2 +当期第一季度经营活动现金流净额:本年度第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7042670845985413:103460734.18:84:2 +当期第一季度经营活动现金流净额:本年度第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7042670845985413:137243172.01:83:2 +当期第一季度经营活动现金流净额:本期发生额第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7523605823516846:72206529.17:84:2 +当期第一季度经营活动现金流净额:本期发生额第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7523605823516846:96403230.58:83:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7660543322563171:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7660543322563171:137243172.01:83:2 +当期第一季度经营活动现金流净额:2023年全年第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7359169125556946:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年全年第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7359169125556946:137243172.01:83:2 +当期第一季度经营活动现金流净额:2023年金额第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.776792049407959:72206529.17:84:2 +当期第一季度经营活动现金流净额:2023年金额第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.776792049407959:96403230.58:83:2 +当期第一季度经营活动现金流净额:第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7004868984222412:72206529.17:84:2 +当期第一季度经营活动现金流净额:第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7004868984222412:96403230.58:83:2 +当期第一季度经营活动现金流净额:1-3月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7071112394332886:72206529.17:84:2 +当期第一季度经营活动现金流净额:1-3月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7071112394332886:96403230.58:83:2 +当期第一季度经营活动现金流净额:第一季度(1-3月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7302182912826538:72206529.17:84:2 +当期第一季度经营活动现金流净额:第一季度(1-3月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7302182912826538:96403230.58:83:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7660543322563171:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年第一季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7660543322563171:137243172.01:83:2 +当期第一季度经营活动现金流净额:当期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6876266002655029:72206529.17:84:2 +当期第一季度经营活动现金流净额:当期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6876266002655029:96403230.58:83:2 +当期第一季度经营活动现金流净额:本期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6864259839057922:72206529.17:84:2 +当期第一季度经营活动现金流净额:本期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6864259839057922:96403230.58:83:2 +当期第一季度经营活动现金流净额:本报告期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6680917143821716:103460734.18:84:2 +当期第一季度经营活动现金流净额:本报告期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6680917143821716:137243172.01:83:2 +当期第一季度经营活动现金流净额:报告期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6631760597229004:72206529.17:84:2 +当期第一季度经营活动现金流净额:报告期第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6631760597229004:96403230.58:83:2 +当期第一季度经营活动现金流净额:报告期内第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6456843018531799:103460734.18:84:2 +当期第一季度经营活动现金流净额:报告期内第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6456843018531799:137243172.01:83:2 +当期第一季度经营活动现金流净额:本年度第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6796085834503174:103460734.18:84:2 +当期第一季度经营活动现金流净额:本年度第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6796085834503174:137243172.01:83:2 +当期第一季度经营活动现金流净额:本期发生额第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7416543960571289:72206529.17:84:2 +当期第一季度经营活动现金流净额:本期发生额第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7416543960571289:96403230.58:83:2 +当期第一季度经营活动现金流净额:2023年第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7403048872947693:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7403048872947693:137243172.01:83:2 +当期第一季度经营活动现金流净额:2023年全年第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7128514647483826:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年全年第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7128514647483826:137243172.01:83:2 +当期第一季度经营活动现金流净额:2023年金额第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7512692213058472:72206529.17:84:2 +当期第一季度经营活动现金流净额:2023年金额第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7512692213058472:96403230.58:83:2 +当期第一季度经营活动现金流净额:第一季度经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.677559494972229:1266437216.92:84:2 +当期第一季度经营活动现金流净额:第一季度经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.677559494972229:1809494459.14:83:2 +当期第一季度经营活动现金流净额:1-3月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6815695762634277:72206529.17:84:2 +当期第一季度经营活动现金流净额:1-3月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6815695762634277:96403230.58:83:2 +当期第一季度经营活动现金流净额:第一季度(1-3月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7041655778884888:72206529.17:84:2 +当期第一季度经营活动现金流净额:第一季度(1-3月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7041655778884888:96403230.58:83:2 +当期第一季度经营活动现金流净额:2023年第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7403048872947693:103460734.18:84:2 +当期第一季度经营活动现金流净额:2023年第一季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7403048872947693:137243172.01:83:2 +当期第二季度经营活动现金流净额:当期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7736657857894897:72206529.17:84:2 +当期第二季度经营活动现金流净额:当期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7736657857894897:96403230.58:83:2 +当期第二季度经营活动现金流净额:本期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7715607285499573:103460734.18:84:2 +当期第二季度经营活动现金流净额:本期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7715607285499573:137243172.01:83:2 +当期第二季度经营活动现金流净额:本报告期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7497390508651733:103460734.18:84:2 +当期第二季度经营活动现金流净额:本报告期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7497390508651733:137243172.01:83:2 +当期第二季度经营活动现金流净额:报告期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7522462010383606:103460734.18:84:2 +当期第二季度经营活动现金流净额:报告期第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7522462010383606:137243172.01:83:2 +当期第二季度经营活动现金流净额:报告期内第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7254213094711304:103460734.18:84:2 +当期第二季度经营活动现金流净额:报告期内第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7254213094711304:137243172.01:83:2 +当期第二季度经营活动现金流净额:本年度第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7767255902290344:103460734.18:84:2 +当期第二季度经营活动现金流净额:本年度第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7767255902290344:137243172.01:83:2 +当期第二季度经营活动现金流净额:本期发生额第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7988326549530029:72206529.17:84:2 +当期第二季度经营活动现金流净额:本期发生额第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7988326549530029:96403230.58:83:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8321700692176819:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8321700692176819:137243172.01:83:2 +当期第二季度经营活动现金流净额:2023年全年第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7950235605239868:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年全年第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7950235605239868:137243172.01:83:2 +当期第二季度经营活动现金流净额:2023年金额第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8332099318504333:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年金额第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8332099318504333:137243172.01:83:2 +当期第二季度经营活动现金流净额:第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7691527605056763:103460734.18:84:2 +当期第二季度经营活动现金流净额:第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7691527605056763:137243172.01:83:2 +当期第二季度经营活动现金流净额:4-6月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7947551012039185:72206529.17:84:2 +当期第二季度经营活动现金流净额:4-6月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7947551012039185:96403230.58:83:2 +当期第二季度经营活动现金流净额:第二季度(4-6月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7638459801673889:72206529.17:84:2 +当期第二季度经营活动现金流净额:第二季度(4-6月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7638459801673889:96403230.58:83:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8321700692176819:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8321700692176819:137243172.01:83:2 +当期第二季度经营活动现金流净额:当期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7094893455505371:72206529.17:84:2 +当期第二季度经营活动现金流净额:当期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7094893455505371:96403230.58:83:2 +当期第二季度经营活动现金流净额:本期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7041306495666504:72206529.17:84:2 +当期第二季度经营活动现金流净额:本期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7041306495666504:96403230.58:83:2 +当期第二季度经营活动现金流净额:本报告期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6884360313415527:103460734.18:84:2 +当期第二季度经营活动现金流净额:本报告期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6884360313415527:137243172.01:83:2 +当期第二季度经营活动现金流净额:报告期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6906895637512207:103460734.18:84:2 +当期第二季度经营活动现金流净额:报告期第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6906895637512207:137243172.01:83:2 +当期第二季度经营活动现金流净额:报告期内第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.665481686592102:103460734.18:84:2 +当期第二季度经营活动现金流净额:报告期内第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.665481686592102:137243172.01:83:2 +当期第二季度经营活动现金流净额:本年度第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7168223261833191:103460734.18:84:2 +当期第二季度经营活动现金流净额:本年度第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7168223261833191:137243172.01:83:2 +当期第二季度经营活动现金流净额:本期发生额第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7437124848365784:72206529.17:84:2 +当期第二季度经营活动现金流净额:本期发生额第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7437124848365784:96403230.58:83:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7760810256004333:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7760810256004333:137243172.01:83:2 +当期第二季度经营活动现金流净额:2023年全年第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7404198050498962:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年全年第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7404198050498962:137243172.01:83:2 +当期第二季度经营活动现金流净额:2023年金额第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7856565117835999:72206529.17:84:2 +当期第二季度经营活动现金流净额:2023年金额第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7856565117835999:96403230.58:83:2 +当期第二季度经营活动现金流净额:第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7023295760154724:103460734.18:84:2 +当期第二季度经营活动现金流净额:第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7023295760154724:137243172.01:83:2 +当期第二季度经营活动现金流净额:4-6月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7230963706970215:72206529.17:84:2 +当期第二季度经营活动现金流净额:4-6月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7230963706970215:96403230.58:83:2 +当期第二季度经营活动现金流净额:第二季度(4-6月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7082515954971313:72206529.17:84:2 +当期第二季度经营活动现金流净额:第二季度(4-6月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7082515954971313:96403230.58:83:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7760810256004333:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年第二季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7760810256004333:137243172.01:83:2 +当期第二季度经营活动现金流净额:当期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.683647871017456:72206529.17:84:2 +当期第二季度经营活动现金流净额:当期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.683647871017456:96403230.58:83:2 +当期第二季度经营活动现金流净额:本期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.682981014251709:103460734.18:84:2 +当期第二季度经营活动现金流净额:本期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.682981014251709:137243172.01:83:2 +当期第二季度经营活动现金流净额:本报告期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6705912947654724:103460734.18:84:2 +当期第二季度经营活动现金流净额:本报告期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6705912947654724:137243172.01:83:2 +当期第二季度经营活动现金流净额:报告期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6717692017555237:103460734.18:84:2 +当期第二季度经营活动现金流净额:报告期第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6717692017555237:137243172.01:83:2 +当期第二季度经营活动现金流净额:报告期内第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6513920426368713:103460734.18:84:2 +当期第二季度经营活动现金流净额:报告期内第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6513920426368713:137243172.01:83:2 +当期第二季度经营活动现金流净额:本年度第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.691369354724884:103460734.18:84:2 +当期第二季度经营活动现金流净额:本年度第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.691369354724884:137243172.01:83:2 +当期第二季度经营活动现金流净额:本期发生额第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7312328815460205:72206529.17:84:2 +当期第二季度经营活动现金流净额:本期发生额第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7312328815460205:96403230.58:83:2 +当期第二季度经营活动现金流净额:2023年第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7445881962776184:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7445881962776184:137243172.01:83:2 +当期第二季度经营活动现金流净额:2023年全年第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7145717740058899:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年全年第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7145717740058899:137243172.01:83:2 +当期第二季度经营活动现金流净额:2023年金额第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7568594217300415:72206529.17:84:2 +当期第二季度经营活动现金流净额:2023年金额第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7568594217300415:96403230.58:83:2 +当期第二季度经营活动现金流净额:第二季度经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6793113946914673:1266437216.92:84:2 +当期第二季度经营活动现金流净额:第二季度经营性活动现金流:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6793113946914673:1809494459.14:83:2 +当期第二季度经营活动现金流净额:4-6月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6796566247940063:72206529.17:84:2 +当期第二季度经营活动现金流净额:4-6月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6796566247940063:96403230.58:83:2 +当期第二季度经营活动现金流净额:第二季度(4-6月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6796213388442993:72206529.17:84:2 +当期第二季度经营活动现金流净额:第二季度(4-6月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6796213388442993:96403230.58:83:2 +当期第二季度经营活动现金流净额:2023年第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7445881962776184:103460734.18:84:2 +当期第二季度经营活动现金流净额:2023年第二季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7445881962776184:137243172.01:83:2 +当期第三季度经营活动现金流净额:当期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7756008505821228:72206529.17:84:2 +当期第三季度经营活动现金流净额:当期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7756008505821228:96403230.58:83:2 +当期第三季度经营活动现金流净额:本期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.765664279460907:103460734.18:84:2 +当期第三季度经营活动现金流净额:本期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.765664279460907:137243172.01:83:2 +当期第三季度经营活动现金流净额:本报告期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7352154850959778:103460734.18:84:2 +当期第三季度经营活动现金流净额:本报告期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7352154850959778:137243172.01:83:2 +当期第三季度经营活动现金流净额:报告期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7421324253082275:103460734.18:84:2 +当期第三季度经营活动现金流净额:报告期第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7421324253082275:137243172.01:83:2 +当期第三季度经营活动现金流净额:报告期内第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.728070855140686:103460734.18:84:2 +当期第三季度经营活动现金流净额:报告期内第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.728070855140686:137243172.01:83:2 +当期第三季度经营活动现金流净额:本年度第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7607164978981018:103460734.18:84:2 +当期第三季度经营活动现金流净额:本年度第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7607164978981018:137243172.01:83:2 +当期第三季度经营活动现金流净额:本期发生额第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7964656949043274:72206529.17:84:2 +当期第三季度经营活动现金流净额:本期发生额第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7964656949043274:96403230.58:83:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8113766312599182:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8113766312599182:137243172.01:83:2 +当期第三季度经营活动现金流净额:2023年全年第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7780672907829285:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年全年第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7780672907829285:137243172.01:83:2 +当期第三季度经营活动现金流净额:2023年金额第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8191104531288147:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年金额第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8191104531288147:137243172.01:83:2 +当期第三季度经营活动现金流净额:第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7734482884407043:103460734.18:84:2 +当期第三季度经营活动现金流净额:第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7734482884407043:137243172.01:83:2 +当期第三季度经营活动现金流净额:7-9月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.745712399482727:72206529.17:84:2 +当期第三季度经营活动现金流净额:7-9月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.745712399482727:96403230.58:83:2 +当期第三季度经营活动现金流净额:第三季度(7-9月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7562373876571655:72206529.17:84:2 +当期第三季度经营活动现金流净额:第三季度(7-9月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7562373876571655:96403230.58:83:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8113766312599182:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8113766312599182:137243172.01:83:2 +当期第三季度经营活动现金流净额:当期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7100602984428406:72206529.17:84:2 +当期第三季度经营活动现金流净额:当期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7100602984428406:96403230.58:83:2 +当期第三季度经营活动现金流净额:本期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6957334280014038:103460734.18:84:2 +当期第三季度经营活动现金流净额:本期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6957334280014038:137243172.01:83:2 +当期第三季度经营活动现金流净额:本报告期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6706667542457581:103460734.18:84:2 +当期第三季度经营活动现金流净额:本报告期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6706667542457581:137243172.01:83:2 +当期第三季度经营活动现金流净额:报告期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.679035484790802:103460734.18:84:2 +当期第三季度经营活动现金流净额:报告期第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.679035484790802:137243172.01:83:2 +当期第三季度经营活动现金流净额:报告期内第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6648772358894348:103460734.18:84:2 +当期第三季度经营活动现金流净额:报告期内第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6648772358894348:137243172.01:83:2 +当期第三季度经营活动现金流净额:本年度第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6978175044059753:103460734.18:84:2 +当期第三季度经营活动现金流净额:本年度第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6978175044059753:137243172.01:83:2 +当期第三季度经营活动现金流净额:本期发生额第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7409676313400269:72206529.17:84:2 +当期第三季度经营活动现金流净额:本期发生额第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7409676313400269:96403230.58:83:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7572323679924011:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7572323679924011:137243172.01:83:2 +当期第三季度经营活动现金流净额:2023年全年第三季度经营活动现金净流量:持续经营净利润2023年度:0.7526537775993347:153819180.44:82:1 +当期第三季度经营活动现金流净额:2023年全年第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7249948978424072:137243172.01:83:2 +当期第三季度经营活动现金流净额:2023年金额第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.774736762046814:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年金额第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.774736762046814:137243172.01:83:2 +当期第三季度经营活动现金流净额:第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.704445481300354:103460734.18:84:2 +当期第三季度经营活动现金流净额:第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.704445481300354:137243172.01:83:2 +当期第三季度经营活动现金流净额:7-9月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6607980132102966:72206529.17:84:2 +当期第三季度经营活动现金流净额:7-9月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6607980132102966:96403230.58:83:2 +当期第三季度经营活动现金流净额:第三季度(7-9月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6923367977142334:72206529.17:84:2 +当期第三季度经营活动现金流净额:第三季度(7-9月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6923367977142334:96403230.58:83:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7572323679924011:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年第三季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7572323679924011:137243172.01:83:2 +当期第三季度经营活动现金流净额:当期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6788573861122131:72206529.17:84:2 +当期第三季度经营活动现金流净额:当期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6788573861122131:96403230.58:83:2 +当期第三季度经营活动现金流净额:本期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6701276898384094:103460734.18:84:2 +当期第三季度经营活动现金流净额:本期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6701276898384094:137243172.01:83:2 +当期第三季度经营活动现金流净额:本报告期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6502850651741028:103460734.18:84:2 +当期第三季度经营活动现金流净额:本报告期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6502850651741028:137243172.01:83:2 +当期第三季度经营活动现金流净额:报告期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6552742123603821:103460734.18:84:2 +当期第三季度经营活动现金流净额:报告期第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6552742123603821:137243172.01:83:2 +当期第三季度经营活动现金流净额:报告期内第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.646312952041626:103460734.18:84:2 +当期第三季度经营活动现金流净额:报告期内第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.646312952041626:137243172.01:83:2 +当期第三季度经营活动现金流净额:本年度第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6689830422401428:103460734.18:84:2 +当期第三季度经营活动现金流净额:本年度第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6689830422401428:137243172.01:83:2 +当期第三季度经营活动现金流净额:本期发生额第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.724909782409668:72206529.17:84:2 +当期第三季度经营活动现金流净额:本期发生额第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.724909782409668:96403230.58:83:2 +当期第三季度经营活动现金流净额:2023年第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7254926562309265:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7254926562309265:137243172.01:83:2 +当期第三季度经营活动现金流净额:2023年全年第三季度经营性活动现金流:持续经营净利润2023年度:0.699832022190094:153819180.44:82:1 +当期第三季度经营活动现金流净额:2023年全年第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6979538798332214:137243172.01:83:2 +当期第三季度经营活动现金流净额:2023年金额第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7477968335151672:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年金额第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7477968335151672:137243172.01:83:2 +当期第三季度经营活动现金流净额:第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.674629271030426:103460734.18:84:2 +当期第三季度经营活动现金流净额:第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.674629271030426:137243172.01:83:2 +当期第三季度经营活动现金流净额:7-9月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6471729874610901:72206529.17:84:2 +当期第三季度经营活动现金流净额:7-9月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6471729874610901:96403230.58:83:2 +当期第三季度经营活动现金流净额:第三季度(7-9月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.663939893245697:72206529.17:84:2 +当期第三季度经营活动现金流净额:第三季度(7-9月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.663939893245697:96403230.58:83:2 +当期第三季度经营活动现金流净额:2023年第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7254926562309265:103460734.18:84:2 +当期第三季度经营活动现金流净额:2023年第三季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7254926562309265:137243172.01:83:2 +当期第四季度经营活动现金流净额:当期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7456432580947876:72206529.17:84:2 +当期第四季度经营活动现金流净额:当期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7456432580947876:96403230.58:83:2 +当期第四季度经营活动现金流净额:本期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7401652336120605:103460734.18:84:2 +当期第四季度经营活动现金流净额:本期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7401652336120605:137243172.01:83:2 +当期第四季度经营活动现金流净额:本报告期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7176844477653503:103460734.18:84:2 +当期第四季度经营活动现金流净额:本报告期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7176844477653503:137243172.01:83:2 +当期第四季度经营活动现金流净额:报告期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7246822714805603:103460734.18:84:2 +当期第四季度经营活动现金流净额:报告期第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7246822714805603:137243172.01:83:2 +当期第四季度经营活动现金流净额:报告期内第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7006620168685913:103460734.18:84:2 +当期第四季度经营活动现金流净额:报告期内第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7006620168685913:137243172.01:83:2 +当期第四季度经营活动现金流净额:本年度第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7376666069030762:103460734.18:84:2 +当期第四季度经营活动现金流净额:本年度第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7376666069030762:137243172.01:83:2 +当期第四季度经营活动现金流净额:本期发生额第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7732998728752136:72206529.17:84:2 +当期第四季度经营活动现金流净额:本期发生额第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7732998728752136:96403230.58:83:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8110312819480896:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8110312819480896:137243172.01:83:2 +当期第四季度经营活动现金流净额:2023年全年第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7785190343856812:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年全年第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7785190343856812:137243172.01:83:2 +当期第四季度经营活动现金流净额:2023年金额第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8189374208450317:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年金额第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8189374208450317:137243172.01:83:2 +当期第四季度经营活动现金流净额:第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7464290261268616:103460734.18:84:2 +当期第四季度经营活动现金流净额:第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7464290261268616:137243172.01:83:2 +当期第四季度经营活动现金流净额:10-12月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7557798027992249:72206529.17:84:2 +当期第四季度经营活动现金流净额:10-12月经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7557798027992249:96403230.58:83:2 +当期第四季度经营活动现金流净额:第四季度(10-12月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7422123551368713:72206529.17:84:2 +当期第四季度经营活动现金流净额:第四季度(10-12月)经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7422123551368713:96403230.58:83:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8110312819480896:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8110312819480896:137243172.01:83:2 +当期第四季度经营活动现金流净额:当期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6902490258216858:72206529.17:84:2 +当期第四季度经营活动现金流净额:当期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6902490258216858:96403230.58:83:2 +当期第四季度经营活动现金流净额:本期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6819332242012024:103460734.18:84:2 +当期第四季度经营活动现金流净额:本期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6819332242012024:137243172.01:83:2 +当期第四季度经营活动现金流净额:本报告期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6625370979309082:103460734.18:84:2 +当期第四季度经营活动现金流净额:本报告期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6625370979309082:137243172.01:83:2 +当期第四季度经营活动现金流净额:报告期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6702380776405334:103460734.18:84:2 +当期第四季度经营活动现金流净额:报告期第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6702380776405334:137243172.01:83:2 +当期第四季度经营活动现金流净额:报告期内第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6463814973831177:103460734.18:84:2 +当期第四季度经营活动现金流净额:报告期内第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6463814973831177:137243172.01:83:2 +当期第四季度经营活动现金流净额:本年度第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6847479343414307:103460734.18:84:2 +当期第四季度经营活动现金流净额:本年度第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6847479343414307:137243172.01:83:2 +当期第四季度经营活动现金流净额:本期发生额第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7208194136619568:72206529.17:84:2 +当期第四季度经营活动现金流净额:本期发生额第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7208194136619568:96403230.58:83:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7621285319328308:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7621285319328308:137243172.01:83:2 +当期第四季度经营活动现金流净额:2023年全年第四季度经营活动现金净流量:持续经营净利润2023年度:0.7586382627487183:153819180.44:82:1 +当期第四季度经营活动现金流净额:2023年全年第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7290136814117432:137243172.01:83:2 +当期第四季度经营活动现金流净额:2023年金额第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7775333523750305:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年金额第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7775333523750305:137243172.01:83:2 +当期第四季度经营活动现金流净额:第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6888599991798401:103460734.18:84:2 +当期第四季度经营活动现金流净额:第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6888599991798401:137243172.01:83:2 +当期第四季度经营活动现金流净额:10-12月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6784265637397766:72206529.17:84:2 +当期第四季度经营活动现金流净额:10-12月经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6784265637397766:96403230.58:83:2 +当期第四季度经营活动现金流净额:第四季度(10-12月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6929306983947754:72206529.17:84:2 +当期第四季度经营活动现金流净额:第四季度(10-12月)经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6929306983947754:96403230.58:83:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7621285319328308:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年第四季度经营活动现金净流量:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7621285319328308:137243172.01:83:2 +当期第四季度经营活动现金流净额:当期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6607277989387512:72206529.17:84:2 +当期第四季度经营活动现金流净额:当期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6607277989387512:96403230.58:83:2 +当期第四季度经营活动现金流净额:本期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6587761044502258:103460734.18:84:2 +当期第四季度经营活动现金流净额:本期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6587761044502258:137243172.01:83:2 +当期第四季度经营活动现金流净额:本报告期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.643967866897583:103460734.18:84:2 +当期第四季度经营活动现金流净额:本报告期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.643967866897583:137243172.01:83:2 +当期第四季度经营活动现金流净额:报告期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6486228704452515:103460734.18:84:2 +当期第四季度经营活动现金流净额:报告期第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6486228704452515:137243172.01:83:2 +当期第四季度经营活动现金流净额:报告期内第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6284465193748474:103460734.18:84:2 +当期第四季度经营活动现金流净额:报告期内第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6284465193748474:137243172.01:83:2 +当期第四季度经营活动现金流净额:本年度第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6576710343360901:103460734.18:84:2 +当期第四季度经营活动现金流净额:本年度第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6576710343360901:137243172.01:83:2 +当期第四季度经营活动现金流净额:本期发生额第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.706596314907074:72206529.17:84:2 +当期第四季度经营活动现金流净额:本期发生额第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.706596314907074:96403230.58:83:2 +当期第四季度经营活动现金流净额:2023年第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7337139844894409:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7337139844894409:137243172.01:83:2 +当期第四季度经营活动现金流净额:2023年全年第四季度经营性活动现金流:持续经营净利润2023年度:0.7082571983337402:153819180.44:82:1 +当期第四季度经营活动现金流净额:2023年全年第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7053039073944092:137243172.01:83:2 +当期第四季度经营活动现金流净额:2023年金额第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7538027167320251:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年金额第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7538027167320251:137243172.01:83:2 +当期第四季度经营活动现金流净额:第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6572646498680115:103460734.18:84:2 +当期第四季度经营活动现金流净额:第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6572646498680115:137243172.01:83:2 +当期第四季度经营活动现金流净额:10-12月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6494277715682983:72206529.17:84:2 +当期第四季度经营活动现金流净额:10-12月经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6494277715682983:96403230.58:83:2 +当期第四季度经营活动现金流净额:第四季度(10-12月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6597775220870972:72206529.17:84:2 +当期第四季度经营活动现金流净额:第四季度(10-12月)经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6597775220870972:96403230.58:83:2 +当期第四季度经营活动现金流净额:2023年第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7337139844894409:103460734.18:84:2 +当期第四季度经营活动现金流净额:2023年第四季度经营性活动现金流:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7337139844894409:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8243131041526794:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8243131041526794:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8082700371742249:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8082700371742249:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比上升:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7919213771820068:72206529.17:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比上升:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7919213771820068:96403230.58:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比下降:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.769437313079834:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额同比下降:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.769437313079834:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额变化幅度:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8205978274345398:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额变化幅度:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8205978274345398:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额变动比例:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7852696180343628:72206529.17:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额变动比例:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7852696180343628:96403230.58:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额本期比上年同期增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8378245830535889:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额本期比上年同期增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8378245830535889:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8377158045768738:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动产生的现金流量净额本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.8377158045768738:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动现金净流量同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7817670702934265:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动现金净流量同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7817670702934265:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动现金净流量同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7672666311264038:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动现金净流量同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7672666311264038:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动现金净流量同比上升:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7482216954231262:72206529.17:84:2 +经营活动现金流净额同比变动:经营活动现金净流量同比上升:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7482216954231262:96403230.58:83:2 +经营活动现金流净额同比变动:经营活动现金净流量同比下降:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7253959774971008:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动现金净流量同比下降:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7253959774971008:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动现金净流量变化幅度:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7694886922836304:72206529.17:84:2 +经营活动现金流净额同比变动:经营活动现金净流量变化幅度:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7694886922836304:96403230.58:83:2 +经营活动现金流净额同比变动:经营活动现金净流量变动比例:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7335890531539917:72206529.17:84:2 +经营活动现金流净额同比变动:经营活动现金净流量变动比例:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7335890531539917:96403230.58:83:2 +经营活动现金流净额同比变动:经营活动现金净流量本期比上年同期增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7817979454994202:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动现金净流量本期比上年同期增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7817979454994202:137243172.01:83:2 +经营活动现金流净额同比变动:经营活动现金净流量本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7900387048721313:103460734.18:84:2 +经营活动现金流净额同比变动:经营活动现金净流量本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7900387048721313:137243172.01:83:2 +经营活动现金流净额同比变动:经营性活动现金流同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7279603481292725:103460734.18:84:2 +经营活动现金流净额同比变动:经营性活动现金流同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7279603481292725:137243172.01:83:2 +经营活动现金流净额同比变动:经营性活动现金流同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7100152373313904:72206529.17:84:2 +经营活动现金流净额同比变动:经营性活动现金流同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7100152373313904:96403230.58:83:2 +经营活动现金流净额同比变动:经营性活动现金流同比上升:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6903976202011108:1266437216.92:84:2 +经营活动现金流净额同比变动:经营性活动现金流同比上升:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6903976202011108:1809494459.14:83:2 +经营活动现金流净额同比变动:经营性活动现金流同比下降:经营活动现金流出小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6739140748977661:1194230687.75:84:2 +经营活动现金流净额同比变动:经营性活动现金流同比下降:经营活动现金流出小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6737958788871765:1440744149.92:83:2 +经营活动现金流净额同比变动:经营性活动现金流变化幅度:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7015219926834106:1266437216.92:84:2 +经营活动现金流净额同比变动:经营性活动现金流变化幅度:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7015219926834106:1809494459.14:83:2 +经营活动现金流净额同比变动:经营性活动现金流变动比例:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6808460354804993:1266437216.92:84:2 +经营活动现金流净额同比变动:经营性活动现金流变动比例:经营活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6808460354804993:1809494459.14:83:2 +经营活动现金流净额同比变动:经营性活动现金流本期比上年同期增减:经营性应付项目的增加补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.731671154499054:73651944.24:168:2 +经营活动现金流净额同比变动:经营性活动现金流本期比上年同期增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7264462113380432:103460734.18:84:2 +经营活动现金流净额同比变动:经营性活动现金流本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7358051538467407:72206529.17:84:2 +经营活动现金流净额同比变动:经营性活动现金流本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7358051538467407:96403230.58:83:2 +当期筹资活动现金流净额:当期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7134994268417358:72206529.17:84:2 +当期筹资活动现金流净额:当期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7134994268417358:96403230.58:83:2 +当期筹资活动现金流净额:本期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7072893381118774:72206529.17:84:2 +当期筹资活动现金流净额:本期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7072893381118774:96403230.58:83:2 +当期筹资活动现金流净额:本报告期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7070844769477844:103460734.18:84:2 +当期筹资活动现金流净额:本报告期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7070844769477844:137243172.01:83:2 +当期筹资活动现金流净额:报告期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7032897472381592:72206529.17:84:2 +当期筹资活动现金流净额:报告期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7032897472381592:96403230.58:83:2 +当期筹资活动现金流净额:报告期内筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6799458861351013:103460734.18:84:2 +当期筹资活动现金流净额:报告期内筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6799458861351013:137243172.01:83:2 +当期筹资活动现金流净额:本年度筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.716513991355896:103460734.18:84:2 +当期筹资活动现金流净额:本年度筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.716513991355896:137243172.01:83:2 +当期筹资活动现金流净额:本期发生额筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7209375500679016:72206529.17:84:2 +当期筹资活动现金流净额:本期发生额筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7209375500679016:96403230.58:83:2 +当期筹资活动现金流净额:2023年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7210845947265625:103460734.18:84:2 +当期筹资活动现金流净额:2023年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7210845947265625:137243172.01:83:2 +当期筹资活动现金流净额:2023年全年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7033896446228027:103460734.18:84:2 +当期筹资活动现金流净额:2023年全年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7033896446228027:137243172.01:83:2 +当期筹资活动现金流净额:2023年金额筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7230772972106934:103460734.18:84:2 +当期筹资活动现金流净额:2023年金额筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7230772972106934:137243172.01:83:2 +当期筹资活动现金流净额:当期筹资活动现金净流量:收到其他与投资活动有关的现金本期增加金额:0.6469791531562805:23000000.00:167:2 +当期筹资活动现金流净额:当期筹资活动现金净流量:支付其他与投资活动有关的现金本期增加金额:0.6466296315193176:23000000.00:167:2 +当期筹资活动现金流净额:本期筹资活动现金净流量:收到其他与投资活动有关的现金本期增加金额:0.6268237233161926:23000000.00:167:2 +当期筹资活动现金流净额:本期筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6235358119010925:877120845.62:168:2 +当期筹资活动现金流净额:本报告期筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6443918943405151:877120845.62:168:2 +当期筹资活动现金流净额:本报告期筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.6420029997825623:58749188.40:168:2 +当期筹资活动现金流净额:报告期筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6374691128730774:877120845.62:168:2 +当期筹资活动现金流净额:报告期筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6309181451797485:17356324.23:83:2 +当期筹资活动现金流净额:报告期内筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6169821619987488:877120845.62:168:2 +当期筹资活动现金流净额:报告期内筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.612309992313385:58749188.40:168:2 +当期筹资活动现金流净额:本年度筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6301690936088562:877120845.62:168:2 +当期筹资活动现金流净额:本年度筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.6281577944755554:58749188.40:168:2 +当期筹资活动现金流净额:本期发生额筹资活动现金净流量:收到其他与投资活动有关的现金本期增加金额:0.6777949929237366:23000000.00:167:2 +当期筹资活动现金流净额:本期发生额筹资活动现金净流量:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.675747275352478:877120845.62:168:2 +当期筹资活动现金流净额:2023年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6524487733840942:17356324.23:83:2 +当期筹资活动现金流净额:2023年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6524487733840942:9224707.73:83:2 +当期筹资活动现金流净额:2023年全年筹资活动现金净流量:持续经营净利润2023年度:0.6549877524375916:153819180.44:82:1 +当期筹资活动现金流净额:2023年全年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.63190096616745:9224707.73:83:2 +当期筹资活动现金流净额:2023年金额筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6745457649230957:17356324.23:83:2 +当期筹资活动现金流净额:2023年金额筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6745457649230957:9224707.73:83:2 +当期筹资活动现金流净额:当期筹资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6356825232505798:23000000.00:167:2 +当期筹资活动现金流净额:当期筹资性活动现金流:收到其他与投资活动有关的现金本期增加金额:0.628440797328949:23000000.00:167:2 +当期筹资活动现金流净额:本期筹资性活动现金流:捐赠支出本期发生额:0.6174135208129883:100000.00:164:2 +当期筹资活动现金流净额:本期筹资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6155363917350769:23000000.00:167:2 +当期筹资活动现金流净额:本报告期筹资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6152085065841675:23000000.00:167:2 +当期筹资活动现金流净额:本报告期筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6090860366821289:17356324.23:83:2 +当期筹资活动现金流净额:报告期筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6028099656105042:17356324.23:83:2 +当期筹资活动现金流净额:报告期筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6028099656105042:9224707.73:83:2 +当期筹资活动现金流净额:报告期内筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5991261005401611:17356324.23:83:2 +当期筹资活动现金流净额:报告期内筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5991261005401611:9224707.73:83:2 +当期筹资活动现金流净额:本年度筹资性活动现金流:捐赠支出本期发生额:0.6303250193595886:100000.00:164:2 +当期筹资活动现金流净额:本年度筹资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.5999639630317688:23000000.00:167:2 +当期筹资活动现金流净额:本期发生额筹资性活动现金流:收到其他与投资活动有关的现金本期增加金额:0.690146267414093:23000000.00:167:2 +当期筹资活动现金流净额:本期发生额筹资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6833252310752869:23000000.00:167:2 +当期筹资活动现金流净额:2023年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.612002432346344:17356324.23:83:2 +当期筹资活动现金流净额:2023年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.612002432346344:9224707.73:83:2 +当期筹资活动现金流净额:2023年全年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6005733013153076:17356324.23:83:2 +当期筹资活动现金流净额:2023年全年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6005733013153076:9224707.73:83:2 +当期筹资活动现金流净额:2023年金额筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.638752818107605:17356324.23:83:2 +当期筹资活动现金流净额:2023年金额筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.638752818107605:9224707.73:83:2 +上年同期筹资活动现金流净额:上年同期筹资活动产生的现金流量净额:收到其他与投资活动有关的现金上年同期增加金额:0.6928414702415466:93400000.00:167:2 +上年同期筹资活动现金流净额:上年同期筹资活动产生的现金流量净额:支付其他与投资活动有关的现金上年同期增加金额:0.6876144409179688:93400000.00:167:2 +上年同期筹资活动现金流净额:上期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6818708181381226:72206529.17:84:2 +上年同期筹资活动现金流净额:上期筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6818708181381226:96403230.58:83:2 +上年同期筹资活动现金流净额:上年度筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6755340099334717:103460734.18:84:2 +上年同期筹资活动现金流净额:上年度筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6755340099334717:137243172.01:83:2 +上年同期筹资活动现金流净额:2022年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7341418266296387:103460734.18:84:2 +上年同期筹资活动现金流净额:2022年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7341418266296387:137243172.01:83:2 +上年同期筹资活动现金流净额:2022年全年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7134503126144409:103460734.18:84:2 +上年同期筹资活动现金流净额:2022年全年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7134503126144409:137243172.01:83:2 +上年同期筹资活动现金流净额:2022年金额筹资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7337448596954346:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年金额筹资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7337448596954346:9224707.73:83:2 +上年同期筹资活动现金流净额:上年同期筹资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.6493481993675232:93400000.00:167:2 +上年同期筹资活动现金流净额:上年同期筹资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.6468276381492615:93400000.00:167:2 +上年同期筹资活动现金流净额:上期筹资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.6177698373794556:93400000.00:167:2 +上年同期筹资活动现金流净额:上期筹资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.6176666021347046:93400000.00:167:2 +上年同期筹资活动现金流净额:上年度筹资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.6173229813575745:93400000.00:167:2 +上年同期筹资活动现金流净额:上年度筹资活动现金净流量:捐赠支出上期发生额:0.6165221333503723:100000.00:164:2 +上年同期筹资活动现金流净额:2022年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6812108755111694:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6812108755111694:9224707.73:83:2 +上年同期筹资活动现金流净额:2022年全年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.656927227973938:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年全年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.656927227973938:9224707.73:83:2 +上年同期筹资活动现金流净额:2022年金额筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6972696781158447:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年金额筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6972696781158447:9224707.73:83:2 +上年同期筹资活动现金流净额:上年同期筹资性活动现金流:支付其他与投资活动有关的现金上年同期增加金额:0.6455070972442627:93400000.00:167:2 +上年同期筹资活动现金流净额:上年同期筹资性活动现金流:收到其他与投资活动有关的现金上年同期增加金额:0.6424838304519653:93400000.00:167:2 +上年同期筹资活动现金流净额:上期筹资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6146412491798401:23000000.00:167:2 +上年同期筹资活动现金流净额:上期筹资性活动现金流:收到其他与投资活动有关的现金本期增加金额:0.6076006293296814:23000000.00:167:2 +上年同期筹资活动现金流净额:上年度筹资性活动现金流:收到其他与投资活动有关的现金上年同期增加金额:0.6153243780136108:93400000.00:167:2 +上年同期筹资活动现金流净额:上年度筹资性活动现金流:捐赠支出上期发生额:0.6150528788566589:100000.00:164:2 +上年同期筹资活动现金流净额:2022年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6429991722106934:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6429991722106934:9224707.73:83:2 +上年同期筹资活动现金流净额:2022年全年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6264861822128296:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年全年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6264861822128296:9224707.73:83:2 +上年同期筹资活动现金流净额:2022年金额筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.653853178024292:17356324.23:83:2 +上年同期筹资活动现金流净额:2022年金额筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.653853178024292:9224707.73:83:2 +前年同期筹资活动现金流净额:前年同期筹资活动产生的现金流量净额:收到其他与投资活动有关的现金上年同期增加金额:0.6748863458633423:93400000.00:167:2 +前年同期筹资活动现金流净额:前年同期筹资活动产生的现金流量净额:支付其他与投资活动有关的现金上年同期增加金额:0.666386067867279:93400000.00:167:2 +前年同期筹资活动现金流净额:2021年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6863301992416382:72206529.17:84:2 +前年同期筹资活动现金流净额:2021年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6863301992416382:96403230.58:83:2 +前年同期筹资活动现金流净额:2021年全年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.677590012550354:72206529.17:84:2 +前年同期筹资活动现金流净额:2021年全年筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.677590012550354:96403230.58:83:2 +前年同期筹资活动现金流净额:2021年金额筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6813347935676575:72206529.17:84:2 +前年同期筹资活动现金流净额:2021年金额筹资活动产生的现金流量净额:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6813347935676575:96403230.58:83:2 +前年同期筹资活动现金流净额:前年同期筹资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.6255922317504883:93400000.00:167:2 +前年同期筹资活动现金流净额:前年同期筹资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.6243862509727478:93400000.00:167:2 +前年同期筹资活动现金流净额:2021年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6259444952011108:17356324.23:83:2 +前年同期筹资活动现金流净额:2021年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6259444952011108:9224707.73:83:2 +前年同期筹资活动现金流净额:2021年全年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6122364401817322:17356324.23:83:2 +前年同期筹资活动现金流净额:2021年全年筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6122364401817322:9224707.73:83:2 +前年同期筹资活动现金流净额:2021年金额筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6396418809890747:17356324.23:83:2 +前年同期筹资活动现金流净额:2021年金额筹资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6396418809890747:9224707.73:83:2 +前年同期筹资活动现金流净额:前年同期筹资性活动现金流:收到其他与投资活动有关的现金上年同期增加金额:0.6188945770263672:93400000.00:167:2 +前年同期筹资活动现金流净额:前年同期筹资性活动现金流:支付其他与投资活动有关的现金上年同期增加金额:0.6183110475540161:93400000.00:167:2 +前年同期筹资活动现金流净额:2021年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5884088277816772:17356324.23:83:2 +前年同期筹资活动现金流净额:2021年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5884088277816772:9224707.73:83:2 +前年同期筹资活动现金流净额:2021年全年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5779449939727783:17356324.23:83:2 +前年同期筹资活动现金流净额:2021年全年筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5779449939727783:9224707.73:83:2 +前年同期筹资活动现金流净额:2021年金额筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6082034111022949:17356324.23:83:2 +前年同期筹资活动现金流净额:2021年金额筹资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6082034111022949:9224707.73:83:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6862221956253052:103460734.18:84:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比变动:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6862221956253052:137243172.01:83:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6707387566566467:103460734.18:84:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6707387566566467:137243172.01:83:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比上升:收到其他与投资活动有关的现金上年同期增加金额:0.6482082009315491:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比上升:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6452349424362183:72206529.17:84:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比下降:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6396295428276062:103460734.18:84:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额同比下降:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6396295428276062:137243172.01:83:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额变化幅度:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6814216375350952:72206529.17:84:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额变化幅度:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6814216375350952:96403230.58:83:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额变动比例:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6638022661209106:72206529.17:84:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额变动比例:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.6638022661209106:96403230.58:83:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额本期比上年同期增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.7166196703910828:877120845.62:168:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额本期比上年同期增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.7091936469078064:58749188.40:168:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额本年比上年增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.7085593938827515:877120845.62:168:2 +筹资活动现金流净额同比变动:筹资活动产生的现金流量净额本年比上年增减:经营活动产生的现金流量净额项目附注2023年度2022年度一、经营活动产生的现金流量::0.7028395533561707:103460734.18:84:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6351475715637207:17356324.23:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6351475715637207:9224707.73:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6299943923950195:877120845.62:168:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比增减:收到其他与投资活动有关的现金本期增加金额:0.6266226172447205:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比上升:收到其他与投资活动有关的现金本期增加金额:0.6140739321708679:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比上升:收到其他与投资活动有关的现金上年同期增加金额:0.6112463474273682:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比下降:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5954445004463196:17356324.23:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量同比下降:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.5954445004463196:9224707.73:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量变化幅度:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6405988931655884:17356324.23:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量变化幅度:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6405988931655884:9224707.73:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量变动比例:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6208592057228088:877120845.62:168:2 +筹资活动现金流净额同比变动:筹资活动现金净流量变动比例:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6163809299468994:17356324.23:83:2 +筹资活动现金流净额同比变动:筹资活动现金净流量本期比上年同期增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6750417947769165:877120845.62:168:2 +筹资活动现金流净额同比变动:筹资活动现金净流量本期比上年同期增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.6731933951377869:58749188.40:168:2 +筹资活动现金流净额同比变动:筹资活动现金净流量本年比上年增减:现金及现金等价物净增加额补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.6686350107192993:877120845.62:168:2 +筹资活动现金流净额同比变动:筹资活动现金净流量本年比上年增减:收到其他与投资活动有关的现金上年同期增加金额:0.6615862846374512:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比变动:收到其他与投资活动有关的现金上年同期增加金额:0.639898419380188:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比变动:收到其他与投资活动有关的现金本期增加金额:0.6351804137229919:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比增减:收到其他与投资活动有关的现金本期增加金额:0.6459431052207947:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比增减:收到其他与投资活动有关的现金上年同期增加金额:0.641255259513855:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比上升:收到其他与投资活动有关的现金本期增加金额:0.6208968758583069:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比上升:收到其他与投资活动有关的现金上年同期增加金额:0.6145533323287964:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比下降:收到其他与投资活动有关的现金上年同期增加金额:0.5972611904144287:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流同比下降:收到其他与投资活动有关的现金本期增加金额:0.5969285368919373:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流变化幅度:收到其他与投资活动有关的现金本期增加金额:0.6090983748435974:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流变化幅度:支付其他与投资活动有关的现金本期增加金额:0.5942316651344299:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流变动比例:收到其他与投资活动有关的现金本期增加金额:0.6191003918647766:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流变动比例:支付其他与投资活动有关的现金本期增加金额:0.6178688406944275:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流本期比上年同期增减:收到其他与投资活动有关的现金本期增加金额:0.672512948513031:23000000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流本期比上年同期增减:收到其他与投资活动有关的现金上年同期增加金额:0.6616216897964478:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流本年比上年增减:收到其他与投资活动有关的现金上年同期增加金额:0.6720849275588989:93400000.00:167:2 +筹资活动现金流净额同比变动:筹资性活动现金流本年比上年增减:收到其他与投资活动有关的现金本期增加金额:0.6588045954704285:23000000.00:167:2 +当期投资活动现金流净额:当期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7645931243896484:17356324.23:83:2 +当期投资活动现金流净额:当期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7645931243896484:9224707.73:83:2 +当期投资活动现金流净额:本期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7680643796920776:17356324.23:83:2 +当期投资活动现金流净额:本期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7680643796920776:9224707.73:83:2 +当期投资活动现金流净额:本报告期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7569208741188049:17356324.23:83:2 +当期投资活动现金流净额:本报告期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7569208741188049:9224707.73:83:2 +当期投资活动现金流净额:报告期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7559165954589844:17356324.23:83:2 +当期投资活动现金流净额:报告期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7559165954589844:9224707.73:83:2 +当期投资活动现金流净额:报告期内投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7341994643211365:17356324.23:83:2 +当期投资活动现金流净额:报告期内投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7341994643211365:9224707.73:83:2 +当期投资活动现金流净额:本年度投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7626076936721802:17356324.23:83:2 +当期投资活动现金流净额:本年度投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7626076936721802:9224707.73:83:2 +当期投资活动现金流净额:本期发生额投资活动产生的现金流量净额:收到其他与投资活动有关的现金本期增加金额:0.7655451893806458:23000000.00:167:2 +当期投资活动现金流净额:本期发生额投资活动产生的现金流量净额:取得投资收益收到的现金项目附注2023年度2022年度一、经营活动产生的现金流量::0.7580834627151489:30000000.00:84:2 +当期投资活动现金流净额:2023年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.794794499874115:17356324.23:83:2 +当期投资活动现金流净额:2023年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.794794499874115:9224707.73:83:2 +当期投资活动现金流净额:2023年全年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7628719806671143:17356324.23:83:2 +当期投资活动现金流净额:2023年全年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7628719806671143:9224707.73:83:2 +当期投资活动现金流净额:2023年金额投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7876217365264893:17356324.23:83:2 +当期投资活动现金流净额:2023年金额投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7876217365264893:9224707.73:83:2 +当期投资活动现金流净额:当期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7224342823028564:17356324.23:83:2 +当期投资活动现金流净额:当期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7224342823028564:9224707.73:83:2 +当期投资活动现金流净额:本期投资活动现金净流量:收到其他与投资活动有关的现金本期增加金额:0.7119739651679993:23000000.00:167:2 +当期投资活动现金流净额:本期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7088167667388916:17356324.23:83:2 +当期投资活动现金流净额:本报告期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7211778163909912:17356324.23:83:2 +当期投资活动现金流净额:本报告期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7211778163909912:9224707.73:83:2 +当期投资活动现金流净额:报告期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7170063853263855:17356324.23:83:2 +当期投资活动现金流净额:报告期投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7170063853263855:9224707.73:83:2 +当期投资活动现金流净额:报告期内投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6926631927490234:17356324.23:83:2 +当期投资活动现金流净额:报告期内投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6926631927490234:9224707.73:83:2 +当期投资活动现金流净额:本年度投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.714650571346283:17356324.23:83:2 +当期投资活动现金流净额:本年度投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.714650571346283:9224707.73:83:2 +当期投资活动现金流净额:本期发生额投资活动现金净流量:收到其他与投资活动有关的现金本期增加金额:0.752701461315155:23000000.00:167:2 +当期投资活动现金流净额:本期发生额投资活动现金净流量:支付其他与投资活动有关的现金本期增加金额:0.7351470589637756:23000000.00:167:2 +当期投资活动现金流净额:2023年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7435398101806641:17356324.23:83:2 +当期投资活动现金流净额:2023年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7435398101806641:9224707.73:83:2 +当期投资活动现金流净额:2023年全年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7134151458740234:17356324.23:83:2 +当期投资活动现金流净额:2023年全年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7134151458740234:9224707.73:83:2 +当期投资活动现金流净额:2023年金额投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7503656148910522:17356324.23:83:2 +当期投资活动现金流净额:2023年金额投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7503656148910522:9224707.73:83:2 +当期投资活动现金流净额:当期投资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6976973414421082:23000000.00:167:2 +当期投资活动现金流净额:当期投资性活动现金流:收到其他与投资活动有关的现金本期增加金额:0.6931183338165283:23000000.00:167:2 +当期投资活动现金流净额:本期投资性活动现金流:收到其他与投资活动有关的现金本期增加金额:0.7099927067756653:23000000.00:167:2 +当期投资活动现金流净额:本期投资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.7085216045379639:23000000.00:167:2 +当期投资活动现金流净额:本报告期投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7096385955810547:17356324.23:83:2 +当期投资活动现金流净额:本报告期投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7096385955810547:9224707.73:83:2 +当期投资活动现金流净额:报告期投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6931438446044922:17356324.23:83:2 +当期投资活动现金流净额:报告期投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6931438446044922:9224707.73:83:2 +当期投资活动现金流净额:报告期内投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6907038688659668:17356324.23:83:2 +当期投资活动现金流净额:报告期内投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6907038688659668:9224707.73:83:2 +当期投资活动现金流净额:本年度投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7074317932128906:17356324.23:83:2 +当期投资活动现金流净额:本年度投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7074317932128906:9224707.73:83:2 +当期投资活动现金流净额:本期发生额投资性活动现金流:收到其他与投资活动有关的现金本期增加金额:0.7681307792663574:23000000.00:167:2 +当期投资活动现金流净额:本期发生额投资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.7632301449775696:23000000.00:167:2 +当期投资活动现金流净额:2023年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7331262826919556:17356324.23:83:2 +当期投资活动现金流净额:2023年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7331262826919556:9224707.73:83:2 +当期投资活动现金流净额:2023年全年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7087669372558594:17356324.23:83:2 +当期投资活动现金流净额:2023年全年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7087669372558594:9224707.73:83:2 +当期投资活动现金流净额:2023年金额投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7443609833717346:17356324.23:83:2 +当期投资活动现金流净额:2023年金额投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7443609833717346:9224707.73:83:2 +上年同期投资活动现金流净额:上年同期投资活动产生的现金流量净额:收到其他与投资活动有关的现金上年同期增加金额:0.7801203727722168:93400000.00:167:2 +上年同期投资活动现金流净额:上年同期投资活动产生的现金流量净额:支付其他与投资活动有关的现金上年同期增加金额:0.7695399522781372:93400000.00:167:2 +上年同期投资活动现金流净额:上期投资活动产生的现金流量净额:收到其他与投资活动有关的现金上年同期增加金额:0.7557996511459351:93400000.00:167:2 +上年同期投资活动现金流净额:上期投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7457217574119568:17356324.23:83:2 +上年同期投资活动现金流净额:上年度投资活动产生的现金流量净额:收到其他与投资活动有关的现金上年同期增加金额:0.7564236521720886:93400000.00:167:2 +上年同期投资活动现金流净额:上年度投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7454832792282104:17356324.23:83:2 +上年同期投资活动现金流净额:2022年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.8167271614074707:17356324.23:83:2 +上年同期投资活动现金流净额:2022年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.8167271614074707:9224707.73:83:2 +上年同期投资活动现金流净额:2022年全年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7857856750488281:17356324.23:83:2 +上年同期投资活动现金流净额:2022年全年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7857856750488281:9224707.73:83:2 +上年同期投资活动现金流净额:2022年金额投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.8061516284942627:17356324.23:83:2 +上年同期投资活动现金流净额:2022年金额投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.8061516284942627:9224707.73:83:2 +上年同期投资活动现金流净额:上年同期投资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.7404148578643799:93400000.00:167:2 +上年同期投资活动现金流净额:上年同期投资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.7363752126693726:93400000.00:167:2 +上年同期投资活动现金流净额:上期投资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.7034775614738464:93400000.00:167:2 +上年同期投资活动现金流净额:上期投资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.6970949172973633:93400000.00:167:2 +上年同期投资活动现金流净额:上年度投资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.7125698328018188:93400000.00:167:2 +上年同期投资活动现金流净额:上年度投资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.7008534073829651:93400000.00:167:2 +上年同期投资活动现金流净额:2022年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7683202028274536:17356324.23:83:2 +上年同期投资活动现金流净额:2022年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7683202028274536:9224707.73:83:2 +上年同期投资活动现金流净额:2022年全年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7358429431915283:17356324.23:83:2 +上年同期投资活动现金流净额:2022年全年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7358429431915283:9224707.73:83:2 +上年同期投资活动现金流净额:2022年金额投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7694318294525146:17356324.23:83:2 +上年同期投资活动现金流净额:2022年金额投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7694318294525146:9224707.73:83:2 +上年同期投资活动现金流净额:上年同期投资性活动现金流:支付其他与投资活动有关的现金上年同期增加金额:0.7458711862564087:93400000.00:167:2 +上年同期投资活动现金流净额:上年同期投资性活动现金流:收到其他与投资活动有关的现金上年同期增加金额:0.7415148019790649:93400000.00:167:2 +上年同期投资活动现金流净额:上期投资性活动现金流:支付其他与投资活动有关的现金本期增加金额:0.6945338845252991:23000000.00:167:2 +上年同期投资活动现金流净额:上期投资性活动现金流:支付其他与投资活动有关的现金上年同期增加金额:0.691474974155426:93400000.00:167:2 +上年同期投资活动现金流净额:上年度投资性活动现金流:收到其他与投资活动有关的现金上年同期增加金额:0.714279055595398:93400000.00:167:2 +上年同期投资活动现金流净额:上年度投资性活动现金流:支付其他与投资活动有关的现金上年同期增加金额:0.7097010612487793:93400000.00:167:2 +上年同期投资活动现金流净额:2022年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7611790895462036:17356324.23:83:2 +上年同期投资活动现金流净额:2022年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7611790895462036:9224707.73:83:2 +上年同期投资活动现金流净额:2022年全年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7342512011528015:17356324.23:83:2 +上年同期投资活动现金流净额:2022年全年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7342512011528015:9224707.73:83:2 +上年同期投资活动现金流净额:2022年金额投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7638453245162964:17356324.23:83:2 +上年同期投资活动现金流净额:2022年金额投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7638453245162964:9224707.73:83:2 +前年同期投资活动现金流净额:前年同期投资活动产生的现金流量净额:收到其他与投资活动有关的现金上年同期增加金额:0.7635918855667114:93400000.00:167:2 +前年同期投资活动现金流净额:前年同期投资活动产生的现金流量净额:支付其他与投资活动有关的现金上年同期增加金额:0.7500888705253601:93400000.00:167:2 +前年同期投资活动现金流净额:2021年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7586477398872375:17356324.23:83:2 +前年同期投资活动现金流净额:2021年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7586477398872375:9224707.73:83:2 +前年同期投资活动现金流净额:2021年全年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7367861270904541:17356324.23:83:2 +前年同期投资活动现金流净额:2021年全年投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7367861270904541:9224707.73:83:2 +前年同期投资活动现金流净额:2021年金额投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7464069128036499:17356324.23:83:2 +前年同期投资活动现金流净额:2021年金额投资活动产生的现金流量净额:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7464069128036499:9224707.73:83:2 +前年同期投资活动现金流净额:前年同期投资活动现金净流量:收到其他与投资活动有关的现金上年同期增加金额:0.7140518426895142:93400000.00:167:2 +前年同期投资活动现金流净额:前年同期投资活动现金净流量:支付其他与投资活动有关的现金上年同期增加金额:0.7078875303268433:93400000.00:167:2 +前年同期投资活动现金流净额:2021年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7057977318763733:17356324.23:83:2 +前年同期投资活动现金流净额:2021年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7057977318763733:9224707.73:83:2 +前年同期投资活动现金流净额:2021年全年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6842389106750488:17356324.23:83:2 +前年同期投资活动现金流净额:2021年全年投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6842389106750488:9224707.73:83:2 +前年同期投资活动现金流净额:2021年金额投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7035008668899536:17356324.23:83:2 +前年同期投资活动现金流净额:2021年金额投资活动现金净流量:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7035008668899536:9224707.73:83:2 +前年同期投资活动现金流净额:前年同期投资性活动现金流:支付其他与投资活动有关的现金上年同期增加金额:0.7145386338233948:93400000.00:167:2 +前年同期投资活动现金流净额:前年同期投资性活动现金流:收到其他与投资活动有关的现金上年同期增加金额:0.7126213312149048:93400000.00:167:2 +前年同期投资活动现金流净额:2021年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6938494443893433:17356324.23:83:2 +前年同期投资活动现金流净额:2021年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6938494443893433:9224707.73:83:2 +前年同期投资活动现金流净额:2021年全年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6768910884857178:17356324.23:83:2 +前年同期投资活动现金流净额:2021年全年投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.6768910884857178:9224707.73:83:2 +前年同期投资活动现金流净额:2021年金额投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7020545601844788:17356324.23:83:2 +前年同期投资活动现金流净额:2021年金额投资性活动现金流:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7020545601844788:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7723762392997742:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7723762392997742:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比增减:收到其他与投资活动有关的现金上年同期增加金额:0.7746255397796631:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比增减:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7634896039962769:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比上升:收到其他与投资活动有关的现金上年同期增加金额:0.7634437084197998:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比上升:收到其他与投资活动有关的现金本期增加金额:0.7475484013557434:23000000.00:167:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比下降:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7450748682022095:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额同比下降:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7450748682022095:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额变化幅度:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7583867311477661:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额变化幅度:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7583867311477661:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额变动比例:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.730800986289978:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额变动比例:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.730800986289978:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额本期比上年同期增减:收到其他与投资活动有关的现金上年同期增加金额:0.7897047996520996:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额本期比上年同期增减:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7835431098937988:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额本年比上年增减:收到其他与投资活动有关的现金上年同期增加金额:0.7998234629631042:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动产生的现金流量净额本年比上年增减:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.778876781463623:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动现金净流量同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.744168758392334:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动现金净流量同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.744168758392334:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动现金净流量同比增减:收到其他与投资活动有关的现金上年同期增加金额:0.7422252893447876:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量同比增减:收到其他与投资活动有关的现金本期增加金额:0.7307281494140625:23000000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量同比上升:收到其他与投资活动有关的现金上年同期增加金额:0.7246070504188538:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量同比上升:收到其他与投资活动有关的现金本期增加金额:0.7158752083778381:23000000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量同比下降:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7102575302124023:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动现金净流量同比下降:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7102575302124023:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动现金净流量变化幅度:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7284985184669495:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动现金净流量变化幅度:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7284985184669495:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动现金净流量变动比例:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7006490230560303:17356324.23:83:2 +投资活动现金流净额同比变动:投资活动现金净流量变动比例:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7006490230560303:9224707.73:83:2 +投资活动现金流净额同比变动:投资活动现金净流量本期比上年同期增减:收到其他与投资活动有关的现金上年同期增加金额:0.765455961227417:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量本期比上年同期增减:收到其他与投资活动有关的现金本期增加金额:0.7559592723846436:23000000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量本年比上年增减:收到其他与投资活动有关的现金上年同期增加金额:0.7803136110305786:93400000.00:167:2 +投资活动现金流净额同比变动:投资活动现金净流量本年比上年增减:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7520980834960938:17356324.23:83:2 +投资活动现金流净额同比变动:投资性活动现金流同比变动:收到其他与投资活动有关的现金上年同期增加金额:0.7351154088973999:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流同比变动:投资活动现金流入小计项目附注2023年度2022年度一、经营活动产生的现金流量::0.7269288301467896:17356324.23:83:2 +投资活动现金流净额同比变动:投资性活动现金流同比增减:收到其他与投资活动有关的现金上年同期增加金额:0.7482986450195312:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流同比增减:收到其他与投资活动有关的现金本期增加金额:0.7409780621528625:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流同比上升:收到其他与投资活动有关的现金上年同期增加金额:0.718496561050415:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流同比上升:收到其他与投资活动有关的现金本期增加金额:0.7129499316215515:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流同比下降:收到其他与投资活动有关的现金上年同期增加金额:0.6938232183456421:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流同比下降:收到其他与投资活动有关的现金本期增加金额:0.6813248991966248:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流变化幅度:收到其他与投资活动有关的现金本期增加金额:0.6843140125274658:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流变化幅度:收到其他与投资活动有关的现金上年同期增加金额:0.6769682168960571:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流变动比例:收到其他与投资活动有关的现金本期增加金额:0.6802611351013184:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流变动比例:支付其他与投资活动有关的现金本期增加金额:0.6763988137245178:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流本期比上年同期增减:收到其他与投资活动有关的现金本期增加金额:0.7678791880607605:23000000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流本期比上年同期增减:收到其他与投资活动有关的现金上年同期增加金额:0.7671341300010681:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流本年比上年增减:收到其他与投资活动有关的现金上年同期增加金额:0.773790717124939:93400000.00:167:2 +投资活动现金流净额同比变动:投资性活动现金流本年比上年增减:支付其他与投资活动有关的现金上年同期增加金额:0.7519544363021851:93400000.00:167:2 +当期非经常性损益:当期非经常性损益合计:合计计入当期非经常性损益的金额:0.8909862041473389:1737140.60:164:2 +当期非经常性损益:当期非经常性损益合计:合计计入当期非经常性损益的金额:0.8909862041473389:1089178.18:164:1 +当期非经常性损益:本期非经常性损益合计:合计计入当期非经常性损益的金额:0.86122727394104:1737140.60:164:2 +当期非经常性损益:本期非经常性损益合计:合计计入当期非经常性损益的金额:0.86122727394104:1089178.18:164:1 +当期非经常性损益:本报告期非经常性损益合计:合计计入当期非经常性损益的金额:0.8297645449638367:1737140.60:164:2 +当期非经常性损益:本报告期非经常性损益合计:合计计入当期非经常性损益的金额:0.8297645449638367:1089178.18:164:1 +当期非经常性损益:报告期非经常性损益合计:合计计入当期非经常性损益的金额:0.8356654644012451:1737140.60:164:2 +当期非经常性损益:报告期非经常性损益合计:合计计入当期非经常性损益的金额:0.8356654644012451:1089178.18:164:1 +当期非经常性损益:报告期内非经常性损益合计:合计计入当期非经常性损益的金额:0.8219770193099976:1737140.60:164:2 +当期非经常性损益:报告期内非经常性损益合计:合计计入当期非经常性损益的金额:0.8219770193099976:1089178.18:164:1 +当期非经常性损益:本年度非经常性损益合计:合计计入当期非经常性损益的金额:0.8607388138771057:1737140.60:164:2 +当期非经常性损益:本年度非经常性损益合计:合计计入当期非经常性损益的金额:0.8607388138771057:1089178.18:164:1 +当期非经常性损益:本期发生额非经常性损益合计:合计计入当期非经常性损益的金额:0.8536848425865173:1737140.60:164:2 +当期非经常性损益:本期发生额非经常性损益合计:合计计入当期非经常性损益的金额:0.8536848425865173:1089178.18:164:1 +当期非经常性损益:2023年非经常性损益合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.7704401016235352:5585927.73:202:2 +当期非经常性损益:2023年非经常性损益合计:合计计入当期非经常性损益的金额:0.7637211084365845:1737140.60:164:2 +当期非经常性损益:2023年全年非经常性损益合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.7768527269363403:5585927.73:202:2 +当期非经常性损益:2023年全年非经常性损益合计:持续经营净利润2023年度:0.7485563158988953:153819180.44:82:1 +当期非经常性损益:2023年金额非经常性损益合计:合计计入当期非经常性损益的金额:0.7790354490280151:1737140.60:164:2 +当期非经常性损益:2023年金额非经常性损益合计:合计计入当期非经常性损益的金额:0.7790354490280151:1089178.18:164:1 +当期非经常性损益:当期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8875844478607178:1737140.60:164:2 +当期非经常性损益:当期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8875844478607178:1089178.18:164:1 +当期非经常性损益:本期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8583180904388428:1737140.60:164:2 +当期非经常性损益:本期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8583180904388428:1089178.18:164:1 +当期非经常性损益:本报告期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8221633434295654:1737140.60:164:2 +当期非经常性损益:本报告期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8221633434295654:1089178.18:164:1 +当期非经常性损益:报告期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8262042999267578:1737140.60:164:2 +当期非经常性损益:报告期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8262042999267578:1089178.18:164:1 +当期非经常性损益:报告期内非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8094679713249207:1737140.60:164:2 +当期非经常性损益:报告期内非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8094679713249207:1089178.18:164:1 +当期非经常性损益:本年度非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8412634134292603:1737140.60:164:2 +当期非经常性损益:本年度非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8412634134292603:1089178.18:164:1 +当期非经常性损益:本期发生额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8533920645713806:1737140.60:164:2 +当期非经常性损益:本期发生额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8533920645713806:1089178.18:164:1 +当期非经常性损益:2023年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7607364654541016:1737140.60:164:2 +当期非经常性损益:2023年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7607364654541016:1089178.18:164:1 +当期非经常性损益:2023年全年非经常性损益项目合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.7577162384986877:5585927.73:202:2 +当期非经常性损益:2023年全年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7349141240119934:1737140.60:164:2 +当期非经常性损益:2023年金额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7710221409797668:1737140.60:164:2 +当期非经常性损益:2023年金额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7710221409797668:1089178.18:164:1 +当期非经常性损益:当期非经常性损益项目净额:其他计入当期非经常性损益的金额:0.8517057299613953:0.02:164:2 +当期非经常性损益:当期非经常性损益项目净额:其他计入当期非经常性损益的金额:0.8517057299613953:137953.14:164:1 +当期非经常性损益:本期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8397589921951294:1737140.60:164:2 +当期非经常性损益:本期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8397589921951294:1089178.18:164:1 +当期非经常性损益:本报告期非经常性损益项目净额:其他计入当期非经常性损益的金额:0.8172892928123474:0.02:164:2 +当期非经常性损益:本报告期非经常性损益项目净额:其他计入当期非经常性损益的金额:0.8172892928123474:137953.14:164:1 +当期非经常性损益:报告期非经常性损益项目净额:其他计入当期非经常性损益的金额:0.8126702904701233:0.02:164:2 +当期非经常性损益:报告期非经常性损益项目净额:其他计入当期非经常性损益的金额:0.8126702904701233:137953.14:164:1 +当期非经常性损益:报告期内非经常性损益项目净额:其他计入当期非经常性损益的金额:0.810255229473114:0.02:164:2 +当期非经常性损益:报告期内非经常性损益项目净额:其他计入当期非经常性损益的金额:0.810255229473114:137953.14:164:1 +当期非经常性损益:本年度非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8327562808990479:1737140.60:164:2 +当期非经常性损益:本年度非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8327562808990479:1089178.18:164:1 +当期非经常性损益:本期发生额非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8432623744010925:1737140.60:164:2 +当期非经常性损益:本期发生额非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8432623744010925:1089178.18:164:1 +当期非经常性损益:2023年非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.7683847546577454:5585927.73:202:2 +当期非经常性损益:2023年非经常性损益项目净额:其他计入当期非经常性损益的金额:0.731882631778717:0.02:164:2 +当期非经常性损益:2023年全年非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.7742663621902466:5585927.73:202:2 +当期非经常性损益:2023年全年非经常性损益项目净额:持续经营净利润2023年度:0.7151979207992554:153819180.44:82:1 +当期非经常性损益:2023年金额非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.7750458121299744:5585927.73:202:2 +当期非经常性损益:2023年金额非经常性损益项目净额:其他计入当期非经常性损益的金额:0.7504972815513611:0.02:164:2 +上年同期非经常性损益:上年同期非经常性损益合计:合计计入当期非经常性损益的金额:0.807886004447937:1737140.60:164:2 +上年同期非经常性损益:上年同期非经常性损益合计:合计计入当期非经常性损益的金额:0.807886004447937:1089178.18:164:1 +上年同期非经常性损益:上期非经常性损益合计:合计计入当期非经常性损益的金额:0.8362947702407837:1737140.60:164:2 +上年同期非经常性损益:上期非经常性损益合计:合计计入当期非经常性损益的金额:0.8362947702407837:1089178.18:164:1 +上年同期非经常性损益:上年度非经常性损益合计:合计计入当期非经常性损益的金额:0.8457139730453491:1737140.60:164:2 +上年同期非经常性损益:上年度非经常性损益合计:合计计入当期非经常性损益的金额:0.8457139730453491:1089178.18:164:1 +上年同期非经常性损益:2022年非经常性损益合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.8073281645774841:5585927.73:202:2 +上年同期非经常性损益:2022年非经常性损益合计:合计计入当期非经常性损益的金额:0.7684100866317749:1737140.60:164:2 +上年同期非经常性损益:2022年全年非经常性损益合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.8160032033920288:5585927.73:202:2 +上年同期非经常性损益:2022年全年非经常性损益合计:合计计入当期非经常性损益的金额:0.7444778084754944:1737140.60:164:2 +上年同期非经常性损益:2022年金额非经常性损益合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.8194971680641174:5585927.73:202:2 +上年同期非经常性损益:2022年金额非经常性损益合计:合计计入当期非经常性损益的金额:0.7947731018066406:1737140.60:164:2 +上年同期非经常性损益:上年同期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.809596836566925:1737140.60:164:2 +上年同期非经常性损益:上年同期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.809596836566925:1089178.18:164:1 +上年同期非经常性损益:上期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8402646780014038:1737140.60:164:2 +上年同期非经常性损益:上期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8402646780014038:1089178.18:164:1 +上年同期非经常性损益:上年度非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8325670957565308:1737140.60:164:2 +上年同期非经常性损益:上年度非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8325670957565308:1089178.18:164:1 +上年同期非经常性损益:2022年非经常性损益项目合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.7838752269744873:5585927.73:202:2 +上年同期非经常性损益:2022年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7660536766052246:1737140.60:164:2 +上年同期非经常性损益:2022年全年非经常性损益项目合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.7914266586303711:5585927.73:202:2 +上年同期非经常性损益:2022年全年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7410244345664978:1737140.60:164:2 +上年同期非经常性损益:2022年金额非经常性损益项目合计:2022年度归属于母公司所有者的非经常性损益净额金额:0.799791157245636:5585927.73:202:2 +上年同期非经常性损益:2022年金额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.781523585319519:1737140.60:164:2 +上年同期非经常性损益:上年同期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7972128391265869:1737140.60:164:2 +上年同期非经常性损益:上年同期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7972128391265869:1089178.18:164:1 +上年同期非经常性损益:上期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.820035994052887:1737140.60:164:2 +上年同期非经常性损益:上期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.820035994052887:1089178.18:164:1 +上年同期非经常性损益:上年度非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8211049437522888:1737140.60:164:2 +上年同期非经常性损益:上年度非经常性损益项目净额:合计计入当期非经常性损益的金额:0.8211049437522888:1089178.18:164:1 +上年同期非经常性损益:2022年非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.8056309819221497:5585927.73:202:2 +上年同期非经常性损益:2022年非经常性损益项目净额:其他计入当期非经常性损益的金额:0.7447986602783203:0.02:164:2 +上年同期非经常性损益:2022年全年非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.8148632645606995:5585927.73:202:2 +上年同期非经常性损益:2022年全年非经常性损益项目净额:其他计入当期非经常性损益的金额:0.724946916103363:0.02:164:2 +上年同期非经常性损益:2022年金额非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.8201967477798462:5585927.73:202:2 +上年同期非经常性损益:2022年金额非经常性损益项目净额:其他计入当期非经常性损益的金额:0.7684067487716675:0.02:164:2 +前年同期非经常性损益:前年同期非经常性损益合计:合计计入当期非经常性损益的金额:0.8044193983078003:1737140.60:164:2 +前年同期非经常性损益:前年同期非经常性损益合计:合计计入当期非经常性损益的金额:0.8044193983078003:1089178.18:164:1 +前年同期非经常性损益:2021年非经常性损益合计:合计计入当期非经常性损益的金额:0.7696065902709961:1737140.60:164:2 +前年同期非经常性损益:2021年非经常性损益合计:合计计入当期非经常性损益的金额:0.7696065902709961:1089178.18:164:1 +前年同期非经常性损益:2021年全年非经常性损益合计:合计计入当期非经常性损益的金额:0.7509975433349609:1737140.60:164:2 +前年同期非经常性损益:2021年全年非经常性损益合计:合计计入当期非经常性损益的金额:0.7509975433349609:1089178.18:164:1 +前年同期非经常性损益:2021年金额非经常性损益合计:合计计入当期非经常性损益的金额:0.7984808087348938:1737140.60:164:2 +前年同期非经常性损益:2021年金额非经常性损益合计:合计计入当期非经常性损益的金额:0.7984808087348938:1089178.18:164:1 +前年同期非经常性损益:前年同期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8044611215591431:1737140.60:164:2 +前年同期非经常性损益:前年同期非经常性损益项目合计:合计计入当期非经常性损益的金额:0.8044611215591431:1089178.18:164:1 +前年同期非经常性损益:2021年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7686000466346741:1737140.60:164:2 +前年同期非经常性损益:2021年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7686000466346741:1089178.18:164:1 +前年同期非经常性损益:2021年全年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7465613484382629:1737140.60:164:2 +前年同期非经常性损益:2021年全年非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7465613484382629:1089178.18:164:1 +前年同期非经常性损益:2021年金额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7860339283943176:1737140.60:164:2 +前年同期非经常性损益:2021年金额非经常性损益项目合计:合计计入当期非经常性损益的金额:0.7860339283943176:1089178.18:164:1 +前年同期非经常性损益:前年同期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7947374582290649:1737140.60:164:2 +前年同期非经常性损益:前年同期非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7947374582290649:1089178.18:164:1 +前年同期非经常性损益:2021年非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7404066324234009:1737140.60:164:2 +前年同期非经常性损益:2021年非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7404066324234009:1089178.18:164:1 +前年同期非经常性损益:2021年全年非经常性损益项目净额:2022年度归属于母公司所有者的非经常性损益净额金额:0.7317115068435669:5585927.73:202:2 +前年同期非经常性损益:2021年全年非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7283496260643005:1737140.60:164:2 +前年同期非经常性损益:2021年金额非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7680081129074097:1737140.60:164:2 +前年同期非经常性损益:2021年金额非经常性损益项目净额:合计计入当期非经常性损益的金额:0.7680081129074097:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计同比变动:合计计入当期非经常性损益的金额:0.8170526027679443:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计同比变动:合计计入当期非经常性损益的金额:0.8170526027679443:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计同比增减:合计计入当期非经常性损益的金额:0.8012609481811523:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计同比增减:合计计入当期非经常性损益的金额:0.8012609481811523:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计同比上升:合计计入当期非经常性损益的金额:0.7838822603225708:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计同比上升:合计计入当期非经常性损益的金额:0.7838822603225708:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计同比下降:合计计入当期非经常性损益的金额:0.7801190614700317:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计同比下降:合计计入当期非经常性损益的金额:0.7801190614700317:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计变化幅度:合计计入当期非经常性损益的金额:0.7853020429611206:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计变化幅度:合计计入当期非经常性损益的金额:0.7853020429611206:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计变动比例:合计计入当期非经常性损益的金额:0.8160135746002197:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计变动比例:合计计入当期非经常性损益的金额:0.8160135746002197:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计本期比上年同期增减:合计计入当期非经常性损益的金额:0.8164406418800354:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计本期比上年同期增减:合计计入当期非经常性损益的金额:0.8164406418800354:1089178.18:164:1 +非经常性损益同比变动:非经常性损益合计本年比上年增减:合计计入当期非经常性损益的金额:0.8148890733718872:1737140.60:164:2 +非经常性损益同比变动:非经常性损益合计本年比上年增减:合计计入当期非经常性损益的金额:0.8148890733718872:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计同比变动:合计计入当期非经常性损益的金额:0.8170335292816162:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计同比变动:合计计入当期非经常性损益的金额:0.8170335292816162:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计同比增减:合计计入当期非经常性损益的金额:0.8085120320320129:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计同比增减:合计计入当期非经常性损益的金额:0.8085120320320129:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计同比上升:合计计入当期非经常性损益的金额:0.7944532632827759:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计同比上升:合计计入当期非经常性损益的金额:0.7944532632827759:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计同比下降:合计计入当期非经常性损益的金额:0.7860510349273682:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计同比下降:合计计入当期非经常性损益的金额:0.7860510349273682:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计变化幅度:合计计入当期非经常性损益的金额:0.7996537089347839:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计变化幅度:合计计入当期非经常性损益的金额:0.7996537089347839:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计变动比例:合计计入当期非经常性损益的金额:0.8177168369293213:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计变动比例:合计计入当期非经常性损益的金额:0.8177168369293213:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计本期比上年同期增减:合计计入当期非经常性损益的金额:0.8262964487075806:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计本期比上年同期增减:合计计入当期非经常性损益的金额:0.8262964487075806:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目合计本年比上年增减:合计计入当期非经常性损益的金额:0.8209706544876099:1737140.60:164:2 +非经常性损益同比变动:非经常性损益项目合计本年比上年增减:合计计入当期非经常性损益的金额:0.8209706544876099:1089178.18:164:1 +非经常性损益同比变动:非经常性损益项目净额同比变动:其他计入当期非经常性损益的金额:0.7984821796417236:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额同比变动:其他计入当期非经常性损益的金额:0.7984821796417236:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额同比增减:其他计入当期非经常性损益的金额:0.7883921265602112:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额同比增减:其他计入当期非经常性损益的金额:0.7883921265602112:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额同比上升:其他计入当期非经常性损益的金额:0.7677901983261108:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额同比上升:其他计入当期非经常性损益的金额:0.7677901983261108:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额同比下降:其他计入当期非经常性损益的金额:0.7685742974281311:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额同比下降:其他计入当期非经常性损益的金额:0.7685742974281311:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额变化幅度:其他计入当期非经常性损益的金额:0.7634208798408508:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额变化幅度:其他计入当期非经常性损益的金额:0.7634208798408508:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额变动比例:其他计入当期非经常性损益的金额:0.7819502353668213:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额变动比例:其他计入当期非经常性损益的金额:0.7819502353668213:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额本期比上年同期增减:其他计入当期非经常性损益的金额:0.809641420841217:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额本期比上年同期增减:其他计入当期非经常性损益的金额:0.809641420841217:137953.14:164:1 +非经常性损益同比变动:非经常性损益项目净额本年比上年增减:其他计入当期非经常性损益的金额:0.7984848618507385:0.02:164:2 +非经常性损益同比变动:非经常性损益项目净额本年比上年增减:其他计入当期非经常性损益的金额:0.7984848618507385:137953.14:164:1 +上年同期基本每股收益:上年同期归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8641513586044312:0.60:202:3 +上年同期基本每股收益:上年同期归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润加权平均净资产收益率:0.7940235733985901:15.47:202:3 +上年同期基本每股收益:上期归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8888118267059326:0.60:202:3 +上年同期基本每股收益:上期归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8206071257591248:0.60:202:3 +上年同期基本每股收益:上年度归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.9154144525527954:0.60:202:3 +上年同期基本每股收益:上年度归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润加权平均净资产收益率:0.8384168744087219:15.47:202:3 +上年同期基本每股收益:2022年归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8687353134155273:0.60:202:3 +上年同期基本每股收益:2022年归属于公司普通股股东的净利润基本每股收益:2022年度归属于母公司所有者的非经常性损益净额金额:0.8129934072494507:5585927.73:202:2 +上年同期基本每股收益:2022年全年归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8164439797401428:0.60:202:3 +上年同期基本每股收益:2022年全年归属于公司普通股股东的净利润基本每股收益:2022年度归属于母公司所有者的非经常性损益净额金额:0.8103559017181396:5585927.73:202:2 +上年同期基本每股收益:2022年金额归属于公司普通股股东的净利润基本每股收益:2022年度归属于母公司所有者的非经常性损益净额金额:0.8186773061752319:5585927.73:202:2 +上年同期基本每股收益:2022年金额归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8095484972000122:0.60:202:3 +上年同期基本每股收益:上年同期归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8713048696517944:0.60:202:3 +上年同期基本每股收益:上年同期归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.7977699041366577:0.60:202:3 +上年同期基本每股收益:上期归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8955386281013489:0.60:202:3 +上年同期基本每股收益:上期归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8246742486953735:0.60:202:3 +上年同期基本每股收益:上年度归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.9225068092346191:0.60:202:3 +上年同期基本每股收益:上年度归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.839860200881958:0.60:202:3 +上年同期基本每股收益:2022年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8738360404968262:0.60:202:3 +上年同期基本每股收益:2022年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8143877983093262:0.60:202:3 +上年同期基本每股收益:2022年全年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8226883411407471:0.60:202:3 +上年同期基本每股收益:2022年全年归属于公司普通股股东的净利润每股收益基本每股收益:2022年度归属于母公司所有者的非经常性损益净额金额:0.7990677952766418:5585927.73:202:2 +上年同期基本每股收益:2022年金额归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.814613938331604:0.60:202:3 +上年同期基本每股收益:2022年金额归属于公司普通股股东的净利润每股收益基本每股收益:2022年度归属于母公司所有者的非经常性损益净额金额:0.8104848861694336:5585927.73:202:2 +前年同期基本每股收益:前年同期归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.851165235042572:0.60:202:3 +前年同期基本每股收益:前年同期归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润加权平均净资产收益率:0.7856865525245667:15.47:202:3 +前年同期基本每股收益:2021年归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8762575387954712:0.60:202:3 +前年同期基本每股收益:2021年归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8182271122932434:0.60:202:3 +前年同期基本每股收益:2021年全年归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8347380757331848:0.60:202:3 +前年同期基本每股收益:2021年全年归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.7702171802520752:0.60:202:3 +前年同期基本每股收益:2021年金额归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8105592727661133:0.60:202:3 +前年同期基本每股收益:2021年金额归属于公司普通股股东的净利润基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.7617323398590088:0.60:202:3 +前年同期基本每股收益:前年同期归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8577830195426941:0.60:202:3 +前年同期基本每股收益:前年同期归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.790778636932373:0.60:202:3 +前年同期基本每股收益:2021年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8858486413955688:0.60:202:3 +前年同期基本每股收益:2021年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8263423442840576:0.60:202:3 +前年同期基本每股收益:2021年全年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8438820838928223:0.60:202:3 +前年同期基本每股收益:2021年全年归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.7794286012649536:0.60:202:3 +前年同期基本每股收益:2021年金额归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8196594715118408:0.60:202:3 +前年同期基本每股收益:2021年金额归属于公司普通股股东的净利润每股收益基本每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.7691078186035156:0.60:202:3 +前年同期稀释每股收益:前年同期归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8953182697296143:0.60:202:3 +前年同期稀释每股收益:前年同期归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8330262899398804:0.60:202:3 +前年同期稀释每股收益:2021年归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8997717499732971:0.60:202:3 +前年同期稀释每股收益:2021年归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8469684720039368:0.60:202:3 +前年同期稀释每股收益:2021年全年归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.863892674446106:0.60:202:3 +前年同期稀释每股收益:2021年全年归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8136484026908875:0.60:202:3 +前年同期稀释每股收益:2021年金额归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8498620986938477:0.60:202:3 +前年同期稀释每股收益:2021年金额归属于公司普通股股东的净利润稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.7949496507644653:0.60:202:3 +前年同期稀释每股收益:前年同期归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8980120420455933:0.60:202:3 +前年同期稀释每股收益:前年同期归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8353408575057983:0.60:202:3 +前年同期稀释每股收益:2021年归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.9111474752426147:0.60:202:3 +前年同期稀释每股收益:2021年归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8616248965263367:0.60:202:3 +前年同期稀释每股收益:2021年全年归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.872390627861023:0.60:202:3 +前年同期稀释每股收益:2021年全年归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8251075744628906:0.60:202:3 +前年同期稀释每股收益:2021年金额归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益稀释每股收益:0.8600435256958008:0.60:202:3 +前年同期稀释每股收益:2021年金额归属于公司普通股股东的净利润每股收益稀释每股收益:归属于公司普通股股东的净利润每股收益基本每股收益:0.8081976175308228:0.60:202:3 +上年同期加权平均净资产收益率:上年同期归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8827868700027466:15.47:202:3 +上年同期加权平均净资产收益率:上年同期归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.8109948039054871:0.60:202:3 +上年同期加权平均净资产收益率:上期归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.9059704542160034:15.47:202:3 +上年同期加权平均净资产收益率:上期归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.8311629295349121:0.60:202:3 +上年同期加权平均净资产收益率:上年度归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.9306432008743286:15.47:202:3 +上年同期加权平均净资产收益率:上年度归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.855692982673645:0.60:202:3 +上年同期加权平均净资产收益率:2022年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8819858431816101:15.47:202:3 +上年同期加权平均净资产收益率:2022年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.8135912418365479:0.60:202:3 +上年同期加权平均净资产收益率:2022年全年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8306741118431091:15.47:202:3 +上年同期加权平均净资产收益率:2022年全年归属于公司普通股股东的净利润加权平均净资产收益率:2022年度归属于母公司所有者的非经常性损益净额金额:0.8023531436920166:5585927.73:202:2 +上年同期加权平均净资产收益率:2022年金额归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8271300196647644:15.47:202:3 +上年同期加权平均净资产收益率:2022年金额归属于公司普通股股东的净利润加权平均净资产收益率:2022年度归属于母公司所有者的非经常性损益净额金额:0.8094289302825928:5585927.73:202:2 +上年同期加权平均净资产收益率:上年同期归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8524937033653259:15.47:202:3 +上年同期加权平均净资产收益率:上年同期归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.7717680931091309:0.60:202:3 +上年同期加权平均净资产收益率:上期归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8830907940864563:15.47:202:3 +上年同期加权平均净资产收益率:上期归属于上市公司股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7990968823432922:17.47:202:3 +上年同期加权平均净资产收益率:上年度归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.9012112021446228:15.47:202:3 +上年同期加权平均净资产收益率:上年度归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.8136614561080933:0.60:202:3 +上年同期加权平均净资产收益率:2022年归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8613432049751282:15.47:202:3 +上年同期加权平均净资产收益率:2022年归属于上市公司股东的净利润加权平均净资产收益率:2022年度归属于母公司所有者的非经常性损益净额金额:0.8082143664360046:5585927.73:202:2 +上年同期加权平均净资产收益率:2022年全年归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8176946640014648:15.47:202:3 +上年同期加权平均净资产收益率:2022年全年归属于上市公司股东的净利润加权平均净资产收益率:2022年度归属于母公司所有者的非经常性损益净额金额:0.8024790287017822:5585927.73:202:2 +上年同期加权平均净资产收益率:2022年金额归属于上市公司股东的净利润加权平均净资产收益率:2022年度归属于母公司所有者的非经常性损益净额金额:0.8092328310012817:5585927.73:202:2 +上年同期加权平均净资产收益率:2022年金额归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8062190413475037:15.47:202:3 +上年同期加权平均净资产收益率:上年同期加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7380785942077637:17.47:202:3 +上年同期加权平均净资产收益率:上年同期加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7334461808204651:15.47:202:3 +上年同期加权平均净资产收益率:上期加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7833205461502075:17.47:202:3 +上年同期加权平均净资产收益率:上期加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.769528329372406:15.47:202:3 +上年同期加权平均净资产收益率:上年度加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7704448699951172:17.47:202:3 +上年同期加权平均净资产收益率:上年度加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7605705261230469:15.47:202:3 +上年同期加权平均净资产收益率:2022年加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7401102185249329:17.47:202:3 +上年同期加权平均净资产收益率:2022年加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7259166836738586:15.47:202:3 +上年同期加权平均净资产收益率:2022年全年加权平均净资产收益率(扣非前):综合收益总额2022年度所有者权益合计:0.7546960115432739:132340330.02:90:1 +上年同期加权平均净资产收益率:2022年全年加权平均净资产收益率(扣非前):综合收益总额2022年度未分配利润:0.7327196002006531:132340330.02:90:1 +上年同期加权平均净资产收益率:2022年金额加权平均净资产收益率(扣非前):综合收益总额2022年度所有者权益合计:0.7447577118873596:132340330.02:90:1 +上年同期加权平均净资产收益率:2022年金额加权平均净资产收益率(扣非前):综合收益总额2022年度未分配利润:0.7313406467437744:132340330.02:90:1 +前年同期加权平均净资产收益率:前年同期归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8722242712974548:15.47:202:3 +前年同期加权平均净资产收益率:前年同期归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.7949244379997253:0.60:202:3 +前年同期加权平均净资产收益率:2021年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.892853319644928:15.47:202:3 +前年同期加权平均净资产收益率:2021年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.8341692686080933:0.60:202:3 +前年同期加权平均净资产收益率:2021年全年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8532336354255676:15.47:202:3 +前年同期加权平均净资产收益率:2021年全年归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.7947027683258057:0.60:202:3 +前年同期加权平均净资产收益率:2021年金额归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8309763073921204:15.47:202:3 +前年同期加权平均净资产收益率:2021年金额归属于公司普通股股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.7646823525428772:0.60:202:3 +前年同期加权平均净资产收益率:前年同期归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8398890495300293:15.47:202:3 +前年同期加权平均净资产收益率:前年同期归属于上市公司股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7574605941772461:17.47:202:3 +前年同期加权平均净资产收益率:2021年归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8761062026023865:15.47:202:3 +前年同期加权平均净资产收益率:2021年归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.805146336555481:0.60:202:3 +前年同期加权平均净资产收益率:2021年全年归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.83992999792099:15.47:202:3 +前年同期加权平均净资产收益率:2021年全年归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润每股收益基本每股收益:0.7711949944496155:0.60:202:3 +前年同期加权平均净资产收益率:2021年金额归属于上市公司股东的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8161693811416626:15.47:202:3 +前年同期加权平均净资产收益率:2021年金额归属于上市公司股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7459229230880737:17.47:202:3 +前年同期加权平均净资产收益率:前年同期加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7472833395004272:17.47:202:3 +前年同期加权平均净资产收益率:前年同期加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7292420268058777:15.47:202:3 +前年同期加权平均净资产收益率:2021年加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7495368719100952:15.47:202:3 +前年同期加权平均净资产收益率:2021年加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7467817068099976:17.47:202:3 +前年同期加权平均净资产收益率:2021年全年加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7417020797729492:15.47:202:3 +前年同期加权平均净资产收益率:2021年全年加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.732979953289032:17.47:202:3 +前年同期加权平均净资产收益率:2021年金额加权平均净资产收益率(扣非前):归属于公司普通股股东的净利润加权平均净资产收益率:0.7233011722564697:15.47:202:3 +前年同期加权平均净资产收益率:2021年金额加权平均净资产收益率(扣非前):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7204035520553589:17.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期扣除非经常性损益后的加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8125909566879272:17.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期扣除非经常性损益后的加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.7144697308540344:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年扣除非经常性损益后的加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8481913208961487:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年扣除非经常性损益后的加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7538158297538757:0.68:202:3 +前年同期扣非加权平均净资产收益率:2021年全年扣除非经常性损益后的加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8138609528541565:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年全年扣除非经常性损益后的加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7202578186988831:0.68:202:3 +前年同期扣非加权平均净资产收益率:2021年金额扣除非经常性损益后的加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7708470225334167:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年金额扣除非经常性损益后的加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.6845069527626038:15.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8990662693977356:17.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8344263434410095:0.68:202:3 +前年同期扣非加权平均净资产收益率:2021年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8934484124183655:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8392876386642456:0.68:202:3 +前年同期扣非加权平均净资产收益率:2021年全年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8552215695381165:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年全年扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.8009082078933716:0.68:202:3 +前年同期扣非加权平均净资产收益率:2021年金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8300220966339111:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年金额扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润每股收益基本每股收益:0.7713981866836548:0.68:202:3 +前年同期扣非加权平均净资产收益率:前年同期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8588160276412964:17.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8117743730545044:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8342223167419434:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.8289521336555481:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年全年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.8187755346298218:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年全年归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.7939671277999878:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7981807589530945:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年金额归属于上市公司股东的扣除非经常性损益后的净利润加权平均净资产收益率:归属于公司普通股股东的净利润加权平均净资产收益率:0.7543877363204956:15.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期加权平均净资产收益率(扣非后):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7481780052185059:17.47:202:3 +前年同期扣非加权平均净资产收益率:前年同期加权平均净资产收益率(扣非后):归属于公司普通股股东的净利润加权平均净资产收益率:0.7292217016220093:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年加权平均净资产收益率(扣非后):归属于公司普通股股东的净利润加权平均净资产收益率:0.7483988404273987:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年加权平均净资产收益率(扣非后):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7456885576248169:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年全年加权平均净资产收益率(扣非后):归属于公司普通股股东的净利润加权平均净资产收益率:0.7418086528778076:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年全年加权平均净资产收益率(扣非后):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7339495420455933:17.47:202:3 +前年同期扣非加权平均净资产收益率:2021年金额加权平均净资产收益率(扣非后):归属于公司普通股股东的净利润加权平均净资产收益率:0.7176316380500793:15.47:202:3 +前年同期扣非加权平均净资产收益率:2021年金额加权平均净资产收益率(扣非后):扣除非经常性损益后归属于公司普通股股东的净利润加权平均净资产收益率:0.7140576839447021:17.47:202:3 +报告期末总资产:报告期末资产总计:合计期末余额:0.8034055829048157:1118004552.25:115:1 +报告期末总资产:报告期末资产总计:合计期末余额:0.8034055829048157:524158828.57:150:1 +报告期末总资产:本报告期末资产总计:合计期末余额:0.7535401582717896:1118004552.25:115:1 +报告期末总资产:本报告期末资产总计:合计期末余额:0.7535401582717896:524158828.57:150:1 +报告期末总资产:期末资产总计:合计期末数:0.8474330902099609:0.18:21:1 +报告期末总资产:期末资产总计:合计期末余额:0.8411272764205933:2379380.51:132:1 +报告期末总资产:期末数资产总计:合计期末数:0.8346810936927795:0.18:21:1 +报告期末总资产:期末数资产总计:固定资产上期期末数:0.8318822979927063:23771.18:18:1 +报告期末总资产:期末金额资产总计:合计期末金额:0.8664836883544922:26440421.67:148:1 +报告期末总资产:期末金额资产总计:合计期末余额:0.8559979200363159:1118004552.25:115:1 +报告期末总资产:2023年年末资产总计:2024年期末金额:0.8003131151199341:693038.67:148:1 +报告期末总资产:2023年年末资产总计:2027年期末金额:0.787048876285553:19820645.33:148:1 +报告期末总资产:2023年12月31日资产总计:2023年1月1日余额合计:0.8335059881210327:151671.00:197:3 +报告期末总资产:2023年12月31日资产总计:2024年期末金额:0.795393168926239:693038.67:148:1 +报告期末总资产:报告期末资产总额:合计期末账面余额:0.7888314127922058:28690.97:19:1 +报告期末总资产:报告期末资产总额:合计期末余额:0.7879525423049927:1118004552.25:115:1 +报告期末总资产:本报告期末资产总额:合计期末余额:0.7586439847946167:1118004552.25:115:1 +报告期末总资产:本报告期末资产总额:合计期末余额:0.7586439847946167:524158828.57:150:1 +报告期末总资产:期末资产总额:固定资产期末余额:0.8425536751747131:616592585.20:138:1 +报告期末总资产:期末资产总额:合计期末余额:0.8218733668327332:1118004552.25:115:1 +报告期末总资产:期末数资产总额:固定资产上期期末数:0.8210349678993225:23771.18:18:1 +报告期末总资产:期末数资产总额:合计期末数:0.7981336712837219:0.18:21:1 +报告期末总资产:期末金额资产总额:固定资产期末余额:0.8442015647888184:616592585.20:138:1 +报告期末总资产:期末金额资产总额:合计期末金额:0.8340120315551758:26440421.67:148:1 +报告期末总资产:2023年年末资产总额:2024年期末金额:0.8052576184272766:693038.67:148:1 +报告期末总资产:2023年年末资产总额:2027年期末金额:0.8009334802627563:19820645.33:148:1 +报告期末总资产:2023年12月31日资产总额:2023年1月1日余额合计:0.8290035128593445:151671.00:197:3 +报告期末总资产:2023年12月31日资产总额:2027年期末金额:0.7963895797729492:19820645.33:148:1 +报告期末总资产:报告期末公司总资产:合计期末账面余额:0.692314088344574:28690.97:19:1 +报告期末总资产:报告期末公司总资产:合计期末账面价值:0.6865399479866028:24129.81:19:1 +报告期末总资产:本报告期末公司总资产:合计期末账面余额:0.6664191484451294:28690.97:19:1 +报告期末总资产:本报告期末公司总资产:合计期末账面价值:0.6640529036521912:24129.81:19:1 +报告期末总资产:期末公司总资产:股份总数期末余额:0.75873863697052:337335000:156:1 +报告期末总资产:期末公司总资产:合计期末余额:0.7477667331695557:1118004552.25:115:1 +报告期末总资产:期末数公司总资产:股份总数期末余额:0.759932279586792:337335000:156:1 +报告期末总资产:期末数公司总资产:合计期末数:0.7463799118995667:0.18:21:1 +报告期末总资产:期末金额公司总资产:合计期末账面价值:0.7714545130729675:24129.81:19:1 +报告期末总资产:期末金额公司总资产:股份总数期末余额:0.7712440490722656:337335000:156:1 +报告期末总资产:2023年年末公司总资产:2027年期末金额:0.7030313611030579:19820645.33:148:1 +报告期末总资产:2023年年末公司总资产:2024年期末金额:0.7017164826393127:693038.67:148:1 +报告期末总资产:2023年12月31日公司总资产:一、营业收入2023年度:0.7267325520515442:1529440280.25:82:1 +报告期末总资产:2023年12月31日公司总资产:一、营业收入2022年度:0.7181971073150635:1316036204.14:82:1 +年初至报告期末总资产:年初至报告期末资产总计:固定资产上期期末数:0.7152193188667297:23771.18:18:1 +年初至报告期末总资产:年初至报告期末资产总计:合计期初账面余额:0.7106441855430603:633810.00:197:2 +年初至报告期末总资产:年初至本报告期末资产总计:固定资产本期期末数:0.6737830638885498:35036.52:18:1 +年初至报告期末总资产:年初至本报告期末资产总计:其他流动资产本期期末数:0.6720746159553528:5079.93:18:1 +年初至报告期末总资产:年初至期末资产总计:固定资产上期期末数:0.782211184501648:23771.18:18:1 +年初至报告期末总资产:年初至期末资产总计:合计期末数:0.7821078300476074:0.18:21:1 +年初至报告期末总资产:年初至期末数资产总计:固定资产上期期末数:0.7946824431419373:23771.18:18:1 +年初至报告期末总资产:年初至期末数资产总计:合计期初数:0.7659837007522583:0:21:1 +年初至报告期末总资产:年初至期末金额资产总计:合计期初金额:0.806937575340271:26834365.63:148:1 +年初至报告期末总资产:年初至期末金额资产总计:合计期初余额:0.7998080849647522:3939395.02:155:1 +年初至报告期末总资产:年初至2023年年末资产总计:2024年期末金额:0.7262924313545227:693038.67:148:1 +年初至报告期末总资产:年初至2023年年末资产总计:2025年期末金额:0.7156385779380798:1739524.15:148:1 +年初至报告期末总资产:年初至2023年12月31日资产总计:2023年1月1日余额合计:0.7888622879981995:151671.00:197:3 +年初至报告期末总资产:年初至2023年12月31日资产总计:2024年期末金额:0.7471668124198914:693038.67:148:1 +年初至报告期末总资产:上年年末资产总计:固定资产上期期末数:0.7458370327949524:23771.18:18:1 +年初至报告期末总资产:上年年末资产总计:合计期末数:0.737171471118927:0.18:21:1 +年初至报告期末总资产:上年末资产总计:合计期末余额:0.7571682929992676:1118004552.25:115:1 +年初至报告期末总资产:上年末资产总计:合计期末余额:0.7571682929992676:524158828.57:150:1 +年初至报告期末总资产:2022年年末资产总计:2024年期末金额:0.7923240661621094:693038.67:148:1 +年初至报告期末总资产:2022年年末资产总计:2026年期末金额:0.780467689037323:2192390.77:148:1 +年初至报告期末总资产:2022年12月31日资产总计:2023年1月1日余额合计:0.7841861844062805:151671.00:197:3 +年初至报告期末总资产:2022年12月31日资产总计:2024年期末金额:0.7802205085754395:693038.67:148:1 +年初至报告期末总资产:年初至报告期末资产总额:固定资产上期期末数占总资产的比例:0.7043234705924988:14.92:18:1 +年初至报告期末总资产:年初至报告期末资产总额:合计期初账面余额:0.7034945487976074:633810.00:197:2 +年初至报告期末总资产:年初至本报告期末资产总额:固定资产本期期末数占总资产的比例:0.6788447499275208:12.38:18:1 +年初至报告期末总资产:年初至本报告期末资产总额:固定资产本期期末数:0.6663997173309326:35036.52:18:1 +年初至报告期末总资产:年初至期末资产总额:固定资产上期期末数:0.77234947681427:23771.18:18:1 +年初至报告期末总资产:年初至期末资产总额:固定资产期末余额:0.7705315947532654:616592585.20:138:1 +年初至报告期末总资产:年初至期末数资产总额:固定资产上期期末数:0.7894395589828491:23771.18:18:1 +年初至报告期末总资产:年初至期末数资产总额:固定资产上期期末数占总资产的比例:0.7679818272590637:14.92:18:1 +年初至报告期末总资产:年初至期末金额资产总额:合计期末余额账面余额金额:0.7813317775726318:544907094.21:192:1 +年初至报告期末总资产:年初至期末金额资产总额:固定资产期末余额:0.779523491859436:616592585.20:138:1 +年初至报告期末总资产:年初至2023年年末资产总额:2024年期末金额:0.727732241153717:693038.67:148:1 +年初至报告期末总资产:年初至2023年年末资产总额:2025年期末金额:0.722752571105957:1739524.15:148:1 +年初至报告期末总资产:年初至2023年12月31日资产总额:2023年1月1日余额合计:0.7920926213264465:151671.00:197:3 +年初至报告期末总资产:年初至2023年12月31日资产总额:2024年期末金额:0.7492849230766296:693038.67:148:1 +年初至报告期末总资产:上年年末资产总额:固定资产上期期末数:0.7422801852226257:23771.18:18:1 +年初至报告期末总资产:上年年末资产总额:固定资产期末余额:0.7319319844245911:616592585.20:138:1 +年初至报告期末总资产:上年末资产总额:合计期末余额:0.7540695667266846:1118004552.25:115:1 +年初至报告期末总资产:上年末资产总额:合计期末余额:0.7540695667266846:524158828.57:150:1 +年初至报告期末总资产:2022年年末资产总额:2024年期末金额:0.8026893734931946:693038.67:148:1 +年初至报告期末总资产:2022年年末资产总额:2026年期末金额:0.792368471622467:2192390.77:148:1 +年初至报告期末总资产:2022年12月31日资产总额:2024年期末金额:0.7890821099281311:693038.67:148:1 +年初至报告期末总资产:2022年12月31日资产总额:2023年1月1日余额合计:0.7869315147399902:151671.00:197:3 +年初至报告期末总资产:年初至报告期末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度归属于母公司所有者权益小计:0.6485457420349121:813814216.80:86:1 +年初至报告期末总资产:年初至报告期末公司总资产:固定资产本期期末数占总资产的比例:0.6406510472297668:12.38:18:1 +年初至报告期末总资产:年初至本报告期末公司总资产:固定资产本期期末数占总资产的比例:0.6070743203163147:12.38:18:1 +年初至报告期末总资产:年初至本报告期末公司总资产:合计期末账面余额:0.5954676866531372:28690.97:19:1 +年初至报告期末总资产:年初至期末公司总资产:股份总数期末余额:0.7074944972991943:337335000:156:1 +年初至报告期末总资产:年初至期末公司总资产:合计期末账面余额:0.6901988983154297:28690.97:19:1 +年初至报告期末总资产:年初至期末数公司总资产:固定资产上期期末数占总资产的比例:0.714147686958313:14.92:18:1 +年初至报告期末总资产:年初至期末数公司总资产:固定资产本期期末数占总资产的比例:0.6979820132255554:12.38:18:1 +年初至报告期末总资产:年初至期末金额公司总资产:合计期末余额账面余额金额:0.7243325114250183:544907094.21:192:1 +年初至报告期末总资产:年初至期末金额公司总资产:股份总数期末余额:0.7221023440361023:337335000:156:1 +年初至报告期末总资产:年初至2023年年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度归属于母公司所有者权益小计:0.6489337682723999:813814216.80:86:1 +年初至报告期末总资产:年初至2023年年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度所有者权益合计:0.647895872592926:818205888.04:86:1 +年初至报告期末总资产:年初至2023年12月31日公司总资产:一、营业收入2023年度:0.6736809611320496:1529440280.25:82:1 +年初至报告期末总资产:年初至2023年12月31日公司总资产:一、营业收入2022年度:0.668239414691925:1316036204.14:82:1 +年初至报告期末总资产:上年年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度所有者权益合计:0.7084210515022278:818205888.04:86:1 +年初至报告期末总资产:上年年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度归属于母公司所有者权益小计:0.7048448920249939:813814216.80:86:1 +年初至报告期末总资产:上年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度所有者权益合计:0.6930123567581177:818205888.04:86:1 +年初至报告期末总资产:上年末公司总资产:股份总数期末余额:0.6883984208106995:337335000:156:1 +年初至报告期末总资产:2022年年末公司总资产:2026年期末金额:0.7001519799232483:2192390.77:148:1 +年初至报告期末总资产:2022年年末公司总资产:2024年期末金额:0.6971119046211243:693038.67:148:1 +年初至报告期末总资产:2022年12月31日公司总资产:一、营业收入2022年度:0.7281304597854614:1316036204.14:82:1 +年初至报告期末总资产:2022年12月31日公司总资产:一、营业收入2023年度:0.698906421661377:1529440280.25:82:1 +上年年末总资产:上年年末资产总计:固定资产上期期末数:0.7458370327949524:23771.18:18:1 +上年年末总资产:上年年末资产总计:合计期末数:0.737171471118927:0.18:21:1 +上年年末总资产:上年年末资产总额:固定资产上期期末数:0.7422801852226257:23771.18:18:1 +上年年末总资产:上年年末资产总额:固定资产期末余额:0.7319319844245911:616592585.20:138:1 +上年年末总资产:上年年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度所有者权益合计:0.7084210515022278:818205888.04:86:1 +上年年末总资产:上年年末公司总资产:一、上年年末余额253000000.00274601631.7971671.1974200516.65211940397.172023年度归属于母公司所有者权益小计:0.7048448920249939:813814216.80:86:1 +报告期初总资产:报告期初资产总计:合计期初余额:0.757774829864502:122250.00:118:2 +报告期初总资产:报告期初资产总计:合计期初余额:0.757774829864502:218333706.63:115:1 +报告期初总资产:期初资产总计:合计期初数:0.816834032535553:0:21:1 +报告期初总资产:期初资产总计:固定资产期初余额:0.8074356913566589:482499313.46:138:1 +报告期初总资产:期初数资产总计:合计期初数:0.8051103949546814:0:21:1 +报告期初总资产:期初数资产总计:固定资产上期期末数:0.7712562680244446:23771.18:18:1 +报告期初总资产:期初金额资产总计:合计期初金额:0.8508333563804626:26834365.63:148:1 +报告期初总资产:期初金额资产总计:合计期初余额:0.8289123773574829:122250.00:118:2 +报告期初总资产:2023年1月1日资产总计:2023年1月1日余额合计:0.8853997588157654:151671.00:197:3 +报告期初总资产:2023年1月1日资产总计:2024年期末金额:0.7541033625602722:693038.67:148:1 +报告期初总资产:报告期初资产总额:合计上期发生额收入:0.7550577521324158:1316036204.14:200:2 +报告期初总资产:报告期初资产总额:固定资产期末余额:0.7423659563064575:616592585.20:138:1 +报告期初总资产:期初资产总额:固定资产期初余额:0.8169195652008057:482499313.46:138:1 +报告期初总资产:期初资产总额:固定资产期末余额:0.7961166501045227:616592585.20:138:1 +报告期初总资产:期初数资产总额:固定资产期初余额:0.7721706628799438:482499313.46:138:1 +报告期初总资产:期初数资产总额:固定资产上期期末数:0.7713271379470825:23771.18:18:1 +报告期初总资产:期初金额资产总额:固定资产期初余额:0.8180246949195862:482499313.46:138:1 +报告期初总资产:期初金额资产总额:合计期初金额:0.8068811893463135:26834365.63:148:1 +报告期初总资产:2023年1月1日资产总额:2023年1月1日余额合计:0.8785151839256287:151671.00:197:3 +报告期初总资产:2023年1月1日资产总额:2027年期末金额:0.7754600048065186:19820645.33:148:1 +报告期初总资产:报告期初公司总资产:固定资产本期期末数占总资产的比例:0.6601637005805969:12.38:18:1 +报告期初总资产:报告期初公司总资产:固定资产上期期末数占总资产的比例:0.6502805948257446:14.92:18:1 +报告期初总资产:期初公司总资产:固定资产期初余额:0.717126727104187:482499313.46:138:1 +报告期初总资产:期初公司总资产:固定资产期末余额:0.7092400789260864:616592585.20:138:1 +报告期初总资产:期初数公司总资产:固定资产上期期末数占总资产的比例:0.7208409309387207:14.92:18:1 +报告期初总资产:期初数公司总资产:股份总数期初余额:0.7152382135391235:253000000:156:1 +报告期初总资产:期初金额公司总资产:股份总数期初余额:0.7262371182441711:253000000:156:1 +报告期初总资产:期初金额公司总资产:固定资产期初余额:0.7121995091438293:482499313.46:138:1 +报告期初总资产:2023年1月1日公司总资产:一、营业收入2023年度:0.7498003244400024:1529440280.25:82:1 +报告期初总资产:2023年1月1日公司总资产:一、营业收入2022年度:0.7359612584114075:1316036204.14:82:1 +报告期末应收账款:报告期末应收账款合计:合计期末余额应收账款:0.8969576358795166:571845719.20:121:2 +报告期末应收账款:报告期末应收账款合计:合计期末余额应收账款:0.8964501619338989:544907094.21:193:1 +报告期末应收账款:本报告期末应收账款合计:合计期末余额应收账款:0.8996017575263977:571845719.20:121:2 +报告期末应收账款:本报告期末应收账款合计:合计期末余额应收账款:0.8994593620300293:544907094.21:193:1 +报告期末应收账款:期末应收账款合计:合计期末余额应收账款:0.9043871760368347:571845719.20:121:2 +报告期末应收账款:期末应收账款合计:合计期末余额应收账款:0.9041203856468201:544907094.21:193:1 +报告期末应收账款:期末数应收账款合计:合计期末余额应收账款:0.8979073762893677:571845719.20:121:2 +报告期末应收账款:期末数应收账款合计:合计期末余额应收账款:0.8975533246994019:544907094.21:193:1 +报告期末应收账款:期末金额应收账款合计:合计期末余额应收账款:0.9265770316123962:571845719.20:121:2 +报告期末应收账款:期末金额应收账款合计:合计期末余额应收账款:0.9262375235557556:544907094.21:193:1 +报告期末应收账款:2023年年末应收账款合计:合计期末余额应收账款:0.7952982783317566:571845719.20:121:2 +报告期末应收账款:2023年年末应收账款合计:合计期末余额应收账款:0.7950059175491333:544907094.21:193:1 +报告期末应收账款:2023年12月31日应收账款合计:合计期末余额应收账款:0.7864966988563538:571845719.20:121:2 +报告期末应收账款:2023年12月31日应收账款合计:合计期末余额应收账款:0.7860802412033081:544907094.21:193:1 +报告期末应收账款:报告期末应收账款余额:合计期末余额应收账款:0.8717659711837769:571845719.20:121:2 +报告期末应收账款:报告期末应收账款余额:合计期末余额应收账款:0.8709506392478943:544907094.21:193:1 +报告期末应收账款:本报告期末应收账款余额:合计期末余额应收账款:0.8827681541442871:571845719.20:121:2 +报告期末应收账款:本报告期末应收账款余额:合计期末余额应收账款:0.8822731375694275:544907094.21:193:1 +报告期末应收账款:期末应收账款余额:1-2年期末余额应收账款:0.894814133644104:5251065.35:121:2 +报告期末应收账款:期末应收账款余额:1-2年期末余额应收账款:0.8944545984268188:21980836.86:193:1 +报告期末应收账款:期末数应收账款余额:合计期末余额应收账款:0.8806336522102356:571845719.20:121:2 +报告期末应收账款:期末数应收账款余额:合计期末余额应收账款:0.8799927234649658:544907094.21:193:1 +报告期末应收账款:期末金额应收账款余额:合计期末余额应收账款:0.8985991477966309:571845719.20:121:2 +报告期末应收账款:期末金额应收账款余额:合计期末余额应收账款:0.8979535102844238:544907094.21:193:1 +报告期末应收账款:2023年年末应收账款余额:2-3年期末余额应收账款:0.7852213382720947:104153.67:121:2 +报告期末应收账款:2023年年末应收账款余额:2-3年期末余额应收账款:0.7852149605751038:104153.67:193:1 +报告期末应收账款:2023年12月31日应收账款余额:合计期末余额应收账款:0.7599267959594727:571845719.20:121:2 +报告期末应收账款:2023年12月31日应收账款余额:合计期末余额应收账款:0.7592548131942749:544907094.21:193:1 +年初至报告期末应收账款:年初至报告期末应收账款合计:合计期末余额应收账款:0.8253859281539917:571845719.20:121:2 +年初至报告期末应收账款:年初至报告期末应收账款合计:合计期末余额应收账款:0.8249209523200989:544907094.21:193:1 +年初至报告期末应收账款:年初至本报告期末应收账款合计:合计期末余额应收账款:0.8199940919876099:571845719.20:121:2 +年初至报告期末应收账款:年初至本报告期末应收账款合计:合计期末余额应收账款:0.8197895288467407:544907094.21:193:1 +年初至报告期末应收账款:年初至期末应收账款合计:1-2年期末余额应收账款:0.8752605319023132:5251065.35:121:2 +年初至报告期末应收账款:年初至期末应收账款合计:1-2年期末余额应收账款:0.8751815557479858:21980836.86:193:1 +年初至报告期末应收账款:年初至期末数应收账款合计:合计期末余额应收账款:0.8517359495162964:571845719.20:121:2 +年初至报告期末应收账款:年初至期末数应收账款合计:合计期末余额应收账款:0.8513017892837524:544907094.21:193:1 +年初至报告期末应收账款:年初至期末金额应收账款合计:合计期末余额应收账款:0.8789396286010742:571845719.20:121:2 +年初至报告期末应收账款:年初至期末金额应收账款合计:合计期末余额应收账款:0.8784923553466797:544907094.21:193:1 +年初至报告期末应收账款:年初至2023年年末应收账款合计:1-2年期末余额应收账款:0.7874090671539307:5251065.35:121:2 +年初至报告期末应收账款:年初至2023年年末应收账款合计:1-2年期末余额应收账款:0.7873268723487854:21980836.86:193:1 +年初至报告期末应收账款:年初至2023年12月31日应收账款合计:合计期末余额应收账款:0.7699342966079712:571845719.20:121:2 +年初至报告期末应收账款:年初至2023年12月31日应收账款合计:合计期末余额应收账款:0.769444465637207:544907094.21:193:1 +年初至报告期末应收账款:上年年末应收账款合计:1-2年期末余额应收账款:0.8422863483428955:5251065.35:121:2 +年初至报告期末应收账款:上年年末应收账款合计:1-2年期末余额应收账款:0.8421115279197693:21980836.86:193:1 +年初至报告期末应收账款:上年末应收账款合计:1-2年期末余额应收账款:0.8443710207939148:5251065.35:121:2 +年初至报告期末应收账款:上年末应收账款合计:1-2年期末余额应收账款:0.8441755771636963:21980836.86:193:1 +年初至报告期末应收账款:2022年年末应收账款合计:合计期末余额应收账款:0.815313458442688:571845719.20:121:2 +年初至报告期末应收账款:2022年年末应收账款合计:合计期末余额应收账款:0.8150294423103333:544907094.21:193:1 +年初至报告期末应收账款:2022年12月31日应收账款合计:合计期末余额应收账款:0.8126327991485596:571845719.20:121:2 +年初至报告期末应收账款:2022年12月31日应收账款合计:合计期末余额应收账款:0.8122707605361938:544907094.21:193:1 +年初至报告期末应收账款:年初至报告期末应收账款余额:合计期末余额应收账款:0.8144029378890991:571845719.20:121:2 +年初至报告期末应收账款:年初至报告期末应收账款余额:合计期末余额应收账款:0.8136770725250244:544907094.21:193:1 +年初至报告期末应收账款:年初至本报告期末应收账款余额:合计期末余额应收账款:0.8149298429489136:571845719.20:121:2 +年初至报告期末应收账款:年初至本报告期末应收账款余额:合计期末余额应收账款:0.8143709897994995:544907094.21:193:1 +年初至报告期末应收账款:年初至期末应收账款余额:1-2年期末余额应收账款:0.8935086131095886:5251065.35:121:2 +年初至报告期末应收账款:年初至期末应收账款余额:1-2年期末余额应收账款:0.893358588218689:21980836.86:193:1 +年初至报告期末应收账款:年初至期末数应收账款余额:1-2年期末余额应收账款:0.8677477836608887:5251065.35:121:2 +年初至报告期末应收账款:年初至期末数应收账款余额:1-2年期末余额应收账款:0.8676351308822632:21980836.86:193:1 +年初至报告期末应收账款:年初至期末金额应收账款余额:1-2年期末余额应收账款:0.8640316724777222:5251065.35:121:2 +年初至报告期末应收账款:年初至期末金额应收账款余额:1-2年期末余额应收账款:0.8639309406280518:21980836.86:193:1 +年初至报告期末应收账款:年初至2023年年末应收账款余额:1-2年期末余额应收账款:0.7970596551895142:5251065.35:121:2 +年初至报告期末应收账款:年初至2023年年末应收账款余额:1-2年期末余额应收账款:0.796920895576477:21980836.86:193:1 +年初至报告期末应收账款:年初至2023年12月31日应收账款余额:1-2年期末余额应收账款:0.768119752407074:5251065.35:121:2 +年初至报告期末应收账款:年初至2023年12月31日应收账款余额:1-2年期末余额应收账款:0.7680410742759705:21980836.86:193:1 +年初至报告期末应收账款:上年年末应收账款余额:1-2年期末余额应收账款:0.8562723994255066:5251065.35:121:2 +年初至报告期末应收账款:上年年末应收账款余额:1-2年期末余额应收账款:0.8559784889221191:21980836.86:193:1 +年初至报告期末应收账款:上年末应收账款余额:1-2年期末余额应收账款:0.864892840385437:5251065.35:121:2 +年初至报告期末应收账款:上年末应收账款余额:1-2年期末余额应收账款:0.8645954132080078:21980836.86:193:1 +年初至报告期末应收账款:2022年年末应收账款余额:合计期末余额应收账款:0.7913275957107544:571845719.20:121:2 +年初至报告期末应收账款:2022年年末应收账款余额:合计期末余额应收账款:0.7907556295394897:544907094.21:193:1 +年初至报告期末应收账款:2022年12月31日应收账款余额:合计期末余额应收账款:0.7852776050567627:571845719.20:121:2 +年初至报告期末应收账款:2022年12月31日应收账款余额:合计期末余额应收账款:0.7846431732177734:544907094.21:193:1 +上年年末应收账款:上年年末应收账款合计:1-2年期末余额应收账款:0.8422863483428955:5251065.35:121:2 +上年年末应收账款:上年年末应收账款合计:1-2年期末余额应收账款:0.8421115279197693:21980836.86:193:1 +上年年末应收账款:上年年末应收账款余额:1-2年期末余额应收账款:0.8562723994255066:5251065.35:121:2 +上年年末应收账款:上年年末应收账款余额:1-2年期末余额应收账款:0.8559784889221191:21980836.86:193:1 +报告期初应收账款:报告期初应收账款合计:合计期末余额应收账款:0.84457927942276:571845719.20:121:2 +报告期初应收账款:报告期初应收账款合计:合计期末余额应收账款:0.8440734148025513:544907094.21:193:1 +报告期初应收账款:期初应收账款合计:1-2年期末余额应收账款:0.8622738122940063:5251065.35:121:2 +报告期初应收账款:期初应收账款合计:1-2年期末余额应收账款:0.8620949983596802:21980836.86:193:1 +报告期初应收账款:期初数应收账款合计:1-2年期末余额应收账款:0.8323848247528076:5251065.35:121:2 +报告期初应收账款:期初数应收账款合计:1-2年期末余额应收账款:0.8323042392730713:21980836.86:193:1 +报告期初应收账款:期初金额应收账款合计:合计期末余额应收账款:0.8562630414962769:571845719.20:121:2 +报告期初应收账款:期初金额应收账款合计:合计期末余额应收账款:0.855879545211792:544907094.21:193:1 +报告期初应收账款:2023年1月1日应收账款合计:2023年1月1日余额合计:0.8157468438148499:151671.00:197:3 +报告期初应收账款:2023年1月1日应收账款合计:1年以内期末余额应收账款:0.7626504302024841:522748029.23:193:1 +报告期初应收账款:报告期初应收账款余额:1-2年期末余额应收账款:0.8217716217041016:5251065.35:121:2 +报告期初应收账款:报告期初应收账款余额:1-2年期末余额应收账款:0.8214777708053589:21980836.86:193:1 +报告期初应收账款:期初应收账款余额:1-2年期末余额应收账款:0.8802130222320557:5251065.35:121:2 +报告期初应收账款:期初应收账款余额:1-2年期末余额应收账款:0.8799636363983154:21980836.86:193:1 +报告期初应收账款:期初数应收账款余额:1-2年期末余额应收账款:0.8532726168632507:5251065.35:121:2 +报告期初应收账款:期初数应收账款余额:1-2年期末余额应收账款:0.8531012535095215:21980836.86:193:1 +报告期初应收账款:期初金额应收账款余额:1-2年期末余额应收账款:0.8555550575256348:5251065.35:121:2 +报告期初应收账款:期初金额应收账款余额:1-2年期末余额应收账款:0.8554052114486694:21980836.86:193:1 +报告期初应收账款:2023年1月1日应收账款余额:2023年1月1日余额合计:0.8124623894691467:151671.00:197:3 +报告期初应收账款:2023年1月1日应收账款余额:1年以内期末余额应收账款:0.762741208076477:522748029.23:193:1 +报告期末存货:报告期末存货合计:合计期末账面余额:0.7419212460517883:28690.97:19:1 +报告期末存货:报告期末存货合计:合计期末余额账面余额:0.7315249443054199:287182.00:121:1 +报告期末存货:本报告期末存货合计:合计期末账面余额:0.7173601388931274:28690.97:19:1 +报告期末存货:本报告期末存货合计:其中:库存现金期末余额:0.7033385634422302:23443.16:169:1 +报告期末存货:期末存货合计:合计期末余额:0.7826568484306335:2379380.51:132:1 +报告期末存货:期末存货合计:合计期末余额:0.7826568484306335:6424309.84:155:2 +报告期末存货:期末数存货合计:合计期末数:0.7757528424263:0.18:21:1 +报告期末存货:期末数存货合计:库存现金期末余额:0.7597318887710571:23443.16:115:1 +报告期末存货:期末金额存货合计:合计期末余额账面余额金额:0.8352677822113037:544907094.21:192:1 +报告期末存货:期末金额存货合计:合计期末余额账面余额:0.8260056376457214:287182.00:121:1 +报告期末存货:2023年年末存货合计:2024年期末金额:0.67825847864151:693038.67:148:1 +报告期末存货:2023年年末存货合计:2027年期末金额:0.6689973473548889:19820645.33:148:1 +报告期末存货:2023年12月31日存货合计:2023年1月1日余额合计:0.7745243906974792:151671.00:197:3 +报告期末存货:2023年12月31日存货合计:2024年期末金额:0.7116486430168152:693038.67:148:1 +报告期末存货:报告期末存货余额:库存现金期末余额:0.7283424139022827:23443.16:115:1 +报告期末存货:报告期末存货余额:合计期末账面余额:0.7239798307418823:28690.97:19:1 +报告期末存货:本报告期末存货余额:库存现金期末余额:0.7288166880607605:23443.16:115:1 +报告期末存货:本报告期末存货余额:合计期末账面余额:0.7195266485214233:28690.97:19:1 +报告期末存货:期末存货余额:库存现金期末余额:0.8115779161453247:23443.16:115:1 +报告期末存货:期末存货余额:固定资产期末余额:0.7676447033882141:616592585.20:138:1 +报告期末存货:期末数存货余额:库存现金期末余额:0.7969129681587219:23443.16:115:1 +报告期末存货:期末数存货余额:库存现金期初余额:0.7510433197021484:43244.16:115:1 +报告期末存货:期末金额存货余额:库存现金期末余额:0.8113296627998352:23443.16:115:1 +报告期末存货:期末金额存货余额:合计期末余额账面余额金额:0.7904300689697266:544907094.21:192:1 +报告期末存货:2023年年末存货余额:2023年1月1日余额合计:0.6972479224205017:151671.00:197:3 +报告期末存货:2023年年末存货余额:库存现金期末余额:0.6922735571861267:23443.16:115:1 +报告期末存货:2023年12月31日存货余额:2023年1月1日余额合计:0.7721742987632751:151671.00:197:3 +报告期末存货:2023年12月31日存货余额:2027年期末金额:0.6865925192832947:19820645.33:148:1 +年初至报告期末存货:年初至报告期末存货合计:合计期初账面余额:0.6492487192153931:633810.00:197:2 +年初至报告期末存货:年初至报告期末存货合计:库存现金期初余额:0.6404813528060913:43244.16:115:1 +年初至报告期末存货:年初至本报告期末存货合计:库存现金期初余额:0.6155139207839966:43244.16:115:1 +年初至报告期末存货:年初至本报告期末存货合计:库存现金期末余额:0.6126390695571899:23443.16:115:1 +年初至报告期末存货:年初至期末存货合计:其中:库存现金期初余额:0.7111393809318542:43244.16:169:1 +年初至报告期末存货:年初至期末存货合计:合计期初账面余额:0.7107130885124207:633810.00:197:2 +年初至报告期末存货:年初至期末数存货合计:库存现金期初余额:0.7096043825149536:43244.16:115:1 +年初至报告期末存货:年初至期末数存货合计:合计期初账面余额:0.7076025009155273:633810.00:197:2 +年初至报告期末存货:年初至期末金额存货合计:合计期初账面余额:0.7745214104652405:633810.00:197:2 +年初至报告期末存货:年初至期末金额存货合计:合计期初余额:0.7616404891014099:3939395.02:155:1 +年初至报告期末存货:年初至2023年年末存货合计:库存现金期初余额:0.6323002576828003:43244.16:115:1 +年初至报告期末存货:年初至2023年年末存货合计:库存现金期末余额:0.6282182335853577:23443.16:115:1 +年初至报告期末存货:年初至2023年12月31日存货合计:2023年1月1日余额合计:0.7052847743034363:151671.00:197:3 +年初至报告期末存货:年初至2023年12月31日存货合计:2024年期末金额:0.6452690958976746:693038.67:148:1 +年初至报告期末存货:上年年末存货合计:库存现金期末余额:0.6363542079925537:23443.16:115:1 +年初至报告期末存货:上年年末存货合计:固定资产上期期末数:0.6189294457435608:23771.18:18:1 +年初至报告期末存货:上年末存货合计:库存现金期末余额:0.6467581987380981:23443.16:115:1 +年初至报告期末存货:上年末存货合计:合计期末余额:0.6423467993736267:6424309.84:155:2 +年初至报告期末存货:2022年年末存货合计:2024年期末金额:0.6816664934158325:693038.67:148:1 +年初至报告期末存货:2022年年末存货合计:库存现金期末余额:0.6731631755828857:23443.16:115:1 +年初至报告期末存货:2022年12月31日存货合计:2023年1月1日余额合计:0.7332677245140076:151671.00:197:3 +年初至报告期末存货:2022年12月31日存货合计:2024年期末金额:0.6994050145149231:693038.67:148:1 +年初至报告期末存货:年初至报告期末存货余额:库存现金期初余额:0.6881812810897827:43244.16:115:1 +年初至报告期末存货:年初至报告期末存货余额:库存现金期末余额:0.6637402772903442:23443.16:115:1 +年初至报告期末存货:年初至本报告期末存货余额:库存现金期初余额:0.6693066954612732:43244.16:115:1 +年初至报告期末存货:年初至本报告期末存货余额:库存现金期末余额:0.6500466465950012:23443.16:115:1 +年初至报告期末存货:年初至期末存货余额:库存现金期初余额:0.7547615766525269:43244.16:115:1 +年初至报告期末存货:年初至期末存货余额:库存现金期末余额:0.7375847101211548:23443.16:115:1 +年初至报告期末存货:年初至期末数存货余额:库存现金期初余额:0.7550692558288574:43244.16:115:1 +年初至报告期末存货:年初至期末数存货余额:库存现金期末余额:0.7306348085403442:23443.16:115:1 +年初至报告期末存货:年初至期末金额存货余额:库存现金期初余额:0.7654070258140564:43244.16:115:1 +年初至报告期末存货:年初至期末金额存货余额:库存现金期末余额:0.750079870223999:23443.16:115:1 +年初至报告期末存货:年初至2023年年末存货余额:库存现金期初余额:0.6834300756454468:43244.16:115:1 +年初至报告期末存货:年初至2023年年末存货余额:库存现金期末余额:0.6645985841751099:23443.16:115:1 +年初至报告期末存货:年初至2023年12月31日存货余额:2023年1月1日余额合计:0.7223694920539856:151671.00:197:3 +年初至报告期末存货:年初至2023年12月31日存货余额:库存现金期初余额:0.6826246976852417:43244.16:115:1 +年初至报告期末存货:上年年末存货余额:库存现金期末余额:0.6774221062660217:23443.16:115:1 +年初至报告期末存货:上年年末存货余额:库存现金期初余额:0.6501494646072388:43244.16:115:1 +年初至报告期末存货:上年末存货余额:库存现金期末余额:0.6904462575912476:23443.16:115:1 +年初至报告期末存货:上年末存货余额:库存现金期初余额:0.6579556465148926:43244.16:115:1 +年初至报告期末存货:2022年年末存货余额:库存现金期末余额:0.6996060609817505:23443.16:115:1 +年初至报告期末存货:2022年年末存货余额:2024年期末金额:0.684524416923523:693038.67:148:1 +年初至报告期末存货:2022年12月31日存货余额:2023年1月1日余额合计:0.7336928844451904:151671.00:197:3 +年初至报告期末存货:2022年12月31日存货余额:库存现金期末余额:0.6818348169326782:23443.16:115:1 +上年年末存货:上年年末存货合计:库存现金期末余额:0.6363542079925537:23443.16:115:1 +上年年末存货:上年年末存货合计:固定资产上期期末数:0.6189294457435608:23771.18:18:1 +上年年末存货:上年年末存货余额:库存现金期末余额:0.6774221062660217:23443.16:115:1 +上年年末存货:上年年末存货余额:库存现金期初余额:0.6501494646072388:43244.16:115:1 +报告期初存货:报告期初存货合计:合计期初账面余额:0.6952295303344727:633810.00:197:2 +报告期初存货:报告期初存货合计:其中:库存现金期初余额:0.6715774536132812:43244.16:169:1 +报告期初存货:期初存货合计:合计期初余额:0.7339316010475159:3939395.02:155:1 +报告期初存货:期初存货合计:合计期初余额:0.7339316010475159:441363806.63:150:1 +报告期初存货:期初数存货合计:合计期初数:0.7295008897781372:0:21:1 +报告期初存货:期初数存货合计:库存现金期初余额:0.7134703993797302:43244.16:115:1 +报告期初存货:期初金额存货合计:合计期初金额:0.799241840839386:26834365.63:148:1 +报告期初存货:期初金额存货合计:合计期初余额:0.788472592830658:3939395.02:155:1 +报告期初存货:2023年1月1日存货合计:2023年1月1日余额合计:0.8410807251930237:151671.00:197:3 +报告期初存货:2023年1月1日存货合计:2027年期末金额:0.6908064484596252:19820645.33:148:1 +报告期初存货:报告期初存货余额:库存现金期初余额:0.7213222980499268:43244.16:115:1 +报告期初存货:报告期初存货余额:其中:库存现金期初余额:0.7038559913635254:43244.16:169:1 +报告期初存货:期初存货余额:库存现金期初余额:0.7973576784133911:43244.16:115:1 +报告期初存货:期初存货余额:其中:库存现金期初余额:0.7665843963623047:43244.16:169:1 +报告期初存货:期初数存货余额:库存现金期初余额:0.7768783569335938:43244.16:115:1 +报告期初存货:期初数存货余额:其中:库存现金期初余额:0.7203554511070251:43244.16:169:1 +报告期初存货:期初金额存货余额:库存现金期初余额:0.7832807898521423:43244.16:115:1 +报告期初存货:期初金额存货余额:固定资产期初余额:0.7588052749633789:482499313.46:138:1 +报告期初存货:2023年1月1日存货余额:2023年1月1日余额合计:0.8501741290092468:151671.00:197:3 +报告期初存货:2023年1月1日存货余额:2027年期末金额:0.6882811188697815:19820645.33:148:1 +报告期末应付账款:报告期末应付账款合计:合计期末余额应收账款:0.8277978897094727:571845719.20:121:2 +报告期末应付账款:报告期末应付账款合计:合计期末余额应收账款:0.8272995948791504:544907094.21:193:1 +报告期末应付账款:本报告期末应付账款合计:合计期末余额应收账款:0.8102726936340332:571845719.20:121:2 +报告期末应付账款:本报告期末应付账款合计:合计期末余额应收账款:0.8100638389587402:544907094.21:193:1 +报告期末应付账款:期末应付账款合计:合计期末余额应收账款:0.8572800159454346:571845719.20:121:2 +报告期末应付账款:期末应付账款合计:合计期末余额应收账款:0.8569366931915283:544907094.21:193:1 +报告期末应付账款:期末数应付账款合计:合计期末余额应收账款:0.848789393901825:571845719.20:121:2 +报告期末应付账款:期末数应付账款合计:合计期末余额应收账款:0.8483284115791321:544907094.21:193:1 +报告期末应付账款:期末金额应付账款合计:合计期末余额应收账款:0.8604987859725952:571845719.20:121:2 +报告期末应付账款:期末金额应付账款合计:合计期末余额应收账款:0.8599948883056641:544907094.21:193:1 +报告期末应付账款:2023年年末应付账款合计:2024年期末金额:0.7897460460662842:693038.67:148:1 +报告期末应付账款:2023年年末应付账款合计:2027年期末金额:0.7852571606636047:19820645.33:148:1 +报告期末应付账款:2023年12月31日应付账款合计:2023年1月1日余额合计:0.7803754210472107:151671.00:197:3 +报告期末应付账款:2023年12月31日应付账款合计:2024年期末金额:0.7752457857131958:693038.67:148:1 +报告期末应付账款:报告期末应付账款余额:合计期末余额应收账款:0.8146867156028748:571845719.20:121:2 +报告期末应付账款:报告期末应付账款余额:合计期末余额应收账款:0.8138965368270874:544907094.21:193:1 +报告期末应付账款:本报告期末应付账款余额:合计期末余额应收账款:0.8085877299308777:571845719.20:121:2 +报告期末应付账款:本报告期末应付账款余额:合计期末余额应收账款:0.8081188201904297:544907094.21:193:1 +报告期末应付账款:期末应付账款余额:1-2年期末余额应收账款:0.8296377658843994:5251065.35:121:2 +报告期末应付账款:期末应付账款余额:合计期末余额应收账款:0.8294065594673157:571845719.20:121:2 +报告期末应付账款:期末数应付账款余额:合计期末余额应收账款:0.8291071057319641:571845719.20:121:2 +报告期末应付账款:期末数应付账款余额:合计期末余额应收账款:0.8283445239067078:544907094.21:193:1 +报告期末应付账款:期末金额应付账款余额:应付账款期末折算人民币余额:0.8408025503158569:7677713.04:170:1 +报告期末应付账款:期末金额应付账款余额:合计期末余额应收账款:0.8394204378128052:571845719.20:121:2 +报告期末应付账款:2023年年末应付账款余额:2024年期末金额:0.7679375410079956:693038.67:148:1 +报告期末应付账款:2023年年末应付账款余额:2027年期末金额:0.7642313241958618:19820645.33:148:1 +报告期末应付账款:2023年12月31日应付账款余额:2023年1月1日余额合计:0.7799515724182129:151671.00:197:3 +报告期末应付账款:2023年12月31日应付账款余额:2024年期末金额:0.7460556626319885:693038.67:148:1 +年初至报告期末应付账款:年初至报告期末应付账款合计:合计期末余额应收账款:0.7694746255874634:571845719.20:121:2 +年初至报告期末应付账款:年初至报告期末应付账款合计:合计期末余额应收账款:0.7688839435577393:544907094.21:193:1 +年初至报告期末应付账款:年初至本报告期末应付账款合计:合计期末余额应收账款:0.7337818741798401:571845719.20:121:2 +年初至报告期末应付账款:年初至本报告期末应付账款合计:合计期末余额应收账款:0.733391284942627:544907094.21:193:1 +年初至报告期末应付账款:年初至期末应付账款合计:合计期末余额应收账款:0.8108749389648438:571845719.20:121:2 +年初至报告期末应付账款:年初至期末应付账款合计:合计期末余额应收账款:0.8104475736618042:544907094.21:193:1 +年初至报告期末应付账款:年初至期末数应付账款合计:合计期初账面余额:0.8117387890815735:633810.00:197:2 +年初至报告期末应付账款:年初至期末数应付账款合计:合计期末余额应收账款:0.7999585866928101:571845719.20:121:2 +年初至报告期末应付账款:年初至期末金额应付账款合计:合计期初账面余额:0.8145468235015869:633810.00:197:2 +年初至报告期末应付账款:年初至期末金额应付账款合计:合计期末余额应收账款:0.8135396242141724:571845719.20:121:2 +年初至报告期末应付账款:年初至2023年年末应付账款合计:2024年期末金额:0.7496059536933899:693038.67:148:1 +年初至报告期末应付账款:年初至2023年年末应付账款合计:2027年期末金额:0.7403320670127869:19820645.33:148:1 +年初至报告期末应付账款:年初至2023年12月31日应付账款合计:2023年1月1日余额合计:0.7537567019462585:151671.00:197:3 +年初至报告期末应付账款:年初至2023年12月31日应付账款合计:2024年期末金额:0.7430242896080017:693038.67:148:1 +年初至报告期末应付账款:上年年末应付账款合计:1年以内期末余额应收账款:0.7952505350112915:522748029.23:193:1 +年初至报告期末应付账款:上年年末应付账款合计:1年以内期末余额应收账款:0.7952505350112915:566236260.65:121:2 +年初至报告期末应付账款:上年末应付账款合计:1年以内期末余额应收账款:0.7997880578041077:522748029.23:193:1 +年初至报告期末应付账款:上年末应付账款合计:1年以内期末余额应收账款:0.7997880578041077:566236260.65:121:2 +年初至报告期末应付账款:2022年年末应付账款合计:2024年期末金额:0.7891518473625183:693038.67:148:1 +年初至报告期末应付账款:2022年年末应付账款合计:2026年期末金额:0.7801999449729919:2192390.77:148:1 +年初至报告期末应付账款:2022年12月31日应付账款合计:2024年期末金额:0.7738385200500488:693038.67:148:1 +年初至报告期末应付账款:2022年12月31日应付账款合计:2027年期末金额:0.7659085988998413:19820645.33:148:1 +年初至报告期末应付账款:年初至报告期末应付账款余额:合计期末余额应收账款:0.7567396759986877:571845719.20:121:2 +年初至报告期末应付账款:年初至报告期末应付账款余额:合计期末余额应收账款:0.7558783292770386:544907094.21:193:1 +年初至报告期末应付账款:年初至本报告期末应付账款余额:合计期末余额应收账款:0.7365757822990417:571845719.20:121:2 +年初至报告期末应付账款:年初至本报告期末应付账款余额:合计期末余额应收账款:0.7358938455581665:544907094.21:193:1 +年初至报告期末应付账款:年初至期末应付账款余额:1-2年期末余额应收账款:0.8178719282150269:5251065.35:121:2 +年初至报告期末应付账款:年初至期末应付账款余额:1-2年期末余额应收账款:0.8178008794784546:21980836.86:193:1 +年初至报告期末应付账款:年初至期末数应付账款余额:1-2年期末余额应收账款:0.7965426445007324:21980836.86:193:1 +年初至报告期末应付账款:年初至期末数应付账款余额:1-2年期末余额应收账款:0.7965412735939026:5251065.35:121:2 +年初至报告期末应付账款:年初至期末金额应付账款余额:应付账款期末折算人民币余额:0.8022675514221191:7677713.04:170:1 +年初至报告期末应付账款:年初至期末金额应付账款余额:合计期末余额账面余额金额:0.7959034442901611:544907094.21:192:1 +年初至报告期末应付账款:年初至2023年年末应付账款余额:2024年期末金额:0.7305707335472107:693038.67:148:1 +年初至报告期末应付账款:年初至2023年年末应付账款余额:2-3年期末余额应收账款:0.7299743294715881:104153.67:193:1 +年初至报告期末应付账款:年初至2023年12月31日应付账款余额:2023年1月1日余额合计:0.7553520202636719:151671.00:197:3 +年初至报告期末应付账款:年初至2023年12月31日应付账款余额:2024年期末金额:0.7188413739204407:693038.67:148:1 +年初至报告期末应付账款:上年年末应付账款余额:1-2年期末余额应收账款:0.807725191116333:5251065.35:121:2 +年初至报告期末应付账款:上年年末应付账款余额:1-2年期末余额应收账款:0.8075681924819946:21980836.86:193:1 +年初至报告期末应付账款:上年末应付账款余额:1-2年期末余额应收账款:0.8150061368942261:5251065.35:121:2 +年初至报告期末应付账款:上年末应付账款余额:1-2年期末余额应收账款:0.8148264288902283:21980836.86:193:1 +年初至报告期末应付账款:2022年年末应付账款余额:2024年期末金额:0.7680654525756836:693038.67:148:1 +年初至报告期末应付账款:2022年年末应付账款余额:2027年期末金额:0.7573504447937012:19820645.33:148:1 +年初至报告期末应付账款:2022年12月31日应付账款余额:2024年期末金额:0.7519962191581726:693038.67:148:1 +年初至报告期末应付账款:2022年12月31日应付账款余额:2027年期末金额:0.7448115348815918:19820645.33:148:1 +上年年末应付账款:上年年末应付账款合计:1年以内期末余额应收账款:0.7952505350112915:522748029.23:193:1 +上年年末应付账款:上年年末应付账款合计:1年以内期末余额应收账款:0.7952505350112915:566236260.65:121:2 +上年年末应付账款:上年年末应付账款余额:1-2年期末余额应收账款:0.807725191116333:5251065.35:121:2 +上年年末应付账款:上年年末应付账款余额:1-2年期末余额应收账款:0.8075681924819946:21980836.86:193:1 +报告期初应付账款:报告期初应付账款合计:合计期末余额应收账款:0.7783821821212769:571845719.20:121:2 +报告期初应付账款:报告期初应付账款合计:合计期末余额应收账款:0.777859628200531:544907094.21:193:1 +报告期初应付账款:期初应付账款合计:1-2年期末余额应收账款:0.8026183843612671:5251065.35:121:2 +报告期初应付账款:期初应付账款合计:1-2年期末余额应收账款:0.8025661110877991:21980836.86:193:1 +报告期初应付账款:期初数应付账款合计:合计期初账面余额:0.8037099838256836:633810.00:197:2 +报告期初应付账款:期初数应付账款合计:合计期末余额应收账款:0.7810590267181396:571845719.20:121:2 +报告期初应付账款:期初金额应付账款合计:合计期初金额:0.8071702122688293:26834365.63:148:1 +报告期初应付账款:期初金额应付账款合计:合计期初账面余额:0.7994604110717773:633810.00:197:2 +报告期初应付账款:2023年1月1日应付账款合计:2023年1月1日余额合计:0.8344029784202576:151671.00:197:3 +报告期初应付账款:2023年1月1日应付账款合计:2027年期末金额:0.7837668061256409:19820645.33:148:1 +报告期初应付账款:报告期初应付账款余额:合计期末余额应收账款:0.7573323249816895:571845719.20:121:2 +报告期初应付账款:报告期初应付账款余额:应付账款期末折算人民币余额:0.756885290145874:7677713.04:170:1 +报告期初应付账款:期初应付账款余额:1-2年期末余额应收账款:0.8168371915817261:5251065.35:121:2 +报告期初应付账款:期初应付账款余额:1-2年期末余额应收账款:0.8166757822036743:21980836.86:193:1 +报告期初应付账款:期初数应付账款余额:1-2年期末余额应收账款:0.7867940664291382:5251065.35:121:2 +报告期初应付账款:期初数应付账款余额:1-2年期末余额应收账款:0.7867732048034668:21980836.86:193:1 +报告期初应付账款:期初金额应付账款余额:应付账款期末折算人民币余额:0.7952132225036621:7677713.04:170:1 +报告期初应付账款:期初金额应付账款余额:1-2年期末余额应收账款:0.7925553917884827:5251065.35:121:2 +报告期初应付账款:2023年1月1日应付账款余额:2023年1月1日余额合计:0.8463598489761353:151671.00:197:3 +报告期初应付账款:2023年1月1日应付账款余额:2027年期末金额:0.7613712549209595:19820645.33:148:1 +当期销售费用:当期销售费用合计:销售服务费本期发生额:0.8502888083457947:11213141.21:161:2 +当期销售费用:当期销售费用合计:销售服务费上期发生额:0.8354504704475403:9812253.11:161:2 +当期销售费用:本期销售费用合计:销售服务费本期发生额:0.8515200018882751:11213141.21:161:2 +当期销售费用:本期销售费用合计:销售费用2022年度:0.8202098608016968:22310693.51:82:1 +当期销售费用:本报告期销售费用合计:销售费用2022年度:0.746112048625946:22310693.51:82:1 +当期销售费用:本报告期销售费用合计:合计合计营业成本:0.7345873713493347:1512177971.43:160:1 +当期销售费用:报告期销售费用合计:销售费用2022年度:0.7755853533744812:22310693.51:82:1 +当期销售费用:报告期销售费用合计:销售服务费本期发生额:0.7641952037811279:11213141.21:161:2 +当期销售费用:报告期内销售费用合计:销售费用2022年度:0.7319629192352295:22310693.51:82:1 +当期销售费用:报告期内销售费用合计:销售服务费本期发生额:0.7169700860977173:11213141.21:161:2 +当期销售费用:本年度销售费用合计:其他合计营业成本:0.7890352606773376:168869933.15:200:3 +当期销售费用:本年度销售费用合计:其他合计营业成本:0.7890352606773376:73050912.12:160:1 +当期销售费用:本期发生额销售费用合计:销售服务费本期发生额:0.8606821298599243:11213141.21:161:2 +当期销售费用:本期发生额销售费用合计:销售服务费上期发生额:0.8409159779548645:9812253.11:161:2 +当期销售费用:2023年销售费用合计:销售费用2023年度:0.9486556053161621:24094794.79:82:1 +当期销售费用:2023年销售费用合计:销售费用2022年度:0.9145612716674805:22310693.51:82:1 +当期销售费用:2023年全年销售费用合计:销售费用2023年度:0.8935838937759399:24094794.79:82:1 +当期销售费用:2023年全年销售费用合计:销售费用2022年度:0.8574691414833069:22310693.51:82:1 +当期销售费用:2023年金额销售费用合计:销售费用2023年度:0.91605544090271:24094794.79:82:1 +当期销售费用:2023年金额销售费用合计:销售费用2022年度:0.8804787397384644:22310693.51:82:1 +上年同期销售费用:上年同期销售费用合计:合计上期发生额成本:0.753637433052063:1094701926.60:200:2 +上年同期销售费用:上年同期销售费用合计:销售服务费上期发生额:0.7394947409629822:9812253.11:161:2 +上年同期销售费用:上期销售费用合计:销售服务费上期发生额:0.853717029094696:9812253.11:161:2 +上年同期销售费用:上期销售费用合计:销售服务费本期发生额:0.8262584805488586:11213141.21:161:2 +上年同期销售费用:上年度销售费用合计:销售服务费上期发生额:0.7742466926574707:9812253.11:161:2 +上年同期销售费用:上年度销售费用合计:其他合计营业成本:0.7716014385223389:73050912.12:160:1 +上年同期销售费用:2022年销售费用合计:销售费用2022年度:0.9522322416305542:22310693.51:82:1 +上年同期销售费用:2022年销售费用合计:销售费用2023年度:0.9198381900787354:24094794.79:82:1 +上年同期销售费用:2022年全年销售费用合计:销售费用2022年度:0.8900285959243774:22310693.51:82:1 +上年同期销售费用:2022年全年销售费用合计:销售费用2023年度:0.8609659671783447:24094794.79:82:1 +上年同期销售费用:2022年金额销售费用合计:销售费用2022年度:0.9200883507728577:22310693.51:82:1 +上年同期销售费用:2022年金额销售费用合计:销售费用2023年度:0.8846222162246704:24094794.79:82:1 +前年同期销售费用:前年同期销售费用合计:合计上期发生额成本:0.7404971122741699:1094701926.60:200:2 +前年同期销售费用:前年同期销售费用合计:合计上期发生额收入:0.7266584634780884:1316036204.14:200:2 +前年同期销售费用:2021年销售费用合计:销售费用2022年度:0.8809715509414673:22310693.51:82:1 +前年同期销售费用:2021年销售费用合计:销售费用2023年度:0.8596804141998291:24094794.79:82:1 +前年同期销售费用:2021年全年销售费用合计:销售费用2022年度:0.8279953598976135:22310693.51:82:1 +前年同期销售费用:2021年全年销售费用合计:销售费用2023年度:0.8075697422027588:24094794.79:82:1 +前年同期销售费用:2021年金额销售费用合计:销售费用2022年度:0.8479146361351013:22310693.51:82:1 +前年同期销售费用:2021年金额销售费用合计:销售费用2023年度:0.8245225548744202:24094794.79:82:1 +销售费用同比变动:销售费用合计同比变动:销售服务费本期发生额:0.7936614751815796:11213141.21:161:2 +销售费用同比变动:销售费用合计同比变动:销售费用2022年度:0.7908707857131958:22310693.51:82:1 +销售费用同比变动:销售费用合计同比增减:销售服务费上期发生额:0.7833792567253113:9812253.11:161:2 +销售费用同比变动:销售费用合计同比增减:销售服务费本期发生额:0.7758016586303711:11213141.21:161:2 +销售费用同比变动:销售费用合计同比上升:销售服务费上期发生额:0.797362744808197:9812253.11:161:2 +销售费用同比变动:销售费用合计同比上升:销售费用2022年度:0.7819875478744507:22310693.51:82:1 +销售费用同比变动:销售费用合计同比下降:销售费用2022年度:0.759334921836853:22310693.51:82:1 +销售费用同比变动:销售费用合计同比下降:销售服务费上期发生额:0.7496047616004944:9812253.11:161:2 +销售费用同比变动:销售费用合计变化幅度:销售服务费上期发生额:0.8110959529876709:9812253.11:161:2 +销售费用同比变动:销售费用合计变化幅度:销售服务费本期发生额:0.8030269145965576:11213141.21:161:2 +销售费用同比变动:销售费用合计变动比例:销售服务费上期发生额:0.8046965003013611:9812253.11:161:2 +销售费用同比变动:销售费用合计变动比例:销售服务费本期发生额:0.7927078008651733:11213141.21:161:2 +销售费用同比变动:销售费用合计本期比上年同期增减:销售服务费本期发生额:0.7833332419395447:11213141.21:161:2 +销售费用同比变动:销售费用合计本期比上年同期增减:销售服务费上期发生额:0.7628648281097412:9812253.11:161:2 +销售费用同比变动:销售费用合计本年比上年增减:销售服务费本期发生额:0.7777131199836731:11213141.21:161:2 +销售费用同比变动:销售费用合计本年比上年增减:销售服务费上期发生额:0.7675108313560486:9812253.11:161:2 +当期管理费用:当期管理费用合计:付现管理费用本期发生额:0.7994791865348816:32317215.83:165:3 +当期管理费用:当期管理费用合计:付现管理费用上期发生额:0.7956627607345581:24861866.25:165:3 +当期管理费用:本期管理费用合计:管理费用2022年度:0.8170056343078613:49722467.87:82:1 +当期管理费用:本期管理费用合计:管理费用2023年度:0.8064616918563843:53859861.08:82:1 +当期管理费用:本报告期管理费用合计:管理费用2022年度:0.7367563247680664:49722467.87:82:1 +当期管理费用:本报告期管理费用合计:管理费用2023年度:0.7225094437599182:53859861.08:82:1 +当期管理费用:报告期管理费用合计:管理费用2022年度:0.7646634578704834:49722467.87:82:1 +当期管理费用:报告期管理费用合计:管理费用2023年度:0.7497279047966003:53859861.08:82:1 +当期管理费用:报告期内管理费用合计:管理费用2022年度:0.7127650380134583:49722467.87:82:1 +当期管理费用:报告期内管理费用合计:管理费用2023年度:0.6938031315803528:53859861.08:82:1 +当期管理费用:本年度管理费用合计:管理费用2022年度:0.8102744817733765:49722467.87:82:1 +当期管理费用:本年度管理费用合计:管理费用2023年度:0.804446816444397:53859861.08:82:1 +当期管理费用:本期发生额管理费用合计:合计本期发生额成本:0.7881571054458618:1266195618.25:200:2 +当期管理费用:本期发生额管理费用合计:付现管理费用上期发生额:0.7844264507293701:24861866.25:165:3 +当期管理费用:2023年管理费用合计:管理费用2023年度:0.9533434510231018:53859861.08:82:1 +当期管理费用:2023年管理费用合计:管理费用2022年度:0.9280987977981567:49722467.87:82:1 +当期管理费用:2023年全年管理费用合计:管理费用2023年度:0.9158065319061279:53859861.08:82:1 +当期管理费用:2023年全年管理费用合计:管理费用2022年度:0.8902058601379395:49722467.87:82:1 +当期管理费用:2023年金额管理费用合计:管理费用2023年度:0.8810473084449768:53859861.08:82:1 +当期管理费用:2023年金额管理费用合计:管理费用2022年度:0.8550890684127808:49722467.87:82:1 +上年同期管理费用:上年同期管理费用合计:管理费用2022年度:0.7676732540130615:49722467.87:82:1 +上年同期管理费用:上年同期管理费用合计:管理费用2023年度:0.7616453170776367:53859861.08:82:1 +上年同期管理费用:上期管理费用合计:管理费用2022年度:0.7992925047874451:49722467.87:82:1 +上年同期管理费用:上期管理费用合计:管理费用2023年度:0.7942320108413696:53859861.08:82:1 +上年同期管理费用:上年度管理费用合计:管理费用2022年度:0.7958676218986511:49722467.87:82:1 +上年同期管理费用:上年度管理费用合计:管理费用2023年度:0.7898702621459961:53859861.08:82:1 +上年同期管理费用:2022年管理费用合计:管理费用2022年度:0.9580146074295044:49722467.87:82:1 +上年同期管理费用:2022年管理费用合计:管理费用2023年度:0.9245465993881226:53859861.08:82:1 +上年同期管理费用:2022年全年管理费用合计:管理费用2022年度:0.9156702756881714:49722467.87:82:1 +上年同期管理费用:2022年全年管理费用合计:管理费用2023年度:0.8866477608680725:53859861.08:82:1 +上年同期管理费用:2022年金额管理费用合计:管理费用2022年度:0.8825558423995972:49722467.87:82:1 +上年同期管理费用:2022年金额管理费用合计:管理费用2023年度:0.8457334041595459:53859861.08:82:1 +前年同期管理费用:前年同期管理费用合计:管理费用2022年度:0.7457094788551331:49722467.87:82:1 +前年同期管理费用:前年同期管理费用合计:管理费用2023年度:0.739607036113739:53859861.08:82:1 +前年同期管理费用:2021年管理费用合计:管理费用2022年度:0.8995745182037354:49722467.87:82:1 +前年同期管理费用:2021年管理费用合计:管理费用2023年度:0.8791611194610596:53859861.08:82:1 +前年同期管理费用:2021年全年管理费用合计:管理费用2022年度:0.8660081624984741:49722467.87:82:1 +前年同期管理费用:2021年全年管理费用合计:管理费用2023年度:0.8460116982460022:53859861.08:82:1 +前年同期管理费用:2021年金额管理费用合计:管理费用2022年度:0.8359576463699341:49722467.87:82:1 +前年同期管理费用:2021年金额管理费用合计:管理费用2023年度:0.8127288818359375:53859861.08:82:1 +管理费用同比变动:管理费用合计同比变动:管理费用2022年度:0.7915716171264648:49722467.87:82:1 +管理费用同比变动:管理费用合计同比变动:管理费用2023年度:0.7742828130722046:53859861.08:82:1 +管理费用同比变动:管理费用合计同比增减:管理费用2022年度:0.780850350856781:49722467.87:82:1 +管理费用同比变动:管理费用合计同比增减:管理费用2023年度:0.7627355456352234:53859861.08:82:1 +管理费用同比变动:管理费用合计同比上升:管理费用2022年度:0.7927466034889221:49722467.87:82:1 +管理费用同比变动:管理费用合计同比上升:管理费用2023年度:0.7741130590438843:53859861.08:82:1 +管理费用同比变动:管理费用合计同比下降:管理费用2022年度:0.7757989168167114:49722467.87:82:1 +管理费用同比变动:管理费用合计同比下降:管理费用2023年度:0.7532684803009033:53859861.08:82:1 +管理费用同比变动:管理费用合计变化幅度:管理费用2022年度:0.7891071438789368:49722467.87:82:1 +管理费用同比变动:管理费用合计变化幅度:管理费用2023年度:0.7764127254486084:53859861.08:82:1 +管理费用同比变动:管理费用合计变动比例:管理费用2022年度:0.760614275932312:49722467.87:82:1 +管理费用同比变动:管理费用合计变动比例:管理费用2023年度:0.7521030306816101:53859861.08:82:1 +管理费用同比变动:管理费用合计本期比上年同期增减:管理费用2022年度:0.7375778555870056:49722467.87:82:1 +管理费用同比变动:管理费用合计本期比上年同期增减:管理费用2023年度:0.722387969493866:53859861.08:82:1 +管理费用同比变动:管理费用合计本年比上年增减:管理费用2022年度:0.7562362551689148:49722467.87:82:1 +管理费用同比变动:管理费用合计本年比上年增减:管理费用2023年度:0.744993269443512:53859861.08:82:1 +当期财务费用:当期财务费用合计:合计本期发生额成本:0.7826632261276245:1266195618.25:200:2 +当期财务费用:当期财务费用合计:财务费用2022年度:0.7776362895965576:1344301.6:82:1 +当期财务费用:本期财务费用合计:合计本期发生额成本:0.7928518652915955:1266195618.25:200:2 +当期财务费用:本期财务费用合计:财务费用2022年度:0.7903631925582886:1344301.6:82:1 +当期财务费用:本报告期财务费用合计:财务费用2022年度:0.7446427941322327:1344301.6:82:1 +当期财务费用:本报告期财务费用合计:财务费用2023年度:0.7289769053459167:3635779.49:82:1 +当期财务费用:报告期财务费用合计:财务费用2022年度:0.7740914225578308:1344301.6:82:1 +当期财务费用:报告期财务费用合计:财务费用2023年度:0.759307324886322:3635779.49:82:1 +当期财务费用:报告期内财务费用合计:财务费用2022年度:0.7265269756317139:1344301.6:82:1 +当期财务费用:报告期内财务费用合计:财务费用2023年度:0.7055230736732483:3635779.49:82:1 +当期财务费用:本年度财务费用合计:财务费用2022年度:0.7742157578468323:1344301.6:82:1 +当期财务费用:本年度财务费用合计:财务费用2023年度:0.7715103626251221:3635779.49:82:1 +当期财务费用:本期发生额财务费用合计:合计本期发生额成本:0.8520136475563049:1266195618.25:200:2 +当期财务费用:本期发生额财务费用合计:合计上期发生额成本:0.8061702251434326:1094701926.60:200:2 +当期财务费用:2023年财务费用合计:财务费用2023年度:0.9600544571876526:3635779.49:82:1 +当期财务费用:2023年财务费用合计:财务费用2022年度:0.9102057218551636:1344301.6:82:1 +当期财务费用:2023年全年财务费用合计:财务费用2023年度:0.9209787845611572:3635779.49:82:1 +当期财务费用:2023年全年财务费用合计:财务费用2022年度:0.867030143737793:1344301.6:82:1 +当期财务费用:2023年金额财务费用合计:财务费用2023年度:0.9175599813461304:3635779.49:82:1 +当期财务费用:2023年金额财务费用合计:财务费用2022年度:0.8661676645278931:1344301.6:82:1 +上年同期财务费用:上年同期财务费用合计:合计上期发生额成本:0.7293047904968262:1094701926.60:200:2 +上年同期财务费用:上年同期财务费用合计:财务费用2022年度:0.7283450961112976:1344301.6:82:1 +上年同期财务费用:上期财务费用合计:合计上期发生额成本:0.8128847479820251:1094701926.60:200:2 +上年同期财务费用:上期财务费用合计:合计本期发生额成本:0.7831109762191772:1266195618.25:200:2 +上年同期财务费用:上年度财务费用合计:合计上期发生额成本:0.7704497575759888:1094701926.60:200:2 +上年同期财务费用:上年度财务费用合计:合计本期发生额成本:0.7616614103317261:1266195618.25:200:2 +上年同期财务费用:2022年财务费用合计:财务费用2022年度:0.9606430530548096:1344301.6:82:1 +上年同期财务费用:2022年财务费用合计:财务费用2023年度:0.9100829362869263:3635779.49:82:1 +上年同期财务费用:2022年全年财务费用合计:财务费用2022年度:0.9192928671836853:1344301.6:82:1 +上年同期财务费用:2022年全年财务费用合计:财务费用2023年度:0.8717846274375916:3635779.49:82:1 +上年同期财务费用:2022年金额财务费用合计:财务费用2022年度:0.9169302582740784:1344301.6:82:1 +上年同期财务费用:2022年金额财务费用合计:财务费用2023年度:0.861065685749054:3635779.49:82:1 +前年同期财务费用:前年同期财务费用合计:合计上期发生额成本:0.7038044929504395:1094701926.60:200:2 +前年同期财务费用:前年同期财务费用合计:财务费用2022年度:0.7002814412117004:1344301.6:82:1 +前年同期财务费用:2021年财务费用合计:财务费用2022年度:0.8741729855537415:1344301.6:82:1 +前年同期财务费用:2021年财务费用合计:财务费用2023年度:0.8464341163635254:3635779.49:82:1 +前年同期财务费用:2021年全年财务费用合计:财务费用2022年度:0.8360084295272827:1344301.6:82:1 +前年同期财务费用:2021年全年财务费用合计:财务费用2023年度:0.8081990480422974:3635779.49:82:1 +前年同期财务费用:2021年金额财务费用合计:财务费用2022年度:0.8238554000854492:1344301.6:82:1 +前年同期财务费用:2021年金额财务费用合计:财务费用2023年度:0.7925317287445068:3635779.49:82:1 +财务费用同比变动:财务费用合计同比变动:财务费用2022年度:0.7725768685340881:1344301.6:82:1 +财务费用同比变动:财务费用合计同比变动:财务费用2023年度:0.7574034929275513:3635779.49:82:1 +财务费用同比变动:财务费用合计同比增减:财务费用补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.741489589214325:-1869908.34:168:2 +财务费用同比变动:财务费用合计同比增减:财务费用补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.7409719824790955:-172751.41:168:2 +财务费用同比变动:财务费用合计同比上升:财务费用2022年度:0.7476550340652466:1344301.6:82:1 +财务费用同比变动:财务费用合计同比上升:财务费用2023年度:0.7344062924385071:3635779.49:82:1 +财务费用同比变动:财务费用合计同比下降:财务费用2022年度:0.735169529914856:1344301.6:82:1 +财务费用同比变动:财务费用合计同比下降:财务费用2023年度:0.7120358347892761:3635779.49:82:1 +财务费用同比变动:财务费用合计变化幅度:财务费用2022年度:0.7482195496559143:1344301.6:82:1 +财务费用同比变动:财务费用合计变化幅度:财务费用2023年度:0.7342737317085266:3635779.49:82:1 +财务费用同比变动:财务费用合计变动比例:财务费用2022年度:0.7253965735435486:1344301.6:82:1 +财务费用同比变动:财务费用合计变动比例:合计上期发生额成本:0.7195844650268555:1094701926.60:200:2 +财务费用同比变动:财务费用合计本期比上年同期增减:财务费用补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.7817389965057373:-172751.41:168:2 +财务费用同比变动:财务费用合计本期比上年同期增减:财务费用补充资料本期金额上期金额1.将净利润调节为经营活动现金流量::0.7650370001792908:-1869908.34:168:2 +财务费用同比变动:财务费用合计本年比上年增减:财务费用补充资料本期金额上期金额1.将净利润调节为经营活动现金流量:160945884.96128488991.57:0.7553203701972961:-172751.41:168:2 +财务费用同比变动:财务费用合计本年比上年增减:财务费用2022年度:0.7459166646003723:1344301.6:82:1 +当期研发费用:当期研发费用合计:其中:费用化研发支出本期发生额:0.8482924699783325:59488138.59:171:1 +当期研发费用:当期研发费用合计:其中:费用化研发支出上期发生额:0.8278329372406006:62189328.77:171:1 +当期研发费用:本期研发费用合计:其中:费用化研发支出本期发生额:0.8590143918991089:59488138.59:171:1 +当期研发费用:本期研发费用合计:其中:费用化研发支出上期发生额:0.8108137249946594:62189328.77:171:1 +当期研发费用:本报告期研发费用合计:其中:费用化研发支出本期发生额:0.7906324863433838:59488138.59:171:1 +当期研发费用:本报告期研发费用合计:其中:费用化研发支出上期发生额:0.7619344592094421:62189328.77:171:1 +当期研发费用:报告期研发费用合计:其中:费用化研发支出本期发生额:0.8011545538902283:59488138.59:171:1 +当期研发费用:报告期研发费用合计:其中:费用化研发支出上期发生额:0.7846811413764954:62189328.77:171:1 +当期研发费用:报告期内研发费用合计:其中:费用化研发支出本期发生额:0.7646077871322632:59488138.59:171:1 +当期研发费用:报告期内研发费用合计:其中:费用化研发支出上期发生额:0.7321047186851501:62189328.77:171:1 +当期研发费用:本年度研发费用合计:其中:费用化研发支出本期发生额:0.7972168922424316:59488138.59:171:1 +当期研发费用:本年度研发费用合计:研发费用2022年度:0.7714356184005737:46492323.47:82:1 +当期研发费用:本期发生额研发费用合计:其中:费用化研发支出本期发生额:0.841005802154541:59488138.59:171:1 +当期研发费用:本期发生额研发费用合计:付现研发费用本期发生额:0.8131992816925049:15714448.39:165:3 +当期研发费用:2023年研发费用合计:研发费用2023年度:0.9553529024124146:40413176.50:82:1 +当期研发费用:2023年研发费用合计:研发费用2022年度:0.9252932071685791:46492323.47:82:1 +当期研发费用:2023年全年研发费用合计:研发费用2023年度:0.9241452813148499:40413176.50:82:1 +当期研发费用:2023年全年研发费用合计:研发费用2022年度:0.891770601272583:46492323.47:82:1 +当期研发费用:2023年金额研发费用合计:研发费用2023年度:0.9075791239738464:40413176.50:82:1 +当期研发费用:2023年金额研发费用合计:研发费用2022年度:0.8714181184768677:46492323.47:82:1 +当期研发费用:当期费用化研发投入:其中:费用化研发支出上期发生额:0.8134006857872009:62189328.77:171:1 +当期研发费用:当期费用化研发投入:其中:费用化研发支出本期发生额:0.7867863774299622:59488138.59:171:1 +当期研发费用:本期费用化研发投入:其中:费用化研发支出上期发生额:0.7989080548286438:62189328.77:171:1 +当期研发费用:本期费用化研发投入:其中:费用化研发支出本期发生额:0.7895255088806152:59488138.59:171:1 +当期研发费用:本报告期费用化研发投入:其中:费用化研发支出上期发生额:0.8490074872970581:62189328.77:171:1 +当期研发费用:本报告期费用化研发投入:其中:费用化研发支出本期发生额:0.824533224105835:59488138.59:171:1 +当期研发费用:报告期费用化研发投入:其中:费用化研发支出上期发生额:0.8347005844116211:62189328.77:171:1 +当期研发费用:报告期费用化研发投入:其中:费用化研发支出本期发生额:0.8031103014945984:59488138.59:171:1 +当期研发费用:报告期内费用化研发投入:其中:费用化研发支出上期发生额:0.8660442233085632:62189328.77:171:1 +当期研发费用:报告期内费用化研发投入:其中:费用化研发支出本期发生额:0.8517147898674011:59488138.59:171:1 +当期研发费用:本年度费用化研发投入:其中:费用化研发支出上期发生额:0.8285514116287231:62189328.77:171:1 +当期研发费用:本年度费用化研发投入:其中:费用化研发支出本期发生额:0.8180673718452454:59488138.59:171:1 +当期研发费用:本期发生额费用化研发投入:其中:费用化研发支出上期发生额:0.8243467211723328:62189328.77:171:1 +当期研发费用:本期发生额费用化研发投入:其中:费用化研发支出本期发生额:0.8150284886360168:59488138.59:171:1 +当期研发费用:2023年费用化研发投入:研发费用2023年度:0.8054366707801819:40413176.50:82:1 +当期研发费用:2023年费用化研发投入:研发费用2022年度:0.7762700915336609:46492323.47:82:1 +当期研发费用:2023年全年费用化研发投入:研发费用2023年度:0.8287012577056885:40413176.50:82:1 +当期研发费用:2023年全年费用化研发投入:研发费用2022年度:0.7991495728492737:46492323.47:82:1 +当期研发费用:2023年金额费用化研发投入:研发费用2023年度:0.8049963712692261:40413176.50:82:1 +当期研发费用:2023年金额费用化研发投入:研发费用2022年度:0.7737802267074585:46492323.47:82:1 +上年同期研发费用:上年同期研发费用合计:其中:费用化研发支出上期发生额:0.7782645225524902:62189328.77:171:1 +上年同期研发费用:上年同期研发费用合计:其中:费用化研发支出本期发生额:0.7635209560394287:59488138.59:171:1 +上年同期研发费用:上期研发费用合计:其中:费用化研发支出上期发生额:0.8464184999465942:62189328.77:171:1 +上年同期研发费用:上期研发费用合计:其中:费用化研发支出本期发生额:0.8386982083320618:59488138.59:171:1 +上年同期研发费用:上年度研发费用合计:其中:费用化研发支出本期发生额:0.7832903861999512:59488138.59:171:1 +上年同期研发费用:上年度研发费用合计:其中:费用化研发支出上期发生额:0.7745546698570251:62189328.77:171:1 +上年同期研发费用:2022年研发费用合计:研发费用2022年度:0.9585002660751343:46492323.47:82:1 +上年同期研发费用:2022年研发费用合计:研发费用2023年度:0.9245561957359314:40413176.50:82:1 +上年同期研发费用:2022年全年研发费用合计:研发费用2022年度:0.9226511716842651:46492323.47:82:1 +上年同期研发费用:2022年全年研发费用合计:研发费用2023年度:0.891923725605011:40413176.50:82:1 +上年同期研发费用:2022年金额研发费用合计:研发费用2022年度:0.900986909866333:46492323.47:82:1 +上年同期研发费用:2022年金额研发费用合计:研发费用2023年度:0.8684234023094177:40413176.50:82:1 +上年同期研发费用:上年同期费用化研发投入:其中:费用化研发支出上期发生额:0.8453018665313721:62189328.77:171:1 +上年同期研发费用:上年同期费用化研发投入:其中:费用化研发支出本期发生额:0.7988941669464111:59488138.59:171:1 +上年同期研发费用:上期费用化研发投入:其中:费用化研发支出上期发生额:0.8431870341300964:62189328.77:171:1 +上年同期研发费用:上期费用化研发投入:其中:费用化研发支出本期发生额:0.7950496673583984:59488138.59:171:1 +上年同期研发费用:上年度费用化研发投入:其中:费用化研发支出上期发生额:0.8647117018699646:62189328.77:171:1 +上年同期研发费用:上年度费用化研发投入:其中:费用化研发支出本期发生额:0.8251071572303772:59488138.59:171:1 +上年同期研发费用:2022年费用化研发投入:研发费用2022年度:0.7987691760063171:46492323.47:82:1 +上年同期研发费用:2022年费用化研发投入:研发费用2023年度:0.780080258846283:40413176.50:82:1 +上年同期研发费用:2022年全年费用化研发投入:研发费用2022年度:0.825167715549469:46492323.47:82:1 +上年同期研发费用:2022年全年费用化研发投入:研发费用2023年度:0.808775782585144:40413176.50:82:1 +上年同期研发费用:2022年金额费用化研发投入:研发费用2022年度:0.7927082777023315:46492323.47:82:1 +上年同期研发费用:2022年金额费用化研发投入:其中:费用化研发支出上期发生额:0.7715504765510559:62189328.77:171:1 +前年同期研发费用:前年同期研发费用合计:其中:费用化研发支出上期发生额:0.7456375956535339:62189328.77:171:1 +前年同期研发费用:前年同期研发费用合计:其中:费用化研发支出本期发生额:0.7341616153717041:59488138.59:171:1 +前年同期研发费用:2021年研发费用合计:研发费用2022年度:0.8766095638275146:46492323.47:82:1 +前年同期研发费用:2021年研发费用合计:研发费用2023年度:0.8497543931007385:40413176.50:82:1 +前年同期研发费用:2021年全年研发费用合计:研发费用2022年度:0.8454886674880981:46492323.47:82:1 +前年同期研发费用:2021年全年研发费用合计:研发费用2023年度:0.820156455039978:40413176.50:82:1 +前年同期研发费用:2021年金额研发费用合计:研发费用2022年度:0.8148799538612366:46492323.47:82:1 +前年同期研发费用:2021年金额研发费用合计:研发费用2023年度:0.7916519641876221:40413176.50:82:1 +前年同期研发费用:前年同期费用化研发投入:其中:费用化研发支出上期发生额:0.8419346213340759:62189328.77:171:1 +前年同期研发费用:前年同期费用化研发投入:其中:费用化研发支出本期发生额:0.7998185157775879:59488138.59:171:1 +前年同期研发费用:2021年费用化研发投入:其中:费用化研发支出上期发生额:0.7515115141868591:62189328.77:171:1 +前年同期研发费用:2021年费用化研发投入:研发费用2022年度:0.7364245057106018:46492323.47:82:1 +前年同期研发费用:2021年全年费用化研发投入:研发费用2022年度:0.757165789604187:46492323.47:82:1 +前年同期研发费用:2021年全年费用化研发投入:其中:费用化研发支出上期发生额:0.751413881778717:62189328.77:171:1 +前年同期研发费用:2021年金额费用化研发投入:其中:费用化研发支出上期发生额:0.7624894380569458:62189328.77:171:1 +前年同期研发费用:2021年金额费用化研发投入:其中:费用化研发支出本期发生额:0.7370168566703796:59488138.59:171:1 +研发费用同比变动:研发费用合计同比变动:其中:费用化研发支出上期发生额:0.7876659035682678:62189328.77:171:1 +研发费用同比变动:研发费用合计同比变动:其中:费用化研发支出本期发生额:0.786831259727478:59488138.59:171:1 +研发费用同比变动:研发费用合计同比增减:其中:费用化研发支出上期发生额:0.8126370310783386:62189328.77:171:1 +研发费用同比变动:研发费用合计同比增减:其中:费用化研发支出本期发生额:0.8030186295509338:59488138.59:171:1 +研发费用同比变动:研发费用合计同比上升:其中:费用化研发支出上期发生额:0.820818305015564:62189328.77:171:1 +研发费用同比变动:研发费用合计同比上升:其中:费用化研发支出本期发生额:0.8008311986923218:59488138.59:171:1 +研发费用同比变动:研发费用合计同比下降:其中:费用化研发支出上期发生额:0.7808071374893188:62189328.77:171:1 +研发费用同比变动:研发费用合计同比下降:其中:费用化研发支出本期发生额:0.7647489309310913:59488138.59:171:1 +研发费用同比变动:研发费用合计变化幅度:其中:费用化研发支出本期发生额:0.7803255915641785:59488138.59:171:1 +研发费用同比变动:研发费用合计变化幅度:其中:费用化研发支出上期发生额:0.7783536911010742:62189328.77:171:1 +研发费用同比变动:研发费用合计变动比例:其中:费用化研发支出本期发生额:0.7721972465515137:59488138.59:171:1 +研发费用同比变动:研发费用合计变动比例:其中:费用化研发支出上期发生额:0.7708457708358765:62189328.77:171:1 +研发费用同比变动:研发费用合计本期比上年同期增减:其中:费用化研发支出本期发生额:0.7943031191825867:59488138.59:171:1 +研发费用同比变动:研发费用合计本期比上年同期增减:其中:费用化研发支出上期发生额:0.7875047922134399:62189328.77:171:1 +研发费用同比变动:研发费用合计本年比上年增减:其中:费用化研发支出本期发生额:0.7955412864685059:59488138.59:171:1 +研发费用同比变动:研发费用合计本年比上年增减:其中:费用化研发支出上期发生额:0.7883235812187195:62189328.77:171:1 +研发费用同比变动:费用化研发投入同比变动:其中:费用化研发支出上期发生额:0.8635380864143372:62189328.77:171:1 +研发费用同比变动:费用化研发投入同比变动:其中:费用化研发支出本期发生额:0.8283059597015381:59488138.59:171:1 +研发费用同比变动:费用化研发投入同比增减:其中:费用化研发支出上期发生额:0.848540723323822:62189328.77:171:1 +研发费用同比变动:费用化研发投入同比增减:其中:费用化研发支出本期发生额:0.8094174265861511:59488138.59:171:1 +研发费用同比变动:费用化研发投入同比上升:其中:费用化研发支出上期发生额:0.8192704319953918:62189328.77:171:1 +研发费用同比变动:费用化研发投入同比上升:其中:费用化研发支出本期发生额:0.7746274471282959:59488138.59:171:1 +研发费用同比变动:费用化研发投入同比下降:其中:费用化研发支出上期发生额:0.814490556716919:62189328.77:171:1 +研发费用同比变动:费用化研发投入同比下降:其中:费用化研发支出本期发生额:0.77069091796875:59488138.59:171:1 +研发费用同比变动:费用化研发投入变化幅度:其中:费用化研发支出上期发生额:0.8113885521888733:62189328.77:171:1 +研发费用同比变动:费用化研发投入变化幅度:其中:费用化研发支出本期发生额:0.7745591402053833:59488138.59:171:1 +研发费用同比变动:费用化研发投入变动比例:其中:费用化研发支出上期发生额:0.8423951268196106:62189328.77:171:1 +研发费用同比变动:费用化研发投入变动比例:其中:费用化研发支出本期发生额:0.8073174953460693:59488138.59:171:1 +研发费用同比变动:费用化研发投入本期比上年同期增减:其中:费用化研发支出上期发生额:0.889008641242981:62189328.77:171:1 +研发费用同比变动:费用化研发投入本期比上年同期增减:其中:费用化研发支出本期发生额:0.8691677451133728:59488138.59:171:1 +研发费用同比变动:费用化研发投入本年比上年增减:其中:费用化研发支出上期发生额:0.8511839509010315:62189328.77:171:1 +研发费用同比变动:费用化研发投入本年比上年增减:其中:费用化研发支出本期发生额:0.8216643929481506:59488138.59:171:1 +当期研发投入:当期研发投入金额:其中:费用化研发支出本期发生额:0.8011746406555176:59488138.59:171:1 +当期研发投入:当期研发投入金额:其中:费用化研发支出上期发生额:0.7848328351974487:62189328.77:171:1 +当期研发投入:本期研发投入金额:其中:费用化研发支出本期发生额:0.7976077795028687:59488138.59:171:1 +当期研发投入:本期研发投入金额:其中:费用化研发支出上期发生额:0.7582603693008423:62189328.77:171:1 +当期研发投入:本报告期研发投入金额:其中:费用化研发支出本期发生额:0.7776451110839844:59488138.59:171:1 +当期研发投入:本报告期研发投入金额:其中:费用化研发支出上期发生额:0.7592961192131042:62189328.77:171:1 +当期研发投入:报告期研发投入金额:其中:费用化研发支出本期发生额:0.7780441045761108:59488138.59:171:1 +当期研发投入:报告期研发投入金额:其中:费用化研发支出上期发生额:0.7689294815063477:62189328.77:171:1 +当期研发投入:报告期内研发投入金额:其中:费用化研发支出本期发生额:0.7618732452392578:59488138.59:171:1 +当期研发投入:报告期内研发投入金额:其中:费用化研发支出上期发生额:0.7341662049293518:62189328.77:171:1 +当期研发投入:本年度研发投入金额:其中:费用化研发支出本期发生额:0.7582212686538696:59488138.59:171:1 +当期研发投入:本年度研发投入金额:研发费用2022年度:0.7173565626144409:46492323.47:82:1 +当期研发投入:本期发生额研发投入金额:其中:费用化研发支出本期发生额:0.8158197402954102:59488138.59:171:1 +当期研发投入:本期发生额研发投入金额:其中:费用化研发支出上期发生额:0.7907412052154541:62189328.77:171:1 +当期研发投入:2023年研发投入金额:研发费用2023年度:0.868328869342804:40413176.50:82:1 +当期研发投入:2023年研发投入金额:研发费用2022年度:0.8333661556243896:46492323.47:82:1 +当期研发投入:2023年全年研发投入金额:研发费用2023年度:0.8649724125862122:40413176.50:82:1 +当期研发投入:2023年全年研发投入金额:研发费用2022年度:0.830211877822876:46492323.47:82:1 +当期研发投入:2023年金额研发投入金额:研发费用2023年度:0.825864315032959:40413176.50:82:1 +当期研发投入:2023年金额研发投入金额:研发费用2022年度:0.7938939332962036:46492323.47:82:1 +当期研发投入:当期研发支出金额:其中:费用化研发支出本期发生额:0.8371860980987549:59488138.59:171:1 +当期研发投入:当期研发支出金额:其中:费用化研发支出上期发生额:0.8286018371582031:62189328.77:171:1 +当期研发投入:本期研发支出金额:其中:费用化研发支出本期发生额:0.8633166551589966:59488138.59:171:1 +当期研发投入:本期研发支出金额:其中:费用化研发支出上期发生额:0.8305703997612:62189328.77:171:1 +当期研发投入:本报告期研发支出金额:其中:费用化研发支出本期发生额:0.8024144768714905:59488138.59:171:1 +当期研发投入:本报告期研发支出金额:其中:费用化研发支出上期发生额:0.78697270154953:62189328.77:171:1 +当期研发投入:报告期研发支出金额:其中:费用化研发支出本期发生额:0.8029383420944214:59488138.59:171:1 +当期研发投入:报告期研发支出金额:其中:费用化研发支出上期发生额:0.799511730670929:62189328.77:171:1 +当期研发投入:报告期内研发支出金额:其中:费用化研发支出本期发生额:0.7740678787231445:59488138.59:171:1 +当期研发投入:报告期内研发支出金额:其中:费用化研发支出上期发生额:0.7498541474342346:62189328.77:171:1 +当期研发投入:本年度研发支出金额:其中:费用化研发支出本期发生额:0.8081645965576172:59488138.59:171:1 +当期研发投入:本年度研发支出金额:其中:费用化研发支出上期发生额:0.7703669667243958:62189328.77:171:1 +当期研发投入:本期发生额研发支出金额:其中:费用化研发支出本期发生额:0.8544797897338867:59488138.59:171:1 +当期研发投入:本期发生额研发支出金额:其中:费用化研发支出上期发生额:0.8329595923423767:62189328.77:171:1 +当期研发投入:2023年研发支出金额:研发费用2023年度:0.8923414349555969:40413176.50:82:1 +当期研发投入:2023年研发支出金额:研发费用2022年度:0.8593515157699585:46492323.47:82:1 +当期研发投入:2023年全年研发支出金额:研发费用2023年度:0.8747934103012085:40413176.50:82:1 +当期研发投入:2023年全年研发支出金额:研发费用2022年度:0.8411500453948975:46492323.47:82:1 +当期研发投入:2023年金额研发支出金额:研发费用2023年度:0.8475143909454346:40413176.50:82:1 +当期研发投入:2023年金额研发支出金额:研发费用2022年度:0.814691424369812:46492323.47:82:1 +上年同期研发投入:上年同期研发投入金额:其中:费用化研发支出上期发生额:0.7716317772865295:62189328.77:171:1 +上年同期研发投入:上年同期研发投入金额:其中:费用化研发支出本期发生额:0.7471718788146973:59488138.59:171:1 +上年同期研发投入:上期研发投入金额:其中:费用化研发支出上期发生额:0.809795081615448:62189328.77:171:1 +上年同期研发投入:上期研发投入金额:其中:费用化研发支出本期发生额:0.8006811141967773:59488138.59:171:1 +上年同期研发投入:上年度研发投入金额:其中:费用化研发支出本期发生额:0.7596837282180786:59488138.59:171:1 +上年同期研发投入:上年度研发投入金额:其中:费用化研发支出上期发生额:0.7532347440719604:62189328.77:171:1 +上年同期研发投入:2022年研发投入金额:研发费用2022年度:0.8732930421829224:46492323.47:82:1 +上年同期研发投入:2022年研发投入金额:研发费用2023年度:0.8414447903633118:40413176.50:82:1 +上年同期研发投入:2022年全年研发投入金额:研发费用2022年度:0.8680919408798218:46492323.47:82:1 +上年同期研发投入:2022年全年研发投入金额:研发费用2023年度:0.8384578227996826:40413176.50:82:1 +上年同期研发投入:2022年金额研发投入金额:研发费用2022年度:0.8216285705566406:46492323.47:82:1 +上年同期研发投入:2022年金额研发投入金额:研发费用2023年度:0.7905395030975342:40413176.50:82:1 +上年同期研发投入:上年同期研发支出金额:其中:费用化研发支出上期发生额:0.7897493243217468:62189328.77:171:1 +上年同期研发投入:上年同期研发支出金额:其中:费用化研发支出本期发生额:0.761771023273468:59488138.59:171:1 +上年同期研发投入:上期研发支出金额:其中:费用化研发支出上期发生额:0.856290876865387:62189328.77:171:1 +上年同期研发投入:上期研发支出金额:其中:费用化研发支出本期发生额:0.8367624282836914:59488138.59:171:1 +上年同期研发投入:上年度研发支出金额:其中:费用化研发支出上期发生额:0.7887541651725769:62189328.77:171:1 +上年同期研发投入:上年度研发支出金额:其中:费用化研发支出本期发生额:0.7886950969696045:59488138.59:171:1 +上年同期研发投入:2022年研发支出金额:研发费用2022年度:0.8960452675819397:46492323.47:82:1 +上年同期研发投入:2022年研发支出金额:研发费用2023年度:0.8642931580543518:40413176.50:82:1 +上年同期研发投入:2022年全年研发支出金额:研发费用2022年度:0.8757795095443726:46492323.47:82:1 +上年同期研发投入:2022年全年研发支出金额:研发费用2023年度:0.8456503748893738:40413176.50:82:1 +上年同期研发投入:2022年金额研发支出金额:研发费用2022年度:0.8425536155700684:46492323.47:82:1 +上年同期研发投入:2022年金额研发支出金额:研发费用2023年度:0.8110005855560303:40413176.50:82:1 +前年同期研发投入:前年同期研发投入金额:其中:费用化研发支出上期发生额:0.7326213121414185:62189328.77:171:1 +前年同期研发投入:前年同期研发投入金额:其中:费用化研发支出本期发生额:0.7100021243095398:59488138.59:171:1 +前年同期研发投入:2021年研发投入金额:研发费用2022年度:0.7941097021102905:46492323.47:82:1 +前年同期研发投入:2021年研发投入金额:研发费用2023年度:0.7726119756698608:40413176.50:82:1 +前年同期研发投入:2021年全年研发投入金额:研发费用2022年度:0.7931640148162842:46492323.47:82:1 +前年同期研发投入:2021年全年研发投入金额:研发费用2023年度:0.7714583873748779:40413176.50:82:1 +前年同期研发投入:2021年金额研发投入金额:研发费用2022年度:0.7456508278846741:46492323.47:82:1 +前年同期研发投入:2021年金额研发投入金额:研发费用2023年度:0.7263417840003967:40413176.50:82:1 +前年同期研发投入:前年同期研发支出金额:其中:费用化研发支出上期发生额:0.7619628310203552:62189328.77:171:1 +前年同期研发投入:前年同期研发支出金额:其中:费用化研发支出本期发生额:0.7351360321044922:59488138.59:171:1 +前年同期研发投入:2021年研发支出金额:研发费用2022年度:0.8142543435096741:46492323.47:82:1 +前年同期研发投入:2021年研发支出金额:研发费用2023年度:0.7945753931999207:40413176.50:82:1 +前年同期研发投入:2021年全年研发支出金额:研发费用2022年度:0.8010973930358887:46492323.47:82:1 +前年同期研发投入:2021年全年研发支出金额:研发费用2023年度:0.7808692455291748:40413176.50:82:1 +前年同期研发投入:2021年金额研发支出金额:研发费用2022年度:0.7599626779556274:46492323.47:82:1 +前年同期研发投入:2021年金额研发支出金额:研发费用2023年度:0.7419766187667847:40413176.50:82:1 +研发投入同比变动:研发投入金额同比变动:其中:费用化研发支出上期发生额:0.7543234825134277:62189328.77:171:1 +研发投入同比变动:研发投入金额同比变动:其中:费用化研发支出本期发生额:0.7492598295211792:59488138.59:171:1 +研发投入同比变动:研发投入金额同比增减:其中:费用化研发支出上期发生额:0.7613822221755981:62189328.77:171:1 +研发投入同比变动:研发投入金额同比增减:其中:费用化研发支出本期发生额:0.7442132234573364:59488138.59:171:1 +研发投入同比变动:研发投入金额同比上升:其中:费用化研发支出上期发生额:0.7526810169219971:62189328.77:171:1 +研发投入同比变动:研发投入金额同比上升:其中:费用化研发支出本期发生额:0.7269998788833618:59488138.59:171:1 +研发投入同比变动:研发投入金额同比下降:其中:费用化研发支出上期发生额:0.7304876446723938:62189328.77:171:1 +研发投入同比变动:研发投入金额同比下降:其中:费用化研发支出本期发生额:0.7060518264770508:59488138.59:171:1 +研发投入同比变动:研发投入金额变化幅度:其中:费用化研发支出上期发生额:0.7614496350288391:62189328.77:171:1 +研发投入同比变动:研发投入金额变化幅度:其中:费用化研发支出本期发生额:0.7522437572479248:59488138.59:171:1 +研发投入同比变动:研发投入金额变动比例:其中:费用化研发支出上期发生额:0.7516428828239441:62189328.77:171:1 +研发投入同比变动:研发投入金额变动比例:其中:费用化研发支出本期发生额:0.7449641823768616:59488138.59:171:1 +研发投入同比变动:研发投入金额本期比上年同期增减:其中:费用化研发支出本期发生额:0.7621433734893799:59488138.59:171:1 +研发投入同比变动:研发投入金额本期比上年同期增减:其中:费用化研发支出上期发生额:0.7612549662590027:62189328.77:171:1 +研发投入同比变动:研发投入金额本年比上年增减:其中:费用化研发支出上期发生额:0.7641503214836121:62189328.77:171:1 +研发投入同比变动:研发投入金额本年比上年增减:其中:费用化研发支出本期发生额:0.761948823928833:59488138.59:171:1 +研发投入同比变动:研发支出金额同比变动:其中:费用化研发支出上期发生额:0.7883933186531067:62189328.77:171:1 +研发投入同比变动:研发支出金额同比变动:其中:费用化研发支出本期发生额:0.7773956060409546:59488138.59:171:1 +研发投入同比变动:研发支出金额同比增减:其中:费用化研发支出上期发生额:0.8042576909065247:62189328.77:171:1 +研发投入同比变动:研发支出金额同比增减:其中:费用化研发支出本期发生额:0.7828094959259033:59488138.59:171:1 +研发投入同比变动:研发支出金额同比上升:其中:费用化研发支出上期发生额:0.8033867478370667:62189328.77:171:1 +研发投入同比变动:研发支出金额同比上升:其中:费用化研发支出本期发生额:0.7722020149230957:59488138.59:171:1 +研发投入同比变动:研发支出金额同比下降:其中:费用化研发支出上期发生额:0.7748376727104187:62189328.77:171:1 +研发投入同比变动:研发支出金额同比下降:其中:费用化研发支出本期发生额:0.7471243143081665:59488138.59:171:1 +研发投入同比变动:研发支出金额变化幅度:其中:费用化研发支出上期发生额:0.8078420758247375:62189328.77:171:1 +研发投入同比变动:研发支出金额变化幅度:其中:费用化研发支出本期发生额:0.7927571535110474:59488138.59:171:1 +研发投入同比变动:研发支出金额变动比例:其中:费用化研发支出上期发生额:0.7890496850013733:62189328.77:171:1 +研发投入同比变动:研发支出金额变动比例:其中:费用化研发支出本期发生额:0.7774198055267334:59488138.59:171:1 +研发投入同比变动:研发支出金额本期比上年同期增减:其中:费用化研发支出上期发生额:0.7922061681747437:62189328.77:171:1 +研发投入同比变动:研发支出金额本期比上年同期增减:其中:费用化研发支出本期发生额:0.7877682447433472:59488138.59:171:1 +研发投入同比变动:研发支出金额本年比上年增减:其中:费用化研发支出上期发生额:0.8003973364830017:62189328.77:171:1 +研发投入同比变动:研发支出金额本年比上年增减:其中:费用化研发支出本期发生额:0.7926489114761353:59488138.59:171:1 +当期资本化研发投入:当期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7040315270423889:62189328.77:171:1 +当期资本化研发投入:当期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.6884761452674866:59488138.59:171:1 +当期资本化研发投入:本期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7262288331985474:59488138.59:171:1 +当期资本化研发投入:本期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7202708125114441:62189328.77:171:1 +当期资本化研发投入:本报告期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.6992024779319763:62189328.77:171:1 +当期资本化研发投入:本报告期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.6881996393203735:59488138.59:171:1 +当期资本化研发投入:报告期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.6996340155601501:62189328.77:171:1 +当期资本化研发投入:报告期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.6811620593070984:59488138.59:171:1 +当期资本化研发投入:报告期内研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7275335192680359:62189328.77:171:1 +当期资本化研发投入:报告期内研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7273496985435486:59488138.59:171:1 +当期资本化研发投入:本年度研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7095011472702026:59488138.59:171:1 +当期资本化研发投入:本年度研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7001384496688843:62189328.77:171:1 +当期资本化研发投入:本期发生额研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7263201475143433:59488138.59:171:1 +当期资本化研发投入:本期发生额研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7221813201904297:62189328.77:171:1 +当期资本化研发投入:2023年研发投入资本化的金额:研发费用2023年度:0.7363513708114624:40413176.50:82:1 +当期资本化研发投入:2023年研发投入资本化的金额:研发费用2022年度:0.7016579508781433:46492323.47:82:1 +当期资本化研发投入:2023年全年研发投入资本化的金额:研发费用2023年度:0.7624906301498413:40413176.50:82:1 +当期资本化研发投入:2023年全年研发投入资本化的金额:研发费用2022年度:0.7295544743537903:46492323.47:82:1 +当期资本化研发投入:2023年金额研发投入资本化的金额:研发费用2023年度:0.7127232551574707:40413176.50:82:1 +当期资本化研发投入:2023年金额研发投入资本化的金额:研发费用2022年度:0.6776072382926941:46492323.47:82:1 +当期资本化研发投入:当期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7516232132911682:62189328.77:171:1 +当期资本化研发投入:当期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7313761711120605:59488138.59:171:1 +当期资本化研发投入:本期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7693076729774475:62189328.77:171:1 +当期资本化研发投入:本期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7656526565551758:59488138.59:171:1 +当期资本化研发投入:本报告期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7334250807762146:62189328.77:171:1 +当期资本化研发投入:本报告期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7200056314468384:59488138.59:171:1 +当期资本化研发投入:报告期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7373440861701965:62189328.77:171:1 +当期资本化研发投入:报告期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7150998115539551:59488138.59:171:1 +当期资本化研发投入:报告期内研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7563024163246155:62189328.77:171:1 +当期资本化研发投入:报告期内研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7523415088653564:59488138.59:171:1 +当期资本化研发投入:本年度研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7455784678459167:62189328.77:171:1 +当期资本化研发投入:本年度研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7451550960540771:59488138.59:171:1 +当期资本化研发投入:本期发生额研发支出资本化的金额:其中:费用化研发支出本期发生额:0.768402636051178:59488138.59:171:1 +当期资本化研发投入:本期发生额研发支出资本化的金额:其中:费用化研发支出上期发生额:0.768030047416687:62189328.77:171:1 +当期资本化研发投入:2023年研发支出资本化的金额:研发费用2023年度:0.7612175941467285:40413176.50:82:1 +当期资本化研发投入:2023年研发支出资本化的金额:研发费用2022年度:0.7259216904640198:46492323.47:82:1 +当期资本化研发投入:2023年全年研发支出资本化的金额:研发费用2023年度:0.7781775593757629:40413176.50:82:1 +当期资本化研发投入:2023年全年研发支出资本化的金额:研发费用2022年度:0.7443914413452148:46492323.47:82:1 +当期资本化研发投入:2023年金额研发支出资本化的金额:研发费用2023年度:0.7459957003593445:40413176.50:82:1 +当期资本化研发投入:2023年金额研发支出资本化的金额:研发费用2022年度:0.7083063125610352:46492323.47:82:1 +当期资本化研发投入:当期资本化研发投入:其中:费用化研发支出上期发生额:0.674224853515625:62189328.77:171:1 +当期资本化研发投入:当期资本化研发投入:其中:费用化研发支出本期发生额:0.648833692073822:59488138.59:171:1 +当期资本化研发投入:本期资本化研发投入:其中:费用化研发支出上期发生额:0.666975200176239:62189328.77:171:1 +当期资本化研发投入:本期资本化研发投入:其中:费用化研发支出本期发生额:0.6525300741195679:59488138.59:171:1 +当期资本化研发投入:本报告期资本化研发投入:其中:费用化研发支出上期发生额:0.6880849003791809:62189328.77:171:1 +当期资本化研发投入:本报告期资本化研发投入:其中:费用化研发支出本期发生额:0.666390061378479:59488138.59:171:1 +当期资本化研发投入:报告期资本化研发投入:其中:费用化研发支出上期发生额:0.6872408986091614:62189328.77:171:1 +当期资本化研发投入:报告期资本化研发投入:其中:费用化研发支出本期发生额:0.6598919034004211:59488138.59:171:1 +当期资本化研发投入:报告期内资本化研发投入:其中:费用化研发支出上期发生额:0.7201206684112549:62189328.77:171:1 +当期资本化研发投入:报告期内资本化研发投入:其中:费用化研发支出本期发生额:0.7111191153526306:59488138.59:171:1 +当期资本化研发投入:本年度资本化研发投入:其中:费用化研发支出上期发生额:0.672764003276825:62189328.77:171:1 +当期资本化研发投入:本年度资本化研发投入:其中:费用化研发支出本期发生额:0.6637065410614014:59488138.59:171:1 +当期资本化研发投入:本期发生额资本化研发投入:其中:费用化研发支出上期发生额:0.7180575728416443:62189328.77:171:1 +当期资本化研发投入:本期发生额资本化研发投入:其中:费用化研发支出本期发生额:0.7067016959190369:59488138.59:171:1 +当期资本化研发投入:2023年资本化研发投入:研发费用2023年度:0.6773908138275146:40413176.50:82:1 +当期资本化研发投入:2023年资本化研发投入:研发费用2022年度:0.6480236053466797:46492323.47:82:1 +当期资本化研发投入:2023年全年资本化研发投入:研发费用2023年度:0.7116182446479797:40413176.50:82:1 +当期资本化研发投入:2023年全年资本化研发投入:研发费用2022年度:0.6779475212097168:46492323.47:82:1 +当期资本化研发投入:2023年金额资本化研发投入:研发费用2023年度:0.6702579855918884:40413176.50:82:1 +当期资本化研发投入:2023年金额资本化研发投入:研发费用2022年度:0.6371675133705139:46492323.47:82:1 +上年同期资本化研发投入:上年同期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7401091456413269:62189328.77:171:1 +上年同期资本化研发投入:上年同期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7073288559913635:59488138.59:171:1 +上年同期资本化研发投入:上期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.758450448513031:62189328.77:171:1 +上年同期资本化研发投入:上期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7242143750190735:59488138.59:171:1 +上年同期资本化研发投入:上年度研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7369818091392517:62189328.77:171:1 +上年同期资本化研发投入:上年度研发投入资本化的金额:其中:费用化研发支出本期发生额:0.7196356654167175:59488138.59:171:1 +上年同期资本化研发投入:2022年研发投入资本化的金额:研发费用2022年度:0.7325294613838196:46492323.47:82:1 +上年同期资本化研发投入:2022年研发投入资本化的金额:研发费用2023年度:0.706552267074585:40413176.50:82:1 +上年同期资本化研发投入:2022年全年研发投入资本化的金额:研发费用2022年度:0.759177565574646:46492323.47:82:1 +上年同期资本化研发投入:2022年全年研发投入资本化的金额:研发费用2023年度:0.735794723033905:40413176.50:82:1 +上年同期资本化研发投入:2022年金额研发投入资本化的金额:研发费用2022年度:0.699307382106781:46492323.47:82:1 +上年同期资本化研发投入:2022年金额研发投入资本化的金额:研发费用2023年度:0.6736913323402405:40413176.50:82:1 +上年同期资本化研发投入:上年同期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7720836997032166:62189328.77:171:1 +上年同期资本化研发投入:上年同期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7355310916900635:59488138.59:171:1 +上年同期资本化研发投入:上期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7982574105262756:62189328.77:171:1 +上年同期资本化研发投入:上期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7582351565361023:59488138.59:171:1 +上年同期资本化研发投入:上年度研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7727710604667664:62189328.77:171:1 +上年同期资本化研发投入:上年度研发支出资本化的金额:其中:费用化研发支出本期发生额:0.7472457885742188:59488138.59:171:1 +上年同期资本化研发投入:2022年研发支出资本化的金额:研发费用2022年度:0.7549300789833069:46492323.47:82:1 +上年同期资本化研发投入:2022年研发支出资本化的金额:研发费用2023年度:0.7340965867042542:40413176.50:82:1 +上年同期资本化研发投入:2022年全年研发支出资本化的金额:研发费用2022年度:0.7730686664581299:46492323.47:82:1 +上年同期资本化研发投入:2022年全年研发支出资本化的金额:研发费用2023年度:0.7527860999107361:40413176.50:82:1 +上年同期资本化研发投入:2022年金额研发支出资本化的金额:研发费用2022年度:0.726545512676239:46492323.47:82:1 +上年同期资本化研发投入:2022年金额研发支出资本化的金额:研发费用2023年度:0.703262209892273:40413176.50:82:1 +上年同期资本化研发投入:上年同期资本化研发投入:其中:费用化研发支出上期发生额:0.7037675380706787:62189328.77:171:1 +上年同期资本化研发投入:上年同期资本化研发投入:其中:费用化研发支出本期发生额:0.6625241041183472:59488138.59:171:1 +上年同期资本化研发投入:上期资本化研发投入:其中:费用化研发支出上期发生额:0.695621132850647:62189328.77:171:1 +上年同期资本化研发投入:上期资本化研发投入:其中:费用化研发支出本期发生额:0.6502957940101624:59488138.59:171:1 +上年同期资本化研发投入:上年度资本化研发投入:其中:费用化研发支出上期发生额:0.7284855246543884:62189328.77:171:1 +上年同期资本化研发投入:上年度资本化研发投入:其中:费用化研发支出本期发生额:0.6957793235778809:59488138.59:171:1 +上年同期资本化研发投入:2022年资本化研发投入:研发费用2022年度:0.6663859486579895:46492323.47:82:1 +上年同期资本化研发投入:2022年资本化研发投入:研发费用2023年度:0.6566985845565796:40413176.50:82:1 +上年同期资本化研发投入:2022年全年资本化研发投入:研发费用2022年度:0.7073492407798767:46492323.47:82:1 +上年同期资本化研发投入:2022年全年资本化研发投入:研发费用2023年度:0.7004823088645935:40413176.50:82:1 +上年同期资本化研发投入:2022年金额资本化研发投入:研发费用2022年度:0.6548672914505005:46492323.47:82:1 +上年同期资本化研发投入:2022年金额资本化研发投入:研发费用2023年度:0.6448048949241638:40413176.50:82:1 +前年同期资本化研发投入:前年同期研发投入资本化的金额:其中:费用化研发支出上期发生额:0.7110123634338379:62189328.77:171:1 +前年同期资本化研发投入:前年同期研发投入资本化的金额:其中:费用化研发支出本期发生额:0.6780908703804016:59488138.59:171:1 +前年同期资本化研发投入:2021年研发投入资本化的金额:研发费用2022年度:0.6719006896018982:46492323.47:82:1 +前年同期资本化研发投入:2021年研发投入资本化的金额:研发费用2023年度:0.6583369374275208:40413176.50:82:1 +前年同期资本化研发投入:2021年全年研发投入资本化的金额:研发费用2022年度:0.6874759793281555:46492323.47:82:1 +前年同期资本化研发投入:2021年全年研发投入资本化的金额:研发费用2023年度:0.673445463180542:40413176.50:82:1 +前年同期资本化研发投入:2021年金额研发投入资本化的金额:研发费用2022年度:0.6362329125404358:46492323.47:82:1 +前年同期资本化研发投入:2021年金额研发投入资本化的金额:研发费用2023年度:0.623939573764801:40413176.50:82:1 +前年同期资本化研发投入:前年同期研发支出资本化的金额:其中:费用化研发支出上期发生额:0.7507959604263306:62189328.77:171:1 +前年同期资本化研发投入:前年同期研发支出资本化的金额:其中:费用化研发支出本期发生额:0.714769184589386:59488138.59:171:1 +前年同期资本化研发投入:2021年研发支出资本化的金额:研发费用2022年度:0.6955376863479614:46492323.47:82:1 +前年同期资本化研发投入:2021年研发支出资本化的金额:研发费用2023年度:0.686894953250885:40413176.50:82:1 +前年同期资本化研发投入:2021年全年研发支出资本化的金额:研发费用2022年度:0.7095136046409607:46492323.47:82:1 +前年同期资本化研发投入:2021年全年研发支出资本化的金额:研发费用2023年度:0.69923996925354:40413176.50:82:1 +前年同期资本化研发投入:2021年金额研发支出资本化的金额:研发费用2022年度:0.6596825122833252:46492323.47:82:1 +前年同期资本化研发投入:2021年金额研发支出资本化的金额:其中:费用化研发支出上期发生额:0.653965175151825:62189328.77:171:1 +前年同期资本化研发投入:前年同期资本化研发投入:其中:费用化研发支出上期发生额:0.6918579936027527:62189328.77:171:1 +前年同期资本化研发投入:前年同期资本化研发投入:其中:费用化研发支出本期发生额:0.6563490629196167:59488138.59:171:1 +前年同期资本化研发投入:2021年资本化研发投入:研发费用2022年度:0.611398458480835:46492323.47:82:1 +前年同期资本化研发投入:2021年资本化研发投入:研发费用2023年度:0.608823299407959:40413176.50:82:1 +前年同期资本化研发投入:2021年全年资本化研发投入:研发费用2022年度:0.6379700303077698:46492323.47:82:1 +前年同期资本化研发投入:2021年全年资本化研发投入:研发费用2023年度:0.6368879675865173:40413176.50:82:1 +前年同期资本化研发投入:2021年金额资本化研发投入:研发费用2022年度:0.5958791375160217:46492323.47:82:1 +前年同期资本化研发投入:2021年金额资本化研发投入:研发费用2023年度:0.5934922099113464:40413176.50:82:1 +资本化研发投入同比变动:研发投入资本化的金额同比变动:其中:费用化研发支出上期发生额:0.6932308077812195:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比变动:其中:费用化研发支出本期发生额:0.6738178730010986:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比增减:其中:费用化研发支出上期发生额:0.6905614733695984:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比增减:其中:费用化研发支出本期发生额:0.6658340692520142:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比上升:其中:费用化研发支出上期发生额:0.6802895069122314:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比上升:其中:费用化研发支出本期发生额:0.6514178514480591:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比下降:其中:费用化研发支出上期发生额:0.6775098443031311:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额同比下降:其中:费用化研发支出本期发生额:0.6473228931427002:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额变化幅度:其中:费用化研发支出上期发生额:0.6620462536811829:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额变化幅度:其中:费用化研发支出本期发生额:0.6382988691329956:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额变动比例:其中:费用化研发支出上期发生额:0.6742682456970215:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额变动比例:其中:费用化研发支出本期发生额:0.6542381644248962:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额本期比上年同期增减:其中:费用化研发支出上期发生额:0.7097933888435364:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额本期比上年同期增减:其中:费用化研发支出本期发生额:0.7013245820999146:59488138.59:171:1 +资本化研发投入同比变动:研发投入资本化的金额本年比上年增减:其中:费用化研发支出上期发生额:0.7041659951210022:62189328.77:171:1 +资本化研发投入同比变动:研发投入资本化的金额本年比上年增减:其中:费用化研发支出本期发生额:0.690773069858551:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比变动:其中:费用化研发支出上期发生额:0.7355541586875916:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比变动:其中:费用化研发支出本期发生额:0.7104172706604004:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比增减:其中:费用化研发支出上期发生额:0.7387428283691406:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比增减:其中:费用化研发支出本期发生额:0.7088135480880737:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比上升:其中:费用化研发支出上期发生额:0.7329922914505005:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比上升:其中:费用化研发支出本期发生额:0.6985768675804138:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比下降:其中:费用化研发支出上期发生额:0.7278560996055603:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额同比下降:其中:费用化研发支出本期发生额:0.6930238604545593:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额变化幅度:其中:费用化研发支出上期发生额:0.7113882899284363:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额变化幅度:其中:费用化研发支出本期发生额:0.6822489500045776:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额变动比例:其中:费用化研发支出上期发生额:0.7152115702629089:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额变动比例:其中:费用化研发支出本期发生额:0.688707172870636:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额本期比上年同期增减:其中:费用化研发支出上期发生额:0.7388390302658081:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额本期比上年同期增减:其中:费用化研发支出本期发生额:0.7243691086769104:59488138.59:171:1 +资本化研发投入同比变动:研发支出资本化的金额本年比上年增减:其中:费用化研发支出上期发生额:0.7399269342422485:62189328.77:171:1 +资本化研发投入同比变动:研发支出资本化的金额本年比上年增减:其中:费用化研发支出本期发生额:0.7207632064819336:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入同比变动:其中:费用化研发支出上期发生额:0.7077454924583435:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入同比变动:其中:费用化研发支出本期发生额:0.6807712316513062:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入同比增减:其中:费用化研发支出上期发生额:0.7054114937782288:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入同比增减:其中:费用化研发支出本期发生额:0.6745649576187134:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入同比上升:其中:费用化研发支出上期发生额:0.6776103377342224:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入同比上升:其中:费用化研发支出本期发生额:0.6421412825584412:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入同比下降:其中:费用化研发支出上期发生额:0.6849082708358765:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入同比下降:其中:费用化研发支出本期发生额:0.6484125852584839:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入变化幅度:其中:费用化研发支出上期发生额:0.6706559062004089:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入变化幅度:其中:费用化研发支出本期发生额:0.6391206979751587:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入变动比例:其中:费用化研发支出上期发生额:0.7027855515480042:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入变动比例:其中:费用化研发支出本期发生额:0.6740719079971313:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入本期比上年同期增减:其中:费用化研发支出上期发生额:0.7135870456695557:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入本期比上年同期增减:其中:费用化研发支出本期发生额:0.6999106407165527:59488138.59:171:1 +资本化研发投入同比变动:资本化研发投入本年比上年增减:其中:费用化研发支出上期发生额:0.6896443963050842:62189328.77:171:1 +资本化研发投入同比变动:资本化研发投入本年比上年增减:其中:费用化研发支出本期发生额:0.6681532859802246:59488138.59:171:1 +当期资本化研发投入占比:当期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.6913068294525146:62189328.77:171:1 +当期资本化研发投入占比:当期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.661847710609436:59488138.59:171:1 +当期资本化研发投入占比:本期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.6858418583869934:62189328.77:171:1 +当期资本化研发投入占比:本期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6645534634590149:59488138.59:171:1 +当期资本化研发投入占比:本报告期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.6785212159156799:62189328.77:171:1 +当期资本化研发投入占比:本报告期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6546223163604736:59488138.59:171:1 +当期资本化研发投入占比:报告期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.6815398335456848:62189328.77:171:1 +当期资本化研发投入占比:报告期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6521741151809692:59488138.59:171:1 +当期资本化研发投入占比:报告期内资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.6923779845237732:62189328.77:171:1 +当期资本化研发投入占比:报告期内资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6743389964103699:59488138.59:171:1 +当期资本化研发投入占比:本年度资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.6790412068367004:62189328.77:171:1 +当期资本化研发投入占比:本年度资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6636756658554077:59488138.59:171:1 +当期资本化研发投入占比:本期发生额资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.7084001898765564:62189328.77:171:1 +当期资本化研发投入占比:本期发生额资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6887836456298828:59488138.59:171:1 +当期资本化研发投入占比:2023年资本化研发投入占研发投入的比例:研发费用2023年度:0.7002663612365723:40413176.50:82:1 +当期资本化研发投入占比:2023年资本化研发投入占研发投入的比例:研发费用2022年度:0.6709545850753784:46492323.47:82:1 +当期资本化研发投入占比:2023年全年资本化研发投入占研发投入的比例:研发费用2023年度:0.7302125692367554:40413176.50:82:1 +当期资本化研发投入占比:2023年全年资本化研发投入占研发投入的比例:研发费用2022年度:0.6954445242881775:46492323.47:82:1 +当期资本化研发投入占比:2023年金额资本化研发投入占研发投入的比例:研发费用2023年度:0.6988831758499146:40413176.50:82:1 +当期资本化研发投入占比:2023年金额资本化研发投入占研发投入的比例:研发费用2022年度:0.6666131615638733:46492323.47:82:1 +当期资本化研发投入占比:当期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7601867914199829:62189328.77:171:1 +当期资本化研发投入占比:当期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7252825498580933:59488138.59:171:1 +当期资本化研发投入占比:本期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7589678168296814:62189328.77:171:1 +当期资本化研发投入占比:本期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7315105199813843:59488138.59:171:1 +当期资本化研发投入占比:本报告期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7450704574584961:62189328.77:171:1 +当期资本化研发投入占比:本报告期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.71622633934021:59488138.59:171:1 +当期资本化研发投入占比:报告期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7451675534248352:62189328.77:171:1 +当期资本化研发投入占比:报告期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7100793123245239:59488138.59:171:1 +当期资本化研发投入占比:报告期内资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7496164441108704:62189328.77:171:1 +当期资本化研发投入占比:报告期内资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7269117832183838:59488138.59:171:1 +当期资本化研发投入占比:本年度资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7522842288017273:62189328.77:171:1 +当期资本化研发投入占比:本年度资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7309399843215942:59488138.59:171:1 +当期资本化研发投入占比:本期发生额资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7791966199874878:62189328.77:171:1 +当期资本化研发投入占比:本期发生额资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7531725168228149:59488138.59:171:1 +当期资本化研发投入占比:2023年资本化研发支出占研发支出的比例:研发费用2023年度:0.7420212030410767:40413176.50:82:1 +当期资本化研发投入占比:2023年资本化研发支出占研发支出的比例:研发费用2022年度:0.7119235396385193:46492323.47:82:1 +当期资本化研发投入占比:2023年全年资本化研发支出占研发支出的比例:研发费用2023年度:0.7651351094245911:40413176.50:82:1 +当期资本化研发投入占比:2023年全年资本化研发支出占研发支出的比例:研发费用2022年度:0.7301470637321472:46492323.47:82:1 +当期资本化研发投入占比:2023年金额资本化研发支出占研发支出的比例:研发费用2023年度:0.733086347579956:40413176.50:82:1 +当期资本化研发投入占比:2023年金额资本化研发支出占研发支出的比例:研发费用2022年度:0.6991769671440125:46492323.47:82:1 +上年同期资本化研发投入占比:上年同期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.7171524167060852:62189328.77:171:1 +上年同期资本化研发投入占比:上年同期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6753838062286377:59488138.59:171:1 +上年同期资本化研发投入占比:上期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.7175729870796204:62189328.77:171:1 +上年同期资本化研发投入占比:上期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6691127419471741:59488138.59:171:1 +上年同期资本化研发投入占比:上年度资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.7205886840820312:62189328.77:171:1 +上年同期资本化研发投入占比:上年度资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6852710843086243:59488138.59:171:1 +上年同期资本化研发投入占比:2022年资本化研发投入占研发投入的比例:研发费用2022年度:0.6905239224433899:46492323.47:82:1 +上年同期资本化研发投入占比:2022年资本化研发投入占研发投入的比例:研发费用2023年度:0.6761232614517212:40413176.50:82:1 +上年同期资本化研发投入占比:2022年全年资本化研发投入占研发投入的比例:研发费用2022年度:0.7200315594673157:46492323.47:82:1 +上年同期资本化研发投入占比:2022年全年资本化研发投入占研发投入的比例:研发费用2023年度:0.70856773853302:40413176.50:82:1 +上年同期资本化研发投入占比:2022年金额资本化研发投入占研发投入的比例:研发费用2022年度:0.6858579516410828:46492323.47:82:1 +上年同期资本化研发投入占比:2022年金额资本化研发投入占研发投入的比例:研发费用2023年度:0.6730085015296936:40413176.50:82:1 +上年同期资本化研发投入占比:上年同期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.774750828742981:62189328.77:171:1 +上年同期资本化研发投入占比:上年同期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7275823354721069:59488138.59:171:1 +上年同期资本化研发投入占比:上期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7783069014549255:62189328.77:171:1 +上年同期资本化研发投入占比:上期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7244986891746521:59488138.59:171:1 +上年同期资本化研发投入占比:上年度资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7813200354576111:62189328.77:171:1 +上年同期资本化研发投入占比:上年度资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7408679127693176:59488138.59:171:1 +上年同期资本化研发投入占比:2022年资本化研发支出占研发支出的比例:研发费用2022年度:0.7313217520713806:46492323.47:82:1 +上年同期资本化研发投入占比:2022年资本化研发支出占研发支出的比例:研发费用2023年度:0.7179096937179565:40413176.50:82:1 +上年同期资本化研发投入占比:2022年全年资本化研发支出占研发支出的比例:研发费用2022年度:0.7543909549713135:46492323.47:82:1 +上年同期资本化研发投入占比:2022年全年资本化研发支出占研发支出的比例:研发费用2023年度:0.7431010007858276:40413176.50:82:1 +上年同期资本化研发投入占比:2022年金额资本化研发支出占研发支出的比例:研发费用2022年度:0.7192618250846863:46492323.47:82:1 +上年同期资本化研发投入占比:2022年金额资本化研发支出占研发支出的比例:研发费用2023年度:0.7072563767433167:40413176.50:82:1 +前年同期资本化研发投入占比:前年同期资本化研发投入占研发投入的比例:其中:费用化研发支出上期发生额:0.690614640712738:62189328.77:171:1 +前年同期资本化研发投入占比:前年同期资本化研发投入占研发投入的比例:其中:费用化研发支出本期发生额:0.6524224281311035:59488138.59:171:1 +前年同期资本化研发投入占比:2021年资本化研发投入占研发投入的比例:研发费用2022年度:0.6402491927146912:46492323.47:82:1 +前年同期资本化研发投入占比:2021年资本化研发投入占研发投入的比例:研发费用2023年度:0.6332999467849731:40413176.50:82:1 +前年同期资本化研发投入占比:2021年全年资本化研发投入占研发投入的比例:研发费用2022年度:0.6556764245033264:46492323.47:82:1 +前年同期资本化研发投入占比:2021年全年资本化研发投入占研发投入的比例:研发费用2023年度:0.6515828371047974:40413176.50:82:1 +前年同期资本化研发投入占比:2021年金额资本化研发投入占研发投入的比例:研发费用2022年度:0.6376383304595947:46492323.47:82:1 +前年同期资本化研发投入占比:2021年金额资本化研发投入占研发投入的比例:研发费用2023年度:0.6326647996902466:40413176.50:82:1 +前年同期资本化研发投入占比:前年同期资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.7513870596885681:62189328.77:171:1 +前年同期资本化研发投入占比:前年同期资本化研发支出占研发支出的比例:其中:费用化研发支出本期发生额:0.7070838212966919:59488138.59:171:1 +前年同期资本化研发投入占比:2021年资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.6879241466522217:62189328.77:171:1 +前年同期资本化研发投入占比:2021年资本化研发支出占研发支出的比例:研发费用2022年度:0.6825991868972778:46492323.47:82:1 +前年同期资本化研发投入占比:2021年全年资本化研发支出占研发支出的比例:研发费用2022年度:0.6946429014205933:46492323.47:82:1 +前年同期资本化研发投入占比:2021年全年资本化研发支出占研发支出的比例:研发费用2023年度:0.6915282011032104:40413176.50:82:1 +前年同期资本化研发投入占比:2021年金额资本化研发支出占研发支出的比例:其中:费用化研发支出上期发生额:0.685718834400177:62189328.77:171:1 +前年同期资本化研发投入占比:2021年金额资本化研发支出占研发支出的比例:研发费用2022年度:0.6732593178749084:46492323.47:82:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比变动:其中:费用化研发支出上期发生额:0.6873283982276917:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比变动:其中:费用化研发支出本期发生额:0.6583584547042847:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比增减:其中:费用化研发支出上期发生额:0.6975170373916626:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比增减:其中:费用化研发支出本期发生额:0.6652538776397705:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比上升:其中:费用化研发支出上期发生额:0.6790310740470886:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比上升:其中:费用化研发支出本期发生额:0.6435939073562622:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比下降:其中:费用化研发支出上期发生额:0.6813059449195862:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例同比下降:其中:费用化研发支出本期发生额:0.6452513933181763:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例变化幅度:其中:费用化研发支出上期发生额:0.6674928069114685:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例变化幅度:其中:费用化研发支出本期发生额:0.6353918313980103:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例变动比例:其中:费用化研发支出上期发生额:0.674227774143219:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例变动比例:其中:费用化研发支出本期发生额:0.6428543329238892:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例本期比上年同期增减:其中:费用化研发支出上期发生额:0.705160915851593:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例本期比上年同期增减:其中:费用化研发支出本期发生额:0.6883405447006226:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例本年比上年增减:其中:费用化研发支出上期发生额:0.702910840511322:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发投入占研发投入的比例本年比上年增减:其中:费用化研发支出本期发生额:0.6810764074325562:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比变动:其中:费用化研发支出上期发生额:0.7437787055969238:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比变动:其中:费用化研发支出本期发生额:0.7091113328933716:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比增减:其中:费用化研发支出上期发生额:0.7520627379417419:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比增减:其中:费用化研发支出本期发生额:0.7134777307510376:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比上升:其中:费用化研发支出上期发生额:0.7400727868080139:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比上升:其中:费用化研发支出本期发生额:0.6985464096069336:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比下降:其中:费用化研发支出上期发生额:0.7368139624595642:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例同比下降:其中:费用化研发支出本期发生额:0.695686936378479:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例变化幅度:其中:费用化研发支出上期发生额:0.7391538023948669:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例变化幅度:其中:费用化研发支出本期发生额:0.7016798853874207:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例变动比例:其中:费用化研发支出上期发生额:0.7410556674003601:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例变动比例:其中:费用化研发支出本期发生额:0.7044199705123901:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例本期比上年同期增减:其中:费用化研发支出上期发生额:0.7558754086494446:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例本期比上年同期增减:其中:费用化研发支出本期发生额:0.7314084768295288:59488138.59:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例本年比上年增减:其中:费用化研发支出上期发生额:0.7583093047142029:62189328.77:171:1 +资本化研发投入占比同比变动:资本化研发支出占研发支出的比例本年比上年增减:其中:费用化研发支出本期发生额:0.7285597920417786:59488138.59:171:1 +当期研发投入占营业收入比例:当期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7264764308929443:62189328.77:171:1 +当期研发投入占营业收入比例:当期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.7118239402770996:59488138.59:171:1 +当期研发投入占营业收入比例:本期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.7228354811668396:59488138.59:171:1 +当期研发投入占营业收入比例:本期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7172864079475403:62189328.77:171:1 +当期研发投入占营业收入比例:本报告期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7093595862388611:62189328.77:171:1 +当期研发投入占营业收入比例:本报告期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.7014721632003784:59488138.59:171:1 +当期研发投入占营业收入比例:报告期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7133808135986328:62189328.77:171:1 +当期研发投入占营业收入比例:报告期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.6965571641921997:59488138.59:171:1 +当期研发投入占营业收入比例:报告期内研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.7008248567581177:59488138.59:171:1 +当期研发投入占营业收入比例:报告期内研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.6993891596794128:62189328.77:171:1 +当期研发投入占营业收入比例:本年度研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.6906678676605225:59488138.59:171:1 +当期研发投入占营业收入比例:本年度研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.6823857426643372:62189328.77:171:1 +当期研发投入占营业收入比例:本期发生额研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7166961431503296:62189328.77:171:1 +当期研发投入占营业收入比例:本期发生额研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.713179886341095:59488138.59:171:1 +当期研发投入占营业收入比例:2023年研发投入总额占营业收入比例:研发费用2023年度:0.7692245841026306:40413176.50:82:1 +当期研发投入占营业收入比例:2023年研发投入总额占营业收入比例:研发费用2022年度:0.742644727230072:46492323.47:82:1 +当期研发投入占营业收入比例:2023年全年研发投入总额占营业收入比例:研发费用2023年度:0.7758121490478516:40413176.50:82:1 +当期研发投入占营业收入比例:2023年全年研发投入总额占营业收入比例:研发费用2022年度:0.7475318312644958:46492323.47:82:1 +当期研发投入占营业收入比例:2023年金额研发投入总额占营业收入比例:研发费用2023年度:0.7497574090957642:40413176.50:82:1 +当期研发投入占营业收入比例:2023年金额研发投入总额占营业收入比例:研发费用2022年度:0.7225124835968018:46492323.47:82:1 +上年同期研发投入占营业收入比例:上年同期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7279837727546692:62189328.77:171:1 +上年同期研发投入占营业收入比例:上年同期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.6944128274917603:59488138.59:171:1 +上年同期研发投入占营业收入比例:上期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7575743198394775:62189328.77:171:1 +上年同期研发投入占营业收入比例:上期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.7249627113342285:59488138.59:171:1 +上年同期研发投入占营业收入比例:上年度研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.7156901955604553:62189328.77:171:1 +上年同期研发投入占营业收入比例:上年度研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.6985364556312561:59488138.59:171:1 +上年同期研发投入占营业收入比例:2022年研发投入总额占营业收入比例:研发费用2022年度:0.7728416919708252:46492323.47:82:1 +上年同期研发投入占营业收入比例:2022年研发投入总额占营业收入比例:研发费用2023年度:0.7371199727058411:40413176.50:82:1 +上年同期研发投入占营业收入比例:2022年全年研发投入总额占营业收入比例:研发费用2022年度:0.7799626588821411:46492323.47:82:1 +上年同期研发投入占营业收入比例:2022年全年研发投入总额占营业收入比例:研发费用2023年度:0.7463829517364502:40413176.50:82:1 +上年同期研发投入占营业收入比例:2022年金额研发投入总额占营业收入比例:研发费用2022年度:0.7459007501602173:46492323.47:82:1 +上年同期研发投入占营业收入比例:2022年金额研发投入总额占营业收入比例:研发费用2023年度:0.7080227136611938:40413176.50:82:1 +前年同期研发投入占营业收入比例:前年同期研发投入总额占营业收入比例:其中:费用化研发支出上期发生额:0.6949669122695923:62189328.77:171:1 +前年同期研发投入占营业收入比例:前年同期研发投入总额占营业收入比例:其中:费用化研发支出本期发生额:0.6621950268745422:59488138.59:171:1 +前年同期研发投入占营业收入比例:2021年研发投入总额占营业收入比例:研发费用2022年度:0.6998984217643738:46492323.47:82:1 +前年同期研发投入占营业收入比例:2021年研发投入总额占营业收入比例:研发费用2023年度:0.6787154674530029:40413176.50:82:1 +前年同期研发投入占营业收入比例:2021年全年研发投入总额占营业收入比例:研发费用2022年度:0.6999029517173767:46492323.47:82:1 +前年同期研发投入占营业收入比例:2021年全年研发投入总额占营业收入比例:研发费用2023年度:0.6790218353271484:40413176.50:82:1 +前年同期研发投入占营业收入比例:2021年金额研发投入总额占营业收入比例:研发费用2022年度:0.6728917956352234:46492323.47:82:1 +前年同期研发投入占营业收入比例:2021年金额研发投入总额占营业收入比例:研发费用2023年度:0.6510370969772339:40413176.50:82:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比变动:其中:费用化研发支出上期发生额:0.6874906420707703:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比变动:其中:费用化研发支出本期发生额:0.6670337319374084:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比增减:其中:费用化研发支出上期发生额:0.685393750667572:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比增减:其中:费用化研发支出本期发生额:0.6588724255561829:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比上升:其中:费用化研发支出上期发生额:0.6837812066078186:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比上升:其中:费用化研发支出本期发生额:0.6512950658798218:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比下降:其中:费用化研发支出上期发生额:0.6744316220283508:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例同比下降:其中:费用化研发支出本期发生额:0.6413045525550842:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例变化幅度:其中:费用化研发支出上期发生额:0.6922248601913452:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例变化幅度:其中:费用化研发支出本期发生额:0.6715036630630493:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例变动比例:其中:费用化研发支出上期发生额:0.6732086539268494:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例变动比例:其中:费用化研发支出本期发生额:0.6548466682434082:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例本期比上年同期增减:其中:费用化研发支出上期发生额:0.6802437901496887:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例本期比上年同期增减:其中:费用化研发支出本期发生额:0.671461820602417:59488138.59:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例本年比上年增减:其中:费用化研发支出上期发生额:0.6839109063148499:62189328.77:171:1 +研发投入占营业收入比例同比变动:研发投入总额占营业收入比例本年比上年增减:其中:费用化研发支出本期发生额:0.6765210032463074:59488138.59:171:1 diff --git a/zzb_data_prod/pdf_company.py b/zzb_data_prod/pdf_company.py new file mode 100644 index 0000000..67bb945 --- /dev/null +++ b/zzb_data_prod/pdf_company.py @@ -0,0 +1,108 @@ +from config import MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB +import mysql.connector +from http import HTTPStatus +import dashscope +import random,re +from pdfminer.high_level import extract_pages +from pdfminer.layout import LTTextBoxHorizontal + +dashscope.api_key='sk-63c02fbb9b7d4b0494a3200bec1ae286' + +def get_company_name(file_path): + line_text = '' + # 我们从PDF中提取页面,page_numbers=[4,5,6] + for pagenum, page in enumerate(extract_pages(file_path)): + if pagenum > 1: + break + # 找到所有的元素 + page_elements = [(element.y1, element) for element in page._objs] + # 查找组成页面的元素 + for i,component in enumerate(page_elements): + # 提取页面布局的元素 + element = component[1] + # 检查该元素是否为文本元素 + if isinstance(element, LTTextBoxHorizontal): + # 检查文本是否出现在表中 + line_text += element.get_text() + + return llm_service(line_text) + +def llm_service(user_prompt): + + system_prompt = ''' + 从以下数据报告中提取公司全称,只需要提取中文公司全称,不要增加其他内容,如果提取不到公司全称,请返回-。 + <数据报告> + + + ''' + system_prompt = system_prompt.replace('', user_prompt) + response = dashscope.Generation.call( + model='qwen-plus', + prompt = system_prompt, + seed=random.randint(1, 10000), + top_p=0.8, + result_format='message', + enable_search=False, + max_tokens=1500, + temperature=0.85, + repetition_penalty=1.0 + ) + if response.status_code == HTTPStatus.OK: + result = response['output']['choices'][0]['message']['content'] + return result + else: + print('Request id: %s, Status code: %s, error code: %s, error message: %s' % ( + response.request_id, response.status_code, + response.code, response.message + )) + + return "llm_error" + +def update_company_name(file_id, company_name, cursor, conn): + update_sql = f''' + UPDATE report_check + SET c_name = '{company_name}' + WHERE id = {file_id} + ''' + cursor.execute(update_sql) + conn.commit() + +if __name__ == '__main__': + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor() + + data_query = ''' + SELECT id,file_path FROM report_check where c_name is null + ''' + + cursor.execute(data_query) + data_list = cursor.fetchall() + + for data in data_list: + try: + file_id = data[0] + file_path = f'/usr/local/zhanglei/financial/{data[1]}' + print(f'财报{file_id}开始解析') + # file_id = '1329' + # file_path = '/Users/zhengfei/Desktop/cb/zhangjun-600271-2023-nb-nb.pdf' + + company_name = get_company_name(file_path) + contains_newline = '\n' in company_name + if contains_newline: + lines = company_name.splitlines(True) + company_name = lines[0] + + if company_name != "llm_error": + update_company_name(file_id, company_name, cursor, conn) + except Exception as e: + print(f'财报{file_id}解析失败',e) + + cursor.close() + conn.close() diff --git a/zzb_data_prod/pdf_company_0824.py b/zzb_data_prod/pdf_company_0824.py new file mode 100644 index 0000000..3cbe302 --- /dev/null +++ b/zzb_data_prod/pdf_company_0824.py @@ -0,0 +1,268 @@ +from config import MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB +import mysql.connector +from http import HTTPStatus +import dashscope +import random,re +from pdfminer.high_level import extract_pages +from pdfminer.layout import LTTextBoxHorizontal +import PyPDF2 +dashscope.api_key='sk-63c02fbb9b7d4b0494a3200bec1ae286' + +def get_company_name(file_path): + line_text = '' + # 我们从PDF中提取页面,page_numbers=[4,5,6] + for pagenum, page in enumerate(extract_pages(file_path)): + if pagenum > 1: + break + # 找到所有的元素 + page_elements = [(element.y1, element) for element in page._objs] + # 查找组成页面的元素 + for i,component in enumerate(page_elements): + # 提取页面布局的元素 + element = component[1] + # 检查该元素是否为文本元素 + if isinstance(element, LTTextBoxHorizontal): + # 检查文本是否出现在表中 + line_text += element.get_text() + + return llm_service(line_text) +def get_company_code(file_path): + line_text = '' + # 我们从PDF中提取页面,page_numbers=[4,5,6] + for pagenum, page in enumerate(extract_pages(file_path)): + if pagenum > 1: + break + # 找到所有的元素 + page_elements = [(element.y1, element) for element in page._objs] + # 查找组成页面的元素 + for i,component in enumerate(page_elements): + # 提取页面布局的元素 + element = component[1] + # 检查该元素是否为文本元素 + if isinstance(element, LTTextBoxHorizontal): + # 检查文本是否出现在表中 + line_text += element.get_text() + + return llm_service_code(line_text) +#获取公司简介的那一页 +# def get_code_page(pdf_path): +# with open(pdf_path, 'rb') as file: +# reader = PyPDF2.PdfReader(file) +# outlines = reader.outline +# company_profile_page = None + +# def find_page_from_outlines(outlines): +# nonlocal company_profile_page +# for item in outlines: +# if isinstance(item, list): # 如果是子目录,则递归 +# find_page_from_outlines(item) +# else: +# title = item.title +# if title is not None and '公司简介' in title: +# # 获取页面的实际页码 +# page_num = reader.get_destination_page_number(item) +# company_profile_page = page_num +# return +# # 处理没有标题的情况 +# elif item.page is not None: +# page_num = reader.get_destination_page_number(item) +# if page_num is not None: +# pass + +# find_page_from_outlines(outlines) + +# return company_profile_page + +# def get_company_code(file_path): +# line_text = '' +# # 我们从PDF中提取页面,page_numbers=[4,5,6] +# for pagenum, page in enumerate(extract_pages(file_path)): +# print(f'页码是{get_code_page(file_path)+1}') +# if pagenum > 1 and pagenum != get_code_page(file_path)+1: +# break +# # 找到所有的元素 +# #print(pagenum) +# page_elements = [(element.y1, element) for element in page._objs] +# # 查找组成页面的元素 +# # for i,component in enumerate(page_elements): +# # # 提取页面布局的元素 +# # element = component[1] +# # # 检查该元素是否为文本元素 +# # if isinstance(element, LTTextBoxHorizontal): +# # # 检查文本是否出现在表中 +# # line_text += element.get_text() +# for _, element in page_elements: +# if isinstance(element, LTTextBoxHorizontal): +# # 提取文本并添加到 line_text +# line_text += element.get_text() + +# return llm_service_code(line_text) +def llm_service(user_prompt): + + system_prompt = ''' + 从以下数据报告中提取公司全称,只需要提取中文公司全称,不要增加其他内容,如果提取不到公司全称,请返回-,不要返回其他任何内容。 + <数据报告> + + + ''' + system_prompt = system_prompt.replace('', user_prompt) + response = dashscope.Generation.call( + model='qwen-plus', + prompt = system_prompt, + seed=random.randint(1, 10000), + top_p=0.8, + result_format='message', + enable_search=False, + max_tokens=1500, + temperature=0.85, + repetition_penalty=1.0 + ) + if response.status_code == HTTPStatus.OK: + result = response['output']['choices'][0]['message']['content'] + return result + else: + print('Request id: %s, Status code: %s, error code: %s, error message: %s' % ( + response.request_id, response.status_code, + response.code, response.message + )) + + return "llm_error" +def llm_service_code(user_prompt): + + system_prompt = ''' + 从以下数据报告中提取6位数字的股票代码,只需要提取股票代码,如果有多个则以','隔开,不要增加其他内容,如果提取不到股票代码,请返回-,不要返回其他任何内容。 + <数据报告> + + + ''' + system_prompt = system_prompt.replace('', user_prompt) + response = dashscope.Generation.call( + model='qwen-plus', + prompt = system_prompt, + seed=random.randint(1, 10000), + top_p=0.8, + result_format='message', + enable_search=False, + max_tokens=1500, + temperature=0.85, + repetition_penalty=1.0 + ) + if response.status_code == HTTPStatus.OK: + result = response['output']['choices'][0]['message']['content'] + return result + else: + print('Request id: %s, Status code: %s, error code: %s, error message: %s' % ( + response.request_id, response.status_code, + response.code, response.message + )) + + return "llm_error" +def update_company_name(file_id, company_name,company_code, cursor, conn): + update_sql = f''' + UPDATE report_check + SET c_name = '{company_name}',c_code = '{company_code}' + WHERE id = {file_id} + ''' + cursor.execute(update_sql) + conn.commit() +def name_code_fix(file_id,file_path): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor() + + try: + # file_id = data[0] + # #生产环境地址 + # file_path = f'/usr/local/zhanglei/financial{data[1]}' + # #测试环境地址 + # # file_path_1 = f'/root/pdf_parser/pdf/{data[1]}' + # # file_path = file_path_1.replace('/upload/file/','') + # print(f'财报{file_id}开始解析') + # #file_id = '305' + # #file_path = r"F:\11_pdf\7874.pdf" + company_name = get_company_name(file_path) + contains_newline = '\n' in company_name + if contains_newline: + lines = company_name.splitlines(True) + company_name = lines[0] + + company_code = get_company_code(file_path) + contains_newline1 = '\n' in company_code + if contains_newline1: + lines = company_code.splitlines(True) + company_code = lines[0] + + if company_name != "llm_error" or company_code != "llm_error": + #print(company_code) + pattern = re.compile(r'^(\d{6}|\d{6}(,\d{6})*)$') + if not pattern.match(company_code): + company_code = '-' + if len(company_name) > 15 or company_name == '-': + company_name = '' + update_company_name(file_id, company_name,company_code, cursor, conn) + except Exception as e: + print(f'财报解析失败',e) + + cursor.close() + conn.close() + + + +if __name__ == '__main__': + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor() + + data_query = ''' + SELECT id,file_path FROM report_check where c_code is null + ''' + + cursor.execute(data_query) + data_list = cursor.fetchall() + + for data in data_list: + try: + file_id = data[0] + #生产环境地址 + file_path = f'/usr/local/zhanglei/financial{data[1]}' + #测试环境地址 + # file_path_1 = f'/root/pdf_parser/pdf/{data[1]}' + # file_path = file_path_1.replace('/upload/file/','') + print(f'财报{file_id}开始解析') + #file_id = '305' + #file_path = r"F:\11_pdf\7874.pdf" + + company_name = get_company_name(file_path) + contains_newline = '\n' in company_name + if contains_newline: + lines = company_name.splitlines(True) + company_name = lines[0] + + company_code = get_company_code(file_path) + contains_newline1 = '\n' in company_code + if contains_newline1: + lines = company_code.splitlines(True) + company_code = lines[0] + + if company_name != "llm_error" or company_code != "llm_error": + #print(company_code) + pattern = re.compile(r'^(\d{6}|\d{6}(,\d{6})*)$') + if not pattern.match(company_code): + company_code = '-' + update_company_name(file_id, company_name,company_code, cursor, conn) + except Exception as e: + print(f'财报解析失败',e) + + cursor.close() + conn.close() diff --git a/zzb_data_prod/pdf_delete.py b/zzb_data_prod/pdf_delete.py new file mode 100644 index 0000000..713e46d --- /dev/null +++ b/zzb_data_prod/pdf_delete.py @@ -0,0 +1,98 @@ +#报错提示 +import paramiko +import time +import threading + +# 执行命令的函数 +def execute_commands_on_server(hostname, username, password, host): + try: + # 连接到服务器 + client = paramiko.SSHClient() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + client.connect(hostname=hostname, username=username, password=password) + + # 执行命令 + shell = client.invoke_shell() + #启动docker + shell.send("cd /root/pdf_parser/pdf\n") + time.sleep(1) + shell.send("rm -f *.pdf\n") + time.sleep(10) + shell.send("rm -f *.PDF\n") + time.sleep(10) + # 读取输出 + output = shell.recv(2048).decode() + print(f"Output from {hostname}:\n{output}") + + except paramiko.SSHException as e: + print(f"SSH connection error with {hostname}: {e}") + + finally: + client.close() + +# 创建线程函数 +def thread_function(server): + execute_commands_on_server(server['hostname'], server['username'], server['password'], server['host']) + +# 服务器列表 +# servers = [ +# {'hostname': 'server1.example.com', 'username': 'user1', 'password': 'pass1', 'host': 'host1'}, +# {'hostname': 'server2.example.com', 'username': 'user2', 'password': 'pass2', 'host': 'host2'}, +# # 添加更多服务器 +# ] +servers = [ + #{'hostname': '124.70.129.232', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'测试服务器'}, + # {'hostname': '1.94.179.121', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器'},#废弃 + +#旧10台 + {'hostname': '113.44.72.157', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器1'}, + {'hostname': '1.94.101.237', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器2'}, + {'hostname': '123.60.16.225', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器3'}, + {'hostname': '124.71.157.162', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器4'}, + + {'hostname': '1.94.60.103', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器5'}, + # {'hostname': '1.94.143.23', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器6'},#都往这里存 + {'hostname': '124.71.149.225', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器7'}, + {'hostname': '113.44.52.221', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器8'}, + {'hostname': '121.37.137.13', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器9'}, + {'hostname': '123.60.28.83', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'生产服务器10'}, +#新10台 + {'hostname': '192.168.0.19', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器1'}, + {'hostname': '192.168.0.53', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器2'}, + {'hostname': '192.168.0.150', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器3'}, + {'hostname': '192.168.0.210', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器4'}, + + {'hostname': '192.168.0.129', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器5'}, + {'hostname': '192.168.0.24', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器6'}, + {'hostname': '192.168.0.250', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器7'}, + {'hostname': '192.168.0.162', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器8'}, + {'hostname': '192.168.0.86', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器9'}, + {'hostname': '192.168.0.88', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新生产服务器10'}, +#再来11台新的 + {'hostname': '192.168.0.93', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器1'}, + {'hostname': '192.168.0.228', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器2'}, + {'hostname': '192.168.0.155', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器3'}, + {'hostname': '192.168.0.186', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器4'}, + + {'hostname': '192.168.0.56', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器5'}, + {'hostname': '192.168.0.185', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器6'}, + {'hostname': '192.168.0.72', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器7'}, + {'hostname': '192.168.0.35', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器8'}, + {'hostname': '192.168.0.230', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器9'}, + {'hostname': '192.168.0.125', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器10'}, + {'hostname': '192.168.0.46', 'username': 'root', 'password': 's6fQeVQmxxNv','host':'新1生产服务器11'}, +# +] + +# 创建并启动线程 +threads = [] +for server in servers: + thread = threading.Thread(target=thread_function, args=(server,)) + threads.append(thread) + thread.start() + +# 等待所有线程完成 +for thread in threads: + thread.join() + +print("All commands executed.") diff --git a/zzb_data_prod/pdf_title.py b/zzb_data_prod/pdf_title.py new file mode 100644 index 0000000..0d96f66 --- /dev/null +++ b/zzb_data_prod/pdf_title.py @@ -0,0 +1,240 @@ +import PyPDF2 +import re +import os,threading +from config import REDIS_HOST,REDIS_PORT,REDIS_PASSWORD +import redis +import db_service +def get_tree_pages(root, info, depth=0,title_array=[]): + """ + Recursively iterate the outline tree + Find the pages pointed by the outline item + and get the assigned physical order id + + Decrement with padding if necessary + """ + + if isinstance(root, dict): + # print(root) + page = root['/Page'].get_object() + # print(id(page)) + t = root['/Title'] + title = t + if isinstance(t, PyPDF2.generic.ByteStringObject): + title = t.original_bytes.decode('utf8') + title = title.strip() + title = title.replace('\n', '') + title = title.replace('\r', '') + + page_num = info['all_pages'].get(id(page), 0) + if page_num == 0: + print('Not found page number for /Page!', page) + elif page_num < info['padding']: + page_num = 0 + else: + page_num -= info['padding'] + + + # str_val = '%-5d' % page_num + # str_val += '\t' * depth + # str_val += title + '\t' + '%3d' % page_num + # print(str_val) + title_array.append({ + 'title': title, + 'page_num': page_num, + 'depth': depth + }) + for elem in root: + get_tree_pages(elem, info, depth+1,title_array) + return title_array + + +def recursive_numbering(obj, info): + """ + Recursively iterate through all the pages in order and assign them a physical + order number + """ + # print(id(obj), obj) + if obj['/Type'] == '/Page': + obj_id = id(obj) + if obj_id not in info['all_pages']: + info['all_pages'][obj_id] = info['current_page_id'] + info['current_page_id'] += 1 + return + elif obj['/Type'] == '/Pages': + for page in obj['/Kids']: + recursive_numbering(page.get_object(), info) + +def get_numbers_between(numbers_between,start, end): + # 初始化一个空列表来存储两个数字之间的所有数字 + + # 遍历从开始数字到结束数字之间的每个数字 + for i in range(start, end + 1): + # 将每个数字添加到列表中 + numbers_between.append(i) + return numbers_between + +def get_page_end(start, depth, title_array): + page_end = -1 + for i in range(start, len(title_array)): + if title_array[i]['depth'] == depth: + page_end = title_array[i]['page_num'] + break + return page_end + +def get_file_split(page_count): + # 获取 CPU 核数 + cpu_count = 4 + if page_count < cpu_count: + cpu_count = page_count + # 使用 divmod() 函数计算除法结果和余数 + quotient, remainder = divmod(page_count, cpu_count) + table_split_parts = [] + text_split_parts = [] + for i in range(cpu_count): + start_num = i * quotient + if i < cpu_count-1: + start_num = i * quotient + end_num = start_num+quotient + else: + end_num = page_count + table_split_parts.append(f'{start_num}-{end_num}') + text_split_parts.append(get_numbers_between([],start_num, end_num)) + + # 返回除法结果和余数 + return { + 'table_split_parts': table_split_parts, + 'text_split_parts': text_split_parts + } + +def create_text_outline(pdf_path, file_id): + # print('Running the script for [%s] with padding [%d]' % (pdf_path, page_number_padding)) + # creating an object + with open(pdf_path, 'rb') as file: + file_info = {} + fileReader = PyPDF2.PdfReader(file) + page_count = len(fileReader.pages) + + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + redis_client.set(f'page_count_{file_id}', page_count) + + info = { + 'page_count': page_count, + 'all_pages': {}, + 'current_page_id': 1, + 'padding': 0 + } + + print('Number of pages: %d' % info['page_count']) + + pages = fileReader.trailer['/Root']['/Pages'].get_object() + recursive_numbering(pages, info) + #for page_num, page in enumerate(pages['/Kids']): + # page_obj = page.getObject() + # all_pages[id(page_obj)] = page_num + 1 # who starts counting from 0 anyways? + title_array = get_tree_pages(fileReader.outline, info, 0, []) + db_service.pdf_title_insert_mysql(file_id,title_array) + title_array = db_service.get_file_info_from_mysql(file_id) + + parent_table_pages_local = {} + parent_table_pages_local[file_id] = [] + print(f'{file_id}:{len(title_array)}') + for i in range(len(title_array)): + title_obj = title_array[i] + title = title_obj['title'] + #print(f'标题分别是{title}') + if len(re.findall('母公司|现金流量表补充|重要会计政策|会计估计变更|公允价值的披露|合营安排或联营企业中的权益|与金融工具相关的风险|税项|主要控股参股公司|结构化主体情况|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|所有权或使用权受到限制的资产|在建工程|固定资产|其他主体中的权益|分部信息|与金融工具相关的风险|其他关联交易|公司子公司重大事项', title)) >0 : + page_start = title_obj['page_num'] + depth = title_obj['depth'] + if i < len(title_array) - 1: + page_end = title_array[i+1]['page_num'] + if title_array[i]['depth'] in [1,2]: + page_end = get_page_end(i+1, depth, title_array) + else: + page_end = page_count + print(f'目录识别时被丢弃的页码:{page_start}-{page_end}') + + #当标题为母公司财务报表主要项目注释时,最后一页不过滤,避免核心roe指标无法召回 + if len(re.findall('财务报表主要项目注释', title)) == 0: + page_end = page_end - 1 + # print(title,page_start,page_end) + for i in range(page_start, page_end + 1): + # 将每个数字添加到列表中 + parent_table_pages_local[file_id].append(i) + file_info['page_count'] = page_count + file_info['parent_table_pages'] = parent_table_pages_local[file_id] + file_info['split_parts'] = get_file_split(page_count) + + redis_client.close() + + return file_info + + +def create_text_outline_disclosure(pdf_path, file_id): + # print('Running the script for [%s] with padding [%d]' % (pdf_path, page_number_padding)) + # creating an object + with open(pdf_path, 'rb') as file: + file_info = {} + fileReader = PyPDF2.PdfReader(file) + page_count = len(fileReader.pages) + + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + redis_client.set(f'page_count_{file_id}', page_count) + + info = { + 'page_count': page_count, + 'all_pages': {}, + 'current_page_id': 1, + 'padding': 0 + } + + print('Number of pages: %d' % info['page_count']) + + pages = fileReader.trailer['/Root']['/Pages'].get_object() + recursive_numbering(pages, info) + #for page_num, page in enumerate(pages['/Kids']): + # page_obj = page.getObject() + # all_pages[id(page_obj)] = page_num + 1 # who starts counting from 0 anyways? + title_array = get_tree_pages(fileReader.outline, info, 0, []) + #db_service.pdf_title_insert_mysql(file_id,title_array) + #title_array = db_service.get_file_info_from_mysql(file_id) + + parent_table_pages_local = {} + parent_table_pages_local[file_id] = [] + print(f'{file_id}:{len(title_array)}') + for i in range(len(title_array)): + title_obj = title_array[i] + title = title_obj['title'] + #print(f'标题分别是{title}') + if len(re.findall('母公司|现金流量表补充|重要会计政策|会计估计变更|公允价值的披露|合营安排或联营企业中的权益|与金融工具相关的风险|税项|主要控股参股公司|结构化主体情况|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|所有权或使用权受到限制的资产|在建工程|固定资产|其他主体中的权益|分部信息|与金融工具相关的风险|其他关联交易|公司子公司重大事项', title)) >0 : + page_start = title_obj['page_num'] + depth = title_obj['depth'] + if i < len(title_array) - 1: + page_end = title_array[i+1]['page_num'] + if title_array[i]['depth'] in [1,2]: + page_end = get_page_end(i+1, depth, title_array) + else: + page_end = page_count + print(f'目录识别时被丢弃的页码:{page_start}-{page_end}') + + #当标题为母公司财务报表主要项目注释时,最后一页不过滤,避免核心roe指标无法召回 + if len(re.findall('财务报表主要项目注释', title)) == 0: + page_end = page_end - 1 + # print(title,page_start,page_end) + for i in range(page_start, page_end + 1): + # 将每个数字添加到列表中 + parent_table_pages_local[file_id].append(i) + file_info['page_count'] = page_count + file_info['parent_table_pages'] = parent_table_pages_local[file_id] + file_info['split_parts'] = get_file_split(page_count) + + redis_client.close() + + return file_info +if __name__ == '__main__': + import time + path = "/Users/zhengfei/Desktop/cb/2023年报检测/安妮股份.pdf" + + threading.Thread(target=create_text_outline, args=(path,'111')).start() + time.sleep(5) + threading.Thread(target=create_text_outline, args=(path,'222')).start() + diff --git a/zzb_data_prod/put_code.sh b/zzb_data_prod/put_code.sh new file mode 100644 index 0000000..7905408 --- /dev/null +++ b/zzb_data_prod/put_code.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# 设置文件路径和目标目录# 请注意这列的config文件是不可以进行传输的 /root/pdf_parser/zzb_data_prod/utils.py /root/pdf_parser/zzb_data_prod/db_service.py +#FILES="/root/pdf_parser/zzb_data_prod/utils.py /root/pdf_parser/zzb_data_prod/db_service.py /root/pdf_parser/zzb_data_prod/app.py /root/pdf_parser/zzb_data_prod/main.py /root/pdf_parser/zzb_data_prod/pdf_title.py" +FILES="/root/pdf_parser/zzb_data_prod/put_code.sh" +DEST_PATH="/root/pdf_parser/zzb_data_prod" + +# 设置服务器列表 主服务器 "1.94.143.23" "113.44.72.157" "1.94.101.237" "123.60.16.225" "124.71.157.162" "1.94.60.103" "1.94.143.23" "124.71.149.225" "113.44.52.221" "121.37.137.13" +#SERVERS=("113.44.72.157" "1.94.101.237" "123.60.16.225" "124.71.157.162" "1.94.60.103" "124.71.149.225" "113.44.52.221" "121.37.137.13" "123.60.28.83" "192.168.0.19" "192.168.0.53" "192.168.0.150" "192.168.0.210" "192.168.0.129" "192.168.0.24" "192.168.0.250" "192.168.0.162" "192.168.0.86" "192.168.0.88" "192.168.0.93" "192.168.0.228" "192.168.0.155" "192.168.0.186" "192.168.0.56" "192.168.0.185" "192.168.0.72" "192.168.0.35" "192.168.0.230" "192.168.0.125" "192.168.0.46" "192.168.0.131") +#SERVERS=("192.168.0.228" "192.168.0.155" "192.168.0.186" "192.168.0.56" "192.168.0.185") +#监管服务器 +#SERVERS=("192.168.0.108" "192.168.0.131") +#企业服务器 +#SERVERS=("192.168.0.163" "192.168.0.26" "192.168.0.2" "192.168.0.128" "192.168.0.136" "192.168.0.239") +#两者一起 +SERVERS=("192.168.0.163" "192.168.0.26" "192.168.0.2" "192.168.0.128" "192.168.0.136" "192.168.0.239" "192.168.0.108" "192.168.0.131") +# 遍历每个服务器并上传文件 +for SERVER in "${SERVERS[@]}"; do + echo "Uploading files to $SERVER" + scp -r $FILES root@$SERVER:$DEST_PATH + echo "Finished uploading to $SERVER" +done + + diff --git a/zzb_data_prod/redis_service.py b/zzb_data_prod/redis_service.py new file mode 100644 index 0000000..0bec300 --- /dev/null +++ b/zzb_data_prod/redis_service.py @@ -0,0 +1,16 @@ +import redis +# 从 MySQL 表中读取数据并写入 Redis +def read_from_file_and_write_to_redis(redis_client,ori_measure_id,measure_vector): + # Redis 连接配置 + redis_client.hset('measure_config',ori_measure_id, measure_vector) + +# 从 Redis 中读取数据 +def read_from_redis(redis_client,ori_measure_id): + # 获取所有键 + return redis_client.hget('measure_config',ori_measure_id).decode() + +if __name__ == "__main__": + redis_client = redis.Redis(host='192.168.0.175', port=6379, password='Xgf_redis', db=6) + + value = read_from_redis(redis_client,"bb3cf43f3dba147373c706c6567b5a") + print(value) diff --git a/zzb_data_prod/requirements.txt b/zzb_data_prod/requirements.txt new file mode 100644 index 0000000..3be1870 --- /dev/null +++ b/zzb_data_prod/requirements.txt @@ -0,0 +1,15 @@ +camelot-py==0.11.0 +pdfminer.six==20221105 +PyPDF2==3.0.1 +pdfplumber==0.10.3 +pymilvus==2.3.3 +mysql-connector-python==8.3.0 +dashscope==1.17.0 +fastapi +pydantic +uvicorn +redis +ghostscript +opencv-python-headless +python-docx +docx2pdf \ No newline at end of file diff --git a/zzb_data_prod/requirements_lite.txt b/zzb_data_prod/requirements_lite.txt new file mode 100644 index 0000000..10e93b0 --- /dev/null +++ b/zzb_data_prod/requirements_lite.txt @@ -0,0 +1,6 @@ +pdfminer.six==20221105 +PyPDF2==3.0.1 +pdfplumber==0.10.3 +pymilvus==2.3.3 +mysql-connector-python==8.3.0 +dashscope==1.17.0 diff --git a/zzb_data_prod/test.pdf b/zzb_data_prod/test.pdf new file mode 100644 index 0000000..cc0b07a --- /dev/null +++ b/zzb_data_prod/test.pdf @@ -0,0 +1,3 @@ +--2024-12-27 11:23:36-- https://financial-report.obs.cn-east-3.myhuaweicloud.com/upload/file/44b374ac0fe140a2922c360db47335a1.PDF?AccessKeyId=WMBIZTLULUR24OBUIRC4 +Resolving financial-report.obs.cn-east-3.myhuaweicloud.com (financial-report.obs.cn-east-3.myhuaweicloud.com)... failed: Name or service not known. +wget: unable to resolve host address ‘financial-report.obs.cn-east-3.myhuaweicloud.com’ diff --git a/zzb_data_prod/test.py b/zzb_data_prod/test.py new file mode 100644 index 0000000..f514947 --- /dev/null +++ b/zzb_data_prod/test.py @@ -0,0 +1,154 @@ +#coding=utf-8 +import sys,ast +from pdfminer.high_level import extract_text +from pdfminer.pdfparser import PDFParser +from pdfminer.pdfdocument import PDFDocument +from pdfminer.pdfpage import PDFPage +import utils +import mysql.connector +from pymilvus import connections,MilvusClient +import json +import db_service +import ast +import numpy as np +import config +import redis_service +from config import MILVUS_CLIENT,MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB +import main +import redis + +def measure_config_to_db(conn,cursor): + insert_query = ''' + INSERT INTO measure_config + (measure_id, measure_name, ori_measure_id, ori_measure_name) + VALUES (%s, %s, %s, %s) + ''' + check_query = ''' + select ori_measure_id from measure_config + ''' + # 打开文本文件 + with open('/Users/zhengfei/work/zzb_data/measure_config_all.txt', 'r') as file: + # 读取所有行到一个列表中 + lines = file.readlines() + + # 打印每一行 + for line in lines: + config_list = line.strip().split(',') + measure = config_list[0] + ori_measure = config_list[1] + ori_measure_id = utils.get_md5(ori_measure) + # 判断数据库中是否有数据 + # cursor.execute(check_query.format(ori_measure_id=ori_measure_id)) + # check_records = cursor.fetchall() + # if(len(check_records)) > 0: + # continue + data_to_insert = (utils.get_md5(measure), measure, ori_measure_id, ori_measure) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def insert_measure_vector(conn,cursor): + + redis_client = redis.Redis(host='192.168.0.172', port=6379, password='Xgf_redis', db=6) + # 执行SQL语句,更新数据 + select_query = ''' + SELECT ori_measure_id,ori_measure_name FROM measure_config + ''' + cursor.execute(select_query) + records = cursor.fetchall() + for record in records: + if redis_client.hexists('measure_config', record[0]): + measure_vector = redis_client.hget('measure_config', record[0]) + else: + print('新增指标',record[1]) + vector_obj = utils.embed_with_str(record[1]) + measure_vector = str(vector_obj.output["embeddings"][0]["embedding"]) + + redis_client.hset('measure_config', record[0], measure_vector) + redis_client.close() + conn.close() + +def contains_financial_indicators(text): + import re + # 正则表达式模式匹配千分位格式的数字和百分比 + pattern = r"\d{1,3}(,\d{3})+(\.\d{1,3})?" + + pattern1 = r"\d+(.\d+)+%?" + # 使用 re.search 函数查找匹配项 + match = re.search(pattern1, text) + + # 如果找到匹配项,返回 True,否则返回 False + return bool(match) + +def get_clean_text(text): + import re + pattern = r"\([^)]*?\)" + matches = re.findall(pattern, text) + for match in matches: + # 使用 re.findall 函数查找括号内的内容中是否包含月份或关键词 + month_keywords_found = re.search(r"归属于|扣非", match) + if not month_keywords_found: + # 如果包含,则从文本中删除该部分 + text = re.sub(pattern,"", text) + else: + # 如果不包含,删除所有标点符号和中文数字 + text = re.sub(r"[^\w\s]", "", text) + print(text) + +def insert_and_update(conn,cursor,client,parent_table_pages,file_id,path): + # #通过向量查询指标 + db_service.insert_table_measure_from_vector(conn,cursor,client,parent_table_pages,file_id,path) + + # #指标归一化处理 + db_service.update_ori_measure(conn,cursor,file_id) + +def print_measure_data(cursor,client): + select_query = ''' + SELECT ori_measure_name,measure_name,ori_measure_id FROM measure_config + where measure_id not in(select distinct measure_id from ori_measure_list where file_id='64') + ''' + cursor.execute(select_query) + records = cursor.fetchall() + for record in records: + ori_measure_name = record[0] + measure_name = record[1] + ori_measure_id = record[2] + measure_vector = redis_service.read_from_redis(ori_measure_id) + + measure_list = ast.literal_eval(measure_vector) + data = [measure_list] + res = client.search( + collection_name="pdf_measure_v4", # Replace with the actual name of your collection + # Replace with your query vector + data=data, + limit=2, # Max. number of search results to return + search_params={"metric_type": "COSINE", "params": {}}, # Search parameters + output_fields=["measure_name","measure_value","table_num","table_index"], + filter = 'file_id == "64"' + ) + vector_str = measure_name+":"+ori_measure_name + # Convert the output to a formatted JSON string + for i in range(len(res[0])): + + vector_distance = float(res[0][i]["distance"]) + vector_measure_name = res[0][i]["entity"]["measure_name"] + measure_value = res[0][i]["entity"]["measure_value"] + table_num = res[0][i]["entity"]["table_num"] + table_index = res[0][i]["entity"]["table_index"] + table_num_list = [106] + print(vector_str +":"+vector_measure_name+":"+str(vector_distance) +":"+measure_value +":"+str(table_num) +":"+str(table_index)) + # if vector_distance > 0.89 and table_num not in table_num_list: + # print(vector_str +":"+vector_measure_name+":"+str(vector_distance) +":"+measure_value +":"+str(table_num) +":"+str(table_index)+":"+str(0.94)) + # if vector_distance > distance and table_num not in table_num_list: + # print(vector_str +":"+vector_measure_name +":"+measure_value +":"+str(table_num) +":"+str(table_index)+":"+str(vector_distance)+":"+str(distance)) + + +if __name__ == "__main__": + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + cursor = conn.cursor() + + insert_measure_vector(conn,cursor) diff --git a/zzb_data_prod/test0710.py b/zzb_data_prod/test0710.py new file mode 100644 index 0000000..b199df5 --- /dev/null +++ b/zzb_data_prod/test0710.py @@ -0,0 +1 @@ +import re diff --git a/zzb_data_prod/test_0711.py b/zzb_data_prod/test_0711.py new file mode 100644 index 0000000..578010c --- /dev/null +++ b/zzb_data_prod/test_0711.py @@ -0,0 +1,92 @@ +#import camelot +import re +#from multiprocessing import Pool +import os, time, random +import json +#from config import MILVUS_CLIENT,MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB,MEASURE_COUNT +from datetime import datetime +# 读取PDF +import PyPDF2 +# 分析PDF的layout,提取文本 +from pdfminer.high_level import extract_pages +from pdfminer.layout import LTTextBoxHorizontal +import pdfplumber +import mysql.connector +#import utils +from pymilvus import MilvusClient +#import llm_service +#import db_service +#import pdf_title +import numpy as np +#from multiprocessing import Process + + + + +def text_in_table(top, tables_range, page_num): + if tables_range.get(page_num): + for range in tables_range[page_num]: + if top < range['top'] and top > range['buttom']: + return True + return False + +def get_text_type(text: str): + text = re.sub(r"\s", "", text) + first_re = '年度报告' + page_number_pattern = re.compile(r'^\d+(/\d+)?$') + + if re.search(first_re, text.strip()): + return 'page_header' + + if page_number_pattern.match(text.strip()): + return 'page_footer' + + return 'text' +def get_text_content_test(file_path,file_id,pages,tables_range): + page_start = pages.split('-')[0] + page_end = pages.split('-')[1] + + + # 我们从PDF中提取页面,page_numbers=[4,5,6] + for pagenum, page in enumerate(extract_pages(pdf_path)): + try: + if pagenum+1 < int(page_start) or pagenum+1 > int(page_end): + continue + # 找到所有的元素 + page_elements = [(element.y1, element) for element in page._objs] + # 查找组成页面的元素 + for i,component in enumerate(page_elements): + # 提取页面布局的元素 + element = component[1] + # 检查该元素是否为文本元素 + if isinstance(element, LTTextBoxHorizontal): + # 检查文本是否出现在表中 + line_text = element.get_text().replace('\n','') + line_text = re.sub(r"\s", "", line_text) + #print(f'line_text 的值是{line_text}') + + element_top = element.bbox[3] + element_buttom = element.bbox[1] + + # 检查该文本是否出现在表中 + if tables_range.get(pagenum+1): + for range in tables_range[pagenum+1]: + if element_top < range['top'] and element_top > range['buttom']: + pass + else: + if element_top - range['top'] < 150 and element_top - range['top'] > 5 and not text_in_table(element_top, tables_range, pagenum+1): + text_type = get_text_type(line_text) + if text_type == 'page_header': + break + + # 记录需要过滤掉的页码 + if len(re.findall('母公司|现金流量表补充', line_text)) > 0: + print('成功识别到了') + except Exception as e: + print(f"Error processing page {pagenum+1}: {e}") + +pdf_path = r"combined_v61.pdf" +file_id = 1 +tables_range = {1: [{'top': 727.0118072976055, 'buttom': 77.52552451539339, 'table_index': 1, 'page_num': 1}], 2: [{'top': 687.408985176739, 'buttom': 77.04549030786774, 'table_index': 1, 'page_num': 2}]} +pages = '1-2' +get_text_content_test(pdf_path,file_id,pages,tables_range) diff --git a/zzb_data_prod/test_0711_v2.py b/zzb_data_prod/test_0711_v2.py new file mode 100644 index 0000000..e6f1089 --- /dev/null +++ b/zzb_data_prod/test_0711_v2.py @@ -0,0 +1,325 @@ +import camelot +import re +#from multiprocessing import Pool +import os, time, random +import json +#from config import MILVUS_CLIENT,MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB,MEASURE_COUNT +from datetime import datetime +# 读取PDF +import PyPDF2 +# 分析PDF的layout,提取文本 +from pdfminer.high_level import extract_pages +from pdfminer.layout import LTTextBoxHorizontal +import pdfplumber +import mysql.connector +#import utils +from pymilvus import MilvusClient +#import llm_service +#import db_service +#import pdf_title +import numpy as np +#from multiprocessing import Process + +STR_PATTERN = '营业收入|净利润|变动比例|损益|现金流量净额|现金净流量|现金流|每股收益|总资产|资产总额|收益率|货币资金|应收账款|存货|固定资产|在建工程|商誉|短期借款|应付账款|合同负债|长期借款|营业成本|销售费用|管理费用|财务费用|研发费用|研发投入' +#负责表内一旦出现某个字符,整个表丢弃 +PATTERN = '品牌类型|分门店|销售渠道|行业名称|产品名称|地区名称|子公司名称|业绩快报|调整情况说明|调整年初资产负债表|计入当期损益的政府补助|主要子公司|分部|母公司资产负债表|显示服务|渠道|商品类型|合同分类|会计政策变更|地区分类' +#unit_pattern = re.compile(r'单位[:|:]?(百万元|千万元|亿元|万元|千元|元)') +MUILT_PATTERN = '调整前' +file_path = r"combined_v61.pdf" +file_id = 1 +pages = '1-2' +tables_range = {} +# def get_table_range_test(file_path, file_id, pages, tables_range): + +# print('Run task %s (%s)...' % (f'解析表格{pages}', os.getpid())) +# #(f'file_path: {file_path},file_id:{file_id},pages:{pages},tables_range:{tables_range}') +# start = time.time() +# import tempfile +# temp_dir_path = "F:\\temp" + +# # 检查并创建临时文件夹 +# if not os.path.exists(temp_dir_path): +# os.makedirs(temp_dir_path) + +# # 创建临时文件夹 +# temp_dir = tempfile.mkdtemp(prefix="camelot_temp_", dir=temp_dir_path) +# # 设置全局临时文件夹路径 +# os.environ["TMP"] = temp_dir +# os.environ["TEMP"] = temp_dir +# # conn = mysql.connector.connect( +# # host= MYSQL_HOST, +# # user= MYSQL_USER, +# # password= MYSQL_PASSWORD, +# # database= MYSQL_DB +# # ) + +# # 创建一个cursor对象来执行SQL语句 +# #print(f'file_path的值是{file_path}') +# #cursor = conn.cursor() +# # try: +# # tables = camelot.read_pdf(file_path, pages=pages, strip_text=' ,\n', copy_text=['h']) +# # print('读取成功') +# # except Exception as e: +# # print(f'错误在{e}') +# #print(f'file_path的值是{file_path}') +# #file_path = "F:\\11_pdf\\688670-2023-nb-nb.pdf" +# os.environ["GHOSTSCRIPT_BINARY"] = "gswin64c" +# try: +# # 确保 file_path 是正确的,并且文件是可访问的 +# if not os.path.exists(file_path): +# print(f'文件路径不正确或文件不存在: {file_path}') +# raise FileNotFoundError(f"文件不存在:{file_path}") +# else: +# pass#(f'file_path是存在的就是{file_path}') + +# # 读取 PDF 文件 +# #tables = camelot.read_pdf(file_path, pages=pages, strip_text=' ,\n')#, copy_text=['h'] +# #tables = camelot.read_pdf(file_path, pages=pages, flavor='lattice', strip_text=' ,\n', temp_dir=temp_dir) +# tables = camelot.read_pdf(file_path, pages=pages, strip_text=' ,\n', copy_text=['h'], temp_dir=temp_dir)#line_scale=10, + +# print('读取成功') +# print("检测到的表格数量:", tables.n) +# except FileNotFoundError as fe: +# print(fe) +# except Exception as e: +# print(f'处理PDF时出错: {e}') +# for t in tables: + +# top = t._bbox[3] +# buttom = t._bbox[1] +# page_num = int(t.page) +# table_index = int(t.order) +# arr = np.array(t.data) +# #recent_value = None +# #这里开始对可能解析错误的值做判断: +# for i, row in enumerate(arr): +# if len(row) >= 4: +# # first_value = row[0] +# # if ("2023年度" in first_value or "2022年度" in first_value) and len(first_value) <= 12: +# # recent_value = first_value +# # if first_value == '' and recent_value: +# # row[0] = recent_value +# # 检查条件:第一列不为数字,第二列和第四列为空,第三列有三个小数点【三列的数字被识别到一起了】 +# if (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 4 and len(row[2].rsplit('.', 1)[-1]) == 2) and (row[3] == ''): +# split_values = row[2].split('.') +# # 确保可以正确拆分成三个数值 +# if len(split_values) == 4: +# new_value1 = f"{split_values[0]}.{split_values[1][:2]}" +# new_value2 = f"{split_values[1][2:]}.{split_values[2][:2]}" +# new_value3 = f"{split_values[2][2:]}.{split_values[3]}" +# row[1] = new_value1 +# row[2] = new_value2 +# row[3] = new_value3 +# #检查条件:第一列不为数字,第二列第四列为空,第三列两个小数点,第五列两个小数点【两列的数字被识别到一起了】 +# if len(row) >= 5 and (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 3) and (row[3] == '') and (len(row[4].split('.')) == 3) and len(row[2].rsplit('.', 1)[-1]) == 2 and len(row[4].rsplit('.', 1)[-1]) == 2: +# split_value_3 = row[2].split('.') +# split_value_5 = row[4].split('.') + +# if len(split_value_3) == 3: +# new_value2 = f"{split_value_3[0]}.{split_value_3[1][:2]}" +# new_value3 = f"{split_value_3[1][2:]}.{split_value_3[2]}" + +# if len(split_value_5) == 3: +# new_value4 = f"{split_value_5[0]}.{split_value_5[1][:2]}" +# new_value5 = f"{split_value_5[1][2:]}.{split_value_5[2]}" + +# row[1] = new_value2 +# row[2] = new_value3 +# row[3] = new_value4 +# row[4] = new_value5 +# #检查条件:第一列不为数字,第二列为空,第三列有两个小数点,第四列为正常数字【两列的数字被识别到一起了】 +# if len(row) >= 4 and (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 3) and len(row[2].rsplit('.', 1)[-1]) == 2 and (row[3].replace('-', '', 1).replace('.', '', 1).isdigit()): +# split_values = row[2].split('.') +# if len(split_values) == 3: +# new_value2 = f"{split_values[0]}.{split_values[1][:2]}" +# new_value3 = f"{split_values[1][2:]}.{split_values[2]}" +# row[1] = new_value2 +# row[2] = new_value3 +# #检查条件:第一列不位数字,后面有一列中的值存在“%”并且"%"不是结尾,就进行拆分 +# if not row[0].replace('.', '', 1).isdigit(): +# for i in range(1, len(row) - 1): +# if row[i] == '' and '%' in row[i + 1] and len(row[i + 1].split('%')) == 2: +# split_values = row[i + 1].split('%') +# new_value1 = f"{split_values[0]}%" +# new_value2 = f"{split_values[1]}" +# row[i] = new_value1 +# row[i + 1] = new_value2 +# break + +# #检查条件:当一个列表中同时出现了2022年12月31日和2023年1月1日时【并且都只出现1次】,在2022年12月31日后面增加“调整前”字段 +# # if sum(1 for item in row if item.strip() == "2023年1月1日") == 1 and sum(1 for item in row if item.strip() == "2022年12月31日") == 1: +# # for i, item in enumerate(row): +# # stripped_item = item.strip() #去空格 +# # if stripped_item == "2022年12月31日": +# # row[i] = stripped_item + '调整前' + +# new_data = arr.tolist()#用于后面保存到数据库中 + + +# rows, cols = arr.shape +# if rows == 1 and cols == 1: +# continue +# arr_str = ''.join([''.join(map(str, row)) for row in arr]) +# #print(f'arr_str的值是 {arr_str}') +# #过滤掉不包含需抽取指标表格的文本 +# matches = re.findall(STR_PATTERN, arr_str) +# pattern = re.findall(PATTERN,arr_str) +# muilt_pattern = re.findall(MUILT_PATTERN,arr_str) +# if len(matches) > 0 and len(pattern) == 0 and len(muilt_pattern)<5: +# if not tables_range.get(page_num): +# tables_range[page_num] = [] + +# tables_range[page_num].append({ +# 'top' : top, +# 'buttom' : buttom, +# 'table_index' : table_index, +# 'page_num' : page_num, +# }) +# print(f"tables_range的值是{tables_range}") +# #(f'file_id是{file_id}') + +# # db_service.insert_pdf_parse_process({ +# # 'file_id': file_id, +# # 'page_num' : page_num, +# # 'page_count' : 100, +# # 'type' : 'parse_table', +# # 'content':{ +# # 'top' : top, +# # 'buttom' : buttom, +# # 'page_num' : page_num, +# # 'table_index' : table_index, +# # "type" : "table", +# # "data" : new_data, +# # 'sort_num' : page_num*1000 - top +# # }},conn,cursor) + +# #get_text_content(file_path, file_id, tables_range, pages, conn, cursor) + +# # cursor.close() +# # conn.close() + +# end = time.time() +# print('Task %s runs %0.2f seconds.' % (f'解析表格{pages}', (end - start))) +def get_table_range_test(file_path, file_id, pages, tables_range): + + print('Run task %s (%s)...' % (f'解析表格{pages}', os.getpid())) + start = time.time() + + # conn = mysql.connector.connect( + # host= MYSQL_HOST, + # user= MYSQL_USER, + # password= MYSQL_PASSWORD, + # database= MYSQL_DB + # ) + + # 创建一个cursor对象来执行SQL语句 + #cursor = conn.cursor() + + #redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + + tables = camelot.read_pdf(file_path, pages=pages, strip_text=' ,\n', copy_text=['h']) + for t in tables: + + top = t._bbox[3] + buttom = t._bbox[1] + page_num = int(t.page) + table_index = int(t.order) + arr = np.array(t.data) + #这里开始对可能解析错误的值做判断: + for i, row in enumerate(arr): + if len(row) >= 4: + # 检查条件:第一列不为数字,第二列和第四列为空,第三列有三个小数点【三列的数字被识别到一起了】 + if (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 4 and len(row[2].rsplit('.', 1)[-1]) == 2) and (row[3] == ''): + split_values = row[2].split('.') + # 确保可以正确拆分成三个数值 + if len(split_values) == 4: + new_value1 = f"{split_values[0]}.{split_values[1][:2]}" + new_value2 = f"{split_values[1][2:]}.{split_values[2][:2]}" + new_value3 = f"{split_values[2][2:]}.{split_values[3]}" + row[1] = new_value1 + row[2] = new_value2 + row[3] = new_value3 + #检查条件:第一列不为数字,第二列第四列为空,第三列两个小数点,第五列两个小数点【两列的数字被识别到一起了】 + if len(row) >= 5 and (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 3) and (row[3] == '') and (len(row[4].split('.')) == 3) and len(row[2].rsplit('.', 1)[-1]) == 2 and len(row[4].rsplit('.', 1)[-1]) == 2: + split_value_3 = row[2].split('.') + split_value_5 = row[4].split('.') + + if len(split_value_3) == 3: + new_value2 = f"{split_value_3[0]}.{split_value_3[1][:2]}" + new_value3 = f"{split_value_3[1][2:]}.{split_value_3[2]}" + + if len(split_value_5) == 3: + new_value4 = f"{split_value_5[0]}.{split_value_5[1][:2]}" + new_value5 = f"{split_value_5[1][2:]}.{split_value_5[2]}" + + row[1] = new_value2 + row[2] = new_value3 + row[3] = new_value4 + row[4] = new_value5 + #检查条件:第一列不为数字,第二列为空,第三列有两个小数点,第四列为正常数字【两列的数字被识别到一起了】 + if len(row) >= 4 and (not row[0].replace('.', '', 1).isdigit()) and (row[1] == '') and (len(row[2].split('.')) == 3) and len(row[2].rsplit('.', 1)[-1]) == 2 and (row[3].replace('-', '', 1).replace('.', '', 1).isdigit()): + split_values = row[2].split('.') + if len(split_values) == 3: + new_value2 = f"{split_values[0]}.{split_values[1][:2]}" + new_value3 = f"{split_values[1][2:]}.{split_values[2]}" + row[1] = new_value2 + row[2] = new_value3 + #检查条件:第一列不位数字,后面有一列中的值存在“%”并且"%"不是结尾,就进行拆分 + if not row[0].replace('.', '', 1).isdigit(): + for i in range(1, len(row) - 1): + if row[i] == '' and '%' in row[i + 1] and len(row[i + 1].split('%')) == 2: + split_values = row[i + 1].split('%') + new_value1 = f"{split_values[0]}%" + new_value2 = f"{split_values[1]}" + row[i] = new_value1 + row[i + 1] = new_value2 + break + + new_data = arr.tolist()#用于后面保存到数据库中 + rows, cols = arr.shape + if rows == 1 and cols == 1: + continue + arr_str = ''.join([''.join(map(str, row)) for row in arr]) + + #过滤掉不包含需抽取指标表格的文本 + matches = re.findall(STR_PATTERN, arr_str) + pattern = re.findall(PATTERN,arr_str) + muilt_pattern = re.findall(MUILT_PATTERN,arr_str) + if len(matches) > 0 and len(pattern) == 0 and len(muilt_pattern)<5: + if not tables_range.get(page_num): + tables_range[page_num] = [] + + tables_range[page_num].append({ + 'top' : top, + 'buttom' : buttom, + 'table_index' : table_index, + 'page_num' : page_num, + }) + print(f"tables_range的值是{tables_range}") + + # db_service.insert_pdf_parse_process({ + # 'file_id': file_id, + # 'page_num' : page_num, + # 'page_count' : 100, + # 'type' : 'parse_table', + # 'content':{ + # 'top' : top, + # 'buttom' : buttom, + # 'page_num' : page_num, + # 'table_index' : table_index, + # "type" : "table", + # "data" : new_data, + # 'sort_num' : page_num*1000 - top + # }},conn,cursor) + + # get_text_content(file_path, file_id, tables_range, pages, conn, cursor, redis_client) + + # cursor.close() + # conn.close() + # redis_client.close() + + end = time.time() + print('Task %s runs %0.2f seconds.' % (f'解析表格{pages}', (end - start))) + + +get_table_range_test(file_path, file_id, pages, tables_range) diff --git a/zzb_data_prod/utils.py b/zzb_data_prod/utils.py new file mode 100644 index 0000000..8e2beae --- /dev/null +++ b/zzb_data_prod/utils.py @@ -0,0 +1,780 @@ +#coding=utf-8 + +import dashscope +from http import HTTPStatus +from pymilvus import MilvusClient +import json +from datetime import datetime +import re,os,time +import requests +import config +import numpy as np +from docx2pdf import convert +from config import api_key +import logging +logger = logging.getLogger(__name__) + +dashscope.api_key = api_key + + +def get_md5(str): + import hashlib + m = hashlib.md5() + m.update(str.encode('utf-8')) + return m.hexdigest() + +def embed_with_str(input): + retry = 0 + max_retry = 5 + t = 0.2 + while retry < max_retry: + # time.sleep(t) + #阿里接口限流 + resp = dashscope.TextEmbedding.call( + model=dashscope.TextEmbedding.Models.text_embedding_v2, + input=input) + if resp.status_code == HTTPStatus.OK: + return resp + elif resp.status_code == 429: + logger.info(f'触发限流,等待{t}秒后重试') + retry += 1 + t+=0.1 + else: + logger.error(f'请求失败,状态码:{resp.status_code}') + return None + logger.error('重试超过上限') + return None + + + +#如果存在‘归属于|扣非’,就保留括号内的内容,并去掉标点符号和中文数字。 +#如果存在季度关键词,就将括号内容替换为季度 +#如果存在‘±’,就将括号内容替换为同期增减 +#其他情况,就删掉括号内全部内容 +def get_clean_text(text): + text = text.replace('流动资产:','').replace('半年度','上半年') + #先对几个半年报的词做整理,防止向量识别不出来 + terms = ["货币资金", "应收账款",'应付账款'] + #这个是不要合计的 + terms_2 = ["固定资产","短期借款","合同负债","在建工程","商誉","存货"] + #这个是需要调换位置的指标 + #terms_3 = ["固定资产","短期借款","合同负债","在建工程","商誉"] + #不可以出现同比之类的 + terms_4 = ['比', '率', '占','至','年以内','年以上','年内','1-2年','2-3年','3-4年','4-5年','准备','在途','增值','评估','利息','应计','改良','跌价','补助','投资'] + dates = [ "2021年12月31日","2022年12月31日","2022年1月1日","2023年1月1日", "2023年12月31日", "2022年6月30日","2023年6月30日","2024年6月30日","2024年半年度","2023年半年度","2022年半年度"] + #dates = [ "2021年12月31日","2022年12月31日","2023年12月31日","2022年1月1日","2023年1月1日", "2024年1月1日", "2022年6月30日","2023年6月30日","2024年6月30日","2021年初","2022年初","2023年初","2024年初",'2021年末','2022年末','2023年末','2024年末',"2023年","2022年","2021年"] + if any(term in text for term in terms_4): + return text + if len(text) <= 20: + for term in terms: + for date in dates: + if term in text and date in text: + text = f"{date}{term}合计" + return text + if len(text) <= 20: + for term in terms_2: + for date in dates: + if term in text and date in text: + text = f"{date}{term}" + return text + + import re + replacement_dict = { + '加:': '', + '减:': '', + '%' : '', + '其中:': '', + '实际': '', + '/': '', + '重述后':'', + '年末金额':'年末', + '比重增减':'同比增减', + '比例':'同比', + } + #针对整个text做替换 + def replace_all(text, replacements): + pattern = re.compile("|".join(map(re.escape, replacements.keys()))) + return pattern.sub(lambda match: replacements[match.group(0)], text) + text = replace_all(text, replacement_dict) + #单独出现12月31日时,就剔除掉 + pattern_year = r'(? 0: + return 'c' + elif len(re.findall(l_period, text)) > 0: + return 'l' + elif len(re.findall(bl_period, text)) > 0: + return 'bl' + else: + return 'c' + +def get_period_type_other(text, year): + l_year = f'{int(year)-1}' + bl_year = f'{int(year)-2}' + c_period = f'当期|本期|本报告期|报告期|本年|本期|{year}' + l_period = f'上年|上期|上年度|{l_year}' + bl_period = f'前年|{bl_year}' + + if len(re.findall(c_period, text)) > 0: + return 'c' + elif len(re.findall(l_period, text)) > 0: + return 'l' + elif len(re.findall(bl_period, text)) > 0: + return 'bl' + else: + return 'c_n' + +def get_start_period_type(text): + s_period = '期初|1月1日|年初' + + if len(re.findall(s_period, text)) > 0: + return '' + else: + return '0' + +def get_season_flag(text): + season_period = '第1季度|第2季度|第3季度|第4季度|一季度|二季度|三季度|四季度|1-3月|4-6月|7-9月|10-12月' + if len(re.findall(season_period, text)) > 0: + return '1' + else: + return '0' + +def get_percent_flag(text): + percent_word = '收益率|占比|比重|比例|同比增减|同比上升|同比下降|变化幅度|同期增减|本年比上年增减|同比变动|本期期末金额较上期期末变动比例' + if len(re.findall(percent_word, text)) > 0: + return '1' + else: + return '0' + +def get_kf_flag(text): + kf_word = '扣非|扣除非经常性损益' + if len(re.findall(kf_word, text)) > 0: + return '1' + else: + return '0' + +def get_report_start(text): + kf_word = '报告期初|1月1日' + if len(re.findall(kf_word, text)) > 0: + return '1' + else: + return '0' + +def get_percent_growth(text): + percent_growth_word = '变动|本年比上年|比例同比增减|比例同比上升|比例同比下降|比例变化幅度|比例变动比例|比例本期比上年同期增减|比例本年比上年增减|比例同比变动|比例本期期末金额较上期期末变动比例|比率同比增减|比率同比上升|比率同比下降|比率变化幅度|比率变动比例|比率本期比上年同期增减|比率本年比上年增减|比率同比变动|比率本期期末金额较上期期末变动比例|占比同比增减|占比同比上升|占比同比下降|占比变化幅度|占比变动比例|占比本期比上年同期增减|占比本年比上年增减|占比同比变动|占比本期期末金额较上期期末变动比例|费用同比增减|费用同比上升|费用同比下降|费用变化幅度|费用变动比例|费用本期比上年同期增减|费用本年比上年增减|费用同比变动|费用本期期末金额较上期期末变动比例' + if len(re.findall(percent_growth_word, text)) > 0: + return '1' + else: + return '0' +def check_black_list(meta_measure, pdf_measure, black_array): + # 获取黑名单数据 + #black_array = fetch_black_list_data(cursor) + + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure==black_meta: + for pdf in black_pdfs: + if pdf_measure.find(pdf) >= 0: + return True + return False + +def check_black_list_old(meta_measure,pdf_measure): + # 判断指标名是否包含黑名单词 + black_array = ['非经常性损益:非经常性损益合计,非经常性损益总额','营业收入:营业外收入,主营业务,营业总收入,扣除,年底公司','归母净利润:净资产,净利率,扣除,年度公司','扣非净利润:净资产,净利率,年度公司','经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计','筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计','投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计','非经常性损益:扣除非经常性损益','基本每股收益:稀释每股收益','稀释每股收益:基本每股收益','总资产:净资产','应收账款:应付账款','短期借款:长期借款','应付账款:应收账款','长期借款:短期借款','研发投入:比例,比率,占比,费用','资本化研发投入:比例,比率,占比,费用','资本化研发投入占比:金额,费用','研发投入占营业收入比例:金额,费用'] + # current_period = f'当期:{report_year}年1-6月' + # black_array.append(current_period) + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure.find(black_meta) >= 0: + for pdf in black_pdfs: + if pdf_measure.find(pdf) >= 0: + return True + return False +def check_white_list(meta_measure,pdf_measure): + white_array = ['基本每股收益:每股收益','加权平均净资产收益率同比变动:比','季度变动比例:比'] + for black in white_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure.find(black_meta) >= 0: + for pdf in black_pdfs: + if pdf_measure.find(pdf) < 0: + return True + return False + +def check_title_black_list(meta_measure,text_info): + # 判断指标名是否包含黑名单词 + black_array = ['营业收入:前五名,前5名,合计','营业成本:合计','财务费用:现金流','销售费用:现金流','管理费用:现金流','研发费用:现金流','非经常性损益:合计'] + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure.find(black_meta) >= 0: + for pdf in black_pdfs: + if text_info.find(pdf) >= 0: + return True + return False + +# 文本中数字的占比 +def under_non_alpha_ratio(text: str, threshold: float = 0.6): + + if len(text) == 0: + return False + + alpha_count = len([char for char in text if char.strip() and char.isalpha()]) + total_count = len([char for char in text if char.strip()]) + try: + ratio = alpha_count / total_count + return ratio <= threshold + except: + return False +def check_table_title_black_list(text,table_title_black_list):#report_year + #previous_year = int(report_year) - 1 + if table_title_black_list is None: + return False + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +#通过关键词黑名单匹配表格上方的文本区域,提取需要过滤的表格 +def check_table_title_black_list_old(text,report_year):#report_year + previous_year = int(report_year) - 1 + table_title_black_list = f"""所有权或使用权受到限制的资产|持有待售资产|关联交易|未确认递延所得税资产明细|{previous_year}年度|{previous_year}年1-6月|自{previous_year}年1月1日至6月30日止期间|流动性风险|关联交易|账龄超过|流动风险|公司资产负债表|按账龄组合|线上直营|线上直销|公司现金流量表|公司利润表|应收账款|在建工程|固定资产|其他与筹资活动有关的现金|汇率风险|市场风险|主营业务收入|主营收入|其他收入|前五名|前5名|经营活动有关的现金|股份变动对最近一年和最近一期每股收益、每股净资产等财务指标的影响|合同产生的收入情况|子公司|参股公司|控股公司|分解信息|经营活动产生的现金|行业分类|产品分类|地区分类|业绩快报|销售渠道|调整情况说明|合同分类|计入当期损益的政府补助|股份变动对最近一年和最近一期|分部的财务信息|显示服务创收|线上销售情况|试运行销售|会计政策变更|品牌经营业务|工程施工业务|开发业务|制造业务|合营安排或联营企业中的权益|联营企业的主要财务信息|汇率及通货膨胀|与金融工具相关的风险|运营业务|B端业务|终止经营现金流量|终止经营|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|母公司|现金流量表补充|直营店店效情况|担保人2023年度未经审计的|外汇风险|公司各业务板块经营情况|报告期确认的包括在合同负债期初账面价值中的收入|资产受限情况|资产权利受限情况|内控自我评价报告|所有权或使用权受限资产|合并日被合并方资产、负债的账面价值|经营租赁资产|前5|前五|②|不属于现金及现金等价物的货币资金|按销售模式分|按产品类别分|按照销售区域|产品类别|销售模式|经销模式|关键管理人员|截至{previous_year}年6月30日止六个月期间|关联方提供的存款及贷款服务|报告期内各销售渠道的盈利情况|报告期内各地区的盈利情况|报告期内各产品的盈利情况|其他非流动负债|关联方提供的存款及贷款服务|自营销售分商品类别数据|组合计提|考核指标|不属于现金及现金等价物的货币资金|应收款项融资|本期计提、收回或转回的坏账准备情况|存货跌价准备|持有待售负债""" + + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +#通过关键词黑名单匹配页面下方的文本区域,提取需要过滤的表格 + +def check_table_title_black_list_button(text,table_title_black_list): + + if table_title_black_list is None: + return False + + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +def check_table_title_black_list_button_old(text): + + table_title_black_list = """公司资产负债表|公司现金流量表|公司利润表|主营业务收入|主营收入|其他收入|前五名|前5名|经营活动有关的现金|股份变动对最近一年和最近一期每股收益、每股净资产等财务指标的影响|合同产生的收入情况|子公司|参股公司|控股公司|分解信息|经营活动产生的现金|2022年度|行业分类|产品分类|地区分类|业绩快报|销售渠道|调整情况说明|合同分类|计入当期损益政府补助|股份变动对最近一年和最近一期|分部的财务信息|显示服务创收|线上销售情况|试运行销售|品牌经营业务|工程施工业务|开发业务|制造业务|合营安排或联营企业中的权益|联营企业的主要财务信息|汇率及通货膨胀|与金融工具相关的风险|运营业务|B端业务|终止经营现金流量|终止经营|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|不属于现金及现金等价物的货币资金|经营租赁资产|分地区|分产品|分行业|使用权受限资产|资产受限情况|经销模式|持续的第三层次公允价值计量项目,期初与期末账面价值间的调节信息及不可观察参数敏感|权利受限情况|应收款项融资|本期计提、收回或转回的坏账准备情况""" + + + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +def check_table_title_black_list_measure(text): + #black_array = ['补充资料:研发费用,管理费用,财务费用' + # ,'营业收入:营业外收入,主营业务,营业总收入,扣除,年底公司,合计,汇总' + #] + table_title_black_list = """补充资料|测试文本|其他非流动负债|应收款项融资|本期计提、收回或转回的坏账准备情况|筹资活动产生的各项负债变动情况|持有待售资产|账龄超过 1 年或逾期的重要应付账款|经营租赁资产|计息金融工具|坏账准备""" + if len(re.findall(table_title_black_list, text)) > 0: + return True + return False +#过滤原始指标中包含黑名单 +def check_pdf_measure_black_list(text): + pdf_measure_black_list = '股权变动前|股权变动后|含股份支付|境内|境外|调整前|有限公司|责任公司|其他|变更前|差异|同口径|调整金额' + if len(re.findall(pdf_measure_black_list, text)) > 0: + return True + if "其中:营业收入" in text: + return False + if "同比" in text and "额" in text: + #if text.find("同比") < text.find("额"): + if text.endswith("额"): + return True + return False + + +def check_pdf_measure(pdf_measure): + keywords_1 = [ + '2022年', '2023年', '2021年', '第一季度', '第二季度', '第三季度', '第四季度', '增减', '变动', '本期','同期', '当期', '报告期', '前年', + '上年', '上期', '本年', '1-3月', '4-6月', '7-9月', '10-12月' + ] + + keywords_2 = ['这里是一个测试文本'] + + contain_keyword_1 = any(keyword in pdf_measure for keyword in keywords_1) + contain_keyword_2 = any(keyword in pdf_measure for keyword in keywords_2) + #只有 未出现周期,同时出现了'调整后'才会删掉指标 + if not contain_keyword_1 and contain_keyword_2: + return True + return False +# def check_white_list(meta_measure,pdf_measure): +# # 判断指标名是否包含白名单词 +# black_array = ['营业收入:营业外收入,主营业务,营业总收入,扣除','归母净利润:净资产,净利率,扣除','扣非净利润:净资产,净利率','经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计','筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计','投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计','非经常性损益:扣除非经常性损益','基本每股收益:稀释每股收益','稀释每股收益:基本每股收益','总资产:净资产','应收账款:应付账款','短期借款:长期借款','应付账款:应收账款','长期借款:短期借款','研发投入:比例,比率,占比,费用','资本化研发投入:比例,比率,占比,费用','资本化研发投入占比:金额,费用','研发投入占营业收入比例:金额,费用'] +# for black in black_array: +# black_meta = black.split(':')[0] +# black_pdfs = black.split(':')[1].split(',') +# if meta_measure.find(black_meta) >= 0: +# for pdf in black_pdfs: +# if pdf_measure.find(pdf) >= 0: +# return True +# return False +def check_line_text(line_text): + if line_text == 'PAGE': + return False + if line_text == '(续)': + return False + if line_text.endswith('(续)'): + return False + if line_text.endswith("年度财务报表") and "有限公司" in line_text: + return False + if len(line_text) < 20 and line_text.endswith("有限公司"): + return False + substrings = [ + '对内加快发展方式绿色转型、对外形成绿色生产和生活方式', + '可持续发展、创新发展;“8”是八大绿色行动', + '色新赋能、催生绿色新科技、筑牢绿色新支撑', + '接上表','续上表', + ] + for substring in substrings: + if substring in line_text: + return False + return True + +def pdf_text_flag(text : str): + if under_non_alpha_ratio(text) and len(text) < 25: + return True + + if len(text) < 5: + return True + + if not re.findall(',|,|。|、|(|)|:|:|;|;',text): + return True + + if text.find('适用') != -1 and text.find('不适用') != -1: + return True + + if text.find('是') != -1 and text.find('否') != -1: + return True + + return False + +def get_change_rate_flag(text): + percent_word = '同比增减|同比上升|同比下降|变化幅度|变动比例|本期比上年同期增减|本年比上年增减|同比变动|本期期末金额较上期期末变动比例' + if len(re.findall(percent_word, text)) > 0: + return '1' + else: + return '0' + +def check_pdf_measure_black_list_v3(file_id,table_num,table_index,pdf_measure,conn_app,cursor_app): + content_value = f"{table_num}_{table_index}" + measure_index_array = [] + select_measure_index_query = ''' + SELECT DISTINCT text FROM measure_parser_info_linetext WHERE file_id = %s AND type = 'measure_index' and content = %s + ''' + cursor_app.execute(select_measure_index_query, (file_id,content_value,)) + measure_index_records = cursor_app.fetchall() + for measure_index_record in measure_index_records: + measure_index_array.append(measure_index_record[0]) + black_array = ['补充资料:研发费用,管理费用,财务费用,销售费用' + ,'测试标题:测试指标' + ,'其他非流动负债:合同负债' + ,'应收款项融资:应收账款' + ,'本期计提、收回或转回的坏账准备情况:应收账款' + ,'筹资活动产生的各项负债变动情况:短期借款,长期借款' + ,'持有待售资产:固定资产' + ,'账龄超过 1 年或逾期的重要应付账款:应付账款' + ,'经营租赁资产:固定资产' + ,'计息金融工具:货币资金,短期借款,交易性金融资产' + ,'坏账准备:应收账款' + ] + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + #if measure_index_array.find(black_meta) >= 0: + #if black_meta in measure_index_array: + if any(black_meta in measure_index for measure_index in measure_index_array): + if any(pdf in pdf_measure for pdf in black_pdfs): + #for pdf in black_pdfs: + #if pdf in pdf_measure: + #if pdf_measure.find(pdf) >= 0: + return True + return False +def check_black_table_list(data): + black_array = ['补充资料:研发费用,管理费用,财务费用,销售费用', + #'补充目录:母公司' + ] + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if any(black_meta in cell for row in data for cell in row): + logger.debug(data) + for pdf in black_pdfs: + data = [row for row in data if not any(pdf in cell for cell in row)] + return data + +if __name__ == '__main__': + + logger.debug(len('我是我')) + + # logger.debug(under_non_alpha_ratio('202水电费水电费水电费是的205月')) + # title = '母公司财务报表主要项目注释' + # if len(re.findall('母公司|现金流量表补充', title)) >0 and len(re.findall('项目注释', title)) == 0: + # logger.debug('1') + # else: + # logger.debug('0') + + # logger.debug(check_black_list('当期投资活动现金流净额','当前筹资活动现金流净额')) + # test = '2023年1-12月' + # logger.debug(get_period_type('上年度本期费用化研发投入')) + # logger.debug(get_period_type('费用化研发投入本年度')) + # vector_a = embed_with_str('第一季度营业收入') + # vector = vector_a.output["embeddings"][0]["embedding"] + + # vector_b = embed_with_str('营业收入第一季度') + # vector1 = vector_b.output["embeddings"][0]["embedding"] + + # similarity = cosine_similarity(vector, vector1) + # logger.debug(f"余弦相似度: {similarity}") + + # measure_data = [ + # '1,1,营业收入2023年金额,1003535799.51', + # '1,1,营业收入2022年金额,869401513.71', + # '1,1,营业收入变动比例,15.43%', + # '1,1,营业成本2023年金额,810779075.89', + # '1,1,营业成本2023年占营业收入的比重,80.79%', + # '1,1,营业成本2022年金额,702990363.57', + # '1,1,营业成本2022年占营业收入的比重,80.86%', + # '1,1,营业成本变动比例,15.33%', + # '1,1,毛利率2023年金额,19.21%', + # '1,1,毛利率2022年金额,19.14%', + # '1,1,销售费用2023年金额,34065464.60', + # '1,1,销售费用2023年占营业收入的比重,3.39%', + # '1,1,销售费用2022年金额,28038106.19', + # '1,1,销售费用2022年占营业收入的比重,3.22%', + # '1,1,销售费用变动比例,21.50%', + # '1,1,管理费用2023年金额,50807308.69', + # '1,1,管理费用2023年占营业收入的比重,5.06%', + # '1,1,管理费用2022年金额,38251704.48', + # '1,1,管理费用2022年占营业收入的比重,4.40%', + # '1,1,管理费用变动比例,32.82%', + # '1,1,研发费用2023年金额,35312198.23', + # '1,1,研发费用2023年占营业收入的比重,3.52%', + # '1,1,研发费用2022年金额,30081787.99', + # '1,1,研发费用2022年占营业收入的比重,3.46%', + # '1,1,研发费用变动比例,17.39%', + # '1,1,财务费用2023年金额,8015604.52', + # '1,1,财务费用2023年占营业收入的比重,0.80%', + # '1,1,财务费用2022年金额,5739677.85', + # '1,1,财务费用2022年占营业收入的比重,0.66%', + # '1,1,财务费用变动比例,39.65%', + # '1,1,信用减值损失2023年金额,-11873626.82', + # '1,1,信用减值损失2023年占营业收入的比重,-1.18%', + # '1,1,信用减值损失2022年金额,-8903293.61', + # '1,1,信用减值损失2022年占营业收入的比重,-1.02%', + # '1,1,信用减值损失变动比例,33.36%', + # '1,1,资产减值损失2023年金额,-2328729.46', + # '1,1,资产减值损失2023年占营业收入的比重,-0.23%', + # '1,1,资产减值损失2022年金额,-2285987.53', + # '1,1,资产减值损失2022年占营业收入的比重,-0.26%', + # '1,1,资产减值损失变动比例,1.87%', + # '1,1,其他收益2023年金额,17886048.88', + # '1,1,其他收益2023年占营业收入的比重,1.78%', + # '1,1,其他收益2022年金额,11025908.32', + # '1,1,其他收益2022年占营业收入的比重,1.27%', + # '1,1,其他收益变动比例,62.22%', + # '1,1,投资收益2023年金额,323361.47', + # '1,1,投资收益2023年占营业收入的比重,0.03%', + # '1,1,投资收益2022年金额,1119730.43', + # '1,1,投资收益2022年占营业收入的比重,0.13%', + # '1,1,投资收益变动比例,-71.12%', + # '1,1,公允价值变动收益2023年占营业收入的比重,0.00%', + # '1,1,公允价值变动收益2022年金额,10183.62', + # '1,1,公允价值变动收益2022年占营业收入的比重,0.00%', + # '1,1,公允价值变动收益变动比例,-100.00%', + # '1,1,资产处置收益2023年金额,12782544.48', + # '1,1,资产处置收益2023年占营业收入的比重,1.27%', + # '1,1,资产处置收益2022年金额,-59.56', + # '1,1,资产处置收益2022年占营业收入的比重,0.00%', + # '1,1,资产处置收益变动比例,21461726.06%', + # '1,1,汇兑收益2023年金额,0', + # '1,1,汇兑收益2023年占营业收入的比重,0%', + # '1,1,汇兑收益2022年金额,0', + # '1,1,汇兑收益2022年占营业收入的比重,0%', + # '1,1,汇兑收益变动比例,0%', + # '1,1,营业利润2023年金额,76175407.00', + # '1,1,营业利润2023年占营业收入的比重,7.59%', + # '1,1,营业利润2022年金额,63332601.81', + # '1,1,营业利润2022年占营业收入的比重,7.28%', + # '1,1,营业利润变动比例,20.28%', + # '1,1,营业外收入2023年金额,5788307.99', + # '1,1,营业外收入2023年占营业收入的比重,0.58%', + # '1,1,营业外收入2022年金额,1083997.19', + # '1,1,营业外收入2022年占营业收入的比重,0.12%', + # '1,1,营业外收入变动比例,433.98%', + # '1,1,营业外支出2023年金额,687271.68', + # '1,1,营业外支出2023年占营业收入的比重,0.07%', + # '1,1,营业外支出2022年金额,1554243.54', + # '1,1,营业外支出2022年占营业收入的比重,0.18%', + # '1,1,营业外支出变动比例,-55.78%', + # '1,1,净利润2023年金额,72975283.09', + # '1,1,净利润2023年占营业收入的比重,7.27%', + # '1,1,净利润2022年金额,57747603.98', + # '1,1,净利润2022年占营业收入的比重,6.64%', + # '1,1,净利润变动比例,26.37%', + # '1,1,税金及附加2023年金额,5170339.13', + # '1,1,税金及附加2023年占营业收入的比重,0.52%', + # '1,1,税金及附加2022年金额,1933753.49', + # '1,1,税金及附加2022年占营业收入的比重,0.22%', + # '1,1,税金及附加变动比例,167.37%', + # '1,1,所得税费用2023年金额,8301160.22', + # '1,1,所得税费用2023年占营业收入的比重,0.83%', + # '1,1,所得税费用2022年金额,5114751.48', + # '1,1,所得税费用2022年占营业收入的比重,0.59%', + # '1,1,所得税费用变动比例,62.30%', + # '1,1,少数股东损益2023年金额,-58350.22', + # '1,1,少数股东损益2023年占营业收入的比重,-0.01%', + # '1,1,少数股东损益2022年金额,-946.60', + # '1,1,少数股东损益2022年占营业收入的比重,0.00%', + # '1,1,少数股东损益变动比例,-6064.19%', + # '1,1,归属于母公司所有者的净利润2023年金额,73033633.31', + # '1,1,归属于母公司所有者的净利润2023年占营业收入的比重,7.28%', + # '1,1,归属于母公司所有者的净利润2022年金额,57748550.58', + # '1,1,归属于母公司所有者的净利润2022年占营业收入的比重,6.64%', + # '1,1,归属于母公司所有者的净利润变动比例,26.47%', + # '1,1,归属于少数股东的综合收益总额2023年金额,-58350.22', + # '1,1,归属于少数股东的综合收益总额2023年占营业收入的比重,-0.01%', + # '1,1,归属于少数股东的综合收益总额2022年金额,-946.60', + # '1,1,归属于少数股东的综合收益总额2022年占营业收入的比重,0.00%', + # '1,1,归属于少数股东的综合收益总额变动比例,-6064.19%', + # '1,1,归属于母公司所有者的综合收益总额2023年金额,73033633.31', + # '1,1,归属于母公司所有者的综合收益总额2023年占营业收入的比重,7.28%', + # '1,1,归属于母公司所有者的综合收益总额2022年金额,57748550.58', + # '1,1,归属于母公司所有者的综合收益总额2022年占营业收入的比重,6.64%', + # '1,1,归属于母公司所有者的综合收益总额变动比例,26.47%', + # '2,1,主营业务收入2023年,983698831.48', + # '2,1,主营业务收入2022年,854682261.31', + # '2,1,主营业务收入变动比例,15.10%', + # '2,1,其他业务收入2023年,19836968.03', + # '2,1,其他业务收入2022年,14719252.40', + # '2,1,其他业务收入变动比例,34.77%', + # '2,1,主营业务成本2023年,793604607.43', + # '2,1,主营业务成本2022年,690932741.27', + # '2,1,主营业务成本变动比例,14.86%', + # '2,1,其他业务成本2023年,17174468.46', + # '2,1,其他业务成本2022年,12057622.30', + # '2,1,其他业务成本变动比例,42.44%', + # '3,1,变压器营业收入,490028234.05', + # '3,1,变压器营业成本,402179824.08', + # '3,1,变压器毛利率,17.93%', + # '3,1,变压器营业收入比上年同期增减,16.22%', + # '3,1,变压器营业成本比上年同期增减,16.33%', + # '3,1,变压器毛利率比上年同期增减,减少0.07个百分点', + # '3,1,高低压成套开关设备营业收入,261342442.26', + # '3,1,高低压成套开关设备营业成本,206645237.99', + # '3,1,高低压成套开关设备毛利率,20.93%', + # '3,1,高低压成套开关设备营业收入比上年同期增减,-8.93%', + # '3,1,高低压成套开关设备营业成本比上年同期增减,-9.91%', + # '3,1,高低压成套开关设备毛利率比上年同期增减,增加0.86个百分点', + # '3,1,户外成套设备营业收入,198013248.27', + # '3,1,户外成套设备营业成本,157856817.84', + # '3,1,户外成套设备毛利率,20.28%', + # '3,1,户外成套设备营业收入比上年同期增减,62.25%', + # '3,1,户外成套设备营业成本比上年同期增减,65.30%', + # '3,1,户外成套设备毛利率比上年同期增减,减少1.47个百分点', + # '3,1,其他营业收入,54151874.93', + # '3,1,其他营业成本,44097195.98', + # '3,1,其他毛利率,18.57%', + # '3,1,其他营业收入比上年同期增减,39.68%', + # '3,1,其他营业成本比上年同期增减,36.10%', + # '3,1,其他毛利率比上年同期增减,增加2.14个百分点', + # '3,1,合计营业收入,1003535799.51', + # '3,1,合计营业成本,810779075.89', + # '3,2,东北地区营业收入,2425280.53', + # '3,2,东北地区营业成本,1427939.37', + # '3,2,东北地区毛利率,41.12%', + # '3,2,东北地区营业收入比上年同期增减,-69.51%', + # '3,2,东北地区营业成本比上年同期增减,-77.58%', + # '3,2,东北地区毛利率比上年同期增减,增加21.20个百分点', + # '3,2,华北地区营业收入,70542020.62', + # '3,2,华北地区营业成本,53044055.18', + # '3,2,华北地区毛利率,24.81%', + # '3,2,华北地区营业收入比上年同期增减,205.32%', + # '3,2,华北地区营业成本比上年同期增减,203.18%', + # '3,2,华北地区毛利率比上年同期增减,增加0.54个百分点', + # '3,2,华东地区营业收入,770352353.33', + # '3,2,华东地区营业成本,636803535.34', + # '3,2,华东地区毛利率,17.34%', + # '3,2,华东地区营业收入比上年同期增减,24.17%', + # '3,2,华东地区营业成本比上年同期增减,25.30%', + # '3,2,华东地区毛利率比上年同期增减,减少0.74个百分点', + # '3,2,华南地区营业收入,18509519.71', + # '3,2,华南地区营业成本,14496855.46', + # '3,2,华南地区毛利率,21.68%', + # '3,2,华南地区营业收入比上年同期增减,-57.08%', + # '3,2,华南地区营业成本比上年同期增减,-57.98%', + # '3,2,华南地区毛利率比上年同期增减,增加1.67个百分点', + # '3,2,华中地区营业收入,60588394.64', + # '3,2,华中地区营业成本,44559969.21', + # '3,2,华中地区毛利率,26.45%', + # '3,2,华中地区营业收入比上年同期增减,-51.24%', + # '3,2,华中地区营业成本比上年同期增减,-55.13%', + # '3,2,华中地区毛利率比上年同期增减,增加6.38个百分点', + # '3,2,西北地区营业收入,58618014.32', + # '3,2,西北地区营业成本,42844719.81', + # '3,2,西北地区毛利率,26.91%', + # '3,2,西北地区营业收入比上年同期增减,178.59%', + # '3,2,西北地区营业成本比上年同期增减,173.62%', + # '3,2,西北地区毛利率比上年同期增减,增加1.33个百分点', + # '3,2,西南地区营业收入,22500216.36', + # '3,2,西南地区营业成本,17602001.52', + # '3,2,西南地区毛利率,21.77%', + # '3,2,西南地区营业收入比上年同期增减,-23.74%', + # '3,2,西南地区营业成本比上年同期增减,-17.89%', + # '3,2,西南地区毛利率比上年同期增减,减少5.57个百分点', + # '3,2,合计营业收入,1003535799.51', + # '3,2,合计营业成本,810779075.89', + # '5,2,经营活动产生的现金流量净额2023年,-44713443.44', + # '5,2,经营活动产生的现金流量净额2022年,-53241071.45', + # '5,2,经营活动产生的现金流量净额变动比例,16.02%', + # '5,2,投资活动产生的现金流量净额2023年,-88649920.50', + # '5,2,投资活动产生的现金流量净额2022年,-94251741.15', + # '5,2,投资活动产生的现金流量净额变动比例,5.94%', + # '5,2,筹资活动产生的现金流量净额2023年,96607197.26', + # '5,2,筹资活动产生的现金流量净额2022年,210537586.22', + # '5,2,筹资活动产生的现金流量净额变动比例,-54.11%' + # ] + + # client = MilvusClient( + # uri="http://localhost:19530" + # ) + # vector_obj = embed_with_str('2023年营业收入') + # vector = vector_obj.output["embeddings"][0]["embedding"] + + # vector_b = embed_with_str('营业收入第一季度') + # vector1 = vector_b.output["embeddings"][0]["embedding"] + + # similarity = cosine_similarity(vector, vector1) + # logger.debug(f"余弦相似度: {similarity}") + + # insert_measure_data(client, measure_data) + # text = '营业收入第一季度(1-3月份)' + # new_text = re.sub(r'([^)]*)', '',text) + # logger.debug(new_text) diff --git a/zzb_data_prod/wget-log b/zzb_data_prod/wget-log new file mode 100644 index 0000000..ee281c6 --- /dev/null +++ b/zzb_data_prod/wget-log @@ -0,0 +1,3 @@ +--2024-12-27 11:22:17-- https://financial-report.obs.cn-east-3.myhuaweicloud.com/upload/file/44b374ac0fe140a2922c360db47335a1.PDF?AccessKeyId=WMBIZTLULUR24OBUIRC4 +Resolving financial-report.obs.cn-east-3.myhuaweicloud.com (financial-report.obs.cn-east-3.myhuaweicloud.com)... failed: Name or service not known. +wget: unable to resolve host address ‘financial-report.obs.cn-east-3.myhuaweicloud.com’ diff --git a/zzb_data_word/Mil_unit.py b/zzb_data_word/Mil_unit.py new file mode 100644 index 0000000..130243a --- /dev/null +++ b/zzb_data_word/Mil_unit.py @@ -0,0 +1,30 @@ +from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection,MilvusClient +from config import MILVUS_CLIENT +import time +from datetime import datetime, timedelta + +def create_partition_by_hour(current_hour): + # 连接到 Milvus 服务器 + connections.connect("default",uri=MILVUS_CLIENT) + # 获取集合 + collection_name = "pdf_measure_v4" + collection = Collection(collection_name) + + # 创建当前小时的分区 + partition_name = f"partition_{current_hour}" + if not collection.has_partition(partition_name): + collection.create_partition(partition_name) + print(f"Created partition: {partition_name}") + partition = collection.partition(partition_name) + partition.load() + + # 获取所有分区 + partitions = collection.partitions + # 删除所有分区(除了默认分区和当前分区) + for partition in partitions: + name = partition.name + if name not in ["_default", partition_name]: # 保留默认分区 + pre_partition = collection.partition(name) + pre_partition.release() + collection.drop_partition(name) + print(f"Partition '{name}' deleted.") \ No newline at end of file diff --git a/zzb_data_word/__pycache__/config.cpython-310.pyc b/zzb_data_word/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49f15b4743cf67c504794d937fe72f01acf8315d GIT binary patch literal 812 zcmaJf#j5M2TRV?ILCB@ zF=kY9cIcgca$UQ^aYF7Q%hN4Xgz|Zw_u_vG=Cw?SmlSA^a&p-me_{Si5&~(%oawWn zsZTW9u@H`@({61xe3***vmxK~RP9P`NUbg; z*0A1Ix1iHjy1+L3>PJ}%8tZ(w-cuz7(ko7Mx>t=j2quut8^zO?`! zJ+&9qk{gRYTE^&DwDD;1l{is)i$VDP>Ys^t-atd$)wN(WLu+Q3_gQH$5iw2f>HelmGw# literal 0 HcmV?d00001 diff --git a/zzb_data_word/__pycache__/db_service_word.cpython-310.pyc b/zzb_data_word/__pycache__/db_service_word.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95849e48e92944f2ecaab411b52c985ee6bed119 GIT binary patch literal 27993 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 WB-|Em3C|6;hdc1E5q@X1>;D6OOoyfb literal 0 HcmV?d00001 diff --git a/zzb_data_word/__pycache__/main_word.cpython-310.pyc b/zzb_data_word/__pycache__/main_word.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40217a660d0707f555466021227da6dd7c4d884d GIT binary patch literal 21084 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 a+EBPYyeQHb{tj{@zVC*wMCz*On*R$kl$2!v literal 0 HcmV?d00001 diff --git a/zzb_data_word/__pycache__/parse_word.cpython-310.pyc b/zzb_data_word/__pycache__/parse_word.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a58b0dc65b49e8f2029d60bdf86aefeb85908b83 GIT binary patch literal 7782 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�tHW2AySnMKuq%@|Q=($w3#&)GS(Mx3N7q+ve5 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 L2vp!zov;2c(>AUh literal 0 HcmV?d00001 diff --git a/zzb_data_word/__pycache__/word_title.cpython-310.pyc b/zzb_data_word/__pycache__/word_title.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8f248fb162aa2496583c326f92e531c32d228da GIT binary patch literal 1054 zcmah}%}*0S6rb7dmimFBAqXeWO^n<;7-CHHX2Qi=6Voj0(o{=Zw@VZGH>6T_nY7R-kaTxw6|YJFkWm$0|JlG zFFUw8I0&A?jCF#Mkc30Xha^sNrI8Oy_$Bi47GzNWppCp79&p?+pTUfcfeE5G7eIs~ zxDTm_;1V#Yn4lDRtF9ErNadV3g`cBW_v0>th^q(1dBRH^JOvf2u615=5uw7Ru*ARN zl}C^hAm_Gud(gT-+!bJYd(VmEZKMtKx%wPK;d5n*6{H zlh$P3tW?d)Ce37sH92Q)CH0e{xmRI}XU6UlaRU9M21_)*%t{BurpP4q<}pp27{xT3 z{%V!K6I#fcg-yCQ#d7m3yJRL8A=FQjdcCOEcWvBi$|y|}y`F=U&9ymt3}+r2r8>?0 zfVA}`XRYiIqnfiSKLOPQB`mjXj>ECzw!IMETwrTyI=ci2{d9q)GIZjwB`IGAl-@jL zi6;A4qxoq&td|XELw=b~S7FhiF%Q#vW1G&;ng^e0qTygb1XKvH3sN?fVC5;04dv*k zXU1X`e4776vo&j_K(j}%!672FT&2whRAf|V2rV_}Uhy)MIntXKV*ls^%}!XUs(w~s z$^HK|g|p zuqG&CI3R1BB5Q3!01!hV%`HZwa#-?ud^gmf8j}5@qKKn*9{ix>>yCZ(s0ms&Djzec&!O7*XOYj{_x1KcK6?nJ4m?=;?5uRDv^lV8IP( z@7UOY-+oX1?;?uSYa4%y?_qRQ>k7!Kjr&W5%l^W;!SL9FyKo0s5AK9{3v&q%$7AIV lB)yzsf08Y~b@&z20SV31Hyn{hLh=*4Z87)}AP>HYe*;(r;;#Sz literal 0 HcmV?d00001 diff --git a/zzb_data_word/__pycache__/zzb_logger.cpython-310.pyc b/zzb_data_word/__pycache__/zzb_logger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5eb8089f76858486edbf287b6c7aa5f9a59b90ba GIT binary patch literal 829 zcmYjO&2G~`5Z;X)$8qyh0wD!1y%;4DNkqi~A%u{Mq9TGw3aF$wvlox8(A=PfSz6AdSv zM#S6h)T4!8+UGPii;o9VT=4Q>A+R_*XARy)AVM{rQo zYTu&9>M^v7m_{v)I6WslXM^35vt=a`L7%hhWktexfR3W?HWaCifu?6Db1{WP*?{eQg>AN5L?zt|peBpMP9Oq#SJ$d7H6NaGw{7Ak! zbh{B;L9~s$l<3DGB@6Ii?};*XiqevTFbUND4h*I&;Spp~m4x&(?ej2GRsi{U!IdE) z^=utYSw2-}VauV^XY80=0s^UZ%W!-wl1Uh-DyE*|Er2I{U#szbWwA8HD$15fYL&`- ze>VE4>gRa|EI!$aP|dMOq=>-ZsZ#c>yo1lEpMMfL%TfO*j9{1KHFakb4E#&7=6H@Fu$J-Ga>R}$|u-)CLtRxmlr-~IrA4H z 30 : + continue + ori_measure_value = measure_obj.split(':')[1].replace('+', '').replace(',', '').replace('元', '').replace('%', '') + if '-' in ori_measure_value: + ori_measure_value = "-" + if '.' in ori_measure_name: + ori_measure_name = ori_measure_name.split('.')[1] + ori_measure_id = utils.get_md5(ori_measure_name) + if re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', ori_measure_value): + # 判断数据库中是否有数据 + check_query_data = (file_id, 'text', int(page_num), ori_measure_value) + cursor.execute(check_query, check_query_data) + check_records = cursor.fetchall() + if(len(check_records)) > 0: + continue + data_to_insert = (file_id, file_name, type, int(page_num), int(table_index), ori_measure_id, ori_measure_name, ori_measure_value, create_time, create_time) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def insert_measure_parser_info(parser_info,conn,cursor): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO measure_parser_info + (file_id, type, content, create_time) + VALUES (%s, %s, %s, %s) + ''' + file_id = parser_info['file_id'] + type = parser_info['type'] + content = parser_info['content'] + data_to_insert = (file_id, type, content, create_time) + cursor.execute(insert_query, data_to_insert) + conn.commit() +def insert_measure_parser_info_measure(parser_info, conn, cursor, line_text): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + insert_query = ''' + INSERT INTO word_measure_parser_info_linetext + (file_id, type, content,text, create_time) + VALUES (%s, %s, %s, %s,%s) + ''' + file_id = parser_info['file_id'] + type = parser_info['type'] + content = parser_info['content'] + text = line_text + data_to_insert = (file_id, type, content,text, create_time) + cursor.execute(insert_query, data_to_insert) + conn.commit() +def insert_table_unit_info(table_info,conn,cursor): + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO table_unit_info + (file_id, page_num, table_index, unit) + VALUES (%s, %s, %s, %s) + ''' + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + table_index = int(table_info['table_index']) + unit = table_info['unit'] + data_to_insert = (file_id, page_num, table_index, unit) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def insert_table_unit_info_v1(table_info, conn, cursor): + """ + 插入数据到 table_unit_info 表之前,检查是否存在相同的 file_id, page_num 和 table_index。 + 如果存在且 unit 不同,更新现有记录,否则插入新记录。 + """ + + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + table_index = int(table_info['table_index']) + unit = table_info['unit'] + + # 查询现有记录 + check_query = ''' + SELECT unit + FROM table_unit_info + WHERE file_id = %s AND page_num = %s AND table_index = %s + ''' + cursor.execute(check_query, (file_id, page_num, table_index)) + existing_record = cursor.fetchone() + + if existing_record: + existing_unit = existing_record[0] + + if unit != existing_unit: + # 更新现有记录 + update_query = ''' + UPDATE table_unit_info + SET unit = %s + WHERE file_id = %s AND page_num = %s AND table_index = %s + ''' + cursor.execute(update_query, (unit, file_id, page_num, table_index)) + + else: + applog.info(f'No change needed. Existing unit={existing_unit} is the same as new unit={unit}.') + else: + # 插入新的记录 + insert_query = ''' + INSERT INTO table_unit_info + (file_id, page_num, table_index, unit) + VALUES (%s, %s, %s, %s) + ''' + data_to_insert = (file_id, page_num, table_index, unit) + cursor.execute(insert_query, data_to_insert) + + conn.commit() + +def insert_table_text_info(table_info,conn,cursor): + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO table_text_info + (file_id, page_num, table_index, text) + VALUES (%s, %s, %s, %s) + ''' + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + table_index = int(table_info['table_index']) + text = table_info['text_info'] + data_to_insert = (file_id, page_num, table_index, text) + cursor.execute(insert_query, data_to_insert) + conn.commit() + +def update_ori_measure(conn,cursor,file_id): + + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + # 执行SQL语句,更新数据 + update_query = ''' + UPDATE ori_measure_list + SET measure_id = %s, measure_name = %s + WHERE ori_measure_id = %s and file_id = %s + ''' + + select_query = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + select_query_half_year = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config_half_year t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + select_query_thrid = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config_third_quarter t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + + select_query_first_quarter = ''' + SELECT t2.measure_id,t2.measure_name,t1.ori_measure_id + FROM ori_measure_list t1 + left join + measure_config_first_quarter t2 + on t1.ori_measure_id = t2.ori_measure_id + where t2.measure_id is not null and (t1.measure_id is null or t1.measure_id ='') + and t1.file_id = '{file_id}' + and t2.year = '{year}' + '''.format(file_id=file_id, year=report_year) + + if report_type == 1: + start_time = time.time() + cursor.execute(select_query_half_year) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + applog.info(f'update_ori_measure方法走的是半年报') + elif report_type == 2: + start_time = time.time() + cursor.execute(select_query_first_quarter) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + applog.info(f'update_ori_measure方法走的是一季报') + elif report_type == 3: + start_time = time.time() + cursor.execute(select_query_thrid) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + applog.info(f'update_ori_measure方法走的是三季报') + else: + start_time = time.time() + cursor.execute(select_query) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"更新数据查询 {(end_time - start_time):.2f} 秒。") + applog.info(f'update_ori_measure方法走的是全年报') + start_time = time.time() + for record in records: + data_to_update = (record[0], record[1], record[2], file_id) + cursor.execute(update_query, data_to_update) + conn.commit() + end_time = time.time() + applog.info(f"更新数据更新 {(end_time - start_time):.2f} 秒。") + #更新measure_list表,增加此次文件的显示指标 + start_time = time.time() + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + if report_type == 0: + table_name = "measure_config" + elif report_type == 2: + table_name = "measure_config_first_quarter" + + elif report_type == 3: + table_name = "measure_config_third_quarter" + else: + table_name = "measure_config_half_year" + + insert_query = f''' + INSERT INTO measure_list + (measure_id, measure_name, create_time, update_time, file_id) + select distinct measure_id,measure_name, %s,%s,%s from {table_name} + where year = {report_year} + ''' + + data_to_update = (create_time, create_time, file_id) + cursor.execute(insert_query, data_to_update) + conn.commit() + end_time = time.time() + applog.info(f"更新数据写入 {(end_time - start_time):.2f} 秒。") + +def insert_table_from_vector_mul_process(parent_table_pages,file_id,file_name,records,record_range,black_array): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + applog.info('Run task %s (%s)...' % (record_range, os.getpid())) + applog.info(f"插入数据 {len(records)}") + client = MilvusClient( + uri=MILVUS_CLIENT + ) + + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + cursor_app = conn_app.cursor(buffered=True) + + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + check_query = ''' + select id from ori_measure_list + WHERE file_id = %s and measure_name = %s and page_number = %s and table_index = %s and ori_measure_value = %s + ''' + insert_query = ''' + INSERT INTO ori_measure_list + (file_id, file_name, type, page_number, table_index, ori_measure_id, ori_measure_name, ori_measure_value, create_time, update_time, distance, pdf_measure,measure_id,measure_name,unit) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + ''' + #获取表格上方文字包含母公司字样的文本index + select_parent_query = ''' + select distinct content from measure_parser_info WHERE file_id = '{file_id}' and type='parent_com' + '''.format(file_id=file_id) + + #获取表格上方文字黑名单关键词的页码和表格下标 + select_table_index_query = ''' + select distinct content from measure_parser_info WHERE file_id = '{file_id}' and type='table_index' + '''.format(file_id=file_id) + # #获取表格上方文字黑名单关键词的页码和表格下标----标题下的详细指标 + select_measure_index_query = ''' + SELECT content FROM measure_parser_info_linetext WHERE file_id = %s AND type = 'measure_index' + ''' + unit_query = ''' + select unit from table_unit_info + WHERE file_id = %s and page_num = %s and table_index = %s + ''' + + cursor_app.execute(select_parent_query) + parent_records = cursor_app.fetchall() + + for parent_record in parent_records: + parent_id = parent_record[0] + parent_table_pages.append(int(parent_id)) + + #表格上方文字黑名单关键词的页码和表格下标转成数组 + table_index_array = [] + cursor_app.execute(select_table_index_query) + table_index_records = cursor_app.fetchall() + for table_index_record in table_index_records: + table_index_array.append(table_index_record[0]) + # #仿照写法,指标的黑名单转化 + measure_index_array = [] + cursor_app.execute(select_measure_index_query, (file_id,)) + measure_index_records = cursor_app.fetchall() + for measure_index_record in measure_index_records: + measure_index_array.append(measure_index_record[0]) + + + if str(report_type) == "2": + parent_table_pages = [] + table_index_array = [] + measure_index_array = [] + applog.info(f'黑名单的值是{parent_table_pages}和{table_index_array}以及新增的{measure_index_array}') + applog.info(f"black_array:{black_array}") + + record_start = record_range.split('-')[0] + record_end = record_range.split('-')[1] + try: + for index in range(int(record_start),int(record_end)): + record = records[index] + ori_measure_name = record[0] + measure_name = record[1] + distance = record[2] + ori_measure_id = record[3] + measure_id = record[4] + measure_vector = redis_service.read_from_redis(redis_client,ori_measure_id) + measure_list = ast.literal_eval(measure_vector) + data = [measure_list] + # data.append(measure_list) + filter_str = 'file_id == "'+file_id+'"' + res = client.search( + collection_name="pdf_measure_v4", # Replace with the actual name of your collection + # Replace with your query vector + data=data, + limit=3, # Max. number of search results to return + search_params={"metric_type": "COSINE", "params": {}}, # Search parameters + output_fields=["measure_name","measure_value","table_num","table_index","measure_unit"], + filter=filter_str + ) + + + + # Convert the output to a formatted JSON string + # for i in range(len(res[0])): + for i in range(len(res[0])): + + vector_distance = float(res[0][i]["distance"]) + pdf_measure = res[0][i]["entity"]["measure_name"] + measure_value = res[0][i]["entity"]["measure_value"] + table_num = res[0][i]["entity"]["table_num"] + table_index = res[0][i]["entity"]["table_index"] + unit = res[0][i]["entity"]["measure_unit"] + + #先过滤页码为0的情况,暂时不知道原因 + if table_num == 0: + continue + + #过滤表格上方文字黑名单关键词的页码和表格下标 + if f"{table_num}" in table_index_array: + continue + + + #过滤指标中包含黑名单关键词 + if utils.check_pdf_measure_black_list(pdf_measure): + continue + + if f"{table_num}" in measure_index_array and utils.check_pdf_measure_black_list_v3(file_id,table_num,table_index,pdf_measure,conn_app,cursor_app): + #if utils.check_pdf_measure_black_list_v3(file_id,table_num,table_index,pdf_measure,conn_app,cursor_app): + applog.info(f'经过第三层规则去除了{table_num}页的{pdf_measure}指标') + continue + + + if vector_distance > distance and table_num not in parent_table_pages: + #检测规则开始 + #判断抽取指标和财报指标周期是否相同 + ori_period = utils.get_period_type(ori_measure_name, report_year) + pdf_period = utils.get_period_type(pdf_measure, report_year) + if pdf_measure == '2023年6月30日货币资金合计': + applog.info(f'第1处{ori_period}和{pdf_period}') + if(ori_period != pdf_period): + continue + + + #判断抽取指标和财报指标是否期初指标 + start_ori_period = utils.get_start_period_type(ori_measure_name) + start_pdf_period = utils.get_start_period_type(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + applog.info(f'第2处{start_ori_period}和{start_pdf_period}') + if(start_ori_period != start_pdf_period): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是季度 + ori_season_type = utils.get_season_flag(ori_measure_name) + pdf_season_type = utils.get_season_flag(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + applog.info(f'第3处{ori_season_type}和{pdf_season_type}') + if(ori_season_type != pdf_season_type): + continue + + + #判断是否都是扣非指标 + ori_kf_type = utils.get_kf_flag(ori_measure_name) + pdf_kf_type = utils.get_kf_flag(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + applog.info(f'第4处{ori_kf_type}和{pdf_kf_type}') + if(ori_kf_type != pdf_kf_type): + applog.info(f'扣非指标{table_num}页的{pdf_measure}指标') + continue + + #判断抽取指标和财报指标类型是否相同,是否都是百分比 + ori_type = utils.get_percent_flag(ori_measure_name) + pdf_type = utils.get_percent_flag(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + applog.info(f'第5处{ori_type}和{pdf_type}') + if(ori_type != pdf_type): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是占比同比变动类 + ori_growth_type = utils.get_percent_growth(ori_measure_name) + pdf_growth_type = utils.get_percent_growth(pdf_measure) + if pdf_measure == '2023年6月30日货币资金合计': + applog.info(f'第6处{ori_growth_type}和{pdf_growth_type}') + if(ori_growth_type != pdf_growth_type): + continue + + #解决指标语义是比率,但值为非比率的情况 + if ori_growth_type == '1': + check_measure_value = abs(float(measure_value)) + if(check_measure_value > 10000): + continue + + # 判断数据库中是否有数据 + check_query_data = (file_id, measure_name, int(table_num), int(table_index), measure_value) + cursor.execute(check_query, check_query_data) + check_records = cursor.fetchall() + if(len(check_records)) > 0: + continue + + #判断是否包含黑名单 + if(utils.check_black_list(measure_name,pdf_measure,black_array)): + continue + + if(utils.check_white_list(measure_name,pdf_measure)): + applog.info(f"measure_name{measure_name},pdf_measure{pdf_measure}") + continue + + #判断抽取指标和财报指标类型是否都是增长类,比如同比变动为增长类 + ori_change_type = utils.get_change_rate_flag(ori_measure_name) + pdf_change_type = utils.get_change_rate_flag(pdf_measure) + if(ori_change_type != pdf_change_type): + continue + + #处理调整前,调整前、后同时出现,如果有调整前过滤 + if pdf_measure.find('调整前') != -1 or pdf_measure.find('重述前') != -1: + continue + + #判断指标是否报告期初 + ori_report_start = utils.get_report_start(ori_measure_name) + pdf_report_start = utils.get_report_start(pdf_measure) + + if(ori_report_start != pdf_report_start): + continue + + #检测规则结束 + #获取指标单位数据,除了百分比 + if(utils.get_percent_flag(measure_name) == '0'): + unit_query_data = (file_id, int(table_num), int(table_index)) + cursor.execute(unit_query, unit_query_data) + unit_records = cursor.fetchall() + if unit != '' : + pass + elif unit == '' and (len(unit_records)) > 0: + unit = unit_records[0][0] + else: + unit = '元' + + data_to_insert = (file_id, file_name, "table", int(table_num), int(table_index), ori_measure_id, ori_measure_name, measure_value, create_time, create_time, vector_distance, pdf_measure,measure_id,measure_name,unit) + cursor.execute(insert_query, data_to_insert) + conn.commit() + except Exception as e: + applog.error(e) + finally: + redis_client.close() + cursor.close() + conn.close() + client.close() + +# +def insert_table_measure_from_vector_async_process(cursor,parent_table_pages,file_id,file_name): + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + select_query = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config + where year = '{year}' + '''.format(year=report_year) + select_query_half_year = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config_half_year + where year = '{year}' + '''.format(year=report_year) + select_query_thrid = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config_third_quarter + where year = '{year}' + '''.format(year=report_year) + select_query_first_quarter = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config_first_quarter + where year = '{year}' + '''.format(year=report_year) + # select_black_array_query = 'SELECT measure_name, keywords FROM measure_black_list where isdel = 0' + select_black_array_query = ''' + SELECT measure_name, keywords FROM measure_black_list where isdel = 0 and find_in_set('{year}',year) and find_in_set('{flag}',flag) + '''.format(year=report_year, flag=report_type) + + + black_array = [] + cursor.execute(select_black_array_query) + results = cursor.fetchall() + for row in results: + category = row[0] + keywords = row[1].split(',') + black_array.append(f"{category}:{','.join(keywords)}") + + if report_type == 1: + start_time = time.time() + cursor.execute(select_query_half_year) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + applog.info('insert_table_measure_from_vector_async_process方法走的半年报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,)) + processes.append(p) + p.start() + elif report_type == 2: + start_time = time.time() + cursor.execute(select_query_first_quarter) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + applog.info('insert_table_measure_from_vector_async_process方法走的一季报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,)) + processes.append(p) + p.start() + elif report_type == 3: + start_time = time.time() + cursor.execute(select_query_thrid) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + applog.info('insert_table_measure_from_vector_async_process方法走的三季报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,)) + processes.append(p) + p.start() + + else: + start_time = time.time() + cursor.execute(select_query) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + applog.info('insert_table_measure_from_vector_async_process方法走的全年报') + start_time = time.time() + records_range_parts = utils.get_range(len(records),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=insert_table_from_vector_mul_process, args=(parent_table_pages,file_id,file_name,records,record_range,black_array,)) + processes.append(p) + p.start() + + applog.info(f'等待所有子任务完成,任务ID:{file_id}') + for p in processes: + p.join() + applog.info(f'所有子任务完成,任务ID:{file_id}') + applog.info(f'启动指标归一化任务ID:{file_id}') + end_time = time.time() + applog.info(f"向量更新时间 {(end_time - start_time):.2f} 秒。") + +def insert_table_measure_from_vector(conn,cursor,client,parent_table_pages,file_id,file_name): + create_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + select_query = ''' + SELECT ori_measure_name,measure_name,distance,ori_measure_id,measure_id FROM measure_config + ''' + + check_query = ''' + select id from ori_measure_list + WHERE file_id = %s and measure_name = %s and page_number = %s and table_index = %s and ori_measure_value = %s + ''' + insert_query = ''' + INSERT INTO ori_measure_list + (file_id, file_name, type, page_number, table_index, ori_measure_id, ori_measure_name, ori_measure_value, create_time, update_time, distance, pdf_measure,measure_id,measure_name,unit) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s ,%s) + ''' + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + start_time = time.time() + cursor.execute(select_query) + records = cursor.fetchall() + end_time = time.time() + applog.info(f"向量配置数据查询 {(end_time - start_time):.2f} 秒。") + start_time = time.time() + + try: + for record in records: + ori_measure_name = record[0] + measure_name = record[1] + distance = record[2] + ori_measure_id = record[3] + measure_id = record[4] + measure_vector = redis_service.read_from_redis(ori_measure_id) + measure_list = ast.literal_eval(measure_vector) + data = [measure_list] + filter_str = 'file_id == "'+file_id+'"' + res = client.search( + collection_name="pdf_measure_v4", # Replace with the actual name of your collection + # Replace with your query vector + data=data, + limit=3, # Max. number of search results to return + search_params={"metric_type": "COSINE", "params": {}}, # Search parameters + output_fields=["measure_name","measure_value","table_num","table_index","measure_unit"], + filter=filter_str + ) + + # Convert the output to a formatted JSON string + for i in range(len(res[0])): + + vector_distance = float(res[0][i]["distance"]) + pdf_measure = res[0][i]["entity"]["measure_name"] + measure_value = res[0][i]["entity"]["measure_value"] + table_num = res[0][i]["entity"]["table_num"] + table_index = res[0][i]["entity"]["table_index"] + measure_unit = res[0][i]["entity"]["measure_unit"] + + if vector_distance > distance and table_num not in parent_table_pages: + #检测规则开始 + #判断抽取指标和财报指标周期是否相同 + ori_period = utils.get_period_type(ori_measure_name, report_year) + pdf_period = utils.get_period_type(pdf_measure, report_year) + if(ori_period != pdf_period): + continue + + #判断抽取指标和财报指标类型是否相同,是否都是百分比 + ori_type = utils.get_percent_flag(ori_measure_name) + pdf_type = utils.get_percent_flag(pdf_measure) + if(ori_type != pdf_type): + continue + + # 判断数据库中是否有数据 + check_query_data = (file_id, measure_name, int(table_num), int(table_index), measure_value) + cursor.execute(check_query, check_query_data) + check_records = cursor.fetchall() + if(len(check_records)) > 0: + continue + #检测规则结束 + + data_to_insert = (file_id, file_name, "table", int(table_num), int(table_index), ori_measure_id, ori_measure_name, measure_value, create_time, create_time, vector_distance, pdf_measure,measure_id,measure_name,measure_unit) + cursor.execute(insert_query, data_to_insert) + conn.commit() + except Exception as e: + applog.info(e) + end_time = time.time() + applog.info(f"向量更新数据时间 {(end_time - start_time):.2f} 秒。") + start_time = time.time() + + +def insert_measure_data_to_milvus(client,table_info,cursor,conn): + insert_query = ''' + INSERT INTO word_measure_parse_process + (file_id, page_num, content) + VALUES (%s, %s, %s) + ''' + for table in table_info: + try: + data=[] + table_num = table['page_num'].split("_")[0] + file_id = table['file_id'] + table_index = table['page_num'].split("_")[1] + + measure_list = table['measure_list'] + for measure in measure_list: + measure_name = measure['measure_name'] + # 需要跳过的一些指标 + black_list = ["营业总成本"] + if any(black in measure_name for black in black_list): + continue + measure_value = measure['measure_value'].replace("(", "").replace(")", "") + measure_name = utils.get_clean_text(measure_name) + measure_name = measure_name.replace('2023','2023年').replace('2022','2022年').replace('(','').replace(')','')#这个真绝了,怎么都删不掉 + #measure_name_1 = measure_name.replace('调整后','') + quarters = ['第一季度', '第二季度', '第三季度', '第四季度','增减','2023年','2022年','2021年','年'] + for quarter in quarters: + measure_name = measure_name.replace(quarter * 2, quarter) + pattern_dup = re.compile(r'(\w{3,})\1+')#去掉任意超过两个字且重复的字符 + matches = pattern_dup.findall(measure_name) + for match in matches: + applog.info(f"被删除的字符: {match * 2}") + measure_name = pattern_dup.sub(r'\1', measure_name) + measure_name_1 = measure_name.replace('调整后','').replace('上年期末数','上年期末').replace('上年期末','上年年末') + measure_unit = measure['measure_unit'] + if re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', measure_value) and any(key_word in measure_name for key_word in measure_name_keywords): + vector_obj = utils.embed_with_str(measure_name_1) + vector = vector_obj.output["embeddings"][0]["embedding"] + measure_data = {} + measure_data['vector'] = vector + measure_data['table_num'] = int(table_num) + measure_data['table_index'] = int(table_index) + measure_data['measure_name'] = measure_name + measure_data['measure_value'] = measure_value + measure_data['measure_unit'] = measure_unit + measure_data['file_id'] = file_id + data.append(measure_data) + + # 指标数据写入指标解析过程表,用于前端展示 + content = f"{measure_name}:{measure_value}" + data_to_insert = (file_id, table_num, content) + cursor.execute(insert_query, data_to_insert) + conn.commit() + elif re.match(r'(增加|减少|下降|上升)[了]?(\d+\.\d+)[个]?百分点', measure_value) and any(key_word in measure_name for key_word in measure_name_keywords): + #特殊处理指标值为增加了/减少了 XXX 个百分点 + unit_pattern = re.compile(r'(增加|减少|下降|上升)[了]?(\d+\.\d+)[个]?百分点') + match = unit_pattern.search(measure_value) + if match and len(match.groups()) == 2: + crease_type = match.group(1) + measure_value = match.group(2) + if crease_type == '减少' or crease_type == '下降': + measure_value = f'-{match.group(2)}' + + vector_obj = utils.embed_with_str(measure_name_1) + vector = vector_obj.output["embeddings"][0]["embedding"] + measure_data = {} + measure_data['vector'] = vector + measure_data['table_num'] = int(table_num) + measure_data['table_index'] = int(table_index) + measure_data['measure_name'] = measure_name + measure_data['measure_value'] = measure_value + measure_data['measure_unit'] = measure_unit + measure_data['file_id'] = file_id + data.append(measure_data) + + # 指标数据写入指标解析过程表,用于前端展示 + content = f"{measure_name}:{measure_value}" + data_to_insert = (file_id, table_num, content) + cursor.execute(insert_query, data_to_insert) + conn.commit() + res = client.insert( + collection_name="pdf_measure_v4", + data=data + ) + + + except Exception as e: + applog.error(f"异常信息=={e}") + +def runing_job(): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + select_query = ''' + SELECT * FROM report_check where status = 0 and isdel=0 + ''' + cursor.execute(select_query) + records = cursor.fetchall() + if(len(records)) > 1: + return True + return False + +def insert_word_parse_process(parser_info,conn,cursor,table_name): + # 执行SQL语句,插入数据 + insert_query = f''' + INSERT INTO {table_name} + (file_id, page_num, page_count, content, type) + VALUES (%s, %s, %s, %s, %s) + ''' + file_id = parser_info['file_id'] + page_num = int(parser_info['page_num']) + page_count = int(parser_info['page_count']) + content = json.dumps(parser_info['content'], ensure_ascii=False) + type = parser_info['type'] + data_to_insert = (file_id, page_num, page_count, content, type) + cursor.execute(insert_query, data_to_insert) + conn.commit() + + +def delete_database(file_id): + try: + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + + truncate_query = [ + "delete from measure_parse_process where file_id = %s;", + "delete from measure_parser_info where file_id = %s;", + "delete from ori_measure_list where file_id = %s;", + "delete from measure_list where file_id = %s;", + "delete from word_parse_process where file_id = %s;", + "delete from table_unit_info where file_id = %s;", + # "delete from a where file_id = %s;", + # "delete from b where file_id = %s;", + ] + #file_id = file_id + for truncate in truncate_query: + cursor.execute(truncate,(file_id,)) + conn.commit() + except Exception as e: + applog.error(f'删除失败,原因是{e}') +def delete_to_run(conn,cursor,file_id): + try: + truncate_query = [ + "delete from ori_measure_list where file_id = %s;", + "delete from measure_list where file_id = %s;", + "delete from check_measure_list where file_id = %s;", + "delete from check_measure_detail_list where file_id = %s;", + # "delete from table_unit_info where file_id = %s;", + # "delete from pdf_parse_process where file_id = %s;", + # "delete from table_unit_info where file_id = %s;", + # "delete from a where file_id = %s;", + # "delete from b where file_id = %s;", + ] + #file_id = file_id + for truncate in truncate_query: + cursor.execute(truncate,(file_id,)) + conn.commit() + except Exception as e: + applog.error(f'删除失败,原因是{e}') + +def insert_word_text_info(file_id,table_info): + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + + # 执行SQL语句,插入数据 + insert_query = ''' + INSERT INTO word_text_info + (file_id, page_num, text) + VALUES (%s, %s, %s) + ''' + + data_to_insert = [(file_id, int(line["index"]),int(line["data"])) for line in table_info] + cursor.executemany(insert_query,data_to_insert) + + conn.commit() + +def process_time(file_id,type,time,start_time,end_time): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + time = round(time, 2) + start_time = datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S') + end_time = datetime.fromtimestamp(end_time).strftime('%Y-%m-%d %H:%M:%S') + insert_query = ''' + insert into word_process_time + (file_id,type,time,start_time,end_time) + values (%s, %s, %s,%s,%s) + ''' + data_insert = (file_id,type,time,start_time,end_time) + cursor.execute(insert_query,data_insert) + conn.commit() + + +def batch_insert_page_text(table_info, conn, cursor, table_name): + file_id = table_info['file_id'] + page_num = int(table_info['page_num']) + text_lines = table_info['text'] + + insert_query = f''' + INSERT INTO {table_name} + (file_id, page_num, text) + VALUES (%s, %s, %s) + ''' + data_to_insert = [(file_id, page_num, text_lines) ] + cursor.executemany(insert_query, data_to_insert) + + conn.commit() +def file_type_check(file_id): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + try: + select_query = ''' + SELECT report_type FROM report_check WHERE id = %s + ''' + cursor.execute(select_query, (file_id,)) + record = cursor.fetchone() + if record and record[0] == 5: + return True + return False + finally: + cursor.close() + conn.close() +def file_type_check_v2(file_id): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + try: + select_query = ''' + SELECT report_type FROM report_check WHERE id = %s + ''' + cursor.execute(select_query, (file_id,)) + record = cursor.fetchone() + return record[0] + # if record and == 5: + # return True + # return False + finally: + cursor.close() + conn.close() + +def word_title_insert_mysql(file_id,title_array): + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + cursor = conn.cursor(buffered=True) + data_to_insert = [(file_id, line["data"], int(line["index"]),int(line["depth"])) for line in title_array] + + # 插入语句 + insert_query = """ + INSERT INTO word_title_info (file_id, title, page_num, depth) + VALUES (%s, %s, %s, %s) + """ + + cursor.executemany(insert_query, data_to_insert) + + conn.commit() + cursor.close() + conn.close() + + +def get_file_info_from_mysql(file_id): + conn = mysql.connector.connect( + host= MYSQL_HOST, + user= MYSQL_USER, + password= MYSQL_PASSWORD, + database= MYSQL_DB + ) + #cursor = conn.cursor(buffered=True) + cursor = conn.cursor(dictionary=True) + select_query = """ + SELECT title, page_num, depth + FROM pdf_title_info + WHERE file_id = %s + """ + + cursor.execute(select_query, (file_id,)) + result = cursor.fetchall() + cursor.close() + conn.close() + return result diff --git a/zzb_data_word/main_word.py b/zzb_data_word/main_word.py new file mode 100644 index 0000000..44a0f26 --- /dev/null +++ b/zzb_data_word/main_word.py @@ -0,0 +1,823 @@ +import re +import os,time +from config import MILVUS_CLIENT,MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB,MEASURE_COUNT,MYSQL_HOST_APP,MYSQL_USER_APP,MYSQL_PASSWORD_APP,MYSQL_DB_APP +import mysql.connector +import utils +from pymilvus import MilvusClient + +import numpy as np +from multiprocessing import Process +from config import REDIS_HOST,REDIS_PORT,REDIS_PASSWORD +import redis +import db_service_word +from zzb_logger import applog + + + +''' +已知发现问题: +1.表格和文本提取错误,表格和文本内容在同一页,文本在前表格在后的,文本数据提取不出来 +2.大模型抽取错,抽取2023年营业收入:主营业务收入、分产品的营业收入、变动比例被错误抽取 +3.表格中的指标被抽取成文本中 +4.大模型抽取指标时,语义完全不同的指标被放一起,考虑用向量相似度来判断 +''' + +# 数据处理流程 +# 1. get_table_range多进程获取所有表格及表格上下文,输出为一个完整的列表 +# 2. 单进程进行表格分页合并,输出一个新的表格对象数组 +# 3. 新表格对象数组多进程开始原来的解析指标流程 + + +STR_PATTERN = '营业收入|净利润|变动比例|损益|现金流量净额|现金净流量|现金流|每股收益|总资产|资产总额|收益率|货币资金|应收账款|存货|固定资产|在建工程|商誉|短期借款|应付账款|合同负债|长期借款|营业成本|销售费用|管理费用|财务费用|研发费用|研发投入' +PATTERN = '品牌类型|分门店|销售渠道|行业名称|产品名称|地区名称|子公司名称|业绩快报|调整情况说明|调整年初资产负债表|计入当期损益的政府补助|主要子公司|分部|母公司资产负债表|显示服务|渠道|商品类型|合同分类|会计政策变更|地区分类|研发项目|分类产品|表头不合规的表格|内部控制评价|关联方|国内地区|国外地区|销售区域|存货库龄|外币|逾期60天以上|欧元|英镑|美元|日元' +MUILT_PATTERN = '调整前' +#unit_pattern = re.compile(r'单位[:|:]?(百万元|千万元|亿元|万元|千元|元)') +unit_pattern = re.compile(r'(单位|单元|人民币).{0,6}?(百万元|千万元|亿元|万元|千元|元).{0,3}?')#修改单位匹配规则,不限制冒号,只限制距离 +#获取指标的表头信息 +def get_col_num_info(array,row_num,col_num,x,y): + num_info="" + for j in range(col_num): + if len(str(array[x][j])) > 50: + continue + num_info += str(array[x][j]) + + return num_info.replace('%','') + +#获取指标的表头信息 +def get_row_num_info(array,row_num,col_num,x,y): + num_info="" + + for i in range(row_num): + if len(str(array[i][y])) > 50: + continue + num_info += str(array[i][y]) + + return num_info + +def table_converter(table): + table_string = '' + # 遍历表格的每一行 + for row_num in range(len(table)): + row = table[row_num] + # 从warp的文字删除线路断路器 + cleaned_row = [item.replace('\n', ' ') if item is not None and '\n' in item else 'None' if item is None else item for item in row] + # 将表格转换为字符串,注意'|'、'\n' + table_string+=(','.join(cleaned_row)) + # 删除最后一个换行符 + table_string = table_string[:-1] + return table_string + +# 检查第二列是否为中文字符的函数 +def is_chinese(s): + return bool(re.search('[\u4e00-\u9fff]', s)) + +def check_table(arr): + split_index = None + for i in range(arr.shape[0]): + # 过滤掉第一行 + if arr[i, 0] == "" and is_chinese(arr[i, 1]) and i > 1: + split_index = i + break + if split_index is not None: + arr1 = arr[:split_index] + arr2 = arr[split_index:] + return [arr1, arr2] + else: + return [arr] + +def safe_process_array(func, arr): + try: + return func(arr) + except Exception as e: + print(f"这个函数出现了报错{func.__name__}: {e}") + return arr # 返回原数组以便继续后续处理 + + +# 单独针对三季报的资产负债表识别合并问题 +def process_array(arr, years=['2022', '2023', '2024'], keyword='项目'): + # 确保 row 有足够的列来存储分割后的数据 + def ensure_columns(row, num_columns): + while len(row) < num_columns: + row.append('') + + def is_valid_header(header, years, keyword): + header_text = header.lower() # 转小写以提高匹配的鲁棒性 + return any(year in header_text for year in years) and keyword in header_text + + # 对字符串进行清理 + def clean_text(text): + # 去除“年”和“月”相邻的空格 + text = re.sub(r'\s*(年|月)\s*', r'\1', text) + # 去除“日”左侧相邻的空格 + text = re.sub(r'\s*日', '日', text) + return text + + # 将 numpy 数组转换为列表 + arr = arr.tolist() if isinstance(arr, np.ndarray) else arr + + if len(arr[0]) == 1 and is_valid_header(arr[0][0], years, keyword): + remaining_value = arr[0][0] + + # 清理字符串 + remaining_value = clean_text(remaining_value) + + parts = remaining_value.split() + + ensure_columns(arr[0], len(parts)) + for i in range(len(parts)): + arr[0][i] = parts[i] + + header_columns = len(arr[0]) + + for i in range(1, len(arr)): + if len(arr[i]) == 1: + remaining_value = arr[i][0] + parts = remaining_value.split() + if len(parts) > header_columns: + parts = parts[:header_columns] + ensure_columns(arr[i], header_columns) + for j in range(len(parts)): + arr[i][j] = parts[j] + # 如果分割出的值不足,填充空值 + if len(parts) < header_columns: + for j in range(len(parts), header_columns): + arr[i][j] = '' + + return arr + + +# 三季报中针对性修改,本报告期和年初至报告期末的两个上年同期进行区分 +def process_array_with_annual_comparison(arr, keywords=['本报告期', '年初至报告期末', '上年同期']): + def contains_all_keywords(header, keywords): + return all(keyword in header for keyword in keywords) + + def split_and_replace_occurrences(header, target, replacement): + # 找到所有 target 出现的位置 + indices = [i for i, x in enumerate(header) if x == target] + if len(indices) > 1: + split_index = len(indices) // 2 + for i in range(split_index): + header[indices[i]] = replacement + return header + + # 将 numpy 数组转换为列表 + arr = arr.tolist() if isinstance(arr, np.ndarray) else arr + + if len(arr) > 0 and len(arr[0]) > 0: + first_row = arr[0] + + if contains_all_keywords(first_row, keywords): + # 将 "上年同期" 拆分并替换 + first_row = split_and_replace_occurrences(first_row, '上年同期', '三季报中无需识别的上年同期') + arr[0] = first_row + + return arr + + +# 三季报的非经常损益的单独处理 +def process_array_with_grants(arr, keywords=['本报告期', '年初至报告期'], target='计入当期损益的政府补助', + replacement='非经常性损益'): + # 检查第一行是否包含所有关键词 + def contains_all_keywords(header, keywords): + # return all(keyword in header for keyword in keywords) + return all(any(keyword in str(cell) for cell in header) for keyword in keywords) + + # 检查第一列中是否存在目标文本 + def contains_target_in_first_column(arr, target): + return any(target in str(item[0]) for item in arr) + + # 替换第一列中的特定值 + def replace_in_first_column(arr, target, replacement): + for i in range(len(arr)): + if arr[i][0] == target: + arr[i][0] = replacement + return arr + + # 将 numpy 数组转换为列表 + arr = arr.tolist() if isinstance(arr, np.ndarray) else arr + + if len(arr) > 0 and len(arr[0]) > 0: + first_row = arr[0] + + # 检查第一行和第一列的条件 + if contains_all_keywords(first_row, keywords) and contains_target_in_first_column(arr, target): + # 替换第一列中的 "合计" + arr = replace_in_first_column(arr, '合计', replacement) + + return arr + +# 处理表格数据 +def process_table(file_id, tables): + applog.info('Run task %s (%s)...' % (f'处理word文件中的table file_id:{file_id}', os.getpid())) + start = time.time() + + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + + for t in tables: + try: + arr = np.array(t["data"]) + + arr = safe_process_array(process_array, arr) # 部分资产负债表合并问题 + arr = safe_process_array(process_array_with_annual_comparison, arr) # 复杂表格的优化"多个上年同期时处理" + arr = safe_process_array(process_array_with_grants, arr) # 三季报的非经常损益 + + arr = np.char.replace(arr, ' ', '') + arr = np.char.replace(arr, '\n', '') + arr = np.char.replace(arr, ',', '') + + arr_list = check_table(arr) + + for a in arr_list: + new_data = a.tolist() # 用于后面保存到数据库中 + new_data = utils.check_black_table_list(new_data) + rows, cols = a.shape + if rows == 1 and cols == 1: + continue + arr_str = ''.join([''.join(map(str, row)) for row in a]) + # 全量的数据先存入 word_parse_data表中 + db_service_word.insert_word_parse_process({ + 'file_id': file_id, + 'page_num': t["index"], + 'page_count': 100, + 'type': 'table', + 'content': { + 'page_num': t["index"], + 'table_index': t["index"], + "type": "table", + "data": new_data, + }}, conn, cursor, "word_parse_data") + + # 过滤掉不包含需抽取指标表格的文本 + matches = re.findall(STR_PATTERN, arr_str) + pattern = re.findall(PATTERN, arr_str) + muilt_pattern = re.findall(MUILT_PATTERN, arr_str) + + if len(matches) > 0 and len(muilt_pattern) < 5: + # if len(matches) > 0 and len(pattern) == 0 and len(muilt_pattern) < 5: + db_service_word.insert_word_parse_process({ + 'file_id': file_id, + 'page_num': t["index"], + 'page_count': 100, + 'type': 'parse_table', + 'content': { + 'page_num': t["index"], + 'table_index': t["index"], + "type": "table", + "data": new_data, + }}, conn, cursor,"word_parse_process") + except Exception as e: + applog.info(f'解析表格时出现了异常 {e} 内容为{t}') + cursor.close() + conn.close() + end = time.time() + applog.info('Task %s runs %0.2f seconds.' % (f'解析表格{file_id}', (end - start))) + +def text_in_table(top, tables_range, page_num): + if tables_range.get(page_num): + for range in tables_range[page_num]: + if top < range['top'] and top > range['buttom']: + return True + return False + +def get_text_type(text: str): + text = re.sub(r"\s", "", text) + first_re = '年度报告' + page_number_pattern = re.compile(r'^\d+(/\d+)?$') + + if re.search(first_re, text.strip()): + return 'page_header' + + if page_number_pattern.match(text.strip()): + return 'page_footer' + + if len(text) < 20 and text.endswith('页'): + return 'page_footer' + + return 'text' + +def check_report_type(file_id): + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + """ + :return: 返回pdf文件中文本内容,不包括表格 + """ + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + if record_select: + report_type = record_select[0][0] + report_year = record_select[0][1] + cursor.close() + conn.close() + return int(report_type),report_year + else: + return None + + + +# 通过text的index 获取最近的一个table的index,并校验中间text文本的长度和数量 +def get_next_table_index(text_index, texts, tables): + try: + for table in tables: + if table["index"] > text_index and table["type"] == "table": + table_index = table["index"] + total_len = sum(len(texts.get(key).get("data").replace(" " ,"")) for key in range(text_index + 1, table_index)) + # 最近一个表格的索引 在10个以内 + if (table_index - text_index) < 10 and total_len < 50: + # 在判断所有的字符串加起来有是否小于50个字 + return table_index + else: + return text_index + except StopIteration: + applog.error("Target not found") + return text_index + + +#处理文本数据 +def process_text_content(file_id,texts,tables,full_texts,type =0): + applog.info('Run task %s (%s)...' % (f'处理word文件中的 text file_id:{file_id}', os.getpid())) + conn = mysql.connector.connect( + host=MYSQL_HOST, + user=MYSQL_USER, + password=MYSQL_PASSWORD, + database=MYSQL_DB + ) + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + """ + :return: 返回pdf文件中文本内容,不包括表格 + """ + report_type, report_year = check_report_type(file_id) + texts_dict = {t["index"]:t for t in full_texts} + + query = "SELECT title_list,button_list FROM table_title_list WHERE report_year = %s" + cursor_dict = conn.cursor(dictionary=True) + cursor_dict.execute(query, (report_year,)) + result = cursor_dict.fetchone() + title_list = result['title_list'] + button_list = result['button_list'] + + try: + for t in texts: + line_text = t["data"] + line_text = re.sub(r"\s", "", line_text) + line_text = re.sub(r":", ":", line_text) + index = t["index"] + + if len(re.findall('母公司|现金流量表补充', line_text)) > 0: + db_service_word.insert_measure_parser_info({ + 'file_id': file_id, + 'content': get_next_table_index(index,texts_dict,tables), + 'type': 'parent_com', + }, conn, cursor) + + # 保存每个表格上方小范围区域的文字,这部分内容包含了表格的标题和指标单位 + table_info = {} + if (utils.check_table_title_black_list(line_text, title_list) + or utils.check_table_title_black_list_button(line_text,button_list)): + db_service_word.insert_measure_parser_info({ + 'file_id': file_id, + 'content': get_next_table_index(index,texts_dict,tables), + 'type': 'table_index', + }, conn, cursor) + if utils.check_table_title_black_list_measure(line_text): + db_service_word.insert_measure_parser_info_measure({ + 'file_id': file_id, + 'content': get_next_table_index(index, texts_dict,tables), + 'type': 'measure_index', + }, conn, cursor, line_text) + + + if re.findall(unit_pattern, line_text): + # 为单位 + table_info = get_table_unit_info(file_id,line_text,t["index"],t["index"]+1) + + db_service_word.insert_table_unit_info_v1(table_info,conn,cursor) + + if utils.check_table_title_black_list_measure(line_text): + db_service_word.insert_measure_parser_info_measure({ + 'file_id': file_id, + 'content': f"{t['index']}_1", + 'type': 'measure_index', + }, conn, cursor, line_text) + + if not utils.pdf_text_flag(line_text): + if utils.check_line_text(line_text): + db_service_word.insert_word_parse_process({ + 'file_id': file_id, + 'page_num' : t["index"], + 'page_count' : 100, + 'type' : 'parse_table', + 'content':{ + 'page_num' : t["index"], + 'table_index' : t["index"], + "type" : "text", + 'content' : line_text, + }},conn,cursor,"word_parse_process") + # 给慎用词校验用 + db_service_word.insert_word_parse_process({ + 'file_id': file_id, + 'page_num': t["index"], + 'page_count': 100, + 'type': 'text', + 'content': { + 'page_num': t["index"], + 'table_index': t["index"], + "type": "text", + 'content': line_text, + }}, conn, cursor, "word_parse_data") + + table_name = "word_text_info" + if type == 1: + table_name = "id_text_info" + # 写入数据库 传入表名 + db_service_word.batch_insert_page_text({ + 'file_id': file_id, + 'page_num' : t["index"], + 'text' : line_text + },conn,cursor, table_name) + + + for t in tables: + page_num = t["index"] + for lines in t["data"]: + lines = list(set(lines)) + for line in lines: + if len(line) == 0: + continue + db_service_word.batch_insert_page_text({ + 'file_id': file_id, + 'page_num' : page_num, + 'text' : line + },conn,cursor,"word_text_info") + + + except Exception as e: + applog.error(f'文本处理异常{e}') + + + +def get_table_unit_info(file_id,line_text,page_num,table_index): + table_info = {} + table_info['file_id'] = file_id + match = unit_pattern.search(line_text) + if match: + unit = match.group(2) + table_info['unit'] = unit + + table_info['page_num'] = page_num + table_info['table_index'] = table_index + + return table_info + + +def get_table_text_info(file_id,line_text,page_num,table_index): + table_info = {} + table_info['file_id'] = file_id + table_info['text_info'] = line_text + table_info['page_num'] = page_num + table_info['table_index'] = table_index + + return table_info + +# 读取pdf中的表格,并将表格中指标和表头合并,eg: 2022年1季度营业收入为xxxxx +def get_table_measure(file_id, word_tables, record_range): + """ + :return: pdf中的表格,并将表格中指标和表头合并,eg: 2022年1季度营业收入为xxxxx + """ + try: + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + + # 创建一个cursor对象来执行SQL语句 + cursor_app = conn_app.cursor(buffered=True) + + select_year_select = f"""select report_type,year from report_check where id = {file_id}""" + cursor.execute(select_year_select) + record_select = cursor.fetchall() + report_type = record_select[0][0] + report_year = record_select[0][1] + + client = MilvusClient( + uri= MILVUS_CLIENT + ) + applog.info('提取指标任务 %s (%s)...' % (record_range, os.getpid())) + start = time.time() + + record_start = record_range.split('-')[0] + record_end = record_range.split('-')[1] + for index in range(int(record_start),int(record_end)): + t = word_tables[index][0] + measure_obj =[] + data_dict = {} + measure_list = [] + try: + arr = np.array(t["data"]) + rows, cols = arr.shape + if rows == 1 and cols == 1: + continue + + row_num , col_num = -1 , -1 + + # 使用嵌套循环遍历数组,获取第一个数值位置 + for i in range(rows): + for j in range(cols): + if j == 0 or i == 0:#防止第一列识别出数字 + continue + measure_value_config = str(arr[i, j]).replace('(','').replace(')','') + + + if re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', measure_value_config): + if j == cols-1: + row_num, col_num = i, j + break + elif (re.match(r'^[+-]?(\d+(\.\d*)?|\.\d+)(%?)$', measure_value_config) + or measure_value_config == '-'): + row_num, col_num = i, j + break + else: + continue + break + # 遍历数值二维数组,转成带语义的指标 + if row_num != -1 and col_num != -1: + for i in range(row_num,arr.shape[0]): + for j in range(col_num,arr.shape[1]): + measure_value = str(arr[i, j]).replace('%','').replace('(','-').replace(')','') + if measure_value == '-' or measure_value == '' or len(measure_value) > 20: + continue + else: + row_num_info = get_row_num_info(arr,row_num,col_num,i,j) + col_num_info = get_col_num_info(arr,row_num,col_num,i,j) + + #如果上表头为空则认为是被截断,除了研发投入特殊处理其它过滤 + if row_num_info in ('','-',')',')'): + continue + + #特殊处理非经常性损益合计和非经常性损益净额同时出现时保留净额 + if col_num_info == '非经常性损益合计': + continue + + if utils.check_pdf_measure_black_list(f"{col_num_info}{row_num_info}"): + continue + + #去掉没有周期的指标 + if utils.check_pdf_measure(f"{col_num_info}{row_num_info}"): + continue + + #判断上表头和左表头周期是否一致,不一致过滤 + row_period = utils.get_period_type_other(row_num_info, report_year) + col_period = utils.get_period_type_other(col_num_info, report_year) + if(row_period != col_period and row_period != 'c_n' and col_period != 'c_n'): + continue + units_mapping = { + "百万元": "百万元", + "千万元": "千万元", + "亿元": "亿元", + "万元": "万元", + "千元": "千元", + "元": "元", + "元/股": "元" + } + row_num_info = row_num_info.replace('%','增减') + #num_info = f"{col_num_info}{row_num_info}".replace('()','').replace('加:','').replace('减:','').replace('%','') + num_info = utils.get_clean_text(f"{row_num_info}{col_num_info}") + num_info_bak = utils.get_clean_text(f"{col_num_info}{row_num_info}") + measure_unit = '' + #"%": "同期增减" + combined_info = f"{row_num_info} {col_num_info}" + # for unit in units_mapping: + # if unit in row_num_info: + # measure_unit = units_mapping[unit] + # break + if utils.get_percent_flag(row_num_info) == '1': + measure_unit = '' + else: + for unit in units_mapping: + if re.search(rf'\(\s*{unit}(\s*人民币)?\s*\)|\(\s*{unit}(\s*人民币)?\s*\)', combined_info) or (re.search(rf'{unit}', combined_info) and any(re.search('单位', item) for item in arr[0])): + measure_unit = units_mapping[unit] + break + measure_list.append({ + 'measure_name': num_info, + 'measure_value': measure_value, + 'measure_unit':measure_unit, + }) + measure_list.append({ + 'measure_name': num_info_bak, + 'measure_value': measure_value, + 'measure_unit':measure_unit, + }) + + if not redis_client.exists(f'parsed_measure_count_{file_id}'): + redis_client.set(f'parsed_measure_count_{file_id}', 0) + + redis_client.incr(f'parsed_measure_count_{file_id}') + + if len(measure_list) > 0: + data_dict["measure_list"] = measure_list + data_dict["page_num"] = f"{str(t['page_num'])}_{str(t['table_index'])}" + data_dict['file_id'] = file_id + measure_obj.append(data_dict) + db_service_word.insert_measure_data_to_milvus(client,measure_obj,cursor_app,conn_app) + except Exception as e: + applog.error(f"循环获取表格数据这里报错了,数据是{t['data']},位置在{index}") + applog.error(f"错误是:{e}") + end = time.time() + applog.info('提取指标 %s runs %0.2f seconds.' % (record_range, (end - start))) + except Exception as e: + applog.error(f'这个错误是{e},所在的位置是{record_start}-{record_end}') + record_start = record_range.split('-')[0] + record_end = record_range.split('-')[1] + for index in range(int(record_start),int(record_end)): + t = word_tables[index] + try: + arr = np.array(t['data']) + except Exception as e: + applog.error(f'这个错误是{e}的arr的值是{arr}') + + + finally: + redis_client.close() + client.close() + cursor.close() + conn.close() + cursor_app.close() + conn_app.close() + + +#指标归一化处理 + +def update_measure_data(file_id,file_path,parent_table_pages): + conn = mysql.connector.connect( + host = MYSQL_HOST, + user = MYSQL_USER, + password = MYSQL_PASSWORD, + database = MYSQL_DB + ) + + # 创建一个cursor对象来执行SQL语句 + cursor = conn.cursor(buffered=True) + # #通过向量查询指标 + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + + # 创建一个cursor对象来执行SQL语句 + cursor_app = conn_app.cursor(buffered=True) + applog.info(f'目录黑名单为:{parent_table_pages}') + # db_service_word.delete_to_run(conn,cursor,file_id) + db_service_word.insert_table_measure_from_vector_async_process(cursor,parent_table_pages,file_id,file_path) + + # #指标归一化处理 + db_service_word.update_ori_measure(conn,cursor,file_id) + # db_service.delete_database(conn_app,cursor_app,file_id) + cursor.close() + conn.close() + cursor_app.close() + conn_app.close() + +def merge_consecutive_arrays(word_info): + merged_objects = [] + temp_list = [] + + for info_obj in word_info: + try: + if info_obj['type'] == 'table': + # 如果对象是表格,将其元素添加到临时列表中 + data = info_obj['data'] + if not data: + continue + first_row = data[0] + if all(re.search(r'[\u4e00-\u9fa5]', cell) for cell in first_row[1:]) and len(temp_list) == 0: + temp_list.append(info_obj) + elif all(re.search(r'[\u4e00-\u9fa5]', cell) for cell in first_row[1:]) and len(temp_list) > 0: + merged_objects.append(temp_list) + temp_list = [] + temp_list.append(info_obj) + elif not all(re.search(r'[\u4e00-\u9fa5]', cell) for cell in first_row[1:]) and len(temp_list) > 0: + temp_data = temp_list[-1]['data'] + temp_data = list(temp_data) + for row in list(info_obj['data']): + temp_data.append(row) + info_obj['data'] = temp_data + temp_list.clear() + temp_list.append(info_obj) + + + except Exception as e: + + applog.error(f"解析数据错误: {e}") + + if temp_list: + merged_objects.append(temp_list) + + return merged_objects + +def merge_consecutive_arrays_v1(pdf_info): + merged_objects = [] + temp_array = {} + + def is_same_dimension(data1, data2): + # 检查两个表的每行长度是否相同 + if len(data1) != len(data2): + return False + return all(len(row1) == len(row2) for row1, row2 in zip(data1, data2)) + + for info_obj in pdf_info: + try: + if info_obj['type'] == 'table': + if not temp_array: + # 如果临时列表为空,则初始化临时列表 + temp_array = info_obj + else: + # 检查当前表与临时列表中的表是否同维度 + if is_same_dimension(temp_array['data'], info_obj['data']): + # 如果是同维度,则合并数据 + temp_array['data'].extend(info_obj['data']) + else: + # 如果不是同维度,将现有临时列表添加到结果中,并重置临时列表 + merged_objects.append(temp_array) + temp_array = info_obj + else: + # 如果对象不是表格,检查临时列表是否非空 + if temp_array: + # 将临时列表中的元素合并成一个数组,并添加到新的对象列表中 + merged_objects.append(temp_array) + temp_array = {} # 重置临时列表 + except Exception as e: + applog.error(f"解析数据错误: {e}") + + # 循环结束后,检查临时列表是否非空,如果非空,则添加到结果中 + if temp_array: + merged_objects.append(temp_array) + + return merged_objects +def start_table_measure_job(file_id): + conn_app = mysql.connector.connect( + host = MYSQL_HOST_APP, + user = MYSQL_USER_APP, + password = MYSQL_PASSWORD_APP, + database = MYSQL_DB_APP + ) + + # 创建一个cursor对象来执行SQL语句 + cursor_app = conn_app.cursor(buffered=True) + + select_process_query = ''' + select DISTINCT content from word_parse_process WHERE file_id = '{file_id}' and type='parse_table' order by page_num + '''.format(file_id=file_id) + cursor_app.execute(select_process_query) + records = cursor_app.fetchall() + word_info = [] + for record in records: + word_info.append(eval(record[0])) + + # 获取table 数据 + word_tables = merge_consecutive_arrays(word_info) + redis_client = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=6) + + redis_client.set(f'measure_count_{file_id}', len(word_tables)) + + cursor_app.close() + conn_app.close() + redis_client.close() + + records_range_parts = utils.get_range(len(word_tables),MEASURE_COUNT) + processes = [] + for record_range in records_range_parts: + p = Process(target=get_table_measure, args=(file_id,word_tables,record_range,)) + processes.append(p) + p.start() + + for p in processes: + p.join() + diff --git a/zzb_data_word/parse_word.py b/zzb_data_word/parse_word.py new file mode 100644 index 0000000..a047544 --- /dev/null +++ b/zzb_data_word/parse_word.py @@ -0,0 +1,269 @@ +from docx import Document +import json +from docx.oxml.table import CT_Tbl +from docx.oxml.text.paragraph import CT_P +from lxml import etree +import os +import zipfile + +RESULT_TYPE_TEXT = 'text' +RESULT_TYPE_TABLE = 'table' + +def build_result(result_type, index, data): + return { + 'type': result_type, + 'index': index, + 'data': data + } + +def build_catalog_result(index, depth, data): + return { + 'index': index, + 'depth': depth, + 'data': data + } + +# 解析docx文件中的XML内容 +def get_xml_content(docx_filename, xml_filename): + with zipfile.ZipFile(docx_filename) as z: + return z.read(xml_filename) + +def parse_paragraph(paragraph, index, namespaces): + paragraph_text = paragraph.text.strip() if paragraph else '' + if paragraph_text: + return build_result(RESULT_TYPE_TEXT, index, paragraph_text) + return None + +def parse_table(table, index): + table_data = [] + for row in table.rows: + row_data = [cell.text for cell in row.cells] + table_data.append(row_data) + return build_result(RESULT_TYPE_TABLE, index, table_data) + +def parse_paragraph_element(paragraph_element, index, namespaces): + paragraph_xml = etree.fromstring(paragraph_element.xml) + paragraph_text = ''.join(paragraph_xml.xpath('//w:t/text()', namespaces=namespaces)).strip() + if paragraph_text: + return build_result(RESULT_TYPE_TEXT, index, paragraph_text) + return None + +def parse_table_element(table_element, index, namespaces): + table_xml = etree.fromstring(table_element.xml) + table_data = [] + for row in table_xml.xpath('//w:tr', namespaces=namespaces): + row_data = [] + for cell in row.xpath('./w:tc | ./w:sdt', namespaces=namespaces): + cell_text = ''.join(cell.xpath('.//w:t/text()', namespaces=namespaces)).strip() + grid_span_xpath = etree.XPath('.//w:tcPr/w:gridSpan/@w:val', namespaces=namespaces) + grid_span = int(grid_span_xpath(cell)[0]) if grid_span_xpath(cell) else 1 + if grid_span > 1: + row_data.extend([cell_text] * grid_span) + else: + row_data.append(cell_text) + table_data.append(row_data) + return build_result(RESULT_TYPE_TABLE, index, table_data) + +def add_to_catalog(element_xml, index, catalog_content, namespaces, paragraph_text, heading_styles): + p_element = etree.fromstring(element_xml) + # outlineLvl = p_element.xpath('.//w:outlineLvl', namespaces=namespaces) + # if outlineLvl: + # level = int(outlineLvl[0].get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val')) + # catalog_content.append(build_catalog_result(index, level, paragraph_text)) + level = is_heading_paragraph(p_element, heading_styles, namespaces) + if level != -1: + catalog_content.append(build_catalog_result(index, level, paragraph_text)) +# 检查段落是否为标题样式 +def is_heading_paragraph(paragraph, heading_styles, namespaces): + pPr = paragraph.find('.//w:pPr', namespaces=namespaces) + if pPr is not None: + pStyle = pPr.find('.//w:pStyle', namespaces=namespaces) + pOutLineLvl = pPr.find('.//w:outlineLvl', namespaces=namespaces) + if pStyle is not None: + style_val = pStyle.get(f"{{{namespaces['w']}}}val") + if style_val.isdigit(): + return int(style_val) + if pOutLineLvl is not None: + outLineLvl_val = pOutLineLvl.get(f"{{{namespaces['w']}}}val") + if outLineLvl_val.isdigit(): + return int(outLineLvl_val) + 1 + # if pStyle is not None and pStyle.get(ns['w'] + 'val') in heading_styles: + # if style_val > 0: + # return True + return -1 + +def get_paragraph_text(paragraph_element, namespaces): + paragraph_text = '' + for run in paragraph_element.findall('.//w:r', namespaces=namespaces): + for text in run.findall('.//w:t', namespaces=namespaces): + paragraph_text += text.text if text.text is not None else '' + return paragraph_text + +def add_to_catalog_paragraph(text, index, catalog_content, namespaces): + # 添加段落到目录 + catalog_content.append(build_catalog_result(index, 1, text)) # 假设默认级别为1 + +def parse_sdt_catalog(sdt_element, catalog_content, index, namespaces): + sdt_content = sdt_element.find('.//w:sdtContent', namespaces=namespaces) + if sdt_content is not None: + for child in sdt_content: + if child.tag.endswith('p'): # 内容控件中的段落 + paragraph_text = get_paragraph_text(child, namespaces) + if paragraph_text.strip(): # 检查文本是否为空 + add_to_catalog_paragraph(paragraph_text, index, catalog_content, namespaces) + index += 1 # 更新索引 + elif child.tag.endswith('tbl'): # 内容控件中的表格 + # 处理表格内容(如果需要) + pass + elif child.tag.endswith('sdt'): # 嵌套的内容控件 + index = parse_sdt_catalog(child, catalog_content, index, namespaces) # 递归解析嵌套的内容控件 + return index + +def parse_docx(docx_path): + try: + document = Document(docx_path) + styles_xml = get_xml_content(docx_path, 'word/styles.xml') + except Exception as e: + print(f"Error loading document: {e}") + return None, None + + doc_content = [] # 内容(文本+表格) + catalog_content = [] # 目录 + current_index = 1 # 维护全局的 index 变量 + paragraph_index = 0 + table_index = 0 + # 获取整个文档的XML内容 + xml_root = document.part.element + namespaces = xml_root.nsmap + + # 获取所有标题样式 + styles_root = etree.fromstring(styles_xml) + heading_styles = set() + for style in styles_root.xpath('//w:style', namespaces=namespaces): + style_type = style.get(namespaces['w'] + 'type') + if style_type == 'paragraph' and style.get(namespaces['w'] + 'styleId').startswith('Heading'): + heading_styles.add(style.get(namespaces['w'] + 'styleId')) + + # 遍历文档中的所有元素 + for i, element in enumerate(document.element.body): + if isinstance(element, CT_P): # 段落 + paragraph_result = parse_paragraph_element(element, current_index, namespaces) + if paragraph_result: + doc_content.append(paragraph_result) + # 判断是否为目录,是就插入目录内容 + paragraph = document.paragraphs[paragraph_index] + add_to_catalog(paragraph._element.xml, current_index, catalog_content, namespaces, paragraph.text, heading_styles) + current_index += 1 # 更新 index + paragraph_index += 1 + elif isinstance(element, CT_Tbl): # 表格 + table_result = parse_table_element(element, current_index, namespaces) + if table_result: + doc_content.append(table_result) + current_index += 1 # 更新 index + table_index += 1 + elif element.tag.endswith('sdt'): # 内容控件 + current_index = parse_sdt(element, doc_content, current_index, namespaces, catalog_content, heading_styles) # 更新索引 + + return json.dumps(doc_content, indent=4, ensure_ascii=False), json.dumps(catalog_content, indent=4, ensure_ascii=False) + + + +def parse_sdt(sdt_element, doc_content, current_index, namespaces, catalog_content, heading_styles): + sdtContent = sdt_element.find('.//w:sdtContent', namespaces=namespaces) + if sdtContent is not None: + for child in sdtContent: + if child.tag.endswith('p'): # 内容控件中的段落 + paragraph_text = '' + for run in child.findall('.//w:r', namespaces=namespaces): + for text in run.findall('.//w:t', namespaces=namespaces): + paragraph_text += text.text if text.text is not None else '' + if paragraph_text.strip(): # 检查文本是否为空 + doc_content.append(build_result(RESULT_TYPE_TEXT, current_index, paragraph_text.strip())) + # 判断是否为目录,是就插入目录内容 + add_to_catalog(child.xml, current_index, catalog_content, namespaces, paragraph_text, heading_styles) + current_index += 1 # 更新索引 + elif child.tag.endswith('tbl'): # 内容控件中的表格 + table_data = [] + merged_cells = {} # 用于记录跨行单元格的信息 + for row_idx, row in enumerate(child.findall('.//w:tr', namespaces=namespaces)): + row_data = [] + for col_idx, cell in enumerate(row.findall('.//w:tc', namespaces=namespaces)): + cell_text = '' + for run in cell.findall('.//w:r', namespaces=namespaces): + for text in run.findall('.//w:t', namespaces=namespaces): + cell_text += text.text if text.text is not None else '' + + # 检查单元格是否跨列 + grid_span_xpath = etree.XPath('.//w:tcPr/w:gridSpan/@w:val', namespaces=namespaces) + grid_span = int(grid_span_xpath(cell)[0]) if grid_span_xpath(cell) else 1 + if grid_span > 1: + row_data.extend([cell_text.strip()] * grid_span) + else: + row_data.append(cell_text.strip()) + + # 检查单元格是否跨行 + v_merge_xpath = etree.XPath('.//w:tcPr/w:vMerge/@w:val', namespaces=namespaces) + v_merge = v_merge_xpath(cell) + if v_merge and v_merge[0] == 'restart': + merged_cells[(row_idx, col_idx)] = (int(grid_span), 1) + elif v_merge and v_merge[0] == 'continue': + if (row_idx - 1, col_idx) in merged_cells: + merged_cells[(row_idx - 1, col_idx)] = (merged_cells[(row_idx - 1, col_idx)][0], merged_cells[(row_idx - 1, col_idx)][1] + 1) + # 跨行单元格不需要再次添加到 row_data 中 + else: + # 只有非跨行单元格才需要添加到 row_data 中 + pass + + # 处理跨行单元格 + for (r, c), (col_span, row_span) in list(merged_cells.items()): + if r < row_idx: + for i in range(row_span): + if r + i == row_idx: + row_data[c:c] = [row_data[c]] * (col_span - 1) + break + if r + row_span - 1 == row_idx: + del merged_cells[(r, c)] + + table_data.append(row_data) + if table_data: # 检查表格数据是否为空 + doc_content.append(build_result(RESULT_TYPE_TABLE, current_index, table_data)) + current_index += 1 # 更新索引 + elif child.tag.endswith('sdt'): # 嵌套的内容控件 + current_index = parse_sdt(child, doc_content, current_index, namespaces, catalog_content, heading_styles) # 递归解析嵌套的内容控件 + return current_index # 返回更新后的索引 + +def split_text_table(json_data): + # 分组 + text_elements = [element for element in json_data if element['type'] == 'text'] + table_elements = [element for element in json_data if element['type'] == 'table'] + + # 转换为JSON字符串 + text_elements_json = json.dumps(text_elements, ensure_ascii=False, indent=4) + table_elements_json = json.dumps(table_elements, ensure_ascii=False, indent=4) + + return text_elements_json, table_elements_json + +def append_to_file(file_path, text): + try: + with open(file_path, 'a', encoding='utf-8') as file: + file.write(text + '\n') + except Exception as e: + print(f"Error writing to file: {e}") + +if __name__ == "__main__": + current_directory = os.getcwd() + docx_relative_path = '101.docx' + file_relative_path = 'file\\docx\\test1.txt' + docx_path = os.path.join(current_directory, docx_relative_path) + file_path = os.path.join(current_directory, file_relative_path) + try: + parsed_content, catalog_content = parse_docx(docx_path) + if parsed_content and catalog_content: + json_parsed_content = json.loads(parsed_content) + text_elements_json, table_elements_json = split_text_table(json_parsed_content) + + append_to_file(file_path, text_elements_json) + append_to_file(file_path, table_elements_json) + append_to_file(file_path, catalog_content) + except Exception as e: + print(f"Error parse_docx: {e}") \ No newline at end of file diff --git a/zzb_data_word/redis_service.py b/zzb_data_word/redis_service.py new file mode 100644 index 0000000..b767944 --- /dev/null +++ b/zzb_data_word/redis_service.py @@ -0,0 +1,17 @@ +import redis +# 从 MySQL 表中读取数据并写入 Redis +def read_from_file_and_write_to_redis(redis_client,ori_measure_id,measure_vector): + # Redis 连接配置 + redis_client.hset('measure_config',ori_measure_id, measure_vector) + +# 从 Redis 中读取数据 +def read_from_redis(redis_client,ori_measure_id): + # 获取所有键 + return redis_client.hget('measure_config',ori_measure_id).decode() + +# if __name__ == "__main__": +# # redis_client = redis.Redis(host='123.60.153.169', port=6379, password='Xgf_redis', db=6) +# redis_client = redis.Redis(host='124.70.129.232', port=6379, password='Xgf_redis', db=6) +# +# value = read_from_redis(redis_client,"92b44ffb50b6ab2068f5de447c9925") +# print(value) \ No newline at end of file diff --git a/zzb_data_word/requirements.txt b/zzb_data_word/requirements.txt new file mode 100644 index 0000000..a38c143 --- /dev/null +++ b/zzb_data_word/requirements.txt @@ -0,0 +1,14 @@ +camelot-py==0.11.0 +pdfminer.six==20221105 +PyPDF2==3.0.1 +pdfplumber==0.10.3 +pymilvus==2.3.3 +mysql-connector-python==8.3.0 +dashscope==1.17.0 +fastapi +pydantic +uvicorn +redis +ghostscript +opencv-python-headless +python-docx \ No newline at end of file diff --git a/zzb_data_word/utils.py b/zzb_data_word/utils.py new file mode 100644 index 0000000..a735aac --- /dev/null +++ b/zzb_data_word/utils.py @@ -0,0 +1,818 @@ +#coding=utf-8 + +import dashscope +from http import HTTPStatus +from pymilvus import MilvusClient +import json +from datetime import datetime +import re,os,time +import requests +import config +import numpy as np +from docx2pdf import convert +from config import api_key + + +dashscope.api_key = api_key + + +def get_md5(str): + import hashlib + m = hashlib.md5() + m.update(str.encode('utf-8')) + return m.hexdigest() + +def embed_with_str(input): + retry = 0 + max_retry = 5 + t = 0.1 + while retry < max_retry: + #阿里接口限流 + time.sleep(t) + resp = dashscope.TextEmbedding.call( + model=dashscope.TextEmbedding.Models.text_embedding_v2, + input=input) + if resp.status_code == HTTPStatus.OK: + return resp + elif resp.status_code == 429: + print(f'触发限流,等待{t}秒后重试') + retry += 1 + t+=0.1 + else: + print(f'请求失败,状态码:{resp.status_code}') + return None + print('重试超过上限') + return None + +#如果存在‘归属于|扣非’,就保留括号内的内容,并去掉标点符号和中文数字。 +#如果存在季度关键词,就将括号内容替换为季度 +#如果存在‘±’,就将括号内容替换为同期增减 +#其他情况,就删掉括号内全部内容 +def get_clean_text(text): + text = text.replace('流动资产:','').replace('半年度','上半年') + #先对几个半年报的词做整理,防止向量识别不出来 + terms = ["货币资金", "应收账款",'应付账款'] + #这个是不要合计的 + terms_2 = ["固定资产","短期借款","合同负债","在建工程","商誉","存货"] + #这个是需要调换位置的指标 + #terms_3 = ["固定资产","短期借款","合同负债","在建工程","商誉"] + #不可以出现同比之类的 + terms_4 = ['比', '率', '占','至','年以内','年以上','年内','1-2年','2-3年','3-4年','4-5年','准备','在途','增值','评估','利息','应计','改良','跌价','补助','投资'] + dates = [ "2021年12月31日","2022年12月31日","2022年1月1日","2023年1月1日", "2023年12月31日", "2022年6月30日","2023年6月30日","2024年6月30日","2024年半年度","2023年半年度","2022年半年度"] + #dates = [ "2021年12月31日","2022年12月31日","2023年12月31日","2022年1月1日","2023年1月1日", "2024年1月1日", "2022年6月30日","2023年6月30日","2024年6月30日","2021年初","2022年初","2023年初","2024年初",'2021年末','2022年末','2023年末','2024年末',"2023年","2022年","2021年"] + if any(term in text for term in terms_4): + return text + if len(text) <= 20: + for term in terms: + for date in dates: + if term in text and date in text: + text = f"{date}{term}合计" + return text + if len(text) <= 20: + for term in terms_2: + for date in dates: + if term in text and date in text: + text = f"{date}{term}" + return text + + import re + replacement_dict = { + '加:': '', + '减:': '', + '%' : '', + '其中:': '', + '实际': '', + '/': '', + '重述后':'', + '年末金额':'年末', + '比重增减':'同比增减', + '比例':'同比', + } + #针对整个text做替换 + def replace_all(text, replacements): + pattern = re.compile("|".join(map(re.escape, replacements.keys()))) + return pattern.sub(lambda match: replacements[match.group(0)], text) + text = replace_all(text, replacement_dict) + #单独出现12月31日时,就剔除掉 + pattern_year = r'(? 0: + return 'c' + elif len(re.findall(l_period, text)) > 0: + return 'l' + elif len(re.findall(bl_period, text)) > 0: + return 'bl' + else: + return 'c' + +def get_period_type_other(text, year): + l_year = f'{int(year)-1}' + bl_year = f'{int(year)-2}' + c_period = f'当期|本期|本报告期|报告期|本年|本期|{year}' + l_period = f'上年|上期|上年度|{l_year}' + bl_period = f'前年|{bl_year}' + + if len(re.findall(c_period, text)) > 0: + return 'c' + elif len(re.findall(l_period, text)) > 0: + return 'l' + elif len(re.findall(bl_period, text)) > 0: + return 'bl' + else: + return 'c_n' + +def get_start_period_type(text): + s_period = '期初|1月1日|年初' + + if len(re.findall(s_period, text)) > 0: + return '' + else: + return '0' + +def get_season_flag(text): + season_period = '第1季度|第2季度|第3季度|第4季度|一季度|二季度|三季度|四季度|1-3月|4-6月|7-9月|10-12月' + if len(re.findall(season_period, text)) > 0: + return '1' + else: + return '0' + +def get_percent_flag(text): + percent_word = '收益率|占比|比重|比例|同比增减|同比上升|同比下降|变化幅度|同期增减|本年比上年增减|同比变动|变动比例|本年度比上年度增减|增减' + if len(re.findall(percent_word, text)) > 0: + return '1' + else: + return '0' + +def get_kf_flag(text): + kf_word = '扣非|扣除非经常性损益' + if len(re.findall(kf_word, text)) > 0: + return '1' + else: + return '0' + +def get_report_start(text): + kf_word = '报告期初|1月1日' + if len(re.findall(kf_word, text)) > 0: + return '1' + else: + return '0' + +def get_percent_growth(text): + percent_growth_word = '变动|本年比上年|比例同比增减|比例同比上升|比例同比下降|比例变化幅度|比例变动比例|比例本期比上年同期增减|比例本年比上年增减|比例同比变动|比例本期期末金额较上期期末变动比例|比率同比增减|比率同比上升|比率同比下降|比率变化幅度|比率变动比例|比率本期比上年同期增减|比率本年比上年增减|比率同比变动|比率本期期末金额较上期期末变动比例|占比同比增减|占比同比上升|占比同比下降|占比变化幅度|占比变动比例|占比本期比上年同期增减|占比本年比上年增减|占比同比变动|占比本期期末金额较上期期末变动比例|费用同比增减|费用同比上升|费用同比下降|费用变化幅度|费用变动比例|费用本期比上年同期增减|费用本年比上年增减|费用同比变动|费用本期期末金额较上期期末变动比例' + if len(re.findall(percent_growth_word, text)) > 0: + return '1' + else: + return '0' +def check_black_list(meta_measure, pdf_measure, black_array): + # 获取黑名单数据 + #black_array = fetch_black_list_data(cursor) + + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure==black_meta: + for pdf in black_pdfs: + if pdf_measure.find(pdf) >= 0: + return True + return False + +def check_black_list_old(meta_measure,pdf_measure): + # 判断指标名是否包含黑名单词 + #black_array = ['非经常性损益:非经常性损益合计,非经常性损益总额','营业收入:营业外收入,主营业务,营业总收入,扣除,年度公司','归母净利润:净资产,净利率,扣除,年度公司','扣非净利润:净资产,净利率,年度公司','经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计','筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计','投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计','非经常性损益:扣除非经常性损益','基本每股收益:稀释每股收益','稀释每股收益:基本每股收益','总资产:净资产','应收账款:应付账款','短期借款:长期借款','应付账款:应收账款','长期借款:短期借款','研发投入:比例,比率,占比,费用','资本化研发投入:比例,比率,占比,费用','资本化研发投入占比:金额,费用','研发投入占营业收入比例:金额,费用','上年年末:1月1日'] + black_array = ['非经常性损益:非经常性损益合计,非经常性损益总额,合计' + ,'营业收入:营业外收入,主营业务,营业总收入,扣除,年底公司,合计,汇总' + ,'归母净利润:净资产,净利率,扣除,年度公司,归属于本公司普通股股东的净利润' + ,'扣非净利润:净资产,净利率,年度公司' + ,'经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计,每股,扣除' + ,'筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计,每股,扣除' + ,'投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计,每股,扣除' + ,'非经常性损益:扣除非经常性损益' + ,'基本每股收益:稀释每股收益,发行新股' + ,'稀释每股收益:基本每股收益,发行新股' + ,'总资产:净资产','应收账款:应付账款,年以上,内,至,到' + ,'短期借款:长期借款,非流动负债,年以上,年以内,内,至,到' + ,'应付账款:应收账款,年以上,内,至,到' + ,'长期借款:短期借款,非流动负债,年以上,内,至,到,保证,抵押' + ,'研发投入:比例,比率,占比,费用,占' + ,'资本化研发投入:比例,比率,占比,费用,占' + ,'资本化研发投入占比:金额,费用' + ,'研发投入占营业收入比例:金额,费用' + ,'上年年末:1月1日' + ,'期加权平均净资产收益率:同比,扣除,扣非,年化,每股' + ,'期扣非加权平均净资产收益率:同比,年化,每股' + ,'加权平均净资产收益率同比变动:年化,每股' + ,'研发费用:制造,投入,直接,管理' + ,'应收账款:1-2年','货币资金:在途' + ,'当期:2023年1-6月,调整后' + ,'营业成本:营业总成本' + ,'长期借债:年内到期','研发投入:直接' + ,'第一季度:第二季度,第三季度,第四季度' + ,'第二季度:第一季度,第三季度,第四季度' + ,'第三季度:第二季度,第一季度,第四季度' + ,'第四季度:第二季度,第三季度,第一季度' + ,'研发费用:研发支出,研发投入','存货:跌价准备' + ,'费用:日常,付现','固定资产:改良,补助,投资'] + # current_period = f'当期:{report_year}年1-6月' + # black_array.append(current_period) + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure.find(black_meta) >= 0: + for pdf in black_pdfs: + if pdf_measure.find(pdf) >= 0: + return True + return False + +def check_white_list(meta_measure,pdf_measure): + white_array = ['基本每股收益:每股收益','加权平均净资产收益率同比变动:比','季度变动比例:比'] + for black in white_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if black_meta in meta_measure: + for pdf in black_pdfs: + if pdf_measure.find(pdf) < 0: + return True + return False + +def check_title_black_list(meta_measure,text_info): + # 判断指标名是否包含黑名单词 + black_array = ['营业收入:前五名,前5名,合计','营业成本:合计','财务费用:现金流','销售费用:现金流','管理费用:现金流','研发费用:现金流','非经常性损益:合计'] + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if meta_measure.find(black_meta) >= 0: + for pdf in black_pdfs: + if text_info.find(pdf) >= 0: + return True + return False + +# 文本中数字的占比 +def under_non_alpha_ratio(text: str, threshold: float = 0.6): + + if len(text) == 0: + return False + + alpha_count = len([char for char in text if char.strip() and char.isalpha()]) + total_count = len([char for char in text if char.strip()]) + try: + ratio = alpha_count / total_count + return ratio <= threshold + except: + return False +def check_table_title_black_list(text,table_title_black_list):#report_year + #previous_year = int(report_year) - 1 + if table_title_black_list is None: + return False + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +#通过关键词黑名单匹配表格上方的文本区域,提取需要过滤的表格 +def check_table_title_black_list_old(text,report_year):#report_year + previous_year = int(report_year) - 1 + table_title_black_list = f"""所有权或使用权受到限制的资产|持有待售资产|关联交易|未确认递延所得税资产明细|{previous_year}年度|{previous_year}年1-6月|自{previous_year}年1月1日至6月30日止期间|流动性风险|关联交易|账龄超过|流动风险|公司资产负债表|按账龄组合|线上直营|线上直销|公司现金流量表|公司利润表|应收账款|在建工程|固定资产|其他与筹资活动有关的现金|汇率风险|市场风险|主营业务收入|主营收入|其他收入|前五名|前5名|经营活动有关的现金|股份变动对最近一年和最近一期每股收益、每股净资产等财务指标的影响|合同产生的收入情况|子公司|参股公司|控股公司|分解信息|经营活动产生的现金|行业分类|产品分类|地区分类|业绩快报|销售渠道|调整情况说明|合同分类|计入当期损益的政府补助|股份变动对最近一年和最近一期|分部的财务信息|显示服务创收|线上销售情况|试运行销售|会计政策变更|品牌经营业务|工程施工业务|开发业务|制造业务|合营安排或联营企业中的权益|联营企业的主要财务信息|汇率及通货膨胀|与金融工具相关的风险|运营业务|B端业务|终止经营现金流量|终止经营|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|母公司|现金流量表补充|直营店店效情况|担保人2023年度未经审计的|外汇风险|公司各业务板块经营情况|报告期确认的包括在合同负债期初账面价值中的收入|资产受限情况|资产权利受限情况|内控自我评价报告|所有权或使用权受限资产|合并日被合并方资产、负债的账面价值|经营租赁资产|前5|前五|②|不属于现金及现金等价物的货币资金|按销售模式分|按产品类别分|按照销售区域|产品类别|销售模式|经销模式|关键管理人员|截至{previous_year}年6月30日止六个月期间|关联方提供的存款及贷款服务|报告期内各销售渠道的盈利情况|报告期内各地区的盈利情况|报告期内各产品的盈利情况|其他非流动负债|关联方提供的存款及贷款服务|自营销售分商品类别数据|组合计提|考核指标|不属于现金及现金等价物的货币资金|应收款项融资|本期计提、收回或转回的坏账准备情况|存货跌价准备|持有待售负债""" + + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +#通过关键词黑名单匹配页面下方的文本区域,提取需要过滤的表格 + +def check_table_title_black_list_button(text,table_title_black_list): + + if table_title_black_list is None: + return False + + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +def check_table_title_black_list_button_old(text): + + table_title_black_list = """公司资产负债表|公司现金流量表|公司利润表|主营业务收入|主营收入|其他收入|前五名|前5名|经营活动有关的现金|股份变动对最近一年和最近一期每股收益、每股净资产等财务指标的影响|合同产生的收入情况|子公司|参股公司|控股公司|分解信息|经营活动产生的现金|2022年度|行业分类|产品分类|地区分类|业绩快报|销售渠道|调整情况说明|合同分类|计入当期损益政府补助|股份变动对最近一年和最近一期|分部的财务信息|显示服务创收|线上销售情况|试运行销售|品牌经营业务|工程施工业务|开发业务|制造业务|合营安排或联营企业中的权益|联营企业的主要财务信息|汇率及通货膨胀|与金融工具相关的风险|运营业务|B端业务|终止经营现金流量|终止经营|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|不属于现金及现金等价物的货币资金|经营租赁资产|分地区|分产品|分行业|使用权受限资产|资产受限情况|经销模式|持续的第三层次公允价值计量项目,期初与期末账面价值间的调节信息及不可观察参数敏感|权利受限情况|应收款项融资|本期计提、收回或转回的坏账准备情况""" + + + if len(re.findall(table_title_black_list, text)) > 0: + return True + if re.search(r'上年度\s*$', text): + return True + return False +def check_table_title_black_list_measure(text): + #black_array = ['补充资料:研发费用,管理费用,财务费用' + # ,'营业收入:营业外收入,主营业务,营业总收入,扣除,年底公司,合计,汇总' + #] + table_title_black_list = """补充资料|测试文本|其他非流动负债|应收款项融资|本期计提、收回或转回的坏账准备情况|筹资活动产生的各项负债变动情况|持有待售资产|账龄超过 1 年或逾期的重要应付账款|经营租赁资产|计息金融工具|坏账准备""" + if len(re.findall(table_title_black_list, text)) > 0: + return True + return False +#过滤原始指标中包含黑名单 +def check_pdf_measure_black_list(text): + pdf_measure_black_list = '股权变动前|股权变动后|含股份支付|境内|境外|调整前|有限公司|责任公司|其他|变更前|差异|同口径|调整金额' + if len(re.findall(pdf_measure_black_list, text)) > 0: + return True + if "其中:营业收入" in text: + return False + if "同比" in text and "额" in text: + #if text.find("同比") < text.find("额"): + if text.endswith("额"): + return True + return False + + +def check_pdf_measure(pdf_measure): + keywords_1 = [ + '2022年', '2023年', '2021年', '第一季度', '第二季度', '第三季度', '第四季度', '增减', '变动', '本期','同期', '当期', '报告期', '前年', + '上年', '上期', '本年', '1-3月', '4-6月', '7-9月', '10-12月' + ] + + keywords_2 = ['这里是一个测试文本'] + + contain_keyword_1 = any(keyword in pdf_measure for keyword in keywords_1) + contain_keyword_2 = any(keyword in pdf_measure for keyword in keywords_2) + #只有 未出现周期,同时出现了'调整后'才会删掉指标 + if not contain_keyword_1 and contain_keyword_2: + return True + return False +# def check_white_list(meta_measure,pdf_measure): +# # 判断指标名是否包含白名单词 +# black_array = ['营业收入:营业外收入,主营业务,营业总收入,扣除','归母净利润:净资产,净利率,扣除','扣非净利润:净资产,净利率','经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计','筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计','投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计','非经常性损益:扣除非经常性损益','基本每股收益:稀释每股收益','稀释每股收益:基本每股收益','总资产:净资产','应收账款:应付账款','短期借款:长期借款','应付账款:应收账款','长期借款:短期借款','研发投入:比例,比率,占比,费用','资本化研发投入:比例,比率,占比,费用','资本化研发投入占比:金额,费用','研发投入占营业收入比例:金额,费用'] +# for black in black_array: +# black_meta = black.split(':')[0] +# black_pdfs = black.split(':')[1].split(',') +# if meta_measure.find(black_meta) >= 0: +# for pdf in black_pdfs: +# if pdf_measure.find(pdf) >= 0: +# return True +# return False +def check_line_text(line_text): + if line_text == 'PAGE': + return False + if line_text == '(续)': + return False + if line_text.endswith('(续)'): + return False + if line_text.endswith("年度财务报表") and "有限公司" in line_text: + return False + if len(line_text) < 20 and line_text.endswith("有限公司"): + return False + substrings = [ + '对内加快发展方式绿色转型、对外形成绿色生产和生活方式', + '可持续发展、创新发展;“8”是八大绿色行动', + '色新赋能、催生绿色新科技、筑牢绿色新支撑', + '接上表','续上表', + ] + for substring in substrings: + if substring in line_text: + return False + return True + +def pdf_text_flag(text : str): + if under_non_alpha_ratio(text): + return True + + if len(text) < 5: + return True + + if not re.findall(',|,|。|、|(|)',text): + return True + + if text.find('适用') != -1 and text.find('不适用') != -1: + return True + + if text.find('是') != -1 and text.find('否') != -1: + return True + + return False + +def get_change_rate_flag(text): + percent_word = '同比增减|同比上升|同比下降|变化幅度|变动比例|本期比上年同期增减|本年比上年增减|同比变动|本期期末金额较上期期末变动比例' + if len(re.findall(percent_word, text)) > 0: + return '1' + else: + return '0' + +def check_pdf_measure_black_list_v3(file_id,table_num,table_index,pdf_measure,conn_app,cursor_app): + content_value = f"{table_num}_{table_index}" + measure_index_array = [] + select_measure_index_query = ''' + SELECT DISTINCT text FROM measure_parser_info_linetext WHERE file_id = %s AND type = 'measure_index' and content = %s + ''' + cursor_app.execute(select_measure_index_query, (file_id,content_value,)) + measure_index_records = cursor_app.fetchall() + for measure_index_record in measure_index_records: + measure_index_array.append(measure_index_record[0]) + black_array = ['补充资料:研发费用,管理费用,财务费用,销售费用' + ,'测试标题:测试指标' + ,'其他非流动负债:合同负债' + ,'应收款项融资:应收账款' + ,'本期计提、收回或转回的坏账准备情况:应收账款' + ,'筹资活动产生的各项负债变动情况:短期借款,长期借款' + ,'持有待售资产:固定资产' + ,'账龄超过 1 年或逾期的重要应付账款:应付账款' + ,'经营租赁资产:固定资产' + ,'计息金融工具:货币资金,短期借款,交易性金融资产' + ,'坏账准备:应收账款' + ] + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + #if measure_index_array.find(black_meta) >= 0: + #if black_meta in measure_index_array: + if any(black_meta in measure_index for measure_index in measure_index_array): + if any(pdf in pdf_measure for pdf in black_pdfs): + #for pdf in black_pdfs: + #if pdf in pdf_measure: + #if pdf_measure.find(pdf) >= 0: + return True + return False +def check_black_table_list(data): + black_array = ['补充资料:研发费用,管理费用,财务费用,销售费用', + #'补充目录:母公司' + ] + for black in black_array: + black_meta = black.split(':')[0] + black_pdfs = black.split(':')[1].split(',') + if any(black_meta in cell for row in data for cell in row): + print(data) + for pdf in black_pdfs: + data = [row for row in data if not any(pdf in cell for cell in row)] + return data + +if __name__ == '__main__': + + print(len('我是我')) + + # print(under_non_alpha_ratio('202水电费水电费水电费是的205月')) + # title = '母公司财务报表主要项目注释' + # if len(re.findall('母公司|现金流量表补充', title)) >0 and len(re.findall('项目注释', title)) == 0: + # print('1') + # else: + # print('0') + + # print(check_black_list('当期投资活动现金流净额','当前筹资活动现金流净额')) + # test = '2023年1-12月' + # print(get_period_type('上年度本期费用化研发投入')) + # print(get_period_type('费用化研发投入本年度')) + # vector_a = embed_with_str('第一季度营业收入') + # vector = vector_a.output["embeddings"][0]["embedding"] + + # vector_b = embed_with_str('营业收入第一季度') + # vector1 = vector_b.output["embeddings"][0]["embedding"] + + # similarity = cosine_similarity(vector, vector1) + # print(f"余弦相似度: {similarity}") + + # measure_data = [ + # '1,1,营业收入2023年金额,1003535799.51', + # '1,1,营业收入2022年金额,869401513.71', + # '1,1,营业收入变动比例,15.43%', + # '1,1,营业成本2023年金额,810779075.89', + # '1,1,营业成本2023年占营业收入的比重,80.79%', + # '1,1,营业成本2022年金额,702990363.57', + # '1,1,营业成本2022年占营业收入的比重,80.86%', + # '1,1,营业成本变动比例,15.33%', + # '1,1,毛利率2023年金额,19.21%', + # '1,1,毛利率2022年金额,19.14%', + # '1,1,销售费用2023年金额,34065464.60', + # '1,1,销售费用2023年占营业收入的比重,3.39%', + # '1,1,销售费用2022年金额,28038106.19', + # '1,1,销售费用2022年占营业收入的比重,3.22%', + # '1,1,销售费用变动比例,21.50%', + # '1,1,管理费用2023年金额,50807308.69', + # '1,1,管理费用2023年占营业收入的比重,5.06%', + # '1,1,管理费用2022年金额,38251704.48', + # '1,1,管理费用2022年占营业收入的比重,4.40%', + # '1,1,管理费用变动比例,32.82%', + # '1,1,研发费用2023年金额,35312198.23', + # '1,1,研发费用2023年占营业收入的比重,3.52%', + # '1,1,研发费用2022年金额,30081787.99', + # '1,1,研发费用2022年占营业收入的比重,3.46%', + # '1,1,研发费用变动比例,17.39%', + # '1,1,财务费用2023年金额,8015604.52', + # '1,1,财务费用2023年占营业收入的比重,0.80%', + # '1,1,财务费用2022年金额,5739677.85', + # '1,1,财务费用2022年占营业收入的比重,0.66%', + # '1,1,财务费用变动比例,39.65%', + # '1,1,信用减值损失2023年金额,-11873626.82', + # '1,1,信用减值损失2023年占营业收入的比重,-1.18%', + # '1,1,信用减值损失2022年金额,-8903293.61', + # '1,1,信用减值损失2022年占营业收入的比重,-1.02%', + # '1,1,信用减值损失变动比例,33.36%', + # '1,1,资产减值损失2023年金额,-2328729.46', + # '1,1,资产减值损失2023年占营业收入的比重,-0.23%', + # '1,1,资产减值损失2022年金额,-2285987.53', + # '1,1,资产减值损失2022年占营业收入的比重,-0.26%', + # '1,1,资产减值损失变动比例,1.87%', + # '1,1,其他收益2023年金额,17886048.88', + # '1,1,其他收益2023年占营业收入的比重,1.78%', + # '1,1,其他收益2022年金额,11025908.32', + # '1,1,其他收益2022年占营业收入的比重,1.27%', + # '1,1,其他收益变动比例,62.22%', + # '1,1,投资收益2023年金额,323361.47', + # '1,1,投资收益2023年占营业收入的比重,0.03%', + # '1,1,投资收益2022年金额,1119730.43', + # '1,1,投资收益2022年占营业收入的比重,0.13%', + # '1,1,投资收益变动比例,-71.12%', + # '1,1,公允价值变动收益2023年占营业收入的比重,0.00%', + # '1,1,公允价值变动收益2022年金额,10183.62', + # '1,1,公允价值变动收益2022年占营业收入的比重,0.00%', + # '1,1,公允价值变动收益变动比例,-100.00%', + # '1,1,资产处置收益2023年金额,12782544.48', + # '1,1,资产处置收益2023年占营业收入的比重,1.27%', + # '1,1,资产处置收益2022年金额,-59.56', + # '1,1,资产处置收益2022年占营业收入的比重,0.00%', + # '1,1,资产处置收益变动比例,21461726.06%', + # '1,1,汇兑收益2023年金额,0', + # '1,1,汇兑收益2023年占营业收入的比重,0%', + # '1,1,汇兑收益2022年金额,0', + # '1,1,汇兑收益2022年占营业收入的比重,0%', + # '1,1,汇兑收益变动比例,0%', + # '1,1,营业利润2023年金额,76175407.00', + # '1,1,营业利润2023年占营业收入的比重,7.59%', + # '1,1,营业利润2022年金额,63332601.81', + # '1,1,营业利润2022年占营业收入的比重,7.28%', + # '1,1,营业利润变动比例,20.28%', + # '1,1,营业外收入2023年金额,5788307.99', + # '1,1,营业外收入2023年占营业收入的比重,0.58%', + # '1,1,营业外收入2022年金额,1083997.19', + # '1,1,营业外收入2022年占营业收入的比重,0.12%', + # '1,1,营业外收入变动比例,433.98%', + # '1,1,营业外支出2023年金额,687271.68', + # '1,1,营业外支出2023年占营业收入的比重,0.07%', + # '1,1,营业外支出2022年金额,1554243.54', + # '1,1,营业外支出2022年占营业收入的比重,0.18%', + # '1,1,营业外支出变动比例,-55.78%', + # '1,1,净利润2023年金额,72975283.09', + # '1,1,净利润2023年占营业收入的比重,7.27%', + # '1,1,净利润2022年金额,57747603.98', + # '1,1,净利润2022年占营业收入的比重,6.64%', + # '1,1,净利润变动比例,26.37%', + # '1,1,税金及附加2023年金额,5170339.13', + # '1,1,税金及附加2023年占营业收入的比重,0.52%', + # '1,1,税金及附加2022年金额,1933753.49', + # '1,1,税金及附加2022年占营业收入的比重,0.22%', + # '1,1,税金及附加变动比例,167.37%', + # '1,1,所得税费用2023年金额,8301160.22', + # '1,1,所得税费用2023年占营业收入的比重,0.83%', + # '1,1,所得税费用2022年金额,5114751.48', + # '1,1,所得税费用2022年占营业收入的比重,0.59%', + # '1,1,所得税费用变动比例,62.30%', + # '1,1,少数股东损益2023年金额,-58350.22', + # '1,1,少数股东损益2023年占营业收入的比重,-0.01%', + # '1,1,少数股东损益2022年金额,-946.60', + # '1,1,少数股东损益2022年占营业收入的比重,0.00%', + # '1,1,少数股东损益变动比例,-6064.19%', + # '1,1,归属于母公司所有者的净利润2023年金额,73033633.31', + # '1,1,归属于母公司所有者的净利润2023年占营业收入的比重,7.28%', + # '1,1,归属于母公司所有者的净利润2022年金额,57748550.58', + # '1,1,归属于母公司所有者的净利润2022年占营业收入的比重,6.64%', + # '1,1,归属于母公司所有者的净利润变动比例,26.47%', + # '1,1,归属于少数股东的综合收益总额2023年金额,-58350.22', + # '1,1,归属于少数股东的综合收益总额2023年占营业收入的比重,-0.01%', + # '1,1,归属于少数股东的综合收益总额2022年金额,-946.60', + # '1,1,归属于少数股东的综合收益总额2022年占营业收入的比重,0.00%', + # '1,1,归属于少数股东的综合收益总额变动比例,-6064.19%', + # '1,1,归属于母公司所有者的综合收益总额2023年金额,73033633.31', + # '1,1,归属于母公司所有者的综合收益总额2023年占营业收入的比重,7.28%', + # '1,1,归属于母公司所有者的综合收益总额2022年金额,57748550.58', + # '1,1,归属于母公司所有者的综合收益总额2022年占营业收入的比重,6.64%', + # '1,1,归属于母公司所有者的综合收益总额变动比例,26.47%', + # '2,1,主营业务收入2023年,983698831.48', + # '2,1,主营业务收入2022年,854682261.31', + # '2,1,主营业务收入变动比例,15.10%', + # '2,1,其他业务收入2023年,19836968.03', + # '2,1,其他业务收入2022年,14719252.40', + # '2,1,其他业务收入变动比例,34.77%', + # '2,1,主营业务成本2023年,793604607.43', + # '2,1,主营业务成本2022年,690932741.27', + # '2,1,主营业务成本变动比例,14.86%', + # '2,1,其他业务成本2023年,17174468.46', + # '2,1,其他业务成本2022年,12057622.30', + # '2,1,其他业务成本变动比例,42.44%', + # '3,1,变压器营业收入,490028234.05', + # '3,1,变压器营业成本,402179824.08', + # '3,1,变压器毛利率,17.93%', + # '3,1,变压器营业收入比上年同期增减,16.22%', + # '3,1,变压器营业成本比上年同期增减,16.33%', + # '3,1,变压器毛利率比上年同期增减,减少0.07个百分点', + # '3,1,高低压成套开关设备营业收入,261342442.26', + # '3,1,高低压成套开关设备营业成本,206645237.99', + # '3,1,高低压成套开关设备毛利率,20.93%', + # '3,1,高低压成套开关设备营业收入比上年同期增减,-8.93%', + # '3,1,高低压成套开关设备营业成本比上年同期增减,-9.91%', + # '3,1,高低压成套开关设备毛利率比上年同期增减,增加0.86个百分点', + # '3,1,户外成套设备营业收入,198013248.27', + # '3,1,户外成套设备营业成本,157856817.84', + # '3,1,户外成套设备毛利率,20.28%', + # '3,1,户外成套设备营业收入比上年同期增减,62.25%', + # '3,1,户外成套设备营业成本比上年同期增减,65.30%', + # '3,1,户外成套设备毛利率比上年同期增减,减少1.47个百分点', + # '3,1,其他营业收入,54151874.93', + # '3,1,其他营业成本,44097195.98', + # '3,1,其他毛利率,18.57%', + # '3,1,其他营业收入比上年同期增减,39.68%', + # '3,1,其他营业成本比上年同期增减,36.10%', + # '3,1,其他毛利率比上年同期增减,增加2.14个百分点', + # '3,1,合计营业收入,1003535799.51', + # '3,1,合计营业成本,810779075.89', + # '3,2,东北地区营业收入,2425280.53', + # '3,2,东北地区营业成本,1427939.37', + # '3,2,东北地区毛利率,41.12%', + # '3,2,东北地区营业收入比上年同期增减,-69.51%', + # '3,2,东北地区营业成本比上年同期增减,-77.58%', + # '3,2,东北地区毛利率比上年同期增减,增加21.20个百分点', + # '3,2,华北地区营业收入,70542020.62', + # '3,2,华北地区营业成本,53044055.18', + # '3,2,华北地区毛利率,24.81%', + # '3,2,华北地区营业收入比上年同期增减,205.32%', + # '3,2,华北地区营业成本比上年同期增减,203.18%', + # '3,2,华北地区毛利率比上年同期增减,增加0.54个百分点', + # '3,2,华东地区营业收入,770352353.33', + # '3,2,华东地区营业成本,636803535.34', + # '3,2,华东地区毛利率,17.34%', + # '3,2,华东地区营业收入比上年同期增减,24.17%', + # '3,2,华东地区营业成本比上年同期增减,25.30%', + # '3,2,华东地区毛利率比上年同期增减,减少0.74个百分点', + # '3,2,华南地区营业收入,18509519.71', + # '3,2,华南地区营业成本,14496855.46', + # '3,2,华南地区毛利率,21.68%', + # '3,2,华南地区营业收入比上年同期增减,-57.08%', + # '3,2,华南地区营业成本比上年同期增减,-57.98%', + # '3,2,华南地区毛利率比上年同期增减,增加1.67个百分点', + # '3,2,华中地区营业收入,60588394.64', + # '3,2,华中地区营业成本,44559969.21', + # '3,2,华中地区毛利率,26.45%', + # '3,2,华中地区营业收入比上年同期增减,-51.24%', + # '3,2,华中地区营业成本比上年同期增减,-55.13%', + # '3,2,华中地区毛利率比上年同期增减,增加6.38个百分点', + # '3,2,西北地区营业收入,58618014.32', + # '3,2,西北地区营业成本,42844719.81', + # '3,2,西北地区毛利率,26.91%', + # '3,2,西北地区营业收入比上年同期增减,178.59%', + # '3,2,西北地区营业成本比上年同期增减,173.62%', + # '3,2,西北地区毛利率比上年同期增减,增加1.33个百分点', + # '3,2,西南地区营业收入,22500216.36', + # '3,2,西南地区营业成本,17602001.52', + # '3,2,西南地区毛利率,21.77%', + # '3,2,西南地区营业收入比上年同期增减,-23.74%', + # '3,2,西南地区营业成本比上年同期增减,-17.89%', + # '3,2,西南地区毛利率比上年同期增减,减少5.57个百分点', + # '3,2,合计营业收入,1003535799.51', + # '3,2,合计营业成本,810779075.89', + # '5,2,经营活动产生的现金流量净额2023年,-44713443.44', + # '5,2,经营活动产生的现金流量净额2022年,-53241071.45', + # '5,2,经营活动产生的现金流量净额变动比例,16.02%', + # '5,2,投资活动产生的现金流量净额2023年,-88649920.50', + # '5,2,投资活动产生的现金流量净额2022年,-94251741.15', + # '5,2,投资活动产生的现金流量净额变动比例,5.94%', + # '5,2,筹资活动产生的现金流量净额2023年,96607197.26', + # '5,2,筹资活动产生的现金流量净额2022年,210537586.22', + # '5,2,筹资活动产生的现金流量净额变动比例,-54.11%' + # ] + + # client = MilvusClient( + # uri="http://localhost:19530" + # ) + # vector_obj = embed_with_str('2023年营业收入') + # vector = vector_obj.output["embeddings"][0]["embedding"] + # data = [vector] + # res = client.search( + # collection_name="zzb_measure", # Replace with the actual name of your collection + # # Replace with your query vector + # data=data, + # limit=1, # Max. number of search results to return + # search_params={"metric_type": "COSINE", "params": {}}, # Search parameters + # output_fields=["measure_name","measure_value"] + # ) + + # # Convert the output to a formatted JSON string + # result = json.dumps(res, indent=4, ensure_ascii=False) + # print(result) + + # insert_measure_data(client, measure_data) + # text = '营业收入第一季度(1-3月份)' + # new_text = re.sub(r'([^)]*)', '',text) + # print(new_text) diff --git a/zzb_data_word/word_title.py b/zzb_data_word/word_title.py new file mode 100644 index 0000000..63c15e5 --- /dev/null +++ b/zzb_data_word/word_title.py @@ -0,0 +1,16 @@ + +import re +def get_parent_table_pages(title_array, file_id): + parent_table_pages_local = {} + parent_table_pages_local[file_id] = [] + print(f'{file_id}:{len(title_array)}') + for i in range(len(title_array)): + title_obj = title_array[i] + title = title_obj['data'] + if len(re.findall('母公司|现金流量表补充|重要会计政策|会计估计变更|公允价值的披露|合营安排或联营企业中的权益|与金融工具相关的风险|税项|主要控股参股公司|结构化主体情况|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|所有权或使用权受到限制的资产|在建工程|固定资产|其他主体中的权益|分部信息|与金融工具相关的风险|其他关联交易|公司子公司重大事项', title)) >0 : + page_num = title_obj['index'] + parent_table_pages_local[file_id].append(page_num) + + parent_table_pages = parent_table_pages_local[file_id] + return parent_table_pages + diff --git a/zzb_data_word/zzb_logger.py b/zzb_data_word/zzb_logger.py new file mode 100644 index 0000000..f5c0777 --- /dev/null +++ b/zzb_data_word/zzb_logger.py @@ -0,0 +1,39 @@ +import time +import logging +import logging.handlers +import os + +# 如果日志文件夹不存在,则创建 +log_dir = "log-day" # 日志存放文件夹名称 +log_path = os.getcwd() + os.sep + log_dir +if not os.path.isdir(log_path): + os.makedirs(log_path) + +# logging初始化工作 +logging.basicConfig() + +# myapp的初始化工作 +applog = logging.getLogger(__name__) +applog.setLevel(logging.INFO) + +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.INFO) + +# 添加TimedRotatingFileHandler +# 定义一个1天换一次log文件的handler +# 保留3个旧log文件 +timefilehandler = logging.handlers.TimedRotatingFileHandler( + log_dir + os.sep + "sec.log", + when='D', + interval=1, + backupCount=3 +) +# 设置后缀名称,跟strftime的格式一样 +timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log" +# timefilehandler.suffix = "%Y-%m-%d.log" + +formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s') +console_handler.setFormatter(formatter) +timefilehandler.setFormatter(formatter) +applog.addHandler(timefilehandler) +applog.addHandler(console_handler) \ No newline at end of file