需求要点:在单据A的界面点击“自动转换”,则自动产生审核态的单据B;若单据B不满足审核条件,则维持“提交”态;若单据B不满足保存校验,则维持“暂存”态;若转换失败,给出界面提示。

实现思路:
1.通过转换规则来定义单据A到单据B的转换关系,便于扩展,也便于使用已有的插件和服务;
2.定义一个空操作“自动转换”,扩展AbstractOperationServicePlugIn,重写EndOperationTransaction方法,方便处理事务;
3.依次调用单据转换服务、暂存服务、保存服务、提交服务和审核服务,以保证当前服务失败时能维持前一服务的状态;
4.根据上述服务调用的结果构造“自动转换”的操作结果;
5.若需求变更,只能生成审核态的单据B,否则不予生成,就要调用删除服务将所有审核不通过的单据删除,再构造操作结果;也可以直接抛出异常throw new KDBusinessException("", string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message)))。

代码示例:

    public override void EndOperationTransaction(BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e){base.EndOperationTransaction(e);// 转换 //ConvertRuleElement ruleElement = AppServiceContext.ConvertService.GetConvertRules(this.Context, "srcFormId", "destFormId").Where(o => o.IsDefault == true).FirstOrDefault();ListSelectedRowCollection rows = new ListSelectedRowCollection();int i = 0;foreach (var srcData in e.DataEntitys){ListSelectedRow row = new ListSelectedRow(srcData.GetDynamicObjectItemValue<string>("Id"), string.Empty, i++,"srcFormId");rows.Add(row);}OperateOption option = OperateOption.Create();option.SetVariableValue(BOSConst.CST_ConvertValidatePermission, true);PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray());// 转换生成目标单ConvertOperationResult convResult = AppServiceContext.ConvertService.Push(this.Context, pushArgs, option);DynamicObject[] destObjs = convResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();// 目标单元数据FormMetadata destFormMetadata = AppMetadataContext.LoadWithNoVerCheck(this.Context, "destFormId") as FormMetadata;// 操作选项option = OperateOption.Create();option.SetIgnoreWarning(false);// 上一步操作成功的目标单List<object> lastSuccessIdLst = new List<object>();// 本操作成功的目标单List<object> successIdLst = new List<object>();// 操作失败的目标单List<DynamicObject> failedobjs = new List<DynamicObject>();// 操作结果IOperationResult result = new OperationResult();// 错误信息List<ValidationErrorInfo> errorLst = new List<ValidationErrorInfo>();// 暂存 //IDraftService service = Kingdee.BOS.Contracts.ServiceFactory.GetService<IDraftService>(this.Context);IOperationResult innerResult = service.Draft(this.Context, destFormMetadata.BusinessInfo, destObjs);// 暂存成功的目标单successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();// 暂存不通过的目标单failedobjs = destObjs.Where(o => !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();if (failedobjs != null && !failedobjs.IsEmpty()){errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "DraftError", string.Format("{0}暂存失败:{1}",string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));}// 暂存不通过,则操作失败if (successIdLst.IsEmpty()){result.IsSuccess = false;}e.DataEntitys = e.DataEntitys.Where(o => successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToArray();// 保存 //if (!successIdLst.IsEmpty()){lastSuccessIdLst = successIdLst;innerResult = AppServiceContext.SaveService.Save(this.Context, destFormMetadata.BusinessInfo, destObjs.Where(o => successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToArray(), option);// 保存成功的目标单successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();// 校验不通过的目标单failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();if (failedobjs != null && !failedobjs.IsEmpty()){errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "SaveError", string.Format("{0}保存失败,已暂存:{1}",string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));}}// 提交 //if (!successIdLst.IsEmpty()){lastSuccessIdLst = successIdLst;innerResult = AppServiceContext.SubmitService.Submit(this.Context, destFormMetadata.BusinessInfo, successIdLst.ToArray(), "Submit", option);// 提交成功的目标单successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();// 校验不通过的目标单failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();if (failedobjs != null && !failedobjs.IsEmpty()){errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "SubmitError", string.Format("{0}提交失败,已保存:{1}",string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));}}// 审核 //if (!successIdLst.IsEmpty()){lastSuccessIdLst = successIdLst;List<KeyValuePair<object, object>> pkIds = new List<KeyValuePair<object, object>>();foreach (var o in successIdLst){pkIds.Add(new KeyValuePair<object, object>(o, ""));}//审核List<object> paraAudit = new List<object>();//1审核通过paraAudit.Add("1");//审核意见paraAudit.Add("");innerResult = AppServiceContext.SetStatusService.SetBillStatus(this.Context, destFormMetadata.BusinessInfo, pkIds, paraAudit, "Audit", option);// 审核成功的目标单successIdLst = innerResult.OperateResult.Select(o => o.PKValue).Distinct().ToList();// 审核不通过的目标单failedobjs = destObjs.Where(o => lastSuccessIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))&& !successIdLst.Contains(o.GetDynamicObjectItemValue<object>("Id"))).ToList();if (failedobjs != null && !failedobjs.IsEmpty()){errorLst.Add(new ValidationErrorInfo("", "Id", 0, 0, "AuditError", string.Format("{0}审核失败,已提交:{1}",string.Join(",", failedobjs.Select(o => o.GetDynamicObjectItemValue<string>("BillNo"))), string.Join("\n", innerResult.ValidationErrors.Select(o => o.Message))), "", ErrorLevel.Error));}}// 构造错误信息 //if (!errorLst.IsNullOrEmpty()){result.ValidationErrors.AddRange(errorLst);}// 将操作结果合并到空操作结果中this.OperationResult.IsSuccess = result.IsSuccess;if (!this.OperationResult.IsSuccess){this.OperationResult.ValidationErrors.Add(new ValidationErrorInfo("", "Id", 0, 0, "Error", string.Format("自动转换失败"), "", ErrorLevel.Error));}this.OperationResult.MergeResult(result);}

引用:

转载于:https://www.cnblogs.com/fyq891014/p/8698041.html

单据自动转换并审核的方法示例相关推荐

  1. java 首字母小写_java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例...

    本文实例讲述了java实现将字符串中首字母转换成大写,其它全部转换成小写的方法.分享给大家供大家参考,具体如下: public class TestSubstring { public static ...

  2. 使用postcss-plugin-px2rem和postcss-pxtorem(postcss-px2rem)-px自动转换rem的配置方法-vue-cli3.0

    在vue-cli3.0中使用postcss-plugin-px2rem 插件 插件的作用是 自动将vue项目中的px转换为rem  postcss-plugin-px2rem优势: 因为 postcs ...

  3. java form的时间格式_SpringMvc接收日期表单提交,自动转换成Date类型方法

    User中有birthday(Date)属性,用户注册的时候,选择日期即可,然后提交表单,可spring mvc 报错,400 Bad Request意思是不能把字符串转为Date类型的. 实体类中加 ...

  4. python将源代码转换成在html可显示的格式,Python实现将HTML转换成doc格式文件的方法示例...

    Python实现将HTML转换成doc格式文件的方法示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现将HTML转换成doc格式文件的方法示例. ...

  5. boost::python模块显示重载和自动转换问题的示例

    boost::python模块显示重载和自动转换问题的示例 实现功能 C++实现代码 实现功能 boost::python模块显示重载和自动转换问题的示例 C++实现代码 #include <b ...

  6. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} ...

  7. csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法

    csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法 参考文章: (1)csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计 ...

  8. V90 PN 伺服驱动器的一键自动优化功能_方法示例

    V90 PN 伺服驱动器的一键自动优化功能_方法示例 首先,了解一下伺服系统的组成,如下图所示,电流环.速度环和位置环 重点: 伺服系统的调节要结合实际的电机机械负载. 对于V90伺服驱动器,支持手动 ...

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

    金蝶K3Cloud插件 -- 单据保存自动提交并审核(c#) 最近在做金蝶相关的技术支持,记录一下插件开发步骤.使用C#开发 需求:实现表单点击保存,自动进行提交审核 1.打开VS,新建项目,选择类库 ...

最新文章

  1. R语言时间序列(time series)分析实战:简单指数平滑法预测
  2. curl用法:获取网站的header头及状态码
  3. 升腾威讯怎么恢复集群_PB级大规模Elasticsearch集群运维与调优实践
  4. Linux7的ftp日志怎么看,centos7打开sftp操作日志
  5. PAT甲级 -- 1007 Maximum Subsequence Sum (25 分)
  6. 【转】ABP源码分析四十:ZERO的Application和Tenant
  7. LVS三种工作模式、十种调度算法介绍
  8. scala 函数中嵌套函数_Scala中的VarArgs函数和@varargs批注
  9. 基础学习笔记之opencv(2):haartraining前将统一图片尺寸方法
  10. @开源镜像站(linux系统:Center OS|Ubuntu|Debian)
  11. 计算机的方差符号怎么输入,【2人回答】标准差的符号在电脑上怎么输入?-3D溜溜网...
  12. “造星工厂“乐华娱乐IPO,如何寻找下一个“王一博“?
  13. excel从两列数据中找到相同的数据,并用不同颜色展示
  14. Android studio3.2 分配内存设置方法
  15. mac dock 隐藏程序_从Dock删除最近的应用程序
  16. java实现pdf文件下载
  17. WebRTC源码研究(47)WebRCT传输非音视频数据
  18. 【学习笔记】ROS-移动机器人导航相关
  19. 代码Review工具upsourse的部署
  20. 学习Java用什么软件?

热门文章

  1. 【动态规划】最长公共子序列与最长公共子串
  2. VDI序曲二十一 APP-V 4.6 SP1服务器端部署
  3. 今年央视的春晚能给人带来惊喜吗?
  4. Java 重写(Override)与重载(Overload)
  5. FastJson 转换 javaBean 时 null 值被忽略都问题
  6. 恶意软件每天至少30万个变种 杀毒软件捉襟见肘 来看4种恶意软件反查杀技术...
  7. 微信授权获取用户的openid和支付宝授权获取用户的userid
  8. centos下axel安装与使用
  9. Andriod使用webview控件往APP里内嵌网页
  10. 为什么一定要杀掉病毒?---帮一位老师解决MyDocument.exe优盘文件夹图标病毒问题...