金蝶K3Cloud插件 -- 单据保存自动提交并审核(c#)

金蝶K3Cloud插件 -- 单据保存自动提交并审核(c#)

最近在做金蝶相关的技术支持,记录一下插件开发步骤。使用C#开发

需求:实现表单点击保存,自动进行提交审核

1、打开VS,新建项目,选择类库

2、类继承Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn

3、以下是实现代码

 public class Save : AbstractOperationServicePlugIn
    {
        //加载单据字段
        public override void OnPreparePropertys(PreparePropertysEventArgs e)
        {
            base.OnPreparePropertys(e);
            //是否内部交易
            e.FieldKeys.Add("FIsInner");
        }

        public override void OnPrepareOperationServiceOption(OnPrepareOperationServiceEventArgs e)
        {
            base.OnPrepareOperationServiceOption(e);
            //为了在BeginOperationTransaction里检查数据抛出异常时
            //只回滚当前单据的事务,这里设置为不支持批量事务,这样BOS会
            //循环为每一张单据创建事务调用操作 
            e.SupportTransaction = true;
            e.SurportBatchTransaction = false;
        }
        /// <summary>
        /// 保存操作完毕,事务结束之前,进行自动提交、审核,只有内部交易的发货通知单才自动提交审核
        /// </summary>
        /// <param name="e"></param>
        public override void EndOperationTransaction(EndOperationTransactionArgs e)
        {
            if (e.DataEntitys.IsNullOrEmpty() || e.DataEntitys.Count() == 0)
            {
                return;
            }
            DynamicObject objs;
            List<Object> list = new List<Object>();
            for (int i = 0; i < e.DataEntitys.Length; i++)
            {
                objs = e.DataEntitys[i];
                if (objs["FIsInner"].ToString().Trim().Equals("True"))
                {
                    list.Add(objs["Id"]);
                }
                else
                {
                    continue;
                }
            }
            if (list.Count() == 0)
            {
                return;
            }
            // 取到需要自动提交、审核的单据内码
            object[] pkArray = list.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;
            }
        }
        /// <summary>
        /// 判断操作结果是否成功,如果不成功,则直接抛错中断进程
        /// </summary>
        /// <param name="opResult"></param>
        /// <returns></returns>
        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;
        }
    }

4、生成.dll文件,将插件加入表单的操作列表-保存服务中

分享小技巧,金蝶到7.几的版本以后才支持热更新,所以每次修改插件都要重启IIS,是不是觉得很麻烦,特别是有很多用户在使用的时候,只能下班时间搞。

告诉你们一个办法,修改插件的名字,每次用一个新名字插件在第一次就会生效,如果修改了代码,就再修改插件名字。虽然也比较麻烦,但是不用重启IIS,不用加班搞,爽不爽。。。。

如果对你有用,请给个赞,哈哈!!!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋亦琛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值