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

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

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

【应用场景】PLM物料、BOM的变更状态需要同步至ERP说明:V9版本,PT-161001特性补丁中已标准支持同步变更中状态至ERP物料和物料清单中,无...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息