From f383d3f8212e77a45bd6e99b0a4f8b7566f8339c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期日, 05 七月 2026 11:25:07 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' into dev_pro_山西长治
---
src/api/procurementManagement/procurementLedger.js | 8
src/components/ProcessParamListDialog.vue | 12
src/views/salesManagement/receiptPaymentLedger/index.vue | 14 +
src/views/salesManagement/returnOrder/components/detailDia.vue | 20 +
src/views/financialManagement/receivable/receipt.vue | 71 +++++
src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue | 2
src/views/salesManagement/returnOrder/index.vue | 38 +++
src/views/financialManagement/receivable/salesReturn.vue | 24 ++
src/views/procurementManagement/paymentLedger/index.vue | 16 +
src/api/financialManagement/invoiceApply.js | 11
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js | 12
src/views/procurementManagement/procurementLedger/index.vue | 6
src/views/salesManagement/returnOrder/components/formDia.vue | 137 ++++++++--
src/views/procurementManagement/purchaseReturnOrder/New.vue | 97 +++++++-
src/views/procurementManagement/purchaseReturnOrder/index.vue | 60 +++-
src/views/inventoryManagement/stockManagement/Record.vue | 2
src/views/procurementManagement/purchaseReturnOrder/ProductList.vue | 13
src/views/financialManagement/receivable/outputInvoice.vue | 131 ++++++++--
src/views/financialManagement/payable/purchaseReturn.vue | 24 ++
19 files changed, 577 insertions(+), 121 deletions(-)
diff --git a/src/api/financialManagement/invoiceApply.js b/src/api/financialManagement/invoiceApply.js
index a567d1c..8806bbc 100644
--- a/src/api/financialManagement/invoiceApply.js
+++ b/src/api/financialManagement/invoiceApply.js
@@ -56,4 +56,13 @@
url: `/accountInvoiceApplication/deleteAccountInvoiceApplication?${query}`,
method: "delete",
});
-}
\ No newline at end of file
+}
+
+/** 鏍规嵁瀹㈡埛id鏌ヨ寮�绁ㄧ敵璇峰彴璐� */
+export function getAccountInvoiceApplicationList(query) {
+ return request({
+ url: '/accountInvoiceApplication/getAccountInvoiceApplicationList',
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/procurementManagement/procurementLedger.js b/src/api/procurementManagement/procurementLedger.js
index 88f4ce0..c389582 100644
--- a/src/api/procurementManagement/procurementLedger.js
+++ b/src/api/procurementManagement/procurementLedger.js
@@ -9,6 +9,14 @@
params: query,
});
}
+// 閲囪喘閫�璐у彲閫夐噰璐彴璐�
+export function purchaseReturnableList(query) {
+ return request({
+ url: "/purchase/ledger/returnableList",
+ method: "get",
+ params: query,
+ });
+}
// 鏌ヨ鍚堝悓鍙�
export function getSalesNo(query) {
return request({
diff --git a/src/components/ProcessParamListDialog.vue b/src/components/ProcessParamListDialog.vue
index deee249..5af24bb 100644
--- a/src/components/ProcessParamListDialog.vue
+++ b/src/components/ProcessParamListDialog.vue
@@ -372,7 +372,14 @@
size: paramPage.value.size,
}).then(res => {
if (res.code === 200) {
- filteredParamList.value = res.data?.records || [];
+ const existingParamIds = new Set(
+ (props.paramList || [])
+ .map(item => Number(item.paramId || item.technologyOperationParamId))
+ .filter(id => Number.isFinite(id) && id > 0)
+ );
+ filteredParamList.value = (res.data?.records || []).filter(
+ item => !existingParamIds.has(Number(item.id))
+ );
paramPage.value.total = res.data.total || 0;
} else {
ElMessage.error(res.msg || "鏌ヨ澶辫触");
@@ -402,7 +409,6 @@
addProcessRouteItemParamOrder({
productionOrderId: Number(props.orderId),
productionOrderRoutingOperationId: props.process.id,
- technologyRoutingOperationParamId: props.process.id,
paramId: selectedParam.value.id,
standardValue: selectedParam.value.standardValue || "",
isRequired: selectedParam.value.isRequired || 0,
@@ -667,4 +673,4 @@
.detail-text {
font-weight: 500;
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/financialManagement/payable/purchaseReturn.vue b/src/views/financialManagement/payable/purchaseReturn.vue
index 4171df2..5c274ac 100644
--- a/src/views/financialManagement/payable/purchaseReturn.vue
+++ b/src/views/financialManagement/payable/purchaseReturn.vue
@@ -85,6 +85,30 @@
{ label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
{ label: "渚涘簲鍟�", prop: "supplierName", minWidth: "180" },
{ label: "鍏宠仈鍏ュ簱鍗曞彿", prop: "inboundBatches", minWidth: "150" },
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ minWidth: "110",
+ formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+ },
+ {
+ label: "鍙戣揣杞︾墝鍙�",
+ prop: "truckPlateNo",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "1" ? row?.truckPlateNo || "--" : "--"),
+ },
+ {
+ label: "蹇�掑叕鍙�",
+ prop: "expressCompany",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressCompany || "--" : "--"),
+ },
+ {
+ label: "蹇�掑崟鍙�",
+ prop: "expressNo",
+ minWidth: "150",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressNo || "--" : "--"),
+ },
{ label: "閫�璐ф棩鏈�", prop: "preparedAt", minWidth: "170" },
{
label: "閫�娆炬�婚",
diff --git a/src/views/financialManagement/receivable/outputInvoice.vue b/src/views/financialManagement/receivable/outputInvoice.vue
index 22cc202..effb0af 100644
--- a/src/views/financialManagement/receivable/outputInvoice.vue
+++ b/src/views/financialManagement/receivable/outputInvoice.vue
@@ -37,7 +37,7 @@
<div class="actions">
<div></div>
<div>
- <!-- <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button> -->
+ <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button>
<el-button type="success" @click="handleExport" icon="Download">瀵煎嚭</el-button>
</div>
</div>
@@ -93,7 +93,7 @@
@confirm="submitForm"
@cancel="closeDialog"
>
- <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
+ <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
<el-row v-if="isView" :gutter="20">
<el-col :span="12">
<el-form-item label="鐘舵��">
@@ -111,13 +111,25 @@
</el-col>
<el-col :span="12">
<el-form-item label="瀹㈡埛" prop="customerId">
- <el-select v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isView">
+ <el-select @change="checkCustomer" v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isView">
<el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鍏宠仈寮�绁ㄧ敵璇�" prop="accountInvoiceApplicationId">
+ <el-select v-model="form.accountInvoiceApplicationId"
+ placeholder="璇峰厛閫夋嫨瀹㈡埛"
+ readonly
+ @change="selectionApply"
+ :disabled="!form.customerId || isView"
+ class="outbound-batch-select">
+ <el-option v-for="(item,index) in applyList" :key="index" :label="item.invoiceApplicationNo" :value="item.id"></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
<el-col :span="12">
<el-form-item label="寮�绁ㄦ棩鏈�" prop="invoiceDate">
<el-date-picker
@@ -130,14 +142,15 @@
/>
</el-form-item>
</el-col>
+ </el-row>
+ <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="鍙戠エ绫诲瀷" prop="invoiceType">
<el-select
- v-model="form.invoiceType"
- placeholder="璇烽�夋嫨鍙戠エ绫诲瀷"
- style="width: 100%;"
- :disabled="isView"
- @change="handleInvoiceTypeChange"
+ v-model="form.invoiceType"
+ placeholder="璇烽�夋嫨鍙戠エ绫诲瀷"
+ style="width: 100%;"
+ :disabled="isView"
>
<el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="澧炲�肩◣涓撶敤鍙戠エ" />
<el-option label="澧炲�肩◣鏅�氬彂绁�" value="澧炲�肩◣鏅�氬彂绁�" />
@@ -145,8 +158,6 @@
</el-select>
</el-form-item>
</el-col>
- </el-row>
- <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="绋庣巼" prop="taxRate">
<el-select
@@ -154,7 +165,7 @@
placeholder="璇烽�夋嫨绋庣巼"
style="width: 100%;"
:disabled="isView"
- @change="calculateTax"
+ @change="handleTaxRateChange"
>
<el-option
v-for="dict in tax_rate"
@@ -167,7 +178,7 @@
</el-col>
</el-row>
<el-row :gutter="20">
- <el-col :span="8">
+ <el-col :span="10">
<el-form-item label="閲戦(涓嶅惈绋�)" prop="amount">
<el-input-number
v-model="form.amount"
@@ -175,18 +186,18 @@
:precision="2"
style="width: 100%;"
:disabled="isView"
- @change="calculateTax"
+ @change="handleTaxRateChange"
/>
</el-form-item>
</el-col>
- <el-col :span="8">
+ <el-col :span="7">
<el-form-item label="绋庨">
- <el-input v-model="form.taxAmount" disabled />
+ <el-input v-model="form.taxAmount" style="width: 100%;" disabled />
</el-form-item>
</el-col>
- <el-col :span="8">
+ <el-col :span="7">
<el-form-item label="浠风◣鍚堣">
- <el-input v-model="form.totalAmount" disabled />
+ <el-input v-model="form.totalAmount" style="width: 100%;" disabled />
</el-form-item>
</el-col>
</el-row>
@@ -224,6 +235,7 @@
cancelAccountSalesInvoice,
deleteAccountSalesInvoice,
} from "@/api/financialManagement/accountSalesInvoice.js";
+import {getAccountInvoiceApplicationList} from "@/api/financialManagement/invoiceApply.js";
const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
@@ -271,6 +283,9 @@
const fileDialogVisible = ref(false);
const currentRecordId = ref(0);
+const applySelectVisible = ref(false);
+const applyList = ref([]);
+
const openFileDialog = (row) => {
if (!row.accountInvoiceApplicationId) {
ElMessage.warning("鏈叧鑱斿紑绁ㄧ敵璇凤紝鏃犳硶鏌ョ湅闄勪欢");
@@ -313,17 +328,88 @@
totalAmount: 0,
content: "",
remark: "",
+ deptId: undefined,
accountInvoiceApplicationId: undefined,
storageAttachmentId: undefined,
});
const rules = {
invoiceNo: [{ required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿鐮�", trigger: "blur" }],
+ accountInvoiceApplicationId: [{ required: true, message: "璇烽�夋嫨寮�绁ㄧ敵璇�", trigger: "change" }],
customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
invoiceDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
invoiceType: [{ required: true, message: "璇烽�夋嫨鍙戠エ绫诲瀷", trigger: "change" }],
taxRate: [{ required: true, message: "璇烽�夋嫨绋庣巼", trigger: "change" }],
amount: [{ required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur" }],
+};
+
+// 閫夋嫨瀹㈡埛
+const checkCustomer = (val) =>{
+ loadApplyList(val);
+}
+
+//鏌ヨ寮�绁ㄧ敵璇峰垪琛�
+const loadApplyList = (customerId) => {
+ if (!customerId) {
+ applyList.value = [];
+ return Promise.resolve();
+ }
+ return getAccountInvoiceApplicationList({ customerId })
+ .then(res => {
+ if (res.code === 200) {
+ const list = res.data?.records ?? res.data ?? [];
+ applyList.value = Array.isArray(list) ? list : [];
+ } else {
+ applyList.value = [];
+ }
+ })
+ .catch(() => {
+ applyList.value = [];
+ })
+};
+
+const selectionApply = (val)=>{
+ const applyObj = applyList.value.find(item=>item.id === val);
+ if(!applyObj){
+ ElMessage.warning("璇烽�夋嫨鍏宠仈鐨勫紑绁ㄧ敵璇�");
+ return;
+ }
+ form.remark = applyObj.remark;
+ form.content = applyObj.invoiceContent;
+ form.invoiceDate = applyObj.applyDate;
+ form.invoiceType = applyObj.invoiceType;
+ form.deptId = applyObj.deptId;
+ form.taxRate = applyObj.taxRate;
+ form.totalAmount = applyObj.invoiceAmount
+ handleTaxRateChange();
+}
+
+/** 浠风◣鍚堣鍙樻洿锛氭寜绋庣巼鍙嶇畻涓嶅惈绋庨噾棰濄�佺◣棰� */
+const calculateTaxFromInclusive = (inclusiveTotal) => {
+ const total = Number(inclusiveTotal ?? form.totalAmount ?? 0);
+ if (total <= 0) {
+ form.amount = 0;
+ form.taxAmount = 0;
+ form.totalAmount = 0;
+ return;
+ }
+ const rate = Number(form.taxRate) / 100;
+ form.totalAmount = Number(total.toFixed(2));
+ form.amount = Number((form.totalAmount / (1 + rate)).toFixed(2));
+ form.taxAmount = Number((form.totalAmount - form.amount).toFixed(2));
+};
+
+const calculateTaxFromExclusive = () => {
+ form.taxAmount = Number((form.amount * form.taxRate / 100).toFixed(2));
+ form.totalAmount = Number((form.amount + form.taxAmount).toFixed(2));
+};
+
+const handleTaxRateChange = () => {
+ if (form.totalAmount > 0) {
+ calculateTaxFromInclusive(form.totalAmount);
+ } else {
+ calculateTaxFromExclusive();
+ }
};
const getSummaries = ({ columns, data }) => {
@@ -350,15 +436,6 @@
const formatMoney = (value) => {
if (value === undefined || value === null) return "0.00";
return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
-};
-
-const calculateTax = () => {
- form.taxAmount = Number((form.amount * form.taxRate / 100).toFixed(2));
- form.totalAmount = Number((form.amount + form.taxAmount).toFixed(2));
-};
-
-const handleInvoiceTypeChange = () => {
- calculateTax();
};
const normalizeTableRow = (row) => ({
@@ -506,6 +583,8 @@
const closeDialog = () => {
dialogVisible.value = false;
+ applySelectVisible.value = false;
+ isView.value = false;
isView.value = false;
};
diff --git a/src/views/financialManagement/receivable/receipt.vue b/src/views/financialManagement/receivable/receipt.vue
index 467a368..29194e7 100644
--- a/src/views/financialManagement/receivable/receipt.vue
+++ b/src/views/financialManagement/receivable/receipt.vue
@@ -171,10 +171,10 @@
prop="amount">
<el-input-number v-model="form.amount"
:min="0"
+ :max="collectionAmountInputMax"
:precision="2"
style="width: 100%;"
- :disabled="isView"
- placeholder="鏍规嵁鍏宠仈鍗曟嵁鑷姩姹囨�伙紝鍙慨鏀�" />
+ :disabled="isView" />
</el-form-item>
</el-col>
</el-row>
@@ -368,6 +368,7 @@
const isEdit = ref(false);
const isView = ref(false);
const currentId = ref(null);
+ const originalReceiptAmount = ref(0);
const submitLoading = ref(false);
const customerList = ref([]);
@@ -406,6 +407,46 @@
},
});
+ const maxCollectionAmount = computed(() => {
+ const selected = form.stockOutRecordIds || [];
+ const editAmount = isEdit.value ? Number(originalReceiptAmount.value) || 0 : 0;
+ if (!selected.length) return isEdit.value ? editAmount : undefined;
+ const selectedValueSet = new Set(selected.map(id => String(id)));
+ const selectedOptions = outboundBatchOptions.value.filter(
+ opt => opt.amountLimitAvailable && selectedValueSet.has(String(opt.value))
+ );
+ if (selectedOptions.length !== selectedValueSet.size) {
+ return isEdit.value ? Number(editAmount.toFixed(2)) : undefined;
+ }
+ const sum = selectedOptions.reduce(
+ (acc, opt) => acc + (Number(opt.outboundAmount) || 0),
+ 0
+ );
+ return Number((sum + editAmount).toFixed(2));
+ });
+
+ const collectionAmountInputMax = computed(
+ () => maxCollectionAmount.value ?? Number.MAX_SAFE_INTEGER
+ );
+
+ const validateCollectionAmount = (rule, value, callback) => {
+ if (value === undefined || value === null || value === "") {
+ callback();
+ return;
+ }
+ const amount = Number(value);
+ if (Number.isNaN(amount)) {
+ callback(new Error("璇疯緭鍏ユ敹娆鹃噾棰�"));
+ return;
+ }
+ const max = maxCollectionAmount.value;
+ if (max !== undefined && amount - max > 0.000001) {
+ callback(new Error(`鏀舵閲戦涓嶈兘瓒呰繃${max.toFixed(2)}`));
+ return;
+ }
+ callback();
+ };
+
const rules = {
customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
stockOutRecordIds: [
@@ -420,7 +461,10 @@
receiptDate: [
{ required: true, message: "璇烽�夋嫨鏀舵鏃ユ湡", trigger: "change" },
],
- amount: [{ required: true, message: "璇疯緭鍏ユ敹娆鹃噾棰�", trigger: "blur" }],
+ amount: [
+ { required: true, message: "璇疯緭鍏ユ敹娆鹃噾棰�", trigger: "blur" },
+ { validator: validateCollectionAmount, trigger: ["blur", "change"] },
+ ],
receiptMethod: [
{ required: true, message: "璇烽�夋嫨鏀舵鏂瑰紡", trigger: "change" },
],
@@ -480,7 +524,12 @@
return list.map((item, index) => {
if (typeof item === "string" || typeof item === "number") {
const text = String(item);
- return { label: text, value: text, outboundAmount: 0 };
+ return {
+ label: text,
+ value: text,
+ outboundAmount: 0,
+ amountLimitAvailable: false,
+ };
}
const label =
item.outboundBatches ??
@@ -490,10 +539,15 @@
item.label ??
`鍑哄簱鍗�${index + 1}`;
const value = item.id ?? item.stockOutRecordId ?? label;
+ const outboundAmount = Number(item.outboundAmount) || 0;
+ const amountReceived = Number(item.amountReceived) || 0;
+ const availableAmount = outboundAmount - amountReceived;
return {
label: String(label),
value,
- outboundAmount: (Number(item.outboundAmount)-Number(item.amountReceived)) || 0,
+ outboundAmount:
+ availableAmount > 0 ? Number(availableAmount.toFixed(2)) : 0,
+ amountLimitAvailable: true,
};
});
};
@@ -541,6 +595,7 @@
label: String(id),
value: id,
outboundAmount: 0,
+ amountLimitAvailable: false,
});
});
};
@@ -643,6 +698,7 @@
outboundSelectVisible.value = false;
syncCollectionAmount();
formRef.value?.validateField("stockOutRecordIds");
+ formRef.value?.validateField("amount");
};
const handleOutboundDialogClosed = () => {
@@ -713,6 +769,7 @@
outboundSelectVisible.value = false;
isView.value = false;
isEdit.value = false;
+ originalReceiptAmount.value = 0;
};
const handleExport = () => {
@@ -772,6 +829,7 @@
isEdit.value = false;
isView.value = false;
dialogTitle.value = "鏂板鏀舵";
+ originalReceiptAmount.value = 0;
Object.assign(form, {
receiptCode: "",
customerId: "",
@@ -794,13 +852,16 @@
currentId.value = row.id;
dialogTitle.value = "缂栬緫鏀舵";
fillFormFromRow(row);
+ originalReceiptAmount.value = Number(form.amount || 0);
dialogVisible.value = true;
+ loadOutboundBatches(form.customerId, true);
};
const view = row => {
isView.value = true;
isEdit.value = false;
dialogTitle.value = "鏌ョ湅鏀舵";
+ originalReceiptAmount.value = 0;
fillFormFromRow(row);
dialogVisible.value = true;
};
diff --git a/src/views/financialManagement/receivable/salesReturn.vue b/src/views/financialManagement/receivable/salesReturn.vue
index afe363c..85153bf 100644
--- a/src/views/financialManagement/receivable/salesReturn.vue
+++ b/src/views/financialManagement/receivable/salesReturn.vue
@@ -77,6 +77,30 @@
{ label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
{ label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: "180" },
{ label: "鍏宠仈鍙戣揣鍗曞彿", prop: "shippingNo", minWidth: "150" },
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ minWidth: "110",
+ formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+ },
+ {
+ label: "鍙戣揣杞︾墝鍙�",
+ prop: "truckPlateNo",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "1" ? row?.truckPlateNo || "--" : "--"),
+ },
+ {
+ label: "蹇�掑叕鍙�",
+ prop: "expressCompany",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressCompany || "--" : "--"),
+ },
+ {
+ label: "蹇�掑崟鍙�",
+ prop: "expressNo",
+ minWidth: "150",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressNo || "--" : "--"),
+ },
{ label: "閫�璐ф棩鏈�", prop: "makeTime", minWidth: "170" },
{
label: "閫�娆炬�婚",
diff --git a/src/views/inventoryManagement/stockManagement/Record.vue b/src/views/inventoryManagement/stockManagement/Record.vue
index 934ae06..9ee214c 100644
--- a/src/views/inventoryManagement/stockManagement/Record.vue
+++ b/src/views/inventoryManagement/stockManagement/Record.vue
@@ -46,7 +46,7 @@
</el-col>
</el-row>
</el-form>
- <div>
+ <div style="display: flex; gap: 10px; flex-wrap: nowrap;">
<el-button type="primary"
@click="isShowNewModal = true">鏂板搴撳瓨</el-button>
<el-button type="info"
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index 58b612b..d057f16 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -50,7 +50,7 @@
<el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
<el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
<el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDate || "--" }}</el-descriptions-item>
<el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
<el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
<el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 25b6ae5..737e2de 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -310,7 +310,10 @@
else if (row.businessType === 5) {
const purchaseContractNumber = row?.purchaseContractNumber;
if (purchaseContractNumber) {
- const res = await getPurchaseByCode({ purchaseContractNumber });
+ const res = await getPurchaseByCode({
+ purchaseContractNumber,
+ approvalInstanceId: row?.id,
+ });
detailData.value = res || {};
}
}
@@ -355,7 +358,10 @@
else if (row.businessType === 5) {
const purchaseContractNumber = row?.purchaseContractNumber;
if (purchaseContractNumber) {
- const res = await getPurchaseByCode({ purchaseContractNumber });
+ const res = await getPurchaseByCode({
+ purchaseContractNumber,
+ approvalInstanceId: row?.id,
+ });
detailData.value = res || {};
}
}
@@ -699,4 +705,4 @@
openApprove,
fetchApprovalList,
};
-}
\ No newline at end of file
+}
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 99b4b39..7fba9cb 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -46,6 +46,10 @@
prop="paymentAmount"
show-overflow-tooltip
:formatter="formattedNumber" />
+ <el-table-column label="閫�璐ч噾棰�(鍏�)"
+ prop="returnAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber" />
<el-table-column label="搴斾粯閲戦(鍏�)"
prop="payableAmount"
show-overflow-tooltip>
@@ -153,6 +157,14 @@
},
},
{
+ label: "閫�璐ч噾棰�(鍏�)",
+ prop: "returnAmount",
+ width: 200,
+ formatData: params => {
+ return params ? parseFloat(params).toFixed(2) : 0;
+ },
+ },
+ {
label: "搴斾粯閲戦(鍏�)",
dataType: "slot",
width: 200,
@@ -170,7 +182,7 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["contractAmounts", "paymentAmount", "payableAmount"],
+ ["contractAmounts", "paymentAmount", "returnAmount", "payableAmount"],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -181,7 +193,7 @@
const summarizeMainTable1 = param => {
let summarizeTable = proxy.summarizeTable(
param,
- ["contractAmount", "invoiceAmount", "paymentAmount"],
+ ["contractAmount", "invoiceAmount", "paymentAmount", "returnAmount"],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index ed7e5d9..7e1576b 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -121,6 +121,8 @@
</el-table-column>
<el-table-column label="鏁伴噺"
prop="quantity" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�"
+ prop="shippedQuantity" />
<el-table-column label="鍙敤鏁伴噺"
prop="availableQuality" />
<el-table-column label="閫�璐ф暟閲�"
@@ -219,7 +221,7 @@
<el-button link
type="primary"
@click="openForm('edit', scope.row)"
- :disabled="scope.row.stockInStatus === '瀹屽叏鍏ュ簱'">缂栬緫
+ :disabled="scope.row.approvalStatus === 3">缂栬緫
</el-button>
<el-button link
type="primary"
@@ -1747,7 +1749,7 @@
return;
}
const ids = selectedRows.value.map((item) => item.id);
-
+
ElMessageBox.confirm("纭鎵归噺鐢熸垚鏁版嵁锛�", "鎵归噺鐢熸垚", {
confirmButtonText: "纭",
cancelButtonText: "鍙栨秷",
diff --git a/src/views/procurementManagement/purchaseReturnOrder/New.vue b/src/views/procurementManagement/purchaseReturnOrder/New.vue
index 9474b11..186a552 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/New.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/New.vue
@@ -58,6 +58,63 @@
</el-form-item>
<el-form-item
+ label="鍙戣揣绫诲瀷"
+ prop="shippingType"
+ :rules="[
+ {
+ required: true,
+ message: '璇烽�夋嫨鍙戣揣绫诲瀷',
+ trigger: 'change',
+ }
+ ]"
+ >
+ <el-select
+ v-model="formState.shippingType"
+ placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
+ style="width: 240px"
+ @change="handleShippingTypeChange"
+ >
+ <el-option label="璐ц溅" :value="1" />
+ <el-option label="蹇��" :value="2" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item
+ v-if="formState.shippingType === 1"
+ label="鍙戣揣杞︾墝鍙�"
+ prop="truckPlateNo"
+ >
+ <el-input
+ v-model="formState.truckPlateNo"
+ placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿"
+ style="width: 240px"
+ />
+ </el-form-item>
+
+ <template v-else-if="formState.shippingType === 2">
+ <el-form-item
+ label="蹇�掑叕鍙�"
+ prop="expressCompany"
+ >
+ <el-input
+ v-model="formState.expressCompany"
+ placeholder="璇疯緭鍏ュ揩閫掑叕鍙�"
+ style="width: 240px"
+ />
+ </el-form-item>
+ <el-form-item
+ label="蹇�掑崟鍙�"
+ prop="expressNo"
+ >
+ <el-input
+ v-model="formState.expressNo"
+ placeholder="璇疯緭鍏ュ揩閫掑崟鍙�"
+ style="width: 240px"
+ />
+ </el-form-item>
+ </template>
+
+ <el-form-item
label="渚涘簲鍟嗗悕绉�"
prop="supplierId"
:rules="[
@@ -259,13 +316,16 @@
<el-table-column label="鏁伴噺"
prop="stockInNum"
width="100" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�"
+ prop="saleOutQuantity"
+ width="120" />
<el-table-column label="鍙��璐ф暟閲�"
prop="unQuantity"
width="130" />
<el-table-column label="宸查��璐ф暟閲�"
width="130">
<template #default="scope">
- {{ calcAlreadyReturned(scope.row) }}
+ {{ formattedNumber(scope.row, null, scope.row.totalReturnNum || 0) }}
</template>
</el-table-column>
<el-table-column label="閫�璐ф暟閲�"
@@ -420,7 +480,7 @@
<script setup>
import {ref, computed, getCurrentInstance, watch, defineAsyncComponent} from "vue";
import {createPurchaseReturnOrder} from "@/api/procurementManagement/purchase_return_order.js";
-import {getOptions, purchaseList} from "@/api/procurementManagement/procurementLedger.js";
+import {getOptions, purchaseReturnableList} from "@/api/procurementManagement/procurementLedger.js";
import {userListNoPageByTenantId} from "@/api/system/user.js";
const ProductList = defineAsyncComponent(() => import("@/views/procurementManagement/purchaseReturnOrder/ProductList.vue"));
const props = defineProps({
@@ -455,6 +515,10 @@
no: '',
isDefaultNo: true,
returnType: 0,
+ shippingType: undefined,
+ truckPlateNo: '',
+ expressCompany: '',
+ expressNo: '',
incomeType: undefined,
remark: '',
supplierId: undefined,
@@ -501,6 +565,19 @@
// 鏄惁灞曠ず浜у搧鍒楄〃鏁版嵁
const isShowProductsModal = ref(false)
+const handleShippingTypeChange = (val) => {
+ if (val === 1) {
+ formState.value.expressCompany = '';
+ formState.value.expressNo = '';
+ } else if (val === 2) {
+ formState.value.truckPlateNo = '';
+ } else {
+ formState.value.truckPlateNo = '';
+ formState.value.expressCompany = '';
+ formState.value.expressNo = '';
+ }
+};
+
const isShow = computed({
get() {
return props.visible;
@@ -528,14 +605,6 @@
const toNumber = (val) => {
const num = Number(val)
return Number.isNaN(num) ? 0 : num
-}
-
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
- const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0)
- const un = Number(row?.unQuantity ?? 0)
- if (!Number.isFinite(total) || !Number.isFinite(un)) return 0
- return Math.max(total - un, 0)
}
const getReturnTotal = (row) => {
@@ -581,6 +650,10 @@
}
const closeModal = () => {
+ formState.value.shippingType = undefined;
+ formState.value.truckPlateNo = '';
+ formState.value.expressCompany = '';
+ formState.value.expressNo = '';
isShow.value = false;
};
@@ -674,7 +747,7 @@
const fetchPurchaseLedgerOptions = () => {
purchaseLedgerOptions.value = []
if (formState.value.supplierId) {
- purchaseList({supplierId: formState.value.supplierId,approvalStatus:3}).then((res) => {
+ purchaseReturnableList({ supplierId: formState.value.supplierId }).then((res) => {
purchaseLedgerOptions.value = res.rows;
});
}
@@ -805,4 +878,4 @@
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
index 27fae4a..9b3e6f7 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
@@ -34,13 +34,16 @@
<el-table-column label="鏁伴噺"
prop="stockInNum"
width="70" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�"
+ prop="saleOutQuantity"
+ width="120" />
<el-table-column label="鍙��璐ф暟閲�"
prop="unQuantity"
width="130" />
<el-table-column label="宸查��璐ф暟閲�"
width="130">
<template #default="scope">
- {{ calcAlreadyReturned(scope.row) }}
+ {{ formattedNumber(scope.row, null, scope.row.totalReturnNum || 0) }}
</template>
</el-table-column>
<!-- <el-table-column label="搴撳瓨棰勮鏁伴噺"
@@ -118,14 +121,6 @@
const formattedNumber = (row, column, cellValue) => {
return parseFloat(cellValue).toFixed(2);
};
-
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
- const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0)
- const un = Number(row?.unQuantity ?? 0)
- if (!Number.isFinite(total) || !Number.isFinite(un)) return 0
- return Math.max(total - un, 0)
-}
const handleChangeSelection = (val) => {
selectedRows.value = val;
diff --git a/src/views/procurementManagement/purchaseReturnOrder/index.vue b/src/views/procurementManagement/purchaseReturnOrder/index.vue
index f8866e1..2b73253 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/index.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/index.vue
@@ -45,8 +45,13 @@
@click="handleDetail(row)"
>璇︽儏</el-button
>
- <el-button link size="small" @click="handleDelete(row)"
- >鍒犻櫎</el-button
+ <el-button
+ link
+ size="small"
+ :disabled="row.stockOutApproved"
+ :style="{ color: row.stockOutApproved ? '#c0c4cc' : undefined }"
+ @click="handleDelete(row)"
+ >{{ row.stockOutApproved }}</el-button
>
</template>
</PIMTable>
@@ -89,6 +94,20 @@
<el-descriptions-item label="閫�鏂欎汉">{{
detailData.returnUserName || "--"
}}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣绫诲瀷">{{
+ getShippingTypeLabel(detailData.shippingType)
+ }}</el-descriptions-item>
+ <el-descriptions-item v-if="String(detailData.shippingType) === '1'" label="鍙戣揣杞︾墝鍙�">{{
+ detailData.truckPlateNo || "--"
+ }}</el-descriptions-item>
+ <template v-else-if="String(detailData.shippingType) === '2'">
+ <el-descriptions-item label="蹇�掑叕鍙�">{{
+ detailData.expressCompany || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑崟鍙�">{{
+ detailData.expressNo || "--"
+ }}</el-descriptions-item>
+ </template>
<el-descriptions-item label="鏁村崟鎶樻墸棰�">{{
formatAmount(detailData.totalDiscountAmount)
}}</el-descriptions-item>
@@ -142,13 +161,14 @@
/>
<el-table-column label="鍗曚綅" prop="unit" width="80" />
<el-table-column label="鏁伴噺" prop="stockInNum" width="80" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�" prop="saleOutQuantity" width="110" />
<el-table-column label="鍙��璐ф暟閲�"
prop="unQuantity"
width="100" />
<el-table-column label="宸查��璐ф暟閲�"
width="100">
<template #default="scope">
- {{ calcAlreadyReturned(scope.row) }}
+ {{ formatAmount(scope.row.totalReturnNum || 0) }}
</template>
</el-table-column>
<!-- <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" /> -->
@@ -289,6 +309,15 @@
prop: "returnUserName",
width: 110,
},
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ width: 100,
+ formatData: (val) => getShippingTypeLabel(val),
+ },
+ { label: "鍙戣揣杞︾墝鍙�", prop: "truckPlateDisplay", width: 140 },
+ { label: "蹇�掑叕鍙�", prop: "expressCompanyDisplay", width: 140 },
+ { label: "蹇�掑崟鍙�", prop: "expressNoDisplay", width: 150 },
{
label: "鏁村崟鎶樻墸棰�",
@@ -341,6 +370,7 @@
},
{
name: "鍒犻櫎",
+ disabled: (row) => !!row.stockOutApproved,
clickFun: (row) => {
handleDelete(row);
},
@@ -422,7 +452,12 @@
findPurchaseReturnOrderListPage({ ...searchForm.value, ...page })
.then((res) => {
tableLoading.value = false;
- tableData.value = res.data.records;
+ tableData.value = (res.data.records || []).map((row) => ({
+ ...row,
+ truckPlateDisplay: String(row?.shippingType) === "1" ? (row?.truckPlateNo || "--") : "--",
+ expressCompanyDisplay: String(row?.shippingType) === "2" ? (row?.expressCompany || "--") : "--",
+ expressNoDisplay: String(row?.shippingType) === "2" ? (row?.expressNo || "--") : "--",
+ }));
page.total = res.data.total;
})
.catch(() => {
@@ -450,6 +485,14 @@
);
};
+const getShippingTypeLabel = (value) => {
+ const shippingTypeMap = {
+ 1: "璐ц溅",
+ 2: "蹇��",
+ };
+ return shippingTypeMap[String(value)] || shippingTypeMap[value] || "--";
+};
+
const formatAmount = (value) => {
if (value === null || value === undefined || value === "") {
return "--";
@@ -461,14 +504,6 @@
return num.toFixed(2);
};
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
- const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0);
- const un = Number(row?.unQuantity ?? 0);
- if (!Number.isFinite(total) || !Number.isFinite(un)) return 0;
- return Math.max(total - un, 0);
-};
-
onMounted(() => {
getList();
});
@@ -478,4 +513,3 @@
margin-top: unset;
}
</style>
-
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index f5a9d8f..a87a160 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -46,6 +46,11 @@
show-overflow-tooltip
:formatter="formattedNumber"
width="200" />
+ <el-table-column label="閫�璐ч噾棰�(鍏�)"
+ prop="returnAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber"
+ width="200" />
<el-table-column label="搴旀敹閲戦(鍏�)"
prop="receiptableAmount"
show-overflow-tooltip
@@ -93,6 +98,11 @@
width="200" />
<el-table-column label="鍥炴閲戦(鍏�)"
prop="receiptPaymentAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber"
+ width="200" />
+ <el-table-column label="閫�璐ч噾棰�(鍏�)"
+ prop="returnAmount"
show-overflow-tooltip
:formatter="formattedNumber"
width="200" />
@@ -180,7 +190,7 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+ ["invoiceTotal", "receiptPaymentAmount", "returnAmount", "unReceiptPaymentAmount"],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -191,7 +201,7 @@
const summarizeMainTable1 = param => {
var summarizeTable = proxy.summarizeTable(
param,
- ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
+ ["contractAmount", "receiptPaymentAmount", "returnAmount", "receiptableAmount"],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
diff --git a/src/views/salesManagement/returnOrder/components/detailDia.vue b/src/views/salesManagement/returnOrder/components/detailDia.vue
index ecc663f..a09149f 100644
--- a/src/views/salesManagement/returnOrder/components/detailDia.vue
+++ b/src/views/salesManagement/returnOrder/components/detailDia.vue
@@ -11,6 +11,12 @@
<el-descriptions-item label="閿�鍞崟鍙�">{{ detail.salesContractNo }}</el-descriptions-item>
<el-descriptions-item label="涓氬姟鍛�">{{ detail.salesman }}</el-descriptions-item>
<el-descriptions-item label="鍏宠仈鍙戣揣鍗曞彿">{{ detail.shippingNo }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣绫诲瀷">{{ getShippingTypeText(detail.shippingType) }}</el-descriptions-item>
+ <el-descriptions-item v-if="String(detail.shippingType) === '1'" label="鍙戣揣杞︾墝鍙�">{{ detail.truckPlateNo || "--" }}</el-descriptions-item>
+ <template v-else-if="String(detail.shippingType) === '2'">
+ <el-descriptions-item label="蹇�掑叕鍙�">{{ detail.expressCompany || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑崟鍙�">{{ detail.expressNo || "--" }}</el-descriptions-item>
+ </template>
<!-- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detail.projectName }}</el-descriptions-item> -->
<el-descriptions-item label="鍒跺崟浜�">{{ detail.maker }}</el-descriptions-item>
<el-descriptions-item label="鍒跺崟鏃堕棿">{{ detail.makeTime }}</el-descriptions-item>
@@ -21,9 +27,6 @@
<div style="padding-top: 20px">
<span class="descriptions">浜у搧鍒楄〃</span>
<PIMTable :isShowPagination="false" rowKey="id" :column="tableColumn" :tableData="tableData">
- <template #totalReturnNum="{ row }">
- {{ calcAlreadyReturned(row) }}
- </template>
</PIMTable>
</div>
</div>
@@ -44,6 +47,10 @@
const detail = ref({});
const tableData = ref([]);
const availableProducts = ref([]);
+const shippingTypeMap = {
+ 1: "璐ц溅",
+ 2: "蹇��",
+};
const sameKey = (a, b) => a != null && b != null && String(a) === String(b);
@@ -113,6 +120,8 @@
if (!Number.isFinite(total) || !Number.isFinite(un)) return 0;
return Math.max(total - un, 0);
};
+
+const getShippingTypeText = (value) => shippingTypeMap[String(value)] || shippingTypeMap[value] || "--";
/** 璇︽儏琛ㄧ敤 productName / model锛涘悎骞舵椂鍕胯绌轰覆鐩栨帀鍑哄簱琛屽瓧娈� */
const mergeDetailProductRow = (product, normalized) => {
@@ -252,8 +261,9 @@
{align: "center", label: "瑙勬牸鍨嬪彿", prop: "model"},
{align: "center", label: "鍗曚綅", prop: "unit", width: 80},
{align: "center", label: "鎬绘暟閲�", prop: "stockOutNum", width: 120},
- {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120, dataType: "slot", slot: "totalReturnNum"},
+ {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120},
{align: "center", label: "鏈��璐ф暟閲�", prop: "unQuantity", width: 120},
+ {align: "center", label: "寰呭鐞嗛��璐ф暟閲�", prop: "pendingReturnNum", width: 120},
{align: "center", label: "閫�璐ф暟閲�", prop: "returnQuantity", width: 120},
{align: "center", label: "閫�璐т骇鍝佸崟浠�", prop: "price", width: 120},
{align: "center", label: "閫�璐т骇鍝侀噾棰�", prop: "amount", width: 120},
@@ -284,7 +294,7 @@
try {
const res = await returnManagementGetById({ returnManagementId: row.id });
detail.value = res?.data ?? res ?? {};
-
+
if (detail.value.shippingId) {
const productRes = await returnManagementGetByShippingId({ shippingId: detail.value.shippingId });
if (productRes.code === 200) {
diff --git a/src/views/salesManagement/returnOrder/components/formDia.vue b/src/views/salesManagement/returnOrder/components/formDia.vue
index 81d9487..4fc0859 100644
--- a/src/views/salesManagement/returnOrder/components/formDia.vue
+++ b/src/views/salesManagement/returnOrder/components/formDia.vue
@@ -69,6 +69,31 @@
</el-form-item>
</el-col>
<el-col :span="4">
+ <el-form-item label="鍙戣揣绫诲瀷锛�" prop="shippingType">
+ <el-select v-model="form.shippingType" placeholder="璇烽�夋嫨鍙戣揣绫诲瀷" @change="handleShippingTypeChange">
+ <el-option label="璐ц溅" :value="1" />
+ <el-option label="蹇��" :value="2" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="4" v-if="form.shippingType === 1">
+ <el-form-item label="鍙戣揣杞︾墝鍙凤細" prop="truckPlateNo">
+ <el-input v-model="form.truckPlateNo" placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿" />
+ </el-form-item>
+ </el-col>
+ <template v-else-if="form.shippingType === 2">
+ <el-col :span="4">
+ <el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
+ <el-input v-model="form.expressCompany" placeholder="璇疯緭鍏ュ揩閫掑叕鍙�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="4">
+ <el-form-item label="蹇�掑崟鍙凤細" prop="expressNo">
+ <el-input v-model="form.expressNo" placeholder="璇疯緭鍏ュ揩閫掑崟鍙�" />
+ </el-form-item>
+ </el-col>
+ </template>
+ <el-col :span="4">
<el-form-item label="閫�娆炬�婚锛�" prop="refundAmount">
<el-input v-model="form.refundAmount" disabled placeholder="鑷姩璁$畻" />
</el-form-item>
@@ -82,32 +107,29 @@
<el-button type="primary" @click="openProductSelection" :disabled="!form.shippingId">娣诲姞浜у搧</el-button>
</div>
<PIMTable :isShowPagination="false" rowKey="id" :column="tableColumn" :tableData="tableData">
- <template #totalReturnNum="{ row }">
- {{ calcAlreadyReturned(row) }}
- </template>
<template #returnQuantity="{ row }">
- <el-input
- v-model="row.returnQuantity"
- style="width:100px"
- placeholder="璇疯緭鍏�"
+ <el-input
+ v-model="row.returnQuantity"
+ style="width:100px"
+ placeholder="璇疯緭鍏�"
type="number"
@input="(val) => handleReturnQuantityChange(val, row)"
/>
</template>
<template #price="{ row }">
- <el-input
- v-model="row.price"
- style="width:100px"
- placeholder="璇疯緭鍏�"
+ <el-input
+ v-model="row.price"
+ style="width:100px"
+ placeholder="璇疯緭鍏�"
type="number"
@input="(val) => handlePriceChange(val, row)"
/>
</template>
<template #amount="{ row }">
- <el-input
- v-model="row.amount"
- style="width:100px"
- placeholder="鑷姩璁$畻"
+ <el-input
+ v-model="row.amount"
+ style="width:100px"
+ placeholder="鑷姩璁$畻"
type="number"
disabled
/>
@@ -119,10 +141,10 @@
</el-select>
</template>
<template #remark="{ row }">
- <el-input
- v-model="row.remark"
- style="width:130px"
- placeholder="璇疯緭鍏�"
+ <el-input
+ v-model="row.remark"
+ style="width:130px"
+ placeholder="璇疯緭鍏�"
/>
</template>
<template #action="{ index }">
@@ -140,9 +162,9 @@
</el-dialog>
<el-dialog v-model="productSelectionVisible" title="閫夋嫨浜у搧" width="70%" append-to-body>
- <el-table
- :data="availableProducts"
- style="width: 100%"
+ <el-table
+ :data="availableProducts"
+ style="width: 100%"
@selection-change="handleSelectionChange"
ref="productTableRef"
row-key="id"
@@ -154,11 +176,9 @@
<el-table-column align="center" prop="specificationModel" label="瑙勬牸鍨嬪彿" />
<el-table-column align="center" prop="unit" label="鍗曚綅" />
<el-table-column align="center" prop="stockOutNum" label="鎬绘暟閲�" />
+ <el-table-column align="center" label="宸查��璐ф暟閲�" prop="totalReturnNum"></el-table-column>
<el-table-column align="center" prop="unQuantity" label="鏈��璐ф暟閲�" />
- <el-table-column align="center" label="宸查��璐ф暟閲�">
- <template #default="{ row }">{{ calcAlreadyReturned(row) }}</template>
- </el-table-column>
-
+ <el-table-column align="center" prop="pendingReturnNum" label="寰呭鐞嗛��璐ф暟閲�" />
</el-table>
<template #footer>
<div class="dialog-footer">
@@ -191,6 +211,10 @@
returnNo: "",
customerId: "",
shippingId: "",
+ shippingType: "",
+ truckPlateNo: "",
+ expressCompany: "",
+ expressNo: "",
projectId: "",
maker: "",
makeTime: "",
@@ -208,6 +232,7 @@
}],
customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
shippingId: [{ required: true, message: "璇烽�夋嫨鍏宠仈鍑哄簱鍗曞彿", trigger: "change" }],
+ shippingType: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
}
});
const { form, rules } = toRefs(data);
@@ -226,7 +251,8 @@
{align: "center", label: "瑙勬牸鍨嬪彿", prop: "specificationModel" },
{align: "center", label: "鍗曚綅", prop: "unit", width: 80 },
{align: "center", label: "鎬绘暟閲�", prop: "stockOutNum", width: 120 },
- {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120, dataType: "slot", slot: "totalReturnNum" },
+ {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120 },
+ {align: "center", label: "寰呭鐞嗛��璐ф暟閲�", prop: "pendingReturnNum", width: 120 },
{align: "center", label: "鏈��璐ф暟閲�", prop: "unQuantity", width: 120 },
{align: "center", label: "閫�璐ф暟閲�", prop: "returnQuantity", dataType: "slot", slot: "returnQuantity", width: 120 },
{align: "center", label: "閫�璐т骇鍝佸崟浠�", prop: "price", dataType: "slot", slot: "price", width: 120 },
@@ -495,6 +521,10 @@
returnNo: "",
customerId: "",
shippingId: "",
+ shippingType: "",
+ truckPlateNo: "",
+ expressCompany: "",
+ expressNo: "",
projectId: "",
maker: "",
makeTime: "",
@@ -541,6 +571,11 @@
const payload = { ...form.value, returnSaleProducts };
delete payload.returnNoCheckbox;
if (operationType.value === "add" && form.value.returnNoCheckbox) delete payload.returnNo;
+ if (payload.shippingType !== 1) payload.truckPlateNo = "";
+ if (payload.shippingType !== 2) {
+ payload.expressCompany = "";
+ payload.expressNo = "";
+ }
if (operationType.value === "add") {
returnManagementAdd(payload).then(() => {
proxy.$modal.msgSuccess("鏂板鎴愬姛");
@@ -559,6 +594,22 @@
proxy.resetForm("formRef");
dialogFormVisible.value = false;
emit('close');
+ data.form = {
+ returnNoCheckbox: true,
+ returnNo: "",
+ customerId: "",
+ shippingId: "",
+ shippingType: "",
+ truckPlateNo: "",
+ expressCompany: "",
+ expressNo: "",
+ projectId: "",
+ maker: "",
+ makeTime: "",
+ status: 0,
+ returnReason: "",
+ refundAmount: "",
+ }
};
const initCustomers = async () => {
@@ -595,13 +646,26 @@
formRef.value?.validateField('returnNo');
};
+const handleShippingTypeChange = (val) => {
+ if (val === 1) {
+ form.value.expressCompany = "";
+ form.value.expressNo = "";
+ } else if (val === 2) {
+ form.value.truckPlateNo = "";
+ } else {
+ form.value.truckPlateNo = "";
+ form.value.expressCompany = "";
+ form.value.expressNo = "";
+ }
+};
+
const customerNameChange = async (val, clearDownstream = true) => {
// val is customerId now
if (clearDownstream) {
form.value.shippingId = "";
outboundOptions.value = [];
}
-
+
// Find customer name for getSalesLedger if it requires name
const customer = customerNameOptions.value.find(c => c.id === val);
if (!customer) return;
@@ -609,7 +673,7 @@
// Assuming getSalesLedger takes customerName. If it takes ID, adjust accordingly.
// Previous code used customerName. Let's try passing customerName.
getSalesLedger({
- customerName: customer.label,
+ customerName: customer.label,
}).then(res => {
if(res.code === 200){
outboundOptions.value = res.data.map(item => ({
@@ -626,7 +690,7 @@
if(res.code === 200){
// If backend returns project info, set it
if (res.data.projectId) form.value.projectId = res.data.projectId;
-
+
availableProducts.value = mergeShippingProductLists(res.data);
if (clearTable) tableData.value = [];
}
@@ -634,9 +698,12 @@
const handleReturnQuantityChange = (val, row) => {
if (val === "" || val === null) return;
- const max = row.unQuantity === undefined || row.unQuantity === null ? Infinity : Number(row.unQuantity || 0);
+ const unQuantity = row.unQuantity === undefined || row.unQuantity === null ? Infinity : Number(row.unQuantity || 0);//鏈��璐ф暟閲�
+ const pendingReturnNum = row.pendingReturnNum === undefined || row.pendingReturnNum === null ? Infinity : Number(row.pendingReturnNum || 0);//寰呭鐞嗛��璐ф暟閲�
+ //鏈�澶ч��璐ф暟閲忥紝濡傛灉涓虹紪杈戠姸鎬佸姞涓婂緟澶勭悊閫�璐ф暟閲�
+ const max = operationType.value === 'edit' ? unQuantity + pendingReturnNum : unQuantity
const current = Number(val);
-
+
if (current > max) {
proxy.$nextTick(() => {
row.returnQuantity = max;
@@ -702,7 +769,7 @@
// Removed checkSelectable to allow toggling existing items
const confirmProductSelection = () => {
const newTableData = [];
-
+
selectedProducts.value.forEach(product => {
const existing = tableData.value.find(item => item.id === product.id);
if (existing) {
@@ -710,7 +777,7 @@
} else {
newTableData.push({
...product,
- returnSaleLedgerProductId: product.id,
+ returnSaleLedgerProductId: product.id,
productModelId: product.productModelId,
returnQuantity: 0,
num: 0,
@@ -728,7 +795,7 @@
});
}
});
-
+
tableData.value = newTableData;
productSelectionVisible.value = false;
};
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index 0a8257b..1bcda4d 100644
--- a/src/views/salesManagement/returnOrder/index.vue
+++ b/src/views/salesManagement/returnOrder/index.vue
@@ -38,6 +38,9 @@
<template #status="{ row }">
<el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
</template>
+ <template #stockInApprovalStatus="{ row }">
+ <el-tag :type="getStockInApprovalStatusType(row.stockInApprovalStatus)">{{ getStockInApprovalStatusText(row.stockInApprovalStatus) }}</el-tag>
+ </template>
</PIMTable>
</div>
<form-dia ref="formDia" @close="handleQuery" />
@@ -114,11 +117,21 @@
const defaultColumns = [
{ label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: 160 },
{ label: "鍗曟嵁鐘舵��", prop: "status", minWidth: 90, dataType: "slot", slot: "status" },
+ { label: "鍏ュ簱瀹℃壒鐘舵��", prop: "stockInApprovalStatus", minWidth: 120, dataType: "slot", slot: "stockInApprovalStatus" },
{ label: "鍒跺崟鏃堕棿", prop: "makeTime", minWidth: 170 },
{ label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: 220 },
{ label: "閿�鍞崟鍙�", prop: "salesContractNo", minWidth: 160 },
{ label: "涓氬姟鍛�", prop: "salesman", minWidth: 120 },
{ label: "鍏宠仈鍙戣揣鍗曞彿", prop: "shippingNo", minWidth: 170 },
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ minWidth: 100,
+ formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+ },
+ { label: "鍙戣揣杞︾墝鍙�", prop: "truckPlateDisplay", minWidth: 140 },
+ { label: "蹇�掑叕鍙�", prop: "expressCompanyDisplay", minWidth: 140 },
+ { label: "蹇�掑崟鍙�", prop: "expressNoDisplay", minWidth: 150 },
{ label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
{ label: "鍒跺崟浜�", prop: "maker", minWidth: 120 },
{
@@ -164,7 +177,12 @@
tableLoading.value = true;
returnManagementList({ ...searchForm.value, ...page }).then(res => {
tableLoading.value = false;
- tableData.value = res?.data?.records || [];
+ tableData.value = (res?.data?.records || []).map((row) => ({
+ ...row,
+ truckPlateDisplay: String(row?.shippingType) === "1" ? (row?.truckPlateNo || "--") : "--",
+ expressCompanyDisplay: String(row?.shippingType) === "2" ? (row?.expressCompany || "--") : "--",
+ expressNoDisplay: String(row?.shippingType) === "2" ? (row?.expressNo || "--") : "--",
+ }));
page.total = res?.data?.total || 0;
}).finally(() => tableLoading.value = false);
};
@@ -207,6 +225,24 @@
return statusMap[status] || "鏈煡";
};
+const getStockInApprovalStatusType = (status) => {
+ const statusMap = {
+ 0: "",
+ 1: "success",
+ 2: "warning"
+ };
+ return statusMap[status] || "info";
+};
+
+const getStockInApprovalStatusText = (status) => {
+ const statusMap = {
+ 0: "鏈鎵�",
+ 1: "宸插鎵�",
+ 2: "瀹℃壒涓�"
+ };
+ return statusMap[status] || "鏈煡";
+};
+
onMounted(() => {
getList();
});
--
Gitblit v1.9.3