Пакетное размещение акций на SOOrder - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь написать экран процесса для распределения запасов в заказе клиента в FIFO.На экране «Обработка» перечисляются все заказы на продажу для периода для распределения.

Я прошел через код LSSOLine и не смог выяснить фрагмент кода, где выполняется распределение.Кто-нибудь знает, как это сделать?

Обновление

Я пробовал следующий код, и он работает.Есть ли лучший способ сделать это?

private static void DoStockAllocation(SOLine row, SOOrderEntry grp)
        {
            try
            {
                grp.Document.Current = PXSelect<
                    SOOrder, 
                    Where<SOOrder.orderType, Equal<Required<SOOrder.orderType>>, 
                        And<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>>
                    .Select(grp, row.OrderType, row.OrderNbr);
                if (grp.Document.Current != null && grp.Document.Current.Status == SOOrderStatus.Open)
                {
                    grp.Transactions.Current = row;
                   PXSelectBase<INLocationStatus> cmd = new PXSelectReadonly2<INLocationStatus,
                InnerJoin<INLocation, On<INLocation.locationID, Equal<INLocationStatus.locationID>>,
                LeftJoin<INSiteStatus, On<INSiteStatus.inventoryID, Equal<INLocationStatus.inventoryID>,
                    And<INSiteStatus.subItemID, Equal<INLocationStatus.subItemID>,
                    And<INSiteStatus.siteID, Equal<INLocationStatus.siteID>>>>>>,
                    Where<INLocationStatus.inventoryID, Equal<Required<INLocationStatus.inventoryID>>,
                        And<INLocationStatus.subItemID, Equal<Required<INLocationStatus.subItemID>>,
                        And<INLocationStatus.siteID, Equal<Required<INLocationStatus.siteID>>,
                        And<INLocation.salesValid, Equal<boolTrue>,
                        And<INLocation.inclQtyAvail, Equal<boolTrue>,
                        And<INLocationStatus.qtyOnHand, Greater<decimal0>>>>>>>>(grp);

                    foreach (PXResult<INLocationStatus, INLocation, INSiteStatus> ln in cmd.Select(row.InventoryID,row.SubItemID,row.SiteID))
                    {
                        INLocationStatus locationStatus = ln;
                        INSiteStatus siteStatus = ln;
                        SiteStatus accumsiteavail = new SiteStatus();
                        PXCache<INSiteStatus>.RestoreCopy(accumsiteavail, siteStatus);
                        accumsiteavail = (SiteStatus)grp.Caches[typeof(SiteStatus)].Insert(accumsiteavail);

                        decimal? AvailableQty = 0m;


                        decimal? SiteAvailableQty = locationStatus.QtyHardAvail;//siteStatus.QtyHardAvail + accumsiteavail.QtyHardAvail;


                        AvailableQty = SiteAvailableQty;
                        if (AvailableQty <= 0m)
                        {
                            continue;
                        }
                        if (row.LocationID == null)
                        {
                            row.LocationID = locationStatus.LocationID;
                            grp.Transactions.Update(row);
                        }
                        SOLineSplit split = new SOLineSplit();
                        if ( grp.splits.Select().Count > 0)
                        {
                            split = grp.splits.Select(row.OrderType, row.OrderNbr, row.LineNbr); 
                        }
                        else
                        {
                            split =  new SOLineSplit();
                            split = grp.splits.Insert(split);
                            split.InventoryID = row.InventoryID;
                            split.SiteID = row.SiteID;
                            split.OrderType = row.OrderType;
                            split.OrderNbr = row.OrderNbr;
                            split.LineNbr = row.LineNbr;
                            split.UOM = row.UOM;
                            split = PXCache<SOLineSplit>.CreateCopy(grp.splits.Update(split));
                        }
                        //split.LocationID = locationStatus.LocationID;
                        split.Qty = (AvailableQty < row.OrderQty) ? AvailableQty : row.OrderQty;
                        split.IsAllocated = true;
                        grp.splits.Update(split);
                        break;

                    }
                    grp.Save.Press();
                }
            }
            catch(Exception ex)
            {

            }
        }

1 Ответ

0 голосов
/ 12 ноября 2018

Вам понадобится указать комбинацию LSSOLine и SOLineSplitPlanID на SOLineSplit.PlanID на странице процесса.В качестве альтернативы вы могли бы использовать экземпляр SOOrderEntry для выполнения обновлений / отметки выделения.

Следующее было скопировано из графа SOOrderEntry и является 2 компонентами из того, что я могу сказать, что управляет логикой распределения,Оттуда вам просто нужно отметить линии разделения, которые должны быть выделены и должны быть хорошими.Или хотя бы начало.Проблема, с которой вы можете столкнуться, это то, что ищет текущий SOOrder.Возможно, вам придется установить ток до того, как пометить сплиты solines как выделенные.(при условии, что я правильно понимаю ваш вопрос)

Управление записями распределения ...

public LSSOLine lsselect;

Добавьте использование SOLineSplitPlanID, который управляет записями INItemPlan ...

[PXMergeAttributes(Method = MergeMethod.Append)]
[SOLineSplitPlanID(typeof(SOOrder.noteID), typeof(SOOrder.hold), typeof(SOOrder.orderDate))]
protected virtual void SOLineSplit_PlanID_CacheAttached(PXCache sender)
{
}
...