Files
opc-manager/backend/migrations/columns.py
mac 34786ba9e5 产品迭代表格化 + 财务总视图/月度视图 + 总工作台
产品迭代:
- 卡片改表格(10列),5个日期内联编辑,后端日期校验
- 表头排序,新增未开始状态,详情页耗时统计
- 删除 owner/platform/feature_list 字段

财务:
- 新增总视图和月度视图,去除确收/毛利和回款/应付视图
- 月度流水加已付列,费用改应付
- 月份选择器,表格居中对齐
- 去除流程项目/流程金额卡片

总工作台:
- 聚合所有工作台首页数据
- 只显示首页tab,隐藏4个模块卡片
2026-07-02 17:55:40 +08:00

82 lines
4.3 KiB
Python

"""migrations/columns.py — 加列迁移(老表补字段,幂等)"""
def _add_column_if_missing(conn, table, column, ddl):
"""检查列是否存在,不存在才加(幂等)"""
from flask_app import _exec, mysql, logger
cur = conn.cursor(dictionary=True)
cur.execute(f"SHOW COLUMNS FROM {table} LIKE %s", (column,))
exists = cur.fetchone()
cur.close()
if not exists:
try:
_exec(conn, ddl)
print(f"[migrate] {table}.{column} 列已添加")
except mysql.connector.Error as e:
logger.debug(f"add column {table}.{column} skipped: {e}")
def migrate_add_columns():
"""为老表补齐后续新增的字段"""
from flask_app import db
conn = db()
try:
# tenant 字段(多工作台支持)
for table in ["sales_leads", "follow_up_records", "business_proposals",
"operation_projects", "product_versions", "finance_records",
"project_tasks"]:
_add_column_if_missing(conn, table, "tenant",
f"ALTER TABLE {table} ADD COLUMN tenant VARCHAR(100) NOT NULL DEFAULT '科普·无界'")
# business_proposals 扩展字段
_add_column_if_missing(conn, "business_proposals", "proposal_type",
"ALTER TABLE business_proposals ADD COLUMN proposal_type VARCHAR(100) NOT NULL DEFAULT '业务方案'")
_add_column_if_missing(conn, "business_proposals", "notes",
"ALTER TABLE business_proposals ADD COLUMN notes VARCHAR(2000) NOT NULL DEFAULT ''")
# product_versions 扩展字段
_add_column_if_missing(conn, "product_versions", "priority",
"ALTER TABLE product_versions ADD COLUMN priority VARCHAR(10) NOT NULL DEFAULT 'P2'")
_add_column_if_missing(conn, "product_versions", "start_date",
"ALTER TABLE product_versions ADD COLUMN start_date VARCHAR(30) NOT NULL DEFAULT ''")
_add_column_if_missing(conn, "product_versions", "plan_date",
"ALTER TABLE product_versions ADD COLUMN plan_date VARCHAR(30) NOT NULL DEFAULT ''")
_add_column_if_missing(conn, "product_versions", "dev_done_date",
"ALTER TABLE product_versions ADD COLUMN dev_done_date VARCHAR(30) NOT NULL DEFAULT ''")
_add_column_if_missing(conn, "product_versions", "test_date",
"ALTER TABLE product_versions ADD COLUMN test_date VARCHAR(30) NOT NULL DEFAULT ''")
_add_column_if_missing(conn, "product_versions", "devs",
"ALTER TABLE product_versions ADD COLUMN devs VARCHAR(500) NOT NULL DEFAULT ''")
_add_column_if_missing(conn, "product_versions", "testers",
"ALTER TABLE product_versions ADD COLUMN testers VARCHAR(500) NOT NULL DEFAULT ''")
# project_tasks 扩展字段
_add_column_if_missing(conn, "project_tasks", "status",
"ALTER TABLE project_tasks ADD COLUMN status VARCHAR(50) NOT NULL DEFAULT '未开始'")
_add_column_if_missing(conn, "project_tasks", "sort_order",
"ALTER TABLE project_tasks ADD COLUMN sort_order INT NOT NULL DEFAULT 0")
_add_column_if_missing(conn, "project_tasks", "priority",
"ALTER TABLE project_tasks ADD COLUMN priority VARCHAR(10) NOT NULL DEFAULT 'P2'")
# project_finances 12 个月度预算字段(确收/毛利/回款/费用)
for m in ["01","02","03","04","05","06","07","08","09","10","11","12"]:
for field in ["rev", "gross", "payment", "cost"]:
col = f"{field}_2026_{m}"
_add_column_if_missing(conn, "project_finances", col,
f"ALTER TABLE project_finances ADD COLUMN {col} DOUBLE NOT NULL DEFAULT 0")
# project_finances 总视图字段:已回款 / 应付 / 已付
_add_column_if_missing(conn, "project_finances", "total_payment",
"ALTER TABLE project_finances ADD COLUMN total_payment DOUBLE NOT NULL DEFAULT 0")
_add_column_if_missing(conn, "project_finances", "total_cost",
"ALTER TABLE project_finances ADD COLUMN total_cost DOUBLE NOT NULL DEFAULT 0")
_add_column_if_missing(conn, "project_finances", "total_paid",
"ALTER TABLE project_finances ADD COLUMN total_paid DOUBLE NOT NULL DEFAULT 0")
conn.commit()
print("[migrate] 加列迁移完成")
finally:
conn.close()