Merge remote-tracking branch 'origin/main'

main
liutao 5 days ago
commit 7a1c92ce86

@ -2448,6 +2448,193 @@ export default {
qrcodeEmpty: 'No QR code'
},
MoldBrandPage: {
all: 'All',
onMachine: 'On Machine',
standby: 'Standby',
repairing: 'Repairing',
scrapped: 'Scrapped',
image: 'Image',
code: 'Code',
name: 'Name',
productName: 'Product Model',
version: 'Version',
status: 'Status',
currentDevice: 'Current Device',
moldSize: 'Sub Mold Count',
createTime: 'Create Time',
operate: 'Operate',
detail: 'Detail',
moldUp: 'Mold Up',
moldDown: 'Mold Down',
repair: 'Repair',
qrcode: 'QR Code',
edit: 'Edit',
delete: 'Delete',
add: 'Add',
export: 'Export',
reset: 'Reset',
query: 'Query',
placeholderKeyword: 'Please input code/name/product model',
placeholderStatus: 'Mold Status',
placeholderProduct: 'Product Model',
placeholderDevice: 'Current Device',
deleteSuccess: 'Delete success',
exportFilename: 'MoldLedger.xls',
reservedAction: '{action} function is reserved',
back: 'Back',
moldCode: 'Mold Code',
moldName: 'Mold Name',
lastChangeTime: 'Last Change Time',
targetLine: 'Target Line',
lineName: 'Line Name',
targetDevice: 'Target Device',
mold: 'Mold',
operateTime: 'Operation Time',
operator: 'Operator',
remark: 'Remark',
placeholderTargetLine: 'Please select line',
placeholderTargetDevice: 'Please select device',
placeholderMold: 'Please select mold',
placeholderOperateTime: 'Please select time',
placeholderOperator: 'Please select operator',
placeholderRemark: 'Please input remark (optional)',
cancel: 'Cancel',
submit: 'Submit',
validatorMoldRequired: 'Please select mold',
validatorTargetLineRequired: 'Please select target line',
validatorTargetDeviceRequired: 'Please select target device',
validatorOperateTimeRequired: 'Please select operation time',
validatorOperatorRequired: 'Please select operator',
moldUpSuccess: 'Mold up success',
moldDownSuccess: 'Mold down success',
submitFailed: 'Submit failed',
recentRecords: 'Recent Mold Up/Down Records',
operateType: 'Operation Type',
installUp: 'Up Mold',
uninstallDown: 'Down Mold',
noRecords: 'No operation records',
qrcodeDialogTitle: 'Mold QR Code',
qrcodePrintTitle: '{name} Code Print Preview',
qrcodeEmpty: 'No QR code',
qrcodeLoadError: 'QR code load failed',
qrcodeRefreshConfirm: 'Confirm to refresh this mold QR code?'
},
MoldBrandDetail: {
back: 'Back',
moldUp: 'Mold Up',
moldDown: 'Mold Down',
repair: 'Repair',
noImage: 'No Image',
qrcodeTitle: 'Mold QR Code',
qrcodePrintTitle: '{name} Code Print Preview',
qrcodeEmpty: 'No QR code',
qrcodeLoadError: 'QR code load failed',
qrcodeRefreshConfirm: 'Confirm to refresh this mold QR code?',
code: 'Code',
currentDevice: 'Current Device',
productName: 'Product Model',
version: 'Version',
lifeStatus: 'Life Status',
childMoldCount: 'Sub Mold Count',
tabMolds: 'Sub Molds',
tabInspection: 'Inspection Records',
tabRepair: 'Repair Records',
tabMaintain: 'Maintenance Records',
tabInstall: 'Installation Records',
time: 'Time',
startTime: 'Start Time',
endTime: 'End Time',
to: 'To',
query: 'Query',
reset: 'Reset',
export: 'Export',
inspectionMethod: 'Inspection Method',
criteria: 'Criteria',
inspectionTime: 'Inspection Time',
remark: 'Remark',
operator: 'Operator',
projectContent: 'Project Content',
repairResult: 'Repair Result',
finishDate: 'Finish Date',
totalItems: '{count} items in total',
maintainMethod: 'Maintenance Method',
maintainTime: 'Maintenance Time',
mold: 'Mold',
selectMold: 'Select Mold',
remarkPlaceholder: 'Remark',
moldName: 'Mold Name',
deviceName: 'Device',
creatorName: 'Operator',
createTime: 'Operation Time',
noInstallRecords: 'No installation records',
pending: 'Pending',
pass: 'Pass',
fail: 'Fail',
reservedAction: '{action} function is reserved',
missingBrandId: 'Missing mold brand ID',
inspectionExportTip: 'Inspection export pending backend confirmation',
maintainExportTip: 'Maintenance export pending backend confirmation',
repairExportTip: 'Repair export pending backend confirmation'
},
MoldBrandFormPage: {
code: 'Code',
name: 'Name',
productName: 'Product Model',
version: 'Version',
status: 'Status',
moldSize: 'Cavity Number',
useTime: 'Expected Life',
images: 'Image',
remark: 'Remark',
isEnable: 'Is Enable',
enable: 'Enable',
disable: 'Disable',
save: 'Save',
close: 'Close',
placeholderCode: 'Please input model code',
placeholderName: 'Please input model name',
placeholderProduct: 'Please select product model',
placeholderVersion: 'Please input version, e.g. 1.0',
placeholderStatus: 'Please select status',
placeholderRemark: 'Please input remark',
validatorCodeRequired: 'Model code can not be empty',
validatorNameRequired: 'Model name can not be empty',
validatorProductRequired: 'Product model can not be empty',
validatorMoldSizeRequired: 'Cavity number can not be empty',
validatorIsEnableRequired: 'Please select enable status',
createTitle: 'Add Mold Brand',
updateTitle: 'Edit Mold Brand',
createSuccess: 'Create success',
updateSuccess: 'Update success'
},
MoldListPage: {
code: 'Code',
name: 'Name',
query: 'Query',
reset: 'Reset',
addSubMold: 'Add Sub Mold',
export: 'Export',
index: 'Index',
subMoldName: 'Sub Mold Name',
type: 'Type',
installLocation: 'Install Location',
material: 'Material',
quantity: 'Quantity',
operate: 'Operate',
edit: 'Edit',
delete: 'Delete',
placeholderCode: 'Please input code',
placeholderName: 'Please input name',
selectBrandTip: 'Please select a mold model',
formNotReady: 'Form component not ready, please retry later',
deleteSuccess: 'Delete success',
exportFilename: 'SubMold.xls'
},
MoldReturn: {
moduleName: 'Mold Stock In',
no: 'Stock In No',

@ -1947,6 +1947,201 @@ export default {
qrcodeEmpty: '暂无二维码'
},
MoldBrandPage: {
all: '全部',
onMachine: '在机',
standby: '待用',
repairing: '维修',
scrapped: '报废',
image: '图片',
code: '编码',
name: '名称',
productName: '产品型号',
version: '版本',
status: '状态',
currentDevice: '当前设备',
moldSize: '子模数',
createTime: '创建时间',
operate: '操作',
detail: '详情',
moldUp: '上模',
moldDown: '下模',
repair: '维修',
qrcode: '二维码',
edit: '编辑',
delete: '删除',
add: '新增',
export: '导出',
reset: '重置',
query: '查询',
placeholderKeyword: '请输入编码/名称/产品型号',
placeholderStatus: '模具状态',
placeholderProduct: '产品型号',
placeholderDevice: '当前设备',
deleteSuccess: '删除成功',
exportFilename: '模具台账.xls',
reservedAction: '{action}功能预留中',
// 上下模操作
back: '返回',
moldCode: '模具编码',
moldName: '模具名称',
lastChangeTime: '上次更换时间',
targetLine: '目标产线',
lineName: '产线名称',
targetDevice: '目标设备',
mold: '模具',
operateTime: '操作时间',
operator: '操作人',
remark: '备注',
placeholderTargetLine: '请选择产线',
placeholderTargetDevice: '请选择设备',
placeholderMold: '请选择模具',
placeholderOperateTime: '请选择时间',
placeholderOperator: '请选择操作人',
placeholderRemark: '请输入备注(选填)',
cancel: '取消',
submit: '提交',
validatorMoldRequired: '请选择模具',
validatorTargetLineRequired: '请选择目标产线',
validatorTargetDeviceRequired: '请选择目标设备',
validatorOperateTimeRequired: '请选择操作时间',
validatorOperatorRequired: '请选择操作人',
moldUpSuccess: '上模成功',
moldDownSuccess: '下模成功',
submitFailed: '提交失败',
recentRecords: '最近上下模记录',
operateType: '操作类型',
installUp: '上模',
uninstallDown: '下模',
noRecords: '暂无操作记录',
qrcodeDialogTitle: '模具二维码',
qrcodePrintTitle: '{name}码打印预览',
qrcodeEmpty: '暂无二维码',
qrcodeLoadError: '二维码加载失败',
qrcodeRefreshConfirm: '确认刷新该模具二维码吗?'
},
MoldBrandDetail: {
back: '返回',
moldUp: '上模',
moldDown: '下模',
repair: '维修',
noImage: '暂无图片',
qrcodeTitle: '模具二维码',
qrcodePrintTitle: '{name}码打印预览',
qrcodeEmpty: '暂无二维码',
qrcodeLoadError: '二维码加载失败',
qrcodeRefreshConfirm: '确认刷新该模具二维码吗?',
code: '编码',
currentDevice: '当前设备',
productName: '产品型号',
version: '版本',
lifeStatus: '寿命状态',
childMoldCount: '子模数量',
// tabs
tabMolds: '子模具',
tabInspection: '点检记录',
tabRepair: '维修记录',
tabMaintain: '保养记录',
tabInstall: '安装记录',
// 筛选
time: '时间',
startTime: '开始时间',
endTime: '结束时间',
to: '至',
query: '查询',
reset: '重置',
export: '导出',
// 点检
inspectionMethod: '点检方式',
criteria: '判定标准',
inspectionTime: '点检时间',
remark: '备注',
operator: '操作人',
// 维修
projectContent: '项目内容',
repairResult: '维修结果',
finishDate: '完成日期',
totalItems: '共{count}条',
// 保养
maintainMethod: '保养方式',
maintainTime: '保养时间',
// 安装记录
mold: '模具',
selectMold: '选择模具',
remarkPlaceholder: '备注',
moldName: '模具名称',
deviceName: '设备',
creatorName: '操作人',
createTime: '操作时间',
noInstallRecords: '暂无安装记录',
// 检测结果
pending: '待检测',
pass: '通过',
fail: '不通过',
reservedAction: '{action}功能预留中',
missingBrandId: '缺少模具组ID',
inspectionExportTip: '点检记录导出功能待后端确认后接入',
maintainExportTip: '保养记录导出功能待后端确认后接入',
repairExportTip: '维修记录导出功能待后端确认后接入'
},
MoldBrandFormPage: {
code: '编码',
name: '名称',
productName: '产品型号',
version: '版本',
status: '状态',
moldSize: '模穴数',
useTime: '预期寿命',
images: '图片',
remark: '备注',
isEnable: '是否启用',
enable: '启用',
disable: '停用',
save: '保存',
close: '关闭',
placeholderCode: '请输入型号编码',
placeholderName: '请输入型号名称',
placeholderProduct: '请选择产品型号',
placeholderVersion: '请输入版本号如1.0',
placeholderStatus: '请选择状态',
placeholderRemark: '请输入备注',
validatorCodeRequired: '型号编码不能为空',
validatorNameRequired: '型号名称不能为空',
validatorProductRequired: '产品型号不能为空',
validatorMoldSizeRequired: '模穴数不能为空',
validatorIsEnableRequired: '请选择启用状态',
createTitle: '新增模具组',
updateTitle: '编辑模具组',
createSuccess: '新增成功',
updateSuccess: '更新成功'
},
MoldListPage: {
code: '编码',
name: '名称',
query: '查询',
reset: '重置',
addSubMold: '新增子模具',
export: '导出',
index: '序号',
subMoldName: '子模具名称',
type: '类型',
installLocation: '安装位置',
material: '材质',
quantity: '数量',
operate: '操作',
edit: '编辑',
delete: '删除',
placeholderCode: '请输入编码',
placeholderName: '请输入名称',
selectBrandTip: '请选择一个模具型号',
formNotReady: '表单组件未就绪,请稍后重试',
deleteSuccess: '删除成功',
exportFilename: '子模具.xls'
},
MoldReturn: {
moduleName: '模具入库',
no: '入库单号',

@ -3,10 +3,10 @@
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="编码" prop="code">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.code')" prop="code">
<el-row :gutter="20" style="width: 100%">
<el-col :span="18">
<el-input v-model="formData.code" placeholder="请输入型号编码" :disabled="Boolean(formData.isCode) || formType === 'update'" />
<el-input v-model="formData.code" :placeholder="t('MoldManagement.MoldBrandFormPage.placeholderCode')" :disabled="Boolean(formData.isCode) || formType === 'update'" />
</el-col>
<el-col :span="6">
<div>
@ -17,62 +17,62 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入型号名称" />
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('MoldManagement.MoldBrandFormPage.placeholderName')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品型号" prop="productId">
<el-select v-model="formData.productId" filterable clearable placeholder="请选择产品型号" class="w-1/1" @change="handleProductChange">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.productName')" prop="productId">
<el-select v-model="formData.productId" filterable clearable :placeholder="t('MoldManagement.MoldBrandFormPage.placeholderProduct')" class="w-1/1" @change="handleProductChange">
<el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="版本" prop="version">
<el-input v-model="formData.version" placeholder="请输入版本号如1.0" @input="handleVersionInput" />
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.version')" prop="version">
<el-input v-model="formData.version" :placeholder="t('MoldManagement.MoldBrandFormPage.placeholderVersion')" @input="handleVersionInput" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" placeholder="请选择状态" class="w-1/1">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.status')" prop="status">
<el-select v-model="formData.status" :placeholder="t('MoldManagement.MoldBrandFormPage.placeholderStatus')" class="w-1/1">
<el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="模穴数" prop="moldSize">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.moldSize')" prop="moldSize">
<el-input-number v-model="formData.moldSize" :min="1" :precision="0" class="w-1/1" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预期寿命" prop="useTime">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.useTime')" prop="useTime">
<el-input-number v-model="formData.useTime" :min="0" class="w-1/1" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="图片" prop="images">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.images')" prop="images">
<UploadImg v-model="formData.images" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.remark')" prop="remark">
<el-input v-model="formData.remark" type="textarea" :placeholder="t('MoldManagement.MoldBrandFormPage.placeholderRemark')" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('MoldManagement.MoldBrandFormPage.isEnable')" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio :label="true">启用</el-radio>
<el-radio :label="false">停用</el-radio>
<el-radio :label="true">{{ t('MoldManagement.MoldBrandFormPage.enable') }}</el-radio>
<el-radio :label="false">{{ t('MoldManagement.MoldBrandFormPage.disable') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button type="primary" :disabled="formLoading" @click="submitForm"></el-button>
<el-button @click="dialogVisible = false">关闭</el-button>
<el-button type="primary" :disabled="formLoading" @click="submitForm">{{ t('MoldManagement.MoldBrandFormPage.save') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('MoldManagement.MoldBrandFormPage.close') }}</el-button>
</template>
</Dialog>
</template>
@ -85,6 +85,7 @@ import { useDictStoreWithOut } from '@/store/modules/dict'
defineOptions({ name: 'MoldBrandForm' })
const { t } = useI18n()
const message = useMessage()
const dictStore = useDictStoreWithOut()
const productList = ref<ProductVO[]>([])
@ -120,7 +121,7 @@ const validateCode = (_rule: any, value: any, callback: any) => {
return
}
if (value === undefined || value === null || String(value).trim() === '') {
callback(new Error('型号编码不能为空'))
callback(new Error(t('MoldManagement.MoldBrandFormPage.validatorCodeRequired')))
return
}
callback()
@ -150,11 +151,11 @@ const addVersionPrefix = (val: any): string => {
const formRules = reactive({
code: [{ validator: validateCode, trigger: 'blur' }],
name: [{ required: true, message: '型号名称不能为空', trigger: 'blur' }],
moldType: [{ required: true, message: '模具类型不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品型号不能为空', trigger: 'change' }],
moldSize: [{ required: true, message: '模穴数不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '请选择启用状态', trigger: 'change' }]
name: [{ required: true, message: t('MoldManagement.MoldBrandFormPage.validatorNameRequired'), trigger: 'blur' }],
moldType: [{ required: true, message: t('MoldManagement.MoldBrandFormPage.validatorNameRequired'), trigger: 'blur' }],
productId: [{ required: true, message: t('MoldManagement.MoldBrandFormPage.validatorProductRequired'), trigger: 'change' }],
moldSize: [{ required: true, message: t('MoldManagement.MoldBrandFormPage.validatorMoldSizeRequired'), trigger: 'blur' }],
isEnable: [{ required: true, message: t('MoldManagement.MoldBrandFormPage.validatorIsEnableRequired'), trigger: 'change' }]
})
const resetForm = () => {
@ -168,7 +169,7 @@ const resetForm = () => {
productIds: [],
images: '',
version: '',
status: 0,
status: 1,
useTime: 0,
maintainType: undefined,
maintainTime: undefined,
@ -188,7 +189,7 @@ const handleProductChange = (value?: number) => {
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = type === 'create' ? '新增模具组' : '编辑模具组'
dialogTitle.value = type === 'create' ? t('MoldManagement.MoldBrandFormPage.createTitle') : t('MoldManagement.MoldBrandFormPage.updateTitle')
formType.value = type
resetForm()
await dictStore.setDictMap()
@ -233,10 +234,10 @@ const submitForm = async () => {
}
if (formType.value === 'create') {
await MoldBrandApi.createMoldBrand(payload)
message.success('新增成功')
message.success(t('MoldManagement.MoldBrandFormPage.createSuccess'))
} else {
await MoldBrandApi.updateMoldBrand(payload)
message.success('更新成功')
message.success(t('MoldManagement.MoldBrandFormPage.updateSuccess'))
}
dialogVisible.value = false
emit('success')

@ -33,16 +33,16 @@
:placeholder="t('MoldManagement.Mold.placeholderName')"
/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="formData.type" clearable placeholder="请选择类型" class="w-1/1">
<el-form-item :label="t('MoldManagement.MoldListPage.type')" prop="type">
<el-select v-model="formData.type" clearable :placeholder="t('MoldManagement.MoldListPage.type')" class="w-1/1">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.SUBMOLD_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="安装位置" prop="installLocation">
<el-input v-model="formData.installLocation" placeholder="请输入安装位置" />
<el-form-item :label="t('MoldManagement.MoldListPage.installLocation')" prop="installLocation">
<el-input v-model="formData.installLocation" :placeholder="t('MoldManagement.MoldListPage.installLocation')" />
</el-form-item>
<el-form-item label="材质" prop="material">
<el-input v-model="formData.material" placeholder="请输入材质" />
<el-form-item :label="t('MoldManagement.MoldListPage.material')" prop="material">
<el-input v-model="formData.material" :placeholder="t('MoldManagement.MoldListPage.material')" />
</el-form-item>
<el-form-item :label="t('MoldManagement.Mold.unit')" prop="unitId">
<el-select
@ -81,7 +81,7 @@
:image-url="formData.qrcodeUrl"
:print-id="formData.id"
:print-template-type="4"
:print-title="`${formData.name || '模具'}码打印预览`"
:print-title="t('MoldManagement.MoldBrandDetail.qrcodePrintTitle', { name: formData.name || t('MoldManagement.MoldBrandDetail.qrcodeTitle') })"
:print-paper-width="80"
:print-paper-height="80"
:print-max-width="220"
@ -89,7 +89,7 @@
:error-text="t('MoldManagement.Mold.qrcodeLoadError')"
:refresh-url="getQrcodeRefreshUrl()"
:refresh-disabled="!formData.id || !formData.code"
refresh-confirm-text="确认刷新该模具二维码吗?"
:refresh-confirm-text="t('MoldManagement.MoldBrandDetail.qrcodeRefreshConfirm')"
:template-json="formData.templateJson"
:print-data="buildPrintData()"
@refresh-success="handleQrcodeRefreshSuccess"

@ -1,42 +1,42 @@
<template>
<ContentWrap>
<el-form :model="queryParams" ref="queryFormRef" :inline="true" class="-mb-15px">
<el-form-item label="编码" prop="code"><el-input v-model="queryParams.code" placeholder="请输入编码" clearable @keyup.enter="handleQuery" class="!w-200px" /></el-form-item>
<el-form-item label="名称" prop="name"><el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery" class="!w-200px" /></el-form-item>
<el-form-item :label="t('MoldManagement.MoldListPage.code')" prop="code"><el-input v-model="queryParams.code" :placeholder="t('MoldManagement.MoldListPage.placeholderCode')" clearable @keyup.enter="handleQuery" class="!w-200px" /></el-form-item>
<el-form-item :label="t('MoldManagement.MoldListPage.name')" prop="name"><el-input v-model="queryParams.name" :placeholder="t('MoldManagement.MoldListPage.placeholderName')" clearable @keyup.enter="handleQuery" class="!w-200px" /></el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 查询</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['erp:mold-brand:create']"><Icon icon="ep:plus" class="mr-5px" /> 新增子模具</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading" v-hasPermi="['erp:mold-brand:export']"><Icon icon="ep:download" class="mr-5px" /> 导出</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('MoldManagement.MoldListPage.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('MoldManagement.MoldListPage.reset') }}</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['erp:mold-brand:create']"><Icon icon="ep:plus" class="mr-5px" /> {{ t('MoldManagement.MoldListPage.addSubMold') }}</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading" v-hasPermi="['erp:mold-brand:export']"><Icon icon="ep:download" class="mr-5px" /> {{ t('MoldManagement.MoldListPage.export') }}</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="子模具名称" prop="name" min-width="160" />
<el-table-column label="类型" min-width="120">
<el-table-column :label="t('MoldManagement.MoldListPage.index')" type="index" width="70" align="center" />
<el-table-column :label="t('MoldManagement.MoldListPage.subMoldName')" prop="name" min-width="160" />
<el-table-column :label="t('MoldManagement.MoldListPage.type')" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SUBMOLD_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="安装位置" min-width="140">
<el-table-column :label="t('MoldManagement.MoldListPage.installLocation')" min-width="140">
<template #default="scope">
{{ scope.row.installLocation || scope.row.installPosition || scope.row.currentPosition || scope.row.machineName || '-' }}
</template>
</el-table-column>
<el-table-column label="材质" min-width="120">
<el-table-column :label="t('MoldManagement.MoldListPage.material')" min-width="120">
<template #default="scope">
{{ scope.row.material || '-' }}
</template>
</el-table-column>
<el-table-column label="数量" width="90" align="center">
<el-table-column :label="t('MoldManagement.MoldListPage.quantity')" width="90" align="center">
<template #default="scope">
{{ scope.row.quantity || scope.row.count || 1 }}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="160">
<el-table-column :label="t('MoldManagement.MoldListPage.operate')" fixed="right" width="160">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)">编辑</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)"></el-button>
<el-button link type="primary" @click="openForm('update', scope.row.id)">{{ t('MoldManagement.MoldListPage.edit') }}</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)">{{ t('MoldManagement.MoldListPage.delete') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -51,6 +51,7 @@ import download from '@/utils/download'
import { DICT_TYPE } from '@/utils/dict'
import { MoldBrandApi } from '@/api/erp/mold'
const { t } = useI18n()
const message = useMessage() //
const MoldForm = defineAsyncComponent(() => import('./MoldForm.vue') as any)
const MoldRecordForm = defineAsyncComponent(() => import('@/views/erp/mold/components/MoldRecordForm.vue') as any)
@ -115,12 +116,12 @@ watch(
const formRef = ref()
const openForm = async (type: string, id?: number) => {
if (!props.brandId) {
message.error('请选择一个模具型号')
message.error(t('MoldManagement.MoldListPage.selectBrandTip'))
return
}
await nextTick()
if (!formRef.value || typeof formRef.value.open !== 'function') {
message.error('表单组件未就绪,请稍后重试')
message.error(t('MoldManagement.MoldListPage.formNotReady'))
return
}
formRef.value.open(type, id, props.brandId)
@ -133,7 +134,7 @@ const handleDelete = async (id: number) => {
await message.delConfirm()
//
await MoldBrandApi.deleteMold(id)
message.success('删除成功')
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
@ -142,7 +143,7 @@ const handleDelete = async (id: number) => {
/** 导出按钮操作 */
const handleExport = async () => {
if (!props.brandId) {
message.error('请选择一个模具型号')
message.error(t('MoldManagement.MoldListPage.selectBrandTip'))
return
}
try {
@ -152,7 +153,7 @@ const handleExport = async () => {
...queryParams,
brandId: props.brandId
})
download.excel(data, '子模具.xls')
download.excel(data, t('MoldManagement.MoldListPage.exportFilename'))
} catch {
} finally {
exportLoading.value = false

@ -6,15 +6,15 @@
<div class="mold-brand-detail__image-card">
<el-image v-if="imageList.length" :src="imageList[0]" :preview-src-list="imageList" fit="cover"
preview-teleported class="mold-brand-detail__image" />
<el-empty v-else description="暂无图片" />
<el-empty v-else :description="t('MoldManagement.MoldBrandDetail.noImage')" />
</div>
<div class="mold-brand-detail__qr-card">
<div class="mold-brand-detail__qr-title">模具二维码</div>
<div class="mold-brand-detail__qr-title">{{ t('MoldManagement.MoldBrandDetail.qrcodeTitle') }}</div>
<QrcodeActionCard :image-url="detailData?.qrCodeUrl" :print-id="detailData?.id" :print-template-type="4"
:print-title="`${detailData?.name || '模具'}码打印预览`" :print-paper-width="80" :print-paper-height="80"
:print-max-width="220" empty-text="暂无二维码" error-text="二维码加载失败" :refresh-url="getQrcodeRefreshUrl()"
:refresh-disabled="!detailData?.id || !detailData?.code" refresh-confirm-text="确认刷新该模具二维码吗?"
:print-title="t('MoldManagement.MoldBrandDetail.qrcodePrintTitle', { name: detailData?.name || t('MoldManagement.MoldBrandDetail.qrcodeTitle') })" :print-paper-width="80" :print-paper-height="80"
:print-max-width="220" :empty-text="t('MoldManagement.MoldBrandDetail.qrcodeEmpty')" :error-text="t('MoldManagement.MoldBrandDetail.qrcodeLoadError')" :refresh-url="getQrcodeRefreshUrl()"
:refresh-disabled="!detailData?.id || !detailData?.code" :refresh-confirm-text="t('MoldManagement.MoldBrandDetail.qrcodeRefreshConfirm')"
@refresh-success="handleQrcodeRefreshSuccess" />
<div class="mold-brand-detail__qr-code">{{ detailData?.code || '-' }}</div>
</div>
@ -30,49 +30,50 @@
</div>
</div>
<div class="mold-brand-detail__actions">
<el-button @click="goBack"><Icon icon="ep:arrow-left" class="mr-5px" /> 返回</el-button>
<el-button type="primary" @click="handleReservedAction('上模')"></el-button>
<el-button type="success" @click="handleReservedAction('下模')"></el-button>
<el-button type="warning" @click="handleReservedAction('维修')"></el-button>
<el-button @click="goBack"><Icon icon="ep:arrow-left" class="mr-5px" /> {{ t('MoldManagement.MoldBrandDetail.back') }}</el-button>
<el-button type="primary" @click="goOperate(1)" v-if="detailData?.status === 1">{{ t('MoldManagement.MoldBrandDetail.moldUp') }}</el-button>
<el-button type="success" @click="goOperate(2)" v-if="detailData?.status === 0">{{ t('MoldManagement.MoldBrandDetail.moldDown') }}</el-button>
<el-button type="warning" @click="handleReservedAction(t('MoldManagement.MoldBrandDetail.repair'))">{{ t('MoldManagement.MoldBrandDetail.repair') }}</el-button>
</div>
</div>
<div class="mold-brand-detail__grid">
<div class="mold-brand-detail__field"><span>编码</span><strong>{{ detailData?.code || '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>当前设备</span><strong>{{ detailData?.currentDevice ||
<div class="mold-brand-detail__field"><span>{{ t('MoldManagement.MoldBrandDetail.code') }}</span><strong>{{ detailData?.code || '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>{{ t('MoldManagement.MoldBrandDetail.currentDevice') }}</span><strong>{{ detailData?.currentDevice ||
detailData?.machineName
|| '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>产品型号</span><strong>{{ detailData?.productName || '-' }}</strong>
<div class="mold-brand-detail__field"><span>{{ t('MoldManagement.MoldBrandDetail.productName') }}</span><strong>{{ detailData?.productName || '-' }}</strong>
</div>
<div class="mold-brand-detail__field"><span>版本</span><strong>{{ detailData?.version || '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>{{ t('MoldManagement.MoldBrandDetail.version') }}</span><strong>{{ detailData?.version || '-' }}</strong></div>
<div class="mold-brand-detail__field mold-brand-detail__field--life">
<span>寿命状态</span>
<span>{{ t('MoldManagement.MoldBrandDetail.lifeStatus') }}</span>
<div v-if="lifeRate !== null" class="mold-brand-detail__life">
<el-progress :percentage="lifeRate" :stroke-width="10" :show-text="true" />
</div>
<strong v-else>-</strong>
</div>
<div class="mold-brand-detail__field"><span>子模数量</span><strong>{{ childMolds.length || detailData?.moldSize
<div class="mold-brand-detail__field"><span>{{ t('MoldManagement.MoldBrandDetail.childMoldCount') }}</span><strong>{{ childMolds.length || detailData?.moldSize
|| 0
}}</strong></div>
</div>
<div class="mold-brand-detail__tabs">
<el-tabs v-model="activeTab">
<el-tab-pane label="子模具" name="molds">
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabMolds')" name="molds">
<component :is="MoldListComp" :brand-id="brandId" />
</el-tab-pane>
<el-tab-pane label="点检记录" name="inspection">
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabInspection')" name="inspection">
<div v-loading="inspectionLoading">
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="时间">
<el-form-item :label="t('MoldManagement.MoldBrandDetail.time')">
<el-date-picker v-model="inspectionDateRange" type="daterange" value-format="YYYY-MM-DD HH:mm:ss"
start-placeholder="开始时间" end-placeholder="结束时间" range-separator="至" :unlink-panels="true"
:start-placeholder="t('MoldManagement.MoldBrandDetail.startTime')" :end-placeholder="t('MoldManagement.MoldBrandDetail.endTime')" :range-separator="t('MoldManagement.MoldBrandDetail.to')" :unlink-panels="true"
style="width: 340px" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="handleQueryInspection"></el-button>
<el-button @click="handleResetInspection"></el-button>
<el-button type="primary" plain @click="handleQueryInspection">{{ t('MoldManagement.MoldBrandDetail.query') }}</el-button>
<el-button @click="handleResetInspection">{{ t('MoldManagement.MoldBrandDetail.reset') }}</el-button>
<el-button type="success" plain :loading="inspectionExportLoading"
@click="handleExportInspection">导出</el-button>
@click="handleExportInspection">{{ t('MoldManagement.MoldBrandDetail.export') }}</el-button>
</el-form-item>
</el-form>
<el-empty v-if="!inspectionStepGroups.length" />
@ -82,7 +83,7 @@
<template #title>
<div class="device-ledger-history-title">
<span class="device-ledger-history-time">[{{ group.time }}]</span>
<span class="device-ledger-history-operator">操作人: {{ group.operator }}</span>
<span class="device-ledger-history-operator">{{ t('MoldManagement.MoldBrandDetail.operator') }}: {{ group.operator }}</span>
</div>
</template>
<template #description>
@ -94,18 +95,18 @@
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">点检方式</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.inspectionMethod') }}</span><span
class="device-ledger-history-item-value"><dict-tag type="Inspection_method"
:value="item.method" /></span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">判定标准</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.criteria') }}</span><span
class="device-ledger-history-item-value">{{ item.criteria ?? '-' }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">点检时间</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.inspectionTime') }}</span><span
class="device-ledger-history-item-value">{{ formatHistoryTime(item.taskTime) }}</span>
</div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">备注</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.remark') }}</span><span
class="device-ledger-history-item-value">{{ item.remark ?? '-' }}</span></div>
</div>
</div>
@ -113,19 +114,21 @@
</template>
</el-step>
</el-steps>
</div>
</el-tab-pane>
<el-tab-pane label="维修记录" name="repair">
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabRepair')" name="repair">
<div v-loading="repairLoading">
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="时间">
<el-form-item :label="t('MoldManagement.MoldBrandDetail.time')">
<el-date-picker v-model="repairDateRange" type="daterange" value-format="YYYY-MM-DD HH:mm:ss"
start-placeholder="开始时间" end-placeholder="结束时间" range-separator="至" :unlink-panels="true"
:start-placeholder="t('MoldManagement.MoldBrandDetail.startTime')" :end-placeholder="t('MoldManagement.MoldBrandDetail.endTime')" :range-separator="t('MoldManagement.MoldBrandDetail.to')" :unlink-panels="true"
style="width: 340px" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="handleQueryRepair"></el-button>
<el-button @click="handleResetRepair"></el-button>
<el-button type="primary" plain @click="handleQueryRepair">{{ t('MoldManagement.MoldBrandDetail.query') }}</el-button>
<el-button @click="handleResetRepair">{{ t('MoldManagement.MoldBrandDetail.reset') }}</el-button>
<el-button type="success" plain :loading="repairExportLoading"
@click="handleExportRepair">导出</el-button>
@click="handleExportRepair">{{ t('MoldManagement.MoldBrandDetail.export') }}</el-button>
</el-form-item>
</el-form>
<el-empty v-if="!repairGroups.length" />
@ -134,7 +137,7 @@
<template #title>
<div class="device-ledger-repair-title">
<span class="device-ledger-repair-name">{{ group.name }}</span>
<span class="device-ledger-repair-meta">{{ group.items.length }}</span>
<span class="device-ledger-repair-meta">{{ t('MoldManagement.MoldBrandDetail.totalItems', { count: group.items.length }) }}</span>
</div>
</template>
<div class="device-ledger-history-items">
@ -146,21 +149,21 @@
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">项目内容</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.projectContent') }}</span><span
class="device-ledger-history-item-value">{{ row.subjectContent ?? '-' }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">维修结果</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.repairResult') }}</span><span
class="device-ledger-history-item-value"><el-tag
:type="getResultTagType(row.result ?? row.repairResult)">{{
getResultLabel(row.repairResult ??
row.result) }}</el-tag></span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">完成日期</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.finishDate') }}</span><span
class="device-ledger-history-item-value">{{
String(formatHistoryTime(row.finishDate)).split(' ')[0]
}}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">备注</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.remark') }}</span><span
class="device-ledger-history-item-value">{{
row.remark ?? '-' }}</span></div>
</div>
@ -168,19 +171,21 @@
</div>
</el-collapse-item>
</el-collapse>
</div>
</el-tab-pane>
<el-tab-pane label="保养记录" name="maintain">
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabMaintain')" name="maintain">
<div v-loading="maintainLoading">
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="时间">
<el-form-item :label="t('MoldManagement.MoldBrandDetail.time')">
<el-date-picker v-model="maintainDateRange" type="daterange" value-format="YYYY-MM-DD HH:mm:ss"
start-placeholder="开始时间" end-placeholder="结束时间" range-separator="至" :unlink-panels="true"
:start-placeholder="t('MoldManagement.MoldBrandDetail.startTime')" :end-placeholder="t('MoldManagement.MoldBrandDetail.endTime')" :range-separator="t('MoldManagement.MoldBrandDetail.to')" :unlink-panels="true"
style="width: 340px" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="handleQueryMaintain"></el-button>
<el-button @click="handleResetMaintain"></el-button>
<el-button type="primary" plain @click="handleQueryMaintain">{{ t('MoldManagement.MoldBrandDetail.query') }}</el-button>
<el-button @click="handleResetMaintain">{{ t('MoldManagement.MoldBrandDetail.reset') }}</el-button>
<el-button type="success" plain :loading="maintainExportLoading"
@click="handleExportMaintain">导出</el-button>
@click="handleExportMaintain">{{ t('MoldManagement.MoldBrandDetail.export') }}</el-button>
</el-form-item>
</el-form>
<el-empty v-if="!maintainStepGroups.length" />
@ -190,7 +195,7 @@
<template #title>
<div class="device-ledger-history-title">
<span class="device-ledger-history-time">[{{ group.time }}]</span>
<span class="device-ledger-history-operator">操作人: {{ group.operator }}</span>
<span class="device-ledger-history-operator">{{ t('MoldManagement.MoldBrandDetail.operator') }}: {{ group.operator }}</span>
</div>
</template>
<template #description>
@ -202,18 +207,18 @@
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">保养方式</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.maintainMethod') }}</span><span
class="device-ledger-history-item-value"><dict-tag type="Inspection_method"
:value="item.method" /></span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">判定标准</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.criteria') }}</span><span
class="device-ledger-history-item-value">{{ item.criteria ?? '-' }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">保养时间</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.maintainTime') }}</span><span
class="device-ledger-history-item-value">{{
String(formatHistoryTime(item.taskTime)).split(' ')[0] }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">备注</span><span
class="device-ledger-history-item-label">{{ t('MoldManagement.MoldBrandDetail.remark') }}</span><span
class="device-ledger-history-item-value">{{ item.remark ?? '-' }}</span></div>
</div>
</div>
@ -221,35 +226,38 @@
</template>
</el-step>
</el-steps>
</div>
</el-tab-pane>
<el-tab-pane label="安装记录" name="install">
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabInstall')" name="install">
<div v-loading="installLoading">
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="模具"><el-select v-model="installMoldId" filterable clearable placeholder="选择模具"
<el-form-item :label="t('MoldManagement.MoldBrandDetail.mold')"><el-select v-model="installMoldId" filterable clearable :placeholder="t('MoldManagement.MoldBrandDetail.selectMold')"
class="!w-200px"><el-option v-for="item in childMolds" :key="item.id" :label="item.name"
:value="item.id" /></el-select></el-form-item>
<el-form-item label="备注"><el-input v-model="installRemark" placeholder="备注" clearable
<el-form-item :label="t('MoldManagement.MoldBrandDetail.remark')"><el-input v-model="installRemark" :placeholder="t('MoldManagement.MoldBrandDetail.remarkPlaceholder')" clearable
@keyup.enter="handleQueryInstall" /></el-form-item>
<el-form-item label="时间">
<el-form-item :label="t('MoldManagement.MoldBrandDetail.time')">
<el-date-picker v-model="installDateRange" type="daterange" value-format="YYYY-MM-DD HH:mm:ss"
start-placeholder="开始时间" end-placeholder="结束时间" range-separator="至" :unlink-panels="true" />
:start-placeholder="t('MoldManagement.MoldBrandDetail.startTime')" :end-placeholder="t('MoldManagement.MoldBrandDetail.endTime')" :range-separator="t('MoldManagement.MoldBrandDetail.to')" :unlink-panels="true" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="handleQueryInstall"></el-button>
<el-button @click="handleResetInstall"></el-button>
<el-button type="primary" plain @click="handleQueryInstall">{{ t('MoldManagement.MoldBrandDetail.query') }}</el-button>
<el-button @click="handleResetInstall">{{ t('MoldManagement.MoldBrandDetail.reset') }}</el-button>
</el-form-item>
</el-form>
<el-table :data="installRecords" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="模具名称" prop="moldName" min-width="150" sortable />
<el-table-column label="设备" prop="deviceName" min-width="120" sortable />
<el-table-column label="操作人" prop="creatorName" min-width="100" sortable />
<el-table-column label="备注" prop="remark" min-width="140" />
<el-table-column label="操作时间" prop="createTime" min-width="180" sortable>
<el-table-column :label="t('MoldManagement.MoldBrandDetail.moldName')" prop="moldName" min-width="150" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandDetail.deviceName')" prop="deviceName" min-width="120" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandDetail.creatorName')" prop="creatorName" min-width="100" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandDetail.remark')" prop="remark" min-width="140" />
<el-table-column :label="t('MoldManagement.MoldBrandDetail.createTime')" prop="createTime" min-width="180" sortable>
<template #default="scope">{{ formatHistoryTime(scope.row.createTime) }}</template>
</el-table-column>
</el-table>
<el-empty v-if="!installRecords.length" description="暂无安装记录" />
<el-empty v-if="!installRecords.length" :description="t('MoldManagement.MoldBrandDetail.noInstallRecords')" />
<Pagination :total="installTotal" v-model:page="installPageNo" v-model:limit="installPageSize"
@pagination="fetchInstallRecords" />
</div>
</el-tab-pane>
</el-tabs>
</div>
@ -272,6 +280,7 @@ import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue'
defineOptions({ name: 'ErpMoldBrandDetail' })
const { t } = useI18n()
const message = useMessage()
const route = useRoute()
const router = useRouter()
@ -281,6 +290,7 @@ const detailLoading = ref(false)
const detailData = ref<(MoldBrandVO & Record<string, any>) | null>(null)
const childMolds = ref<any[]>([])
const activeTab = ref('molds')
const loadedTabs = ref<Set<string>>(new Set(['molds']))
const inspectionHistory = ref<any[]>([])
const maintainHistory = ref<any[]>([])
const repairList = ref<any[]>([])
@ -298,6 +308,10 @@ const repairDateRange = ref<string[] | undefined>()
const inspectionExportLoading = ref(false)
const maintainExportLoading = ref(false)
const repairExportLoading = ref(false)
const inspectionLoading = ref(false)
const repairLoading = ref(false)
const maintainLoading = ref(false)
const installLoading = ref(false)
const imageList = computed(() => parseImages(detailData.value?.images))
const lifeRate = computed<number | null>(() => {
@ -340,9 +354,9 @@ const getResultLabel = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (!v) return '-'
const upper = v.toUpperCase()
if (v === '0') return '待检测'
if (v === '1' || upper === 'OK') return '通过'
if (v === '2' || upper === 'NG') return '不通过'
if (v === '0') return t('MoldManagement.MoldBrandDetail.pending')
if (v === '1' || upper === 'OK') return t('MoldManagement.MoldBrandDetail.pass')
if (v === '2' || upper === 'NG') return t('MoldManagement.MoldBrandDetail.fail')
return v
}
@ -452,8 +466,12 @@ const goBack = () => {
router.push('/mold/mold-brand')
}
const goOperate = (type: number) => {
router.push({ path: '/mold/mold-brand', query: { operateType: String(type), moldId: String(detailData.value?.id) } })
}
const handleReservedAction = (action: string) => {
message.info(`${action}功能预留中`)
message.info(t('MoldManagement.MoldBrandDetail.reservedAction', { action }))
}
let getChildMoldsPromise: Promise<any[]> | null = null
@ -493,49 +511,69 @@ const collectByChildMolds = async (worker: (moldId: number) => Promise<any>, mer
const fetchInspectionHistory = async () => {
if (!brandId.value) return
const params: any = { moldId: brandId.value }
if (inspectionDateRange.value && inspectionDateRange.value.length === 2) {
params.startTime = inspectionDateRange.value[0]
params.endTime = inspectionDateRange.value[1]
inspectionLoading.value = true
try {
const params: any = { moldId: brandId.value }
if (inspectionDateRange.value && inspectionDateRange.value.length === 2) {
params.startTime = inspectionDateRange.value[0]
params.endTime = inspectionDateRange.value[1]
}
const data = await TicketManagementApi.getInspectionByMoldId(params)
inspectionHistory.value = Array.isArray(data) ? data : []
} finally {
inspectionLoading.value = false
}
const data = await TicketManagementApi.getInspectionByMoldId(params)
inspectionHistory.value = Array.isArray(data) ? data : []
}
const fetchMaintainHistory = async () => {
if (!brandId.value) return
const params: any = { moldId: brandId.value }
if (maintainDateRange.value && maintainDateRange.value.length === 2) {
params.startTime = maintainDateRange.value[0]
params.endTime = maintainDateRange.value[1]
maintainLoading.value = true
try {
const params: any = { moldId: brandId.value }
if (maintainDateRange.value && maintainDateRange.value.length === 2) {
params.startTime = maintainDateRange.value[0]
params.endTime = maintainDateRange.value[1]
}
const data = await TicketManagementApi.getMaintenanceByMoldId(params)
maintainHistory.value = Array.isArray(data) ? data : []
} finally {
maintainLoading.value = false
}
const data = await TicketManagementApi.getMaintenanceByMoldId(params)
maintainHistory.value = Array.isArray(data) ? data : []
}
const fetchRepairHistory = async () => {
if (!brandId.value) return
const params: any = { moldId: brandId.value }
if (repairDateRange.value && repairDateRange.value.length === 2) {
params.startTime = repairDateRange.value[0]
params.endTime = repairDateRange.value[1]
repairLoading.value = true
try {
const params: any = { moldId: brandId.value }
if (repairDateRange.value && repairDateRange.value.length === 2) {
params.startTime = repairDateRange.value[0]
params.endTime = repairDateRange.value[1]
}
const data = await MoldRepairApi.getRepairListByMoldId(params)
repairList.value = Array.isArray(data) ? data : []
repairActiveNames.value = repairGroups.value.map((item) => item.key)
} finally {
repairLoading.value = false
}
const data = await MoldRepairApi.getRepairListByMoldId(params)
repairList.value = Array.isArray(data) ? data : []
repairActiveNames.value = repairGroups.value.map((item) => item.key)
}
const fetchInstallRecords = async () => {
if (!brandId.value) return
const params: any = { pageNo: installPageNo.value, pageSize: installPageSize.value, brandId: brandId.value }
if (installMoldId.value) params.moldId = installMoldId.value
if (installRemark.value) params.remark = installRemark.value
if (installDateRange.value && installDateRange.value.length === 2) {
params.createTime = [installDateRange.value[0], installDateRange.value[1]]
installLoading.value = true
try {
const params: any = { pageNo: installPageNo.value, pageSize: installPageSize.value, brandId: brandId.value }
if (installMoldId.value) params.moldId = installMoldId.value
if (installRemark.value) params.remark = installRemark.value
if (installDateRange.value && installDateRange.value.length === 2) {
params.createTime = [installDateRange.value[0], installDateRange.value[1]]
}
const data = await MoldOperateApi.getMoldOperatePage(params)
installRecords.value = data?.list ?? []
installTotal.value = data?.total ?? 0
} finally {
installLoading.value = false
}
const data = await MoldOperateApi.getMoldOperatePage(params)
installRecords.value = data?.list ?? []
installTotal.value = data?.total ?? 0
}
const handleQueryInstall = () => {
@ -562,7 +600,7 @@ const handleResetInspection = async () => {
const handleExportInspection = async () => {
inspectionExportLoading.value = true
message.info('点检记录导出功能待后端确认后接入')
message.info(t('MoldManagement.MoldBrandDetail.inspectionExportTip'))
inspectionExportLoading.value = false
}
@ -577,7 +615,7 @@ const handleResetMaintain = async () => {
const handleExportMaintain = async () => {
maintainExportLoading.value = true
message.info('保养记录导出功能待后端确认后接入')
message.info(t('MoldManagement.MoldBrandDetail.maintainExportTip'))
maintainExportLoading.value = false
}
@ -592,25 +630,50 @@ const handleResetRepair = async () => {
const handleExportRepair = async () => {
repairExportLoading.value = true
message.info('维修记录导出功能待后端确认后接入')
message.info(t('MoldManagement.MoldBrandDetail.repairExportTip'))
repairExportLoading.value = false
}
const getDetail = async () => {
if (!brandId.value) {
message.error('缺少模具组ID')
message.error(t('MoldManagement.MoldBrandDetail.missingBrandId'))
return
}
detailLoading.value = true
try {
detailData.value = await MoldBrandApi.getMoldBrand(brandId.value)
await getChildMolds()
await Promise.all([fetchInspectionHistory(), fetchMaintainHistory(), fetchRepairHistory(), fetchInstallRecords()])
} finally {
detailLoading.value = false
}
}
const loadTabData = async (tab: string) => {
if (loadedTabs.value.has(tab)) return
loadedTabs.value.add(tab)
switch (tab) {
case 'inspection':
await getChildMolds()
fetchInspectionHistory()
break
case 'repair':
await getChildMolds()
fetchRepairHistory()
break
case 'maintain':
await getChildMolds()
fetchMaintainHistory()
break
case 'install':
await getChildMolds()
fetchInstallRecords()
break
}
}
watch(activeTab, (val) => {
loadTabData(val)
})
onMounted(() => {
getDetail()
})

@ -19,14 +19,14 @@
<el-form-item prop="keyword">
<el-input
v-model="queryParams.keyword"
placeholder="请输入编码/名称/产品型号"
: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="模具状态" clearable class="!w-180px">
<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"
@ -36,12 +36,12 @@
</el-select>
</el-form-item>
<el-form-item prop="productId">
<el-select v-model="queryParams.productId" placeholder="产品型号" 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="当前设备" clearable filterable class="!w-180px">
<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"
@ -51,19 +51,19 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="resetQuery"></el-button>
<el-button type="primary" @click="handleQuery"></el-button>
<el-button @click="resetQuery">{{ t('MoldManagement.MoldBrandPage.reset') }}</el-button>
<el-button type="primary" @click="handleQuery">{{ t('MoldManagement.MoldBrandPage.query') }}</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['erp:mold-brand:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
<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']">
<Icon icon="ep:download" class="mr-5px" /> 导出
<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">
<el-table-column label="图片" align="center" width="92">
<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"
@ -76,31 +76,31 @@
<span v-else class="mold-brand-page__empty">-</span>
</template>
</el-table-column>
<el-table-column label="编码" prop="code" min-width="150" sortable />
<el-table-column label="名称" prop="name" min-width="160" sortable />
<el-table-column label="产品型号" prop="productName" min-width="140" />
<el-table-column label="版本" prop="version" width="100" />
<el-table-column label="状态" prop="status" width="100" align="center">
<el-table-column :label="t('MoldManagement.MoldBrandPage.code')" prop="code" min-width="150" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandPage.name')" prop="name" min-width="160" sortable />
<el-table-column :label="t('MoldManagement.MoldBrandPage.productName')" prop="productName" min-width="140" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.version')" prop="version" width="100" />
<el-table-column :label="t('MoldManagement.MoldBrandPage.status')" prop="status" width="100" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="当前设备" min-width="140">
<el-table-column :label="t('MoldManagement.MoldBrandPage.currentDevice')" min-width="140">
<template #default="scope">
{{ scope.row.currentDevice || scope.row.machineName || '-' }}
</template>
</el-table-column>
<el-table-column label="子模数" prop="moldSize" width="90" align="center" />
<el-table-column label="创建时间" prop="createTime" :formatter="dateFormatter" width="180" sortable />
<el-table-column label="操作" fixed="right" min-width="240">
<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)"></el-button>
<el-button link type="primary" @click="openOperateForm(1, scope.row)">上模</el-button>
<el-button link type="primary" @click="openOperateForm(2, scope.row)">下模</el-button>
<el-button link type="warning" @click="handleReservedAction('维修')"></el-button>
<el-button link type="primary" @click="previewQrcode(scope.row)"></el-button>
<el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['erp:mold-brand:update']"></el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['erp:mold-brand: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>
@ -117,17 +117,7 @@
<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" /> 返回</el-button>
<div class="mold-operate-page__tabs">
<el-button
:type="operateType === 1 ? 'primary' : ''"
@click="switchOperateType(1)"
>上模</el-button>
<el-button
:type="operateType === 2 ? 'primary' : ''"
@click="switchOperateType(2)"
>下模</el-button>
</div>
<el-button @click="closeOperateForm"><Icon icon="ep:arrow-left" class="mr-5px" /> {{ t('MoldManagement.MoldBrandPage.back') }}</el-button>
</div>
<!-- 模具信息卡片 -->
@ -140,31 +130,31 @@
/>
<div class="mold-operate-page__info-empty" v-else></div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">模具编码</span>
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldCode') }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.code }}</span>
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">模具名称</span>
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldName') }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.name }}</span>
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">产品型号</span>
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.productName') }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.productName }}</span>
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">子模数</span>
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldSize') }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.moldSize }}</span>
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">当前状态</span>
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.status') }}</span>
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="currentMold.status" />
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">当前设备</span>
<span class="mold-operate-page__info-label">{{ t('MoldManagement.MoldBrandPage.currentDevice') }}</span>
<span class="mold-operate-page__info-value">{{ currentMold.currentDevice || '-' }}</span>
</div>
<div class="mold-operate-page__info-item">
<span class="mold-operate-page__info-label">上次更换时间</span>
<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>
</div>
</div>
@ -173,82 +163,79 @@
<!-- 左侧表单 -->
<div class="mold-operate-page__form">
<el-form ref="operateFormRef" :model="operateFormData" :rules="operateFormRules" label-width="100px">
<el-form-item label="目标产线" prop="targetLine">
<el-select v-model="operateFormData.targetLine" filterable clearable placeholder="请选择产线" class="!w-full">
<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-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="目标设备" prop="deviceId">
<el-select v-model="operateFormData.deviceId" filterable clearable placeholder="请选择设备" class="!w-full">
<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>
</el-form-item>
<el-form-item label="模具" prop="moldId" v-if="operateType === 1">
<el-select v-model="operateFormData.moldId" clearable filterable placeholder="请选择模具" class="!w-full">
<el-option v-for="item in moldList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="操作时间" prop="operateTime">
<el-date-picker v-model="operateFormData.operateTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择时间" class="!w-full" />
<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-form-item>
<el-form-item label="操作人" prop="operatorId">
<el-select v-model="operateFormData.operatorId" filterable clearable placeholder="请选择操作人" class="!w-full">
<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>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="operateFormData.remark" placeholder="请输入备注(选填)" type="textarea" :rows="3" />
<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-form-item>
</el-form>
<div class="mold-operate-page__form-actions">
<el-button @click="closeOperateForm"></el-button>
<el-button type="primary" @click="submitOperateForm" :loading="operateLoading">提交</el-button>
<el-button @click="closeOperateForm">{{ t('MoldManagement.MoldBrandPage.cancel') }}</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">最近上下模记录</span>
<span class="mold-operate-page__history-title">{{ t('MoldManagement.MoldBrandPage.recentRecords') }}</span>
</div>
<el-table :data="recentOperateList" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="操作类型" width="100">
<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 ? '安装(上模)' : '拆卸(下模)' }}
<span :class="scope.row.operateType === '1' ? 'text-primary' : 'text-success'">
{{ scope.row.operateType === '1' ? t('MoldManagement.MoldBrandPage.installUp') : t('MoldManagement.MoldBrandPage.uninstallDown') }}
</span>
</template>
</el-table-column>
<el-table-column label="模具编码" prop="moldCode" width="140" />
<el-table-column label="操作时间" prop="createTime" width="160" :formatter="dateFormatter" />
<el-table-column label="操作人" prop="creatorName" width="100" />
<el-table-column label="状态" width="80" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="scope.row.status" />
</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.operator')" prop="operatorName" width="100" />
</el-table>
<el-empty v-if="!recentOperateList.length" description="暂无操作记录" />
<el-empty v-if="!recentOperateList.length" :description="t('MoldManagement.MoldBrandPage.noRecords')" />
<Pagination
:total="recentTotal"
v-model:page="recentPageNo"
v-model:limit="recentPageSize"
@pagination="fetchRecentOperateList"
/>
</div>
</div>
</div>
</template>
</ContentWrap>
<Dialog v-model="qrcodeVisible" title="模具二维码" width="360px">
<Dialog v-model="qrcodeVisible" :title="t('MoldManagement.MoldBrandPage.qrcodeDialogTitle')" width="360px">
<QrcodeActionCard
:image-url="currentQrcodeRow?.qrCodeUrl"
:print-id="currentQrcodeRow?.id"
:print-template-type="4"
:print-title="`${currentQrcodeRow?.name || '模具'}码打印预览`"
: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"
empty-text="暂无二维码"
error-text="二维码加载失败"
:empty-text="t('MoldManagement.MoldBrandPage.qrcodeEmpty')"
:error-text="t('MoldManagement.MoldBrandPage.qrcodeLoadError')"
:refresh-url="getQrcodeRefreshUrl()"
:refresh-disabled="!currentQrcodeRow?.id || !currentQrcodeRow?.code"
refresh-confirm-text="确认刷新该模具二维码吗?"
:refresh-confirm-text="t('MoldManagement.MoldBrandPage.qrcodeRefreshConfirm')"
@refresh-success="handleQrcodeRefreshSuccess"
/>
</Dialog>
@ -259,7 +246,7 @@
<script setup lang="ts">
import { defineAsyncComponent } from 'vue'
import { ProductApi, type ProductVO } from '@/api/erp/product/product'
import { MoldBrandApi, type MoldBrandVO, type MoldVO } from '@/api/erp/mold'
import { MoldBrandApi, type MoldBrandVO } from '@/api/erp/mold'
import { DeviceLedgerApi, type DeviceLedgerVO } from '@/api/mes/deviceledger'
import { MoldOperateApi, type MoldOperateVO } from '@/api/mes/moldoperate'
import { OrganizationApi, type OrganizationVO } from '@/api/mes/organization'
@ -271,8 +258,10 @@ import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue'
defineOptions({ name: 'MoldBrand' })
const { t } = useI18n()
const message = useMessage()
const { push } = useRouter()
const route = useRoute()
const loading = ref(false)
const exportLoading = ref(false)
const list = ref<MoldBrandVO[]>([])
@ -313,11 +302,14 @@ const currentMold = ref<MoldBrandVO | null>(null)
const operateLoading = ref(false)
const operateFormRef = ref()
const recentOperateList = ref<MoldOperateVO[]>([])
const recentPageNo = ref(1)
const recentPageSize = ref(5)
const recentTotal = ref(0)
const recentLoading = ref(false)
//
const operateFormData = reactive({
moldId: undefined as number | undefined,
targetLine: undefined as string | undefined,
lineId: undefined as string | undefined,
deviceId: undefined as number | undefined,
operateTime: undefined as string | undefined,
operatorId: undefined as string | undefined,
@ -326,24 +318,22 @@ const operateFormData = reactive({
//
const operateFormRules = reactive({
moldId: [{ required: true, message: '请选择模具', trigger: 'blur' }],
targetLine: [{ required: true, message: '请选择目标产线', trigger: 'blur' }],
deviceId: [{ required: true, message: '请选择目标设备', trigger: 'blur' }],
operateTime: [{ required: true, message: '请选择操作时间', trigger: 'blur' }],
operatorId: [{ required: true, message: '请选择操作人', trigger: 'blur' }]
lineId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorTargetLineRequired'), trigger: 'blur' }],
deviceId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorTargetDeviceRequired'), trigger: 'blur' }],
operateTime: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorOperateTimeRequired'), trigger: 'blur' }],
operatorId: [{ required: true, message: t('MoldManagement.MoldBrandPage.validatorOperatorRequired'), trigger: 'blur' }]
})
//
const lineOptions = ref<OrganizationVO[]>([])
const operatorOptions = ref<UserVO[]>([])
const moldList = ref<MoldVO[]>([])
const statusCards = computed(() => [
{ key: 'all', label: '全部', value: counters.allCount, status: undefined },
{ key: 'onMachine', label: '在机', value: counters.onMachineCount, status: 1 },
{ key: 'standby', label: '待用', value: counters.standbyCount, status: 0 },
{ key: 'repairing', label: '维修', value: counters.repairingCount, status: 2 },
{ key: 'scrapped', label: '报废', value: counters.scrappedCount, status: 3 }
{ key: 'all', label: t('MoldManagement.MoldBrandPage.all'), value: counters.allCount, status: undefined },
{ key: 'onMachine', label: t('MoldManagement.MoldBrandPage.onMachine'), value: counters.onMachineCount, status: 1 },
{ key: 'standby', label: t('MoldManagement.MoldBrandPage.standby'), value: counters.standbyCount, status: 0 },
{ key: 'repairing', label: t('MoldManagement.MoldBrandPage.repairing'), value: counters.repairingCount, status: 2 },
{ key: 'scrapped', label: t('MoldManagement.MoldBrandPage.scrapped'), value: counters.scrappedCount, status: 3 }
])
const parseKeyword = () => {
@ -413,7 +403,7 @@ const handleDelete = async (id: number) => {
try {
await message.delConfirm()
await MoldBrandApi.deleteMoldBrand(id)
message.success('删除成功')
message.success(t('common.delSuccess'))
await getList()
} catch {}
}
@ -424,14 +414,14 @@ const handleExport = async () => {
exportLoading.value = true
parseKeyword()
const data = await MoldBrandApi.exportMoldBrand(queryParams)
download.excel(data, '模具台账.xls')
download.excel(data, t('MoldManagement.MoldBrandPage.exportFilename'))
} finally {
exportLoading.value = false
}
}
const handleReservedAction = (action: string) => {
message.info(`${action}功能预留中`)
message.info(t('MoldManagement.MoldBrandPage.reservedAction', { action }))
}
const previewQrcode = (row: MoldBrandVO) => {
@ -466,8 +456,7 @@ const openOperateForm = async (type: number, row: MoldBrandVO) => {
operateFormVisible.value = true
//
operateFormData.moldId = undefined
operateFormData.targetLine = undefined
operateFormData.lineId = undefined
operateFormData.deviceId = undefined
operateFormData.operateTime = undefined
operateFormData.operatorId = undefined
@ -477,6 +466,7 @@ const openOperateForm = async (type: number, row: MoldBrandVO) => {
await initOperateOptions()
//
recentPageNo.value = 1
await fetchRecentOperateList()
}
@ -485,10 +475,6 @@ const closeOperateForm = () => {
currentMold.value = null
}
const switchOperateType = (type: number) => {
operateType.value = type
}
const initOperateOptions = async () => {
// 线
try {
@ -498,13 +484,6 @@ const initOperateOptions = async () => {
lineOptions.value = []
}
//
try {
moldList.value = await MoldBrandApi.getBrandList()
} catch {
moldList.value = []
}
//
try {
operatorOptions.value = (await getSimpleUserList()) ?? []
@ -516,15 +495,20 @@ const initOperateOptions = async () => {
const fetchRecentOperateList = async () => {
if (!currentMold.value?.id) return
recentLoading.value = true
try {
const data = await MoldOperateApi.getMoldOperatePage({
pageNo: 1,
pageSize: 5,
pageNo: recentPageNo.value,
pageSize: recentPageSize.value,
moldId: currentMold.value.id
})
recentOperateList.value = data?.list ?? []
recentTotal.value = data?.total ?? 0
} catch {
recentOperateList.value = []
recentTotal.value = 0
} finally {
recentLoading.value = false
}
}
@ -538,22 +522,24 @@ const submitOperateForm = async () => {
const submitData = {
operateType: operateType.value,
moldId: operateType.value === 1 ? operateFormData.moldId : currentMold.value?.id,
moldId: currentMold.value?.id,
lineId: operateFormData.lineId,
deviceId: operateFormData.deviceId,
remark: operateFormData.remark,
targetLine: operateFormData.targetLine,
operateTime: operateFormData.operateTime,
operatorId: operateFormData.operatorId
}
await MoldOperateApi.createMoldOperate(submitData)
message.success(operateType.value === 1 ? '上模成功' : '下模成功')
message.success(operateType.value === 1 ? t('MoldManagement.MoldBrandPage.moldUpSuccess') : t('MoldManagement.MoldBrandPage.moldDownSuccess'))
closeOperateForm()
await getList()
//
// closeOperateForm()
// await getList()
fetchRecentOperateList()
} catch (error) {
console.error('提交失败:', error)
console.error(t('MoldManagement.MoldBrandPage.submitFailed'), error)
} finally {
operateLoading.value = false
}
@ -563,6 +549,17 @@ onMounted(async () => {
productOptions.value = await ProductApi.getMesProductSimpleList()
deviceOptions.value = await DeviceLedgerApi.getDeviceLedgerList()
await getList()
//
const { operateType: queryOperateType, moldId: queryMoldId } = route.query
if (queryOperateType && queryMoldId) {
const moldRow = list.value.find((item) => item.id === Number(queryMoldId))
if (moldRow) {
await openOperateForm(Number(queryOperateType), moldRow)
}
// query
push({ path: route.path })
}
})
</script>
@ -707,7 +704,7 @@ onMounted(async () => {
}
.mold-operate-page__history {
width: 420px;
width: 30vw;
background: #fff;
border-radius: 12px;
padding: 20px;

Loading…
Cancel
Save