⚡ 修复运输计划/发货模板列表缓存不刷新,并优化结算导入查看与费用弹窗
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user