This commit is contained in:
lizhenhua 2025-07-17 10:54:30 +08:00
parent 3e811a2236
commit 5fa24ac729
2 changed files with 256 additions and 101 deletions

View File

@ -64,45 +64,50 @@
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template slot-scope="{ row }">
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAddChild(row)"
v-if="row.nodeCount !== row.level"
>
新增
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-upload"
v-if="row.nodeCount === row.level"
@click="handleUploadModel(row)"
>
上传模型
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleEdit(row)"
v-if="row.level != 1"
>
修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
style="color: #f56c6c"
@click="handleDelete(row)"
v-if="row.level != 1"
>
删除
</el-button>
</template>
<template slot-scope="{ row }">
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAddChild(row)"
v-if="row.nodeCount !== row.level"
>
新增
</el-button>
<!-- 根据 modelUrl 显示上传或查看 -->
<el-button
size="mini"
type="text"
:icon="row.modelUrl ? 'el-icon-view' : 'el-icon-upload'"
@click="row.modelUrl ? handleViewModel(row) : handleUploadModel(row)"
v-if="row.nodeCount === row.level"
>
{{ row.modelUrl ? '查看模型' : '上传模型' }}
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleEdit(row)"
v-if="row.level != 1"
>
修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
style="color: #f56c6c"
@click="handleDelete(row)"
v-if="row.level != 1"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -123,9 +128,21 @@
<el-dialog width="50%" append-to-body :title="useOrReturnFormTitle" :visible.sync="useOrReturnFormVisible">
<UseOrReturnForm
ref="useOrReturnFormComponentRef"
@closeUseOrReturnFormDialog="closeUseOrReturnFormDialog"
v-if="useOrReturnFormVisible"
:project-id="currentProjectId"
@closeUseOrReturnFormDialog="useOrReturnFormVisible = false"
@refreshParentList="getModelList"
/>
</el-dialog>
<el-dialog
title="模型预览"
:visible.sync="viewDialogVisible"
width="60%"
append-to-body
>
<DxfViewer :dxfUrl="dxfPreviewUrl" v-if="viewDialogVisible" />
</el-dialog>
</div>
</template>
@ -133,6 +150,8 @@
import AddOrEditForm from './addOrEditForm.vue'
import UseOrReturnForm from './useOrReturnForm.vue'
import UseRecordTable from './useRecordTable.vue'
import DxfViewer from './DxfViewer.vue'
import { getModelListApi, delModelApi } from '@/api/basic/model'
export default {
@ -142,8 +161,17 @@ export default {
UseOrReturnForm,
UseRecordTable,
},
components: {
AddOrEditForm,
UseOrReturnForm,
UseRecordTable,
DxfViewer
},
data() {
return {
viewDialogVisible: false,
dxfPreviewUrl: '',
total: 0, //
loading: false, //
addOrEditFormTitle: '新增', //
@ -153,6 +181,7 @@ export default {
useRecordFormVisible: false, // 使
//
modelList: [],
currentProjectId: null,
//
queryParams: {
// pageNum: 1,
@ -168,6 +197,19 @@ export default {
this.getModelList()
},
methods: {
//
handleViewModel(row) {
const modelUrl = row.modelUrl
console.log(modelUrl)
if (!modelUrl || !modelUrl.endsWith('.dxf')) {
this.$modal.msgWarning('模型地址无效或不是DXF文件')
return
}
this.dxfPreviewUrl = modelUrl
this.viewDialogVisible = true
},
//
handleQuery() {
this.queryParams.pageNum = 1
@ -232,7 +274,14 @@ getModelList() {
//
handleUploadModel(row) {
this.useOrReturnFormVisible = true
this.$nextTick(() => {
// projectId
this.currentProjectId = row.projectId || row.id || null
this.useOrReturnFormVisible = true
// resetForm
this.$refs.useOrReturnFormRef?.resetForm()
})
},
//

View File

@ -1,50 +1,61 @@
<template>
<!-- 基础管理-设备管理-领用或归还 -->
<div>
<el-form :model="useOrReturnForm" :rules="useOrReturnFormRules" ref="useOrReturnFormRef" label-width="120px">
<el-form-item label="模型名称" prop="user">
<el-input v-model="useOrReturnForm.user" placeholder="请输入模型名称" />
<el-form-item label="所属项目" prop="projectId" v-show="false">
<el-input v-model="useOrReturnForm.projectId" placeholder="请输入项目ID" />
</el-form-item>
<el-form-item label="模型上传类型" prop="user">
<el-input v-model="useOrReturnForm.user" placeholder="请输入模型名称" />
<!-- 可选显示模型URL -->
<el-form-item label="模型URL" prop="modelUrl" v-show="false">
<el-input v-model="useOrReturnForm.modelUrl" placeholder="上传后自动填充" />
</el-form-item>
<el-form-item label="模型文件" prop="returnUser">
<el-form-item label="模型名称" prop="modelName">
<el-input v-model="useOrReturnForm.modelName" placeholder="请输入模型名称" />
</el-form-item>
<el-form-item label="模型上传类型" prop="modelType">
<el-input v-model="useOrReturnForm.modelType" placeholder="请输入模型名称" />
</el-form-item>
<el-form-item label="模型文件" prop="files">
<el-upload
action="https://jsonplaceholder.typicode.com/posts/"
action="/dev-api/common/upload"
:on-preview="handlePreview"
:headers="uploadHeaders"
:on-remove="handleRemove"
:on-success="handleSuccess"
:before-remove="beforeRemove"
multiple
:limit="3"
:on-exceed="handleExceed"
:file-list="fileList"
:before-upload="beforeUpload"
>
<div class="upload-demo">
<el-button size="small" icon="el-icon-paperclip">上传模型</el-button>
<div class="upload-demo-tip">仅支持上传dxf文件</div>
</div>
</el-upload>
</el-form-item>
<el-form-item label="模型版本" prop="returnUser">
<el-input v-model="useOrReturnForm.user" placeholder="请输入模型版本" />
</el-form-item>
<el-form-item label="设计人员" prop="returnUser">
<el-select v-model="useOrReturnForm.user" placeholder="请选择设计人员" style="width: 100%">
<el-option label="张工" value="1" />
<el-option label="李工" value="2" />
<el-option label="王工" value="3" />
</el-select>
</el-form-item>
<el-form-item label="版本描述" prop="returnUser">
<el-input
maxlength="100"
show-word-limit
type="textarea"
placeholder="请输入版本描述"
v-model="useOrReturnForm.user"
:autosize="{ minRows: 3, maxRows: 6 }"
/>
</el-form-item>
<el-form-item label="模型版本" prop="version">
<el-input v-model="useOrReturnForm.version" placeholder="请输入模型版本" />
</el-form-item>
<el-form-item label="设计人员" prop="returnUser">
<el-select v-model="useOrReturnForm.designer" placeholder="请选择设计人员" style="width: 100%">
<el-option label="张工" value="1" />
<el-option label="李工" value="2" />
<el-option label="王工" value="3" />
</el-select>
</el-form-item>
<el-form-item label="版本描述" prop="remark">
<el-input
maxlength="100"
show-word-limit
type="textarea"
placeholder="请输入版本描述"
v-model="useOrReturnForm.user"
:autosize="{ minRows: 3, maxRows: 6 }"
/>
</el-form-item>
</el-form-item>
<el-form-item>
@ -56,64 +67,159 @@
</template>
<script>
import { getToken } from '@/utils/auth'
import { addModel } from '@/api/basic/model'
export default {
name: 'useOrReturnForm',
data() {
return {
useOrReturnForm: {
user: '',
useTime: '',
returnUser: '',
modelName: '',
modelType: '',
version: '',
designer: '',
user: '', // remark
files: [],
modelUrl: '', // URL
projectId: '' // ID
},
useOrReturnFormRules: {
user: [{ required: true, message: '请输入领用人', trigger: 'blur' }],
useTime: [{ required: true, message: '请选择领用时间', trigger: 'change' }],
returnUser: [{ required: true, message: '请输入退还人', trigger: 'blur' }],
},
fileList: [],
fileList: []
}
},
props: {
projectId: {
type: String,
default: ''
}
},
mounted() {
this.useOrReturnForm.projectId = this.projectId
},
computed: {
// token
uploadHeaders() {
return {
Authorization: 'Bearer ' + getToken()
}
},
useOrReturnFormRules() {
return {
modelName: [{ required: true, message: '请输入模型名称', trigger: 'blur' }],
modelType: [{ required: true, message: '请输入上传类型', trigger: 'blur' }],
version: [{ required: true, message: '请输入模型版本', trigger: 'blur' }],
designer: [{ required: true, message: '请选择设计人员', trigger: 'change' }],
files: [{ required: true, message: '请上传模型文件', trigger: 'change' }]
}
}
},
methods: {
cancel() {
this.$emit('closeUseOrReturnFormDialog')
},
submitForm() {
// this.$emit('submitForm')
this.$refs.useOrReturnFormRef.validate((valid) => {
if (valid) {
this.$emit('closeUseOrReturnFormDialog')
} else {
return false
// async
async submitForm() {
this.$refs.useOrReturnFormRef.validate(async (valid) => {
if (!valid) return;
const formData = {
modelName: this.useOrReturnForm.modelName,
modelType: this.useOrReturnForm.modelType,
version: this.useOrReturnForm.version,
designer: this.useOrReturnForm.designer,
remark: this.useOrReturnForm.user,
modelUrl: this.useOrReturnForm.modelUrl, //
projectId: this.useOrReturnForm.projectId, //
filePaths: this.useOrReturnForm.files.map(file => file.url)
};
try {
const res = await addModel(formData);
if (res.code === 200) {
this.$modal.msgSuccess('模型添加成功');
this.$emit('closeUseOrReturnFormDialog');
this.$emit('refreshParentList');
this.resetForm();
} else {
this.$modal.msgError(res.msg || '提交失败');
}
} catch (error) {
this.$modal.msgError('提交异常: ' + error.message);
}
})
},
resetForm() {
this.$refs.useOrReturnFormRef.resetFields()
});
},
setFormData(data) {},
resetForm() {
this.$refs.useOrReturnFormRef.resetFields();
this.fileList = [];
this.useOrReturnForm.files = [];
},
handleSuccess(response, file, fileList) {
if (response.code === 200) {
const uploadedUrl = response.fileUrl || response.data || response.url;
this.fileList = fileList;
this.useOrReturnForm.files.push({
name: file.name,
url:uploadedUrl,
uid: file.uid
});
if (!this.useOrReturnForm.modelUrl) {
this.useOrReturnForm.modelUrl = uploadedUrl;
}
this.$refs.useOrReturnFormRef.validateField('files');
} else {
this.$message.error(response.msg || '文件上传失败');
this.handleRemove(file);
}
},
handleRemove(file, fileList) {
this.fileList = fileList;
this.useOrReturnForm.files = this.useOrReturnForm.files.filter(
f => f.uid !== file.uid
);
this.$refs.useOrReturnFormRef.validateField('files');
},
beforeUpload(file) {
const isDxf = file.name.toLowerCase().endsWith('.dxf');
if (!isDxf) {
this.$message.error('只能上传DXF格式的文件!');
}
return isDxf;
},
handlePreview(file) {
console.log(file)
this.$message.info('文件预览功能可根据实际需求实现');
},
handleRemove(file) {
console.log(file)
beforeRemove(file) {
return this.$confirm(`确定移除 ${file.name}`);
},
beforeRemove(file) {},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`,
)
`最多上传3个文件本次选择了 ${files.length} 个文件,总共选择了 ${files.length + fileList.length}`
);
},
},
//
setFormData(data) {
if (data && data.files) {
this.useOrReturnForm.files = [...data.files];
this.fileList = data.files.map(file => ({
name: file.name,
url: file.url
}));
}
}
}
}
</script>
<style lang="scss" scoped>
.upload-demo {
display: flex;
@ -123,4 +229,4 @@ export default {
color: #f56c6c;
}
}
</style>
</style>