/// <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); }
/// <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); }