From e00905e53ee5d91d9e488ecf5ece3e25b9889436 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 20 一月 2026 16:14:44 +0800
Subject: [PATCH] 湟水峡 1.采购模块不要项目名称 2.加一个有待回款登记的提示 3.回款登记、付款登记改成和销售订单价格关联,并且可以多个一起回款或付款 4.合同管理不要下载合同了,跟合同相关的字段可以去掉了 5.重构生产模块 6.测试流程并修改bug

---
 src/views/procurementManagement/paymentEntry/index.vue |  330 +++++++++++++++++++++++++-----------------------------
 1 files changed, 152 insertions(+), 178 deletions(-)

diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 511ee2b..ea4c6a8 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -27,10 +27,10 @@
           </el-col>
           <el-col :span="4">
             <el-form-item style="float: right; margin-right: unset">
-              <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
-              <el-button type="primary" @click="openForm()">
+              <el-button type="primary" @click="openForm('add')">
                 鏂板浠樻
               </el-button>
+              <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
 <!--              <el-button type="danger" plain @click="handleDelete">-->
 <!--                鍒犻櫎-->
 <!--              </el-button>-->
@@ -104,7 +104,6 @@
 									size="small"
 									@click="changeEditType(scope.row)"
 									v-if="!scope.row.editType"
-									:disabled="scope.row.registrant !== userStore.nickName"
 								>缂栬緫</el-button
 								>
 								<el-button
@@ -113,7 +112,6 @@
 									size="small"
 									@click="saveReceiptPayment(scope.row)"
 									v-if="scope.row.editType"
-									:disabled="scope.row.registrant !== userStore.nickName"
 								>淇濆瓨</el-button
 								>
 								<el-button
@@ -121,7 +119,6 @@
 									type="primary"
 									size="small"
 									@click="handleDelete(scope.row)"
-									:disabled="scope.row.registrant !== userStore.nickName"
 								>鍒犻櫎</el-button
 								>
 							</template>
@@ -130,87 +127,110 @@
 				</template>
 			</PIMTable>
     </div>
-    <el-dialog
+    <FormDialog
       v-model="dialogFormVisible"
-      title="鏂板浠樻鐧昏"
-      width="80%"
+      title="鏂板浠樻椤甸潰"
+      :width="'90%'"
       @close="closeDia"
+      @confirm="submitForm"
+      @cancel="closeDia"
     >
-      <el-table :data="dialogTableData" border style="width: 100%" max-height="500px">
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip width="200" />
-        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip width="200" />
-        <el-table-column label="鍙戠エ鍙�" prop="invoiceNumber" show-overflow-tooltip width="180" />
-        <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceAmount" width="150">
-          <template #default="{ row }">
-            {{ row.invoiceAmount ? parseFloat(row.invoiceAmount).toFixed(2) : "0.00" }}
-          </template>
-        </el-table-column>
-        <el-table-column label="寰呬粯娆鹃噾棰�(鍏�)" prop="unPaymentAmountTotal" width="150">
-          <template #default="{ row }">
+      <el-table
+        v-if="forms.length"
+        :data="forms"
+        border
+        style="width: 100%"
+        size="small"
+      >
+        <el-table-column type="index" label="搴忓彿" width="50" align="center"/>
+        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip />
+        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
+        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip />
+        <el-table-column
+          label="浜у搧澶х被"
+          prop="productCategory"
+          show-overflow-tooltip
+          width="100"
+        />
+        <el-table-column
+          label="瑙勬牸鍨嬪彿"
+          prop="specificationModel"
+          show-overflow-tooltip
+          width="150"
+        />
+        <el-table-column
+          label="寰呬粯娆鹃噾棰�(鍏�)"
+          prop="pendingTicketsTotal"
+          show-overflow-tooltip
+          width="170"
+        >
+          <template #default="{ row, column }">
             <el-text type="danger">
