feat:设备/模具维修-添加驳回逻辑

main
黄伟杰 1 day ago
parent ceb6262acb
commit ae6a87281d

@ -31,6 +31,7 @@ export interface DvRepairVO {
faultLevel?: string // 故障等级
isShutdown?: boolean // 是否停机
status: string // 单据状态
rejectReason?: string // 驳回理由
remark: string // 备注
}
@ -70,6 +71,10 @@ export const DvRepairApi = {
return await request.put({ url: `/mes/dv-repair/updateDvRepairStatus`, data })
},
rejectDvRepair: async (data: { id: string | number; rejectReason: string }) => {
return await request.put({ url: `/mes/dv-repair/reject`, data })
},
// ==================== 子表(设备维修记录行) ====================
// 获得设备维修记录行列表

@ -21,6 +21,7 @@ export interface MoldRepairVO {
acceptedBy: string
confirmBy: string
status: string
rejectReason?: string
remark: string
}
@ -55,6 +56,10 @@ export const MoldRepairApi = {
return await request.put({ url: `/mes/mold-repair/updateMoldRepairStatus`, data })
},
rejectMoldRepair: async (data: { id: string | number; rejectReason: string }) => {
return await request.put({ url: `/mes/mold-repair/reject`, data })
},
getMoldRepairLineListByRepairId: async (repairId) => {
return await request.get({ url: `/mes/mold-repair/mold-repair-line/list-by-repair-id?repairId=` + repairId })
},

