Compare commits

...

6 Commits

@ -53,6 +53,10 @@ export const DvRepairApi = {
return await request.download({ url: `/mes/dv-repair/export-excel`, params })
},
updateDvRepairStatus: async (data: any) => {
return await request.put({ url: `/mes/dv-repair/updateDvRepairStatus`, data })
},
// ==================== 子表(设备维修记录行) ====================
// 获得设备维修记录行列表

@ -1,47 +1,52 @@
import request from '@/config/axios'
// 质量管理-检验项目 VO
export interface ZjItemVO {
id: number // ID
zjType: number // 检验类型
name: string // 名称
remark: string // 备注
tool: string // 作业方式
standardVal: number // 标准值
unit: string // 单位
upperVal: number // 上限值
lowerVal: number // 下限值
}
// 质量管理-检验项目 API
export const ZjItemApi = {
// 查询质量管理-检验项目分页
getZjItemPage: async (params: any) => {
return await request.get({ url: `/mes/zj-item/page`, params })
},
// 查询质量管理-检验项目详情
getZjItem: async (id: number) => {
return await request.get({ url: `/mes/zj-item/get?id=` + id })
},
// 新增质量管理-检验项目
createZjItem: async (data: ZjItemVO) => {
return await request.post({ url: `/mes/zj-item/create`, data })
},
// 修改质量管理-检验项目
updateZjItem: async (data: ZjItemVO) => {
return await request.put({ url: `/mes/zj-item/update`, data })
},
// 删除质量管理-检验项目
deleteZjItem: async (id: number) => {
return await request.delete({ url: `/mes/zj-item/delete?id=` + id })
},
// 导出质量管理-检验项目 Excel
exportZjItem: async (params) => {
return await request.download({ url: `/mes/zj-item/export-excel`, params })
},
}
import request from '@/config/axios'
// 质量管理-检验项目 VO
export interface ZjItemVO {
id: number // ID
zjType: number // 检验类型
name: string // 名称
zjTypeName?: string
remark: string // 备注
tool: string // 作业方式
standardVal: number // 标准值
unit: string // 单位
upperVal: number // 上限值
lowerVal: number // 下限值
}
// 质量管理-检验项目 API
export const ZjItemApi = {
// 查询质量管理-检验项目分页
getZjItemPage: async (params: any) => {
return await request.get({ url: `/mes/zj-item/page`, params })
},
getZjItemList: async () => {
return await request.get({ url: `/mes/zj-item/list` })
},
// 查询质量管理-检验项目详情
getZjItem: async (id: number) => {
return await request.get({ url: `/mes/zj-item/get?id=` + id })
},
// 新增质量管理-检验项目
createZjItem: async (data: ZjItemVO) => {
return await request.post({ url: `/mes/zj-item/create`, data })
},
// 修改质量管理-检验项目
updateZjItem: async (data: ZjItemVO) => {
return await request.put({ url: `/mes/zj-item/update`, data })
},
// 删除质量管理-检验项目
deleteZjItem: async (id: number) => {
return await request.delete({ url: `/mes/zj-item/delete?id=` + id })
},
// 导出质量管理-检验项目 Excel
exportZjItem: async (params) => {
return await request.download({ url: `/mes/zj-item/export-excel`, params })
},
}

