zouyu
3 天以前 8bc17a9ea84a6af0b7d01e451c702f404a3ff895
src/views/procurementManagement/paymentEntry/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,575 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <el-form :inline="true" :model="searchForm" style="width: 100%">
        <el-row justify="space-between">
          <el-col :span="20">
            <el-form-item label="供应商名称/合同号">
              <el-input
                v-model="searchForm.supplierNameOrContractNo"
                style="width: 240px"
                placeholder="输入供应商名称/合同号搜索"
                clearable
                prefix-icon="Search"
                @change="handleQuery"
              />
            </el-form-item>
            <el-form-item>
              <el-checkbox
                v-model="searchForm.status"
                label="不显示待付款为0"
                @change="handleQuery"
              />
            </el-form-item>
            <el-form-item>
              <el-button type="primary" @click="handleQuery"> æœç´¢ </el-button>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item style="float: right; margin-right: unset">
              <el-button type="primary" @click="openForm('add')">
                æ–°å¢žä»˜æ¬¾
              </el-button>
<!--              <el-button type="danger" plain @click="handleDelete">-->
<!--                åˆ é™¤-->
<!--              </el-button>-->
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </div>
    <div class="table_list">
      <PIMTable
        rowKey="id"
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :expandRowKeys="expandedRowKeys"
        :isSelection="true"
        :isShowSummary="isShowSummarySon"
        :summaryMethod="summarizeMainTable1"
        @selection-change="handleSelectionChange"
        @expand-change="expandChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
        :total="page.total"
      >
            <template #expand="{ row }">
               <el-table
                  :data="expandData"
                  border
                  show-summary
                  v-loading="childrenLoading"
                  :summary-method="summarizeMainTable2"
                  stripe
               >
                  <el-table-column
                     align="center"
                     label="序号"
                     type="index"
                     width="60"
                  />
                  <el-table-column label="付款日期" prop="paymentDate" />
                  <el-table-column label="付款金额" prop="currentPaymentAmount">
                     <template #default="scope">
                        <el-input-number :step="0.01" :min="0" style="width: 100%"
                                                 v-model="scope.row.currentPaymentAmount"
                                                 :disabled="!scope.row.editType"
                                                 :precision="2"
                                                 placeholder="请输入"
                                                 clearable
                        />
                     </template>
                  </el-table-column>
                  <el-table-column label="付款方式" prop="paymentMethod">
                     <template #default="scope">
                        <el-input
                           :disabled="!scope.row.editType"
                           v-model="scope.row.paymentMethod"
                           placeholder="请输入"
                           clearable
                        />
                     </template>
                  </el-table-column>
                  <el-table-column label="登记人" prop="registrant" />
                  <el-table-column label="登记日期" prop="registrationtDate" />
                  <el-table-column label="操作" width="150">
                     <template #default="scope">
                        <el-button
                           link
                           type="primary"
                           size="small"
                           @click="changeEditType(scope.row)"
                           v-if="!scope.row.editType"
                           :disabled="scope.row.registrant !== userStore.nickName"
                        >编辑</el-button
                        >
                        <el-button
                           link
                           type="primary"
                           size="small"
                           @click="saveReceiptPayment(scope.row)"
                           v-if="scope.row.editType"
                           :disabled="scope.row.registrant !== userStore.nickName"
                        >保存</el-button
                        >
                        <el-button
                           link
                           type="primary"
                           size="small"
                           @click="handleDelete(scope.row)"
                           :disabled="scope.row.registrant !== userStore.nickName"
                        >删除</el-button
                        >
                     </template>
                  </el-table-column>
               </el-table>
            </template>
         </PIMTable>
    </div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增付款登记' : '编辑付款登记'"
      width="60%"
      @close="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="采购合同号:" prop="purchaseContractNumber">
              <el-input
                v-model="form.purchaseContractNumber"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="销售合同号:" prop="salesContractNo">
              <el-input
                v-model="form.salesContractNo"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="供应商名称:" prop="supplierName">
              <el-input
                v-model="form.supplierName"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="发票号:" prop="invoiceNumber">
              <el-input
                v-model="form.invoiceNumber"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="发票金额(元):" prop="invoiceAmount">
              <el-input
                v-model="form.invoiceAmount"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="本次付款金额:" prop="currentPaymentAmount">
              <el-input-number :step="0.01" :min="0" style="width: 100%"
                                              :precision="2"
                v-model="form.currentPaymentAmount"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="付款方式:" prop="paymentMethod">
              <el-input
                v-model="form.paymentMethod"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
               <el-col :span="12">
                  <el-form-item label="付款日期:" prop="paymentDate">
                     <el-date-picker
                        style="width: 100%"
                        v-model="form.paymentDate"
                        value-format="YYYY-MM-DD"
                        format="YYYY-MM-DD"
                        type="date"
                        placeholder="请选择"
                        clearable
                     />
                  </el-form-item>
               </el-col>
        </el-row>
        <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="登记人:" prop="registrant">
                     <el-input
                        v-model="form.registrant"
                        placeholder="请输入"
                        clearable
                        disabled
                     />
                  </el-form-item>
               </el-col>
          <el-col :span="12">
            <el-form-item label="登记日期:" prop="registrationtDate">
              <el-input
                v-model="form.registrationtDate"
                placeholder="请输入"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <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>
