本文提供了一个可直接运行的系统集成下推单据转换的示例,包括服务端代码编写、BOS设计器插件绑定及客户端代码编写(Web API方式)的详细步骤。服务端代码实现了单据转换逻辑,通过服务查询获取源单,并调用单据转换服务生成目标单据。示例强调了对核心组件的精简引用和详细注释,便于理解和实现。客户端代码展示了如何通过Web API方式调用服务端功能。此外,还提供了可能遇到的错误提示及解决方案,确保系统集成和下推单据转换的顺利实施。
[indent]本帖子旨在提供可以运行的系统集成下推单据转换的示例[/indent][indent]1、是完全可以直接运行的代码。[/indent][indent]2、只对平台核心组件有引用,做到引用组件最合理精简。[/indent][indent]3、通过服务查询获取源单。[/indent][indent]4、注释比较详细,相信你很快可以看懂。[/indent][indent]按照本帖子设置,一定可以实现单据转换的下推[/indent][indent]分3步走[/indent][indent]第一步:编写服务端代码。[/indent][indent]第二步:登陆BOS 设计器进行插件绑定。[/indent][indent]第三步:开始你的系统集成客户端代码编写 不管是Web Service方式,还是Web API方式都可以。[/indent][indent]本示例不仅是系统集成方式调用,而且也对Cloud标准开发也有一定的参考价值。[/indent]
第一步:编写服务端代码。服务端全部代码如下:
[code]//服务端插件代码
//销售退货单 下推 应收单 服务端代码(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
{
///
/// 下推 单据转换 测试
///
[Description("服务端插件")]
public class CustPushTestPlugIn : AbstractOperationServicePlugIn
{
///
///
///
///
public override void EndOperationTransaction(EndOperationTransactionArgs e)
{
base.EndOperationTransaction(e);
//此参数是获取由系统集成调用客户端给的数据
var parameters = this.Option.GetVariableValue
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;
}
///
/// 下推 单据转换
///
/// 源单 业务对象标识
/// 目标单 业务对象标识
/// 源单 查询语句
/// 目标单 转换目标类型
///
private IOperationResult Invoke(string source, string target, string getSourceSql, string sargetBillTypeId)
{
IOperationResult result = new OperationResult();
//获取单据转换规则
ConvertRuleElement ruleElement = ServiceHelper.GetService
//如下代码 直接通过查询数据库获取单据转换源单数据
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
//合并转换操作结果
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
//保存目标单据
IOperationResult saveResult = ServiceHelper.GetService
//合并保存操作结果
result.MergeResult(saveResult);
//根据操作结果构造返回结果
if ((result.ValidationErrors != null && result.ValidationErrors.Count > 0)
|| (result.OperateResult != null && result.OperateResult.Count > 0))
{
result.IsSuccess = false;
}
return result;
}
}
}
[/code]
第二步:登陆BOS 设计器进行插件绑定。
第三步:开始你的系统集成客户端代码编写 不管是Web Service方式,还是Web API方式都可以。
Web API方式核心调用代码如下:
[code] static string CloudUrl = "http://192.168.73.123/K3cloud/";
///
/// DoNothing 销售退货单
///
static string DoNothing_SAL_RETURNSTOCK()
{
HttpClient httpClient = new HttpClient();
httpClient.Url = string.Concat(CloudUrl, "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation.common.kdsvc");
List
至此,相信你已经实现了,系统集成,下推单据转换的调用实现。
你可能遇到错误提示:
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' --应收单
PushSet.jpg(99.21KB)
推荐阅读