From 8bc17a9ea84a6af0b7d01e451c702f404a3ff895 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期六, 10 一月 2026 11:36:34 +0800
Subject: [PATCH] Merge branch 'dev_tide' into dev_tide_cbsglxt

---
 src/views/procurementManagement/procurementLedger/index.vue |  251 ++++++++++++++++++++++++++++++++------------------
 1 files changed, 161 insertions(+), 90 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 1465d16..30dacdb 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -2,26 +2,46 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
-        <el-input
-          v-model="searchForm.purchaseContractNumber"
-          style="width: 240px"
-          placeholder="璇疯緭鍏�"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-          >鎼滅储</el-button
-        >
+        <el-form :model="searchForm" :inline="true">
+          <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+            <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+                      @change="handleQuery" />
+          </el-form-item>
+          <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+            <el-input
+                v-model="searchForm.purchaseContractNumber"
+                style="width: 240px"
+                placeholder="璇疯緭鍏�"
+                @change="handleQuery"
+                clearable
+                :prefix-icon="Search"
+            />
+          </el-form-item>
+          <el-form-item label="閿�鍞悎鍚屽彿锛�">
+            <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+                      @change="handleQuery" />
+          </el-form-item>
+          <el-form-item label="椤圭洰鍚嶇О锛�">
+            <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+                      @change="handleQuery" />
+          </el-form-item>
+          <el-form-item label="褰曞叆鏃ユ湡锛�">
+            <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+                            placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+          </el-form-item>
+        </el-form>
       </div>
-      <div>
+
+    </div>
+    <div class="table_list">
+      <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
         <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
       </div>
-    </div>
-    <div class="table_list">
       <el-table
         :data="tableData"
         border
@@ -33,6 +53,7 @@
         :summary-method="summarizeMainTable"
         @expand-change="expandChange"
         height="calc(100vh - 18.5em)"
+        stripe
       >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
@@ -42,6 +63,7 @@
               border
               show-summary
               :summary-method="summarizeChildrenTable"
+              stripe
             >
               <el-table-column
                 align="center"
@@ -94,7 +116,7 @@
         <el-table-column
           label="椤圭洰鍚嶇О"
           prop="projectName"
-          width="100"
+          width="420"
           show-overflow-tooltip
         />
         <el-table-column
@@ -106,7 +128,7 @@
         <el-table-column
           label="鍚堝悓閲戦(鍏�)"
           prop="contractAmount"
-           width="100"
+           width="200"
           show-overflow-tooltip
           :formatter="formattedNumber"
         />
@@ -125,7 +147,7 @@
         <el-table-column
           fixed="right"
           label="鎿嶄綔"
-          min-width="60"
+          min-width="100"
           align="center"
         >
           <template #default="scope">
@@ -134,6 +156,7 @@
               type="primary"
               size="small"
               @click="openForm('edit', scope.row)"
+							:disabled="scope.row.receiptPaymentAmount>0 || scope.row.recorderName !== userStore.nickName"
               >缂栬緫</el-button
             >
           </template>
@@ -172,20 +195,12 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
-              <el-select
-                v-model="form.salesLedgerId"
-                placeholder="璇烽�夋嫨"
+            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
+              <el-input
+                v-model="form.salesContractNo"
+                placeholder="璇疯緭鍏�"
                 clearable
-                @change="salesLedgerChange"
-              >
-                <el-option
-                  v-for="item in salesContractList"
-                  :key="item.id"
-                  :label="item.salesContractNo"
-                  :value="item.id"
-                />
-              </el-select>
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -275,6 +290,7 @@
           border
           @selection-change="productSelected"
           show-summary
+          stripe
           :summary-method="summarizeProTable"
         >
           <el-table-column align="center" type="selection" width="55" />
@@ -288,7 +304,7 @@
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
           <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"
