【应用场景】
项目编码或名称变更时,原来由项目文档命名规则生成的文档文件名(含物理文件名)需要批量被修改。
【案例演示】
项目模板生成实例后,默认的输出文档内容
修改项目名称
【设计思路】
书写二开插件,标准保存插件完成后,获取输出物中的文档对象以及对应的物理文件对象,修改需要修改的文档对象名称以及物理文件名。
【实现步骤】
如果你刚接触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>注册插件
打开BOSIDE,在PLM项目管理子模块找到基础资料【项目】扩展并注册自定义插件
<4>清理缓存,更新模型
清理站点元数据缓存,并更新项目业务类型模型。
上述操作完成后便可以查看效果啦。