/// <summary>
        /// 整单下推
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="SourceFormId"></param>
        /// <param name="TargetFormId"></param>
        /// <param name="sourceBillIds"></param>
        /// <returns></returns>
        public ConvertOperationResult ConvertBills(Context ctx, string SourceFormId, string TargetFormId, List <long> sourceBillIds)
        {
            // 获取源单与目标单的转换规则
            IConvertService convertService = 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));
            }
            // 取勾选了默认选项的规则
            var rule = rules.FirstOrDefault(t => t.IsDefault);

            // 如果无默认规则,则取第一个
            if (rule == null)
            {
                rule = rules[0];
            }
            // 开始构建下推参数:
            // 待下推的源单数据行
            List <ListSelectedRow> srcSelectedRows = new List <ListSelectedRow>();
            int rowkey = -1;

            foreach (long billId in sourceBillIds)
            {
                //把待下推的源单内码,逐个创建ListSelectedRow对象,添加到集合中
                srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), string.Empty, rowkey++, SourceFormId));
            }
            // 指定目标单单据类型:情况比较复杂,直接留空,会下推到默认的单据类型
            string targetBillTypeId = string.Empty;
            // 指定目标单据主业务组织:情况更加复杂,
            // 建议在转换规则中,配置好主业务组织字段的映射关系:运行时,由系统根据映射关系,自动从上游单据取主业务组织,避免由插件指定
            long targetOrgId = 0;
            // 自定义参数字典:把一些自定义参数,传递到转换插件中;转换插件再根据这些参数,进行特定处理
            Dictionary <string, object> custParams = new Dictionary <string, object>();
            //custParams.Add("1", 1);
            //custParams.Add("2", 2);
            // 组装下推参数对象
            PushArgs pushArgs = new PushArgs(rule, srcSelectedRows.ToArray())
            {
                TargetBillTypeId = targetBillTypeId,
                TargetOrgId      = targetOrgId,
                CustomParams     = custParams
            };
            // 调用下推服务,生成下游单据数据包
            ConvertOperationResult operationResult = convertService.Push(ctx, pushArgs, OperateOption.Create());

            return(operationResult);
        }