</template>
<script setup>
import { ref } 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,
   invoiceListPage,
   registrationListPageGetById,
   updatePaymentRegistration
} from "@/api/procurementManagement/procurementInvoiceLedger.js";
import useFormData from "@/hooks/useFormData";
const { proxy } = getCurrentInstance();
const tableColumn = ref([
   {
      type: "expand",
      dataType: "slot",
      slot: "expand",
   },
  {
    label: "采购合同号",
    prop: "purchaseContractNumber",
  },
  {
    label: "销售合同号",
    prop: "salesContractNo",
  },
  {
    label: "供应商名称",
    prop: "supplierName",
    width:240
  },
  {
    label: "发票号",
    prop: "invoiceNumber",
    width:200
  },
  {
    label: "发票金额(元)",
    prop: "invoiceAmount",
    formatData: (params) => {
      return params ? parseFloat(params).toFixed(2) : 0;
    },
  },
  {
    label: "已付款金额(元)",
    prop: "paymentAmountTotal",
    formatData: (params) => {
      return params ? parseFloat(params).toFixed(2) : 0;
    },
  },
  {
    label: "待付款金额(元)",
    prop: "unPaymentAmountTotal",
    formatData: (params) => {
      return params ? parseFloat(params).toFixed(2) : 0;
    },
  },
  {
    label: "录入人",
    prop: "issUer",
  },
]);
const tableData = ref([]);
const expandData = ref([]);
const selectedRows = ref([]);
const tableLoading = ref(false);
const childrenLoading = ref(false);
const userStore = useUserStore();
const page = reactive({
  current: 1,
  size: 100,
   total: 0,
});
// ç”¨æˆ·ä¿¡æ¯è¡¨å•弹框数据
const operationType = ref("");
const dialogFormVisible = ref(false);
const data = reactive({
  searchForm: {
    supplierNameOrContractNo: "",
    status: false,
  },
  form: {
    purchaseContractNumber: "",
    purchaseLedgerId: "",
    salesContractNo: "",
    supplierName: "",
    invoiceNumber: "",
    invoiceAmount: "",
    taxRate: "",
    currentPaymentAmount: "",
    paymentMethod: "",
    registrant: "",
    registrantId: "",
    paymentDate: "",
    registrationtDate: "",
  },
  rules: {
    purchaseLedgerId: [
      { required: true, message: "请选择", trigger: "change" },
    ],
    currentPaymentAmount: [
      { required: true, message: "请输入", trigger: "blur" },
    ],
    paymentMethod: [{ required: true, message: "请选择", trigger: "change" }],
    invoiceNumber: [
      { required: true, message: "请选择采购合同号", trigger: "change" },
    ],
  },
});
const { form, rules } = toRefs(data);
const { form: searchForm, resetForm } = useFormData(data.searchForm);
const isShowSummarySon = ref(true);
const expandedRowKeys = ref([]);
// å­è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable1 = (param) => {
  return proxy.summarizeTable(
    param,
    ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
    {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    }
  );
};
// å­è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable2 = (param) => {
   return proxy.summarizeTable(param, ["currentPaymentAmount"], {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
   });
};
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  invoiceListPage({ ...searchForm, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.records;
      page.total = res.total;
      if (expandedRowKeys.value.length > 0) {
         const arr = []
         const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
         if (index > -1) {
            arr.push(tableData.value[index]);
            expandChange(tableData.value[index], arr)
         }
      }
  });
};
// å±•开行
const expandChange = (row, expandedRows) => {
   if (expandedRows.length > 0) {
      nextTick(() => {
         expandedRowKeys.value = [];
         try {
            childrenLoading.value = true;
            registrationListPageGetById({ id: row.id }).then((res) => {
               childrenLoading.value = false;
               const index = tableData.value.findIndex((item) => item.id === row.id);
               if (index > -1) {
                  expandData.value = res;
               }
               expandedRowKeys.value.push(row.id);
            });
         } catch (error) {
            childrenLoading.value = false;
            console.log(error);
         }
      })
   } else {
      expandedRowKeys.value = [];
   }
};
// ç¼–辑修改状态
const changeEditType = (row) => {
   row.editType = !row.editType;
};
// ä¿å­˜å›žæ¬¾è®°å½•
const saveReceiptPayment = (row) => {
   let updateData = {
      id: row.id,
      currentPaymentAmount: row.currentPaymentAmount,
      paymentMethod: row.paymentMethod,
   };
   updatePaymentRegistration(updateData).then((res) => {
      row.editType = !row.editType;
      getList();
      proxy.$modal.msgSuccess("提交成功");
   });
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const handleSelectionChange = (selection) => {
  selectedRows.value = selection;
};
// æ‰“开弹框
const openForm = (type, row) => {
  if (selectedRows.value.length !== 1) {
    proxy.$message.error("请选择一条发票数据");
    return;
  }
   if (selectedRows.value[0].unPaymentAmountTotal == 0) {
      proxy.$message.warning("无需再付款");
      return;
   }
  operationType.value = type;
  form.value = {};
  form.value = { ...selectedRows.value[0] };
  form.value.ticketRegistrationId = selectedRows.value[0].id;
  form.value.id = null;
  // æŸ¥è¯¢é‡‡è´­åˆåŒå·
  form.value.registrationtDate = getCurrentDate();
  form.value.paymentDate = getCurrentDate();
  form.value.registrant = userStore.name;
  dialogFormVisible.value = true;
};
// æäº¤è¡¨å•
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
      }
    }
  });
};
// æäº¤æ–°å¢ž
const submitAdd = () => {
  paymentRegistrationAdd(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// æäº¤ä¿®æ”¹
const submitEdit = () => {
  paymentRegistrationEdit(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
};
// åˆ é™¤
const handleDelete = (row) => {
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
         delPaymentRegistration(row.id)
        .then((res) => {
          proxy.$modal.msgSuccess("删除成功");
          getList();
        })
        .finally(() => {
          tableLoading.value = false;
        });
    })
    .catch(() => {
      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}`;
}
getList();
</script>
<style scoped lang="scss">
.table_list {
  margin-top: unset;
}
::v-deep(.el-checkbox__label) {
  font-weight: bold;
}
</style>