style:上下模新增弹框逻辑调整

main
黄伟杰 6 days ago
parent b5caf770ee
commit ea8bd96abb

@ -4,10 +4,12 @@ import request from '@/config/axios'
export interface MoldOperateVO {
id: number // ID
operateType: string // 操作类型
moldId: number | string // 关联模具id(上模/下模剩余模具,支持逗号分隔)
moldId: number // 关联模具id
deviceId: number // 关联设备id
lineId: number // 产线
operateTime: string // 操作时间
operatorId: number // 操作人
remark: string // 备注
lowerMoldId?: number | string // 下模的模具id
}
// 模具上下模 API

@ -2987,6 +2987,9 @@ export default {
device: 'Device',
deviceName: 'Device Name',
remark: 'Remark',
productionLine: 'Production Line',
operateTime: 'Operation Time',
operatorName: 'Operator',
creatorName: 'Operator',
createTime: 'Operation Time',
operate: 'Operate',
@ -3000,6 +3003,9 @@ export default {
placeholderMold: 'Please select mold',
placeholderLowerMold: 'Please select lower mold',
placeholderRemark: 'Please input remark',
placeholderProductionLine: 'Please select production line',
placeholderOperateTime: 'Please select operation time',
placeholderOperatorName: 'Please input operator',
placeholderCreateTimeStart: 'Start Date',
placeholderCreateTimeEnd: 'End Date',
placeholderDevice: 'Please select device',
@ -3007,6 +3013,7 @@ export default {
reset: 'Reset',
validatorOperateTypeRequired: 'Operation type can not be empty',
validatorDeviceRequired: 'Device can not be empty',
validatorProductionLineRequired: 'Production line can not be empty',
validatorMoldRequired: 'Mold can not be empty',
validatorLowerMoldRequired: 'Lower mold can not be empty',
alertNeedRemoveMoldFirst: 'Please remove the mold from this device first!',

@ -2494,6 +2494,9 @@ export default {
device: '设备',
deviceName: '设备名称',
remark: '备注',
productionLine: '产线',
operateTime: '操作时间',
operatorName: '操作人',
creatorName: '操作人',
createTime: '操作时间',
operate: '操作',
@ -2507,6 +2510,9 @@ export default {
placeholderMold: '请选择模具',
placeholderLowerMold: '请选择下模模具',
placeholderRemark: '请输入备注',
placeholderProductionLine: '请选择产线',
placeholderOperateTime: '请选择操作时间',
placeholderOperatorName: '请输入操作人',
placeholderCreateTimeStart: '开始日期',
placeholderCreateTimeEnd: '结束日期',
placeholderDevice: '请选择设备',
@ -2514,6 +2520,7 @@ export default {
reset: '重置',
validatorOperateTypeRequired: '操作类型不能为空',
validatorDeviceRequired: '关联设备不能为空',
validatorProductionLineRequired: '产线不能为空',
validatorMoldRequired: '关联模具不能为空',
validatorLowerMoldRequired: '下模模具不能为空',
alertNeedRemoveMoldFirst: '请先将该设备上的模具换下!',

@ -3,13 +3,8 @@
<!-- 列表视图 -->
<template v-if="!operateFormVisible">
<div class="mold-brand-page__header">
<div
v-for="card in statusCards"
:key="card.key"
class="mold-brand-page__stat"
:class="{ 'is-active': currentStatusKey === card.key }"
@click="changeStatus(card.key, card.status)"
>
<div v-for="card in statusCards" :key="card.key" class="mold-brand-page__stat"
:class="{ 'is-active': currentStatusKey === card.key }" @click="changeStatus(card.key, card.status)">
<div class="mold-brand-page__stat-title">{{ card.label }}</div>
<div class="mold-brand-page__stat-value">{{ card.value }}</div>
</div>
@ -17,37 +12,27 @@
<el-form ref="queryFormRef" :model="queryParams" :inline="true" class="-mb-15px mt-16px">
<el-form-item prop="keyword">
<el-input
v-model="queryParams.keyword"
:placeholder="t('MoldManagement.MoldBrandPage.placeholderKeyword')"
clearable
class="!w-240px"
@keyup.enter="handleQuery"
/>
<el-input v-model="queryParams.keyword" :placeholder="t('MoldManagement.MoldBrandPage.placeholderKeyword')"
clearable class="!w-240px" @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item prop="status">
<el-select v-model="queryParams.status" :placeholder="t('MoldManagement.MoldBrandPage.placeholderStatus')" clearable class="!w-180px">
<el-option
v-for="dict in statusOptions"
:key="dict.value"
:label="dict.label"
:value="Number(dict.value)"
/>
<el-select v-model="queryParams.status" :placeholder="t('MoldManagement.MoldBrandPage.placeholderStatus')"
clearable class="!w-180px">
<el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label"
:value="Number(dict.value)" />
</el-select>
</el-form-item>
<el-form-item prop="productId">
<el-select v-model="queryParams.productId" :placeholder="t('MoldManagement.MoldBrandPage.placeholderProduct')" clearable filterable class="!w-180px">
<el-select v-model="queryParams.productId" :placeholder="t('MoldManagement.MoldBrandPage.placeholderProduct')"
clearable filterable class="!w-180px">
<el-option v-for="product in productOptions" :key="product.id" :label="product.name" :value="product.id" />
</el-select>
</el-form-item>
<el-form-item prop="currentDevice">
<el-select v-model="queryParams.currentDevice" :placeholder="t('MoldManagement.MoldBrandPage.placeholderDevice')" clearable filterable class="!w-180px">
<el-option
v-for="device in deviceOptions"
:key="device.id"
:label="`${device.deviceName}${device.deviceCode}`"
:value="device.deviceName"
/>
<el-select v-model="queryParams.currentDevice"
:placeholder="t('MoldManagement.MoldBrandPage.placeholderDevice')" clearable filterable class="!w-180px">
<el-option v-for="device in deviceOptions" :key="device.id"
:label="`${device.deviceName}${device.deviceCode}`" :value="device.deviceName" />
</el-select>
</el-form-item>
<el-form-item>
@ -56,23 +41,20 @@
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['erp:mold-brand:create']">
<Icon icon="ep:plus" class="mr-5px" /> {{ t('MoldManagement.MoldBrandPage.add') }}
</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading" v-hasPermi="['erp:mold-brand:export']">
<el-button type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['erp:mold-brand:export']">
<Icon icon="ep:download" class="mr-5px" /> {{ t('MoldManagement.MoldBrandPage.export') }}
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" row-key="id" style="margin-top: 16px;">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" row-key="id"
style="margin-top: 16px;">
<el-table-column :label="t('MoldManagement.MoldBrandPage.image')" align="center" width="92">
<template #default="scope">
<el-image
v-if="getImageList(scope.row.images).length"
:src="getImageList(scope.row.images)[0]"
:preview-src-list="getImageList(scope.row.images)"
fit="cover"
preview-teleported
class="mold-brand-page__thumb"
/>
<el-image v-if="getImageList(scope.row.images).length" :src="getImageList(scope.row.images)[0]"
:preview-src-list="getImageList(scope.row.images)" fit="cover" preview-teleported
class="mold-brand-page__thumb" />
<span v-else class="mold-brand-page__empty">-</span>
</template>
</el-table-column>
@ -87,47 +69,50 @@
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldBrandPage.currentDevice')" min-width="140">
<template #default="scope">
{{ scope.row.currentDevice || scope.row.machineName || '-' }}
{{ scope.row.deviceName }}
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldBrandPage.moldSize')" prop="moldSize" width="90" align="center" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.createTime')" prop="createTime" :formatter="dateFormatter" width="160" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandPage.moldSize')" prop="moldSize" width="90"
align="center" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.createTime')" prop="createTime"
:formatter="dateFormatter" width="160" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandPage.operate')" fixed="right" width="310">
<template #default="scope">
<el-button link type="primary" @click="openDetail(scope.row.id)">{{ t('MoldManagement.MoldBrandPage.detail') }}</el-button>
<el-button link type="primary" @click="openOperateForm(1, scope.row)" v-if="scope.row.status === 1">{{ t('MoldManagement.MoldBrandPage.moldUp') }}</el-button>
<el-button link type="primary" @click="openOperateForm(2, scope.row)" v-if="scope.row.status === 0">{{ t('MoldManagement.MoldBrandPage.moldDown') }}</el-button>
<el-button link type="warning" @click="handleReservedAction(t('MoldManagement.MoldBrandPage.repair'))">{{ t('MoldManagement.MoldBrandPage.repair') }}</el-button>
<el-button link type="primary" @click="previewQrcode(scope.row)">{{ t('MoldManagement.MoldBrandPage.qrcode') }}</el-button>
<el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['erp:mold-brand:update']">{{ t('MoldManagement.MoldBrandPage.edit') }}</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['erp:mold-brand:delete']">{{ t('MoldManagement.MoldBrandPage.delete') }}</el-button>
<el-button link type="primary" @click="openDetail(scope.row.id)">{{ t('MoldManagement.MoldBrandPage.detail')
}}</el-button>
<el-button link type="primary" @click="openOperateForm(1, scope.row)" v-if="scope.row.status === 1">{{
t('MoldManagement.MoldBrandPage.moldUp') }}</el-button>
<el-button link type="primary" @click="openOperateForm(2, scope.row)" v-if="scope.row.status === 0">{{
t('MoldManagement.MoldBrandPage.moldDown') }}</el-button>
<el-button link type="warning" @click="handleReservedAction(t('MoldManagement.MoldBrandPage.repair'))">{{
t('MoldManagement.MoldBrandPage.repair') }}</el-button>
<el-button link type="primary" @click="previewQrcode(scope.row)">{{ t('MoldManagement.MoldBrandPage.qrcode')
}}</el-button>
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['erp:mold-brand:update']">{{ t('MoldManagement.MoldBrandPage.edit') }}</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['erp:mold-brand:delete']">{{
t('MoldManagement.MoldBrandPage.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</template>
<!-- 上下模操作表单视图 -->
<template v-else>
<div class="mold-operate-page">
<div class="mold-operate-page__header">
<el-button @click="closeOperateForm"><Icon icon="ep:arrow-left" class="mr-5px" /> {{ t('MoldManagement.MoldBrandPage.back') }}</el-button>
<el-button @click="closeOperateForm">
<Icon icon="ep:arrow-left" class="mr-5px" /> {{ t('MoldManagement.MoldBrandPage.back') }}
</el-button>
</div>
<!-- 模具信息卡片 -->
<div class="mold-operate-page__info-card" v-if="currentMold">
<el-image
v-if="getImageList(currentMold.images).length"
:src="getImageList(currentMold.images)[0]"
fit="cover"
class="mold-operate-page__info-image"
/>
<el-image v-if="getImageList(currentMold.images).length" :src="getImageList(currentMold.images)[0]"
fit="cover" class="mold-operate-page__info-image" />
<div class="mold-operate-page__info-empty" v-else></div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldCode') }}</span>
@ -155,7 +140,8 @@
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.lastChangeTime') }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.lastChangeTime ? dateFormatter(currentMold.lastChangeTime) : '-' }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.lastChangeTime ?
dateFormatter(currentMold.lastChangeTime) : '-' }}</span>
</div>
</div>
@ -164,58 +150,65 @@
<div class="mold-operate-page__form">
<el-form ref="operateFormRef" :model="operateFormData" :rules="operateFormRules" label-width="100px">
<el-form-item :label="t('MoldManagement.MoldBrandPage.targetLine')" prop="lineId">
<el-select v-model="operateFormData.lineId" filterable clearable :placeholder="t('MoldManagement.MoldBrandPage.placeholderTargetLine')" class="!w-full">
<el-select v-model="operateFormData.lineId" filterable clearable
:placeholder="t('MoldManagement.MoldBrandPage.placeholderTargetLine')" class="!w-full">
<el-option v-for="line in lineOptions" :key="line.id" :label="line.name" :value="String(line.id)" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldBrandPage.targetDevice')" prop="deviceId">
<el-select v-model="operateFormData.deviceId" filterable clearable :placeholder="t('MoldManagement.MoldBrandPage.placeholderTargetDevice')" class="!w-full">
<el-option v-for="device in deviceOptions" :key="device.id" :label="`${device.deviceName}${device.deviceCode}`" :value="device.id" />
<el-select v-model="operateFormData.deviceId" filterable clearable
:placeholder="t('MoldManagement.MoldBrandPage.placeholderTargetDevice')" class="!w-full">
<el-option v-for="device in deviceOptions" :key="device.id"
:label="`${device.deviceName}${device.deviceCode}`" :value="device.id" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldBrandPage.operateTime')" prop="operateTime">
<el-date-picker v-model="operateFormData.operateTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" :placeholder="t('MoldManagement.MoldBrandPage.placeholderOperateTime')" class="!w-full" />
<el-date-picker v-model="operateFormData.operateTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('MoldManagement.MoldBrandPage.placeholderOperateTime')" class="!w-full" />
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldBrandPage.operator')" prop="operatorId">
<el-select v-model="operateFormData.operatorId" filterable clearable :placeholder="t('MoldManagement.MoldBrandPage.placeholderOperator')" class="!w-full">
<el-option v-for="item in operatorOptions" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
<el-select v-model="operateFormData.operatorId" filterable clearable
:placeholder="t('MoldManagement.MoldBrandPage.placeholderOperator')" class="!w-full">
<el-option v-for="item in operatorOptions" :key="String(item.id)" :label="item.nickname"
:value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldBrandPage.remark')" prop="remark">
<el-input v-model="operateFormData.remark" :placeholder="t('MoldManagement.MoldBrandPage.placeholderRemark')" type="textarea" :rows="3" />
<el-input v-model="operateFormData.remark"
:placeholder="t('MoldManagement.MoldBrandPage.placeholderRemark')" type="textarea" :rows="3" />
</el-form-item>
</el-form>
<div class="mold-operate-page__form-actions">
<el-button @click="closeOperateForm">{{ t('MoldManagement.MoldBrandPage.cancel') }}</el-button>
<el-button type="primary" @click="submitOperateForm" :loading="operateLoading">{{ t('MoldManagement.MoldBrandPage.submit') }}</el-button>
<el-button type="primary" @click="submitOperateForm" :loading="operateLoading">{{
t('MoldManagement.MoldBrandPage.submit') }}</el-button>
</div>
</div>
<!-- 右侧记录列表 -->
<div class="mold-operate-page__history">
<div class="mold-operate-page__history-header">
<span class="mold-operate-page__history-title">{{ t('MoldManagement.MoldBrandPage.recentRecords') }}</span>
<span class="mold-operate-page__history-title">{{ t('MoldManagement.MoldBrandPage.recentRecords')
}}</span>
</div>
<el-table :data="recentOperateList" :stripe="true" :show-overflow-tooltip="true" v-loading="recentLoading">
<el-table-column :label="t('MoldManagement.MoldBrandPage.operateType')">
<template #default="scope">
<span :class="scope.row.operateType === '1' ? 'text-primary' : 'text-success'">
{{ scope.row.operateType === '1' ? t('MoldManagement.MoldBrandPage.installUp') : t('MoldManagement.MoldBrandPage.uninstallDown') }}
{{ scope.row.operateType === '1' ? t('MoldManagement.MoldBrandPage.installUp') :
t('MoldManagement.MoldBrandPage.uninstallDown') }}
</span>
</template>
</el-table-column>
<el-table-column :label="t('MoldManagement.MoldBrandPage.moldName')" prop="moldName" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.lineName')" prop="lineName" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.operateTime')" prop="createTime" width="160" :formatter="dateFormatter" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.operateTime')" prop="createTime" width="160"
:formatter="dateFormatter" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.operator')" prop="operatorName" width="100" />
</el-table>
<el-empty v-if="!recentOperateList.length" :description="t('MoldManagement.MoldBrandPage.noRecords')" />
<Pagination
:total="recentTotal"
v-model:page="recentPageNo"
v-model:limit="recentPageSize"
@pagination="fetchRecentOperateList"
/>
<Pagination :total="recentTotal" v-model:page="recentPageNo" v-model:limit="recentPageSize"
@pagination="fetchRecentOperateList" />
</div>
</div>
</div>
@ -223,21 +216,14 @@
</ContentWrap>
<Dialog v-model="qrcodeVisible" :title="t('MoldManagement.MoldBrandPage.qrcodeDialogTitle')" width="360px">
<QrcodeActionCard
:image-url="currentQrcodeRow?.qrCodeUrl"
:print-id="currentQrcodeRow?.id"
:print-template-type="4"
<QrcodeActionCard :image-url="currentQrcodeRow?.qrCodeUrl" :print-id="currentQrcodeRow?.id" :print-template-type="4"
:print-title="t('MoldManagement.MoldBrandPage.qrcodePrintTitle', { name: currentQrcodeRow?.name || t('MoldManagement.MoldBrandPage.mold') })"
:print-paper-width="80"
:print-paper-height="80"
:print-max-width="220"
:print-paper-width="80" :print-paper-height="80" :print-max-width="220"
:empty-text="t('MoldManagement.MoldBrandPage.qrcodeEmpty')"
:error-text="t('MoldManagement.MoldBrandPage.qrcodeLoadError')"
:refresh-url="getQrcodeRefreshUrl()"
:error-text="t('MoldManagement.MoldBrandPage.qrcodeLoadError')" :refresh-url="getQrcodeRefreshUrl()"
:refresh-disabled="!currentQrcodeRow?.id || !currentQrcodeRow?.code"
:refresh-confirm-text="t('MoldManagement.MoldBrandPage.qrcodeRefreshConfirm')"
@refresh-success="handleQrcodeRefreshSuccess"
/>
@refresh-success="handleQrcodeRefreshSuccess" />
</Dialog>
<component :is="MoldBrandFormComp" ref="formRef" @success="getList" />
@ -405,7 +391,7 @@ const handleDelete = async (id: number) => {
await MoldBrandApi.deleteMoldBrand(id)
message.success(t('common.delSuccess'))
await getList()
} catch {}
} catch { }
}
const handleExport = async () => {
@ -454,17 +440,17 @@ const openOperateForm = async (type: number, row: MoldBrandVO) => {
operateType.value = type
currentMold.value = row
operateFormVisible.value = true
//
operateFormData.lineId = undefined
operateFormData.deviceId = undefined
operateFormData.operateTime = undefined
operateFormData.operatorId = undefined
operateFormData.remark = undefined
//
await initOperateOptions()
//
recentPageNo.value = 1
await fetchRecentOperateList()
@ -483,7 +469,7 @@ const initOperateOptions = async () => {
} catch {
lineOptions.value = []
}
//
try {
operatorOptions.value = (await getSimpleUserList()) ?? []
@ -514,12 +500,12 @@ const fetchRecentOperateList = async () => {
const submitOperateForm = async () => {
if (!operateFormRef.value) return
try {
await operateFormRef.value.validate()
operateLoading.value = true
const submitData = {
operateType: operateType.value,
moldId: currentMold.value?.id,
@ -529,11 +515,11 @@ const submitOperateForm = async () => {
operateTime: operateFormData.operateTime,
operatorId: operateFormData.operatorId
}
await MoldOperateApi.createMoldOperate(submitData)
message.success(operateType.value === 1 ? t('MoldManagement.MoldBrandPage.moldUpSuccess') : t('MoldManagement.MoldBrandPage.moldDownSuccess'))
//
// closeOperateForm()
// await getList()

@ -14,37 +14,11 @@
</el-radio-group>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.device')" prop="deviceId" v-if="formData.operateType != null">
<!-- <el-select
v-model="formData.deviceId"
filterable
clearable
:loading="deviceLoading"
:placeholder="t('MoldManagement.MoldOperate.placeholderDevice')"
class="!w-full"
@change="deviceChange(formData.deviceId)"
>
<el-option v-for="opt in deviceOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>-->
<el-input :model-value="displayItemDevice" readonly clearable class="device-ledger-selection-input"
:placeholder="t('MoldManagement.MoldOperate.placeholderDevice')"
@click="openCriticalComponentDialog" />
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.mold')" prop="moldId" v-if="formData.operateType == '1'">
<!-- <el-select
v-model="formData.moldId"
multiple
clearable
filterable
:placeholder="t('MoldManagement.MoldOperate.placeholderMold')"
class="!w-full"
>
<el-option
v-for="item in moldList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>-->
<el-form-item :label="t('MoldManagement.MoldOperate.mold')" prop="moldId" v-if="formData.operateType != null">
<el-input
:model-value="moldDisplayText"
:placeholder="t('MoldManagement.MoldOperate.placeholderMold')"
@ -52,25 +26,23 @@
@click="openMoldSelectDialog"
/>
</el-form-item>
<el-form-item
v-if="formData.operateType == '2' && formData.deviceId"
:label="t('MoldManagement.MoldOperate.lowerMold')"
prop="lowerMoldId"
>
<el-select
v-model="formData.lowerMoldId"
multiple
clearable
filterable
:placeholder="t('MoldManagement.MoldOperate.placeholderLowerMold')"
<el-form-item :label="t('MoldManagement.MoldOperate.productionLine')" prop="lineId">
<el-select v-model="formData.lineId" filterable clearable :placeholder="t('MoldManagement.MoldOperate.placeholderProductionLine')" class="!w-full">
<el-option v-for="line in lineOptions" :key="line.id" :label="line.name" :value="line.id" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.operateTime')" prop="operateTime">
<el-date-picker
v-model="formData.operateTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
:placeholder="t('MoldManagement.MoldOperate.placeholderOperateTime')"
class="!w-full"
>
<el-option
v-for="item in lowerMoldList"
:key="item.id"
:label="item.name || item.moldName || `ID:${item.id}`"
:value="item.id"
/>
/>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.operatorName')" prop="operatorId">
<el-select v-model="formData.operatorId" filterable clearable :placeholder="t('MoldManagement.MoldOperate.placeholderOperatorName')" class="!w-full">
<el-option v-for="item in operatorOptions" :key="item.id" :label="item.nickname" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldOperate.remark')" prop="remark">
@ -89,6 +61,7 @@
:columns="deviceColumns"
:fetch-api="fetchDeviceLedgerPage"
row-key="id"
selection-type="single"
@confirm="handleDeviceSelectConfirm"
:query-params="mergedQueryParams"
>
@ -113,8 +86,9 @@
ref="moldSelectDialogRef"
title="选择模具"
:columns="moldColumns"
:fetch-api="MoldBrandApi.getMoldPage"
:fetch-api="fetchMoldBrandPage"
row-key="id"
selection-type="single"
@confirm="handleMoldSelectConfirm"
:query-params="mergedMoldQueryParams"
>
@ -139,6 +113,8 @@
import { MoldOperateApi } from '@/api/mes/moldoperate'
import { MoldBrandApi, MoldVO } from '@/api/erp/mold'
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import { getSimpleUserList, type UserVO } from '@/api/system/user'
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
/** 模具上下模 表单 */
@ -146,29 +122,24 @@ defineOptions({ name: 'MoldOperateForm' })
const { t } = useI18n() //
const message = useMessage() //
const moldList = ref<MoldVO[]>([]) //
const lowerMoldList = ref<any[]>([]) //
const deviceLoading = ref(false)
const deviceOptions = ref<{ label: string; value: number; raw?: DeviceLedgerVO }[]>([])
const deviceOptionsLoaded = ref(false)
const lineOptions = ref<OrganizationVO[]>([])
const operatorOptions = ref<UserVO[]>([])
const initializingOperateType = ref(false)
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
type SelectIdValue = string | number | number[] | undefined
type NamedSelection = { id: number; name: string }
type MoldOperateFormData = {
id: number | undefined
operateType: string | number | undefined
moldId: SelectIdValue
deviceId: string | undefined
moldId: number | undefined
deviceId: number | undefined
lineId: number | undefined
operateTime: string | undefined
operatorId: number | undefined
remark: string | undefined
lowerMoldId: SelectIdValue
devices?: NamedSelection[]
molds?: NamedSelection[]
}
const formData = ref<MoldOperateFormData>({
@ -176,29 +147,18 @@ const formData = ref<MoldOperateFormData>({
operateType: undefined,
moldId: undefined,
deviceId: undefined,
lineId: undefined,
operateTime: undefined,
operatorId: undefined,
remark: undefined,
lowerMoldId: undefined,
})
const normalizeIdList = (value: SelectIdValue) => {
if (Array.isArray(value)) {
return value.map((item) => Number(item)).filter((item) => Number.isFinite(item))
}
if (value === undefined || value === null || value === '') {
return []
}
return String(value)
.split(',')
.map((item) => Number(item))
.filter((item) => Number.isFinite(item))
}
const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => {
if (String(formData.value.operateType) !== '1') {
if (formData.value.operateType == null) {
callback()
return
}
const hasValue = Array.isArray(value) ? value.length > 0 : value !== undefined && value !== null && value !== ''
const hasValue = value !== undefined && value !== null && value !== ''
if (!hasValue) {
callback(new Error(t('MoldManagement.MoldOperate.validatorMoldRequired')))
} else {
@ -206,24 +166,11 @@ const validateMoldId = (_rule: any, value: any, callback: (error?: Error) => voi
}
}
const validateLowerMoldId = (_rule: any, value: any, callback: (error?: Error) => void) => {
if (String(formData.value.operateType) !== '2') {
callback()
return
}
const hasValue = Array.isArray(value) ? value.length > 0 : value !== undefined && value !== null && value !== ''
if (!hasValue) {
callback(new Error(t('MoldManagement.MoldOperate.validatorLowerMoldRequired')))
} else {
callback()
}
}
const formRules = reactive({
operateType: [{ required: true, message: t('MoldManagement.MoldOperate.validatorOperateTypeRequired'), trigger: 'blur' }],
deviceId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorDeviceRequired'), trigger: 'change' }],
lineId: [{ required: true, message: t('MoldManagement.MoldOperate.validatorProductionLineRequired'), trigger: 'change' }],
moldId: [{ required: true, validator: validateMoldId, trigger: 'change' }],
lowerMoldId: [{ required: true, validator: validateLowerMoldId, trigger: 'change' }],
})
const formRef = ref() // Ref
@ -234,7 +181,13 @@ const open = async (type: string, id?: number) => {
formType.value = type
resetForm()
initSelectedItems()
await ensureDeviceOptionsLoaded()
//
if (type === 'create') {
const now = new Date()
const pad = (n: number) => String(n).padStart(2, '0')
formData.value.operateTime = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`
}
await ensureLineOptionsLoaded()
//
if (id) {
formLoading.value = true
@ -244,24 +197,12 @@ const open = async (type: string, id?: number) => {
formData.value = {
...formData.value,
...data,
lowerMoldId: (data as any).lowerMoldId,
}
ids.value = normalizeIdList(formData.value.deviceId)
//
if (String(formData.value.operateType) === '1') {
if (typeof formData.value.moldId === 'string') {
const parts = formData.value.moldId.split(',').map((v: string) => Number(v)).filter((v) => !Number.isNaN(v))
formData.value.moldId = parts as any
}
moldIds.value = normalizeIdList(formData.value.moldId)
await loadUpMoldList()
} else if (String(formData.value.operateType) === '2') {
const rawLower = (formData.value as any).lowerMoldId
if (typeof rawLower === 'string') {
const parts = rawLower.split(',').map((v: string) => Number(v)).filter((v) => !Number.isNaN(v))
;(formData.value as any).lowerMoldId = parts
}
await loadLowerMoldList()
if (formData.value.deviceId != null) {
ids.value = [Number(formData.value.deviceId)].filter((v) => Number.isFinite(v))
}
if (formData.value.moldId != null) {
moldIds.value = [Number(formData.value.moldId)].filter((v) => Number.isFinite(v))
}
} finally {
initializingOperateType.value = false
@ -320,25 +261,12 @@ const submitForm = async () => {
id: raw.id,
operateType: raw.operateType,
deviceId: raw.deviceId,
moldId: raw.moldId,
lineId: raw.lineId,
operateTime: raw.operateTime,
operatorId: raw.operatorId,
remark: raw.remark,
}
if (String(raw.operateType) === '1') {
const ids = Array.isArray(raw.moldId) ? raw.moldId : raw.moldId != null ? [raw.moldId] : []
submitData.moldId = ids.map((v: any) => v).join(',')
} else if (String(raw.operateType) === '2') {
const allIds = lowerMoldList.value
.map((item: any) => item?.id)
.filter((id: any) => id !== undefined && id !== null)
const lowerIds = Array.isArray(raw.lowerMoldId)
? raw.lowerMoldId
: raw.lowerMoldId != null
? [raw.lowerMoldId]
: []
submitData.lowerMoldId = lowerIds.map((v: any) => v).join(',')
const lowerIdSet = new Set(lowerIds.map((v: any) => String(v)))
const remainIds = allIds.filter((id: any) => !lowerIdSet.has(String(id)))
submitData.moldId = remainIds.join(',')
}
// 3.
if (formType.value === 'create') {
@ -361,40 +289,26 @@ const submitForm = async () => {
}
}
const ensureDeviceOptionsLoaded = async () => {
if (deviceOptionsLoaded.value) return
deviceLoading.value = true
const ensureLineOptionsLoaded = async () => {
if (lineOptions.value.length) return
try {
const data = await DeviceLedgerApi.getDeviceLedgerPage({})
const rows = (data?.list ?? []) as DeviceLedgerVO[]
deviceOptions.value = rows
.filter((r) => typeof r?.id === 'number')
.map((r) => ({ label: `${r.deviceCode ?? ''} ${r.deviceName ?? ''}`.trim(), value: r.id, raw: r }))
deviceOptionsLoaded.value = true
} finally {
deviceLoading.value = false
const data = await OrganizationApi.getOrganizationList()
lineOptions.value = Array.isArray(data) ? data : []
} catch {
lineOptions.value = []
}
try {
operatorOptions.value = (await getSimpleUserList()) ?? []
} catch {
operatorOptions.value = []
}
}
//
const deviceChange = async (deviceId:number) => {
if (String(formData.value.operateType) === '2' && deviceId) {
await loadLowerMoldList()
formData.value.lowerMoldId = undefined as any
}
}
const loadUpMoldList = async () => {
moldList.value = await MoldBrandApi.getInTransitMoldAllList()
}
const loadLowerMoldList = async () => {
if (!formData.value.deviceId) {
lowerMoldList.value = []
return
formData.value.moldId = undefined as any
}
const list = await MoldOperateApi.getLowerMoldList(formData.value.deviceId)
lowerMoldList.value = Array.isArray(list) ? list : []
}
watch(
@ -405,17 +319,13 @@ watch(
}
formData.value.deviceId = undefined as any
formData.value.moldId = undefined as any
formData.value.lowerMoldId = undefined as any
moldList.value = []
lowerMoldList.value = []
ids.value = []
moldIds.value = []
selectedDeviceRows.value = []
selectedMoldRows.value = []
if (!val) {
return
}
if (String(val) === '1') {
await loadUpMoldList()
} else if (String(val) === '2') {
await loadLowerMoldList()
}
}
)
@ -426,8 +336,10 @@ const resetForm = () => {
operateType: undefined,
moldId: undefined,
deviceId: undefined,
lineId: undefined,
operateTime: undefined,
operatorId: undefined,
remark: undefined,
lowerMoldId: undefined,
}
selectedDeviceRows.value = []
selectedMoldRows.value = []
@ -445,7 +357,7 @@ const deviceColumns = [
const moldColumns = [
{ label: '模具编码', prop: 'code', minWidth: 140 },
{ label: '模具名称', prop: 'name', minWidth: 160 },
{ label: '模具型号', prop: 'brandName', minWidth: 140 },
{ label: '版本', prop: 'version', minWidth: 100 },
{ label: '状态', prop: 'status', minWidth: 100 }
]
@ -455,41 +367,41 @@ const fetchDeviceLedgerPage = (params: Record<string, any>) => {
isScheduled: 1
})
}
const fetchMoldBrandPage = async (params: Record<string, any>) => {
const data = await MoldBrandApi.getMoldBrandPage(params)
const pageResult = data?.pageResult ?? data ?? {}
return { list: pageResult.list ?? [], total: pageResult.total ?? 0 }
}
const selectedDeviceRows = ref<any[]>([])
const selectedMoldRows = ref<any[]>([])
const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
formData.value.devices = payload.rows
.map((item) => {
const id = Number(item.id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: item.deviceName || item.name || item.code || `设备ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
selectedDeviceRows.value = payload.rows
formData.value.deviceId = payload.ids.join(',')
ids.value = payload.ids.map((id) => Number(id))
const row = payload.rows[0]
if (row) {
selectedDeviceRows.value = [row]
formData.value.deviceId = Number(row.id)
ids.value = [Number(row.id)]
} else {
selectedDeviceRows.value = []
formData.value.deviceId = undefined
ids.value = []
}
nextTick(() => {
formRef.value?.clearValidate?.('deviceId')
})
}
const handleMoldSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
formData.value.molds = payload.rows
.map((item) => {
const id = Number(item.id)
if (!Number.isFinite(id)) return undefined
return {
id,
name: item.name || item.code || `模具ID:${id}`
}
})
.filter((item): item is { id: number; name: string } => Boolean(item))
selectedMoldRows.value = payload.rows
formData.value.moldId = payload.ids.map((id) => Number(id))
moldIds.value = payload.ids.map((id) => Number(id))
const row = payload.rows[0]
if (row) {
selectedMoldRows.value = [row]
formData.value.moldId = Number(row.id)
moldIds.value = [Number(row.id)]
} else {
selectedMoldRows.value = []
formData.value.moldId = undefined
moldIds.value = []
}
nextTick(() => {
formRef.value?.clearValidate?.('moldId')
})
@ -527,7 +439,10 @@ const resetMoldSearch = () => {
const moldSelectDialogRef = ref<InstanceType<typeof TableSelectDialog> | null>(null)
// 2.
const mergedQueryParams = computed(() => ({ ...searchParams }))
const mergedMoldQueryParams = computed(() => ({ ...searchMoldParams }))
const mergedMoldQueryParams = computed(() => {
const status = String(formData.value.operateType) === '1' ? 1 : String(formData.value.operateType) === '2' ? 0 : undefined
return { ...searchMoldParams, ...(status !== undefined ? { status } : {}) }
})
const ids = ref<number[]>([])
const moldIds= ref<number[]>([])
const itemList = ref<DeviceLedgerVO[]>([])
@ -539,55 +454,43 @@ const total = ref(0)
const queryFormRef = ref()
const loading = ref(true)
const displayItemDevice = computed( () => {
if (!ids.value.length)return ''
if (formData.value.deviceId == null) return ''
if (selectedDeviceRows.value.length) {
return selectedDeviceRows.value
.map((item) => item.deviceName || item.name || item.deviceCode || '')
.filter((name) => name)
.join(',')
const row = selectedDeviceRows.value[0]
return row.deviceName || row.name || row.deviceCode || ''
}
if (!itemList.value.length) {
return formData.value.deviceId ? String(formData.value.deviceId) : ''
return String(formData.value.deviceId)
}
const map = new Map(itemList.value.map((item) => [item.id, item.deviceName]))
const names = ids.value
.map((id) => map.get(id))
.filter((name) => name)
return names.join(',')
return map.get(formData.value.deviceId) || ''
})
const moldDisplayText = computed(() => {
if (!moldIds.value.length)return ''
if (formData.value.moldId == null) return ''
if (selectedMoldRows.value.length) {
return selectedMoldRows.value
.map((item) => item.name || item.code || '')
.filter((name) => name)
.join(',')
const row = selectedMoldRows.value[0]
return row.name || row.code || ''
}
if (!moldItemList.value.length) {
return formData.value.moldId ? String(formData.value.moldId) : ''
return String(formData.value.moldId)
}
const map = new Map(moldItemList.value.map((item) => [item.id, item.name]))
const names = moldIds.value
.map((id) => map.get(id))
.filter((name) => name)
return names.join(',')
return map.get(formData.value.moldId) || ''
})
const openCriticalComponentDialog = async () => {
searchParams.deviceCode=''
searchParams.deviceName=''
searchMoldParams.code=''
searchMoldParams.name=''
const rows = selectedDeviceRows.value.map((item) => ({ ...item, id: Number(item.id) }))
deviceSelectDialogRef.value?.open(rows)
ids.value = normalizeIdList(formData.value.deviceId)
}
const openMoldSelectDialog = () => {
searchMoldParams.code=''
searchMoldParams.name=''
const rows = selectedMoldRows.value.map((item) => ({ ...item, id: Number(item.id) }))
moldIds.value = normalizeIdList(formData.value.moldId)
moldSelectDialogRef.value?.open(rows)
}
const toDeviceRows = (split: any) => {

@ -89,6 +89,7 @@
<!-- <el-table-column label="操作类型" align="center" prop="operateType" sortable /> -->
<el-table-column :label="t('MoldManagement.MoldOperate.moldName')" align="center" prop="moldName" width="500px" sortable />
<el-table-column :label="t('MoldManagement.MoldOperate.deviceName')" align="center" prop="deviceName" sortable />
<el-table-column :label="t('MoldManagement.MoldOperate.productionLine')" align="center" prop="lineId" sortable />
<el-table-column :label="t('MoldManagement.MoldOperate.creatorName')" align="center" prop="creatorName" sortable />
<el-table-column :label="t('MoldManagement.MoldOperate.remark')" align="center" prop="remark" />
<el-table-column

Loading…
Cancel
Save