| src/api/collaborativeApproval/customerVisit.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/ImageUpload/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/customerVisit/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/deliveryLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/collaborativeApproval/customerVisit.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ import request from '@/utils/request' // è·åæè®¿è®°å½å表 export function getVisitRecords(query) { return request({ url: '/customerVisits/listPage', method: 'get', params: query }) } src/components/ImageUpload/index.vue
@@ -47,6 +47,8 @@ </template> <script setup> import { ref, computed, watch, getCurrentInstance, onMounted, nextTick } from "vue"; import { Plus } from "@element-plus/icons-vue"; import { getToken } from "@/utils/auth"; import { isExternal } from "@/utils/validate"; import Sortable from "sortablejs"; src/views/collaborativeApproval/customerVisit/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,269 @@ <template> <div class="app-container"> <div class="search_form"> <el-form :model="searchForm" :inline="true"> <el-form-item label="客æ·åç§°ï¼"> <el-input v-model="searchForm.customerName" placeholder="请è¾å ¥å®¢æ·åç§°" clearable prefix-icon="Search" style="width: 200px" @change="handleQuery" /> </el-form-item> <el-form-item label="æè®¿äººï¼"> <el-input v-model="searchForm.visitingPeople" placeholder="请è¾å ¥æè®¿äºº" clearable prefix-icon="Search" style="width: 200px" @change="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery">æç´¢</el-button> </el-form-item> </el-form> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" style="width: 100%" height="calc(100vh - 18.5em)" > <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="客æ·åç§°" prop="customerName" width="150" show-overflow-tooltip /> <el-table-column label="è系人" prop="contact" width="120" show-overflow-tooltip /> <el-table-column label="èç³»çµè¯" prop="contactPhone" width="140" show-overflow-tooltip /> <el-table-column label="æè®¿ç®ç" prop="purposeVisit" width="150" show-overflow-tooltip /> <el-table-column label="æè®¿æ¶é´" prop="purposeDate" width="180" show-overflow-tooltip /> <el-table-column label="æè®¿å°ç¹" prop="visitAddress" min-width="200" show-overflow-tooltip /> <el-table-column label="æè®¿äºº" prop="visitingPeople" width="120" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" width="100" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="viewDetail(scope.row)">æ¥ç</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <!-- 详æ å¼¹çª --> <el-dialog v-model="detailVisible" title="å®¢æ·æè®¿è®°å½è¯¦æ " width="600px" @close="closeDetail" > <div class="content-container"> <!-- 客æ·ä¿¡æ¯ --> <div class="section"> <div class="section-title">客æ·ä¿¡æ¯</div> <div class="info-item"> <span class="info-label">客æ·åç§°</span> <span class="info-value">{{ detailForm.customerName || '-' }}</span> </div> <div class="info-item"> <span class="info-label">è系人</span> <span class="info-value">{{ detailForm.contact || '-' }}</span> </div> <div class="info-item"> <span class="info-label">èç³»çµè¯</span> <span class="info-value">{{ detailForm.contactPhone || '-' }}</span> </div> </div> <!-- æè®¿ä¿¡æ¯ --> <div class="section"> <div class="section-title">æè®¿ä¿¡æ¯</div> <div class="info-item"> <span class="info-label">æè®¿ç®ç</span> <span class="info-value">{{ detailForm.purposeVisit || '-' }}</span> </div> <div class="info-item"> <span class="info-label">æè®¿æ¶é´</span> <span class="info-value">{{ detailForm.purposeDate || '-' }}</span> </div> <div class="info-item"> <span class="info-label">æè®¿å°ç¹</span> <span class="info-value multi-line">{{ detailForm.visitAddress || '-' }}</span> </div> <div class="info-item"> <span class="info-label">æè®¿äºº</span> <span class="info-value">{{ detailForm.visitingPeople || '-' }}</span> </div> <div class="info-item" v-if="detailForm.latitude && detailForm.longitude"> <span class="info-label">ç»çº¬åº¦</span> <span class="info-value">{{ detailForm.latitude }}, {{ detailForm.longitude }}</span> </div> </div> <!-- 夿³¨ä¿¡æ¯ --> <div class="section"> <div class="section-title">夿³¨ä¿¡æ¯</div> <div class="info-item remark-item"> <span class="info-label">夿³¨</span> <span class="info-value multi-line">{{ detailForm.remark || '-' }}</span> </div> </div> </div> <template #footer> <div class="dialog-footer"> <el-button @click="closeDetail">å ³é</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import pagination from '@/components/PIMTable/Pagination.vue' import { getVisitRecords } from '@/api/collaborativeApproval/customerVisit.js' const { proxy } = getCurrentInstance() const tableData = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, size: 10, }) const total = ref(0) // æç´¢è¡¨å const searchForm = reactive({ customerName: '', visitingPeople: '', }) // 详æ ç¸å ³ const detailVisible = ref(false) const detailForm = ref({}) // æ¥è¯¢å表 const handleQuery = () => { page.current = 1 getList() } // å页åå const paginationChange = (obj) => { page.current = obj.page page.size = obj.limit getList() } // è·ååè¡¨æ°æ® const getList = () => { tableLoading.value = true getVisitRecords({ ...searchForm, ...page }) .then((res) => { tableLoading.value = false if (res.code === 200) { tableData.value = res.data?.records || res.records || [] total.value = res.data?.total || res.total || 0 } else { proxy.$modal.msgError(res.msg || 'è·åæ°æ®å¤±è´¥') } }) .catch(() => { tableLoading.value = false }) } // æ¥ç详æ const viewDetail = (row) => { detailForm.value = { ...row } detailVisible.value = true } // å ³é详æ const closeDetail = () => { detailVisible.value = false detailForm.value = {} } onMounted(() => { getList() }) </script> <style scoped lang="scss"> .table_list { margin-top: unset; } .content-container { padding: 10px; } .section { margin-bottom: 24px; &:last-child { margin-bottom: 0; } } .section-title { font-size: 16px; font-weight: bold; color: #303133; margin-bottom: 16px; padding-bottom: 8px; border-bottom: 1px solid #e4e7ed; } .info-item { display: flex; margin-bottom: 12px; line-height: 1.6; &:last-child { margin-bottom: 0; } &.remark-item { flex-direction: column; align-items: flex-start; .info-label { margin-bottom: 8px; } .info-value { width: 100%; } } } .info-label { font-weight: 500; color: #606266; min-width: 100px; margin-right: 12px; flex-shrink: 0; } .info-value { color: #303133; flex: 1; word-break: break-all; &.multi-line { white-space: pre-wrap; word-break: break-word; } } </style> src/views/salesManagement/deliveryLedger/index.vue
@@ -3,11 +3,15 @@ <div class="search_form"> <el-form :model="searchForm" :inline="true"> <el-form-item label="éå®è®¢åå·ï¼"> <el-input v-model="searchForm.salesContractNo" placeholder="请è¾å ¥" clearable prefix-icon="Search" <el-input v-model="searchForm.salesContractNo" placeholder="请è¾å ¥" clearable prefix-icon="Search" style="width: 200px" @change="handleQuery" /> </el-form-item> <el-form-item label="车çå·ï¼"> <el-input v-model="searchForm.shippingCarNumber" placeholder="请è¾å ¥" clearable prefix-icon="Search" <el-input v-model="searchForm.shippingCarNumber" placeholder="请è¾å ¥" clearable prefix-icon="Search" style="width: 200px" @change="handleQuery" /> </el-form-item> <el-form-item label="å¿«éåå·ï¼"> <el-input v-model="searchForm.expressNumber" placeholder="请è¾å ¥" clearable prefix-icon="Search" style="width: 200px" @change="handleQuery" /> </el-form-item> <el-form-item> @@ -24,13 +28,15 @@ </div> </div> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :row-key="(row) => row.id" style="width: 100%" height="calc(100vh - 18.5em)"> :row-key="(row) => row.id" style="width: 100%" height="calc(100vh - 21.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="éå®è®¢å" prop="salesContractNo" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" show-overflow-tooltip /> <el-table-column label="åè´§æ¶é´" prop="shippingDate" show-overflow-tooltip /> <el-table-column label="å货车çå·" prop="shippingCarNumber" show-overflow-tooltip /> <el-table-column label="å¿«éå ¬å¸" prop="expressCompany" show-overflow-tooltip /> <el-table-column label="å¿«éåå·" prop="expressNumber" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" width="150" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">ç¼è¾</el-button> @@ -41,45 +47,99 @@ <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢åè´§å°è´¦' : 'ç¼è¾åè´§å°è´¦'" width="50%" <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢åè´§å°è´¦' : 'ç¼è¾åè´§å°è´¦'" width="40%" @close="closeDia"> <el-form :model="form" label-width="120px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éå®è®¢åï¼" prop="salesContractNo"> <el-select v-model="form.salesContractNo" placeholder="è¯·éæ©" clearable filterable @change="handleSalesOrderChange" style="width: 100%" :disabled="operationType === 'edit'"> <el-option v-for="item in salesOrderOptions" :key="item.salesContractNo" :label="item.salesContractNo" :value="item.salesContractNo"> {{ item.salesContractNo + ' - ' + item.customerName }} </el-option> <el-form-item label="åè´§ç±»åï¼" prop="type"> <el-select v-model="form.type" placeholder="è¯·éæ©åè´§ç±»å" style="width: 100%" @change="handleShippingTypeChange" > <el-option label="货车" value="货车" /> <el-option label="å¿«é" value="å¿«é" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="客æ·åç§°ï¼" prop="customerName"> <el-input v-model="form.customerName" placeholder="请è¾å ¥" clearable :disabled="operationType === 'edit'" /> <el-form-item label="åè´§æ¥æï¼" prop="shippingDate"> <el-date-picker style="width: 100%" v-model="form.shippingDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©åè´§æ¥æ" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="åè´§æ¶é´ï¼" prop="shippingDate"> <el-date-picker style="width: 100%" v-model="form.shippingDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-col :span="24" v-if="form.type === '货车'"> <el-form-item label="å货车çå·ï¼" prop="shippingCarNumber"> <el-input v-model="form.shippingCarNumber" placeholder="请è¾å ¥" clearable /> <el-input v-model="form.shippingCarNumber" placeholder="请è¾å ¥å货车çå·" clearable /> </el-form-item> </el-col> <el-col :span="24" v-else> <el-form-item label="å¿«éå ¬å¸ï¼" prop="expressCompany"> <el-input v-model="form.expressCompany" placeholder="请è¾å ¥å¿«éå ¬å¸" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30" v-if="form.type === 'å¿«é'"> <el-col :span="24"> <el-form-item label="å¿«éåå·ï¼" prop="expressNumber"> <el-input v-model="form.expressNumber" placeholder="请è¾å ¥å¿«éåå·" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="åè´§å¾çï¼"> <el-upload v-model:file-list="deliveryFileList" :action="upload.url" multiple ref="deliveryFileUpload" auto-upload :headers="upload.headers" :data="{ type: 9 }" :before-upload="handleDeliveryBeforeUpload" :on-error="handleDeliveryUploadError" :on-success="handleDeliveryUploadSuccess" :on-remove="handleDeliveryRemove" list-type="picture-card" :limit="9" accept="image/png,image/jpeg,image/jpg" > <el-icon class="avatar-uploader-icon"><Plus /></el-icon> <template #tip> <div class="el-upload__tip"> æ¯æ jpgãjpegãpng æ ¼å¼ï¼æå¤ä¸ä¼ 9 å¼ ï¼åå¼ å¤§å°ä¸è¶ è¿ 10MB </div> </template> </el-upload> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> @@ -95,11 +155,15 @@ import pagination from "@/components/PIMTable/Pagination.vue"; import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue"; import { ElMessageBox } from "element-plus"; import { Plus } from "@element-plus/icons-vue"; import { getToken } from "@/utils/auth"; import { getCurrentDate } from "@/utils/index.js"; import { deliveryLedgerListPage, addOrUpdateDeliveryLedger, delDeliveryLedger, } from "@/api/salesManagement/deliveryLedger.js"; import { delLedgerFile } from "@/api/salesManagement/salesLedger.js"; const { proxy } = getCurrentInstance(); @@ -112,6 +176,16 @@ size: 100, }); const total = ref(0); const deliveryFileList = ref([]); const javaApi = proxy.javaApi; // ä¸ä¼ é ç½® const upload = reactive({ // ä¸ä¼ çå°å url: import.meta.env.VITE_APP_BASE_API + "/file/upload", // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref(""); @@ -120,19 +194,31 @@ searchForm: { salesContractNo: "", // éå®è®¢åå· shippingCarNumber: "", // 车çå· expressNumber: "", // å¿«éåå· }, form: { id: null, salesContractNo: "", customerName: "", type: "货车", // 货车, å¿«é shippingDate: "", shippingCarNumber: "", expressCompany: "", expressNumber: "", // å¿«éåå· }, rules: { salesContractNo: [{ required: true, message: "è¯·éæ©éå®è®¢å", trigger: "change" }], customerName: [{ required: true, message: "请è¾å ¥å®¢æ·åç§°", trigger: "blur" }], type: [ { required: true, message: "è¯·éæ©åè´§ç±»å", trigger: "change" } ], shippingDate: [{ required: true, message: "è¯·éæ©åè´§æ¶é´", trigger: "change" }], shippingCarNumber: [{ required: true, message: "请è¾å ¥å货车çå·", trigger: "blur" }], shippingCarNumber: [ { validator: (_, value, callback) => validateShippingCarNumber(value, callback), trigger: "blur" } ], expressCompany: [ { validator: (_, value, callback) => validateExpressCompany(value, callback), trigger: "blur" } ], }, }); const { form, rules } = toRefs(data); @@ -181,22 +267,85 @@ // æå¼å¼¹æ¡ const openForm = async (type, row) => { operationType.value = type; const baseUrl = import.meta.env.VITE_APP_BASE_API; if (type === 'edit' && row) { form.value = { id: row.id ?? null, salesContractNo: row.salesContractNo ?? "", customerName: row.customerName ?? "", type: row.type || "货车", shippingDate: row.shippingDate || getCurrentDate(), shippingCarNumber: row.shippingCarNumber ?? "", expressCompany: row.expressCompany ?? "", expressNumber: row.expressNumber ?? "", }; // 妿æå¾çï¼å° commonFileList 转æ¢ä¸ºæä»¶åè¡¨æ ¼å¼ if (row.commonFileList && Array.isArray(row.commonFileList) && row.commonFileList.length > 0) { deliveryFileList.value = row.commonFileList.map((file, index) => { // å¤ç URLï¼å° Windows è·¯å¾è½¬æ¢ä¸ºå¯è®¿é®ç URL let fileUrl = file.url || ''; console.log('åå§ URL:', fileUrl); // 妿 URL æ¯ Windows è·¯å¾æ ¼å¼ï¼å å«åææ ï¼ï¼éè¦è½¬æ¢ if (fileUrl && fileUrl.indexOf('\\') > -1) { // æ¥æ¾ uploads å ³é®åçä½ç½®ï¼ä»é£éå¼å§æåç¸å¯¹è·¯å¾ const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads'); if (uploadsIndex > -1) { // ä» uploads å¼å§æåè·¯å¾ï¼å¹¶å°åææ æ¿æ¢ä¸ºæ£ææ const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/'); fileUrl = '/' + relativePath; console.log('转æ¢åçç¸å¯¹è·¯å¾:', fileUrl); } else { // å¦ææ²¡ææ¾å° uploadsï¼æåæåä¸ä¸ªç®å½åæä»¶å const parts = fileUrl.split('\\'); const fileName = parts[parts.length - 1]; fileUrl = '/uploads/' + fileName; console.log('æªæ¾å° uploadsï¼ä½¿ç¨æä»¶å:', fileUrl); } } // ç¡®ä¿ææé http å¼å¤´ç URL 齿¼æ¥ baseUrl if (fileUrl && !fileUrl.startsWith('http')) { // ç¡®ä¿è·¯å¾ä»¥ / å¼å¤´ if (!fileUrl.startsWith('/')) { fileUrl = '/' + fileUrl; } // æ¼æ¥ baseUrl fileUrl = javaApi + fileUrl; console.log('æç»æ¼æ¥ç URL:', fileUrl); } return { uid: file.id || Date.now() + index, name: file.name || `image_${index + 1}.jpg`, url: fileUrl, status: 'success', response: { code: 200, data: { tempId: file.id, url: fileUrl } }, tempId: file.id // ä¿åæä»¶IDï¼ç¨äºæäº¤æ¶ä½¿ç¨ }; }); } else { deliveryFileList.value = []; } } else { form.value = { id: null, salesContractNo: "", customerName: "", type: "货车", shippingDate: getCurrentDate(), shippingCarNumber: "", expressCompany: "", expressNumber: "", }; deliveryFileList.value = []; } dialogFormVisible.value = true; @@ -206,10 +355,18 @@ const submitForm = () => { proxy.$refs["formRef"].validate((valid) => { if (valid) { let tempFileIds = []; if (deliveryFileList.value !== null && deliveryFileList.value.length > 0) { tempFileIds = deliveryFileList.value.map((item) => item.tempId); } const payload = { id: form.value.id, type: form.value.type, shippingDate: form.value.shippingDate, shippingCarNumber: form.value.shippingCarNumber, shippingCarNumber: form.value.type === "货车" ? form.value.shippingCarNumber : "", expressCompany: form.value.type === "å¿«é" ? form.value.expressCompany : "", expressNumber: form.value.type === "å¿«é" ? form.value.expressNumber : "", tempFileIds: tempFileIds, }; addOrUpdateDeliveryLedger(payload).then((res) => { proxy.$modal.msgSuccess("æä½æå"); @@ -223,6 +380,7 @@ // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef"); deliveryFileList.value = []; // æ¸ ç©ºæä»¶å表 dialogFormVisible.value = false; }; @@ -284,14 +442,88 @@ }); }; // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, "0"); const day = String(today.getDate()).padStart(2, "0"); return `${year}-${month}-${day}`; // åè´§ç±»åæ ¡éªï¼è´§è½¦æ¶è¦æ±è½¦çï¼å¿«éæ¶è¦æ±å¿«éå ¬å¸ const validateShippingCarNumber = (value, callback) => { if (form.value.type === "货车") { if (!value) return callback(new Error("请è¾å ¥å货车çå·")); } callback(); }; const validateExpressCompany = (value, callback) => { if (form.value.type === "å¿«é") { if (!value) return callback(new Error("请è¾å ¥å¿«éå ¬å¸")); } callback(); }; // åè´§å¾çä¸ä¼ åæ ¡æ£ function handleDeliveryBeforeUpload(file) { // æ ¡æ£æä»¶ç±»å const isImage = file.type === 'image/png' || file.type === 'image/jpeg' || file.type === 'image/jpg'; if (!isImage) { proxy.$modal.msgError("åªè½ä¸ä¼ jpgãjpegãpng æ ¼å¼çå¾ç!"); return false; } // æ ¡æ£æä»¶å¤§å° const isLt10M = file.size / 1024 / 1024 < 10; if (!isLt10M) { proxy.$modal.msgError("ä¸ä¼ å¾ç大å°ä¸è½è¶ è¿ 10MB!"); return false; } proxy.$modal.loading("æ£å¨ä¸ä¼ å¾çï¼è¯·ç¨å..."); return true; } // åè´§å¾çä¸ä¼ 失败 function handleDeliveryUploadError(err) { proxy.$modal.msgError("ä¸ä¼ å¾ç失败"); proxy.$modal.closeLoading(); } // åè´§å¾çä¸ä¼ æååè° function handleDeliveryUploadSuccess(res, file, uploadFiles) { proxy.$modal.closeLoading(); if (res.code === 200) { file.tempId = res.data.tempId; proxy.$modal.msgSuccess("ä¸ä¼ æå"); } else { proxy.$modal.msgError(res.msg); proxy.$refs.deliveryFileUpload.handleRemove(file); } } // ç§»é¤åè´§å¾ç function handleDeliveryRemove(file) { console.log('file--', file) // 妿æ¯ç¼è¾æ¨¡å¼ä¸æä»¶æ idï¼éè¦è°ç¨æ¥å£å é¤ if (operationType.value === "edit") { let ids = []; ids.push(file.uid); delLedgerFile(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); // 仿件å表ä¸ç§»é¤ const index = deliveryFileList.value.findIndex(item => item.uid === file.uid); if (index > -1) { deliveryFileList.value.splice(index, 1); } }).catch(() => { proxy.$modal.msgError("å é¤å¤±è´¥"); }); } else { // æ°å¢æ¨¡å¼ææ²¡æ id çæä»¶ï¼ç´æ¥ä»å表ä¸ç§»é¤ const index = deliveryFileList.value.findIndex(item => item.uid === file.uid); if (index > -1) { deliveryFileList.value.splice(index, 1); } } } // åè´§ç±»ååæ¢æ¶æ¸ 空对åºå段 const handleShippingTypeChange = (val) => { if (val === "货车") { form.value.expressCompany = ""; form.value.expressNumber = ""; } else { form.value.shippingCarNumber = ""; } }; onMounted(() => { getList(); @@ -308,5 +540,12 @@ justify-content: space-between; margin-bottom: 10px; } // éèå¾çä¸ä¼ ç»ä»¶çé¢è§æé®ï¼æ¾å¤§éï¼ :deep(.el-upload-list--picture-card .el-upload-list__item-actions) { .el-upload-list__item-preview { display: none; } } </style> src/views/salesManagement/salesLedger/index.vue
@@ -46,15 +46,6 @@ <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" /> <el-table-column label="产åç¶æ" width="100px" align="center"> <template #default="scope"> <el-tag v-if="scope.row.approveStatus === 0" type="info">æªåºåº</el-tag> <el-tag v-if="scope.row.approveStatus === 1" type="success">å·²åºåº</el-tag> <el-tag v-if="scope.row.approveStatus === 2" type="warning">å®¡æ ¸ä¸</el-tag> <el-tag v-if="scope.row.approveStatus === 3" type="success">å®¡æ ¸æå</el-tag> <el-tag v-if="scope.row.approveStatus === 4" type="danger">å®¡æ ¸å¤±è´¥</el-tag> </template> </el-table-column> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç(%)" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> @@ -73,13 +64,21 @@ <el-table-column label="å½å ¥äºº" prop="entryPersonName" width="100" show-overflow-tooltip /> <el-table-column label="å½å ¥æ¥æ" prop="entryDate" width="120" show-overflow-tooltip /> <el-table-column label="ç¾è®¢æ¥æ" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="å货车ç" prop="shippingCarNumber" width="140" align="center" show-overflow-tooltip /> <el-table-column label="åè´§ç¶æ" prop="shippingStatus" width="140" align="center" show-overflow-tooltip /> <el-table-column label="åè´§æ¥æ" prop="shippingDate" width="140" align="center" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="140" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">ç¼è¾</el-button> <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">éä»¶</el-button> <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">åè´§</el-button> <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)" :disabled="scope.row.shippingStatus === 'å·²åè´§'" > åè´§ </el-button> </template> </el-table-column> </el-table> @@ -426,15 +425,15 @@ <el-form :model="deliveryForm" label-width="120px" label-position="top" :rules="deliveryRules" ref="deliveryFormRef"> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="åè´§ç±»åï¼" prop="shippingType"> <el-form-item label="åè´§ç±»åï¼" prop="type"> <el-select v-model="deliveryForm.shippingType" v-model="deliveryForm.type" placeholder="è¯·éæ©åè´§ç±»å" style="width: 100%" @change="handleShippingTypeChange" > <el-option label="货车" value="truck" /> <el-option label="å¿«é" value="express" /> <el-option label="货车" value="货车" /> <el-option label="å¿«é" value="å¿«é" /> </el-select> </el-form-item> </el-col> @@ -455,7 +454,7 @@ </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24" v-if="deliveryForm.shippingType === 'truck'"> <el-col :span="24" v-if="deliveryForm.type === '货车'"> <el-form-item label="å货车çå·ï¼" prop="shippingCarNumber"> <el-input v-model="deliveryForm.shippingCarNumber" @@ -474,6 +473,46 @@ </el-form-item> </el-col> </el-row> <el-row :gutter="30" v-if="deliveryForm.type === 'å¿«é'"> <el-col :span="24"> <el-form-item label="å¿«éåå·ï¼" prop="expressNumber"> <el-input v-model="deliveryForm.expressNumber" placeholder="请è¾å ¥å¿«éåå·" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="åè´§å¾çï¼"> <el-upload v-model:file-list="deliveryFileList" :action="upload.url" multiple ref="deliveryFileUpload" auto-upload :headers="upload.headers" :data="{ type: 9 }" :before-upload="handleDeliveryBeforeUpload" :on-error="handleDeliveryUploadError" :on-success="handleDeliveryUploadSuccess" :on-remove="handleDeliveryRemove" list-type="picture-card" :limit="9" accept="image/png,image/jpeg,image/jpg" > <el-icon class="avatar-uploader-icon"><Plus /></el-icon> <template #tip> <div class="el-upload__tip"> æ¯æ jpgãjpegãpng æ ¼å¼ï¼æå¤ä¸ä¼ 9 å¼ ï¼åå¼ å¤§å°ä¸è¶ è¿ 10MB </div> </template> </el-upload> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> @@ -492,7 +531,7 @@ import {onMounted, ref, getCurrentInstance} from "vue"; import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js"; import { ElMessageBox, ElMessage } from "element-plus"; import { UploadFilled } from "@element-plus/icons-vue"; import { UploadFilled, Plus } from "@element-plus/icons-vue"; import useUserStore from "@/store/modules/user"; import { userListNoPage } from "@/api/system/user.js"; import FileList from '@/views/salesManagement/salesLedger/fileList.vue'; @@ -532,6 +571,7 @@ }); const total = ref(0); const fileList = ref([]); const deliveryFileList = ref([]); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref(""); @@ -621,13 +661,15 @@ const currentDeliveryRow = ref(null); const deliveryFormData = reactive({ deliveryForm: { shippingType: "truck", // truck: 货车, express: å¿«é type: "货车", // 货车, å¿«é shippingDate: "", shippingCarNumber: "", expressCompany: "", expressNumber: "", // å¿«éåå· shippingImages: "", // åè´§å¾çï¼å¤ä¸ªç¨éå·åé }, deliveryRules: { shippingType: [ type: [ { required: true, message: "è¯·éæ©åè´§ç±»å", trigger: "change" } ], shippingDate: [ @@ -898,6 +940,47 @@ delLedgerFile(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); }); } } // åè´§å¾çä¸ä¼ åæ ¡æ£ function handleDeliveryBeforeUpload(file) { // æ ¡æ£æä»¶ç±»å const isImage = file.type === 'image/png' || file.type === 'image/jpeg' || file.type === 'image/jpg'; if (!isImage) { proxy.$modal.msgError("åªè½ä¸ä¼ jpgãjpegãpng æ ¼å¼çå¾ç!"); return false; } // æ ¡æ£æä»¶å¤§å° const isLt10M = file.size / 1024 / 1024 < 10; if (!isLt10M) { proxy.$modal.msgError("ä¸ä¼ å¾ç大å°ä¸è½è¶ è¿ 10MB!"); return false; } proxy.$modal.loading("æ£å¨ä¸ä¼ å¾çï¼è¯·ç¨å..."); return true; } // åè´§å¾çä¸ä¼ 失败 function handleDeliveryUploadError(err) { proxy.$modal.msgError("ä¸ä¼ å¾ç失败"); proxy.$modal.closeLoading(); } // åè´§å¾çä¸ä¼ æååè° function handleDeliveryUploadSuccess(res, file, uploadFiles) { proxy.$modal.closeLoading(); if (res.code === 200) { file.tempId = res.data.tempId; proxy.$modal.msgSuccess("ä¸ä¼ æå"); } else { proxy.$modal.msgError(res.msg); proxy.$refs.deliveryFileUpload.handleRemove(file); } } // ç§»é¤åè´§å¾ç function handleDeliveryRemove(file) { // 仿件å表ä¸ç§»é¤ const index = deliveryFileList.value.findIndex(item => item.uid === file.uid); if (index > -1) { deliveryFileList.value.splice(index, 1); } } // æäº¤è¡¨å @@ -1447,13 +1530,13 @@ // åè´§ç±»åæ ¡éªï¼è´§è½¦æ¶è¦æ±è½¦çï¼å¿«éæ¶è¦æ±å¿«éå ¬å¸ const validateShippingCarNumber = (value, callback) => { if (deliveryForm.value.shippingType === "truck") { if (deliveryForm.value.type === "货车") { if (!value) return callback(new Error("请è¾å ¥å货车çå·")); } callback(); }; const validateExpressCompany = (value, callback) => { if (deliveryForm.value.shippingType === "express") { if (deliveryForm.value.type === "å¿«é") { if (!value) return callback(new Error("请è¾å ¥å¿«éå ¬å¸")); } callback(); @@ -1647,23 +1730,16 @@ // æå¼åè´§å¼¹æ¡ const openDeliveryForm = (row) => { // getProductInventory({ salesLedgerId: row.id, type:1 }).then((res) => { // currentDeliveryRow.value = row; // deliveryForm.value = { // shippingDate: getCurrentDate(), // shippingCarNumber: "", // }; // deliveryFormVisible.value = true; // }).catch(err => { // ElMessage.error(err.msg); // }); currentDeliveryRow.value = row; deliveryForm.value = { shippingType: "truck", type: "货车", shippingDate: getCurrentDate(), shippingCarNumber: "", expressCompany: "", expressNumber: "", // åå§åå¿«éåå·ä¸ºç©º shippingImages: "", // åå§åå¾ç为空 }; deliveryFileList.value = []; // åå§åæä»¶å表为空 deliveryFormVisible.value = true; }; @@ -1671,12 +1747,18 @@ const submitDelivery = () => { proxy.$refs["deliveryFormRef"].validate((valid) => { if (valid) { let tempFileIds = []; if (deliveryFileList.value !== null && deliveryFileList.value.length > 0) { tempFileIds = deliveryFileList.value.map((item) => item.tempId); } addShippingInfo({ salesLedgerId: currentDeliveryRow.value.id, shippingType: deliveryForm.value.shippingType, type: deliveryForm.value.type, shippingDate: deliveryForm.value.shippingDate, shippingCarNumber: deliveryForm.value.shippingType === "truck" ? deliveryForm.value.shippingCarNumber : "", expressCompany: deliveryForm.value.shippingType === "express" ? deliveryForm.value.expressCompany : "", shippingCarNumber: deliveryForm.value.type === "货车" ? deliveryForm.value.shippingCarNumber : "", expressCompany: deliveryForm.value.type === "å¿«é" ? deliveryForm.value.expressCompany : "", expressNumber: deliveryForm.value.type === "å¿«é" ? deliveryForm.value.expressNumber : "", tempFileIds: tempFileIds, }) .then(() => { proxy.$modal.msgSuccess("åè´§æå"); @@ -1693,14 +1775,18 @@ // å ³éåè´§å¼¹æ¡ const closeDeliveryDia = () => { proxy.resetForm("deliveryFormRef"); deliveryFileList.value = []; // æ¸ ç©ºæä»¶å表 deliveryForm.value.shippingImages = ""; // æ¸ ç©ºå¾ç deliveryForm.value.expressNumber = ""; // æ¸ ç©ºå¿«éåå· deliveryFormVisible.value = false; currentDeliveryRow.value = null; }; // åè´§ç±»ååæ¢æ¶æ¸ 空对åºå段 const handleShippingTypeChange = (val) => { if (val === "truck") { if (val === "货车") { deliveryForm.value.expressCompany = ""; deliveryForm.value.expressNumber = ""; } else { deliveryForm.value.shippingCarNumber = ""; } @@ -1891,4 +1977,11 @@ page-break-after: avoid; } } // éèå¾çä¸ä¼ ç»ä»¶çé¢è§æé®ï¼æ¾å¤§éï¼ :deep(.el-upload-list--picture-card .el-upload-list__item-actions) { .el-upload-list__item-preview { display: none; } } </style>