陈清红
2025-04-14 880f3c0257eeb8c37761d484258fdd102a369a19
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
Quintiq file version 2.0
#parent: #root
StaticMethod Package (
  MacroPlan macroPlan,
  PackagingPlanRow ppr,
  PackagingPlanColumn ppc,
  output Number needPackagingQuantity
)
{
  TextBody:
  [*
    // 计划开始时间
    plannedStartDate := macroPlan.StartOfPlanning().Date();
    
    traverse ( ppr, PackagingPlanCell, ppcell, ppcell.PackagingPlanColumn() = ppc ) {
      // Product_MP
      pmp                     := select( macroPlan, Product_MP, tempPMP, tempPMP.IsLeaf() and tempPMP.ID() = ppr.ProductID() );
      // 包装lotsize
      ppls                    := select( macroPlan, PackagingPlanLotSize, tempPPLS, tempPPLS.Factory() = ppr.Factory() and 
                                         tempPPLS.ProductID() = ifexpr( exists( macroPlan, PackagingPlanLotSize, tempPPLS1, tempPPLS1.ProductID() = pmp.ID() ),
                                                                        pmp.ID(),
                                                                        pmp.ParentID() ) );
      // 一日包装容量
      ppnc                    := select( macroPlan, PackagingPlanNewCapability, tempPPNC, tempPPNC.Factory() = ppr.Factory() and 
                                         tempPPNC.ProductID() = ifexpr( exists( macroPlan, PackagingPlanNewCapability, tempPPNC1, tempPPNC1.ProductID() = pmp.ID() ),
                                                                        pmp.ID(),
                                                                        pmp.ParentID() ) );
      // Unit
      us                      := selectset( macroPlan, Unit, tempU, tempU.ID().Regex( ppr.FactoryAbbreviation() + " " + ppr.Category() ) );
       
      // 包装库存出现负值,需要设置包装量
      if ( not isnull( ppls ) and not isnull( ppnc ) ) {
        // 包装开始的索引
        indexPPCell           := ppcell.Previous();
        
    //      info( "产线个数:", us.Size(), "    开始时间:", ppcell.StartDate().Format( "Y-M2-D2" ), "    包装库存数量:", ppcell.PackagingInventory(), "    需要包装的数量:", needPackagingQuantity, 
    //            "    包装lotsize:",guard( ppls.LotSize(), 0 ), "    最大包装容量:", ppnc.MaximumDailyPackagingQuantity() );
          
        while ( not isnull( indexPPCell )                                                   and 
                indexPPCell.StartDate() >= plannedStartDate                                 and 
                exists( us, Elements.UnitPeriod.astype( UnitPeriodTime ).ShiftPlan, tempSP, 
                        tempSP.UnitPeriodTime().StartDate() = indexPPCell.StartDate(),
                        tempSP.Outcome() <> "" )                                            and
                needPackagingQuantity > 0 ) {
          // 能包装的数量
          canPackagingQuantity  := ifexpr( ceil( needPackagingQuantity / ppls.LotSize() ) < floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ),
                                           ceil( needPackagingQuantity / ppls.LotSize() ),
                                           floor( ppnc.MaximumDailyPackagingQuantity() / ppls.LotSize() ) ) * ppls.LotSize();
          // 改类下其他产品包装总和
          categoryPackageQuantity := sum( indexPPCell, PackagingPlanColumn.PackagingPlanCell, tempPPCell, 
                                          tempPPCell <> indexPPCell                                                            and
                                          tempPPCell.PackagingPlanRow().Factory() = indexPPCell.PackagingPlanRow().Factory()   and
                                          tempPPCell.PackagingPlanRow().Category() = indexPPCell.PackagingPlanRow().Category(),
                                          tempPPCell.Package() );
          canPackagingQuantity    := minvalue( [Number] ( ppnc.MaximumDailyPackagingQuantity() - categoryPackageQuantity ), canPackagingQuantity );
    //        info( "开始包装的日期:", indexPPCell.StartDate().Format( "Y-M2-D2" ), "    能包装的数量:", canPackagingQuantity );
            
          indexPPCell.Package( canPackagingQuantity );
          Transaction::Transaction().Propagate( attribute( PackagingPlanCell, PackagingInventory ) );
          Transaction::Transaction().Propagate( attribute( PackagingPlanCell, UnpackagedInventory ) );
            
          needPackagingQuantity := needPackagingQuantity - canPackagingQuantity;
          indexPPCell           := indexPPCell.Previous();
        }
      }
    }
  *]
}