Files
pda-overseas-uniapp/src/api/overseas.js
T

128 lines
4.4 KiB
JavaScript
Raw Normal View History

2026-08-25 00:24:57 +08:00
import { refresh } from './auth.js'
import { session, replaceTokens, signOut } from '../stores/session.js'
let refreshPromise = null
function errorFrom(response, fallback) {
const body = response?.data || {}
const error = new Error(body.message || fallback)
error.code = body.code || response?.statusCode
error.requestId = body.requestId || response?.header?.['x-request-id'] || response?.header?.['X-Request-Id']
error.traceId = body.traceId || response?.header?.['x-trace-id'] || response?.header?.['X-Trace-Id']
return error
}
function unauthorized(response) {
const code = String(response?.data?.code || response?.statusCode || '')
return response?.statusCode === 401 || code === 'A0401'
}
2026-08-24 19:23:23 +08:00
function successful(response, body) {
return response?.statusCode === 200 && ['00000', '200'].includes(String(body?.code))
}
async function refreshOverseasToken() {
2026-08-25 00:24:57 +08:00
if (!session.refreshToken) {
signOut()
throw new Error('登录状态已过期,请重新登录')
}
if (!refreshPromise) {
2026-08-25 00:24:57 +08:00
refreshPromise = refresh(session.refreshToken)
.then((tokens) => { replaceTokens(tokens); return session.token })
.catch((error) => { signOut(); throw error })
.finally(() => { refreshPromise = null })
}
return refreshPromise
}
2026-08-25 00:24:57 +08:00
async function tokenAfterUnauthorized(failedToken) {
if (session.token && session.token !== failedToken) return session.token
return refreshOverseasToken()
}
function rawRequest(method, path, data, token) {
return new Promise((resolve, reject) => {
uni.request({
url: `${session.apiBase}${path}`,
method,
data,
header: { Accept: 'application/json', Authorization: `Bearer ${token}` },
success: resolve,
fail: (cause) => reject(Object.assign(new Error(cause.errMsg || '海外服务网络连接失败'), { network: true }))
})
})
}
export async function overseasRequest(method, path, data, retry = true) {
2026-08-25 00:24:57 +08:00
const attemptedToken = session.token
let response = await rawRequest(method, path, data, attemptedToken)
if (retry && unauthorized(response)) {
2026-08-25 00:24:57 +08:00
const replacementToken = await tokenAfterUnauthorized(attemptedToken)
response = await rawRequest(method, path, data, replacementToken)
}
const body = response?.data || {}
2026-08-24 19:23:23 +08:00
if (!successful(response, body)) throw errorFrom(response, '海外作业请求失败')
return body.data
}
2026-08-24 19:23:23 +08:00
function rawUpload(path, filePath, name, token) {
return new Promise((resolve, reject) => {
uni.uploadFile({
url: `${session.apiBase}${path}`,
filePath,
name,
2026-08-24 19:23:23 +08:00
header: { Authorization: `Bearer ${token}` },
success: resolve,
fail: (cause) => reject(Object.assign(new Error(cause.errMsg || '卸柜照片上传失败'), { network: true }))
})
})
}
2026-08-24 19:23:23 +08:00
2026-08-26 15:59:08 +08:00
function overseasUrl(path) {
const value = String(path || '')
const normalized = /\/(?:api|overseas-api)$/.test(session.apiBase)
? value.replace(/^\/api(?=\/)/, '')
: value
return `${session.apiBase}${normalized}`
}
function rawDownload(path, token) {
return new Promise((resolve, reject) => {
uni.downloadFile({
url: overseasUrl(path),
header: { Authorization: `Bearer ${token}` },
success: resolve,
fail: (cause) => reject(Object.assign(new Error(cause.errMsg || '签收照片下载失败'), { network: true }))
})
})
}
2026-08-24 19:23:23 +08:00
export async function overseasUpload(path, filePath, name = 'file', retry = true) {
2026-08-25 00:24:57 +08:00
const attemptedToken = session.token
let response = await rawUpload(path, filePath, name, attemptedToken)
2026-08-24 19:23:23 +08:00
let body = null
try { body = JSON.parse(response.data || '{}') } catch (_) { /* handled below */ }
if (retry && unauthorized({ ...response, data: body })) {
2026-08-25 00:24:57 +08:00
const replacementToken = await tokenAfterUnauthorized(attemptedToken)
response = await rawUpload(path, filePath, name, replacementToken)
2026-08-24 19:23:23 +08:00
try { body = JSON.parse(response.data || '{}') } catch (_) { body = null }
}
if (!successful(response, body)) throw errorFrom({ ...response, data: body }, '卸柜照片上传失败')
return body.data
}
2026-08-25 00:24:57 +08:00
2026-08-26 15:59:08 +08:00
export async function overseasDownload(path, retry = true) {
const attemptedToken = session.token
let response = await rawDownload(path, attemptedToken)
if (retry && unauthorized(response)) {
const replacementToken = await tokenAfterUnauthorized(attemptedToken)
response = await rawDownload(path, replacementToken)
}
if (response?.statusCode !== 200 || !response?.tempFilePath) {
throw errorFrom({ ...response, data: {} }, '签收照片下载失败')
}
return response.tempFilePath
}
2026-08-25 00:24:57 +08:00
export function resetOverseasRequestStateForTest() { refreshPromise = null }