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...
点击下载文档
本文2024-09-16 17:14:35发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-14450.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章