Compare commits

...

6 Commits

@ -53,6 +53,10 @@ export const DvRepairApi = {
return await request.download({ url: `/mes/dv-repair/export-excel`, params }) 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 })
},
// ==================== 子表(设备维修记录行) ==================== // ==================== 子表(设备维修记录行) ====================
// 获得设备维修记录行列表 // 获得设备维修记录行列表

@ -5,6 +5,7 @@ export interface ZjItemVO {
id: number // ID id: number // ID
zjType: number // 检验类型 zjType: number // 检验类型
name: string // 名称 name: string // 名称
zjTypeName?: string
remark: string // 备注 remark: string // 备注
tool: string // 作业方式 tool: string // 作业方式
standardVal: number // 标准值 standardVal: number // 标准值
@ -20,6 +21,10 @@ export const ZjItemApi = {
return await request.get({ url: `/mes/zj-item/page`, params }) 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) => { getZjItem: async (id: number) => {
return await request.get({ url: `/mes/zj-item/get?id=` + id }) return await request.get({ url: `/mes/zj-item/get?id=` + id })

@ -2,12 +2,13 @@ import request from '@/config/axios'
// 检验方案 VO // 检验方案 VO
export interface ZjSchemaVO { export interface ZjSchemaVO {
type: string // 类型 id: number
name: string // 名称 type: string
remark: string // 备注 name: string
sampleMethod: string // 抽检方式 remark: string
val: number // 值 sampleMethod: string
item: string // 关联项目 val: string
item: string
} }
// 检验方案 API // 检验方案 API
@ -41,4 +42,8 @@ export const ZjSchemaApi = {
exportZjSchema: async (params) => { exportZjSchema: async (params) => {
return await request.download({ url: `/mes/zj-schema/export-excel`, 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-tabs v-model="subTabsName">
<el-tab-pane label="设备维修项目行" name="dvRepairLine"> <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-tab-pane>
</el-tabs> </el-tabs>
<template #footer> <template #footer>
@ -416,8 +416,24 @@ const submitForm = async () => {
} }
;(data as any).deviceId = formData.value.deviceId ;(data as any).deviceId = formData.value.deviceId
;(data as any).componentId = formData.value.machineryTypeId === 2 ? formData.value.componentId : undefined ;(data as any).componentId = formData.value.machineryTypeId === 2 ? formData.value.componentId : undefined
// const lineList = dvRepairLineFormRef.value.getData() || []
data.dvRepairLines = 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') { if (formType.value === 'create') {
await DvRepairApi.createDvRepair(data) await DvRepairApi.createDvRepair(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
@ -425,6 +441,7 @@ const submitForm = async () => {
await DvRepairApi.updateDvRepair(data) await DvRepairApi.updateDvRepair(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
}
dialogVisible.value = false dialogVisible.value = false
// //
emit('success') emit('success')

@ -44,6 +44,21 @@
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </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"> <!-- <el-table-column label="标准" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subjectStandard`" :rules="formRules.subjectStandard" class="mb-0px!"> <el-form-item :prop="`${$index}.subjectStandard`" :rules="formRules.subjectStandard" class="mb-0px!">
@ -86,15 +101,16 @@
</el-table-column> --> </el-table-column> -->
</el-table> </el-table>
</el-form> </el-form>
<el-row justify="center" class="mt-3"> <!-- <el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加维修项目</el-button> <el-button @click="handleAdd" round>+ 添加维修项目</el-button>
</el-row> </el-row> -->
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DvRepairApi } from '@/api/mes/dvrepair' import { DvRepairApi } from '@/api/mes/dvrepair'
const props = defineProps<{ const props = defineProps<{
repairId: undefined // ID repairId: undefined
isRepairMode?: boolean
}>() }>()
const formLoading = ref(false) // const formLoading = ref(false) //
const formData = ref([]) const formData = ref([])
@ -141,6 +157,7 @@ const handleAdd = () => {
malfunctionUrl: undefined, malfunctionUrl: undefined,
repairDes: undefined, repairDes: undefined,
remark: undefined, remark: undefined,
repairResult: undefined,
} }
row.repairId = props.repairId row.repairId = props.repairId
formData.value.push(row) formData.value.push(row)

@ -100,6 +100,13 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to
</el-tag> </el-tag>
</template> </template>
</el-table-column> </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="remark" /> -->
<el-table-column <el-table-column
label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="170px" label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="170px"
@ -189,6 +196,22 @@ const getStatusTagType = (value: any) => {
return 'info' 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 tableRef = ref()
const selectedIds = ref<number[]>([]) const selectedIds = ref<number[]>([])
const handleSelectionChange = (rows: any[]) => { const handleSelectionChange = (rows: any[]) => {

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

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

@ -82,6 +82,7 @@
<template #default="scope"> <template #default="scope">
<el-switch <el-switch
:model-value="scope.row.enabled === true || scope.row.enabled === 'true'" :model-value="scope.row.enabled === true || scope.row.enabled === 'true'"
:before-change="() => handleBeforeEnabledChange(scope.row)"
@change="(val) => handleEnabledChange(scope.row, val)" @change="(val) => handleEnabledChange(scope.row, val)"
/> />
</template> </template>
@ -126,6 +127,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ElMessageBox } from 'element-plus'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime' import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
import download from '@/utils/download' 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) => { const handleEnabledChange = async (row: TaskManagementVO, value: boolean) => {
if (!row.id) return if (!row.id) return
const oldEnabled = row.enabled const oldEnabled = row.enabled

@ -1,31 +1,50 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
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-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" /> <el-input v-model="formData.name" placeholder="请输入名称" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="类型" prop="type">
<el-input v-model="formData.remark" placeholder="请输入备注" /> <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>
<el-form-item label="抽检方式" prop="sampleMethod"> <el-form-item v-if="isSampleType" label="抽检方式" prop="sampleMethod">
<el-input v-model="formData.sampleMethod" placeholder="请输入抽检方式" /> <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>
<el-form-item label="值" prop="val"> <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="请输入值" /> <el-input v-model="formData.val" placeholder="请输入值" />
</template>
</el-form-item> </el-form-item>
<el-form-item label="关联项目" prop="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-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -33,9 +52,79 @@
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
</template> </template>
</Dialog> </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> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getDictOptions } from '@/utils/dict'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema' import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
import { ZjItemApi, ZjItemVO } from '@/api/mes/zjitem'
/** 检验方案 表单 */ /** 检验方案 表单 */
defineOptions({ name: 'ZjSchemaForm' }) defineOptions({ name: 'ZjSchemaForm' })
@ -48,18 +137,183 @@ const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
type: undefined, type: 'All' as string | undefined,
name: undefined, name: undefined as string | undefined,
remark: undefined, remark: undefined as string | undefined,
sampleMethod: undefined, sampleMethod: undefined as string | undefined,
val: undefined, val: undefined as string | undefined,
item: 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({ const formRules = reactive({
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }], 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 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) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
@ -70,7 +324,21 @@ const open = async (type: string, id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { 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 { } finally {
formLoading.value = false formLoading.value = false
} }
@ -83,6 +351,21 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
const submitForm = async () => { const submitForm = async () => {
// //
await formRef.value.validate() 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 formLoading.value = true
try { try {
@ -105,13 +388,67 @@ const submitForm = async () => {
/** 重置表单 */ /** 重置表单 */
const resetForm = () => { const resetForm = () => {
formData.value = { formData.value = {
type: undefined, type: 'All',
name: undefined, name: undefined,
remark: undefined, remark: undefined,
sampleMethod: undefined, sampleMethod: undefined,
val: undefined, val: undefined,
item: 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() 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> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
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-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery"
placeholder="请输入名称" class="!w-240px" />
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="类型" prop="type">
<el-input <el-select v-model="queryParams.type" placeholder="请选择类型" clearable class="!w-240px">
v-model="queryParams.remark" <el-option
placeholder="请输入备注" v-for="dict in getDictOptions('mes_zj_schema_type')" :key="dict.value" :label="dict.label"
clearable :value="dict.value" />
@keyup.enter="handleQuery" </el-select>
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="抽检方式" prop="sampleMethod"> <el-form-item label="抽检方式" prop="sampleMethod">
<el-input <el-select v-model="queryParams.sampleMethod" placeholder="请选择抽检方式" clearable class="!w-240px">
v-model="queryParams.sampleMethod" <el-option
placeholder="请输入抽检方式" v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value" :label="dict.label"
clearable :value="dict.value" />
@keyup.enter="handleQuery" </el-select>
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="值" prop="val"> <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 <el-input
v-model="queryParams.val" v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter="handleQuery"
placeholder="请输入值" class="!w-240px" />
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="关联项目" prop="item"> <el-form-item label="关联项目" prop="item">
<el-input <el-input
v-model="queryParams.item" v-model="queryParams.item" placeholder="请输入关联项目" clearable @keyup.enter="handleQuery"
placeholder="请输入关联项目" class="!w-240px" />
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期"
type="daterange" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
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-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery">
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <Icon icon="ep:search" class="mr-5px" /> 搜索
<el-button </el-button>
type="primary" <el-button @click="resetQuery">
plain <Icon icon="ep:refresh" class="mr-5px" /> 重置
@click="openForm('create')" </el-button>
v-hasPermi="['mes:zj-schema:create']" <el-button type="primary" plain @click="openForm('create')" v-hasPermi="['mes:zj-schema:create']">
>
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button
type="success" type="success" plain @click="handleExport" :loading="exportLoading"
plain v-hasPermi="['mes:zj-schema:export']">
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:zj-schema:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出 <Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -100,36 +61,52 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table
<el-table-column label="类型" align="center" prop="type" /> 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="name" />
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="类型" align="center" prop="type">
<el-table-column label="抽检方式" align="center" prop="sampleMethod" /> <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="val" />
<el-table-column label="关联项目" align="center" prop="item" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px"> <el-table-column label="操作" align="center" min-width="120px">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link type="primary" @click="openForm('update', scope.row.id)"
type="primary" v-hasPermi="['mes:zj-schema:update']">
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:zj-schema:update']"
>
编辑 编辑
</el-button> </el-button>
<el-button <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:zj-schema:delete']">
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:zj-schema:delete']"
>
删除 删除
</el-button> </el-button>
</template> </template>
@ -137,11 +114,8 @@
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination
:total="total" :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo" @pagination="getList" />
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap> </ContentWrap>
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
@ -149,6 +123,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DictTag } from '@/components/DictTag'
import { getDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema' import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
@ -235,6 +211,18 @@ 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(() => { onMounted(() => {
getList() getList()

Loading…
Cancel
Save