diff --git a/pc/src/api/asset/classification.js b/pc/src/api/asset/classification.js index e4e2fdb..e61004d 100644 --- a/pc/src/api/asset/classification.js +++ b/pc/src/api/asset/classification.js @@ -2,17 +2,31 @@ import request from '@/utils/request' // 查询资产分类列表 export function listClassification(query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'classificationCode') { + params.classification_code = query[key] + } else if (key === 'classificationName') { + params.classification_name = query[key] + } else { + params[key] = query[key] + } + }) + } + return request({ - url: '/asset/classification/list', + url: '/asset/classifications/list', method: 'get', - params: query + params: params }) } // 查询资产分类详情 export function getClassification(id) { return request({ - url: '/asset/classification/' + id, + url: '/asset/classifications/' + id, method: 'get' }) } @@ -20,7 +34,7 @@ export function getClassification(id) { // 新增资产分类 export function addClassification(data) { return request({ - url: '/asset/classification', + url: '/asset/classifications/create', method: 'post', data: data }) @@ -29,68 +43,122 @@ export function addClassification(data) { // 修改资产分类 export function updateClassification(data) { return request({ - url: '/asset/classification', + url: '/asset/classifications/' + data.id, method: 'put', data: data }) } // 删除资产分类 -export function delClassification(id) { +export function delClassification(id, lastModUserId) { return request({ - url: '/asset/classification/' + id, - method: 'delete' + url: '/asset/classifications/' + id, + method: 'delete', + params: lastModUserId ? { lastModUserId } : {} }) } // 禁用资产分类 export function disableClassification(id, lastModUserId) { return request({ - url: '/asset/classification/disable/' + id, + url: '/asset/classifications/' + id + '/status/disable', method: 'put', - params: { lastModUserId } + params: lastModUserId ? { lastModUserId } : {} }) } // 启用资产分类 export function enableClassification(id, lastModUserId) { return request({ - url: '/asset/classification/enable/' + id, + url: '/asset/classifications/' + id + '/status/enable', method: 'put', - params: { lastModUserId } + params: lastModUserId ? { lastModUserId } : {} }) } // 批量删除资产分类 export function delClassificationBatch(ids, lastModUserId) { return request({ - url: '/asset/classification/batch/' + ids, + url: '/asset/classifications/batch', method: 'delete', - params: { lastModUserId } + data: ids, + params: lastModUserId ? { lastModUserId } : {} }) } // 获取资产分类树形结构 -export function getClassificationTree() { +export function getClassificationTree(query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'classificationCode') { + params.classification_code = query[key] + } else if (key === 'classificationName') { + params.classification_name = query[key] + } else { + params[key] = query[key] + } + }) + } + return request({ - url: '/asset/classification/tree', - method: 'get' + url: '/asset/classifications/tree', + method: 'get', + params: params + }) +} + +// 根据父ID查询子分类 +export function getChildClassifications(parentId, query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'classificationCode') { + params.classification_code = query[key] + } else if (key === 'classificationName') { + params.classification_name = query[key] + } else { + params[key] = query[key] + } + }) + } + + return request({ + url: '/asset/classifications/children/' + parentId, + method: 'get', + params: params }) } // 检查分类是否被使用 export function checkClassificationInUse(id) { return request({ - url: '/asset/classification/' + id + '/check', + url: '/asset/classifications/' + id + '/check', method: 'get' }) } // 导出资产分类 export function exportClassification(query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'classificationCode') { + params.classification_code = query[key] + } else if (key === 'classificationName') { + params.classification_name = query[key] + } else { + params[key] = query[key] + } + }) + } + return request({ - url: '/asset/classification/export', + url: '/asset/classifications/export', method: 'get', - params: query + params: params }) } \ No newline at end of file diff --git a/pc/src/api/asset/inventory.js b/pc/src/api/asset/inventory.js new file mode 100644 index 0000000..8968ed8 --- /dev/null +++ b/pc/src/api/asset/inventory.js @@ -0,0 +1,150 @@ +import request from '@/utils/request' + +// 查询资产清单列表 +export function listAsset(query) { + return request({ + url: '/asset/inventory/list', + method: 'get', + params: query + }) +} + +// 查询资产详细 +export function getAsset(id) { + return request({ + url: '/asset/inventory/' + id, + method: 'get' + }) +} + +// 新增资产 +export function addAsset(data) { + return request({ + url: '/asset/inventory', + method: 'post', + data: data + }) +} + +// 修改资产 +export function updateAsset(data) { + return request({ + url: '/asset/inventory', + method: 'put', + data: data + }) +} + +// 删除资产 +export function delAsset(id) { + return request({ + url: '/asset/inventory/' + id, + method: 'delete' + }) +} + +// 批量删除资产 +export function delAssetBatch(ids) { + return request({ + url: '/asset/inventory/batch', + method: 'delete', + data: { ids } + }) +} + +// 导出资产清单 +export function exportAsset(query) { + return request({ + url: '/asset/inventory/export', + method: 'get', + params: query, + responseType: 'blob' + }) +} + +// 下载导入模板 +export function downloadTemplate() { + return request({ + url: '/asset/inventory/template', + method: 'get', + responseType: 'blob' + }) +} + +// 导入资产数据 +export function importAsset(file) { + const formData = new FormData() + formData.append('file', file) + return request({ + url: '/asset/inventory/import', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 获取资产分类树形列表 +export function listAssetClassTree() { + return request({ + url: '/asset/class/tree', + method: 'get' + }) +} + +// 获取资产位置树形列表 +export function listAssetLocationTree() { + return request({ + url: '/asset/location/tree', + method: 'get' + }) +} + +// 获取公司列表 +export function listCompanies() { + return request({ + url: '/system/company/list', + method: 'get' + }) +} + +// 获取用户列表(用于选择管理员) +export function listUsers(query) { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 打印资产标签 +export function printAssetLabel(ids) { + return request({ + url: '/asset/inventory/print', + method: 'post', + data: { ids } + }) +} + +// 获取资产状态列表 +export function getAssetStatusOptions() { + return request({ + url: '/asset/inventory/status/options', + method: 'get' + }) +} + +// 上传资产照片 +export function uploadAssetImage(file) { + const formData = new FormData() + formData.append('file', file) + return request({ + url: '/common/upload', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} \ No newline at end of file diff --git a/pc/src/api/asset/label.js b/pc/src/api/asset/label.js new file mode 100644 index 0000000..aded6bc --- /dev/null +++ b/pc/src/api/asset/label.js @@ -0,0 +1,77 @@ +import request from '@/utils/request' + +// 查询标签模板列表 +export function listLabelTemplates() { + return request({ + url: '/asset/label/template/list', + method: 'get' + }) +} + +// 获取标签模板详情 +export function getLabelTemplate(id) { + return request({ + url: '/asset/label/template/' + id, + method: 'get' + }) +} + +// 添加标签模板 +export function addLabelTemplate(data) { + return request({ + url: '/asset/label/template', + method: 'post', + data: data + }) +} + +// 更新标签模板 +export function updateLabelTemplate(data) { + return request({ + url: '/asset/label/template', + method: 'put', + data: data + }) +} + +// 删除标签模板 +export function deleteLabelTemplate(id) { + return request({ + url: '/asset/label/template/' + id, + method: 'delete' + }) +} + +// 设置默认模板 +export function setDefaultTemplate(id) { + return request({ + url: '/asset/label/template/default/' + id, + method: 'put' + }) +} + +// 获取可用的标签字段 +export function getLabelFields() { + return request({ + url: '/asset/label/fields', + method: 'get' + }) +} + +// 打印标签预览 +export function previewLabel(data) { + return request({ + url: '/asset/label/preview', + method: 'post', + data: data + }) +} + +// 打印标签 +export function printLabel(data) { + return request({ + url: '/asset/label/print', + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/pc/src/api/asset/location.js b/pc/src/api/asset/location.js index 0b2db40..211ac39 100644 --- a/pc/src/api/asset/location.js +++ b/pc/src/api/asset/location.js @@ -2,17 +2,31 @@ import request from '@/utils/request' // 查询资产位置列表 export function listLocation(query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'locationCode') { + params.location_code = query[key] + } else if (key === 'locationName') { + params.location_name = query[key] + } else { + params[key] = query[key] + } + }) + } + return request({ - url: '/asset/location/list', + url: '/asset/locations/list', method: 'get', - params: query + params: params }) } // 查询资产位置详情 export function getLocation(id) { return request({ - url: '/asset/location/' + id, + url: '/asset/locations/' + id, method: 'get' }) } @@ -20,7 +34,7 @@ export function getLocation(id) { // 新增资产位置 export function addLocation(data) { return request({ - url: '/asset/location', + url: '/asset/locations/create', method: 'post', data: data }) @@ -29,68 +43,134 @@ export function addLocation(data) { // 修改资产位置 export function updateLocation(data) { return request({ - url: '/asset/location', + url: '/asset/locations/' + data.id, method: 'put', data: data }) } // 删除资产位置 -export function delLocation(id) { +export function delLocation(id, lastModUserId) { return request({ - url: '/asset/location/' + id, - method: 'delete' + url: '/asset/locations/' + id, + method: 'delete', + params: lastModUserId ? { lastModUserId } : {} }) } // 禁用资产位置 export function disableLocation(id, lastModUserId) { return request({ - url: '/asset/location/disable/' + id, + url: '/asset/locations/' + id + '/status/disable', method: 'put', - params: { lastModUserId } + params: lastModUserId ? { lastModUserId } : {} }) } // 启用资产位置 export function enableLocation(id, lastModUserId) { return request({ - url: '/asset/location/enable/' + id, + url: '/asset/locations/' + id + '/status/enable', method: 'put', - params: { lastModUserId } + params: lastModUserId ? { lastModUserId } : {} }) } // 批量删除资产位置 export function delLocationBatch(ids, lastModUserId) { return request({ - url: '/asset/location/batch/' + ids, + url: '/asset/locations/batch', method: 'delete', - params: { lastModUserId } + data: ids, + params: lastModUserId ? { lastModUserId } : {} }) } // 获取资产位置树形结构 -export function getLocationTree() { +export function getLocationTree(query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'locationCode') { + params.location_code = query[key] + } else if (key === 'locationName') { + params.location_name = query[key] + } else { + params[key] = query[key] + } + }) + } + return request({ - url: '/asset/location/tree', - method: 'get' + url: '/asset/locations/tree', + method: 'get', + params: params + }) +} + +// 根据父ID查询子位置 +export function getChildLocations(parentId, query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'locationCode') { + params.location_code = query[key] + } else if (key === 'locationName') { + params.location_name = query[key] + } else { + params[key] = query[key] + } + }) + } + + return request({ + url: '/asset/locations/children/' + parentId, + method: 'get', + params: params }) } // 检查位置是否被使用 export function checkLocationInUse(id) { return request({ - url: '/asset/location/' + id + '/check', + url: '/asset/locations/' + id + '/check', method: 'get' }) } +// 检查编码唯一性 +export function checkLocationCode(id, locationCode) { + return request({ + url: '/asset/locations/check/code', + method: 'get', + params: { + id: id, + location_code: locationCode + } + }) +} + // 导出资产位置 export function exportLocation(query) { + // 将驼峰命名转换为下划线命名 + const params = {} + if (query) { + Object.keys(query).forEach(key => { + if (key === 'locationCode') { + params.location_code = query[key] + } else if (key === 'locationName') { + params.location_name = query[key] + } else { + params[key] = query[key] + } + }) + } + return request({ - url: '/asset/location/export', + url: '/asset/locations/export', method: 'get', - params: query + params: params }) } \ No newline at end of file diff --git a/pc/src/api/room.js b/pc/src/api/room.js new file mode 100644 index 0000000..4496ed6 --- /dev/null +++ b/pc/src/api/room.js @@ -0,0 +1,199 @@ +import request from '@/utils/request' + +// 查询房源列表 +export function listRoom(query) { + return request({ + url: '/room/list', + method: 'get', + params: query + }) +} + +// 查询房源详细信息 +export function getRoom(id) { + return request({ + url: '/room/' + id, + method: 'get' + }) +} + +// 新增房源 +export function addRoom(data) { + return request({ + url: '/room', + method: 'post', + data: data + }) +} + +// 修改房源 +export function updateRoom(data) { + return request({ + url: '/room', + method: 'put', + data: data + }) +} + +// 删除房源 +export function delRoom(id) { + return request({ + url: '/room/' + id, + method: 'delete' + }) +} + +// 批量删除房源 +export function delRoomBatch(ids) { + return request({ + url: '/room/batch/' + ids, + method: 'delete' + }) +} + +// 导出房源 +export function exportRoom(query) { + return request({ + url: '/room/template/export/batch', + method: 'post', + data: query, + responseType: 'blob' + }) +} + +// 下载导入模板 +export function downloadTemplate() { + return request({ + url: '/room/template/download', + method: 'get', + responseType: 'blob' + }) +} + +// 导入房源数据 +export function importRoom(file) { + const formData = new FormData() + formData.append('file', file) + return request({ + url: '/room/import', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 查询房源标签列表 +export function listRoomTags() { + return request({ + url: '/room/tags', + method: 'get' + }) +} + +// 获取项目列表 +export function listProjects() { + return request({ + url: '/project/list', + method: 'get' + }) +} + +// 获取楼宇列表 +export function listBuildings(projectId) { + return request({ + url: '/building/list', + method: 'get', + params: { projectId } + }) +} + +// 获取楼层列表 +export function listFloors(buildingId) { + return request({ + url: '/building/floors', + method: 'get', + params: { buildingId } + }) +} + +// 远程调用 - 获取业户列表 +export function listOwners(query) { + return request({ + url: '/customer/owners', + method: 'get', + params: query + }) +} + +// 远程调用 - 检查房源合同状态 +export function checkRoomContractStatus(roomId) { + return request({ + url: '/contract/check/room/' + roomId, + method: 'get' + }) +} + +// 修改房源租赁状态 +export function updateRoomLeaseStatus(id, status) { + return request({ + url: '/room/lease-status', + method: 'put', + data: { id, status } + }) +} + +// 检查房号是否存在 +export function checkRoomNumberExists(params) { + return request({ + url: '/room/check-number', + method: 'get', + params: params + }) +} + +// 获取房源图片列表 +export function listRoomImages(params) { + return request({ + url: '/room/images', + method: 'get', + params: params + }) +} + +// 上传房源图片 +export function uploadRoomImage(roomId, imageType, file, sortOrder) { + const formData = new FormData() + formData.append('roomId', roomId) + formData.append('imageType', imageType) + formData.append('file', file) + if (sortOrder !== undefined) { + formData.append('sortOrder', sortOrder) + } + return request({ + url: '/room/upload', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 删除房源图片 +export function deleteRoomImage(id) { + return request({ + url: '/room/image/' + id, + method: 'delete' + }) +} + +// 批量删除房源图片 +export function batchDeleteRoomImages(ids) { + return request({ + url: '/room/images/batch', + method: 'delete', + data: { ids } + }) +} \ No newline at end of file diff --git a/pc/src/assets/images/code.png b/pc/src/assets/images/code.png new file mode 100644 index 0000000..67f1ea1 Binary files /dev/null and b/pc/src/assets/images/code.png differ diff --git a/pc/src/assets/images/qrcode.svg b/pc/src/assets/images/qrcode.svg new file mode 100644 index 0000000..9a30208 --- /dev/null +++ b/pc/src/assets/images/qrcode.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pc/src/main.js b/pc/src/main.js index 301bdd2..2750dc4 100644 --- a/pc/src/main.js +++ b/pc/src/main.js @@ -9,6 +9,17 @@ import './assets/styles/index.scss' Vue.use(ElementUI) Vue.config.productionTip = false +// 添加下载方法 +Vue.prototype.download = function(res, fileName) { + // 创建blob链接 + const blob = new Blob([res.data]) + const link = document.createElement('a') + link.href = URL.createObjectURL(blob) + link.download = fileName + link.click() + URL.revokeObjectURL(link.href) +} + new Vue({ router, store, diff --git a/pc/src/router/index.js b/pc/src/router/index.js index 49d5014..1dad385 100644 --- a/pc/src/router/index.js +++ b/pc/src/router/index.js @@ -45,6 +45,18 @@ const routes = [ component: () => import('@/views/asset/classification/index'), name: 'AssetClassification', meta: { title: '资产分类设置', icon: 'el-icon-folder' } + }, + { + path: 'inventory', + component: () => import('@/views/asset/inventory/index'), + name: 'AssetInventory', + meta: { title: '资产清单管理', icon: 'el-icon-files' } + }, + { + path: 'labelPage', + component: () => import('@/views/asset/labelPage/index'), + name: 'AssetLabel', + meta: { title: '资产标签设置', icon: 'el-icon-printer' } } ] } diff --git a/pc/src/router/modules/project.js b/pc/src/router/modules/project.js index 4af4c1c..ef3de56 100644 --- a/pc/src/router/modules/project.js +++ b/pc/src/router/modules/project.js @@ -16,6 +16,12 @@ export default { name: 'BuildingList', component: () => import('@/views/project/building/index'), meta: { title: '楼宇列表' } + }, + { + path: 'room', + name: 'RoomList', + component: () => import('@/views/project/room/index'), + meta: { title: '房源列表' } } ] } \ No newline at end of file diff --git a/pc/src/utils/request.js b/pc/src/utils/request.js index d10724c..af434e2 100644 --- a/pc/src/utils/request.js +++ b/pc/src/utils/request.js @@ -4,7 +4,7 @@ import { Message } from 'element-ui' // 创建axios实例 const service = axios.create({ // baseURL: '/api', // 修改为相对路径,使用代理 - baseURL: 'http://192.168.137.38:8080/api', // 接口地址 + baseURL: 'http://192.168.137.3:8080/api', // 接口地址 timeout: 10000 // 请求超时时间 }) @@ -24,15 +24,20 @@ service.interceptors.request.use( // 响应拦截器 service.interceptors.response.use( response => { + // 如果是blob类型(文件下载),直接返回 + if (response.config.responseType === 'blob') { + return response + } + const res = response.data - // 如果返回的状态码不是200,则判断为错误 + // 如果返回的状态码不是000000,则判断为错误 if (res.code !== '000000') { Message({ - message: res.message || '系统错误', + message: res.msg || '系统错误', type: 'error', duration: 5 * 1000 }) - return Promise.reject(new Error(res.message || '系统错误')) + return Promise.reject(new Error(res.msg || '系统错误')) } else { return res } diff --git a/pc/src/views/asset/classification/index.vue b/pc/src/views/asset/classification/index.vue index 2f94d8b..fbc49c6 100644 --- a/pc/src/views/asset/classification/index.vue +++ b/pc/src/views/asset/classification/index.vue @@ -4,17 +4,24 @@
+
+ 资产分类 +
+ {{ node.label }} + + ({{ data.children.length }}) +
@@ -26,11 +33,18 @@
分类列表 新增分类 + 批量删除
@@ -53,10 +67,21 @@ - + + - + + + + + \ No newline at end of file diff --git a/pc/src/views/asset/inventory/components/AssetForm.vue b/pc/src/views/asset/inventory/components/AssetForm.vue new file mode 100644 index 0000000..ef1dfa7 --- /dev/null +++ b/pc/src/views/asset/inventory/components/AssetForm.vue @@ -0,0 +1,471 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/asset/inventory/components/AssetLabelPrint.vue b/pc/src/views/asset/inventory/components/AssetLabelPrint.vue new file mode 100644 index 0000000..d000a60 --- /dev/null +++ b/pc/src/views/asset/inventory/components/AssetLabelPrint.vue @@ -0,0 +1,358 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/asset/inventory/index.vue b/pc/src/views/asset/inventory/index.vue new file mode 100644 index 0000000..690f7f9 --- /dev/null +++ b/pc/src/views/asset/inventory/index.vue @@ -0,0 +1,664 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/asset/labelPage/index.vue b/pc/src/views/asset/labelPage/index.vue new file mode 100644 index 0000000..226672e --- /dev/null +++ b/pc/src/views/asset/labelPage/index.vue @@ -0,0 +1,718 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/asset/location/index.vue b/pc/src/views/asset/location/index.vue index 1bd437e..ac33dab 100644 --- a/pc/src/views/asset/location/index.vue +++ b/pc/src/views/asset/location/index.vue @@ -4,17 +4,25 @@
+
+ 资产位置 + +
+ {{ node.label }} + + ({{ data.children.length }}) +
@@ -26,11 +34,18 @@
位置列表 新增位置 + 批量删除
@@ -53,10 +68,22 @@ - + + - + + + + + + \ No newline at end of file diff --git a/pc/src/views/project/room/components/RoomForm.vue b/pc/src/views/project/room/components/RoomForm.vue new file mode 100644 index 0000000..b83b16d --- /dev/null +++ b/pc/src/views/project/room/components/RoomForm.vue @@ -0,0 +1,841 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/project/room/index.vue b/pc/src/views/project/room/index.vue new file mode 100644 index 0000000..5579f51 --- /dev/null +++ b/pc/src/views/project/room/index.vue @@ -0,0 +1,653 @@ + + + + + \ No newline at end of file