1
0
forked from dyf/dyf-vue-ui
Files
dyf-vue-ui/src/views/equipmentManagement/repairRecords/index.vue

1025 lines
31 KiB
Vue
Raw Normal View History

2025-09-03 14:16:47 +08:00
<template>
<div class="content" v-loading="Status.fullLoading">
<div class="main">
2025-12-11 18:26:50 +08:00
<div class ="TopTool">
2025-09-03 14:16:47 +08:00
<div class="button-row">
2025-10-08 14:19:47 +08:00
<el-button type="primary" icon="Plus" @click.stop="ShowEdit(null, true, formRef)">新增维修</el-button>
2025-09-03 14:16:47 +08:00
<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">
2025-12-11 18:26:50 +08:00
<el-input :suffix-icon="'Search'" clearable v-model="advanceSearch.searchValue" class="responsive-input"
placeholder="名称" @input="txtSearch">
2025-09-03 14:16:47 +08:00
</el-input>
2025-09-22 17:34:06 +08:00
<el-button style="margin-left: 10px" type="primary" @click.stop="ToggleAdvance()">高级筛选</el-button>
2025-09-03 14:16:47 +08:00
</div>
</div>
<div class="advanceSearch" v-show="Status.ShowAdvanceSearch">
<el-form :inline="true" :model="advanceSearch" class="demo-form-inline">
2025-09-23 10:26:57 +08:00
<!-- <el-form-item label="设备名称">
<el-input placeholder="请选择" v-model="selectedRow['deviceName']" :readonly="true" @click.stop="ShowDevice('Search', false)" />
2025-09-22 17:34:06 +08:00
<el-select v-model="advanceSearch.deviceId" placeholder="选择设备" clearable filterable>
<el-option v-for="item in deviceDist" :key="item.deviceId" :label="item.deviceName" :value="item.deviceId" />
</el-select>
2025-09-23 10:26:57 +08:00
</el-form-item> -->
2025-09-03 14:16:47 +08:00
<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>
2025-09-28 17:08:52 +08:00
<!-- <el-form-item label="维修原因">
2025-09-03 14:16:47 +08:00
<el-input v-model="advanceSearch.repairReason" placeholder="请输入" clearable />
2025-09-28 17:08:52 +08:00
</el-form-item> -->
2025-09-03 14:16:47 +08:00
<el-form-item label="维修时间">
2025-12-11 18:26:50 +08:00
<el-date-picker v-model="advanceSearch.Date" type="daterange" format="YYYY-MM-DD" style="width: 240px"
value-format="YYYY-MM-DD" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
:size="'default'" />
2025-09-03 14:16:47 +08:00
<div>
2025-09-22 17:34:06 +08:00
<el-button style="margin-left: 5px" type="primary" @click.stop="Search()">查询</el-button>
2025-09-03 14:16:47 +08:00
<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" />
2025-12-11 18:26:50 +08:00
<el-table-column label="操作" align="center" fixed="right" width="280"
class-name="small-padding fixed-width opt">
2025-09-03 14:16:47 +08:00
<template #default="scope">
<div class="center">
2025-10-08 14:19:47 +08:00
<el-text class="mx-1" type="primary" @click.stop="ShowEdit(scope.row, true, formRef)">编辑</el-text>
2025-09-03 14:16:47 +08:00
<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>
2025-12-11 18:26:50 +08:00
<pagination v-show="pagin.total > 0" v-model:page="advanceSearch.pageNum" v-model:limit="advanceSearch.pageSize"
:total="pagin.total" @pagination="getRecordList" />
2025-09-03 14:16:47 +08:00
</div>
</div>
<!-- 新增编辑弹出层 -->
2025-12-11 18:26:50 +08:00
<el-dialog class="editPop" v-model="Status.ShowEditPop" :data-val="Status.ShowEditPop"
:title="!cEdit.isEdit ? '维修详情' : cEdit.recordId ? '编辑维修' : '新增维修'" width="800" :draggable="true">
2025-09-03 14:16:47 +08:00
<div class="form">
2025-10-08 14:19:47 +08:00
<el-form :model="cEdit" ref="formRef" style="max-width: 750px" :rules="rules">
2025-09-28 17:08:52 +08:00
<el-form-item label="设备名称" label-position="right" prop="deviceId">
2025-09-22 17:34:06 +08:00
<!-- <el-input v-model="selectedRow['deviceName']" :readonly="true" @click.stop="ShowDevice('Edit', true)" placeholder="请选择设备" /> -->
<el-select v-model="cEdit.deviceId" placeholder="选择设备" clearable :disabled="!cEdit.isEdit" filterable>
2025-12-11 18:26:50 +08:00
<el-option v-for="item in deviceDist" :key="item.deviceId" :label="item.deviceName"
:value="item.deviceId" /></el-select>
2025-09-03 14:16:47 +08:00
</el-form-item>
2025-09-22 17:34:06 +08:00
2025-09-28 17:08:52 +08:00
<el-form-item label="维修人员" label-position="right" prop="repairPerson">
2025-09-03 14:16:47 +08:00
<el-input v-model="cEdit.repairPerson" :readonly="!cEdit.isEdit" placeholder="请输入姓名" />
</el-form-item>
2025-09-28 17:08:52 +08:00
<el-form-item label="维修时间" label-position="right" prop="repairTime">
2025-12-11 18:26:50 +08:00
<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%" />
2025-09-03 14:16:47 +08:00
</el-form-item>
2025-09-28 17:08:52 +08:00
<el-form-item label="维修部位" label-position="right" prop="repairPart">
2025-09-03 14:16:47 +08:00
<el-input v-model="cEdit.repairPart" :readonly="!cEdit.isEdit" placeholder="请输入维修部位" />
</el-form-item>
2025-09-28 17:08:52 +08:00
<el-form-item label="维修原因" label-position="right" prop="repairReason">
2025-09-03 14:16:47 +08:00
<el-input v-model="cEdit.repairReason" :readonly="!cEdit.isEdit" placeholder="请输入维修原因" />
</el-form-item>
<el-form-item label="损坏照片" label-position="right">
2025-12-11 18:26:50 +08:00
<el-upload :disabled="!cEdit.isEdit" ref="beforeUploadRef" class="upload-demo" action=""
:auto-upload="false" :on-change="handleFileChange1" :file-list="beforeFiles"
accept=".jpg,.jpeg,.png,.gif.webp" :limit="9" list-type="picture-card"
:class="{ 'hide-add-btn': !cEdit.isEdit }">
2025-09-03 14:16:47 +08:00
<el-icon>
<Plus />
</el-icon>
2025-09-22 17:34:06 +08:00
<template #file="{ file, index }">
<!-- 图片预览区域 -->
<div class="el-upload-list__item">
<!-- 图片缩略图 -->
<img :src="file.url" class="el-upload-list__item-thumbnail" />
<!-- 操作按钮组 -->
2025-10-08 14:19:47 +08:00
<div class="el-upload-list__item-actions" v-show="cEdit.isEdit">
2025-09-22 17:34:06 +08:00
<!-- 自定义删除按钮 -->
<span class="el-upload-list__item-delete" @click.stop="dropImg('before', file, index)">
<el-icon>
<Delete />
</el-icon>
</span>
</div>
</div>
</template>
2025-09-03 14:16:47 +08:00
</el-upload>
</el-form-item>
<el-form-item label="修复照片" label-position="right">
2025-12-11 18:26:50 +08:00
<el-upload :disabled="!cEdit.isEdit" ref="afterUploadRef" class="upload-demo" action="" :auto-upload="false"
:on-change="handleFileChange2" :file-list="afterFiles" accept=".jpg,.jpeg,.png,.gif.webp" :limit="9"
list-type="picture-card" :class="{ 'hide-add-btn': !cEdit.isEdit }">
2025-09-03 14:16:47 +08:00
<el-icon>
<Plus />
</el-icon>
2025-09-23 10:26:57 +08:00
<template #file="{ file, index }">
2025-09-22 17:34:06 +08:00
<!-- 图片预览区域 -->
<div class="el-upload-list__item">
<!-- 图片缩略图 -->
2025-09-23 10:26:57 +08:00
<img :src="file.url" class="el-upload-list__item-thumbnail" />
2025-09-22 17:34:06 +08:00
<!-- 操作按钮组 -->
2025-10-08 14:19:47 +08:00
<div class="el-upload-list__item-actions" v-show="cEdit.isEdit">
2025-09-22 17:34:06 +08:00
<!-- 自定义删除按钮 -->
<span class="el-upload-list__item-delete" @click.stop="dropImg('after', file, index)">
<el-icon>
<Delete />
</el-icon>
</span>
</div>
</div>
</template>
2025-09-03 14:16:47 +08:00
</el-upload>
</el-form-item>
</el-form>
</div>
2025-09-22 17:34:06 +08:00
<template #footer>
<div class="dialog-footer">
<div class="center" style="margin-top: 10px">
2025-09-28 17:08:52 +08:00
<el-button type="primary" @click="SaveFormData(formRef)"> 确定 </el-button>
2025-09-22 17:34:06 +08:00
<el-button @click="CloseEdit()"> 取消 </el-button>
</div>
</div>
</template>
2025-09-03 14:16:47 +08:00
</el-dialog>
<!-- 选择设备弹出层 -->
2025-09-22 17:34:06 +08:00
<!-- <el-dialog v-model="Status.ShowCheckDevice" title="选择设备" width="90%" class="checkDeviceDialog" :draggable="true">
2025-09-03 14:16:47 +08:00
<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">
2025-09-22 17:34:06 +08:00
<el-select v-model="queryParams.deviceStatus" placeholder="设备状态" style="margin-left: 10px">
2025-09-03 14:16:47 +08:00
<el-option label="正常" value="1" />
<el-option label="失效" value="0" />
</el-select>
</el-form-item>
<el-form-item label="创建时间">
2025-09-22 17:34:06 +08:00
<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>
2025-09-03 14:16:47 +08:00
</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">
2025-09-22 17:34:06 +08:00
<el-table ref="deviceGrid" v-loading="Status.devLoading" border :data="deviceDist" height="250" @row-click="handleRadioChange">
2025-09-03 14:16:47 +08:00
<el-table-column label="选择" width="80" align="center">
<template #default="scope">
2025-09-22 17:34:06 +08:00
<el-radio :model-value="selectedRowId" :label="scope.row.deviceId" @change="handleRadioChange(scope.row)" />
2025-09-03 14:16:47 +08:00
</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>
2025-09-22 17:34:06 +08:00
<img
:src="scope.row.devicePic"
2025-09-03 14:16:47 +08:00
style="width: 40px; height: 40px; cursor: pointer; object-fit: contain"
2025-09-22 17:34:06 +08:00
class="hover:opacity-80 transition-opacity"
/>
2025-09-03 14:16:47 +08:00
</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>
2025-09-22 17:34:06 +08:00
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
2025-09-03 14:16:47 +08:00
</div>
</div>
2025-09-22 17:34:06 +08:00
<template #footer>
<div class="center" >
<el-button type="primary" @click="CheckDeviceOK()"> 确定 </el-button>
<el-button @click="CloseDevice()"> 取消 </el-button>
</div>
</template>
</el-dialog> -->
2025-09-03 14:16:47 +08:00
<!-- 提示框 -->
2025-12-11 18:26:50 +08:00
<el-dialog :width="300" :draggable="true" v-model="Status.confirm.Visible" :title="Status.confirm.title" width="500"
center>
2025-09-03 14:16:47 +08:00
<span>
{{ Status.confirm.text }}
</span>
<template #footer>
<div class="dialog-footer">
2025-09-22 17:34:06 +08:00
<el-button type="primary" @click="Status.confirm.OkCallback"> 确定 </el-button>
2025-09-03 14:16:47 +08:00
<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';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
2025-09-28 17:08:52 +08:00
2025-09-03 14:16:47 +08:00
var grid = ref(null);
var deviceGrid = ref(null);
//全局状态控制
var Status = reactive({
2025-09-22 17:34:06 +08:00
fullLoading: false, //是否显示全屏loading
loading: false, //是否显示表格区域loading
confirm: {
//弹出框的配置
2025-09-03 14:16:47 +08:00
Visible: false,
title: '',
text: '',
cancelCallback: null,
OkCallback: null,
showCancel: true
},
2025-09-22 17:34:06 +08:00
ShowEditPop: false, //是否显示编辑弹窗
ShowAdvanceSearch: false, //是否显示高级筛选
ShowCheckDevice: false, //是否显示选择设备的弹窗
2025-09-03 14:16:47 +08:00
CheckDeviceType: 'Search'
});
//高级查询
var advanceSearch = reactive({
2025-09-22 17:34:06 +08:00
'recordId': null,
'deviceId': '',
'searchValue': '',
'search': '',
'repairPart': '',
'repairReason': '',
'repairPerson': '',
2025-09-23 10:26:57 +08:00
Date: [],
2025-09-03 14:16:47 +08:00
pageNum: 1,
pageSize: 10
});
//选择设备
2025-09-22 17:34:06 +08:00
var selectedRowId = ref('');
2025-09-03 14:16:47 +08:00
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({
2025-09-22 17:34:06 +08:00
total: 0
2025-09-03 14:16:47 +08:00
});
//列表数据
var List = ref<any[]>(null);
//当前正在编辑的数据
var cEdit = reactive({
2025-09-22 17:34:06 +08:00
recordId: null, //维修记录id
deviceId: '', //设备id
repairTime: '', //维修时间
repairPart: '', //维修部位
repairReason: '', //维修原因
repairPerson: '', //维修人员
2025-09-03 14:16:47 +08:00
isEdit: true,
2025-09-22 17:34:06 +08:00
imageIds: []
2025-09-03 14:16:47 +08:00
});
var deviceTypes = reactive([]);
//重置搜索条件
function Reset() {
let defVal = {
2025-09-22 17:34:06 +08:00
'recordId': null,
'deviceId': '',
'searchValue': '',
'search': '',
'repairPart': '',
'repairReason': '',
'repairPerson': '',
2025-09-23 10:26:57 +08:00
'Date': []
2025-09-03 14:16:47 +08:00
};
2025-09-22 17:34:06 +08:00
selectedRow.value.deviceName = '';
2025-09-03 14:16:47 +08:00
let keys = Object.keys(defVal);
keys.forEach(function (item, index, array) {
advanceSearch[item] = defVal[item];
});
2025-09-22 17:34:06 +08:00
Search();
2025-09-03 14:16:47 +08:00
}
//查询
function Search() {
advanceSearch.pageNum = 1;
getRecordList();
}
//右上角的文本框输入后查询
let searchIntval = null;
function txtSearch() {
clearTimeout(searchIntval);
// 等待 500ms 无输入后执行查询
searchIntval = setTimeout(() => {
Search();
2025-09-23 10:26:57 +08:00
}, 500);
2025-09-03 14:16:47 +08:00
}
//获取列表数据
function getRecordList() {
showloading('loading');
setTimeout(() => {
2025-09-22 17:34:06 +08:00
api
.getRepairList(advanceSearch)
.then((res) => {
if (res.code == 200) {
List.value = res.rows;
pagin.total = res.total;
} else {
alert(res.msg);
}
})
.finally(hideloading);
2025-09-11 11:10:53 +08:00
}, 0);
2025-09-03 14:16:47 +08:00
}
//删除
function DropRecord(arr = undefined) {
if (arr === undefined) {
arr = getSelectionRows(grid);
}
if (arr.length == 0) {
2025-09-22 17:34:06 +08:00
alert('请选择需要删除的数据');
2025-09-03 14:16:47 +08:00
return;
}
2025-09-22 17:34:06 +08:00
confirm(
'您确认删除' + arr.length + '条记录吗?',
() => {
showloading('fullLoading');
arr = arr.map((item) => item.recordId);
2025-10-08 14:19:47 +08:00
api.dropRepir(arr).then((res) => {
if (res && res.code == 200) {
2025-09-28 16:41:41 +08:00
Search();
}
alert(res.msg);
});
2025-09-22 17:34:06 +08:00
},
hideConfirm,
'提示'
);
2025-09-03 14:16:47 +08:00
}
//高级查询显示隐藏
function ToggleAdvance() {
Status.ShowAdvanceSearch = !Status.ShowAdvanceSearch;
}
//显示编辑
2025-10-08 14:19:47 +08:00
function ShowEdit(item = undefined, isEdit = true, formEl = undefined) {
2025-12-11 18:26:50 +08:00
// 先隐藏弹窗,避免提前渲染错误状态
2025-09-03 14:16:47 +08:00
Status.ShowEditPop = true;
let def = {
2025-12-11 18:26:50 +08:00
recordId: null,
deviceId: '',
repairTime: '',
repairPart: '',
repairReason: '',
repairPerson: '',
2025-09-22 17:34:06 +08:00
imageIds: []
};
2025-12-11 18:26:50 +08:00
// 先重置表单和状态,避免残留
ResetFormData();
// 先赋值 isEdit 基础状态
cEdit.isEdit = isEdit;
2025-09-03 14:16:47 +08:00
let promise1 = new Promise((resolve, reject) => {
if (item) {
2025-09-22 17:34:06 +08:00
api
.getRepirDetail(item.recordId)
.then((res) => {
if (res.code == 200) {
resolve(res.data);
} else {
resolve(item);
}
})
.catch((ex) => {
2025-09-03 14:16:47 +08:00
resolve(item);
2025-09-22 17:34:06 +08:00
});
2025-09-03 14:16:47 +08:00
} else {
resolve(item);
}
});
2025-09-22 17:34:06 +08:00
promise1
.then((res) => {
item = res;
if (!item) {
2025-12-11 18:26:50 +08:00
// 新增场景isEdit 保持 true
2025-09-22 17:34:06 +08:00
cEdit.isEdit = isEdit;
return;
2025-09-03 14:16:47 +08:00
}
2025-09-22 17:34:06 +08:00
let keys = Object.keys(cEdit);
keys.forEach((key, i) => {
if (item) {
2025-12-11 18:26:50 +08:00
// 编辑/详情场景,赋值数据
2025-09-22 17:34:06 +08:00
if (item[key] !== undefined) {
cEdit[key] = item[key];
} else {
cEdit[key] = def[key];
}
} else {
2025-12-11 18:26:50 +08:00
// 新增场景
2025-09-22 17:34:06 +08:00
cEdit[key] = def[key];
2025-09-03 14:16:47 +08:00
}
2025-09-22 17:34:06 +08:00
});
if (item.images && item.images.length) {
2025-12-11 18:26:50 +08:00
// 处理图片逻辑(保持原有代码)
2025-09-22 17:34:06 +08:00
beforeFiles.value = item.images
2025-12-11 18:26:50 +08:00
.filter((v) => v.imageType == 'BEFORE')
.map((v) => ({ name: v.imageId, url: v.imageUrl, id: v.imageId }));
2025-09-22 17:34:06 +08:00
afterFiles.value = item.images
2025-12-11 18:26:50 +08:00
.filter((v) => v.imageType == 'AFTER')
.map((v) => ({ name: v.imageId, url: v.imageUrl, id: v.imageId }));
if (formEl) formEl.validate();
2025-09-22 17:34:06 +08:00
}
if (item) {
selectedRow.value['deviceName'] = item.deviceName;
}
2025-12-11 18:26:50 +08:00
// 确保 isEdit 最终赋值正确(覆盖异步过程中可能的异常)
2025-09-22 17:34:06 +08:00
cEdit.isEdit = isEdit;
2025-12-11 18:26:50 +08:00
// 所有状态赋值完成后,再显示弹窗
Status.ShowEditPop = true;
2025-09-22 17:34:06 +08:00
})
.finally(() => {});
2025-09-03 14:16:47 +08:00
}
//关闭编辑弹窗
function CloseEdit() {
Status.ShowEditPop = false;
ResetFormData();
}
//显示选择设备的弹窗
function ShowDevice(type, isvalid) {
if (isvalid && !cEdit.isEdit) {
return;
}
Status.CheckDeviceType = type;
Status.ShowCheckDevice = true;
2025-09-22 17:34:06 +08:00
selectedRowId.value = '';
2025-09-03 14:16:47 +08:00
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() {
2025-09-22 17:34:06 +08:00
cEdit.recordId = null; //维修记录id
cEdit.deviceId = ''; //设备id
cEdit.repairTime = ''; //维修时间
cEdit.repairPart = ''; //维修部位
cEdit.repairReason = ''; //维修原因
cEdit.repairPerson = ''; //维修人员
cEdit.imageIds = [];
selectedRow.value = { deviceName: '', deviceId: '' };
2025-09-03 14:16:47 +08:00
clearUploadFiles();
}
2025-09-22 17:34:06 +08:00
var dropImg = (type, file, index) => {
let runDrop = () => {
if (type == 'after') {
afterFiles.value.splice(index, 1);
}
if (type == 'before') {
2025-09-23 10:26:57 +08:00
beforeFiles.value.splice(index, 1);
2025-09-22 17:34:06 +08:00
}
2025-09-23 10:26:57 +08:00
if (file.id) {
2025-09-22 17:34:06 +08:00
cEdit.imageIds.push(file.id);
}
};
confirm('您确认删除此记录吗?', runDrop, hideConfirm, '提示');
};
2025-09-03 14:16:47 +08:00
//保存表单数据
2025-09-28 17:08:52 +08:00
function SaveFormData(formEl: FormInstance | undefined) {
2025-09-03 14:16:47 +08:00
if (!cEdit.isEdit) {
2025-10-08 14:19:47 +08:00
CloseEdit();
2025-09-03 14:16:47 +08:00
return;
}
2025-10-08 14:19:47 +08:00
if (!formEl) return;
2025-09-28 17:08:52 +08:00
2025-10-08 14:19:47 +08:00
let submit = () => {
showloading('fullLoading');
setTimeout(() => {
let promise = null;
2025-09-03 14:16:47 +08:00
2025-10-08 14:19:47 +08:00
let formData = new FormData();
2025-09-03 14:16:47 +08:00
2025-10-08 14:19:47 +08:00
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]);
2025-09-03 14:16:47 +08:00
}
2025-10-08 14:19:47 +08:00
// 添加第一个控件的文件
if (beforeFile.value.length > 0) {
for (let i = 0; i < beforeFile.value.length; i++) {
let file = beforeFile.value[i];
if (file && !file.id) {
formData.append('beforeFile', file);
}
2025-09-23 10:26:57 +08:00
}
2025-09-22 17:34:06 +08:00
}
2025-09-03 14:16:47 +08:00
2025-10-08 14:19:47 +08:00
if (afterFile.value.length > 0) {
// formData.append('afterFile', afterFile.value[0]);
2025-09-03 14:16:47 +08:00
2025-10-08 14:19:47 +08:00
for (let i = 0; i < afterFile.value.length; i++) {
let file = afterFile.value[i];
if (file && !file.id) {
formData.append('afterFile', file);
}
2025-09-22 17:34:06 +08:00
}
}
2025-09-03 14:16:47 +08:00
2025-10-08 14:19:47 +08:00
if (cEdit.recordId) {
promise = api.updateRepair(formData);
} else {
promise = api.addRepir(formData);
}
2025-09-03 14:16:47 +08:00
2025-10-08 14:19:47 +08:00
promise
.then((res) => {
if (res.code == 200) {
alert('操作成功');
CloseEdit();
Search();
} else {
alert(res.msg);
}
})
.finally(() => {
ResetFormData();
hideloading();
});
}, 0);
};
2025-09-28 17:08:52 +08:00
formEl.validate((valid) => {
if (valid) {
submit();
2025-10-08 14:19:47 +08:00
}
});
2025-09-03 14:16:47 +08:00
}
//导出
function ExportRecord() {
2025-09-22 17:34:06 +08:00
// showloading('fullLoading');
proxy?.download('/equipment/repairRecords/export', advanceSearch, `维修记录_${new Date().getTime()}.xlsx`, 'post').finally(hideloading);
2025-09-03 14:16:47 +08:00
}
2025-12-11 18:26:50 +08:00
function RowSelectionChange(row) { }
2025-09-03 14:16:47 +08:00
//获取已选中的行
var getSelectionRows = (gridInstance) => {
2025-09-22 17:34:06 +08:00
if (gridInstance.value) {
// 检查ref是否已正确引用组件实例
2025-09-03 14:16:47 +08:00
var selectedRows = gridInstance.value.getSelectionRows(); // 获取选中行数据数组
return selectedRows;
}
return [];
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
const handleFileChange1 = (file, fileList) => {
beforeFiles.value = fileList;
2025-09-22 17:34:06 +08:00
beforeFile.value = fileList.map((f) => f.raw);
2025-09-03 14:16:47 +08:00
};
// 处理第二个上传控件的文件变化
const handleFileChange2 = (file, fileList) => {
afterFiles.value = fileList;
2025-09-22 17:34:06 +08:00
afterFile.value = fileList.map((f) => f.raw);
2025-09-03 14:16:47 +08:00
};
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();
}
}
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
Status.confirm = Cfg;
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
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
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
Status.confirm = Cfg;
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
var hideConfirm = function () {
let Cfg = {
Visible: false,
title: '提示',
2025-09-22 17:34:06 +08:00
text: '',
2025-09-03 14:16:47 +08:00
cancelCallback: null,
OkCallback: null
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
Status.confirm = Cfg;
2025-09-22 17:34:06 +08:00
};
2025-09-03 14:16:47 +08:00
var showloading = function (type) {
if (!type) {
2025-09-22 17:34:06 +08:00
type = 'loading';
2025-09-03 14:16:47 +08:00
}
let arr = ['fullLoading', 'loading', 'devLoading'];
2025-09-22 17:34:06 +08:00
arr.forEach((key) => {
2025-09-03 14:16:47 +08:00
if (key == type) {
Status[key] = true;
} else {
Status[key] = false;
}
2025-09-22 17:34:06 +08:00
});
};
2025-09-03 14:16:47 +08:00
var closeLoading = function () {
let arr = ['fullLoading', 'loading', 'devLoading'];
2025-09-22 17:34:06 +08:00
arr.forEach((key) => {
2025-09-03 14:16:47 +08:00
Status[key] = false;
2025-09-22 17:34:06 +08:00
});
};
2025-09-03 14:16:47 +08:00
var hideloading = closeLoading;
onMounted(() => {
Search();
2025-09-22 17:34:06 +08:00
getList();
api.getDeviceTypeAll((res) => {
2025-09-03 14:16:47 +08:00
if (res.code == 200) {
2025-09-22 17:34:06 +08:00
deviceTypes = res.data.map((item) => ({
2025-09-03 14:16:47 +08:00
value: item.deviceTypeId,
typeName: item.typeName
2025-09-22 17:34:06 +08:00
}));
2025-09-03 14:16:47 +08:00
}
});
});
///设备相关
var queryParams = ref({
pageNum: 1,
pageSize: 10,
deviceName: '',
deviceMac: '',
deviceImei: '',
deviceType: '',
2025-09-22 17:34:06 +08:00
deviceStatus: ''
2025-09-03 14:16:47 +08:00
});
const total = ref(0);
2025-09-28 17:08:52 +08:00
const formRef = ref<ElFormInstance>();
2025-09-22 17:34:06 +08:00
const deviceDist = ref<any[]>();
2025-09-03 14:16:47 +08:00
const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
const getList = async () => {
2025-09-22 17:34:06 +08:00
// showloading('devLoading');
// const res = await deviceapi.deviceList(proxy?.addDateRange(queryParams.value, dateRange.value));
// hideloading();
// deviceDist.value = res.rows;
// total.value = res.total;
api.getDeviceAll().then((res) => {
deviceDist.value = res.rows;
});
2025-09-03 14:16:47 +08:00
};
/** 搜索按钮操作 */
2025-09-22 17:34:06 +08:00
// const handleQuery = () => {
// queryParams.value.pageNum = 1;
// getList();
// };
// /** 重置按钮操作 */
// const resetQuery = () => {
// queryFormRef.value?.resetFields();
// dateRange.value = ['', ''];
// handleQuery();
// };
2025-09-03 14:16:47 +08:00
interface RuleForm {
2025-09-22 17:34:06 +08:00
recordId: Number; //维修记录id
createTime: string;
updateTime: string;
deviceId: string; //设备id
repairTime: string; //维修时间
repairPart: string; //维修部位
repairReason: string; //维修原因
repairPerson: string; //维修人员
2025-09-03 14:16:47 +08:00
}
const rules = reactive<FormRules<RuleForm>>({
2025-09-28 17:08:52 +08:00
deviceId: [{ required: true, message: '请选择设备', trigger: 'change' }],
2025-09-22 17:34:06 +08:00
repairTime: [{ required: true, message: '请选择维修时间', trigger: 'blur' }],
repairPart: [{ required: true, message: '请填写维修部位', trigger: 'blur' }],
repairReason: [{ required: true, message: '请填写维修原因', trigger: 'blur' }],
repairPerson: [{ required: true, message: '请填写维修人员', trigger: 'blur' }]
});
2025-09-03 14:16:47 +08:00
</script>
<style lang="scss" scoped>
:deep .deviceContnet .el-radio__label {
display: none !important;
}
.deviceContnet {
position: relative;
2025-09-22 17:34:06 +08:00
background-color: #ffffff;
2025-09-03 14:16:47 +08:00
width: 100%;
height: 100%;
}
.deviceContnet .topSearch {
position: sticky;
top: 0px;
z-index: 9;
2025-09-22 17:34:06 +08:00
background-color: #ffffff;
2025-09-03 14:16:47 +08:00
}
.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;
}
2025-12-11 18:26:50 +08:00
:deep .el-dialog__body .form {}
2025-09-22 17:34:06 +08:00
:deep .el-dialog__body,
.dialog__body {
position: relative;
padding: 0px !important;
}
2025-09-03 14:16:47 +08:00
2025-09-22 17:34:06 +08:00
:deep .el-dialog__body .footerBtn {
position: sticky;
bottom: 0px;
z-index: 9;
background-color: #ffffff;
2025-09-03 14:16:47 +08:00
}
: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;
}
2025-12-11 18:26:50 +08:00
2025-09-22 17:34:06 +08:00
:deep .el-dialog__footer,
.el-dialog__footer {
padding-top: 0px !important;
}
:deep .demo-fit .el-avatar--square,
.demo-fit .el-avatar--square {
margin-right: 10px;
}
2025-09-28 16:41:41 +08:00
:deep .el-upload-list--picture-card .el-upload-list__item .el-upload-list__item,
2025-10-08 14:19:47 +08:00
.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item {
margin: 0px;
2025-09-28 16:41:41 +08:00
}
// :deep .el-upload-list__item,.el-upload-list__item{
// margin-right: 8px !important;
// }
2025-10-08 14:19:47 +08:00
:deep .hide-add-btn .el-upload.is-disabled,
.hide-add-btn .el-upload.is-disabled {
display: none !important;
}
2025-09-03 14:16:47 +08:00
</style>