金蝶云星空创建自动下推并保存公共服务

文章目录

  • 金蝶云星空创建自动下推并保存公共服务
    • 创建公共方法
      • 按单下推数据
      • 按明细行下推数据
      • 调用下推操作
    • 调用公共方法

金蝶云星空创建自动下推并保存公共服务

创建公共方法

按单下推数据

         /// <summary>
        /// 获取单据转换数据包
        /// </summary>
        public DynamicObject[] GetBillObjDoPush(Context ctx, string sourceFormId, string targetFormId, List<object> sourceBillIds, string convertId = null, string billTypeId = null)
        {
            IConvertService convertService = Kingdee.BOS.App.ServiceHelper.GetService<IConvertService>();
            var rules = convertService.GetConvertRules(ctx, sourceFormId, targetFormId);
            if (rules == null || rules.Count == 0)
            {
                throw new KDBusinessException("", string.Format("未找到{0}到{1}之间,启用的转换规则,无法自动下推!", sourceFormId, targetFormId));
            }
            ConvertRuleElement rule = null;
            if (convertId.IsNullOrEmptyOrWhiteSpace())
            {
                rule = rules.FirstOrDefault(t => t.IsDefault);
            }
            else
            {
                rule = rules.FirstOrDefault(s => s.Id.Equals(convertId));
            }
            if (rule == null)
            {
                rule = rules[0];
            }
            List<ListSelectedRow> srcSelectedRows = new List<ListSelectedRow>();
            foreach (var billId in sourceBillIds)
            {
                srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), string.Empty, 0, sourceFormId));
            }
            string targetBillTypeId = billTypeId == null ? string.Empty : billTypeId;
            long targetOrgId = 0;
            Dictionary<string, object> custParams = new Dictionary<string, object>();
            PushArgs pushArgs = new PushArgs(rule, srcSelectedRows.ToArray())
            {
                TargetBillTypeId = targetBillTypeId,
                TargetOrgId = targetOrgId,
                CustomParams = custParams
            };
            ConvertOperationResult operationResult = convertService.Push(ctx, pushArgs, OperateOption.Create());
            DynamicObject[] targetBillObjs = (from p in operationResult.TargetDataEntities select p.DataEntity).ToArray();
            if (targetBillObjs.Length == 0)
            {
                throw new KDBusinessException("", string.Format("由{0}自动下推{1},没有成功生成数据包,自动下推失败!", sourceFormId, targetFormId));
            }
            return targetBillObjs;
        }

按明细行下推数据

         /// <summary>
        /// 获取单据转换数据包 按明细行下推
        /// </summary>
        public DynamicObject[] GetBillObjDoPushByEntryId(Context ctx, string sourceFormId, string targetFormId, IEnumerable<ListSelectedRow> srcSelectedRows, string convertId = null, string billTypeId = null)
        {
            IConvertService convertService = Kingdee.BOS.App.ServiceHelper.GetService<IConvertService>();
            var rules = convertService.GetConvertRules(ctx, sourceFormId, targetFormId);
            if (rules == null || rules.Count == 0)
            {
                throw new KDBusinessException("", string.Format("未找到{0}到{1}之间,启用的转换规则,无法自动下推!", sourceFormId, targetFormId));
            }
            ConvertRuleElement rule = null;
            if (convertId.IsNullOrEmptyOrWhiteSpace())
            {
                rule = rules.FirstOrDefault(t => t.IsDefault);
            }
            else
            {
                rule = rules.FirstOrDefault(s => s.Id.Equals(convertId));
            }
            if (rule == null)
            {
                rule = rules[0];
            }

            string targetBillTypeId = billTypeId == null ? string.Empty : billTypeId;
            long targetOrgId = 0;
            Dictionary<string, object> custParams = new Dictionary<string, object>();
            PushArgs pushArgs = new PushArgs(rule, srcSelectedRows.ToArray())
            {
                TargetBillTypeId = targetBillTypeId,
                TargetOrgId = targetOrgId,
                CustomParams = custParams
            };
            ConvertOperationResult operationResult = convertService.Push(ctx, pushArgs, OperateOption.Create());
            DynamicObject[] targetBillObjs = (from p in operationResult.TargetDataEntities select p.DataEntity).ToArray();
            if (targetBillObjs.Length == 0)
            {
                throw new KDBusinessException("", string.Format("由{0}自动下推{1},没有成功生成数据包,自动下推失败!", sourceFormId, targetFormId));
            }
            return targetBillObjs;
        }

