PLM.变更申请单.自定义下推变更单二开方案
前言
PLM变更申请单中的下推变更单功能,标准产品中两者为一对一映射,即一张申请单可以下推成一张变更单,这个关系无法改变,且下推内容暂只支持单据头字段的配置。
标准产品中的申请单下推功能,目前无法通过二开方式干预,因此对于一些特殊的业务场景,建议通过自定义自己的操作二开实现。PLM组件中,有部分公用方法可供代码开发使用。
二开示例
1. 场景说明
根据申请单中不同变更对象内容,下推生成不同的变更单类型。
2. 可行方案
由于标准功能无法通过二开干预,所以只能通过完全自定义操作实现。你可以通过扩展申请单,在申请单上加入表单按钮,然后编写表单插件或者服务拆建实现。本文不详细介绍插件部署方式,相关内容可以参考【汇总】星空PLM二开指南(持续更新)。
3. 编码示例
对于上述场景,你可以参考下面的代码示例。
在此之前,你可能需要以下组件:
Kingdee.K3.PLM.Common.Core.dll
Kingdee.K3.PLM.Common.Framework.dll
Kingdee.K3.PLM.Common.BusinessEntity.dll
Kingdee.K3.PLM.Business.PlugIn.dll
Kingdee.K3.PLM.CFG.Common.BusinessEntity.dll
Kingdee.K3.PLM.CFG.Common.Core.dll
C# 编码示例:
//本示例通过重写表单插件的菜单按钮事件实现。也可以通过增加操作绑定服务操作实现
public override void BarItemClick(BarItemClickEventArgs e)
{
if(e.BarItemKey == "PLM_tbSplitPush") // 自定义按钮名称
{
IOperationResult result = new SaveOperationResult();
var ecrId = Convert.ToInt64(this.PLMView.CurrentView.Model.DataObject["Id"]);
if(ECRModel.Instance.HasEcn(PLMContext, ecrId)) // 标准产品中的判断是否已经下推,也可以自定义其他标记做判断
{
result.IsSuccess = false;
result.OperateResult.Add(OperationResultHelper.CreateOperateResult(ecrId.ToString(), 0, "下推变更单失败", false, "已经存在相关联变更单,不允许再下推!", MessageType.Warning));
}
else
{
using(KDTransactionScope trans = new KDTransactionScope(TransactionScopeOption.Required))
{
var changeObjectEntitys = this.PLMView.CurrentView.Model.DataObject["ChangeObjectEntity"] as DynamicObjectCollection;
for(int index = 0; index < changeObjectEntitys.Count; index++)
{
// 复制一个当前申请单对象,按需要修改自己的数据包内容
// 本示例演示,每一行创建一个变更单的场景
// 注意:实际场景还需要考虑不同变更类型,以及评估内容等
var targetECR = this.PLMView.CurrentView.Model.DataObject.Clone() as DynamicObject;
var targetECRChangeObjs = targetECR["ChangeObjectEntity"] as DynamicObjectCollection;
for(int delIndex = targetECRChangeObjs.Count - 1; delIndex > index; delIndex--)
{
targetECRChangeObjs.RemoveAt(delIndex);
}
for(int delIndex = 0; delIndex < index; delIndex++)
{
targetECRChangeObjs.RemoveAt(0);
}
var currrentResult = PushEcn(this.PLMContext, targetECR);
foreach(var res in currrentResult.OperateResult)
{
result.OperateResult.Add(res);
}
if(!currrentResult.IsSuccess)
{
result.IsSuccess = false;
break;
}
result.IsSuccess = true;
}
if(result.IsSuccess) // 一个不成功则回滚。可以根据场景自己控制
{
trans.Complete();
}
}
}
PLMView.ShowOperateResult(OperationResultHelper.GetResults(result));
}
base.BarItemClick(e);
}
/// <summary>
/// 下推申请单至变更单
/// </summary>
/// <param name="ctx">PLM上下文</param>
/// <param name="ecr">ECR申请单单据体数据包</param>
/// <returns>操作结果</returns>
private IOperationResult PushEcn(PLMContext ctx, DynamicObject ecr)
{
if(ecr == null) return null;
long ecrId = Convert.ToInt64(ecr["Id"]);
//获取申请单下推配置
var headFeildMapCols = EcrConvertCfgManager.Instance.Load(ctx, string.Format(" FCategoryID = {0} AND FSTARTUP = '1' ", (long) StandardCategoryType.ECR));
//获取字段映射
var policy = ConvertPolicyManager.Instance.GetPolicy(ctx, StandardCategoryType.ECR, StandardCategoryType.ECN);
//通过视图代理新建变更单对象
using(CommonViewProxy proxy = new CommonViewProxy(ctx, CategoryManager.Instance.GetFormIdByCategory(ctx, (long) StandardCategoryType.ECN), false))
{
var view = proxy.GetEmptyView();
// 根据映射关系赋值单据头信息
ECRManager.Instance.SetHeadFieldValue(proxy, headFeildMapCols, view, ecr);
var category = CategoryManager.Instance.Get(ctx, (long) StandardCategoryType.ECN);
var obj = view.Model.DataObject;
// 修改变更单信息,业务类型,映射的申请单ID、完成日期等。可根据自己需要赋值其他内容
obj["CategoryID"] = category;
obj["CategoryID_Id"] = category["Id"];
obj["ApplyId"] = ecr;
obj["ApplyId_Id"] = ecrId;
obj["FinishDate"] = ecr["CompleteDate"];
BaseObjectManager.Instance(ctx).SetIcon(ctx, obj); // PLM图标赋值
CommonViewProxyManager.Instance.SetEntityRowsValue(proxy, policy.EntityMaps, view, ecr); // 单据体对象赋值
IOperationResult result;
var operation = view.GetFormOperation("Save") as AbstractFormOperation; //调用保存操作
if(operation != null)
{
operation.Option.SetVariableValue("TBECRPUSHECN", true);
OperationHelper.MarkBackCalling(operation.Option);
bool ok = operation.Execute();
try
{
result = operation.Option.GetVariableValue < IOperationResult > (BOSConst.CST_KEY_DynamicFormOperationResult); // 获取保存操作结果
}
catch(Exception e)
{
throw new PLMException(0, "保存失败!");
}
if(ok == false) result.IsSuccess = false;
}
else
{
throw new PLMException(0, "没有找到相关保存的处理!");
}
var message = string.Format("{1}({0})", obj["Code"], obj["Name"]); //记录变更单信息
result.OperateResult.Insert(0, OperationResultHelper.CreateOperateResult(obj["Id"].ToString(), 0, message, true, "下推变更单成功完成!", MessageType.Normal));
return result;
}
}
4. 结果展示
PLM.变更申请单.自定义下推变更单二开方案
本文2024-09-23 03:05:06发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-156611.html