Exemple #2
0
        /// <summary>
        /// 自动下推并保存
        /// </summary>
        /// <param name="sourceFormId">源单FormId</param>
        /// <param name="targetFormId">目标单FormId</param>
        /// <param name="sourceBillIds">源单内码</param>
        private IOperationResult DoPush(string sourceFormId, string targetFormId, long targetOrgId, List <long> sourceBillIds)
        {
            IOperationResult result = new OperationResult();

            result.IsSuccess = false;
            // 获取源单与目标单的转换规则
            IConvertService convertService = Kingdee.BOS.App.ServiceHelper.GetService <IConvertService>();
            var             rules          = convertService.GetConvertRules(this.Context, sourceFormId, targetFormId);

            if (rules == null || rules.Count == 0)
            {
                throw new KDBusinessException("", string.Format("未找到{0}到{1}之间,启用的转换规则,无法自动下推!", sourceFormId, targetFormId));
            }
            // 取勾选了默认选项的规则
            var rule = rules.FirstOrDefault(t => t.IsDefault);

            //var rule = rules.
            // 如果无默认规则,则取第一个
            if (rule == null)
            {
                rule = rules[0];
            }
            // 开始构建下推参数:
            // 待下推的源单数据行
            List <ListSelectedRow> srcSelectedRows = new List <ListSelectedRow>();

            foreach (var billId in sourceBillIds)
            {// 把待下推的源单内码,逐个创建ListSelectedRow对象,添加到集合中
                srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), string.Empty, 0, sourceFormId));
                // 特别说明:上述代码,是整单下推;
                // 如果需要指定待下推的单据体行,请参照下句代码,在ListSelectedRow中,指定EntryEntityKey以及EntryId
                //srcSelectedRows.Add(new ListSelectedRow(billId.ToString(), entityId, 0, sourceFormId) { EntryEntityKey = "FEntity" });
            }

            // 指定目标单单据类型:情况比较复杂,没有合适的案例做参照,示例代码暂略,直接留空,会下推到默认的单据类型
            string targetBillTypeId = string.Empty;
            // 指定目标单据主业务组织:情况更加复杂,需要涉及到业务委托关系,缺少合适案例,示例代码暂略
            // 建议在转换规则中,配置好主业务组织字段的映射关系:运行时,由系统根据映射关系,自动从上游单据取主业务组织,避免由插件指定
            //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(this.Context, 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));
            }
            // 对下游单据数据包,进行适当的修订,以避免关键字段为空,自动保存失败
            // 示例代码略
            // 读取目标单据元数据
            IMetaDataService metaService = Kingdee.BOS.App.ServiceHelper.GetService <IMetaDataService>();
            var targetBillMeta           = metaService.Load(this.Context, targetFormId) as FormMetadata;
            // 构建保存操作参数:设置操作选项值,忽略交互提示
            OperateOption saveOption = OperateOption.Create();

            // 忽略全部需要交互性质的提示,直接保存;
            saveOption.SetIgnoreWarning(true);                               // 忽略交互提示
            saveOption.SetInteractionFlag(this.Option.GetInteractionFlag()); // 如果有交互,传入用户选择的交互结果
            // using Kingdee.BOS.Core.Interaction;
            saveOption.SetIgnoreInteractionFlag(this.Option.GetIgnoreInteractionFlag());
            // 调用保存服务,自动保存
            ISaveService saveService = Kingdee.BOS.App.ServiceHelper.GetService <ISaveService>();
            var          saveResult  = saveService.Save(this.Context, targetBillMeta.BusinessInfo, targetBillObjs, saveOption, "Save");

            // 判断自动保存结果:只有操作成功,才会继续
            if (saveResult.SuccessDataEnity != null)
            {
                var submitRet = AppServiceContext.SubmitService.Submit(this.Context, targetBillMeta.BusinessInfo, saveResult.SuccessDataEnity.Select(o => o["Id"]).ToArray(), "Submit", saveOption);
                result.MergeResult(submitRet);
                if (submitRet.SuccessDataEnity != null)
                {
                    var auditResult = AppServiceContext.SetStatusService.SetBillStatus(this.Context, targetBillMeta.BusinessInfo,
                                                                                       submitRet.SuccessDataEnity.Select(o => new KeyValuePair <object, object>(o["Id"], 0)).ToList(),
                                                                                       new List <object> {
                        "1", ""
                    },
                                                                                       "Audit", saveOption);

                    result.MergeResult(auditResult);
                }
            }
            if (this.CheckOpResult(saveResult, saveOption))
            {
                return(result);
            }
            return(result);
        }
        public DynamicObject[] ConvertBillsWithEntry(Context ctx, List <ConvertOption> options, string SourceFormId, string TargetFormId, string targetBillTypeId, string SourceEntryEntityKey, OperateOption operateOption)
        {
            //List<DynamicObject[]> result = new List<DynamicObject[]>();
            List <DynamicObject> before = new List <DynamicObject>();
            //IEnumerable<DynamicObject> targetDatas = null;
            IConvertService convertService = ServiceHelper.GetService <IConvertService>();
            var             rules          = convertService.GetConvertRules(ctx, SourceFormId, TargetFormId);
            string          rulekey        = operateOption.GetVariableValue("ruleKey", string.Empty);//单据转换规则 key 指定 ID
            var             rule           = rules.FirstOrDefault(t => t.IsDefault);

            if (rules == null || rules.Count == 0)
            {
                throw new KDBusinessException("", string.Format("未找到{0}到{1}之间,启用的转换规则,无法自动下推!", SourceFormId, TargetFormId));
            }
            //如果指定 规则
            if (rulekey.Equals(string.Empty) == false)
            {
                foreach (var ervryrule in rules)
                {
                    if (ervryrule.Key.Equals(rulekey))
                    {
                        rule = ervryrule;
                        break;
                    }
                }
            }

            if (rule == null)
            {
                rule = rules[0];
            }

            foreach (ConvertOption option in options)
            {
                // 开始构建下推参数:
                // 待下推的源单数据行
                List <ListSelectedRow> srcSelectedRows = new List <ListSelectedRow>();
                // Dictionary<long, List<Tuple<string, int>>> dic = new Dictionary<long, List<Tuple<string, int>>>();
                foreach (long billId in option.SourceBillIds)
                {
                    srcSelectedRows = new List <ListSelectedRow>();
                    int rowKey = -1;
                    for (int i = 0; i < option.SourceBillEntryIds.Count(); i++)
                    {
                        ListSelectedRow row = new ListSelectedRow(billId.ToString(), option.SourceBillEntryIds[i].ToString(), rowKey++, SourceFormId);
                        row.EntryEntityKey = SourceEntryEntityKey;
                        Dictionary <string, string> fieldValues = new Dictionary <string, string>();
                        fieldValues.Add(SourceEntryEntityKey, option.SourceBillEntryIds[i].ToString());
                        row.FieldValues = fieldValues;
                        srcSelectedRows.Add(row);
                        //dic.Add(option.SourceBillEntryIds[i], new List<Tuple<string, int>> { new Tuple<string, int>(" ", option.mount[i]) });
                    }
                }
                // 指定目标单单据类型:情况比较复杂,直接留空,会下推到默认的单据类型
                if (targetBillTypeId == null)
                {
                    targetBillTypeId = string.Empty;
                }
                // 指定目标单据主业务组织:情况更加复杂,
                // 建议在转换规则中,配置好主业务组织字段的映射关系:运行时,由系统根据映射关系,自动从上游单据取主业务组织,避免由插件指定
                long targetOrgId = 0;
                // 自定义参数字典:把一些自定义参数,传递到转换插件中;转换插件再根据这些参数,进行特定处理
                Dictionary <string, object> custParams = new Dictionary <string, object>();
                //custParams.Add("1", 1);
                //custParams.Add("2", 2);
                // 组装下推参数对象
                PushArgs pushArgs = new PushArgs(rule, srcSelectedRows.ToArray())
                {
                    TargetBillTypeId = targetBillTypeId,
                    TargetOrgId      = targetOrgId,
                    CustomParams     = custParams
                };
                // 调用下推服务,生成下游单据数据包
                //OperateOption option1 = OperateOption.Create();
                //option1.SetVariableValue("OutStockAmount", option.mount);
                //option1.SetVariableValue("srcbillseq", option.srcbillseq);
                //option1.SetVariableValue("FDATE", Convert.ToDateTime(option.FDATE));

                ConvertOperationResult operationResult = convertService.Push(ctx, pushArgs, operateOption);
                // 开始处理下推结果:
                // 获取下推生成的下游单据数据包
                DynamicObject[] targetBillObjs = (from p in operationResult.TargetDataEntities select p.DataEntity).ToArray();
                foreach (DynamicObject cc in targetBillObjs)
                {
                    DynamicObjectCollection rpt = cc["FPAYAPPLYENTRY"] as DynamicObjectCollection;
                    foreach (DynamicObject item in rpt)
                    {
                        // item["FDETABLEINID"] = option.dic[Convert.ToString(item["SoorDerno"]) + Convert.ToString(item["Fsrcbillseq"])];
                    }
                    before.Add(cc);
                }
                if (targetBillObjs.Length == 0)
                {
                    // 未下推成功目标单,抛出错误,中断审核
                    throw new KDBusinessException("", string.Format("由{0}自动下推{1},没有成功生成数据包,自动下推失败!", SourceFormId, TargetFormId));
                }
            }
            DynamicObject[] aa = before.Select(p => p).ToArray() as DynamicObject[];

            return(aa);
        }