.NetCore对接各大财务软件凭证API——金蝶系列(1)

哈喽,又和大家见面了,虽然看文章的小伙伴不多,但是我相信总有一天,自己写的这些文章或多或少会对其他人有些帮助,让他们在相关的业务开发下能少走些弯路,那我的目的就达到了,好了,今天就正式开始我们的系列了,今天要讲的是金蝶系列的API,大家都知道,金蝶的产品是比较多的,那么我们这次要讲解的就是金蝶云星空,或者叫K3Cloud。

首先,作为一名程序猿我们在拿到类似的接口对接需求,第一件是肯定是看相关文档,然后做接口分析,最后是封装接口,运用到我们的项目中去,所以对于我们来说,第一步就是寻找相关的开发文档,在这方面不得不承认,金蝶社区是个好地方。里面有关于产品的所有知识点和大家遇到的各种问题。废话不多说,文档哪里找,请看下面的步骤

一.K3Cloud接口地址以及财务环境的登录信息

我们在做.netCore对接财务系统时,要用到的几个参数有:账套号,用户名,密码,财务环境地址(支持外网访问)

这个信息你可以找你对接的客户要,最好是能要到外网登录的地址,因为这样省去你远程登录的麻烦,其次,账号的权限也很重要,该账号下必须能看到名为-- WebAPI的菜单,因为我们需要的接口信息包括后续的测试等都可以在这里处理。如下图所示

二.对接要用到的接口列表

既然将凭证API,那么我们需要用到的几个菜单在财务会计--总账下:主要有科目查询接口、凭证字查询接口、凭证新增接口

每个操作我们都可以通过在线测试WebAPI来验证我们的接口信息,查询接口的请求参数说明详见下图


要注意的地方有几点:

1.唯一码的FormId

FormId为每个业务对象的表单Id,如科目对应的就是BD_Account,这里建议我们在开发时,可以提前将这些用到的表单ID统一设置为常量。参考以下代码片段,当然实际开发中我们可能用不到这么多,大家根据自己的情况进行合理的取舍。


publicclassBillKeyConst

   {

#region财务会计总账

•publicconststring科目="BD_Account";

•publicconststring帐薄="BD_AccountBook";

•publicconststring会计日历="BD_ACCOUNTCALENDAR";

•publicconststring会计要素="BD_AccountGroup";

•publicconststring币别="BD_Currency";

•publicconststring费用项目="BD_Expense";

•publicconststring汇率="BD_Rate";

•publicconststring结算方式="BD_SETTLETYPE";

•publicconststring凭证字="BD_VOUCHERGROUP";

•publicconststring调整期间管理="GL_ADJUSTPERIOD";

•publicconststring自动转账="GL_AutoTransfer";

•publicconststring现金流量项目="GL_CashFlow";

•publicconststring附表项目指定="GL_CashIndirectItem";

•publicconststring智能转存="GL_DepositScheme";

•publicconststring期末调汇="GL_ExchangeScheme";

•publicconststring摘要库="GL_Explanation";

•publicconststring附表项目调整="GL_INDIRECTITEMADJUST";

•publicconststring帐薄隶属关系="GL_MultiBookMergeScheme";

•publicconststring结转损益="GL_PLScheme";

•publicconststringT型账="GL_TACCOUNT";

•publicconststring凭证="GL_VOUCHER";

•publicconststring凭证摊销="GL_VoucherAmortize";

•publicconststring模式凭证="GL_VoucherModel";

•publicconststring凭证预提="GL_VoucherProvision";

•publicconststring会计核算体系="Org_AccountSystem";

•#endregion

•#region财务会计智能会计平台

•publicconststring业务凭证="BAS_BusinessVoucher";

•publicconststring凭证生成="Bas_MakeBizVchWizard";

•publicconststring分录类型="BAS_VchEntryType";

•publicconststring凭证模板="BAS_VchTemplate";

•publicconststring增值税发票单据="GL_AddedTaxBill";

•publicconststring增值税发票识别="GL_AddedTaxOcrResult";

•publicconststring凭证自动生成方案="GL_AutoBuildVoucherScheme";

•publicconststring扫描识别模板管理="GL_BillOcrTemplate";

•publicconststring对账方案="GL_CHECKSCHEME";

•publicconststring自定义单据识别="GL_OcrResultBase";

•publicconststring扫描仪注册登记="GL_ScannerSign";

•publicconststring银行回单_付款="GL_YHHDFK";

•publicconststring银行回单_收款="GL_YHHDSK";

•#endregion

•#region供应链采购单据

•publicconststringSCM_警示灯方案="SCM_WarnScheme";

•publicconststringBD_采购条款="BD_PURCLAUSE";

•publicconststringBD_采购折扣表="BD_PurDiscount";

•publicconststringPUR_评估等级="PUR_Assessment";

•publicconststringPUR_采购评估指标="PUR_AssessmentIndex";

•publicconststringPUR_采购评估方案="PUR_AssessmentPlans";

•publicconststringPUR_货源清单="PUR_CATALOG";

•publicconststringPUR_采购合同="PUR_Contract";

•publicconststringPUR_采购合同变更单="PUR_ContractChange";

•publicconststringPUR_期初采购退料单="PUR_InitMRS";

•publicconststringPUR_退料申请单="PUR_MRAPP";

•publicconststringPUR_采购退料单="PUR_MRB";

•publicconststringPUR_采购调价表="PUR_PAT";

•publicconststringPUR_采购定价变更单="PUR_POChange";

•publicconststringPUR_采购定价新变更单="PUR_POXChange";

•publicconststringPUR_采购价目表="PUR_PriceCategory";

•publicconststringPUR_物权转移单="PUR_PropertyConvert";

•publicconststringPUR_采购订单="PUR_PurchaseOrder";

•publicconststringPUR_收料通知单="PUR_ReceiveBill";

•publicconststringPUR_采购申请单="PUR_Requisition";

•publicconststringPUR_供应商评分表="PUR_SupplierAsseementTb";

•publicconststringPUR_消耗汇总表="PUR_VMIConsumeSum";

•publicconststringSTK_期初采购入库单="STK_InitInStock";

•publicconststringSTK_采购入库单="STK_InStock";

•#endregion

•#region供应链销售管理

•publicconststringBD_云之家考勤设置="BD_AttendanceSetting";

•publicconststringBD_轻应用自定义字段设置="BD_MobExtendFieldConfig";

•publicconststringBD_销售折扣表="BD_SAL_DiscountList";

•publicconststringBD_销售价目表="BD_SAL_PriceList";

•publicconststringBD_销售条款="BD_SALCLAUSE";

•publicconststringSAL_销售调价方案="SAL_ADJUSTPRICE";

•publicconststringSAL_可发量查询="SAL_AvailableQuery";

•publicconststringSAL_批量调价单="SAL_BATCHADJUSTPRICE";

•publicconststringSAL_寄售结算单="SAL_ConsignmentSettle";

•publicconststringSAL_客户物料对应表="SAL_CustMatMapping";

•publicconststringSAL_发货通知单="SAL_DELIVERYNOTICE";

•publicconststringSAL_期初销售出库单="SAL_INITOUTSTOCK";

•publicconststringSAL_电子面单="SAL_KuaidiBill";

•publicconststringSAL_销售物流信息="SAL_LogisticsInfo";

•publicconststringSAL_销售出库单="SAL_OUTSTOCK";

•publicconststringSAL_销售报价单="SAL_QUOTATION";

•publicconststringSAL_退货通知单="SAL_RETURNNOTICE";

•publicconststringSAL_销售退货单="SAL_RETURNSTOCK";

•publicconststringSAL_销售订单="SAL_SaleOrder";

•publicconststringSAL_销售订单变更单="SAL_SaleOrderChange";

•publicconststringSAL_模拟报价单="Sal_SimulateQuotation";

•publicconststringSAL_标准费率维护="Sal_StdExchangeRate";

•publicconststringSAL_销售订单新变更单="SAL_XORDER";

•publicconststringSAL_销售报价变更单="SAL_XQUOTATION";

•#endregion

•#region供应链信用管理

•publicconststringCRE_信用检查规则="CRE_CheckRule";

•publicconststringCRE_信用表更="CRE_CreditChange";

•publicconststringCRE_信用总额特批="CRE_CreditSumPermit";

•publicconststringCRE_信用档案="CRE_CustArchives";

•publicconststringCRE_客户物料信用档案="CRE_CustMaterialArchive";

•publicconststringCRE_信用评估模型="CRE_EvalModel";

•publicconststringCRE_信用评估指标="CRE_EvaluateIndex";

•publicconststringCRE_信用等级方案="CRE_Gade";

•publicconststringCRE_信用评分表="CRE_ScoringTable";

•publicconststringCRE_信用特批权限="CRE_SpecPermission";

•publicconststringCRE_临时信用档案="CRE_TmpCustArchives";

•#endregion

•#region供应链库存管理

•publicconststringBD_归档序列号="BD_ArchivedSerial";

•publicconststringBD_批号主档="BD_BatchMainFile";

•publicconststringBD_批号_序列号属性="BD_LotCodeItem";

•publicconststringBD_批号_序列号编码规则="BD_LotCodeRule";

•publicconststringBD_生产追溯序列号主档="BD_MTSerialMainFile";

•publicconststringBD_序列号主档="BD_SerialMainFile";

•publicconststringBD_仓库="BD_STOCK";

•publicconststringBD_仓库最大最小安全库存="BD_StockAlert";

•publicconststringBD_库存状态="BD_StockStatus";

•publicconststringSP_简单生成入库单="SP_InStock";

•publicconststringSP_简单生成退库单="SP_OUTSTOCK";

•publicconststringSP_简单生成领料单="SP_PickMtrl";

•publicconststringSP_简单生成退料单="SP_ReturnMtrl";

•publicconststringSTK_组装拆卸单="STK_AssembledApp";

•publicconststringSTK_周期盘点计划="STK_CycleCountPlan";

•publicconststringBD_物料周期盘点表="STK_CycleCountTable";

•publicconststringSTK_即时库存="STK_Inventory";

•publicconststringSTK_初始库存="STK_InvInit";

•publicconststringSTK_库存锁库="STK_LockStock";

•publicconststringSTK_锁库日志="STK_LOCKSTOCKLOG";

•publicconststringSTK_批号调整单="STK_LOTADJUST";

•publicconststringSTK_ABC分配组="STK_MaterialABCGroup";

•publicconststringSTK_其他入库单="STK_MISCELLANEOUS";

•publicconststringSTK_其他出库单="STK_MisDelivery";

•publicconststringSTK_委托加工材料入库单="STK_OEMInStock";

•publicconststringSTK_委托加工材料退料单="STK_OEMInStockRETURN";

•publicconststringSTK_委托加工材料收料单="STK_OEMReceive";

•publicconststringSTK_出库申请单="STK_OutStockApply";

•publicconststringSTK_形态转换单="STK_StatusConvert";

•publicconststringSTK_库存状态转换="STK_StockConvert";

•publicconststringSTK_盘盈单="STK_StockCountGain";

•publicconststringSTK_物料盘点作业="STK_StockCountInput";

•publicconststringSTK_盘亏单="STK_StockCountLoss";

•publicconststringSTK_盘点方案="STK_StockCountScheme";

•publicconststringSTK_调拨申请单="STK_TRANSFERAPPLY";

•publicconststringSTK_直接调拨单="STK_TransferDirect";

•publicconststringSTK_分布式调入单="STK_TRANSFERIN";

•publicconststringSTK_分布式调出单="STK_TRANSFEROUT";

•#endregion

•#region供应链组织间结算

•publicconststringIOS_应付结算清单_物料="IOS_APSettlement";

•publicconststringIOS_应付结算清单_费用="IOS_APSettlementExp";

•publicconststringIOS_应付结算清单_资产="IOS_APSettlementFA";

•publicconststringIOS_应收结算清单_物料="IOS_ARSettlement";

•publicconststringIOS_应收结算清单_费员="IOS_ARSettlementExp";

•publicconststringIOS_应收结算清单_资产="IOS_ARSettlementFA";

•publicconststringIOS_组织间结算价目表="IOS_PriceList";

•publicconststringIOS_定时结算="IOS_ScheduleSettle";

•publicconststringIOS_组织间结算关系="IOS_SettleRelation";

•publicconststringIOS_跨组织业务类型="IOS_TransferBizType";

•#endregion

•#region供应链条码管理

•publicconststringBD_异步生成数据="BD_AsyncBillScanData";

•publicconststringBD_条码盘点清单="BD_BarcodeInventoryData";

•publicconststringBD_条码属性="BD_BarCodeItem";

•publicconststringBD_条码主档="BD_BarCodeMainFile";

•publicconststringBD_条码打印="BD_BarCodePrint";

•publicconststringBD_条码规则="BD_BarCodeRule";

•publicconststringBD_条码扫描="BD_BarCodeScan";

•publicconststringBD_条码拆分="UN_BarCodeSplit";

•publicconststringBD_物料编码解析对应表="UN_MaterialMap";

•publicconststringBD_条码拆箱表="UN_Packaging";

•publicconststringBD_扫描配置="UN_SCAN";

•publicconststringBD_扫描记录="UN_SCANRecordSet";

•publicconststringBD_条码扫描任务="UN_SCANTASK";

•publicconststringBD_条码扫描任务生成日志="UN_SCANTASKCREATELOG";

•publicconststringBD_条码扫描任务方案="UN_SCANTASKSCHEME";

•#endregion

•#region供应链供应商管理

•publicconststringSVM_企业公告="SVM_BusinessBulletin";

•publicconststringSVM_比价单="SVM_ComparePrice";

•publicconststringSVM_询价单="SVM_InquiryBill";

•publicconststringSVM_报价单="SVM_QuoteBill";

•publicconststringSVM_供应商角色="SVM_Role";

•publicconststringSVM_供应商用户="SVM_SUPPLIERUSER";

•#endregion

•#region供应链供应商协同

•publicconststringSCP_供应商协同条码打印="SCP_BarCodePrint";

•publicconststringSCP_供应商协同条码扫描="SCP_BarCodeScan";

•publicconststringSCP_企业公告="SCP_BusinessBulletin";

•publicconststringSCP_询价单="SCP_InquiryBill";

•publicconststringSCP_采购入库单="SCP_InStock";

•publicconststringSCP_退料通知单="SCP_MRAPP";

•publicconststringSCP_采购退料单="SCP_MRB";

•publicconststringSCP_应付单="SCP_Payable";

•publicconststringSCP_采购订单变更单="SCP_POChange";

•publicconststringSCP_采购订单="SCP_PurchaseOrder";

•publicconststringSCP_报价单="SCP_QuoteBill";

•publicconststringSCP_送货通知单="SCP_ReceiveBill";

•publicconststringSCP_供应商协同即时库存查询="SCP_STKInventory";

•publicconststringSCP_供应商评估报告="SCP_SupplierAssResport";

•publicconststringSCP_供应商注册资料="SCP_SupReg";

•publicconststringSCP_供应商协同VMI消耗汇总表="SCP_VMIConsumeSum";

•#endregion

•#region基础管理--基础资料

•publicconststring关键字_智能机器人="BAS_ROBOTKEYWORDS";

•publicconststring消息任务_智能机器人="BAS_ROBOTMSGTASK";

•publicconststring关键字服务_智能机器人="BAS_ROBOTSERVICE";

•publicconststring会计政策="BD_ACCTPOLICY";

•publicconststring辅助属性值组合="BD_AuxPtyValCom";

•publicconststring辅助属性值="BD_AuxPtyValue";

•publicconststring银行="BD_BANK";

•publicconststring联系对象="BD_ContactObject";

•publicconststring客户="BD_Customer";

•publicconststring客户_包含非交易客户="BD_Customer_All";

•publicconststring部门="BD_Department";

•publicconststring员工="BD_Empinfo";

•publicconststring快递100物流公司="BD_KD100LogisticsCom";

•publicconststring物料="BD_MATERIAL";

•publicconststring存货类别="BD_MATERIALCATEGORY";

•publicconststring存货模板="BD_MATERIALTEMPLATE";

•publicconststring物料单位换算="BD_MATERIALUNITCONVERT";

•publicconststring员工任岗信息="BD_NEWSTAFF";

•publicconststring业务员="BD_OPERATOR";

•publicconststring业务组="BD_OPERATORGROUPBILL";

•publicconststring付款条件="BD_PaymentCondition";

•publicconststring岗位汇报="BD_PostReport";

•publicconststring收款条件="BD_RecCondition";

•publicconststring供应商="BD_Supplier";

•publicconststring税组合="BD_TAXMIX";

•publicconststring税率="BD_TaxRate";

•publicconststring税务规则="BD_TAXRULE";

•publicconststring税收制度="BD_TAXSYSTEM";

•publicconststring税种="BD_TAXTYPE";

•publicconststring计量单位="BD_UNIT";

•publicconststring银行账号="CN_BANKACNT";

•publicconststring现金账号="CN_CASHACCOUNT";

•publicconststring内部账户="CN_INNERACCOUNT";

•publicconststring其他往来单位="FIN_OTHERS";

•publicconststring岗位信息="HR_ORG_HRPOST";

•#endregion

•#region基础管理--组织管理

•publicconststring组织隶属关系="ORG_Affiliation";

•publicconststring分配执行情况="ORG_AutoAllocateLogInfo";

•publicconststring基础资料自动分配计划="ORG_AUTOALLOCATEPLAN";

•publicconststring基础资料控制策略="ORG_BaseDataControlPolicy";

•publicconststring组织业务关系="ORG_BizRelation";

•publicconststring组织变更检查规则="ORG_ChangeChkRule";

•publicconststring组织变更方案="ORG_ChangeSolution";

•publicconststring组织机构="ORG_Organizations";

•publicconststring组织形态="ORG_OrgBodyForm";

•publicconststring组织用户维护="Org_OrgUserRoleMap";

•#endregion

•}

2.查询字段集合

FieldKeys为要查询的字段Key集合,如我需要查询的字段有FName,FNumber等,详细的字段说明可以通过保存接口查看

那么我们只需要传入FName,FNumber即可。

3.返回结果的处理

返回的结果是个数组类型,所以我们无法直接通过.net序列化为对象,所以建议是直接序列化为JArry数组,然后进行取值。

三. .NetCore对接处理

3.1登录以及业务接口处理

有了以上的对接参数和简单的接口信息了解之后,我们就可以开始我们的API接口对接工作了,

首先,在社区一位大佬封装的WebAPI的基础上,我们来处理.netCore环境下的WebAPI接口,非常感谢大佬,我们可以看到封装的接口文件如下图所示:

常用的有Query、BatchSave类,如下图所示

Query操作

/// <summary>

   /// 执行查询操作。

   /// </summary>

   public class Query : FormOperation

   {

       #region 公共覆盖操作参数

       /// <summary>

       /// 操作的服务名称定义。

       /// </summary>

       public override string ServiceName

       {

           get

           {

               return "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery";

           }

       }//end property

       /// <summary>

       /// 操作的请求参数。

       /// </summary>

       public override string RequestParameters

       {

           get

           {

               var parametersArray = new object[]

               {

                   new

                   {

                       FormId = this.ObjectTypeId,

                       TopRowCount = this.TopRowCount,

                       Limit = this.PageRowCount == default(int) ? 2000 : this.PageRowCount,

                       StartRow = this.PageIndex,

                       FilterString = this.Filter,

                       OrderString = this.OrderBy,

                       FieldKeys = string.Join(",", this.FieldKeys)

                   }

               };

               return JsonConvert.SerializeObject(parametersArray);

           }

       }//end property

       #endregion

       #region 公共操作参数属性

       /// <summary>

       /// 读写最多允许查询的数量属性值。

       /// </summary>

       /// <remarks>

       /// 0或者不要此属性表示不限制。

       /// </remarks>

       public virtual int TopRowCount { get; set; }//end property

       /// <summary>

       /// 读写分页取数每页允许获取的数据属性值。

       /// </summary>

       /// <remarks>

       /// 最大不能超过2000。

       /// </remarks>

       public virtual int PageRowCount { get; set; }//end property

       /// <summary>

       /// 读写分页取数开始行索引属性值。

       /// </summary>

       /// <remarks>

       /// 从0开始,例如每页10行数据,第2页开始是10,第3页开始是20,以此类推,当不提供此属性,表示仅查询Limit中填写的数据量。

       /// </remarks>

       public virtual int PageIndex { get; set; }//end property

       /// <summary>

       /// 读写过滤条件属性值。

       /// </summary>

       public virtual string Filter { get; set; }//end property

       /// <summary>

       /// 读写排序条件属性值。

       /// </summary>

       public virtual string OrderBy { get; set; }//end property

       /// <summary>

       /// 读写表单返回数据字段的索引键属性值。

       /// </summary>

       public virtual List<string> FieldKeys { get; set; }//end property

       #endregion

       #region 公共方法

       /// <summary>

       /// 设置读写动态表单类型标识。

       /// </summary>

       /// <param name="objectTypeId">动态表单类型标识。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query SetObjectTypeId(string objectTypeId)

       {

           return this.SetObjectTypeId<Query>(objectTypeId);

       }//end method

       /// <summary>

       /// 设置最多允许查询的单据数量。

       /// </summary>

       /// <param name="topRowCount">单据数量值。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query SetTopRowCount(int topRowCount)

       {

           this.TopRowCount = topRowCount;

           return this;

       }//end method

       /// <summary>

       /// 设置分页取数每页允许获取的单据数量。

       /// </summary>

       /// <param name="pageRowCount">分页数量值。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query SetPageRowCount(int pageRowCount)

       {

           this.PageRowCount = pageRowCount;

           return this;

       }//end method

       /// <summary>

       /// 设置分页取数开始行索引。

       /// </summary>

       /// <param name="pageIndex">索引值。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query SetPageIndex(int pageIndex)

       {

           this.PageIndex = pageIndex;

           return this;

       }//end method

       /// <summary>

       /// 设置过滤条件。

       /// </summary>

       /// <param name="filter">过滤条件。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query SetFilter(string filter)

       {

           this.Filter = filter;

           return this;

       }//end method

       /// <summary>

       /// 设置排序条件。

       /// </summary>

       /// <param name="orderBy">排序条件。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query SetOrderBy(string orderBy)

       {

           this.OrderBy = orderBy;

           return this;

       }//end method

       /// <summary>

       /// 表单返回数据字段。

       /// </summary>

       /// <param name="fieldKey">字段索引键。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual Query AddFieldKey(string fieldKey)

       {

           if (this.FieldKeys == null)

           {

               this.FieldKeys = new List<string>();

           }//end if

           this.FieldKeys.Add(fieldKey);

           return this;

       }//end method

       #endregion

   }//end class

BatchSave操作,主要用于凭证的批量保存

/// <summary>

   /// 执行批量保存操作。

   /// </summary>

   public class BatchSave : Save

   {

       #region 公共覆盖操作参数

       /// <summary>

       /// 操作的服务名称定义。

       /// </summary>

       public override string ServiceName

       {

           get

           {

               return "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.BatchSave";

           }

       }//end property

       /// <summary>

       /// 待保存的数据对象。

       /// </summary>

       public override string RequestParameters

       {

           get

           {

               var parametersArray = new object[]{

                   this.ObjectTypeId,

                   new

                   {

                       Creator = string.IsNullOrEmpty(this.Creator) ? "IT" : this.Creator ,

                       NeedUpDateFields = this.NeedUpdateFieldKeys,

                       NeedReturnFieldKeys=this.NeedReturnFieldKeys,

                       Model = this.Models,

                       IsEntryBatchFill=this.IsEntryBatchFill,

                       IsDeleteEntry = this.IsDeleteEntry,

                       SubSystemId = this.SubSystemId,

                       IsAutoSubmitAndAudit=this.IsAutoSubmitAndAudit,

                       IsVerifyBaseDataField = this.IsVerifyBaseDataField,

                       NumberSearch = (this.BDSetter == BaseDataSetter.Number),

                       BatchCount=this.BatchCount

                   }

               };

               return JsonConvert.SerializeObject(parametersArray);

           }

       }//end property

       #endregion

       #region 公共操作参数属性

       /// <summary>

       /// 读写待保存的数据对象。

       /// </summary>

       public override object Model

       {

           get

           {

               return this.Models == null ? null : this.Models.FirstOrDefault();

           }

           set

           {

               if (this.Models == null)

               {

                   this.Models = new List<object>();

               }//end if

               this.Models.Add(value);

           }

       }//end property

       /// <summary>

       /// 读写待保存的多个数据对象。

       /// </summary>

       public virtual List<object> Models { get; set; }//end property

       /// <summary>

       /// 是否批量填充分录。

       /// </summary>

       public virtual bool IsEntryBatchFill { get; set; }//end property

       public virtual bool IsAutoSubmitAndAudit { get; set; }

       public virtual int BatchCount { get; set; }

       #endregion

       #region 公共方法

       /// <summary>

       /// 添加待保存的数据对象。

       /// </summary>

       /// <param name="model">待保存的数据对象。</param>

       /// <returns>返回类本身实例对象。</returns>

       public virtual BatchSave AddModel(object model)

       {

           if (this.Models == null)

           {

               this.Models = new List<object>();

           }//end if

           this.Models.Add(model);

           return this;

       }//end method

       /// <summary>

       /// 设置待保存的数据对象,但无论执行多少次只会保留最后一次设置的数据对象。

       /// </summary>

       /// <param name="model">待保存的数据对象。</param>

       /// <returns>返回类本身实例对象。</returns>

       new public virtual BatchSave SetModel(object model)

       {

           return this.SetModel<BatchSave>(model);

       }//end method

       #endregion

   }//end class

然后我们来看APIException类,可以看到该异常处理类统一继承自Kingdee.BOS.WebAPi.Client.ServiceException.

所以我们要引用 Kingdee.BOS.WebApi.Client.dll

另外这里官网给的代码示例中有句话很值得重视:// 使用webapi引用组件Kingdee.BOS.WebApi.Client.dll

这个组件我们可以在金蝶的安装目录下找到,当你兴致勃勃的找到这个dll,并将它引用到你的.netCore的项目中时,编译运行你会发现有个ServiceException类在.netCore环境下不支持,因为它仅在.net Framework支持。

所以呢,我们的第一反应是这可咋办,别着急,我们总有办法解决,反编译应该是我们在开发过程中比较常见的解决问题的办法,所以当我们将上述的dll进行反编译以后,我们可以得到如下一堆文件

接着我们就可以来处理我们的接口了,按照示例代码中的一样,我们来实现登录接口

/// <summary>

/// 实现登录。

/// </summary>

/// <returns>返回API结果。</returns>

public virtual APIResponse<LoginResult> Login()

{

var result = APIClient.CreateAPIOperation<LoginByUserPassword>(_Config.URL)

.SetDBId(_Config.DBId)

.SetUserName(_Config.UserName)

.SetPassword(_Config.Password)

.ToKdAPIRequest()

.ToAPIResponse<LoginResult>();

return result;

}

_config.Url---对应我们的金蝶财务环境的登录地址

_config.DBid--对应我们要操作的账套号---怎么查看到这个账套号是多少呢?还记得我们上面说的那个WebAPI菜单嘛,没错就是那里。我们随便点开一个菜单,比如我这里以科目为例,我们选中科目后,点击在线测试WebAPI按钮,就能找到我们所需的各自参数了。

_config.UserName --登录的用户名

_config.Password -- 登录的用户名的密码

这四个参数就对应我们登录接口的四个参数。

要注意的一点是我们在调用我们的业务接口时,必须先调用登录接口以实现登录操作。不然无法操作我们的业务接口。

       /// <summary>

       /// 查询人民币币别编码

       /// </summary>

       /// <returns></returns>

       public string QueryCurrency()

       {

           this.Login();

           var result = APIClient.CreateAPIOperation<Query>(_Config.URL)

               .SetObjectTypeId(BillKeyConst.币别)

               .AddFieldKey("FNumber")

               .AddFieldKey("FName")

               .SetFilter("FName like '%人民币%'")

               .ToAPIRequest<KdAPIRequest>().Execute<JArray>();

           if (result.Count > 0)

           {

               return result[0][0].ToString();

           }

           else

           {

               return "";

           }

       }

如我们上图所示的查询人民币的名称和编码。当然这只是查询单个实体,当我们查询所有的数据时,就可能会用到分页查询,因为金蝶的查询接口默认一次查询2000条数据,所以当总数量超过2000时,我们就需要用到分页查询了。

      public string QueryBasicInfoByPageList(string typeId, string FieldName, string Filter, int pageIndex)

       {

           this.Login();

           var result = APIClient.CreateAPIOperation<Query>(_Config.URL)

               .SetObjectTypeId(typeId)

               .AddFieldKey(FieldName)

               .SetFilter(Filter)

               .SetPageIndex(pageIndex)

               .ToAPIRequest<KdAPIRequest>().Execute<string>();

           return result;

       }

只需要在原有的基础上,增加pageIndex-页码参数即可,不过要注意的是每次查询的起始页码是不一样的,这样才能通过循环来得到我们需要的列表数据。

3.2 凭证保存接口

  /// <summary>

       /// 批量保存单据实体

       /// </summary>

       /// <param name="typeId"></param>

       /// <param name="models"></param>

       /// <returns></returns>

       public string BatchSave(string typeId, List<object> models)

       {

           this.Login();

           var client = APIClient.CreateAPIOperation<BatchSave>(_Config.URL);

           client.SetObjectTypeId(typeId);

           client.Models = models;

           return client.ToAPIRequest<KdAPIRequest>().Execute<string>();

       }

凭证批量保存接口,所以当我们在外部构造好凭证实体后,就可直接通过该接口来处理凭证的保存工作。凭证保存实体如下CloudSaveVoucherModel

publicclass CloudSaveVoucherModel

    {

        publicstringFVoucherID {get;set; }

        publicFVoucherNumber FAccountBookID {get;set; }

        publicstringFDate {get;set; }

        publicFVoucherNumber FVoucherGroupID {get;set; }

        publicstringFVoucherGroupNo {get;set; }

        publicstringFIsAdjustVoucher {get;set; }

        publicstringFDocumentStatus {get;set; }

        publicstringFYear {get;set; }

        publicFVoucherNumber FSourceBillKey {get;set; }

        publicstringFPeriod {get;set; }

        publicstringFImportVersion {get;set; }

        publicFentity[] FEntity {get;set; }

    }

    publicclass FVoucherNumber

    {

        publicstringFNumber {get;set; }

    }

    publicclass Fentity

    {

        publicstringFEntryID {get;set; }

        publicstringFExplanation {get;set; }

        publicFVoucherNumber FAccountID {get;set; }

        publicFdetailid FDetailID {get;set; }

        publicFVoucherNumber FCurrencyID {get;set; }

        publicFVoucherNumber FExchangerateType {get;set; }

        publicstringFExchangeRate {get;set; }

        publicFVoucherNumber FUnitId {get;set; }

        publicstringFPrice {get;set; }

        publicstringFQty {get;set; }

        publicdecimalFAmountFor {get;set; }

        publicdecimalFDebit {get;set; }

        publicdecimalFCredit {get;set; }

        publicFVoucherNumber FSettleTypeID {get;set; }

        publicstringFSettleNo {get;set; }

        publicstringFExportentryID {get;set; }

    }

    publicclass Fdetailid

    {

        ///<summary>/// 费用项目

        ///</summary>publicFVoucherNumber FDetailID__Fflex9 {get;set; }

        ///<summary>/// 供应商

        ///</summary>publicFVoucherNumber FDetailID__Fflex4 {get;set; }

        publicFVoucherNumber FDetailID__Fflex5 {get;set; }

        ///<summary>/// 客户

        ///</summary>publicFVoucherNumber FDetailID__Fflex6 {get;set; }

        ///<summary>/// 员工

        ///</summary>publicFVoucherNumber FDetailID__Fflex7 {get;set; }

        ///<summary>/// 物料

        ///</summary>publicFVoucherNumber FDetailID__Fflex8 {get;set; }

        ///<summary>/// 资产类别

        ///</summary>publicFVoucherNumber FDetailID__Fflex10 {get;set; }

        ///<summary>/// 组织机构

        ///</summary>publicFVoucherNumber FDetailID__Fflex11 {get;set; }

        ///<summary>/// 物料分组

        ///</summary>publicFVoucherNumber FDETAILID__FF100005 {get;set; }

        publicFVoucherNumber FDetailID__Fflex12 {get;set; }

        publicFVoucherNumber FDetailID__Fflex13 {get;set; }

    }

