imobile_for_reactnative
Version:
iMobile for ReactNative,是SuperMap iMobile推出的一款基于React-Native框架的移动应用开发工具。基于该开发工具,用户可以使用JavaScript开发语言,开发出在Android和IOS操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。
668 lines (621 loc) • 20.3 kB
text/typescript
import { request } from '../utils'
import { NativeModules, NativeEventEmitter, EmitterSubscription } from 'react-native'
import * as URL from './url'
import {
HttpRequest,
UrlHeader,
ServiceRequestParams,
ServiceInfoParams,
ServiceData,
ServiceDatasource,
DataServiceResponse,
ServicePutResponse,
RecordInfo,
ResultDataBase,
ServiceInfo,
} from './types'
import { EventConst } from '../../constains/index'
import { QueryParamToStr, SetUrlParams } from './UrlUtils'
import { getServerUrl, getCookie } from './SOnline'
import { TOnlineDataType } from './types'
import { DatasetInfo } from '../data/SData'
import { SOnline } from '.'
const _SService = NativeModules.SService
const nativeEvt = new NativeEventEmitter(_SService)
const SIPortalService = NativeModules.SIPortalService
const SOnlineService = NativeModules.SOnlineService
export type CoordinationType = 'iportal' | 'online'
const HttpResponseException = {
succeed: false,
}
const ResultDataException = {
total: 0,
content: [],
}
/** 发布服务结果 */
export interface PushlishResult {
/** 是否发布成功 */
succeed: boolean,
/** 结果信息 */
customResult?: string,
/** 若失败,返回错误信息 */
error?: any,
}
/** 服务数据源查询结果 */
export interface ServiceDatasources {
/** 所含数据源名称的数组 */
datasourceNames: string[],
/** 所含数据源地址的数组 */
childUriList: string[],
/** 所含数据源个数 */
datasourceCount: number,
}
/**************************************************************数据服务API***************************************************************************/
/**
* 根据数据id发布服务
* @param id 数据id
* @param dataType 数据的类型
* @returns 返回发布服务结果
*/
export async function publishService(id: number, dataType: TOnlineDataType, serviceType?: string): Promise<PushlishResult> {
let type
if (serviceType) {
type = serviceType
} else if (dataType === 'UDB') {
type = 'RESTDATA'
} else if (dataType === 'WORKSPACE') {
type = 'RESTMAP,RESTDATA'
} else {
return { succeed: false }
}
let url = SetUrlParams(getServerUrl() + URL.PubllishService[0], [id, type])
let headers = {}
const cookie = await getCookie()
if (cookie) {
headers = {
cookie: cookie,
}
}
const result = await request(encodeURI(url), URL.PubllishService[1], {
headers: headers,
body: true,
})
return result
// const publishResults: PushlishResult[] = []
// if (result.succeed && result.customResult) {
// const dataServiceIds = result.customResult.split(',')
// for (const dataServiceId of dataServiceIds) {
// const publishResultUrl = SetUrlParams(getServerUrl() + URL.GetPubllishDataService[0], [id, dataServiceId])
// let publishResult
// let overTime = 0 // 防止发布服务获取结果超时,返回undefined
// while (!publishResult && overTime < 10) {
// publishResult = await request(encodeURI(publishResultUrl), URL.GetPubllishDataService[1], {
// headers: headers,
// // body: null,
// })
// overTime++
// }
// if (publishResult) {
// publishResult.customResult = dataServiceId
// } else if (overTime === 10) {
// publishResult = {
// succeed: false,
// error: 'timeout',
// }
// }
// publishResults.push(publishResult)
// }
// return publishResults
// } else {
// return [result]
// }
}
/**
* 根据数据id获取服务信息
* @param dataId 数据id
* @param dataServiceId 服务ID
* @returns 返回服务信息
*/
export async function getServiceDetail(dataId: number, dataServiceId: number): Promise<PushlishResult> {
let headers = {}
const cookie = await getCookie()
if (cookie) {
headers = {
cookie: cookie,
}
}
const publishResults: PushlishResult[] = []
const publishResultUrl = SetUrlParams(getServerUrl() + URL.GetPubllishDataService[0], [dataId, dataServiceId])
let publishResult
let overTime = 0 // 防止发布服务获取结果超时,返回undefined
while (!publishResult && overTime < 10) {
publishResult = await request(encodeURI(publishResultUrl), URL.GetPubllishDataService[1], {
headers: headers,
// body: null,
})
overTime++
}
if (publishResult) {
publishResult.customResult = dataServiceId
} else if (overTime === 10) {
publishResult = {
succeed: false,
error: 'timeout',
}
}
return publishResult
}
/**
* 取消发布服务
* @param serviceID 服务ID
* @returns 返回删除结果
*/
export async function unPublishService(serviceID: string): Promise<boolean> {
// let url = getServerUrl() + SetUrlParams(getServerUrl() + URL.DeleteService[0], [serviceID])
// let headers = {}
// const cookie = await getCookie()
// if (cookie) {
// headers = {
// cookie: cookie,
// }
// }
// url = encodeURI(url)
// const result = await request(encodeURI(url), URL.DeleteService[1], {
// headers: headers,
// })
// return result
const userType = SOnline._getUserType()
if (userType === 'common_user') {
return SOnlineService.deleteServiceWithServiceId(serviceID)
} else if (userType === 'iPortal_common_user') {
return SIPortalService.deleteMyService(serviceID)
}
return false
}
// /**
// * 取消发布服务
// * @param serviceID 数据文件名
// * @param name 服务名
// * @returns 返回取消发布结果
// */
// export async function unPublishService(serviceID: string, name: string): Promise<PushlishResult[]> {
// let url = getServerUrl() + SetUrlParams(getServerUrl() + URL.UnPubllishService[0], [serviceID, name])
// let headers = {}
// const cookie = await getCookie()
// if (cookie) {
// headers = {
// cookie: cookie,
// }
// }
// url = encodeURI(url)
// const result = await request(encodeURI(url), URL.UnPubllishService[1], {
// headers: headers,
// })
// return result
// }
/**
* 设置服务公开私有
* @param id 服务id
* @param isPublic 是否公开
* @returns 返回是否设置成功
*/
export async function setServicesShareConfig(id: string, isPublic: boolean): Promise<boolean> {
let url = getServerUrl() + URL.ShareService[0]
let headers = {}
const cookie = await getCookie()
if (cookie) {
headers = {
cookie: cookie,
}
}
let entities: any[]
if (isPublic) {
entities = [
{
entityType: 'USER',
entityName: 'GUEST',
permissionType: 'READ',
},
]
} else {
entities = []
}
url = encodeURI(url)
let result = await request(url, URL.ShareService[1], {
headers: headers,
body: {
ids: [id],
entities: entities,
},
})
return result.succeed
}
/**
* 根据查询条件,获取匹配的所有服务
* @param params 服务查询参数
* @returns 返回服务查询结果数组
*/
export async function getAllServices(params: ServiceRequestParams): Promise<ResultDataBase<ServiceInfo>[]> {
try {
const url = getServerUrl() + URL.GetAllService[0] + QueryParamToStr(params)
const headers: UrlHeader = {}
const cookie = await getCookie()
if (cookie) {
headers.cookie = cookie
}
return request(url, URL.GetAllService[1], {
headers: headers,
})
} catch (e) {
return []
}
}
/**
* 根据数据服务初始化数据源
* 传入数据服务,在工作空间中找到对应数据源,并把数据服务记录到对应数据集中
* @param serviceDatas 数据源 以及数据源中数据集对应的服务地址url的集合
* @returns 返回是否设置成功
*/
export async function initDatasourceWithService(serviceDatas: ServiceDatasource[]): Promise<boolean> {
try {
return await _SService.initDatasourceWithService(serviceDatas)
} catch (e) {
return false
}
}
/**
* 设置数据集关联的在线服务url,可把普通图层,设置为数据服务图层
* @param dataInfo 数据源和数据集名称
* @param serviceData 在线服务数据信息
* @returns 返回是否设置成功
*/
export async function setDataService(dataInfo: DatasetInfo, serviceData: ServiceData): Promise<boolean> {
try {
return await _SService.setDataService(dataInfo, serviceData)
} catch (e) {
return false
}
}
/**
* 查询服务
* @param params 查询服务条件
* @returns 返回符合条件的服务列表
*/
export async function getServices(params: ServiceRequestParams): Promise<ResultDataBase<ServiceInfo>[]> {
try {
const url = getServerUrl() + URL.GetAllService[0] + QueryParamToStr(params)
const headers: UrlHeader = {}
const cookie = await getCookie()
if (cookie) {
headers.cookie = cookie
}
return request(url, URL.GetAllService[1], {
headers: headers,
})
} catch (e) {
return []
}
}
/**
* 根据服务ID,查询指定服务
* @param serviceId 服务id
* @returns 返回指定服务
*/
export async function getService(serviceId: string): Promise<ResultDataBase<ServiceInfo> | null> {
try {
const url = SetUrlParams(getServerUrl() + URL.GetService[0], [serviceId])
const headers: UrlHeader = {}
const cookie = await getCookie()
if (cookie) {
headers.cookie = cookie
}
return request(url, URL.GetService[1], {
headers: headers,
})
} catch (e) {
return null
}
}
/**
* 查询我的服务
* @param params 服务查询参数
* @returns 返回服务查询结果数组
*/
export async function getMyServices(params: HttpRequest): Promise<ResultDataBase<ServiceInfo>[]> {
try {
const url = getServerUrl() + URL.GetUserService[0] + QueryParamToStr(params)
const headers: UrlHeader = {}
const cookie = await getCookie()
if (cookie) {
headers.cookie = cookie
}
return request(url, URL.GetUserService[1], {
headers: headers,
})
} catch (e) {
return []
}
}
/**
* 修改指定服务
* @param serviceId 服务ID
* @param params 要修改的服务内容
* @returns 返回服务修改结果
*/
export async function putService(serviceId: string, params: ServiceInfoParams): Promise<ServicePutResponse> {
try {
const url = SetUrlParams(getServerUrl() + URL.PutService[0], [serviceId])
params.authorizeSetting[0].permissionType = "READWRITE"
const headers: UrlHeader = {}
const cookie = await getCookie()
if (cookie) {
headers.cookie = cookie
}
return request(url, URL.PutService[1], {
headers: headers,
body: params,
})
} catch (e) {
return HttpResponseException
}
}
/**
* 获取服务中的数据源 或 数据源中的数据集,
* 若有datasourceName,则查询数据源中的数据集,
* 若没有datasourceName,则查询数据源。
* @param linkUrl 服务地址
* @param datasourceName 要查询的数据源名称(可选)
* @returns 返回数据源结果,若为null,则查询失败
*/
export async function getServiceData(linkUrl: string, datasourceName?: string): Promise<ServiceDatasources | null> {
try {
let url = linkUrl
if (datasourceName) {
url = url + '/data/datasources/' + datasourceName + '/datasets.json'
} else {
url = url + '/data/datasources.json'
}
const headers: UrlHeader = {}
const cookie = await getCookie()
if (cookie) {
headers.cookie = cookie
}
return request(url, 'GET', {
headers: headers,
})
} catch (e) {
return null
}
}
/**
* 向iServer服务器中添加对象。
* @param datasetUrl 指定的数据服务地址
* @param serviceName 服务名称
* @param dataSourceName 待添加对象数据源。
* @param dataSetName 待添加对象数据集。
* @param geoID 待添加对象。
* @returns 返回是否添加成功
*/
export async function addFeature(datasetUrl: string, serviceName: string, dataSourceName: string, dataSetName: string, geoID: number): Promise<boolean> {
try {
return await _SService.addFeature(datasetUrl, serviceName, dataSourceName, dataSetName, geoID)
} catch (e) {
return false
}
}
/**
* 向指定的数据服务地址添加对象。
* @param fullUrl 指定的数据服务地址,如:http://192.168.120.139:8090/iserver/services/data-China400/rest/data/datasources/China400/datasets/City_R。
* @param dataSourceName 待添加对象数据源。
* @param dataSetName 待添加对象数据集。
* @param geoID 待添加对象。
* @returns 返回是否添加成功
*/
export async function addFeatureFullUrl(fullUrl: string, dataSourceName: string, dataSetName: string, geoID: number): Promise<boolean> {
try {
return await _SService.addFeatureFullUrl(fullUrl, dataSourceName, dataSetName, geoID)
} catch (e) {
return false
}
}
/**
* 根据指定的对象ID数组删除iServer服务器中的对象。
* @param strUrl 数据服务地址。
* @param serviceName 服务名称。
* @param datasourceName 数据源名。
* @param datasetName 数据集名。
* @param featureIDs 对象ID数组。
* @returns 返回是否删除成功
*/
export async function deleteFeature(datasetUrl: string, serviceName: string, dataSourceName: string, dataSetName: string, featureIDs: number[]): Promise<boolean> {
try {
return await _SService.deleteFeature(datasetUrl, serviceName, dataSourceName, dataSetName, featureIDs)
} catch (e) {
return false
}
}
/**
* 指定数据服务地址下的对象。
* @param fullUrl 指定的数据服务地址,如:http://192.168.120.139:8090/iserver/services/data-China400/rest/data/datasources/China400/datasets/City_R。
* @param featureIDs 对象ID数组。
* @returns 返回是否删除成功
*/
export async function deleteFeatureFullUrl(fullUrl: string, featureIDs: number[]): Promise<boolean> {
try {
return await _SService.deleteFeatureFullUrl(fullUrl, featureIDs)
} catch (e) {
return false
}
}
/**
* 根据指定的对象ID数组删除iServer服务器中的对象。
* @param strUrl 数据服务地址。
* @param serviceName 服务名称。
* @param datasourceName 数据源名。
* @param datasetName 数据集名。
* @param featureID 要修改的对象ID。
* @returns 返回是否修改成功
*/
export async function modifyFeature(datasetUrl: string, serviceName: string, dataSourceName: string, dataSetName: string, featureID: number): Promise<boolean> {
try {
return await _SService.modifyFeature(datasetUrl, serviceName, dataSourceName, dataSetName, featureID)
} catch (e) {
return false
}
}
/**
* 向数据服务中添加数据集
* @param datasetUrl 数据服务地址。
* @param serviceName 服务名称。
* @param dataInfo 数据源数据集名称
* @param datasetType 数据集类型
* @returns
*/
export async function addDataset(datasetUrl: string, serviceName: string, dataInfo: DatasetInfo, datasetType: number): Promise<boolean> {
try {
return await _SService.addDataset(datasetUrl, serviceName, dataInfo.datasourceName, dataInfo.datasetName, datasetType)
} catch (e) {
return false
}
}
/**
* 通过复制指定数据源中的指定数据集向服务中添加数据集。
* @param strUrl 数据服务地址。
* @param serviceName 服务名称。
* @param desDataInfo 目标数据源数据集名称
* @param srcDataInfo 源数据源数据集名称
* @returns 返回是否添加成功
*/
export async function addDatasetWithDatasource(datasetUrl: string, serviceName: string, desDataInfo: DatasetInfo, srcDataInfo: DatasetInfo): Promise<boolean> {
try {
return await _SService.addDatasetWithDatasource(datasetUrl, serviceName, desDataInfo.datasourceName, desDataInfo.datasetName, srcDataInfo.datasourceName, srcDataInfo.datasetName)
} catch (e) {
return false
}
}
/**
* 删除数据集。
* @param strUrl 数据服务地址。
* @param serviceName 服务名称。
* @param dataInfo 数据源数据集名称
* @returns 返回是否删除成功
*/
export async function deleteDataset(datasetUrl: string, serviceName: string, dataInfo: DatasetInfo): Promise<boolean> {
try {
return await _SService.deleteDataset(datasetUrl, serviceName, dataInfo.datasourceName, dataInfo.datasetName)
} catch (e) {
return false
}
}
/**
* 删除数据集。
* @param fullUrl 要删除的数据集地址,,如:http://192.168.120.1:8090/iserver/services/data-world/rest/data/datasources/World/datasets/Lakes。
* @returns 返回是否删除成功
*/
export async function deleteDatasetFullUrl(fullUrl: string): Promise<boolean> {
try {
return await _SService.deleteDatasetFullUrl(fullUrl)
} catch (e) {
return false
}
}
/**
* 下载到本地
* @param datasetUrl 服务数据集地址
* @param dataSourceName 存入本地数据源名称
* @returns 返回是否调用成功
*/
export async function downloadToLocal(datasetUrl: string, dataSourceName: string): Promise<boolean> {
try {
return await _SService.downloadToLocal(datasetUrl, dataSourceName)
} catch (e) {
return false
}
}
/**
* 直接读取在线数据集
* @param datasetUrl 服务数据集地址
* @param fromIndex 读取数据集集合的起始点
* @param toIndex 读取数据集集合的结束点
* @returns 返回下载的recordset数据信息
*/
export async function downloadRecordset(datasetUrl: string, fromIndex: number, toIndex: number): Promise<RecordInfo[]> {
try {
return await _SService.downloadRecordset(datasetUrl, fromIndex, toIndex)
} catch (e) {
return []
}
}
/**
* 更新到本地
* @param datasetUrl 服务数据集地址
* @param dataInfo 数据源数据集名称
* @returns 返回是否调用成功
*/
export function updateToLocal(datasetUrl: string, dataInfo: DatasetInfo): Promise<boolean> {
return _SService.updateToLocal(datasetUrl, dataInfo.datasourceName, dataInfo.datasetName)
}
/**
* 上传到服务器
* @param datasetUrl 服务数据集地址
* @param dataInfo 数据源数据集名称
* @returns 返回是否调用成功
*/
export async function uploadToService(datasetUrl: string, dataInfo: DatasetInfo): Promise<boolean> {
try {
return await _SService.uploadToService(datasetUrl, dataInfo.datasourceName, dataInfo.datasetName)
} catch (e) {
return false
}
}
/** 数据服务下载监听 */
let dataServiceDownloadHandler: EmitterSubscription | null | undefined = null
/** 数据服务更新监听 */
let dataServiceUpdateHandler: EmitterSubscription | null | undefined = null
/** 数据服务上传监听 */
let dataServiceUploadHandler: EmitterSubscription | null | undefined = null
/**
* 设置数据服务监听
* @param handlers
*/
export async function addDataServiceListener(handlers: {
downloadHandler?: (result: DataServiceResponse) => void,
updateHandler?: (result: DataServiceResponse) => void,
uploadHandler?: (result: DataServiceResponse) => void,
}) {
try {
removeDataServiceListener()
dataServiceDownloadHandler = handlers?.downloadHandler && nativeEvt.addListener(EventConst.ONLINE_DATA_SERVICE_DOWNLOAD, result => {
if (typeof handlers.downloadHandler === "function") {
handlers.downloadHandler(result)
}
})
dataServiceUpdateHandler = handlers?.updateHandler && nativeEvt.addListener(EventConst.ONLINE_DATA_SERVICE_UPDATE, result => {
if (typeof handlers.updateHandler === "function") {
handlers.updateHandler(result)
}
})
dataServiceUploadHandler = handlers?.updateHandler && nativeEvt.addListener(EventConst.ONLINE_DATA_SERVICE_UPLOAD, result => {
if (typeof handlers.uploadHandler === "function") {
handlers.uploadHandler(result)
}
})
} catch (e) {
console.error(e)
}
}
/** 移除数据服务监听 */
function removeDataServiceListener() {
if (dataServiceDownloadHandler) {
dataServiceDownloadHandler.remove()
dataServiceDownloadHandler = null
}
if (dataServiceUpdateHandler) {
dataServiceUpdateHandler.remove()
dataServiceUpdateHandler = null
}
if (dataServiceUploadHandler) {
dataServiceUploadHandler.remove()
dataServiceUploadHandler = null
}
}