lazhen
2024-10-11 cbf2cc895f1d1e7dcf522a462e77709d92667747
Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev-zlg
已添加9个文件
已修改15个文件
已删除5个文件
1145 ■■■■ 文件已修改
_Main/BL/Relations/Relation_DispatchShiftPlan_Archive_Archive_DispatchShiftPlan.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_DispatchShiftPlan_RecycleBin_RecycleBin_DispatchShiftPlan.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackCell/Function_CalcEstimatedTotalCost.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackCell/Function_CalcNumberOfEmptyShelves.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackCell/Function_CalcRentalWarehouseStorageFees.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackCell/Function_CalcTotalCost.qbl 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_CC_EngineRackRow/Attribute_Index.qbl 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_LocalTool/StaticMethod_SetUnitShiftPattern.qbl 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated#57.def 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormPackagingPlan/Response_MatrixEditor493_OnCheckEditability.def 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelRight_bApply_OnClick.def 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlannerWebApp/Views/BatchSetShiftPattern.vw 386 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_DispatchShiftPlan_Archive_Archive_DispatchShiftPlan.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation DispatchShiftPlan_Archive_Archive_DispatchShiftPlan
{
  #keys: '1[414996.1.121982603]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide Archive
  {
    #keys: '3[414996.1.121982605][414996.1.121982604][414996.1.121982606]'
    Cardinality: '0to1'
    ObjectDefinition: DispatchShiftPlan
    OwningSide: 'Reference'
  }
  RelationSide.RightSide DispatchShiftPlan
  {
    #keys: '3[414996.1.121982608][414996.1.121982607][414996.1.121982609]'
    Cardinality: '1toN'
    ObjectDefinition: Archive
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_DispatchShiftPlan_RecycleBin_RecycleBin_DispatchShiftPlan.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_CC_EngineRackCell/Function_CalcEstimatedTotalCost.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_CC_EngineRackCell/Function_CalcNumberOfEmptyShelves.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_CC_EngineRackCell/Function_CalcRentalWarehouseStorageFees.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_CC_EngineRackCell/Function_CalcTotalCost.qbl
ÎļþÒÑɾ³ý
_Main/BL/Type_CC_EngineRackCell/StaticMethod_CreateData.qbl
@@ -9,12 +9,21 @@
    macroPlan.CC_EngineRackRow( relflush );
    macroPlan.CC_EngineRackColumn( relflush );
    
    sumNumberOfEmptyShelves                       := 0.0;
    sumStorageFeesForRentedWarehouses             := 0.0;
    sumOutboundExpensesForRentedWarehouses        := 0.0;
    sumExternalRentalWarehouseTransportationCosts := 0.0;
    sumRentalWarehouseStorageFees                 := 0.0;
    sumCleaningCost                               := 0.0;
    sumEstimatedTotalCost                         := 0.0;
    sumTotalCost                                  := 0.0;
    // åˆ›å»ºè¡Œ
    genrations := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.Generation().TrimBoth() <> "", tempPMP.Generation() );
    mqbmlbs    := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.MQBMLB().TrimBoth() <> "", tempPMP.MQBMLB() );
    traverse ( genrations, Elements, g ) {
      traverse ( mqbmlbs, Elements, m ) {
        macroPlan.CC_EngineRackRow( relnew, Generation := g, MLB_MQB := m );
        macroPlan.CC_EngineRackRow( relnew, Generation := g, MLB_MQB := m, Index := 1  );
      }
    }
    
