⚡ 修复运输计划/发货模板列表缓存不刷新,并优化结算导入查看与费用弹窗

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-19 16:56:03 +08:00
parent ccaf944782
commit 5cb7eb16d5
9 changed files with 320 additions and 311 deletions
@@ -2807,8 +2807,11 @@ import 'nprogress/nprogress.css';
const AMAP_KEY = '653b7cf105ad7fb8ec9b2f5198ade315';
const AMAP_SECURITY_CODE = '5aab65c632e48ebae0d0e28f5b28e21a';
let amapLoader;
const transportPlanListRoute = '/business/transport-plan';
const transportPlanFormRoute = '/business/transport-plan/form';
const transportPlanListRefreshKey = 'transport-plan-list-refresh';
const standaloneTransportPlanFormRoutes = {
'/business/transport-plan': '/business/transport-plan/form',
[transportPlanListRoute]: transportPlanFormRoute,
};
const standaloneTransportPlanFormPaths = [
...Object.keys(standaloneTransportPlanFormRoutes),
@@ -3072,6 +3075,10 @@ export default {
// 必须放 data:Options API 的顺序是 data → computed → watch(immediate) → created,
// 放 created 的话首个 immediate watcher 会读到空值,把首次加载也挡掉。
routePathLocked: this.$route.path,
// 表单页实例在创建时锁定,避免 keep-alive 列表实例随全局 $route 误切到表单态。
isFormPageInstance: Object.values(standaloneTransportPlanFormRoutes).includes(
this.$route.path
),
form: {},
suppressTransportTypeClear: false,
query: {},
@@ -3112,10 +3119,11 @@ export default {
option: (() => {
const opt = this.cloneOption(this.crudOption, estimateMenuButtonCount(this.config));
if (this.menuWidth != null) opt.menuWidth = this.menuWidth;
if (
this.standaloneFormPage &&
standaloneTransportPlanFormPaths.includes(this.$route.path)
) {
// 仅表单页实例套用全屏表单弹窗样式,避免列表页误用后表格区域异常。
const isFormInstance = Object.values(standaloneTransportPlanFormRoutes).includes(
this.$route.path
);
if (this.standaloneFormPage && isFormInstance) {
opt.dialogAppendToBody = false;
opt.dialogModal = false;
opt.dialogCustomClass = 'transport-plan-form-page-dialog';
@@ -3289,6 +3297,12 @@ export default {
}
this.loadTaskQuantityUnitOptions();
},
// keep-alive 重新激活列表时强制刷新,避免缓存脏数据;标记位用于兼容旧跳转逻辑。
activated() {
if (this.isFormPageInstance) return;
sessionStorage.removeItem(transportPlanListRefreshKey);
this.$nextTick(() => this.onLoad(this.page, this.query));
},
computed: {
...mapGetters(['permission', 'userInfo']),
permissionList() {
@@ -3300,10 +3314,20 @@ export default {
return this.config.detailSections || [];
},
isStandaloneBusinessPage() {
return this.standaloneFormPage && standaloneTransportPlanFormPaths.includes(this.$route.path);
return (
this.standaloneFormPage &&
(this.isFormPageInstance ||
standaloneTransportPlanFormPaths.includes(this.routePathLocked) ||
standaloneTransportPlanFormPaths.includes(this.$route.path))
);
},
isStandaloneFormPage() {
return this.isStandaloneBusinessPage && ['add', 'edit'].includes(this.$route.query.mode);
// 用实例锁定标志,避免列表 keep-alive 实例被全局路由误判成表单页。
return (
this.standaloneFormPage &&
this.isFormPageInstance &&
['add', 'edit'].includes(this.$route.query.mode)
);
},
formPageTitle() {
if (this.isStandaloneFormPage) {
@@ -3752,6 +3776,18 @@ export default {
},
watch: {
$route(to, from) {
// 列表实例:从其他页进入列表时刷新(activated 负责标签切回)。
if (!this.isFormPageInstance) {
const enteringList =
(to.path === this.routePathLocked || to.path === transportPlanListRoute) &&
from?.path &&
from.path !== to.path;
if (enteringList) {
sessionStorage.removeItem(transportPlanListRefreshKey);
this.$nextTick(() => this.onLoad(this.page, this.query));
}
return;
}
if (!this.isStandaloneFormPage) return;
if (
to.query.mode !== from?.query?.mode ||
@@ -4484,6 +4520,9 @@ export default {
loading();
}
},
markTransportPlanListNeedRefresh() {
sessionStorage.setItem(transportPlanListRefreshKey, '1');
},
rowSave(row, done, loading) {
const submitRow = this.normalizeRow(row);
if (!submitRow) {
@@ -4492,6 +4531,7 @@ export default {
}
this.getSaveRequest()(submitRow).then(
() => {
this.markTransportPlanListNeedRefresh();
this.onLoad(this.page);
this.$message({ type: 'success', message: '操作成功!' });
done();
@@ -4511,6 +4551,7 @@ export default {
}
this.getSaveRequest()(submitRow).then(
() => {
this.markTransportPlanListNeedRefresh();
this.onLoad(this.page);
this.$message({ type: 'success', message: '操作成功!' });
done();
@@ -4540,7 +4581,7 @@ export default {
.submit(submitRow)
.then(() => {
this.$message.success(action === 'draft' ? '暂存成功' : '创建成功');
this.onLoad(this.page, this.query);
this.markTransportPlanListNeedRefresh();
this.closeCrudDialog();
})
.finally(() => {
@@ -4548,12 +4589,14 @@ export default {
});
},
closeCrudDialog() {
if (this.isStandaloneBusinessPage) {
if (this.isStandaloneBusinessPage || this.isFormPageInstance) {
// 关闭独立表单页时标记列表需刷新(含直接点关闭未保存的场景)
this.markTransportPlanListNeedRefresh();
this.$router.$avueRouter?.closeTag?.();
const listPath =
Object.entries(standaloneTransportPlanFormRoutes).find(
([, formPath]) => formPath === this.$route.path
)?.[0] || this.$route.path;
([, formPath]) => formPath === this.$route.path || formPath === this.routePathLocked
)?.[0] || transportPlanListRoute;
this.$router.push({ path: listPath, query: {} });
return;
}
@@ -6634,20 +6677,33 @@ export default {
return query;
},
onLoad(page, params = {}) {
if (this.isFormPageInstance) return;
this.loading = true;
const currentPage = page?.currentPage || this.page.currentPage || 1;
const pageSize = page?.pageSize || this.page.pageSize || 10;
const query = this.normalizeQueryParams({
...params,
...this.query,
allDept: 0,
});
this.api
.getList(page.currentPage, page.pageSize, query)
.getList(currentPage, pageSize, query)
.then(res => {
const result = res.data.data;
this.page.total = result.total;
this.data = result.records;
const result = res?.data?.data || res?.data || {};
const records = Array.isArray(result.records)
? result.records
: Array.isArray(result)
? result
: [];
this.page.total = Number(result.total ?? records.length) || 0;
this.data = records;
this.selectionClear();
})
.catch(error => {
window.console.error(error);
this.data = [];
this.page.total = 0;
})
.finally(() => {
this.loading = false;
});