Как установить настраиваемое поле в Acumatica Production Detail Operation при первом создании производственного заказа? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть настраиваемое поле для операции Acumatica Production Detail Operation (UsrElitableForRoboticFulfillment), которую я создал для установки на основе критериев элементов компонента на вкладке Материалы. (код ниже)

Я хотел бы вызвать это действие, чтобы задать поле, как только будет создан производственный заказ, но разделенный характер производственного заказа таков, что в поднятой производственной детали нет событий. что я могу прикрепить и вызвать действие. Я попробовал Row Inserted, а также Persist делегат на графике Production Detail.

Я МОГУ присоединить либо к AMProdItem Row Inserted, либо Persist Delegate на графике Production Maint, но на данный момент времени операции и Материалы еще не созданы.

Как лучше всего обновить это поле при создании нового производственного заказа?

Код действия:

    public PXAction<AMProdItem> UpdateEligibleForRoboticFulfillment;
    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Update Robotic Eligibility", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
    protected void updateEligibleForRoboticFulfillment()
    {
        AMProdItem prodDetail = Base.ProdItemRecords.Current;
        AMProdOper prodOper = Base.ProdOperRecords.Current;
        InventoryItem finishedProduct = PXSelect<InventoryItem,
               Where<InventoryItem.inventoryID, Equal<Current<AMProdItem.inventoryID>>>>.Select(Base).FirstOrDefault();

        //Only production orders are eligible for robotic fulfillment, not disassemblies
        if (prodDetail.OrderType == "MO")
        {
            bool wasRoboticsEligible = (prodOper.GetExtension<AMProdOperExt>().UsrEligibleForRoboticFulfillment ?? false);

            //Get the current branchID
            int branchID = (int)Base.Accessinfo.BranchID;

            //Get the default site/warehouse for this branch.
            INSite site = INTranHelper.GetDefaultSiteForItemBranch(branchID);

            //Get the flag indicating whether this site is active for robotics
            bool activeRobotics = site.GetExtension<INSiteExt>().UsrActiveRobotics ?? false;
            //Get the flags for manual process and component robotics compatible

            bool requiresManualProcess = finishedProduct.GetExtension<InventoryItemExt>().UsrManualFinishRequired ?? false;
            //Gotta be prepared for the possibility that more than one component is used
            //Check for any components that are NOT robotics eligible that have qty required and haven't already been fully allocated
            PXResultset<AMProdMatl> components = PXSelectJoin<AMProdMatl,
            InnerJoin<InventoryItem, On<InventoryItem.inventoryID, Equal<AMProdMatl.inventoryID>,
            And<InventoryItemExt.usrRoboticsCompatible, Equal<False>,
            And<AMProdMatl.orderType, Equal<Current<AMProdOper.orderType>>,
            And<AMProdMatl.prodOrdID, Equal<Current<AMProdOper.prodOrdID>>,
            And<AMProdMatl.operationID, Equal<Current<AMProdOper.operationID>>,
            And<AMProdMatl.qtyActual, Less<AMProdMatl.totalQtyRequired>,
            And<AMProdMatl.qtyReq, Greater<decimal0>>>>>>>>>>
            .Select(Base);

            bool roboticsEligible = !requiresManualProcess && activeRobotics;
            //If any component is not eligible, the whole operation is not eligible
            if (components.Count > 0)
            {                    
                       roboticsEligible = false;
            }

            //If the robotics eligible flag should have changed, change it
            if (wasRoboticsEligible != roboticsEligible)
            {
                prodOper.GetExtension<AMProdOperExt>().UsrEligibleForRoboticFulfillment = roboticsEligible;
                Base.ProdOperRecords.Update(prodOper);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...