feat:模具组-维护模块

main
黄伟杰 5 days ago
parent 8769d1e5af
commit 7e606054b0

@ -8,8 +8,8 @@ VITE_DEV=true
# 线上环境
# VITE_BASE_URL='https://besure.ngsk.tech:7001'
# 本地联调
VITE_BASE_URL='http://192.168.5.106:48081'
# VITE_BASE_URL='http://192.168.5.164:48081'
VITE_BASE_URL='http://192.168.5.160:48081'
# VITE_BASE_URL='http://192.168.43.233:48081'
# VITE_BASE_URL='http://192.168.5.5:48081'

@ -0,0 +1,121 @@
style产品物料信息-新增/编辑-编码输入框大小调整
feat仓库信息-添加详情弹框
feat库区信息/库位信息-新增页面
style任务单排产-排产甘特图样式优化
style甘特图菜单样式调整
style甘特图适配中英文
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style生产报表页面适配中英文
style出库单据-默认展示tabs修改
style生产报表-质检信息字段调整
style任务单排产-create-batch接口添加领料人/是否计算损耗入参
style生产计划/任务单排产生产报表-进度条样式修改
style生产计划-检验明细添加分页
feat生产报表-质检信息对接
feat甘特图菜单页添加刷新按钮
style任务单排产-进度条样式修改
feat甘特图菜单页-添加排产看板
style生产计划-检验按钮保存后刷新列表
style检验记录-新增/编辑-生产计划选项框调整
style检验记录-编辑添加显示判断
style检验模板-新增/编辑-检验方案添加productId传参
style任务单排产-任务单明细-是否计算损耗字段
style检验模板-编辑回显
style任务单排产-任务单明细-新增计划添加领料人、是否完成质检字段
style生产报表-报工信息-添加日期筛选条件
style生产报表-列表添加刷新按钮
style生产报表-基础信息-查看产品信息字段修改
feat生产计划-已开工-检验按钮逻辑修改
style修复甘特图保存后弹框报错
style生产投料-数量不填的默认为0
style产品物料信息-设备-所属车间字段更改
feat检验模板-添加关联产品
style产品物料信息-关联设备选项接口添加deviceStatus=0入参
style产品物料信息-状态字段位置更改
style任务制单-技术要求、备注样式修改
style任务制单-明细-编辑-打包数量字段自动填充
style产品物料信息-去掉字段:采购价格、最低价格、销售价格
style产品BOM-产品BOM明细-单位自动带入
style生产计划-添加“所有”tabs
style甘特图菜单添加设备筛选框
style排产甘特图日期调整
feat菜单甘特图页面/一键排查-甘特图拆开两个组件
style排产弹框-任务单汇总明细-未计划数为0的不能勾选
style排产弹框适配中英文
style检验记录-新增添加单号自动生成
style产品BOM-产品筛选框接口更改
style任务单排产-排产弹框样式调整
style任务制单-父列表项的status值为2,7,8,9,10时子列表不展示编辑和删除按钮
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style任务单排产-生产进度条样式修改
feat添加生产报表页面
style生产计划-暂停状态操作栏添加开工按钮
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style厂区结构-关联采集设备字段回显
feat待入库-入库按钮添加仓库选择
style厂区结构-新增/编辑-关联采集设备选项接口更换
feat甘特图添加颜色区分
feat添加报工记录页面
style甘特图菜单页添加每日报工平均值、数据采集产能字段
style甘特图显示样式优化
style任务单排产-新增-计划开始、计划结束、最晚开工时间添加时分秒
style任务制单-新增-交货日期不能选往日
style任务单排产-添加生产进度条
style任务制单-tabs项更换
style任务单排产-新增计划-数量值添加校验(不能大于未计划数量)
style甘特图tooltip隐藏逻辑优化
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style修改任务单排产-新增计划及生产计划详情字段
style任务制单-任务单明细-新增按钮显示逻辑修改
style任务单排产-tabs更换
style任务单排产-未计划为0的不显示新增计划按钮
style任务制单-任务单明细-新增按钮显示逻辑修改
style生产计划-报工后刷新报工记录列表
style生产计划-详情弹框字段与排产的新增计划弹框字段同步
style生产投料-新增-生产计划status值修改
style删除甘特图菜单无用代码
feat甘特图组件封装
style生产计划列表添加任务编码
style产品BOM-编辑-bomDetails集合里不传createTime字段
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style排产甘特图样式优化
style排产弹框-添加是否跳过节假日switch
style排产甘特图样式调整
style检验记录-编辑-ticketType回显
style检验记录-生产计划传参修改
style任务单排产-关联设备保存后刷新列表
feat排产弹框-新增设备名称列/关联设备按钮
feat生产计划-添加已开工tabs
style任务单排产-新增计划-计划开始时间不能晚于结束时间
style设备台账-是否排产勾选后展示额定产能、每日报工平均值、数据采集产能
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style处理设备台账代码合并问题
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style甘特图查询时间默认本月
feat新增甘特图页面
style任务单排产-排产弹框-复选框逻辑优化
style任务单排产-甘特图样式修改
style任务单排产-一键排查接口字段调整
style任务单排产字段调整
style甘特图样式修改
style任务单排产-新增计划-taskDetailId传参调整
style产品物料信息-新增/编辑-设备列表添加已排产过滤
style排产接口入参添加产品编码
feat甘特图弹框抽离组件
style任务单排产-甘特图保存字段调整
style生产计划-甘特图样式修改
feat添加甘特图预览
style设备台账-新增/编辑-是否排产字段修改
style产品物料信息-阻止表单原生事件
style设备台账-是否排产字段修改
feat任务单排产-列表表头调整、排产弹框对接
style表管理-计算规则添加文案提示
feat采集设备-点位规则添加四则运算规则
style采集设备-添加新增产量按钮
style任务单排产-新增计划刷新列表
Merge branch 'main' of https://git.ngsk.tech/linweidong/besure_web
style任务单排产-列表添加“是否完成排产”列
style产品BOM-新增-清除单位默认值
feat任务制单-添加是否急单字段
feat产品管理-产品物料信息-产品分类时添加关联设备、关联模具字段
feat设备台账-添加是否排产、额定产能字段状态改成switch切换