调用下推操作

 /// <summary>
        /// 下推操作处理
        /// </summary>
        public IOperationResult DoPushOper(Context ctx, DynamicObject[] targetBillObjs, string targetFormId, OperateOption option, IOperationResult billOperationResult, bool isSubmit = false, bool isAudit = false)
        {
            IMetaDataService metaService = Kingdee.BOS.App.ServiceHelper.GetService<IMetaDataService>();
            var targetBillMeta = metaService.Load(ctx, targetFormId) as FormMetadata;
            OperateOption saveOption = OperateOption.Create();
            saveOption.SetIgnoreWarning(true);
            saveOption.SetInteractionFlag(option.GetInteractionFlag());
            saveOption.SetIgnoreInteractionFlag(option.GetIgnoreInteractionFlag());
            try
            {
                var saveResult = Kingdee.K3.MFG.App.AppServiceContext.SaveService.Save(ctx, targetBillMeta.BusinessInfo, targetBillObjs, saveOption, "Save");
                this.CheckOpResult(saveResult, billOperationResult, saveOption);
                if (isSubmit && saveResult.IsSuccess)
                {
                    saveResult = Kingdee.K3.MFG.App.AppServiceContext.SubmitService.Submit(ctx, targetBillMeta.BusinessInfo, targetBillObjs.Select(s => s["Id"]).ToArray(), "Submit", saveOption);
                    this.CheckOpResult(saveResult, billOperationResult, saveOption);
                }
                if (isAudit && saveResult.IsSuccess)
                {
                    List<KeyValuePair<object, object>> keyValuePairs = new List<KeyValuePair<object, object>>();
                    targetBillObjs.ToList().ForEach(item => keyValuePairs.Add(new KeyValuePair<object, object>(item.GetPrimaryKeyValue(), item)));
                    List<object> auditObjs = new List<object>();
                    auditObjs.Add("1");
                    auditObjs.Add("");
                    saveResult = Kingdee.K3.MFG.App.AppServiceContext.SetStatusService.SetBillStatus(ctx, targetBillMeta.BusinessInfo, keyValuePairs, auditObjs, "Audit", saveOption);
                    if (this.CheckOpResult(saveResult, billOperationResult, saveOption)) return saveResult;
                }
                return saveResult;
            }
            catch (Exception ex)
            {
                //string aa = ex.Message;
                throw new KDBusinessException("", ex.Message);
                return null;
            }
        }

        /// <summary>
        /// 判断操作结果是否成功,如果不成功,则直接抛错中断进程
        /// </summary>
        /// <param name="opResult"></param>
        /// <returns></returns>
        private bool CheckOpResult(IOperationResult opResult, IOperationResult operationResult, OperateOption opOption = null, bool isShowError = false)
        {
            bool isSuccess = false;
            if (opResult.IsSuccess)
            {
                // 操作成功
                isSuccess = true;
            }
            else
            {
                if (opResult.InteractionContext != null
                    && opResult.InteractionContext.Option.GetInteractionFlag().Count > 0)
                {// 有交互性提示

                    // 传出交互提示完整信息对象
                    operationResult.InteractionContext = opResult.InteractionContext;
                    // 传出本次交互的标识,
                    // 用户在确认继续后,会重新进入操作;
                    // 将以此标识取本交互是否已经确认过,避免重复交互
                    operationResult.Sponsor = opResult.Sponsor;
                    if (opOption != null)
                    {
                        if (isShowError)
                            throw new KDException("", opResult.InteractionContext.SimpleMessage);
                        else
                        {

                            //throw new KDInteractionException(opOption, opResult.Sponsor);

                            throw new KDException("", ((AbstractInteractionResult)opResult).InteractionContext.SimpleMessage);
                        }

                    }
                    else
                    {
                        // 抛出错误,终止本次操作
                        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;
        }

调用公共方法

在这里插入图片描述
列表插件完整代码

using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Util;
using mm.K3.App.Service.Common;
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.SCM.Business.PlugIn.SC
{
    [Description("售后单-列表界面"), HotUpdate]
    public class AfterOrderList : AbstractListPlugIn
    {
        public override void BarItemClick(BarItemClickEventArgs e)
        {
            base.BarItemClick(e);
            switch (e.BarItemKey.ToUpperInvariant())
            {
                case "XXXX_TBPUSHREPLACE":
                    #region 下推对照 XXXX_tbPushReplace
                    #region v3.0
                    Context ctx = this.View.Context;
                    string sourceFormId = FormIdConst.AS_AfterOrder;//售后单
                    string targetFormId = FormIdConst.AS_Replace;//对照表
                    string convertRuleKey = "AS_AfterOrderToReplace";//转换规则
                    // 获取在列表上当前选择需下推的行
                    ListSelectedRow[] selectedRows = ((IListView)this.View).SelectedRowsInfo.ToArray();
                    var action = new ActionCommon();
                    try
                    {
                        var targetBills = action.GetBillObjDoPushByEntryId(ctx, sourceFormId, targetFormId, selectedRows, convertRuleKey);
                        var result=action.DoPushOper(ctx, targetBills, targetFormId, null, null, false, false);//不提交 不审核
                        //var result = action.DoPushOper(ctx, targetBills, targetFormId, null, null, true, true); //自动提交 ,审核
                        if (result.IsSuccess)
                        {
                            string _msg = string.Empty;
                            if (result.OperateResult.Count() > 0)
                            {
                                _msg += string.Join(",", result.OperateResult.Select(s => s.Message));
                            }
                            if (!_msg.IsNullOrEmptyOrWhiteSpace())
                            {
                                this.View.ShowMessage(_msg);
                            }

                        }
                        else
                        {
                            string _msg = string.Empty;
                            if (result.ValidationErrors.Count > 0)
                            {
                                _msg += string.Join(",", result.ValidationErrors.Select(s => s.Message));
                            }
                            if (!_msg.IsNullOrEmptyOrWhiteSpace())
                            {
                                this.View.ShowErrMessage("", _msg, MessageBoxType.Error);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        this.View.ShowErrMessage("", "下推对照时存在异常:" + ex.Message, MessageBoxType.Error);
                        e.Cancel = true;
                        return;

                    }

                    #endregion

                    #endregion
                    break;
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/111324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RIS辅助MIMO广播信道容量

RIS辅助MIMO广播信道容量 摘要RIS辅助的BC容量矩阵形式的泰勒展开学习舒尔补 RIS-Aided Multiple-Input Multiple-Output Broadcast Channel Capacity论文阅读记录 基于泰勒展开求解了上行容量和最差用户的可达速率&#xff0c;学习其中的展开方法。 摘要 Scalable algorithm…

UE4 使用材质后期 制作玻璃有雨效果

效果展示&#xff0c;其实这是一个动画效果 以上为所有逻辑 拿到TexCoord给到Panner&#xff0c;Time和Speed都是通过下面计算而来&#xff0c;后面讲&#xff0c;再拿到时间和速度值过后&#xff0c;加上扰动值&#xff0c;最后取G值&#xff0c;因为雨事从上而下的动&#xf…

【AIFEM案例操作】电器盒谐响应分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

微信小程序项目案例之导游证考试刷题小程序

前言 很多计算机专业的同学在做毕设选题时不知道该如何选题&#xff0c;有的同学是已经选择了要开发一款小程序&#xff0c;但是又不知道开发哪类小程序。本篇将为大家介绍一个小程序的开发方向&#xff0c;考试刷题类小程序是目前比较火的小程序项目之一&#xff0c;在小程序…

JavaScript基础知识19——循环结构:while循环

哈喽&#xff0c;你好&#xff0c;我是雷工。 本节学习JavaScript基础语法的循环结构&#xff1a;while循环&#xff0c;以下为学习笔记。 while循环 循环概念&#xff1a;重复执行一些操作&#xff1b; 循环特征&#xff1a;不断地重复&#xff1b; while&#xff1a;在…期间…

面向Three.js开发者的3D自动纹理化开发包

DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包&#xff0c;可以为 webGL 应用增加 3D 模型的快速自动纹理化能力。 图一为原始模型, 图二图三为贴图后的模型。提示词&#xff1a; city, Realistic , cinematic , Front view ,Game scene graph 1、…

Kitex踩坑 [Error] KITEX: processing request error,i/o timeout

报错问题 2023/010/28 17:20:10.250768 default_server_handler.go:234: [Error] KITEX: processing request error, remoteService, remoteAddr127.0.0.1:65425, errordefault codec read failed: read tcp 127.0.0.1:8888->127.0.0.1:65425: i/o timeout 分析原因 Hert…

基于dockerfile搭建lnmp

目录 任务需求&#xff1a; 一、规划&#xff1a; 二、准备&#xff1a; 三、部署nginx容器&#xff08;172.18.0.10&#xff09;&#xff1a; 1.编写Dockerfile构建镜像&#xff1a; 2.准备nginx配置文件&#xff1a; 3.构建镜像&#xff0c;启动nginx容器&#xff1a; 四…

【QT】事件分发器

event事件分发器&#xff0c;用于分发事件&#xff0c;在这里也可以做拦截&#xff0c;返回值boo。如果返回的是true代表拦截处理&#xff0c;不再向下分发。 展示事件拦截 上一段代码&#xff1a;【QT】鼠标常用事件-CSDN博客 代码 // 事件分发器 // 拦截鼠标按下 // QEven…

四十二、【进阶】

目录 1、覆盖索引 2、案例分析 &#xff08;1&#xff09;select * 查询 &#xff08;2&#xff09;使用字段查询 &#xff08;3&#xff09;性能差异原因 3、分析 &#xff08;1&#xff09;主键id查询 &#xff08;2&#xff09;覆盖索引 1、覆盖索引 简单点说&#x…

Nginx 部署多个安全域名,多个服务【工作记录】

以下是本人通过Docker 部署的Nginx挂载出来的文件目录 先看下 nginx.conf 配置文件内容&#xff1a;如下 ps&#xff1a;当前文件就是安装后的初始内容&#xff0c;无修改。主要关注最后一行 include /etc/nginx/conf.d/*.conf;表示引入其他目录下的.conf配置文件&#xff1b;…

【Arduino环境下驱动合宙esp32c3单片机基本外设】

【esp32c3基本外设驱动】 1. GPIO调试1.1 源码分享2.2 实验效果 2. ADC调试2.1 源码分享2.2 实验效果 3. WS2812驱动3.1 源码分享3.2 实验效果 4. 旋转编码器4.1 源码分享4.2 测试效果 5. SSD1306屏幕驱动5.1 源码分享5.2 测试效果 6. 双cpu同时工作测试6.1 源码分享6.2 测试效…

Arrays,Arrays重载的sort方法

Arrays -1的原因.因为返回正数不就是表示存在只能是负数 Arrays重载的sort方法 //这个方法只能给引用数据类型排序 //如果是基本数据类型需要转化为对应的包装类 public class arrays {public static void main(String[] args) {Integer arr[]{2,1,4,6,3,5,8,7,9};Arrays.s…

学习笔记3——JVM基础知识

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/196593.html JVM&#xff08;Write Once&#xff0c;Run Anywhere&#xff09; 以下是一些学习时有用到的资料&#xff0c;只学习了JVM的基础知识&#xff0c;对JVM整体进…

python爬虫—使用xpath方法进行数据解析

1. 背景信息 爬取安居客二手房源信息 URL地址&#xff1a;https://wuhan.anjuke.com/sale/?fromnavigation 2. 代码实现 import requests from lxml import etreeif __name__ __main__:# 1.指定URLurl "https://wuhan.anjuke.com/sale/?fromnavigation"# 2.U…

Apache Doris (四十八): Doris表结构变更-替换表

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

在Jetpack Compose中使用Paging 3实现无限滚动

在Jetpack Compose中使用Paging 3实现无限滚动 本文将介绍在Jetpack Compose中进行分页加载。分页加载意味着一次只加载应用程序中的小数据块。 假设您在服务器上有大量数据&#xff0c;并且您希望在UI上显示这些数据。显然&#xff0c;您不希望一次性加载所有数据。您希望每次…

reactor (百万并发服务器) -- 1

为了从点滴开始&#xff0c;文章会先从一些基础socket去补充一些经常发生但是没有很深入去思考的细节。然后我们再开始去设计reactor的设计&#xff0c;可以选择跳过起过前面部分。 为了能从0开始去设计&#xff0c;测试&#xff0c;优化...整个过程会分为2-3篇文章输出&#x…

Redis队列Stream

1 缘起 项目中处理文件的场景&#xff1a; 将文件处理请求放入队列&#xff0c; 一方面&#xff0c;缓解服务器文件处理压力&#xff1b; 另一方面&#xff0c;可以根据文件大小拆分到不同的队列&#xff0c;提高文件处理效率。 这是Java开发组Leader佳汇提出的文件处理方案&a…

网络安全—小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…