PLM.二开方案.关联业务对象支持变更

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

PLM.二开方案.关联业务对象支持变更

【应用场景】

使用PLM平台扩展方案关联了另一业务对象后(在业务对象中关联另一类业务对象的方法 (kingdee.com)),同时支持变更修改。


【注意事项】

该方案可能存在性能损耗,如果存在大数据量变更的场景,请考虑使用业务对象扩展单据体实现,而非使用对象平台扩展的方式

本示例不再演示业务对象关联与接口插件规范,具体请参考原帖。


在业务对象中关联另一类业务对象的方法 (kingdee.com)

二次开发扩展程序开发之插件模式 (kingdee.com)



【案例演示】

物料平台扩展相关客户单据体。

发起变更进行修改。

变更生效结果。


【原理介绍】

使用对象平台关联的方式实际上使用单据体主键关联PDM对象。由于设计变更会生成一个新版对象,新版对象没有关联至原有的扩展单据。 

所以此二开的基本原理就是在产生新版对象的时候复制一套单据体信息给新版对象,并在生效时覆盖至原版对象


【实现步骤】

<1>新增一个组件,继承PLM标准状态转换接IControlStageSwitcher注意组件命名规范,详情参考二次开发扩展程序开发之插件模式 (kingdee.com); ,指定业务类型为变更,生命周期为审核。 即审核生成新版对象后,执行复制单据体信息逻辑。


你可能需要引用以下组件


编写以下代码

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
    {
        //批量获取原对象客户信息
        //由于接口调用时数据库还未提交,所以得使用变更对象单据的版本号关联
        private const string GetCustoms = @"SELECT EC.FREFVERSIONID AS FREFVERSIONID,C.* FROM T_PLM_STD_EC_ITEM EC
INNER JOIN T_PLM_CFG_VERLIST V  ON EC.FREFVERSIONID = V.FVERSIONID
INNER JOIN PLM_T_CUST_RELATEDCUSTOM C ON V.FPDMBASE = C.FID
WHERE EC.FID = {0}
";
        //插入新客户信息脚本
        private const string InsertCustoms = @"INSERT INTO PLM_T_CUST_RELATEDCUSTOM(FID,FENTRYID,FCUSTOM) VALUES({0},{1},{2})";

        public void AfterEnterStatus(PLMContext ctx, DynamicObject obj, ControlStageChangeEventArgs e)
        {
            if (obj.Contains("ChangeObjectEntity"))
            {
                var changeObject = (DynamicObjectCollection)obj["ChangeObjectEntity"];
                var relatedCustom = PLMDBUtils.Instance.ExecuteDynamicObject(ctx, string.Format(GetCustoms, obj["Id"]));
                if (relatedCustom.Count() <= 0) return;
                var sqlArrary = new List<SqlObject>();
                var entryIds = PLMDBUtils.Instance.GetSequenceInt64(ctx, "PLM_T_CUST_RELATEDCUSTOM", relatedCustom.Count()).ToArray();
                for (int i = 0; i < relatedCustom.Count(); i++)
                {
                    //此时单据体中FBASEOBJECT字段已经记录了新版对象ID,通过脚本获取的源版本ID(不会变)进行对应;
                    var item = changeObject.FirstOrDefault(x => Convert.ToInt64(x["REFVERSIONID"]) == Convert.ToInt64(relatedCustom[i]["FREFVERSIONID"]));
                    if (item != null)
                    {
                        sqlArrary.Add(new SqlObject(string.Format(InsertCustoms, item["BASEOBJECT"], entryIds[i], relatedCustom[i]["FCUSTOM"]), new Kingdee.BOS.SqlParam()));
                    }
                }
                PLMDBUtils.Instance.ExecuteBatch(ctx, sqlArrary);
            }
        }

        public void AfterLeaveStatus(PLMContext ctx, DynamicObject obj, ControlStageChangeEventArgs e)
        {
            //缺省
        }
    }
}


<2>新增另一个类实现接口ISetTVersionEffectiveService,指定业务类型为物料(本案例为物料平台扩展)。 意为生效时,删除原版对象信息,用新版对象信息覆盖。

using Kingdee.BOS.Orm.DataEntity;
using Kingdee.K3.PLM.CFG.Common.Interface.Base;
using Kingdee.K3.PLM.CFG.Common.Interface.EventArgument;
using Kingdee.K3.PLM.CFG.Common.Interface.STD.EngineeringChange;
using Kingdee.K3.PLM.Common.Core.BOSBridge;
using Kingdee.K3.PLM.Common.Core.ServiceHelper;
using Kingdee.K3.PLM.Common.Core.Utility;
using System.ComponentModel;

namespace ISV.ECNDemo.Common.BusinessEntity
{
    [Description("生效接口实现")]
    [OperationAttribute(CategoryId = (long)StandardCategoryType.Material)]
    public class SetEffectiveServiceImplement : ISetTVersionEffectiveService
    {
        private const string EffectiveCustrom = @"DELETE FROM PLM_T_CUST_RELATEDCUSTOM WHERE FID = {0};UPDATE PLM_T_CUST_RELATEDCUSTOM SET FID = {0} WHERE FID = {1}";
        public void AfterSave(PLMContext ctx, DynamicObject temporaryObj, DynamicObject targetObj, OperationEventArgs args)
        {
            PLMDBUtils.Instance.Execute(ctx, string.Format(EffectiveCustrom, targetObj["Id"], temporaryObj["Id"]));
        }

        public void AfterSetting(PLMContext ctx, DynamicObject temporaryObj, DynamicObject targetObj, OperationEventArgs args)
        {
            //缺省实现
        }

        public void BeforeSetting(PLMContext ctx, DynamicObject temporaryObj, OperationEventArgs args)
        {
            //缺省实现
        }
    }
}


<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS即可验证功能(无需在元数据上绑定)


【参考资料】

二次开发扩展程序开发之插件模式 (kingdee.com)

在业务对象中关联另一类业务对象的方法 (kingdee.com)



【汇总】星空PLM二开指南(持续更新...)

https://vip.kingdee.com/article/94751030918525696



PLM.二开方案.关联业务对象支持变更

【应用场景】使用PLM平台扩展方案关联了另一业务对象后(在业务对象中关联另一类业务对象的方法 (kingdee.com)),同时支持变更修改。【注...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息