K3Cloud系统集成实现下推单据转换调用【分享】
金蝶云社区-天冥异
天冥异
4人赞赏了该文章 2956次浏览 未经作者许可,禁止转载编辑于2018年07月19日 20:37:30
本帖子旨在提供可以运行的系统集成下推单据转换的示例
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. //wanghl 2015-03-24


  6. using System;

  7. using System.Collections.Generic;

  8. using System.Linq;

  9. using System.Text;

  10. using System.ComponentModel;

  11. using System.Data;


  12. using Kingdee.BOS.Core.DynamicForm.PlugIn;

  13. using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

  14. using Kingdee.BOS.Core.DynamicForm;

  15. using Kingdee.BOS.Core.Metadata.ConvertElement;

  16. using Kingdee.BOS.Core.List;

  17. using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;

  18. using Kingdee.BOS.Core.DynamicForm.Operation;

  19. using Kingdee.BOS.App;

  20. using Kingdee.BOS.Contracts;

  21. using Kingdee.BOS.Core.Metadata;

  22. using Kingdee.BOS.Orm.DataEntity;

  23. using Kingdee.BOS.App.Data;

  24. using Kingdee.BOS.Orm;



  25. namespace ClassLibrary.App.ServicePlugIn

  26. {

  27.     /// <summary>

  28.     /// 下推 单据转换 测试

  29.     /// </summary>

  30.     [Description("服务端插件")]

  31.     public class CustPushTestPlugIn : AbstractOperationServicePlugIn

  32.     {

  33.         /// <summary>

  34.         /// 

  35.         /// </summary>

  36.         /// <param name="e"></param>

  37.         public override void EndOperationTransaction(EndOperationTransactionArgs e)

  38.         {

  39.             base.EndOperationTransaction(e);


  40.             //此参数是获取由系统集成调用客户端给的数据

  41.             var parameters = this.Option.GetVariableValue<object>("Parameters");


  42.             string getSourceSql = "select FID from T_SAL_RETURNSTOCK where FDOCUMENTSTATUS = 'C'";

  43.             //SAL_RETURNSTOCK 销售退货单, AR_receivable 应收单, 180ecd4afd5d44b5be78a6efe4a7e041 标准应收单类型内码

  44.             IOperationResult result = Invoke("SAL_RETURNSTOCK", "AR_receivable", getSourceSql, "180ecd4afd5d44b5be78a6efe4a7e041");


  45.             this.OperationResult.IsSuccess = result.IsSuccess;

  46.             this.OperationResult.ValidationErrors = result.ValidationErrors;

  47.             this.OperationResult.OperateResult = result.OperateResult;

  48.         }


  49.         /// <summary>

  50.         /// 下推 单据转换

  51.         /// </summary>

  52.         /// <param name="source">源单 业务对象标识</param>

  53.         /// <param name="target">目标单 业务对象标识</param>

  54.         /// <param name="getSourceSql">源单 查询语句</param>

  55.         /// <param name="sargetBillTypeId">目标单 转换目标类型</param>

  56.         /// <returns></returns>

  57.         private IOperationResult Invoke(string source, string target, string getSourceSql, string sargetBillTypeId)

  58.         {

  59.             IOperationResult result = new OperationResult();

  60.             //获取单据转换规则

  61.             ConvertRuleElement ruleElement = ServiceHelper.GetService<IConvertService>().GetConvertRules(this.Context, source, target).FirstOrDefault();


  62.             //如下代码 直接通过查询数据库获取单据转换源单数据

  63.             ListSelectedRowCollection rows = new ListSelectedRowCollection();

  64.             int i = 0;

  65.             using (IDataReader reader = DBUtils.ExecuteReader(this.Context, getSourceSql))

  66.             {

  67.                 while (reader.Read())

  68.                 {

  69.                     ListSelectedRow row = new ListSelectedRow(reader["FID"].ToString(), string.Empty, i++, source);

  70.                     rows.Add(row);

  71.                 }

  72.             }


  73.             PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray());

  74.             pushArgs.TargetBillTypeId = sargetBillTypeId;

  75.             //转换生成目标单

  76.             ConvertOperationResult convertResult = ServiceHelper.GetService<IConvertService>().Push(this.Context, pushArgs);

  77.             //合并转换操作结果

  78.             result.MergeResult(convertResult);


  79.             //目标单据数据集合

  80.             DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();

  81.             //根据实际情况,处理目标单据数据

  82.             DynamicObjectCollection col_FEntityDetail = destObjs[0]["AP_PAYABLEENTRY"] as DynamicObjectCollection;


  83.             int sum = 0;

  84.             foreach (var item in col_FEntityDetail)

  85.             {

  86.                 item["TaxPrice"] = 1;

  87.                 sum = sum + 1;//测试用,暂时设置 “含税单价” 每条都是1

  88.             }


  89.             DynamicObjectCollection col_FEntityPlan = destObjs[0]["AP_PAYABLEPLAN"] as DynamicObjectCollection;

  90.             int iPAYAMOUNTFOR = sum / col_FEntityPlan.Count;//“价税合计” 总金额平均分配到每一条付款计划 “应付金额” 字段

  91.             foreach (var item in col_FEntityPlan)

  92.             {

  93.                 item["PAYAMOUNTFOR"] = iPAYAMOUNTFOR;

  94.             }


  95.             //设置单据头 “价税合计” 即【明细】分录的“含税单价”合计

  96.             destObjs[0]["FALLAMOUNTFOR"] = sum;


  97.             //目标单元数据

  98.             FormMetadata destFormMetadata = ServiceHelper.GetService<IMetaDataService>().Load(this.Context, target) as FormMetadata;


  99.             //保存目标单据

  100.             IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());

  101.             //合并保存操作结果

  102.             result.MergeResult(saveResult);

  103.             //根据操作结果构造返回结果

  104.             if ((result.ValidationErrors != null && result.ValidationErrors.Count > 0)

  105.             || (result.OperateResult != null && result.OperateResult.Count > 0))

  106.             {

  107.                 result.IsSuccess = false;

  108.             }

  109.             return result;

  110.         }

  111.     }


  112. }


复制代码


第二步:登陆BOS 设计器进行插件绑定。
PushSet.jpg 

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

  1. static string CloudUrl = "http://192.168.73.123/K3cloud/";


  2.         /// <summary>

  3.         /// DoNothing 销售退货单

  4.         /// </summary>

  5.         static string DoNothing_SAL_RETURNSTOCK()

  6.         {

  7.             HttpClient httpClient = new HttpClient();

  8.             httpClient.Url = string.Concat(CloudUrl, "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation.common.kdsvc");


  9.             List<object> Parameters = new List<object>();

  10.             //业务对象Id 销售退货单

  11.             Parameters.Add("SAL_RETURNSTOCK");

  12.             Parameters.Add("DoNothing");

  13.             //Json字串 服务端可获取到 Parameters值。对于Model 服务端会根据所传值进行一次解析

  14.             string sContent = "{"Parameters":{"FID":"100025","FNumber":"XSTHD000055"},"Model":{"FID":"100025"}}";

  15.             Parameters.Add(sContent);

  16.             httpClient.Content = JsonConvert.SerializeObject(Parameters);

  17.             return httpClient.SysncRequest();

  18.         }

复制代码




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

你可能遇到错误提示:
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' --应收单


赞 4