From c41e67835c8179a9ffbdfaa997d375d11ff52a75 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Wed, 26 Aug 2026 11:17:37 +0800 Subject: [PATCH] site+'%' --- src/utils/subSiteAuth.js | 80 +++++++++++++++++++ .../other-transaction/inventory-move.vue | 10 ++- .../production-inbound/inboundRegister.vue | 6 +- .../production-withdrawal/order-list.vue | 8 +- src/views/modules/recv/qualifiedStorage.vue | 7 +- src/views/modules/recv/recv.vue | 8 +- 6 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 src/utils/subSiteAuth.js diff --git a/src/utils/subSiteAuth.js b/src/utils/subSiteAuth.js new file mode 100644 index 0000000..01f398b --- /dev/null +++ b/src/utils/subSiteAuth.js @@ -0,0 +1,80 @@ +/** + * 统一格式化站点编码,避免大小写和空白导致匹配失败 + * @param {*} siteCode + * @returns {string} + */ +function normalizeSiteCode(siteCode) { + return String(siteCode || '') + .replace(/%/g, '') + .trim() + .toUpperCase(); +} + +/** + * 站点编码去重并清理空值 + * @param {Array} siteCodeList + * @returns {Array} + */ +function normalizeSiteCodeList(siteCodeList) { + if (!Array.isArray(siteCodeList)) { + return []; + } + return Array.from( + new Set( + siteCodeList + .map(code => normalizeSiteCode(code)) + .filter(code => !!code) + ) + ); +} + +/** + * 获取当前用户授权子site编码列表 + * 优先读取Vuex,若为空再回退localStorage,避免页面刷新后Vuex丢失 + * @param {Array} storeSubSiteCodeList + * @returns {Array} + */ +export function getAuthorizedSubSiteCodeList(storeSubSiteCodeList) { + const subSiteCodeListFromStore = normalizeSiteCodeList(storeSubSiteCodeList); + if (subSiteCodeListFromStore.length > 0) { + return subSiteCodeListFromStore; + } + + try { + const localSubSiteCodeList = JSON.parse(localStorage.getItem('userSubSiteCodeList') || '[]'); + return normalizeSiteCodeList(localSubSiteCodeList); + } catch (error) { + console.error('解析userSubSiteCodeList失败:', error); + return []; + } +} + +/** + * 按授权子site过滤列表数据,避免接口按site前缀查询后返回越权数据 + * @param {Array} rows 列表原始数据 + * @param {Array} authorizedSubSiteCodeList 用户授权子site编码列表 + * @param {Array} siteFieldList 数据中可能存放站点编码的字段 + * @returns {Array} + */ +export function filterRowsByAuthorizedSubSite(rows, authorizedSubSiteCodeList, siteFieldList = ['contract']) { + const sourceRows = Array.isArray(rows) ? rows : []; + const normalizedAuthorizedList = normalizeSiteCodeList(authorizedSubSiteCodeList); + + // 未拿到授权子site时,返回空列表,避免放行越权数据 + if (normalizedAuthorizedList.length === 0) { + return []; + } + + const authorizedSiteSet = new Set(normalizedAuthorizedList); + const validSiteFieldList = Array.isArray(siteFieldList) && siteFieldList.length > 0 ? siteFieldList : ['contract']; + + return sourceRows.filter(row => { + if (!row || typeof row !== 'object') { + return false; + } + return validSiteFieldList.some(field => { + const rowSiteCode = normalizeSiteCode(row[field]); + return rowSiteCode && authorizedSiteSet.has(rowSiteCode); + }); + }); +} diff --git a/src/views/modules/other-transaction/inventory-move.vue b/src/views/modules/other-transaction/inventory-move.vue index 238637f..ee56fdb 100644 --- a/src/views/modules/other-transaction/inventory-move.vue +++ b/src/views/modules/other-transaction/inventory-move.vue @@ -142,7 +142,7 @@ export default { targetLocationId: '' }, scannedItems: [], - site: localStorage.getItem('site') || 'SITE01', + site: '', loading: false }; }, @@ -236,9 +236,10 @@ export default { return; } - // 校验HU是否属于当前站点 + this.site = this.scannedItems.length > 0 ? this.scannedItems[0].site : huInfo.site; // 设置当前站点为第一个扫描的HU的站点 + // 所有标签site必须一致 if (huInfo.site && huInfo.site !== this.site) { - this.$message.error('HandlingUnit站点不匹配'); + this.$message.error('所有标签site必须一致'); return; } @@ -260,7 +261,8 @@ export default { batchNo: huInfo.batchNo, locationId: huInfo.locationId, wdr: huInfo.wdr, - expiredDate: huInfo.expiredDate + expiredDate: huInfo.expiredDate, + site: huInfo.site }); this.$message.success('扫描成功'); diff --git a/src/views/modules/production-inbound/inboundRegister.vue b/src/views/modules/production-inbound/inboundRegister.vue index adac8d1..16a5ab7 100644 --- a/src/views/modules/production-inbound/inboundRegister.vue +++ b/src/views/modules/production-inbound/inboundRegister.vue @@ -213,6 +213,7 @@