diff --git a/main.py b/main.py index 9a690fd..ea9d7b3 100644 --- a/main.py +++ b/main.py @@ -173,17 +173,23 @@ class MyPlugin(Star): self.sqllitaa.commit() cur.close() self.sqllitaa.close() + # 删除源文件 + file_list = os.listdir(f"{self.data_path}") try: - # 删除源文件 - file_list = os.listdir(f"{self.data_path}") for nam in file_list: if "zhangdan" not in nam: os.remove(str(self.data_path)+"\\"+nam) file_listaa = os.listdir(f"{self.data_path}/zhangdan/") for namaa in file_listaa: os.remove(str(self.data_path)+"\\zhangdan\\"+namaa) - except IOError as e: - logger.error(f"文件删除失败 原因{e}") + except Exception as e: + for nam in file_list: + if "zhangdan" not in nam: + os.remove(str(self.data_path)+"/"+nam) + file_listaa = os.listdir(f"{self.data_path}/zhangdan/") + for namaa in file_listaa: + os.remove(str(self.data_path)+"/zhangdan/"+namaa) + yield event.plain_result("保存完成__使用/chazhang 查询最后10条记录") except Exception as e: yield event.plain_result(f"保存失败{e}") @@ -217,7 +223,7 @@ class MyPlugin(Star): yuju = [] try: if ".csv" in filename: - ata = pd.read_csv(filename, encoding='GB2312', on_bad_lines='skip',header=22) + ata = pd.read_csv(filename, encoding='gb18030', on_bad_lines='skip',header=22) # 读取表格数据 for biao in range(10): # 暂存当行数据 diff --git a/tools/zhangdan_flask.py b/tools/zhangdan_flask.py index 0c34f39..37961fd 100644 --- a/tools/zhangdan_flask.py +++ b/tools/zhangdan_flask.py @@ -1,3 +1,4 @@ + #!/usr/bin/env python3 """ 账单查询服务 - Flask版 @@ -6,13 +7,17 @@ import sqlite3 import os +import sys +import signal +import hashlib import secrets import threading +import time +from urllib.request import urlopen +from urllib.error import URLError from flask import Flask, render_template_string, jsonify, request, session, redirect, url_for from flask_cors import CORS - - # ===== 🔧 常量 ===== PORT = 5001 PID_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".flask.pid") @@ -34,7 +39,7 @@ def runwebui(web_port,web_passwd,datadb): print(e) -def start_server(host, port, debug): +def start_server(host="0.0.0.0", port=PORT, debug=False): """在子线程中启动 Flask 服务,主线程不受影响""" global _server, _server_thread @@ -59,7 +64,6 @@ def start_server(host, port, debug): def stop_server(): """只关闭 Flask 子线程,主线程继续运行""" - global _server, _server_thread if _server: @@ -93,6 +97,7 @@ def server_status(): app = Flask(__name__) app.secret_key = secrets.token_hex(32) CORS(app) + def check_auth(): """检查是否已登录""" return session.get("authenticated") is True @@ -303,12 +308,24 @@ def api_summary(): """, params) by_wallet = [dict(r) for r in cur.fetchall()] + # 按交易名称汇总 + cur.execute(f""" + SELECT payname, payto, + COUNT(*) as count, + SUM(CAST(paysize AS REAL)) as total + FROM zhangdan {where} + GROUP BY payname, payto + ORDER BY total DESC + """, params) + by_name = [dict(r) for r in cur.fetchall()] + conn.close() return jsonify({ "overview": overview, "by_type": by_type, "by_channel": by_channel, "by_wallet": by_wallet, + "by_name": by_name, }) @@ -609,8 +626,12 @@ HTML_TEMPLATE = r""" } .summary-item.income { border-left-color: #4ade80; } .summary-item.expense { border-left-color: #f87171; } - .summary-item .s-label { font-size: 0.9em; } + .summary-item .s-left { flex: 1; min-width: 0; } + .summary-item .s-right { text-align: right; flex-shrink: 0; margin-left: 12px; } + .summary-item .s-label { font-size: 0.9em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .summary-item .s-meta { font-size: 0.75em; color: #888; } + .summary-item .s-count { font-size: 1.1em; font-weight: 700; color: #60a5fa; } + .summary-item .s-count span { font-size: 0.7em; font-weight: 400; color: #888; } .summary-item .s-value { font-weight: 700; font-size: 1.05em; } /* 表格 */ @@ -735,6 +756,7 @@ HTML_TEMPLATE = r""" } .summary-item { padding: 10px 12px; border-radius: 8px; } .summary-item .s-label { font-size: 0.85em; } + .summary-item .s-count { font-size: 0.95em; } .summary-item .s-value { font-size: 0.95em; } /* 表格 */ @@ -776,6 +798,7 @@ HTML_TEMPLATE = r"""