金蝶云星空创建自动提交审核的公共方法

发布时间 2023-09-19 17:55:09作者: lanrenka

金蝶云星空创建自动提交审核的公共方法

 
【目录】

1、  新建类

2、  添加引用

3、  添加命名空间

4、  创建自动审核方法

5、  创建检查操作是否成功方法

6、  方法使用示例

7、整体代码

 

 

【 具体操作】

1、  在公共项目下新建类

 

 

 记得修改类为public。

 

2、  添加引用

 

HotUpdateKingdee.BOS.dll【using Kingdee.BOS.Util】 启用热更新

DescriptionSystem.dll【using System.ComponentModel

ContextKingdee.BOS.dll 登录上下文环境

BusinessInfoKingdee.BOS.Core.dll【using Kingdee.BOS.Core.MetadataNew DTO处理,主要针对WebApi请求参数构建

IOperationResult:Kingdee.BOS.Core.dll【using Kingdee.BOS.Core.DynamicForm所有操作服务类函数调用返回结果必须继承此接口

OperateOptionKingdee.BOS.DataEntity.dll【using  Kingdee.BOS.Orm为数据的操作提供额外的选项

ISubmitServiceKingdee.BOS.Contracts.dll【using Kingdee.BOS.Contracts提交服务接口

ServiceHelper Kingdee.BOS.App.dll【using  Kingdee.BOS.App

SetInteractionFlagSetIgnoreInteractionFlag 【using Kingdee.BOS.Core.Interaction

mm.k3.Core.dll:是我自己的项目,主要是一些静态参数的设置集合。

 

3、  添加命名空间

using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Util;
using mm.K3.Core.Const;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 

4、  创建自动审核方法

        #region 自动审核方法
        /// <summary>
        /// 自动审核方法
        /// </summary>
        /// <param name="ctx">上下文</param>
        /// <param name="billId">主键数组</param>
        /// <param name="businessInfo">表单参数构建</param>
        /// <param name="operationResult">保存操作返回结果</param>
        /// <param name="option">操作选项</param>
        /// <param name="IsAutoSubmitAndAudit">是否自动提交且审核:false=自动审核,true=自动提交且审核</param>
        public void AutoAudit(Context ctx, object[] billId, BusinessInfo businessInfo, IOperationResult operationResult, OperateOption option, bool IsAutoSubmitAndAudit = false)
        {
            if (IsAutoSubmitAndAudit)
            {
                //设置提交参数
                OperateOption submitOption = OperateOption.Create();
                submitOption.SetIgnoreWarning(true);
                submitOption.SetIgnoreScopeValidateFlag(true);

                //创建提交服务
                ISubmitService submitService = ServiceHelper.GetService<ISubmitService>();
                IOperationResult submitResult = submitService.Submit(ctx, businessInfo, billId, OptionConst.Submit, submitOption);

                //判断提交结果,如果失败,则内部跑出错误,回滚代码
                if (!CheckOptionResult(submitResult, operationResult))
                {
                    return;//回滚
                }
            }

            //构建操作可选参数对象
            OperateOption auditOption = OperateOption.Create();
            auditOption.SetIgnoreWarning(option.GetIgnoreWarning());
            auditOption.SetInteractionFlag(option.GetInteractionFlag());
            auditOption.SetIgnoreInteractionFlag(option.GetIgnoreInteractionFlag());

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

            //调用审核操作
            ISetStatusService setStatusService = ServiceHelper.GetService<ISetStatusService>();
            //如下调用方式,需显示交互信息
            IOperationResult auditResult = setStatusService.SetBillStatus(ctx, businessInfo, pkEntityIds, paras, OptionConst.Audit, auditOption);
            //判断审核结果,如果失败,在内部会抛出错误,回滚代码
            if (!CheckOptionResult(auditResult, operationResult))
            {
                return;//回滚代码
            }
        }
        #endregion

 

5、  创建检查操作是否成功方法

       #region 检查操作是否成功
        /// <summary>
        /// 判断操作结果是否成功,如果不成功,则直接抛出中断进程
        /// </summary>
        /// <param name="operation">当前操作的返回结果</param>
        /// <param name="operationResult">外部参数的操作返回结果</param>
        /// <param name="operateOption">操作选项</param>
        /// <param name="isShowError">抛出错误的方式</param>
        /// <returns></returns>
        private bool CheckOptionResult(IOperationResult operation, IOperationResult operationResult, OperateOption operateOption = null, bool isShowError = false)
        {
            bool isSuccess = false;//操作成功的标识,默认操作不成功
            if (operation.IsSuccess)
            {
                isSuccess = true;//操作成功
            }
            else
            {
                if (operation.InteractionContext != null && operation.InteractionContext.Option.GetInteractionFlag().Count > 0)
                {
                    //有交互性提示
                    //传出交互性提示完整信息对象
                    operationResult.InteractionContext = operation.InteractionContext;
                    //传出本次交互的标识
                    //用户在确认继续后,会重新进入操作
                    //将以此标识取本次交互是否已经确认过,避免重复交互
                    operationResult.Sponsor = operation.Sponsor;
                    if (operateOption != null)
                    {
                        if (isShowError)
                        {
                            throw new KDException("", operation.InteractionContext.SimpleMessage);
                        }
                        else
                        {
                            //throw new KDInteractionException(opOption, opResult.Sponsor);
                            throw new KDException("", ((AbstractInteractionResult)operation).InteractionContext.SimpleMessage);
                        }
                    }
                    else
                    {
                        //抛出错误,终止本次操作
                        throw new KDBusinessException("", "本次操作需要用户确认是否继续,暂时中断。");
                    }
                }
                else//无交互性提示
                {
                    //操作失败,拼接失败原因,然后抛出中断
                    operation.MergeValidateErrors();
                    if (operation.OperateResult == null)
                    {
                        throw new KDBusinessException("", "未知原因导致自动提交、审核失败!");
                    }
                    else
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendLine("自动提交、审核失败,失败原因:");
                        foreach (var or in operation.OperateResult)
                        {
                            sb.AppendLine(or.Message);
                        }
                        throw new KDBusinessException("", sb.ToString());
                    }
                }
            }

            return isSuccess;
        }

        #endregion

 

