bonus-ui/src/views/EquipmentEntryApply/equipmentInput/add.vue

544 lines
16 KiB
Vue
Raw Normal View History

2025-09-25 19:20:00 +08:00
<template>
<!-- 弹窗内容区域 -->
<div class="app-container" style="height: calc(100vh - 84px);overflow-y:unset">
<div class="page-header">
<div>
<i class="el-icon-arrow-left goBack-btn" @click="goBack"
style="border-color: transparent;color: #00a288;background: transparent;padding-left: 0;padding-right: 0;"
>返回</i>
<span class="page-title">新增装备</span>
</div>
<div class="dialog-footer" style="float: right">
<el-button size="medium" @click="goBack">取消</el-button>
<el-button type="primary" size="medium" @click="handleSubmit">确认</el-button>
</div>
</div>
<el-form
label-width="110px"
ref="formRef"
style="padding: 12px;overflow-y: auto;height: calc(100vh - 180px);width: 100%"
label-position="right"
:model="form"
:rules="equipRules"
>
<div style="display:flex;padding-bottom: 5px">
<div style="width: 5px;background-color: #00a288;margin-right: 10px"></div>
基础信息
</div>
<el-row :gutter="24" style="padding-top: 10px">
<el-col :span="6">
<el-form-item label="专业" prop="major">
<el-select v-model="form.major" placeholder="请选择专业" @change="majorChange" style="width: 100%"
clearable
>
<el-option
v-for="item in majorList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="工序" prop="process">
<el-cascader style="width: 100%" clearable
v-model="form.process"
placeholder="请选择工序"
:options="processList"
@change="processChange"
></el-cascader>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="装备类目" prop="category">
<el-cascader style="width: 100%" clearable
v-model="form.category"
:options="categoryList"
placeholder="请选择装备类目"
@change="categoryChange"
></el-cascader>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="装备名称" prop="deviceName">
<el-input
autocomplete="off"
maxlength="30"
placeholder="请输入装备名称"
v-model="form.deviceName"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="规格型号" prop="itemTypeModel">
<el-input
autocomplete="off"
maxlength="30"
v-model="form.itemTypeModel"
placeholder="请输入规格型号"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="资产原值" prop="buyPrice">
<el-input
@input="handlePriceInput"
autocomplete="off"
maxlength="20"
v-model="form.buyPrice"
placeholder="请输入资产原值"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="出厂日期" prop="productionDate">
<el-date-picker
v-model="form.productionDate"
placeholder="请选择出厂日期"
value-format="yyyy-MM-DD"
type="date"
style="width: 100%"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="生产厂家" prop="brand">
<el-input
v-model="form.brand"
autocomplete="off"
placeholder="请输入生产厂家"
maxlength="20"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="装备原始编码" prop="identifyCode">
<el-input
clearable
maxlength="20"
placeholder="请输入装备原始编码"
v-model="form.identifyCode"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="下次维保日期" prop="nextCheckTime">
<el-date-picker
v-model="form.nextCheckTime"
placeholder="请选择下次维保日期"
value-format="yyyy-MM-DD"
type="date"
style="width: 100%"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="装备寿命" prop="lifespan">
<el-input
clearable
maxlength="20"
placeholder="请输入装备寿命"
v-model="form.lifespan"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="管理模式" prop="deviceType">
<el-select
v-model="form.deviceType"
placeholder="请选择管理方式"
clearable
@change="deviceTypeChange"
style="width: 100%"
>
<el-option label="编码" :value="0"/>
<el-option label="数量" :value="1"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="装备数量" prop="deviceCount">
<el-input
v-model="form.deviceCount"
placeholder="请输入装备数量"
clearable
maxlength="10"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计数单位" prop="unitName">
<el-input
v-model="form.unitName"
placeholder="请输入计数单位"
clearable
maxlength="11"
/>
</el-form-item>
</el-col>
</el-row>
<div style="display:flex;padding-bottom: 10px">
<div style="width: 5px;background-color: #00a288;margin-right: 10px"></div>
特征属性
</div>
<el-row :gutter="24" style="padding-top: 10px">
<el-col :span="6">
<el-form-item label="专业特征" prop="specialtyFeature">
<el-input
autocomplete="off"
maxlength="30"
v-model="form.specialtyFeature"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="工序特征" prop="processFeature">
<el-input
autocomplete="off"
maxlength="30"
v-model="form.processFeature"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="类目特征" prop="categoryFeature">
<el-input
autocomplete="off"
maxlength="30"
v-model="form.categoryFeature"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<div style="display:flex;padding-bottom: 10px">
<div style="width: 5px;background-color: #00a288;margin-right: 10px"></div>
装备图片
</div>
<el-row :gutter="24" style="padding-top: 10px">
<el-col>
<el-form-item label="展示图" prop="mainFileList">
<ImageUpload
v-model="form.mainFileList"
:value="form.mainFileList"
:limit="6"
@change="handleImageChange"
/>
</el-form-item>
</el-col>
</el-row>
<div style="display:flex;padding-bottom: 10px">
<div style="width: 5px;background-color: #00a288;margin-right: 10px"></div>
相关证书
</div>
<el-row :gutter="24" style="padding-top: 10px">
<el-col>
<el-form-item label="合格证" prop="certificateList">
<FileUpload
v-model="form.certificateList"
:value="form.certificateList"
:limit="3"
:fileSize="10"
:fileType="['doc','docx', 'ppt','pdf']"
@change="handleCertificateChange"
/>
</el-form-item>
<el-form-item label="检测证书" prop="inspectionList">
<FileUpload
v-model="form.inspectionList"
:value="form.inspectionList"
:limit="3"
:fileSize="10"
:fileType="['doc','docx', 'ppt','pdf']"
@change="handleInspectionChange"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import {
equipmentAddApiNew,
getEquipmentAddIdApi,
firstLevel,
secondAndThirdLevel,
fourthToSixthLevel
} from '@/api/EquipmentEntryApply'
import ImageUpload from '@/components/ImageUpload'
import FileUpload from '@/components/ImageUpload'
export default {
name: 'EquipmentEntryEditDialog', // 明确组件名称
emits: ['update:isVisible', 'submit', 'getOrderId'], // 声明事件
data() {
return {
// 下拉列表数据
majorList: [],
processList: [],
categoryList: [],
form: {
major: '', // 专业
process: '', // 工序
category: '', // 类目
deviceName: '', // 装备名称
itemTypeModel: '', // 规格型号
buyPrice: '', // 资产原值
productionDate: '', // 出厂日期
brand: '', // 生产厂家
identifyCode: '', // 装备原始编码
nextCheckTime: '', // 下次维保日期
lifespan: '', // 装备寿命
deviceType: '', // 管理模式
deviceCount: 1, // 装备数量
unitName: '', // 计数单位
specialtyFeature: '', // 专业特征
processFeature: '', // 工序特征
categoryFeature: '', // 类目特征
deviceTypeList: [], // 装备类型列表
mainFileList: [], // 展示图
certificateList: [], // 合格证
inspectionList: [] // 检测证书
},
// 表单校验规则(所有字段均为必填)
equipRules: {
major: [
{ required: true, message: '请选择专业', trigger: 'change' }
],
process: [
{ required: true, message: '请选择工序', trigger: 'change' }
],
category: [
{ required: true, message: '请选择装备类目', trigger: 'change' }
],
deviceName: [
{ required: true, message: '请输入装备名称', trigger: 'blur' }
],
itemTypeModel: [
{ required: true, message: '请输入规格型号', trigger: 'blur' }
],
buyPrice: [
{ required: true, message: '请输入资产原值', trigger: 'blur' }
],
productionDate: [
{ required: true, message: '请选择出厂日期', trigger: 'change' }
],
brand: [
{ required: true, message: '请输入生产厂家', trigger: 'blur' }
],
identifyCode: [
{ required: true, message: '请输入装备原始编码', trigger: 'blur' }
],
nextCheckTime: [
{ required: true, message: '请选择下次维保日期', trigger: 'change' }
],
lifespan: [
{ required: true, message: '请输入装备寿命', trigger: 'blur' }
],
deviceType: [
{ required: true, message: '请选择管理方式', trigger: 'change' }
],
deviceCount: [
{ required: true, message: '请输入装备数量', trigger: 'blur' }
],
unitName: [
{ required: true, message: '请输入计数单位', trigger: 'blur' }
],
deviceTypeList: [
{ required: true, message: '请选择装备类型', trigger: 'change' }
],
certificateList: [
{ required: true, message: '请上传合格证', trigger: 'change' }
],
inspectionList: [
{ required: true, message: '请上传检测证书', trigger: 'change' }
]
}
}
},
created() {
this.firstLevel()
},
methods: {
/**
* 获取一级类型
*/
firstLevel() {
firstLevel().then(res => {
if (res.code === 200) {
this.majorList = res.data
}
})
},
majorChange(item) {
if (!item) {
this.processList = []
this.form.process = ''
} else {
secondAndThirdLevel({ firstLevelId: item }).then(res => {
if (res.code === 200) {
this.processList = this.convertToSubTree(res.data)
}
})
}
},
processChange(item) {
if (item.length === 0) {
this.categoryList = []
this.form.category = ''
} else {
fourthToSixthLevel({ thirdLevelId: item[item.length - 1] }).then(res => {
if (res.code === 200) {
this.categoryList = this.convertToSubTree(res.data)
}
})
}
},
categoryChange(item) {
},
// 返回上一页
goBack() {
this.$router.go(-1)
},
deviceTypeChange(val) {
if (val === 0) {
this.form.deviceCount = '1'
}
},
// 价格输入处理
handlePriceInput(v) {
this.form.buyPrice = v.replace(/[^\d.]/g, '')
},
// 处理图片上传变化
handleImageChange(files) {
this.form.mainFileList = files
this.$refs.formRef.validateField('mainFileList')
},
// 处理合格证上传变化
handleCertificateChange(files) {
this.form.certificateList = files
this.$refs.formRef.validateField('certificateList')
},
// 处理检测证书上传变化
handleInspectionChange(files) {
this.form.inspectionList = files
this.$refs.formRef.validateField('inspectionList')
},
/**
* 处理表单提交
*/
async handleSubmit() {
console.log(this.form)
this.$refs['formRef'].validate(async valid => {
if (valid) {
const result = await getEquipmentAddIdApi()
this.orderId = result.data.id
this.form.orderId = this.orderId
// 获取数组最后一个元素最末级分类ID
this.form.typeId = this.form.deviceTypeList[this.form.deviceTypeList.length - 1]
const res = await equipmentAddApiNew(this.form)
if (res.code === 200) {
this.goBack()
}
}
}
)
},
/**
* 转换类型数据为树形结构适用于级联选择器
*/
convertToSubTree(list) {
const map = {}
const tree = []
// 构建节点映射
list.forEach(item => {
map[item.value] = {
value: item.value.toString(),
label: item.label
}
})
// 构建树形关系
list.forEach(item => {
const current = map[item.value]
const parent = map[item.parentId]
if (parent) {
if (!parent.children) {
parent.children = []
}
parent.children.push(current)
} else {
tree.push(current)
}
})
return tree
}
}
}
</script>
<style lang="scss" scoped>
.page-header {
display: flex;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
font-size: 18px;
border-bottom: 1px solid #e6e6e6;
justify-content: space-between;
.page-title {
font-size: 18px;
font-weight: 600;
margin-left: 15px;
color: #303133;
}
}
.dialog-content {
padding: 10px 0;
min-height: 200px; // 确保有足够高度
}
.goBack-btn:hover {
cursor: pointer;
color: #33b5a0;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 10px; // 按钮间距
}
</style>