核心重构: - 提取 renderView() / tdRow() 统一函数,消除三视图 16000+ 字符重复代码 - METRIC_CARDS 配置驱动,调整卡片顺序/单位只需改配置 - 筛选区统一为下拉框(视图 + 状态 + 日期),删除筛选:前缀 - 日历选择器移至顶部工具栏,卡片内不再重复 功能优化: - 项目状态简化为已签约/待签约 - 新增签约项目总数卡片(月度/季度按签约月份过滤) - 签约金额/已确收/已回款/应付/已付改为万元单位 - 项目名称固定300px + 省略号 + title悬停 - body min-width 1400px + overflow-x:auto - 首页费用金额→应付金额 代码清理: - 删除 monthOpts/quarterOpts/qLabels 等死代码 - 删除 purchase.js(采购→费用模块已另表迁移) - 财务→项目(侧边栏),采购→费用(全域重命名)
177 lines
6.9 KiB
Python
177 lines
6.9 KiB
Python
"""migrations/tables.py — 建表迁移(所有表的 CREATE TABLE IF NOT EXISTS)"""
|
||
|
||
|
||
def migrate_create_tables():
|
||
"""确保所有业务表存在(幂等)"""
|
||
from db import db, _exec, mysql, logger
|
||
|
||
conn = db()
|
||
try:
|
||
tables = [
|
||
"""CREATE TABLE IF NOT EXISTS sales_leads (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
target_customer VARCHAR(1000) NOT NULL,
|
||
priority VARCHAR(1000) NOT NULL DEFAULT 'P1',
|
||
status VARCHAR(1000) NOT NULL DEFAULT '待跟进',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS follow_up_records (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
target_type VARCHAR(1000) NOT NULL,
|
||
target_id INT NOT NULL,
|
||
followed_at VARCHAR(1000) NOT NULL DEFAULT '',
|
||
follower VARCHAR(1000) NOT NULL DEFAULT '慰心',
|
||
follow_up_method VARCHAR(1000) NOT NULL DEFAULT '记录',
|
||
content VARCHAR(1000) NOT NULL DEFAULT '',
|
||
next_action VARCHAR(1000) NOT NULL DEFAULT '',
|
||
next_follow_up_at VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS business_proposals (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
customer_or_project_name VARCHAR(1000) NOT NULL,
|
||
version VARCHAR(1000) NOT NULL,
|
||
description VARCHAR(1000) NOT NULL DEFAULT '',
|
||
status VARCHAR(1000) NOT NULL DEFAULT '草稿',
|
||
created_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS operation_projects (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
project_name VARCHAR(1000) NOT NULL,
|
||
project_version VARCHAR(1000) NOT NULL DEFAULT 'v1.0',
|
||
project_type VARCHAR(1000) NOT NULL DEFAULT 'opportunity',
|
||
project_status VARCHAR(1000) NOT NULL DEFAULT '',
|
||
current_stage VARCHAR(1000) NOT NULL DEFAULT '',
|
||
owner VARCHAR(1000) NOT NULL DEFAULT '慰心',
|
||
start_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
end_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
target_customer VARCHAR(1000) NOT NULL DEFAULT '',
|
||
customer_need VARCHAR(1000) NOT NULL DEFAULT '',
|
||
expected_contract_amount DOUBLE NOT NULL DEFAULT 0,
|
||
expected_sign_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
sign_probability DOUBLE NOT NULL DEFAULT 0,
|
||
next_action VARCHAR(1000) NOT NULL DEFAULT '',
|
||
related_business_proposal_id INTEGER,
|
||
sop_file_id INTEGER,
|
||
sop_stage VARCHAR(1000) NOT NULL DEFAULT '',
|
||
execution_progress DOUBLE NOT NULL DEFAULT 0,
|
||
current_deliverable VARCHAR(1000) NOT NULL DEFAULT '',
|
||
risks VARCHAR(1000) NOT NULL DEFAULT '',
|
||
notes VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS product_versions (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
product_name VARCHAR(1000) NOT NULL,
|
||
version VARCHAR(1000) NOT NULL,
|
||
version_goal VARCHAR(1000) NOT NULL DEFAULT '',
|
||
feature_list VARCHAR(1000) NOT NULL DEFAULT '',
|
||
launch_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
status VARCHAR(1000) NOT NULL DEFAULT '规划中',
|
||
notes VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS finance_records (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
month VARCHAR(1000) NOT NULL,
|
||
project_name VARCHAR(1000) NOT NULL DEFAULT '科普(慰心斋)',
|
||
record_type VARCHAR(1000) NOT NULL,
|
||
category VARCHAR(1000) NOT NULL DEFAULT '',
|
||
amount DOUBLE NOT NULL DEFAULT 0,
|
||
occurred_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
notes VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS file_assets (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
module VARCHAR(1000) NOT NULL,
|
||
owner_id INT NOT NULL,
|
||
owner_version VARCHAR(1000) NOT NULL DEFAULT '',
|
||
file_category VARCHAR(1000) NOT NULL DEFAULT '',
|
||
file_name VARCHAR(1000) NOT NULL,
|
||
file_type VARCHAR(1000) NOT NULL DEFAULT '',
|
||
file_size INTEGER NOT NULL DEFAULT 0,
|
||
file_path VARCHAR(1000) NOT NULL,
|
||
is_external INTEGER NOT NULL DEFAULT 0,
|
||
notes VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS project_tasks (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
project_id INTEGER NOT NULL,
|
||
phase VARCHAR(1000) NOT NULL DEFAULT '',
|
||
milestone VARCHAR(1000) NOT NULL DEFAULT '',
|
||
task VARCHAR(1000) NOT NULL DEFAULT '',
|
||
owner VARCHAR(1000) NOT NULL DEFAULT '',
|
||
due_date VARCHAR(1000) NOT NULL DEFAULT '',
|
||
blockers VARCHAR(1000) NOT NULL DEFAULT '',
|
||
notes VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS users (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
username VARCHAR(100) NOT NULL UNIQUE,
|
||
password_hash VARCHAR(255) NOT NULL,
|
||
display_name VARCHAR(100) NOT NULL,
|
||
role VARCHAR(50) NOT NULL DEFAULT 'opc_owner',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS user_tenants (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
user_id INT NOT NULL,
|
||
tenant VARCHAR(100) NOT NULL,
|
||
UNIQUE KEY (user_id, tenant)
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS project_finances (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
tenant VARCHAR(100) NOT NULL DEFAULT '科普·无界',
|
||
project_id VARCHAR(100) NOT NULL DEFAULT '',
|
||
business_type VARCHAR(100) NOT NULL DEFAULT '',
|
||
customer_name VARCHAR(200) NOT NULL DEFAULT '',
|
||
sign_amount DOUBLE NOT NULL DEFAULT 0,
|
||
sign_month VARCHAR(20) NOT NULL DEFAULT '',
|
||
status VARCHAR(50) NOT NULL DEFAULT '待签约',
|
||
sales_person VARCHAR(100) NOT NULL DEFAULT '',
|
||
total_rev DOUBLE NOT NULL DEFAULT 0,
|
||
total_gross DOUBLE NOT NULL DEFAULT 0,
|
||
budget_data TEXT,
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
"""CREATE TABLE IF NOT EXISTS expense_records (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
tenant VARCHAR(100) NOT NULL DEFAULT '科普·无界',
|
||
project_name VARCHAR(200) NOT NULL DEFAULT '',
|
||
purchase_item VARCHAR(300) NOT NULL DEFAULT '',
|
||
supplier VARCHAR(200) NOT NULL DEFAULT '',
|
||
amount DOUBLE NOT NULL DEFAULT 0,
|
||
purchase_date VARCHAR(30) NOT NULL DEFAULT '',
|
||
status VARCHAR(50) NOT NULL DEFAULT '待审批',
|
||
category VARCHAR(100) NOT NULL DEFAULT '',
|
||
notes VARCHAR(1000) NOT NULL DEFAULT '',
|
||
created_at VARCHAR(30) NOT NULL DEFAULT '',
|
||
updated_at VARCHAR(30) NOT NULL DEFAULT ''
|
||
)""",
|
||
]
|
||
|
||
for ddl in tables:
|
||
try:
|
||
_exec(conn, ddl)
|
||
conn.commit()
|
||
except mysql.connector.Error as e:
|
||
logger.debug(f"create table skipped: {e}")
|
||
conn.commit()
|
||
|
||
print("[migrate] 所有业务表已就绪")
|
||
finally:
|
||
conn.close()
|