异常记录+异常处理记录
This commit is contained in:
46
rc_autoplc_front/src/api/tb/recorddeal.ts
Normal file
46
rc_autoplc_front/src/api/tb/recorddeal.ts
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function recordDealadd(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/recordDeal/add',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDealdel(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/recordDeal/del/${id}`,
|
||||||
|
method: 'delete',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDealbyid(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/recordDeal/getById/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDeallistByRecordId(recordId: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/recordDeal/listByRecordId/${recordId}`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDeallist(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/recordDeal/listPage',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDealupd(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/recordDeal/update',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
39
rc_autoplc_front/src/api/tb/recordinfo.ts
Normal file
39
rc_autoplc_front/src/api/tb/recordinfo.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function recordInfoadd(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/recordInfo/add',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordInfodel(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/recordInfo/del/${id}`,
|
||||||
|
method: 'delete',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordInfobyid(id: string | number) {
|
||||||
|
return request({
|
||||||
|
url: `/recordInfo/getById/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordInfolist(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/recordInfo/listPage',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordInfoupd(data: any) {
|
||||||
|
return request({
|
||||||
|
url: '/recordInfo/update',
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -109,6 +109,12 @@ const router = createRouter({
|
|||||||
component: () => import('../views/sampleinjection/index.vue'),
|
component: () => import('../views/sampleinjection/index.vue'),
|
||||||
meta: { permission: 'tb:goodcontrol' },
|
meta: { permission: 'tb:goodcontrol' },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/record-info',
|
||||||
|
name: 'record-info',
|
||||||
|
component: () => import('../views/recordinfo/index.vue'),
|
||||||
|
meta: { permission: 'tb:goodrecord' },
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -108,6 +108,10 @@
|
|||||||
<el-icon><component :is="getMenuIcon('样品管理')" /></el-icon>
|
<el-icon><component :is="getMenuIcon('样品管理')" /></el-icon>
|
||||||
<span>样品记录</span>
|
<span>样品记录</span>
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
|
<el-menu-item v-if="hasPermission('tb:goodrecord')" index="/record-info">
|
||||||
|
<el-icon><component :is="getMenuIcon('流程管理')" /></el-icon>
|
||||||
|
<span>异常记录</span>
|
||||||
|
</el-menu-item>
|
||||||
</el-sub-menu>
|
</el-sub-menu>
|
||||||
</el-menu>
|
</el-menu>
|
||||||
</el-aside>
|
</el-aside>
|
||||||
|
|||||||
@@ -360,6 +360,7 @@ const formData = reactive({
|
|||||||
islandId: undefined as number | undefined,
|
islandId: undefined as number | undefined,
|
||||||
devDesc: '',
|
devDesc: '',
|
||||||
remark: '',
|
remark: '',
|
||||||
|
devModel: 'OTHER',
|
||||||
status: 0, // 状态自动设置为0
|
status: 0, // 状态自动设置为0
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -594,6 +595,7 @@ const resetForm = () => {
|
|||||||
formData.islandId = undefined
|
formData.islandId = undefined
|
||||||
formData.devDesc = ''
|
formData.devDesc = ''
|
||||||
formData.remark = ''
|
formData.remark = ''
|
||||||
|
formData.devModel = 'OTHER'
|
||||||
formData.status = 0
|
formData.status = 0
|
||||||
formRef.value?.clearValidate()
|
formRef.value?.clearValidate()
|
||||||
}
|
}
|
||||||
@@ -611,6 +613,7 @@ const handleEdit = async (item: any) => {
|
|||||||
formData.islandId = data.islandId ?? undefined
|
formData.islandId = data.islandId ?? undefined
|
||||||
formData.devDesc = data.devDesc ?? ''
|
formData.devDesc = data.devDesc ?? ''
|
||||||
formData.remark = data.remark ?? ''
|
formData.remark = data.remark ?? ''
|
||||||
|
formData.devModel = data.devModel ?? 'OTHER'
|
||||||
formData.status = data.status ?? 0
|
formData.status = data.status ?? 0
|
||||||
|
|
||||||
isEdit.value = true
|
isEdit.value = true
|
||||||
@@ -683,6 +686,7 @@ const handleSubmit = async () => {
|
|||||||
devName: formData.devName,
|
devName: formData.devName,
|
||||||
plcAddr: formData.plcAddr,
|
plcAddr: formData.plcAddr,
|
||||||
islandId: formData.islandId,
|
islandId: formData.islandId,
|
||||||
|
devModel: formData.devModel || 'OTHER',
|
||||||
}
|
}
|
||||||
|
|
||||||
if (formData.devDesc) submitData.devDesc = formData.devDesc
|
if (formData.devDesc) submitData.devDesc = formData.devDesc
|
||||||
@@ -959,7 +963,7 @@ const setSelectedParams = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 参数选择变化
|
// 参数选择变化
|
||||||
const handleParamSelectionChange = (selection: any[]) => {
|
const handleParamSelectionChange = (_selection: any[]) => {
|
||||||
// noop
|
// noop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
575
rc_autoplc_front/src/views/recordinfo/index.vue
Normal file
575
rc_autoplc_front/src/views/recordinfo/index.vue
Normal file
@@ -0,0 +1,575 @@
|
|||||||
|
<template>
|
||||||
|
<div class="recordinfo-page">
|
||||||
|
<el-breadcrumb separator="/" style="margin-bottom: 16px">
|
||||||
|
<el-breadcrumb-item><router-link to="/home">首页</router-link></el-breadcrumb-item>
|
||||||
|
<el-breadcrumb-item>业务流程控制</el-breadcrumb-item>
|
||||||
|
<el-breadcrumb-item>异常记录</el-breadcrumb-item>
|
||||||
|
</el-breadcrumb>
|
||||||
|
|
||||||
|
<el-card class="search-card" shadow="never">
|
||||||
|
<div class="search-bar">
|
||||||
|
<el-form :inline="true" :model="queryForm" label-width="90px">
|
||||||
|
<el-form-item label="异常名称">
|
||||||
|
<el-input v-model="queryForm.recordName" placeholder="请输入异常名称" clearable style="width: 220px" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="异常类型">
|
||||||
|
<el-select v-model="queryForm.recordType" placeholder="请选择异常类型" clearable style="width: 220px">
|
||||||
|
<el-option label="设备异常" :value="1" />
|
||||||
|
<el-option label="样品异常" :value="2" />
|
||||||
|
<el-option label="操作异常" :value="3" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="处理状态">
|
||||||
|
<el-select v-model="queryForm.recordStatus" placeholder="请选择处理状态" clearable style="width: 220px">
|
||||||
|
<el-option label="未处理" :value="false" />
|
||||||
|
<el-option label="已处理" :value="true" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleSearch">查询</el-button>
|
||||||
|
<el-button @click="resetSearch">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<el-card shadow="never">
|
||||||
|
<el-table :data="tableData" stripe border style="width: 100%" v-loading="loading">
|
||||||
|
<el-table-column type="index" label="序号" width="70" :index="getIndex" />
|
||||||
|
<el-table-column prop="recordName" label="异常名称" min-width="160" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="islandId" label="异常功能岛" min-width="150" show-overflow-tooltip>
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ getIslandName(row.islandId) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="devId" label="异常动作" min-width="150" show-overflow-tooltip>
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ getActionDisplayName(row) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="recordContent" label="异常记录内容" min-width="260" show-overflow-tooltip />
|
||||||
|
<el-table-column label="操作" width="180" fixed="right">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button type="success" link @click="handleDeal(row)">异常处理</el-button>
|
||||||
|
<el-button type="primary" link @click="handleView(row)">详情</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="recordType" label="异常类型" width="140" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="getRecordTypeTag(row.recordType)" size="small">
|
||||||
|
{{ getRecordTypeText(row.recordType) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="recordStatus" label="异常处理状态" width="150" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="row.recordStatus ? 'success' : 'warning'" size="small">
|
||||||
|
{{ row.recordStatus ? '已处理' : '未处理' }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<div class="pagination">
|
||||||
|
<el-pagination
|
||||||
|
v-model:current-page="pagination.pageNum"
|
||||||
|
v-model:page-size="pagination.pageSize"
|
||||||
|
:page-sizes="[10, 20, 50, 100]"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="total"
|
||||||
|
background
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<el-dialog v-model="detailVisible" title="异常记录详情" width="720px">
|
||||||
|
<el-descriptions :column="1" border>
|
||||||
|
<el-descriptions-item label="异常功能岛">{{ getIslandName(detailData.islandId) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="异常动作">{{ getActionDisplayName(detailData) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="异常名称">{{ detailData.recordName || '-' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="异常类型">{{ getRecordTypeText(detailData.recordType) }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="异常处理状态">{{ detailData.recordStatus ? '已处理' : '未处理' }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="异常记录内容">{{ detailData.recordContent || '-' }}</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="detailVisible = false">关闭</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<el-dialog v-model="dealVisible" title="异常处理" width="980px" destroy-on-close @close="handleDealDialogClose">
|
||||||
|
<div class="deal-container" v-loading="dealLoading">
|
||||||
|
<el-form ref="dealFormRef" :model="dealForm" :rules="dealRules" label-width="120px" class="deal-form">
|
||||||
|
<el-form-item label="异常名称">
|
||||||
|
<el-input v-model="dealForm.recordName" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="异常类型">
|
||||||
|
<el-input :model-value="getRecordTypeText(dealForm.recordType)" disabled />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="异常处理方案" prop="dealContent">
|
||||||
|
<el-input
|
||||||
|
v-model="dealForm.dealContent"
|
||||||
|
type="textarea"
|
||||||
|
:rows="4"
|
||||||
|
:disabled="!dealEditable"
|
||||||
|
placeholder="请输入异常处理方案"
|
||||||
|
maxlength="500"
|
||||||
|
show-word-limit
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<div class="deal-list-title">异常处理记录</div>
|
||||||
|
<el-table :data="dealList" border stripe style="width: 100%" :loading="dealListLoading">
|
||||||
|
<el-table-column type="index" label="序号" width="70" :index="getDealIndex" />
|
||||||
|
<el-table-column prop="recordName" label="异常名称" min-width="150" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="recordType" label="异常类型" width="140" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag :type="getRecordTypeTag(row.recordType)" size="small">
|
||||||
|
{{ getRecordTypeText(row.recordType) }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="dealContent" label="异常处理方案" min-width="260" show-overflow-tooltip />
|
||||||
|
<el-table-column label="操作" width="110" align="center">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button type="primary" link @click="handleSelectDeal(row)">选择</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<div class="pagination deal-pagination">
|
||||||
|
<el-pagination
|
||||||
|
v-model:current-page="dealPagination.pageNum"
|
||||||
|
v-model:page-size="dealPagination.pageSize"
|
||||||
|
:page-sizes="[5, 10, 20, 50]"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="dealTotal"
|
||||||
|
background
|
||||||
|
@current-change="handleDealCurrentChange"
|
||||||
|
@size-change="handleDealSizeChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="dealVisible = false">关闭</el-button>
|
||||||
|
<el-button type="primary" :loading="saveLoading" @click="handleDealSave">
|
||||||
|
{{ dealEditable ? '保存' : '编辑' }}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { onMounted, reactive, ref } from 'vue'
|
||||||
|
import type { FormInstance, FormRules } from 'element-plus'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { islandInfolist } from '@/api/tb/islandinfo'
|
||||||
|
import { devselect } from '@/api/tb/devinfo'
|
||||||
|
import { recordInfoupd, recordInfolist } from '@/api/tb/recordinfo'
|
||||||
|
import { recordDealadd, recordDealupd, recordDeallistByRecordId, recordDeallist } from '@/api/tb/recorddeal'
|
||||||
|
|
||||||
|
interface RecordInfoItem {
|
||||||
|
id?: string | number
|
||||||
|
islandId?: string | number
|
||||||
|
devId?: string | number
|
||||||
|
recordName?: string
|
||||||
|
recordType?: number
|
||||||
|
recordStatus?: boolean
|
||||||
|
recordContent?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RecordDealItem {
|
||||||
|
id?: string | number
|
||||||
|
recordId?: string | number
|
||||||
|
recordName?: string
|
||||||
|
recordType?: number
|
||||||
|
dealContent?: string
|
||||||
|
createTime?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OptionItem {
|
||||||
|
id?: string | number
|
||||||
|
islandName?: string
|
||||||
|
name?: string
|
||||||
|
devName?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ActionItem {
|
||||||
|
id?: string | number
|
||||||
|
devName?: string
|
||||||
|
actionName?: string
|
||||||
|
name?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const loading = ref(false)
|
||||||
|
const tableData = ref<RecordInfoItem[]>([])
|
||||||
|
const total = ref(0)
|
||||||
|
const detailVisible = ref(false)
|
||||||
|
const detailData = ref<RecordInfoItem>({})
|
||||||
|
|
||||||
|
const islandOptions = ref<OptionItem[]>([])
|
||||||
|
const actionOptions = ref<ActionItem[]>([])
|
||||||
|
const islandMap = ref<Map<string, string>>(new Map())
|
||||||
|
const actionMap = ref<Map<string, string>>(new Map())
|
||||||
|
|
||||||
|
const dealVisible = ref(false)
|
||||||
|
const dealLoading = ref(false)
|
||||||
|
const dealListLoading = ref(false)
|
||||||
|
const saveLoading = ref(false)
|
||||||
|
const dealEditable = ref(true)
|
||||||
|
const dealHasExistingRecord = ref(false)
|
||||||
|
const dealCurrentRecordId = ref<string | number>('')
|
||||||
|
const dealCurrentRecordType = ref<number | undefined>(undefined)
|
||||||
|
const dealCurrentDealId = ref<string | number>('')
|
||||||
|
const dealListMode = ref<'record' | 'type'>('record')
|
||||||
|
const dealList = ref<RecordDealItem[]>([])
|
||||||
|
const dealTotal = ref(0)
|
||||||
|
const dealFormRef = ref<FormInstance>()
|
||||||
|
|
||||||
|
const queryForm = reactive({
|
||||||
|
recordName: '',
|
||||||
|
recordType: '' as number | '',
|
||||||
|
recordStatus: '' as boolean | '',
|
||||||
|
})
|
||||||
|
|
||||||
|
const pagination = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
})
|
||||||
|
|
||||||
|
const dealPagination = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
})
|
||||||
|
|
||||||
|
const dealForm = reactive<RecordDealItem>({
|
||||||
|
id: undefined,
|
||||||
|
recordId: undefined,
|
||||||
|
recordName: '',
|
||||||
|
recordType: undefined,
|
||||||
|
dealContent: '',
|
||||||
|
})
|
||||||
|
|
||||||
|
const dealRules: FormRules = {
|
||||||
|
dealContent: [{ required: true, message: '请输入异常处理方案', trigger: 'blur' }],
|
||||||
|
}
|
||||||
|
|
||||||
|
const getListFromResponse = (res: any) => {
|
||||||
|
const data = res?.data?.data ?? res?.data ?? res ?? {}
|
||||||
|
return data.records || data.list || data.rows || data || []
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTotalFromResponse = (res: any) => {
|
||||||
|
const data = res?.data?.data ?? res?.data ?? res ?? {}
|
||||||
|
return data.total ?? data.count ?? 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const getFirstRecord = (res: any) => {
|
||||||
|
const list = getListFromResponse(res)
|
||||||
|
return Array.isArray(list) ? list[0] : undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadLookups = async () => {
|
||||||
|
try {
|
||||||
|
const [islandRes, actionRes] = await Promise.all([
|
||||||
|
islandInfolist({ pageNum: 1, pageSize: 1000 }),
|
||||||
|
devselect({ pageNum: 1, pageSize: 1000 }),
|
||||||
|
])
|
||||||
|
islandOptions.value = getListFromResponse(islandRes)
|
||||||
|
actionOptions.value = getListFromResponse(actionRes)
|
||||||
|
|
||||||
|
islandMap.value = new Map(
|
||||||
|
islandOptions.value
|
||||||
|
.filter(item => item.id !== undefined && item.id !== null)
|
||||||
|
.map(item => [String(item.id), item.islandName || item.name || String(item.id)]),
|
||||||
|
)
|
||||||
|
actionMap.value = new Map(
|
||||||
|
actionOptions.value
|
||||||
|
.filter(item => item.id !== undefined && item.id !== null)
|
||||||
|
.map(item => [String(item.id), item.devName || item.actionName || item.name || String(item.id)]),
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadTableData = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const params = {
|
||||||
|
pageNum: pagination.pageNum,
|
||||||
|
pageSize: pagination.pageSize,
|
||||||
|
recordName: queryForm.recordName || undefined,
|
||||||
|
recordType: queryForm.recordType === '' ? undefined : queryForm.recordType,
|
||||||
|
recordStatus: queryForm.recordStatus === '' ? undefined : queryForm.recordStatus,
|
||||||
|
}
|
||||||
|
const res = await recordInfolist(params)
|
||||||
|
tableData.value = getListFromResponse(res)
|
||||||
|
total.value = getTotalFromResponse(res)
|
||||||
|
} catch (error: any) {
|
||||||
|
ElMessage.error(error?.message || '获取异常记录列表失败')
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadDealList = async () => {
|
||||||
|
dealListLoading.value = true
|
||||||
|
try {
|
||||||
|
const params = {
|
||||||
|
pageNum: dealPagination.pageNum,
|
||||||
|
pageSize: dealPagination.pageSize,
|
||||||
|
}
|
||||||
|
let res: any
|
||||||
|
if (dealListMode.value === 'record' && dealCurrentRecordId.value !== '') {
|
||||||
|
res = await recordDeallistByRecordId(dealCurrentRecordId.value)
|
||||||
|
} else {
|
||||||
|
res = await recordDeallist({ ...params, recordType: dealCurrentRecordType.value })
|
||||||
|
}
|
||||||
|
dealList.value = getListFromResponse(res)
|
||||||
|
dealTotal.value = getTotalFromResponse(res)
|
||||||
|
} catch (error: any) {
|
||||||
|
ElMessage.error(error?.message || '获取异常处理记录失败')
|
||||||
|
} finally {
|
||||||
|
dealListLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const initDealDialog = async (row: RecordInfoItem) => {
|
||||||
|
dealLoading.value = true
|
||||||
|
dealVisible.value = true
|
||||||
|
dealCurrentRecordId.value = row.id ?? ''
|
||||||
|
dealCurrentRecordType.value = row.recordType
|
||||||
|
dealCurrentDealId.value = ''
|
||||||
|
dealHasExistingRecord.value = false
|
||||||
|
dealEditable.value = true
|
||||||
|
dealListMode.value = 'record'
|
||||||
|
dealPagination.pageNum = 1
|
||||||
|
dealPagination.pageSize = 10
|
||||||
|
dealForm.id = undefined
|
||||||
|
dealForm.recordId = row.id
|
||||||
|
dealForm.recordName = row.recordName || ''
|
||||||
|
dealForm.recordType = row.recordType
|
||||||
|
dealForm.dealContent = ''
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await recordDeallistByRecordId(row.id as string | number)
|
||||||
|
const first = getFirstRecord(res)
|
||||||
|
if (first) {
|
||||||
|
dealHasExistingRecord.value = true
|
||||||
|
dealForm.id = first.id
|
||||||
|
dealForm.recordId = first.recordId ?? row.id
|
||||||
|
dealForm.recordName = first.recordName || row.recordName || ''
|
||||||
|
dealForm.recordType = first.recordType ?? row.recordType
|
||||||
|
dealForm.dealContent = first.dealContent || ''
|
||||||
|
dealCurrentDealId.value = first.id ?? ''
|
||||||
|
dealEditable.value = false
|
||||||
|
dealListMode.value = 'record'
|
||||||
|
} else {
|
||||||
|
dealForm.id = undefined
|
||||||
|
dealForm.recordId = row.id
|
||||||
|
dealForm.recordName = row.recordName || ''
|
||||||
|
dealForm.recordType = row.recordType
|
||||||
|
dealForm.dealContent = ''
|
||||||
|
dealEditable.value = true
|
||||||
|
dealListMode.value = 'type'
|
||||||
|
}
|
||||||
|
await loadDealList()
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
dealEditable.value = true
|
||||||
|
dealListMode.value = 'type'
|
||||||
|
await loadDealList()
|
||||||
|
} finally {
|
||||||
|
dealLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSearch = () => {
|
||||||
|
pagination.pageNum = 1
|
||||||
|
loadTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetSearch = () => {
|
||||||
|
queryForm.recordName = ''
|
||||||
|
queryForm.recordType = ''
|
||||||
|
queryForm.recordStatus = ''
|
||||||
|
pagination.pageNum = 1
|
||||||
|
loadTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleCurrentChange = (page: number) => {
|
||||||
|
pagination.pageNum = page
|
||||||
|
loadTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSizeChange = (size: number) => {
|
||||||
|
pagination.pageSize = size
|
||||||
|
pagination.pageNum = 1
|
||||||
|
loadTableData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleView = (row: RecordInfoItem) => {
|
||||||
|
detailData.value = { ...row }
|
||||||
|
detailVisible.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDeal = (row: RecordInfoItem) => {
|
||||||
|
initDealDialog(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDealDialogClose = () => {
|
||||||
|
dealFormRef.value?.clearValidate()
|
||||||
|
dealHasExistingRecord.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDealCurrentChange = (page: number) => {
|
||||||
|
dealPagination.pageNum = page
|
||||||
|
loadDealList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDealSizeChange = (size: number) => {
|
||||||
|
dealPagination.pageSize = size
|
||||||
|
dealPagination.pageNum = 1
|
||||||
|
loadDealList()
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSelectDeal = (row: RecordDealItem) => {
|
||||||
|
dealForm.dealContent = row.dealContent || ''
|
||||||
|
dealEditable.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDealSave = async () => {
|
||||||
|
if (!dealEditable.value) {
|
||||||
|
dealEditable.value = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await dealFormRef.value?.validate(async valid => {
|
||||||
|
if (!valid) return
|
||||||
|
|
||||||
|
saveLoading.value = true
|
||||||
|
try {
|
||||||
|
const payload = {
|
||||||
|
...dealForm,
|
||||||
|
recordId: dealCurrentRecordId.value,
|
||||||
|
recordType: dealCurrentRecordType.value,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dealHasExistingRecord.value) {
|
||||||
|
if (!dealCurrentDealId.value) {
|
||||||
|
ElMessage.error('未找到可修改的异常处理记录')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await recordDealupd({ ...payload, id: dealCurrentDealId.value })
|
||||||
|
ElMessage.success('异常处理记录修改成功')
|
||||||
|
} else {
|
||||||
|
await recordDealadd({ ...payload, id: undefined })
|
||||||
|
await recordInfoupd({
|
||||||
|
id: dealCurrentRecordId.value,
|
||||||
|
recordStatus: true,
|
||||||
|
})
|
||||||
|
ElMessage.success('异常处理记录新增成功')
|
||||||
|
}
|
||||||
|
|
||||||
|
dealHasExistingRecord.value = true
|
||||||
|
dealEditable.value = false
|
||||||
|
dealListMode.value = 'record'
|
||||||
|
dealPagination.pageNum = 1
|
||||||
|
await loadDealList()
|
||||||
|
await loadTableData()
|
||||||
|
dealVisible.value = false
|
||||||
|
dealFormRef.value?.resetFields()
|
||||||
|
dealHasExistingRecord.value = false
|
||||||
|
dealCurrentDealId.value = ''
|
||||||
|
} catch (error: any) {
|
||||||
|
ElMessage.error(error?.message || '保存异常处理记录失败')
|
||||||
|
} finally {
|
||||||
|
saveLoading.value = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getIndex = (index: number) => (pagination.pageNum - 1) * pagination.pageSize + index + 1
|
||||||
|
const getDealIndex = (index: number) => (dealPagination.pageNum - 1) * dealPagination.pageSize + index + 1
|
||||||
|
|
||||||
|
const getIslandName = (id?: string | number) => {
|
||||||
|
if (id === undefined || id === null || id === '') return '-'
|
||||||
|
return islandMap.value.get(String(id)) || String(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
const getActionDisplayName = (row: RecordInfoItem) => {
|
||||||
|
const candidates = [row.devId, (row as any).actionId, (row as any).dealActionId, (row as any).action]
|
||||||
|
for (const candidate of candidates) {
|
||||||
|
if (candidate === undefined || candidate === null || candidate === '') continue
|
||||||
|
const mapped = actionMap.value.get(String(candidate))
|
||||||
|
if (mapped) return mapped
|
||||||
|
}
|
||||||
|
return row.devId !== undefined && row.devId !== null && row.devId !== '' ? String(row.devId) : '-'
|
||||||
|
}
|
||||||
|
|
||||||
|
const getRecordTypeText = (type?: number) => {
|
||||||
|
if (type === 1) return '设备异常'
|
||||||
|
if (type === 2) return '样品异常'
|
||||||
|
if (type === 3) return '操作异常'
|
||||||
|
return '-'
|
||||||
|
}
|
||||||
|
|
||||||
|
const getRecordTypeTag = (type?: number) => {
|
||||||
|
if (type === 1) return 'danger'
|
||||||
|
if (type === 2) return 'warning'
|
||||||
|
if (type === 3) return 'info'
|
||||||
|
return 'default'
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await loadLookups()
|
||||||
|
await loadTableData()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.recordinfo-page {
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination {
|
||||||
|
margin-top: 16px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deal-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deal-form {
|
||||||
|
border: 1px solid var(--el-border-color-lighter);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 16px 16px 0;
|
||||||
|
background: var(--el-fill-color-blank);
|
||||||
|
}
|
||||||
|
|
||||||
|
.deal-list-title {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--el-text-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.deal-pagination {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user