diff --git a/DataBase/版本日志/SGGLDB_V2025-09-28-001-lpf.sql b/DataBase/版本日志/SGGLDB_V2025-09-28-001-lpf.sql new file mode 100644 index 00000000..34d37cda --- /dev/null +++ b/DataBase/版本日志/SGGLDB_V2025-09-28-001-lpf.sql @@ -0,0 +1,114 @@ +--drop PROCEDURE [dbo].[Sp_HJGL_ProductionPlanStatistics] +CREATE PROCEDURE [dbo].[Sp_HJGL_ProductionPlanStatistics] + @projectId nvarchar(50)=null +AS +BEGIN + SET NOCOUNT ON; -- ¼õÉÙÍøÂçÁ÷Á¿£¬Ìá¸ßÐÔÄÜ + + -- ʹÓÃCTEÔ¤ÏȹýÂ˺;ۺÏÊý¾Ý + WITH PipelineFiltered AS ( + SELECT UnitWorkId, FlowingSection, PipelineId + FROM HJGL_Pipeline + WHERE PipeArea='1' + AND FlowingSection IS NOT NULL + AND FlowingSection != '' + AND (@projectId IS NULL OR UnitWorkId IN ( + SELECT UnitWorkId FROM WBS_UnitWork WHERE ProjectId = @projectId + )) + ), + + -- ¹¤³§Ô¤ÖÆ×Ü´ïÒò + TotalDiaCTE AS ( + SELECT p.UnitWorkId, p.FlowingSection, SUM(wj.Size) as TotalDia + FROM HJGL_WeldJoint wj + INNER JOIN PipelineFiltered p ON p.PipelineId = wj.PipelineId + WHERE wj.JointAttribute='Ô¤ÖÆ¿Ú' + GROUP BY p.UnitWorkId, p.FlowingSection + ), + + -- µ±ÈÕÍê³É¹¤×÷Á¿ + CurrentDayCompletedCTE AS ( + SELECT p.UnitWorkId, p.FlowingSection, SUM(wj.Size) as CurrentDayCompletedDia + FROM HJGL_WeldJoint wj + INNER JOIN PipelineFiltered p ON p.PipelineId = wj.PipelineId + INNER JOIN HJGL_WeldingDaily wd ON wd.WeldingDailyId = wj.WeldingDailyId + WHERE wj.JointAttribute='Ô¤ÖÆ¿Ú' + AND wj.WeldingDailyId IS NOT NULL + AND wd.WeldingDate >= CAST(GETDATE() AS DATE) -- ÓÅ»¯ÈÕÆÚ±È½Ï£¬Ê¹ÓÃÈÕÆÚ·¶Î§ + AND wd.WeldingDate < DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) + GROUP BY p.UnitWorkId, p.FlowingSection + ), + + -- ÀÛ¼ÆÒÑÍê³ÉÁ¿ + TotalCompletedCTE AS ( + SELECT p.UnitWorkId, p.FlowingSection, SUM(wj.Size) as totalCompletedDia + FROM HJGL_WeldJoint wj + INNER JOIN PipelineFiltered p ON p.PipelineId = wj.PipelineId + WHERE wj.JointAttribute='Ô¤ÖÆ¿Ú' + AND wj.WeldingDailyId IS NOT NULL + GROUP BY p.UnitWorkId, p.FlowingSection + ), + + -- µ±Ç°º¸¹¤ÊýÁ¿ + WelderCountCTE AS ( + SELECT p.UnitWorkId, p.FlowingSection, + COUNT(DISTINCT pp.PersonId) as WelderCount -- ʹÓÃDISTINCT±ÜÃâÖØ¸´¼ÆÊý + FROM Person_Persons pp + INNER JOIN HJGL_WeldJoint wj ON wj.BackingWelderId = pp.PersonId + INNER JOIN PipelineFiltered p ON p.PipelineId = wj.PipelineId + WHERE wj.JointAttribute='Ô¤ÖÆ¿Ú' + AND wj.WeldingDailyId IS NOT NULL + GROUP BY p.UnitWorkId, p.FlowingSection + ), + + -- Ô¤¾¯º¸¹¤ÊýÁ¿ + WarningWelderCountCTE AS ( + SELECT p.UnitWorkId, p.FlowingSection, + COUNT(DISTINCT pp.PersonId) as WarningWelderCount + FROM Person_Persons pp + INNER JOIN HJGL_WeldJoint wj ON wj.BackingWelderId = pp.PersonId + INNER JOIN PipelineFiltered p ON p.PipelineId = wj.PipelineId + INNER JOIN Welder_WelderQualify wq ON wq.WelderId = pp.PersonId + WHERE wj.JointAttribute='Ô¤ÖÆ¿Ú' + AND wj.WeldingDailyId IS NOT NULL + AND wq.LimitDate < GETDATE() -- º¸¹¤×ʸñ¹ýÆÚÔ¤¾¯ + GROUP BY p.UnitWorkId, p.FlowingSection + ) + + SELECT DISTINCT + unitWork.UnitWorkId, + unitWork.UnitWorkCode, + unitWork.UnitWorkName, + unitWork.ProjectId, + pipeline.FlowingSection, + isnull(total.TotalDia,0) as TotalDia,--¹¤³§Ô¤ÖÆ×Ü´ïÒò + p.PlanStartDate,--¼Æ»®¿ªÊ¼ÈÕÆÚ + p.PlanEndDate,--¼Æ»®Íê³ÉÈÕÆÚ + p.Days as TotalDays,--×ÜÌìÊý + (case when p.PlanEndDate>= getdate() then (p.Days-(DATEDIFF(day,p.PlanStartDate,GETDATE()))) else '' end) as RemainingDays,--Ê£ÓàÌìÊý + (case when p.Days>0 then cast(isnull(total.TotalDia,0)/p.Days as decimal(18,2)) else 0 end) as AvgDayCompleteDia, --ƽ¾ùÿÈÕÓ¦Íê³É¹¤×÷Á¿ + ISNULL(currentDay.CurrentDayCompletedDia,0) as CurrentDayCompletedDia, --µ±ÈÕÍê³É¹¤×÷Á¿ + cast(case when (case when p.PlanEndDate>= getdate() then (p.Days-(DATEDIFF(day,p.PlanStartDate,GETDATE()))) else 0 end)>0 then + (isnull(total.TotalDia,0)-isnull(totalCompleted.totalCompletedDia,0))/ (case when p.PlanEndDate>= getdate() then (p.Days-(DATEDIFF(day,p.PlanStartDate,GETDATE()))) else 0 end) else 0 end as decimal(18,2)) as NextDayComplete, --´ÎÈÕÓ¦Íê³ÉÁ¿ + isnull(totalCompleted.totalCompletedDia,0) as totalCompletedDia, --ÀÛ¼ÆÒÑÍê³ÉÁ¿ + cast(cast((case when isnull(total.TotalDia,0)>0 then + (isnull(totalCompleted.totalCompletedDia,0) / isnull(total.TotalDia,0)*100) else 0 end) as decimal(18,2)) as varchar(10))+'%' as CompletedRate, --ÒÑÍê³É°Ù·Ö±È + welder.WelderCount, --µ±Ç°º¸¹¤ÊýÁ¿ + warningWelder.WarningWelderCount --Ô¤¾¯º¸¹¤ÊýÁ¿ + FROM WBS_UnitWork AS unitWork + INNER JOIN PipelineFiltered pipeline ON pipeline.UnitWorkId = unitWork.UnitWorkId -- ʹÓÃINNER JOIN£¬ÒòΪpipelineÊý¾Ý±ØÐë´æÔÚ + LEFT JOIN HJGL_ProductionSchedulingPlan p ON p.PipelineId = unitWork.UnitWorkId AND p.FlowNum = pipeline.FlowingSection + --¹¤³§Ô¤ÖÆ×Ü´ïÒò + LEFT JOIN TotalDiaCTE total ON total.UnitWorkId = unitWork.UnitWorkId AND total.FlowingSection = pipeline.FlowingSection + --µ±ÈÕÍê³É¹¤×÷Á¿ + LEFT JOIN CurrentDayCompletedCTE currentDay ON currentDay.UnitWorkId = unitWork.UnitWorkId AND currentDay.FlowingSection = pipeline.FlowingSection + --ÀÛ¼ÆÒÑÍê³ÉÁ¿ + LEFT JOIN TotalCompletedCTE totalCompleted ON totalCompleted.UnitWorkId = unitWork.UnitWorkId AND totalCompleted.FlowingSection = pipeline.FlowingSection + --µ±Ç°º¸¹¤ÊýÁ¿ + LEFT JOIN WelderCountCTE welder ON welder.UnitWorkId = unitWork.UnitWorkId AND welder.FlowingSection = pipeline.FlowingSection + --Ô¤¾¯º¸¹¤ÊýÁ¿ + LEFT JOIN WarningWelderCountCTE warningWelder ON warningWelder.UnitWorkId = unitWork.UnitWorkId AND warningWelder.FlowingSection = pipeline.FlowingSection + WHERE (@projectId IS NULL OR unitWork.ProjectId = @projectId) + AND pipeline.FlowingSection IS NOT NULL; + +END \ No newline at end of file