<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 @click="handleExport" style="margin-right: 10px">导出</el-button> 
 | 
              <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" 
 | 
                    > 
 | 
                        <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-select 
 | 
                                    :disabled="!scope.row.editType" 
 | 
                                    v-model="scope.row.paymentMethod" 
 | 
                                    placeholder="请选择" 
 | 
                                    clearable 
 | 
                                > 
 | 
                                    <el-option label="电汇" value="电汇" /> 
 | 
                                    <el-option label="承兑" value="承兑" /> 
 | 
                                </el-select> 
 | 
                            </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-select 
 | 
                v-model="form.paymentMethod" 
 | 
                placeholder="请选择" 
 | 
                clearable 
 | 
              > 
 | 
                <el-option label="电汇" value="电汇" /> 
 | 
                <el-option label="承兑" value="承兑" /> 
 | 
              </el-select> 
 | 
            </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, 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, 
 | 
    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: "statusName", 
 | 
        dataType: "tag", 
 | 
        formatType: (params) => { 
 | 
            if (params == '未完成付款') { 
 | 
                return "danger"; 
 | 
            } else if (params == '已完成付款') { 
 | 
                return "success"; 
 | 
            } else { 
 | 
                return null; 
 | 
            } 
 | 
        }, 
 | 
    }, 
 | 
  { 
 | 
    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 getStatusTagType = (statusName = '') => { 
 | 
    const normalized = statusName.trim(); 
 | 
    if (!normalized) return 'info'; 
 | 
    return normalized === '未完成付款' ? 'danger' : 'success'; 
 | 
}; 
 | 
// 子表合计方法 
 | 
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}`; 
 | 
} 
 | 
  
 | 
// 导出 
 | 
const handleExport = () => { 
 | 
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", { 
 | 
    confirmButtonText: "确认", 
 | 
    cancelButtonText: "取消", 
 | 
    type: "warning", 
 | 
  }) 
 | 
    .then(() => { 
 | 
      proxy.download("/purchase/registration/exportOne", { ...searchForm, ...page }, "付款登记.xlsx"); 
 | 
    }) 
 | 
    .catch(() => { 
 | 
      proxy.$modal.msg("已取消"); 
 | 
    }); 
 | 
}; 
 | 
  
 | 
onMounted(() => { 
 | 
  getList(); 
 | 
}); 
 | 
</script> 
 | 
  
 | 
<style scoped lang="scss"> 
 | 
.table_list { 
 | 
  margin-top: unset; 
 | 
} 
 | 
::v-deep(.el-checkbox__label) { 
 | 
  font-weight: bold; 
 | 
} 
 | 
</style> 
 |