<template> <div class="user"> <div class="tree"> <treeList title="物料分类" submitType="2" :data="treeListData" v-model="sourceList.pagination.productClassifyId" @change="treeChange" @changeTreeList="getTreeList" > </treeList> </div> <div class="content"> <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row :selectConfig="selectConfig" :table-events="{ //element talbe事件都能传 select: select, }" :action-list="[]" @get-list="getList" > <template #pic="{ item }"> <div v-if="item.fileList.length > 0"> <img :src="item.fileList[0].fileUrl" class="pic" @click="handleClickFile(item.fileList[0])" /> </div> <div v-else></div> </template> </byTable> </div> <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-model="dialogVisible" width="500" v-loading="loading" > <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform" > <template #productPic> <div> <el-upload v-model:fileList="fileList" action="https://winfaster.obs.cn-south-1.myhuaweicloud.com" :data="uploadData" list-type="picture-card" :on-remove="handleRemove" :on-success="handleSuccess" :before-upload="handleBeforeUpload" > <el-icon><Plus /></el-icon> </el-upload> </div> </template> </byForm> <template #footer> <el-button @click="dialogVisible = false" size="large">取 消</el-button> <el-button type="primary" @click="submitForm('byform')" size="large" :loading="submitLoading" > 确 定 </el-button> </template> </el-dialog> <el-dialog title="Excel导入" v-model="openExcelDialog" width="400" v-loading="loading" > <template #footer> <el-button @click="openExcelDialog = false" size="large" >取 消</el-button > <el-button type="primary" @click="submitExcel()" size="large" :loading="submitLoading" > 确 定 </el-button> </template> </el-dialog> </div> </template> <script setup> /* eslint-disable vue/no-unused-components */ import { ElMessage, ElMessageBox } from "element-plus"; import byTable from "@/components/byTable/index"; import byForm from "@/components/byForm/index"; import treeList from "@/components/product/treeList"; import { computed, defineComponent, ref } from "vue"; const loading = ref(false); const submitLoading = ref(false); const materialUnit = ref([]); const materialType = ref([]); const sourceList = ref({ data: [], pagination: { total: 3, pageNum: 1, pageSize: 10, type: "", productClassifyId: "", keyword: "", definition: "2", }, }); let dialogVisible = ref(false); let openExcelDialog = ref(false); let modalType = ref("add"); let rules = ref({ productClassifyId: [ { required: true, message: "请选择物料分类", trigger: "change" }, ], type: [{ required: true, message: "请选择物料类型", trigger: "change" }], name: [{ required: true, message: "请输入物料名称", trigger: "blur" }], unit: [{ required: true, message: "请选择单位", trigger: "change" }], }); const { proxy } = getCurrentInstance(); const selectConfig = computed(() => { return [ { label: "物料类型", prop: "type", data: materialType.value, }, ]; }); const config = computed(() => { return [ { attrs: { label: "物料类型", prop: "type", }, render(type) { return proxy.dictValueLabel(type, materialType.value); }, }, { attrs: { label: "物料编码", prop: "code", }, }, { attrs: { label: "物料名称", prop: "name", }, }, { attrs: { label: "图片", slot: "pic", }, }, { attrs: { label: "单位", prop: "unit", }, render(unit) { return proxy.dictValueLabel(unit, materialUnit.value); }, }, { attrs: { label: "规格", prop: "spec", }, }, { attrs: { label: "物料备注", prop: "remark", }, }, { attrs: { label: "操作", width: "60", align: "center", fixed: "right", }, // 渲染 el-button,一般用在最后一列。 renderHTML(row) { return [ { attrs: { label: "选择", type: "primary", text: true, }, el: "button", click() { handleSelect(row); }, }, ]; }, }, ]; }); let formData = reactive({ data: {}, }); const formOption = reactive({ inline: true, labelWidth: 100, itemWidth: 100, rules: [], }); const byform = ref(null); const treeListData = ref([]); const formConfig = computed(() => { return [ { type: "treeSelect", prop: "productClassifyId", label: "物料分类", data: [], }, { type: "select", prop: "type", label: "物料类型", required: true, data: [ { label: "原料", id: "1", }, { label: "辅料", id: "2", }, { label: "配件", id: "3", }, { label: "包材", id: "4", }, { label: "其他", id: "5", }, ], }, { type: "input", prop: "name", label: "物料名称", }, { type: "input", prop: "spec", label: "规格", }, { type: "select", prop: "unit", label: "单位", required: true, data: [ { label: "个", id: "个", }, { label: "双", id: "双", }, ], }, { type: "slot", slotName: "productPic", prop: "fileList", label: "产品图片", }, { type: "input", prop: "remark", label: "备注", itemType: "textarea", }, ]; }); const newPassword = () => { formData.data.password = generatePassword(); }; const generatePassword = () => { var length = 12, charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", password = ""; for (var i = 0, n = charset.length; i < length; ++i) { password += charset.charAt(Math.floor(Math.random() * n)); } return password; }; const getList = async (req) => { sourceList.value.pagination = { ...sourceList.value.pagination, ...req }; loading.value = true; proxy .post("/productInfo/page", sourceList.value.pagination) .then((message) => { console.log(message); sourceList.value.data = message.rows.map((x) => ({ ...x, fileList: [] })); sourceList.value.pagination.total = message.total; setTimeout(() => { loading.value = false; }, 200); const productIdList = message.rows.map((x) => x.id); // 请求文件数据并回显 if (productIdList.length > 0) { proxy .post("/fileInfo/getList", { businessIdList: productIdList }) .then((fileObj) => { for (let i = 0; i < sourceList.value.data.length; i++) { const e = sourceList.value.data[i]; for (const key in fileObj) { if (e.id === key) { e.fileList = fileObj[key]; } } } }); } }); }; const uploadData = ref({}); const fileList = ref([]); const fileListCopy = ref([]); const treeChange = (e) => { console.log(e); sourceList.value.pagination.productClassifyId = e.id; getList({ productClassifyId: e.id }); }; const openModal = () => { dialogVisible.value = true; modalType.value = "add"; formData.data = { definition: "2", fileList: [], }; fileList.value = []; fileListCopy.value = []; }; const openExcel = () => { openExcelDialog.value = true; }; const submitExcel = () => { openExcelDialog.value = false; }; const TreetenantId = ref(""); const selection = ref({ data: [], }); const select = (_selection, row) => { selection.value.data = _selection; console.log(_selection.length); }; const tree = ref(null); const submitForm = () => { console.log(byform.value); byform.value.handleSubmit((valid) => { formData.data.fileList = fileListCopy.value.map((x) => ({ id: x.id, fileName: x.fileName, })); submitLoading.value = true; proxy.post("/productInfo/" + modalType.value, formData.data).then( (res) => { ElMessage({ message: modalType.value == "add" ? "添加成功" : "编辑成功", type: "success", }); dialogVisible.value = false; submitLoading.value = false; getList(); }, (err) => { submitLoading.value = false; } ); }); }; const getTreeList = () => { proxy .post("/productClassify/tree", { parentId: "", name: "", definition: "2" }) .then((message) => { treeListData.value = message; formConfig.value[0].data = message; }); }; const getDtl = (row) => { modalType.value = "edit"; proxy.post("/productInfo/detail", { id: row.id }).then((res) => { fileList.value = row.fileList.map((x) => ({ ...x, url: x.fileUrl })); fileListCopy.value = [...fileList.value]; res.type = res.type + ""; res.definition = "2"; formData.data = res; dialogVisible.value = true; }); }; getTreeList(); getList(); const handleBeforeUpload = async (file) => { const res = await proxy.post("/fileInfo/getSing", { fileName: file.name }); uploadData.value = res.uploadBody; fileListCopy.value.push({ id: res.id, fileName: res.fileName, path: res.fileUrl, url: res.fileUrl, uid: file.uid, }); }; const handleSuccess = (res, file, files) => { // 查当前file的index值去赋值对应的copy变量的值 // let uid = file.uid; // const index = fileList.value.findIndex((x) => x.uid === uid); // fileListCopy.value[index].uid = uid; }; const handleRemove = (file) => { const index = fileListCopy.value.findIndex( (x) => x.uid === file.uid || x.id === file.id ); fileListCopy.value.splice(index, 1); }; const handleClickFile = (file) => { window.open(file.fileUrl, "_blank"); }; const handleSelect = (row) => { proxy.$emit("handleSelect", toRaw(row)); }; const getDict = () => { proxy.getDictOne(["material_unit", "material_type"]).then((res) => { materialUnit.value = res["material_unit"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); materialType.value = res["material_type"].map((x) => ({ label: x.dictValue, value: x.dictKey, })); }); }; getDict(); </script> <style lang="scss" scoped> .user { padding: 20px; display: flex; justify-content: space-between; .tree { width: 300px; } .content { width: calc(100% - 320px); } } .pic { object-fit: contain; width: 50px; height: 50px; cursor: pointer; vertical-align: middle; } </style>