1050 lines
28 KiB
Vue
1050 lines
28 KiB
Vue
<template>
|
|
<div class="content" v-loading="Status.fullLoading">
|
|
|
|
<div class="main">
|
|
<div class="TopTool">
|
|
<div class="button-row">
|
|
|
|
<el-button type="primary" icon="Plus" @click.stop="ShowEdit(null, true)">新增维修</el-button>
|
|
<el-button type="primary" plain icon="Download" @click.stop="ExportRecord()">导出</el-button>
|
|
<el-button type="danger" plain icon="Delete" @click.stop="DropRecord()">批量删除</el-button>
|
|
|
|
</div>
|
|
|
|
<div class="rightSearch">
|
|
|
|
<el-input :suffix-icon="'Search'" v-model="advanceSearch.searchValue" class="responsive-input"
|
|
placeholder="名称" @input="txtSearch">
|
|
|
|
</el-input>
|
|
|
|
<el-button style="margin-left: 10px;" type="primary" @click.stop="ToggleAdvance()">高级筛选</el-button>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<div class="advanceSearch" v-show="Status.ShowAdvanceSearch">
|
|
<el-form :inline="true" :model="advanceSearch" class="demo-form-inline">
|
|
<el-form-item label="设备名称">
|
|
<el-input placeholder="请选择" v-model="selectedRow['deviceName']" :readonly="true"
|
|
@click.stop="ShowDevice('Search', false)" />
|
|
</el-form-item>
|
|
|
|
<el-form-item label="维修人员">
|
|
<el-input v-model="advanceSearch.repairPerson" placeholder="请输入人员名称" clearable />
|
|
</el-form-item>
|
|
|
|
<el-form-item label="维修部位">
|
|
<el-input v-model="advanceSearch.repairPart" placeholder="请输入" clearable />
|
|
</el-form-item>
|
|
<el-form-item label="维修原因">
|
|
<el-input v-model="advanceSearch.repairReason" placeholder="请输入" clearable />
|
|
</el-form-item>
|
|
|
|
<el-form-item label="维修时间">
|
|
<el-col :span="7">
|
|
<el-form-item prop="date1" style="margin-right: 0px;">
|
|
<el-date-picker v-model="advanceSearch.repairBeginTime" type="date" placeholder="开始日期"
|
|
format="YYYY-MM-DD" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
<el-col :span="1">
|
|
<span class="text-gray-500">-</span>
|
|
</el-col>
|
|
<el-col :span="7">
|
|
<el-form-item prop="date2" style="margin-right: 0px;">
|
|
<el-date-picker v-model="advanceSearch.repairEndTime" placeholder="结束日期" style="width: 100%" />
|
|
</el-form-item>
|
|
</el-col>
|
|
<div>
|
|
<el-button style="margin-left: 5px;" type="primary" @click.stop="Search()">查询</el-button>
|
|
<el-button type="primary" @click.stop="Reset()">重置</el-button>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
</el-form>
|
|
|
|
</div>
|
|
|
|
<div class="grid" v-loading="Status.loading">
|
|
|
|
<el-table ref="grid" height="calc(100vh - 360px)" border :data="List" @selection-change="RowSelectionChange">
|
|
<el-table-column type="selection" width="50" align="center" />
|
|
<el-table-column label="设备名称" align="center" prop="deviceName" />
|
|
<el-table-column label="维修时间" align="center" prop="repairTime" />
|
|
<el-table-column label="损坏部位" align="center" prop="repairPart" />
|
|
<el-table-column label="损坏原因" align="center" prop="repairReason" />
|
|
<el-table-column label="维修人员" align="center" prop="repairPerson" />
|
|
|
|
<el-table-column label="操作" align="center" fixed="right" width="280"
|
|
class-name="small-padding fixed-width opt">
|
|
<template #default="scope">
|
|
<div class="center">
|
|
<el-text class="mx-1" type="primary" @click.stop="ShowEdit(scope.row, true)">编辑</el-text>
|
|
<el-text class="mx-1" type="primary" @click.stop="ShowEdit(scope.row, false)">详情</el-text>
|
|
<el-text class="mx-1" type="danger" @click.stop="DropRecord([scope.row])">删除</el-text>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
</el-table-column>
|
|
|
|
|
|
</el-table>
|
|
<pagination v-show="pagin.total > 0" v-model:page="advanceSearch.pageNum" v-model:limit="advanceSearch.pageSize"
|
|
:total="pagin.total" @pagination="getRecordList" />
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- 新增、编辑弹出层 -->
|
|
<el-dialog v-model="Status.ShowEditPop" :data-val="Status.ShowEditPop" :title="cEdit.recordId ? '编辑维修' : '新增维修'"
|
|
width="800" :draggable="true">
|
|
|
|
<div class="form">
|
|
|
|
<el-form :model="cEdit" ref="ruleFormRef" style="max-width: 750px" :rules="rules">
|
|
|
|
<el-form-item label="设备名称" label-position="right">
|
|
<el-input v-model="selectedRow['deviceName']" :readonly="true" @click.stop="ShowDevice('Edit', true)"
|
|
placeholder="请选择设备" />
|
|
</el-form-item>
|
|
<el-form-item label="维修人员" label-position="right">
|
|
<el-input v-model="cEdit.repairPerson" :readonly="!cEdit.isEdit" placeholder="请输入姓名" />
|
|
</el-form-item>
|
|
<el-form-item label="维修时间" label-position="right">
|
|
|
|
<el-date-picker v-model="cEdit.repairTime" :readonly="!cEdit.isEdit" type="datetime" placeholder="请选择时间"
|
|
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
|
|
|
|
</el-form-item>
|
|
<el-form-item label="维修部位" label-position="right">
|
|
<el-input v-model="cEdit.repairPart" :readonly="!cEdit.isEdit" placeholder="请输入维修部位" />
|
|
</el-form-item>
|
|
<el-form-item label="维修原因" label-position="right">
|
|
|
|
<el-input v-model="cEdit.repairReason" :readonly="!cEdit.isEdit" placeholder="请输入维修原因" />
|
|
</el-form-item>
|
|
|
|
<el-form-item label="损坏照片" label-position="right">
|
|
<el-upload v-show="cEdit.isEdit" ref="beforeUploadRef" class="upload-demo" action="" :auto-upload="false"
|
|
:on-change="handleFileChange1" :file-list="beforeFiles" accept=".jpg,.jpeg,.png,.gif.webp" :limit="1"
|
|
list-type="picture-card">
|
|
<el-icon>
|
|
<Plus />
|
|
</el-icon>
|
|
|
|
|
|
</el-upload>
|
|
<div class="demo-fit" v-show="!cEdit.isEdit">
|
|
<div class="block">
|
|
|
|
<el-avatar shape="square" :size="100" :fit="'scale-down'" :src="cEdit.beforeImg" />
|
|
</div>
|
|
</div>
|
|
</el-form-item>
|
|
|
|
<el-form-item label="修复照片" label-position="right">
|
|
<el-upload v-show="cEdit.isEdit" ref="afterUploadRef" class="upload-demo" action="" :auto-upload="false"
|
|
:on-change="handleFileChange2" :file-list="afterFiles" accept=".jpg,.jpeg,.png,.gif.webp" :limit="1"
|
|
list-type="picture-card">
|
|
<el-icon>
|
|
<Plus />
|
|
</el-icon>
|
|
|
|
</el-upload>
|
|
<div class="demo-fit" v-show="!cEdit.isEdit">
|
|
<div class="block">
|
|
|
|
<el-avatar shape="square" :size="100" :fit="'scale-down'" :src="cEdit.afterImg" />
|
|
</div>
|
|
</div>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
</div>
|
|
<div class="center" style="margin-top: 10px;">
|
|
<el-button type="primary" @click="SaveFormData()">
|
|
确定
|
|
</el-button>
|
|
<el-button @click="CloseEdit()">
|
|
取消
|
|
</el-button>
|
|
</div>
|
|
|
|
|
|
</el-dialog>
|
|
|
|
<!-- 选择设备弹出层 -->
|
|
<el-dialog v-model="Status.ShowCheckDevice" title="选择设备" class="checkDeviceDialog" :draggable="true">
|
|
<div class="deviceContnet">
|
|
<div class="topSearch">
|
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
|
<el-form-item label="设备名称" prop="deviceName">
|
|
<el-input v-model="queryParams.deviceName" placeholder="请输入设备名称" clearable />
|
|
</el-form-item>
|
|
<el-form-item label="设备MAC" prop="deviceMac">
|
|
<el-input v-model="queryParams.deviceMac" placeholder="请输入设备MAC" clearable />
|
|
</el-form-item>
|
|
<el-form-item label="请输入设备IMEI" prop="deviceImei">
|
|
<el-input v-model="queryParams.deviceImei" placeholder="请输入设备IMEI" clearable />
|
|
</el-form-item>
|
|
<el-form-item label="设备类型" prop="deviceType">
|
|
<el-select v-model="queryParams.deviceType" placeholder="设备类型">
|
|
<el-option v-for="item in deviceTypes" :key="item.value" :label="item.typeName" :value="item.id" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="设备状态" prop="deviceStatus">
|
|
<el-select v-model="queryParams.deviceStatus" placeholder="设备状态" style="margin-left: 10px;">
|
|
<el-option label="正常" value="1" />
|
|
<el-option label="失效" value="0" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="创建时间">
|
|
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
|
|
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
|
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</div>
|
|
<div class="gridContent">
|
|
|
|
|
|
<el-table ref="deviceGrid" v-loading="Status.devLoading" border :data="deviceDist" height="300"
|
|
@row-click="handleRadioChange">
|
|
<!-- <el-table-column type="selection" width="50" align="center" /> -->
|
|
|
|
<el-table-column label="选择" width="80" align="center">
|
|
<template #default="scope">
|
|
<el-radio :model-value="selectedRowId" :label="scope.row.deviceId"
|
|
@change="handleRadioChange(scope.row)" />
|
|
</template>
|
|
</el-table-column>
|
|
|
|
|
|
|
|
<el-table-column label="设备名称" align="center" prop="deviceName" />
|
|
<el-table-column prop="customerName" label="所属客户" />
|
|
<el-table-column prop="devicePic" label="设备图片">
|
|
<template #default="scope">
|
|
<el-popover placement="right" trigger="click">
|
|
<template #reference>
|
|
<img :src="scope.row.devicePic"
|
|
style="width: 40px; height: 40px; cursor: pointer; object-fit: contain"
|
|
class="hover:opacity-80 transition-opacity" />
|
|
</template>
|
|
<img :src="scope.row.devicePic" style="max-width: 600px; max-height: 600px; object-fit: contain" />
|
|
</el-popover>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="deviceMac" label="设备MAC" />
|
|
<el-table-column prop="bluetoothName" label="蓝牙名称" />
|
|
<el-table-column prop="deviceImei" label="设备IMEI" />
|
|
<el-table-column prop="typeName" label="设备类型" />
|
|
<el-table-column prop="bindingStatus" label="绑定状态">
|
|
<template #default="scope">
|
|
<el-tag :type="scope.row.bindingStatus === 1 ? 'success' : 'info'">
|
|
{{ scope.row.bindingStatus === 1 ? '已绑定' : '未绑定' }}
|
|
</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="deviceStatus" label="设备状态">
|
|
<template #default="scope">
|
|
<el-tag :type="scope.row.deviceStatus == 1 ? 'success' : 'danger'">
|
|
{{ scope.row.deviceStatus == 1 ? '正常' : '失效' }}
|
|
</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="remark" label="备注" />
|
|
<el-table-column prop="createTime" label="创建日期" width="160" />
|
|
<el-table-column prop="createByName" label="创建人" />
|
|
|
|
|
|
</el-table>
|
|
<pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
|
|
:total="total" @pagination="getList" />
|
|
</div>
|
|
|
|
|
|
<div class="center footerBtn" style="margin-top: 10px;">
|
|
<el-button type="primary" @click="CheckDeviceOK()">
|
|
确定
|
|
</el-button>
|
|
<el-button @click="CloseDevice()">
|
|
取消
|
|
</el-button>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
<!-- 提示框 -->
|
|
<el-dialog :width="300" :draggable="true" v-model="Status.confirm.Visible" :title="Status.confirm.title" width="500"
|
|
center>
|
|
<span>
|
|
{{ Status.confirm.text }}
|
|
</span>
|
|
<template #footer>
|
|
<div class="dialog-footer">
|
|
<el-button type="primary" @click="Status.confirm.OkCallback">
|
|
确定
|
|
</el-button>
|
|
<el-button v-show="Status.confirm.showCancel" @click="Status.confirm.cancelCallback">取消</el-button>
|
|
|
|
</div>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
|
|
import api from '@/api/equipmentManagement/repairRecords/index';
|
|
import common from '@/utils/common';
|
|
import deviceapi from '@/api/equipmentManagement/device/index';
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
import { deviceForm, deviceQuery, deviceVO, deviceTypeOption } from '@/api/equipmentManagement/device/types';
|
|
import { UploadProps } from 'element-plus';
|
|
|
|
var grid = ref(null);
|
|
var deviceGrid = ref(null);
|
|
|
|
//全局状态控制
|
|
var Status = reactive({
|
|
fullLoading: false,//是否显示全屏loading
|
|
loading: false,//是否显示表格区域loading
|
|
confirm: {//弹出框的配置
|
|
Visible: false,
|
|
title: '',
|
|
text: '',
|
|
cancelCallback: null,
|
|
OkCallback: null,
|
|
showCancel: true
|
|
},
|
|
ShowEditPop: false,//是否显示编辑弹窗
|
|
ShowAdvanceSearch: false,//是否显示高级筛选
|
|
ShowCheckDevice: false,//是否显示选择设备的弹窗
|
|
CheckDeviceType: 'Search'
|
|
});
|
|
//高级查询
|
|
var advanceSearch = reactive({
|
|
"recordId": null,
|
|
"deviceId": "",
|
|
"searchValue": "",
|
|
"search": "",
|
|
"repairPart": "",
|
|
"repairReason": "",
|
|
"repairPerson": "",
|
|
"repairBeginTime": "",
|
|
"repairEndTime": "",
|
|
pageNum: 1,
|
|
pageSize: 10
|
|
});
|
|
|
|
//选择设备
|
|
var selectedRowId = ref("");
|
|
var selectedRow = ref({});
|
|
function handleRadioChange(row) {
|
|
selectedRowId.value = row.deviceId;
|
|
selectedRow.value = row;
|
|
}
|
|
|
|
//照片上传
|
|
var beforeFiles = ref([]);
|
|
var afterFiles = ref([]);
|
|
|
|
var beforeFile = ref([]);
|
|
var afterFile = ref([]);
|
|
|
|
var beforeUploadRef = ref(null);
|
|
var afterUploadRef = ref(null);
|
|
|
|
function clearUploadFiles() {
|
|
beforeFiles.value = [];
|
|
afterFiles.value = [];
|
|
beforeFile.value = [];
|
|
afterFile.value = [];
|
|
beforeUploadRef.value?.clearFiles();
|
|
afterUploadRef.value?.clearFiles();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//页码控件数据
|
|
var pagin = reactive({
|
|
total: 0,
|
|
});
|
|
|
|
//列表数据
|
|
var List = ref<any[]>(null);
|
|
|
|
//当前正在编辑的数据
|
|
var cEdit = reactive({
|
|
recordId: null,//维修记录id
|
|
deviceId: "",//设备id
|
|
repairTime: '',//维修时间
|
|
repairPart: '',//维修部位
|
|
repairReason: '',//维修原因
|
|
repairPerson: '',//维修人员
|
|
isEdit: true,
|
|
beforeImg: "",
|
|
afterImg: "",
|
|
|
|
// beforeFile: '',
|
|
// afterFile: ''
|
|
});
|
|
|
|
|
|
var deviceTypes = reactive([]);
|
|
|
|
//重置搜索条件
|
|
function Reset() {
|
|
let defVal = {
|
|
type: '',
|
|
user: '',
|
|
mac: '',
|
|
imei: '',
|
|
startDate: '',
|
|
endDate: ''
|
|
};
|
|
|
|
let keys = Object.keys(defVal);
|
|
keys.forEach(function (item, index, array) {
|
|
advanceSearch[item] = defVal[item];
|
|
});
|
|
}
|
|
//查询
|
|
function Search() {
|
|
advanceSearch.pageNum = 1;
|
|
getRecordList();
|
|
}
|
|
//右上角的文本框输入后查询
|
|
let searchIntval = null;
|
|
function txtSearch() {
|
|
clearTimeout(searchIntval);
|
|
// 等待 500ms 无输入后执行查询
|
|
searchIntval = setTimeout(() => {
|
|
Search();
|
|
}, 500);
|
|
}
|
|
|
|
//获取列表数据
|
|
function getRecordList() {
|
|
|
|
showloading('loading');
|
|
setTimeout(() => {
|
|
api.getRepairList(advanceSearch).then(res => {
|
|
|
|
if (res.code == 200) {
|
|
|
|
List.value = res.rows;
|
|
pagin.total = res.total;
|
|
|
|
} else {
|
|
alert(res.msg);
|
|
}
|
|
}).catch(ex => {
|
|
alert("出现了未知的异常");
|
|
}).finally(hideloading);
|
|
|
|
|
|
|
|
}, 2000);
|
|
}
|
|
|
|
|
|
//删除
|
|
function DropRecord(arr = undefined) {
|
|
|
|
if (arr === undefined) {
|
|
arr = getSelectionRows(grid);
|
|
}
|
|
if (arr.length == 0) {
|
|
alert("请选择需要删除的数据");
|
|
return;
|
|
}
|
|
|
|
|
|
confirm("您确认删除" + arr.length + "条记录吗?", () => {
|
|
showloading('fullLoading');
|
|
arr = arr.map(item => item.recordId);
|
|
api.dropRepir(arr);
|
|
setTimeout(hideloading, 2000);
|
|
alert("操作成功");
|
|
Search();
|
|
}, hideConfirm, '提示');
|
|
}
|
|
|
|
//高级查询显示隐藏
|
|
function ToggleAdvance() {
|
|
Status.ShowAdvanceSearch = !Status.ShowAdvanceSearch;
|
|
}
|
|
|
|
//显示编辑
|
|
function ShowEdit(item = undefined, isEdit = true) {
|
|
debugger;
|
|
Status.ShowEditPop = true;
|
|
let def = {
|
|
recordId: null,//维修记录id
|
|
|
|
deviceId: "",//设备id
|
|
repairTime: '',//维修时间
|
|
repairPart: '',//维修部位
|
|
repairReason: '',//维修原因
|
|
repairPerson: ''//维修人员
|
|
}
|
|
|
|
let promise1 = new Promise((resolve, reject) => {
|
|
if (item) {
|
|
api.getRepirDetail(item.recordId).then((res) => {
|
|
if (res.code == 200) {
|
|
|
|
resolve(res.data);
|
|
}
|
|
else {
|
|
resolve(item);
|
|
}
|
|
}).catch(ex => {
|
|
resolve(item);
|
|
});
|
|
} else {
|
|
resolve(item);
|
|
}
|
|
});
|
|
|
|
promise1.then(res => {
|
|
item = res;
|
|
if (!item) {
|
|
cEdit.isEdit = isEdit;
|
|
return;
|
|
}
|
|
let keys = Object.keys(cEdit);
|
|
keys.forEach((key, i) => {
|
|
if (item) {//编辑
|
|
cEdit[key] = item[key];
|
|
} else {//新增
|
|
cEdit[key] = def[key];
|
|
}
|
|
});
|
|
|
|
if (item.images && item.images.length) {
|
|
item.images.filter(v => {
|
|
if (v.imageType == 'BEFORE') {
|
|
cEdit.beforeImg = v.imageUrl;
|
|
return true;
|
|
}
|
|
if (v.imageType == 'AFTER') {
|
|
cEdit.beforeImg = v.imageUrl;
|
|
return true;
|
|
}
|
|
return false;
|
|
})
|
|
}
|
|
if (item) {
|
|
selectedRow.value['deviceName'] = item.deviceName;
|
|
}
|
|
|
|
cEdit.isEdit = isEdit;
|
|
}).finally(() => {
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//关闭编辑弹窗
|
|
function CloseEdit() {
|
|
|
|
Status.ShowEditPop = false;
|
|
ResetFormData();
|
|
}
|
|
|
|
//显示选择设备的弹窗
|
|
function ShowDevice(type, isvalid) {
|
|
|
|
if (isvalid && !cEdit.isEdit) {
|
|
return;
|
|
}
|
|
|
|
Status.CheckDeviceType = type;
|
|
Status.ShowCheckDevice = true;
|
|
selectedRowId.value = "";
|
|
|
|
if (total.value === 0) {
|
|
handleQuery();
|
|
}
|
|
}
|
|
|
|
//关闭选择设备
|
|
function CloseDevice() {
|
|
Status.ShowCheckDevice = false;
|
|
}
|
|
|
|
//确认选择某个设备
|
|
function CheckDeviceOK() {
|
|
|
|
|
|
|
|
if (Status.CheckDeviceType == 'Edit') {
|
|
cEdit.deviceId = selectedRowId.value;
|
|
} else {
|
|
advanceSearch.deviceId = selectedRowId.value;
|
|
}
|
|
CloseDevice();
|
|
|
|
}
|
|
|
|
function ResetFormData() {
|
|
cEdit.recordId = null;//维修记录id
|
|
cEdit.deviceId = "";//设备id
|
|
cEdit.repairTime = '';//维修时间
|
|
cEdit.repairPart = '';//维修部位
|
|
cEdit.repairReason = '';//维修原因
|
|
cEdit.repairPerson = '';//维修人员
|
|
cEdit.isEdit = false;
|
|
cEdit.afterImg = "";
|
|
cEdit.beforeImg = "";
|
|
selectedRow.value = { deviceName: "", deviceId: "" };
|
|
|
|
clearUploadFiles();
|
|
}
|
|
//保存表单数据
|
|
function SaveFormData() {
|
|
if (!cEdit.isEdit) {
|
|
return;
|
|
}
|
|
|
|
showloading('fullLoading');
|
|
setTimeout(() => {
|
|
|
|
let promise = null;
|
|
|
|
let formData = new FormData();
|
|
|
|
let keys = Object.keys(cEdit);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
let key = keys[i];
|
|
if (key == 'isEdit') {
|
|
continue;
|
|
}
|
|
if (cEdit[key] === null || cEdit[key] === undefined) {
|
|
continue;
|
|
}
|
|
formData.append(key, cEdit[key]);
|
|
}
|
|
|
|
// 添加第一个控件的文件
|
|
if (beforeFile.value.length > 0) {
|
|
formData.append('beforeFile', beforeFile.value[0]);
|
|
}
|
|
|
|
if (afterFile.value.length > 0) {
|
|
formData.append('afterFile', afterFile.value[0]);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (cEdit.recordId) {
|
|
promise = api.updateRepair(formData);
|
|
} else {
|
|
promise = api.addRepir(formData);
|
|
}
|
|
|
|
promise.then((res) => {
|
|
if (res.code == 200) {
|
|
alert("操作成功");
|
|
CloseEdit();
|
|
Search();
|
|
} else {
|
|
alert(res.msg);
|
|
}
|
|
}).catch(ex => {
|
|
alert("出现了未知的异常,操作失败");
|
|
}).finally(() => {
|
|
ResetFormData();
|
|
hideloading();
|
|
})
|
|
|
|
}, 0);
|
|
|
|
}
|
|
|
|
//导出
|
|
function ExportRecord() {
|
|
showloading('fullLoading');
|
|
proxy?.download(
|
|
'/equipment/repairRecords/export',
|
|
advanceSearch,
|
|
`维修记录_${new Date().getTime()}.xlsx`,
|
|
'post'
|
|
).finally(hideloading);
|
|
|
|
}
|
|
|
|
function RowSelectionChange(row) {
|
|
|
|
}
|
|
//获取已选中的行
|
|
var getSelectionRows = (gridInstance) => {
|
|
|
|
if (gridInstance.value) { // 检查ref是否已正确引用组件实例
|
|
var selectedRows = gridInstance.value.getSelectionRows(); // 获取选中行数据数组
|
|
return selectedRows;
|
|
}
|
|
return [];
|
|
}
|
|
|
|
|
|
|
|
const handleFileChange1 = (file, fileList) => {
|
|
beforeFiles.value = fileList;
|
|
beforeFile.value = fileList.map(f => f.raw);
|
|
};
|
|
|
|
// 处理第二个上传控件的文件变化
|
|
const handleFileChange2 = (file, fileList) => {
|
|
afterFiles.value = fileList;
|
|
afterFile.value = fileList.map(f => f.raw);
|
|
};
|
|
|
|
|
|
window.confirm = function (text, OK, cancel, title) {
|
|
let Cfg = {
|
|
Visible: true,
|
|
title: title ? title : '提示',
|
|
text: text ? text : '此操作不可逆,您确定这样做吗?',
|
|
OkCallback: () => {
|
|
Status.confirm.Visible = false;
|
|
if (OK) {
|
|
OK();
|
|
}
|
|
},
|
|
showCancel: true,
|
|
cancelCallback: () => {
|
|
Status.confirm.Visible = false;
|
|
if (cancel) {
|
|
cancel();
|
|
}
|
|
}
|
|
}
|
|
|
|
Status.confirm = Cfg;
|
|
}
|
|
|
|
window.alert = function (text, OK, title) {
|
|
|
|
let Cfg = {
|
|
Visible: true,
|
|
title: title ? title : '提示',
|
|
text: text ? text : '不符合规则',
|
|
OkCallback: () => {
|
|
Status.confirm.Visible = false;
|
|
if (OK) {
|
|
OK();
|
|
}
|
|
},
|
|
showCancel: false,
|
|
cancelCallback: null
|
|
}
|
|
|
|
Status.confirm = Cfg;
|
|
}
|
|
|
|
var hideConfirm = function () {
|
|
|
|
let Cfg = {
|
|
Visible: false,
|
|
title: '提示',
|
|
text: "",
|
|
cancelCallback: null,
|
|
OkCallback: null
|
|
}
|
|
|
|
Status.confirm = Cfg;
|
|
}
|
|
|
|
var showloading = function (type) {
|
|
if (!type) {
|
|
type = 'loading'
|
|
}
|
|
let arr = ['fullLoading', 'loading', 'devLoading'];
|
|
|
|
arr.forEach(key => {
|
|
if (key == type) {
|
|
Status[key] = true;
|
|
} else {
|
|
Status[key] = false;
|
|
}
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
var closeLoading = function () {
|
|
let arr = ['fullLoading', 'loading', 'devLoading'];
|
|
|
|
arr.forEach(key => {
|
|
Status[key] = false;
|
|
})
|
|
}
|
|
var hideloading = closeLoading;
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
Search();
|
|
api.getDeviceTypeAll(res => {
|
|
if (res.code == 200) {
|
|
|
|
deviceTypes = res.data.map(item => ({
|
|
value: item.deviceTypeId,
|
|
typeName: item.typeName
|
|
}))
|
|
|
|
}
|
|
});
|
|
});
|
|
|
|
///设备相关
|
|
var queryParams = ref({
|
|
pageNum: 1,
|
|
pageSize: 10,
|
|
deviceName: '',
|
|
deviceMac: '',
|
|
deviceImei: '',
|
|
deviceType: '',
|
|
deviceStatus: '',
|
|
|
|
});
|
|
const total = ref(0);
|
|
const queryFormRef = ref<ElFormInstance>();
|
|
const deviceDist = ref<deviceVO[]>();
|
|
const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
|
|
|
|
const getList = async () => {
|
|
showloading('devLoading');
|
|
const res = await deviceapi.deviceList(proxy?.addDateRange(queryParams.value, dateRange.value));
|
|
hideloading();
|
|
deviceDist.value = res.rows;
|
|
total.value = res.total;
|
|
};
|
|
|
|
|
|
/** 搜索按钮操作 */
|
|
const handleQuery = () => {
|
|
queryParams.value.pageNum = 1;
|
|
getList();
|
|
};
|
|
/** 重置按钮操作 */
|
|
const resetQuery = () => {
|
|
queryFormRef.value?.resetFields();
|
|
dateRange.value = ['', ''];
|
|
handleQuery()
|
|
};
|
|
|
|
interface RuleForm {
|
|
recordId: Number,//维修记录id
|
|
createTime: string,
|
|
updateTime: string,
|
|
deviceId: string,//设备id
|
|
repairTime: string,//维修时间
|
|
repairPart: string,//维修部位
|
|
repairReason: string,//维修原因
|
|
repairPerson: string//维修人员
|
|
}
|
|
|
|
|
|
const rules = reactive<FormRules<RuleForm>>({
|
|
|
|
deviceId: [
|
|
{ required: true, message: '请选择设备', trigger: 'blur' },
|
|
],
|
|
repairTime: [
|
|
{ required: true, message: '请选择维修时间', trigger: 'blur' },
|
|
],
|
|
repairPart: [
|
|
{ required: true, message: '请填写维修部位', trigger: 'blur' },
|
|
],
|
|
repairReason: [
|
|
{ required: true, message: '请填写维修原因', trigger: 'blur' },
|
|
],
|
|
repairPerson: [
|
|
{ required: true, message: '请填写维修人员', trigger: 'blur' },
|
|
],
|
|
|
|
})
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
:deep .deviceContnet .el-radio__label {
|
|
display: none !important;
|
|
}
|
|
|
|
.deviceContnet {
|
|
position: relative;
|
|
background-color: #FFFFFF;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.deviceContnet .topSearch {
|
|
position: sticky;
|
|
top: 0px;
|
|
z-index: 9;
|
|
background-color: #FFFFFF;
|
|
}
|
|
|
|
.deviceContnet .footerBtn {
|
|
position: sticky;
|
|
bottom: 0px;
|
|
z-index: 9;
|
|
background-color: #FFFFFF;
|
|
}
|
|
|
|
.deviceContnet .deviceGrid {
|
|
height: calc(92% - 500px);
|
|
}
|
|
|
|
:deep .checkDeviceDialog {
|
|
width: calc(calc(100% - 280px) * 0.9);
|
|
height: 600px;
|
|
}
|
|
|
|
|
|
:deep .el-form--inline .el-form-item {
|
|
margin-right: 15px !important;
|
|
}
|
|
|
|
:deep .el-dialog__body {
|
|
overflow: hidden;
|
|
}
|
|
|
|
:deep .el-form-item__label {
|
|
padding: 0px 5px 0px 0px !important;
|
|
}
|
|
|
|
.advanceSearch {
|
|
display: flex;
|
|
flex-direction: row;
|
|
flex-wrap: wrap;
|
|
align-content: center;
|
|
align-items: center;
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.TopTool .rightSearch {
|
|
display: flex;
|
|
flex-direction: row;
|
|
flex-wrap: nowrap;
|
|
align-content: center;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
|
|
.TopTool .input-with-Search {
|
|
max-width: 175px;
|
|
margin-right: 15px;
|
|
}
|
|
|
|
.TopTool {
|
|
width: 100%;
|
|
padding-bottom: 15px;
|
|
border-bottom: 1px solid #e8e8e8;
|
|
display: flex;
|
|
flex-direction: row;
|
|
flex-wrap: nowrap;
|
|
align-content: center;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.main {
|
|
width: 100%;
|
|
height: 100%;
|
|
box-sizing: border-box;
|
|
border-radius: 4px;
|
|
box-shadow: 0px 0px 6px 0px #0022601a;
|
|
background: #ffffff;
|
|
box-sizing: border-box;
|
|
padding: 12px 12px;
|
|
}
|
|
|
|
.fleft {
|
|
float: left;
|
|
}
|
|
|
|
.fright {
|
|
float: right;
|
|
}
|
|
|
|
.clear {
|
|
clear: both;
|
|
}
|
|
|
|
.center {
|
|
display: flex;
|
|
flex-direction: row;
|
|
flex-wrap: nowrap;
|
|
align-content: center;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.displayNone {
|
|
display: none !important;
|
|
}
|
|
|
|
input:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.H100 {
|
|
height: 100%;
|
|
}
|
|
|
|
.content {
|
|
width: 100%;
|
|
min-height: calc(100vh - 84px);
|
|
height: calc(100vh - 84px);
|
|
background: rgba(247, 248, 252, 1);
|
|
font-size: 16px;
|
|
box-sizing: border-box;
|
|
padding: 8px 20px;
|
|
font-family: 'Microsoft YaHei';
|
|
}
|
|
|
|
.opt .mx-1 {
|
|
margin-right: 10px;
|
|
cursor: pointer;
|
|
}
|
|
</style>
|