feat:模具组详情页

main
黄伟杰 1 week ago
parent e6617ceed6
commit b8d4cfc7e0

@ -228,6 +228,7 @@ export enum DICT_TYPE {
ERP_AUDIT_STATUS = 'erp_audit_status',// ERP 审批状态
ERP_STOCK_RECORD_BIZ_TYPE = 'erp_stock_record_biz_type',// 库存明细的业务类型
ERP_MOLD_STATUS = 'erp_mold_status',// ERP 模具状态
SUBMOLD_TYPE = 'submold_type', // 子模具类型
ERP_MAINTAIN_TYPE = 'maintain_type',// ERP 保养类型
ERP_AUTOCODE_IS_PADDING = "erp_autocode_is_padding",

@ -33,6 +33,17 @@
: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-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>
<el-form-item label="材质" prop="material">
<el-input v-model="formData.material" placeholder="请输入材质" />
</el-form-item>
<el-form-item :label="t('MoldManagement.Mold.unit')" prop="unitId">
<el-select
v-model="formData.unitId"
@ -65,25 +76,6 @@
:placeholder="t('MoldManagement.Mold.placeholderInTime')"
/>
</el-form-item>
<el-form-item prop="status">
<template #label>
<span>
{{ t('MoldManagement.Mold.status') }}
<el-tooltip :content="t('MoldManagement.Mold.statusTooltip')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-radio-group v-model="formData.status" :disabled = "formType == 'create'">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.ERP_MOLD_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formType === 'update'" :label="t('MoldManagement.Mold.qrcode')" prop="qrcodeUrl">
<QrcodeActionCard
:image-url="formData.qrcodeUrl"
@ -137,7 +129,7 @@
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE, getBoolDictOptions } from '@/utils/dict'
import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getBoolDictOptions } from '@/utils/dict'
import { MoldBrandApi } from '@/api/erp/mold'
import { ProductUnitApi, ProductUnitVO } from '@/api/erp/product/unit'
import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue'
@ -155,6 +147,9 @@ const formData = ref({
code: undefined,
isCode: undefined,
name: undefined,
type: undefined,
installLocation: undefined,
material: undefined,
unitId: undefined,
machineId: undefined,
useTime: undefined,

@ -1,20 +1,26 @@
<template>
<ContentWrap>
<div class="mb-12px">
<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>
</div>
<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>
<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-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="类型" prop="moldType" min-width="120" />
<el-table-column label="类型" 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">
<template #default="scope">
{{ scope.row.installPosition || scope.row.currentPosition || scope.row.machineName || '-' }}
{{ scope.row.installLocation || scope.row.installPosition || scope.row.currentPosition || scope.row.machineName || '-' }}
</template>
</el-table-column>
<el-table-column label="材质" min-width="120">
@ -42,6 +48,7 @@
<script setup lang="ts">
import { defineAsyncComponent, nextTick } from 'vue'
import download from '@/utils/download'
import { DICT_TYPE } from '@/utils/dict'
import { MoldBrandApi } from '@/api/erp/mold'
const message = useMessage() //
@ -58,8 +65,11 @@ const exportLoading = ref(false) // 导出的加载中
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
brandId: undefined as unknown
brandId: undefined as unknown,
code: undefined,
name: undefined
})
const queryFormRef = ref()
/** 查询列表 */
const getList = async () => {
@ -74,6 +84,17 @@ const getList = async () => {
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields()
handleQuery()
}
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.brandId,
@ -82,6 +103,8 @@ watch(
return
}
queryParams.brandId = val
queryParams.code = undefined
queryParams.name = undefined
queryParams.pageNo = 1
getList()
},

