From b6e0c9175e15545fbe890611d3b6ce71a3fc916d Mon Sep 17 00:00:00 2001
From: xiaoding721 <33130084+xiaoding721@users.noreply.github.com>
Date: 星期一, 09 十二月 2024 00:08:40 +0800
Subject: [PATCH] 修复一些bug,优化计划汇总报表

---
 _Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl                                                        |    9 -
 _Main/BL/Type_LocalTool/StaticMethod_GetYYYYMM.qbl                                                                       |   23 ++++
 _Main/BL/Type_MP_Cell_ScheduleSummary0/StaticMethod_CreateFullTable.qbl                                                  |   66 +++++++++++++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly.def                  |   25 +++++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight445.def                 |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelMonthly_bApply902_OnClick.def |   19 +++
 _Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPatternByMonth#139.qbl                                             |   60 ++++++++++++
 _Main/BL/Type_Test/StaticMethod_Test.qbl                                                                                 |    7 +
 _Main/BL/Type_LocalTool/StaticMethod_AddMonthByYYYYMM.qbl                                                                |   40 ++++++++
 _Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly743.def               |   36 +++++++
 10 files changed, 275 insertions(+), 11 deletions(-)

diff --git a/_Main/BL/Type_LocalTool/StaticMethod_AddMonthByYYYYMM.qbl b/_Main/BL/Type_LocalTool/StaticMethod_AddMonthByYYYYMM.qbl
new file mode 100644
index 0000000..a246691
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/StaticMethod_AddMonthByYYYYMM.qbl
@@ -0,0 +1,40 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AddMonthByYYYYMM (
+  Number data,
+  Number addMonthNumber
+) as Number
+{
+  TextBody:
+  [*
+    // Akari Dec-6-2024 (created)
+    stringData := [String]data;
+    if( stringData.Length() <> 6 ){
+      error( "wrong date: " + [String]data );
+    }
+    year := [Number]stringData.SubString( 0,4 );
+    month := [Number]stringData.SubString( 4,2 );
+    
+    while( addMonthNumber >= 12 ){
+      addMonthNumber := addMonthNumber - 12;
+      year := year + 1;
+    }
+    
+    if( month + addMonthNumber > 12 ){
+      year := year + 1;
+      month := month + addMonthNumber - 12;
+    }else{
+      month := month + addMonthNumber; 
+    }
+    
+    result := [String]year;
+    
+    if( month < 10 ){
+       result := result + "0" + [String]month;
+    }else{
+       result := result + [String]month; 
+    }
+    
+    return [Number]result;
+  *]
+}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl b/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl
index 31bd0a7..285f0da 100644
--- a/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl
+++ b/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl
@@ -25,17 +25,8 @@
           i := flag;
           flag := i.StartOfNextWeek();
           temp--;
-          
-          info( i.Format( "Y-M2-D2") );
-          info( flag.Format( "Y-M2-D2") );
         }
       }
-    }
-    
-    info( "----------------------------");
-    
-    traverse( saveDays,Elements,element ){
-      info( element.Format( "Y-M2-D2")); 
     }
     
     dayPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, 
