
# 1 产品概述
## 1.1 产品介绍
基础配置中心微服务引入引出功能是专门给二次开发者提供基于微服务场景的引入引出的二开拓展能力。
## 1.2 业务场景
针对一些特殊的配置项,无法直接通过使用基础配置中心标准的EXCEL引入引出以及JSON引入引出,同时由于插件引入引出在分应用的情况下支持不友好等问题时,既可以使用微服务引入引出。
## 1.3 系统路径
V6.0.1以下版本:【基础服务云】→【实施配置中心】→【基础配置中心列表】新增基础配置项
V6.0.1及以上版本:【实施服务云】→【实施配置中心】→【基础配置中心列表】新增基础配置项
## 1.4 关键字段/按钮说明
**关键字段说明**
|字段名称|详细解释|
|-|-|
|业务云|微服务应用所在云|
|业务应用|微服务所在应用|
|服务名称|微服务任务名称,通常都是您注册在微服务工程类(ServiceFactory)的名称|
|分批数量|针对大数据量可进行分批处理,大数据量如果不进行分批,可能导致微服务请求超时,影响正常业务,可根据业务引入引出耗时来控制每次处理的数据量。如没有配置,默认1000条数据一批进行处理。|
|文件传输类型|支持苍穹标准的临时文件以及byte数组,具体案例可参考下面的开发案例|
# 2 主要操作
## 2.1 主要操作1
基于实际业务开发微服务接口。
**微服务开发规范:** 可参考[微服务开发及调用规范](https://vip.kingdee.com/knowledge/specialDetail/218022218066869248?category=249111205459980800&id=241157540979680000&productLineId=29)
### 2.1.1 实施配置中心微服务规范
微服务引出必须实现**exportPacket(Map<String, Object> map)**方法。
**map传入参数**
|参数名|解析|
|-|-|
|entity_number|实体标识|
|entity_name|实体名称|
|params|该参数携带的是微服务配置时配置的参数信息|
|listSelectedRowList|页面勾选数据,类型为平台的ListSelectedRow类型,可获取内码、编码、名称|
|...|后续升级存在更多数据,也会在map中携带|
**map返回参数**
|参数名|解析|
|-|-|
|code|业务执行情况,0为数据引出成功,其他为失败|
|msg|出错信息,当code不为0时需要提供友好的错误信息给用户|
|export_url|当微服务的文件传输方式为通过苍穹临时文件传输时,需要返回该参数,本地文件转苍穹临时文件可参考示例代码里面的getTempUrlFormLocalFile()方法实现|
|byte_arr|当微服务的文件传输方式为通过byte数组传输时,需要返回该参数,本地文件转byte数组可参考示例代码实现|
|...|后续升级需要返回更多数据,也会在map中携带|
微服务引入必须要实现**importPacket(Map<String, Object> map)** 方法。
**map传入参数**
|参数名|解析|
|-|-|
|entity_number|实体标识|
|entity_name|实体名称|
|params|该参数携带的是微服务配置是配置的参数信息|
|import_url|当微服务的文件传输方式为通过苍穹临时文件传输时,微服务引入时会传入该参数,苍穹临时文件转本地文件可参考示例代码里面的getCacheContentFromTempUrl()方法实现|
|byte_arr|当微服务的文件传输方式为通过byte数组传输时,微服务引入时会传入该参数,得到该参数后,可以转为文件,byte数组转本地文件可参考示例代码|
|...|后续升级存在更多数据,也会在map中携带|
**map返回参数**
|参数名|解析|
|-|-|
|code|业务执行情况,0为数据引入成功,其他为失败|
|msg|出错信息,当code不为0时需要提供友好的错误信息给用户|
|...|后续升级需要返回更多数据,也会在map中携带|
开发示例:
```java
package kd.bamp.ricc.dynamic.plugin.list;
import kd.bos.cache.CacheFactory;
import kd.bos.cache.TempFileCache;
import kd.bos.cache.tempfile.TempFileCacheDownloadable;
import kd.bos.db.DB;
import kd.bos.entity.datamodel.ListSelectedRow;
import kd.bos.exception.KDBizException;
import kd.bos.url.UrlService;
import kd.sys.ricc.common.util.StringUtils;
import kd.sys.ricc.exception.RiccBizException;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataPacketServiceImpl {
/**
* 微服务引出的方法
* @param map
* @return
*/
public Map<String, Object> exportPacket(Map<String, Object> map) {
//实体标识
String entityNumber = (String) map.get("entity_number");
//实体名称
String entityName = (String) map.get("entity_name");
//传入的勾选数据
List<ListSelectedRow> listSelectedRowList = (List<ListSelectedRow>) map.get("listSelectedRowList");
// begin 这里执行业务逻辑,得到引出文件
//###########业务逻辑###########
//###########业务逻辑###########
//###########业务逻辑###########
// end 这里执行业务逻辑,得到引出文件
//返回数据
Map<String, Object> returnMap = new HashMap<>();
//code ==0 为数据引出成功,其他为失败,失败的时候需要填写失败原因
returnMap.put("code", 0);
returnMap.put("msg", "如果引出失败。这里填写错误信息");
/**
* 方式一 临时文件
*/
//##### begin 文件传输方式为临时文件,您需要的处理逻辑,必须返回临时文件url即:export_url
String filePath = generateLocalPath();
String tempUrl = getTempUrlFormLocalFile(filePath, 0);
returnMap.put("export_url", tempUrl);
//##### end 文件传输方式为临时文件,您需要的处理逻辑
/**
* 方式二 byte数组
*/
//##### begin 文件传输方式为byte数组时,您需要的处理逻辑,必须返回临时byte数组即:byte_arr
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
FileInputStream fileInputStream = new FileInputStream(filePath);
inputStreamToOutpurStream(fileInputStream, byteArrayOutputStream);
//必须返回的byte_arr 参数
returnMap.put("byte_arr", byteArrayOutputStream.toByteArray());
fileInputStream.close();
byteArrayOutputStream.close();
} catch (IOException e) {
}
//##### begin 文件传输方式为byte数组时,您需要的处理逻辑,必须返回临时byte数组即:byte_arr
//返回的文件名称,可以随意,可返回可不返回
returnMap.put("file_name", "test.json");
return returnMap;
}
/**
* 微服务引入的方法
* @param map
* @return
*/
public Map<String, Object> importPacket(Map<String, Object> map) {
Map<String, Object> returnMap = new HashMap<>();
try {
/**
* 方式一 临时文件
*/
//###### begin 设置的文件处理方式为byte数组时,可以通过参数byte_arr,得到byte数组,转为文件#########
byte[] bytes = (byte[]) map.get("byte_arr");
try (InputStream in = new ByteArrayInputStream(bytes)) {
//业务处理文件引入系统
//业务处理文件引入系统
//业务处理文件引入系统
} catch (IOException e) {
}
//###### end 设置的文件处理方式为byte数组时,可以通过参数byte_arr,得到byte数组,转为文件#########
/**
* 方式二 byte数组
*/
//###### begin 设置的文件处理方式为临时文件时,可以通过参数import_url,得到临时文件地址,转为文件#########
String importUrl = (String) map.get("import_url");
TempFileCacheDownloadable.Content cacheContentFromTempUrl = getCacheContentFromTempUrl(importUrl);
try (InputStream in = cacheContentFromTempUrl.getInputStream()) {
//业务处理文件引入系统
//业务处理文件引入系统
//业务处理文件引入系统
} catch (IOException e) {
}
//###### end 设置的文件处理方式为临时文件时,可以通过参数import_url,得到临时文件地址,转为文件#########
}catch (Exception e){}