6、  方法使用示例

 

7、整体代码

#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2023  保留所有权利。
 * CLR版本:4.0.30319.42000
 * 机器名称:
 * 公司名称:
 * 命名空间:mm.K3.App.Service.Common
 * 唯一标识:
 * 文件名:ActionCommon
 * 当前用户域:
 * 
 * 创建者:Krystal
 * 电子邮箱:
 * 创建时间:2023/9/19 16:41:59
 * 版本:V1.0.0
 * 描述:
 *
 * ----------------------------------------------------------------
 * 修改人:
 * 时间:
 * 修改说明:
 *
 * 版本:V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>

using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Util;
using mm.K3.Core.Const;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace mm.K3.App.Service.Common
{
    /// <summary>
    /// ActionCommon 的摘要说明
    /// </summary>
    [Description("操作公共类"), HotUpdate]
    public class ActionCommon
    {
        #region <常量>
        #endregion <常量>

        #region <变量>
        #endregion <变量>

        #region <方法>

        #region 自动审核方法
        /// <summary>
        /// 自动审核方法
        /// </summary>
        /// <param name="ctx">上下文</param>
        /// <param name="billId">主键数组</param>
        /// <param name="businessInfo">表单参数构建</param>
        /// <param name="operationResult">保存操作返回结果</param>
        /// <param name="option">操作选项</param>
        /// <param name="IsAutoSubmitAndAudit">是否自动提交且审核:false=自动审核,true=自动提交且审核</param>
        public void AutoAudit(Context ctx, object[] billId, BusinessInfo businessInfo, IOperationResult operationResult, OperateOption option, bool IsAutoSubmitAndAudit = false)
        {
            if (IsAutoSubmitAndAudit)
            {
                //设置提交参数
                OperateOption submitOption = OperateOption.Create();
                submitOption.SetIgnoreWarning(true);
                submitOption.SetIgnoreScopeValidateFlag(true);

                //创建提交服务
                ISubmitService submitService = ServiceHelper.GetService<ISubmitService>();
                IOperationResult submitResult = submitService.Submit(ctx, businessInfo, billId, OptionConst.Submit, submitOption);

                //判断提交结果,如果失败,则内部跑出错误,回滚代码
                if (!CheckOptionResult(submitResult, operationResult))
                {
                    return;//回滚
                }
            }

            //构建操作可选参数对象
            OperateOption auditOption = OperateOption.Create();
            auditOption.SetIgnoreWarning(option.GetIgnoreWarning());
            auditOption.SetInteractionFlag(option.GetInteractionFlag());
            auditOption.SetIgnoreInteractionFlag(option.GetIgnoreInteractionFlag());

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

            //调用审核操作
            ISetStatusService setStatusService = ServiceHelper.GetService<ISetStatusService>();
            //如下调用方式,需显示交互信息
            IOperationResult auditResult = setStatusService.SetBillStatus(ctx, businessInfo, pkEntityIds, paras, OptionConst.Audit, auditOption);
            //判断审核结果,如果失败,在内部会抛出错误,回滚代码
            if (!CheckOptionResult(auditResult, operationResult))
            {
                return;//回滚代码
            }
        }
        #endregion

        #region 检查操作是否成功
        /// <summary>
        /// 判断操作结果是否成功,如果不成功,则直接抛出中断进程
        /// </summary>
        /// <param name="operation">当前操作的返回结果</param>
        /// <param name="operationResult">外部参数的操作返回结果</param>
        /// <param name="operateOption">操作选项</param>
        /// <param name="isShowError">抛出错误的方式</param>
        /// <returns></returns>
        private bool CheckOptionResult(IOperationResult operation, IOperationResult operationResult, OperateOption operateOption = null, bool isShowError = false)
        {
            bool isSuccess = false;//操作成功的标识,默认操作不成功
            if (operation.IsSuccess)
            {
                isSuccess = true;//操作成功
            }
            else
            {
                if (operation.InteractionContext != null && operation.InteractionContext.Option.GetInteractionFlag().Count > 0)
                {
                    //有交互性提示
                    //传出交互性提示完整信息对象
                    operationResult.InteractionContext = operation.InteractionContext;
                    //传出本次交互的标识
                    //用户在确认继续后,会重新进入操作
                    //将以此标识取本次交互是否已经确认过,避免重复交互
                    operationResult.Sponsor = operation.Sponsor;
                    if (operateOption != null)
                    {
                        if (isShowError)
                        {
                            throw new KDException("", operation.InteractionContext.SimpleMessage);
                        }
                        else
                        {
                            //throw new KDInteractionException(opOption, opResult.Sponsor);

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

            return isSuccess;
        }

        #endregion

        #endregion <方法>
    }
}
ActionCommon

 

完美,又是优秀的自己,度过完美的一天。