3bb0fddcca
- transportCapacity/driver、vehicle、ship 页的「全部/30天内到期/已到期」筛选标签改为靠右对齐 - 统一使用 #search-menu 插槽替代 #expireStatus-search,标签移至搜索按钮前 - 标签容器删除宽度限制,增加 order:-1 和 margin-right:12px,保证标签和按钮为一体 - transportCapacity/vehicle 和 ship 的 expireStatus 列 search 改为 false,避免多余输入框出现 - transportCapacity/vehicle、ship 的 searchIndex 提升至6,避免搜索条件折叠,标签默认展开 - 暂用样式更改保证标签与搜索按钮间距和垂直对齐 - temporary-credit-limit 弹窗新增 dialogCustomClass,实现弹窗label固定六字宽度并自动换行 - element-ui.scss 新增临时额度弹窗 label 样式,修改label宽度、换行、对齐,提升可读性 - 调整多处搜索表单内 label 宽度由160px变为88px,优化表单紧凑度 - 多处文本域的最小行数 minRows 统一由较高数值改为2,改善表单布局和输入体验 - 更新 vite.config.mjs 开发服务器端口及代理配置,切换至本地测试环境 - waybill-import-dialog.vue 中修正文本域 autosize 最小行数为2,更符合表单设计规范 - 修改业务页 contract-manage.vue 菜单宽度由245px调整至252px,优化界面布局
758 lines
23 KiB
Vue
758 lines
23 KiB
Vue
<template>
|
|
<basic-container class="maintenance-record-page">
|
|
<avue-crud
|
|
:option="option"
|
|
:table-loading="loading"
|
|
:data="data"
|
|
v-model:page="page"
|
|
:permission="permissionList"
|
|
:before-open="beforeOpen"
|
|
v-model="form"
|
|
ref="crud"
|
|
@row-update="rowUpdate"
|
|
@row-save="rowSave"
|
|
@row-del="rowDel"
|
|
@search-change="searchChange"
|
|
@search-reset="searchReset"
|
|
@selection-change="selectionChange"
|
|
@current-change="currentChange"
|
|
@size-change="sizeChange"
|
|
@refresh-change="refreshChange"
|
|
@on-load="onLoad"
|
|
>
|
|
<template #menu-left>
|
|
<el-button
|
|
type="primary"
|
|
icon="el-icon-upload"
|
|
plain
|
|
v-if="hasPermission('maintenance_record_import')"
|
|
@click="handleImport"
|
|
>批量导入
|
|
</el-button>
|
|
<el-button
|
|
type="primary"
|
|
icon="el-icon-download"
|
|
plain
|
|
v-if="hasPermission('maintenance_record_template')"
|
|
@click="handleTemplate"
|
|
>下载模板
|
|
</el-button>
|
|
<el-button
|
|
type="primary"
|
|
icon="el-icon-download"
|
|
plain
|
|
v-if="hasPermission('maintenance_record_export')"
|
|
@click="handleExport"
|
|
>批量导出
|
|
</el-button>
|
|
<el-button
|
|
type="danger"
|
|
icon="el-icon-delete"
|
|
plain
|
|
v-if="hasPermission('maintenance_record_delete')"
|
|
@click="handleDelete"
|
|
>批量删除
|
|
</el-button>
|
|
</template>
|
|
<template #vehicleNo="{ row, index }">
|
|
<el-button type="primary" link @click="$refs.crud.rowView(row, index)">
|
|
{{ row.vehicleNo }}
|
|
</el-button>
|
|
</template>
|
|
<template #vehicleNoForm>
|
|
<el-autocomplete
|
|
v-model="form.vehicleNo"
|
|
:fetch-suggestions="fetchVehicleOptions"
|
|
:disabled="boxType === 'view'"
|
|
clearable
|
|
:placeholder="vehicleNoPlaceholder"
|
|
value-key="value"
|
|
class="maintenance-record-page__input"
|
|
/>
|
|
</template>
|
|
<template #costForm>
|
|
<el-input
|
|
v-model="form.cost"
|
|
:disabled="boxType === 'view'"
|
|
inputmode="decimal"
|
|
placeholder="请输入"
|
|
@input="value => normalizeDecimalInput('cost', value)"
|
|
>
|
|
<template #append>元</template>
|
|
</el-input>
|
|
</template>
|
|
<template #mileageForm>
|
|
<el-input
|
|
v-model="form.mileage"
|
|
:disabled="boxType === 'view'"
|
|
inputmode="decimal"
|
|
placeholder="请输入"
|
|
@input="value => normalizeDecimalInput('mileage', value)"
|
|
>
|
|
<template #append>{{ form.mileageUnit || '公里' }}</template>
|
|
</el-input>
|
|
</template>
|
|
<template #mileage="{ row }">
|
|
<span>{{ formatMileage(row.mileage, row.mileageUnit) }}</span>
|
|
</template>
|
|
<template #attachments="{ row }">
|
|
<span>{{ formatAttachments(row.attachments) }}</span>
|
|
</template>
|
|
<template #attachmentsForm>
|
|
<vehicle-attachment-upload
|
|
v-model="form.attachments"
|
|
:readonly="boxType === 'view'"
|
|
button-text="新增"
|
|
button-icon="el-icon-plus"
|
|
:show-tip="false"
|
|
/>
|
|
</template>
|
|
<template #attachments-form>
|
|
<vehicle-attachment-upload
|
|
v-model="form.attachments"
|
|
:readonly="boxType === 'view'"
|
|
button-text="新增"
|
|
button-icon="el-icon-plus"
|
|
:show-tip="false"
|
|
/>
|
|
</template>
|
|
</avue-crud>
|
|
<el-dialog title="维修记录数据导入" append-to-body v-model="excelBox" width="555px">
|
|
<avue-form :option="excelOption" v-model="excelForm">
|
|
<template #excelTemplate>
|
|
<el-button type="primary" @click="handleTemplate">
|
|
点击下载<i class="el-icon-download el-icon--right"></i>
|
|
</el-button>
|
|
</template>
|
|
</avue-form>
|
|
</el-dialog>
|
|
</basic-container>
|
|
</template>
|
|
|
|
<script>
|
|
import { getList, getDetail, add, update, remove } from '@/api/vehicle/maintenance-record';
|
|
import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle';
|
|
import { getList as getShipList } from '@/api/transportCapacity/transport-ship';
|
|
import { getDeptTree } from '@/api/system/dept';
|
|
import { exportBlob } from '@/api/common';
|
|
import { downloadXls } from '@/utils/util';
|
|
import { openImportDialog } from '@/utils/import-excel';
|
|
import { formatUpdateUserName } from '@/utils/audit';
|
|
import { getToken } from '@/utils/auth';
|
|
import { normalizeSearchRangeParams } from '@/utils/search-range';
|
|
import { mapGetters } from 'vuex';
|
|
import NProgress from 'nprogress';
|
|
import 'nprogress/nprogress.css';
|
|
|
|
const createTimeRangeMap = {
|
|
createTimeRange: ['createTimeStart', 'createTimeEnd'],
|
|
};
|
|
|
|
export default {
|
|
data() {
|
|
const validateNonNegative = (rule, value, callback) => {
|
|
if (value === undefined || value === null || value === '') {
|
|
callback();
|
|
} else if (Number(value) < 0) {
|
|
callback(new Error('不能小于 0'));
|
|
} else {
|
|
callback();
|
|
}
|
|
};
|
|
return {
|
|
form: {},
|
|
query: {},
|
|
loading: true,
|
|
excelBox: false,
|
|
excelForm: {},
|
|
isDetailLoading: false,
|
|
page: {
|
|
pageSize: 10,
|
|
pageSizes: [10, 20, 50, 100],
|
|
currentPage: 1,
|
|
total: 0,
|
|
},
|
|
selectionList: [],
|
|
boxType: '',
|
|
option: {
|
|
height: 'auto',
|
|
calcHeight: 32,
|
|
dialogWidth: 960,
|
|
labelPosition: 'right',
|
|
labelWidth: 'auto',
|
|
searchLabelWidth: 88,
|
|
tip: false,
|
|
searchShow: true,
|
|
searchMenuSpan: 24,
|
|
searchIcon: true,
|
|
searchIndex: 4,
|
|
searchMenuPosition: 'right',
|
|
border: true,
|
|
index: true,
|
|
indexLabel: '序号',
|
|
viewBtn: true,
|
|
selection: true,
|
|
dialogClickModal: false,
|
|
menuWidth: 180,
|
|
column: [
|
|
{
|
|
label: '车船类型',
|
|
prop: 'vehicleType',
|
|
type: 'radio',
|
|
minWidth: 110,
|
|
dicData: [
|
|
{ label: '车辆', value: '车辆' },
|
|
{ label: '船舶', value: '船舶' },
|
|
],
|
|
value: '车辆',
|
|
search: true,
|
|
span: 24,
|
|
change: ({ value }) => this.updateVehicleType(value || '车辆'),
|
|
rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }],
|
|
},
|
|
{
|
|
label: '车牌号/船号',
|
|
prop: 'vehicleNo',
|
|
slot: true,
|
|
formslot: true,
|
|
search: true,
|
|
minWidth: 130,
|
|
span: 12,
|
|
placeholder: '输入车牌号/船号查询选择',
|
|
rules: [
|
|
{ required: true, message: '请输入车牌号/船号', trigger: 'blur' },
|
|
{ max: 30, message: '最多 30 个字符', trigger: 'blur' },
|
|
],
|
|
},
|
|
{
|
|
label: '维修人',
|
|
prop: 'maintainer',
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '维修时间',
|
|
prop: 'maintenanceTime',
|
|
sortable: true,
|
|
type: 'datetime',
|
|
format: 'YYYY-MM-DD HH:mm:ss',
|
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
minWidth: 170,
|
|
span: 12,
|
|
placeholder: '日期时间选择器',
|
|
rules: [{ required: true, message: '请选择维修时间', trigger: 'click' }],
|
|
},
|
|
{
|
|
label: '维修位置',
|
|
prop: 'location',
|
|
minWidth: 160,
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '更换零件',
|
|
prop: 'replacedPart',
|
|
minWidth: 160,
|
|
overHidden: true,
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '费用',
|
|
prop: 'cost',
|
|
type: 'input',
|
|
slot: true,
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [
|
|
{ required: true, message: '请输入费用', trigger: 'blur' },
|
|
{ validator: validateNonNegative, trigger: 'blur' },
|
|
],
|
|
},
|
|
{
|
|
label: '维修单位',
|
|
prop: 'company',
|
|
minWidth: 180,
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '联系方式',
|
|
prop: 'contact',
|
|
minWidth: 150,
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '地址',
|
|
prop: 'address',
|
|
minWidth: 180,
|
|
overHidden: true,
|
|
span: 24,
|
|
placeholder: '地图选址',
|
|
rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '出厂时间',
|
|
prop: 'factoryTime',
|
|
sortable: true,
|
|
type: 'datetime',
|
|
format: 'YYYY-MM-DD HH:mm:ss',
|
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
minWidth: 170,
|
|
span: 12,
|
|
placeholder: '日期时间选择器',
|
|
},
|
|
{
|
|
label: '里程/航程数',
|
|
prop: 'mileage',
|
|
type: 'input',
|
|
minWidth: 130,
|
|
slot: true,
|
|
span: 12,
|
|
placeholder: '请输入',
|
|
rules: [{ validator: validateNonNegative, trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '里程单位',
|
|
prop: 'mileageUnit',
|
|
type: 'select',
|
|
dicData: [
|
|
{ label: '公里', value: '公里' },
|
|
{ label: '海里', value: '海里' },
|
|
],
|
|
value: '公里',
|
|
hide: true,
|
|
},
|
|
{
|
|
label: '备注',
|
|
prop: 'remark',
|
|
type: 'textarea',
|
|
minRows: 2,
|
|
span: 24,
|
|
hide: true,
|
|
placeholder: '请输入',
|
|
rules: [{ max: 500, message: '最多 500 个字符', trigger: 'blur' }],
|
|
},
|
|
{
|
|
label: '附件',
|
|
prop: 'attachments',
|
|
span: 24,
|
|
minWidth: 100,
|
|
slot: true,
|
|
formslot: true,
|
|
},
|
|
{
|
|
label: '创建时间',
|
|
prop: 'createTime',
|
|
sortable: true,
|
|
type: 'date',
|
|
format: 'YYYY-MM-DD HH:mm:ss',
|
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
addDisplay: false,
|
|
editDisplay: false,
|
|
viewDisplay: false,
|
|
display: false,
|
|
minWidth: 170,
|
|
},
|
|
{
|
|
label: '创建时间',
|
|
prop: 'createTimeRange',
|
|
type: 'date',
|
|
format: 'YYYY-MM-DD',
|
|
valueFormat: 'YYYY-MM-DD',
|
|
searchRange: true,
|
|
search: true,
|
|
hide: true,
|
|
addDisplay: false,
|
|
editDisplay: false,
|
|
viewDisplay: false,
|
|
},
|
|
{
|
|
label: '组织',
|
|
prop: 'createDept',
|
|
type: 'tree',
|
|
dicData: [],
|
|
props: {
|
|
label: 'title',
|
|
value: 'id',
|
|
},
|
|
checkStrictly: true,
|
|
search: true,
|
|
hide: true,
|
|
addDisplay: false,
|
|
editDisplay: false,
|
|
viewDisplay: false,
|
|
},
|
|
{
|
|
label: '更新人',
|
|
prop: 'updateUserName',
|
|
formatter: formatUpdateUserName,
|
|
addDisplay: false,
|
|
editDisplay: false,
|
|
display: false,
|
|
minWidth: 180,
|
|
},
|
|
{
|
|
label: '更新时间',
|
|
prop: 'updateTime',
|
|
sortable: true,
|
|
type: 'datetime',
|
|
format: 'YYYY-MM-DD HH:mm:ss',
|
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
|
addDisplay: false,
|
|
editDisplay: false,
|
|
display: false,
|
|
minWidth: 170,
|
|
},
|
|
],
|
|
},
|
|
excelOption: {
|
|
labelPosition: 'right',
|
|
submitBtn: false,
|
|
emptyBtn: false,
|
|
column: [
|
|
{
|
|
label: '模板上传',
|
|
prop: 'excelFile',
|
|
type: 'upload',
|
|
drag: true,
|
|
loadText: '模板上传中,请稍等',
|
|
span: 24,
|
|
propsHttp: {
|
|
res: 'data',
|
|
},
|
|
tip: '请上传 .xls,.xlsx 标准格式文件',
|
|
action: '/blade-transport/maintenance-record/import-maintenance-record',
|
|
},
|
|
{
|
|
label: '模板下载',
|
|
prop: 'excelTemplate',
|
|
formslot: true,
|
|
span: 24,
|
|
},
|
|
],
|
|
},
|
|
data: [],
|
|
};
|
|
},
|
|
created() {
|
|
this.initDeptTree();
|
|
},
|
|
computed: {
|
|
...mapGetters(['permission', 'userInfo']),
|
|
isAdmin() {
|
|
const authority = this.userInfo.authority || '';
|
|
return authority.includes('admin');
|
|
},
|
|
permissionList() {
|
|
return {
|
|
addBtn: this.hasPermission('maintenance_record_add'),
|
|
viewBtn: this.hasPermission('maintenance_record_view'),
|
|
delBtn: this.hasPermission('maintenance_record_delete'),
|
|
editBtn: this.hasPermission('maintenance_record_edit'),
|
|
};
|
|
},
|
|
vehicleNoPlaceholder() {
|
|
return this.form.vehicleType === '船舶' ? '输入船号模糊查询选择' : '输入车牌号模糊查询选择';
|
|
},
|
|
ids() {
|
|
let ids = [];
|
|
this.selectionList.forEach(ele => {
|
|
ids.push(ele.id);
|
|
});
|
|
return ids.join(',');
|
|
},
|
|
},
|
|
watch: {
|
|
'form.vehicleType': {
|
|
handler(value, oldValue) {
|
|
this.updateVehicleType(value || '车辆', oldValue);
|
|
},
|
|
immediate: true,
|
|
},
|
|
},
|
|
methods: {
|
|
hasPermission(code) {
|
|
return this.isAdmin || this.validData(this.permission[code], false);
|
|
},
|
|
updateVehicleType(vehicleType, oldValue) {
|
|
const mileageUnit = vehicleType === '船舶' ? '海里' : '公里';
|
|
const vehicleTypeColumn = this.findColumn(this.option.column, 'vehicleType');
|
|
const vehicleNoColumn = this.findColumn(this.option.column, 'vehicleNo');
|
|
const mileageColumn = this.findColumn(this.option.column, 'mileage');
|
|
const mileageUnitColumn = this.findColumn(this.option.column, 'mileageUnit');
|
|
vehicleNoColumn.placeholder =
|
|
vehicleType === '船舶' ? '输入船号模糊查询选择' : '输入车牌号模糊查询选择';
|
|
vehicleTypeColumn.disabled = Boolean(this.form.id);
|
|
mileageColumn.append = mileageUnit;
|
|
mileageUnitColumn.value = mileageUnit;
|
|
this.form.mileageUnit = mileageUnit;
|
|
if (!this.isDetailLoading && oldValue && vehicleType !== oldValue && this.form.vehicleNo) {
|
|
this.form.vehicleNo = '';
|
|
}
|
|
},
|
|
fetchVehicleOptions(queryString, callback) {
|
|
const vehicleType = this.form.vehicleType || '车辆';
|
|
const request = vehicleType === '船舶' ? getShipList : getVehicleList;
|
|
const params =
|
|
vehicleType === '船舶' ? { shipIdentifierNo: queryString } : { plateNo: queryString };
|
|
request(1, 20, params)
|
|
.then(res => {
|
|
const records = res.data.data.records || [];
|
|
callback(
|
|
records.map(item => ({
|
|
value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo,
|
|
}))
|
|
);
|
|
})
|
|
.catch(() => callback([]));
|
|
},
|
|
formatMileage(value, unit) {
|
|
if (value === undefined || value === null || value === '') return '';
|
|
return `${Math.max(Number(value), 0)} ${unit || '公里'}`;
|
|
},
|
|
formatAttachments(value) {
|
|
if (!value) return '';
|
|
if (Array.isArray(value)) return `${value.length} 个`;
|
|
if (typeof value !== 'string') return '1 个';
|
|
try {
|
|
const attachments = JSON.parse(value);
|
|
return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个';
|
|
} catch (error) {
|
|
return (
|
|
value
|
|
.split(',')
|
|
.map(item => item.trim())
|
|
.filter(Boolean).length + ' 个'
|
|
);
|
|
}
|
|
},
|
|
parseAttachments(value) {
|
|
if (!value || Array.isArray(value)) return value;
|
|
if (typeof value !== 'string') return [];
|
|
try {
|
|
const attachments = JSON.parse(value);
|
|
return Array.isArray(attachments) ? attachments : [];
|
|
} catch (error) {
|
|
return value
|
|
.split(',')
|
|
.map(item => ({ name: item.trim(), url: item.trim() }))
|
|
.filter(item => item.url);
|
|
}
|
|
},
|
|
stringifyAttachments(value) {
|
|
if (!value || typeof value === 'string') return value;
|
|
return JSON.stringify(value);
|
|
},
|
|
normalizeDecimalInput(prop, value) {
|
|
const sanitized = String(value ?? '').replace(/[^\d.]/g, '');
|
|
const [integerPart, ...decimalParts] = sanitized.split('.');
|
|
this.form[prop] = decimalParts.length
|
|
? `${integerPart || '0'}.${decimalParts.join('').slice(0, 2)}`
|
|
: integerPart;
|
|
},
|
|
initDeptTree() {
|
|
getDeptTree(this.userInfo.tenantId).then(res => {
|
|
const column = this.findColumn(this.option.column, 'createDept');
|
|
column.dicData = res.data.data;
|
|
});
|
|
},
|
|
normalizeRow(row) {
|
|
const values = { ...row };
|
|
values.vehicleType = values.vehicleType || '车辆';
|
|
values.mileageUnit = values.vehicleType === '船舶' ? '海里' : '公里';
|
|
if (values.vehicleNo) {
|
|
values.vehicleNo =
|
|
values.vehicleType === '船舶'
|
|
? values.vehicleNo.trim()
|
|
: values.vehicleNo.trim().toUpperCase();
|
|
}
|
|
values.attachments = this.stringifyAttachments(values.attachments);
|
|
return values;
|
|
},
|
|
rowSave(row, done, loading) {
|
|
add(this.normalizeRow(row)).then(
|
|
() => {
|
|
this.onLoad(this.page);
|
|
this.$message({ type: 'success', message: '操作成功!' });
|
|
done();
|
|
},
|
|
error => {
|
|
window.console.log(error);
|
|
loading();
|
|
}
|
|
);
|
|
},
|
|
rowUpdate(row, index, done, loading) {
|
|
update(this.normalizeRow(row)).then(
|
|
() => {
|
|
this.onLoad(this.page);
|
|
this.$message({ type: 'success', message: '操作成功!' });
|
|
done();
|
|
},
|
|
error => {
|
|
window.console.log(error);
|
|
loading();
|
|
}
|
|
);
|
|
},
|
|
rowDel(row) {
|
|
this.$confirm('确定将选择数据删除?', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
})
|
|
.then(() => remove(row.id))
|
|
.then(() => {
|
|
this.onLoad(this.page);
|
|
this.$message({ type: 'success', message: '操作成功!' });
|
|
});
|
|
},
|
|
handleDelete() {
|
|
if (this.selectionList.length === 0) {
|
|
this.$message.warning('请选择至少一条数据');
|
|
return;
|
|
}
|
|
this.$confirm('确定将选择数据删除?', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
})
|
|
.then(() => remove(this.ids))
|
|
.then(() => {
|
|
this.onLoad(this.page);
|
|
this.$message({ type: 'success', message: '操作成功!' });
|
|
this.$refs.crud.toggleSelection();
|
|
});
|
|
},
|
|
beforeOpen(done, type) {
|
|
this.boxType = type;
|
|
if (type === 'add') {
|
|
this.form = {
|
|
vehicleType: '车辆',
|
|
mileageUnit: '公里',
|
|
};
|
|
this.updateVehicleType('车辆');
|
|
}
|
|
if (['edit', 'view'].includes(type)) {
|
|
this.isDetailLoading = true;
|
|
getDetail(this.form.id)
|
|
.then(res => {
|
|
const detail = res.data.data;
|
|
detail.attachments = this.parseAttachments(detail.attachments);
|
|
detail.vehicleType = detail.vehicleType || '车辆';
|
|
detail.mileageUnit = detail.vehicleType === '船舶' ? '海里' : '公里';
|
|
this.form = detail;
|
|
this.updateVehicleType(detail.vehicleType);
|
|
})
|
|
.finally(() => {
|
|
this.isDetailLoading = false;
|
|
});
|
|
}
|
|
done();
|
|
},
|
|
searchReset() {
|
|
this.query = {};
|
|
this.onLoad(this.page);
|
|
},
|
|
searchChange(params, done) {
|
|
this.query = this.buildQuery(params);
|
|
this.page.currentPage = 1;
|
|
this.onLoad(this.page);
|
|
done();
|
|
},
|
|
selectionChange(list) {
|
|
this.selectionList = list;
|
|
},
|
|
selectionClear() {
|
|
this.selectionList = [];
|
|
this.$refs.crud.toggleSelection();
|
|
},
|
|
currentChange(currentPage) {
|
|
this.page.currentPage = currentPage;
|
|
},
|
|
sizeChange(pageSize) {
|
|
this.page.pageSize = pageSize;
|
|
},
|
|
refreshChange() {
|
|
this.onLoad(this.page, this.query);
|
|
},
|
|
onLoad(page, params = {}) {
|
|
this.loading = true;
|
|
getList(page.currentPage, page.pageSize, this.buildQuery(params))
|
|
.then(res => {
|
|
const data = res.data.data;
|
|
this.page.total = data.total;
|
|
this.data = data.records;
|
|
this.selectionClear();
|
|
})
|
|
.finally(() => {
|
|
this.loading = false;
|
|
});
|
|
},
|
|
handleImport() {
|
|
openImportDialog(this, '维修记录');
|
|
},
|
|
handleExport() {
|
|
this.$confirm('是否导出维修记录数据?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
}).then(() => {
|
|
NProgress.start();
|
|
exportBlob(
|
|
'/blade-transport/maintenance-record/export-maintenance-record',
|
|
this.buildExportParams(),
|
|
{ feedback: true }
|
|
)
|
|
.then(res => {
|
|
downloadXls(res.data, `维修记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`);
|
|
})
|
|
.finally(() => {
|
|
NProgress.done();
|
|
});
|
|
});
|
|
},
|
|
buildExportParams() {
|
|
return {
|
|
...this.buildQuery(),
|
|
ids: this.ids,
|
|
[this.website.tokenHeader]: getToken(),
|
|
};
|
|
},
|
|
buildQuery(params = {}) {
|
|
return normalizeSearchRangeParams({ ...params, ...this.query }, createTimeRangeMap);
|
|
},
|
|
handleTemplate() {
|
|
exportBlob(
|
|
`/blade-transport/maintenance-record/export-template?${
|
|
this.website.tokenHeader
|
|
}=${getToken()}`,
|
|
{ feedback: true }
|
|
).then(res => {
|
|
downloadXls(res.data, '维修记录模板.xlsx');
|
|
});
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.maintenance-record-page {
|
|
:deep(.el-table th .cell),
|
|
:deep(.el-table td .cell) {
|
|
white-space: nowrap;
|
|
}
|
|
|
|
&__input {
|
|
width: 100%;
|
|
}
|
|
}
|
|
</style>
|