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.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.K3.PLM.App.Core; using Kingdee.K3.PLM.Common.Core.BOSBridge; using Kingdee.K3.PLM.Common.Core.Common; using Kingdee.K3.PLM.STD.App.ServicePlugIn.EngineeringChange; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace ISV.ECOperation.Common.BusinessEntity { [Description("ECN生效后操作")] public class EcnAfterEffectiveOperation : EffectChangeService { public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); e.FieldKeys.Add("FChangeObjectEntity"); } protected override Func<PLMContext, ProgressTrace, List<IOperationResult>> operationFunction { get { return new Func<PLMContext, ProgressTrace, List<IOperationResult>>((ctx, progressTrace) => { var result = base.operationFunction(ctx, progressTrace); //先执行标准逻辑 if (result.All(x => x.IsSuccess)) { SyncChangStatus(); } return result; }); } } private List<IOperationResult> SyncChangStatus() { List<IOperationResult> results = new List<IOperationResult>(); var allBaseId = new List<long>(); foreach (var ecn in this.Models) { var changeObjs = ecn.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 BM SET FISCHANGE = 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 INNER JOIN T_BD_MATERIALBASE BM ON BM.FMATERIALID = M.FMATERIALID WHERE B.FISCHANGEOBJECT = 0 AND B.FID IN ({0})", string.Join(",", allBaseId)); string updateBOM = string.Format(@"/*dialect*/UPDATE M SET FISCHANGE = 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 = 0 AND B.FID IN ({0})", string.Join(",", allBaseId)); DBUtils.Execute(this.Context, updateMat); DBUtils.Execute(this.Context, updateBOM); } return results; } } }
<3>扩展变更单,变更单生效操作中替换组件。随后更新配置
【功能验证】

【参考资料】
【汇总】星空PLM二开指南(持续更新) (kingdee.com)
PLM二开.设计变更.变更对象字段解读.不同阶段获取变更对象信息 (kingdee.com)
【金蝶云星空BOS二次开发案例演示】
https://vip.kingdee.com/article/94751030918525696
PLM.二开案例.PLM物料/BOM变更时同步状态至ERP
本文2024-09-23 03:05:04发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-156607.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