feat: 新增工单中心、房间巡查、失物招领等业务模块
- 新增工单中心(ticket_center)与工单工作台(ticket_workbench)页面 - 新增房间巡查(room_inspection)与失物招领发布(lost_found_publish)页面 - 预约看样流程新增房型/楼栋/楼层选择器组件 - 新增工具模块: booking-entry、privacy、reservation-flow - api/index.js 补充楼层列表、看样提交等接口 - locales/messages.js 补充多语言文案 - manifest.json 开启微信小程序隐私检查 - 完善登录、注册、申请详情、账单等相关页面交互
This commit is contained in:
@@ -2,15 +2,110 @@ import { getEnums } from '@/api/index.js'
|
||||
import { getCurrentLanguage } from '@/utils/i18n'
|
||||
|
||||
const ENUMS_CACHE_KEY = 'mini_enums_cache_v1'
|
||||
const BUILTIN_ENUMS = {
|
||||
zh: {
|
||||
IdCardTypeEnum: [
|
||||
{ key: 3, value: '港澳通行证', valueEn: 'Mainland Travel Permit for Hong Kong and Macao Residents' },
|
||||
{ key: 2, value: '护照', valueEn: 'Passport' },
|
||||
{ key: 99, value: '其他', valueEn: 'Other' },
|
||||
{ key: 1, value: '身份证', valueEn: 'ID Card' },
|
||||
{ key: 4, value: '台湾通行证', valueEn: 'Mainland Travel Permit for Taiwan Residents' }
|
||||
]
|
||||
},
|
||||
en: {
|
||||
IdCardTypeEnum: [
|
||||
{ key: 3, value: 'Mainland Travel Permit for Hong Kong and Macao Residents', valueZh: '港澳通行证' },
|
||||
{ key: 2, value: 'Passport', valueZh: '护照' },
|
||||
{ key: 99, value: 'Other', valueZh: '其他' },
|
||||
{ key: 1, value: 'ID Card', valueZh: '身份证' },
|
||||
{ key: 4, value: 'Mainland Travel Permit for Taiwan Residents', valueZh: '台湾通行证' }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
let enumsMap = {}
|
||||
let enumsLanguage = ''
|
||||
let fetchPromise = null
|
||||
|
||||
function hasRemoteEnumData(map = {}, language) {
|
||||
const currentLanguage = getNormalizedLanguage(language)
|
||||
const builtinKeys = Object.keys(BUILTIN_ENUMS[currentLanguage] || {})
|
||||
const sourceMap = map && typeof map === 'object' ? map : {}
|
||||
return Object.keys(sourceMap).some(code => !builtinKeys.includes(code))
|
||||
}
|
||||
|
||||
function mergeEnumOptionList(builtinList = [], customList = []) {
|
||||
const nextList = []
|
||||
const customMap = new Map()
|
||||
|
||||
;(Array.isArray(customList) ? customList : []).forEach((item) => {
|
||||
if (!item || typeof item !== 'object') return
|
||||
customMap.set(String(item.key), item)
|
||||
})
|
||||
|
||||
;(Array.isArray(builtinList) ? builtinList : []).forEach((item) => {
|
||||
const key = String(item && item.key)
|
||||
const customItem = customMap.get(key)
|
||||
if (customItem) {
|
||||
nextList.push({
|
||||
...item,
|
||||
...customItem
|
||||
})
|
||||
customMap.delete(key)
|
||||
return
|
||||
}
|
||||
nextList.push(item)
|
||||
})
|
||||
|
||||
customMap.forEach((item) => {
|
||||
nextList.push(item)
|
||||
})
|
||||
|
||||
return nextList
|
||||
}
|
||||
|
||||
function mergeBuiltinEnums(map = {}, language) {
|
||||
const currentLanguage = getNormalizedLanguage(language)
|
||||
const builtinMap = BUILTIN_ENUMS[currentLanguage] || {}
|
||||
const mergedMap = {
|
||||
...builtinMap,
|
||||
...(map || {})
|
||||
}
|
||||
|
||||
Object.keys(builtinMap).forEach((code) => {
|
||||
if (!Array.isArray(mergedMap[code])) {
|
||||
mergedMap[code] = builtinMap[code]
|
||||
return
|
||||
}
|
||||
mergedMap[code] = mergeEnumOptionList(builtinMap[code], mergedMap[code])
|
||||
})
|
||||
|
||||
return mergedMap
|
||||
}
|
||||
|
||||
function parseJsonStringMaybe(value) {
|
||||
if (typeof value !== 'string') {
|
||||
return value
|
||||
}
|
||||
const text = value.trim()
|
||||
if (!text) {
|
||||
return value
|
||||
}
|
||||
if (!((text.startsWith('{') && text.endsWith('}')) || (text.startsWith('[') && text.endsWith(']')))) {
|
||||
return value
|
||||
}
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch (error) {
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeEnumMap(data) {
|
||||
const normalizedData = parseJsonStringMaybe(data)
|
||||
const map = {}
|
||||
if (Array.isArray(data)) {
|
||||
data.forEach((item) => {
|
||||
if (Array.isArray(normalizedData)) {
|
||||
normalizedData.forEach((item) => {
|
||||
if (item && item.code) {
|
||||
map[item.code] = Array.isArray(item.data) ? item.data : []
|
||||
}
|
||||
@@ -76,26 +171,30 @@ function writeEnumsCache(map, language) {
|
||||
export function initEnumsFromCache(language) {
|
||||
const currentLanguage = getNormalizedLanguage(language)
|
||||
if (Object.keys(enumsMap).length && enumsLanguage === currentLanguage) return enumsMap
|
||||
enumsMap = readEnumsCache(currentLanguage)
|
||||
enumsMap = mergeBuiltinEnums(readEnumsCache(currentLanguage), currentLanguage)
|
||||
enumsLanguage = currentLanguage
|
||||
return enumsMap
|
||||
}
|
||||
|
||||
export async function fetchEnums(force = false, language) {
|
||||
const currentLanguage = getNormalizedLanguage(language)
|
||||
if (!force && Object.keys(enumsMap).length && enumsLanguage === currentLanguage) return enumsMap
|
||||
if (!force && Object.keys(enumsMap).length && enumsLanguage === currentLanguage && hasRemoteEnumData(enumsMap, currentLanguage)) {
|
||||
return enumsMap
|
||||
}
|
||||
if (fetchPromise) return fetchPromise
|
||||
|
||||
fetchPromise = (async () => {
|
||||
if (!force && (!Object.keys(enumsMap).length || enumsLanguage !== currentLanguage)) {
|
||||
initEnumsFromCache(currentLanguage)
|
||||
if (Object.keys(enumsMap).length) return enumsMap
|
||||
if (Object.keys(enumsMap).length && hasRemoteEnumData(enumsMap, currentLanguage)) {
|
||||
return enumsMap
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await getEnums({}, currentLanguage)
|
||||
const data = res && res.data ? res.data : res
|
||||
const map = normalizeEnumMap(data)
|
||||
const map = mergeBuiltinEnums(normalizeEnumMap(data), currentLanguage)
|
||||
if (Object.keys(map).length) {
|
||||
enumsMap = map
|
||||
enumsLanguage = currentLanguage
|
||||
@@ -118,6 +217,10 @@ export function getEnumOptions(code, language) {
|
||||
return enumsMap[code] || []
|
||||
}
|
||||
|
||||
export function getBuiltInEnums(language) {
|
||||
return mergeBuiltinEnums({}, language)
|
||||
}
|
||||
|
||||
export function getEnumLabel(code, key, fallback = '', language) {
|
||||
const options = getEnumOptions(code, language)
|
||||
const matched = options.find(item => String(item.key) === String(key))
|
||||
|
||||
Reference in New Issue
Block a user