WebAPi保存单据如何自动触发匹配库存返回原创
金蝶云社区-null
null
9人赞赏了该文章 65次浏览 未经作者许可,禁止转载编辑于2024年05月31日 08:20:57

       标准产品提供了匹配库存返回服务,单据体增加菜单,配置上匹配库存返回服务,点击菜单会根据单据上录入的库存维度和需求数量对单据数据执行库存匹配和拆分。

       为了避免服务被误触发或重复触发引起单据数据混乱,目前此服务只能配置在菜单上使用,不能用于字段值更新事件或者实体服务规则。


       如果需要在WebAPi对接时自动触发匹配库存返回,可以借助表头字段值更新和二开插件来处理。

       1、为避免服务被多次触发,使用单据头字段作为触发源,比如在单据表头增加文本字段或者直接使用备注字段,勾选即时触发值更新事件。

       2、增加单据体菜单,点击事件中配置匹配库存返回服务,注意字段映射的正确性。

       3、编写单据表单插件,获得单据体菜单和菜单上配置的匹配库存返回服务,重写值更新事件,处理触发源字段值更新,调用匹配库存返回服务。

       4、调用WebAPi保存单据时,此字段在所有单据分录之后最后一个赋值


       插件示例代码大致如下,如果要复制使用,注意确认修改如下内容跟单据相匹配:名称空间名、类名、单据体标识、单据体实体属性名、单据头触发字段标识、单据状态字段标识、单据作废字段标识:



using Kingdee.BOS;

using Kingdee.BOS.Core.Bill.PlugIn;

using Kingdee.BOS.Core.Bill.PlugIn.Args;

using Kingdee.BOS.Core.DynamicForm;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.Core.Metadata.BarElement;

using Kingdee.BOS.Core.Metadata.BusinessService;

using Kingdee.BOS.Core.Metadata.EntityElement;

using Kingdee.BOS.Core.Metadata.FormElement;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Util;

using System;

using System.Linq;


namespace CustBillNameSpace

{

    public class BillPickInventory : AbstractBillPlugIn

    {

        /// <summary>

        /// 匹配库存服务配置

        /// </summary>

        private FormBusinessService _pickInvService = null;

        /// <summary>

        /// 菜单,作为事件源

        /// </summary>

        protected BarItem _barItem = null;


        /// <summary>

        /// 单据体(标识)

        /// </summary>

        private string entryEntityKey = "FEntity";


        /// <summary>

        /// 单据体实体属性名

        /// </summary>

        private string entryEntityName = "BillEntry";

        

        public override void OnBillInitialize(BillInitializeEventArgs e)

        {

            base.OnBillInitialize(e);

            //取得单据体匹配库存服务

            GetEntryPickInvService();

        }


        public override void DataChanged(DataChangedEventArgs e)

        {

            //单据头文本字段修改且在WebAPi对接时触发服务     

           if (this.Context.ClientType == ClientType.WebApi)

             {

                if ("FNote".Equals(e.Field.Key))

                {

                    InvokePickInv((DynamicObjectCollection)this.Model.DataObject[entryEntityName]);

                }

            }

        }


        /// <summary>

        /// 获取匹配库存菜单和服务

        /// </summary>

        private void GetEntryPickInvService()

        {

            _pickInvService = null;

            _barItem = null;

            foreach (Appearance ap in this.View.LayoutInfo.Appearances)

            {

                if (!entryEntityKey.Equals(ap.Key)) continue;


                BarDataManager menu = ((EntryEntityAppearance)ap).Menu;

                foreach (BarItem item in menu.BarItems)

                {

                    if (item.ClickActions.IsEmpty() == true) continue;

                    FormBusinessService service = item.ClickActions.FirstOrDefault(p => p.ActionId == 133);

                    if (service != null)

                    {

                        _pickInvService = (service.Clone()) as FormBusinessService;

                        ((LotPickingBusinessServiceMeta)_pickInvService).OnlyCurrentRow = false;

                        _pickInvService.ClassName = "Kingdee.K3.SCM.Business.DynamicForm.BusinessService.PickInventory, Kingdee.K3.SCM.Business.DynamicForm";

                        _barItem = item;

                        break;

                    }

                }

            }

        }


        /// <summary>

        /// 执行匹配库存服务

        /// </summary>

        public virtual void InvokePickInv(DynamicObjectCollection entrys)

        {

            if (entrys.Count < 1) return;


            if (_pickInvService != null && _pickInvService.IsEnabled && !_pickInvService.IsForbidden)

            {

                //检查单据状态,审核中、已审核、已作废不处理

                string strValue = Convert.ToString(this.Model.GetValue("FDocumentStatus"));

                if ("B".Equals(strValue) || "C".Equals(strValue)) return;

                strValue = Convert.ToString(this.Model.GetValue("FCANCELSTATUS"));

                if ("B".Equals(strValue)) return;

                FormBusinessServiceUtil.InvokeService(this.View, _barItem, _pickInvService, entryEntityKey, entrys[0], 0);

            }

        }


    }

}


    

        

赞 9