diff --git a/.env b/.env
index ba876f5..01b86ef 100644
Binary files a/.env and b/.env differ
diff --git a/src/types/equipment.d.ts b/src/types/equipment.d.ts
index ed61ae4..51c1752 100644
--- a/src/types/equipment.d.ts
+++ b/src/types/equipment.d.ts
@@ -11,6 +11,18 @@ export interface EquipmentPageQuery {
useStatus?: string
projectId?: string
userId?: string
+ equipmentModel?: string
+ specification?: string
+ physicalLocation?: string
+ supplierName?: string
+ maintenancePerson?: string
+ inventoryBarcode?: string
+ assetRemark?: string
+ // 新增搜索字段
+ usingDepartment?: string
+ invoice?: string
+ barcode?: string
+ importer?: string
page?: number
pageSize?: number
orderBy?: string
@@ -50,6 +62,26 @@ export interface EquipmentReq {
maintenancePerson?: string
inventoryBarcode?: string
assetRemark?: string
+ // 新增字段
+ usingDepartment?: string
+ borrowingTime?: string
+ returnTime?: string
+ outStockTime?: string
+ totalUsageTime?: string
+ depreciationRate?: number
+ depreciationMethodDesc?: string
+ invoice?: string
+ invoiceStatus?: string
+ attachments?: string
+ photos?: string
+ barcode?: string
+ importer?: string
+ inventoryTimeStatus1?: string
+ inventoryTimeStatus2?: string
+ inventoryTimeStatus3?: string
+ inventoryCheckTimeStatus1?: string
+ inventoryCheckTimeStatus2?: string
+ inventoryCheckTimeStatus3?: string
}
export interface EquipmentResp {
@@ -90,6 +122,26 @@ export interface EquipmentResp {
maintenancePerson?: string
inventoryBarcode?: string
assetRemark?: string
+ // 新增字段
+ usingDepartment?: string
+ borrowingTime?: string
+ returnTime?: string
+ outStockTime?: string
+ totalUsageTime?: string
+ depreciationRate?: number
+ depreciationMethodDesc?: string
+ invoice?: string
+ invoiceStatus?: string
+ attachments?: string
+ photos?: string
+ barcode?: string
+ importer?: string
+ inventoryTimeStatus1?: string
+ inventoryTimeStatus2?: string
+ inventoryTimeStatus3?: string
+ inventoryCheckTimeStatus1?: string
+ inventoryCheckTimeStatus2?: string
+ inventoryCheckTimeStatus3?: string
projectId?: string
projectName?: string
userId?: string
diff --git a/src/utils/http.ts b/src/utils/http.ts
index fd795f0..891c9cb 100644
--- a/src/utils/http.ts
+++ b/src/utils/http.ts
@@ -30,7 +30,7 @@ const StatusCodeMessage: ICodeMessage = {
}
const http: AxiosInstance = axios.create({
- baseURL: import.meta.env.VITE_API_PREFIX ?? import.meta.env.VITE_API_BASE_URL,
+ baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 30 * 1000,
})
diff --git a/src/views/system-resource/device-management/components/DeviceModal.vue b/src/views/system-resource/device-management/components/DeviceModal.vue
index d958205..db10a43 100644
--- a/src/views/system-resource/device-management/components/DeviceModal.vue
+++ b/src/views/system-resource/device-management/components/DeviceModal.vue
@@ -213,6 +213,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -224,6 +226,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -238,6 +242,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -249,6 +255,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -263,6 +271,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -274,6 +284,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -382,6 +394,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -407,6 +421,8 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
/>
@@ -418,6 +434,144 @@
:disabled="isView"
style="width: 100%"
show-time
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -436,6 +590,112 @@
:max-length="1000"
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -492,6 +752,7 @@ const tabs = [
{ key: 'time', label: '时间与金额' },
{ key: 'purchase', label: '采购及相关信息' },
{ key: 'maintenance', label: '维保与健康信息' },
+ { key: 'usage', label: '使用与盘点信息' },
{ key: 'remark', label: '备注信息' },
]
@@ -544,6 +805,27 @@ const formData = ref({
// 备注信息字段
assetRemark: '',
+
+ // 新增字段
+ usingDepartment: '',
+ borrowingTime: '',
+ returnTime: '',
+ outStockTime: '',
+ totalUsageTime: '',
+ depreciationRate: undefined,
+ depreciationMethodDesc: '',
+ invoice: '',
+ invoiceStatus: '',
+ attachments: '',
+ photos: '',
+ barcode: '',
+ importer: '',
+ inventoryTimeStatus1: '',
+ inventoryTimeStatus2: '',
+ inventoryTimeStatus3: '',
+ inventoryCheckTimeStatus1: '',
+ inventoryCheckTimeStatus2: '',
+ inventoryCheckTimeStatus3: '',
})
// 表单验证规则
@@ -769,6 +1051,27 @@ const resetFormData = () => {
// 备注信息字段
assetRemark: '',
+
+ // 新增字段
+ usingDepartment: '',
+ borrowingTime: '',
+ returnTime: '',
+ outStockTime: '',
+ totalUsageTime: '',
+ depreciationRate: undefined,
+ depreciationMethodDesc: '',
+ invoice: '',
+ invoiceStatus: '',
+ attachments: '',
+ photos: '',
+ barcode: '',
+ importer: '',
+ inventoryTimeStatus1: '',
+ inventoryTimeStatus2: '',
+ inventoryTimeStatus3: '',
+ inventoryCheckTimeStatus1: '',
+ inventoryCheckTimeStatus2: '',
+ inventoryCheckTimeStatus3: '',
}
}
@@ -841,6 +1144,27 @@ const handleSubmit = async () => {
maintenancePerson: formData.value.maintenancePerson?.trim(),
inventoryBarcode: formData.value.inventoryBarcode?.trim(),
assetRemark: formData.value.assetRemark?.trim(),
+
+ // 新增字段
+ usingDepartment: formData.value.usingDepartment?.trim(),
+ borrowingTime: formData.value.borrowingTime,
+ returnTime: formData.value.returnTime,
+ outStockTime: formData.value.outStockTime,
+ totalUsageTime: formData.value.totalUsageTime?.trim(),
+ depreciationRate: formData.value.depreciationRate,
+ depreciationMethodDesc: formData.value.depreciationMethodDesc?.trim(),
+ invoice: formData.value.invoice?.trim(),
+ invoiceStatus: formData.value.invoiceStatus?.trim(),
+ attachments: formData.value.attachments?.trim(),
+ photos: formData.value.photos?.trim(),
+ barcode: formData.value.barcode?.trim(),
+ importer: formData.value.importer?.trim(),
+ inventoryTimeStatus1: formData.value.inventoryTimeStatus1?.trim(),
+ inventoryTimeStatus2: formData.value.inventoryTimeStatus2?.trim(),
+ inventoryTimeStatus3: formData.value.inventoryTimeStatus3?.trim(),
+ inventoryCheckTimeStatus1: formData.value.inventoryCheckTimeStatus1?.trim(),
+ inventoryCheckTimeStatus2: formData.value.inventoryCheckTimeStatus2?.trim(),
+ inventoryCheckTimeStatus3: formData.value.inventoryCheckTimeStatus3?.trim(),
}
// 调用API
@@ -917,6 +1241,27 @@ const fillTestData = () => {
// 备注信息字段
assetRemark: '这是一台测试设备,用于系统功能验证和演示。设备性能良好,维护记录完整。',
+
+ // 新增字段
+ usingDepartment: '技术部-张三',
+ borrowingTime: '2025-01-15 09:00:00',
+ returnTime: '',
+ outStockTime: '2025-01-15 09:00:00',
+ totalUsageTime: '120小时',
+ depreciationRate: 20.00,
+ depreciationMethodDesc: '直线折旧法,年折旧率20%',
+ invoice: 'INV20250101001',
+ invoiceStatus: '已开具',
+ attachments: '设备说明书.pdf,保修卡.pdf',
+ photos: '设备正面.jpg,设备侧面.jpg',
+ barcode: 'BAR20250101001',
+ importer: '系统管理员',
+ inventoryTimeStatus1: '2025-01-01 已完成',
+ inventoryTimeStatus2: '2025-04-01 待盘点',
+ inventoryTimeStatus3: '2025-07-01 待盘点',
+ inventoryCheckTimeStatus1: '2025-01-01 已核对',
+ inventoryCheckTimeStatus2: '2025-04-01 待核对',
+ inventoryCheckTimeStatus3: '2025-07-01 待核对',
}
Message.success('已填充完整测试数据')
}
diff --git a/src/views/system-resource/device-management/components/EquipmentSearch.vue b/src/views/system-resource/device-management/components/EquipmentSearch.vue
new file mode 100644
index 0000000..be26ad4
--- /dev/null
+++ b/src/views/system-resource/device-management/components/EquipmentSearch.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+ 设备搜索
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/system-resource/device-management/index.vue b/src/views/system-resource/device-management/index.vue
index c1bb46c..c2f96cf 100644
--- a/src/views/system-resource/device-management/index.vue
+++ b/src/views/system-resource/device-management/index.vue
@@ -1,68 +1,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 搜索
-
-
-
-
-
- 重置
-
-
-
-
+
+
@@ -189,6 +132,7 @@ import { Modal } from '@arco-design/web-vue'
import { IconPlus, IconRefresh, IconSearch } from '@arco-design/web-vue/es/icon'
import message from '@arco-design/web-vue/es/message'
import DeviceModal from './components/DeviceModal.vue'
+import EquipmentSearch from './components/EquipmentSearch.vue'
import router from '@/router'
import {
assignEquipment,
@@ -200,14 +144,7 @@ import type { EquipmentPageQuery, EquipmentResp } from '@/types/equipment.d'
defineOptions({ name: 'EquipmentCenter' })
-// 搜索表单
-const searchForm = reactive({
- equipmentName: '',
- equipmentType: '',
- equipmentStatus: '',
- locationStatus: '',
- healthStatus: '',
-})
+// 搜索表单引用
// 表格数据
const tableData = ref([])
@@ -356,42 +293,15 @@ const columns = [
]
// 下拉选项
-const equipmentTypeOptions = [
- { label: '检测设备', value: '1' },
- { label: '安全设备', value: '2' },
- { label: '车辆', value: '3' },
-]
-
-const equipmentStatusOptions = [
- { label: '正常', value: 'normal' },
- { label: '维修中', value: 'maintenance' },
- { label: '报废', value: 'scrapped' },
-]
-
-const locationStatusOptions = [
- { label: '库存中', value: 'in_stock' },
- { label: '已分配', value: 'allocated' },
- { label: '维修中', value: 'repair' },
- { label: '待报废', value: 'scrap' },
- { label: '已报废', value: 'scrapped' },
- { label: '外借中', value: 'borrowed' },
- { label: '丢失', value: 'lost' },
-]
-
-const healthStatusOptions = [
- { label: '优秀', value: 'excellent' },
- { label: '良好', value: 'good' },
- { label: '一般', value: 'normal' },
- { label: '较差', value: 'poor' },
- { label: '差', value: 'bad' },
-]
// 获取设备类型文本
const getEquipmentTypeText = (type: string) => {
const typeMap: Record = {
- 1: '检测设备',
- 2: '安全设备',
- 3: '车辆',
+ detection: '检测设备',
+ maintain: '维修设备',
+ security: '安全设备',
+ office: '办公设备',
+ car: '车辆',
}
return typeMap[type] || type
}
@@ -399,9 +309,11 @@ const getEquipmentTypeText = (type: string) => {
// 获取设备类型颜色
const getEquipmentTypeColor = (type: string) => {
const colorMap: Record = {
- 1: 'blue',
- 2: 'green',
- 3: 'orange',
+ detection: 'blue',
+ maintain: 'green',
+ security: 'orange',
+ office: 'purple',
+ car: 'red',
}
return colorMap[type] || 'default'
}
@@ -410,8 +322,9 @@ const getEquipmentTypeColor = (type: string) => {
const getEquipmentStatusText = (status: string) => {
const statusMap: Record = {
normal: '正常',
- maintenance: '维修中',
- scrapped: '报废',
+ repair: '维修中',
+ maintain: '保养中',
+ scrap: '报废',
}
return statusMap[status] || status
}
@@ -420,8 +333,9 @@ const getEquipmentStatusText = (status: string) => {
const getEquipmentStatusColor = (status: string) => {
const colorMap: Record = {
normal: 'green',
- maintenance: 'orange',
- scrapped: 'red',
+ repair: 'orange',
+ maintain: 'blue',
+ scrap: 'red',
}
return colorMap[status] || 'default'
}
@@ -482,8 +396,9 @@ const getHealthStatusColor = (status: string) => {
const getStatusDotClass = (status: string) => {
const classMap: Record = {
normal: 'normal-dot',
- maintenance: 'maintenance-dot',
- scrapped: 'scrapped-dot',
+ repair: 'maintenance-dot',
+ maintain: 'maintenance-dot',
+ scrap: 'scrapped-dot',
}
return classMap[status] || 'normal-dot'
}
@@ -520,63 +435,55 @@ const transformBackendData = (data: any[]) => {
console.log('转换前的数据:', data)
return data.map((item) => {
console.log('处理单个项目:', item)
+
+ // 格式化时间字段
+ const formatDateTime = (dateTime: any) => {
+ if (!dateTime) return ''
+ try {
+ return new Date(dateTime).toLocaleString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ })
+ // eslint-disable-next-line unused-imports/no-unused-vars
+ } catch (error) {
+ return dateTime
+ }
+ }
+
+ // 直接返回后端数据,只格式化时间字段
return {
- equipmentId: item.equipmentId || item.id,
- assetCode: item.assetCode,
- equipmentName: item.equipmentName || item.name,
- equipmentType: item.equipmentType || item.type,
- equipmentTypeLabel: item.equipmentTypeLabel,
- equipmentModel: item.equipmentModel || item.model,
- equipmentSn: item.equipmentSn || item.sn,
- brand: item.brand,
- specification: item.specification,
- equipmentStatus: item.equipmentStatus || item.status,
- equipmentStatusLabel: item.equipmentStatusLabel,
- useStatus: item.useStatus,
- locationStatus: item.locationStatus,
- locationStatusLabel: item.locationStatusLabel,
- physicalLocation: item.physicalLocation,
- responsiblePerson: item.responsiblePerson,
- healthStatus: item.healthStatus,
- healthStatusLabel: item.healthStatusLabel,
- purchaseTime: item.purchaseTime,
- inStockTime: item.inStockTime,
- activationTime: item.activationTime,
- expectedScrapTime: item.expectedScrapTime,
- actualScrapTime: item.actualScrapTime,
- statusChangeTime: item.statusChangeTime,
- purchaseOrder: item.purchaseOrder,
- supplierName: item.supplierName,
- purchasePrice: item.purchasePrice,
- currentNetValue: item.currentNetValue,
- depreciationMethod: item.depreciationMethod,
- depreciationYears: item.depreciationYears,
- salvageValue: item.salvageValue,
- warrantyExpireDate: item.warrantyExpireDate,
- lastMaintenanceDate: item.lastMaintenanceDate,
- nextMaintenanceDate: item.nextMaintenanceDate,
- maintenancePerson: item.maintenancePerson,
- inventoryBarcode: item.inventoryBarcode,
- assetRemark: item.assetRemark,
- projectId: item.projectId,
- projectName: item.projectName,
- userId: item.userId,
- name: item.name,
- createTime: item.createTime ? new Date(item.createTime).toLocaleString() : '',
- updateTime: item.updateTime ? new Date(item.updateTime).toLocaleString() : '',
+ ...item,
+ createTime: formatDateTime(item.createTime),
+ updateTime: formatDateTime(item.updateTime),
+ purchaseTime: formatDateTime(item.purchaseTime),
+ inStockTime: formatDateTime(item.inStockTime),
+ activationTime: formatDateTime(item.activationTime),
+ expectedScrapTime: formatDateTime(item.expectedScrapTime),
+ actualScrapTime: formatDateTime(item.actualScrapTime),
+ statusChangeTime: formatDateTime(item.statusChangeTime),
+ warrantyExpireDate: formatDateTime(item.warrantyExpireDate),
+ lastMaintenanceDate: formatDateTime(item.lastMaintenanceDate),
+ nextMaintenanceDate: formatDateTime(item.nextMaintenanceDate),
}
})
}
// 加载数据
-const loadData = async () => {
+const loadData = async (searchParams?: EquipmentPageQuery) => {
loading.value = true
try {
const params = {
pageSize: pagination.pageSize,
page: pagination.current,
- ...searchForm, // 添加搜索条件
+ ...(searchParams || {}), // 添加搜索条件
}
+
+ console.log('发送的请求参数:', params)
+ console.log('当前分页配置:', pagination)
+
const res = await pageEquipment(params)
console.log('API响应:', res)
@@ -622,20 +529,13 @@ const loadData = async () => {
}
// 搜索
-const handleSearch = () => {
+const handleSearch = (searchParams: EquipmentPageQuery) => {
pagination.current = 1
- loadData()
+ loadData(searchParams)
}
// 重置
const handleReset = () => {
- Object.assign(searchForm, {
- equipmentName: '',
- equipmentType: '',
- equipmentStatus: '',
- locationStatus: '',
- healthStatus: '',
- })
pagination.current = 1
loadData()
}
@@ -712,17 +612,68 @@ const handleReturn = async (record: EquipmentResp) => {
// 删除
const handleDelete = async (record: EquipmentResp) => {
+ // 检查设备状态,提供更详细的确认信息
+ let confirmContent = `确定要删除设备"${record.equipmentName}"吗?`
+ let canDelete = true
+ let statusWarning = ''
+
+ // 检查设备使用状态
+ if (record.useStatus === '1') {
+ canDelete = false
+ statusWarning = '该设备正在使用中,无法删除。请先归还设备后再进行删除操作。'
+ }
+
+ // 检查设备位置状态
+ if (record.locationStatus === 'allocated' || record.locationStatus === 'borrowed') {
+ canDelete = false
+ statusWarning = '该设备已分配或外借中,无法删除。请先归还设备后再进行删除操作。'
+ }
+
+ // 检查设备是否在维修中
+ if (record.locationStatus === 'repair' || record.equipmentStatus === 'repair') {
+ canDelete = false
+ statusWarning = '该设备正在维修中,无法删除。请等待维修完成后再进行删除操作。'
+ }
+
+ // 如果设备状态不允许删除,显示警告信息
+ if (!canDelete) {
+ Modal.warning({
+ title: '无法删除设备',
+ content: statusWarning,
+ okText: '确定',
+ hideCancel: true,
+ })
+ return
+ }
+
+ // 构建详细的确认信息
+ const deviceInfo = [
+ `设备名称:${record.equipmentName || '无'}`,
+ `资产编号:${record.assetCode || '无'}`,
+ `设备型号:${record.equipmentModel || '无'}`,
+ `序列号:${record.equipmentSn || '无'}`,
+ `当前状态:${getEquipmentStatusText(record.equipmentStatus || '')}`,
+ `位置状态:${getLocationStatusText(record.locationStatus || '')}`,
+ ].join('\n')
+
+ confirmContent = `确定要删除以下设备吗?\n\n${deviceInfo}\n\n⚠️ 删除后设备将被标记为已报废,此操作不可恢复!\n\n删除原因:\n• 设备信息本身不可更改,但可以通过删除操作标记为报废\n• 删除后设备将不再出现在正常列表中\n• 历史记录将被保留,不影响其他模块功能`
+
Modal.confirm({
- title: '确认删除',
- content: `确定要删除设备"${record.equipmentName}"吗?此操作不可恢复!`,
+ title: '确认删除设备',
+ content: confirmContent,
+ okText: '确认删除',
+ cancelText: '取消',
+ okButtonProps: { status: 'danger' },
onOk: async () => {
try {
await deleteEquipment(record.equipmentId)
- message.success('删除成功')
+ message.success('设备删除成功')
loadData()
} catch (error: any) {
console.error('删除失败:', error)
- message.error(error?.message || '删除失败')
+ // 根据后端返回的错误信息显示具体的错误提示
+ const errorMessage = error?.response?.data?.msg || error?.message || '删除失败'
+ message.error(errorMessage)
}
},
})