Files
company-ai-platform/app/modules/business/constants.py
JiuContinent 9cf7c44393 ```
feat: 添加生命周期报告和AI规则管理功能

- 在Dockerfile中添加pillow依赖包用于图像处理
- 实现生命周期报告调度任务,支持日报和周报两种类型
- 新增TASK_RUN_LIFECYCLE任务常量和相关配置选项
- 扩展AI Agent服务以支持用户规则,并在分析时应用规则
- 添加AI用户规则创建、更新和查询接口
- 增加项目生命周期和财务需求分析技能
- 扩展现有模型以支持更完整的业务数据字段
- 实现飞书图片上传功能用于报告展示
```
2026-07-12 17:44:49 +08:00

178 lines
4.0 KiB
Python

from enum import StrEnum
class StatusValue(StrEnum):
INITIATED = "立项"
TODO = "待办"
DRAFT = "草稿"
POLICY_DRAFT = "草案"
VALID = "有效"
APPROVING = "审批中"
PENDING_APPROVAL = "待审批"
PENDING = "pending"
ACCEPTED = "验收"
COMPLETED_CN = "已完成"
DONE_CN = "完成"
REVIEWED = "复盘"
ARCHIVED = "归档"
CLOSED_CN = "关闭"
CLOSED = "closed"
RESOLVED = "resolved"
DONE = "done"
COMPLETED = "completed"
GENERATED = "已生成"
UNKNOWN = "未知"
PAID = "已付款"
UNPAID = "未付款"
UNDELIVERED = "未到货"
INVOICE_NOT_RECEIVED = "未收票"
NORMAL = "normal"
NORMAL_CN = "正常"
LATE = "迟到"
LEAVE_EARLY = "早退"
MISSING_PUNCH = "缺卡"
ABSENT = "旷工"
ABNORMAL = "异常"
OPEN = "open"
RUNNING = "running"
RUNNING_CN = "执行中"
DRY_RUN = "dry_run"
class RiskLevel(StrEnum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class PriorityValue(StrEnum):
P2 = "P2"
class SourceSystem(StrEnum):
INTERNAL = "internal"
LEGACY_MYSQL = "legacy_mysql"
class CashFlowDirection(StrEnum):
INFLOW = "inflow"
OUTFLOW = "outflow"
class CashFlowType(StrEnum):
CONTRACT_RECEIVABLE = "contract_receivable"
PROJECT_FUND = "project_fund"
class DataQualityStatus(StrEnum):
VALID = "valid"
ORPHAN_CONTRACT = "orphan_contract"
ORPHAN_PROJECT = "orphan_project"
DELETED_PROJECT = "deleted_project"
PAID_AMOUNT_MISSING = "paid_amount_missing"
STATUS_AMOUNT_MISMATCH = "status_amount_mismatch"
class AccountType(StrEnum):
BANK = "bank"
class VersionValue(StrEnum):
V1_0 = "v1.0"
class BusinessDomain(StrEnum):
PROJECTS = "projects"
TASKS = "tasks"
PROCUREMENTS = "procurements"
EXPENSES = "expenses"
FUND_ACCOUNTS = "fund-accounts"
POLICIES = "policies"
STANDARDS = "standards"
PERFORMANCE_METRICS = "performance-metrics"
SUPPLIERS = "suppliers"
ATTENDANCE_RECORDS = "attendance-records"
WORK_REPORTS = "work-reports"
RISK_EVENTS = "risk-events"
LEGACY_SYNC_RUNS = "legacy-sync-runs"
class BusinessResponseKey(StrEnum):
DOMAINS = "domains"
DOMAIN = "domain"
TOTAL = "total"
ITEMS = "items"
DATA = "data"
class BusinessField(StrEnum):
ID = "id"
STATUS = "status"
class BusinessErrorDetail(StrEnum):
RECORD_NOT_FOUND = "Record not found"
UNKNOWN_FIELD_TEMPLATE = "Unknown field '{field}'"
READ_ONLY_FIELD_TEMPLATE = "Field '{field}' is read-only"
INVALID_FIELD_VALUE_TEMPLATE = "Invalid value for field '{field}'"
class RiskEventType(StrEnum):
OVERDUE_TASK = "overdue_task"
DELAYED_PROJECT = "delayed_project"
OVER_BUDGET_PROJECT = "over_budget_project"
FUND_SAFETY_LINE = "fund_safety_line"
SUPPLIER_RISK = "supplier_risk"
DONE_STATUSES = frozenset(
{
StatusValue.DONE_CN,
StatusValue.COMPLETED_CN,
StatusValue.CLOSED_CN,
StatusValue.DONE,
StatusValue.COMPLETED,
StatusValue.CLOSED,
}
)
PENDING_APPROVAL_STATUSES = frozenset(
{
StatusValue.DRAFT,
StatusValue.APPROVING,
StatusValue.PENDING_APPROVAL,
StatusValue.PENDING,
}
)
PROJECT_CLOSED_STATUSES = frozenset(
{
StatusValue.ACCEPTED,
StatusValue.COMPLETED_CN,
StatusValue.REVIEWED,
StatusValue.ARCHIVED,
StatusValue.CLOSED_CN,
StatusValue.CLOSED,
}
)
ATTENDANCE_ABNORMAL_STATUSES = frozenset(
{
StatusValue.LATE,
StatusValue.LEAVE_EARLY,
StatusValue.MISSING_PUNCH,
StatusValue.ABSENT,
StatusValue.ABNORMAL,
}
)
SUPPLIER_RISK_LEVELS = frozenset({RiskLevel.MEDIUM, RiskLevel.HIGH})
CLOSED_RISK_STATUSES = frozenset({StatusValue.CLOSED, StatusValue.RESOLVED})
GENERATED_RISK_EVENT_TYPES = frozenset(
{
RiskEventType.OVERDUE_TASK,
RiskEventType.DELAYED_PROJECT,
RiskEventType.OVER_BUDGET_PROJECT,
RiskEventType.FUND_SAFETY_LINE,
RiskEventType.SUPPLIER_RISK,
}
)