From 60a702a3dbcbe6e16a26faab49e66d710d1f8656 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 28 十一月 2025 14:57:36 +0800
Subject: [PATCH] 湟水峡-销售台账/采购台账,有可能同一个公司不同单子,但是开票登记的时候会一起,一对多或者多对一
---
src/views/salesManagement/invoiceRegistration/index.vue | 276 +++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 226 insertions(+), 50 deletions(-)
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 528ba0c..bdacb18 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -2,7 +2,7 @@
<div class="app-container">
<div class="search_form">
<el-form :inline="true" :model="searchForm">
- <el-form-item label="寮�绁ㄧ櫥璁�">
+ <el-form-item label="瀹㈡埛鍚嶇О">
<el-input
v-model="searchForm.customerName"
style="width: 240px"
@@ -26,6 +26,12 @@
clearable
/>
</el-form-item>
+ <br>
+ <el-form-item label="浜у搧澶х被锛�">
+ <el-input v-model="searchForm.productCategory" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+ @change="handleQuery" />
+ </el-form-item>
+
<el-form-item>
<el-checkbox
v-model="searchForm.status"
@@ -36,15 +42,18 @@
<el-form-item>
<el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
<el-button @click="resetForm"> 閲嶇疆 </el-button>
+ <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
</el-form-item>
</el-form>
</div>
<div class="table_list">
<div class="flex justify-between">
<div></div>
+ <div>
<el-button type="primary" @click="openForm" style="margin-bottom: 8px">
鏂板鐧昏
</el-button>
+ </div>
</div>
<el-table
:data="tableData"
@@ -74,10 +83,14 @@
width="60"
/>
<el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+ <el-table-column
+ label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ width="150"
+ />
<el-table-column label="鍗曚綅" prop="unit" width="70" />
<el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="70" />
+ <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
<el-table-column
label="鍚◣鍗曚环(鍏�)"
prop="taxInclusiveUnitPrice"
@@ -121,36 +134,48 @@
label="閿�鍞悎鍚屽彿"
prop="salesContractNo"
show-overflow-tooltip
+ width="200"
/>
<el-table-column
label="瀹㈡埛鍚堝悓鍙�"
prop="customerContractNo"
+ width="200"
show-overflow-tooltip
/>
<el-table-column
label="瀹㈡埛鍚嶇О"
prop="customerName"
show-overflow-tooltip
+ width="240"
/>
- <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip />
+ <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip width="90"/>
<el-table-column
label="椤圭洰鍚嶇О"
prop="projectName"
show-overflow-tooltip
+ width="200"
/>
<el-table-column
label="鍚堝悓閲戦(鍏�)"
prop="contractAmount"
show-overflow-tooltip
:formatter="formattedNumber"
+ width="220"
+
/>
<el-table-column
label="宸插紑绁ㄩ噾棰�(鍏�)"
prop="invoiceTotal"
show-overflow-tooltip
:formatter="formattedNumber"
+ width="120"
/>
- <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" show-overflow-tooltip>
+ <el-table-column
+ label="鏈紑绁ㄩ噾棰�(鍏�)"
+ prop="noInvoiceAmountTotal"
+ show-overflow-tooltip
+ width="120"
+ >
<template #default="{ row, column }">
<el-text type="danger">
{{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
@@ -183,7 +208,7 @@
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" disabled></el-input>
+ <el-input v-model="form.salesContractNo" disabled placeholder="澶氬悎鍚屾壒閲忓鐞嗭紙鍏蜂綋鍚堝悓鍙疯浜у搧鍒楄〃锛�"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -218,7 +243,7 @@
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="褰曞叆浜�">
+ <el-form-item label="褰曞叆浜�" prop="createUer">
<el-input v-model="form.createUer" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
</el-form-item>
</el-col>
@@ -273,20 +298,31 @@
type="index"
width="60"
/>
+ <el-table-column label="鎵�灞炲悎鍚�" prop="salesContractNo" width="200">
+ <template #default="{ row }">
+ <el-tag type="primary">{{ row.salesContractNo }}</el-tag>
+ </template>
+ </el-table-column>
<el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+ <el-table-column
+ label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ width="150"
+ />
<el-table-column label="鍗曚綅" prop="unit" />
<el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="70" />
+ <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
<el-table-column
label="鍚◣鍗曚环(鍏�)"
prop="taxInclusiveUnitPrice"
:formatter="formattedNumber"
+ width="200"
/>
<el-table-column
label="鍚◣鎬讳环(鍏�)"
prop="taxInclusiveTotalPrice"
:formatter="formattedNumber"
+ width="200"
/>
<el-table-column
label="涓嶅惈绋庢�讳环(鍏�)"
@@ -294,33 +330,29 @@
:formatter="formattedNumber"
width="150"
/>
- <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum">
+ <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
<template #default="scope">
- <el-input
- type="number"
- :step="0.1"
- min="0"
+ <el-input-number :step="0.1" :min="0" style="width: 100%"
+ :precision="2"
v-model="scope.row.currentInvoiceNum"
- @blur="invoiceNumBlur(scope.row)"
- ></el-input>
+ @change="invoiceNumBlur(scope.row)"
+ ></el-input-number>
</template>
</el-table-column>
<el-table-column
label="鏈寮�绁ㄩ噾棰�(鍏�)"
prop="currentInvoiceAmount"
- width="150"
+ width="180"
>
<template #default="scope">
- <el-input
- type="number"
- :step="0.01"
- min="0"
+ <el-input-number :step="0.01" :min="0" style="width: 100%"
+ :precision="2"
v-model="scope.row.currentInvoiceAmount"
- @blur="invoiceAmountBlur(scope.row)"
- ></el-input>
+ @change="invoiceAmountBlur(scope.row)"
+ ></el-input-number>
</template>
</el-table-column>
- <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum">
+ <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
<template #default="scope">
<el-input
type="number"
@@ -333,7 +365,7 @@
<el-table-column
label="鏈紑绁ㄩ噾棰�(鍏�)"
prop="noInvoiceAmount"
- width="150"
+ width="200"
>
<template #default="scope">
<el-input
@@ -347,13 +379,17 @@
></el-input>
</template>
</el-table-column>
- <el-table-column label="鐧昏浜�" prop="register">
- <template #default="{ row }">
- <el-input v-model="row.register" placeholder="璇疯緭鍏ョ櫥璁颁汉" />
- </template>
+ <el-table-column label="鐧昏浜�" prop="register" width="100">
+ <!-- <template #default="{ row }">
+ <el-input
+ v-model="row.register"
+ placeholder="璇疯緭鍏ョ櫥璁颁汉"
+ disabled
+ />
+ </template> -->
</el-table-column>
- <el-table-column label="鐧昏鏃ユ湡" prop="registerDate">
- <template #default="{ row }">
+ <el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
+ <!-- <template #default="{ row }">
<el-date-picker
style="width: 100%"
v-model="row.registerDate"
@@ -362,8 +398,9 @@
type="date"
placeholder="璇烽�夋嫨"
clearable
+ disabled
/>
- </template>
+ </template> -->
</el-table-column>
</el-table>
</el-form>
@@ -391,6 +428,7 @@
import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
import useFormData from "@/hooks/useFormData";
import useUserStore from "@/store/modules/user";
+import dayjs from "dayjs";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
@@ -415,6 +453,8 @@
createUer: undefined, // 鐧昏浜�
issueDate: undefined, // 寮�绁ㄦ棩鏈�
createTime: undefined, // 褰曞叆鏃ユ湡锛�
+ productCategory: "",
+ isInvoice: 1
},
form: {
salesLedgerId: "",
@@ -423,10 +463,16 @@
projectName: "",
productData: [],
invoiceNo: "",
- createUer: "",
+ createUer: userStore.nickName,
+ issueDate: dayjs().format("YYYY-MM-DD"),
+ selectedContractIds: [], // 鏂板锛氬瓨鍌ㄦ墍鏈夐�変腑鐨勫悎鍚孖D
+ isBatch: false // 鏂板锛氭爣璇嗘槸鍚︿负鎵归噺鎿嶄綔
},
rules: {
- salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
+ issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
},
});
const { form, rules } = toRefs(data);
@@ -444,7 +490,7 @@
};
const formattedInputNumber = (value) => {
- return parseFloat(value).toFixed(2);
+ return value ? parseFloat(value).toFixed(2) : 0;
};
// 鏌ヨ鍒楄〃
@@ -483,7 +529,7 @@
productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
const index = tableData.value.findIndex((item) => item.id === row.id);
if (index > -1) {
- tableData.value[index].children = res;
+ tableData.value[index].children = res.data;
}
expandedRowKeys.value.push(row.id);
});
@@ -498,8 +544,8 @@
const summarizeMainTable = (param) => {
return proxy.summarizeTable(param, [
"contractAmount",
- "noInvoiceAmountTotal",
"invoiceTotal",
+ "noInvoiceAmountTotal",
]);
};
// 瀛愯〃鍚堣鏂规硶
@@ -513,22 +559,67 @@
"currentInvoiceAmount",
"noInvoiceNum",
"noInvoiceAmount",
+ "currentInvoiceNum",
]);
};
// 鎵撳紑寮规
const openForm = () => {
- // 鍒ゆ柇鏄惁澶氶��
- if (selectedRows.value.length != 1) {
- proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�");
+ // 鍒ゆ柇鏄惁閫夋嫨浜嗗悎鍚�
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgError("璇疯嚦灏戦�夋嫨涓�鏉″悎鍚�");
return;
}
+
+ // 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑瀹㈡埛鍚嶇О
+ const firstRow = selectedRows.value[0];
+ const isSameCustomer = selectedRows.value.every(row =>
+ row.customerName === firstRow.customerName
+ );
+
+ if (!isSameCustomer) {
+ proxy.$modal.msgError("璇烽�夋嫨鐩稿悓瀹㈡埛鍚嶇О鐨勫悎鍚�");
+ return;
+ }
+
+ // 鍏佽涓嶅悓鐨勯攢鍞悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
+
form.value = {};
productData.value = [];
- getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
- form.value = { ...res };
- productData.value = form.value.productData.map((item) => {
- return item;
+
+ // 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
+ const promises = selectedRows.value.map(row =>
+ getSalesLedgerWithProducts({ id: row.id })
+ );
+
+ Promise.all(promises).then(results => {
+ // 鍚堝苟鎵�鏈夊悎鍚岀殑浜у搧鏁版嵁锛屽苟涓烘瘡涓骇鍝佹坊鍔犲搴旂殑鍚堝悓淇℃伅
+ const allProductData = [];
+ results.forEach((result, index) => {
+ const contract = selectedRows.value[index];
+ const contractId = contract.id;
+ if (result.productData) {
+ result.productData.forEach(item => {
+ allProductData.push({
+ ...item,
+ id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
+ salesContractNo: contract.salesContractNo, // 娣诲姞閿�鍞悎鍚屽彿
+ customerName: contract.customerName, // 娣诲姞瀹㈡埛鍚嶇О
+ customerContractNo: contract.customerContractNo // 娣诲姞瀹㈡埛鍚堝悓鍙�
+ });
+ });
+ }
});
+
+ // 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄攢鍞悎鍚屽彿鐣欑┖锛�
+ form.value = { ...results[0] };
+ form.value.createTime = dayjs().format("YYYY-MM-DD");
+ form.value.issueDate = dayjs().format("YYYY-MM-DD");
+ form.value.createUer = userStore.nickName;
+ form.value.selectedContractIds = selectedRows.value.map(row => row.id); // 瀛樺偍鎵�鏈夐�変腑鐨勫悎鍚孖D
+ form.value.salesContractNo = ""; // 閿�鍞悎鍚屽彿鐣欑┖锛屽洜涓轰細鍦ㄤ骇鍝佽〃鏍间腑鍒嗗埆鏄剧ず
+
+ productData.value = allProductData;
+
dialogFormVisible.value = true;
console.log("productData.value ", productData.value);
});
@@ -537,12 +628,77 @@
const submitForm = () => {
proxy.$refs["formRef"].validate((valid) => {
if (valid) {
- form.value.productData = proxy.HaveJson(productData.value);
- invoiceRegistrationSave(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
+ // 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
+ if (selectedRows.value.length > 1) {
+ // 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
+ const batchData = selectedRows.value.map(contract => {
+ // 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
+ const contractProductData = productData.value.filter(item =>
+ item.salesLedgerId === contract.id
+ );
+
+ // 涓烘瘡涓攢鍞悎鍚屽彿鍒涘缓鐙珛鐨勫璞�
+ return {
+ // 鍩虹琛ㄥ崟鏁版嵁
+ issueDate: form.value.issueDate,
+ createTime: form.value.createTime,
+ createUer: form.value.createUer,
+ invoiceNo: form.value.invoiceNo,
+
+ // 鍚堝悓瀹為檯淇℃伅
+ id: contract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
+ salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+ customerName: contract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
+ customerId: contract.customerId, // 娣诲姞瀹㈡埛ID
+ customerContractNo: contract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
+ projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+ salesman: contract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
+
+ // 浜у搧鏁版嵁
+ productData: proxy.HaveJson(contractProductData),
+
+ // 鎵归噺鏍囪瘑
+ isBatch: true
+ };
+ });
+
+ // 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
+ invoiceRegistrationSave(batchData).then(() => {
+ proxy.$modal.msgSuccess("鎵归噺鏂板鎴愬姛");
+ closeDia();
+ getList();
+ });
+ } else {
+ // 鍗曚釜鍚堝悓鎻愪氦閫昏緫
+ const singleContract = selectedRows.value[0];
+ const singleForm = {
+ // 鍩虹琛ㄥ崟鏁版嵁
+ issueDate: form.value.issueDate,
+ createTime: form.value.createTime,
+ createUer: form.value.createUer,
+ invoiceNo: form.value.invoiceNo,
+
+ // 鍚堝悓瀹為檯淇℃伅
+ id: singleContract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
+ salesContractNo: singleContract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+ customerName: singleContract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
+ customerId: singleContract.customerId, // 娣诲姞瀹㈡埛ID
+ customerContractNo: singleContract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
+ projectName: singleContract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+ salesman: singleContract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
+
+ // 浜у搧鏁版嵁
+ productData: proxy.HaveJson(productData.value),
+
+ // 鎵归噺鏍囪瘑
+ isBatch: false
+ };
+ invoiceRegistrationSave(singleForm).then((res) => {
+ proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ closeDia();
+ getList();
+ });
+ }
}
});
};
@@ -560,6 +716,21 @@
})
.then(() => {
proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
+
+// 瀵煎嚭閿�鍞彴璐�
+const handleExport = () => {
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ proxy.download("/sales/ledger/exportOne", { ...searchForm, ...page }, "寮�绁ㄧ櫥璁�.xlsx");
})
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
@@ -633,3 +804,8 @@
font-weight: bold;
}
</style>
+
+
+
+
+
--
Gitblit v1.9.3