插件案例 —— 自动下推 自动审核原创
金蝶云社区-MiLai
MiLai
73人赞赏了该文章 1.3万次浏览 未经作者许可,禁止转载编辑于2020年08月03日 17:31:05


案例背景:


像入库配置了自动下推到应付后,可以选择应付到自动审核的状态。那么我们想扩展开发任意流程的自动下推,然后下游单据自动审核,如何操作呢?


案例需求:自动下推后自动审核



一、自动下推

如图,在审核操作上,配置自动下推服务。

image.png


配置默认的自动下推单据转换规则。

image.png



二、下游单据自动审核

比如上图配置的是XX流程到物料清单的流程,那么我们在物料清单上保存操作,配置插件。

image.png



代码如下,可通用。


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 你的命名空间
{
    [HotUpdate]
    public class MaterialListSave : AbstractOperationServicePlugIn
    {
        ///        
        /// 保存操作完毕,事务结束之前,进行自动提交、审核
        ///
        ///
        public override void EndOperationTransaction(EndOperationTransactionArgs e)
        {
            string saveTime = "";
            this.Option.TryGetVariableValue<string>("ConvertType", out saveTime);
            //只有从自动下推的,才自动提交审核
            if (string.Compare(saveTime, "AutoPush", true) != 0)
            {
                return;
            }
            // 取到需要自动提交、审核的单据内码
            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 = ServiceFactory.GetSubmitService(this.Context);
            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<KeyValuePair<object, object>> pkEntityIds = new List<KeyValuePair<object, object>>();
            foreach (var pkValue in pkArray)
            {
                pkEntityIds.Add(new KeyValuePair<object, object>(pkValue, ""));
            }
            List<object> paras = new List<object>();
            paras.Add("1");
            paras.Add("");
            // 调用审核操作
            ISetStatusService setStatusService = ServiceFactory.GetSetStatusService(this.Context);
            // 如下调用方式,需显示交互信息
            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;
        }
    }
}


赞 73