首页 > 其他分享 >金蝶云星空创建自动提交审核的公共方法

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

时间:2023-09-19 17:55:21浏览次数:32  
标签:星空 金蝶 BOS Kingdee 提交 new using operation 操作

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

  【目录】

1、  新建类

2、  添加引用

3、  添加命名空间

4、  创建自动审核方法

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

6、  方法使用示例

7、整体代码

 

 

【 具体操作】

1、  在公共项目下新建类

 

 

 记得修改类为public。

 

2、  添加引用

 

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

Description:System.dll【using System.ComponentModel】

Context:Kingdee.BOS.dll 登录上下文环境

BusinessInfo:Kingdee.BOS.Core.dll【using Kingdee.BOS.Core.Metadata】New DTO处理,主要针对WebApi请求参数构建

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

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

ISubmitService:Kingdee.BOS.Contracts.dll【using Kingdee.BOS.Contracts】提交服务接口

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

SetInteractionFlag、SetIgnoreInteractionFlag 【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

 

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

标签:星空,金蝶,BOS,Kingdee,提交,new,using,operation,操作
From: https://www.cnblogs.com/lanrenka/p/17715057.html

相关文章

  • KingbaseESV8R6延迟提交参数
    前言队列理论在我们生活中的应用随处可见,例如我们去食堂打饭需要排队,我们生活中随处可见排队的场景。在计算机领域中,性能诊断等地方使用队列理论的案例也很多。服务器硬件分为动态设备和静态设备。CPU和IO子系统属于动态设备,RAM属于静态设备,队列理论只对动态设备适用。Kingbase......
  • Postman测试金蝶云星空Webapi【协同开发云下的本地环境】
    业务背景:基于金蝶云星空提供的接口测试,交付之前或者联调之前开发者先自测,即使纠错,提高效率。  大致流程:先请求登录接口,获得token后再请求标准webapi或者自定义接口,这样上下文才不会空。 说明: 金蝶的接口格式一般为:http://ServerIp/K3Cloud/接口命名空间.接口实现类名......
  • Git的ssh方式如何配置,如何通过ssh方式拉取和提交代码
    大家通过git拉取代码的时候,一般都是通过http的方式,简单方便。但是细心的童鞋肯定也注意到Git也是支持ssh方式的。可能很多人也试过使用这个方式,但是好像没有那么简单。那么什么是SSH呢?为啥要使用SSH方式呢?HTTPS和SSH的区别Git支持使用HTTPS和SSH两种方式与远程仓库进行通信和代码......
  • SpringBoot Redis使用AOP防止重复提交
    自定义注解importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***@ProjectName:gswr-ets-cloud*@ClassName:*@Description:防止重复提交的自定义......
  • 提交学习记录的流程分析
       ......
  • WebStrom提交代码到GitLab报错Error: Cannot find any-observable implementation nor
    项目场景:前端代码完成后,提交代码问题描述提交代码到GitLab时,因自动检测机制导致项目提交失败C:\D\insper\inspur_works\custom-manage-front\node_modules\any-observable\register.js:29 thrownewError('Cannotfindany-observableimplementationnor'+ ^Error:C......
  • 金碟星空云 sql server常用表(防遗忘)
    数据表命名基本规则:表名前缀:t_或者T_视图前缀:v_或者V_多语言表后缀:_L关联关系表后缀:_LK一、元数据元数据:t_meta_objectType元数据扩展信息表:t_meta_objectType_E元数据缓存表:T_META_OBJECTTYPECACHE元数据视图表:T_META_OBJECTTYPEVIEW元数据视图:V_META_OBJECTTYPE_L元......
  • sqlserver存储过程报错:当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事
    ​ ​编辑 现象:系统出现异常,手动执行过程提示如上。  问题排查:1.直接执行的过程事务挂起(排除)2.重启数据库实例(重启后无效)3.过程中套用过程,套用的过程中使用事务,因为插入的表结构字段超出最大长度(修改表结构问题恢复) 结论:事务执行失败,嵌套层级太深。  ​......
  • 金蝶云星空新增单据转换
      1、文件-单据转换“  2、点击新建: 3、选择源单和目标单: 4、设置唯一标识: 5、设置关联主单据体:  6、设置单据类型映射: 7、设置上下游字段关系对应: 8、设置选单条件策略:   9、创建插件:新建转换插件:添加引用:Kingdee.BOS.Contracts.dll......
  • 配置 git 提交校验规则以及提交前进行代码的校验和修复
    git篇前言今日分享的话题是配置git提交校验规则以及提交前进行代码lint的校验和修复......