@ -1,33 +1,21 @@
<template>
<ContentWrap>
<div v-loading="detailLoading" class="mold-brand-detail">
<div class="mold-brand-detail__crumb">模具详情页面 / 模具台账 / 模具详情</div>
<div class="mold-brand-detail__hero">
<div class="mold-brand-detail__left">
<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-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="暂无图片" />
</div>
<div class="mold-brand-detail__qr-card">
<div class="mold-brand-detail__qr-title">模具二维码</div>
<el-image
v-if="detailData?.qrCodeUrl"
:src="detailData.qrCodeUrl"
:preview-src-list="[detailData.qrCodeUrl]"
fit="contain"
preview-teleported
class="mold-brand-detail__qr"
/>
<el-empty v-else description="暂无二维码" />
<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="确认刷新该模具二维码吗?"
@refresh-success="handleQrcodeRefreshSuccess" />
<div class="mold-brand-detail__qr-code">{{ detailData?.code || '-' }}</div>
</div>
</div>
@ -36,34 +24,27 @@
<div class="mold-brand-detail__topbar">
<div>
<div class="mold-brand-detail__title-row">
<span class="mold-brand-detail__title">{{ detailData?.name || '-' }}<span v-if="detailData?.version">{{ detailData.version }}</span></span>
<el-tag v-if="detailData?.status !== undefined" type="success" effect="light">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="detailData?.status" />
</el-tag>
<span class="mold-brand-detail__title">{{ detailData?.name || '-' }}<span v-if="detailData?.version">{{
detailData.version }}</span></span>
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="detailData?.status" />
</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-dropdown>
<el-button>更多<Icon icon="ep:arrow-down" class="ml-4px" /></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="handleReservedAction('更多操作')"></el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</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 || detailData?.machineName || '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>产品型号</span><strong>{{ detailData?.productName || '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>当前设备</span><strong>{{ detailData?.currentDevice ||
detailData?.machineName
|| '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>产品型号</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>安装时间</span><strong>{{ formatSimpleDate(detailData?.installTime) }}</strong></div>
<div class="mold-brand-detail__field"><span>客户</span><strong>{{ detailData?.customerName || detailData?.customer || '-' }}</strong></div>
<div class="mold-brand-detail__field mold-brand-detail__field--life">
<span>寿命状态</span>
<div v-if="lifeRate !== null" class="mold-brand-detail__life">
@ -71,8 +52,9 @@
</div>
<strong v-else>-</strong>
</div>
<div class="mold-brand-detail__field"><span>模具类型</span><strong>{{ detailData?.moldType || '-' }}</strong></div>
<div class="mold-brand-detail__field"><span>子模数量</span><strong>{{ childMolds.length || detailData?.moldSize || 0 }}</strong></div>
<div class="mold-brand-detail__field"><span>子模数量</span><strong>{{ childMolds.length || detailData?.moldSize
|| 0
}}</strong></div>
</div>
<div class="mold-brand-detail__tabs">
<el-tabs v-model="activeTab">
@ -80,23 +62,22 @@
<component :is="MoldListComp" :brand-id="brandId" />
</el-tab-pane>
<el-tab-pane label="点检记录" name="inspection">
<div class="device-ledger-tab-toolbar">
<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"
class="mr-10px"
/>
<el-button type="primary" plain @click="handleQueryInspection"></el-button>
<el-button @click="handleResetInspection"></el-button>
<el-button type="success" plain :loading="inspectionExportLoading" @click="handleExportInspection"></el-button>
</div>
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="时间">
<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"
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="success" plain :loading="inspectionExportLoading"
@click="handleExportInspection">导出</el-button>
</el-form-item>
</el-form>
<el-empty v-if="!inspectionStepGroups.length" />
<el-steps v-else direction="vertical" :active="inspectionStepGroups.length" class="device-ledger-history-steps">
<el-steps v-else direction="vertical" :active="inspectionStepGroups.length"
class="device-ledger-history-steps">
<el-step v-for="group in inspectionStepGroups" :key="group.key">
<template #title>
<div class="device-ledger-history-title">
@ -112,10 +93,20 @@
<span class="device-ledger-history-item-text">{{ item.name }}</span>
</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-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-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-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-value">{{ item.remark ?? '-' }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">点检方式</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-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-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-value">{{ item.remark ?? '-' }}</span></div>
</div>
</div>
</div>
@ -124,21 +115,19 @@
</el-steps>
</el-tab-pane>
<el-tab-pane label="维修记录" name="repair">
<div class="device-ledger-tab-toolbar">
<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"
class="mr-10px"
/>
<el-button type="primary" plain @click="handleQueryRepair"></el-button>
<el-button @click="handleResetRepair"></el-button>
<el-button type="success" plain :loading="repairExportLoading" @click="handleExportRepair"></el-button>
</div>
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="时间">
<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"
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="success" plain :loading="repairExportLoading"
@click="handleExportRepair">导出</el-button>
</el-form-item>
</el-form>
<el-empty v-if="!repairGroups.length" />
<el-collapse v-else v-model="repairActiveNames" class="device-ledger-repair-collapse">
<el-collapse-item v-for="group in repairGroups" :key="group.key" :name="group.key">
@ -149,16 +138,31 @@
</div>
</template>
<div class="device-ledger-history-items">
<div v-for="row in group.items" :key="String(row.id ?? row.subjectId ?? row.subjectCode)" class="device-ledger-history-item">
<div v-for="row in group.items" :key="String(row.id ?? row.subjectId ?? row.subjectCode)"
class="device-ledger-history-item">
<div class="device-ledger-history-item-head">
<el-tag type="info" effect="light">{{ row.subjectCode ?? '-' }}</el-tag>
<span class="device-ledger-history-item-text">{{ row.subjectName ?? '-' }}</span>
</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-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-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-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-value">{{ row.remark ?? '-' }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">项目内容</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-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-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-value">{{
row.remark ?? '-' }}</span></div>
</div>
</div>
</div>
@ -166,23 +170,22 @@
</el-collapse>
</el-tab-pane>
<el-tab-pane label="保养记录" name="maintain">
<div class="device-ledger-tab-toolbar">
<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"
class="mr-10px"
/>
<el-button type="primary" plain @click="handleQueryMaintain"></el-button>
<el-button @click="handleResetMaintain"></el-button>
<el-button type="success" plain :loading="maintainExportLoading" @click="handleExportMaintain"></el-button>
</div>
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="时间">
<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"
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="success" plain :loading="maintainExportLoading"
@click="handleExportMaintain">导出</el-button>
</el-form-item>
</el-form>
<el-empty v-if="!maintainStepGroups.length" />
<el-steps v-else direction="vertical" :active="maintainStepGroups.length" class="device-ledger-history-steps">
<el-steps v-else direction="vertical" :active="maintainStepGroups.length"
class="device-ledger-history-steps">
<el-step v-for="group in maintainStepGroups" :key="group.key">
<template #title>
<div class="device-ledger-history-title">
@ -198,10 +201,20 @@
<span class="device-ledger-history-item-text">{{ item.name }}</span>
</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-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-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-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-value">{{ item.remark ?? '-' }}</span></div>
<div class="device-ledger-history-item-row"><span
class="device-ledger-history-item-label">保养方式</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-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-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-value">{{ item.remark ?? '-' }}</span></div>
</div>
</div>
</div>
@ -210,21 +223,33 @@
</el-steps>
</el-tab-pane>
<el-tab-pane label="安装记录" name="install">
<el-form :inline="true" class="device-ledger-tab-toolbar">
<el-form-item label="模具"><el-select v-model="installMoldId" filterable clearable placeholder="选择模具"
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
@keyup.enter="handleQueryInstall" /></el-form-item>
<el-form-item label="时间">
<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" />
</el-form-item>
<el-form-item>
<el-button type="primary" plain @click="handleQueryInstall"></el-button>
<el-button @click="handleResetInstall"></el-button>
</el-form-item>
</el-form>
<el-table :data="installRecords" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="操作类型" min-width="100">
<template #default="scope">
{{ scope.row.operateType === '1' ? '上模' : scope.row.operateType === '2' ? '下模' : '-' }}
</template>
</el-table-column>
<el-table-column label="模具名称" prop="moldName" min-width="150" />
<el-table-column label="设备" prop="deviceName" min-width="120" />
<el-table-column label="操作人" prop="creatorName" min-width="100" />
<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">
<el-table-column label="操作时间" 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="暂无安装记录" />
<Pagination :total="installTotal" v-model:page="installPageNo" v-model:limit="installPageSize"
@pagination="fetchInstallRecords" />
</el-tab-pane>
</el-tabs>
</div>
@ -243,11 +268,13 @@ import { MoldBrandApi, type MoldBrandVO } from '@/api/erp/mold'
import { TicketManagementApi } from '@/api/mold/ticketManagement'
import { MoldRepairApi } from '@/api/mold/moldrepair'
import { MoldOperateApi } from '@/api/mes/moldoperate'
import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue'
defineOptions({ name: 'ErpMoldBrandDetail' })
const message = useMessage()
const route = useRoute()
const router = useRouter()
const MoldListComp = defineAsyncComponent(() => import('../components/MoldList.vue') as any)
const brandId = computed(() => Number(route.params.id))
const detailLoading = ref(false)
@ -258,6 +285,12 @@ const inspectionHistory = ref<any[]>([])
const maintainHistory = ref<any[]>([])
const repairList = ref<any[]>([])
const installRecords = ref<any[]>([])
const installTotal = ref(0)
const installPageNo = ref(1)
const installPageSize = ref(10)
const installMoldId = ref<number | undefined>()
const installRemark = ref<string | undefined>()
const installDateRange = ref<string[] | undefined>()
const repairActiveNames = ref<string[]>([])
const inspectionDateRange = ref<string[] | undefined>()
const maintainDateRange = ref<string[] | undefined>()
@ -399,6 +432,26 @@ const repairGroups = computed(() => {
return Array.from(groupsMap.values())
})
const getQrcodeRefreshUrl = () => {
if (!detailData.value?.id || !detailData.value?.code) return ''
return `/erp/mold-brand/regenerate-code?id=${detailData.value.id}&code=${encodeURIComponent(String(detailData.value.code))}`
}
const handleQrcodeRefreshSuccess = async (data: any) => {
if (!detailData.value?.id) return
if (data?.qrcodeUrl) {
detailData.value.qrcodeUrl = data.qrcodeUrl
return
}
const moldData = await MoldBrandApi.getMoldBrand(detailData.value.id)
detailData.value.qrcodeUrl = moldData?.qrcodeUrl
detailData.value.code = moldData?.code ?? detailData.value.code
}
const goBack = () => {
router.push('/mold/mold-brand')
}
const handleReservedAction = (action: string) => {
message.info(`${action}功能预留中`)
}
@ -473,10 +526,29 @@ const fetchRepairHistory = async () => {
}
const fetchInstallRecords = async () => {
installRecords.value = await collectByChildMolds(async (moldId) => {
const data = await MoldOperateApi.getMoldOperatePage({ pageNo: 1, pageSize: 100, moldId })
return data?.list ?? []
})
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]]
}
const data = await MoldOperateApi.getMoldOperatePage(params)
installRecords.value = data?.list ?? []
installTotal.value = data?.total ?? 0
}
const handleQueryInstall = () => {
installPageNo.value = 1
fetchInstallRecords()
}
const handleResetInstall = () => {
installMoldId.value = undefined
installRemark.value = undefined
installDateRange.value = undefined
installPageNo.value = 1
fetchInstallRecords()
}
const handleQueryInspection = async () => {
@ -510,7 +582,7 @@ const handleExportMaintain = async () => {
}
const handleQueryRepair = async () => {
await fetchRepairHistory()
await fetchRepairHistory()
}
const handleResetRepair = async () => {
@ -668,9 +740,6 @@ onMounted(() => {
}
.device-ledger-tab-toolbar {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 16px;
}

@ -113,19 +113,23 @@
/>
</ContentWrap>
<el-dialog v-model="qrcodeVisible" title="模具二维码" width="360px">
<div class="mold-brand-page__qrcode-wrap">
<el-image
v-if="currentQrcodeUrl"
:src="currentQrcodeUrl"
:preview-src-list="[currentQrcodeUrl]"
fit="contain"
preview-teleported
class="mold-brand-page__qrcode"
/>
<el-empty v-else description="暂无二维码" />
</div>
</el-dialog>
<Dialog v-model="qrcodeVisible" title="模具二维码" width="360px">
<QrcodeActionCard
:image-url="currentQrcodeRow?.qrCodeUrl"
:print-id="currentQrcodeRow?.id"
:print-template-type="4"
:print-title="`${currentQrcodeRow?.name || '模具'}码打印预览`"
:print-paper-width="80"
:print-paper-height="80"
:print-max-width="220"
empty-text="暂无二维码"
error-text="二维码加载失败"
:refresh-url="getQrcodeRefreshUrl()"
:refresh-disabled="!currentQrcodeRow?.id || !currentQrcodeRow?.code"
refresh-confirm-text="确认刷新该模具二维码吗?"
@refresh-success="handleQrcodeRefreshSuccess"
/>
</Dialog>
<component :is="MoldBrandFormComp" ref="formRef" @success="getList" />
</template>
@ -138,6 +142,7 @@ import { DeviceLedgerApi, type DeviceLedgerVO } from '@/api/mes/deviceledger'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue'
defineOptions({ name: 'MoldBrand' })
@ -151,7 +156,7 @@ const productOptions = ref<ProductVO[]>([])
const deviceOptions = ref<DeviceLedgerVO[]>([])
const currentStatusKey = ref('all')
const qrcodeVisible = ref(false)
const currentQrcodeUrl = ref('')
const currentQrcodeRow = ref<MoldBrandVO | null>(null)
const statusOptions = computed(() => getIntDictOptions(DICT_TYPE.ERP_MOLD_STATUS))
const counters = reactive({
allCount: 0,
@ -273,10 +278,26 @@ const handleReservedAction = (action: string) => {
}
const previewQrcode = (row: MoldBrandVO) => {
currentQrcodeUrl.value = row.qrCodeUrl || ''
currentQrcodeRow.value = row
qrcodeVisible.value = true
}
const getQrcodeRefreshUrl = () => {
if (!currentQrcodeRow.value?.id || !currentQrcodeRow.value?.code) return ''
return `/erp/mold-brand/regenerate-code?id=${currentQrcodeRow.value.id}&code=${encodeURIComponent(String(currentQrcodeRow.value.code))}`
}
const handleQrcodeRefreshSuccess = async (data: any) => {
if (!currentQrcodeRow.value?.id) return
if (data?.qrcodeUrl) {
currentQrcodeRow.value.qrCodeUrl = data.qrcodeUrl
return
}
const moldData = await MoldBrandApi.getMoldBrand(currentQrcodeRow.value.id)
currentQrcodeRow.value.qrCodeUrl = moldData?.qrCodeUrl
currentQrcodeRow.value.code = moldData?.code ?? currentQrcodeRow.value.code
}
const openDetail = (id: number) => {
push({ name: 'ErpMoldBrandDetail', params: { id } })
}

@ -338,6 +338,7 @@ const openDetail = (id: number) => {
}
.device-ledger-tab-toolbar {
display: flex;
margin-bottom: 8px;
text-align: right;
}

Loading…
Cancel
Save