chore: initial import

This commit is contained in:
liangjian
2026-06-29 09:42:53 +08:00
commit 9fea127de1
241 changed files with 82767 additions and 0 deletions

704
api/index.js Normal file
View 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)
}
})
})
}