Files
root cc5d96e226 大改造:施工进度系统+模板管理+物流收货+分包评分
- 新增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,增加施工进度预览条和进入施工管理按钮
- 菜单更新:施工管理增加施工总览子菜单,后台管理增加工程模板管理
2026-05-15 12:25:08 +08:00

70 lines
3.2 KiB
JavaScript

const express = require('express');
const db = require('../db');
const router = express.Router();
router.post('/', async (req, res) => {
try {
const { purchase_order_id, logistics_record_id, confirm_date, receiver_name, receiver_phone, received_location, is_complete, missing_items, damage_items, photo_urls, remark, confirmed_by } = req.body;
if (!purchase_order_id) {
return res.status(400).json({ success: false, message: '采购订单ID不能为空' });
}
const result = await db.query(
`INSERT INTO receiving_confirms (purchase_order_id, logistics_record_id, confirm_date, receiver_name, receiver_phone, received_location, is_complete, missing_items, damage_items, photo_urls, remark, confirmed_by)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING id`,
[purchase_order_id, logistics_record_id || null, confirm_date || new Date().toISOString().slice(0, 10), receiver_name || '', receiver_phone || '', received_location || '', is_complete !== false, missing_items || '', damage_items || '', photo_urls || [], remark || '', confirmed_by || null]
);
if (is_complete) {
await db.query("UPDATE purchase_orders SET receiving_status = 'received' WHERE id = $1", [purchase_order_id]);
} else {
await db.query("UPDATE purchase_orders SET receiving_status = 'partial_received' WHERE id = $1", [purchase_order_id]);
}
if (logistics_record_id) {
await db.query("UPDATE logistics_records SET status = 'arrived', final_arrival_date = CURRENT_DATE WHERE id = $1", [logistics_record_id]);
}
res.json({ success: true, message: '收货确认成功', data: { id: result.rows[0].id } });
} catch (error) {
console.error('收货确认失败:', error);
res.status(500).json({ success: false, message: '收货确认失败' });
}
});
router.get('/:purchase_order_id', async (req, res) => {
try {
const result = await db.query(
'SELECT * FROM receiving_confirms WHERE purchase_order_id = $1 ORDER BY created_at DESC',
[req.params.purchase_order_id]
);
res.json({ success: true, data: result.rows });
} catch (error) {
console.error('获取收货记录失败:', error);
res.status(500).json({ success: false, message: '获取收货记录失败' });
}
});
router.put('/:id', async (req, res) => {
try {
const { id } = req.params;
const fields = ['confirm_date', 'receiver_name', 'receiver_phone', 'received_location', 'is_complete', 'missing_items', 'damage_items', 'photo_urls', 'remark'];
const updates = [];
const values = [];
let paramIndex = 1;
for (const field of fields) {
if (req.body[field] !== undefined) {
updates.push(`${field} = $${paramIndex++}`);
values.push(req.body[field]);
}
}
if (updates.length === 0) {
return res.status(400).json({ success: false, message: '没有更新数据' });
}
values.push(id);
await db.query(`UPDATE receiving_confirms SET ${updates.join(', ')} WHERE id = $${paramIndex}`, values);
res.json({ success: true, message: '收货记录更新成功' });
} catch (error) {
console.error('更新收货记录失败:', error);
res.status(500).json({ success: false, message: '更新收货记录失败' });
}
});
module.exports = router;