PLM.二开案例.PLM物料/BOM变更时同步状态至ERP

【应用场景】
PLM物料、BOM的变更状态需要同步至ERP
说明:V9版本,PT-161001特性补丁中已标准支持同步变更中状态至ERP物料和物料清单中,无需二开,详情见研发物料/BOM变更时,同步变更状态至制造物料/物料清单中 (kingdee.com)
【实现思路】
第一种方式
在ERP端单据中新增字段,根据关联的PLM对象实时查,此方式开发难度较小。对于数据关联关系可参考
如何通过脚本将ERP物料、BOM的属性批量更新到PLM中 (kingdee.com)
第二种方式
通过干预变更单的审核、生效操作,实时将信息更新至ERP对象中。此方式存在一定开发难度,但是可以提供一个干预变更单审核和生效干预的思路。本文提供此方案示例。
【案例演示】
ERP物料新增一个PLM变更中标记,当PLM端物料为变更中时,可以在ERP端物料看到状态。
【实现步骤】
变更单审核二开
<1>变更单状态转换至审核时,生成T版对象,原版对象状态更新至变更中。因此可以使用状态状态接口干预
PLM二开:扩展程序开发之插件模式中的相关扩展接口说明-阶段转换接口 (kingdee.com)
<2>编写接口实现代码,并部署组件至服务器
using Kingdee.BOS.App.Core.Utils;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.K3.PLM.CFG.Common.Interface.CategoryStatus;
using Kingdee.K3.PLM.CFG.Common.Interface.EventArgument;
using Kingdee.K3.PLM.CFG.Common.Interface.Switchers;
using Kingdee.K3.PLM.Common.Core.BOSBridge;
using Kingdee.K3.PLM.Common.Core.ServiceHelper;
using Kingdee.K3.PLM.Common.Core.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Kingdee.K3.PLM.Industry.ECNDemo.Common.BusinessEntity
{
/// <summary>
/// ECN审核状态转换控制(标签说明:CategoryId1 受控的业务类型ID,Stage 对应控制的生命周期阶段)
/// </summary>
[StageSwitcherAttribute(CategoryId1 = (long)StandardCategoryType.ECN, Stage = ControlStage.Audit)]
public class ECNAuditImplement : IControlStageSwitcher
{
public void AfterEnterStatus(PLMContext ctx, DynamicObject obj, ControlStageChangeEventArgs e)
{
var allBaseId = new List<long>();
var changeObjs = obj.GetDynamicObjectItemValue<DynamicObjectCollection>("ChangeObjectEntity");
if (changeObjs != null)
{
allBaseId.AddRange(changeObjs.Select(x => Convert.ToInt64(x["BaseObject"])).Distinct());
}
if (allBaseId.Any())
{
string updateMat = string.Format(@"/*dialect*/UPDATE M SET FPLMISCHANGE = 1
FROM T_PLM_PDM_BASE B
INNER JOIN T_PLM_PDM_BASE_M Z ON B.FID = Z.FID
INNER JOIN T_BD_MATERIAL M ON M.FMASTERID = Z.FERPMATERIALID
WHERE B.FISCHANGEOBJECT = 1 AND B.FID IN ({0})", string.Join(",", allBaseId));
string updateBOM = string.Format(@"/*dialect*/UPDATE M SET FPLMISCHANGE = 1
FROM T_PLM_PDM_BASE B
INNER JOIN T_PLM_PDM_BASE_0 Z ON B.FID = Z.FID
INNER JOIN T_ENG_BOM M ON M.FMASTERID = Z.FERPBOMID
WHERE B.FISCHANGEOBJECT = 1 AND B.FID IN ({0})", string.Join(",", allBaseId));
PLMDBUtils.Instance.Execute(ctx, updateMat);
PLMDBUtils.Instance.Execute(ctx, updateBOM);
}
}
public void AfterLeaveStatus(PLMContext ctx, DynamicObject obj, ControlStageChangeEventArgs e)
{
//审核阶段转换至其他非完成阶段时,需要重置信息(对象生效后状态已经被重置,因此转换至完成阶段无需再处理)
if (e.ToStage != ControlStage.Finish)
{
var allBaseId = new List<long>();
var changeObjs = obj.GetDynamicObjectItemValue<DynamicObjectCollection>("ChangeObjectEntity");
if (changeObjs != null)
{
allBaseId.AddRange(changeObjs.Select(x => Convert.ToInt64(x["BaseObject"])).Distinct());
}
if (allBaseId.Any())
{
string updateMat = string.Format(@"/*dialect*/UPDATE M SET FPLMISCHANGE = 0
FROM T_PLM_PDM_BASE B
INNER JOIN T_PLM_PDM_BASE_M Z ON B.FID = Z.FID
INNER JOIN T_BD_MATERIAL M ON M.FMASTERID = Z.FERPMATERIALID
WHERE B.FISCHANGEOBJECT = 1 AND B.FID IN ({0})", string.Join(",", allBaseId));
string updateBOM = string.Format(@"/*dialect*/UPDATE M SET FPLMISCHANGE = 0
FROM T_PLM_PDM_BASE B
INNER JOIN T_PLM_PDM_BASE_0 Z ON B.FID = Z.FID
INNER JOIN T_ENG_BOM M ON M.FMASTERID = Z.FERPBOMID
WHERE B.FISCHANGEOBJECT = 1 AND B.FID IN ({0})", string.Join(",", allBaseId));
PLMDBUtils.Instance.Execute(ctx, updateMat);
PLMDBUtils.Instance.Execute(ctx, updateBOM);
}
}
}
}
}变更单生效二开
<1>变更单生效操作使用了比较特殊的PLM抽象操作,无法使用标准平台服务插件去干预,因此需要重写生效插件。
<2>继承标准操作插件Kingdee.K3.PLM.STD.App.ServicePlugIn.EngineeringChange.EffectChangeService,并重写operationFunction属性
using Kingdee.BOS.App.Core.Utils; using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.Pl
PLM.二开案例.PLM物料/BOM变更时同步状态至ERP
【应用场景】PLM物料、BOM的变更状态需要同步至ERP说明:V9版本,PT-161001特性补丁中已标准支持同步变更中状态至ERP物料和物料清单中,无...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



