diff --git a/dist/index.html b/dist/index.html index 3b0bb80..a61abf0 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1,18 +1,19 @@ - - - - - - - 设备管理系统 - + + + + + + + 设备管理系统 + - - -
- - - + + +
+ + + + diff --git a/node_modules/.vite/deps/_metadata.json b/node_modules/.vite/deps/_metadata.json index 12a539d..0fda38f 100644 --- a/node_modules/.vite/deps/_metadata.json +++ b/node_modules/.vite/deps/_metadata.json @@ -2,7 +2,7 @@ "hash": "a6f0f194", "configHash": "147f2811", "lockfileHash": "77198382", - "browserHash": "0cd29ca6", + "browserHash": "ee71f75c", "optimized": { "@element-plus/icons-vue": { "src": "../../@element-plus/icons-vue/dist/index.js", diff --git a/src/api/equipment.js b/src/api/equipment.js index 6755b92..9235981 100644 --- a/src/api/equipment.js +++ b/src/api/equipment.js @@ -1,16 +1,79 @@ import request from '@/utils/request' -// 设备列表 -export const getEquipmentList = (params) => request.get('/equipment/list', { params }) +// 后端路由前缀(EquipmentController: [Route("api/asset/equipment")]) +const base = '/asset/equipment' + +// ============ 枚举常量(与后端 Model.Entity.Asset 枚举一一对应) ============ + +// 设备状态(EquipmentStatusEnum) +export const EQUIPMENT_STATUS = { + 1: { label: '待验收', tag: 'info' }, + 2: { label: '使用中', tag: 'success' }, + 3: { label: '已借出', tag: 'warning' }, + 4: { label: '闲置', tag: 'info' }, + 5: { label: '维修中', tag: 'danger' }, + 6: { label: '已停用', tag: 'info' }, + 7: { label: '待处置', tag: 'warning' }, + 8: { label: '已处置', tag: 'info' }, + 9: { label: '入库', tag: 'primary' } +} +export const statusOptions = Object.entries(EQUIPMENT_STATUS).map(([value, v]) => ({ value: Number(value), label: v.label })) +export const statusLabel = (s) => EQUIPMENT_STATUS[s]?.label || '未知' +export const statusTag = (s) => EQUIPMENT_STATUS[s]?.tag || 'info' + +// 合规状态(ComplianceStatusEnum) +export const COMPLIANCE_STATUS = { + 1: { label: '正常', tag: 'success' }, + 2: { label: '超期', tag: 'danger' } +} +export const complianceLabel = (s) => COMPLIANCE_STATUS[s]?.label || '未知' +export const complianceTag = (s) => COMPLIANCE_STATUS[s]?.tag || 'info' + +// 附件文件类型(AttachmentTypeEnum) +export const ATTACHMENT_TYPES = { + 1: '使用说明书', + 2: '合格证明', + 3: '校准证书', + 4: '保养卡', + 5: '合同扫描件', + 6: '验收照片', + 99: '其他' +} +export const attachmentTypeOptions = Object.entries(ATTACHMENT_TYPES).map(([value, label]) => ({ value: Number(value), label })) + +// ============ 设备台账接口 ============ + +// 设备列表(服务端分页;结果数组上附带 total 总记录数,来自响应头 X-Total-Count) +export const getEquipmentList = (params) => request.get(`${base}/list`, { params }) + +// 全部设备(不分页,供分类/统计/生命周期等视图使用) +export const getAllEquipment = () => request.get(`${base}/all`) // 设备详情 -export const getEquipmentDetail = (id) => request.get(`/equipment/${id}`) +export const getEquipmentDetail = (id) => request.get(`${base}/${id}`) // 新增设备 -export const addEquipment = (data) => request.post('/equipment', data) +export const addEquipment = (data) => request.post(base, data) // 修改设备 -export const updateEquipment = (id, data) => request.put(`/equipment/${id}`, data) +export const updateEquipment = (id, data) => request.put(`${base}/${id}`, data) -// 删除设备 -export const deleteEquipment = (id) => request.delete(`/equipment/${id}`) +// 删除设备(软删除) +export const deleteEquipment = (id) => request.delete(`${base}/${id}`) + +// 变更设备状态:{ Status, Operator, Remark } +export const changeEquipmentStatus = (id, data) => request.post(`${base}/${id}/status`, data) + +// 状态变更历史记录 +export const getStatusRecords = (id) => request.get(`${base}/${id}/status-records`) + +// ============ 设备附件接口 ============ + +// 附件列表 +export const getAttachments = (equipmentId) => request.get(`${base}/${equipmentId}/attachments`) + +// 附件上传地址(el-upload 的 action,绕过拦截器直传后端) +export const uploadAttachmentAction = (equipmentId) => `/api${base}/${equipmentId}/attachments` + +// 删除附件 +export const deleteAttachment = (attachmentId) => request.delete(`${base}/attachments/${attachmentId}`) diff --git a/src/utils/request.js b/src/utils/request.js index 33bc5a3..ade014d 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -25,7 +25,13 @@ request.interceptors.response.use( return Promise.reject(new Error(res.Msg || res.message)) } // 直接返回 Data,页面拿到的就是干净数据,不用每次再 .data - return res.Data ?? res.data + const data = res.Data ?? res.data + // 分页列表:透传服务端响应头 X-Total-Count(总记录数),以不可枚举属性挂在数组上,不影响遍历与序列化 + const totalCount = response.headers['x-total-count'] + if (Array.isArray(data) && totalCount !== undefined) { + Object.defineProperty(data, 'total', { value: Number(totalCount), enumerable: false }) + } + return data }, error => { ElMessage.error(error.message || '网络错误') diff --git a/src/views/asset/ledger/CategoryView.vue b/src/views/asset/ledger/CategoryView.vue index da476c9..29e056c 100644 --- a/src/views/asset/ledger/CategoryView.vue +++ b/src/views/asset/ledger/CategoryView.vue @@ -2,13 +2,287 @@
- + + + + +
+
+ + 设备类型 + 使用部门 + 存放位置 + + + + + +
+ +
+
+ + {{ dimensionLabel }}:{{ selectedNode.label }}({{ filteredList.length }} 台) + + 点击左侧分类节点进行筛选 +
+ + + + + + + + + + +
+
+
+ + + + + +
+
{{ statusCounts[item.value] || 0 }}
+ {{ item.label }} +
+
+
+ + + + + + + + + + + + + + + + +
+
+ + + + + + {{ statusLabel(currentRow?.Status) }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/src/views/asset/ledger/ComplianceView.vue b/src/views/asset/ledger/ComplianceView.vue index cd1b346..b2bba92 100644 --- a/src/views/asset/ledger/ComplianceView.vue +++ b/src/views/asset/ledger/ComplianceView.vue @@ -2,13 +2,158 @@
- + + + + + +
{{ allEquipments.length }}
+
设备总数
+
+
+ + +
{{ overdueCounts.calibration }}
+
校准超期
+
+
+ + +
{{ overdueCounts.inspection }}
+
检定超期
+
+
+ + +
{{ overdueCounts.maintenance }}
+
保养超期
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/src/views/asset/ledger/EquipmentInfo.vue b/src/views/asset/ledger/EquipmentInfo.vue index ff406fd..9d4ccb5 100644 --- a/src/views/asset/ledger/EquipmentInfo.vue +++ b/src/views/asset/ledger/EquipmentInfo.vue @@ -2,13 +2,220 @@
- + + + + + + + + {{ equipment.Code }} + {{ equipment.Name }} + {{ equipment.Type || '-' }} + {{ equipment.Brand || '-' }} + {{ equipment.Model || '-' }} + {{ equipment.Specifications || '-' }} + {{ equipment.Manufacturer || '-' }} + {{ equipment.Supplier || '-' }} + {{ equipment.QrCode || '-' }} + {{ equipment.Description || '-' }} + + + + {{ equipment.Department || '-' }} + {{ equipment.Location || '-' }} + {{ equipment.ResponsiblePerson || '-' }} + {{ equipment.ContactPhone || '-' }} + {{ equipment.Custodian || '-' }} + + + + {{ fmtDate(equipment.PurchaseDate) || '-' }} + {{ equipment.PurchasePrice ?? '-' }} + {{ fmtDate(equipment.WarrantyExpireDate) || '-' }} + {{ fmtDate(equipment.AcceptanceDate) || '-' }} + {{ fmtDate(equipment.EnableDate) || '-' }} + {{ equipment.ServiceLifeYears ? `${equipment.ServiceLifeYears} 年` : '-' }} + {{ fmtDate(equipment.ScrapDate) || '-' }} + {{ equipment.Remark || '-' }} + + + + + +
+ + + + + + + + 上传附件 + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + diff --git a/src/views/asset/ledger/Index.vue b/src/views/asset/ledger/Index.vue index 0718b00..bd57c17 100644 --- a/src/views/asset/ledger/Index.vue +++ b/src/views/asset/ledger/Index.vue @@ -4,41 +4,21 @@ - - - - - - - - - - - - + + - - - - - + + @@ -48,117 +28,349 @@ - - - - - - - - + + + + + + + + + + + + + - - diff --git a/src/views/asset/ledger/LifecycleView.vue b/src/views/asset/ledger/LifecycleView.vue index 362fdef..357c446 100644 --- a/src/views/asset/ledger/LifecycleView.vue +++ b/src/views/asset/ledger/LifecycleView.vue @@ -2,13 +2,153 @@
- + + + + + + + +
{{ equipment.Name }}
+
{{ equipment.Code }}
+ + {{ equipment.Type || '-' }} + {{ equipment.Department || '-' }} + {{ equipment.Location || '-' }} + {{ equipment.ResponsiblePerson || '-' }} + {{ equipment.Supplier || '-' }} + + {{ equipment.ServiceLifeYears ? `${equipment.ServiceLifeYears} 年` : '-' }} + + +
+
+ + + + + + + +
+ {{ stage.name }} + {{ fmtDate(stage.date) }} + 未发生 + {{ stage.extra }} +
+
+
+
+ + + + + +
+ {{ statusLabel(record.FromStatus) }} + + {{ statusLabel(record.ToStatus) }} +
+
+ {{ fmtDateTime(record.ChangeTime) }} + · 操作人:{{ record.Operator }} +
+
{{ record.Remark }}
+
+
+
+
+
+
+ + diff --git a/src/views/asset/ledger/Statistics.vue b/src/views/asset/ledger/Statistics.vue index e0c8916..687427c 100644 --- a/src/views/asset/ledger/Statistics.vue +++ b/src/views/asset/ledger/Statistics.vue @@ -1,14 +1,206 @@ + + diff --git a/vite.config.js b/vite.config.js index 3a4208c..843e0f8 100644 --- a/vite.config.js +++ b/vite.config.js @@ -12,11 +12,15 @@ export default defineConfig({ server: { port: 3000, open: true, - // 开发环境代理:/api 请求转发到后端服务,避免跨域 + // 开发环境代理:/api 请求转发到后端服务,避免跨域;/uploads 为设备附件静态文件与上传接口 proxy: { '/api': { target: 'http://localhost:5287', changeOrigin: true + }, + '/uploads': { + target: 'http://localhost:5287', + changeOrigin: true } } }