@@ -52,10 +61,13 @@
                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               = "长春外租库"       and
                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       = ccerr.Generation() and
                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           = ccerr.MLB_MQB()    and
                                 tempPISPIP.Start().Date()                                                                              = lastDayOfThisMonth,
                                 tempPISPIP.Start().Date()                                                                              >= ccerc.StartDate()  and
                                 tempPISPIP.End().Date()                                                                                <= lastDayOfThisMonth,
                                 tempPISPIP.PlannedInventoryLevelEnd() );
        cell.PackagingCapacity( guard( lce.PackagingCapacity(), 1 ) );
        cell.PlannedInventory( plannedInventory );
        cell.NumberOfEmptyShelves( guard( [Number] ( cell.TotalQuantityOfMaterialRacks() - ( plannedInventory / lce.PackagingCapacity() ) ), 0 ) );
        sumNumberOfEmptyShelves := sumNumberOfEmptyShelves + cell.NumberOfEmptyShelves();
        
        // å¤–租库入库费用(发动机销量 / åŒ…装容量[向上取整] * æ–™æž¶å…¥åº“单价)
        engineSales := sum( macroPlan, FSImportData, tempFSID, 
@@ -65,8 +77,8 @@
                            tempFSID.StartDate().Year()  = ccerc.StartDate().Year()                      and
                            tempFSID.StartDate().Month() = ccerc.StartDate().Month(),
                            tempFSID.Quantity() );
        cell.StorageFeesForRentedWarehouses( [Number] ( engineSales / guard( lce.PackagingCapacity(), 1 ) * guard( lcmr.WarehousingPrice(), 1 ) ) );
        sumStorageFeesForRentedWarehouses := sumStorageFeesForRentedWarehouses + cell.StorageFeesForRentedWarehouses();
             
        // å¤–租库出库费用(发动机产量 / åŒ…装容量[向上取整] * æ–™æž¶å‡ºåº“单价)
        engineProductions := sum( macroPlan, FPImportData, tempFPID, 
@@ -77,6 +89,7 @@
                                  tempFPID.StartDate().Month() = ccerc.StartDate().Month(),
                                  tempFPID.Quantity() );
        cell.OutboundExpensesForRentedWarehouses( [Number] ( engineProductions / guard( lce.PackagingCapacity(), 1 ) ) * guard( lcmr.OutboundPrice(), 1 ) );
        sumOutboundExpensesForRentedWarehouses := sumOutboundExpensesForRentedWarehouses + cell.OutboundExpensesForRentedWarehouses();
        
        // å¤–租库运输费用:发动机运输量 / åŒ…装容量 / è£…载容量(向上取整) * æ–™æž¶è¿è¾“单价
        transportationQuantity := sum( macroPlan, Unit.Lane.LaneLeg.Trip.ProductInTrip, tempPIT, 
@@ -89,16 +102,53 @@
                                       tempPIT.Quantity()
                                      );
    //    info( "时间:", ccerc.StartDate().Format( "Y-M2-D2" ), "    è¿è¾“数据:", transportationQuantity, "     è¿è¾“单价:", lct.TransportPrice() );
        cell.ExternalRentalWarehouseTransportationCosts( transportationQuantity / guard( lce.PackagingCapacity(), 1 ) / guard( lct.LoadingCapacity(), 1 ) * guard( lct.TransportPrice(), 1 ) );
        cell.ExternalRentalWarehouseTransportationCosts( [Number] ( transportationQuantity / guard( lce.PackagingCapacity(), 1 ) / guard( lct.LoadingCapacity(), 1 ) * guard( lct.TransportPrice(), 1 ) ) );
        sumExternalRentalWarehouseTransportationCosts := sumExternalRentalWarehouseTransportationCosts + cell.ExternalRentalWarehouseTransportationCosts();
             
        // å¤–租库仓储费用:料架总数量 - å‘动机库存 / åŒ…装容量(向上取整),再乘以空料架仓储单价得到空料架仓储费用。发动机库存取Actual inventories里取到长春外租库该发动机的仓储量,料架总数量需要手动维护。
        cell.UnitPriceOfEmptyShelfStorage( lcmr.StoragePrice() );
        cell.RentalWarehouseStorageFees( [Number] ( guard( ( cell.TotalQuantityOfMaterialRacks() - [Number]( plannedInventory / lce.PackagingCapacity() ) ) * lcmr.StoragePrice(), 0 ) ) );
        sumRentalWarehouseStorageFees := sumRentalWarehouseStorageFees + cell.RentalWarehouseStorageFees();
        
        // æ¸…洗费用:发动机入库量 / åŒ…装容量 * æ–™æž¶æ¸…洗单价。发动机入库量取发动机销量,包装容量取自发动机成本表。料架清洗单价取料架成本表。
        cell.CleaningCost( engineSales / guard( lce.PackagingCapacity(), 1 ) * lcmr.CleanPrice() );
        cell.CleaningCost( [Number] ( engineProductions / guard( lce.PackagingCapacity(), 1 ) * lcmr.CleanPrice() ) );
        sumCleaningCost := sumCleaningCost + cell.CleaningCost();
        // é¢„计总费用
        cell.EstimatedTotalCost( cell.StorageFeesForRentedWarehouses()             +
                                 cell.OutboundExpensesForRentedWarehouses()        +
                                 cell.ExternalRentalWarehouseTransportationCosts() +
                                 cell.RentalWarehouseStorageFees()                 +
                                 cell.CleaningCost()
                                );
        sumEstimatedTotalCost := sumEstimatedTotalCost + cell.EstimatedTotalCost();
        // ç³»æ•°
        cell.Coefficient( 1.05 );
        // æ€»è´¹ç”¨
        cell.TotalCost( cell.EstimatedTotalCost() * cell.Coefficient() );
        sumTotalCost := sumTotalCost + cell.TotalCost();
        
        cell.CC_EngineRackColumn( relset, ccerc );
      }
    }
    // åˆ›å»ºSUM行
    sumR := macroPlan.CC_EngineRackRow( relnew, Generation := "SUM", MLB_MQB := "", Index := 2 );
    traverse ( macroPlan, CC_EngineRackColumn, ccerc ) {
      cell := sumR.CC_EngineRackCell( relnew );
      cell.NumberOfEmptyShelves( sumNumberOfEmptyShelves );
      cell.StorageFeesForRentedWarehouses( sumStorageFeesForRentedWarehouses );
      cell.OutboundExpensesForRentedWarehouses( sumOutboundExpensesForRentedWarehouses );
      cell.ExternalRentalWarehouseTransportationCosts( sumExternalRentalWarehouseTransportationCosts );
      cell.RentalWarehouseStorageFees( sumRentalWarehouseStorageFees );
      cell.CleaningCost( sumCleaningCost );
      cell.EstimatedTotalCost( sumEstimatedTotalCost );
      cell.TotalCost( sumTotalCost );
      cell.CC_EngineRackColumn( relset, ccerc );
    }
  *]
}
_Main/BL/Type_CC_EngineRackCell/StaticMethod_Export.qbl
@@ -12,7 +12,7 @@
    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
    
    // ç¬¬ä¸€åˆ—(名称)
    cerrs       := selectsortedset( macroPlan, CC_EngineRackRow, tempCERR, true, tempCERR.Name() );
    cerrs       := selectsortedset( macroPlan, CC_EngineRackRow, tempCERR, true, tempCERR.Index(), tempCERR.Name() );
    firstColumn := xmlDOM.CreateElement( "column" );
    firstName   := xmlDOM.CreateElement( "name" );
    firstType   := xmlDOM.CreateElement( "type" );
@@ -63,7 +63,7 @@
      cellType.TextContent( "Number" );
      cellColumn.AppendChild( cellName );
      cellColumn.AppendChild( cellType );
      cells := selectsortedset( cerc, CC_EngineRackCell, tempCELL, true, tempCELL.CC_EngineRackRow().Name() );
      cells := selectsortedset( cerc, CC_EngineRackCell, tempCELL, true, tempCELL.CC_EngineRackRow().Index(), tempCELL.CC_EngineRackRow().Name() );
      traverse ( cells, Elements, c ) {
        cell := xmlDOM.CreateElement( "cell" );
        cell.SetAttribute( "value", [String]c.TotalQuantityOfMaterialRacks().Round( 0 ) ); // æ–™æž¶æ€»æ•°é‡
_Main/BL/Type_CC_EngineRackRow/Attribute_Index.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
Quintiq file version 2.0
#parent: #root
Attribute Index
{
  #keys: '3[415754.0.356027162][415754.0.356027161][415754.0.356027163]'
  ValueType: Number
}
_Main/BL/Type_DL_EngineRackCell/StaticMethod_CreateData.qbl
@@ -33,6 +33,15 @@
        lce  := select( macroPlan, LogisticsCostEngine, tempLCE, tempLCE.Generation() = dlerr.Generation() and tempLCE.MLB_MQB() = dlerr.MLB_MQB() and tempLCE.Factory() = "大连工厂" 
                        and tempLCE.StartDate() <= dlerc.StartDate() and tempLCE.EndDate() >= dlerc.StartDate().StartOfNextMonth() );
        
        // æ–™æž¶æˆæœ¬å‚æ•°
        lcmr := select( macroPlan, LogisticsCostMaterialRack, tempLCMR, tempLCMR.Factory() = "大连工厂"
                        and tempLCMR.StartDate() <= dlerc.StartDate() and tempLCMR.EndDate() >= dlerc.StartDate().StartOfNextMonth() );
        // è¿è¾“成本参数
        lct1 := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "发动机料架" and tempLCT.Origin() = "大连发动机的长春外租库" and tempLCT.Destination() = "大连厂内库" );
        lct2 := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "发动机料架" and tempLCT.Origin() = "大连外租库" and tempLCT.Destination() = "大连厂内库" );
        lct3 := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "发动机料架" and tempLCT.Origin() = "CC å®¢æˆ·åº“" and tempLCT.Destination() = "CC å¤–租库" );
        // å½“前月末最后一天日期                
        lastDayOfThisMonth := dlerc.StartDate().StartOfNextMonth() - 1; 
        
