1 需求描述
生产订单自动生成工序计划时,需要自动从其他单据携带数据过来填充到“工序列表”子单据体。
2 接口原理
生产订单生成工序计划,其过程分为两步:生产订单到工序计划的单据转换,以及工序计划单据保存。因此理论上说,要对工序计划进行二次赋值,可以通过单据转换插件或保存操作插件来实现。
对于较为简单的字段携带,可以直接通过配置制造字段映射,将字段值填充到工序计划。但对于不方便配置的情况,就需要插件干预。
但是,由于Bos平台的限制,转换插件不支持“单据头-单据体-子单据体”结构的单据,因此使用单据转换插件时,无法取到工序计划工序列表(工序列表为工序计划的“子单据体”)的数据;而车间管理出于性能考虑,从生产订单生成工序计划的保存操作,跳过了保存操作插件,直接将生成的对象写入数据库,因此也无法插件介入。
为此,特提供生产订单生成工序计划的二开接口:
(1) 在生产订单到工序计划的制造字段映射后、尚未保存到数据库前,提供批量更新工序计划对象集合的接口。
(2) 在工序计划保存到数据库后,提供直接更新数据库的接口。
3 二开实现
3.1 直接配置字段映射(适用于简单的字段携带)
3.1.1 发布菜单“制造字段映射模型”
3.1.2 配置字段映射
登陆Cloud,打开“制造字段映射模型”,单据编号“SFC_OperationPlanning_Head”是生产订单到工序计划单据头的字段映射,单据编号“SFC_OperationPlanning_Entry”是工艺路线工序序列单据体到工序计划工序序列单据体的字段映射,单据号“SFC_OperationPlanning_SubEntry”是工艺路线工序列表子单据体到工序计划工序列表子单据体的字段映射。
如果工序计划工序列表的字段来源是工艺路线,就修改SFC_OperationPlanning_SubEntry,新增分录行,配置工艺路线字段到工序计划字段的映射,保存后提交审核:
3.1.3 重启IIS
需要重启IIS,才能生效。
3.2 接口插件(适用于不方便配置的字段携带,PT133705之后的补丁)
3.2.1 发布菜单“车间插件定义”
3.2.2 配置二开插件
登陆Cloud,打开“车间插件定义”,单据编号“MO2OptPlan”是生产订单生成工序计划的插件定义,用于制造字段映射后批量更新工序计划对象集合、或保存操作后处理。
反审核后进行修改,新增分录行,填写“插件实现类”,序号表示执行顺序(由小到大),保存后提交审核:
3.2.3 实现二开插件
继承Kingdee.K3.MFG.SFC.App.Core.PlugInDefine.AbstractSFCPlugIn,扩展方法BeforeExecute,通过参数BeforeExecuteEventArgs可以获取到已生成、但尚未保存到数据库的工序计划对象集合ObjectLst,直接给对象赋值即可;扩展方法AfterExecute,可以在工序计划已经保存到数据库后,直接进行数据库处理。参考代码如下:
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.K3.MFG.SFC.App.Core.PlugInDefine;
using Kingdee.K3.MFG.SFC.App.Core.PlugInDefine.Args;
namespace MyTest.MO2OptPlanPlugIns
{
/// <summary>
/// 生产订单生成工序计划插件
/// </summary>
public class MyMO2OptPlanPlugIn : AbstractSFCPlugIn
{
/// <summary>
/// 工序计划对象已生成,但尚未保存到数据库,可以直接给对象赋值
/// </summary>
/// <param name="e"></param>
public override void BeforeExecute(BeforeExecuteEventArgs e)
{
// 待处理的工序计划对象集合
if (e.ObjectLst == null) return;
// 工序序列
DynamicObjectCollection seqCol;
// 工序列表
DynamicObjectCollection operCol;
foreach (var optPlan in e.ObjectLst)
{
seqCol = optPlan["Entity"] as DynamicObjectCollection;
foreach (var seq in seqCol)
{
operCol = seq["SubEntity"] as DynamicObjectCollection;
foreach (var oper in operCol)
{
oper["F_A_Text"] = "测试";
}
}
}
}
/// <summary>
/// 工序计划已保存到数据库,可以直接进行数据库操作
/// </summary>
/// <param name="e"></param>
public override void AfterExecute(AfterExecuteEventArgs e)
{
}
}
}
3.2.4 重启IIS
需要重启IIS,才能生效。
推荐阅读