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 @@
- 分类管理视图
+
-
+
+
+
+
+
+
+
+ 设备类型
+ 使用部门
+ 存放位置
+
+
+
+
+
+ {{ data.label }}
+ {{ data.count }}
+
+
+
+
+
+
+
+
+ {{ dimensionLabel }}:{{ selectedNode.label }}({{ filteredList.length }} 台)
+
+ 点击左侧分类节点进行筛选
+
+
+
+
+
+
+
+
+
+ {{ statusLabel(row.Status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ statusCounts[item.value] || 0 }}
+
{{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ statusLabel(row.Status) }}
+
+
+
+ {{ fmtDateTime(row.UpdateTime || row.CreateTime) }}
+
+
+
+ 变更记录
+ 变更状态
+
+
+
+
+
+
+
+
+
+
+ {{ statusLabel(currentRow?.Status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
+
+ {{ statusLabel(row.FromStatus) }}
+
+ {{ statusLabel(row.ToStatus) }}
+
+
+
+ {{ fmtDateTime(row.ChangeTime) }}
+
+
+
+
+
+
+
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 }}
+ 保养超期
+
+
+
+
+
+
+
+
+
+
+
+ {{ calibrationOverdue(row) ? '超期' : '正常' }}
+
+
+
+
+ {{ fmtDate(row.LastCalibrationDate) || '-' }}
+
+
+
+
+ {{ fmtDate(row.NextCalibrationDate) || '-' }}
+
+
+
+
+ {{ fmtDate(row.InspectionDate) || '-' }}
+
+
+
+
+ {{ fmtDate(row.NextInspectionDate) || '-' }}
+
+
+
+
+
+
+ {{ maintenanceOverdue(row) ? '超期' : '正常' }}
+
+
+
+
+ {{ fmtDate(row.LastMaintenanceDate) || '-' }}
+
+
+
+
+ {{ fmtDate(row.NextMaintenanceDate) || '-' }}
+
+
+
+
+
+
+ {{ fmtDate(row.WarrantyExpireDate) || '-' }}
+
+
+
+
+
+
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 || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上传附件
+
+
+
+
+
+
+
+
+ {{ ATTACHMENT_TYPES[row.FileType] || '其他' }}
+
+
+
+ {{ fmtFileSize(row.FileSize) }}
+
+
+
+ {{ fmtDateTime(row.CreateTime) }}
+
+
+
+
+ 预览
+ 删除
+
+
+
+
+
+
+
+
+
+
+ {{ statusLabel(row.FromStatus) }}
+
+
+
+
+ {{ statusLabel(row.ToStatus) }}
+
+
+
+ {{ fmtDateTime(row.ChangeTime) }}
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {{ fmtDate(row.PurchaseDate) }}
+
+
- {{ row.status }}
+ {{ statusLabel(row.Status) }}
-
-
- 查看
- 编辑
- 删除
+
+
+ 详情
+ 编辑
+ 状态
+ 删除
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- 取消
- 确定
+ 取消
+ 保存
+
+
+
+
+
+
+ {{ statusForm.equipment?.Code }}
+
+ {{ statusLabel(statusForm.equipment?.Status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
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) }}
+ 未发生
+
+
+
+
+
+
+
+
+
+
+
+ {{ statusLabel(record.FromStatus) }}
+
+ {{ statusLabel(record.ToStatus) }}
+
+
+ {{ fmtDateTime(record.ChangeTime) }}
+ · 操作人:{{ record.Operator }}
+
+
+
+
+
+
+
+
+
+
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 @@
-
+
- 分类统计
+
-
+
+
+
+
+
+ {{ allEquipments.length }}
+ 设备总数(台)
+
+
+
+
+ {{ totalValue }}
+ 资产总值(元)
+
+
+
+
+ {{ inUseCount }}
+ 使用中(台)
+
+
+
+
+ {{ avgYears }}
+ 平均使用年限(年)
+
+
+
+
+
+
+
+
+ 按状态统计
+
+
+
+
+
+ 按设备类型统计
+
+
+
+
+
+
+
+ 按使用部门统计
+
+
+
+
+
+ 按使用年限统计
+
+
+
+
+
+
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
}
}
}