<template> <div class="form"> <van-nav-bar title="供应商管理" left-text="返回" left-arrow @click-left="onClickLeft"> </van-nav-bar> <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px; overflow-y: auto"> <van-cell-group inset> <van-field v-model="formData.typeName" is-link readonly label="供应商类型" placeholder="请选择供应商类型" @click="typeModal = true" :rules="[{ required: true, message: '供应商类型不能为空' }]" required /> <van-popup v-model:show="typeModal" position="bottom"> <van-picker :columns="classification" @confirm="onConfirmType" @cancel="typeModal = false" /> </van-popup> <van-field v-model="formData.name" name="供应商名称" label="供应商名称" placeholder="请填写供应商名称" :rules="[{ required: true, message: '供应商名称不能为空' }]" required /> <van-field v-model="formData.cityName" is-link readonly label="所在城市" placeholder="选择所在城市" @click="cityModal = true" :rules="[{ required: true, message: '所在城市不能为空' }]" required /> <van-popup v-model:show="cityModal" round position="bottom"> <van-cascader v-model="formData.city" title="请选择所在地区" :options="areaInfo" @close="showArea = false" @change="cityOnChange" @finish="getAreaInfo" /> </van-popup> <van-field v-model="formData.areaDetail" rows="3" type="textarea" name="详细地址" label="详细地址" placeholder="请填写详细地址" /> <van-field v-model="formData.contactPerson" name="联系人" label="联系人" placeholder="请填写联系人" :rules="[{ required: true, message: '联系人不能为空' }]" required /> <van-field v-model="formData.contactNumber" name="联系电话" label="联系电话" placeholder="请填写联系电话" :rules="[{ required: true, message: '联系电话不能为空' }]" required /> <van-field name="uploader" label="文件上传"> <template #input> <van-uploader v-model="fileList" :after-read="afterRead" multiple :max-count="9" :max-size="5 * 1024 * 1024" @oversize="onOversize" /> </template> </van-field> </van-cell-group> <div style="margin: 16px"> <van-button round block type="primary" native-type="submit"> 提交 </van-button> </div> </van-form> </div> </template> <script setup> import { ref, getCurrentInstance, onMounted } from "vue"; import { showSuccessToast, showToast } from "vant"; import { useRoute } from "vue-router"; import { showLoadingToast, closeToast, showNotify } from 'vant'; const proxy = getCurrentInstance().proxy; const route = useRoute(); const show = ref(false); const typeModal = ref(false); const cityModal = ref(false); const areaInfo = ref([]); const classification = ref([ { text: "贸易商", value: 1, }, { text: "工厂", value: 2, } ]); const fieldNames = { text: "label", value: "id", }; const typeList = ref([ { text: "原料", value: "1", }, { text: "辅料", value: "2", }, { text: "配件", value: "3", }, { text: "包材", value: "4", }, { text: "其他", value: "5", }, ]); const unitList = ref([ { text: "个", value: "个", }, { text: "双", value: "双", }, ]); const formData = ref({ id: null, definition: "2", productClassifyId: null, productClassifyName: null, code: null, customCode: null, type: null, typeName: null, name: null, spec: null, unit: null, remark: null, fileList: [], }); const onConfirmType = ({ selectedOptions }) => { formData.value.type = selectedOptions[0].value; formData.value.typeName = selectedOptions[0].text; typeModal.value = false; }; const cityOnChange = (selectedOptions) => { getAreaInfo(selectedOptions) }; const onConfirmCity = (selectedOptions) => { console.log(selectedOptions) }; const getAreaInfo = (selectedOptions) => { showLoadingToast('加载中...'); proxy.post("/areaInfo/list", { parentId: selectedOptions.value }).then((res) => { let countryIndex = selectedOptions.selectedOptions[0].index; let provinceIndex = selectedOptions.tabIndex === 1 ? selectedOptions.selectedOptions[1].index : null; let cityIndex = selectedOptions.tabIndex === 2 ? selectedOptions.selectedOptions[2].index : null; //已经没有下级数据 if (res.data.length === 0) { if (selectedOptions.tabIndex === 1) { formData.value.cityName = selectedOptions.selectedOptions.map((item) => item.text).join(' '); cityModal.value = false; formData.value.selectedOptions = selectedOptions; return; } } if (selectedOptions.tabIndex === 2) { formData.value.cityName = selectedOptions.selectedOptions.map((item) => item.text).join(' '); cityModal.value = false; formData.value.selectedOptions = selectedOptions; return; } if (selectedOptions.tabIndex === 0) { areaInfo.value[countryIndex].children = res.data.map((item, index) => { return { ...item, index: index, text: item.name, value: item.id, }; }); } else if (selectedOptions.tabIndex === 1) { areaInfo.value[countryIndex].children[provinceIndex].children = res.data.map((item, index) => { return { ...item, index: index, text: item.name, value: item.id, }; }); } else if (selectedOptions.tabIndex === 2) { areaInfo.value[countryIndex].children[provinceIndex].children[cityIndex].children = res.data.map((item, index) => { return { ...item, index: index, text: item.name, value: item.id, }; }); } console.log(areaInfo) closeToast(); }); }; const fileList = ref([]); const afterRead = (file) => { if (file && file.length > 0) { for (let i = 0; i < file.length; i++) { file[i].status = "uploading"; file[i].message = "上传中..."; proxy.post("/fileInfo/getSing", { fileName: file[i].file.name }).then( (res) => { let forms = new FormData(); forms.append("file", file[i].file); proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then( () => { file[i].id = res.data.id; file[i].url = res.data.fileUrl; file[i].fileName = res.data.fileName; delete file[i].status; delete file[i].message; }, () => { file[i].status = "failed"; file[i].message = "上传失败"; } ); }, () => { file[i].status = "failed"; file[i].message = "上传失败"; } ); } } else { file.status = "uploading"; file.message = "上传中..."; proxy.post("/fileInfo/getSing", { fileName: file.file.name }).then( (res) => { let forms = new FormData(); forms.append("file", file.file); proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then( () => { file.id = res.data.id; file.url = res.data.fileUrl; file.fileName = res.data.fileName; delete file.status; delete file.message; }, () => { file.status = "failed"; file.message = "上传失败"; } ); }, () => { file.status = "failed"; file.message = "上传失败"; } ); } }; const onOversize = () => { showToast("文件大小不能超过 5MB"); }; const onClickLeft = () => history.back(); const onSubmit = () => { if (fileList.value && fileList.value.length > 0) { formData.value.fileList = fileList.value.map((item) => { return { id: item.id, fileName: item.fileName, }; }); } else { formData.value.fileList = []; } console.log(formData.value.selectedOptions) if(formData.value.selectedOptions) { formData.value.countryId = formData.value.selectedOptions.selectedOptions[0].value; formData.value.provinceId = formData.value.selectedOptions.tabIndex === 2 ? formData.value.selectedOptions.selectedOptions[1].value : null formData.value.cityId = formData.value.selectedOptions.tabIndex === 1 ? formData.value.selectedOptions.selectedOptions[1].value : formData.value.selectedOptions.selectedOptions[2].value; } proxy.post("/supplierInfo/" + route.query.type, formData.value).then(() => { showSuccessToast(route.query.type == 'add' ? '添加成功' : '修改成功'); setTimeout(() => { history.back(); }, 500); }); }; onMounted(() => { proxy.post("/areaInfo/list", formData.value).then((res) => { areaInfo.value = res.data.map((item, index) => { return { ...item, index: index, text: item.chineseName, value: item.id, children: [] }; }); }); if(route.query.type == 'add') return proxy.post("/supplierInfo/detail", { id: route.query.id }).then((res) => { formData.value = res.data formData.value.typeName = res.data.type == 1 ? '供应商' : '客户' }) }); </script>