samruk-ai-agent/server.py

134 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import io
import os
from datetime import datetime
from flask import Flask, request, jsonify
from flask_cors import CORS
import requests as http_requests
app = Flask(__name__)
CORS(app)
HSE_API_URL = "https://hse.sk.kz/api/v1"
DATA_DIR = os.path.join(os.path.dirname(__file__), "data")
os.makedirs(DATA_DIR, exist_ok=True)
def make_docx(report):
from docx import Document
from docx.shared import Pt
doc = Document()
doc.styles["Normal"].font.size = Pt(11)
doc.add_heading("План ПБ — Казахтелеком", level=1)
s = report.get("summary", {})
doc.add_paragraph(
f"Дата: {datetime.now().strftime('%d.%m.%Y')} | "
f"Всего: {s.get('total', 0)} | "
f"Выполнено: {s.get('done', 0)} ({s.get('pct', 0)}%)"
)
events = report.get("events", [])
table = doc.add_table(rows=1, cols=6)
table.style = "Light Grid Accent 1"
for i, h in enumerate(["N", "Мероприятие", "Филиал", "Срок", "Статус", "%"]):
table.rows[0].cells[i].text = h
for e in events:
row = table.add_row().cells
row[0].text = str(e.get("id", ""))
row[1].text = str(e.get("title", ""))[:100]
row[2].text = str(e.get("branch", ""))
row[3].text = str(e.get("deadline", ""))
row[4].text = str(e.get("status", ""))
row[5].text = str(e.get("progress", 0)) + "%"
buf = io.BytesIO()
doc.save(buf)
buf.seek(0)
return buf
def make_pdf(report):
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import mm
from reportlab.lib.colors import HexColor
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
buf = io.BytesIO()
doc = SimpleDocTemplate(buf, pagesize=A4, rightMargin=20 * mm, leftMargin=20 * mm,
topMargin=20 * mm, bottomMargin=20 * mm)
styles = getSampleStyleSheet()
story = [Paragraph("План ПБ — Казахтелеком", styles["Title"]), Spacer(1, 10)]
s = report.get("summary", {})
story.append(Paragraph(
f"Всего: {s.get('total', 0)} | Выполнено: {s.get('done', 0)} ({s.get('pct', 0)}%)",
styles["Normal"]
))
story.append(Spacer(1, 10))
data = [["N", "Мероприятие", "Филиал", "Срок", "Статус", "%"]]
for e in report.get("events", []):
data.append([
str(e.get("id", "")), str(e.get("title", ""))[:80],
str(e.get("branch", ""))[:25], str(e.get("deadline", "")),
str(e.get("status", "")), str(e.get("progress", 0)) + "%",
])
table = Table(data, colWidths=[20, 220, 80, 50, 60, 40])
table.setStyle(TableStyle([
("FONTSIZE", (0, 0), (-1, 0), 9), ("FONTSIZE", (0, 1), (-1, -1), 8),
("BACKGROUND", (0, 0), (-1, 0), HexColor("#003366")),
("TEXTCOLOR", (0, 0), (-1, 0), HexColor("#FFFFFF")),
("GRID", (0, 0), (-1, -1), 0.5, HexColor("#CCCCCC")),
("VALIGN", (0, 0), (-1, -1), "TOP"),
]))
story.append(table)
doc.build(story)
buf.seek(0)
return buf
@app.route("/api/hse/send", methods=["POST"])
def hse_send():
data = request.get_json()
month = data.get("month", "")
api_key = data.get("api_key", "")
fmt = data.get("format", "word")
report = data.get("report", {})
endpoint = data.get("endpoint", f"{HSE_API_URL}/documents/upload")
if not api_key:
return jsonify({"ok": False, "error": "API key required"}), 400
if fmt == "pdf":
buf = make_pdf(report)
mime = "application/pdf"
ext = "pdf"
else:
buf = make_docx(report)
mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
ext = "docx"
try:
files = {"file": (f"hse_report_{month}.{ext}", buf.getvalue(), mime)}
headers = {"Authorization": f"Bearer {api_key}"}
payload = {
"title": f"Сводный отчет по ПБ за {month}",
"description": "Автоматический отчет платформы мониторинга ПБ",
"type": "safety_report",
"period": month,
}
r = http_requests.post(endpoint, files=files, data=payload, headers=headers, timeout=30)
if r.ok:
return jsonify({"ok": True, "hse_response": r.json() if r.text else {"status": r.status_code}})
return jsonify({"ok": False, "error": f"HSE API error: {r.status_code}", "detail": r.text[:500]}), 502
except Exception as e:
return jsonify({"ok": False, "error": str(e)}), 502
@app.route("/api/health", methods=["GET"])
def health():
return jsonify({"ok": True, "time": datetime.now().isoformat()})
if __name__ == "__main__":
print("HSE Integration Server — http://0.0.0.0:5000")
app.run(host="0.0.0.0", port=5000, debug=False)