diff --git "a/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPatternByMonth\043139.qbl" "b/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPatternByMonth\043139.qbl"
new file mode 100644
index 0000000..06d2ae4
--- /dev/null
+++ "b/_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPatternByMonth\043139.qbl"
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod BatchSetUnitShiftPatternByMonth (
+  Unit unit,
+  ShiftPattern shiftPattern,
+  Date startDate,
+  Date endDate,
+  Number skipMonth
+)
+{
+  TextBody:
+  [*
+    // Akari Oct-10-2024 (created)
+    owner := unit.MacroPlan();
+    
+    saveMonths := construct( Numbers );
+    
+    for( i := LocalTool::GetYYYYMM( startDate ); i < LocalTool::GetYYYYMM( endDate ) ; i := LocalTool::AddMonthByYYYYMM( i,skipMonth ) ){
+      
+      saveMonths.Add( i ); 
+      
+    }
+    
+    
+    dayPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, 
+                                      period_MP.TimeUnit() = 'Day' and 
+                                      period_MP.StartDate() >= startDate and 
+                                      period_MP.EndDate() <= endDate and exists( saveMonths, Elements,month,month = LocalTool::GetYYYYMM( period_MP.StartDate() )) ,period_MP.StartDate());
+    weekPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, 
+                                       period_MP.TimeUnit() = 'Week' and 
+                                       period_MP.StartDate() >= startDate and 
+                                       period_MP.EndDate() <= endDate and exists( saveMonths, Elements,month,month = LocalTool::GetYYYYMM( period_MP.StartDate() )) ,period_MP.StartDate());
+    monthPeriod_MPs := selectsortedset( owner,Period_MP,period_MP, 
+                                       period_MP.TimeUnit() = 'Month' and 
+                                       period_MP.StartDate() >= startDate and 
+                                       period_MP.EndDate() <= endDate and exists( saveMonths, Elements,month,month = LocalTool::GetYYYYMM( period_MP.StartDate() )) ,period_MP.StartDate());
+    
+    
+    
+    if( dayPeriod_MPs.Size() > 0 ){
+      unitPeriodTimes := selectset( unit,UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( dayPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+      if( unitPeriodTimes.Size() > 0 ){
+        info( unitPeriodTimes.Size() );
+        LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
+      }
+    }
+    if( weekPeriod_MPs.Size() <> 0 ){
+      unitPeriodTimes := selectset( unit,UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( weekPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+      if( unitPeriodTimes.Size() > 0 ){
+        LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
+      }
+    }
+    if( monthPeriod_MPs.Size() <> 0 ){
+      unitPeriodTimes := selectset( unit,UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( monthPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+      if( unitPeriodTimes.Size() > 0 ){
+        LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LocalTool/StaticMethod_GetYYYYMM.qbl b/_Main/BL/Type_LocalTool/StaticMethod_GetYYYYMM.qbl
new file mode 100644
index 0000000..df6dd0c
--- /dev/null
+++ b/_Main/BL/Type_LocalTool/StaticMethod_GetYYYYMM.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetYYYYMM (
+  Date date
+) as Number
+{
+  TextBody:
+  [*
+    // Akari Dec-6-2024 (created)
+    year := date.Year();
+    month := date.Month();
+    
+    result := [String]year;
+    
+    if( month < 10 ){
+       result := result + "0" + [String]month;
+    }else{
+       result := result + [String]month; 
+    }
+    
+    return [Number]result;
+  *]
+}
diff --git a/_Main/BL/Type_MP_Cell_ScheduleSummary0/StaticMethod_CreateFullTable.qbl b/_Main/BL/Type_MP_Cell_ScheduleSummary0/StaticMethod_CreateFullTable.qbl
index daaba1f..1bb5094 100644
--- a/_Main/BL/Type_MP_Cell_ScheduleSummary0/StaticMethod_CreateFullTable.qbl
+++ b/_Main/BL/Type_MP_Cell_ScheduleSummary0/StaticMethod_CreateFullTable.qbl
@@ -43,7 +43,19 @@
     localTable := recycleBin.LocalTable( relnew,Name := ArchiveCell_ScheduleSummary::GetTableName() );
     
     // 鑾峰彇寮�濮嬫椂闂村拰缁撴潫鏃堕棿
-    startDate := minselect( archive,ActualDailyProductionData,data,data.ProductionDate() ).ProductionDate();
+    startDate := Date::Construct( Date::ActualDate().Year() - 1, 6, 1 );
+    {
+      minActualDailyProductionDataDate := guard( minselect( archive,ActualDailyProductionData,data,data.ProductionDate() ).ProductionDate(),Date::MaxDate() );
+      minArchiveShiftPlanDate := guard( minselect( archive,ArchiveShiftPlanColumn,data,data.StartDate()).StartDate(),Date::MaxDate() );
+      if( minActualDailyProductionDataDate <> Date::MaxDate() or minArchiveShiftPlanDate <> Date::MaxDate() ){
+        if( minArchiveShiftPlanDate > minActualDailyProductionDataDate ){
+          startDate := minActualDailyProductionDataDate; 
+        }else {
+          startDate := minArchiveShiftPlanDate; 
+        }
+      }
+    }
+    
     endDate := maxselect( macroPlan,Period_MP,period,period.EndDate() ).EndDate();
     
     // 鏋勫缓LocalColumn鐨勭储寮�
@@ -172,7 +184,9 @@
           
           // 璁″垝寮�濮嬩箣鍓嶇殑浜у嚭鍙栧疄闄呮瘡鏃ョ敓浜ф帴鍙�
           if( localColumn.CustomDate() < macroPlan.StartOfPlanning().Date() ){
+            // 寮�濮嬫椂闂村彇姣旇緝灏忕殑寮�濮嬫椂闂�
             historyStartDate := ifexpr( macroPlan.StartOfPlanning().Date() <= localColumn.CustomDate(), macroPlan.StartOfPlanning().Date(), localColumn.CustomDate() );
+            // 缁撴潫鏃堕棿鍙栨瘮杈冨ぇ鐨勫紑濮嬫椂闂达紝濡傛灉鍜岃鍒掑紑濮嬫椂闂村浜庡悓涓�涓湀浠斤紝鍒欏彇璁″垝寮�濮嬫椂闂达紱鍚﹀垯鍙栨湀搴曟椂闂�
             historyEndDate := ifexpr( macroPlan.StartOfPlanning().Date() > localColumn.CustomDate().StartOfNextMonth() and 
                                       macroPlan.StartOfPlanning().Date().Month() = localColumn.CustomDate().Month() and 
                                       macroPlan.StartOfPlanning().Date().Year() = localColumn.CustomDate().Year() ,macroPlan.StartOfPlanning().Date(), localColumn.CustomDate().StartOfNextMonth() );
@@ -210,7 +224,57 @@
           localCell.WorkingDay( localCell.WorkingDay() + workingDay );
           localCell.Capacity( localCell.Capacity() + capacity );
           localCell.Output( localCell.Output() + output );
+       }
+    }
+    
+    traverse( archive,ArchiveShiftPlanRow,row ){
+       localRow := null( LocalRow );
+       {
+         localRowHandle := localRowIndexTree.GetHandle( row.UnitID());
+         localRowIndex := guard( localRowIndexTree.Root().Child( localRowHandle ),null( NamedValue ));
+         if( isnull( localRowIndex )){
+           localRow := localTable.LocalRow( relnew,CustomName := row.UnitID(),Index := localTable.GetRowIndexCache() );
+           localRows.Add( localRow );
+           localRowIndexTree.Root().AddChild( localRowHandle,localRows.Size() - 1 );
+         }else{
+           localRow := localRows.Element( localRowIndex.GetValueAsNumber());
+         }
+       }
+       traverse( localColumns,Elements,localColumn ){
+          archiveCells := selectset( row,ArchiveShiftPlanCell,cell,
+                              cell.ArchiveShiftPlanColumn().StartDate() >= localColumn.CustomDate() and 
+                              cell.ArchiveShiftPlanColumn().StartDate() < localColumn.CustomDate().StartOfNextMonth() );
           
+          workingDay := 0;
+          capacity := 0.0;
+          shiftPatterns := construct( Strings );
+          
+          traverse( archiveCells,Elements,cell ){
+             // capacity := capacity + cell.Capacity();
+             if( cell.Outcome() <> "" ){
+               workingDay := workingDay + 1;
+               shiftPatterns.Add( cell.Outcome() );
+             }
+          }
+          
+          
+          localCell := null( LocalCell_ScheduleSummary );
+          {
+            localCellHandle := localCellIndexTree.GetHandle( row.UnitID() + localColumn.CustomDate().AsQUILL() );
+            localCellIndex := guard( localCellIndexTree.Root().Child( localCellHandle ),null( NamedValue ));
+            if( isnull( localCellIndex )){
+              localCell := localRow.LocalCell( relnew,LocalCell_ScheduleSummary,LocalColumn := localColumn );
+              localCells.Add( localCell );
+              localCellIndexTree.Root().AddChild( localCellHandle , localCells.Size() - 1 );
+            }else{
+              localCell := localCells.Element( localCellIndex.GetValueAsNumber() ); 
+            }
+          }
+          
+          localCell.ShiftPattern( selectuniquevalues( shiftPatterns,Elements,element,element ).Concatenate( "/" ) );
+          
+          localCell.WorkingDay( localCell.WorkingDay() + workingDay );
+          localCell.Capacity( localCell.Capacity() + capacity );
        }
     }
     
diff --git a/_Main/BL/Type_Test/StaticMethod_Test.qbl b/_Main/BL/Type_Test/StaticMethod_Test.qbl
index a114517..7518a65 100644
--- a/_Main/BL/Type_Test/StaticMethod_Test.qbl
+++ b/_Main/BL/Type_Test/StaticMethod_Test.qbl
@@ -9,5 +9,10 @@
   InterfaceDataset interfaceDataset
 )
 {
-  TextBody: '//archive.ActualDailyProductionData( relnew ,ActualOut := 100,Fac := "CC",LineName := "CC1",ProductionDate := Date::ActualDate(),ProductNo := "112233445566",ShiftCode := "3",ShiftName := "鐧界彮");'
+  TextBody:
+  [*
+    //archive.ActualDailyProductionData( relnew ,ActualOut := 100,Fac := "CC",LineName := "CC1",ProductionDate := Date::ActualDate(),ProductNo := "112233445566",ShiftCode := "3",ShiftName := "鐧界彮");
+    
+    info( LocalTool::AddMonthByYYYYMM( 202401,25 ) )
+  *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly.def
new file mode 100644
index 0000000..c0efe40
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly.def
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+Component PanelMonthly
+{
+  #keys: '[414996.1.263421916]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelMonthly743
+    Component bApply902
+    {
+      #keys: '[414996.1.265980213]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Apply'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 2
+    Title: 'Monthly'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly743.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly743.def
new file mode 100644
index 0000000..c651816
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelMonthly743.def
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+Component PanelMonthly743
+{
+  #keys: '[414996.1.263422034]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component efMonthly
+    {
+      #keys: '[414996.1.263422035]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        Label: 'Recur every '
+        Taborder: 0
+        Text: '1'
+      ]
+    }
+    Component LabelMonthly
+    {
+      #keys: '[414996.1.263422036]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        Label: 'month(s)'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight445.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight445.def
index 12cb959..832f40e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight445.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight445.def
@@ -7,6 +7,7 @@
   [
     #child: PanelDaily_478
     #child: PanelWeekly_791
+    #child: PanelMonthly
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelMonthly_bApply902_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelMonthly_bApply902_OnClick.def
new file mode 100644
index 0000000..ff15a7e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelMonthly_bApply902_OnClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: PanelMonthly/bApply902
+Response OnClick () id:Response_PanelMonthly_bApply902_OnClick
+{
+  #keys: '[414996.1.265980212]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      
+      skipMonth := [Number]efMonthly.Text();
+      LocalTool::BatchSetUnitShiftPatternByMonth( dhSelectUnit.Data(),ddlShiftPattern.Data(),dsStartDate.Date(),dsEndDate.Date() ,skipMonth );
+      WebMessageBox::Success( "Success");
+    *]
+  }
+}

--
Gitblit v1.9.3