chore: initial import
This commit is contained in:
704
api/index.js
Normal file
704
api/index.js
Normal file
@@ -0,0 +1,704 @@
|
||||
import { API_BASE_URL, request } from '../utils/request'
|
||||
import { getCurrentLanguage, getLocaleShort } from '@/utils/i18n'
|
||||
|
||||
function resolveLanguageHeader(language) {
|
||||
return getLocaleShort(language || getCurrentLanguage())
|
||||
}
|
||||
|
||||
function resolveIotApiBaseUrl() {
|
||||
const normalizedBaseUrl = String(API_BASE_URL || '').trim()
|
||||
if (!normalizedBaseUrl) {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (normalizedBaseUrl.includes('/admin/')) {
|
||||
return normalizedBaseUrl.replace('/admin/', '/iot/')
|
||||
}
|
||||
|
||||
if (/\/admin$/i.test(normalizedBaseUrl)) {
|
||||
return normalizedBaseUrl.replace(/\/admin$/i, '/iot')
|
||||
}
|
||||
|
||||
return normalizedBaseUrl.replace(/\/$/, '') + '/iot'
|
||||
}
|
||||
|
||||
function buildIotGatewayUrl(path = '') {
|
||||
const iotBaseUrl = resolveIotApiBaseUrl()
|
||||
const normalizedPath = String(path || '').startsWith('/')
|
||||
? String(path || '')
|
||||
: `/${String(path || '')}`
|
||||
return `${iotBaseUrl}${normalizedPath}`
|
||||
}
|
||||
|
||||
function normalizeUploadResponse(data) {
|
||||
if (typeof data !== 'string') {
|
||||
return Promise.resolve(data)
|
||||
}
|
||||
|
||||
const trimmed = data.trim()
|
||||
const looksLikeJson = (
|
||||
(trimmed.startsWith('{') && trimmed.endsWith('}'))
|
||||
|| (trimmed.startsWith('[') && trimmed.endsWith(']'))
|
||||
)
|
||||
|
||||
if (!looksLikeJson) {
|
||||
return Promise.resolve(data)
|
||||
}
|
||||
|
||||
return Promise.resolve(trimmed)
|
||||
.then(JSON.parse)
|
||||
.catch(() => data)
|
||||
}
|
||||
|
||||
function normalizeRequestCacheValue(value) {
|
||||
if (Array.isArray(value)) {
|
||||
return value.map(item => normalizeRequestCacheValue(item))
|
||||
}
|
||||
if (value && typeof value === 'object') {
|
||||
return Object.keys(value).sort().reduce((result, key) => {
|
||||
result[key] = normalizeRequestCacheValue(value[key])
|
||||
return result
|
||||
}, {})
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
function buildRequestCacheKey(prefix, params = {}, language) {
|
||||
return `${prefix}:${language}:${JSON.stringify(normalizeRequestCacheValue(params || {}))}`
|
||||
}
|
||||
|
||||
const notificationPageRequestCache = new Map()
|
||||
const notificationPageResponseCache = new Map()
|
||||
const NOTIFICATION_PAGE_CACHE_TTL = 1200
|
||||
|
||||
function getNotificationPageCachedResponse(requestKey) {
|
||||
const cachedEntry = notificationPageResponseCache.get(requestKey)
|
||||
if (!cachedEntry) {
|
||||
return null
|
||||
}
|
||||
if (cachedEntry.expiresAt <= Date.now()) {
|
||||
notificationPageResponseCache.delete(requestKey)
|
||||
return null
|
||||
}
|
||||
return cachedEntry.response
|
||||
}
|
||||
|
||||
function clearNotificationPageCache() {
|
||||
notificationPageRequestCache.clear()
|
||||
notificationPageResponseCache.clear()
|
||||
}
|
||||
|
||||
// --- 字典与枚举 ---
|
||||
export function sysdictPage(params = {}, language) {
|
||||
return request({
|
||||
url: '/sysdict/page',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function getCountryList(language) {
|
||||
return request({
|
||||
url: '/sysdict/countries',
|
||||
method: 'GET',
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function getEnums(params = {}, language) {
|
||||
return request({
|
||||
url: '/enums',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- 用户与登录 ---
|
||||
export function usersLogin(data = {}, language) {
|
||||
return request({
|
||||
url: '/user/login',
|
||||
method: 'POST',
|
||||
data,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function userMe(params = {}, language) {
|
||||
return request({
|
||||
url: '/user/me',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- 注册与申请 ---
|
||||
export function submitRegistrationApplication(data = {}, language) {
|
||||
return request({
|
||||
url: '/applicationform/registration/submit',
|
||||
method: 'POST',
|
||||
data,
|
||||
header: {
|
||||
'Content-Type': 'application/json-patch+json',
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function submitApplicationForm(data = {}, language) {
|
||||
return request({
|
||||
url: '/applicationform/submit',
|
||||
method: 'POST',
|
||||
data,
|
||||
header: {
|
||||
'Content-Type': 'application/json-patch+json',
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function registrationApplicationMePage(params = {}, language) {
|
||||
return request({
|
||||
url: '/applicationform/registration/me/page',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function registrationMyorder(params = {}, language) {
|
||||
return request({
|
||||
url: '/applicationform/registration/myorder',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function applicationFormMePage(params = {}, language) {
|
||||
return request({
|
||||
url: '/applicationform/me/page',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- 订单与入住 ---
|
||||
export function orderSearchedHistoryPage(params = {}, language) {
|
||||
return request({
|
||||
url: '/order/searched/history/page',
|
||||
method: 'GET',
|
||||
params: params || {},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function orderSearchedMePage(params = {}, language) {
|
||||
return request({
|
||||
url: '/order/searched/me/page',
|
||||
method: 'GET',
|
||||
params: params || {},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function orderSearchedMeHistoryPage(params = {}, language) {
|
||||
return request({
|
||||
url: '/order/searched/me/history/page',
|
||||
method: 'GET',
|
||||
params: params || {},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function orderSearchedDetail(orderNo = '', language) {
|
||||
return request({
|
||||
url: `/order/searched/detail/${encodeURIComponent(orderNo || '')}`,
|
||||
method: 'GET',
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function orderSearchedCheckInPage(params = {}, language) {
|
||||
return request({
|
||||
url: '/order/searched/checkin/page',
|
||||
method: 'GET',
|
||||
params: params || {},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function orderSearchedReservationPage(params = {}, language) {
|
||||
return request({
|
||||
url: '/order/searched/reservation/page',
|
||||
method: 'GET',
|
||||
params: params || {},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function checkRecordByChecked(params = {}, language) {
|
||||
const query = params || {}
|
||||
const orderNo = String(query.orderNo || '').trim()
|
||||
if (!orderNo) {
|
||||
return Promise.resolve([])
|
||||
}
|
||||
|
||||
return request({
|
||||
url: '/checkrecord/by-checked',
|
||||
method: 'GET',
|
||||
params: {
|
||||
...query,
|
||||
orderNo
|
||||
},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function accountQueryBills(params = {}, language) {
|
||||
const query = params || {}
|
||||
return request({
|
||||
url: '/accountquery/bills',
|
||||
method: 'GET',
|
||||
params: query,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function paymentBillPay(data = {}, language) {
|
||||
const payload = data || {}
|
||||
return request({
|
||||
url: '/payment/bill-pay',
|
||||
method: 'POST',
|
||||
data: payload,
|
||||
header: {
|
||||
'Content-Type': 'application/json-patch+json',
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function paymentPayingBills(params = {}, language) {
|
||||
const query = params || {}
|
||||
const BillNo = String(query.BillNo || query.billNo || '').trim()
|
||||
if (!BillNo) {
|
||||
return Promise.reject(new Error('账单号不能为空'))
|
||||
}
|
||||
return request({
|
||||
url: '/payment/paying-bills',
|
||||
method: 'GET',
|
||||
params: {
|
||||
BillNo
|
||||
},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function paymentStatusByBillNo(params = {}, language) {
|
||||
const query = params || {}
|
||||
const BillNo = String(query.BillNo || query.billNo || '').trim()
|
||||
if (!BillNo) {
|
||||
return Promise.reject(new Error('账单号不能为空'))
|
||||
}
|
||||
return request({
|
||||
url: '/payment/status-by-billno',
|
||||
method: 'GET',
|
||||
params: {
|
||||
BillNo
|
||||
},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function userDetailCancel(data = {}, language) {
|
||||
const payload = data || {}
|
||||
return request({
|
||||
url: '/ApplicationForm/user/detail/cancel',
|
||||
method: 'POST',
|
||||
data: payload,
|
||||
header: {
|
||||
'Content-Type': 'application/json-patch+json',
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- 合同 ---
|
||||
export function getMyPendingSignContracts(params = {}, language) {
|
||||
return request({
|
||||
url: '/contract/my/pending-sign',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function getMyEffectiveContracts(params = {}, language) {
|
||||
return request({
|
||||
url: '/contract/my/effective',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function contractPreview(data = {}, language) {
|
||||
return request({
|
||||
url: '/contract/preview',
|
||||
method: 'POST',
|
||||
data,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function contractSign(data = {}, language) {
|
||||
return request({
|
||||
url: '/contract/sign',
|
||||
method: 'POST',
|
||||
data,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- 消息通知 ---
|
||||
export function notificationPage(params = {}, language) {
|
||||
const query = params || {}
|
||||
const requestKey = buildRequestCacheKey('notificationPage', query, language)
|
||||
|
||||
if (notificationPageRequestCache.has(requestKey)) {
|
||||
return notificationPageRequestCache.get(requestKey)
|
||||
}
|
||||
|
||||
const cachedResponse = getNotificationPageCachedResponse(requestKey)
|
||||
if (cachedResponse) {
|
||||
return Promise.resolve(cachedResponse)
|
||||
}
|
||||
|
||||
const requestPromise = request({
|
||||
url: '/notification/page',
|
||||
method: 'GET',
|
||||
params: query,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
|
||||
const managedRequestPromise = requestPromise.then((response) => {
|
||||
notificationPageResponseCache.set(requestKey, {
|
||||
response,
|
||||
expiresAt: Date.now() + NOTIFICATION_PAGE_CACHE_TTL
|
||||
})
|
||||
return response
|
||||
})
|
||||
|
||||
notificationPageRequestCache.set(requestKey, managedRequestPromise)
|
||||
|
||||
return managedRequestPromise.finally(() => {
|
||||
if (notificationPageRequestCache.get(requestKey) === managedRequestPromise) {
|
||||
notificationPageRequestCache.delete(requestKey)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function notificationRead(code, language) {
|
||||
return request({
|
||||
url: `/notification/read/${code}`,
|
||||
method: 'POST',
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
}).finally(() => {
|
||||
clearNotificationPageCache()
|
||||
})
|
||||
}
|
||||
|
||||
// --- 房源与区域 ---
|
||||
export function areaPagination(params = {}, language) {
|
||||
return request({
|
||||
url: '/index/pagination',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
},
|
||||
withAuth: false
|
||||
})
|
||||
}
|
||||
|
||||
export function facilityManagers(params = {}, language) {
|
||||
return request({
|
||||
url: '/facility/managers',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
},
|
||||
withAuth: false
|
||||
})
|
||||
}
|
||||
|
||||
export function roomtypeList(params = {}, language) {
|
||||
return request({
|
||||
url: '/roomtype/list',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
},
|
||||
withAuth: false
|
||||
})
|
||||
}
|
||||
|
||||
export function roomTypeDetail(params = {}, language) {
|
||||
return request({
|
||||
url: '/roomtype/detail',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function roomPagination(params = {}, language) {
|
||||
return request({
|
||||
url: '/room/pagination',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
},
|
||||
withAuth: false
|
||||
})
|
||||
}
|
||||
|
||||
export function roomDetail(params = {}, language) {
|
||||
return request({
|
||||
url: '/room/detail',
|
||||
method: 'GET',
|
||||
params,
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
},
|
||||
withAuth: false
|
||||
})
|
||||
}
|
||||
|
||||
// --- 智能设备 ---
|
||||
export function gatewayRoomDeviceList(brandId = '', roomCode = '', language) {
|
||||
const resolvedBrandId = String(brandId || '').trim()
|
||||
const resolvedRoomCode = String(roomCode || '').trim()
|
||||
|
||||
if (!resolvedBrandId) {
|
||||
return Promise.reject(new Error('brandId 不能为空'))
|
||||
}
|
||||
|
||||
if (!resolvedRoomCode) {
|
||||
return Promise.reject(new Error('roomCode 不能为空'))
|
||||
}
|
||||
|
||||
return request({
|
||||
url: buildIotGatewayUrl(`/gateway/${encodeURIComponent(resolvedBrandId)}/rooms/${encodeURIComponent(resolvedRoomCode)}`),
|
||||
method: 'POST',
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function stringifyGatewayExecuteValue(value = '') {
|
||||
if (value === undefined || value === null) {
|
||||
return ''
|
||||
}
|
||||
if (typeof value === 'object') {
|
||||
try {
|
||||
return JSON.stringify(value)
|
||||
} catch (error) {
|
||||
return String(value)
|
||||
}
|
||||
}
|
||||
return String(value)
|
||||
}
|
||||
|
||||
function buildGatewayExecuteValues(data = {}) {
|
||||
if (data === undefined || data === null) {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (typeof data !== 'object' || Array.isArray(data)) {
|
||||
return stringifyGatewayExecuteValue(data)
|
||||
}
|
||||
|
||||
const keys = Object.keys(data)
|
||||
if (!keys.length) {
|
||||
return ''
|
||||
}
|
||||
|
||||
if (keys.length === 1) {
|
||||
return stringifyGatewayExecuteValue(data[keys[0]])
|
||||
}
|
||||
|
||||
if (Object.prototype.hasOwnProperty.call(data, 'value')) {
|
||||
return stringifyGatewayExecuteValue(data.value)
|
||||
}
|
||||
|
||||
if (Object.prototype.hasOwnProperty.call(data, 'command')) {
|
||||
return stringifyGatewayExecuteValue(data.command)
|
||||
}
|
||||
|
||||
if (Object.prototype.hasOwnProperty.call(data, 'action')) {
|
||||
return stringifyGatewayExecuteValue(data.action)
|
||||
}
|
||||
|
||||
return stringifyGatewayExecuteValue(data)
|
||||
}
|
||||
|
||||
export function gatewayExecuteDeviceCommand(brandId = '', deviceNo = '', functionCode = '', data = {}, language) {
|
||||
const resolvedBrandId = String(brandId || '').trim()
|
||||
const resolvedDeviceNo = String(deviceNo || '').trim()
|
||||
const resolvedFunctionCode = String(functionCode || '').trim()
|
||||
|
||||
if (!resolvedBrandId) {
|
||||
return Promise.reject(new Error('brandId 不能为空'))
|
||||
}
|
||||
|
||||
if (!resolvedDeviceNo) {
|
||||
return Promise.reject(new Error('deviceNo 不能为空'))
|
||||
}
|
||||
|
||||
if (!resolvedFunctionCode) {
|
||||
return Promise.reject(new Error('functionCode 不能为空'))
|
||||
}
|
||||
|
||||
return request({
|
||||
url: buildIotGatewayUrl(`/gateway/${encodeURIComponent(resolvedBrandId)}/execute`),
|
||||
method: 'POST',
|
||||
data: {
|
||||
deviceNo: resolvedDeviceNo,
|
||||
cmd: resolvedFunctionCode,
|
||||
values: buildGatewayExecuteValues(data)
|
||||
},
|
||||
header: {
|
||||
'Content-Type': 'application/json-patch+json',
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function gatewaySyncDeviceInfo(brandId = '', deviceNo = '', language) {
|
||||
const resolvedBrandId = String(brandId || '').trim()
|
||||
const resolvedDeviceNo = String(deviceNo || '').trim()
|
||||
|
||||
if (!resolvedBrandId) {
|
||||
return Promise.reject(new Error('brandId 不能为空'))
|
||||
}
|
||||
|
||||
if (!resolvedDeviceNo) {
|
||||
return Promise.reject(new Error('deviceNo 不能为空'))
|
||||
}
|
||||
|
||||
return request({
|
||||
url: buildIotGatewayUrl(`/gateway/${encodeURIComponent(resolvedBrandId)}/devices/${encodeURIComponent(resolvedDeviceNo)}`),
|
||||
method: 'POST',
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- 内容 ---
|
||||
export function bannerAll(language) {
|
||||
return request({
|
||||
url: '/content/banner/all',
|
||||
method: 'GET',
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(language)
|
||||
},
|
||||
withAuth: false
|
||||
})
|
||||
}
|
||||
|
||||
// --- 上传 ---
|
||||
export function uploadCommonFile(filePath, formData = {}, name = 'file', header = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.uploadFile({
|
||||
url: `${API_BASE_URL}/file/common/upload`,
|
||||
filePath,
|
||||
name,
|
||||
formData: {
|
||||
...(formData || {}),
|
||||
ProviderType: 'WechatMiniProgram'
|
||||
},
|
||||
header: {
|
||||
'X-Requested-Language': resolveLanguageHeader(),
|
||||
...header
|
||||
},
|
||||
success: (res) => {
|
||||
const { statusCode, data } = res
|
||||
|
||||
normalizeUploadResponse(data)
|
||||
.then(parsedData => {
|
||||
if (statusCode >= 200 && statusCode < 300) {
|
||||
resolve(parsedData)
|
||||
return
|
||||
}
|
||||
|
||||
reject(parsedData || res)
|
||||
})
|
||||
.catch(() => {
|
||||
reject(res)
|
||||
})
|
||||
},
|
||||
fail: (error) => {
|
||||
reject(error)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user