@@ -429,18 +445,20 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏁伴噺锛�" prop="quantity">
-              <el-input-number
-              :step="0.1"
-                clearable
-                style="width: 100%"
-                v-model="productForm.quantity"
-                placeholder="璇疯緭鍏�"
-                @change="mathNum"
-              />
-            </el-form-item>
-          </el-col>
+					<el-col :span="12">
+						<el-form-item label="绋庣巼(%)锛�" prop="taxRate">
+							<el-select
+								v-model="productForm.taxRate"
+								placeholder="璇烽�夋嫨"
+								clearable
+								@change="mathNum"
+							>
+								<el-option label="1" value="1" />
+								<el-option label="6" value="6" />
+								<el-option label="13" value="13" />
+							</el-select>
+						</el-form-item>
+					</el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -455,20 +473,19 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
-              <el-select
-                v-model="productForm.taxRate"
-                placeholder="璇烽�夋嫨"
-                clearable
-                @change="mathNum"
-              >
-                <el-option label="1" value="1" />
-                <el-option label="6" value="6" />
-                <el-option label="13" value="13" />
-              </el-select>
-            </el-form-item>
-          </el-col>
+					<el-col :span="12">
+						<el-form-item label="鏁伴噺锛�" prop="quantity">
+							<el-input-number
+								:step="0.1"
+								clearable
+								:precision="2"
+								style="width: 100%"
+								v-model="productForm.quantity"
+								placeholder="璇疯緭鍏�"
+								@change="mathNum"
+							/>
+						</el-form-item>
+					</el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -479,7 +496,7 @@
                 :step="0.1"
                 clearable
                 style="width: 100%"
-                disabled
+                @change="reverseMathNum('taxInclusiveTotalPrice')"
               />
             </el-form-item>
           </el-col>
@@ -488,7 +505,10 @@
               label="涓嶅惈绋庢�讳环(鍏�)锛�"
               prop="taxExclusiveTotalPrice"
             >
-              <el-input v-model="productForm.taxExclusiveTotalPrice" disabled />
+              <el-input 
+                v-model="productForm.taxExclusiveTotalPrice"
+                @change="reverseMathNum('taxExclusiveTotalPrice')"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -520,7 +540,7 @@
 <script setup>
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref, onMounted } from "vue";
+import { ref, onMounted, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 import { userListNoPage } from "@/api/system/user.js";
@@ -529,18 +549,17 @@
   addOrUpdateSalesLedgerProduct,
   delProduct,
   delLedgerFile,
-  getProductInfoByContractNo,
 } from "@/api/salesManagement/salesLedger.js";
 import {
   addOrEditPurchase,
   delPurchase,
-  getSalesNo,
   purchaseListPage,
   productList,
   getPurchaseById,
   getOptions,
   createPurchaseNo,
 } from "@/api/procurementManagement/procurementLedger.js";
+import useFormData from "@/hooks/useFormData.js";
 const { proxy } = getCurrentInstance();
 const tableData = ref([]);
 const productData = ref([]);
@@ -549,7 +568,6 @@
 const modelOptions = ref([]);
 const userList = ref([]);
 const productOptions = ref([]);
-const salesContractList = ref([]);
 const supplierList = ref([]);
 const tableLoading = ref(false);
 const page = reactive({
@@ -560,6 +578,7 @@
 const fileList = ref([]);
 import useUserStore from "@/store/modules/user";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
+import dayjs from "dayjs";
 
 const userStore = useUserStore();
 
@@ -568,11 +587,20 @@
 const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    purchaseContractNumber: "",
+    supplierName: "", // 渚涘簲鍟嗗悕绉�
+    purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
+    salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
+    projectName: "", // 椤圭洰鍚嶇О
+    entryDate: [
+      dayjs().format("YYYY-MM-DD"),
+      dayjs().add(1, "day").format("YYYY-MM-DD"),
+    ], // 褰曞叆鏃ユ湡
+    entryDateStart: dayjs().format("YYYY-MM-DD"),
+    entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
   },
   form: {
     purchaseContractNumber: "",
-    salesLedgerId: "",
+    salesContractNo: "",
     projectName: "",
     recorderId: "",
     entryDate: "",
@@ -589,7 +617,9 @@
     supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
   },
 });
-const { searchForm, form, rules } = toRefs(data);
+const {  form, rules } = toRefs(data);
+const { form: searchForm } = useFormData(data.searchForm);
+
 // 浜у搧琛ㄥ崟寮规鏁版嵁
 const productFormVisible = ref(false);
 const productOperationType = ref("");
@@ -635,6 +665,17 @@
   headers: { Authorization: "Bearer " + getToken() },
 });
 
