feat:模具管理-维修单模块重构

main
黄伟杰 3 weeks ago
parent 4c98bb463a
commit 04150a392f

@ -293,7 +293,7 @@ export default {
warehouseId: 'Warehouse', warehouseId: 'Warehouse',
areaCode: 'Area Code', areaCode: 'Area Code',
areaName: 'Area Name', areaName: 'Area Name',
areaSize: 'Area Size (㎡)', areaSize: 'Area Size (<EFBFBD>?',
description: 'Description', description: 'Description',
status: 'Status', status: 'Status',
createTime: 'Create Time', createTime: 'Create Time',
@ -313,7 +313,7 @@ export default {
areaId: 'Area', areaId: 'Area',
code: 'Location Code', code: 'Location Code',
name: 'Location Name', name: 'Location Name',
areaSize: 'Area Size (㎡)', areaSize: 'Area Size (<EFBFBD>?',
maxLoadWeight: 'Max Load Weight', maxLoadWeight: 'Max Load Weight',
position: 'Position (X,Y,Z)', position: 'Position (X,Y,Z)',
positionX: 'Position X', positionX: 'Position X',
@ -2325,12 +2325,12 @@ export default {
nextMonth: 'next month', nextMonth: 'next month',
work: 'work', work: 'work',
rest: 'rest', rest: 'rest',
searchDateStartPlaceholder: '开始日期', searchDateStartPlaceholder: '<EFBFBD>?,
searchDateEndPlaceholder: '结束日期', searchDateEndPlaceholder: '结束日期',
searchTypeLabel: '类型', searchTypeLabel: '类型',
searchTypePlaceholder: '请选择类型', searchTypePlaceholder: '请选择类型',
searchRemarkLabel: '备注', searchRemarkLabel: '备注',
searchRemarkPlaceholder: '请输入备注', searchRemarkPlaceholder: '<EFBFBD>?,
searchButtonText: '搜索', searchButtonText: '搜索',
resetButtonText: '重置', resetButtonText: '重置',
addButtonText: '新增', addButtonText: '新增',
@ -2695,9 +2695,39 @@ export default {
validatorRepairNameRequired: 'Repair order can not be empty', validatorRepairNameRequired: 'Repair order can not be empty',
validatorMoldRequired: 'Mold can not be empty', validatorMoldRequired: 'Mold can not be empty',
tabMoldRepairLine: 'Mold Repair Line Items', tabMoldRepairLine: 'Mold Repair Line Items',
faultPhenomenon: 'Fault Phenomenon',
faultDescription: 'Fault Description',
faultLevel: 'Fault Level',
isShutdown: 'Is Shutdown',
faultImages: 'Fault Images',
faultReason: 'Fault Reason',
faultInfoTitle: 'Fault Information',
placeholderFaultPhenomenon: 'Please input fault phenomenon',
placeholderFaultDescription: 'Please input fault description',
placeholderFaultReason: 'Please input fault reason',
validatorFaultPhenomenonRequired: 'Fault phenomenon can not be empty',
validatorFaultLevelRequired: 'Fault level can not be empty',
validatorIsShutdownRequired: 'Is shutdown can not be empty',
dialogTitleCreate: 'Create Repair Order', dialogTitleCreate: 'Create Repair Order',
dialogTitleUpdate: 'Edit Repair Order', dialogTitleUpdate: 'Edit Repair Order',
dialogTitleRepair: 'Repair' dialogTitleRepair: 'Repair',
placeholderRemark: 'Please enter remarks within 300 characters',
validatorRequireDateRequired: 'Request date can not be empty',
validatorFinishDateRequired: 'Finish date can not be empty',
validatorConfirmDateRequired: 'Accept date can not be empty',
validatorRepairResultRequired: 'Repair result can not be empty',
warrantyDate: 'Warranty Date',
downtimeDuration: 'Downtime Duration',
handlingMeasures: 'Handling Measures',
replacementParts: 'Replacement Parts',
repairContent: 'Repair Content',
repairedImages: 'After-repair Images',
placeholderWarrantyDate: 'Select warranty date',
placeholderDowntimeDuration: 'Please enter downtime duration',
placeholderHandlingMeasures: 'Please enter handling measures',
placeholderReplacementParts: 'Please enter replacement parts',
placeholderRepairContent: 'Please describe the repair process and result',
placeholderRepairResult: 'Please select repair result'
}, },
MoldRepairLine: { MoldRepairLine: {

@ -2194,9 +2194,39 @@ export default {
validatorRepairNameRequired: '维修单不能为空', validatorRepairNameRequired: '维修单不能为空',
validatorMoldRequired: '模具不能为空', validatorMoldRequired: '模具不能为空',
tabMoldRepairLine: '模具维修项目行', tabMoldRepairLine: '模具维修项目行',
faultPhenomenon: '故障现象',
faultDescription: '故障描述',
faultLevel: '故障等级',
isShutdown: '是否停机',
faultImages: '故障图片',
faultReason: '故障原因',
faultInfoTitle: '故障信息',
placeholderFaultPhenomenon: '请输入故障现象',
placeholderFaultDescription: '请输入故障描述',
placeholderFaultReason: '请输入故障原因',
validatorFaultPhenomenonRequired: '故障现象不能为空',
validatorFaultLevelRequired: '故障等级不能为空',
validatorIsShutdownRequired: '是否停机不能为空',
dialogTitleCreate: '新增维修单', dialogTitleCreate: '新增维修单',
dialogTitleUpdate: '编辑维修单', dialogTitleUpdate: '编辑维修单',
dialogTitleRepair: '维修' dialogTitleRepair: '维修',
placeholderRemark: '请输入备注信息,限 300 字以内',
validatorRequireDateRequired: '报修日期不能为空',
validatorFinishDateRequired: '完成日期不能为空',
validatorConfirmDateRequired: '验收日期不能为空',
validatorRepairResultRequired: '维修结果不能为空',
warrantyDate: '保修日期',
downtimeDuration: '停机时长',
handlingMeasures: '处理措施',
replacementParts: '更换配件',
repairContent: '维修总结 / 维修内容',
repairedImages: '附件 / 维修后图片',
placeholderWarrantyDate: '选择保修日期',
placeholderDowntimeDuration: '请输入停机时长',
placeholderHandlingMeasures: '请输入处理措施',
placeholderReplacementParts: '请输入更换配件',
placeholderRepairContent: '请详细描述维修过程、处理情况及结果',
placeholderRepairResult: '请选择维修结果'
}, },
MoldRepairLine: { MoldRepairLine: {

@ -7,7 +7,7 @@
</el-button> </el-button>
</div> </div>
<div class="dv-repair-dialog" v-loading="formLoading"> <div class="dv-repair-dialog" v-loading="formLoading">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px"> <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
<section class="dv-repair-section"> <section class="dv-repair-section">
<div class="dv-repair-section__title">基本信息</div> <div class="dv-repair-section__title">基本信息</div>
<el-row :gutter="20"> <el-row :gutter="20">
@ -23,31 +23,111 @@
</template> </template>
<div class="dv-repair-code-row"> <div class="dv-repair-code-row">
<el-input <el-input
:disabled="formData.isCode == true || formType === 'update'" :disabled="repairCodeDisabled"
v-model="formData.repairCode" v-model="formData.repairCode"
:placeholder="t('common.code')" :placeholder="t('common.code')"
/> />
<el-switch <el-switch
v-model="formData.isCode" v-model="formData.isCode"
:disabled="formType === 'update'" :disabled="formType === 'update' || formType === 'repair' || formType === 'detail'"
/> />
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.repairName')" prop="repairName"> <el-form-item :label="t('MoldManagement.MoldRepair.repairName')" prop="repairName" required>
<el-input <el-input
v-model="formData.repairName" v-model="formData.repairName"
:placeholder="t('MoldManagement.MoldRepair.placeholderRepairName')" :placeholder="t('MoldManagement.MoldRepair.placeholderRepairName')"
:disabled="isRepairMode" :disabled="isBaseInfoReadonly"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.requireDate')" prop="requireDate" required>
<el-date-picker
v-model="formData.requireDate"
type="date"
value-format="x"
:placeholder="t('MoldManagement.MoldRepair.placeholderRequireDate')"
class="!w-full"
:disabled="isBaseInfoReadonly"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.repairUser')" prop="acceptedBy">
<el-select
v-model="formData.acceptedBy" filterable clearable
:placeholder="t('MoldManagement.MoldRepair.placeholderAcceptUser')"
class="!w-full"
:disabled="isRepairMetaReadonly">
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.confirmUser')" prop="confirmBy">
<el-select
v-model="formData.confirmBy" filterable clearable
:placeholder="t('MoldManagement.MoldRepair.placeholderConfirmUser')"
class="!w-full"
:disabled="isRepairMetaReadonly">
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.status')">
<el-input :model-value="statusLabel" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.faultLevel')" prop="faultLevel">
<template #label>
<span class="dv-repair-label is-required">
{{ t('MoldManagement.MoldRepair.faultLevel') }}
</span>
</template>
<el-radio-group v-model="formData.faultLevel" :disabled="isRepairMetaReadonly">
<el-radio
v-for="dict in failureLevelOptions"
:key="String(dict.value)"
:label="String(dict.value)"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.isShutdown')" prop="shutdown">
<template #label>
<span class="dv-repair-label is-required">
{{ t('MoldManagement.MoldRepair.isShutdown') }}
</span>
</template>
<el-radio-group v-model="formData.shutdown" :disabled="isRepairMetaReadonly">
<el-radio :label="true">{{ t('common.yes') }}</el-radio>
<el-radio :label="false">{{ t('common.no') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</section>
<section class="dv-repair-section">
<div class="dv-repair-section__title">维修对象</div>
<el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.mold')" prop="moldId"> <el-form-item :label="t('MoldManagement.MoldRepair.mold')" prop="moldId">
<el-select <el-select
v-model="formData.moldId" filterable clearable :loading="moldLoading" v-model="formData.moldId" filterable clearable :loading="moldLoading"
:disabled="isRepairMode" :disabled="isBaseInfoReadonly"
:placeholder="t('MoldManagement.MoldRepair.placeholderMold')" :placeholder="t('MoldManagement.MoldRepair.placeholderMold')"
class="!w-full" class="!w-full"
> >
@ -55,8 +135,6 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.moldName')" prop="moldName" :required="false"> <el-form-item :label="t('MoldManagement.MoldRepair.moldName')" prop="moldName" :required="false">
<el-input v-model="formData.moldName" :placeholder="t('MoldManagement.MoldRepair.placeholderMoldNameAuto')" disabled /> <el-input v-model="formData.moldName" :placeholder="t('MoldManagement.MoldRepair.placeholderMoldNameAuto')" disabled />
@ -68,27 +146,46 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</section>
<section class="dv-repair-section">
<div class="dv-repair-section__title">故障信息</div>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="24">
<el-form-item :label="t('MoldManagement.MoldRepair.repairUser')" prop="acceptedBy"> <el-form-item :label="t('MoldManagement.MoldRepair.faultPhenomenon')" prop="faultPhenomenon">
<el-select <template #label>
v-model="formData.acceptedBy" filterable clearable <span class="dv-repair-label is-required">
:placeholder="t('MoldManagement.MoldRepair.placeholderAcceptUser')" {{ t('MoldManagement.MoldRepair.faultPhenomenon') }}
class="!w-full" </span>
:disabled="isRepairMode"> </template>
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" /> <el-input
</el-select> v-model="formData.faultPhenomenon"
:placeholder="t('MoldManagement.MoldRepair.placeholderFaultPhenomenon')"
:disabled="isFaultInfoReadonly"
/>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldRepair.faultDescription')" prop="faultDescription">
<el-input
v-model="formData.faultDescription"
type="textarea"
:rows="4"
:placeholder="t('MoldManagement.MoldRepair.placeholderFaultDescription')"
:disabled="isFaultInfoReadonly"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> </el-row>
<el-form-item :label="t('MoldManagement.MoldRepair.confirmUser')" prop="confirmBy"> <el-row :gutter="20">
<el-select <el-col :span="24">
v-model="formData.confirmBy" filterable clearable <el-form-item :label="t('MoldManagement.MoldRepair.faultImages')">
:placeholder="t('MoldManagement.MoldRepair.placeholderConfirmUser')" <UploadImgs
class="!w-full" v-model="faultImagesValue"
:disabled="isRepairMode"> :limit="9"
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" /> :disabled="isFaultInfoReadonly"
</el-select> width="120px"
height="120px"
class="dv-repair-upload"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -98,16 +195,30 @@
<div class="dv-repair-section__title">处理结果</div> <div class="dv-repair-section__title">处理结果</div>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.requireDate')" prop="requireDate"> <el-form-item :label="t('MoldManagement.MoldRepair.repairResult')" prop="repairStatus">
<el-date-picker <template #label>
v-model="formData.requireDate" type="date" value-format="x" <span class="dv-repair-label" :class="{ 'is-required': formType === 'repair' }">
:placeholder="t('MoldManagement.MoldRepair.placeholderRequireDate')" {{ t('MoldManagement.MoldRepair.repairResult') }}
class="!w-full" :disabled="repairFieldsDisabled" </span>
/> </template>
<el-select
v-model="formData.repairStatus"
class="!w-full"
:placeholder="t('MoldManagement.MoldRepair.placeholderRepairResult')"
:disabled="repairFieldsDisabled"
>
<el-option :label="t('MoldManagement.MoldRepair.repairResultOk')" :value="1" />
<el-option :label="t('MoldManagement.MoldRepair.repairResultNg')" :value="2" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.finishDate')" prop="finishDate"> <el-form-item :label="t('MoldManagement.MoldRepair.finishDate')" prop="finishDate">
<template #label>
<span class="dv-repair-label" :class="{ 'is-required': formType === 'repair' }">
{{ t('MoldManagement.MoldRepair.finishDate') }}
</span>
</template>
<el-date-picker <el-date-picker
v-model="formData.finishDate" type="date" value-format="x" v-model="formData.finishDate" type="date" value-format="x"
:placeholder="t('MoldManagement.MoldRepair.placeholderFinishDate')" :placeholder="t('MoldManagement.MoldRepair.placeholderFinishDate')"
@ -117,6 +228,11 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.confirmDate')" prop="confirmDate"> <el-form-item :label="t('MoldManagement.MoldRepair.confirmDate')" prop="confirmDate">
<template #label>
<span class="dv-repair-label" :class="{ 'is-required': formType === 'repair' }">
{{ t('MoldManagement.MoldRepair.confirmDate') }}
</span>
</template>
<el-date-picker <el-date-picker
v-model="formData.confirmDate" type="date" value-format="x" v-model="formData.confirmDate" type="date" value-format="x"
:placeholder="t('MoldManagement.MoldRepair.placeholderConfirmDate')" :placeholder="t('MoldManagement.MoldRepair.placeholderConfirmDate')"
@ -125,56 +241,138 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.downtimeDuration')" prop="downtimeDuration">
<el-input
v-model="formData.downtimeDuration"
:placeholder="t('MoldManagement.MoldRepair.placeholderDowntimeDuration')"
:disabled="repairFieldsDisabled"
>
<template #append>小时</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.faultReason')" prop="faultReason">
<el-input
v-model="formData.faultReason"
:placeholder="t('MoldManagement.MoldRepair.placeholderFaultReason')"
:disabled="repairFieldsDisabled"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.handlingMeasures')" prop="handlingMeasures">
<el-input
v-model="formData.handlingMeasures"
:placeholder="t('MoldManagement.MoldRepair.placeholderHandlingMeasures')"
:disabled="repairFieldsDisabled"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.replacementParts')" prop="replacementParts">
<el-input
v-model="formData.replacementParts"
:placeholder="t('MoldManagement.MoldRepair.placeholderReplacementParts')"
:disabled="repairFieldsDisabled"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="14">
<el-form-item :label="t('MoldManagement.MoldRepair.repairContent')" prop="repairContent">
<el-input
v-model="formData.repairContent"
type="textarea"
:rows="4"
:maxlength="1000"
show-word-limit
:placeholder="t('MoldManagement.MoldRepair.placeholderRepairContent')"
:disabled="repairFieldsDisabled"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item :label="t('MoldManagement.MoldRepair.repairResult')" prop="repairResult"> <el-form-item :label="t('MoldManagement.MoldRepair.repairedImages')">
<Editor v-model="formData.repairResult" height="150px" :readonly="repairFieldsDisabled" /> <UploadImgs
v-model="repairedImagesValue"
:limit="9"
:disabled="repairFieldsDisabled"
width="120px"
height="120px"
class="dv-repair-upload"
>
<template #tip>
<span>最多上传 9 张维修后图片</span>
</template>
</UploadImgs>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</section> </section>
</el-form>
<el-tabs v-model="subTabsName" style="margin-top: 16px;"> <section class="dv-repair-section">
<el-tab-pane :label="t('MoldManagement.MoldRepair.tabMoldRepairLine')" name="moldRepairLine"> <div class="dv-repair-section__title">创建备注 / 补充说明</div>
<MoldRepairLineForm ref="moldRepairLineFormRef" :repair-id="formData.id" :line-mode="lineMode" /> <el-form-item prop="remark" label-width="0">
</el-tab-pane> <el-input
</el-tabs> v-model="formData.remark"
type="textarea"
:rows="3"
maxlength="300"
show-word-limit
:placeholder="t('MoldManagement.MoldRepair.placeholderRemark')"
:disabled="formType === 'repair' || isDetailMode"
/>
</el-form-item>
</section>
</el-form>
</div> </div>
<div class="dv-repair-footer"> <div class="dv-repair-footer">
<el-button @click="closeForm">{{ t('common.cancel') }}</el-button> <el-button @click="closeForm">{{ t('common.cancel') }}</el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('common.ok') }}</el-button> <el-button v-if="!isDetailMode" @click="submitForm" type="primary" :disabled="formLoading">{{ submitButtonText }}</el-button>
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { MoldRepairApi, MoldRepairVO } from '@/api/mold/moldrepair' import { MoldRepairApi, MoldRepairVO } from '@/api/mold/moldrepair'
import { MoldRepairItemsApi } from '@/api/mold/moldRepairItems'
import MoldRepairLineForm from './components/MoldRepairLineForm.vue'
import { MoldBrandApi, MoldVO } from '@/api/erp/mold' import { MoldBrandApi, MoldVO } from '@/api/erp/mold'
import { getSimpleUserList, UserVO } from '@/api/system/user' import { getSimpleUserList, UserVO } from '@/api/system/user'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
defineOptions({ name: 'MoldRepairForm' }) defineOptions({ name: 'MoldRepairForm' })
const { t } = useI18n() interface MoldRepairFormData extends Partial<MoldRepairVO> {
const message = useMessage() moldId?: number
shutdown?: boolean
isCode?: boolean
faultLevel?: string
faultImages?: string
repairResult?: string
repairStatus?: string
faultPhenomenon?: string
faultDescription?: string
faultReason?: string
downtimeDuration?: string
handlingMeasures?: string
replacementParts?: string
repairContent?: string
repairedImages?: string
}
const dialogTitle = ref('') const createDefaultFormData = (): MoldRepairFormData => ({
const formLoading = ref(false)
const formType = ref('')
const isRepairMode = computed(() => formType.value === 'update' || formType.value === 'repair')
const showRepairFields = computed(() => formType.value === 'update' || formType.value === 'repair')
const repairFieldsDisabled = computed(() => formType.value !== 'repair')
const isHydrating = ref(false)
const openRequestId = ref(0)
const emit = defineEmits(['success', 'closed'])
const formData = ref({
id: undefined, id: undefined,
repairCode: undefined, repairCode: undefined,
repairName: undefined, repairName: undefined,
moldId: undefined as number | undefined, moldId: undefined,
moldCode: undefined, moldCode: undefined,
moldName: undefined, moldName: undefined,
machineryBrand: undefined, machineryBrand: undefined,
@ -183,28 +381,73 @@ const formData = ref({
finishDate: undefined, finishDate: undefined,
confirmDate: undefined, confirmDate: undefined,
repairResult: '', repairResult: '',
repairStatus: '',
faultPhenomenon: undefined,
faultDescription: undefined,
faultLevel: undefined,
shutdown: undefined,
faultImages: '',
faultReason: undefined,
acceptedBy: undefined, acceptedBy: undefined,
confirmBy: undefined, confirmBy: undefined,
status: undefined, status: undefined,
remark: undefined, remark: undefined,
isCode: undefined isCode: true,
downtimeDuration: undefined,
handlingMeasures: undefined,
replacementParts: undefined,
repairContent: undefined,
repairedImages: '',
})
const { t } = useI18n()
const message = useMessage()
const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const isDetailMode = computed(() => formType.value === 'detail')
const isBaseInfoReadonly = computed(() => formType.value === 'repair' || formType.value === 'detail')
const isRepairMetaReadonly = computed(() => formType.value === 'detail')
const isFaultInfoReadonly = computed(() => formType.value === 'repair' || formType.value === 'detail')
const repairCodeDisabled = computed(() => formData.value.isCode === true || formType.value === 'update' || formType.value === 'repair' || formType.value === 'detail')
const submitButtonText = computed(() => {
if (formType.value === 'create') return '保存'
if (formType.value === 'repair') return '保存并提交'
return t('common.ok')
}) })
const currentStatusValue = computed(() => {
const value = formData.value.status
return value === '' || value === null || value === undefined ? '' : String(value)
})
const currentRepairStatusValue = computed(() => {
const value = formData.value.repairStatus
return value === '' || value === null || value === undefined ? '0' : String(value)
})
const showRepairFields = computed(() => {
if (formType.value === 'repair') return true
if (formType.value === 'update') return currentStatusValue.value === '1'
if (formType.value === 'detail') return currentRepairStatusValue.value !== '0'
return false
})
const repairFieldsDisabled = computed(() => formType.value !== 'repair')
const failureLevelOptions = computed(() => getStrDictOptions(DICT_TYPE.FAILURE_LEVEL))
const statusLabel = computed(() => {
const status = formData.value.status
if (status === '' || status === null || status === undefined) return t('MoldManagement.MoldRepair.statusPending')
return String(status) === '1'
? t('MoldManagement.MoldRepair.statusDone')
: t('MoldManagement.MoldRepair.statusPending')
})
const isHydrating = ref(false)
const openRequestId = ref(0)
const emit = defineEmits(['success', 'closed'])
const formData = ref<MoldRepairFormData>(createDefaultFormData())
const moldLoading = ref(false) const moldLoading = ref(false)
const moldOptions = ref<{ label: string; value: number; raw?: MoldVO }[]>([]) const moldOptions = ref<{ label: string; value: number; raw?: MoldVO }[]>([])
const moldOptionsLoaded = ref(false) const moldOptionsLoaded = ref(false)
const lineMode = computed(() => {
if (formType.value === 'repair') return 'repair' as const
if (formType.value === 'update') {
const v = formData.value.status === '' || formData.value.status === null || formData.value.status === undefined
? undefined
: String(formData.value.status)
if (v === '1') return 'readonlyWithResult' as const
}
return 'edit' as const
})
const users = ref<UserVO[]>([]) const users = ref<UserVO[]>([])
const ensureUsersLoaded = async () => { const ensureUsersLoaded = async () => {
@ -252,14 +495,13 @@ const ensureMoldOptionsLoaded = async () => {
watch( watch(
() => formData.value.moldId, () => formData.value.moldId,
async (moldId) => { (moldId) => {
if (isHydrating.value) return if (isHydrating.value) return
if (typeof moldId !== 'number') { if (typeof moldId !== 'number') {
formData.value.moldCode = undefined formData.value.moldCode = undefined
formData.value.moldName = undefined formData.value.moldName = undefined
formData.value.machinerySpec = undefined formData.value.machinerySpec = undefined
formData.value.machineryBrand = undefined formData.value.machineryBrand = undefined
if (formType.value === 'create') setLineRows([])
return return
} }
@ -273,8 +515,6 @@ watch(
formData.value.machinerySpec = raw?.moldType ?? raw?.spec ?? raw?.moldSpec formData.value.machinerySpec = raw?.moldType ?? raw?.spec ?? raw?.moldSpec
formData.value.machineryBrand = raw?.brandName ?? raw?.brand ?? raw?.moldBrand formData.value.machineryBrand = raw?.brandName ?? raw?.brand ?? raw?.moldBrand
} }
await prefillLinesByMold(moldId as number)
} }
) )
const formRules = reactive({ const formRules = reactive({
@ -298,12 +538,12 @@ const formRules = reactive({
trigger: 'blur', trigger: 'blur',
}, },
], ],
repairName: [], repairName: [{ required: true, message: t('MoldManagement.MoldRepair.validatorRepairNameRequired'), trigger: 'blur' }],
moldId: [{ required: true, message: t('MoldManagement.MoldRepair.validatorMoldRequired'), trigger: 'change' }], moldId: [{ required: true, message: t('MoldManagement.MoldRepair.validatorMoldRequired'), trigger: 'change' }],
requireDate: [ requireDate: [
{ {
validator: (_: any, value: any, callback: any) => { validator: (_: any, value: any, callback: any) => {
if (formType.value === 'repair' && !value) { if (!value) {
callback(new Error(t('MoldManagement.MoldRepair.validatorRequireDateRequired'))) callback(new Error(t('MoldManagement.MoldRepair.validatorRequireDateRequired')))
return return
} }
@ -336,7 +576,7 @@ const formRules = reactive({
trigger: 'change', trigger: 'change',
}, },
], ],
repairResult: [ repairStatus: [
{ {
validator: (_: any, value: any, callback: any) => { validator: (_: any, value: any, callback: any) => {
if (formType.value === 'repair' && !value) { if (formType.value === 'repair' && !value) {
@ -345,14 +585,79 @@ const formRules = reactive({
} }
callback() callback()
}, },
trigger: 'change',
},
],
faultPhenomenon: [
{
validator: (_: any, value: any, callback: any) => {
if (value === undefined || value === null || String(value).trim() === '') {
callback(new Error(t('MoldManagement.MoldRepair.validatorFaultPhenomenonRequired')))
return
}
callback()
},
trigger: 'blur', trigger: 'blur',
}, },
], ],
faultLevel: [
{
validator: (_: any, value: any, callback: any) => {
if (value === undefined || value === null || String(value).trim() === '') {
callback(new Error(t('MoldManagement.MoldRepair.validatorFaultLevelRequired')))
return
}
callback()
},
trigger: 'change',
},
],
shutdown: [
{
validator: (_: any, value: any, callback: any) => {
if (value === undefined || value === null || value === '') {
callback(new Error(t('MoldManagement.MoldRepair.validatorIsShutdownRequired')))
return
}
callback()
},
trigger: 'change',
},
],
}) })
const formRef = ref() const formRef = ref()
const subTabsName = ref('moldRepairLine') const splitImageValue = (value: unknown) => {
const moldRepairLineFormRef = ref() if (Array.isArray(value)) return value.map((item) => String(item).trim()).filter(Boolean)
if (typeof value !== 'string') return []
return value
.split(',')
.map((item) => item.trim())
.filter(Boolean)
}
const normalizeImageString = (value: unknown) => splitImageValue(value).join(',')
const normalizeRepairStatusValue = (value: unknown) => {
if (value === undefined || value === null || value === '') return ''
const num = Number(value)
if (!Number.isNaN(num) && num === 0) return ''
return Number.isNaN(num) ? value : num
}
const faultImagesValue = computed<string[]>({
get: () => splitImageValue(formData.value.faultImages),
set: (value) => {
formData.value.faultImages = value.join(',')
}
})
const repairedImagesValue = computed<string[]>({
get: () => splitImageValue(formData.value.repairedImages),
set: (value) => {
formData.value.repairedImages = value.join(',')
}
})
watch( watch(
() => formData.value.isCode, () => formData.value.isCode,
@ -364,44 +669,6 @@ watch(
} }
) )
const setLineRows = (rows: any[]) => {
moldRepairLineFormRef.value?.setData(rows)
}
const normalizeMoldRepairItemList = (data: any) => {
const rows = (Array.isArray(data) ? data : data?.list ?? data?.data ?? []) as any[]
return rows
}
const toMoldRepairLineRow = (item: any) => {
const subjectId = item?.subjectId ?? item?.id
return {
id: undefined,
repairId: formData.value.id,
subjectId,
subjectCode: item?.subjectCode ?? item?.subject_code ?? item?.code,
subjectName: item?.subjectName ?? item?.subject_name ?? item?.name,
subjectType: item?.subjectType ?? item?.subject_type ?? item?.type,
subjectContent: item?.subjectContent ?? item?.projectContent ?? item?.subject_content,
subjectStandard: item?.subjectStandard ?? item?.judgmentCriteria ?? item?.subject_standard,
malfunction: undefined,
malfunctionUrl: undefined,
repairDes: undefined,
remark: undefined,
}
}
const prefillLinesByMold = async (moldId: number | undefined) => {
if (formType.value !== 'create') return
if (typeof moldId !== 'number') {
setLineRows([])
return
}
const data = await MoldRepairItemsApi.getRepairItemsPage({ pageNo: 1, pageSize: 100, moldId })
const list = normalizeMoldRepairItemList(data)
setLineRows(list.map(toMoldRepairLineRow))
}
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
const currentOpenId = ++openRequestId.value const currentOpenId = ++openRequestId.value
dialogTitle.value = type === 'repair' ? '维修处理结果' : t('action.' + type) dialogTitle.value = type === 'repair' ? '维修处理结果' : t('action.' + type)
@ -422,6 +689,20 @@ const open = async (type: string, id?: number) => {
;(formData.value as any).finishDate = (formData.value as any).finishDate ?? undefined ;(formData.value as any).finishDate = (formData.value as any).finishDate ?? undefined
;(formData.value as any).confirmDate = (formData.value as any).confirmDate ?? undefined ;(formData.value as any).confirmDate = (formData.value as any).confirmDate ?? undefined
;(formData.value as any).repairResult = (formData.value as any).repairResult ?? '' ;(formData.value as any).repairResult = (formData.value as any).repairResult ?? ''
;(formData.value as any).repairStatus = (formData.value as any).repairStatus === undefined || (formData.value as any).repairStatus === null || (formData.value as any).repairStatus === ''
? normalizeRepairStatusValue((formData.value as any).repairResult)
: normalizeRepairStatusValue((formData.value as any).repairStatus)
;(formData.value as any).faultPhenomenon = (formData.value as any).faultPhenomenon ?? undefined
;(formData.value as any).faultDescription = (formData.value as any).faultDescription ?? undefined
;(formData.value as any).faultLevel = (formData.value as any).faultLevel === undefined || (formData.value as any).faultLevel === null ? undefined : String((formData.value as any).faultLevel)
;(formData.value as any).shutdown = (formData.value as any).shutdown ?? undefined
;(formData.value as any).faultImages = normalizeImageString((formData.value as any).faultImages)
;(formData.value as any).faultReason = (formData.value as any).faultReason ?? undefined
;(formData.value as any).downtimeDuration = (formData.value as any).downtimeDuration ?? undefined
;(formData.value as any).handlingMeasures = (formData.value as any).handlingMeasures ?? undefined
;(formData.value as any).replacementParts = (formData.value as any).replacementParts ?? undefined
;(formData.value as any).repairContent = (formData.value as any).repairContent ?? undefined
;(formData.value as any).repairedImages = normalizeImageString((formData.value as any).repairedImages)
;(formData.value as any).acceptedBy = normalizeUserId((formData.value as any).acceptedBy) ;(formData.value as any).acceptedBy = normalizeUserId((formData.value as any).acceptedBy)
;(formData.value as any).confirmBy = normalizeUserId((formData.value as any).confirmBy) ;(formData.value as any).confirmBy = normalizeUserId((formData.value as any).confirmBy)
@ -462,7 +743,14 @@ const submitForm = async () => {
await formRef.value.validate() await formRef.value.validate()
formLoading.value = true formLoading.value = true
try { try {
const data = { ...formData.value } const data: any = { ...formData.value }
data.faultLevel = data.faultLevel === undefined || data.faultLevel === null || String(data.faultLevel).trim() === '' ? undefined : String(data.faultLevel)
data.faultImages = Array.isArray(data.faultImages) ? data.faultImages.join(',') : (data.faultImages ?? '')
data.repairedImages = Array.isArray(data.repairedImages) ? data.repairedImages.join(',') : (data.repairedImages ?? '')
data.repairResult = data.repairStatus
if (formType.value === 'repair') {
data.status = '1'
}
if (formType.value === 'create') { if (formType.value === 'create') {
await MoldRepairApi.createMoldRepair(data) await MoldRepairApi.createMoldRepair(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
@ -470,7 +758,6 @@ const submitForm = async () => {
await MoldRepairApi.updateMoldRepair(data) await MoldRepairApi.updateMoldRepair(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
await moldRepairLineFormRef.value?.submit()
closeForm() closeForm()
emit('success') emit('success')
} finally { } finally {
@ -479,25 +766,7 @@ const submitForm = async () => {
} }
const resetForm = () => { const resetForm = () => {
formData.value = { formData.value = createDefaultFormData()
id: undefined,
repairCode: undefined,
repairName: undefined,
moldId: undefined,
moldCode: undefined,
moldName: undefined,
machineryBrand: undefined,
machinerySpec: undefined,
requireDate: undefined,
finishDate: undefined,
confirmDate: undefined,
repairResult: '',
acceptedBy: undefined,
confirmBy: undefined,
status: undefined,
remark: undefined,
isCode: true
}
moldOptionsLoaded.value = false moldOptionsLoaded.value = false
formRef.value?.resetFields() formRef.value?.resetFields()
} }
@ -531,6 +800,17 @@ const resetForm = () => {
overflow-y: auto; overflow-y: auto;
} }
.dv-repair-label {
display: inline-flex;
gap: 4px;
align-items: center;
&.is-required::before {
color: var(--el-color-danger);
content: '*';
}
}
.dv-repair-section { .dv-repair-section {
margin-bottom: 20px; margin-bottom: 20px;
padding: 16px; padding: 16px;

@ -115,6 +115,20 @@
<el-table-column type="selection" width="55" fixed="left" reserve-selection /> <el-table-column type="selection" width="55" fixed="left" reserve-selection />
<el-table-column :label="t('MoldManagement.MoldRepair.repairCode')" align="center" prop="repairCode" min-width="150" sortable /> <el-table-column :label="t('MoldManagement.MoldRepair.repairCode')" align="center" prop="repairCode" min-width="150" sortable />
<el-table-column :label="t('MoldManagement.MoldRepair.repairName')" align="center" prop="repairName" min-width="150" sortable /> <el-table-column :label="t('MoldManagement.MoldRepair.repairName')" align="center" prop="repairName" min-width="150" sortable />
<el-table-column :label="t('MoldManagement.MoldRepair.status')" align="center" prop="status" min-width="130" sortable>
<template #default="scope">
<el-tag :type="getStatusTagType(scope.row.status)" effect="light">
{{ getStatusLabel(scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column :label="t('EquipmentManagement.DvRepair.repairStatus')" align="center" prop="repairStatus" min-width="120" sortable>
<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="t('MoldManagement.MoldRepair.moldName')" align="center" prop="moldName" min-width="200" sortable> <el-table-column :label="t('MoldManagement.MoldRepair.moldName')" align="center" prop="moldName" min-width="200" sortable>
<template #default="scope"> <template #default="scope">
{{ scope.row.moldName ?? scope.row.machineryName ?? '-' }} {{ scope.row.moldName ?? scope.row.machineryName ?? '-' }}
@ -144,23 +158,11 @@
:label="t('MoldManagement.MoldRepair.confirmDate')" align="center" prop="confirmDate" :label="t('MoldManagement.MoldRepair.confirmDate')" align="center" prop="confirmDate"
:formatter="dateFormatter2" min-width="130" :formatter="dateFormatter2" min-width="130"
sortable /> sortable />
<el-table-column :label="t('MoldManagement.MoldRepair.repairResult')" align="center" prop="repairResult" min-width="160" /> <!-- <el-table-column :label="t('MoldManagement.MoldRepair.repairResult')" align="center" prop="repairResult" min-width="160" /> -->
<el-table-column :label="t('MoldManagement.MoldRepair.repairStatus')" align="center" prop="repairStatus" min-width="120" sortable>
<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="t('MoldManagement.MoldRepair.acceptUser')" align="center" prop="acceptedBy" min-width="140" /> <el-table-column :label="t('MoldManagement.MoldRepair.acceptUser')" align="center" prop="acceptedBy" min-width="140" />
<el-table-column :label="t('MoldManagement.MoldRepair.confirmUserShort')" align="center" prop="confirmBy" min-width="140" /> <el-table-column :label="t('MoldManagement.MoldRepair.confirmUserShort')" align="center" prop="confirmBy" min-width="140" />
<el-table-column :label="t('MoldManagement.MoldRepair.status')" align="center" prop="status" min-width="130" sortable>
<template #default="scope">
<el-tag :type="getStatusTagType(scope.row.status)" effect="light">
{{ getStatusLabel(scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column <el-table-column
:label="t('MoldManagement.MoldRepair.createTime')" align="center" prop="createTime" :label="t('MoldManagement.MoldRepair.createTime')" align="center" prop="createTime"
:formatter="dateFormatter" min-width="170" sortable /> :formatter="dateFormatter" min-width="170" sortable />
@ -168,13 +170,20 @@
<template #default="scope"> <template #default="scope">
<el-button <el-button
link type="primary" @click="openForm('repair', scope.row.id)" link type="primary" @click="openForm('repair', scope.row.id)"
v-if="String(scope.row.status) !== '1'" v-hasPermi="['mes:dv-repair:update']" v-if="String(scope.row.status) !== '1' && !isProcessedRepair(scope.row.repairStatus)" v-hasPermi="['mes:dv-repair:update']"
>{{ t('MoldManagement.MoldRepair.repair') }}</el-button> >{{ t('MoldManagement.MoldRepair.repair') }}</el-button>
<el-button <el-button
v-if="!isProcessedRepair(scope.row.repairStatus)"
link type="primary" @click="openForm('update', scope.row.id)" link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['mes:dv-repair:update']"> v-hasPermi="['mes:dv-repair:update']">
{{ t('MoldManagement.MoldRepair.edit') }} {{ t('MoldManagement.MoldRepair.edit') }}
</el-button> </el-button>
<el-button
v-else
link type="primary" @click="openForm('detail', scope.row.id)"
v-hasPermi="['mes:dv-repair:update']">
{{ t('action.detail') }}
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:dv-repair:delete']"> <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:dv-repair:delete']">
{{ t('MoldManagement.MoldRepair.delete') }} {{ t('MoldManagement.MoldRepair.delete') }}
</el-button> </el-button>
@ -193,7 +202,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { MoldRepairApi, MoldRepairVO } from '@/api/mold/moldrepair' import { MoldRepairApi, MoldRepairVO } from '@/api/mold/moldrepair'
import MoldRepairForm from './MoldRepairForm.vue' import MoldRepairForm from './MoldRepairForm.vue'
@ -272,6 +281,11 @@ const getStatusTagType = (value: any) => {
return 'info' return 'info'
} }
const isProcessedRepair = (value: any) => {
const v = value === '' || value === null || value === undefined ? '0' : String(value)
return v !== '0'
}
const tableRef = ref() const tableRef = ref()
const selectedIds = ref<number[]>([]) const selectedIds = ref<number[]>([])
const handleSelectionChange = (rows: any[]) => { const handleSelectionChange = (rows: any[]) => {

Loading…
Cancel
Save