| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #!/usr/bin/env python3
- """Seed recent tenant/factory-scoped S8 exception lifecycle facts."""
- from __future__ import annotations
- import argparse
- import json
- from datetime import datetime, timedelta
- from typing import Any
- from apply_sql_file import connect
- DEFAULT_TENANT = 838257186181189
- DEFAULT_FACTORY = 1
- PREFIX = "UAT-S8-A-"
- def seed(tenant_id: int, factory_id: int, dry_run: bool) -> dict[str, Any]:
- result: dict[str, Any] = {
- "tenantId": tenant_id,
- "factoryId": factory_id,
- "dryRun": dry_run,
- "exceptions": 14,
- "closed": 10,
- }
- conn = connect()
- try:
- conn.begin()
- with conn.cursor() as cur:
- if not dry_run:
- cur.execute(
- "DELETE FROM ado_s8_exception WHERE tenant_id=%s AND exception_code LIKE %s",
- (tenant_id, f"{PREFIX}%"),
- )
- now = datetime.now().replace(microsecond=0)
- for index in range(14):
- seq = index + 1
- source_module = f"S{index % 7 + 1}"
- created_at = now - timedelta(days=13 - index, hours=6)
- is_closed = index < 10
- closed_at = created_at + timedelta(hours=2 + index % 8) if is_closed else None
- status = "CLOSED" if is_closed else "ASSIGNED"
- severity = ("LOW", "MEDIUM", "HIGH", "CRITICAL")[index % 4]
- code = f"{PREFIX}{seq:03d}"
- cur.execute(
- """
- INSERT INTO ado_s8_exception
- (tenant_id,factory_id,exception_code,title,description,scene_code,source_type,
- status,severity,priority_score,priority_level,
- occurrence_dept_id,responsible_dept_id,responsible_group_id,
- assignee_id,reporter_id,sla_deadline,timeout_flag,
- created_at,updated_at,assigned_at,closed_at,is_deleted,
- created_by,updated_by,process_node_code,related_object_code,module_code,
- exception_type_code,source_payload,dedup_key,last_detected_at,
- consecutive_hit_count,consecutive_miss_count,stage_code,rule_mechanism)
- VALUES
- (%s,%s,%s,%s,%s,'UAT_OPERATIONS','UAT_GENERATOR',
- %s,%s,%s,%s,
- 1,1,1,1,1,%s,0,
- %s,%s,%s,%s,0,
- 'UAT_GENERATOR','UAT_GENERATOR','UAT_STAGE',%s,%s,
- 'UAT_EXCEPTION',%s,%s,%s,
- 1,0,%s,'RULE')
- """,
- (
- tenant_id,
- factory_id,
- code,
- f"UAT 异常事件 {seq:03d}",
- "用于验证 S8 异常数量与处理时效正式汇总链",
- status,
- severity,
- 60 + index,
- "P1" if severity in ("HIGH", "CRITICAL") else "P2",
- created_at + timedelta(hours=12),
- created_at,
- closed_at or created_at + timedelta(hours=1),
- created_at + timedelta(minutes=15),
- closed_at,
- f"UAT-OBJECT-{seq:03d}",
- source_module,
- json.dumps({"source": "uat", "seq": seq}, ensure_ascii=False),
- code,
- closed_at or created_at + timedelta(hours=1),
- source_module,
- ),
- )
- if dry_run:
- conn.rollback()
- else:
- conn.commit()
- except Exception:
- conn.rollback()
- raise
- finally:
- conn.close()
- return result
- def main() -> None:
- parser = argparse.ArgumentParser()
- parser.add_argument("--tenant", type=int, default=DEFAULT_TENANT)
- parser.add_argument("--factory", type=int, default=DEFAULT_FACTORY)
- parser.add_argument("--dry-run", action="store_true")
- args = parser.parse_args()
- print(json.dumps(seed(args.tenant, args.factory, args.dry_run), ensure_ascii=False, indent=2))
- if __name__ == "__main__":
- main()
|