WebAPi保存单据如何自动触发匹配库存返回
标准产品提供了匹配库存返回服务,单据体增加菜单,配置上匹配库存返回服务,点击菜单会根据单据上录入的库存维度和需求数量对单据数据执行库存匹配和拆分。
为了避免服务被误触发或重复触发引起单据数据混乱,目前此服务只能配置在菜单上使用,不能用于字段值更新事件或者实体服务规则。
如果需要在WebAPi对接时自动触发匹配库存返回,可以借助表头字段值更新和二开插件来处理。
1、此服务为整单服务,一张单据触发一次即可,为避免服务被多次触发,使用单据头字段作为触发源,比如在单据表头增加文本字段或者直接使用备注字段,字段勾选即时触发值更新事件属性。
2、如果单据分录物料或其他字段上有配置“无源单批号拣货”服务,要勾选“引入和WebAPi禁用”。
3、增加单据体菜单,点击事件中配置匹配库存返回服务,注意字段映射的正确性。
4、编写单据表单插件,获得单据体菜单和菜单上配置的匹配库存返回服务,重写值更新事件,处理触发源字段值更新,调用匹配库存返回服务。
5、调用WebAPi保存单据时,设置 "IsAutoAdjustField": false,自己保证字段录入顺序,JSON中把触发源字段放在所有单据分录之后最后一个赋值。
插件示例代码大致如下,如果要复制使用,注意确认修改如下内容跟单据相匹配:名称空间名、类名、单据体标识、单据体实体属性名、单据头触发字段标识、单据状态字段标识、单据作废字段标识:
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);
}
}
}
}
也可以直接模拟菜单点击
WebAPI创建单据自动获取批号\匹配库存出库二开方案 (kingdee.com)
WebAPi保存单据如何自动触发匹配库存返回
本文2024-09-16 18:59:42发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-25729.html
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf