在与异构系统进行数据对接的时候,同步到金蝶云星空,或者从星空上查询相关资料到其他的系统的时候,不得不说的是webapi带来的奇怪问题。社区已经存在大量的关于webapi的同步指导文档,那我们怎么从文档中高效的查出问题,解决他,而不是苦苦等待KSM的提单系统。
一、webapi的基本指南
WebAPI的工作原理通俗来说,就是模拟录单的过程,根据传入的Json数据包构造的每个字段值,按顺序逐一模拟录单填充(录入)对应字段的值,触发此字段的相关值更新事件、实体服务和插件逻辑。构造完成整个单据的数据包之后,调用Save保存接口(Submit提交、Audit接口),并对应触发保存(提交、审核)的操作校验、操作逻辑、操作单据插件逻辑等整个过程。
模拟录单
在业务员操作录单的时候,我们经常会存在值更新、实体服务规则、代码值更新等影响,导致一个值的变动,其他值也会随着变动。比如,我们在采购订单上录入物料的时候,录入供应商,会根据供应商的价目表等信息,清空已经填写分录行的价格等信息。
顺序
既然录单的顺序已经规定了,那么录入顺序也需要按照系统字段列表属性顺序,从前往后,否则就存在一定的相互覆盖值的情况。
二、问题清单
网控冲突
我们在操作单据保存的时候,如果这个时候有业务员在进行业务操作,或者历史存在的业务员打开单据,导致网控没有合理清除。这个时候我们需要参数IsUserModelInit,具体示例如下:
client.Save("BD_PURCLAUSE","{"NeedUpDateFields":[],"NeedReturnFields":[],"IsDeleteEntry":"true","SubSystemId":"","IsVerifyBaseDataField":"false","IsEntryBatchFill":"true","ValidateFlag":"true","NumberSearch":"true","InterationFlags":"","IsUserModelInit":true,"Model":{"FCLAUSEID":0,"FNumber":"","FCreateOrgId":{"FNumber":""},"FUseOrgId":{"FNumber":""},"FClauseTypeId":"","FDocumentStatus":"","FName":"","FDescription":"","FClauseContent":""}}");
2. 保存失败? 值无法保存进入
保存的时候,明明单据填写了对应的值,但是仍然提示保存失败、字段必录等信息。其实这个如基本指南,整个操作是模拟录单的过程,需要有一定的顺序。那么我们怎么来确定这个顺序呢?
2.1 顺序确定
下面以采购订单为例,我们在打开对应单据的时候,BOSIDE最上方的编辑菜单-批量编辑字段属性栏,可以打开整个表单的实体。我们对每个实体都存在从上到下的顺序。
比如,我们在整个录单的时候,应当以表头字段为先,录入组织、供应商,表体字段应当以物料、单位、数量、单价、税率、折扣率等字段为基本顺序。
2.2 顺序对了,仍然出现不符合逻辑。
2.2.1 第一行有值,其他行无值。 有一些单的逻辑赋值顺序比较奇怪,比如货源清单、销售订单、采购订单的套件父项,影响物料的赋值。 这种情况的原因是:货源清单的“供应类别”字段会在代码赋值的时候影响物料的过滤,但是这个字段因为不是基础资料字段,无法批量填充。这个时候应当对传入参数 IsEntryBatchFill 设置为 false
2.2.2 变更单保存,修改被强制变更为新增。采购订单变更单、销售订单变更单这两张单据,因为BOS底层代码逻辑的调整,通版业务代码已经限定了,手工新增的分录行必定会成为新增,从而影响了引入、webapi的录单问题。这类问题目前只能通过补丁解决。
3. 提示错误,但没有错误信息。
由于WebAPI是服务端处理业务,无法支持交互弹出界面,那么我们应当怎么去确定问题呢?
3.1 分步保存法,IsAutoSubmitAndAudit:false
对IsAutoSubmitAndAudit参数设置为false后,我们分别调用保存、提交、审核,就可以看到错误内容,然后按照错误提示进行修正。
往往我们在审核的时候会存在系统控制的自动下推并保存下游单据,比如:采购入库单,审核后自动生成应付单,但是应付单的总金额又不允许为空,从而导致无法保存成功。
那么我们解决思路是:对下游入库单的总金额不设保存必录控制,或者执行分布调用。
3.2 交互标识设置InterationFlags
在JSON数据包的开头,我们添加如下标识,即可忽略掉提示性弹窗,从而保存通过。
client.Save("BD_PURCLAUSE","{"NeedUpDateFields":[],"NeedReturnFields":[],"IsDeleteEntry":"true","SubSystemId":"","IsVerifyBaseDataField":"false","IsEntryBatchFill":"true","ValidateFlag":"true","NumberSearch":"true", "InterationFlags":"STK_InvCheckResult","IsUserModelInit":true,"Model":{"FCLAUSEID":0,"FNumber":"","FCreateOrgId":{"FNumber":""},"FUseOrgId":{"FNumber":""},"FClauseTypeId":"","FDocumentStatus":"","FName":"","FDescription":"","FClauseContent":""}}");
4. 下推未关联
https://vip.kingdee.com/article/159052?channel_level=kdclub
4.1 无法建立关联
在按照帖子进行操作后,仍然无法进行保存建立关联,但是单据的内容已经成功录入可以检查JSON数据包的关联表部分。
如图,我们不但要确保“实体_LINK”表体实体标识填写正确,还要确保所有字段标识填写正确。必填字段是FRuleId ,FSTableName ,FSBillId ,FSId,FEntity_Link_FBaseQty。
其实我们调用保存接口去建立关联的时候,我们更希望的是关联多少数量,如果我们的业务是整单下推,直接调用PUSH 的接口,可以不用考虑这么多字段填写的问题。
所以在下推的时候,我们的关联数量要根据实际的单位换算数量进行填写FBaseQty,如果存在多行数量下推的时候,我们还应该填写FBaseOldQty。
4.2 保存关联单,提示无法保存
我们在保存采购订单变更单的时候,会提示源单编号没有办法录入。这是一些单在做关联校验的时候,通版业务代码处理了源单编号必录的情况,所以录入分录的时候,把对应的字段填写即可。
三、日志
如果仍然无法找到问题,https://vip.kingdee.com/article/8744 按照提示,开启日志吧,总能发现录单中无法解决的问题。
附上精华,K3Cloud WebAPI 接口说明书_V2.0,基本涵盖了所有Webapi对接中需要处理需求
https://vip.kingdee.com/questions/8874/answers/12403
WebApi 对接的疑难杂症.docx(503.30KB)