Files
WarehouseClient/src/views/Car/CarUseLog.vue

462 lines
12 KiB
Vue

<template>
<div class="car-use-log">
<el-card class="mb-4">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold text-blue-400">车辆出入库记录</h2>
</div>
<!-- 搜索栏 -->
<div class="search-bar mb-4 p-3 bg-blue-900/20 rounded">
<el-row :gutter="20">
<el-col :span="6">
<el-select
v-model="searchForm.carId"
placeholder="选择车辆"
size="small"
>
<el-option
v-for="item in carListOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-col>
<el-col :span="6">
<el-select
v-model="searchForm.action"
placeholder="动作类型"
size="small"
>
<el-option
v-for="item in actionOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-col>
<el-col :span="6">
<el-select
v-model="searchForm.actionUser"
placeholder="动作执行人员"
size="small"
>
<el-option
v-for="item in userListOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-col>
<el-col :span="6" class="text-right">
<el-button type="primary" size="small" @click="handleSearch">搜索</el-button>
<el-button size="small" @click="handleReset">重置</el-button>
</el-col>
</el-row>
</div>
<!-- 出入库记录表格 -->
<el-table
:data="logData"
style="width: 100%"
stripe
:row-key="row => row.Id"
>
<el-table-column
v-for="column in tableColumns"
:key="column.field"
:prop="column.field"
:label="column.title"
:width="column.width"
:align="column.align"
v-if="!column.hidden"
>
<template v-if="column.field === 'CarId'" slot-scope="scope">
<el-tag>{{ getCarLabel(scope.row.CarId) }}</el-tag>
</template>
<template v-else-if="column.field === 'Action'" slot-scope="scope">
<el-tag :type="getActionType(scope.row.Action)">{{ getActionLabel(scope.row.Action) }}</el-tag>
</template>
<template v-else-if="column.field === 'ActionUser'" slot-scope="scope">
<el-tag>{{ getUserLabel(scope.row.ActionUser) }}</el-tag>
</template>
<template v-else-if="column.field === 'CreateDate'" slot-scope="scope">
{{ formatDateTime(scope.row.CreateDate) }}
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="mt-4 flex justify-end">
<el-pagination
layout="prev, pager, next, jumper, sizes, total"
:total="total"
:page-size="pageSize"
:page-sizes="[10, 20, 50, 100]"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
/>
</div>
</el-card>
<!-- 新增记录弹窗 -->
<el-dialog
title="新增出入库记录"
:visible.sync="dialogVisible"
width="500px"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form
:model="formData"
:rules="rules"
ref="formRef"
label-width="120px"
class="mt-4"
>
<el-form-item label="车辆" prop="CarId">
<el-select v-model="formData.CarId" placeholder="请选择车辆">
<el-option
v-for="item in carListOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="动作" prop="Action">
<el-select v-model="formData.Action" placeholder="请选择动作类型">
<el-option
v-for="item in actionOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="动作执行人员" prop="ActionUser">
<el-select v-model="formData.ActionUser" placeholder="请选择执行人员">
<el-option
v-for="item in userListOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="动作时间" prop="CreateDate">
<el-date-picker
v-model="formData.CreateDate"
type="datetime"
placeholder="请选择动作时间"
style="width: 100%"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</div>
</el-dialog>
<!-- 操作按钮 -->
<div class="fixed bottom-4 right-4">
<el-button type="primary" icon="el-icon-plus" circle size="medium" @click="handleAdd" />
</div>
</div>
</template>
<script>
export default {
name: 'CarUseLog',
data() {
return {
// 表格数据
logData: [],
total: 0,
pageSize: 10,
currentPage: 1,
// 搜索表单
searchForm: {
carId: '',
action: '',
actionUser: ''
},
// 新增记录对话框
dialogVisible: false,
formData: {
Id: '',
CarId: '',
Action: '',
ActionUser: '',
CreateDate: ''
},
// 验证规则
rules: {
CarId: [
{ required: true, message: '请选择车辆', trigger: 'change' }
],
Action: [
{ required: true, message: '请选择动作类型', trigger: 'change' }
],
ActionUser: [
{ required: true, message: '请选择执行人员', trigger: 'change' }
],
CreateDate: [
{ required: true, message: '请选择动作时间', trigger: 'change' }
]
},
// 车辆列表选项
carListOptions: [
{ label: '京A12345', value: 1 },
{ label: '京B54321', value: 2 },
{ label: '京C67890', value: 3 }
],
// 动作类型选项
actionOptions: [
{ label: '出库', value: '出库' },
{ label: '入库', value: '入库' }
],
// 人员列表选项
userListOptions: [
{ label: '张三', value: '张三' },
{ label: '李四', value: '李四' },
{ label: '王五', value: '王五' },
{ label: '赵六', value: '赵六' }
]
}
},
computed: {
tableColumns() {
return [
{field:'Id',title:'车辆记录ID',type:'int',width:110,hidden:true,require:true,align:'left'},
{field:'CarId',title:'车辆',type:'int',bind:{ key:'车辆列表',data:[]},link:true,width:150,align:'left'},
{field:'Action',title:'动作(出库/入库)',type:'string',bind:{ key:'车辆出入状态',data:[]},width:150,align:'left'},
{field:'ActionUser',title:'动作执行人员',type:'string',bind:{ key:'人员列表',data:[]},width:150,align:'left'},
{field:'CreateDate',title:'动作时间',type:'datetime',width:180,align:'left'}
]
}
},
mounted() {
this.loadData()
},
methods: {
// 加载数据
loadData() {
// 模拟数据加载
this.logData = [
{
Id: 1,
CarId: 1,
Action: '出库',
ActionUser: '张三',
CreateDate: '2024-01-20 09:30:00'
},
{
Id: 2,
CarId: 1,
Action: '入库',
ActionUser: '张三',
CreateDate: '2024-01-20 18:45:00'
},
{
Id: 3,
CarId: 2,
Action: '出库',
ActionUser: '李四',
CreateDate: '2024-01-21 10:15:00'
},
{
Id: 4,
CarId: 3,
Action: '出库',
ActionUser: '王五',
CreateDate: '2024-01-21 14:20:00'
},
{
Id: 5,
CarId: 2,
Action: '入库',
ActionUser: '李四',
CreateDate: '2024-01-21 19:30:00'
}
]
this.total = this.logData.length
},
// 搜索
handleSearch() {
// 模拟搜索逻辑
console.log('搜索条件:', this.searchForm)
this.loadData()
},
// 重置
handleReset() {
this.searchForm = {
carId: '',
action: '',
actionUser: ''
}
this.loadData()
},
// 新增
handleAdd() {
this.formData = {
Id: '',
CarId: '',
Action: '',
ActionUser: '',
CreateDate: new Date()
}
this.dialogVisible = true
},
// 提交表单
handleSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
// 模拟提交操作
console.log('提交数据:', this.formData)
this.dialogVisible = false
this.loadData()
this.$message.success('记录添加成功')
}
})
},
// 分页处理
handleCurrentChange(val) {
this.currentPage = val
this.loadData()
},
handleSizeChange(val) {
this.pageSize = val
this.loadData()
},
// 格式化日期时间
formatDateTime(dateTime) {
if (!dateTime) return ''
const date = new Date(dateTime)
return date.toLocaleString('zh-CN')
},
// 获取车辆标签
getCarLabel(value) {
const item = this.carListOptions.find(opt => opt.value === value)
return item ? item.label : value
},
// 获取动作标签
getActionLabel(value) {
const item = this.actionOptions.find(opt => opt.value === value)
return item ? item.label : value
},
// 获取动作类型(用于标签颜色)
getActionType(value) {
return value === '出库' ? 'warning' : 'success'
},
// 获取用户标签
getUserLabel(value) {
const item = this.userListOptions.find(opt => opt.value === value)
return item ? item.label : value
}
}
}
</script>
<style scoped>
.car-use-log {
padding: 20px;
}
.search-bar {
margin-bottom: 20px;
}
/* 表格背景透明 */
:deep(.el-table) {
background-color: transparent !important;
}
:deep(.el-table__body-wrapper) {
background-color: transparent !important;
}
:deep(.el-table__row) {
background-color: transparent !important;
}
/* 表头透明 */
:deep(.el-table__header) {
background: transparent !important;
}
:deep(.el-table__header) th {
background: transparent !important;
background-color: transparent !important;
color: #68c9ff !important;
border-color: rgba(104, 201, 255, 0.3) !important;
}
/* 确保表头在各种状态下都保持透明 */
:deep(.el-table th.is-leaf) {
background: transparent !important;
background-color: transparent !important;
}
/* 表格边框 */
:deep(.el-table__row td) {
border-color: rgba(104, 201, 255, 0.2) !important;
color: #91d5ff !important;
}
/* 表格悬停效果 */
:deep(.el-table__row:hover td) {
background-color: rgba(104, 201, 255, 0.1) !important;
}
:deep(.el-dialog) {
background-color: rgba(0, 58, 97, 0.4) !important;
backdrop-filter: blur(8px);
border: 1px solid rgba(104, 201, 255, 0.3);
}
:deep(.el-dialog__header) {
background-color: rgba(0, 58, 97, 0.6) !important;
border-bottom: 1px solid rgba(104, 201, 255, 0.3);
}
:deep(.el-dialog__title) {
color: #91d5ff !important;
font-weight: 600;
}
:deep(.el-dialog__footer) {
background-color: rgba(0, 58, 97, 0.6) !important;
border-top: 1px solid rgba(104, 201, 255, 0.3);
padding-bottom: 20px;
}
:deep(.el-form-label) {
color: #68c9ff !important;
font-weight: 500;
}
</style>