@ -1,44 +1,49 @@
import request from '@/config/axios'
// 检验方案 VO
export interface ZjSchemaVO {
type: string // 类型
name: string // 名称
remark: string // 备注
sampleMethod: string // 抽检方式
val: number // 值
item: string // 关联项目
}
// 检验方案 API
export const ZjSchemaApi = {
// 查询检验方案分页
getZjSchemaPage: async (params: any) => {
return await request.get({ url: `/mes/zj-schema/page`, params })
},
// 查询检验方案详情
getZjSchema: async (id: number) => {
return await request.get({ url: `/mes/zj-schema/get?id=` + id })
},
// 新增检验方案
createZjSchema: async (data: ZjSchemaVO) => {
return await request.post({ url: `/mes/zj-schema/create`, data })
},
// 修改检验方案
updateZjSchema: async (data: ZjSchemaVO) => {
return await request.put({ url: `/mes/zj-schema/update`, data })
},
// 删除检验方案
deleteZjSchema: async (id: number) => {
return await request.delete({ url: `/mes/zj-schema/delete?id=` + id })
},
// 导出检验方案 Excel
exportZjSchema: async (params) => {
return await request.download({ url: `/mes/zj-schema/export-excel`, params })
},
}
import request from '@/config/axios'
// 检验方案 VO
export interface ZjSchemaVO {
id: number
type: string
name: string
remark: string
sampleMethod: string
val: string
item: string
}
// 检验方案 API
export const ZjSchemaApi = {
// 查询检验方案分页
getZjSchemaPage: async (params: any) => {
return await request.get({ url: `/mes/zj-schema/page`, params })
},
// 查询检验方案详情
getZjSchema: async (id: number) => {
return await request.get({ url: `/mes/zj-schema/get?id=` + id })
},
// 新增检验方案
createZjSchema: async (data: ZjSchemaVO) => {
return await request.post({ url: `/mes/zj-schema/create`, data })
},
// 修改检验方案
updateZjSchema: async (data: ZjSchemaVO) => {
return await request.put({ url: `/mes/zj-schema/update`, data })
},
// 删除检验方案
deleteZjSchema: async (id: number) => {
return await request.delete({ url: `/mes/zj-schema/delete?id=` + id })
},
// 导出检验方案 Excel
exportZjSchema: async (params) => {
return await request.download({ url: `/mes/zj-schema/export-excel`, params })
},
getItemList: async (id: number) => {
return await request.get({ url: `/mes/zj-schema/getItemList?id=` + id })
},
}

