| | |
| | | { |
| | | 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 ); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | //} |
| | | *] |
| | | } |