This commit is contained in:
2026-08-26 16:50:25 +08:00
parent 5868e774d4
commit 083299602d
31 changed files with 816 additions and 239 deletions
+25 -6
View File
@@ -66,14 +66,18 @@ export function validatePdaTokenPair(accessToken, overseasAccessToken) {
return { domestic, overseas, warehouseId }
}
function userFromClaims(pair) {
function userFromClaims(pair, saved = {}) {
const savedWarehouseId = String(saved?.warehouseId || '')
const sameWarehouse = savedWarehouseId === pair.warehouseId
return {
id: claimId(pair.domestic, 'user_id'),
name: pair.domestic.username || '仓库作业员',
role: PDA_ROLE,
roles: [...pair.overseas.roles],
warehouse: `海外仓 #${pair.warehouseId}`,
warehouseId: pair.warehouseId
warehouse: sameWarehouse && saved.warehouseName ? saved.warehouseName : `海外仓 #${pair.warehouseId}`,
warehouseId: pair.warehouseId,
warehouseCode: sameWarehouse ? (saved.warehouseCode || '') : '',
warehouseName: sameWarehouse ? (saved.warehouseName || '') : ''
}
}
@@ -94,7 +98,8 @@ function persistSession() {
}
export function signIn(account, warehouse, options = {}) {
session.currentUser = { id: String(account.id), name: account.name, role: account.role, roles: account.roles || [], warehouse, warehouseId: account.warehouseId || null }
session.currentUser = { id: String(account.id), name: account.name, role: account.role, roles: account.roles || [], warehouse,
warehouseId: account.warehouseId || null, warehouseCode: account.warehouseCode || '', warehouseName: account.warehouseName || '' }
session.token = options.token || account.token || ''
session.domesticToken = options.domesticToken || account.domesticToken || ''
session.refreshToken = options.refreshToken || account.refreshToken || ''
@@ -120,7 +125,7 @@ export function signInWithTokens(tokens) {
export function replaceTokens(tokens) {
if (!tokens?.accessToken || !tokens?.overseasAccessToken) throw new Error('刷新响应缺少双区域访问令牌')
const pair = validatePdaTokenPair(tokens.accessToken, tokens.overseasAccessToken)
const user = userFromClaims(pair)
const user = userFromClaims(pair, session.currentUser)
const nextRefreshToken = tokens.refreshToken || session.refreshToken
// Validate the complete replacement before mutating reactive or persisted session state.
session.domesticToken = tokens.accessToken
@@ -131,6 +136,20 @@ export function replaceTokens(tokens) {
persistSession()
}
export function applyWarehouseProfile(profile) {
if (!session.currentUser) throw new Error('当前登录会话不存在')
const warehouseId = String(profile?.warehouseId || '')
if (!warehouseId || warehouseId !== String(session.currentUser.warehouseId)) throw new Error('仓库主档与当前登录仓库不一致')
session.currentUser = {
...session.currentUser,
warehouse: profile.warehouseName || profile.warehouseCode || `海外仓 #${warehouseId}`,
warehouseCode: String(profile.warehouseCode || ''),
warehouseName: String(profile.warehouseName || '')
}
persistSession()
return session.currentUser
}
export function restoreSession() {
if (!storageAvailable()) return false
const saved = uni.getStorageSync(SESSION_KEY)
@@ -141,7 +160,7 @@ export function restoreSession() {
try {
const pair = validatePdaTokenPair(saved.domesticToken, saved.token)
Object.assign(session, saved, {
currentUser: userFromClaims(pair), tenantId: claimId(pair.domestic, 'tenant_id'),
currentUser: userFromClaims(pair, saved.currentUser), tenantId: claimId(pair.domestic, 'tenant_id'),
apiBase: OVERSEAS_API_ROOT
})
return true