开放平台,API服务,自定义服务,删除单据体数据原创
金蝶云社区-吴锐雄
吴锐雄
8人赞赏了该文章 3840次浏览 未经作者许可,禁止转载编辑于2021年05月21日 20:32:51

如果文章对您有帮助,请为我点击一个朴实无华的赞^_^


需求场景:

操作服务的删除功能比较简单,需要更加灵活地删除单据体的数据,所以使用自定义服务,删除过程完全由开发者控制。

开发者通过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


准备工作

准备一个单据,为接下来的操作提供数据:

image.png

image.png

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.新增自定义服务,注册插件

image.png

image.png


3.调用自定义服务

PostMan调用自定义服务

image.png

image.png


效果:

刷新单据列表,发现单据体已经被删除了一行:

image.png

image.png




赞 8