705 lines
17 KiB
JavaScript
705 lines
17 KiB
JavaScript
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)
|
|
}
|
|
})
|
|
})
|
|
}
|