From 6cfa8faa48d5b70d10657fd0dd9346b8df3a2f50 Mon Sep 17 00:00:00 2001 From: jhd <1684074631@qq.com> Date: Tue, 26 May 2026 15:14:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E6=A0=B7=E5=BC=8F=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/request.js | 57 +- src/api/wms/actualWarehouse.js | 135 ++ src/utils/request.js | 51 +- .../screens/warehouse-overview/index.vue | 1852 +++++++---------- 4 files changed, 959 insertions(+), 1136 deletions(-) create mode 100644 src/api/wms/actualWarehouse.js diff --git a/src/api/request.js b/src/api/request.js index 5dafa86..8b252a0 100644 --- a/src/api/request.js +++ b/src/api/request.js @@ -10,11 +10,31 @@ const service = axios.create({ } }) +// 从 Cookies 获取 Token(与 klp-ui 保持一致) +const getToken = () => { + const name = 'Admin-Token' + const value = `; ${document.cookie}` + const parts = value.split(`; ${name}=`) + if (parts.length === 2) return parts.pop().split(';').shift() + return null +} + service.interceptors.request.use( config => { - const token = localStorage.getItem('token') + let token = getToken() + // ========== 测试用:临时硬编码 Token ========== + // 如果没有从 Cookies 获取到 Token,使用测试 Token + if (!token) { + token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJGM2w5Nm5ncGV4ZDA4d1BUYWlvVmFreWhCUDdlc2gyeCIsInVzZXJJZCI6MX0.aP06S-5aJtukzMjmYW3d5zK3v10TOKcdNpROniv5lr8' + } + // ========== 测试用结束 ========== + + console.log('请求URL:', config.url) + console.log('使用的Token:', token ? '已设置' : '未设置') + if (token) { - config.headers['Authorization'] = `Bearer ${token}` + // 尝试两种格式:Bearer 和 直接使用Token + config.headers['Authorization'] = token // 直接使用Token(不带Bearer前缀) } return config }, @@ -25,15 +45,36 @@ service.interceptors.request.use( service.interceptors.response.use( response => { - const res = response.data - if (res.code !== 200) { - console.error('请求失败:', res.message) - return Promise.reject(new Error(res.message || 'Error')) + console.log('响应数据:', response.data) + + let res = response.data + + // 如果响应数据为空 + if (!res) { + console.error('响应数据为空') + return Promise.reject(new Error('响应数据为空')) } - return res.data + + // 如果是字符串,尝试解析 + if (typeof res === 'string') { + try { + res = JSON.parse(res) + } catch { + console.error('响应数据不是JSON格式:', res) + return res + } + } + + // 检查code + if (res.code !== undefined && res.code !== 200) { + console.error('请求失败 [code=' + res.code + ']:', res.message || res.msg) + return Promise.reject(new Error(res.message || res.msg || '请求失败')) + } + + return res.data !== undefined ? res.data : res }, error => { - console.error('请求错误:', error) + console.error('请求错误:', error.response?.data || error.message || error) return Promise.reject(error) } ) diff --git a/src/api/wms/actualWarehouse.js b/src/api/wms/actualWarehouse.js new file mode 100644 index 0000000..2119308 --- /dev/null +++ b/src/api/wms/actualWarehouse.js @@ -0,0 +1,135 @@ +import request from '@/utils/request' + +// 查询实际库区/库位自关联列表 +export function listActualWarehouse(query) { + return request({ + url: '/wms/actualWarehouse/list', + method: 'get', + params: query + }) +} + +// 获取完整三级目录 +export function listActualWarehouseTree(query) { + return request({ + url: '/wms/actualWarehouse/tree', + method: 'get', + params: query + }) +} + +// 查询实际库区/库位自关联详细 +export function getActualWarehouse(actualWarehouseId) { + return request({ + url: '/wms/actualWarehouse/' + actualWarehouseId, + method: 'get' + }) +} + +// 新增实际库区/库位自关联 +export function addActualWarehouse(data) { + return request({ + url: '/wms/actualWarehouse', + method: 'post', + data: data + }) +} + +// 导入实际库区/库位 +export function importActualWarehouse(data) { + return request({ + url: '/wms/actualWarehouse/importData', + method: 'post', + data, + headers: { 'Content-Type': 'multipart/form-data' } + }) +} + +// 批量新增三级目录 +export function createActualWarehouseHierarchy(data) { + return request({ + url: '/wms/actualWarehouse/hierarchy', + method: 'post', + data + }) +} + +// 修改实际库区/库位自关联 +export function updateActualWarehouse(data) { + return request({ + url: '/wms/actualWarehouse', + method: 'put', + data: data + }) +} + +// 删除实际库区/库位自关联 +export function delActualWarehouse(actualWarehouseId) { + return request({ + url: '/wms/actualWarehouse/' + actualWarehouseId, + method: 'delete' + }) +} + +// 获取两级的树结构 +export function treeActualWarehouseTwoLevel(query) { + return request({ + url: '/wms/actualWarehouse/levelTwo', + method: 'get', + params: query + }) +} + +export function generateLocations(data) { + return request({ + url: '/wms/actualWarehouse/generateLocations', + method: 'post', + data + }) +} + +/** + * 分割库区 + */ +export function splitActualWarehouse(payload) { + return request({ + url: '/wms/actualWarehouse/split', + method: 'post', + timeout: 100000, + data: { + action: 1, + splitType: 0, + ...payload + } + }) +} + +/** + * 合并库区 + */ +export function mergeActualWarehouse(payload) { + return request({ + url: '/wms/actualWarehouse/merge', + method: 'post', + timeout: 100000, + data: { + action: 0, + splitType: 0, + ...payload + } + }) +} + +/** + * 强制释放库位 + */ +export function forceReleaseLocation(actualWarehouseId) { + if (!actualWarehouseId) { + throw new Error('actualWarehouseId is required'); + } + return request({ + url: '/wms/actualWarehouse/release/' + actualWarehouseId, + method: 'put', + timeout: 100000, + }) +} diff --git a/src/utils/request.js b/src/utils/request.js index 72dca3b..8f7f5c0 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,12 +1,41 @@ import axios from 'axios' +// klp-oa线上API地址(测试环境) +const baseURL = 'http://140.143.206.120:8080' + const service = axios.create({ - baseURL: '', - timeout: 15000 + baseURL: baseURL, + timeout: 30000 }) +// 从 Cookies 获取 Token(与 klp-ui 保持一致) +const getToken = () => { + const name = 'Admin-Token' + const value = `; ${document.cookie}` + const parts = value.split(`; ${name}=`) + if (parts.length === 2) return parts.pop().split(';').shift() + return null +} + service.interceptors.request.use( config => { + // 携带Token + let token = getToken() + + // ========== 测试用:临时硬编码 Token ========== + // 如果没有从 Cookies 获取到 Token,使用测试 Token + if (!token) { + token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJGM2w5Nm5ncGV4ZDA4d1BUYWlvVmFreWhCUDdlc2gyeCIsInVzZXJJZCI6MX0.aP06S-5aJtukzMjmYW3d5zK3v10TOKcdNpROniv5lr8' + } + // ========== 测试用结束 ========== + + console.log('请求URL:', config.url) + console.log('使用的Token:', token ? '已设置' : '未设置') + + if (token) { + // 直接使用Token(不带Bearer前缀) + config.headers['Authorization'] = token + } return config }, error => { @@ -18,16 +47,22 @@ service.interceptors.request.use( service.interceptors.response.use( response => { const res = response.data - if (res.code === 200) { - return res.data - } else { - console.error('Response error:', res.message) - return Promise.reject(new Error(res.message || 'Error')) + // 兼容多种返回格式 + if (res && res.code !== undefined) { + if (res.code === 200) { + return res.data + } else { + console.warn('API error:', res.message) + return res.data || [] + } } + // 如果没有 code 字段,直接返回数据 + return res }, error => { console.error('Response error:', error.message) - return Promise.reject(error) + // 返回空数组作为默认值,避免页面崩溃 + return Promise.resolve([]) } ) diff --git a/src/views/screens/warehouse-overview/index.vue b/src/views/screens/warehouse-overview/index.vue index fbf941b..acc7400 100644 --- a/src/views/screens/warehouse-overview/index.vue +++ b/src/views/screens/warehouse-overview/index.vue @@ -1,734 +1,536 @@ -