@@ -42,17 +51,97 @@
        plannedInventory := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriod, tempPISPIP,
                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                and
                                 exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() = "发动机" )         and
                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               = "大连外租库"       and
                                 tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               =  "大连发动机的长春外租库" and
                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       = dlerr.Generation() and
                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           = dlerr.MLB_MQB()    and
                                 tempPISPIP.Start().Date()                                                                              = lastDayOfThisMonth,
                                 tempPISPIP.Start().Date()                                                                              >= dlerc.StartDate()        and
                                 tempPISPIP.End().Date()                                                                                <= lastDayOfThisMonth,
                                 tempPISPIP.PlannedInventoryLevelEnd() );
        cell.PackagingCapacity( guard( lce.PackagingCapacity(), 1 ) );
        cell.PlannedInventory( plannedInventory );
        
        // CC外租库入库费用:发动机销量 / åŒ…装容量(向上取整)* æ–™æž¶å…¥åº“单价
        transportationQuantity1 := sum( macroPlan, SalesDemand.astype( Forecast ), tempF,
                                        tempF.Product_MP().Generation() =  dlerr.Generation()       and
                                        tempF.Product_MP().MQBMLB()     =  dlerr.MLB_MQB()          and
                                        tempF.StockingPointID()         =  "大连发动机的长春外租库" and
                                        tempF.StartDate()               >= dlerc.StartDate()        and
                                        tempF.EndDate()                 <= lastDayOfThisMonth,
                                        tempF.FulfilledQuantity() );
        cell.CCStorageFeesForRentedWarehouses( [Number] ( guard( transportationQuantity1 / lce.PackagingCapacity(), 0 ) * lcmr.WarehousingPrice() ) );
        
        // CC外租库出库费用:发动机销量 / åŒ…装容量(向上取整)* æ–™æž¶å‡ºåº“单价
        cell.CCOutboundExpensesForRentedWarehouses( [Number] ( guard( transportationQuantity1 / lce.PackagingCapacity(), 0 ) * lcmr.OutboundPrice() ) );
        // CC外租库仓储费用:料架总数量 - å‘动机库存 / åŒ…装容量(向上取整) * æ–™æž¶ä»“储单价
        cell.CCRentalWarehouseStorageFees( [Number] ( ( cell.TotalQuantityOfMaterialRacks() - guard( plannedInventory / lce.PackagingCapacity(), 0 ) ) * lcmr.StoragePrice() ) );
        // CC长途运输费用:调拨数量 / åŒ…装容量 / è£…载容量 * æ–™æž¶è¿è¾“单价
        transportationQuantity2 := sum( macroPlan, Unit.Lane.LaneLeg.Trip.ProductInTrip, tempPIT,
                                        tempPIT.Product_MP().Generation()                                                =  dlerr.Generation()      and
                                        tempPIT.Product_MP().MQBMLB()                                                    =  dlerr.MLB_MQB()         and
                                        tempPIT.Trip().Departure().Date()                                                >= dlerc.StartDate()       and
                                        tempPIT.Trip().Arrival().Date()                                                  <= lastDayOfThisMonth      and
                                        tempPIT.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().ID()      = "大连厂内库"              and
                                        tempPIT.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().ID() = "大连发动机的长春外租库",
                                        tempPIT.Quantity()
                                       );
        cell.CCLineHaulCost( [Number] ( guard( transportationQuantity2 / lce.PackagingCapacity() / lct1.LoadingCapacity(), 0 ) * guard( lct1.TransportPrice(), 1 ) ) );
        // CC短途运输费用:调拨数量 / åŒ…装容量 / è£…载容量 * æ–™æž¶è¿è¾“单价
        cell.CCShortDistanceTransportationCosts( [Number] ( guard( transportationQuantity1 / lce.PackagingCapacity() / lct3.LoadingCapacity(), 0 ) * guard( lct3.TransportPrice(), 1 ) ) )
        // DL外租库入库费用:发动机入库量 / åŒ…装容量(向上取整)* æ–™æž¶å…¥åº“单价
        inventoryQuantity := sum( macroPlan, SalesDemand.astype( Forecast ), tempF,
                                  tempF.Product_MP().Generation() =  dlerr.Generation()       and
                                  tempF.Product_MP().MQBMLB()     =  dlerr.MLB_MQB()          and
                                  tempF.StockingPointID()         =  "大连外租库"             and
                                  tempF.StartDate().Year()        = dlerc.StartDate().Year()  and
                                  tempF.StartDate().Month()       = dlerc.StartDate().Month(),
                                  tempF.FulfilledQuantity() );
    //                   info( "时间:", dlerc.StartDate().Format( "Y-M2-D2" ), "    å…¥åº“数量:", inventoryQuantity, "    åŒ…装容量:", guard( lce.PackagingCapacity(), 0 ),
    //                         "    è£…载容量:", guard( lct1.LoadingCapacity(), 0 ) ); // æµ‹è¯•输出
        cell.DLStorageFeesForRentedWarehouses( [Number] ( guard( inventoryQuantity / lce.PackagingCapacity(), 0 ) * guard( lcmr.WarehousingPrice(), 1 ) ) );
        // DL外租库出库费用:发动机出库量 / æ–™æž¶å®¹é‡ï¼ˆå‘上取整)* æ–™æž¶å‡ºåº“单价
        outboundQuantity := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), tempPISPIPPL,
                                 tempPISPIPPL.ProductInStockingPoint_MP().Product_MP().Generation() = dlerr.Generation()  and
                                 tempPISPIPPL.ProductInStockingPoint_MP().Product_MP().MQBMLB()     = dlerr.MLB_MQB()     and
                                 tempPISPIPPL.ProductInStockingPoint_MP().StockingPointID()         = "大连外租库"        and
                                 tempPISPIPPL.Start().Date()                                        >= dlerc.StartDate()  and
                                 tempPISPIPPL.End().Date()                                          <= lastDayOfThisMonth,
                                 tempPISPIPPL.NewSupplyQuantity() );
        cell.DLOutboundExpensesForRentedWarehouses( [Number] ( guard( outboundQuantity / lce.PackagingCapacity(), 0 ) * guard( lcmr.OutboundPrice(), 1 ) ) );
        // DL外租库运输费用:发动机运输量 / åŒ…装容量 / è£…载容量(向上取整)* æ–™æž¶è¿è¾“单价
        cell.DLExternalRentalWarehouseTransportationCosts( [Number] ( guard( inventoryQuantity / lce.PackagingCapacity() / lct2.LoadingCapacity(), 0 ) * guard( lct2.TransportPrice(), 1 ) ) );
        // DL外租库仓储费用:料架总数量 - å‘动机库存 / åŒ…装容量(向上取整)* ç©ºæ–™æž¶ä»“储单价
        plannedInventory1 := sum( macroPlan, Product_MP.ProductInStockingPoint_MP.ProductInStockingPointInPeriod, tempPISPIP,
                                  tempPISPIP.ProductInStockingPoint_MP().Product_MP().IsLeaf()                                                                       and
                                  exists( tempPISPIP.ProductInStockingPoint_MP().Product_MP(), AllParent.AsParent, tempPMP, tempPMP.ID() =  "发动机" )               and
                                  tempPISPIP.ProductInStockingPoint_MP().StockingPointID()                                               =  "大连外租库"             and
                                  tempPISPIP.ProductInStockingPoint_MP().Product_MP().Generation()                                       =  dlerr.Generation()       and
                                  tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           =  dlerr.MLB_MQB()          and
                                  tempPISPIP.Start().Date()                                                                              >= dlerc.StartDate()        and
                                  tempPISPIP.End().Date()                                                                                <= lastDayOfThisMonth,
                                  tempPISPIP.PlannedInventoryLevelEnd() );
        cell.DLRentalWarehouseStorageFees( [Number] ( guard( ( cell.TotalQuantityOfMaterialRacks() - plannedInventory1 ) / lce.PackagingCapacity(), 0 ) * guard( lcmr.StoragePrice(), 1 ) ) );
        //清洗费用:发动机入库量 / åŒ…装容量 * æ–™æž¶æ¸…洗单价。发动机入库量取发动机销量,包装容量取自发动机成本表。料架清洗单价取料架成本表。
        cell.CleaningCost( [Number] ( guard( inventoryQuantity / lce.PackagingCapacity(), 0 ) * guard( lcmr.CleanPrice(), 1 ) ) );
        // é¢„计总费用
        cell.EstimatedTotalCost( cell.CCStorageFeesForRentedWarehouses() + cell.CCOutboundExpensesForRentedWarehouses() + cell.CCRentalWarehouseStorageFees() + cell.CCLineHaulCost() +
                                 cell.CCShortDistanceTransportationCosts() + cell.DLStorageFeesForRentedWarehouses() + cell.DLOutboundExpensesForRentedWarehouses() +
                                 cell.DLExternalRentalWarehouseTransportationCosts() + cell.DLRentalWarehouseStorageFees() + cell.CleaningCost() );
        // ç³»æ•°
        cell.Coefficient( 1.05 );
        // æ€»è´¹ç”¨
        cell.TotalCost( cell.EstimatedTotalCost() * cell.Coefficient() );
        
        cell.DL_EngineRackColumn( relset, dlerc );
      }
