K3Cloud系统集成实现下推单据转换调用

本帖子旨在提供可以运行的系统集成下推单据转换的示例
1、是完全可以直接运行的代码。
2、只对平台核心组件有引用,做到引用组件最合理精简。
3、通过服务查询获取源单。
4、注释比较详细,相信你很快可以看懂。
按照本帖子设置,一定可以实现单据转换的下推
分3步走
第一步:编写服务端代码。
第二步:登陆BOS 设计器进行插件绑定。
第三步:开始你的系统集成客户端代码编写 不管是Web Service方式,还是Web API方式都可以。
本示例不仅是系统集成方式调用,而且也对Cloud标准开发也有一定的参考价值。


第一步:编写服务端代码。服务端全部代码如下:

  1. //服务端插件代码
  2. //销售退货单 下推 应收单 服务端代码(Cloud5.0)
  3. //新建立.net 工程
  4. //引用组件 Kingdee.BOS.dll、Kingdee.BOS.Core.dll、Kingdee.BOS.DataEntity.dll、Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll
  5.  
  6. //wanghl 2015-03-24
  7.  
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.ComponentModel;
  13. using System.Data;
  14.  
  15. using Kingdee.BOS.Core.DynamicForm.PlugIn;
  16. using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
  17. using Kingdee.BOS.Core.DynamicForm;
  18. using Kingdee.BOS.Core.Metadata.ConvertElement;
  19. using Kingdee.BOS.Core.List;
  20. using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
  21. using Kingdee.BOS.Core.DynamicForm.Operation;
  22. using Kingdee.BOS.App;
  23. using Kingdee.BOS.Contracts;
  24. using Kingdee.BOS.Core.Metadata;
  25. using Kingdee.BOS.Orm.DataEntity;
  26. using Kingdee.BOS.App.Data;
  27. using Kingdee.BOS.Orm;
  28.  
  29.  
  30. namespace ClassLibrary.App.ServicePlugIn
  31. {
  32.     ///
  33.     /// 下推 单据转换 测试
  34.     ///
  35.     [Description("服务端插件")]
  36.     public class CustPushTestPlugIn : AbstractOperationServicePlugIn
  37.     {
  38.         ///
  39.         ///
  40.         ///
  41.         ///
  42.         public override void EndOperationTransaction(EndOperationTransactionArgs e)
  43.         {
  44.             base.EndOperationTransaction(e);
  45.  
  46.             //此参数是获取由系统集成调用客户端给的数据
  47.             var parameters = this.Option.GetVariableValue("Parameters");
  48.  
  49.             string getSourceSql = "select FID from T_SAL_RETURNSTOCK where FDOCUMENTSTATUS = 'C'";
  50.             //SAL_RETURNSTOCK 销售退货单, AR_receivable 应收单, 180ecd4afd5d44b5be78a6efe4a7e041 标准应收单类型内码
  51.             IOperationResult result = Invoke("SAL_RETURNSTOCK", "AR_receivable", getSourceSql, "180ecd4afd5d44b5be78a6efe4a7e041");
  52.  
  53.             this.OperationResult.IsSuccess = result.IsSuccess;
  54.             this.OperationResult.ValidationErrors = result.ValidationErrors;
  55.             this.OperationResult.OperateResult = result.OperateResult;
  56.         }
  57.  
  58.         ///
  59.         /// 下推 单据转换
  60.         ///
  61.         /// 源单 业务对象标识
  62.         /// 目标单 业务对象标识
  63.         /// 源单 查询语句
  64.         /// 目标单 转换目标类型
  65.         ///
  66.         private IOperationResult Invoke(string source, string target, string getSourceSql, string sargetBillTypeId)
  67.         {
  68.             IOperationResult result = new OperationResult();
  69.             //获取单据转换规则
  70.             ConvertRuleElement ruleElement = ServiceHelper.GetService().GetConvertRules(this.Context, source, target).FirstOrDefault();
  71.  
  72.             //如下代码 直接通过查询数据库获取单据转换源单数据
  73.             ListSelectedRowCollection rows = new ListSelectedRowCollection();
  74.             int i = 0;
  75.             using (IDataReader reader = DBUtils.ExecuteReader(this.Context, getSourceSql))
  76.             {
  77.                 while (reader.Read())
  78.                 {
  79.                     ListSelectedRow row = new ListSelectedRow(reader["FID"].ToString(), string.Empty, i++, source);
  80.                     rows.Add(row);
  81.                 }
  82.             }
  83.  
  84.             PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray());
  85.             pushArgs.TargetBillTypeId = sargetBillTypeId;
  86.             //转换生成目标单
  87.             ConvertOperationResult convertResult = ServiceHelper.GetService().Push(this.Context, pushArgs);
  88.             //合并转换操作结果
  89.             result.MergeResult(convertResult);
  90.  
  91.             //目标单据数据集合
  92.             DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
  93.             //根据实际情况,处理目标单据数据
  94.             DynamicObjectCollection col_FEntityDetail = destObjs[0]["AP_PAYABLEENTRY"] as DynamicObjectCollection;
  95.  
  96.             int sum = 0;
  97.             foreach (var item in col_FEntityDetail)
  98.             {
  99.                 item["TaxPrice"] = 1;
  100.                 sum = sum + 1;//测试用,暂时设置 “含税单价” 每条都是1
  101.             }
  102.  
  103.             DynamicObjectCollection col_FEntityPlan = destObjs[0]["AP_PAYABLEPLAN"] as DynamicObjectCollection;
  104.             int iPAYAMOUNTFOR = sum / col_FEntityPlan.Count;//“价税合计” 总金额平均分配到每一条付款计划 “应付金额” 字段
  105.             foreach (var item in col_FEntityPlan)
  106.             {
  107.                 item["PAYAMOUNTFOR"] = iPAYAMOUNTFOR;
  108.             }
  109.  
  110.             //设置单据头 “价税合计” 即【明细】分录的“含税单价”合计
  111.             destObjs[0]["FALLAMOUNTFOR"] = sum;
  112.  
  113.             //目标单元数据
  114.             FormMetadata destFormMetadata = ServiceHelper.GetService().Load(this.Context, target) as FormMetadata;
  115.  
  116.             //保存目标单据
  117.             IOperationResult saveResult = ServiceHelper.GetService().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
  118.             //合并保存操作结果
  119.             result.MergeResult(saveResult);
  120.             //根据操作结果构造返回结果
  121.             if ((result.ValidationErrors != null && result.ValidationErrors.Count > 0)
  122.             || (result.OperateResult != null && result.OperateResult.Count > 0))
  123.             {
  124.                 result.IsSuccess = false;
  125.             }
  126.             return result;
  127.         }
  128.     }
  129.  
  130. }
  131. 复制代码


    第二步:登陆BOS 设计器进行插件绑定。
    K3Cloud系统集成实现下推单据转换调用_第1张图片

    第三步:开始你的系统集成客户端代码编写 不管是Web Service方式,还是Web API方式都可以。
    Web API方式核心调用代码如下:

    1. static string CloudUrl = "http://192.168.73.123/K3cloud/";
    2.  
    3.         ///
    4.         /// DoNothing 销售退货单
    5.         ///
    6.         static string DoNothing_SAL_RETURNSTOCK()
    7.         {
    8.             HttpClient httpClient = new HttpClient();
    9.             httpClient.Url = string.Concat(CloudUrl, "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation.common.kdsvc");
    10.  
    11.             List Parameters = new List();
    12.             //业务对象Id 销售退货单
    13.             Parameters.Add("SAL_RETURNSTOCK");
    14.             Parameters.Add("DoNothing");
    15.             //Json字串 服务端可获取到 Parameters值。对于Model 服务端会根据所传值进行一次解析
    16.             string sContent = "{"Parameters":{"FID":"100025","FNumber":"XSTHD000055"},"Model":{"FID":"100025"}}";
    17.             Parameters.Add(sContent);
    18.             httpClient.Content = JsonConvert.SerializeObject(Parameters);
    19.             return httpClient.SysncRequest();
    20.         }
    21. 复制代码




      至此,相信你已经实现了,系统集成,下推单据转换的调用实现。

      你可能遇到错误提示:
      1、【所选目标单据类型,不允许由本源单下推】
      需要注意服务端代码的目标单类型赋值, pushArgs.TargetBillTypeId = "目标单据类型内码";
      该是目标单据类型内码不正确。
      具体单据类型内码查询语句如下:
      select
              (select FNAME
              from T_BAS_BILLTYPE_L
              where FBILLTYPEID = T_BAS_BILLTYPE.FBILLTYPEID and FLOCALEID = 2052) '中文'
              ,FBILLTYPEID '单据类型内码'
              ,*
      from T_BAS_BILLTYPE
      where FBILLFORMID = 'AR_receivable' --应收单

      你可能感兴趣的:(金蝶云二开)