本帖子旨在提供可以运行的系统集成下推单据转换的示例
1、是完全可以直接运行的代码。
2、只对平台核心组件有引用,做到引用组件最合理精简。
3、通过服务查询获取源单。
4、注释比较详细,相信你很快可以看懂。
按照本帖子设置,一定可以实现单据转换的下推
分3步走
第一步:编写服务端代码。
第二步:登陆BOS 设计器进行插件绑定。
第三步:开始你的系统集成客户端代码编写 不管是Web Service方式,还是Web API方式都可以。
本示例不仅是系统集成方式调用,而且也对Cloud标准开发也有一定的参考价值。
//服务端插件代码 //销售退货单 下推 应收单 服务端代码(Cloud5.0) //新建立.net 工程 //引用组件 Kingdee.BOS.dll、Kingdee.BOS.Core.dll、Kingdee.BOS.DataEntity.dll、Kingdee.BOS.App.dll、Kingdee.BOS.Contracts.dll //wanghl 2015-03-24 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Data; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.Metadata.ConvertElement; using Kingdee.BOS.Core.List; using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs; using Kingdee.BOS.Core.DynamicForm.Operation; using Kingdee.BOS.App; using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.App.Data; using Kingdee.BOS.Orm; namespace ClassLibrary.App.ServicePlugIn { /// <summary> /// 下推 单据转换 测试 /// </summary> [Description("服务端插件")] public class CustPushTestPlugIn : AbstractOperationServicePlugIn { /// <summary> /// /// </summary> /// <param name="e"></param> public override void EndOperationTransaction(EndOperationTransactionArgs e) { base.EndOperationTransaction(e); //此参数是获取由系统集成调用客户端给的数据 var parameters = this.Option.GetVariableValue<object>("Parameters"); string getSourceSql = "select FID from T_SAL_RETURNSTOCK where FDOCUMENTSTATUS = 'C'"; //SAL_RETURNSTOCK 销售退货单, AR_receivable 应收单, 180ecd4afd5d44b5be78a6efe4a7e041 标准应收单类型内码 IOperationResult result = Invoke("SAL_RETURNSTOCK", "AR_receivable", getSourceSql, "180ecd4afd5d44b5be78a6efe4a7e041"); this.OperationResult.IsSuccess = result.IsSuccess; this.OperationResult.ValidationErrors = result.ValidationErrors; this.OperationResult.OperateResult = result.OperateResult; } /// <summary> /// 下推 单据转换 /// </summary> /// <param name="source">源单 业务对象标识</param> /// <param name="target">目标单 业务对象标识</param> /// <param name="getSourceSql">源单 查询语句</param> /// <param name="sargetBillTypeId">目标单 转换目标类型</param> /// <returns></returns> private IOperationResult Invoke(string source, string target, string getSourceSql, string sargetBillTypeId) { IOperationResult result = new OperationResult(); //获取单据转换规则 ConvertRuleElement ruleElement = ServiceHelper.GetService<IConvertService>().GetConvertRules(this.Context, source, target).FirstOrDefault(); //如下代码 直接通过查询数据库获取单据转换源单数据 ListSelectedRowCollection rows = new ListSelectedRowCollection(); int i = 0; using (IDataReader reader = DBUtils.ExecuteReader(this.Context, getSourceSql)) { while (reader.Read()) { ListSelectedRow row = new ListSelectedRow(reader["FID"].ToString(), string.Empty, i++, source); rows.Add(row); } } PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray()); pushArgs.TargetBillTypeId = sargetBillTypeId; //转换生成目标单 ConvertOperationResult convertResult = ServiceHelper.GetService<IConvertService>().Push(this.Context, pushArgs); //合并转换操作结果 result.MergeResult(convertResult); //目标单据数据集合 DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray(); //根据实际情况,处理目标单据数据 DynamicObjectCollection col_FEntityDetail = destObjs[0]["AP_PAYABLEENTRY"] as DynamicObjectCollection; int sum = 0; foreach (var item in col_FEntityDetail) { item["TaxPrice"] = 1; sum = sum + 1;//测试用,暂时设置 “含税单价” 每条都是1 } DynamicObjectCollection col_FEntityPlan = destObjs[0]["AP_PAYABLEPLAN"] as DynamicObjectCollection; int iPAYAMOUNTFOR = sum / col_FEntityPlan.Count;//“价税合计” 总金额平均分配到每一条付款计划 “应付金额” 字段 foreach (var item in col_FEntityPlan) { item["PAYAMOUNTFOR"] = iPAYAMOUNTFOR; } //设置单据头 “价税合计” 即【明细】分录的“含税单价”合计 destObjs[0]["FALLAMOUNTFOR"] = sum; //目标单元数据 FormMetadata destFormMetadata = ServiceHelper.GetService<IMetaDataService>().Load(this.Context, target) as FormMetadata; //保存目标单据 IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create()); //合并保存操作结果 result.MergeResult(saveResult); //根据操作结果构造返回结果 if ((result.ValidationErrors != null && result.ValidationErrors.Count > 0) || (result.OperateResult != null && result.OperateResult.Count > 0)) { result.IsSuccess = false; } return result; } } } 复制代码
第一步:编写服务端代码。服务端全部代码如下:
第二步:登陆BOS 设计器进行插件绑定。
第三步:开始你的系统集成客户端代码编写 不管是Web Service方式,还是Web API方式都可以。
Web API方式核心调用代码如下:
static string CloudUrl = "http://192.168.73.123/K3cloud/";
/// <summary>
/// DoNothing 销售退货单
/// </summary>
static string DoNothing_SAL_RETURNSTOCK()
{
HttpClient httpClient = new HttpClient();
httpClient.Url = string.Concat(CloudUrl, "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation.common.kdsvc");
List<object> Parameters = new List<object>();
//业务对象Id 销售退货单
Parameters.Add("SAL_RETURNSTOCK");
Parameters.Add("DoNothing");
//Json字串 服务端可获取到 Parameters值。对于Model 服务端会根据所传值进行一次解析
string sContent = "{"Parameters":{"FID":"100025","FNumber":"XSTHD000055"},"Model":{"FID":"100025"}}";
Parameters.Add(sContent);
httpClient.Content = JsonConvert.SerializeObject(Parameters);
return httpClient.SysncRequest();
}
复制代码
至此,相信你已经实现了,系统集成,下推单据转换的调用实现。
你可能遇到错误提示:
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' --应收单
推荐阅读