_Main/BL/Type_DispatchShiftPlan/StaticMethod_Dispatch.qbl
@@ -2,19 +2,27 @@
#parent: #root
StaticMethod Dispatch (
  const MacroPlan macroPlan,
  RecycleBin owner,
  Archive owner,
  String versionFlag
)
{
  TextBody:
  [*
    // Akari Aug-21-2024 (created)
    owner.DispatchShiftPlan( relflush );
    // owner.DispatchShiftPlan( relflush );
    // owner.RB_DispatchShiftPlanBroker().Source().FlatQuery( "truncate table A_DispatchShiftPlan" );
    dispatchShiftPlans := selectset( owner,DispatchShiftPlan,dispatchShiftPlan,true );
    dispatchShiftPlanIndexTree := NamedValueTree::Create();
    for( i := 0 ; i < dispatchShiftPlans.Size() ; i++){
      dispatchShiftPlan := dispatchShiftPlans.Element( i );
      dispatchShiftPlanHandle := dispatchShiftPlanIndexTree.GetHandle( dispatchShiftPlan.FactoryName() + dispatchShiftPlan.ProductLine() + dispatchShiftPlan.ShiftDate().AsQUILL() );
      dispatchShiftPlanIndexTree.Root().AddChild( dispatchShiftPlanHandle,i );
    }
    
    now := DateTime::Now();
    macroPlanName := macroPlan.MDSMacroPlan().Description();
    traverse( macroPlan,Unit.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan,shiftPlan ){
    traverse( macroPlan,Unit.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan,shiftPlan ,shiftPlan.UnitPeriodTime().Period_MP().StartDate() >= macroPlan.StartOfPlanning().Date()){
       factory := shiftPlan.UnitPeriodTime().Unit();
       while( factory.HasParent() ){
         temp1 := factory;
@@ -23,19 +31,31 @@
           factory := temp1;
         }
       }
       productLine :=  shiftPlan.UnitPeriodTime().Unit().ID();
       shiftDate := shiftPlan.UnitPeriodTime().Period_MP().StartDate();
       factoryName := factory.ID();
      
       dispatchShiftPlanHandle := dispatchShiftPlanIndexTree.GetHandle( factoryName + productLine + shiftDate.AsQUILL() );
       dispatchShiftPlanIndex := guard( dispatchShiftPlanIndexTree.Root().Child( dispatchShiftPlanHandle ),null( NamedValue ));
       if( not isnull( dispatchShiftPlanIndex )){
         dispatchShiftPlan := dispatchShiftPlans.Element( dispatchShiftPlanIndex.GetValueAsNumber() );
         dispatchShiftPlan.Tips( shiftPlan.Remark() );
         dispatchShiftPlan.VersionName( macroPlanName );
         dispatchShiftPlan.VersionFlag( versionFlag );
         dispatchShiftPlan.InterfaceTime( now );
       }else{
       owner.DispatchShiftPlan( relnew,ID := OS:: GenerateGUIDAsString(),
                                ProductLine := shiftPlan.UnitPeriodTime().Unit().ID(),
                                ShiftDate := shiftPlan.UnitPeriodTime().Period_MP().StartDate(),
                                  ProductLine := productLine,
                                  FactoryName := factory.ID(),
                                  ShiftDate := shiftDate,
                                Tips := shiftPlan.Remark(),
                                VersionName := macroPlanName,
                                VersionFlag := versionFlag,
                                FactoryName := factory.ID(),
                                InterfaceTime := now
                                );
                                  InterfaceTime := now );
       }
    }
    
    owner.RB_DispatchShiftPlanBroker().AsyncExecute();
    // owner.RB_DispatchShiftPlanBroker().AsyncExecute();
  *]
}
_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_Dispatch.qbl
@@ -61,16 +61,21 @@
            shiftDayTime := select( shiftPattern,ShiftDayTime,object,true );
          }
        }
        if( shiftVolume <> 0 ){
          shiftSchedulingInformations := DispatchShiftSchedulingInformation::SplitShifts( owner,shiftName,shiftVolume );
        
        shiftSchedulingInformation := owner.DispatchShiftSchedulingInformation( relnew ,
                                                                                ID := IDHolder::GetGUID() ,
                                                                                InterfaceTime := now ,
                                                                                VersionName := macroPlan.MDSMacroPlan().Description(),
                                                                                Product := productID,
                                                                                ProductLine := productLine,
                                                                                ShiftDate := shiftDate,
                                                                                ShiftName := shiftName,
                                                                                ShiftVolume := shiftVolume );
        traverse( shiftSchedulingInformations,Elements,shiftSchedulingInformation ){
          shiftSchedulingInformation.InterfaceTime( now );
          shiftSchedulingInformation.VersionName( macroPlan.MDSMacroPlan().Description() );
          shiftSchedulingInformation.Product( productID );
          shiftSchedulingInformation.ProductLine( productLine );
          shiftSchedulingInformation.ShiftDate( shiftDate );
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.InterfaceTime( now );
    //      shiftSchedulingInformation.InterfaceTime( now );
        if( not isnull( shiftDayTime )){
          shiftSchedulingInformation.ShiftStartDate( shiftDayTime.StartDateTime() );
          shiftSchedulingInformation.ShiftEndDate( shiftDayTime.EndDateTIme() );
@@ -80,5 +85,7 @@
        }
      }
    }
      }
    }
  *]
}
_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
Quintiq file version 2.0
#parent: #root
StaticMethod SplitShifts (
  RecycleBin owner,
  String shiftName,
  Real shiftVolume
) as owning DispatchShiftSchedulingInformations
{
  TextBody:
  [*
    // Akari Oct-9-2024 (created)
    shiftSchedulingInformations := construct( DispatchShiftSchedulingInformations );
    if( shiftName = "3" ){
      shiftSchedulingInformation1 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
      shiftSchedulingInformation1.SingleShiftName( "1班" );
      shiftSchedulingInformations.Add( shiftSchedulingInformation1 );
      shiftSchedulingInformation2 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
      shiftSchedulingInformation2.SingleShiftName( "2班" );
      shiftSchedulingInformations.Add( shiftSchedulingInformation2 );
      shiftSchedulingInformation3 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
      shiftSchedulingInformation3.SingleShiftName( "3班" );
      shiftSchedulingInformations.Add( shiftSchedulingInformation3 );
    }else{
      shiftSchedulingInformation := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume );
      shiftSchedulingInformations.Add( shiftSchedulingInformation );
    }
    return &shiftSchedulingInformations;
  *]
}
_Main/BL/Type_LocalTool/StaticMethod_BatchSetUnitShiftPattern.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
Quintiq file version 2.0
#parent: #root
StaticMethod BatchSetUnitShiftPattern (
  Unit unit,
  ShiftPattern shiftPattern,
  Date startDate,
  Date endDate,
  Numbers weekdays
)
{
  TextBody:
  [*
    // Akari Oct-10-2024 (created)
    owner := unit.MacroPlan();
    dayPeriod_MPs := selectsortedset( owner,Period_MP,period_MP,
                                      period_MP.TimeUnit() = 'Day' and
                                      period_MP.StartDate() >= startDate and
                                      period_MP.EndDate() <= endDate and exists( weekdays, Elements,dayOfWeek,dayOfWeek = period_MP.StartDate().DayOfWeek() ) ,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( weekdays, Elements,dayOfWeek,dayOfWeek = period_MP.StartDate().DayOfWeek() ),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()) and not isnull( unitPeriodTime.UnitAvailability()));
      if( unitPeriodTimes.Size() > 0 ){
        LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
      }
    }
    if( weekPeriod_MPs.Size() <> 0 ){
      traverse( weekPeriod_MPs,Elements,period_MP ){
        unitPeriodTimes := selectset( unit,UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP() and not isnull( unitPeriodTime.UnitAvailability()));
        if( unitPeriodTimes.Size() > 0 ){
          LocalTool::SetUnitShiftPattern( owner,unitPeriodTimes,shiftPattern );
        }
      }
    }
  *]
}
_Main/BL/Type_LocalTool/StaticMethod_SetUnitShiftPattern.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
Quintiq file version 2.0
#parent: #root
StaticMethod SetUnitShiftPattern (
  MacroPlan macroPlan,
  UnitPeriodTimes unitPeriodTimes,
  ShiftPattern shiftPattern
)
{
  TextBody:
  [*
    // Akari Oct-10-2024 (created)
    firstElement := minselect( unitPeriodTimes, Elements, e, true, e.Start() );
    start := macroPlan.Start();
    timeunit := macroPlan.StartOfPlanningPeriod().TimeUnit();
    maintenance := Duration::Zero();
    efficiency := 1.0;
    allocation := 1.0;
    maxloadpercentage := macroPlan.GlobalParameters_MP().DefaultMaxLoadPercentage();
    nrofunitopen := 1;
    minloadthreshold := 0.0;
    if( not isnull( firstElement ) ){
      // To inherit the value from last unit availability while creating a new unit availability
      unitavailability := firstElement.UnitAvailability();
      start := firstElement.Start();
      if( not isnull( unitavailability ) ){
        timeunit := unitavailability.TimeUnit();
        maintenance := unitavailability.Maintenance();
        efficiency := unitavailability.Efficiency();
        allocation := unitavailability.Allocation();
        maxloadpercentage := unitavailability.MaximumLoadPercentage();
        nrofunitopen := unitavailability.NrOfUnitsOpen();
        minloadthreshold := unitavailability.MinimumLoadThreshold();
      }else{
        timeunit := firstElement.Period_MP().TimeUnit();
        maintenance := firstElement.Maintenance();
        efficiency := firstElement.Efficiency();
        allocation := firstElement.Allocation();
        maxloadpercentage := firstElement.MaximumLoadPercentage();
        nrofunitopen := firstElement.NrOfOpen();
        minloadthreshold := firstElement.MinimumLoadThreshold();
      }
    }
    isbatchedit := unitPeriodTimes.Size() > 1;
    UnitAvailability::CreateOrUpdateForUnitPeriodTimes( unitPeriodTimes,
                                                        not isbatchedit or false,
                                                        timeunit,
                                                        maintenance,
                                                        not isbatchedit or false,
                                                        efficiency,
                                                        false,
                                                        allocation,
                                                        not isbatchedit or true,
                                                        shiftPattern,
                                                        not isbatchedit or false,
                                                        maxloadpercentage,
                                                        not isbatchedit or false,
                                                        nrofunitopen,
                                                        false,
                                                        not isbatchedit or false,
                                                        minloadthreshold
                                                       );
  *]
}
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
@@ -26,6 +26,16 @@
        Taborder: 2
      ]
    }
    Component dhMDSHandles
    {
      #keys: '[414996.1.116451655]'
      BaseType: 'WebDataHolder'
      Databinding: 'structured[internal[ExternalMDSHandle]]*'
      Properties:
      [
        Taborder: 3
      ]
    }
  ]
  Properties:
  [
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuCapacities.def
@@ -27,5 +27,16 @@
        Tooltip: 'Event type'
      ]
    }
    Component MenuBatchSetShiftPattern
    {
      #keys: '[414996.1.119140284]'
      BaseType: 'WebMenu'
      Properties:
      [
        Image: 'QUEUE'
        Taborder: 8
        Title: '批量设置产线班次'
      ]
    }
  ]
}
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
@@ -7,11 +7,14 @@
  [*
    componentmds := ApplicationScope.ComponentMDS();
    
    dhMDSHandles.Data().Flush();
    macroPlans := construct( MacroPlans );
    scemps := selectset( ScenarioManager,ScenarioMP,mp,mp.IsLoaded());
    traverse( scemps,Elements,scemp ){
      mdsinstance     := select( componentmds, ComponentMDSKinds.ComponentMDSInstances, m, m.MDSID().MDSKey() = scemp.DatasetMDSID() );
      handle          := mdsinstance.GetMDSHandle();
      dhMDSHandles.Data().Add( handle );
      demandMacroPlan := handle.AsMacroPlan();
      macroPlans.Add( demandMacroPlan );
    }
_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: ContextMenuCapacities/MenuBatchSetShiftPattern
Response OnClick () id:Response_MacroPlanner_ContextMenuCapacities_MenuBatchSetShiftPattern_OnClick
{
  #keys: '[414996.1.119140372]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebMenu_OnClick'
  QuillAction
  {
    Body:
    [*
      // Open view
      ApplicationMacroPlanner.OpenView( 'BatchSetShiftPattern', ButtonCapacities );
    *]
    GroupServerCalls: false
  }
}
_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlActions_btnOk_OnClick.def
@@ -4,6 +4,10 @@
{
  #keys: '[413988.0.1596179631]'
  DefinitionID: 'Responsedef_WebButton_OnClick'
  Precondition:
  [*
    return not exists( MacroPlan, PackagingPlanNewCapability, tempPPNC, true, tempPPNC.ProductionLine() = ddslProductionLine.Text() );
  *]
  QuillAction
  {
    Body:
_Main/UI/MacroPlannerWebApp/Component_DialogCreateEditPackagingPlanNewCapability/Response_pnlContent_ddslProductionLine_OnCreated.def
@@ -13,7 +13,7 @@
  {
    Body:
    [*
      uids := selectuniquevalues( MacroPlan, Unit, tempU, true, tempU.ID() );
      uids := selectuniquevalues( MacroPlan, Unit, tempU, tempU.HasCapacityTypeTime(), tempU.ID() );
      
      this.Strings( uids.Concatenate( ";" ) );
    *]
_Main/UI/MacroPlannerWebApp/Component_DialogPackagingPlanLotSize/Response_pHeader_bAdd_OnClick.def
@@ -5,6 +5,11 @@
  #keys: '[413988.0.1401876560]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebButton_OnClick'
  Precondition:
  [*
    return not exists( MacroPlan, PackagingPlanLotSize, tempPPLS, true, tempPPLS.Factory() = ddslFactory.Text() and
                       tempPPLS.ProductID() = ddlProductID.Data().ID() );
  *]
  QuillAction
  {
    Body:
_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated#57.def
@@ -14,6 +14,11 @@
      traverse( macroPlans,Elements,element ){
        info( element.MDSID() ); 
      }
      info( dhMDSHandles.Data().Size() );
      traverse( dhMDSHandles.Data(),Elements,element ){
        info( element.AsMacroPlan().MDSMacroPlan().Description() );
      }
      this.Data( &offlinePlanTables );
    *]
    GroupServerCalls: false
_Main/UI/MacroPlannerWebApp/Component_FormDL_EngineRackReport/Response_pHeader_bRefresh_OnClick.def
@@ -14,6 +14,8 @@
    Body:
    [*
      DL_EngineRackCell::CreateData( MacroPlan );
      WebMessageBox::Success( Translations::A_VWED_Success() );
    *]
    GroupServerCalls: false
  }
_Main/UI/MacroPlannerWebApp/Component_FormPackagingPlan/Response_MatrixEditor493_OnCheckEditability.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
Quintiq file version 2.0
#parent: MatrixEditor493
Response OnCheckEditability (
  structured[PackagingPlanCell] cell,
  Real value
) id:Response_MatrixEditor493_OnCheckEditability
{
  #keys: '[415754.0.367460056]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebMatrixEditor_OnCheckEditability'
  QuillAction
  {
    Body:
    [*
      cond := focusedattribute = "Package" or focusedattribute = "Unpacking";
      editinfo.CanEdit( cond );
      editinfo.UserHint( ifexpr( cond, "", "不能修改" ) );
    *]
    GroupServerCalls: false
  }
}
_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Component_PanelRight.def
@@ -5,69 +5,6 @@
  BaseType: 'WebPanel'
  Children:
  [
    Component cbMonday
    {
      #keys: '[414996.1.116589495]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 3
      ]
    }
    Component cbTuesday
    {
      #keys: '[414996.1.116589517]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 4
      ]
    }
    Component cbWednesday
    {
      #keys: '[414996.1.116589519]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 5
      ]
    }
    Component cbThursday
    {
      #keys: '[414996.1.116589521]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 6
      ]
    }
    Component cbFriday
    {
      #keys: '[414996.1.116589523]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 7
      ]
    }
    Component cbSaturday
    {
      #keys: '[414996.1.116589525]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 8
      ]
    }
    Component cbSunday
    {
      #keys: '[414996.1.116589527]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Taborder: 9
      ]
    }
    Component dsStartDate
    {
      #keys: '[414996.1.116589712]'
@@ -75,7 +12,7 @@
      Properties:
      [
        Label: 'Start'
        Taborder: 1
        Taborder: 2
      ]
    }
    Component dsEndDate
