大改造:施工进度系统+模板管理+物流收货+分包评分

- 新增5张数据库表:logistics_records, receiving_confirms, project_type_templates, project_phases, subcontractor_events
- 修改3张表:projects(增加type_template_id/current_phase/phase_progress), purchase_orders(增加expected_delivery_date/receiving_status), subcontractors(增加score/initial_score)
- 插入5套预设工程模板(配电安装/架空线路/电缆敷设/变电站/小型工程)
- 后端新增:模板管理API、项目阶段管理API、收货确认API、分包商事件API
- 后端修改:项目创建/预算签约支持模板选择,自动初始化阶段
- 前端新增:工程模板设计器(后台管理)、施工总览页、施工进度页(手机友好)
- 前端修改:项目详情页重构为7个Tab,增加施工进度预览条和进入施工管理按钮
- 菜单更新:施工管理增加施工总览子菜单,后台管理增加工程模板管理
This commit is contained in:
root
2026-05-15 12:25:08 +08:00
parent fad28741bd
commit cc5d96e226
13 changed files with 1761 additions and 648 deletions
+18
View File
@@ -255,6 +255,7 @@ router.put('/:id/sign', authenticate, async (req, res) => {
);
let project_id = projectResult.rows[0].project_id;
const { type_template_id } = req.body;
if (!project_id) {
const projResult = await db.query(
`INSERT INTO projects (name, customer_id, project_manager_id, status, created_at, updated_at)
@@ -265,6 +266,23 @@ router.put('/:id/sign', authenticate, async (req, res) => {
);
project_id = projResult.rows[0].id;
await db.query('UPDATE budget_projects SET project_id = $1 WHERE id = $2', [project_id, id]);
if (type_template_id) {
const tplResult = await db.query('SELECT phases FROM project_type_templates WHERE id = $1', [type_template_id]);
if (tplResult.rows.length > 0) {
const phases = tplResult.rows[0].phases;
if (Array.isArray(phases)) {
for (const phase of phases) {
const subItems = (phase.sub_items || []).map(item => ({ name: item, completed: false }));
await db.query(
`INSERT INTO project_phases (project_id, template_key, phase_name, phase_order, phase_type, depends_on, sub_items, status) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,
[project_id, phase.key || `phase_${phase.order}`, phase.name, phase.order, phase.type || 'serial', phase.depends || [], JSON.stringify(subItems), phase.order === 1 ? 'in_progress' : 'pending']
);
}
const firstPhase = phases.find(p => p.order === 1);
await db.query('UPDATE projects SET type_template_id = $1, current_phase = $2 WHERE id = $3', [type_template_id, firstPhase ? firstPhase.name : '', project_id]);
}
}
}
}
res.json({