This commit is contained in:
2025-11-05 22:54:01 +08:00
parent 364276d85b
commit 4959b2f34f

View File

@@ -278,19 +278,6 @@
width="600px" width="600px"
:close-on-click-modal="false" :close-on-click-modal="false"
> >
<el-alert
v-if="tokenStatusChecked && !tokenValid"
title="访问令牌未配置或已过期"
type="warning"
:closable="false"
style="margin-bottom: 20px;"
>
<template slot="default">
<p>请先完成授权并保存访问令牌</p>
<p>获取授权URL后完成授权从回调页面复制access_token和refresh_token然后调用设置token接口保存</p>
</template>
</el-alert>
<el-form :model="syncLogisticsForm" label-width="140px"> <el-form :model="syncLogisticsForm" label-width="140px">
<el-form-item label="文件ID" required> <el-form-item label="文件ID" required>
<el-input <el-input
@@ -340,10 +327,11 @@
</el-form-item> </el-form-item>
<el-form-item label="说明"> <el-form-item label="说明">
<div style="font-size: 12px; color: #666; line-height: 1.6;"> <div style="font-size: 12px; color: #666; line-height: 1.6;">
<p>1. 系统会自动使用后端保存的访问令牌无需手动输入</p> <p>1. 点击"同步物流"如果没有token会自动打开授权页面</p>
<p>2. 文件ID和工作表ID可以从腾讯文档URL中获取</p> <p>2. 完成授权后点击"开始同步"即可自动刷新token并同步数据</p>
<p>3. 系统会自动从上次处理的最大行数-100开始读取避免重复处理历史数据</p> <p>3. 文件ID和工作表ID可以从腾讯文档URL中获取</p>
<p>4. 配置会自动保存下次使用时无需重新填写</p> <p>4. 系统会自动从上次处理的最大行数-100开始读取避免重复处理历史数据</p>
<p>5. 配置会自动保存下次使用时无需重新填写</p>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -353,7 +341,6 @@
type="primary" type="primary"
:loading="syncLogisticsLoading" :loading="syncLogisticsLoading"
@click="handleSyncLogisticsSubmit" @click="handleSyncLogisticsSubmit"
:disabled="tokenStatusChecked && !tokenValid"
> >
开始同步 开始同步
</el-button> </el-button>
@@ -364,7 +351,7 @@
<script> <script>
import { listJDOrders, updateJDOrder, delJDOrder, fetchLogisticsManually } from '@/api/system/jdorder' import { listJDOrders, updateJDOrder, delJDOrder, fetchLogisticsManually } from '@/api/system/jdorder'
import { fillLogisticsByOrderNo, getTokenStatus } from '@/api/jarvis/tendoc' import { fillLogisticsByOrderNo, getTokenStatus, getTencentDocAuthUrl } from '@/api/jarvis/tendoc'
import ListLayout from '@/components/ListLayout' import ListLayout from '@/components/ListLayout'
export default { export default {
@@ -648,9 +635,21 @@ export default {
} }
this.currentOrder = row this.currentOrder = row
// 先检查token状态如果没有token则自动打开授权页面
try {
const tokenStatusRes = await getTokenStatus()
if (!tokenStatusRes.data || !tokenStatusRes.data.hasToken) {
// 没有token自动打开授权页面
await this.openAuthAndWait()
}
} catch (e) {
// 检查失败,也尝试打开授权
await this.openAuthAndWait()
}
// 打开配置对话框
this.syncLogisticsDialogVisible = true this.syncLogisticsDialogVisible = true
this.tokenStatusChecked = false
this.tokenValid = false
// 从localStorage获取之前保存的配置 // 从localStorage获取之前保存的配置
const savedConfig = localStorage.getItem('tendoc_sync_config') const savedConfig = localStorage.getItem('tendoc_sync_config')
@@ -665,9 +664,58 @@ export default {
console.error('解析保存的配置失败', e) console.error('解析保存的配置失败', e)
} }
} }
},
// 检查后端token状态
await this.checkTokenStatus() /** 打开授权页面并等待授权完成 */
async openAuthAndWait() {
try {
// 获取授权URL
const authUrlRes = await getTencentDocAuthUrl()
if (authUrlRes.code !== 200 || !authUrlRes.data) {
this.$message.error('获取授权URL失败')
return
}
const authUrl = authUrlRes.data
// 打开授权页面
this.$message.info('正在打开授权页面,请完成授权后继续...')
const width = 600
const height = 700
const left = (window.screen.width - width) / 2
const top = (window.screen.height - height) / 2
const authWindow = window.open(
authUrl,
'腾讯文档授权',
`width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`
)
// 轮询检查授权是否完成通过检查token状态
const checkAuth = setInterval(async () => {
if (authWindow.closed) {
clearInterval(checkAuth)
// 等待1秒后检查token状态
setTimeout(async () => {
try {
const tokenStatusRes = await getTokenStatus()
if (tokenStatusRes.data && tokenStatusRes.data.hasToken) {
this.$message.success('授权成功!')
} else {
this.$message.warning('授权未完成,请重新尝试')
}
} catch (e) {
this.$message.warning('无法验证授权状态')
}
}, 1000)
}
}, 1000)
} catch (e) {
this.$message.error('打开授权页面失败: ' + (e.message || '未知错误'))
console.error('打开授权页面失败', e)
}
}, },
/** 检查后端token状态 */ /** 检查后端token状态 */
@@ -689,11 +737,6 @@ export default {
/** 同步物流链接 */ /** 同步物流链接 */
async handleSyncLogisticsSubmit() { async handleSyncLogisticsSubmit() {
if (!this.tokenValid) {
this.$message.warning('访问令牌无效请先完成授权并保存token')
return
}
if (!this.syncLogisticsForm.fileId || !this.syncLogisticsForm.sheetId) { if (!this.syncLogisticsForm.fileId || !this.syncLogisticsForm.sheetId) {
this.$message.warning('请填写文件ID和工作表ID') this.$message.warning('请填写文件ID和工作表ID')
return return
@@ -712,7 +755,7 @@ export default {
this.syncLogisticsLoading = true this.syncLogisticsLoading = true
try { try {
const params = { const params = {
// 不再传递accessToken后端自动获取 // 不再传递accessToken后端自动刷新token
fileId: this.syncLogisticsForm.fileId, fileId: this.syncLogisticsForm.fileId,
sheetId: this.syncLogisticsForm.sheetId, sheetId: this.syncLogisticsForm.sheetId,
headerRow: this.syncLogisticsForm.headerRow || 1 headerRow: this.syncLogisticsForm.headerRow || 1
@@ -735,10 +778,15 @@ export default {
) )
this.syncLogisticsDialogVisible = false this.syncLogisticsDialogVisible = false
} else { } else {
this.$message.error(res.msg || '同步失败') // 如果是因为token问题提示用户授权
if (res.msg && res.msg.includes('授权')) {
this.$message.error(res.msg + '。请访问: GET /jarvis/tendoc/authUrl 获取授权URL')
} else {
this.$message.error(res.msg || '同步失败')
}
} }
} catch (e) { } catch (e) {
this.$message.error('同步失败,请稍后重试') this.$message.error('同步失败,请稍后重试: ' + (e.message || '未知错误'))
console.error('同步物流失败', e) console.error('同步物流失败', e)
} finally { } finally {
this.syncLogisticsLoading = false this.syncLogisticsLoading = false