yypsybs
2023-09-09 3cb5a54def670d97301f07170fcaad213bfc54f2
_Main/BL/Type_MacroPlan/Method_MappingOperationBOMDataRouting#576.qbl
@@ -9,87 +9,87 @@
{
  TextBody:
  [*
    // yypsybs Aug-21-2023 (created)
    // 根据工艺段汇总处理
    processSections := selectuniquevalues( routingRows, Elements, row, true, row.ProcessSection() );
    traverse( processSections, Elements, processSection ) {
        rows := selectset( routingRows, Elements, row, row.ProcessSection() = processSection );
        firstRow := rows.Element( 0 );
        // 找orgCode/productId/processSection匹配且sequence最小的一组数据
        minSeq := MappingOperation::FindMinSeq( this, firstRow.OrganCode(), firstRow.ProductCode(), processSection );
        routingStepId := processSection + "_" + [String]minSeq;
        // 找对应routingStep
        routingStep := RoutingStep::FindByName( routing, routingStepId );
        if( not isnull( routingStep ) ) {
    //        error( "routing step : " + routing.ID() + "|" + routingStepId + " not found" );
        // 仅主料,统一处理
          noAlterRows := selectset( rows, Elements, noAlterRow, noAlterRow.AlternativeMaterialCode() = "" );
          traverse( noAlterRows, Elements, noAlterRow ) {
              traverse( routingStep, Operation, toLink ) {
                  // 检查主料
                  component := Product_MP::FindById( this, noAlterRow.ComponentCode() );
                  if( not isnull( component ) ) {
    //                  error( "component : " + noAlterRow.ComponentCode() + " not found" );
                  // 连接产品与operation
                  pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
                  trash := construct( OperationBOMs );
                  operationBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp,
                                                      true, trash );
                  operationBOM.MinQuantityInGroup( 0 );
                  operationBOM.Quantity( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
                  operationBOM.MaxQuantityInGroup( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
                  }
              }
          }
          // 替换料,按主料分组处理
          alterComponentIds := selectuniquevalues( rows, Elements, row, row.AlternativeMaterialCode() <> "", row.ComponentCode() );
          traverse( alterComponentIds, Elements, alterComponentId ) {
              alterRows := selectset( rows, Elements, row, row.ComponentCode() = alterComponentId );
              firstAlterRow := alterRows.Element( 0 );
              // 检查主料
              component := Product_MP::FindById( this, firstAlterRow.ComponentCode() );
              if( not isnull( component ) ) {
    //              error( "component : " + firstAlterRow.ComponentCode() + " not found" );
    //// yypsybs Aug-21-2023 (created)
    //
    //// 根据工艺段汇总处理
    //processSections := selectuniquevalues( routingRows, Elements, row, true, row.ProcessSection() );
    //traverse( processSections, Elements, processSection ) {
    //    rows := selectset( routingRows, Elements, row, row.ProcessSection() = processSection );
    //    firstRow := rows.Element( 0 );
    //    // 找orgCode/productId/processSection匹配且sequence最小的一组数据
    //    minSeq := MappingOperation::FindMinSeq( this, firstRow.OrganCode(), firstRow.ProductCode(), processSection );
    //    routingStepId := processSection + "_" + [String]minSeq;
    //    // 找对应routingStep
    //    routingStep := RoutingStep::FindByName( routing, routingStepId );
    //    if( not isnull( routingStep ) ) {
    ////        error( "routing step : " + routing.ID() + "|" + routingStepId + " not found" );
    //    // 仅主料,统一处理
    //      noAlterRows := selectset( rows, Elements, noAlterRow, noAlterRow.AlternativeMaterialCode() = "" );
    //      traverse( noAlterRows, Elements, noAlterRow ) {
    //          traverse( routingStep, Operation, toLink ) {
    //              // 检查主料
    //              component := Product_MP::FindById( this, noAlterRow.ComponentCode() );
    //              if( not isnull( component ) ) {
    ////                  error( "component : " + noAlterRow.ComponentCode() + " not found" );
    //              // 连接产品与operation
    //              pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
    //              trash := construct( OperationBOMs );
    //              operationBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp,
    //                                                  true, trash );
    //              operationBOM.MinQuantityInGroup( 0 );
    //              operationBOM.Quantity( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
    //              operationBOM.MaxQuantityInGroup( noAlterRow.UnitUsageOfComponents() / noAlterRow.ComponentOutputRate() );
    //              }
    //          }
                traverse( routingStep, Operation, toLink ) {
                    // 连接产品与operation
                    pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
                    trash := construct( OperationBOMs );
                    mainBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp,
                                                        true, trash );
                    mainBOM.Quantity( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
                    mainBOM.MaxQuantityInGroup( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
                    mainQty := mainBOM.Quantity();
                    Transaction::Transaction().Propagate();
                    // 添加辅料
                    traverse( alterRows, Elements, alterRow ) {
                        alterProd := Product_MP::FindById( this, alterRow.AlternativeMaterialCode() );
                        if( not isnull( alterProd ) ) {
        //                    error( "alterProd : " + alterRow.AlternativeMaterialCode() + " not found" );
                          stockingPointIdAlter := alterRow.OrganCode()  + "_" + alterRow.ProductType() + "_STOCK";
                          stockingPointAlter := StockingPoint_MP::FindById( this, stockingPointIdAlter );
                          if( isnull( stockingPointAlter ) ) {
                              error( "stockingPoint : " + stockingPointIdAlter + " not found" );
                          }
                          pispAlter := ProductInStockingPoint_MP::CreateIfNotFound( alterProd, stockingPointAlter );
                          mainInput := toLink.LastOperationInput();
                          trash := construct( OperationBOMs );
                          if( not isnull( mainInput ) ) {
                              alterBom := mainInput.Operation().LinkPISP( pispAlter, true, mainInput.OperationLinkGroupID(), trash );
                              alterBom.Quantity( mainBOM.MaxQuantityInGroup() * alterRow.AlternativeRate() );
                              alterBom.MaxQuantityInGroup( mainBOM.MaxQuantityInGroup() );
    //                          info( "Quantity" + [String]alterBom.Quantity() )
    //                          info( "MaxQuantityInGroup" + [String]alterBom.MaxQuantityInGroup() )
                              mainQty := mainQty - alterBom.Quantity();
                          }
                      }
                      mainBOM.Quantity( mainQty );
                   }
                }
              }
          }
       }
    }
    //      }
    //      // 替换料,按主料分组处理
    //      alterComponentIds := selectuniquevalues( rows, Elements, row, row.AlternativeMaterialCode() <> "", row.ComponentCode() );
    //      traverse( alterComponentIds, Elements, alterComponentId ) {
    //          alterRows := selectset( rows, Elements, row, row.ComponentCode() = alterComponentId );
    //          firstAlterRow := alterRows.Element( 0 );
    //          // 检查主料
    //          component := Product_MP::FindById( this, firstAlterRow.ComponentCode() );
    //          if( not isnull( component ) ) {
    ////              error( "component : " + firstAlterRow.ComponentCode() + " not found" );
    ////          }
    //            traverse( routingStep, Operation, toLink ) {
    //                // 连接产品与operation
    //                pisp := ProductInStockingPoint_MP::CreateIfNotFound( component, stockingPoint );
    //                trash := construct( OperationBOMs );
    //                mainBOM := toLink.LinkProduct( component, true, BaseOperationLink::GetGroupID( toLink, true, false ), pisp,
    //                                                    true, trash );
    //                mainBOM.Quantity( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
    //                mainBOM.MaxQuantityInGroup( firstAlterRow.UnitUsageOfComponents() / firstAlterRow.ComponentOutputRate() );
    //                mainQty := mainBOM.Quantity();
    //                Transaction::Transaction().Propagate();
    //                // 添加辅料
    //                traverse( alterRows, Elements, alterRow ) {
    //                    alterProd := Product_MP::FindById( this, alterRow.AlternativeMaterialCode() );
    //                    if( not isnull( alterProd ) ) {
    //    //                    error( "alterProd : " + alterRow.AlternativeMaterialCode() + " not found" );
    //                      stockingPointIdAlter := alterRow.OrganCode()  + "_" + alterRow.ProductType() + "_STOCK";
    //                      stockingPointAlter := StockingPoint_MP::FindById( this, stockingPointIdAlter );
    //                      if( isnull( stockingPointAlter ) ) {
    //                          error( "stockingPoint : " + stockingPointIdAlter + " not found" );
    //                      }
    //                      pispAlter := ProductInStockingPoint_MP::CreateIfNotFound( alterProd, stockingPointAlter );
    //                      mainInput := toLink.LastOperationInput();
    //                      trash := construct( OperationBOMs );
    //                      if( not isnull( mainInput ) ) {
    //                          alterBom := mainInput.Operation().LinkPISP( pispAlter, true, mainInput.OperationLinkGroupID(), trash );
    //                          alterBom.Quantity( mainBOM.MaxQuantityInGroup() * alterRow.AlternativeRate() );
    //                          alterBom.MaxQuantityInGroup( mainBOM.MaxQuantityInGroup() );
    ////                          info( "Quantity" + [String]alterBom.Quantity() )
    ////                          info( "MaxQuantityInGroup" + [String]alterBom.MaxQuantityInGroup() )
    //                          mainQty := mainQty - alterBom.Quantity();
    //                      }
    //                  }
    //                  mainBOM.Quantity( mainQty );
    //               }
    //            }
    //          }
    //      }
    //   }
    //}
  *]
}