项目二开.项目编码或名称变更时,批量修改输出对象中的文档文件名

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

项目二开.项目编码或名称变更时,批量修改输出对象中的文档文件名

【应用场景】

项目编码或名称变更时,原来由项目文档命名规则生成的文档文件名(含物理文件名)需要批量被修改。


【案例演示】

项目模板生成实例后,默认的输出文档内容

修改项目名称


【设计思路】

书写二开插件,标准保存插件完成后,获取输出物中的文档对象以及对应的物理文件对象,修改需要修改的文档对象名称以及物理文件名。


【实现步骤】

如果你刚接触PLM二开,你可能需要参考:

如何编写二开插件配置等请参考:二次开发扩展程序开发之插件模式https://vip.kingdee.com/article/83591896433330944?productLineId=1

其他星空PLM开发指南也可以参考 【汇总】星空PLM二开指南(持续更新)https://vip.kingdee.com/article/329914697153905408?productLineId=1&isKnowledge=2

更多详细的金蝶云星空BOS二次开发指南:https://vip.kingdee.com/article/94751030918525696?productLineId=1&isKnowledge=2


<1>编写二开插件

首先项目中添加必要的引用

继承PLM标准单据插件,在AfterDoOperation事件中修改输出对象的名称

示例代码:

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Util;

using Kingdee.K3.PLM.Business.PlugIn;

using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Base;

using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Entity;

using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Manager;

using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Manager.Document;

using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Manager.PhysicalFile;

using Kingdee.K3.PLM.Common.Core.ServiceHelper;

using Kingdee.K3.PLM.STD.Common.BusinessEntity.Project;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Linq;


namespace ISV.PLM.ProjectDemo

{

    [HotUpdate]

    [Description("项目保存二开插件")]

    public class ProjectSaveExtendPlugIn : AbstractPLMBillPlugIn

    {

        private string _oldProjectName = null;

        public override void OnLoad(EventArgs e)

        {

            base.OnLoad(e);

            if (this.Model != null && this.Model.DataObject != null && _oldProjectName == null)

            {

                _oldProjectName = this.Model.DataObject["NAME"].GetString(); // 这里只需要加载一次,后续保存操作会刷新,可能会被新的项目名称覆盖

            }

        }


        public override void AfterDoOperation(AfterDoOperationEventArgs e)

        {

            // 本示例只演示如何修改名称。具体名称校验规则可根据实际场景完善

            // 本示例暂未涉及版本变动, 建议涉及对象信息修改的地方加上必要的日志记录,否则可能无法追溯。

            base.AfterDoOperation(e);

            if (e.OperationResult != null && e.OperationResult.IsSuccess && e.Operation.Operation.ToUpperInvariant() == "SAVE")

            {

                var newProjectName = this.Model.DataObject["NAME"].GetString();

                if (newProjectName == _oldProjectName) return; //未改项目名时退出

                var projectId = Convert.ToInt64(this.Model.DataObject["Id"]);

                List<DynamicObject> wbs = ProjectManager.Instance.GetProjectWBSObjs(PLMContext, projectId);

                var wbsIds = wbs.Select(x => Convert.ToInt64(x["id"])).ToList();

                DynamicObjectCollection relatedObjects = ProjectRelationModel.Instance.GetAllProjectRelatedObjectList(this.PLMContext, wbsIds, 1); //获取项目任务输出内容,1代表为输出

                if (relatedObjects.Count > 0)

                {

                    var ids = relatedObjects.Select(w => w["FRELATEDOBJECT"]);

                    var reobjects = GlobalObjectManager.Instance(PLMContext).Load(PLMContext, ids.ToArray());

                    //获取输出中的文档对象

                    //注意需要过滤集成文档,集成文档不能随意改名

                    var docIds = reobjects.Where(x => CategoryContract.Instance.IsDocumentCategory(Convert.ToInt64(x["CategoryId_Id"])) && !FileTypeManager.Instance.IsCad2DTypeByDocument(PLMContext, x) && !FileTypeManager.Instance.IsCad3DTypeByDocument(PLMContext, x))

                        .Select(x => x["Id"]).ToArray();

                    var docObjects = DomainObjectManager.Instance(PLMContext, (long)StandardCategoryType.Document).Load(PLMContext, docIds);

                    List<DynamicObject> toSaveDocuments = new List<DynamicObject>();

                    foreach (var doc in docObjects)

                    {

                        if (doc["Name"].GetString().Contains(_oldProjectName))

                        {

                            doc["Name"] = doc["Name"].GetString().Replace(_oldProjectName, newProjectName);

                            toSaveDocuments.Add(doc);

                        }

                    }

                    DomainObjectManager.Instance(PLMContext, (long)StandardCategoryType.Document).Save(PLMContext, toSaveDocuments.ToArray());


                    //获取物理文件并修改物理文件名称

                    //如果是初次由项目模板生成的文档,还未生成新的物理文件,不需要修改物理文件的名称。根据RealFileName过滤

                    var fileIds = docObjects.Where(x => x["FileId_Id"].GetString() != x["RealFileName"].GetString())

                        .Select(x => x["FileId_Id"]).ToArray();

                    var files = PhysicalFileManager.Instance.Load(PLMContext, fileIds);

                    List<DynamicObject> toSaveFiles = new List<DynamicObject>();

                    foreach (var file in files)

                    {

                        if (file["FileName"].GetString().Contains(_oldProjectName))

                        {

                            file["FileName"] = file["FileName"].GetString().Replace(_oldProjectName, newProjectName);

                            toSaveFiles.Add(file);

                        }

                    }

                    PhysicalFileManager.Instance.Save(PLMContext, toSaveFiles.ToArray());

                }

                _oldProjectName = newProjectName;

            }

        }

    }

}

<2>拷贝组件

拷贝新增插件的组件到应用站点的WebSite\Bin目录下,重启IIS

<3>注册插件

打开BOSIDEPLM项目管理子模块找到基础资料项目扩展并注册自定义插件

<4>清理缓存,更新模型

清理站点元数据缓存,并更新项目业务类型模型。

上述操作完成后便可以查看效果啦。


项目二开.项目编码或名称变更时,批量修改输出对象中的文档文件名

【应用场景】项目编码或名称变更时,原来由项目文档命名规则生成的文档文件名(含物理文件名)需要批量被修改。【案例演示】项目模板生成实...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息