multiple/assets/favicon/BTYXfavicon.ico
multiple/assets/favicon/ZXZNfavicon.ico
multiple/assets/logo/BTYXLogo.png
multiple/assets/logo/ZXZNLogo.png
multiple/config.json
@@ -42,6 +42,24 @@ "logo": "logo/DZZBLogo.png", "favicon": "favicon/DZZBfavicon.ico" }, "BTYX": { "env": { "VITE_APP_TITLE": "æ²³å帮太ä¼éè¿åºå£æéå ¬å¸", "VITE_BASE_API": "http://127.0.0.1:9001", "VITE_JAVA_API": "http://127.0.0.1:9000" }, "logo": "logo/BTYXLogo.png", "favicon": "favicon/BTYXfavicon.ico" }, "ZXZN": { "env": { "VITE_APP_TITLE": "æ²³åæºè¯æºè½æºå¨äººæéå ¬å¸", "VITE_BASE_API": "http://127.0.0.1:9001", "VITE_JAVA_API": "http://127.0.0.1:9000" }, "logo": "logo/ZXZNLogo.png", "favicon": "favicon/ZXZNfavicon.ico" }, "logo": "/src/assets/logo/logo.png", "favicon": "/public/favicon.ico" } multiple/multiple-build.js
@@ -24,6 +24,19 @@ const envFilePath = path.join(process.cwd(), '.env.production.local'); async function copyFileWithOverwrite(src, dest) { await fs.mkdir(path.dirname(dest), { recursive: true }); if (fsSync.existsSync(dest)) { try { await fs.chmod(dest, 0o666); } catch { // Ignore chmod failure and try delete directly. } await fs.rm(dest, { force: true }); } await fs.copyFile(src, dest); } try { // 1ï¸â£ çæ .env console.log("=======çæ.env======="); @@ -41,9 +54,8 @@ const backupFile = path.join(replacePath, config[key]); const replaceFile = path.join(resourcePath, companyMap[key]); await fs.mkdir(path.dirname(backupFile), { recursive: true }); await fs.copyFile(originFile, backupFile); await fs.copyFile(replaceFile, originFile); await copyFileWithOverwrite(originFile, backupFile); await copyFileWithOverwrite(replaceFile, originFile); } console.log("=====å¼å§æå ======"); @@ -66,7 +78,7 @@ const originFile = path.join(rootPath, config[key]); const backupFile = path.join(replacePath, config[key]); await fs.copyFile(backupFile, originFile); await copyFileWithOverwrite(backupFile, originFile); } await fs.rm(replacePath, { recursive: true, force: true }); console.log(`ðï¸ å·²å é¤ ${replacePath}`); public/favicon.icosrc/api/oaSystem/projectManagement.js
ÎļþÒÑɾ³ý src/assets/AI/²Ö´¢ÖúÊÖ.png
src/assets/AI/´ý°ìÖúÊÖ.pngsrc/assets/AI/Éú²úÖúÊÖ.pngsrc/assets/AI/ÀϰåÖúÊÖ.pngBinary files differ
src/assets/AI/²ÆÎñÖúÊÖ.pngsrc/assets/AI/ÖÊÁ¿ÖúÊÖ.png
src/assets/AI/²É¹ºÖúÊÖ.pngsrc/assets/AI/ÏúÊÛÖúÊÖ.pngsrc/assets/logo/logo.pngsrc/components/AIChatSidebar/index.vue
@@ -530,7 +530,7 @@ import purchaseAssistantAvatar from '@/assets/AI/éè´å©æ.png' import productionAssistantAvatar from '@/assets/AI/çäº§å©æ.png' import financeAssistantAvatar from '@/assets/AI/è´¢å¡å©æ.png' import bossAssistantAvatar from '@/assets/AI/èæ¿å©æ.png' import bossAssistantAvatar from '@/assets/AI/å¾ å婿.png' const emit = defineEmits(['header-extra-action']) @@ -1529,12 +1529,7 @@ if (visibleValue === undefined || visibleValue === null) return clonePurchasePayloadValue(hiddenValue) if (Array.isArray(visibleValue) && Array.isArray(hiddenValue)) { const maxLength = Math.max(visibleValue.length, hiddenValue.length) const merged = [] for (let i = 0; i < maxLength; i++) { merged[i] = mergePurchasePayloadWithHidden(visibleValue[i], hiddenValue[i]) } return merged return visibleValue.map((item, index) => mergePurchasePayloadWithHidden(item, hiddenValue[index])) } if ( @@ -1937,6 +1932,23 @@ '' } const prunePurchaseProductRecord = (record) => { if (!record || typeof record !== 'object' || Array.isArray(record)) return null const normalizedRecord = normalizePurchaseProductRecord(record) const hasVisibleFieldValue = Object.entries(normalizedRecord).some(([key, value]) => { if (shouldHidePurchaseField(key)) return false return hasMeaningfulPayloadValue(value) }) return hasVisibleFieldValue ? normalizedRecord : null } const normalizeAndFilterPurchaseProductData = (value) => { if (!Array.isArray(value)) return value return value .map(item => prunePurchaseProductRecord(item)) .filter(Boolean) } const mergeLegacyProductDataIntoLedgers = (payload) => { if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return payload if (!Array.isArray(payload.purchaseLedgers) || !Array.isArray(payload.productData) || !payload.productData.length) { @@ -1945,13 +1957,11 @@ const ledgers = payload.purchaseLedgers.map(ledger => ({ ...ledger, productData: Array.isArray(ledger.productData) ? ledger.productData.map(normalizePurchaseProductRecord) : [] productData: normalizeAndFilterPurchaseProductData(ledger.productData) || [] })) const unmatchedProducts = [] payload.productData.map(normalizePurchaseProductRecord).forEach(product => { normalizeAndFilterPurchaseProductData(payload.productData).forEach(product => { const productMatchKey = getPurchaseProductMatchKey(product) const matchedLedger = ledgers.find(ledger => { const ledgerKeys = [ @@ -1990,9 +2000,7 @@ if (!record || typeof record !== 'object' || Array.isArray(record)) return record const normalizedRecord = { ...record, productData: Array.isArray(record.productData) ? record.productData.map(normalizePurchaseProductRecord) : record.productData productData: normalizeAndFilterPurchaseProductData(record.productData) } return Object.entries(normalizedRecord).reduce((result, [key, value]) => { if (purchaseLedgerAllowedFieldKeys.has(key)) { @@ -2190,6 +2198,12 @@ if (Array.isArray(sanitized.purchaseLedgers)) { sanitized.purchaseLedgers = sanitized.purchaseLedgers.map(filterPurchaseLedgerRecord) } if (Array.isArray(sanitized.productData)) { sanitized.productData = normalizeAndFilterPurchaseProductData(sanitized.productData) } if (Array.isArray(sanitized.productData) && !sanitized.productData.length) { delete sanitized.productData } purchaseApprovalFieldKeys.forEach(key => { if (!Array.isArray(sanitized)) { src/components/Dialog/FileList.vue
@@ -129,22 +129,23 @@ const saveUpload = async () => { // æ£æ¥æ¯å¦ææ°ä¸ä¼ çæä»¶ if (newFileList.value.length > 0) { try { await createAttachment({ application: "file", recordType: props.recordType, recordId: props.recordId, storageBlobDTOs: [...newFileList.value, ...tableData.value], }); newFileList.value = []; // å·æ°å表 setList(); } catch (error) { proxy?.$modal?.msgError("ä¸ä¼ 失败"); } createAttachment({ application: "file", recordType: props.recordType, recordId: props.recordId, storageBlobDTOs: [...newFileList.value, ...tableData.value], }).then((res) => { if (res && res.code === 200) { proxy?.$modal?.msgSuccess("ä¸ä¼ æå"); newFileList.value = []; // å·æ°å表 setList(); } }).finally(() => { uploadDialogVisible.value = false; }) } uploadDialogVisible.value = false; }; } const closeUpload = () => { newFileList.value = []; @@ -152,13 +153,12 @@ }; const handleDelete = async (row, index) => { try { await deleteAttachment([row.storageAttachmentId]); proxy?.$modal?.msgSuccess("å 餿å"); setList(); } catch (error) { proxy?.$modal?.msgError("å é¤å¤±è´¥"); } deleteAttachment([row.storageAttachmentId]).then((res) => { if (res && res.code === 200) { proxy?.$modal?.msgSuccess("å 餿å"); setList(); } }) }; const setList = () => { @@ -166,9 +166,7 @@ recordType: props.recordType, recordId: props.recordId, }).then(res => { if (res && res.data) { tableData.value = res.data || []; } tableData.value = (res && res.data) || []; }); }; src/router/index.js
@@ -118,20 +118,6 @@ name: "DeviceInfo", meta: { title: "设å¤ä¿¡æ¯", icon: "monitor" }, }, // æ·»å 项ç®è¯¦æ 页é¢è·¯ç±é ç½® { path: "/oaSystem/projectManagement/projectDetail", component: Layout, hidden: true, children: [ { path: ":projectId", component: () => import("@/views/oaSystem/projectManagement/projectDetail.vue"), name: "ProjectDetail", meta: { title: "项ç®è¯¦æ ", activeMenu: "/oaSystem/projectManagement" }, }, ], }, { path: "/projectManagement/Management/detail", component: Layout, src/views/equipmentManagement/ledger/index.vue
@@ -298,7 +298,34 @@ const showQRCode = async (row) => { // ç´æ¥ä½¿ç¨URLï¼ä¸è¦ç¨JSON.stringifyå è£ const qrContent = proxy.javaApi + '/device-info?deviceId=' + row.id; qrCodeUrl.value = await QRCode.toDataURL(qrContent); const qrDataUrl = await QRCode.toDataURL(qrContent, { width: 200, margin: 2 }); // å建canvasåæå¸¦åç§°çäºç»´ç å¾ç const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const qrSize = 200; const textHeight = 30; const padding = 10; canvas.width = qrSize + padding * 2; canvas.height = qrSize + textHeight + padding * 2; // å¡«å ç½è²èæ¯ ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, canvas.width, canvas.height); // ç»å¶äºç»´ç const qrImg = new Image(); qrImg.src = qrDataUrl; await new Promise((resolve) => { qrImg.onload = resolve; }); ctx.drawImage(qrImg, padding, padding, qrSize, qrSize); // ç»å¶è®¾å¤åç§° ctx.fillStyle = '#333333'; ctx.font = 'bold 14px Arial'; ctx.textAlign = 'center'; ctx.fillText(row.deviceName || '', canvas.width / 2, qrSize + padding + 20); qrCodeUrl.value = canvas.toDataURL('image/png'); qrRowData.value = row; qrDialogVisible.value = true; }; src/views/equipmentManagement/upkeep/Form/formDia.vue
@@ -67,6 +67,18 @@ </el-row> <el-row> <el-col :span="12"> <el-form-item label="设å¤é¡¹ç®" prop="machineryCategory"> <el-input v-model.trim="form.machineryCategory" placeholder="请è¾å ¥è®¾å¤é¡¹ç®" maxlength="100" clearable /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="ä»»å¡é¢ç" prop="frequencyType"> <el-select v-model="form.frequencyType" placeholder="è¯·éæ©" clearable> <el-option label="æ¯æ¥" value="DAILY"/> @@ -154,6 +166,7 @@ taskName: undefined, // å½å ¥äººï¼åéä¸ä¸ªç¨æ· id inspector: undefined, machineryCategory: "", remarks: '', frequencyType: '', frequencyDetail: '', @@ -165,7 +178,8 @@ rules: { taskId: [{ required: true, message: "è¯·éæ©è®¾å¤", trigger: "change" },], inspector: [{ required: true, message: "è¯·éæ©å½å ¥äºº", trigger: "blur" },], registrationDate: [{ required: true, message: "è¯·éæ©ç»è®°æ¶é´", trigger: "change" }] registrationDate: [{ required: true, message: "è¯·éæ©ç»è®°æ¶é´", trigger: "change" }], machineryCategory: [{ required: true, message: "请è¾å ¥è®¾å¤é¡¹ç®", trigger: "blur" }] } }) const { form, rules } = toRefs(data) @@ -238,7 +252,7 @@ taskId: undefined, taskName: undefined, inspector: undefined, inspector: undefined, machineryCategory: "", remarks: '', frequencyType: '', frequencyDetail: '', src/views/equipmentManagement/upkeep/index.vue
@@ -300,6 +300,12 @@ prop: "deviceModel", }, { label: "设å¤é¡¹ç®", prop: "machineryCategory", minWidth: 120, formatData: cell => cell || "--", }, { prop: "frequencyType", label: "颿¬¡", minWidth: 150, @@ -372,9 +378,10 @@ prop: "createUserName", }, { label: "项ç®", label: "设å¤é¡¹ç®", align: "center", prop: "machineryCategory", formatData: cell => cell || "--", }, // { // label: "å½å ¥æ¥æ", src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,117 +1,110 @@ <template> <div> <div class="search_form" style="margin-bottom: 10px;"> <div> <span class="search_title ml10">åºåºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <span class="search_title ml10">æ¥æºï¼</span> <el-select v-model="searchForm.recordType" style="width: 240px" placeholder="è¯·éæ©" clearable> <el-option v-for="item in stockRecordTypeOptions" :key="item.value" :label="item.label" :value="item.value"/> </el-select> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >æç´¢</el-button > </div> <div> <el-button type="primary" @click="handleBatchApprove">审æ¹</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> <el-button type="primary" plain @click="handlePrint">æå°</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" style="width: 100%" height="calc(100vh - 18.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="outboundBatches" min-width="100" show-overflow-tooltip <div> <div class="search_form" style="margin-bottom: 10px"> <div> <span class="search_title ml10">åºåºæ¥æï¼</span> <el-date-picker v-model="searchForm.timeStr" type="date" placeholder="è¯·éæ©æ¥æ" value-format="YYYY-MM-DD" format="YYYY-MM-DD" clearable @change="handleQuery" /> <el-table-column label="åºåºæ¥æ" prop="createTime" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productName" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="æ¹å·" prop="batchNo" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="åºåºæ°é" prop="stockOutNum" show-overflow-tooltip /> <el-table-column label="åºåºäºº" prop="createBy" show-overflow-tooltip /> <el-table-column label="æ¥æº" prop="recordType" show-overflow-tooltip> <span class="search_title ml10">æ¥æºï¼</span> <el-select v-model="searchForm.recordType" style="width: 240px" placeholder="è¯·éæ©" clearable > <el-option v-for="item in stockRecordTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" >æç´¢</el-button > </div> <div> <el-button type="primary" @click="handleBatchApprove">审æ¹</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> <el-button type="primary" plain @click="handlePrint">æå°</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" style="width: 100%" height="calc(100vh - 18.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="outboundBatches" min-width="100" show-overflow-tooltip /> <el-table-column label="åºåºæ¥æ" prop="createTime" show-overflow-tooltip /> <el-table-column label="产å大类" prop="productName" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> <el-table-column label="æ¹å·" prop="batchNo" show-overflow-tooltip /> <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> <el-table-column label="åºåºæ°é" prop="stockOutNum" show-overflow-tooltip /> <el-table-column label="åºåºäºº" prop="createBy" show-overflow-tooltip /> <el-table-column label="æ¥æº" prop="recordType" show-overflow-tooltip> <template #default="scope"> {{ getRecordType(scope.row.recordType) }} </template> </el-table-column> <el-table-column label="审æ¹ç¶æ" prop="approvalStatus" show-overflow-tooltip> <template #default="scope"> <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)" size="small"> {{ getApprovalStatusLabel(scope.row.approvalStatus) }} </el-tag> </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> </div> <el-table-column label="审æ¹ç¶æ" prop="approvalStatus" show-overflow-tooltip > <template #default="scope"> <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)" size="small" > {{ getApprovalStatusLabel(scope.row.approvalStatus) }} </el-tag> </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> </div> </template> <script setup> @@ -121,12 +114,13 @@ import useUserStore from "@/store/modules/user"; import { getCurrentDate } from "@/utils/index.js"; import { getStockOutPage, delPendingStockOut, batchApproveStockOutRecords, getStockOutPage, delPendingStockOut, batchApproveStockOutRecords, } from "@/api/inventoryManagement/stockOut.js"; import { findAllQualifiedStockOutRecordTypeOptions, findAllUnQualifiedStockOutRecordTypeOptions, findAllQualifiedStockOutRecordTypeOptions, findAllUnQualifiedStockOutRecordTypeOptions, } from "@/api/basicData/enum.js"; const userStore = useUserStore(); @@ -137,8 +131,8 @@ // æ¥æºç±»åé项 const stockRecordTypeOptions = ref([]); const page = reactive({ current: 1, size: 100, current: 1, size: 100, }); const total = ref(0); @@ -146,13 +140,13 @@ type: { type: String, required: true, default: '0' default: "0", }, topParentProductId: { type: [String, Number], default: undefined } }) default: undefined, }, }); // æå°ç¸å ³ const printPreviewVisible = ref(false); @@ -160,193 +154,215 @@ // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const data = reactive({ searchForm: { supplierName: "", timeStr: "", searchForm: { supplierName: "", timeStr: "", recordType: "", } }, }); const { searchForm } = toRefs(data); // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1; getList(); page.current = 1; getList(); }; const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList(); page.current = obj.page; page.size = obj.limit; getList(); }; const getList = () => { tableLoading.value = true; getStockOutPage({ ...searchForm.value, ...page, topParentProductId: props.topParentProductId }) .then((res) => { tableLoading.value = false; tableData.value = res.data.records; tableData.value.map((item) => { item.children = []; }); total.value = res.data.total; }) .catch(() => { tableLoading.value = false; }); tableLoading.value = true; getStockOutPage({ ...searchForm.value, ...page, topParentProductId: props.topParentProductId, }) .then((res) => { tableLoading.value = false; tableData.value = res.data.records; tableData.value.map((item) => { item.children = []; }); total.value = res.data.total; }) .catch(() => { tableLoading.value = false; }); }; const getRecordType = (recordType) => { return stockRecordTypeOptions.value.find(item => item.value === recordType)?.label || '' } return ( stockRecordTypeOptions.value.find((item) => item.value === recordType) ?.label || "" ); }; const approvalStatusLabelMap = { 0: "å¾ å®¡æ¹", 1: "éè¿", 2: "驳å", pending: "å¾ å®¡æ¹", approved: "éè¿", rejected: "驳å", PENDING: "å¾ å®¡æ¹", APPROVED: "éè¿", REJECTED: "驳å", 0: "å¾ å®¡æ¹", 1: "éè¿", 2: "驳å", 3: "å¾ ç¡®è®¤", pending: "å¾ å®¡æ¹", approved: "éè¿", rejected: "驳å", PENDING: "å¾ å®¡æ¹", APPROVED: "éè¿", REJECTED: "驳å", }; const getApprovalStatusLabel = (status) => { if (status === null || status === undefined || status === "") { return "å¾ å®¡æ¹"; } return approvalStatusLabelMap[status] || "å¾ å®¡æ¹"; if (status === null || status === undefined || status === "") { return "å¾ å®¡æ¹"; } return approvalStatusLabelMap[status] || "å¾ å®¡æ¹"; }; // éè¿/驳ååºå®è²ï¼å ¶ä½ï¼å«å¾ 审æ¹ã空å¼ãæªæ å°ä½ææ¡ä¸ºå¾ 审æ¹ï¼ç»ä¸ç¨ warning é¢è¦è² const getApprovalStatusTagType = (status) => { if (status === 1 || status === "1" || status === "approved" || status === "APPROVED") return "success"; if (status === 2 || status === "2" || status === "rejected" || status === "REJECTED") return "danger"; return "warning"; if ( status === 1 || status === "1" || status === "approved" || status === "APPROVED" ) return "success"; if ( status === 2 || status === "2" || status === "rejected" || status === "REJECTED" ) return "danger"; return "warning"; }; // è·åæ¥æºç±»åé项 const fetchStockRecordTypeOptions = () => { if (props.type === '0') { findAllQualifiedStockOutRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) return if (props.type === "0") { findAllQualifiedStockOutRecordTypeOptions().then((res) => { stockRecordTypeOptions.value = res.data; }); return; } findAllUnQualifiedStockOutRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) } findAllUnQualifiedStockOutRecordTypeOptions().then((res) => { stockRecordTypeOptions.value = res.data; }); }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter((item) => item.id); console.log("selection", selectedRows.value); // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter((item) => item.id); console.log("selection", selectedRows.value); }; const expandedRowKeys = ref([]); const handleBatchApprove = () => { if (selectedRows.value.length === 0) { proxy.$modal.msgWarning("è¯·éæ©æ°æ®"); return; } const ids = selectedRows.value.map((item) => item.id); ElMessageBox.confirm("è¯·éæ©å®¡æ¹ç»æ", "审æ¹", { confirmButtonText: "éè¿", cancelButtonText: "驳å", type: "warning", distinguishCancelAndClose: true, }) .then(() => { batchApproveStockOutRecords({ ids, approvalStatus: 1 }) .then(() => { proxy.$modal.msgSuccess("审æ¹éè¿æå"); getList(); }) .catch(() => { proxy.$modal.msgError("审æ¹éè¿å¤±è´¥"); }); }) .catch((action) => { if (action === "cancel") { batchApproveStockOutRecords({ ids, approvalStatus: 2 }) .then(() => { proxy.$modal.msgSuccess("审æ¹é©³åæå"); getList(); }) .catch(() => { proxy.$modal.msgError("审æ¹é©³å失败"); }); return; } proxy.$modal.msg("已忶"); }); if (selectedRows.value.length === 0) { proxy.$modal.msgWarning("è¯·éæ©æ°æ®"); return; } const ids = selectedRows.value.map((item) => item.id); ElMessageBox.confirm("è¯·éæ©å®¡æ¹ç»æ", "审æ¹", { confirmButtonText: "éè¿", cancelButtonText: "驳å", type: "warning", distinguishCancelAndClose: true, }) .then(() => { batchApproveStockOutRecords({ ids, approvalStatus: 1 }) .then(() => { proxy.$modal.msgSuccess("审æ¹éè¿æå"); getList(); }) .catch(() => { proxy.$modal.msgError("审æ¹éè¿å¤±è´¥"); }); }) .catch((action) => { if (action === "cancel") { batchApproveStockOutRecords({ ids, approvalStatus: 2 }) .then(() => { proxy.$modal.msgSuccess("审æ¹é©³åæå"); getList(); }) .catch(() => { proxy.$modal.msgError("审æ¹é©³å失败"); }); return; } proxy.$modal.msg("已忶"); }); }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm("æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) .then(() => { proxy.download("/stockOutRecord/exportStockOutRecord", {type: props.type}, props.type === '0' ? "åæ ¼åºåºå°è´¦.xlsx" : "ä¸åæ ¼åºåºå°è´¦.xlsx"); }) .catch(() => { proxy.$modal.msg("已忶"); }); ElMessageBox.confirm("æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) .then(() => { proxy.download( "/stockOutRecord/exportStockOutRecord", { type: props.type }, props.type === "0" ? "åæ ¼åºåºå°è´¦.xlsx" : "ä¸åæ ¼åºåºå°è´¦.xlsx" ); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; // å é¤ const handleDelete = () => { let ids = []; if (selectedRows.value.length > 0) { ids = selectedRows.value.map((item) => item.id); } else { proxy.$modal.msgWarning("è¯·éæ©æ°æ®"); return; } ElMessageBox.confirm("éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼", "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) .then(() => { delPendingStockOut(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); }); let ids = []; if (selectedRows.value.length > 0) { ids = selectedRows.value.map((item) => item.id); } else { proxy.$modal.msgWarning("è¯·éæ©æ°æ®"); return; } ElMessageBox.confirm("éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼", "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) .then(() => { delPendingStockOut(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; // æå°åè½ const handlePrint = () => { if (selectedRows.value.length === 0) { proxy.$modal.msgWarning("è¯·éæ©è¦æå°çæ°æ®"); return; } printData.value = [...selectedRows.value]; console.log('æå°æ°æ®:', printData.value); printPreviewVisible.value = true; if (selectedRows.value.length === 0) { proxy.$modal.msgWarning("è¯·éæ©è¦æå°çæ°æ®"); return; } printData.value = [...selectedRows.value]; console.log("æå°æ°æ®:", printData.value); printPreviewVisible.value = true; }; // æ§è¡æå° const executePrint = () => { console.log('å¼å§æ§è¡æå°ï¼æ°æ®æ¡æ°:', printData.value.length); console.log('æå°æ°æ®:', printData.value); // å建ä¸ä¸ªæ°çæå°çªå£ const printWindow = window.open('', '_blank', 'width=800,height=600'); // æå»ºæå°å 容 let printContent = ` console.log("å¼å§æ§è¡æå°ï¼æ°æ®æ¡æ°:", printData.value.length); console.log("æå°æ°æ®:", printData.value); // å建ä¸ä¸ªæ°çæå°çªå£ const printWindow = window.open("", "_blank", "width=800,height=600"); // æå»ºæå°å 容 let printContent = ` <!DOCTYPE html> <html> <head> @@ -480,10 +496,10 @@ </head> <body> `; // ä¸ºæ¯æ¡æ°æ®çææå°é¡µé¢ printData.value.forEach((item, index) => { printContent += ` // ä¸ºæ¯æ¡æ°æ®çææå°é¡µé¢ printData.value.forEach((item, index) => { printContent += ` <div class="print-page"> <div class="delivery-note"> <div class="header"> @@ -503,7 +519,7 @@ </div> <div class="info-row"> <span class="label">åå·ï¼</span> <span class="value">${item.code || ''}</span> <span class="value">${item.code || ""}</span> </div> </div> @@ -521,12 +537,12 @@ </thead> <tbody> <tr> <td>${item.productName || 'ç ç°ç '}</td> <td>${item.model || 'æ å'}</td> <td>${item.unit || 'å'}</td> <td>${item.taxInclusiveUnitPrice || '0'}</td> <td>${item.inboundNum || '2000'}</td> <td>${item.taxInclusiveTotalPrice || '0'}</td> <td>${item.productName || "ç ç°ç "}</td> <td>${item.model || "æ å"}</td> <td>${item.unit || "å"}</td> <td>${item.taxInclusiveUnitPrice || "0"}</td> <td>${item.inboundNum || "2000"}</td> <td>${item.taxInclusiveTotalPrice || "0"}</td> </tr> </tbody> <tfoot> @@ -535,8 +551,10 @@ <td class="total-value"></td> <td class="total-value"></td> <td class="total-value"></td> <td class="total-value">${item.inboundNum || '2000'}</td> <td class="total-value">${item.taxInclusiveTotalPrice || '0'}</td> <td class="total-value">${item.inboundNum || "2000"}</td> <td class="total-value">${ item.taxInclusiveTotalPrice || "0" }</td> </tr> </tfoot> </table> @@ -560,7 +578,7 @@ <div class="footer-row"> <div class="footer-item"> <span class="label">æä½åï¼</span> <span class="value">${userStore.nickName || 'æå¼å'}</span> <span class="value">${userStore.nickName || "æå¼å"}</span> </div> <div class="footer-item"> <span class="label">æå°æ¥æï¼</span> @@ -571,51 +589,49 @@ </div> </div> `; }); printContent += ` }); printContent += ` </body> </html> `; // åå ¥å 容尿°çªå£ printWindow.document.write(printContent); printWindow.document.close(); // çå¾ å 容å è½½å®æåæå° printWindow.onload = () => { setTimeout(() => { printWindow.print(); printWindow.close(); printPreviewVisible.value = false; }, 500); }; // åå ¥å 容尿°çªå£ printWindow.document.write(printContent); printWindow.document.close(); // çå¾ å 容å è½½å®æåæå° printWindow.onload = () => { setTimeout(() => { printWindow.print(); printWindow.close(); printPreviewVisible.value = false; }, 500); }; }; // æ ¼å¼åæ¥æ const formatDate = (dateString) => { if (!dateString) return getCurrentDate(); const date = new Date(dateString); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); return `${year}/${month}/${day}`; if (!dateString) return getCurrentDate(); const date = new Date(dateString); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); return `${year}/${month}/${day}`; }; // æ ¼å¼åæ¥ææ¶é´ const formatDateTime = (date) => { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); const hours = String(date.getHours()).padStart(2, "0"); const minutes = String(date.getMinutes()).padStart(2, "0"); const seconds = String(date.getSeconds()).padStart(2, "0"); return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`; const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); const hours = String(date.getHours()).padStart(2, "0"); const minutes = String(date.getMinutes()).padStart(2, "0"); const seconds = String(date.getSeconds()).padStart(2, "0"); return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`; }; onMounted(() => { getList(); getList(); fetchStockRecordTypeOptions(); }); @@ -630,169 +646,170 @@ <style scoped lang="scss"> .print-preview-dialog { .el-dialog__body { padding: 0; max-height: 80vh; overflow-y: auto; } .el-dialog__body { padding: 0; max-height: 80vh; overflow-y: auto; } } .print-preview-container { .print-preview-header { padding: 15px; border-bottom: 1px solid #e4e7ed; text-align: center; .el-button { margin: 0 10px; } } .print-preview-content { padding: 20px; background-color: #f5f5f5; min-height: 400px; } .print-preview-header { padding: 15px; border-bottom: 1px solid #e4e7ed; text-align: center; .el-button { margin: 0 10px; } } .print-preview-content { padding: 20px; background-color: #f5f5f5; min-height: 400px; } } .print-page { width: 220mm; height: 90mm; padding: 10mm; margin: 0 auto; background: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); margin-bottom: 10px; box-sizing: border-box; width: 220mm; height: 90mm; padding: 10mm; margin: 0 auto; background: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); margin-bottom: 10px; box-sizing: border-box; } .delivery-note { width: 100%; height: 100%; font-family: "SimSun", serif; font-size: 10px; line-height: 1.2; display: flex; flex-direction: column; width: 100%; height: 100%; font-family: "SimSun", serif; font-size: 10px; line-height: 1.2; display: flex; flex-direction: column; } .header { text-align: center; margin-bottom: 8px; .company-name { font-size: 18px; font-weight: bold; margin-bottom: 4px; } .document-title { font-size: 16px; font-weight: bold; } text-align: center; margin-bottom: 8px; .company-name { font-size: 18px; font-weight: bold; margin-bottom: 4px; } .document-title { font-size: 16px; font-weight: bold; } } .info-section { margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; .info-row { line-height: 20px; .label { font-weight: bold; width: 60px; font-size: 14px; } .value { margin-right: 20px; min-width: 80px; font-size: 14px; } } margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; .info-row { line-height: 20px; .label { font-weight: bold; width: 60px; font-size: 14px; } .value { margin-right: 20px; min-width: 80px; font-size: 14px; } } } .table-section { margin-bottom: 4px; flex: 1; .product-table { width: 100%; border-collapse: collapse; border: 1px solid #000; th, td { border: 1px solid #000; padding: 6px; text-align: center; font-size: 14px; line-height: 1.4; } th { font-weight: bold; } .total-label { text-align: right; font-weight: bold; } .total-value { font-weight: bold; } } margin-bottom: 4px; flex: 1; .product-table { width: 100%; border-collapse: collapse; border: 1px solid #000; th, td { border: 1px solid #000; padding: 6px; text-align: center; font-size: 14px; line-height: 1.4; } th { font-weight: bold; } .total-label { text-align: right; font-weight: bold; } .total-value { font-weight: bold; } } } .footer-section { .footer-row { display: flex; margin-bottom: 3px; line-height: 20px; justify-content: space-between; .footer-item { display: flex; margin-right: 20px; .label { font-weight: bold; width: 80px; font-size: 14px; } .value { min-width: 80px; font-size: 14px; } &.address-item { .address-value { min-width: 200px; } } } } .footer-row { display: flex; margin-bottom: 3px; line-height: 20px; justify-content: space-between; .footer-item { display: flex; margin-right: 20px; .label { font-weight: bold; width: 80px; font-size: 14px; } .value { min-width: 80px; font-size: 14px; } &.address-item { .address-value { min-width: 200px; } } } } } @media print { .app-container { display: none; } .print-page { box-shadow: none; margin: 0; padding: 10mm; padding-left: 20mm; page-break-inside: avoid; page-break-after: always; } .print-page:last-child { page-break-after: avoid; } .app-container { display: none; } .print-page { box-shadow: none; margin: 0; padding: 10mm; padding-left: 20mm; page-break-inside: avoid; page-break-after: always; } .print-page:last-child { page-break-after: avoid; } } </style> src/views/inventoryManagement/receiptManagement/Record.vue
@@ -50,6 +50,7 @@ height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" :selectable="isRowSelectableForApprove" width="55"/> <el-table-column align="center" label="åºå·" @@ -181,6 +182,7 @@ APPROVED: "éè¿", REJECTED: "驳å", }; approvalStatusLabelMap[3] = "å¾ ç¡®è®¤"; const getApprovalStatusLabel = (status) => { if (status === null || status === undefined || status === "") { @@ -194,6 +196,14 @@ if (status === 1 || status === "1" || status === "approved" || status === "APPROVED") return "success"; if (status === 2 || status === "2" || status === "rejected" || status === "REJECTED") return "danger"; return "warning"; }; const isPendingApproval = status => { return status === 0 || status === "0" || status === "pending" || status === "PENDING" || status === null || status === undefined || status === ""; }; const isRowSelectableForApprove = row => { return isPendingApproval(row?.approvalStatus); }; const pageProductChange = obj => { @@ -234,7 +244,7 @@ // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = selection => { selectedRows.value = selection.filter(item => item.id); selectedRows.value = selection.filter(item => item.id && isPendingApproval(item.approvalStatus)); }; const expandedRowKeys = ref([]); src/views/oaSystem/projectManagement/components/milestoneList.vue
ÎļþÒÑɾ³ý src/views/oaSystem/projectManagement/components/phaseGoalList.vue
ÎļþÒÑɾ³ý src/views/oaSystem/projectManagement/components/projectForm.vue
ÎļþÒÑɾ³ý src/views/oaSystem/projectManagement/components/taskTree.vue
ÎļþÒÑɾ³ý src/views/oaSystem/projectManagement/index.vue
ÎļþÒÑɾ³ý src/views/oaSystem/projectManagement/projectDetail.vue
ÎļþÒÑɾ³ý src/views/salesManagement/deliveryLedger/index.vue
@@ -3,19 +3,34 @@ <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" style="width: 200px" @change="handleQuery"/> <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" style="width: 200px" @change="handleQuery"/> <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-input v-model="searchForm.expressNumber" placeholder="请è¾å ¥" clearable prefix-icon="Search" style="width: 200px" @change="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery"> æç´¢</el-button> @@ -30,20 +45,68 @@ <el-button type="danger" plain @click="handleDelete">å é¤</el-button> </div> </div> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :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="shippingNo" show-overflow-tooltip/> <el-table-column label="客æ·åç§°" prop="customerName" show-overflow-tooltip/> <el-table-column label="产ååç§°" prop="productName" show-overflow-tooltip/> <el-table-column label="è§æ ¼åå·" prop="specificationModel" 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 label="å®¡æ ¸ç¶æ" prop="status" align="center" width="120"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :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="shippingNo" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" show-overflow-tooltip /> <el-table-column label="产ååç§°" prop="productName" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" 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 label="å®¡æ ¸ç¶æ" prop="status" align="center" width="120" > <template #default="scope"> <el-tag :type="getApprovalStatusType(scope.row.status)"> {{ getApprovalStatusText(scope.row.status) }} @@ -52,46 +115,62 @@ </el-table-column> <el-table-column fixed="right" label="æä½" width="220" align="center"> <template #default="scope"> <!-- <el-button--> <!-- link--> <!-- type="primary"--> <!-- :disabled="!isApproved(scope.row.status)"--> <!-- @click="openForm('edit', scope.row)">åè´§--> <!-- </el-button>--> <el-button link type="primary" :disabled="!isApproved(scope.row.status)" @click="openForm('edit', scope.row)">åè´§ link type="primary" style="color: #67c23a" @click="openDetail(scope.row)" >详æ </el-button> <el-button link type="primary" style="color: #67C23A" @click="openDetail(scope.row)" >详æ </el-button> <el-button link type="danger" :disabled="isApproving(scope.row.status)" @click="handleDeleteSingle(scope.row)">å é¤ link type="danger" :disabled="isApproving(scope.row.status)" @click="handleDeleteSingle(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"/> <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="40%" @close="closeDia"> <el-form :model="form" label-width="120px" label-position="top" :rules="rules" ref="formRef"> <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="type"> <el-select v-model="form.type" placeholder="è¯·éæ©åè´§ç±»å" style="width: 100%" @change="handleShippingTypeChange" v-model="form.type" placeholder="è¯·éæ©åè´§ç±»å" style="width: 100%" @change="handleShippingTypeChange" > <el-option label="货车" value="货车"/> <el-option label="å¿«é" value="å¿«é"/> <el-option label="货车" value="货车" /> <el-option label="å¿«é" value="å¿«é" /> </el-select> </el-form-item> </el-col> @@ -100,13 +179,13 @@ <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 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> @@ -115,18 +194,18 @@ <el-col :span="24" v-if="form.type === '货车'"> <el-form-item label="å货车çå·ï¼" prop="shippingCarNumber"> <el-input v-model="form.shippingCarNumber" placeholder="请è¾å ¥å货车çå·" clearable 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 v-model="form.expressCompany" placeholder="请è¾å ¥å¿«éå ¬å¸" clearable /> </el-form-item> </el-col> @@ -135,9 +214,9 @@ <el-col :span="24"> <el-form-item label="å¿«éåå·ï¼" prop="expressNumber"> <el-input v-model="form.expressNumber" placeholder="请è¾å ¥å¿«éåå·" clearable v-model="form.expressNumber" placeholder="请è¾å ¥å¿«éåå·" clearable /> </el-form-item> </el-col> @@ -145,7 +224,7 @@ <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="åè´§å¾çï¼"> <ImageUpload v-model:file-list="deliveryFileList" :limit="9"/> <ImageUpload v-model:file-list="deliveryFileList" :limit="9" /> </el-form-item> </el-col> </el-row> @@ -159,42 +238,79 @@ </el-dialog> <!-- 详æ å¼¹æ¡ --> <el-dialog v-model="detailDialogVisible" title="åè´§å°è´¦è¯¦æ " width="55%" @close="closeDetail"> <el-dialog v-model="detailDialogVisible" title="åè´§å°è´¦è¯¦æ " width="55%" @close="closeDetail" > <div v-if="detailRow" class="detail-wrapper"> <el-descriptions :column="2" border> <el-descriptions-item label="éå®è®¢å">{{ detailRow.salesContractNo || '--' }}</el-descriptions-item> <el-descriptions-item label="å货订åå·">{{ detailRow.shippingNo || '--' }}</el-descriptions-item> <el-descriptions-item label="客æ·åç§°">{{ detailRow.customerName || '--' }}</el-descriptions-item> <el-descriptions-item label="产ååç§°">{{ detailRow.productName || '--' }}</el-descriptions-item> <el-descriptions-item label="è§æ ¼åå·">{{ detailRow.specificationModel || '--' }}</el-descriptions-item> <el-descriptions-item label="åè´§ç±»å">{{ detailRow.type || '--' }}</el-descriptions-item> <el-descriptions-item label="åè´§æ¥æ">{{ detailRow.shippingDate || '--' }}</el-descriptions-item> <el-descriptions-item label="å®¡æ ¸ç¶æ">{{ getApprovalStatusText(detailRow.status) }}</el-descriptions-item> <el-descriptions-item label="å货车çå·">{{ detailRow.shippingCarNumber || '--' }}</el-descriptions-item> <el-descriptions-item label="å¿«éå ¬å¸">{{ detailRow.expressCompany || '--' }}</el-descriptions-item> <el-descriptions-item label="å¿«éåå·" :span="2">{{ detailRow.expressNumber || '--' }}</el-descriptions-item> <el-descriptions-item label="éå®è®¢å">{{ detailRow.salesContractNo || "--" }}</el-descriptions-item> <el-descriptions-item label="å货订åå·">{{ detailRow.shippingNo || "--" }}</el-descriptions-item> <el-descriptions-item label="客æ·åç§°">{{ detailRow.customerName || "--" }}</el-descriptions-item> <el-descriptions-item label="产ååç§°">{{ detailRow.productName || "--" }}</el-descriptions-item> <el-descriptions-item label="è§æ ¼åå·">{{ detailRow.specificationModel || "--" }}</el-descriptions-item> <el-descriptions-item label="åè´§ç±»å">{{ detailRow.type || "--" }}</el-descriptions-item> <el-descriptions-item label="åè´§æ¥æ">{{ detailRow.shippingDate || "--" }}</el-descriptions-item> <el-descriptions-item label="å®¡æ ¸ç¶æ">{{ getApprovalStatusText(detailRow.status) }}</el-descriptions-item> <el-descriptions-item label="å货车çå·">{{ detailRow.shippingCarNumber || "--" }}</el-descriptions-item> <el-descriptions-item label="å¿«éå ¬å¸">{{ detailRow.expressCompany || "--" }}</el-descriptions-item> <el-descriptions-item label="å¿«éåå·" :span="2">{{ detailRow.expressNumber || "--" }}</el-descriptions-item> </el-descriptions> <el-table :data="getDeliveryProductInfoList()" border size="small" class="delivery-product-table" style="width: 100%; margin-top: 16px;"> <el-table-column label="æ¹å·" prop="batchNo" min-width="160" show-overflow-tooltip/> <el-table-column label="产ååç§°" prop="productName" min-width="160" show-overflow-tooltip/> <el-table-column label="è§æ ¼åå·" prop="specificationModel" min-width="160" show-overflow-tooltip/> <el-table-column label="åè´§æ°é" prop="deliveryQuantity" min-width="120" align="center"/> <el-table :data="getDeliveryProductInfoList()" border size="small" class="delivery-product-table" style="width: 100%; margin-top: 16px" > <el-table-column label="æ¹å·" prop="batchNo" min-width="160" show-overflow-tooltip /> <el-table-column label="产ååç§°" prop="productName" min-width="160" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" min-width="160" show-overflow-tooltip /> <el-table-column label="åè´§æ°é" prop="deliveryQuantity" min-width="120" align="center" /> </el-table> <ImagePreview :file-list="detailRow.storageBlobVOs || []" /> </div> @@ -209,21 +325,20 @@ <script setup> import pagination from "@/components/PIMTable/Pagination.vue"; import {onMounted, ref, reactive, toRefs, getCurrentInstance} from "vue"; import {ElMessageBox} from "element-plus"; import {getCurrentDate} from "@/utils/index.js"; import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue"; import { ElMessageBox } from "element-plus"; import { getCurrentDate } from "@/utils/index.js"; import { deliveryLedgerListPage, delDeliveryLedger, deductStock, getDeliveryDetail, } from "@/api/salesManagement/deliveryLedger.js"; import {delLedgerFile} from "@/api/salesManagement/salesLedger.js"; import { delLedgerFile } from "@/api/salesManagement/salesLedger.js"; import ImageUpload from "@/components/AttachmentUpload/image/index.vue"; import ImagePreview from "@/components/AttachmentPreview/image/index.vue"; const {proxy} = getCurrentInstance(); const { proxy } = getCurrentInstance(); const tableData = ref([]); const selectedRows = ref([]); const tableLoading = ref(false); @@ -261,23 +376,34 @@ expressNumber: "", // å¿«éåå· }, rules: { salesContractNo: [{required: true, message: "è¯·éæ©éå®è®¢å", trigger: "change"}], customerName: [{required: true, message: "请è¾å ¥å®¢æ·åç§°", trigger: "blur"}], type: [ {required: true, message: "è¯·éæ©åè´§ç±»å", trigger: "change"} salesContractNo: [ { required: true, message: "è¯·éæ©éå®è®¢å", trigger: "change" }, ], shippingDate: [{required: true, message: "è¯·éæ©åè´§æ¶é´", trigger: "change"}], customerName: [ { required: true, message: "请è¾å ¥å®¢æ·åç§°", trigger: "blur" }, ], type: [{ required: true, message: "è¯·éæ©åè´§ç±»å", trigger: "change" }], shippingDate: [ { required: true, message: "è¯·éæ©åè´§æ¶é´", trigger: "change" }, ], shippingCarNumber: [ {validator: (_, value, callback) => validateShippingCarNumber(value, callback), trigger: "blur"} { validator: (_, value, callback) => validateShippingCarNumber(value, callback), trigger: "blur", }, ], expressCompany: [ {validator: (_, value, callback) => validateExpressCompany(value, callback), trigger: "blur"} { validator: (_, value, callback) => validateExpressCompany(value, callback), trigger: "blur", }, ], }, }); const {form, rules} = toRefs(data); const {searchForm} = toRefs(data); const { form, rules } = toRefs(data); const { searchForm } = toRefs(data); // æ¥è¯¢å表 const handleQuery = () => { @@ -293,20 +419,22 @@ const getList = () => { tableLoading.value = true; deliveryLedgerListPage({...searchForm.value, ...page}) .then((res) => { tableLoading.value = false; tableData.value = res.data.records || []; total.value = res.data.total || 0; }) .catch(() => { tableLoading.value = false; }); deliveryLedgerListPage({ ...searchForm.value, ...page }) .then((res) => { tableLoading.value = false; tableData.value = res.data.records || []; total.value = res.data.total || 0; }) .catch(() => { tableLoading.value = false; }); }; // éå®è®¢åååæ¶èªå¨å¡«å 客æ·åç§° const handleSalesOrderChange = (value) => { const selectedOrder = salesOrderOptions.value.find(item => item.salesContractNo === value); const selectedOrder = salesOrderOptions.value.find( (item) => item.salesContractNo === value ); if (selectedOrder) { form.value.customerName = selectedOrder.customerName; } @@ -320,14 +448,14 @@ // æå¼å¼¹æ¡ const openForm = async (type, row) => { // åè´§ï¼ä» âå®¡æ ¸éè¿âå 许ç¼è¾ if (type === 'edit' && row && !isApproved(row.status)) { if (type === "edit" && row && !isApproved(row.status)) { proxy.$modal.msgWarning("åªæå®¡æ ¸éè¿çæ°æ®æå¯ä»¥åè´§"); return; } operationType.value = type; if (type === 'edit' && row) { if (type === "edit" && row) { form.value = { id: row.id ?? null, salesContractNo: row.salesContractNo ?? "", @@ -362,62 +490,69 @@ proxy.$modal.msgError("å è½½åè´§å°è´¦è¯¦æ 失败"); } }; const resolveDeliveryDetailList = data => { const resolveDeliveryDetailList = (data) => { if (Array.isArray(data)) return data; if (!data || typeof data !== "object") return []; return [ data.batchNoDetailList, data.batchNoList, data.shippingBatchList, data.shippingInfoDetailList, data.detailList, data.batchDetailList, data.rows, data.records, data.list, data.data, ].find(value => Array.isArray(value) && value.length) || []; return ( [ data.batchNoDetailList, data.batchNoList, data.shippingBatchList, data.shippingInfoDetailList, data.detailList, data.batchDetailList, data.rows, data.records, data.list, data.data, ].find((value) => Array.isArray(value) && value.length) || [] ); }; const getDeliveryProductInfoList = () => { const row = detailRow.value; if (!row) return []; const normalizeBatchNoList = value => { const normalizeBatchNoList = (value) => { if (Array.isArray(value)) return value; if (typeof value === "string" && value.includes(",")) { return value.split(",").map(item => item.trim()).filter(Boolean); return value .split(",") .map((item) => item.trim()) .filter(Boolean); } return value ? [value] : []; }; const detailList = detailProductList.value.length ? detailProductList.value : [ row.batchNoDetailList, row.batchNoList, row.shippingBatchList, row.shippingInfoDetailList, row.detailList, row.batchDetailList, ].find(value => Array.isArray(value) && value.length); const detailList = detailProductList.value.length ? detailProductList.value : [ row.batchNoDetailList, row.batchNoList, row.shippingBatchList, row.shippingInfoDetailList, row.detailList, row.batchDetailList, ].find((value) => Array.isArray(value) && value.length); const batchNoList = normalizeBatchNoList(row.batchNo); const toTableRow = (item = {}) => ({ batchNo: typeof item === "string" || typeof item === "number" ? item : item.batchNo ?? item.batchNumber ?? row.batchNo ?? "--", typeof item === "string" || typeof item === "number" ? item : item.batchNo ?? item.batchNumber ?? row.batchNo ?? "--", productName: item.productName ?? row.productName ?? "--", specificationModel: item.specificationModel ?? item.model ?? row.specificationModel ?? "--", item.specificationModel ?? item.model ?? row.specificationModel ?? "--", deliveryQuantity: item.deliveryQuantity ?? item.quantity ?? item.shippingQuantity ?? row.deliveryQuantity ?? row.quantity ?? "--", item.deliveryQuantity ?? item.quantity ?? item.shippingQuantity ?? row.deliveryQuantity ?? row.quantity ?? "--", }); if (detailList?.length) { return detailList.map(toTableRow); } if (batchNoList.length) { return batchNoList.map(batchNo => toTableRow({batchNo})); return batchNoList.map((batchNo) => toTableRow({ batchNo })); } return [toTableRow()]; }; @@ -435,9 +570,12 @@ id: form.value.id, type: form.value.type, shippingDate: form.value.shippingDate, shippingCarNumber: form.value.type === "货车" ? form.value.shippingCarNumber : "", expressCompany: form.value.type === "å¿«é" ? form.value.expressCompany : "", expressNumber: form.value.type === "å¿«é" ? form.value.expressNumber : "", shippingCarNumber: form.value.type === "货车" ? form.value.shippingCarNumber : "", expressCompany: form.value.type === "å¿«é" ? form.value.expressCompany : "", expressNumber: form.value.type === "å¿«é" ? form.value.expressNumber : "", storageBlobDTOs: deliveryFileList.value || [], }; deductStock(payload).then((res) => { @@ -463,12 +601,12 @@ cancelButtonText: "åæ¶", type: "warning", }) .then(() => { proxy.download("/shippingInfo/export", {}, "åè´§å°è´¦.xlsx"); }) .catch(() => { proxy.$modal.msg("已忶"); }); .then(() => { proxy.download("/shippingInfo/export", {}, "åè´§å°è´¦.xlsx"); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; // æ¹éå é¤ @@ -479,7 +617,9 @@ } // æ£æ¥éä¸çè¡æ¯å¦æ"å®¡æ ¸ä¸"ç¶æ const approvingRows = selectedRows.value.filter(row => isApproving(row.status)); const approvingRows = selectedRows.value.filter((row) => isApproving(row.status) ); if (approvingRows.length > 0) { proxy.$modal.msgWarning("å®¡æ ¸ä¸çæ°æ®ä¸è½å é¤"); return; @@ -491,15 +631,15 @@ cancelButtonText: "åæ¶", type: "warning", }) .then(() => { delDeliveryLedger(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); .then(() => { delDeliveryLedger(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; // å个å é¤ @@ -515,15 +655,15 @@ cancelButtonText: "åæ¶", type: "warning", }) .then(() => { delDeliveryLedger([row.id]).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); .then(() => { delDeliveryLedger([row.id]).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; // åè´§ç±»åæ ¡éªï¼è´§è½¦æ¶è¦æ±è½¦çï¼å¿«éæ¶è¦æ±å¿«éå ¬å¸ @@ -543,7 +683,10 @@ // åè´§å¾çä¸ä¼ åæ ¡æ£ function handleDeliveryBeforeUpload(file) { // æ ¡æ£æä»¶ç±»å const isImage = file.type === 'image/png' || file.type === 'image/jpeg' || file.type === 'image/jpg'; const isImage = file.type === "image/png" || file.type === "image/jpeg" || file.type === "image/jpg"; if (!isImage) { proxy.$modal.msgError("åªè½ä¸ä¼ jpgãjpegãpng æ ¼å¼çå¾ç!"); return false; @@ -578,24 +721,30 @@ // ç§»é¤åè´§å¾ç function handleDeliveryRemove(file) { console.log('file--', 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("å é¤å¤±è´¥"); }); 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); const index = deliveryFileList.value.findIndex( (item) => item.uid === file.uid ); if (index > -1) { deliveryFileList.value.splice(index, 1); } @@ -614,92 +763,92 @@ // è·åå®¡æ ¸ç¶æææ¬ const getApprovalStatusText = (status) => { if (status === null || status === undefined || status === '') { return 'å¾ å®¡æ ¸'; if (status === null || status === undefined || status === "") { return "å¾ å®¡æ ¸"; } // å¦ææ¯æ°å if (typeof status === 'number') { if (typeof status === "number") { const statusMap = { 0: 'å¾ å®¡æ ¸', 1: 'å®¡æ ¸ä¸', 2: 'å®¡æ ¸æç»', 3: 'å®¡æ ¸éè¿' 0: "å¾ å®¡æ ¸", 1: "å®¡æ ¸ä¸", 2: "å®¡æ ¸æç»", 3: "å®¡æ ¸éè¿", }; return statusMap[status] || 'å¾ å®¡æ ¸'; return statusMap[status] || "å¾ å®¡æ ¸"; } // 妿æ¯å符串ï¼ç´æ¥è¿åææ å° const statusStr = String(status).trim(); const statusTextMap = { 'å¾ å®¡æ ¸': 'å¾ å®¡æ ¸', 'å®¡æ ¸ä¸': 'å®¡æ ¸ä¸', 'å®¡æ ¸æç»': 'å®¡æ ¸æç»', 'å®¡æ ¸éè¿': 'å®¡æ ¸éè¿', 'å·²åè´§': 'å·²åè´§', '0': 'å¾ å®¡æ ¸', '1': 'å®¡æ ¸ä¸', '2': 'å®¡æ ¸æç»', '3': 'å®¡æ ¸éè¿' å¾ å®¡æ ¸: "å¾ å®¡æ ¸", å®¡æ ¸ä¸: "å®¡æ ¸ä¸", å®¡æ ¸æç»: "å®¡æ ¸æç»", å®¡æ ¸éè¿: "å®¡æ ¸éè¿", å·²åè´§: "å·²åè´§", 0: "å¾ å®¡æ ¸", 1: "å®¡æ ¸ä¸", 2: "å®¡æ ¸æç»", 3: "å®¡æ ¸éè¿", }; return statusTextMap[statusStr] || statusStr || 'å¾ å®¡æ ¸'; return statusTextMap[statusStr] || statusStr || "å¾ å®¡æ ¸"; }; // è·åå®¡æ ¸ç¶ææ ç¾ç±»åï¼é¢è²ï¼ const getApprovalStatusType = (status) => { if (status === null || status === undefined || status === '') { return 'info'; if (status === null || status === undefined || status === "") { return "info"; } // å¦ææ¯æ°å if (typeof status === 'number') { if (typeof status === "number") { const typeMap = { 0: 'info', // å¾ å®¡æ ¸ - ç°è² 1: 'warning', // å®¡æ ¸ä¸ - é»è² 2: 'danger', // å®¡æ ¸æç» - çº¢è² 3: 'success' // å®¡æ ¸éè¿ - ç»¿è² 0: "info", // å¾ å®¡æ ¸ - ç°è² 1: "warning", // å®¡æ ¸ä¸ - é»è² 2: "danger", // å®¡æ ¸æç» - çº¢è² 3: "success", // å®¡æ ¸éè¿ - ç»¿è² }; return typeMap[status] || 'info'; return typeMap[status] || "info"; } // 妿æ¯å符串 const statusStr = String(status).trim(); const typeTextMap = { 'å¾ å®¡æ ¸': 'info', 'å®¡æ ¸ä¸': 'warning', 'å®¡æ ¸æç»': 'danger', 'å®¡æ ¸éè¿': 'success', 'å·²åè´§': 'success', '0': 'info', '1': 'warning', '2': 'danger', '3': 'success' å¾ å®¡æ ¸: "info", å®¡æ ¸ä¸: "warning", å®¡æ ¸æç»: "danger", å®¡æ ¸éè¿: "success", å·²åè´§: "success", 0: "info", 1: "warning", 2: "danger", 3: "success", }; return typeTextMap[statusStr] || 'info'; return typeTextMap[statusStr] || "info"; }; // æ£æ¥å®¡æ ¸ç¶ææ¯å¦ä¸º"å®¡æ ¸éè¿" const isApproved = (status) => { if (status === null || status === undefined || status === '') { if (status === null || status === undefined || status === "") { return false; } // å¦ææ¯æ°åï¼3 è¡¨ç¤ºå®¡æ ¸éè¿ if (typeof status === 'number') { if (typeof status === "number") { return status === 3; } // 妿æ¯å符串 const statusStr = String(status).trim(); return statusStr === 'å®¡æ ¸éè¿' || statusStr === '3'; return statusStr === "å®¡æ ¸éè¿" || statusStr === "3"; }; // æ£æ¥å®¡æ ¸ç¶ææ¯å¦ä¸º"å®¡æ ¸ä¸" const isApproving = (status) => { if (status === null || status === undefined || status === '') { if (status === null || status === undefined || status === "") { return false; } // å¦ææ¯æ°åï¼1 è¡¨ç¤ºå®¡æ ¸ä¸ if (typeof status === 'number') { if (typeof status === "number") { return status === 1; } // 妿æ¯å符串 const statusStr = String(status).trim(); return statusStr === 'å®¡æ ¸ä¸' || statusStr === '1'; return statusStr === "å®¡æ ¸ä¸" || statusStr === "1"; }; onMounted(() => { @@ -752,4 +901,3 @@ color: #909399; } </style> src/views/salesManagement/returnOrder/components/formDia.vue
@@ -55,14 +55,14 @@ <el-date-picker v-model="form.makeTime" type="datetime" style="width:100%" value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" /> </el-form-item> </el-col> <el-col :span="4"> <!-- <el-col :span="4"> <el-form-item label="ç¶æï¼" prop="status"> <el-select v-model="form.status" placeholder="è¯·éæ©ç¶æ"> <el-option label="å¾ å¤ç" :value="0" /> <el-option label="å·²å¤ç" :value="1" /> </el-select> </el-form-item> </el-col> </el-col> --> <el-col :span="4"> <el-form-item label="éè´§åå ï¼" prop="returnReason"> <el-input v-model="form.returnReason" placeholder="请è¾å ¥éè´§åå " /> @@ -170,7 +170,7 @@ import { returnManagementAdd, returnManagementUpdate, returnManagementGetByShippingId, getSalesLedger, returnManagementGetById } from "@/api/salesManagement/returnOrder.js"; import useUserStore from "@/store/modules/user.js"; import { userListNoPageByTenantId } from "@/api/system/user.js"; import { listProject } from "@/api/oaSystem/projectManagement.js"; import { listProject } from "@/api/projectManagement/project.js"; import {listCustomer} from "@/api/basicData/customer.js"; const { proxy } = getCurrentInstance(); src/views/salesManagement/salesLedger/index.vue
@@ -898,7 +898,8 @@ prop="type"> <el-select v-model="deliveryForm.type" placeholder="è¯·éæ©åè´§ç±»å" style="width: 100%"> style="width: 100%" @change="handleDeliveryTypeChange"> <el-option label="货车" value="货车" /> <el-option label="å¿«é" @@ -910,6 +911,41 @@ <el-form-item label="å¾ åè´§æ°éï¼"> <el-input :model-value="currentDeliveryRow?.noQuantity" disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24" v-if="deliveryForm.type === '货车'"> <el-form-item label="å货车çå·ï¼" prop="shippingCarNumber"> <el-input v-model="deliveryForm.shippingCarNumber" placeholder="请è¾å ¥å货车çå·" clearable /> </el-form-item> </el-col> <el-col :span="24" v-else> <el-form-item label="å¿«éå ¬å¸ï¼" prop="expressCompany"> <el-input v-model="deliveryForm.expressCompany" placeholder="请è¾å ¥å¿«éå ¬å¸" clearable /> </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="åè´§å¾çï¼"> <ImageUpload v-model:file-list="deliveryFileList" :limit="9" /> </el-form-item> </el-col> </el-row> @@ -990,6 +1026,7 @@ import useFormData from "@/hooks/useFormData.js"; import dayjs from "dayjs"; import FileUpload from "@/components/AttachmentUpload/file/index.vue"; import ImageUpload from "@/components/AttachmentUpload/image/index.vue"; import { getCurrentDate } from "@/utils/index.js"; import { listCustomer } from "@/api/basicData/customer.js"; @@ -1017,6 +1054,7 @@ }); const total = ref(0); const fileList = ref([]); const deliveryFileList = ref([]); // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref(""); @@ -1195,11 +1233,30 @@ deliveryQuantity: 0, })); }; const validateDeliveryShippingCarNumber = (_rule, value, callback) => { if (deliveryForm.value.type === "货车" && !value) { return callback(new Error("请è¾å ¥å货车çå·")); } callback(); }; const validateDeliveryExpressCompany = (_rule, value, callback) => { if (deliveryForm.value.type === "å¿«é" && !value) { return callback(new Error("请è¾å ¥å¿«éå ¬å¸")); } callback(); }; const deliveryFormData = reactive({ deliveryForm: { shippingCarNumber: "", expressCompany: "", expressNumber: "", type: "货车", // 货车, å¿«é }, deliveryRules: { shippingCarNumber: [ { validator: validateDeliveryShippingCarNumber, trigger: "blur" }, ], expressCompany: [{ validator: validateDeliveryExpressCompany, trigger: "blur" }], type: [{ required: true, message: "è¯·éæ©åè´§ç±»å", trigger: "change" }], }, }); @@ -2621,10 +2678,14 @@ row.productModelId || row.modelId ); deliveryForm.value = { shippingCarNumber: "", expressCompany: "", expressNumber: "", type: "货车", batchNo: [], batchNoList, }; deliveryFileList.value = []; deliveryFormVisible.value = true; }; @@ -2662,6 +2723,19 @@ salesLedgerId: salesLedgerId, salesLedgerProductId: currentDeliveryRow.value.id, type: deliveryForm.value.type, shippingCarNumber: deliveryForm.value.type === "货车" ? deliveryForm.value.shippingCarNumber : "", expressCompany: deliveryForm.value.type === "å¿«é" ? deliveryForm.value.expressCompany : "", expressNumber: deliveryForm.value.type === "å¿«é" ? deliveryForm.value.expressNumber : "", storageBlobDTOs: deliveryFileList.value || [], batchNo: deliveryForm.value.batchNo, batchNoDetailList: selectedBatchRows.map(item => ({ stockInventoryId: item.id, @@ -2701,8 +2775,18 @@ }; // å ³éåè´§å¼¹æ¡ const handleDeliveryTypeChange = val => { if (val === "货车") { deliveryForm.value.expressCompany = ""; deliveryForm.value.expressNumber = ""; } else { deliveryForm.value.shippingCarNumber = ""; } }; const closeDeliveryDia = () => { proxy.resetForm("deliveryFormRef"); deliveryFileList.value = []; deliveryFormVisible.value = false; currentDeliveryRow.value = null; };