通过前面的BatchSave类,我们可以看到有个属性叫做NeedReturnFieldKeys -- 意为需要返回的字段,等于是在执行成功保存操作后,金蝶可以直接将我们需要返回的字段返回回来,传递形式还是和查询的FieldsKey格式一样,但是在实际的开发过程中我发现其实即便你传了NeedReturnFieldKeys,但是在返回值中并没有正常返回。我曾经在论坛里找个该问题,发现有小伙伴也遇到同样的问题。但是都没有得到解决,因为我在实际的逻辑中还需要得到类似总金额,凭证日期,凭证号等字段,所以没办法只能通过查询接口再执行一次查询操作了,当然不涉及后续的业务处理的话,可以不用执行该步骤的。

ps:当你执行批量保存操作时,如果一次操作的JSon数据量过大时,接口提示操作超时,所以在实际开发中建议可以分批次进行保存操作。

四.结语

相对来说,K3Cloud的接口文档还是比较全面的,所以当时在实际开发的时候,并没有遇到很多坑,只是在API封装的过程中,如上述说到的.netCore环境不支持的情况,这样的话通过反编译来处理问题也是一个不错的办法。后续我们还会在处理用友的一个产品时同样使用反编译来处理问题。

以上就是自己在实际生产过程中处理K3CloudAPI接口时的一些想法和思路。比如金蝶社区,论坛是不错的选择。同样QQ群也是一个沟通交流的途径。比如上面说到的批量保存时JSon串过大导致接口操作超时的问题,就是通过群里一个小伙伴的提醒,改变了思路通过分批传递的方法来解决问题的。我想说的是在开发过程中我们会遇到各种各样的问题,但是通过解决这些问题我们就能得到锻炼和成长,这就是我们的财富。说实话在之前我从没接触过这些知识点和业务范围,但是这不是也是一种成长的方式嘛。希望可以给在开发对接此产品的小伙伴一点帮助,一点支持就够了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容