86 lines
3.1 KiB
JavaScript
86 lines
3.1 KiB
JavaScript
/**
|
|
* Web 路由 → 手机页。工作台 shortcuts / pendingItems 下发的是 Web path。
|
|
*/
|
|
export function mobileUrl(webPath, extra = {}) {
|
|
const raw = String(webPath || '').trim()
|
|
if (!raw) return ''
|
|
if (raw.startsWith('/pages/')) return raw
|
|
const qIndex = raw.indexOf('?')
|
|
const path = qIndex >= 0 ? raw.slice(0, qIndex) : raw
|
|
const query = qIndex >= 0 ? raw.slice(qIndex + 1) : ''
|
|
const no = extra.no || extra.id || extra.requestNo || ''
|
|
|
|
if (path === '/apply') return '/pages/apply/list'
|
|
const apply = path.match(/^\/apply\/([^/]+)$/)
|
|
if (apply) return '/pages/apply/form?kind=' + encodeURIComponent(apply[1])
|
|
|
|
if (path.startsWith('/todo')) {
|
|
if (no) return '/pages/todo/detail?no=' + encodeURIComponent(no)
|
|
const tab = path.split('/')[2] || 'pending'
|
|
return '/pages/todo/list?tab=' + encodeURIComponent(tab)
|
|
}
|
|
|
|
if (path === '/contacts') return '/pages/tabs/contacts'
|
|
if (path === '/profile' || path === '/me') return '/pages/me/archive'
|
|
if (path.startsWith('/hr/notice') || path === '/notice') return '/pages/notice/list'
|
|
if (path.startsWith('/report')) return '/pages/reports/list'
|
|
if (path.includes('clock') || path.includes('attend')) return '/pages/tabs/clock'
|
|
if (path.startsWith('/work')) {
|
|
if (no) return '/pages/coop/detail?id=' + encodeURIComponent(no)
|
|
return '/pages/coop/list'
|
|
}
|
|
|
|
const erp = [
|
|
['/project', 'project'],
|
|
['/bidding', 'bidding'],
|
|
['/finance', 'finance'],
|
|
['/hr', 'hr'],
|
|
['/contracts', 'contracts'],
|
|
['/seals', 'seals'],
|
|
['/crm', 'crm'],
|
|
['/system', 'system']
|
|
]
|
|
for (const [prefix, id] of erp) {
|
|
if (path === prefix || path.startsWith(prefix + '/')) return '/pages/erp/hub?id=' + id
|
|
}
|
|
|
|
if (query) {
|
|
const mapped = mobileUrl(path, extra)
|
|
if (mapped && mapped.includes('?')) return mapped + '&' + query
|
|
if (mapped) return mapped + '?' + query
|
|
}
|
|
return ''
|
|
}
|
|
|
|
export function openHref(webPath, extra = {}) {
|
|
const url = mobileUrl(webPath, extra)
|
|
if (!url) return false
|
|
if (url.startsWith('/pages/tabs/')) {
|
|
uni.switchTab({ url: url.split('?')[0] })
|
|
return true
|
|
}
|
|
uni.navigateTo({ url })
|
|
return true
|
|
}
|
|
|
|
const EMOJI = {
|
|
expense: '🧾', loan: '¥', leave: '休', trip: '✈', procurement: '购',
|
|
overtime: '加', outing: '出', card: '补', transfer: '转', regularize: '正',
|
|
resign: '离', layoff: '裁', seal: '章', receive: '领', clock: '📍',
|
|
todo: '☑', apply: '✎', report: '▤', salary: '💳', perf: '↗',
|
|
archive: '👤', notice: '📢', coop: '🤝', contacts: '☎',
|
|
bidding: '◎', project: '▣', finance: '◈', hr: '☰', contracts: '▤',
|
|
seals: '◆', crm: '◇', system: '⚙'
|
|
}
|
|
|
|
export function tileEmoji(item) {
|
|
if (item && item.emoji) return item.emoji
|
|
const to = String((item && (item.to || item.url || item.path)) || '')
|
|
const m = to.match(/\/apply\/([^/?]+)/)
|
|
if (m && EMOJI[m[1]]) return EMOJI[m[1]]
|
|
const id = String((item && (item.id || item.kind || item.key)) || '')
|
|
if (EMOJI[id]) return EMOJI[id]
|
|
const label = String((item && (item.label || item.title)) || '')
|
|
return label ? label.slice(0, 1) : '·'
|
|
}
|