@ -11,11 +11,14 @@
t.project_name,
t.project_category,
t.project_status,
t .payment_method,
c .payment_method,
c.contract_id,
u1.nick_name AS manager_name,
d.dept_name,
CONCAT(t2.type_name, '/', t1.type_name) AS type_name,
<!-- 异常启动信息 -->
CASE WHEN t.contract_flag = '2' THEN '是' ELSE '否' END AS abnormal_startup,
CASE WHEN t.contract_flag = '2' THEN '无合同' ELSE NULL END AS abnormal_startup_reason,
<!-- 合同信息 -->
c.contract_date,
c.total_price AS contract_amount,
@ -26,59 +29,58 @@
b.budget_rate,
b.reduce_budget_cost,
b.reduce_budget_rate,
CASE WHEN b.contract_amount IS NOT NULL THEN ROUND(b.contract_amount / 1.13, 2) ELSE NULL END AS revenue,
b.net_contract_amount AS revenue,
<!-- 验收信息 -->
stages_sub.acceptance_plan_end_time AS expected_acceptance_time,
acc.acceptance_date,
<!-- 累计工时 -->
hours_sub.total_hours,
<!-- 产品数量 -->
mat_sub.product_amount,
<!-- 进度信息 (子查询 Pivot) -->
<!-- 1: 启动 -->
stages_sub.startup_plan_start_time,
stages_sub.startup_plan_end_time,
stages_sub.startup_real_start_time,
stages_sub.startup_real_end_time,
stages_sub.startup_reasons_explanation,
<!-- 2: 设计 -->
stages_sub.design_plan_start_time,
stages_sub.design_plan_end_time,
stages_sub.design_real_start_time,
stages_sub.design_real_end_time,
stages_sub.design_reasons_explanation,
stages_sub.purchase_plan_start_time,
stages_sub.purchase_plan_end_time,
stages_sub.purchase_real_start_time,
stages_sub.purchase_real_end_time,
stages_sub.purchase_reasons_explanation,
stages_sub.shipment _plan_start_time,
stages_sub.shipment _plan_end_time,
stages_sub.shipment _real_start_time,
stages_sub.shipment _real_end_time,
stages_sub.shipment_reasons_explanation,
stages_sub.implement _plan_start_time,
stages_sub.implement _plan_end_time,
stages_sub.implement _real_start_time,
stages_sub.implement _real_end_time,
stages_sub.implement_reasons_explanation,
stages_sub.debug_plan_start_time,
stages_sub.debug_plan_end_time,
stages_sub.debug_real_start_time,
stages_sub.debug_real_end_time,
stages_sub.debug_reasons_explanation,
stages_sub.pilot_run_plan_start_time,
stages_sub.pilot_run_plan_end_time,
stages_sub.pilot_run_real_start_time,
stages_sub.pilot_run_real_end_time,
stages_sub.pilot_run_reasons_explanation,
<!-- 3: 采购与发货 -->
stages_sub.purchase_shipment_ plan_start_time,
stages_sub.purchase_shipment_ plan_end_time,
stages_sub.purchase_shipment_ real_start_time,
stages_sub.purchase_shipment_ real_end_time,
<!-- 4: 开发 -->
stages_sub.develop _plan_start_time,
stages_sub.develop _plan_end_time,
stages_sub.develop _real_start_time,
stages_sub.develop _real_end_time,
<!-- 5: 组装调试(设备类) -->
stages_sub.assembly_debug _plan_start_time,
stages_sub.assembly_debug _plan_end_time,
stages_sub.assembly_debug _real_start_time,
stages_sub.assembly_debug _real_end_time,
<!-- 6: 实施与安装调试 -->
stages_sub.implement_ debug_plan_start_time,
stages_sub.implement_ debug_plan_end_time,
stages_sub.implement_ debug_real_start_time,
stages_sub.implement_ debug_real_end_time,
<!-- 7: 测试与试运行 -->
stages_sub.test_ pilot_run_plan_start_time,
stages_sub.test_ pilot_run_plan_end_time,
stages_sub.test_ pilot_run_real_start_time,
stages_sub.test_ pilot_run_real_end_time,
<!-- 8: 验收 -->
stages_sub.acceptance_plan_start_time,
stages_sub.acceptance_plan_end_time,
stages_sub.acceptance_real_start_time,
stages_sub. acceptance_real_end_time,
stages_sub.acceptance_reasons_explanation,
acc.acceptance_date AS acceptance_real_end_time,
<!-- 9: 质保 -->
stages_sub.warranty_plan_start_time,
stages_sub.warranty_plan_end_time,
stages_sub.warranty_real_start_time,
stages_sub.warranty_real_end_time,
stages_sub.warranty_reasons_explanation
stages_sub.warranty_real_end_time
FROM
erp_project_info t
LEFT JOIN erp_project_type t1 ON t1.project_type_id = t.project_type_id
@ -110,72 +112,64 @@
WHERE tp.del_flag = '0' AND ti.timesheet_status = '3'
GROUP BY tp.project_id
) hours_sub ON t.project_id = hours_sub.project_id
<!-- 产品数量(按合同聚合) -->
LEFT JOIN (
SELECT contract_id, SUM(amount) AS product_amount
FROM erp_contract_material
WHERE del_flag = '0'
GROUP BY contract_id
) mat_sub ON c.contract_id = mat_sub.contract_id
<!-- 进度信息 Pivot 子查询 -->
LEFT JOIN (
SELECT
s.project_id,
MAX(CASE WHEN d.dict_label = '启动' THEN s.plan_start_time END) AS startup_plan_start_time,
MAX(CASE WHEN d.dict_label = '启动' THEN s.plan_end_time END) AS startup_plan_end _time,
MAX(CASE WHEN d.dict_label = '启动' THEN s.real_start_time END) AS startup_real_start _time,
MAX(CASE WHEN d.dict_label = '启动' THEN s.real_end_time END) AS startup_real_end _time,
MAX(CASE WHEN d.dict_label = '启动' THEN s.reasons_explanation END) AS startup_reasons_explanation ,
<!-- 1: 启动 -->
MAX(CASE WHEN s.project_phases = '1' THEN s.plan_start_time END) AS startup_plan_start_time,
MAX(CASE WHEN s.project_phases = '1' THEN s.plan_end_time END) AS startup_plan_end_time,
MAX(CASE WHEN s.project_phases = '1' THEN s.real_start_time END) AS startup_real_start _time,
MAX(CASE WHEN s.project_phases = '1' THEN s.real_end_time END) AS startup_real_end_time ,
MAX(CASE WHEN d.dict_label = '设计' THEN s.plan_start_time END) AS design_plan_start_time,
MAX(CASE WHEN d.dict_label = '设计' THEN s.plan_end_time END) AS design_plan_end _time,
MAX(CASE WHEN d.dict_label = '设计' THEN s.real_start_time END) AS design_real_start _time,
MAX(CASE WHEN d.dict_label = '设计' THEN s.real_end_time END) AS design_real_end _time,
MAX(CASE WHEN d.dict_label = '设计' THEN s.reasons_explanation END) AS design_reasons_explanation ,
<!-- 2: 设计 -->
MAX(CASE WHEN s.project_phases = '2' THEN s.plan_start_time END) AS design_plan_start _time,
MAX(CASE WHEN s.project_phases = '2' THEN s.plan_end_time END) AS design_plan_end _time,
MAX(CASE WHEN s.project_phases = '2' THEN s.real_start_time END) AS design_real_start _time,
MAX(CASE WHEN s.project_phases = '2' THEN s.real_end_time END) AS design_real_end_time ,
MAX(CASE WHEN d.dict_label = '采购' THEN s.plan_start_time END) AS purchase_plan_start_time,
MAX(CASE WHEN d.dict_label = '采购' THEN s.plan_end_time END) AS purchase_plan_end _time,
MAX(CASE WHEN d.dict_label = '采购' THEN s.real_start_time END) AS purchase_real_start _time,
MAX(CASE WHEN d.dict_label = '采购' THEN s.real_end_time END) AS purchase_real_end _time,
MAX(CASE WHEN d.dict_label = '采购' THEN s.reasons_explanation END) AS purchase_reasons_explanation ,
<!-- 3: 采购与发货 -->
MAX(CASE WHEN s.project_phases = '3' THEN s.plan_start_time END) AS purchase_shipment_plan_start _time,
MAX(CASE WHEN s.project_phases = '3' THEN s.plan_end_time END) AS purchase_shipment_plan_end _time,
MAX(CASE WHEN s.project_phases = '3' THEN s.real_start_time END) AS purchase_shipment_real_start _time,
MAX(CASE WHEN s.project_phases = '3' THEN s.real_end_time END) AS purchase_shipment_real_end_time ,
MAX(CASE WHEN d.dict_label = '发货' THEN s.plan_start_time END) AS shipment_plan_start_time,
MAX(CASE WHEN d.dict_label = '发货' THEN s.plan_end_time END) AS shipment_plan_end _time,
MAX(CASE WHEN d.dict_label = '发货' THEN s.real_start_time END) AS shipment_real_start _time,
MAX(CASE WHEN d.dict_label = '发货' THEN s.real_end_time END) AS shipment_real_end _time,
MAX(CASE WHEN d.dict_label = '发货' THEN s.reasons_explanation END) AS shipment_reasons_explanation ,
<!-- 4: 开发 -->
MAX(CASE WHEN s.project_phases = '4' THEN s.plan_start_time END) AS develop_plan_start _time,
MAX(CASE WHEN s.project_phases = '4' THEN s.plan_end_time END) AS develop_plan_end _time,
MAX(CASE WHEN s.project_phases = '4' THEN s.real_start_time END) AS develop_real_start _time,
MAX(CASE WHEN s.project_phases = '4' THEN s.real_end_time END) AS develop_real_end_time ,
MAX(CASE WHEN d.dict_label = '实施' THEN s.plan_start_time END) AS implement_plan_start_time,
MAX(CASE WHEN d.dict_label = '实施' THEN s.plan_end_time END) AS implement_plan_end _time,
MAX(CASE WHEN d.dict_label = '实施' THEN s.real_start_time END) AS implement_real_start _time,
MAX(CASE WHEN d.dict_label = '实施' THEN s.real_end_time END) AS implement_real_end _time,
MAX(CASE WHEN d.dict_label = '实施' THEN s.reasons_explanation END) AS implement_reasons_explanation ,
<!-- 5: 组装调试(设备类) -->
MAX(CASE WHEN s.project_phases = '5' THEN s.plan_start_time END) AS assembly_debug_plan_start _time,
MAX(CASE WHEN s.project_phases = '5' THEN s.plan_end_time END) AS assembly_debug_plan_end _time,
MAX(CASE WHEN s.project_phases = '5' THEN s.real_start_time END) AS assembly_debug_real_start _time,
MAX(CASE WHEN s.project_phases = '5' THEN s.real_end_time END) AS assembly_debug_real_end_time ,
MAX(CASE WHEN d.dict_label = '调试' THEN s.plan_start_time END) AS debug_plan_start_time,
MAX(CASE WHEN d.dict_label = '调试' THEN s.plan_end_time END) AS debug_plan_end _time,
MAX(CASE WHEN d.dict_label = '调试' THEN s.real_start_time END) AS debug_real_start _time,
MAX(CASE WHEN d.dict_label = '调试' THEN s.real_end_time END) AS debug_real_end _time,
MAX(CASE WHEN d.dict_label = '调试' THEN s.reasons_explanation END) AS debug_reasons_explanation ,
<!-- 6: 实施与安装调试 -->
MAX(CASE WHEN s.project_phases = '6' THEN s.plan_start_time END) AS implement_debug_plan_start _time,
MAX(CASE WHEN s.project_phases = '6' THEN s.plan_end_time END) AS implement_debug_plan_end _time,
MAX(CASE WHEN s.project_phases = '6' THEN s.real_start_time END) AS implement_debug_real_start _time,
MAX(CASE WHEN s.project_phases = '6' THEN s.real_end_time END) AS implement_debug_real_end_time ,
MAX(CASE WHEN d.dict_label = '试运行' THEN s.plan_start_time END) AS pilot_run_plan_start_time,
MAX(CASE WHEN d.dict_label = '试运行' THEN s.plan_end_time END) AS pilot_run_plan_end _time,
MAX(CASE WHEN d.dict_label = '试运行' THEN s.real_start_time END) AS pilot_run_real_start _time,
MAX(CASE WHEN d.dict_label = '试运行' THEN s.real_end_time END) AS pilot_run_real_end _time,
MAX(CASE WHEN d.dict_label = '试运行' THEN s.reasons_explanation END) AS pilot_run_reasons_explanation ,
<!-- 7: 测试与试运行 -->
MAX(CASE WHEN s.project_phases = '7' THEN s.plan_start_time END) AS test_pilot_run_plan_start _time,
MAX(CASE WHEN s.project_phases = '7' THEN s.plan_end_time END) AS test_pilot_run_plan_end _time,
MAX(CASE WHEN s.project_phases = '7' THEN s.real_start_time END) AS test_pilot_run_real_start _time,
MAX(CASE WHEN s.project_phases = '7' THEN s.real_end_time END) AS test_pilot_run_real_end_time ,
MAX(CASE WHEN d.dict_label = '验收' THEN s.plan_start_time END) AS acceptance_plan_start_time,
MAX(CASE WHEN d.dict_label = '验收' THEN s.plan_end_time END) AS acceptance_plan_end _time,
MAX(CASE WHEN d.dict_label = '验收' THEN s.real_start_time END) AS acceptance_real_start _time,
MAX(CASE WHEN d.dict_label = '验收' THEN s.real_end_time END) AS acceptance_real_end _time,
MAX(CASE WHEN d.dict_label = '验收' THEN s.reasons_explanation END) AS acceptance_reasons_explanation ,
<!-- 8: 验收 -->
MAX(CASE WHEN s.project_phases = '8' THEN s.plan_start_time END) AS acceptance_plan_start _time,
MAX(CASE WHEN s.project_phases = '8' THEN s.plan_end_time END) AS acceptance_plan_end _time,
MAX(CASE WHEN s.project_phases = '8' THEN s.real_start_time END) AS acceptance_real_start _time,
MAX(CASE WHEN s.project_phases = '8' THEN s.real_end_time END) AS acceptance_real_end_time ,
MAX(CASE WHEN d.dict_label = '质保' THEN s.plan_start_time END) AS warranty_plan_start_time,
MAX(CASE WHEN d.dict_label = '质保' THEN s.plan_end_time END) AS warranty_plan_end _time,
MAX(CASE WHEN d.dict_label = '质保' THEN s.real_start_time END) AS warranty_real_start _time,
MAX(CASE WHEN d.dict_label = '质保' THEN s.real_end_time END) AS warranty_real_end _time,
MAX(CASE WHEN d.dict_label = '质保' THEN s.reasons_explanation END) AS warranty_reasons_explanation
<!-- 9: 质保 -->
MAX(CASE WHEN s.project_phases = '9' THEN s.plan_start_time END) AS warranty_plan_start _time,
MAX(CASE WHEN s.project_phases = '9' THEN s.plan_end_time END) AS warranty_plan_end _time,
MAX(CASE WHEN s.project_phases = '9' THEN s.real_start_time END) AS warranty_real_start _time,
MAX(CASE WHEN s.project_phases = '9' THEN s.real_end_time END) AS warranty_real_end_time
FROM erp_project_plan_stage s
LEFT JOIN sys_dict_data d ON s.project_phases = d.dict_value AND d.dict_type = 'project_phases'
WHERE s.del_flag = '0'
GROUP BY s.project_id
) stages_sub ON t.project_id = stages_sub.project_id