@ -102,7 +102,7 @@ v-model="formData.confirmBy" filterable clearable placeholder="请选择验收
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="设备维修项目行" name="dvRepairLine">
<DvRepairLineForm ref="dvRepairLineFormRef" :repair-id="formData.id" />
<DvRepairLineForm ref="dvRepairLineFormRef" :repair-id="formData.id" :is-repair-mode="formType === 'repair'" />
</el-tab-pane>
</el-tabs>
<template #footer>
@ -406,24 +406,41 @@ const submitForm = async () => {
formLoading.value = true
try {
const data = { ...(formData.value as any) } as DvRepairVO & { deviceId?: number; componentId?: number }
; (data as any).acceptedBy = normalizeUserId((data as any).acceptedBy)
; (data as any).confirmBy = normalizeUserId((data as any).confirmBy)
;(data as any).acceptedBy = normalizeUserId((data as any).acceptedBy)
;(data as any).confirmBy = normalizeUserId((data as any).confirmBy)
if (formType.value === 'repair') {
;(data as any).status = 1
}
if (typeof formData.value.deviceId === 'number') {
data.machineryId = formData.value.deviceId as any
}
; (data as any).deviceId = formData.value.deviceId
; (data as any).componentId = formData.value.machineryTypeId === 2 ? formData.value.componentId : undefined
//
data.dvRepairLines = dvRepairLineFormRef.value.getData()
if (formType.value === 'create') {
await DvRepairApi.createDvRepair(data)
message.success(t('common.createSuccess'))
} else {
await DvRepairApi.updateDvRepair(data)
;(data as any).deviceId = formData.value.deviceId
;(data as any).componentId = formData.value.machineryTypeId === 2 ? formData.value.componentId : undefined
const lineList = dvRepairLineFormRef.value.getData() || []
if (formType.value === 'repair') {
const requireDate = data.requireDate
const finishDate = data.finishDate
const confirmDate = data.confirmDate
const repairResult = data.repairResult
const updateReqVOList = lineList
await DvRepairApi.updateDvRepairStatus({
id: data.id,
requireDate,
finishDate,
confirmDate,
repairResult,
updateReqVOList,
})
message.success(t('common.updateSuccess'))
} else {
;(data as any).dvRepairLines = lineList
if (formType.value === 'create') {
await DvRepairApi.createDvRepair(data)
message.success(t('common.createSuccess'))
} else {
await DvRepairApi.updateDvRepair(data)
message.success(t('common.updateSuccess'))
}
}
dialogVisible.value = false
//

@ -44,6 +44,21 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column v-if="props.isRepairMode" label="备注" min-width="180">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column v-if="props.isRepairMode" label="结果" min-width="160">
<template #default="{ row }">
<el-radio-group v-model="row.result">
<el-radio label="1">通过</el-radio>
<el-radio label="2">不通过</el-radio>
</el-radio-group>
</template>
</el-table-column>
<!-- <el-table-column label="标准" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subjectStandard`" :rules="formRules.subjectStandard" class="mb-0px!">
@ -86,15 +101,16 @@
</el-table-column> -->
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<!-- <el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加维修项目</el-button>
</el-row>
</el-row> -->
</template>
<script setup lang="ts">
import { DvRepairApi } from '@/api/mes/dvrepair'
const props = defineProps<{
repairId: undefined // ID
repairId: undefined
isRepairMode?: boolean
}>()
const formLoading = ref(false) //
const formData = ref([])
@ -141,6 +157,7 @@ const handleAdd = () => {
malfunctionUrl: undefined,
repairDes: undefined,
remark: undefined,
repairResult: undefined,
}
row.repairId = props.repairId
formData.value.push(row)

@ -100,6 +100,13 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to
</el-tag>
</template>
</el-table-column>
<el-table-column label="结果" align="center" prop="repairStatus" min-width="120">
<template #default="scope">
<el-tag :type="getResultTagType(scope.row.repairStatus)" effect="light">
{{ getResultLabel(scope.row.repairStatus) }}
</el-tag>
</template>
</el-table-column>
<!-- <el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column
label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="170px"
@ -189,6 +196,22 @@ const getStatusTagType = (value: any) => {
return 'info'
}
const getResultLabel = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v == '0') return '待维修'
if (v == '1') return '通过'
if (v == '2') return '不通过'
return '-'
}
const getResultTagType = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v == '1') return 'success'
if (v == '2') return 'danger'
if (v == '0') return 'info'
return 'info'
}
const tableRef = ref()
const selectedIds = ref<number[]>([])
const handleSelectionChange = (rows: any[]) => {

@ -95,6 +95,9 @@ const formLoading = ref(false)
const formType = ref('')
const formRef = ref()
const isInitializing = ref(false)
const isSwitchingDeviceType = ref(false)
const formData = ref({
id: undefined as number | undefined,
subjectCode: undefined as string | undefined,
@ -163,15 +166,16 @@ const loadComponentOptionsByDeviceId = async (deviceId: number) => {
watch(
() => formData.value.deviceType,
(val) => {
if (val === 1) {
formData.value.componentId = undefined
componentOptions.value = []
} else if (val !== 2) {
formData.value.deviceId = undefined
formData.value.componentId = undefined
componentOptions.value = []
}
async () => {
if (isInitializing.value) return
isSwitchingDeviceType.value = true
formData.value.deviceId = undefined
deviceOptions.value = []
formData.value.componentId = undefined
componentOptions.value = []
await nextTick()
formRef.value?.clearValidate?.(['deviceId', 'componentId'])
isSwitchingDeviceType.value = false
}
)
@ -187,6 +191,10 @@ watch(
)
const validateDeviceId = (_: any, value: any, callback: any) => {
if (isSwitchingDeviceType.value) {
callback()
return
}
const dt = formData.value.deviceType
if ((dt === 1 || dt === 2) && (value === undefined || value === null || value === '')) {
callback(new Error('设备不能为空'))
@ -196,6 +204,10 @@ const validateDeviceId = (_: any, value: any, callback: any) => {
}
const validateComponentId = (_: any, value: any, callback: any) => {
if (isSwitchingDeviceType.value) {
callback()
return
}
const dt = formData.value.deviceType
if (dt === 2 && (value === undefined || value === null || value === '')) {
callback(new Error('关键件不能为空'))
@ -205,18 +217,19 @@ const validateComponentId = (_: any, value: any, callback: any) => {
}
const formRules = reactive({
subjectCode: [{ required: true, message: '项目编码不能为空', trigger: 'blur' }],
subjectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'change' }],
deviceId: [{ validator: validateDeviceId, trigger: 'change' }],
componentId: [{ validator: validateComponentId, trigger: 'change' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'change' }]
subjectCode: [{ required: true, message: '项目编码不能为空' }],
subjectName: [{ required: true, message: '项目名称不能为空' }],
deviceType: [{ required: true, message: '设备类型不能为空' }],
deviceId: [{ validator: validateDeviceId }],
componentId: [{ validator: validateComponentId }],
isEnable: [{ required: true, message: '是否启用不能为空' }]
})
const open = async (type: string, row?: any) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
isInitializing.value = true
resetForm()
if (!dictReady.value) {
await dictStore.setDictMap()
@ -249,6 +262,9 @@ const open = async (type: string, row?: any) => {
}
}
}
await nextTick()
formRef.value?.clearValidate?.()
isInitializing.value = false
}
defineExpose({ open })

@ -138,7 +138,7 @@ const formData = ref({
dateRange: [] as string[],
cronExpression: undefined as string | undefined,
operableUsers: [] as string[],
enabled: true as boolean
enabled: false as boolean
})
const formRules = reactive({
@ -160,7 +160,7 @@ const resetForm = () => {
dateRange: [],
cronExpression: undefined,
operableUsers: [],
enabled: true
enabled: false
}
formRef.value?.resetFields()
}

@ -82,6 +82,7 @@
<template #default="scope">
<el-switch
:model-value="scope.row.enabled === true || scope.row.enabled === 'true'"
:before-change="() => handleBeforeEnabledChange(scope.row)"
@change="(val) => handleEnabledChange(scope.row, val)"
/>
</template>
@ -126,6 +127,7 @@
</template>
<script setup lang="ts">
import { ElMessageBox } from 'element-plus'
import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
import download from '@/utils/download'
@ -247,6 +249,20 @@ const handleCreateTicket = async (id?: number) => {
}
}
const handleBeforeEnabledChange = async (row: TaskManagementVO) => {
const isEnabled = row.enabled === true || row.enabled === 'true'
if (isEnabled) return true
const cronExpression = (row as any)?.cronExpression
if (typeof cronExpression === 'string' && cronExpression.trim()) return true
await ElMessageBox.alert('请先填写 cron 表达式,再启用任务', '提示', {
type: 'warning',
confirmButtonText: '我知道了',
closeOnClickModal: false,
closeOnPressEscape: false
})
return false
}
const handleEnabledChange = async (row: TaskManagementVO, value: boolean) => {
if (!row.id) return
const oldEnabled = row.enabled

@ -1,31 +1,50 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="类型" prop="type">
<el-select v-model="formData.type" placeholder="请选择类型">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-form-item label="类型" prop="type">
<el-radio-group v-model="formData.type">
<el-radio v-for="dict in getDictOptions('mes_zj_schema_type')" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="抽检方式" prop="sampleMethod">
<el-input v-model="formData.sampleMethod" placeholder="请输入抽检方式" />
<el-form-item v-if="isSampleType" label="抽检方式" prop="sampleMethod">
<el-radio-group v-model="formData.sampleMethod">
<el-radio v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="值" prop="val">
<el-input v-model="formData.val" placeholder="请输入值" />
<el-form-item v-if="isSampleType" label="值" prop="val">
<template v-if="isRateMethod">
<el-input-number v-model="rateVal" :min="0" class="!w-160px" />
<span class="ml-8px">%</span>
</template>
<template v-else-if="isGapMethod">
<span>每间隔</span>
<el-input-number v-model="gapInterval" :min="1" class="!w-120px mx-8px" :controls="false" />
<span>抽取</span>
<el-input-number v-model="gapCount" :min="1" class="!w-120px ml-8px" :controls="false" />
</template>
<template v-else>
<el-input v-model="formData.val" placeholder="请输入值" />
</template>
</el-form-item>
<el-form-item label="关联项目" prop="item">
<el-input v-model="formData.item" placeholder="请输入关联项目" />
<el-row :gutter="8" class="w-full">
<el-col :span="22">
<el-input :model-value="displayItemNames" placeholder="请选择检验项目" readonly />
</el-col>
<el-col :span="2" class="text-right">
<el-button type="primary" @click="openItemDialog"></el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
@ -33,9 +52,79 @@
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
<el-dialog v-model="itemDialogVisible" title="选择检验项目" width="920px" draggable>
<div v-loading="itemLoading">
<div class="formula-config-picklist">
<div class="formula-config-panel">
<div class="formula-config-panel__header">
<div>来源</div>
<div class="formula-config-panel__meta">{{ filteredSourceItems.length }}</div>
</div>
<div class="formula-config-panel__filter">
<el-input v-model="sourceKeyword" placeholder="筛选" clearable />
</div>
<el-table
class="formula-config-panel__table"
:data="filteredSourceItems"
height="440"
row-key="key"
@selection-change="handleSourceSelectionChange"
>
<el-table-column type="selection" width="44" />
<el-table-column label="名称" prop="name" />
<el-table-column label="检验类型">
<template #default="scope">
{{ scope.row.zjTypeName }}
</template>
</el-table-column>
</el-table>
</div>
<div class="formula-config-actions">
<el-button type="primary" :disabled="!sourceCheckedKeys.length" @click="addToTarget">
&gt;&gt;
</el-button>
<el-button :disabled="!targetCheckedKeys.length" @click="removeFromTarget">
&lt;&lt;
</el-button>
</div>
<div class="formula-config-panel">
<div class="formula-config-panel__header">
<div>目标</div>
<div class="formula-config-panel__meta">{{ filteredTargetItems.length }}</div>
</div>
<div class="formula-config-panel__filter">
<el-input v-model="targetKeyword" placeholder="筛选" clearable />
</div>
<el-table
class="formula-config-panel__table"
:data="filteredTargetItems"
height="440"
row-key="key"
@selection-change="handleTargetSelectionChange"
>
<el-table-column type="selection" width="44" />
<el-table-column label="名称" prop="name" />
<el-table-column label="检验类型">
<template #default="scope">
{{ scope.row.zjTypeName }}
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
<template #footer>
<el-button @click="itemDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmSelectItems"> </el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { getDictOptions } from '@/utils/dict'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
import { ZjItemApi, ZjItemVO } from '@/api/mes/zjitem'
/** 检验方案 表单 */
defineOptions({ name: 'ZjSchemaForm' })
@ -48,18 +137,183 @@ const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
type: undefined,
name: undefined,
remark: undefined,
sampleMethod: undefined,
val: undefined,
item: undefined,
type: 'All' as string | undefined,
name: undefined as string | undefined,
remark: undefined as string | undefined,
sampleMethod: undefined as string | undefined,
val: undefined as string | undefined,
item: undefined as string | undefined,
})
const rateVal = ref<number | undefined>(undefined)
const gapInterval = ref<number | undefined>(undefined)
const gapCount = ref<number | undefined>(undefined)
const itemDialogVisible = ref(false)
const itemLoading = ref(false)
const itemList = ref<ZjItemVO[]>([])
const selectedItemIds = ref<number[]>([])
const sourceKeyword = ref('')
const targetKeyword = ref('')
const sourceCheckedKeys = ref<number[]>([])
const targetCheckedKeys = ref<number[]>([])
const formRules = reactive({
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
type: [{ required: true, message: '类型不能为空', trigger: 'change' }],
sampleMethod: [{ required: true, message: '抽检方式不能为空', trigger: 'change' }],
val: [{ validator: (_: any, __: any, callback: any) => validateVal(callback), trigger: 'blur' }],
})
const formRef = ref() // Ref
const isSampleType = computed(() => {
const type = formData.value.type
return type === 'Sample'
})
const isRateMethod = computed(() => formData.value.sampleMethod === 'Rate')
const isGapMethod = computed(() => formData.value.sampleMethod === 'Gap')
const displayItemNames = computed(() => {
if (!selectedItemIds.value.length) return ''
if (!itemList.value.length) {
return formData.value.item ? String(formData.value.item) : ''
}
const map = new Map(itemList.value.map((item) => [item.id, item.name]))
const names = selectedItemIds.value
.map((id) => map.get(id))
.filter((name) => name)
return names.join(',')
})
const allItems = computed(() =>
itemList.value.map((item) => {
const typeName = item.zjTypeName || ''
const name = item.name || ''
const label = typeName ? `${typeName}-${name}` : name
return {
...item,
key: item.id,
label,
}
})
)
const sourceItems = computed(() =>
allItems.value.filter((item) => !selectedItemIds.value.includes(item.id))
)
const targetItems = computed(() =>
allItems.value.filter((item) => selectedItemIds.value.includes(item.id))
)
const filteredSourceItems = computed(() => {
const keyword = sourceKeyword.value.trim()
if (!keyword) return sourceItems.value
return sourceItems.value.filter((item) => item.label?.includes(keyword))
})
const filteredTargetItems = computed(() => {
const keyword = targetKeyword.value.trim()
if (!keyword) return targetItems.value
return targetItems.value.filter((item) => item.label?.includes(keyword))
})
const validateVal = (callback: any) => {
if (!isSampleType.value) {
callback()
return
}
if (isRateMethod.value) {
if (rateVal.value === undefined || rateVal.value === null) {
callback(new Error('值不能为空'))
return
}
} else if (isGapMethod.value) {
if (!gapInterval.value || !gapCount.value) {
callback(new Error('值不能为空'))
return
}
} else if (!formData.value.val) {
callback(new Error('值不能为空'))
return
}
callback()
}
watch(
() => formData.value.type,
(val) => {
if (val === 'Sample') {
if (!formData.value.sampleMethod) {
const opts = getDictOptions('mes_zj_schema_sample_method')
if (opts && opts.length > 0) {
formData.value.sampleMethod = String(opts[0].value)
}
}
return
}
formData.value.sampleMethod = undefined
formData.value.val = undefined
rateVal.value = undefined
gapInterval.value = undefined
gapCount.value = undefined
formRef.value?.clearValidate?.(['sampleMethod', 'val'])
}
)
const openItemDialog = async () => {
itemDialogVisible.value = true
if (!itemList.value.length) {
itemLoading.value = true
try {
itemList.value = await ZjItemApi.getZjItemList()
} finally {
itemLoading.value = false
}
}
initSelectedItemIds()
sourceCheckedKeys.value = []
targetCheckedKeys.value = []
}
const initSelectedItemIds = () => {
if (!formData.value.item) {
selectedItemIds.value = []
return
}
const ids = String(formData.value.item)
.split(',')
.map((v) => Number(v.trim()))
.filter((v) => !Number.isNaN(v))
selectedItemIds.value = ids
}
const confirmSelectItems = () => {
formData.value.item = selectedItemIds.value.join(',')
itemDialogVisible.value = false
}
const handleSourceSelectionChange = (rows: any[]) => {
sourceCheckedKeys.value = rows.map((row: any) => row.id)
}
const handleTargetSelectionChange = (rows: any[]) => {
targetCheckedKeys.value = rows.map((row: any) => row.id)
}
const addToTarget = () => {
if (!sourceCheckedKeys.value.length) return
const set = new Set(selectedItemIds.value)
sourceCheckedKeys.value.forEach((id) => set.add(id))
selectedItemIds.value = Array.from(set)
sourceCheckedKeys.value = []
}
const removeFromTarget = () => {
if (!targetCheckedKeys.value.length) return
const removeSet = new Set(targetCheckedKeys.value)
selectedItemIds.value = selectedItemIds.value.filter((id) => !removeSet.has(id))
targetCheckedKeys.value = []
}
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@ -70,7 +324,21 @@ const open = async (type: string, id?: number) => {
if (id) {
formLoading.value = true
try {
formData.value = await ZjSchemaApi.getZjSchema(id)
const data = await ZjSchemaApi.getZjSchema(id)
formData.value = data
initSelectedItemIds()
if (formData.value.type === 'Sample') {
if (formData.value.sampleMethod === 'Rate') {
const n = Number(formData.value.val)
rateVal.value = Number.isNaN(n) ? undefined : n
} else if (formData.value.sampleMethod === 'Gap' && typeof formData.value.val === 'string') {
const parts = formData.value.val.split(',').map((v: string) => v.trim())
const interval = Number(parts[0])
const count = Number(parts[1])
gapInterval.value = Number.isNaN(interval) ? undefined : interval
gapCount.value = Number.isNaN(count) ? undefined : count
}
}
} finally {
formLoading.value = false
}
@ -83,6 +351,21 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
const submitForm = async () => {
//
await formRef.value.validate()
if (isSampleType.value) {
if (isRateMethod.value) {
formData.value.val =
rateVal.value === undefined || rateVal.value === null ? undefined : String(rateVal.value)
} else if (isGapMethod.value) {
if (gapInterval.value && gapCount.value) {
formData.value.val = `${gapInterval.value},${gapCount.value}`
} else {
formData.value.val = undefined
}
}
} else {
formData.value.sampleMethod = ''
formData.value.val = ''
}
//
formLoading.value = true
try {
@ -105,13 +388,67 @@ const submitForm = async () => {
/** 重置表单 */
const resetForm = () => {
formData.value = {
type: undefined,
type: 'All',
name: undefined,
remark: undefined,
sampleMethod: undefined,
val: undefined,
item: undefined,
}
rateVal.value = undefined
gapInterval.value = undefined
gapCount.value = undefined
selectedItemIds.value = []
sourceKeyword.value = ''
targetKeyword.value = ''
sourceCheckedKeys.value = []
targetCheckedKeys.value = []
formRef.value?.resetFields()
}
</script>
</script>
<style scoped>
.formula-config-picklist {
display: flex;
width: 100%;
}
.formula-config-panel {
width: calc((100% - 96px) / 2);
border: 1px solid var(--el-border-color);
border-radius: 4px;
overflow: hidden;
background: var(--el-bg-color);
}
.formula-config-panel__header {
display: flex;
justify-content: space-between;
padding: 10px 12px;
border-bottom: 1px solid var(--el-border-color);
font-weight: 600;
}
.formula-config-panel__meta {
color: var(--el-text-color-secondary);
font-weight: 400;
}
.formula-config-panel__filter {
padding: 10px 12px;
border-bottom: 1px solid var(--el-border-color);
}
.formula-config-panel__table {
width: 100%;
}
.formula-config-actions {
width: 96px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 12px;
}
</style>

@ -1,97 +1,58 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="类型" prop="type">
<el-select
v-model="queryParams.type"
placeholder="请选择类型"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item label="名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
<el-form-item label="类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类型" clearable class="!w-240px">
<el-option
v-for="dict in getDictOptions('mes_zj_schema_type')" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="抽检方式" prop="sampleMethod">
<el-input
v-model="queryParams.sampleMethod"
placeholder="请输入抽检方式"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
<el-select v-model="queryParams.sampleMethod" placeholder="请选择抽检方式" clearable class="!w-240px">
<el-option
v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="值" prop="val">
<el-input v-model="queryParams.val" placeholder="请输入值" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.val"
placeholder="请输入值"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="关联项目" prop="item">
<el-input
v-model="queryParams.item"
placeholder="请输入关联项目"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.item" placeholder="请输入关联项目" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:zj-schema:create']"
>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['mes:zj-schema:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:zj-schema:export']"
>
type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['mes:zj-schema:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
@ -100,36 +61,52 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="类型" align="center" prop="type" />
<el-table
v-loading="loading"
:data="list"
:show-overflow-tooltip="true"
@expand-change="handleExpandChange"
>
<el-table-column type="expand">
<template #default="scope">
<el-table
v-loading="scope.row._itemLoading"
:data="scope.row._items || []"
size="small"
:show-overflow-tooltip="true"
>
<el-table-column label="名称" prop="name" align="center" />
<el-table-column label="作业方式" prop="tool" align="center" />
<el-table-column label="标准值" prop="standardVal" align="center" />
<el-table-column label="单位" prop="unit" align="center" />
<el-table-column label="上限值" prop="upperVal" align="center" />
<el-table-column label="下限值" prop="lowerVal" align="center" />
<el-table-column label="备注" prop="remark" align="center" />
</el-table>
</template>
</el-table-column>
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="抽检方式" align="center" prop="sampleMethod" />
<el-table-column label="类型" align="center" prop="type">
<template #default="scope">
<dict-tag type="mes_zj_schema_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="抽检方式" align="center" prop="sampleMethod">
<template #default="scope">
<dict-tag type="mes_zj_schema_sample_method" :value="scope.row.sampleMethod" />
</template>
</el-table-column>
<el-table-column label="值" align="center" prop="val" />
<el-table-column label="关联项目" align="center" prop="item" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:zj-schema:update']"
>
link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['mes:zj-schema:update']">
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:zj-schema:delete']"
>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:zj-schema:delete']">
删除
</el-button>
</template>
@ -137,11 +114,8 @@
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
@ -149,6 +123,8 @@
</template>
<script setup lang="ts">
import { DictTag } from '@/components/DictTag'
import { getDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
@ -217,7 +193,7 @@ const handleDelete = async (id: number) => {
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
} catch { }
}
/** 导出按钮操作 */
@ -235,8 +211,20 @@ const handleExport = async () => {
}
}
const handleExpandChange = async (row: any) => {
if (!row || !row.id) return
if (row._items && Array.isArray(row._items)) return
row._itemLoading = true
try {
const data = await ZjSchemaApi.getItemList(row.id)
row._items = data || []
} finally {
row._itemLoading = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
</script>

Loading…
Cancel
Save