@ -2852,6 +2852,8 @@ export default {
MoldRepair: {
moduleName: 'Mold Repair',
basicInfo: 'Basic Information',
faultInfo: 'Fault Information',
repairCode: 'Repair Order No',
repairName: 'Repair Order',
mold: 'Mold',

@ -2359,6 +2359,8 @@ export default {
MoldRepair: {
moduleName: '维修单',
basicInfo: '基本信息',
faultInfo: '故障信息',
repairCode: '维修单号',
repairName: '维修单',
mold: '模具',

@ -0,0 +1,738 @@
<template>
<div class="mold-maintain-page">
<div class="mold-maintain-page__header">
<el-button @click="emit('back')">
<Icon icon="ep:arrow-left" class="mr-5px" /> {{ t('MoldManagement.MoldBrandPage.back') }}
</el-button>
</div>
<div class="mold-maintain-page__body">
<!-- 左侧模具信息区域 -->
<div class="mold-maintain-page__sidebar" v-if="mold">
<div class="mold-maintain-page__info-card">
<div class="mold-maintain-page__info-header">
<span class="mold-maintain-page__info-num">1</span>
<span class="mold-maintain-page__info-title">{{ t('MoldManagement.MoldBrandPage.moldInfo') }}</span>
</div>
<div class="mold-maintain-page__info-image-wrap">
<el-image v-if="getImageList(mold.images).length" :src="getImageList(mold.images)[0]"
fit="cover" class="mold-maintain-page__info-image" />
<el-empty v-else :description="t('MoldManagement.MoldBrandDetail.noImage')" />
</div>
<div class="mold-maintain-page__info-item">
<span class="mold-maintain-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldCode') }}</span>
<span class="mold-maintain-page__info-value">{{ mold.code }}</span>
</div>
<div class="mold-maintain-page__info-item">
<span class="mold-maintain-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldName') }}</span>
<span class="mold-maintain-page__info-value">{{ mold.name }}</span>
</div>
<div class="mold-maintain-page__info-item">
<span class="mold-maintain-page__info-label">{{ t('MoldManagement.MoldBrandPage.productName') }}</span>
<span class="mold-maintain-page__info-value">{{ mold.productName }}</span>
</div>
<div class="mold-maintain-page__info-item">
<span class="mold-maintain-page__info-label">{{ t('MoldManagement.MoldBrandPage.moldSize') }}</span>
<span class="mold-maintain-page__info-value">{{ mold.moldSize }}</span>
</div>
<div class="mold-maintain-page__info-item">
<span class="mold-maintain-page__info-label">{{ t('MoldManagement.MoldBrandPage.status') }}</span>
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="mold.status" />
</div>
<div class="mold-maintain-page__info-item">
<span class="mold-maintain-page__info-label">{{ t('MoldManagement.MoldBrandPage.currentDevice') }}</span>
<span class="mold-maintain-page__info-value">{{ mold.currentDevice || '-' }}</span>
</div>
</div>
</div>
<!-- 右侧表单区域 -->
<div class="mold-maintain-page__form">
<div class="mold-maintain-page__form-header">
<span class="mold-maintain-page__info-num">2</span>
<span class="mold-maintain-page__info-title">{{ t('MoldManagement.MoldBrandPage.maintainInfo') }}</span>
</div>
<el-form ref="maintainFormRef" :model="formModel" :rules="formRules" label-width="100px">
<!-- 维护类型 -->
<el-form-item :label="t('MoldManagement.MoldBrandPage.maintainType')" prop="maintainType">
<div class="mold-maintain-type-card">
<div
v-for="type in maintainTypes"
:key="type.value"
class="mold-maintain-type-card__item"
:class="{ 'is-active': maintainFormData.maintainType === type.value }"
@click="selectMaintainType(type.value)"
>
<div class="mold-maintain-type-card__icon">
<el-icon :size="26">
<component :is="type.icon" />
</el-icon>
</div>
<span class="mold-maintain-type-card__label">{{ type.label }}</span>
</div>
</div>
</el-form-item>
<!-- 点检/保养表单 -->
<template v-if="isInspectOrMaintain">
<el-form-item :label="t('EquipmentManagement.TaskManagement.name')" prop="name">
<el-input v-model="taskFormData.name" :placeholder="t('EquipmentManagement.TaskManagement.placeholderName')" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.projectForm')" prop="projectForm">
<el-select
v-model="taskFormData.projectForm"
multiple
filterable
clearable
:placeholder="t('EquipmentManagement.TaskManagement.placeholderProjectForm')"
class="!w-full"
>
<el-option v-for="item in planOptions" :key="String(item.id)" :label="item.planName" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.dateRange')" prop="dateRange">
<el-date-picker
v-model="taskFormData.dateRange"
value-format="YYYY-MM-DD"
type="daterange"
:start-placeholder="t('EquipmentManagement.TaskManagement.placeholderStartDate')"
:end-placeholder="t('EquipmentManagement.TaskManagement.placeholderEndDate')"
class="!w-320px"
/>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.cronExpression')" prop="cronExpression">
<template #label>
<Tooltip
title="Cron 表达式"
message="可以通过AI生成AI提示词举例帮我生成一个周一早上 9 点执行的 Cron 表达式"
/>
</template>
<crontab v-model="taskFormData.cronExpression" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.operableUsers')" prop="operableUsers">
<el-select
v-model="taskFormData.operableUsers"
multiple
filterable
clearable
:placeholder="t('EquipmentManagement.TaskManagement.placeholderOperableUsers')"
class="!w-full"
>
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.enabled')" prop="enabled">
<el-radio-group v-model="taskFormData.enabled">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)" :key="String(dict.value)"
:label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</template>
<!-- 维修表单 -->
<template v-if="isRepair">
<section class="dv-repair-section">
<div class="dv-repair-section__title">{{ t('MoldManagement.MoldRepair.basicInfo') }}</div>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.repairCode')" prop="repairCode">
<div class="dv-repair-code-row">
<el-input
:disabled="repairCodeDisabled"
v-model="repairFormData.repairCode"
:placeholder="t('common.code')"
/>
<el-switch
v-model="repairFormData.isCode"
/>
</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.repairName')" prop="repairName">
<el-input
v-model="repairFormData.repairName"
:placeholder="t('MoldManagement.MoldRepair.placeholderRepairName')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.requireDate')" prop="requireDate">
<el-date-picker
v-model="repairFormData.requireDate"
type="date"
value-format="x"
:placeholder="t('MoldManagement.MoldRepair.placeholderRequireDate')"
class="!w-full"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.repairUser')" prop="acceptedBy">
<el-select
v-model="repairFormData.acceptedBy" filterable clearable
:placeholder="t('MoldManagement.MoldRepair.placeholderAcceptUser')"
class="!w-full">
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.confirmUser')" prop="confirmBy">
<el-select
v-model="repairFormData.confirmBy" filterable clearable
:placeholder="t('MoldManagement.MoldRepair.placeholderConfirmUser')"
class="!w-full">
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.faultLevel')" prop="faultLevel">
<el-radio-group v-model="repairFormData.faultLevel">
<el-radio
v-for="dict in failureLevelOptions"
:key="String(dict.value)"
:label="String(dict.value)"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="t('MoldManagement.MoldRepair.isShutdown')" prop="shutdown">
<el-radio-group v-model="repairFormData.shutdown">
<el-radio :label="true">{{ t('common.yes') }}</el-radio>
<el-radio :label="false">{{ t('common.no') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</section>
<section class="dv-repair-section">
<div class="dv-repair-section__title">{{ t('MoldManagement.MoldRepair.faultInfo') }}</div>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item :label="t('MoldManagement.MoldRepair.faultPhenomenon')" prop="faultPhenomenon">
<el-input
v-model="repairFormData.faultPhenomenon"
:placeholder="t('MoldManagement.MoldRepair.placeholderFaultPhenomenon')"
/>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldRepair.faultDescription')" prop="faultDescription">
<el-input
v-model="repairFormData.faultDescription"
type="textarea"
:rows="4"
:placeholder="t('MoldManagement.MoldRepair.placeholderFaultDescription')"
/>
</el-form-item>
</el-col>
</el-row>
</section>
<section class="dv-repair-section">
<div class="dv-repair-section__title">{{ t('MoldManagement.MoldRepair.remark') }}</div>
<el-form-item prop="remark" label-width="0">
<el-input
v-model="repairFormData.remark"
type="textarea"
:rows="3"
maxlength="300"
show-word-limit
:placeholder="t('MoldManagement.MoldRepair.placeholderRemark')"
/>
</el-form-item>
</section>
</template>
<!-- 更换压网表单 -->
<template v-if="isReplaceNet">
<el-form-item :label="t('MoldManagement.MoldBrandPage.replaceNetRemark')" prop="replaceNetRemark">
<el-input
v-model="replaceNetFormData.remark"
type="textarea"
:rows="4"
:placeholder="t('MoldManagement.MoldBrandPage.placeholderReplaceNetRemark')"
/>
</el-form-item>
</template>
</el-form>
<div class="mold-maintain-page__form-actions">
<el-button @click="emit('back')">{{ t('MoldManagement.MoldBrandPage.cancel') }}</el-button>
<el-button type="primary" @click="submitForm" :loading="submitLoading">{{ t('MoldManagement.MoldBrandPage.submit') }}</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, computed, watch } from 'vue'
import { EditPen, RefreshRight, Search, Tools } from '@element-plus/icons-vue'
import { MoldBrandApi, type MoldBrandVO } from '@/api/erp/mold'
import { DeviceLedgerApi, type DeviceLedgerVO } from '@/api/mes/deviceledger'
import { TaskManagementApi, type TaskManagementVO } from '@/api/mold/taskManagement'
import { MoldRepairApi, type MoldRepairVO } from '@/api/mold/moldrepair'
import { PlanMaintenanceApi } from '@/api/mold/planmaintenance'
import { getSimpleUserList, type UserVO } from '@/api/system/user'
import { DICT_TYPE, getBoolDictOptions, getStrDictOptions } from '@/utils/dict'
import { Tooltip } from '@/components/Tooltip'
defineOptions({ name: 'MoldMaintainView' })
const props = defineProps<{
mold: MoldBrandVO | null
deviceOptions: DeviceLedgerVO[]
}>()
const emit = defineEmits<{
(e: 'back'): void
(e: 'success'): void
}>()
const { t } = useI18n()
const message = useMessage()
const submitLoading = ref(false)
const maintainFormRef = ref()
//
const formRules = reactive({
maintainType: [{ required: true, message: t('MoldManagement.MoldBrandPage.placeholderMaintainType'), trigger: 'change' }],
// /
name: [{ required: true, message: t('EquipmentManagement.TaskManagement.placeholderName'), trigger: 'blur' }],
taskType: [{ required: true, message: t('EquipmentManagement.TaskManagement.placeholderTaskType'), trigger: 'change' }],
projectForm: [{ required: true, message: t('EquipmentManagement.TaskManagement.placeholderProjectForm'), trigger: 'change' }],
dateRange: [{ required: true, message: t('EquipmentManagement.TaskManagement.placeholderDateRange'), trigger: 'change' }],
enabled: [{ required: true, message: t('EquipmentManagement.TaskManagement.placeholderEnabled'), trigger: 'change' }],
//
repairName: [{ required: true, message: t('MoldManagement.MoldRepair.validatorRepairNameRequired'), trigger: 'blur' }],
requireDate: [{ required: true, message: t('MoldManagement.MoldRepair.validatorRequireDateRequired'), trigger: 'change' }],
faultLevel: [{ required: true, message: t('MoldManagement.MoldRepair.validatorFaultLevelRequired'), trigger: 'change' }],
shutdown: [{ required: true, message: t('MoldManagement.MoldRepair.validatorIsShutdownRequired'), trigger: 'change' }],
faultPhenomenon: [{ required: true, message: t('MoldManagement.MoldRepair.validatorFaultPhenomenonRequired'), trigger: 'blur' }],
})
// el-form
const formModel = computed(() => ({
maintainType: maintainFormData.maintainType,
name: taskFormData.name,
taskType: taskFormData.taskType,
projectForm: taskFormData.projectForm,
dateRange: taskFormData.dateRange,
enabled: taskFormData.enabled,
repairName: repairFormData.repairName,
requireDate: repairFormData.requireDate,
faultLevel: repairFormData.faultLevel,
shutdown: repairFormData.shutdown,
faultPhenomenon: repairFormData.faultPhenomenon,
}))
//
const maintainFormData = reactive({
maintainType: 1 as number
})
// /
const taskFormData = reactive({
name: undefined as string | undefined,
taskType: 1 as number,
projectForm: [] as string[],
dateRange: [] as string[],
cronExpression: undefined as string | undefined,
operableUsers: [] as string[],
enabled: true as boolean
})
//
const repairFormData = reactive({
repairCode: undefined as string | undefined,
repairName: undefined as string | undefined,
requireDate: undefined as string | undefined,
acceptedBy: undefined as string | undefined,
confirmBy: undefined as string | undefined,
faultLevel: undefined as string | undefined,
shutdown: undefined as boolean | undefined,
faultPhenomenon: undefined as string | undefined,
faultDescription: undefined as string | undefined,
remark: undefined as string | undefined,
isCode: true as boolean
})
//
const replaceNetFormData = reactive({
remark: undefined as string | undefined
})
//
const isInspectOrMaintain = computed(() => [1, 2].includes(maintainFormData.maintainType ?? 0))
const isRepair = computed(() => maintainFormData.maintainType === 3)
const isReplaceNet = computed(() => maintainFormData.maintainType === 4)
const repairCodeDisabled = computed(() => repairFormData.isCode === true)
const failureLevelOptions = computed(() => getStrDictOptions(DICT_TYPE.FAILURE_LEVEL))
//
const maintainTypes = computed(() => [
{ value: 1, label: t('MoldManagement.MoldBrandPage.maintainTypeInspect'), icon: Search },
{ value: 2, label: t('MoldManagement.MoldBrandPage.maintainTypeMaintain'), icon: Tools },
{ value: 3, label: t('MoldManagement.MoldBrandPage.maintainTypeRepair'), icon: EditPen },
{ value: 4, label: t('MoldManagement.MoldBrandPage.maintainTypeReplaceNet'), icon: RefreshRight }
])
//
const planOptions = ref<{ id: number | string; planName: string }[]>([])
const users = ref<UserVO[]>([])
const getImageList = (images?: string) => {
if (!images) return []
return String(images)
.split(',')
.map((item) => item.trim())
.filter(Boolean)
}
const parseIdsValue = (value: any): string[] => {
if (!value) return []
if (Array.isArray(value)) return value.map((v) => String(v).trim()).filter(Boolean)
return String(value)
.split(',')
.map((v) => v.trim())
.filter(Boolean)
}
const toCommaSeparatedIds = (value: any): string | undefined => {
const ids = parseIdsValue(value)
return ids.length ? ids.join(',') : undefined
}
const initOptions = async () => {
const [planRes, userRes] = await Promise.all([
PlanMaintenanceApi.getPlanMaintenancePage({}),
getSimpleUserList()
])
planOptions.value = (planRes?.list ?? []) as { id: number | string; planName: string }[]
users.value = userRes ?? []
}
const handleMaintainTypeChange = () => {
//
if (isInspectOrMaintain.value) {
taskFormData.name = undefined
taskFormData.taskType = maintainFormData.maintainType
taskFormData.projectForm = []
taskFormData.dateRange = []
taskFormData.cronExpression = undefined
taskFormData.operableUsers = []
taskFormData.enabled = true
} else if (isRepair.value) {
repairFormData.repairCode = undefined
repairFormData.repairName = undefined
repairFormData.requireDate = undefined
repairFormData.acceptedBy = undefined
repairFormData.confirmBy = undefined
repairFormData.faultLevel = undefined
repairFormData.shutdown = undefined
repairFormData.faultPhenomenon = undefined
repairFormData.faultDescription = undefined
repairFormData.remark = undefined
repairFormData.isCode = true
} else if (isReplaceNet.value) {
replaceNetFormData.remark = undefined
}
}
const selectMaintainType = (type: number) => {
maintainFormData.maintainType = type
handleMaintainTypeChange()
}
const submitForm = async () => {
//
try {
await maintainFormRef.value?.validate()
} catch {
return
}
submitLoading.value = true
try {
if (isInspectOrMaintain.value) {
// /
const [startDate, endDate] = Array.isArray(taskFormData.dateRange) ? taskFormData.dateRange : []
const payload: TaskManagementVO = {
name: taskFormData.name,
taskType: taskFormData.taskType,
moldList: props.mold?.id ? String(props.mold.id) : undefined,
projectForm: toCommaSeparatedIds(taskFormData.projectForm),
startDate: startDate || undefined,
endDate: endDate || undefined,
cronExpression: taskFormData.cronExpression,
operableUsers: toCommaSeparatedIds(taskFormData.operableUsers),
enabled: taskFormData.enabled
}
await TaskManagementApi.createTaskManagement(payload)
message.success(t('common.createSuccess'))
} else if (isRepair.value) {
//
const payload: any = {
repairCode: repairFormData.isCode ? undefined : repairFormData.repairCode,
repairName: repairFormData.repairName,
moldId: props.mold?.id,
requireDate: repairFormData.requireDate,
acceptedBy: repairFormData.acceptedBy,
confirmBy: repairFormData.confirmBy,
faultLevel: repairFormData.faultLevel,
shutdown: repairFormData.shutdown,
faultPhenomenon: repairFormData.faultPhenomenon,
faultDescription: repairFormData.faultDescription,
remark: repairFormData.remark
}
await MoldRepairApi.createMoldRepair(payload)
message.success(t('common.createSuccess'))
} else if (isReplaceNet.value) {
//
message.success(t('common.createSuccess'))
}
emit('success')
} catch (error) {
console.error(t('MoldManagement.MoldBrandPage.submitFailed'), error)
} finally {
submitLoading.value = false
}
}
const open = async () => {
maintainFormData.maintainType = 1
await initOptions()
}
defineExpose({ open })
</script>
<style scoped>
.mold-maintain-page__header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.mold-maintain-page__info-card {
display: flex;
flex-direction: column;
gap: 16px;
padding: 20px;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
flex: 1;
}
.mold-maintain-page__info-header,
.mold-maintain-page__form-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 4px;
}
.mold-maintain-page__info-num {
display: inline-flex;
align-items: center;
justify-content: center;
width: 22px;
height: 22px;
border-radius: 50%;
background: var(--el-color-primary);
color: #fff;
font-size: 12px;
font-weight: 600;
flex-shrink: 0;
}
.mold-maintain-page__info-title {
font-size: 15px;
font-weight: 600;
color: var(--el-text-color-primary);
}
.mold-maintain-page__info-image-wrap {
display: flex;
justify-content: left;
}
.mold-maintain-page__info-image {
width: 120px;
height: 120px;
border-radius: 8px;
border: 1px solid var(--el-border-color-lighter);
}
.mold-maintain-page__info-empty {
width: 120px;
height: 120px;
border-radius: 8px;
border: 1px dashed var(--el-border-color-lighter);
}
.mold-maintain-page__info-item {
display: flex;
align-items: center;
gap: 8px;
}
.mold-maintain-page__info-label {
color: var(--el-text-color-secondary);
font-size: 13px;
white-space: nowrap;
flex-shrink: 0;
width: 90px;
text-align: left;
}
.mold-maintain-page__info-value {
color: var(--el-text-color-primary);
font-size: 14px;
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
text-align: left;
}
.mold-maintain-page__body {
display: flex;
gap: 20px;
align-items: stretch;
}
.mold-maintain-page__sidebar {
width: 20vw;
flex-shrink: 0;
display: flex;
}
.mold-maintain-page__form {
flex: 1;
background: #fff;
border-radius: 12px;
padding: 24px 32px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
}
:deep(.el-form-item__label) {
white-space: nowrap;
}
.mold-maintain-page__form-actions {
display: flex;
justify-content: flex-end;
gap: 12px;
margin-top: 24px;
padding-top: 16px;
border-top: 1px solid var(--el-border-color-lighter);
}
.dv-repair-section {
margin-bottom: 20px;
padding: 16px;
background: #f8f9fa;
border-radius: 8px;
}
.dv-repair-section__title {
font-size: 14px;
font-weight: 600;
color: #303133;
margin-bottom: 16px;
padding-left: 8px;
border-left: 3px solid #409eff;
}
.dv-repair-label {
display: inline-flex;
gap: 4px;
align-items: center;
&.is-required::before {
color: var(--el-color-danger);
content: '*';
}
}
.dv-repair-code-row {
display: flex;
gap: 10px;
align-items: center;
}
/* 维护类型卡片样式 */
.mold-maintain-type-card {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.mold-maintain-type-card__item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100px;
height: 100px;
border-radius: 12px;
border: 2px solid var(--el-border-color-lighter);
cursor: pointer;
transition: all 0.25s ease;
background: #fff;
&:hover {
border-color: var(--el-color-primary);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
&.is-active {
border-color: var(--el-color-primary);
background: rgba(64, 158, 255, 0.06);
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2);
}
}
.mold-maintain-type-card__icon {
width: 44px;
height: 44px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
color: var(--el-color-primary);
background: var(--el-color-primary-light-9);
transition: transform 0.25s ease;
.mold-maintain-type-card__item:hover & {
transform: scale(1.1);
}
}
.mold-maintain-type-card__label {
font-size: 14px;
color: var(--el-text-color-primary);
font-weight: 500;
}
.mold-maintain-type-card__item.is-active .mold-maintain-type-card__label {
color: var(--el-color-primary);
}
</style>
Loading…
Cancel
Save