@ -2322,6 +2322,13 @@ export default {
repairResultNg: 'Fail',
statusPending: 'Pending',
statusFinished: 'Finished',
statusRejected: 'Rejected',
reject: 'Reject',
rejectionInfo: 'Rejection Information',
rejectReason: 'Rejection Reason',
rejectReasonPrompt: 'Please enter the rejection reason',
rejectReasonRequired: 'Rejection reason cannot be empty',
rejectSuccess: 'Rejected successfully',
creatorName: 'Creator',
createTime: 'Create Time',
operate: 'Operate',
@ -3686,6 +3693,13 @@ export default {
status: 'Order Status',
statusPending: 'Pending',
statusDone: 'Completed',
statusRejected: 'Rejected',
reject: 'Reject',
rejectionInfo: 'Rejection Information',
rejectReason: 'Rejection Reason',
rejectReasonPrompt: 'Please enter the rejection reason',
rejectReasonRequired: 'Rejection reason cannot be empty',
rejectSuccess: 'Rejected successfully',
acceptUser: 'Repair User',
confirmUserShort: 'Acceptance User',
creator: 'Creator',

@ -2354,6 +2354,13 @@ export default {
repairResultNg: '不通过',
statusPending: '待完成',
statusFinished: '已完成',
statusRejected: '已驳回',
reject: '驳回',
rejectionInfo: '驳回信息',
rejectReason: '驳回理由',
rejectReasonPrompt: '请输入驳回理由',
rejectReasonRequired: '驳回理由不能为空',
rejectSuccess: '驳回成功',
creatorName: '创建人',
createTime: '创建时间',
operate: '操作',
@ -3191,6 +3198,13 @@ export default {
status: '单据状态',
statusPending: '待完成',
statusDone: '已完成',
statusRejected: '已驳回',
reject: '驳回',
rejectionInfo: '驳回信息',
rejectReason: '驳回理由',
rejectReasonPrompt: '请输入驳回理由',
rejectReasonRequired: '驳回理由不能为空',
rejectSuccess: '驳回成功',
acceptUser: '维修人员',
confirmUserShort: '验收人员',
creator: '创建人',

@ -365,6 +365,13 @@
</el-row>
</section>
<section v-if="isDetailMode && String(formData.status) === '2'" class="dv-repair-section">
<div class="dv-repair-section__title">{{ t('EquipmentManagement.DvRepair.rejectionInfo') }}</div>
<el-form-item :label="t('EquipmentManagement.DvRepair.rejectReason')">
<el-input :model-value="formData.rejectReason || '-'" type="textarea" :rows="3" disabled />
</el-form-item>
</section>
<section class="dv-repair-section">
<div class="dv-repair-section__title">创建备注 / 补充说明</div>
<el-form-item prop="remark" label-width="0">
@ -562,6 +569,7 @@ const createDefaultFormData = (): DvRepairFormData => ({
faultLevel: undefined,
isShutdown: false,
status: undefined,
rejectReason: undefined,
remark: undefined,
isCode: true
})
@ -603,7 +611,9 @@ const statusLabel = computed(() => {
if (status === '' || status === null || status === undefined) return t('EquipmentManagement.DvRepair.statusPending')
return String(status) === '1'
? t('EquipmentManagement.DvRepair.statusFinished')
: t('EquipmentManagement.DvRepair.statusPending')
: String(status) === '2'
? t('EquipmentManagement.DvRepair.statusRejected')
: t('EquipmentManagement.DvRepair.statusPending')
})
const showComponentSelect = computed(() => formData.value.machineryTypeId === 2)

@ -192,11 +192,11 @@
<template #default="scope">
<el-button
link type="primary" @click="openForm('repair', scope.row.id)"
v-if="String(scope.row.status) !== '1' && !isProcessedRepair(scope.row.repairStatus)" v-hasPermi="['mes:dv-repair:update']">
v-if="String(scope.row.status) === '0' && !isProcessedRepair(scope.row.repairStatus)" v-hasPermi="['mes:dv-repair:update']">
{{ t('EquipmentManagement.DvRepair.repair') }}
</el-button>
<el-button
v-if="!isProcessedRepair(scope.row.repairStatus)"
v-if="String(scope.row.status) === '0' && !isProcessedRepair(scope.row.repairStatus)"
link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['mes:dv-repair:update']">
{{ t('action.update') }}
@ -207,6 +207,12 @@
v-hasPermi="['mes:dv-repair:update']">
{{ t('action.detail') }}
</el-button>
<el-button
v-if="String(scope.row.status) === '1'"
link type="danger" :loading="String(rejectingId) === String(scope.row.id)" @click="handleReject(scope.row.id)"
v-hasPermi="['mes:dv-repair:update']">
{{ t('EquipmentManagement.DvRepair.reject') }}
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:dv-repair:delete']">
{{ t('action.delete') }}
</el-button>
@ -296,7 +302,8 @@ const toggleFilters = () => {
const statusOptions = [
{ label: t('EquipmentManagement.DvRepair.statusPending'), value: '0' },
{ label: t('EquipmentManagement.DvRepair.statusFinished'), value: '1' }
{ label: t('EquipmentManagement.DvRepair.statusFinished'), value: '1' },
{ label: t('EquipmentManagement.DvRepair.statusRejected'), value: '2' }
]
const repairStatusOptions = [
@ -309,6 +316,7 @@ const getStatusLabel = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '0') return t('EquipmentManagement.DvRepair.statusPending')
if (v === '1') return t('EquipmentManagement.DvRepair.statusFinished')
if (v === '2') return t('EquipmentManagement.DvRepair.statusRejected')
return '-'
}
@ -316,6 +324,7 @@ const getStatusTagType = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '1') return 'success'
if (v === '0') return 'warning'
if (v === '2') return 'danger'
return 'info'
}
@ -353,6 +362,7 @@ const updatePlanTableMaxHeight = async () => {
planTableMaxHeight.value = Math.min(window.innerHeight, Math.max(240, Math.floor(availableHeight)))
}
const selectedIds = ref<number[]>([])
const rejectingId = ref<number | string>()
const handleSelectionChange = (rows: any[]) => {
selectedIds.value = rows?.map((row) => row.id).filter((id) => id !== undefined) ?? []
}
@ -429,6 +439,28 @@ const handleBatchDelete = async () => {
await handleDelete(selectedIds.value)
}
const handleReject = async (id: number | string) => {
try {
const { value } = await ElMessageBox.prompt(
t('EquipmentManagement.DvRepair.rejectReasonPrompt'),
t('EquipmentManagement.DvRepair.reject'),
{
confirmButtonText: t('common.ok'),
cancelButtonText: t('common.cancel'),
inputPattern: /^[\s\S]*.*\S[\s\S]*$/,
inputErrorMessage: t('EquipmentManagement.DvRepair.rejectReasonRequired')
}
)
rejectingId.value = id
await DvRepairApi.rejectDvRepair({ id, rejectReason: value })
message.success(t('EquipmentManagement.DvRepair.rejectSuccess'))
await getList()
} catch {
} finally {
rejectingId.value = undefined
}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {

@ -645,7 +645,7 @@ const moldSelectDialogRef = ref<InstanceType<typeof TableSelectDialog> | null>(n
// 2.
const mergedQueryParams = computed(() => ({ ...searchParams }))
const mergedMoldQueryParams = computed(() => {
const status = String(formData.value.operateType) === '1' ? 1 : String(formData.value.operateType) === '2' ? 0 : undefined
const status = String(formData.value.operateType) === '1' ? 4 : String(formData.value.operateType) === '2' ? 0 : undefined
return { ...searchMoldParams, ...(status !== undefined ? { status } : {}) }
})
const ids = ref<string[]>([])

@ -338,6 +338,13 @@
</el-row>
</section>
<section v-if="isDetailMode && String(formData.status) === '2'" class="dv-repair-section">
<div class="dv-repair-section__title">{{ t('MoldManagement.MoldRepair.rejectionInfo') }}</div>
<el-form-item :label="t('MoldManagement.MoldRepair.rejectReason')">
<el-input :model-value="formData.rejectReason || '-'" type="textarea" :rows="3" disabled />
</el-form-item>
</section>
<section class="dv-repair-section">
<div class="dv-repair-section__title">创建备注 / 补充说明</div>
<el-form-item prop="remark" label-width="0">
@ -514,6 +521,7 @@ const createDefaultFormData = (): MoldRepairFormData => ({
acceptedBy: undefined,
confirmBy: undefined,
status: undefined,
rejectReason: undefined,
remark: undefined,
isCode: true,
downtimeDuration: undefined,
@ -561,7 +569,9 @@ const statusLabel = computed(() => {
if (status === '' || status === null || status === undefined) return t('MoldManagement.MoldRepair.statusPending')
return String(status) === '1'
? t('MoldManagement.MoldRepair.statusDone')
: t('MoldManagement.MoldRepair.statusPending')
: String(status) === '2'
? t('MoldManagement.MoldRepair.statusRejected')
: t('MoldManagement.MoldRepair.statusPending')
})
const isHydrating = ref(false)
const openRequestId = ref(0)

@ -178,10 +178,10 @@
<template #default="scope">
<el-button
link type="primary" @click="openForm('repair', scope.row.id)"
v-if="String(scope.row.status) !== '1' && !isProcessedRepair(scope.row.repairStatus)" v-hasPermi="['mes:dv-repair:update']"
v-if="String(scope.row.status) === '0' && !isProcessedRepair(scope.row.repairStatus)" v-hasPermi="['mes:dv-repair:update']"
>{{ t('MoldManagement.MoldRepair.repair') }}</el-button>
<el-button
v-if="!isProcessedRepair(scope.row.repairStatus)"
v-if="String(scope.row.status) === '0' && !isProcessedRepair(scope.row.repairStatus)"
link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['mes:dv-repair:update']">
{{ t('MoldManagement.MoldRepair.edit') }}
@ -192,6 +192,12 @@
v-hasPermi="['mes:dv-repair:update']">
{{ t('action.detail') }}
</el-button>
<el-button
v-if="String(scope.row.status) === '1'"
link type="danger" :loading="String(rejectingId) === String(scope.row.id)" @click="handleReject(scope.row.id)"
v-hasPermi="['mes:dv-repair:update']">
{{ t('MoldManagement.MoldRepair.reject') }}
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:dv-repair:delete']">
{{ t('MoldManagement.MoldRepair.delete') }}
</el-button>
@ -281,7 +287,8 @@ const exportLoading = ref(false)
const statusOptions = [
{ label: t('MoldManagement.MoldRepair.statusPending'), value: '0' },
{ label: t('MoldManagement.MoldRepair.statusDone'), value: '1' }
{ label: t('MoldManagement.MoldRepair.statusDone'), value: '1' },
{ label: t('MoldManagement.MoldRepair.statusRejected'), value: '2' }
]
const getResultLabel = (value: any) => {
@ -304,6 +311,7 @@ const getStatusLabel = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '0') return t('MoldManagement.MoldRepair.statusPending')
if (v === '1') return t('MoldManagement.MoldRepair.statusDone')
if (v === '2') return t('MoldManagement.MoldRepair.statusRejected')
return '-'
}
@ -311,6 +319,7 @@ const getStatusTagType = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '1') return 'success'
if (v === '0') return 'warning'
if (v === '2') return 'danger'
return 'info'
}
@ -332,6 +341,7 @@ const updatePlanTableMaxHeight = async () => {
planTableMaxHeight.value = Math.min(window.innerHeight, Math.max(240, Math.floor(availableHeight)))
}
const selectedIds = ref<number[]>([])
const rejectingId = ref<number | string>()
const handleSelectionChange = (rows: any[]) => {
selectedIds.value = rows?.map((row) => row.id).filter((id) => id !== undefined) ?? []
}
@ -412,6 +422,28 @@ const handleBatchDelete = async () => {
await handleDelete(selectedIds.value)
}
const handleReject = async (id: number | string) => {
try {
const { value } = await ElMessageBox.prompt(
t('MoldManagement.MoldRepair.rejectReasonPrompt'),
t('MoldManagement.MoldRepair.reject'),
{
confirmButtonText: t('common.ok'),
cancelButtonText: t('common.cancel'),
inputPattern: /^[\s\S]*.*\S[\s\S]*$/,
inputErrorMessage: t('MoldManagement.MoldRepair.rejectReasonRequired')
}
)
rejectingId.value = id
await MoldRepairApi.rejectMoldRepair({ id, rejectReason: value })
message.success(t('MoldManagement.MoldRepair.rejectSuccess'))
await getList()
} catch {
} finally {
rejectingId.value = undefined
}
}
const handleExport = async () => {
try {
await message.exportConfirm()

Loading…
Cancel
Save