-              {{ row.unPaymentAmountTotal ? parseFloat(row.unPaymentAmountTotal).toFixed(2) : "0.00" }}
+              {{ formattedNumber(row, column, row.pendingTicketsTotal) }}
             </el-text>
           </template>
         </el-table-column>
         <el-table-column label="鏈浠樻閲戦(鍏�)" width="180">
-          <template #default="scope">
+          <template #default="{ row }">
             <el-input-number
+              v-model="row.currentPaymentAmount"
               :step="0.01"
               :min="0"
-              :max="Number(scope.row.unPaymentAmountTotal || 0)"
-              style="width: 100%"
+              :max="Number(row.pendingTicketsTotal || 0)"
               :precision="2"
-              v-model="scope.row.currentPaymentAmount"
+              style="width: 100%"
               placeholder="璇疯緭鍏�"
-              clearable
             />
           </template>
         </el-table-column>
-        <el-table-column label="浠樻鏂瑰紡" width="150">
-          <template #default="scope">
-            <el-select v-model="scope.row.paymentMethod" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+        <el-table-column label="浠樻鏂瑰紡" width="160">
+          <template #default="{ row }">
+            <el-select v-model="row.paymentMethod" placeholder="璇烽�夋嫨" clearable>
               <el-option label="鐢垫眹" value="鐢垫眹" />
               <el-option label="鎵垮厬" value="鎵垮厬" />
             </el-select>
           </template>
         </el-table-column>
-        <el-table-column label="浠樻鏃ユ湡" width="180">
-          <template #default="scope">
+        <el-table-column label="浠樻鏃ユ湡" width="170">
+          <template #default="{ row }">
             <el-date-picker
-              style="width: 100%"
-              v-model="scope.row.paymentDate"
+              v-model="row.paymentDate"
               value-format="YYYY-MM-DD"
               format="YYYY-MM-DD"
               type="date"
               placeholder="璇烽�夋嫨"
-              clearable
+              style="width: 100%"
             />
           </template>
         </el-table-column>
-        <el-table-column label="鐧昏浜�" width="120">
-          <template #default="scope">
-            <el-input v-model="scope.row.registrant" placeholder="鑷姩濉厖" disabled />
+        <el-table-column label="鐧昏浜�" width="140">
+          <template #default="{ row }">
+            <el-input v-model="row.registrant" disabled />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐧昏鏃ユ湡" width="170">
+          <template #default="{ row }">
+            <el-input v-model="row.registrationtDate" />
           </template>
         </el-table-column>
       </el-table>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+      <div v-else class="empty-tip">璇烽�夋嫨闇�瑕佷粯娆剧殑璁板綍</div>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive, toRefs, getCurrentInstance, nextTick, onMounted } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 import useUserStore from "@/store/modules/user.js";
 import {
+  byPurchaseId,
   paymentRegistrationAdd,
+  paymentRegistrationDel,
+  paymentRegistrationEdit,
+  getTicketNo,
 } from "@/api/procurementManagement/paymentEntry.js";
 import {
 	delPaymentRegistration,
@@ -219,6 +239,7 @@
 	updatePaymentRegistration
 } from "@/api/procurementManagement/procurementInvoiceLedger.js";
 import useFormData from "@/hooks/useFormData";