@@ -85,7 +22,7 @@
      Properties:
      [
        Label: 'End'
        Taborder: 2
        Taborder: 3
      ]
    }
    Component LabelSelectUnit
@@ -105,6 +42,103 @@
      Properties:
      [
        Label: 'Apply'
        Taborder: 11
      ]
    }
    Component ddlShiftPattern
    {
      #keys: '[414996.1.116430349]'
      BaseType: 'WebDropDownList'
      Databinding: 'ShiftPattern'
      Children:
      [
        Component deContent710 id:deContent710_593
        {
          #keys: '[414996.1.116430350]'
          BaseType: 'WebDataExtractor'
          Properties:
          [
            DataType: 'MacroPlan'
            Source: 'MacroPlan'
            Taborder: 0
            Transformation: 'ShiftPattern'
          ]
        }
      ]
      Properties:
      [
        DisplayField: 'Name'
        Label: 'Shift pattern 1'
        Taborder: 1
      ]
    }
    Component cbMonday
    {
      #keys: '[414996.1.117120493]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Monday'
        Taborder: 4
      ]
    }
    Component cbTuesday
    {
      #keys: '[414996.1.117120516]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Tuesday'
        Taborder: 5
      ]
    }
    Component cbWednesday
    {
      #keys: '[414996.1.117120539]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Wednesday'
        Taborder: 6
      ]
    }
    Component cbThursday
    {
      #keys: '[414996.1.117120576]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Thursday'
        Taborder: 7
      ]
    }
    Component cbFriday
    {
      #keys: '[414996.1.117120599]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Friday'
        Taborder: 8
      ]
    }
    Component cbSaturday id:cbSaturday_682
    {
      #keys: '[414996.1.117120636]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Saturday'
        Taborder: 9
      ]
    }
    Component cbSunday
    {
      #keys: '[414996.1.117120659]'
      BaseType: 'WebCheckbox'
      Properties:
      [
        Label: 'Sunday'
        Taborder: 10
      ]
    }
_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/Response_PanelRight_bApply_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
Quintiq file version 2.0
#parent: PanelRight/bApply
Response OnClick () id:Response_PanelRight_bApply_OnClick
{
  #keys: '[414996.1.117189721]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebButton_OnClick'
  GroupServerCalls: true
  QuillAction
  {
    Body:
    [*
      weekdays := construct( Numbers );
      if( cbMonday.Checked() ){
        weekdays.Add( 1 );
      }
      if( cbTuesday.Checked() ){
        weekdays.Add( 2 );
      }
      if( cbWednesday.Checked() ){
        weekdays.Add( 3 );
      }
      if( cbThursday.Checked() ){
        weekdays.Add( 4 );
      }
      if( cbFriday.Checked() ){
        weekdays.Add( 5 );
      }
      if( cbSaturday.Checked() ){
        weekdays.Add( 6 );
      }
      if( cbSunday.Checked() ){
        weekdays.Add( 7 );
      }
      LocalTool::BatchSetUnitShiftPattern( dhSelectUnit.Data(),ddlShiftPattern.Data(),dsStartDate.Date(),dsEndDate.Date(),weekdays );
      WebMessageBox::Success( "Success");
    *]
  }
}
_Main/UI/MacroPlannerWebApp/Component_FormProductionLineBatchSetShiftPattern/_ROOT_Component_FormProductionLineBatchSetShiftPattern.def
@@ -12,5 +12,6 @@
  Properties:
  [
    Description: 'FormProductionLineBatchData'
    Title: '批量设置产线班次'
  ]
}
_Main/UI/MacroPlannerWebApp/Views/BatchSetShiftPattern.vw
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,386 @@
Quintiq file version 2.0
{
  viewcontents
  {
    forms
    {
      form_FormProductionLineBatchSetShiftPattern
      {
        title: 'QMacroPlanner::FormProductionLineBatchSetShiftPattern'
        shown: true
        componentID: 'QMacroPlanner::FormProductionLineBatchSetShiftPattern'
        layout
        {
          mode: 'open'
          rowPosition: 1
          rowSpan: 23
          columnPosition: 1
          columnSpan: 9
        }
        components
        {
          FormProductionLineBatchSetShiftPattern_PanelProductionLineBatchSetShiftPattern
          {
            sizeRatio: 1
          }
          FormProductionLineBatchSetShiftPattern_PanelLeft
          {
            sizeRatio: 1
          }
          FormProductionLineBatchSetShiftPattern_ListUnit
          {
          }
          FormProductionLineBatchSetShiftPattern_DataSetLevelProductionLineBatchSetShiftPattern
          {
            groupDepth: -1
            sort: 'Name'
            column_Name
            {
              columnId: 'Name'
              dataPath: 'Name'
              dataType: 'string'
              index: 0
              subtotals: ''
              width: 150
            }
          }
          FormProductionLineBatchSetShiftPattern_PanelRight
          {
            sizeRatio: 1
          }
        }
      }
      form_FormKPI
      {
        title: 'KPI Dashboard'
        shown: false
        componentID: 'FormKPI'
        layout
        {
          mode: 'dockright'
          index: 0
        }
        components
        {
          FormKPI_PanelKPI
          {
            sizeRatio: 1
            activeChild: 'PanelKPISelection'
          }
          FormKPI_PanelKPIDashboard
          {
            sizeRatio: 1
          }
          FormKPI_PanelKPISelection
          {
            sizeRatio: 1
          }
          FormKPI_ListKPISelection
          {
            QuillViewData
            {
              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
            }
          }
          FormKPI_DataSetLevelKPISelection
          {
            groupDepth: -1
            column_All_constraints
            {
              columnId: 'All constraints'
              dataPath: 'All constraints'
              dataType: 'string'
              title: 'All constraints'
              index: 0
              subtotals: ''
              width: 32
            }
            column_Name
            {
              columnId: 'Name'
              dataPath: 'Name'
              dataType: 'string'
              title: 'Name'
              index: 1
              subtotals: ''
              width: 200
            }
          }
        }
      }
      form_FormOptimizerStrategiesSlideIn
      {
        title: 'Optimizer Strategies'
        shown: false
        componentID: 'FormOptimizerStrategiesSlideIn'
        layout
        {
          mode: 'dockright'
          index: 1
        }
        components
        {
          FormOptimizerStrategiesSlideIn_ListOptimizerStrategiesSlideIn
          {
          }
          FormOptimizerStrategiesSlideIn_DataSetLevelOptimizerStrategiesSlideIn
          {
            groupDepth: -1
            column_All_constraints
            {
              columnId: 'All constraints'
              dataPath: 'All constraints'
              dataType: 'string'
              index: 0
              subtotals: ''
              width: 32
            }
            column_ImgIsValid
            {
              columnId: 'ImgIsValid'
              dataPath: 'ImgIsValid'
              dataType: 'string'
              index: 1
              subtotals: ''
              width: 32
            }
            column_Name
            {
              columnId: 'Name'
              dataPath: 'Name'
              dataType: 'string'
              index: 2
              subtotals: ''
              width: 270
            }
          }
        }
      }
      form_FormSanityCheck
      {
        title: 'Sanity Check'
        shown: false
        componentID: 'FormSanityCheck'
        layout
        {
          mode: 'dockright'
          index: 2
        }
        components
        {
          FormSanityCheck_PanelSanityCheckToolbar
          {
            sizeRatio: 1
          }
          FormSanityCheck_PanelSanityCheckContent
          {
            sizeRatio: 1
          }
          FormSanityCheck_PanelSanityCheckGroup
          {
            sizeRatio: 4
          }
          FormSanityCheck_ListSanityCheckGroup
          {
          }
          FormSanityCheck_DataSetLevelSanityCheckGroup
          {
            groupDepth: -1
            sort: 'DESC:IsShown,DESC:SanityCheckHighestCategory,DESC:_Expr3'
            column_All_constraints
            {
              columnId: 'All constraints'
              dataPath: 'All constraints'
              dataType: 'string'
              index: 0
              subtotals: ''
              width: 32
            }
            column_Show
            {
              columnId: 'Show'
              dataPath: 'Show'
              dataType: 'string'
              index: 1
              subtotals: ''
              width: 32
            }
            column_Category
            {
              columnId: 'Category'
              dataPath: 'Category'
              dataType: 'string'
              index: 2
              subtotals: ''
              width: 32
            }
            column_Group
            {
              columnId: 'Group'
              dataPath: 'Group'
              dataType: 'string'
              index: 3
              subtotals: ''
              width: 270
            }
            column__Expr3
            {
              columnId: '_Expr3'
              dataPath: '_Expr3'
              dataType: 'number'
              index: 4
              subtotals: ''
              width: 95
            }
          }
          FormSanityCheck_PanelSanityCheckMessage
          {
            sizeRatio: 5
          }
          FormSanityCheck_ListSanityCheckMessage
          {
          }
          FormSanityCheck_DataSetLevelSanityCheckMessage
          {
            groupDepth: -1
            sort: 'DESC:IsShown,SanityCheckGroup.Type,SanityCheckGroup.Group,Description'
            column_All_constraints
            {
              columnId: 'All constraints'
              dataPath: 'All constraints'
              dataType: 'string'
              index: 0
              subtotals: ''
              width: 32
            }
            column_Show
            {
              columnId: 'Show'
              dataPath: 'Show'
              dataType: 'string'
              index: 1
              subtotals: ''
              width: 32
            }
            column_Category
            {
              columnId: 'Category'
              dataPath: 'Category'
              dataType: 'string'
              index: 2
              subtotals: ''
              width: 32
            }
            column_Messages
            {
              columnId: 'Messages'
              dataPath: 'Messages'
              dataType: 'string'
              index: 3
              subtotals: ''
              width: 32
            }
            column_Description
            {
              columnId: 'Description'
              dataPath: 'Description'
              dataType: 'string'
              index: 4
              subtotals: ''
              width: 585
            }
          }
        }
      }
      form_FormDefaultCapacities
      {
        title: 'Default Capacities'
        shown: false
        componentID: 'FormDefaultCapacities'
        layout
        {
          mode: 'dockright'
          index: 3
        }
        components
        {
          FormDefaultCapacities_PanelContent
          {
            sizeRatio: 1
          }
          FormDefaultCapacities_PanelTimeCapacities
          {
            sizeRatio: 1
          }
          FormDefaultCapacities_PanelQuantityAndTransportCapacities
          {
            sizeRatio: 1
          }
          FormDefaultCapacities_PanelStockingPointCapacities
          {
            sizeRatio: 1
          }
          FormDefaultCapacities_PanelActions
          {
            sizeRatio: 1
          }
        }
      }
      form_FormGeneralSettings
      {
        title: 'General Settings'
        shown: true
        componentID: 'FormGeneralSettings'
        layout
        {
          mode: 'dockright'
          index: 4
        }
        components
        {
          FormGeneralSettings_PanelContent
          {
            sizeRatio: 1
          }
          FormGeneralSettings_PanelGeneralParameter
          {
            sizeRatio: 1
          }
          FormGeneralSettings_PanelLeadTimeDependent
          {
            sizeRatio: 1
          }
          FormGeneralSettings_PanelShelfLife
          {
            sizeRatio: 1
          }
          FormGeneralSettings_PanelSustainability
          {
            sizeRatio: 1
          }
          FormGeneralSettings_PanelForecastNetting
          {
            sizeRatio: 1
          }
          FormGeneralSettings_PanelActions
          {
            sizeRatio: 1
          }
        }
      }
    }
    userconfigurableinformation
    {
    }
    image: 'QUEUE'
    page: ''
    group: ''
    index: 0
    description: ''
  }
  formatversion: 2
  id: 'BatchSetShiftPattern'
  name: 'BatchSetShiftPattern'
  isglobal: false
  isroot: true
}