You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
software/fix_server.py

133 lines
3.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python3
"""服务器端修复脚本:解决内存计数器重启归零导致的主键冲突"""
import os, sys
APP_PATH = "/opt/zhitu/app.py"
if not os.path.exists(APP_PATH):
print(f"错误:找不到 {APP_PATH}")
sys.exit(1)
# 备份
bak = APP_PATH + ".bak." + str(int(os.time()))
os.system(f"cp {APP_PATH} {bak}")
print(f"已备份: {bak}")
with open(APP_PATH, "r", encoding="utf-8") as f:
s = f.read()
# 1. 删除内存计数器
s = s.replace(
"_demand_id_counter = 0\n_task_id_counter = 0\n_danger_id_counter = 0",
"# 计数器已从内存变量改为数据库查询,避免服务重启后主键冲突"
)
# 2. 添加辅助函数
helper = '''def _next_demand_id():
"""从数据库查询当前最大需求ID生成下一个避免内存计数器重启归零导致主键冲突"""
conn = get_db()
row = conn.execute("SELECT id FROM demands WHERE id LIKE 'REQ-%' ORDER BY id DESC LIMIT 1").fetchone()
conn.close()
if row:
try:
num = int(row["id"].replace("REQ-", ""))
except ValueError:
num = 0
else:
num = 0
return "REQ-" + str(num + 1).zfill(3)
def _next_task_id():
"""从数据库查询当前最大任务ID生成下一个"""
conn = get_db()
row = conn.execute("SELECT id FROM tasks WHERE id LIKE '#%' ORDER BY id DESC LIMIT 1").fetchone()
conn.close()
if row:
try:
num = int(row["id"].replace("#", ""))
except ValueError:
num = 0
else:
num = 0
return "#" + str(num + 1).zfill(3)
'''
marker = "# ===== REST API: 物资需求单兵APP ====="
if marker in s and "_next_demand_id" not in s:
s = s.replace(marker, helper + marker)
# 3. 修改 post_demand
s = s.replace(
" global _demand_id_counter\n data = request.get_json(force=True)\n _demand_id_counter += 1",
" data = request.get_json(force=True)"
)
s = s.replace(
' demand_id = "REQ-" + str(_demand_id_counter).zfill(3)',
' demand_id = _next_demand_id()'
)
# 4. 修改 add_danger_zone
s = s.replace(
''' global _danger_id_counter
data = request.get_json(force=True)
_danger_id_counter += 1
zone = {
"id": _danger_id_counter,''',
''' data = request.get_json(force=True)
zone = {'''
)
s = s.replace(
''' conn.execute('''
INSERT INTO danger_zones (lat, lng, radius, description, created_at)
VALUES (?, ?, ?, ?, ?)
''', (zone["lat"], zone["lng"], zone["radius"], zone["description"], zone["created_at"]))
conn.commit()
conn.close()
return jsonify({"ok": True, "id": zone["id"]})''',
''' cur = conn.execute('''
INSERT INTO danger_zones (lat, lng, radius, description, created_at)
VALUES (?, ?, ?, ?, ?)
''', (zone["lat"], zone["lng"], zone["radius"], zone["description"], zone["created_at"]))
zone_id = cur.lastrowid
conn.commit()
conn.close()
return jsonify({"ok": True, "id": zone_id})'''
)
# 5. 修改 dispatch_task
s = s.replace(
''' global _task_id_counter
data = request.get_json(force=True)
soldier_id = data.get("soldier_id", "unknown")
_task_id_counter += 1''',
''' data = request.get_json(force=True)
soldier_id = data.get("soldier_id", "unknown")'''
)
s = s.replace(
''' "id": "#" + str(_task_id_counter).zfill(3),''',
''' "id": _next_task_id(),'''
)
# 6. 修改 sos
s = s.replace(
''' # 同时标记为危险区域
global _danger_id_counter
_danger_id_counter += 1
conn.execute('''',
''' # 同时标记为危险区域
conn.execute(''''
)
with open(APP_PATH, "w", encoding="utf-8") as f:
f.write(s)
# 语法检查
result = os.system(f"python3 -m py_compile {APP_PATH}")
if result == 0:
print("✅ 修复完成,语法检查通过")
else:
print("❌ 语法检查失败,已恢复备份")
os.system(f"cp {bak} {APP_PATH}")
sys.exit(1)