【应用场景】
当完成最后一个任务时,项目自动完成。
【案例演示】
最后一个任务进行中。
完成最后一个任务
【设计思路】
1. 二开执行计划。执行计划开发教程:
https://vip.kingdee.com/article/35401?productLineId=1
https://vip.kingdee.com/article/172011048747176704?productLineId=1
2. 使用PLM标准状态转换接口,在任务完成时对项目任务进行判断,符合业务场景的项目自动完成。本示例演示此方案。
【实现步骤】
如果你刚接触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>编写二开插件
本示例二开的主要接口方法位于标准插件Kingdee.K3.PLM.CFG.Common.Interface.dll中,接口方法为Kingdee.K3.PLM.CFG.Common.Interface.Switchers. IControlStageSwitcher
本示例必要的引用
实现接口IControlStageSwitcher,使用StageSwitcher特性标记[任务]业务类型,指定状态为[完成],实现方法AfterEnterStatus处理任务到完成时的业务。
* 本示例只演示简单的状态转换,如果项目转换涉及流程,请另作处理。可在PLM二开指南中查找相关资料。
* 使用标准方案转化项目生命周期不涉及规则类校验,请根据自身业务场景设置必要的校验逻辑。
示例代码:
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.K3.PLM.CFG.Common.BusinessEntity.CategoryStatus;
using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Manager;
using Kingdee.K3.PLM.CFG.Common.BusinessEntity.Operation;
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.BusinessEntity.Operation;
using Kingdee.K3.PLM.Common.Core.BOSBridge;
using Kingdee.K3.PLM.Common.Core.Log;
using Kingdee.K3.PLM.Common.Core.ServiceHelper;
using Kingdee.K3.PLM.STD.Common.BusinessEntity.Project.Plugins;
using System;
using System.Linq;
namespace ISV.TaskDemo.Common.BusinessEntity
{
[StageSwitcher(CategoryId1 = (long)StandardCategoryType.Task, Stage = ControlStage.Finish)]
public class TaskFinishStageSwitchDemo : IControlStageSwitcher
{
public void AfterEnterStatus(PLMContext ctx, DynamicObject obj, ControlStageChangeEventArgs e)
{
//获取所属项目
var projectId = Convert.ToInt64(obj["PROJECT_ID"]);
var project = DomainObjectManager.AutoLoad(ctx, projectId);
/*
* 本示例通过标准项目规则判断是否允许当前项目完成。
* 可根据自己实际业务场景进行业务判断。
* */
if (RuleVerifyPlugin.Instance.Check(ctx, project, ControlStage.Finish, ControlRuleType.Prj_ReadyLeader) && //是否为项目经理
RuleVerifyPlugin.Instance.Check(ctx, project, ControlStage.Finish, ControlRuleType.Prj_SubTaskAllArrived) && //下层任务是否都完成
RuleVerifyPlugin.Instance.Check(ctx, project, ControlStage.Finish, ControlRuleType.Prj_CheckMark) //要求全部标记
)
{
//符合要求使用标准生命周期转换方法,转换项目至完成状态
StageConvertItem item = new StageConvertItem() { Object = project, TargetStage = ControlStage.Finish };
var result = StageConvertMananger.Instance.SwitchStage(ctx, (new[] { item }).ToList());
if (OperationResultHelper.IsSuccess(result)) // 请根据业务场景处理项目转换至完成的执行结果。 此处演示记录文件日志。
{
LogHelper.Info(string.Format("任务{0}完成时,项目{1}完成!", obj["Code"], project["Code"]));
}
}
}
public void AfterLeaveStatus(PLMContext ctx, DynamicObject obj, ControlStageChangeEventArgs e)
{
//缺省
}
}
}
<3>拷贝组件
拷贝新增插件的组件到应用站点的WebSite\Bin目录下,重启IIS
上述操作完成后便可以查看效果啦。