+const changeDaterange = (value) => {
+  if (value) {
+    searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+    searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+  } else {
+    searchForm.entryDateStart = undefined;
+    searchForm.entryDateEnd = undefined;
+  }
+  handleQuery();
+};
+
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
 };
@@ -670,7 +711,8 @@
 };
 const getList = () => {
   tableLoading.value = true;
-  purchaseListPage({ ...searchForm.value, ...page })
+  const { entryDate, ...rest } = searchForm;
+  purchaseListPage({ ...rest, ...page })
     .then((res) => {
       tableLoading.value = false;
       tableData.value = res.data.records;
@@ -737,9 +779,6 @@
   userListNoPage().then((res) => {
     userList.value = res.data;
   });
-  getSalesNo().then((res) => {
-    salesContractList.value = res;
-  });
   getOptions().then((res) => {
     supplierList.value = res.data;
   });
@@ -762,8 +801,8 @@
 // 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload(file) {
   // 鏍℃鏂囦欢澶у皬
-  if (file.size > 1024 * 1024 * 10) {
-    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
+  if (file.size > 1024 * 1024 * 50) {
+    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃50MB!");
     return false;
   }
   proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
@@ -788,6 +827,10 @@
 // 绉婚櫎鏂囦欢
 function handleRemove(file) {
   console.log("handleRemove", file.id);
+  if (file.size > 1024 * 1024 * 10) { 
+    // 浠呭墠绔竻鐞嗭紝涓嶈皟鐢ㄥ垹闄ゆ帴鍙e拰鎻愮ず
+    return; 
+  }
   if (operationType.value === "edit") {
     let ids = [];
     ids.push(file.id);
@@ -981,6 +1024,12 @@
 const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
+		// 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
+		const unauthorizedData = selectedRows.value.filter(item => item.recorderName !== userStore.nickName);
+		if (unauthorizedData.length > 0) {
+			proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
+			return;
+		}
     ids = selectedRows.value.map((item) => item.id);
   } else {
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
@@ -1010,7 +1059,10 @@
   return `${year}-${month}-${day}`;
 }
 const mathNum = () => {
-  console.log("productForm.value", productForm.value);
+	if (!productForm.value.taxRate) {
+		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+		return;
+	}
   if (!productForm.value.taxInclusiveUnitPrice) {
     return;
   }
@@ -1032,25 +1084,44 @@
       );
   }
 };
-// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
-const salesLedgerChange = async (row) => {
-  console.log("row", row);
-  var index = salesContractList.value.findIndex((item) => item.id == row);
-  console.log("index", index);
-  if (index > -1) {
-    form.value.projectName = salesContractList.value[index].projectName;
-    await querygProductInfoByContractNo();
+const reverseMathNum = (field) => {
+	if (!productForm.value.taxRate) {
+		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+		return;
+	}
+  const taxRate = Number(productForm.value.taxRate);
+  if (!taxRate) return;
+  if (field === 'taxInclusiveTotalPrice') {
+    // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
+    if (productForm.value.quantity) {
+      productForm.value.taxInclusiveUnitPrice = 
+        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
+    }
+    // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
+    else if (productForm.value.taxInclusiveUnitPrice) {
+      productForm.value.quantity = 
+        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
+    }
+    // 鍙嶇畻涓嶅惈绋庢�讳环
+    productForm.value.taxExclusiveTotalPrice = 
+      (Number(productForm.value.taxInclusiveTotalPrice) / (1 + taxRate / 100)).toFixed(2);
+  } else if (field === 'taxExclusiveTotalPrice') {
+    // 鍙嶇畻鍚◣鎬讳环
+    productForm.value.taxInclusiveTotalPrice = 
+      (Number(productForm.value.taxExclusiveTotalPrice) * (1 + taxRate / 100)).toFixed(2);
+    // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
+    if (productForm.value.quantity) {
+      productForm.value.taxInclusiveUnitPrice = 
+        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
+    }
+    // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
+    else if (productForm.value.taxInclusiveUnitPrice) {
+      productForm.value.quantity = 
+        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
+    }
   }
 };
 
-const querygProductInfoByContractNo = async () => {
-  const { code, data } = await getProductInfoByContractNo({
-    contractNo: form.value.salesLedgerId,
-  });
-  if (code == 200) {
-    productData.value = data;
-  }
-};
 
 onMounted(() => {
   getList();

--
Gitblit v1.9.3