本文介绍了通过自定义服务在云苍穹平台中删除单据体数据的详细步骤。包括编写Java插件以继承IBillWebApiPlugin接口,实现单据体数据的删除逻辑;注册自定义服务并配置调用URL;通过HTTP接口调用自定义服务执行删除操作。最终效果是单据列表中的一行单据体数据被成功删除。
如果文章对您有帮助,请为我点击一个朴实无华的赞^_^
需求场景:
操作服务的删除功能比较简单,需要更加灵活地删除单据体的数据,所以使用自定义服务,删除过程完全由开发者控制。
开发者通过http接口调用云苍穹的OpenApi,删除单据中的单据体的一行。
实现步骤:
1. 注册第三方应用,在开放平台下找到第三方应用,新增第三方应用信息,填写系统编码和系统密码等信息。
2. 获取appToken,根据第三方应用信息获取appToken。
3. 获取accessToken信息,用appToken和用户信息,从api/login.do中获取accessToken。
4. 编写java代码插件,定义好返回的数据。
5. 注册自定义服务,配置好调用调用的url、注册java插件。
6. 调用自定义服务,携带accessToken调用自定义服务,这时会调用到java插件,执行插件中对单据体数据的删除。
实现步骤详情:
文本省略前几个步骤,直接从实现自定义服务插件开始。
有关如何使用第三方应用、获取appToken、获取accessToken,请参考我的另一篇文章:
https://club.kdcloud.com/article/154241666411380736
准备工作
准备一个单据,为接下来的操作提供数据:
1.编写插件代码
继承IBillWebApiPlugin,对单据体的数据进行删除,删除单据体行的操作需要经过3步,
(1)取出单据数据
(2)把单据的单据体删除一行
(3)重新存入单据数据
代码如下:
package kd.ecos.demo; import kd.bos.bill.IBillWebApiPlugin; import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.api.ApiResult; import kd.bos.entity.operate.result.OperationResult; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import java.util.*; public class DemoTextileApiPlugin implements IBillWebApiPlugin { @Override public ApiResult doCustomService(Map<String, Object> params) { // 获取参数 String formNumber = params.get("formNumber").toString(); String formNo = params.get("billno").toString(); String entryNo = params.get("entitybillno").toString(); // 查询单据和单据体,获取时要使用BusinessDataServiceHelper来获取 DynamicObject[] dynamicObjects = BusinessDataServiceHelper.load(formNumber, "billno, kdec_textile_name, kdec_textile_entity.kdec_entitybillno", new QFilter("billno", QFilter.equals, formNo).toArray()); // 遍历entryNo对应的单据体 if (dynamicObjects[0].get("kdec_textile_entity") instanceof DynamicObjectCollection) { // 由于单据编码是不重复的,所以dynamicObjects数组只有一个数据,取下标0 DynamicObjectCollection collection = (DynamicObjectCollection)dynamicObjects[0].get("kdec_textile_entity"); Iterator<DynamicObject> iterator = collection.iterator(); while (iterator.hasNext()) { DynamicObject dynamicObject = iterator.next(); if (entryNo.equals(dynamicObject.get("kdec_entitybillno"))) { // 删除单据体的一行数据 iterator.remove(); } } } // 把删除之后的单据体数据,执行更新操作 OperationResult result = SaveServiceHelper.saveOperate(formNumber, dynamicObjects, OperateOption.create()); return ApiResult.success(result.isSuccess()); } }
2.新增自定义服务,注册插件
3.调用自定义服务
PostMan调用自定义服务
效果:
刷新单据列表,发现单据体已经被删除了一行:
推荐阅读