feat(oa/erp): 更新项目台账报表功能

- 修改Mapper XML文件中的SQL查询逻辑,优化字段映射关系
- 添加异常启动状态判断和显示功能,增加相应字段展示
- 调整项目阶段进度信息的展示结构,重新定义阶段分类
- 新增部门ID和项目类型ID的查询条件支持
- 移除冗余的产品数量统计功能模块
- 更新VO对象属性定义,新增预计验收时间、异常启动等字段
- 调整Excel导出模板的列配置,完善各阶段时间信息展示
- 修复收入计算逻辑,直接使用净合同金额字段
- 增加项目阶段筛选条件的动态SQL支持
dev
Yangk 1 month ago
parent 13bfbbac3c
commit a797d87c5b

@ -30,6 +30,12 @@ public class ProjectLedgerReportVo implements Serializable {
@ExcelProperty({"基本信息", "序号"})
private Integer index;
/** 部门ID查询条件 */
private Long deptId;
/** 项目类型ID查询条件 */
private Long projectTypeId;
/** 合同ID */
private Long contractId;
@ -73,10 +79,22 @@ public class ProjectLedgerReportVo implements Serializable {
@org.dromara.common.excel.annotation.ExcelDictFormat(dictType = "project_status")
private String projectStatus;
/** 预计验收时间 */
@ExcelProperty({"基本信息", "预计验收时间"})
private String expectedAcceptanceTime;
/** 实际验收时间 */
@ExcelProperty({"基本信息", "实际验收时间"})
private String acceptanceDate;
/** 是否异常启动 */
@ExcelProperty({"基本信息", "是否异常启动"})
private String abnormalStartup;
/** 异常启动原因 */
@ExcelProperty({"基本信息", "异常启动原因"})
private String abnormalStartupReason;
/** 签订时间 */
@ExcelProperty({"合同信息", "签订时间"})
private String contractDate;
@ -117,7 +135,11 @@ public class ProjectLedgerReportVo implements Serializable {
@ExcelProperty({"预算及成本", "累计工时"})
private BigDecimal totalHours;
// --- 启动阶段 ---
/** 已发生成本 */
@ExcelProperty({"预算及成本", "已发生成本"})
private BigDecimal actualCost;
// --- 1: 启动 ---
@ExcelProperty({"启动", "计划开始时间"})
private String startupPlanStartTime;
@ExcelProperty({"启动", "计划结束时间"})
@ -126,10 +148,8 @@ public class ProjectLedgerReportVo implements Serializable {
private String startupRealStartTime;
@ExcelProperty({"启动", "实际结束时间"})
private String startupRealEndTime;
@ExcelProperty({"启动", "原因说明"})
private String startupReasonsExplanation;
// --- 设计阶段 ---
// --- 2: 设计 ---
@ExcelProperty({"设计", "计划开始时间"})
private String designPlanStartTime;
@ExcelProperty({"设计", "计划结束时间"})
@ -138,70 +158,58 @@ public class ProjectLedgerReportVo implements Serializable {
private String designRealStartTime;
@ExcelProperty({"设计", "实际结束时间"})
private String designRealEndTime;
@ExcelProperty({"设计", "原因说明"})
private String designReasonsExplanation;
// --- 采购阶段 ---
@ExcelProperty({"采购", "计划开始时间"})
private String purchasePlanStartTime;
@ExcelProperty({"采购", "计划结束时间"})
private String purchasePlanEndTime;
@ExcelProperty({"采购", "实际开始时间"})
private String purchaseRealStartTime;
@ExcelProperty({"采购", "实际结束时间"})
private String purchaseRealEndTime;
@ExcelProperty({"采购", "原因说明"})
private String purchaseReasonsExplanation;
// --- 3: 采购与发货 ---
@ExcelProperty({"采购与发货", "计划开始时间"})
private String purchaseShipmentPlanStartTime;
@ExcelProperty({"采购与发货", "计划结束时间"})
private String purchaseShipmentPlanEndTime;
@ExcelProperty({"采购与发货", "实际开始时间"})
private String purchaseShipmentRealStartTime;
@ExcelProperty({"采购与发货", "实际结束时间"})
private String purchaseShipmentRealEndTime;
// --- 发货阶段 ---
@ExcelProperty({"发货", "计划开始时间"})
private String shipmentPlanStartTime;
@ExcelProperty({"发货", "计划结束时间"})
private String shipmentPlanEndTime;
@ExcelProperty({"发货", "实际开始时间"})
private String shipmentRealStartTime;
@ExcelProperty({"发货", "实际结束时间"})
private String shipmentRealEndTime;
@ExcelProperty({"发货", "原因说明"})
private String shipmentReasonsExplanation;
// --- 4: 开发 ---
@ExcelProperty({"开发", "计划开始时间"})
private String developPlanStartTime;
@ExcelProperty({"开发", "计划结束时间"})
private String developPlanEndTime;
@ExcelProperty({"开发", "实际开始时间"})
private String developRealStartTime;
@ExcelProperty({"开发", "实际结束时间"})
private String developRealEndTime;
// --- 实施阶段 ---
@ExcelProperty({"实施", "计划开始时间"})
private String implementPlanStartTime;
@ExcelProperty({"实施", "计划结束时间"})
private String implementPlanEndTime;
@ExcelProperty({"实施", "实际开始时间"})
private String implementRealStartTime;
@ExcelProperty({"实施", "实际结束时间"})
private String implementRealEndTime;
@ExcelProperty({"实施", "原因说明"})
private String implementReasonsExplanation;
// --- 5: 组装调试(设备类) ---
@ExcelProperty({"组装调试(设备类)", "计划开始时间"})
private String assemblyDebugPlanStartTime;
@ExcelProperty({"组装调试(设备类)", "计划结束时间"})
private String assemblyDebugPlanEndTime;
@ExcelProperty({"组装调试(设备类)", "实际开始时间"})
private String assemblyDebugRealStartTime;
@ExcelProperty({"组装调试(设备类)", "实际结束时间"})
private String assemblyDebugRealEndTime;
// --- 调试阶段 ---
@ExcelProperty({"调试", "计划开始时间"})
private String debugPlanStartTime;
@ExcelProperty({"调试", "计划结束时间"})
private String debugPlanEndTime;
@ExcelProperty({"调试", "实际开始时间"})
private String debugRealStartTime;
@ExcelProperty({"调试", "实际结束时间"})
private String debugRealEndTime;
@ExcelProperty({"调试", "原因说明"})
private String debugReasonsExplanation;
// --- 6: 实施与安装调试 ---
@ExcelProperty({"实施与安装调试", "计划开始时间"})
private String implementDebugPlanStartTime;
@ExcelProperty({"实施与安装调试", "计划结束时间"})
private String implementDebugPlanEndTime;
@ExcelProperty({"实施与安装调试", "实际开始时间"})
private String implementDebugRealStartTime;
@ExcelProperty({"实施与安装调试", "实际结束时间"})
private String implementDebugRealEndTime;
// --- 试运行阶段 ---
@ExcelProperty({"试运行", "计划开始时间"})
private String pilotRunPlanStartTime;
@ExcelProperty({"试运行", "计划结束时间"})
private String pilotRunPlanEndTime;
@ExcelProperty({"试运行", "实际开始时间"})
private String pilotRunRealStartTime;
@ExcelProperty({"试运行", "实际结束时间"})
private String pilotRunRealEndTime;
@ExcelProperty({"试运行", "原因说明"})
private String pilotRunReasonsExplanation;
// --- 7: 测试与试运行 ---
@ExcelProperty({"测试与试运行", "计划开始时间"})
private String testPilotRunPlanStartTime;
@ExcelProperty({"测试与试运行", "计划结束时间"})
private String testPilotRunPlanEndTime;
@ExcelProperty({"测试与试运行", "实际开始时间"})
private String testPilotRunRealStartTime;
@ExcelProperty({"测试与试运行", "实际结束时间"})
private String testPilotRunRealEndTime;
// --- 验收阶段 ---
// --- 8: 验收 ---
@ExcelProperty({"验收", "计划开始时间"})
private String acceptancePlanStartTime;
@ExcelProperty({"验收", "计划结束时间"})
@ -210,10 +218,8 @@ public class ProjectLedgerReportVo implements Serializable {
private String acceptanceRealStartTime;
@ExcelProperty({"验收", "实际结束时间"})
private String acceptanceRealEndTime;
@ExcelProperty({"验收", "原因说明"})
private String acceptanceReasonsExplanation;
// --- 质保阶段 ---
// --- 9: 质保 ---
@ExcelProperty({"质保", "计划开始时间"})
private String warrantyPlanStartTime;
@ExcelProperty({"质保", "计划结束时间"})
@ -222,8 +228,7 @@ public class ProjectLedgerReportVo implements Serializable {
private String warrantyRealStartTime;
@ExcelProperty({"质保", "实际结束时间"})
private String warrantyRealEndTime;
@ExcelProperty({"质保", "原因说明"})
private String warrantyReasonsExplanation;
/** 业务方向(查询条件用) */
private String businessDirection;

@ -42,6 +42,10 @@ public class ProjectLedgerReportServiceImpl implements IProjectLedgerReportServi
lqw.like(StringUtils.isNotBlank(bo.getProjectCode()), ErpProjectInfo::getProjectCode, bo.getProjectCode());
lqw.eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpProjectInfo::getBusinessDirection, bo.getBusinessDirection());
lqw.eq(StringUtils.isNotBlank(bo.getProjectStatus()), ErpProjectInfo::getProjectStatus, bo.getProjectStatus());
lqw.eq(bo.getDeptId() != null, ErpProjectInfo::getDeptId, bo.getDeptId());
lqw.eq(bo.getProjectTypeId() != null, ErpProjectInfo::getProjectTypeId, bo.getProjectTypeId());
// 项目阶段过滤 (联查关联表)
lqw.apply(StringUtils.isNotBlank(bo.getProjectPhases()), "EXISTS (SELECT 1 FROM erp_project_plan_stage s WHERE s.project_id = t.project_id AND s.project_phases = {0} AND s.del_flag = '0')", bo.getProjectPhases());
lqw.orderByDesc(ErpProjectInfo::getCreateTime);
return lqw;

@ -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

Loading…
Cancel
Save