+import { getCurrentDate } from "@/utils/index.js";
 
 const { proxy } = getCurrentInstance();
 const tableColumn = ref([
@@ -230,10 +251,12 @@
   {
     label: "閲囪喘鍚堝悓鍙�",
     prop: "purchaseContractNumber",
+    width:160
   },
   {
     label: "閿�鍞悎鍚屽彿",
     prop: "salesContractNo",
+    width:160
   },
   {
     label: "渚涘簲鍟嗗悕绉�",
@@ -243,6 +266,7 @@
 	{
 		label: "浠樻鐘舵��",
 		prop: "statusName",
+    width:110,
 		dataType: "tag",
 		formatType: (params) => {
 			if (params == '鏈畬鎴愪粯娆�') {
@@ -254,35 +278,31 @@
 			}
 		},
 	},
-  {
-    label: "鍙戠エ鍙�",
-    prop: "invoiceNumber",
-    width:200
-  },
-  {
-    label: "鍙戠エ閲戦(鍏�)",
-    prop: "invoiceAmount",
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
+	{
+		label: "浜у搧澶х被",
+		prop: "productCategory",
+		showOverflowTooltip: true,
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "specificationModel",
+		showOverflowTooltip: true,
+	},
   {
     label: "宸蹭粯娆鹃噾棰�(鍏�)",
-    prop: "paymentAmountTotal",
+    prop: "ticketsTotal",
+    width: 120,
     formatData: (params) => {
       return params ? parseFloat(params).toFixed(2) : 0;
     },
   },
   {
     label: "寰呬粯娆鹃噾棰�(鍏�)",
-    prop: "unPaymentAmountTotal",
+    prop: "pendingTicketsTotal",
+    width: 120,
     formatData: (params) => {
       return params ? parseFloat(params).toFixed(2) : 0;
     },
-  },
-  {
-    label: "褰曞叆浜�",
-    prop: "issUer",
   },
 ]);
 const tableData = ref([]);
@@ -290,6 +310,7 @@
 const selectedRows = ref([]);
 const tableLoading = ref(false);
 const childrenLoading = ref(false);
+const forms = ref([]);
 const userStore = useUserStore();
 const page = reactive({
   current: 1,
@@ -297,9 +318,9 @@
 	total: 0,
 });
 
-// 寮规鏁版嵁
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const operationType = ref("");
 const dialogFormVisible = ref(false);
-const dialogTableData = ref([]);
 const data = reactive({
   searchForm: {
     supplierNameOrContractNo: "",
@@ -310,8 +331,6 @@
     purchaseLedgerId: "",
     salesContractNo: "",
     supplierName: "",
-    invoiceNumber: "",
-    invoiceAmount: "",
     taxRate: "",
     currentPaymentAmount: "",
     paymentMethod: "",
@@ -328,9 +347,6 @@
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
     paymentMethod: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceNumber: [
-      { required: true, message: "璇烽�夋嫨閲囪喘鍚堝悓鍙�", trigger: "change" },
-    ],
   },
 });
 const { form, rules } = toRefs(data);
@@ -343,11 +359,16 @@
 	if (!normalized) return 'info';
 	return normalized === '鏈畬鎴愪粯娆�' ? 'danger' : 'success';
 };
+
+const formattedNumber = (row, column, cellValue) => {
+  const val = Number(cellValue ?? 0);
+  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
+};
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
   return proxy.summarizeTable(
     param,
-    ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
+    ["ticketsTotal", "pendingTicketsTotal"],
     {
       ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
       futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -376,8 +397,8 @@
   tableLoading.value = true;
   invoiceListPage({ ...searchForm, ...page }).then((res) => {
     tableLoading.value = false;
-    tableData.value = res.records;
-		page.total = res.total;
+    tableData.value = res.data.records;
+		page.total = res.data.total;
 		if (expandedRowKeys.value.length > 0) {
 			const arr = []
 			const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
@@ -423,8 +444,7 @@
 		currentPaymentAmount: row.currentPaymentAmount,
 		paymentMethod: row.paymentMethod,
 	};
-	// 瀛愯〃缂栬緫淇濆瓨鎸夋暟缁勬彁浜わ紙涓庢壒閲忕櫥璁颁繚鎸佷竴鑷达級
-	updatePaymentRegistration([updateData]).then(() => {
+	updatePaymentRegistration(updateData).then((res) => {
 		row.editType = !row.editType;
 		getList();
 		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
@@ -435,117 +455,75 @@
   selectedRows.value = selection;
 };
 // 鎵撳紑寮规
-const openForm = () => {
-  // 鑷冲皯閫夋嫨涓�鏉℃暟鎹�
+const openForm = (type, row) => {
   if (selectedRows.value.length === 0) {
-    proxy.$modal?.msgError ? proxy.$modal.msgError("璇烽�夋嫨鏁版嵁") : proxy.$message.error("璇烽�夋嫨鏁版嵁");
+    proxy.$modal.msgError("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
     return;
   }
-
-  // 鏍¢獙鏄惁涓虹浉鍚屼緵搴斿晢鍚嶇О
-  const firstSupplierName = selectedRows.value[0].supplierName;
-  const isSameSupplier = selectedRows.value.every(
-    (item) => item.supplierName === firstSupplierName
-  );
-  if (!isSameSupplier) {
-    proxy.$modal?.msgError
-      ? proxy.$modal.msgError("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鏁版嵁杩涜浠樻鐧昏")
-      : proxy.$message.error("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鏁版嵁杩涜浠樻鐧昏");
-    return;
-  }
-
-  // 杩囨护鍑烘湁寰呬粯娆鹃噾棰濈殑璁板綍
-  const validRows = selectedRows.value.filter(
-    (item) => Number(item.unPaymentAmountTotal) > 0
-  );
+  const validRows = selectedRows.value.filter((item) => Number(item.pendingTicketsTotal || 0) !== 0);
   if (validRows.length === 0) {
-    proxy.$modal?.msgWarning
-      ? proxy.$modal.msgWarning("鎵�閫夋暟鎹潎鏃犻渶鍐嶄粯娆�")
-      : proxy.$message.warning("鎵�閫夋暟鎹潎鏃犻渶鍐嶄粯娆�");
+    proxy.$modal.msgWarning("鎵�閫夎褰曞潎鏃犻渶浠樻");
     return;
   }
-
-  const today = getCurrentDate();
-  dialogTableData.value = validRows.map((row) => {
-    return {
-      ...row,
-      // 鍚庣鍏宠仈鈥滄潵绁ㄥ彴璐�/鐧昏鍗曗�濈殑瀛楁锛堝師閫昏緫锛歵icketRegistrationId = row.id锛�
-      ticketRegistrationId: row.id,
-      id: null,
-      currentPaymentAmount: row.unPaymentAmountTotal || "",
-      paymentMethod: "",
-      paymentDate: today,
-      registrationtDate: today,
-      registrant: userStore.nickName || userStore.name,
-    };
-  });
-
+  forms.value = validRows.map((row) => ({
+    purchaseContractNumber: row.purchaseContractNumber || "",
+    salesContractNo: row.salesContractNo || "",
+    supplierName: row.supplierName || "",
+    supplierId: row.supplierId,
+    productCategory: row.productCategory || "",
+    specificationModel: row.specificationModel || "",
+    pendingTicketsTotal: Number(row.pendingTicketsTotal || 0),
+    currentPaymentAmount: "",
+    paymentMethod: "",
+    paymentDate: "",
+    registrant: userStore.nickName,
+    registrationtDate: getCurrentDate(),
+    ticketRegistrationId: row.id,
+    purchaseLedgerId: row.salesLedgerId,
+    salesLedgerProductId: row.id,
+  }));
   dialogFormVisible.value = true;
 };
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  // 鏍¢獙琛ㄦ牸鏁版嵁
-  const invalidRows = dialogTableData.value.filter((row) => {
-    return (
-      !row.currentPaymentAmount ||
-      Number(row.currentPaymentAmount) <= 0 ||
-      !row.paymentMethod ||
-      !row.paymentDate
-    );
-  });
-  if (invalidRows.length > 0) {
-    proxy.$modal?.msgError
-      ? proxy.$modal.msgError("璇峰畬鍠勬墍鏈夊繀濉」锛氫粯娆鹃噾棰濄�佷粯娆炬柟寮忋�佷粯娆炬棩鏈�")
-      : proxy.$message.error("璇峰畬鍠勬墍鏈夊繀濉」锛氫粯娆鹃噾棰濄�佷粯娆炬柟寮忋�佷粯娆炬棩鏈�");
+  if (forms.value.length === 0) {
+    proxy.$modal.msgError("璇烽�夋嫨浠樻璁板綍");
     return;
   }
-
-  // 鏍¢獙浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰�
-  const exceedRows = dialogTableData.value.filter((row) => {
-    return Number(row.currentPaymentAmount) > Number(row.unPaymentAmountTotal);
-  });
-  if (exceedRows.length > 0) {
-    proxy.$modal?.msgError
-      ? proxy.$modal.msgError("浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰�")
-      : proxy.$message.error("浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰�");
-    return;
+  for (let i = 0; i < forms.value.length; i++) {
+    const item = forms.value[i];
+    const pendingAmount = Number(item.pendingTicketsTotal || 0);
+    const currentAmount = Number(item.currentPaymentAmount);
+    if (!item.currentPaymentAmount && item.currentPaymentAmount !== 0) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇峰~鍐欎粯娆鹃噾棰漙);
+      return;
+    }
+    if (currentAmount > pendingAmount) {
+      proxy.$modal.msgError(
+        `绗� ${i + 1} 鏉★細浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰濓紙寰呬粯娆撅細${pendingAmount.toFixed(
+          2
+        )}锛塦
+      );
+      return;
+    }
+    if (!item.paymentMethod) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨浠樻鏂瑰紡`);
+      return;
+    }
+    if (!item.paymentDate) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨浠樻鏃ユ湡`);
+      return;
+    }
   }
-
-  // 缁勮鏁扮粍鎵归噺鎻愪氦锛堝鏋滃悗绔笉鏀寔鏁扮粍锛屼細璧板厹搴曞惊鐜彁浜わ級
-  const submitDataList = dialogTableData.value.map((row) => {
-    return {
-      ticketRegistrationId: row.ticketRegistrationId,
-      purchaseLedgerId: row.purchaseLedgerId,
-      purchaseContractNumber: row.purchaseContractNumber,
-      salesContractNo: row.salesContractNo,
-      supplierName: row.supplierName,
-      invoiceNumber: row.invoiceNumber,
-      invoiceAmount: row.invoiceAmount,
-      taxRate: row.taxRate,
-      currentPaymentAmount: row.currentPaymentAmount,
-      paymentMethod: row.paymentMethod,
-      paymentDate: row.paymentDate,
-      registrant: row.registrant,
-      registrationtDate: row.registrationtDate,
-      id: null,
-    };
+  paymentRegistrationAdd(forms.value).then(() => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeDia();
+    getList();
   });
-
-  paymentRegistrationAdd(submitDataList)
-    .then(() => {
-      proxy.$modal?.msgSuccess
-        ? proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
-        : proxy.$message.success("鎻愪氦鎴愬姛");
-      closeDia();
-      getList();
-    })
-    .catch((e) => {
-      console.error("鎻愪氦澶辫触:", e);
-    });
 };
 // 鍏抽棴寮规
 const closeDia = () => {
-  dialogTableData.value = [];
+  forms.value = [];
   dialogFormVisible.value = false;
 };
 // 鍒犻櫎
@@ -557,7 +535,7 @@
   })
     .then(() => {
       tableLoading.value = true;
-			delPaymentRegistration(row.id)
+			delPaymentRegistration([row.id])
         .then((res) => {
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
           getList();
@@ -570,15 +548,6 @@
       proxy.$modal.msg("宸插彇娑�");
     });
 };
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
-  const today = new Date();
-  const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
-  const day = String(today.getDate()).padStart(2, "0");
-  return `${year}-${month}-${day}`;
-}
-
 // 瀵煎嚭
 const handleExport = () => {
   ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
@@ -606,4 +575,9 @@
 ::v-deep(.el-checkbox__label) {
   font-weight: bold;
 }
+.empty-tip {
+  text-align: center;
+  padding: 20px 0;
+  color: #909399;
+}
 </style>

--
Gitblit v1.9.3