知识共享 - 保存操作,同时进行自动提交、审核
金蝶云社区-JohnnyDing
JohnnyDing
23人赞赏了该文章 2.2万次浏览 未经作者许可,禁止转载编辑于2015年10月23日 17:37:48
summary-icon摘要由AI智能服务提供

需求概述:单据编辑界面设有自动提交、审核选项,但这些选项在自动下推生成下游单据时不生效。需实现下游单据也能自动提交、审核。解决方案:编写一个插件,在下游单据保存操作时自动调用提交和审核逻辑。示例代码展示了如何在单据保存事务结束时,通过调用相应服务接口来实现自动提交和审核功能,并处理了操作失败的情况。

需求背景:
单据编辑界面上,有个保存时自动提交、提交时自动审核的选项。
但此选项,在自动下推保存下游单据时,不会生效。下游单据保存后,还是创建状态。

现在需要在自动下推时,生成的下游单据,也能够自动提交、审核。

解决方案:
在下游单据的保存操作上,编写插件,使用插件实现自动提交、审核。

示例代码:
//******************************************************

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;


using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.App;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Interaction;


namespace JDSample.ServicePlugIn.Operation
{
[Description("保存时自动提交、审核")]
public class S150909AutoAuditOpPlug : AbstractOperationServicePlugIn
{
///


/// 保存操作完毕,事务结束之前,进行自动提交、审核
///

///
public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
// 取到需要自动提交、审核的单据内码
object[] pkArray = (from p in e.DataEntitys
select p[0]).ToArray();

// 设置提交参数
// using Kingdee.BOS.Orm;
OperateOption submitOption = OperateOption.Create();

submitOption.SetIgnoreWarning(this.Option.GetIgnoreWarning());
submitOption.SetInteractionFlag(this.Option.GetInteractionFlag());
submitOption.SetIgnoreInteractionFlag(this.Option.GetIgnoreInteractionFlag());


// 创建提交服务:using Kingdee.BOS.Contracts; using Kingdee.BOS.App;
ISubmitService submitService = ServiceHelper.GetService();
IOperationResult submitResult = submitService.Submit(
this.Context, this.BusinessInfo,
pkArray, "Submit", submitOption);


// 判断提交结果,如果失败,则内部会抛出错误,回滚代码
if (CheckOpResult(submitResult) == false)
{
return;
}


// 构建操作可选参数对象
OperateOption auditOption = OperateOption.Create();

auditOption.SetIgnoreWarning(this.Option.GetIgnoreWarning());
auditOption.SetInteractionFlag(this.Option.GetInteractionFlag());
auditOption.SetIgnoreInteractionFlag(this.Option.GetIgnoreInteractionFlag());


// 构建单据主键参数
List> pkEntityIds = new List>();
foreach (var pkValue in pkArray)
{
pkEntityIds.Add(new KeyValuePair(pkValue, ""));
}

List paras = new List();
paras.Add("1");
paras.Add("");

// 调用审核操作
ISetStatusService setStatusService = ServiceHelper.GetService();

// 如下调用方式,需显示交互信息
IOperationResult auditResult = setStatusService.SetBillStatus(this.Context,
this.BusinessInfo,
pkEntityIds,
paras,
"Audit",
auditOption);


// 判断审核结果,如果失败,则内部会抛出错误,回滚代码
if (CheckOpResult(auditResult) == false)
{
return;
}
}

///
/// 判断操作结果是否成功,如果不成功,则直接抛错中断进程
///

///
///
private bool CheckOpResult(IOperationResult opResult)
{
bool isSuccess = false;
if (opResult.IsSuccess == true)
{
// 操作成功
isSuccess = true;
}
else
{
if (opResult.InteractionContext != null
&& opResult.InteractionContext.Option.GetInteractionFlag().Count > 0)
{// 有交互性提示


// 传出交互提示完整信息对象
this.OperationResult.InteractionContext = opResult.InteractionContext;
// 传出本次交互的标识,
// 用户在确认继续后,会重新进入操作;
// 将以此标识取本交互是否已经确认过,避免重复交互
this.OperationResult.Sponsor = opResult.Sponsor;


// 抛出错误,终止本次操作
throw new KDBusinessException("", "本次操作需要用户确认是否继续,暂时中断");
}
else
{
// 操作失败,拼接失败原因,然后抛出中断
opResult.MergeValidateErrors();
if (opResult.OperateResult == null)
{// 未知原因导致提交失败
throw new KDBusinessException("", "未知原因导致自动提交、审核失败!");
}
else
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("自动提交、审核失败,失败原因:");
foreach (var operateResult in opResult.OperateResult)
{
sb.AppendLine(operateResult.Message);
}
throw new KDBusinessException("", sb.ToString());
}
}
}

return isSuccess;
}
}
}