迁移设备点检功能
This commit is contained in:
@@ -27,3 +27,20 @@ export function deleteItem (data) {
|
|||||||
export function batchDeleteItems (data) {
|
export function batchDeleteItems (data) {
|
||||||
return request({ url: BASE + 'batch_delete', method: 'delete', data: params('device_management_device_check_device_check_items_batch_delete', data) })
|
return request({ url: BASE + 'batch_delete', method: 'delete', data: params('device_management_device_check_device_check_items_batch_delete', data) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getImportTemplate (data) {
|
||||||
|
return request({
|
||||||
|
url: BASE + 'get_import_template',
|
||||||
|
method: 'post',
|
||||||
|
responseType: 'blob',
|
||||||
|
data: params('device_management_device_check_device_check_items_get_import_template', data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function importData (data) {
|
||||||
|
return request({
|
||||||
|
url: BASE + 'import_data_create',
|
||||||
|
method: 'post',
|
||||||
|
data: params('device_management_device_check_device_check_items_import_data_create', data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,14 @@ export function getList (data) {
|
|||||||
return request({ url: BASE + 'list', method: 'get', params: params('device_management_device_check_device_check_items_log_list', data) })
|
return request({ url: BASE + 'list', method: 'get', params: params('device_management_device_check_device_check_items_log_list', data) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getDetails (data) {
|
||||||
|
return request({ url: BASE + 'details', method: 'get', params: params('device_management_device_check_device_check_items_log_details', data) })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDetailsList (data) {
|
||||||
|
return request({ url: BASE + 'details_list', method: 'get', params: params('device_management_device_check_device_check_items_log_details_list', data) })
|
||||||
|
}
|
||||||
|
|
||||||
export function createExportTask (data) {
|
export function createExportTask (data) {
|
||||||
return request({ url: BASE + 'export', method: 'post', data: params('device_management_device_check_device_check_items_log_export', data) })
|
return request({ url: BASE + 'export', method: 'post', data: params('device_management_device_check_device_check_items_log_export', data) })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,5 +13,5 @@ export function createItem (data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function editItem (data) {
|
export function editItem (data) {
|
||||||
return request({ url: BASE + 'create_record', method: 'put', data: params('device_management_device_check_device_check_create_record', data) })
|
return request({ url: BASE + 'edit_record', method: 'post', data: params('device_management_device_check_device_check_edit_record', data) })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1073,15 +1073,30 @@
|
|||||||
"file_column_missing": "Import file is missing column: {title}",
|
"file_column_missing": "Import file is missing column: {title}",
|
||||||
"file_format_error": "Please upload an xls or xlsx file",
|
"file_format_error": "Please upload an xls or xlsx file",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"import_template_name": "Consumables Category Import Template",
|
"import_template_name": "Inspection Item Import Template",
|
||||||
"import_tip": "The uploaded file must be xlsx/xls and follow the template.",
|
"import_tip": "The uploaded file must be xlsx/xls and follow the template.",
|
||||||
"import_title": "Consumables Category Data Import",
|
"import_title": "Inspection Item Data Import",
|
||||||
"length_1_100": "Length must be 1 to 100 characters",
|
"length_1_100": "Length must be 1 to 100 characters",
|
||||||
"please_import_data": "Please import data first",
|
"please_import_data": "Please import data first",
|
||||||
"please_select_data": "Please select data first",
|
"please_select_data": "Please select data first",
|
||||||
"select_file": "Select File",
|
"select_file": "Select File",
|
||||||
"sort": "No.",
|
"sort": "No.",
|
||||||
"update_time": "Updated Time"
|
"update_time": "Updated Time",
|
||||||
|
"device_category": "Device Category",
|
||||||
|
"please_select_device_category": "Please select device category",
|
||||||
|
"check_method": "Inspection Method",
|
||||||
|
"enter_check_method": "Enter inspection method",
|
||||||
|
"unit": "Inspection Unit",
|
||||||
|
"enter_unit": "Enter inspection unit",
|
||||||
|
"frequentness": "Frequency",
|
||||||
|
"enter_frequentness": "Enter frequency",
|
||||||
|
"example": "Example",
|
||||||
|
"enter_example": "Enter example",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"please_select_status": "Please select status",
|
||||||
|
"import_file": "Import File",
|
||||||
|
"duplicate_import_name": "Inspection item name {name} is duplicated. Remove duplicates and upload again."
|
||||||
},
|
},
|
||||||
"inspection_records": {
|
"inspection_records": {
|
||||||
"search": "Search",
|
"search": "Search",
|
||||||
@@ -1222,7 +1237,24 @@
|
|||||||
"standard_service_life": "Standard Service Life",
|
"standard_service_life": "Standard Service Life",
|
||||||
"update_time": "Updated Time",
|
"update_time": "Updated Time",
|
||||||
"warning_life_not_greater_than_standard": "Warning life cannot be greater than standard life",
|
"warning_life_not_greater_than_standard": "Warning life cannot be greater than standard life",
|
||||||
"warning_service_life": "Warning Service Life"
|
"warning_service_life": "Warning Service Life",
|
||||||
|
"add_inspection_record": "Add Inspection Log",
|
||||||
|
"last_inspection_time": "Last Inspection Time",
|
||||||
|
"last_inspection_result": "Last Inspection Result",
|
||||||
|
"last_item_total": "Last Item Total",
|
||||||
|
"last_ng_total": "Last NG Total",
|
||||||
|
"last_ng_rate": "Last NG Rate (%)",
|
||||||
|
"implementation_people": "Implementer",
|
||||||
|
"enter_implementation_people": "Enter implementer",
|
||||||
|
"class_please": "Shift",
|
||||||
|
"please_select_class_please": "Please select shift",
|
||||||
|
"day_shift": "Day",
|
||||||
|
"night_shift": "Night",
|
||||||
|
"check_method": "Inspection Method",
|
||||||
|
"unit": "Inspection Unit",
|
||||||
|
"inspection_value": "Inspection Value",
|
||||||
|
"enter_inspection_value": "Enter inspection value",
|
||||||
|
"inspection_items_empty": "No inspection items. Please configure them first."
|
||||||
},
|
},
|
||||||
"inspection_logs": {
|
"inspection_logs": {
|
||||||
"search": "Search",
|
"search": "Search",
|
||||||
@@ -1335,7 +1367,29 @@
|
|||||||
"replace_reason": "Replacement Reason",
|
"replace_reason": "Replacement Reason",
|
||||||
"enter_replace_reason": "Enter replacement reason",
|
"enter_replace_reason": "Enter replacement reason",
|
||||||
"replace_duration": "Replacement Duration",
|
"replace_duration": "Replacement Duration",
|
||||||
"enter_replace_duration": "Enter replacement duration"
|
"enter_replace_duration": "Enter replacement duration",
|
||||||
|
"device_category": "Device Category",
|
||||||
|
"please_select_device_category": "Please select device category",
|
||||||
|
"start_time": "Start Time",
|
||||||
|
"end_time": "End Time",
|
||||||
|
"create_download_task_success": "Download task created successfully",
|
||||||
|
"details": "Details",
|
||||||
|
"details_title": "Inspection Log Details",
|
||||||
|
"close": "Close",
|
||||||
|
"sort": "No.",
|
||||||
|
"check_method": "Inspection Method",
|
||||||
|
"unit": "Inspection Unit",
|
||||||
|
"frequentness": "Frequency",
|
||||||
|
"example": "Example",
|
||||||
|
"inspection_value": "Inspection Value",
|
||||||
|
"class_please": "Shift",
|
||||||
|
"implementation_people": "Implementer",
|
||||||
|
"operator": "Operator",
|
||||||
|
"item_total": "Item Total",
|
||||||
|
"item_ng_number": "NG Total",
|
||||||
|
"item_ng_rate": "NG Rate (%)",
|
||||||
|
"please_enter_export_device_code": "Enter device code before exporting",
|
||||||
|
"please_select_export_time": "Select inspection time range before exporting"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"maintenance_management": {
|
"maintenance_management": {
|
||||||
@@ -5206,8 +5260,7 @@
|
|||||||
"sampling_time": "Sampling Time",
|
"sampling_time": "Sampling Time",
|
||||||
"sample_value": "Sample Value"
|
"sample_value": "Sample Value"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
,
|
|
||||||
"scada_manage": {
|
"scada_manage": {
|
||||||
"basic_configuration": {
|
"basic_configuration": {
|
||||||
"scada_configure": {
|
"scada_configure": {
|
||||||
@@ -5549,7 +5602,8 @@
|
|||||||
"stop_device": "Stop Device"
|
"stop_device": "Stop Device"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}},
|
}
|
||||||
|
},
|
||||||
"__MENU_TEMP_BEGIN__": "===== 以下为临时菜单翻译,后续统一删除 =====",
|
"__MENU_TEMP_BEGIN__": "===== 以下为临时菜单翻译,后续统一删除 =====",
|
||||||
"设备类型": "Device Type",
|
"设备类型": "Device Type",
|
||||||
"首页": "Home",
|
"首页": "Home",
|
||||||
|
|||||||
@@ -1073,15 +1073,30 @@
|
|||||||
"file_column_missing": "导入文件缺少列:{title}",
|
"file_column_missing": "导入文件缺少列:{title}",
|
||||||
"file_format_error": "请上传 xls 或 xlsx 文件",
|
"file_format_error": "请上传 xls 或 xlsx 文件",
|
||||||
"import": "导入",
|
"import": "导入",
|
||||||
"import_template_name": "损耗品类别导入模板",
|
"import_template_name": "设备点检项目管理导入模板",
|
||||||
"import_tip": "上传的文件后缀必须是 xlsx/xls,且需要按模板填写",
|
"import_tip": "上传的文件后缀必须是 xlsx/xls,且需要按模板填写",
|
||||||
"import_title": "损耗品类别数据导入",
|
"import_title": "设备点检项目数据导入",
|
||||||
"length_1_100": "长度在 1 到 100 个字符",
|
"length_1_100": "长度在 1 到 100 个字符",
|
||||||
"please_import_data": "请先导入数据",
|
"please_import_data": "请先导入数据",
|
||||||
"please_select_data": "请先选择数据",
|
"please_select_data": "请先选择数据",
|
||||||
"select_file": "选择文件",
|
"select_file": "选择文件",
|
||||||
"sort": "序号",
|
"sort": "序号",
|
||||||
"update_time": "更新时间"
|
"update_time": "更新时间",
|
||||||
|
"device_category": "设备类别",
|
||||||
|
"please_select_device_category": "请选择设备类别",
|
||||||
|
"check_method": "点检方法",
|
||||||
|
"enter_check_method": "请输入点检方法",
|
||||||
|
"unit": "点检单位",
|
||||||
|
"enter_unit": "请输入点检单位",
|
||||||
|
"frequentness": "频度",
|
||||||
|
"enter_frequentness": "请输入频度",
|
||||||
|
"example": "例",
|
||||||
|
"enter_example": "请输入例",
|
||||||
|
"enabled": "启用",
|
||||||
|
"disabled": "禁用",
|
||||||
|
"please_select_status": "请选择状态",
|
||||||
|
"import_file": "数据导入表格",
|
||||||
|
"duplicate_import_name": "【{name}】项目名称存在重复值,请去掉重复值并重新上传"
|
||||||
},
|
},
|
||||||
"inspection_records": {
|
"inspection_records": {
|
||||||
"search": "查询",
|
"search": "查询",
|
||||||
@@ -1222,7 +1237,24 @@
|
|||||||
"standard_service_life": "标准使用寿命",
|
"standard_service_life": "标准使用寿命",
|
||||||
"update_time": "更新时间",
|
"update_time": "更新时间",
|
||||||
"warning_life_not_greater_than_standard": "预警使用寿命不能大于标准使用寿命",
|
"warning_life_not_greater_than_standard": "预警使用寿命不能大于标准使用寿命",
|
||||||
"warning_service_life": "预警使用寿命"
|
"warning_service_life": "预警使用寿命",
|
||||||
|
"add_inspection_record": "新增点检日志",
|
||||||
|
"last_inspection_time": "上一次点检时间",
|
||||||
|
"last_inspection_result": "上一次点检结果",
|
||||||
|
"last_item_total": "上一次点检项目总数",
|
||||||
|
"last_ng_total": "上一次点检NG总数",
|
||||||
|
"last_ng_rate": "上一次点检NG率(%)",
|
||||||
|
"implementation_people": "实施人",
|
||||||
|
"enter_implementation_people": "请填写实施人",
|
||||||
|
"class_please": "班别",
|
||||||
|
"please_select_class_please": "请选择班别",
|
||||||
|
"day_shift": "早",
|
||||||
|
"night_shift": "夜",
|
||||||
|
"check_method": "点检方法",
|
||||||
|
"unit": "点检单位",
|
||||||
|
"inspection_value": "点检值",
|
||||||
|
"enter_inspection_value": "请输入点检值",
|
||||||
|
"inspection_items_empty": "设备点检项目为空,请先配置"
|
||||||
},
|
},
|
||||||
"inspection_logs": {
|
"inspection_logs": {
|
||||||
"search": "查询",
|
"search": "查询",
|
||||||
@@ -1335,7 +1367,29 @@
|
|||||||
"replace_reason": "更换原因",
|
"replace_reason": "更换原因",
|
||||||
"enter_replace_reason": "请输入更换原因",
|
"enter_replace_reason": "请输入更换原因",
|
||||||
"replace_duration": "更换耗时",
|
"replace_duration": "更换耗时",
|
||||||
"enter_replace_duration": "请输入更换耗时"
|
"enter_replace_duration": "请输入更换耗时",
|
||||||
|
"device_category": "设备类别",
|
||||||
|
"please_select_device_category": "请选择设备类别",
|
||||||
|
"start_time": "开始时间",
|
||||||
|
"end_time": "结束时间",
|
||||||
|
"create_download_task_success": "创建下载任务成功",
|
||||||
|
"details": "详情",
|
||||||
|
"details_title": "点检日志详情",
|
||||||
|
"close": "关闭",
|
||||||
|
"sort": "序号",
|
||||||
|
"check_method": "点检方法",
|
||||||
|
"unit": "点检单位",
|
||||||
|
"frequentness": "频度",
|
||||||
|
"example": "例",
|
||||||
|
"inspection_value": "点检值",
|
||||||
|
"class_please": "班别",
|
||||||
|
"implementation_people": "实施人",
|
||||||
|
"operator": "操作人",
|
||||||
|
"item_total": "项目总数",
|
||||||
|
"item_ng_number": "NG总数",
|
||||||
|
"item_ng_rate": "NG率(%)",
|
||||||
|
"please_enter_export_device_code": "请输入设备编码后再导出",
|
||||||
|
"please_select_export_time": "请选择点检时间范围后再导出"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"maintenance_management": {
|
"maintenance_management": {
|
||||||
@@ -5206,8 +5260,7 @@
|
|||||||
"sampling_time": "采样时间",
|
"sampling_time": "采样时间",
|
||||||
"sample_value": "样本值"
|
"sample_value": "样本值"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
,
|
|
||||||
"scada_manage": {
|
"scada_manage": {
|
||||||
"basic_configuration": {
|
"basic_configuration": {
|
||||||
"scada_configure": {
|
"scada_configure": {
|
||||||
@@ -5549,7 +5602,8 @@
|
|||||||
"stop_device": "停止设备"
|
"stop_device": "停止设备"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}},
|
}
|
||||||
|
},
|
||||||
"__MENU_TEMP_BEGIN__": "===== 以下为临时菜单翻译,后续统一删除 =====",
|
"__MENU_TEMP_BEGIN__": "===== 以下为临时菜单翻译,后续统一删除 =====",
|
||||||
"设备类型": "设备类型",
|
"设备类型": "设备类型",
|
||||||
"首页": "首页",
|
"首页": "首页",
|
||||||
|
|||||||
@@ -2,15 +2,26 @@
|
|||||||
<d2-container>
|
<d2-container>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="search-bar">
|
<div class="search-bar">
|
||||||
<el-form :inline="true" size="mini">
|
<el-form :inline="true" :model="search" size="mini">
|
||||||
<el-form-item :label="$t(key('keyword'))">
|
<el-form-item :label="$t(key('device_category'))">
|
||||||
<el-input
|
<el-select v-model="search.device_category_id" :placeholder="$t(key('please_select_device_category'))" clearable filterable style="width:200px">
|
||||||
v-model="search.keyword"
|
<el-option v-for="item in deviceCategoryOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
:placeholder="$t(key('enter_keyword'))"
|
</el-select>
|
||||||
clearable
|
</el-form-item>
|
||||||
style="width:200px"
|
<el-form-item :label="$t(key('inspection_item_name'))">
|
||||||
@keyup.enter.native="onSearch"
|
<el-input v-model.trim="search.name" :placeholder="$t(key('enter_inspection_item_name'))" clearable style="width:200px" @keyup.enter.native="onSearch" />
|
||||||
/>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('check_method'))">
|
||||||
|
<el-input v-model.trim="search.check_method" :placeholder="$t(key('enter_check_method'))" clearable style="width:190px" @keyup.enter.native="onSearch" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('standard'))">
|
||||||
|
<el-input v-model.trim="search.standard" :placeholder="$t(key('enter_standard'))" clearable style="width:190px" @keyup.enter.native="onSearch" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('unit'))">
|
||||||
|
<el-input v-model.trim="search.unit" :placeholder="$t(key('enter_unit'))" clearable style="width:160px" @keyup.enter.native="onSearch" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('create_time'))">
|
||||||
|
<el-date-picker v-model="search.create_time" type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss" :start-placeholder="$t(key('start_time'))" :end-placeholder="$t(key('end_time'))" style="width:330px" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="onSearch">{{ $t(key('search')) }}</el-button>
|
<el-button type="primary" icon="el-icon-search" @click="onSearch">{{ $t(key('search')) }}</el-button>
|
||||||
@@ -30,14 +41,20 @@
|
|||||||
:pagination="pagination"
|
:pagination="pagination"
|
||||||
auto-height
|
auto-height
|
||||||
@page-change="onPageChange"
|
@page-change="onPageChange"
|
||||||
@selection-change="onSelect"
|
@selection-change="selectedRows = $event"
|
||||||
/>
|
>
|
||||||
|
<template #col-status="{ row }">
|
||||||
|
<el-tag :type="Number(row.status) === 1 ? 'success' : 'info'" size="mini">
|
||||||
|
{{ Number(row.status) === 1 ? $t(key('enabled')) : $t(key('disabled')) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</page-table>
|
||||||
|
|
||||||
<page-dialog-form
|
<page-dialog-form
|
||||||
ref="dialogForm"
|
ref="dialogForm"
|
||||||
:visible.sync="dialogVisible"
|
:visible.sync="dialogVisible"
|
||||||
:title="dialogTitle"
|
:title="dialogTitle"
|
||||||
width="40%"
|
width="700px"
|
||||||
:form-cols="formCols"
|
:form-cols="formCols"
|
||||||
:form-data="formData"
|
:form-data="formData"
|
||||||
:rules="rules"
|
:rules="rules"
|
||||||
@@ -46,8 +63,39 @@
|
|||||||
:confirm-text="key('confirm')"
|
:confirm-text="key('confirm')"
|
||||||
:cancel-text="key('cancel')"
|
:cancel-text="key('cancel')"
|
||||||
@submit="onDialogSubmit"
|
@submit="onDialogSubmit"
|
||||||
@close="onDialogClose"
|
@close="resetForm"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<el-dialog :title="$t(key('import_title'))" :visible.sync="importVisible" width="900px" :close-on-click-modal="false">
|
||||||
|
<el-alert :title="$t(key('import_tip'))" type="warning" :closable="false" />
|
||||||
|
<el-form size="mini" label-width="130px" class="import-form">
|
||||||
|
<el-form-item :label="$t(key('device_category'))" required>
|
||||||
|
<el-select v-model="importDeviceCategoryId" :placeholder="$t(key('please_select_device_category'))" clearable filterable style="width:260px">
|
||||||
|
<el-option v-for="item in deviceCategoryOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('import_file'))">
|
||||||
|
<el-upload action="" :auto-upload="false" :show-file-list="true" :file-list="importFileList" accept=".xls,.xlsx" :on-change="onImportFileChange">
|
||||||
|
<el-button slot="trigger" size="mini" type="success">{{ $t(key('select_file')) }}</el-button>
|
||||||
|
<el-button style="margin-left:10px" size="mini" type="primary" :loading="importLoading" @click.stop="downloadTemplate">{{ $t(key('download_template')) }}</el-button>
|
||||||
|
</el-upload>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<el-table v-loading="importTableLoading" :data="importRows" border height="330" size="mini">
|
||||||
|
<el-table-column prop="name" :label="$t(key('inspection_item_name'))" min-width="130" />
|
||||||
|
<el-table-column prop="status" :label="$t(key('status'))" width="100" />
|
||||||
|
<el-table-column prop="standard" :label="$t(key('standard'))" min-width="130" />
|
||||||
|
<el-table-column prop="check_method" :label="$t(key('check_method'))" min-width="130" />
|
||||||
|
<el-table-column prop="unit" :label="$t(key('unit'))" width="110" />
|
||||||
|
<el-table-column prop="frequentness" :label="$t(key('frequentness'))" width="110" />
|
||||||
|
<el-table-column prop="example" :label="$t(key('example'))" width="110" />
|
||||||
|
<el-table-column prop="remark" :label="$t(key('remark'))" min-width="130" />
|
||||||
|
</el-table>
|
||||||
|
<span slot="footer">
|
||||||
|
<el-button @click="importVisible = false">{{ $t(key('cancel')) }}</el-button>
|
||||||
|
<el-button type="primary" @click="submitImport">{{ $t(key('confirm')) }}</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
</d2-container>
|
</d2-container>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -58,7 +106,21 @@ import { i18nMixin } from '@/composables/useI18n'
|
|||||||
import { confirmMixin } from '@/composables/useConfirmHandle'
|
import { confirmMixin } from '@/composables/useConfirmHandle'
|
||||||
import PageTable from '@/components/page-table'
|
import PageTable from '@/components/page-table'
|
||||||
import PageDialogForm from '@/components/page-dialog-form'
|
import PageDialogForm from '@/components/page-dialog-form'
|
||||||
import { getList, createItem, editItem, deleteItem } from '@/api/equipment-management/inspection-items'
|
import { downloadRename, readExcel } from '@/utils/file'
|
||||||
|
import { getEquipmentCategoryALL } from '@/api/equipment-management/equipment-category'
|
||||||
|
import { getList, createItem, editItem, deleteItem, batchDeleteItems, getImportTemplate, importData } from '@/api/equipment-management/inspection-items'
|
||||||
|
|
||||||
|
function readPageData (res) {
|
||||||
|
const data = res && res.data !== undefined ? res.data : res
|
||||||
|
if (Array.isArray(data)) return { list: data, total: data.length }
|
||||||
|
if (data && Array.isArray(data.data)) return { list: data.data, total: Number(data.count || data.total || data.data.length) }
|
||||||
|
if (data && data.data && Array.isArray(data.data.data)) return { list: data.data.data, total: Number(data.data.count || data.data.total || data.data.data.length) }
|
||||||
|
return { list: [], total: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
function toOptions (list) {
|
||||||
|
return (Array.isArray(list) ? list : []).map(item => ({ label: item.name || item.label, value: item.id || item.value, raw: item }))
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'equipment-management-inspection-items',
|
name: 'equipment-management-inspection-items',
|
||||||
@@ -70,108 +132,77 @@ export default {
|
|||||||
submitting: false,
|
submitting: false,
|
||||||
tableData: [],
|
tableData: [],
|
||||||
selectedRows: [],
|
selectedRows: [],
|
||||||
|
deviceCategoryOptions: [],
|
||||||
|
search: { device_category_id: '', name: '', check_method: '', standard: '', unit: '', create_time: [] },
|
||||||
|
pagination: { current: 1, size: 10, total: 0 },
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
dialogTitle: '',
|
dialogTitle: '',
|
||||||
editId: '',
|
|
||||||
handleType: 'create',
|
handleType: 'create',
|
||||||
search: {
|
editId: '',
|
||||||
keyword: ''
|
formData: this.emptyForm(),
|
||||||
},
|
importVisible: false,
|
||||||
pagination: { current: 1, size: 10, total: 0 },
|
importDeviceCategoryId: '',
|
||||||
formData: {
|
importFileList: [],
|
||||||
device_check_item_code: '',
|
importRows: [],
|
||||||
device_check_item_name: '',
|
importLoading: false,
|
||||||
device_id: '',
|
importTableLoading: false,
|
||||||
cycle: '',
|
|
||||||
standard: '',
|
|
||||||
remark: ''
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
device_check_item_code: [{ required: true, message: this.key('enter_inspection_item_code'), trigger: 'blur' }],
|
|
||||||
device_check_item_name: [{ required: true, message: this.key('enter_inspection_item_name'), trigger: 'blur' }]
|
|
||||||
},
|
|
||||||
columns: [],
|
columns: [],
|
||||||
toolbarButtons: [],
|
toolbarButtons: [],
|
||||||
rowButtons: [],
|
rowButtons: [],
|
||||||
formCols: [
|
rules: {
|
||||||
[
|
name: [
|
||||||
{
|
{ required: true, message: this.key('enter_inspection_item_name'), trigger: 'blur' },
|
||||||
type: 'input',
|
{ min: 1, max: 100, message: this.key('length_1_100'), trigger: 'blur' }
|
||||||
prop: 'device_check_item_code',
|
],
|
||||||
label: this.key('inspection_item_code'),
|
device_category_id: [{ required: true, message: this.key('please_select_device_category'), trigger: 'change' }],
|
||||||
placeholder: this.key('enter_inspection_item_code'),
|
status: [{ required: true, message: this.key('please_select_status'), trigger: 'change' }]
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
formCols () {
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
{ type: 'input', prop: 'name', label: this.key('inspection_item_name'), placeholder: this.key('enter_inspection_item_name'), style: { width: '100%' } },
|
||||||
|
{ type: 'select', prop: 'device_category_id', label: this.key('device_category'), placeholder: this.key('please_select_device_category'), options: this.deviceCategoryOptions, style: { width: '100%' } }
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
{
|
{ type: 'select', prop: 'status', label: this.key('status'), placeholder: this.key('please_select_status'), options: [{ label: this.$t(this.key('enabled')), value: 1 }, { label: this.$t(this.key('disabled')), value: 0 }], style: { width: '100%' } },
|
||||||
type: 'input',
|
{ type: 'input', prop: 'standard', label: this.key('standard'), placeholder: this.key('enter_standard'), style: { width: '100%' } }
|
||||||
prop: 'device_check_item_name',
|
|
||||||
label: this.key('inspection_item_name'),
|
|
||||||
placeholder: this.key('enter_inspection_item_name'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
{
|
{ type: 'input', prop: 'check_method', label: this.key('check_method'), placeholder: this.key('enter_check_method'), style: { width: '100%' } },
|
||||||
type: 'input',
|
{ type: 'input', prop: 'unit', label: this.key('unit'), placeholder: this.key('enter_unit'), style: { width: '100%' } }
|
||||||
prop: 'device_id',
|
|
||||||
label: this.key('device_id'),
|
|
||||||
placeholder: this.key('enter_device_id'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
{
|
{ type: 'input', prop: 'frequentness', label: this.key('frequentness'), placeholder: this.key('enter_frequentness'), style: { width: '100%' } },
|
||||||
type: 'input',
|
{ type: 'input', prop: 'example', label: this.key('example'), placeholder: this.key('enter_example'), style: { width: '100%' } }
|
||||||
prop: 'cycle',
|
|
||||||
label: this.key('cycle'),
|
|
||||||
placeholder: this.key('enter_cycle'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
[
|
[{ type: 'input', prop: 'remark', label: this.key('remark'), placeholder: this.key('enter_remark'), inputType: 'textarea', autosize: { minRows: 2, maxRows: 6 }, style: { width: '100%' } }]
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'standard',
|
|
||||||
label: this.key('standard'),
|
|
||||||
placeholder: this.key('enter_standard'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'remark',
|
|
||||||
label: this.key('remark'),
|
|
||||||
placeholder: this.key('enter_remark'),
|
|
||||||
inputType: 'textarea',
|
|
||||||
autosize: { minRows: 2, maxRows: 6 },
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
this.columns = useTableColumns([
|
this.columns = useTableColumns([
|
||||||
{ prop: 'device_check_item_code', label: this.key('inspection_item_code'), minWidth: 140 },
|
{ prop: 'sort', label: this.key('sort'), width: 80 },
|
||||||
{ prop: 'device_check_item_name', label: this.key('inspection_item_name'), minWidth: 140 },
|
{ prop: 'name', label: this.key('inspection_item_name'), minWidth: 150 },
|
||||||
{ prop: 'device_name', label: this.key('device_name'), minWidth: 140 },
|
{ prop: 'device_category_name', label: this.key('device_category'), minWidth: 140 },
|
||||||
{ prop: 'cycle', label: this.key('cycle'), minWidth: 140 },
|
{ prop: 'status', label: this.key('status'), slot: 'status', width: 100 },
|
||||||
{ prop: 'standard', label: this.key('standard'), minWidth: 140 },
|
{ prop: 'standard', label: this.key('standard'), minWidth: 140, showOverflowTooltip: true },
|
||||||
{ prop: 'remark', label: this.key('remark'), minWidth: 140 },
|
{ prop: 'check_method', label: this.key('check_method'), minWidth: 140, showOverflowTooltip: true },
|
||||||
|
{ prop: 'unit', label: this.key('unit'), minWidth: 100 },
|
||||||
|
{ prop: 'frequentness', label: this.key('frequentness'), minWidth: 110 },
|
||||||
|
{ prop: 'example', label: this.key('example'), minWidth: 110 },
|
||||||
|
{ prop: 'remark', label: this.key('remark'), minWidth: 140, showOverflowTooltip: true },
|
||||||
|
{ prop: 'create_time', label: this.key('create_time'), minWidth: 160 },
|
||||||
|
{ prop: 'update_time', label: this.key('update_time'), minWidth: 160 },
|
||||||
{ prop: '_actions', label: this.key('operation'), width: 170, fixed: 'right' }
|
{ prop: '_actions', label: this.key('operation'), width: 170, fixed: 'right' }
|
||||||
])
|
])
|
||||||
const btns = useTableButtons({
|
const btns = useTableButtons({
|
||||||
toolbar: [
|
toolbar: [
|
||||||
{ key: 'add', label: this.key('add'), icon: 'el-icon-plus', type: 'primary', auth: '/device_management/device_check/device_check_items/create', onClick: this.openAdd }
|
{ key: 'add', label: this.key('add'), icon: 'el-icon-plus', type: 'primary', auth: '/device_management/device_check/device_check_items/create', onClick: this.openAdd },
|
||||||
|
{ key: 'batch_delete', label: this.key('batch_delete'), icon: 'el-icon-delete', type: 'danger', auth: '/device_management/device_check/device_check_items/batch-delete', needSelection: true, disabledTip: this.key('please_select_data'), onClick: this.handleBatchDelete },
|
||||||
|
{ key: 'import', label: this.key('import'), icon: 'el-icon-upload2', type: 'success', auth: '/device_management/device_check/device_check_items/import', onClick: this.openImport }
|
||||||
],
|
],
|
||||||
row: [
|
row: [
|
||||||
{ key: 'edit', label: this.key('edit'), icon: 'el-icon-edit', auth: '/device_management/device_check/device_check_items/edit', onClick: this.openEdit },
|
{ key: 'edit', label: this.key('edit'), icon: 'el-icon-edit', auth: '/device_management/device_check/device_check_items/edit', onClick: this.openEdit },
|
||||||
@@ -180,23 +211,29 @@ export default {
|
|||||||
}, this.$permission)
|
}, this.$permission)
|
||||||
this.toolbarButtons = btns.toolbarButtons
|
this.toolbarButtons = btns.toolbarButtons
|
||||||
this.rowButtons = btns.rowButtons
|
this.rowButtons = btns.rowButtons
|
||||||
|
this.loadDeviceCategories()
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
normalizeResponse (res) {
|
emptyForm () {
|
||||||
const data = res && res.data !== undefined ? res.data : res
|
return { name: '', device_category_id: '', status: 1, standard: '', check_method: '', unit: '', frequentness: '', example: '', remark: '' }
|
||||||
if (Array.isArray(data)) return { list: data, total: data.length }
|
},
|
||||||
if (data && Array.isArray(data.data)) return { list: data.data, total: Number(data.count || data.total || data.data.length) }
|
async loadDeviceCategories () {
|
||||||
if (data && data.data && Array.isArray(data.data.data)) return { list: data.data.data, total: Number(data.data.count || data.data.total || data.data.data.length) }
|
const res = await getEquipmentCategoryALL({})
|
||||||
return { list: [], total: 0 }
|
this.deviceCategoryOptions = toOptions((res && res.data) || res)
|
||||||
|
},
|
||||||
|
buildSearchParams () {
|
||||||
|
const params = { ...this.search }
|
||||||
|
if (!Array.isArray(params.create_time) || !params.create_time.length) delete params.create_time
|
||||||
|
return params
|
||||||
},
|
},
|
||||||
async fetchData () {
|
async fetchData () {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
try {
|
try {
|
||||||
const res = await getList({ ...this.search, page_no: this.pagination.current, page_size: this.pagination.size })
|
const res = await getList({ ...this.buildSearchParams(), page_no: this.pagination.current, page_size: this.pagination.size })
|
||||||
const data = this.normalizeResponse(res)
|
const page = readPageData(res)
|
||||||
this.tableData = data.list
|
this.tableData = page.list
|
||||||
this.pagination.total = data.total
|
this.pagination.total = page.total
|
||||||
} finally {
|
} finally {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
@@ -206,9 +243,7 @@ export default {
|
|||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
onReset () {
|
onReset () {
|
||||||
this.search = {
|
this.search = { device_category_id: '', name: '', check_method: '', standard: '', unit: '', create_time: [] }
|
||||||
keyword: ''
|
|
||||||
}
|
|
||||||
this.pagination.current = 1
|
this.pagination.current = 1
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
@@ -217,39 +252,29 @@ export default {
|
|||||||
this.pagination.size = page.size
|
this.pagination.size = page.size
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
onSelect (rows) {
|
|
||||||
this.selectedRows = rows
|
|
||||||
},
|
|
||||||
resetForm () {
|
resetForm () {
|
||||||
this.formData = {
|
this.formData = this.emptyForm()
|
||||||
device_check_item_code: '',
|
|
||||||
device_check_item_name: '',
|
|
||||||
device_id: '',
|
|
||||||
cycle: '',
|
|
||||||
standard: '',
|
|
||||||
remark: ''
|
|
||||||
}
|
|
||||||
this.editId = ''
|
this.editId = ''
|
||||||
},
|
},
|
||||||
openAdd () {
|
openAdd () {
|
||||||
this.handleType = 'create'
|
this.handleType = 'create'
|
||||||
this.dialogTitle = this.key('add_title')
|
this.dialogTitle = this.key('add_title')
|
||||||
this.$nextTick(() => {
|
|
||||||
this.$refs.dialogForm && this.$refs.dialogForm.reset()
|
|
||||||
this.resetForm()
|
this.resetForm()
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
})
|
|
||||||
},
|
},
|
||||||
openEdit (row) {
|
openEdit (row) {
|
||||||
this.handleType = 'edit'
|
this.handleType = 'edit'
|
||||||
this.dialogTitle = this.key('edit_title')
|
this.dialogTitle = this.key('edit_title')
|
||||||
this.editId = row.id
|
this.editId = row.id
|
||||||
this.formData = {
|
this.formData = {
|
||||||
device_check_item_code: row.device_check_item_code || '',
|
name: row.name || '',
|
||||||
device_check_item_name: row.device_check_item_name || '',
|
device_category_id: row.device_category_id || '',
|
||||||
device_id: row.device_id || '',
|
status: Number(row.status),
|
||||||
cycle: row.cycle || '',
|
|
||||||
standard: row.standard || '',
|
standard: row.standard || '',
|
||||||
|
check_method: row.check_method || '',
|
||||||
|
unit: row.unit || '',
|
||||||
|
frequentness: row.frequentness || '',
|
||||||
|
example: row.example || '',
|
||||||
remark: row.remark || ''
|
remark: row.remark || ''
|
||||||
}
|
}
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
@@ -266,17 +291,102 @@ export default {
|
|||||||
this.submitting = false
|
this.submitting = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDialogClose () {
|
|
||||||
this.resetForm()
|
|
||||||
},
|
|
||||||
async handleDelete (row) {
|
async handleDelete (row) {
|
||||||
const cancelled = await this.$confirmAction(
|
const cancelled = await this.$confirmAction(
|
||||||
{ message: this.key('confirm_delete'), title: this.key('tip') },
|
{ message: this.key('confirm_delete'), title: this.key('tip'), confirmButtonText: this.key('confirm'), cancelButtonText: this.key('cancel') },
|
||||||
() => deleteItem({ id: [row.id] })
|
() => deleteItem({ id: [row.id] })
|
||||||
)
|
)
|
||||||
if (cancelled) return
|
if (!cancelled) {
|
||||||
this.$message.success(this.$t(this.key('operation_success')))
|
this.$message.success(this.$t(this.key('operation_success')))
|
||||||
this.pagination.current = Math.min(this.pagination.current, Math.ceil((this.pagination.total - 1) / this.pagination.size) || 1)
|
this.fetchData()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async handleBatchDelete () {
|
||||||
|
if (!this.selectedRows.length) {
|
||||||
|
this.$message.warning(this.$t(this.key('please_select_data')))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const ids = this.selectedRows.map(item => item.id)
|
||||||
|
const cancelled = await this.$confirmAction(
|
||||||
|
{ message: this.key('confirm_batch_delete'), title: this.key('tip'), confirmButtonText: this.key('confirm'), cancelButtonText: this.key('cancel') },
|
||||||
|
() => batchDeleteItems({ id: ids })
|
||||||
|
)
|
||||||
|
if (!cancelled) {
|
||||||
|
this.$message.success(this.$t(this.key('operation_success')))
|
||||||
|
this.fetchData()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
openImport () {
|
||||||
|
this.importDeviceCategoryId = ''
|
||||||
|
this.importFileList = []
|
||||||
|
this.importRows = []
|
||||||
|
this.importVisible = true
|
||||||
|
},
|
||||||
|
async downloadTemplate () {
|
||||||
|
this.importLoading = true
|
||||||
|
try {
|
||||||
|
const res = await getImportTemplate({})
|
||||||
|
downloadRename(res, 'xlsx', this.$t(this.key('import_template_name')))
|
||||||
|
} finally {
|
||||||
|
this.importLoading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async onImportFileChange (file) {
|
||||||
|
if (!file || !/\.(xls|xlsx)$/i.test(file.name)) {
|
||||||
|
this.$message.error(this.$t(this.key('file_format_error')))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.importFileList = [file]
|
||||||
|
this.importTableLoading = true
|
||||||
|
try {
|
||||||
|
const rows = await readExcel(file.raw)
|
||||||
|
const headers = ['inspection_item_name', 'status', 'standard', 'check_method', 'unit', 'frequentness', 'example', 'remark'].map(item => this.$t(this.key(item)))
|
||||||
|
const first = rows[0] || {}
|
||||||
|
for (const title of headers) {
|
||||||
|
if (!Object.prototype.hasOwnProperty.call(first, title)) {
|
||||||
|
this.$message.error(this.$t(this.key('file_column_missing'), { title }))
|
||||||
|
this.importRows = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const names = new Set()
|
||||||
|
const normalized = []
|
||||||
|
for (const row of rows) {
|
||||||
|
const name = row[headers[0]]
|
||||||
|
if (names.has(name)) {
|
||||||
|
this.$message.error(this.$t(this.key('duplicate_import_name'), { name }))
|
||||||
|
this.importRows = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
names.add(name)
|
||||||
|
normalized.push({
|
||||||
|
name,
|
||||||
|
status: row[headers[1]],
|
||||||
|
standard: row[headers[2]],
|
||||||
|
check_method: row[headers[3]],
|
||||||
|
unit: row[headers[4]],
|
||||||
|
frequentness: row[headers[5]],
|
||||||
|
example: row[headers[6]],
|
||||||
|
remark: row[headers[7]]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.importRows = normalized
|
||||||
|
} finally {
|
||||||
|
this.importTableLoading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async submitImport () {
|
||||||
|
if (!this.importDeviceCategoryId) {
|
||||||
|
this.$message.warning(this.$t(this.key('please_select_device_category')))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!this.importRows.length) {
|
||||||
|
this.$message.warning(this.$t(this.key('please_import_data')))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await importData({ device_category_id: this.importDeviceCategoryId, import_data: JSON.stringify(this.importRows) })
|
||||||
|
this.$message.success(this.$t(this.key('operation_success')))
|
||||||
|
this.importVisible = false
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -285,5 +395,6 @@ export default {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.search-bar { padding: 10px 0; }
|
.search-bar { padding: 10px 0; }
|
||||||
|
.import-form { margin-top: 14px; }
|
||||||
/deep/ .el-form-item--mini.el-form-item { margin-bottom: 4px; }
|
/deep/ .el-form-item--mini.el-form-item { margin-bottom: 4px; }
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -2,15 +2,20 @@
|
|||||||
<d2-container>
|
<d2-container>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="search-bar">
|
<div class="search-bar">
|
||||||
<el-form :inline="true" size="mini">
|
<el-form :inline="true" :model="search" size="mini">
|
||||||
<el-form-item :label="$t(key('keyword'))">
|
<el-form-item :label="$t(key('device_category'))">
|
||||||
<el-input
|
<el-select v-model="search.device_category_id" :placeholder="$t(key('please_select_device_category'))" clearable filterable style="width:210px">
|
||||||
v-model="search.keyword"
|
<el-option v-for="item in deviceCategoryOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
:placeholder="$t(key('enter_keyword'))"
|
</el-select>
|
||||||
clearable
|
</el-form-item>
|
||||||
style="width:200px"
|
<el-form-item :label="$t(key('device_code'))">
|
||||||
@keyup.enter.native="onSearch"
|
<el-input v-model.trim="search.device_code" :placeholder="$t(key('enter_device_code'))" clearable style="width:200px" @keyup.enter.native="onSearch" />
|
||||||
/>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('device_name'))">
|
||||||
|
<el-input v-model.trim="search.device_name" :placeholder="$t(key('enter_device_name'))" clearable style="width:200px" @keyup.enter.native="onSearch" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('create_time'))">
|
||||||
|
<el-date-picker v-model="search.create_time" type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss" :start-placeholder="$t(key('start_time'))" :end-placeholder="$t(key('end_time'))" style="width:330px" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="onSearch">{{ $t(key('search')) }}</el-button>
|
<el-button type="primary" icon="el-icon-search" @click="onSearch">{{ $t(key('search')) }}</el-button>
|
||||||
@@ -30,8 +35,36 @@
|
|||||||
:pagination="pagination"
|
:pagination="pagination"
|
||||||
auto-height
|
auto-height
|
||||||
@page-change="onPageChange"
|
@page-change="onPageChange"
|
||||||
@selection-change="onSelect"
|
>
|
||||||
/>
|
<template #col-result="{ row }">
|
||||||
|
<el-tag :type="row.result === 'OK' ? 'success' : 'danger'" size="mini">{{ row.result }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</page-table>
|
||||||
|
|
||||||
|
<el-dialog :title="$t(key('details_title'))" :visible.sync="detailsVisible" width="1050px" :close-on-click-modal="false">
|
||||||
|
<el-table v-loading="detailsLoading" :data="detailsData" border height="460" size="mini">
|
||||||
|
<el-table-column prop="sort" :label="$t(key('sort'))" width="70" />
|
||||||
|
<el-table-column prop="device_check_items_name" :label="$t(key('inspection_item_name'))" min-width="150" />
|
||||||
|
<el-table-column prop="result" :label="$t(key('inspection_result'))" width="100">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="row.result === 'OK' ? 'success' : 'danger'" size="mini">{{ row.result }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="val" :label="$t(key('inspection_value'))" min-width="110" />
|
||||||
|
<el-table-column prop="standard" :label="$t(key('standard'))" min-width="140" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="check_method" :label="$t(key('check_method'))" min-width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="unit" :label="$t(key('unit'))" width="90" />
|
||||||
|
<el-table-column prop="frequentness" :label="$t(key('frequentness'))" width="110" />
|
||||||
|
<el-table-column prop="example" :label="$t(key('example'))" width="110" />
|
||||||
|
<el-table-column prop="class_please" :label="$t(key('class_please'))" width="100" />
|
||||||
|
<el-table-column prop="implementation_people" :label="$t(key('implementation_people'))" min-width="120" />
|
||||||
|
<el-table-column prop="username" :label="$t(key('operator'))" min-width="120" />
|
||||||
|
<el-table-column prop="create_time" :label="$t(key('inspection_time'))" min-width="160" />
|
||||||
|
</el-table>
|
||||||
|
<span slot="footer">
|
||||||
|
<el-button @click="detailsVisible = false">{{ $t(key('close')) }}</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
</d2-container>
|
</d2-container>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -41,7 +74,27 @@ import { useTableButtons } from '@/composables/useTableButtons'
|
|||||||
import { i18nMixin } from '@/composables/useI18n'
|
import { i18nMixin } from '@/composables/useI18n'
|
||||||
import { confirmMixin } from '@/composables/useConfirmHandle'
|
import { confirmMixin } from '@/composables/useConfirmHandle'
|
||||||
import PageTable from '@/components/page-table'
|
import PageTable from '@/components/page-table'
|
||||||
import { getList, createExportTask } from '@/api/equipment-management/inspection-logs'
|
import { getEquipmentCategoryALL } from '@/api/equipment-management/equipment-category'
|
||||||
|
import { getList, getDetails, createExportTask } from '@/api/equipment-management/inspection-logs'
|
||||||
|
|
||||||
|
function readPageData (res) {
|
||||||
|
const data = res && res.data !== undefined ? res.data : res
|
||||||
|
if (Array.isArray(data)) return { list: data, total: data.length }
|
||||||
|
if (data && Array.isArray(data.data)) return { list: data.data, total: Number(data.count || data.total || data.data.length) }
|
||||||
|
if (data && data.data && Array.isArray(data.data.data)) return { list: data.data.data, total: Number(data.data.count || data.data.total || data.data.data.length) }
|
||||||
|
return { list: [], total: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
function readList (res) {
|
||||||
|
const data = res && res.data !== undefined ? res.data : res
|
||||||
|
if (Array.isArray(data)) return data
|
||||||
|
if (data && Array.isArray(data.data)) return data.data
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
function toOptions (list) {
|
||||||
|
return (Array.isArray(list) ? list : []).map(item => ({ label: item.name || item.label, value: item.id || item.value, raw: item }))
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'equipment-management-inspection-logs',
|
name: 'equipment-management-inspection-logs',
|
||||||
@@ -50,63 +103,62 @@ export default {
|
|||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
submitting: false,
|
detailsLoading: false,
|
||||||
tableData: [],
|
tableData: [],
|
||||||
selectedRows: [],
|
detailsData: [],
|
||||||
dialogVisible: false,
|
detailsVisible: false,
|
||||||
dialogTitle: '',
|
deviceCategoryOptions: [],
|
||||||
editId: '',
|
search: { device_category_id: '', device_code: '', device_name: '', create_time: [] },
|
||||||
handleType: 'create',
|
|
||||||
search: {
|
|
||||||
keyword: ''
|
|
||||||
},
|
|
||||||
pagination: { current: 1, size: 10, total: 0 },
|
pagination: { current: 1, size: 10, total: 0 },
|
||||||
formData: {
|
|
||||||
|
|
||||||
},
|
|
||||||
rules: {},
|
|
||||||
columns: [],
|
columns: [],
|
||||||
toolbarButtons: [],
|
toolbarButtons: [],
|
||||||
rowButtons: [],
|
rowButtons: []
|
||||||
formCols: []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
this.columns = useTableColumns([
|
this.columns = useTableColumns([
|
||||||
{ prop: 'device_code', label: this.key('device_code'), minWidth: 140 },
|
{ prop: 'device_code', label: this.key('device_code'), minWidth: 140, fixed: 'left' },
|
||||||
{ prop: 'device_name', label: this.key('device_name'), minWidth: 140 },
|
{ prop: 'device_name', label: this.key('device_name'), minWidth: 150, fixed: 'left' },
|
||||||
{ prop: 'check_item_name', label: this.key('inspection_item'), minWidth: 140 },
|
{ prop: 'device_category_name', label: this.key('device_category'), minWidth: 140 },
|
||||||
{ prop: 'check_result', label: this.key('inspection_result'), minWidth: 140 },
|
{ prop: 'result', label: this.key('inspection_result'), slot: 'result', width: 120 },
|
||||||
{ prop: 'check_user', label: this.key('inspection_user'), minWidth: 140 },
|
{ prop: 'item_total', label: this.key('item_total'), minWidth: 120 },
|
||||||
{ prop: 'check_time', label: this.key('inspection_time'), minWidth: 140 }
|
{ prop: 'item_ng_number', label: this.key('item_ng_number'), minWidth: 120 },
|
||||||
])
|
{ prop: 'item_ng_rate', label: this.key('item_ng_rate'), minWidth: 130 },
|
||||||
|
{ prop: 'username', label: this.key('operator'), minWidth: 120 },
|
||||||
|
{ prop: 'remark', label: this.key('remark'), minWidth: 140, showOverflowTooltip: true },
|
||||||
|
{ prop: 'create_time', label: this.key('inspection_time'), minWidth: 160 },
|
||||||
|
{ prop: '_actions', label: this.key('operation'), width: 120, fixed: 'right' }
|
||||||
|
], { selectionWidth: 0 })
|
||||||
const btns = useTableButtons({
|
const btns = useTableButtons({
|
||||||
toolbar: [
|
toolbar: [
|
||||||
{ key: 'export', label: this.key('export'), icon: 'el-icon-download', auth: '/device_management/device_check/device_check_items_log/export', onClick: this.handleExport }
|
{ key: 'export', label: this.key('export'), icon: 'el-icon-download', type: 'primary', auth: '/device_management/device_check/device_check_items_log/export', onClick: this.handleExport }
|
||||||
],
|
],
|
||||||
row: [
|
row: [
|
||||||
|
{ key: 'details', label: this.key('details'), icon: 'el-icon-view', auth: '/device_management/device_check/device_check_items_log/details', onClick: this.openDetails }
|
||||||
]
|
]
|
||||||
}, this.$permission)
|
}, this.$permission)
|
||||||
this.toolbarButtons = btns.toolbarButtons
|
this.toolbarButtons = btns.toolbarButtons
|
||||||
this.rowButtons = btns.rowButtons
|
this.rowButtons = btns.rowButtons
|
||||||
|
this.loadDeviceCategories()
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
normalizeResponse (res) {
|
async loadDeviceCategories () {
|
||||||
const data = res && res.data !== undefined ? res.data : res
|
const res = await getEquipmentCategoryALL({})
|
||||||
if (Array.isArray(data)) return { list: data, total: data.length }
|
this.deviceCategoryOptions = toOptions((res && res.data) || res)
|
||||||
if (data && Array.isArray(data.data)) return { list: data.data, total: Number(data.count || data.total || data.data.length) }
|
},
|
||||||
if (data && data.data && Array.isArray(data.data.data)) return { list: data.data.data, total: Number(data.data.count || data.data.total || data.data.data.length) }
|
buildSearchParams () {
|
||||||
return { list: [], total: 0 }
|
const params = { ...this.search }
|
||||||
|
if (!Array.isArray(params.create_time) || !params.create_time.length) delete params.create_time
|
||||||
|
return params
|
||||||
},
|
},
|
||||||
async fetchData () {
|
async fetchData () {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
try {
|
try {
|
||||||
const res = await getList({ ...this.search, page_no: this.pagination.current, page_size: this.pagination.size })
|
const res = await getList({ ...this.buildSearchParams(), page_no: this.pagination.current, page_size: this.pagination.size })
|
||||||
const data = this.normalizeResponse(res)
|
const page = readPageData(res)
|
||||||
this.tableData = data.list
|
this.tableData = page.list
|
||||||
this.pagination.total = data.total
|
this.pagination.total = page.total
|
||||||
} finally {
|
} finally {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
@@ -116,9 +168,7 @@ export default {
|
|||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
onReset () {
|
onReset () {
|
||||||
this.search = {
|
this.search = { device_category_id: '', device_code: '', device_name: '', create_time: [] }
|
||||||
keyword: ''
|
|
||||||
}
|
|
||||||
this.pagination.current = 1
|
this.pagination.current = 1
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
@@ -127,22 +177,30 @@ export default {
|
|||||||
this.pagination.size = page.size
|
this.pagination.size = page.size
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
onSelect (rows) {
|
async openDetails (row) {
|
||||||
this.selectedRows = rows
|
this.detailsVisible = true
|
||||||
},
|
this.detailsLoading = true
|
||||||
resetForm () {
|
try {
|
||||||
this.formData = {
|
const res = await getDetails({ device_check_items_log_id: row.id })
|
||||||
|
this.detailsData = readList(res)
|
||||||
|
} finally {
|
||||||
|
this.detailsLoading = false
|
||||||
}
|
}
|
||||||
this.editId = ''
|
|
||||||
},
|
},
|
||||||
async handleExport () {
|
async handleExport () {
|
||||||
|
if (!this.search.device_code) {
|
||||||
|
this.$message.warning(this.$t(this.key('please_enter_export_device_code')))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!Array.isArray(this.search.create_time) || this.search.create_time.length !== 2) {
|
||||||
|
this.$message.warning(this.$t(this.key('please_select_export_time')))
|
||||||
|
return
|
||||||
|
}
|
||||||
const cancelled = await this.$confirmAction(
|
const cancelled = await this.$confirmAction(
|
||||||
{ message: this.key('confirm_export'), title: this.key('tip') },
|
{ message: this.key('confirm_export'), title: this.key('tip'), confirmButtonText: this.key('confirm'), cancelButtonText: this.key('cancel') },
|
||||||
() => createExportTask({ ...this.search })
|
() => createExportTask(this.buildSearchParams())
|
||||||
)
|
)
|
||||||
if (cancelled) return
|
if (!cancelled) this.$message.success(this.$t(this.key('create_download_task_success')))
|
||||||
this.$message.success(this.$t(this.key('operation_success')))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,15 +2,17 @@
|
|||||||
<d2-container>
|
<d2-container>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="search-bar">
|
<div class="search-bar">
|
||||||
<el-form :inline="true" size="mini">
|
<el-form :inline="true" :model="search" size="mini">
|
||||||
<el-form-item :label="$t(key('keyword'))">
|
<el-form-item :label="$t(key('device_category'))">
|
||||||
<el-input
|
<el-select v-model="search.device_category_id" :placeholder="$t(key('please_select_device_category'))" clearable filterable style="width:210px">
|
||||||
v-model="search.keyword"
|
<el-option v-for="item in deviceCategoryOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
:placeholder="$t(key('enter_keyword'))"
|
</el-select>
|
||||||
clearable
|
</el-form-item>
|
||||||
style="width:200px"
|
<el-form-item :label="$t(key('device_code'))">
|
||||||
@keyup.enter.native="onSearch"
|
<el-input v-model.trim="search.device_code" :placeholder="$t(key('enter_device_code'))" clearable style="width:210px" @keyup.enter.native="onSearch" />
|
||||||
/>
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t(key('device_name'))">
|
||||||
|
<el-input v-model.trim="search.device_name" :placeholder="$t(key('enter_device_name'))" clearable style="width:210px" @keyup.enter.native="onSearch" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="onSearch">{{ $t(key('search')) }}</el-button>
|
<el-button type="primary" icon="el-icon-search" @click="onSearch">{{ $t(key('search')) }}</el-button>
|
||||||
@@ -30,24 +32,56 @@
|
|||||||
:pagination="pagination"
|
:pagination="pagination"
|
||||||
auto-height
|
auto-height
|
||||||
@page-change="onPageChange"
|
@page-change="onPageChange"
|
||||||
@selection-change="onSelect"
|
>
|
||||||
/>
|
<template #col-check_result="{ row }">
|
||||||
|
<el-tag v-if="row.check_result" :type="row.check_result === 'OK' ? 'success' : 'danger'" size="mini">{{ row.check_result }}</el-tag>
|
||||||
|
<span v-else>-</span>
|
||||||
|
</template>
|
||||||
|
</page-table>
|
||||||
|
|
||||||
<page-dialog-form
|
<el-dialog :title="dialogTitleText" :visible.sync="dialogVisible" width="980px" :close-on-click-modal="false" @close="resetDialog">
|
||||||
ref="dialogForm"
|
<el-form ref="recordForm" :model="recordForm" :rules="recordRules" inline size="mini" label-width="90px">
|
||||||
:visible.sync="dialogVisible"
|
<el-form-item :label="$t(key('implementation_people'))" prop="implementation_people">
|
||||||
:title="dialogTitle"
|
<el-input v-model.trim="recordForm.implementation_people" :placeholder="$t(key('enter_implementation_people'))" clearable style="width:220px" />
|
||||||
width="40%"
|
</el-form-item>
|
||||||
:form-cols="formCols"
|
<el-form-item :label="$t(key('class_please'))" prop="class_please">
|
||||||
:form-data="formData"
|
<el-select v-model="recordForm.class_please" :placeholder="$t(key('please_select_class_please'))" clearable style="width:160px">
|
||||||
:rules="rules"
|
<el-option :label="$t(key('day_shift'))" value="早" />
|
||||||
label-width="130px"
|
<el-option :label="$t(key('night_shift'))" value="夜" />
|
||||||
:submitting="submitting"
|
</el-select>
|
||||||
:confirm-text="key('confirm')"
|
</el-form-item>
|
||||||
:cancel-text="key('cancel')"
|
<el-form-item :label="$t(key('inspection_item_name'))">
|
||||||
@submit="onDialogSubmit"
|
<el-input v-model.trim="itemSearch.name" :placeholder="$t(key('enter_inspection_item_name'))" clearable style="width:220px" @keyup.enter.native="loadInspectionItems" />
|
||||||
@close="onDialogClose"
|
</el-form-item>
|
||||||
/>
|
<el-form-item>
|
||||||
|
<el-button icon="el-icon-search" @click="loadInspectionItems">{{ $t(key('search')) }}</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" @click="resetItemSearch">{{ $t(key('reset')) }}</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-table v-loading="itemsLoading" :data="inspectionItems" border height="430" size="mini">
|
||||||
|
<el-table-column prop="sort" :label="$t(key('sort'))" width="70" />
|
||||||
|
<el-table-column prop="name" :label="$t(key('inspection_item_name'))" min-width="150" />
|
||||||
|
<el-table-column prop="standard" :label="$t(key('standard'))" min-width="150" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="check_method" :label="$t(key('check_method'))" min-width="130" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="unit" :label="$t(key('unit'))" width="90" />
|
||||||
|
<el-table-column prop="val" :label="$t(key('inspection_value'))" min-width="160">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-input v-model.trim="row.val" size="mini" :placeholder="$t(key('enter_inspection_value'))" clearable />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="result" :label="$t(key('inspection_result'))" width="130">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-switch v-model="row.result" active-value="OK" inactive-value="NG" active-text="OK" inactive-text="NG" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<span slot="footer">
|
||||||
|
<el-button @click="dialogVisible = false">{{ $t(key('cancel')) }}</el-button>
|
||||||
|
<el-button type="primary" :loading="submitting" @click="submitRecord">{{ $t(key('confirm')) }}</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
</d2-container>
|
</d2-container>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -55,136 +89,97 @@
|
|||||||
import { useTableColumns } from '@/composables/useTableColumns'
|
import { useTableColumns } from '@/composables/useTableColumns'
|
||||||
import { useTableButtons } from '@/composables/useTableButtons'
|
import { useTableButtons } from '@/composables/useTableButtons'
|
||||||
import { i18nMixin } from '@/composables/useI18n'
|
import { i18nMixin } from '@/composables/useI18n'
|
||||||
import { confirmMixin } from '@/composables/useConfirmHandle'
|
|
||||||
import PageTable from '@/components/page-table'
|
import PageTable from '@/components/page-table'
|
||||||
import PageDialogForm from '@/components/page-dialog-form'
|
import { getEquipmentCategoryALL } from '@/api/equipment-management/equipment-category'
|
||||||
import { getList, createItem, editItem } from '@/api/equipment-management/inspection-records'
|
import { getList, createItem } from '@/api/equipment-management/inspection-records'
|
||||||
|
import { getAll as getInspectionItemsAll } from '@/api/equipment-management/inspection-items'
|
||||||
|
|
||||||
export default {
|
function readPageData (res) {
|
||||||
name: 'equipment-management-inspection-records',
|
|
||||||
components: { PageTable, PageDialogForm },
|
|
||||||
mixins: [i18nMixin('page.equipment_management.inspection_management.inspection_records'), confirmMixin],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
loading: false,
|
|
||||||
submitting: false,
|
|
||||||
tableData: [],
|
|
||||||
selectedRows: [],
|
|
||||||
dialogVisible: false,
|
|
||||||
dialogTitle: '',
|
|
||||||
editId: '',
|
|
||||||
handleType: 'create',
|
|
||||||
search: {
|
|
||||||
keyword: ''
|
|
||||||
},
|
|
||||||
pagination: { current: 1, size: 10, total: 0 },
|
|
||||||
formData: {
|
|
||||||
device_id: '',
|
|
||||||
check_status: '',
|
|
||||||
check_user: '',
|
|
||||||
check_time: '',
|
|
||||||
remark: ''
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
device_id: [{ required: true, message: this.key('enter_device_id'), trigger: 'blur' }],
|
|
||||||
check_status: [{ required: true, message: this.key('enter_inspection_status'), trigger: 'blur' }]
|
|
||||||
},
|
|
||||||
columns: [],
|
|
||||||
toolbarButtons: [],
|
|
||||||
rowButtons: [],
|
|
||||||
formCols: [
|
|
||||||
[
|
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'device_id',
|
|
||||||
label: this.key('device_id'),
|
|
||||||
placeholder: this.key('enter_device_id'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'check_status',
|
|
||||||
label: this.key('inspection_status'),
|
|
||||||
placeholder: this.key('enter_inspection_status'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'check_user',
|
|
||||||
label: this.key('inspection_user'),
|
|
||||||
placeholder: this.key('enter_inspection_user'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'check_time',
|
|
||||||
label: this.key('inspection_time'),
|
|
||||||
placeholder: this.key('enter_inspection_time'),
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{
|
|
||||||
type: 'input',
|
|
||||||
prop: 'remark',
|
|
||||||
label: this.key('remark'),
|
|
||||||
placeholder: this.key('enter_remark'),
|
|
||||||
inputType: 'textarea',
|
|
||||||
autosize: { minRows: 2, maxRows: 6 },
|
|
||||||
clearable: true,
|
|
||||||
style: { width: '90%' }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
this.columns = useTableColumns([
|
|
||||||
{ prop: 'device_code', label: this.key('device_code'), minWidth: 140 },
|
|
||||||
{ prop: 'device_name', label: this.key('device_name'), minWidth: 140 },
|
|
||||||
{ prop: 'check_status', label: this.key('inspection_status'), minWidth: 140 },
|
|
||||||
{ prop: 'check_user', label: this.key('inspection_user'), minWidth: 140 },
|
|
||||||
{ prop: 'check_time', label: this.key('inspection_time'), minWidth: 140 },
|
|
||||||
{ prop: 'remark', label: this.key('remark'), minWidth: 140 },
|
|
||||||
{ prop: '_actions', label: this.key('operation'), width: 170, fixed: 'right' }
|
|
||||||
])
|
|
||||||
const btns = useTableButtons({
|
|
||||||
toolbar: [
|
|
||||||
{ key: 'add', label: this.key('add'), icon: 'el-icon-plus', type: 'primary', auth: '/device_management/device_check/device_check_record/create', onClick: this.openAdd }
|
|
||||||
],
|
|
||||||
row: [
|
|
||||||
{ key: 'edit', label: this.key('edit'), icon: 'el-icon-edit', auth: '/device_management/device_check/device_check_record/edit', onClick: this.openEdit }
|
|
||||||
]
|
|
||||||
}, this.$permission)
|
|
||||||
this.toolbarButtons = btns.toolbarButtons
|
|
||||||
this.rowButtons = btns.rowButtons
|
|
||||||
this.fetchData()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
normalizeResponse (res) {
|
|
||||||
const data = res && res.data !== undefined ? res.data : res
|
const data = res && res.data !== undefined ? res.data : res
|
||||||
if (Array.isArray(data)) return { list: data, total: data.length }
|
if (Array.isArray(data)) return { list: data, total: data.length }
|
||||||
if (data && Array.isArray(data.data)) return { list: data.data, total: Number(data.count || data.total || data.data.length) }
|
if (data && Array.isArray(data.data)) return { list: data.data, total: Number(data.count || data.total || data.data.length) }
|
||||||
if (data && data.data && Array.isArray(data.data.data)) return { list: data.data.data, total: Number(data.data.count || data.data.total || data.data.data.length) }
|
if (data && data.data && Array.isArray(data.data.data)) return { list: data.data.data, total: Number(data.data.count || data.data.total || data.data.data.length) }
|
||||||
return { list: [], total: 0 }
|
return { list: [], total: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
function readList (res) {
|
||||||
|
const data = res && res.data !== undefined ? res.data : res
|
||||||
|
if (Array.isArray(data)) return data
|
||||||
|
if (data && Array.isArray(data.data)) return data.data
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
function toOptions (list) {
|
||||||
|
return (Array.isArray(list) ? list : []).map(item => ({ label: item.name || item.label, value: item.id || item.value, raw: item }))
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'equipment-management-inspection-records',
|
||||||
|
components: { PageTable },
|
||||||
|
mixins: [i18nMixin('page.equipment_management.inspection_management.inspection_records')],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
submitting: false,
|
||||||
|
itemsLoading: false,
|
||||||
|
tableData: [],
|
||||||
|
deviceCategoryOptions: [],
|
||||||
|
search: { device_category_id: '', device_code: '', device_name: '' },
|
||||||
|
pagination: { current: 1, size: 10, total: 0 },
|
||||||
|
dialogVisible: false,
|
||||||
|
currentDevice: null,
|
||||||
|
recordForm: { implementation_people: '', class_please: '' },
|
||||||
|
itemSearch: { name: '' },
|
||||||
|
inspectionItems: [],
|
||||||
|
columns: [],
|
||||||
|
toolbarButtons: [],
|
||||||
|
rowButtons: [],
|
||||||
|
recordRules: {
|
||||||
|
implementation_people: [{ required: true, message: this.$t(this.key('enter_implementation_people')), trigger: 'blur' }],
|
||||||
|
class_please: [{ required: true, message: this.$t(this.key('please_select_class_please')), trigger: 'change' }]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
dialogTitleText () {
|
||||||
|
const name = this.currentDevice ? `${this.currentDevice.device_code || ''} ${this.currentDevice.device_name || ''}`.trim() : ''
|
||||||
|
return `${this.$t(this.key('add_inspection_record'))}${name ? ` - ${name}` : ''}`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
this.columns = useTableColumns([
|
||||||
|
{ prop: 'device_code', label: this.key('device_code'), minWidth: 140, fixed: 'left' },
|
||||||
|
{ prop: 'device_name', label: this.key('device_name'), minWidth: 150, fixed: 'left' },
|
||||||
|
{ prop: 'device_category_name', label: this.key('device_category'), minWidth: 140 },
|
||||||
|
{ prop: 'check_time', label: this.key('last_inspection_time'), minWidth: 160 },
|
||||||
|
{ prop: 'check_result', label: this.key('last_inspection_result'), slot: 'check_result', minWidth: 140 },
|
||||||
|
{ prop: 'item_total', label: this.key('last_item_total'), minWidth: 150 },
|
||||||
|
{ prop: 'item_ng_number', label: this.key('last_ng_total'), minWidth: 150 },
|
||||||
|
{ prop: 'item_ng_rate', label: this.key('last_ng_rate'), minWidth: 150 },
|
||||||
|
{ prop: '_actions', label: this.key('operation'), width: 150, fixed: 'right' }
|
||||||
|
], { selectionWidth: 0 })
|
||||||
|
const btns = useTableButtons({
|
||||||
|
row: [
|
||||||
|
{ key: 'create', label: this.key('add_inspection_record'), icon: 'el-icon-plus', auth: '/device_management/device_check/device_check_record/create', onClick: this.openCreate }
|
||||||
|
]
|
||||||
|
}, this.$permission)
|
||||||
|
this.toolbarButtons = btns.toolbarButtons
|
||||||
|
this.rowButtons = btns.rowButtons
|
||||||
|
this.loadDeviceCategories()
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async loadDeviceCategories () {
|
||||||
|
const res = await getEquipmentCategoryALL({})
|
||||||
|
this.deviceCategoryOptions = toOptions((res && res.data) || res)
|
||||||
},
|
},
|
||||||
async fetchData () {
|
async fetchData () {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
try {
|
try {
|
||||||
const res = await getList({ ...this.search, page_no: this.pagination.current, page_size: this.pagination.size })
|
const res = await getList({ ...this.search, page_no: this.pagination.current, page_size: this.pagination.size })
|
||||||
const data = this.normalizeResponse(res)
|
const page = readPageData(res)
|
||||||
this.tableData = data.list
|
this.tableData = page.list
|
||||||
this.pagination.total = data.total
|
this.pagination.total = page.total
|
||||||
} finally {
|
} finally {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
@@ -194,9 +189,7 @@ export default {
|
|||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
onReset () {
|
onReset () {
|
||||||
this.search = {
|
this.search = { device_category_id: '', device_code: '', device_name: '' }
|
||||||
keyword: ''
|
|
||||||
}
|
|
||||||
this.pagination.current = 1
|
this.pagination.current = 1
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
@@ -205,55 +198,63 @@ export default {
|
|||||||
this.pagination.size = page.size
|
this.pagination.size = page.size
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
},
|
},
|
||||||
onSelect (rows) {
|
openCreate (row) {
|
||||||
this.selectedRows = rows
|
this.currentDevice = row
|
||||||
},
|
|
||||||
resetForm () {
|
|
||||||
this.formData = {
|
|
||||||
device_id: '',
|
|
||||||
check_status: '',
|
|
||||||
check_user: '',
|
|
||||||
check_time: '',
|
|
||||||
remark: ''
|
|
||||||
}
|
|
||||||
this.editId = ''
|
|
||||||
},
|
|
||||||
openAdd () {
|
|
||||||
this.handleType = 'create'
|
|
||||||
this.dialogTitle = this.key('add_title')
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.$refs.dialogForm && this.$refs.dialogForm.reset()
|
|
||||||
this.resetForm()
|
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
|
this.resetDialog(false)
|
||||||
|
this.loadInspectionItems()
|
||||||
|
},
|
||||||
|
resetDialog (clearDevice = true) {
|
||||||
|
this.recordForm = { implementation_people: '', class_please: '' }
|
||||||
|
this.itemSearch = { name: '' }
|
||||||
|
this.inspectionItems = []
|
||||||
|
if (clearDevice) this.currentDevice = null
|
||||||
|
},
|
||||||
|
resetItemSearch () {
|
||||||
|
this.itemSearch = { name: '' }
|
||||||
|
this.loadInspectionItems()
|
||||||
|
},
|
||||||
|
async loadInspectionItems () {
|
||||||
|
if (!this.currentDevice || !this.currentDevice.device_category_id) return
|
||||||
|
this.itemsLoading = true
|
||||||
|
try {
|
||||||
|
const res = await getInspectionItemsAll({
|
||||||
|
device_category_id: this.currentDevice.device_category_id,
|
||||||
|
name: this.itemSearch.name
|
||||||
})
|
})
|
||||||
},
|
this.inspectionItems = readList(res).map(item => ({
|
||||||
openEdit (row) {
|
...item,
|
||||||
this.handleType = 'edit'
|
val: '',
|
||||||
this.dialogTitle = this.key('edit_title')
|
result: 'OK'
|
||||||
this.editId = row.id
|
}))
|
||||||
this.formData = {
|
} finally {
|
||||||
device_id: row.device_id || '',
|
this.itemsLoading = false
|
||||||
check_status: row.check_status || '',
|
|
||||||
check_user: row.check_user || '',
|
|
||||||
check_time: row.check_time || '',
|
|
||||||
remark: row.remark || ''
|
|
||||||
}
|
}
|
||||||
this.dialogVisible = true
|
|
||||||
},
|
},
|
||||||
async onDialogSubmit () {
|
submitRecord () {
|
||||||
|
this.$refs.recordForm.validate(async valid => {
|
||||||
|
if (!valid) return
|
||||||
|
if (!this.inspectionItems.length) {
|
||||||
|
this.$message.warning(this.$t(this.key('inspection_items_empty')))
|
||||||
|
return
|
||||||
|
}
|
||||||
this.submitting = true
|
this.submitting = true
|
||||||
try {
|
try {
|
||||||
if (this.handleType === 'create') await createItem(this.formData)
|
await createItem({
|
||||||
else await editItem({ ...this.formData, id: this.editId })
|
deviceCheckItemsData: JSON.stringify(this.inspectionItems),
|
||||||
|
device_category_id: this.currentDevice.device_category_id,
|
||||||
|
device_code: this.currentDevice.device_code,
|
||||||
|
class_please: this.recordForm.class_please,
|
||||||
|
implementation_people: this.recordForm.implementation_people,
|
||||||
|
status: 1
|
||||||
|
})
|
||||||
this.$message.success(this.$t(this.key('operation_success')))
|
this.$message.success(this.$t(this.key('operation_success')))
|
||||||
this.dialogVisible = false
|
this.dialogVisible = false
|
||||||
this.fetchData()
|
this.fetchData()
|
||||||
} finally {
|
} finally {
|
||||||
this.submitting = false
|
this.submitting = false
|
||||||
}
|
}
|
||||||
},
|
})
|
||||||
onDialogClose () {
|
|
||||||
this.resetForm()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user