#!/usr/bin/env python3 """汇总管理会计OS管理能力报告""" import json, urllib.request import os # noqa: E402 (凭据加载器需要) # ---- 管理员凭据同源加载(2026-09-14 cma-defaultcred-code-fix)---- # 生产凭据只存 600 密钥文件;禁止在脚本/文档/日志里硬编码口令。 # 顺序:$CMA_ADMIN_ENV → wecom-ops 主副本(ops 轮换落点,权威) → 本 profile 副本。 def _admin_creds(): """返回 (user, password, 来源文件);未找到 → 显式报错退出(不静默退回默认口令)""" for p in (os.environ.get("CMA_ADMIN_ENV"), "/root/.hermes/profiles/wecom-ops/.secrets/cma-admin.env", "/root/.hermes/profiles/wecom-fullstack/.secrets/cma-admin.env"): if p and os.path.isfile(p): kv = {} for line in open(p, encoding="utf-8"): line = line.strip() if "=" in line and not line.startswith("#"): k, v = line.split("=", 1) kv[k.strip()] = v.strip().strip('"').strip("'") if kv.get("CMA_ADMIN_USER") and kv.get("CMA_ADMIN_PASS"): return kv["CMA_ADMIN_USER"], kv["CMA_ADMIN_PASS"], p raise SystemExit("[错误] 未找到 CMA 管理员凭据:请设 $CMA_ADMIN_ENV,或准备 600 权限密钥文件 " ".secrets/cma-admin.env(键名 CMA_ADMIN_USER / CMA_ADMIN_PASS)") ADMIN_USER, ADMIN_PASS, CRED_SRC = _admin_creds() print(f"[creds] 来源={CRED_SRC} 账号={ADMIN_USER}(口令不回显)") BASE = "http://127.0.0.1:8010" def login(): data = json.dumps({"username":ADMIN_USER,"password":ADMIN_PASS}).encode() req = urllib.request.Request(BASE + "/api/cma/auth/login", data=data, headers={"Content-Type":"application/json"}, method="POST") resp = json.loads(urllib.request.urlopen(req).read()) return resp["token"] def api(path, token): auth = "Bearer " + token req = urllib.request.Request(BASE + path, headers={"Authorization": auth}) resp = json.loads(urllib.request.urlopen(req).read()) return resp token = login() report = { "战略管理": { "战略地图": { "状态": "✅ 已实现", "数据": api("/api/cma/maps", token).get("data", [{}])[0].get("title", "未知"), "说明": "1张已发布的战略地图,支持创建/编辑/发布", "接口": ["GET/POST/PUT /api/cma/maps"], }, "KPI字典": { "状态": "✅ 已实现", "数据数": len(api("/api/cma/kpis", token).get("data", [])), "维度分布": str(api("/api/cma/dashboard/summary", token).get("dimension_stats", [])), "说明": "10个KPI覆盖4维度(财务4/客户3/流程2/学习1),含阈值配置", "接口": ["CRUD /api/cma/kpis", "阈值建议 GET /api/cma/thresholds/suggest/{id}"], }, }, "驾驶舱": { "多角色视图": { "状态": "✅ 已实现", "角色": ["CEO(仅读+审批)", "财务(读写导入导出)", "业务(读写)", "IT(读写删除管理)"], "模块数": {"ceo":10, "finance":7, "business":4, "it":7}, }, "数据展示": { "状态": "✅ 已实现", "KPI总数": api("/api/cma/dashboard/summary", token).get("kpi_total"), "预警数": api("/api/cma/dashboard/summary", token).get("alert_count"), "布局": "双栏布局(2/3主数据+1/3预测面板),异常高亮+摘要卡片", }, "AI分析": { "状态": "✅ 已实现", "功能": "驾驶舱AI分析(SSE流式)、单KPI深度分析、问答、计划审核", "调用": "DeepSeek API", }, "预测": { "状态": "✅ 已实现", "接口": "GET /api/cma/dashboard/predict — 基于历史数据预测下期", }, }, "数据管理": { "ERP接入": { "状态": "✅ 已实现", "数据源": "1个(测试ERP),通过erp-api-gateway(8300)连接SQL Server", "引擎": "calc_engine.py 从科目余额表+销售报表计算KPI", }, "Excel导入": { "状态": "✅ 已实现", "接口": "POST /api/cma/data/import-excel", }, "数据源管理": { "状态": "✅ 已实现", "接口": "CRUD /api/cma/data/sources", }, "定时同步": { "状态": "✅ 已实现", "cron": "每日凌晨1:00执行 daily_sync.py (ERP同步→预警检查→预警推送)", }, }, "预警管理": { "预警规则": { "状态": "✅ 已实现", "规则数": len(api("/api/cma/alert-rules", token).get("data", [])), "说明": "每个KPI配绿/黄/红三级阈值,支持>=/<=/>/ 100: val = val[:97] + "..." print(" %-12s %s" % (k, val)) print("\n" + "=" * 66) print(" 总结:共10大能力模块, 除2项P2待完善外, 其余全部完成") print(" 网址: https://cma.sxbh.ltd") print("=" * 66)