Python插件 - 单据转换插件-WebApi下推单据 自定义入参插件

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

Python插件 - 单据转换插件-WebApi下推单据 自定义入参插件

# 需求 WebApi 关联订单入库做保存接口需要传的参数有点多太麻烦了 WebApi 下推动作 采购订单下推采购入库 需要修改入库的数量。 **C#版本如果有需要的后续补上来。** 为了不重启IIS,直接开干,记录一下代码~ # 入参 ``` json { "FormId": "PUR_PurchaseOrder", //表单ID "EntryIds": "100049,100050,100052", //采购订单分录内码 多个分录,号隔开 "RuleId": "PUR_PurchaseOrder-STK_InStock", //单据转换规则 "CustomParams": { "FEntry": [{ "FRealQty": 1, //入库数量 "FStockID": "CK001", //仓库编码 "FENTRYID": 100049, //对应源单分录内码(采购订单) "FNote": "备注一下" //备注 }, { "FRealQty": 2, //入库数量 "FStockID": "CK001", //仓库编码 "FENTRYID": 100050, //对应源单分录内码(采购订单) "FNote": "备注二下" //备注 }, { "FRealQty": 3, //入库数量 "FStockID": "CK001", //仓库编码 "FENTRYID": 100052, //对应源单分录内码(采购订单) "FNote": "备注三下" //备注 } ] } //目标单据数据 } ``` # 解析json CustomParams 自定义参数-传到转换插件的操作选项中 this.Option 对应源单分录内码(采购订单)来匹配对应的数量 # 代码 ``` python #作者: 老李头(Dean) import clr clr.AddReference("System") clr.AddReference("System.Core") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Kingdee.BOS.DataEntity") clr.AddReference("Kingdee.BOS.ServiceHelper") clr.AddReference("Newtonsoft.Json") from Kingdee.BOS import * from Kingdee.BOS.Core import * from Kingdee.BOS.Core.Bill import * from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.Metadata import * from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn import * from Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args import * from Kingdee.BOS.Core.Metadata.FormElement import * from Kingdee.BOS.Orm.DataEntity import * from Kingdee.BOS.Orm.Metadata.DataEntity import * from Kingdee.BOS.ServiceHelper import * from System import * from System.Collections.Generic import * from System.ComponentModel import * from System.Linq import * from Newtonsoft.Json import * from Newtonsoft.Json.Linq import * #单据转换之后事件 def AfterConvert(e): paraDIC=this.Option.GetVariables(); if paraDIC.ContainsKey("FEntry") == False: return; FInStockEntryItem = paraDIC["FEntry"] if FInStockEntryItem is None: return; FInStockEntry = e.TargetBusinessInfo.GetEntity("FInStockEntry"); #得到单据数据包扩展集合 billDynObjExs = e.Result.FindByEntityKey("FBillHead"); tView = CreateView(e.TargetBusinessInfo.GetForm().Id);#创建目标单据视图 for billDynObjEx in billDynObjExs:#循环数据包扩展集合 billDynObj = billDynObjEx.DataEntity; #单个单据数据包 tView.Model.DataObject = billDynObj; #给模型设置数据包 entryDynObjs = FInStockEntry.DynamicProperty.GetValue(billDynObj); #得到字段所在实体的数据包 rowIndex = 0;#分录行索引 for rowObj in entryDynObjs: #循环分录 dynObj = entryDynObjs[rowIndex]; #原原分录行数据包 #查找对应分录标识 fRealQtyField = e.TargetBusinessInfo.GetField("FRealQty"); #数量 FStockID = e.TargetBusinessInfo.GetField("FStockID"); #仓库 FNote = e.TargetBusinessInfo.GetField("FNote"); #备注 Link = dynObj["FInStockEntry_Link"]; #找出LK关系表找出对应的源单内码数据 entity = FirstOrDefault(Where(FInStockEntryItem,lambda w: w["FENTRYID"].ToString()==Link[0]["SId"].ToString())) if entity != None : tView.Model.SetValue(fRealQtyField, dynObj, entity["FRealQty"]); #这字段值并且会触发值更新事件 tView.InvokeFieldUpdateService(fRealQtyField.Key, rowIndex); #调用实体服务规则 tView.Model.SetItemValueByNumber("FStockId",entity["FStockID"].ToString(), rowIndex); tView.InvokeFieldUpdateService(FStockID.Key, rowIndex); #调用实体服务规则 tView.Model.SetValue(FNote, dynObj, entity["FNote"]); #这字段值并且会触发值更新事件 rowIndex=rowIndex+1; return #创建单据视图 def CreateView(formId): metadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, formId); OpenParameter = CreateOpenParameter(this.Context, metadata); Provider = metadata.BusinessInfo.GetForm().GetFormServiceProvider(True); importViewClass = "Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web"; importViewClassType = Type.GetType(importViewClass); view = Activator.CreateInstance(importViewClassType); view.Initialize(OpenParameter, Provider); return view; #创建输入参数 def CreateOpenParameter(ctx, metaData): form = metaData.BusinessInfo.GetForm(); openPara = BillOpenParameter(form.Id, metaData.GetLayoutInfo().Id); openPara = BillOpenParameter(form.Id, ""); openPara.Context = ctx; openPara.ServiceName = form.FormServiceName; openPara.PageId = Guid.NewGuid().ToString(); #单据 openPara.FormMetaData = metaData; openPara.LayoutId = metaData.GetLayoutInfo().Id; #操作相关参数 openPara.Status = OperationStatus.ADDNEW; openPara.PkValue = None; openPara.CreateFrom = CreateFrom.Default; openPara.ParentId = 0; openPara.GroupId = ""; openPara.DefaultBillTypeId = None; openPara.DefaultBusinessFlowId = None; #修改主业务组织无须用户确认 openPara.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", False); #插件 plugins = form.CreateFormPlugIns(); openPara.SetCustomParameter(FormConst.PlugIns, plugins); return openPara; def FirstOrDefault(col, fun = lambda x: True): return Enumerable.FirstOrDefault[object](col, Func[object, bool](fun)) def Where(col, fun): return Enumerable.Where[object](col, Func[object, bool](fun)) ``` # 部署 -打开BOS设计器 选择:文件 - 单据转换 ![image.webp](/download/010000d846238f7c421b866cc8ab237874da.webp) ![image.webp](/download/010048e887b975d84e36a26971700d783b07.webp) -选择插件策略 注册python插件 粘贴进去代码 点击确认保存 **弹出存在错误** 这个是设计器误报直接点击确认即可! ![image.webp](/download/0100136b52a3f1a24c959881b20c95fbb504.webp) - 最后记得要启动跟保存 ![image.webp](/download/01000549c37dbcf1449a801bbb23940e31b1.webp) # 实现效果 ![image.webp](/download/01009e8aadd7f5cc4b588f3581beb8cd681f.webp) ![image.webp](/download/0100ef6be8ac55694629afceb1dd2456ea09.webp) # 注意事项 - 细心的小伙伴应该能发现 3个分录生成采购入库只有 **2条数据** - 实际上有一个料是设置了检验的 ![image.webp](/download/0100637bba9ab33242bbbe27aab120af75d3.webp) - **在系统上做下推实际也是生成2条** ![微信图片_20230513092143.webp](/download/0100d6a2114c2e494603a69f73d6796ab2bc.webp)

entity = FirstOrDefault(Where(FInStockEntryItem,lambda w: w["FENTRYID"].ToString()==Link[0]["SId"].ToString())) 老师 这句是什么意思,是根据源单内码和传入内码是否一致,来获取什么数据呢,主要是这个函数不知道啥意思。


Python插件 - 单据转换插件-WebApi下推单据 自定义入参插件

# 需求WebApi 关联订单入库做保存接口需要传的参数有点多太麻烦了 WebApi 下推动作 采购订单下推采购入库 需要修改入库的数量。**C...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息