lazhen
2024-10-11 cbf2cc895f1d1e7dcf522a462e77709d92667747
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Quintiq file version 2.0
#parent: #root
StaticMethod CreateData (
  MacroPlan macroPlan
)
{
  TextBody:
  [*
    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, Index := 1  );
      }
    }
    
    // 创建列
    indexDate := macroPlan.StartOfPlanning().Date().StartOfMonth();
    for ( i := 0; i < 12; i++ ) {
      macroPlan.CC_EngineRackColumn( relnew, StartDate := indexDate );
      indexDate := indexDate.StartOfNextMonth();
    }
    
    // 创建单元格
    traverse ( macroPlan, CC_EngineRackRow, ccerr ) { // 循环行
      info( "当前遍历的行:", ccerr.Generation(), " ", ccerr.MLB_MQB() );
      traverse ( macroPlan, CC_EngineRackColumn, ccerc ) { // 循环列
        // 发动机成本参数
        lce  := select( macroPlan, LogisticsCostEngine, tempLCE, tempLCE.Generation() = ccerr.Generation() and tempLCE.MLB_MQB() = ccerr.MLB_MQB() and tempLCE.Factory() = "长春工厂" 
                        and tempLCE.StartDate() <= ccerc.StartDate() and tempLCE.EndDate() >= ccerc.StartDate().StartOfNextMonth() );
        
        // 料架成本参数
        lcmr := select( macroPlan, LogisticsCostMaterialRack, tempLCMR, tempLCMR.Factory() = "长春工厂" 
                        and tempLCMR.StartDate() <= ccerc.StartDate() and tempLCMR.EndDate() >= ccerc.StartDate().StartOfNextMonth() );
                        
        // 运输成本参数
        lct  := select( macroPlan, LogisticsCostTransport, tempLCT, tempLCT.Product() = "发动机料架" and tempLCT.Origin() = "长春外租库" and tempLCT.Destination() = "CC 厂内库" );
        
        // 当前月末最后一天日期                
        lastDayOfThisMonth := ccerc.StartDate().StartOfNextMonth() - 1; 
        
        cell := ccerr.CC_EngineRackCell( relnew );
        
        // 空料架数量(长春厂该产品的料架总数量 - 发动机库存 / 包装容量 )
        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().Product_MP().Generation()                                       =  ccerr.Generation() and
                                 tempPISPIP.ProductInStockingPoint_MP().Product_MP().MQBMLB()                                           =  ccerr.MLB_MQB()    and
                                 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, 
                            tempFSID.Unit()              = FinancialProductionReport::GetDefaultCCUnit() and
                            tempFSID.Generation()        = ccerr.Generation()                            and
                            tempFSID.MqbMlb()            = ccerr.MLB_MQB()                               and
                            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, 
                                  tempFPID.Unit()              = FinancialProductionReport::GetDefaultCCUnit() and
                                  tempFPID.Generation()        = ccerr.Generation()                            and
                                  tempFPID.MqbMlb()            = ccerr.MLB_MQB()                               and
                                  tempFPID.StartDate().Year()  = ccerc.StartDate().Year()                      and
                                  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, 
                                       tempPIT.Product_MP().Generation()                                                =  ccerr.Generation() and
                                       tempPIT.Product_MP().MQBMLB()                                                    =  ccerr.MLB_MQB()    and
                                       tempPIT.Trip().Departure().Date()                                                >= ccerc.StartDate()  and
                                       tempPIT.Trip().Arrival().Date()                                                  <= lastDayOfThisMonth and
                                       tempPIT.Trip().LaneLeg().AsOriginStockingPointLeg().StockingPoint_MP().ID()      = "CC 厂内库"         and
                                       tempPIT.Trip().LaneLeg().AsDestinationStockingPointLeg().StockingPoint_MP().ID() = "长春外租库",
                                       tempPIT.Quantity()
                                      );
    //    info( "时间:", ccerc.StartDate().Format( "Y-M2-D2" ), "    运输数据:", transportationQuantity, "     运输单价:", lct.TransportPrice() );
        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( [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 );
    }
  *]
}