曹睿
2 天以前 6e30fb16e72db22a119285cb5b757b7a5e1b2206
fix: 修复之前剩下的要求
已修改13个文件
已添加2个文件
1270 ■■■■■ 文件已修改
src/api/procurementManagement/procurementInvoiceLedger.js 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/procurementManagement/procurementLedger.js 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/invoiceEntry/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/paymentEntry/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/paymentHistory/index.vue 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementInvoiceLedger/index.vue 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementLedger/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/reportAnalysis/projectProfit/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/reportAnalysis/taxComparison/index.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/invoiceLedger/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/invoiceRegistration/index.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/receiptPayment/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/receiptPaymentHistory/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/receiptPaymentLedger/index.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/procurementManagement/procurementInvoiceLedger.js
@@ -1,60 +1,68 @@
// é‡‡è´­-来票台账接口
import request from '@/utils/request'
import request from "@/utils/request";
// æŸ¥è¯¢åˆ—表
export function invoiceList(query) {
    return request({
        url: '/purchase/registration/list',
        method: 'get',
        params: query
    })
    url: "/purchase/registration/list",
    method: "get",
    params: query,
  });
}
// æŸ¥è¯¢è¯¦æƒ…
export function getInvoiceById(query) {
    return request({
        url: '/purchase/registration/getRegistrationById',
        method: 'get',
        params: query
    })
    url: "/purchase/registration/getRegistrationById",
    method: "get",
    params: query,
  });
}
// æ–°å¢žã€ç¼–辑
export function addOrUpdateInvoice(query) {
    return request({
        url: '/purchase/invoice/addOrUpdateInvoice',
        method: 'post',
        data: query
    })
    url: "/purchase/invoice/addOrUpdateInvoice",
    method: "post",
    data: query,
  });
}
// åˆ é™¤
export function delInvoice(query) {
    return request({
        url: '/purchase/invoice/delInvoice',
        method: 'delete',
        data: query
    })
    url: "/purchase/invoice/delInvoice",
    method: "delete",
    data: query,
  });
}
// åˆ é™¤é™„ä»¶
export function delCommonFile(query) {
    return request({
        url: '/commonFile/delCommonFile',
        method: 'delete',
        data: query
    })
    url: "/commonFile/delCommonFile",
    method: "delete",
    data: query,
  });
}
// å­è¡¨æ ¼æŸ¥è¯¢
export function productRecordList(query){
    return request({
        url: '/purchase/registration/productRecordList',
        method: 'get',
        params: query
    })
    url: "/purchase/registration/productRecordList",
    method: "get",
    params: query,
  });
}
// æŸ¥è¯¢åˆ—表
export function invoiceListPage(query) {
    return request({
        url: '/purchase/registration/listPage',
        method: 'get',
        params: query
    })
    url: "/purchase/registration/listPage",
    method: "get",
    params: query,
  });
}
export function productRecordPage(query) {
  return request({
    url: "/purchase/registration/productRecordPage",
    method: "get",
    params: query,
  });
}
src/api/procurementManagement/procurementLedger.js
@@ -1,67 +1,74 @@
// é‡‡è´­å°è´¦é¡µé¢æŽ¥å£
import request from '@/utils/request'
import request from "@/utils/request";
// åˆ†é¡µæŸ¥è¯¢
export function purchaseList(query) {
    return request({
        url: '/purchase/ledger/list',
        method: 'get',
        params: query
    })
    url: "/purchase/ledger/list",
    method: "get",
    params: query,
  });
}
// æŸ¥è¯¢åˆåŒå·
export function getSalesNo(query) {
    return request({
        url: '/purchase/ledger/getSalesNo',
        method: 'get',
        params: query
    })
    url: "/purchase/ledger/getSalesNo",
    method: "get",
    params: query,
  });
}
// å­è¡¨æ ¼æŸ¥è¯¢
export function productList(query) {
    return request({
        url: '/sales/product/list',
        method: 'get',
        params: query
    })
    url: "/sales/product/list",
    method: "get",
    params: query,
  });
}
// æ–°å¢žã€ç¼–辑
export function addOrEditPurchase(query) {
    return request({
        url: '/purchase/ledger/addOrEditPurchase',
        method: 'post',
        data: query
    })
    url: "/purchase/ledger/addOrEditPurchase",
    method: "post",
    data: query,
  });
}
// åˆ é™¤
export function delPurchase(query) {
    return request({
        url: '/purchase/ledger/delPurchase',
        method: 'delete',
        data: query
    })
    url: "/purchase/ledger/delPurchase",
    method: "delete",
    data: query,
  });
}
// æŸ¥è¯¢è¯¦æƒ…
export function getPurchaseById(query) {
    return request({
        url: '/purchase/ledger/getPurchaseById',
        method: 'get',
        params: query
    })
    url: "/purchase/ledger/getPurchaseById",
    method: "get",
    params: query,
  });
}
// æŸ¥è¯¢è¯¦æƒ…
export function getOptions(query) {
    return request({
        url: '/system/supplier/getOptions',
        method: 'get',
        params: query
    })
    url: "/system/supplier/getOptions",
    method: "get",
    params: query,
  });
}
export function purchaseListPage(query) {
    return request({
        url: '/purchase/ledger/listPage',
        method: 'get',
        params: query
    })
    url: "/purchase/ledger/listPage",
    method: "get",
    params: query,
  });
}
export function createPurchaseNo() {
  return request({
    url: "/purchase/ledger/createPurchaseNo",
    method: "get",
  });
}
src/views/procurementManagement/invoiceEntry/index.vue
@@ -222,18 +222,19 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
        <!-- <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="录入日期:" prop="createTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.createTime"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        </el-row> -->
        <el-row>
          <el-form-item label="产品信息:" prop="entryDate"> </el-form-item>
        </el-row>
@@ -256,6 +257,7 @@
          <el-table-column label="单位" prop="unit" width="70" />
          <el-table-column label="数量" prop="quantity" width="70" />
          <el-table-column label="税率(%)" prop="taxRate" width="80" />
          <el-table-column label="录入日期" prop="createTime" width="120" />
          <el-table-column
            label="含税单价(元)"
            width="150"
src/views/procurementManagement/paymentEntry/index.vue
@@ -14,10 +14,10 @@
                @change="handleQuery"
              />
            </el-form-item>
            <el-form-item label="不显示待回款">
            <el-form-item>
              <el-checkbox
                v-model="searchForm.status"
                :label="0"
                label="不显示待付款为0"
                @change="handleQuery"
              />
            </el-form-item>
@@ -483,4 +483,7 @@
.table_list {
  margin-top: unset;
}
::v-deep(.el-checkbox__label) {
  font-weight: bold;
}
</style>
src/views/procurementManagement/paymentHistory/index.vue
@@ -1,106 +1,166 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">供应商名称:</span>
        <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="输入供应商名称搜索"
          @change="handleQuery" clearable :prefix-icon="Search" />
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button>
      </div>
    </div>
    <el-form :model="searchForm" :inline="true">
      <el-form-item label="供应商名称">
        <el-input
          v-model="searchForm.searchText"
          style="width: 240px"
          placeholder="输入供应商名称搜索"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
      </el-form-item>
      <el-form-item label="付款日期">
        <el-date-picker
          v-model="searchForm.paymentDate"
          value-format="YYYY-MM-DD"
          format="YYYY-MM-DD"
          type="daterange"
          start-placeholder="开始时间"
          end-placeholder="结束时间"
          clearable
          @change="changeDateRange"
          @clear="clearRange"
        />
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          @click="handleQuery"
          style="margin-left: 10px"
        >
          æœç´¢
        </el-button>
      </el-form-item>
    </el-form>
    <div class="table_list">
      <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
      <PIMTable
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :isSelection="true"
                :isShowSummary="isShowSummarySon"
                :summaryMethod="summarizeMainTable1"
        :handleSelectionChange="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
        :total="total"></PIMTable>
        :handleSelectionChange="handleSelectionChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
        :total="total"
      ></PIMTable>
    </div>
  </div>
</template>
<script setup>
import { ref } from 'vue'
import { ref } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
  paymentHistoryListPage
} from "@/api/procurementManagement/paymentEntry.js";
const { proxy } = getCurrentInstance()
import { paymentHistoryListPage } from "@/api/procurementManagement/paymentEntry.js";
import useFormData from "@/hooks/useFormData";
import dayjs from "dayjs";
const { proxy } = getCurrentInstance();
const isShowSummarySon = ref(true);
const tableColumn = ref([
  {
    label: '付款日期',
    prop: 'paymentDate',
    label: "付款日期",
    prop: "paymentDate",
  },
  {
    label: '供应商名称',
    prop: 'supplierName',
    label: "供应商名称",
    prop: "supplierName",
  },
  {
    label: '付款金额',
    prop: 'currentPaymentAmount',
    label: "付款金额",
    prop: "currentPaymentAmount",
    formatData: (params) => {
      return parseFloat(params).toFixed(2);
    }
    },
  },
  {
    label: '付款方式',
    prop: 'paymentMethod'
    label: "付款方式",
    prop: "paymentMethod",
  },
  {
    label: '登记人',
    prop: 'registrant'
    label: "登记人",
    prop: "registrant",
  },
  {
    label: '登记日期',
    prop: 'registrationtDate'
  }
])
const tableData = ref([])
const selectedRows = ref([])
const tableLoading = ref(false)
    label: "登记日期",
    prop: "registrationtDate",
  },
]);
const tableData = ref([]);
const selectedRows = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
})
const total = ref(0)
const data = reactive({
  searchForm: {
    searchText: '',
  },
})
const { searchForm } = toRefs(data)
});
const total = ref(0);
const { form: searchForm } = useFormData({
  searchText: undefined,
  paymentDate: [
    dayjs().startOf("month").format("YYYY-MM-DD"),
    dayjs().endOf("month").format("YYYY-MM-DD"),
  ],
  paymentDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
  paymentDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
});
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1
  getList()
}
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList()
}
  getList();
};
const getList = () => {
  tableLoading.value = true
  paymentHistoryListPage({ ...searchForm.value, ...page }).then(res => {
    tableLoading.value = false
    tableData.value = res.records
    total.value = res.total
  })
}
  tableLoading.value = true;
  const { paymentDate, ...rest } = searchForm;
  paymentHistoryListPage({ ...rest, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.records;
    total.value = res.total;
  });
};
// å­è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable1 = (param) => {
  return proxy.summarizeTable(param, ['currentPaymentAmount'], {
  return proxy.summarizeTable(param, ["currentPaymentAmount"], {
    ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
  });
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const handleSelectionChange = (selection) => {
  selectedRows.value = selection
  selectedRows.value = selection;
};
const changeDateRange = (date) => {
  if (date) {
    searchForm.paymentDateStart = date[0];
    searchForm.paymentDateEnd = date[1];
    getList();
}
getList()
};
const clearRange = () => {
  searchForm.paymentDate = [];
  searchForm.paymentDateStart = undefined;
  searchForm.paymentDateEnd = undefined;
  getList();
};
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
.table_list {
  margin-top: unset;
}
</style>
src/views/procurementManagement/procurementInvoiceLedger/index.vue
@@ -1,274 +1,184 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">采购合同号:</span>
    <el-form :model="filters" :inline="true">
      <el-form-item label="采购合同号">
        <el-input
          v-model="searchForm.purchaseContractNumber"
          v-model="filters.purchaseContractNumber"
          style="width: 240px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
          @change="getTableData"
        />
        <span class="search_title" style="margin-left: 10px">供应商:</span>
      </el-form-item>
      <el-form-item label="供应商">
        <el-input
          v-model="searchForm.supplierName"
          v-model="filters.supplierName"
          style="width: 240px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
          @change="getTableData"
        />
        <span class="search_title" style="margin-left: 10px">来票日期:</span>
      </el-form-item>
      <el-form-item label="来票日期">
        <el-date-picker
          style="width: 240px"
          v-model="searchForm.issueDate"
          v-model="filters.createdAt"
          value-format="YYYY-MM-DD"
          format="YYYY-MM-DD"
          type="daterange"
          start-placeholder="开始时间"
          end-placeholder="结束时间"
          clearable
          @change="changeDateRange"
          @clear="clearRange"
          @change="getTableData"
        />
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="getTableData">搜索</el-button>
        <el-button @click="resetFilters"> é‡ç½® </el-button>
        <el-button @click="handleOut">导出</el-button>
      </div>
    </div>
      </el-form-item>
    </el-form>
    <div class="table_list">
      <el-table
        :data="tableData"
        border
        v-loading="tableLoading"
        :expand-row-keys="expandedRowKeys"
        :row-key="(row) => row.id"
        show-summary
        :summary-method="summarizeMainTable"
        @expand-change="expandChange"
        height="calc(100vh - 18.5em)"
      <PIMTable
        :column="columns"
        :tableLoading="loading"
        :tableData="dataList"
        :isSelection="true"
        :page="{
          current: pagination.currentPage,
          size: pagination.pageSize,
          total: pagination.total,
        }"
        :handleSelectionChange="handleSelectionChange"
        @pagination="onCurrentChange"
      >
        <el-table-column align="center" label="序号" type="index" width="55" />
        <el-table-column type="expand">
          <template #default="props">
            <el-table
              :data="props.row.children"
              border
              show-summary
              :summary-method="summarizeChildrenTable"
            >
              <el-table-column
                align="center"
                label="序号"
                type="index"
                width="60"
              />
              <el-table-column label="产品大类" prop="productCategory" />
              <el-table-column label="规格型号" prop="specificationModel" />
              <el-table-column label="单位" prop="unit" />
              <el-table-column label="数量" prop="quantity" />
              <el-table-column label="税率(%)" prop="taxRate" />
              <el-table-column
                label="含税单价(元)"
                prop="taxInclusiveUnitPrice"
                :formatter="formattedNumber"
              />
              <el-table-column
                label="含税总价(元)"
                prop="taxInclusiveTotalPrice"
                :formatter="formattedNumber"
              />
              <el-table-column
                label="不含税总价(元)"
                prop="taxExclusiveTotalPrice"
                :formatter="formattedNumber"
              />
              <el-table-column label="本次来票数" prop="ticketsNum" />
              <el-table-column
                label="本次来票金额(元)"
                prop="ticketsAmount"
                :formatter="formattedNumber"
              />
              <el-table-column label="未来票数" prop="futureTickets" />
              <el-table-column
                label="未来票金额(元)"
                prop="futureTicketsAmount"
                :formatter="formattedNumber"
              />
            </el-table>
          </template>
        </el-table-column>
        <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="invoiceNumber"
          show-overflow-tooltip
        />
        <el-table-column
          label="合同金额(元)"
          prop="invoiceAmount"
          show-overflow-tooltip
          :formatter="formattedNumber"
        />
        <el-table-column label="开票人" prop="issUer" show-overflow-tooltip />
        <el-table-column
          label="开票日期"
          prop="issueDate"
          show-overflow-tooltip
        />
      </el-table>
      <pagination
        v-show="total > 0"
        :total="total"
        layout="total, sizes, prev, pager, next, jumper"
        :page="page.current"
        :limit="page.size"
        @pagination="paginationChange"
      />
        <!-- <template #operation>
          <el-button type="primary" text @click="handleEdit" size="small">
            ç¼–辑
          </el-button>
        </template> -->
      </PIMTable>
    </div>
  </div>
</template>
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import { ref } from "vue";
import { ref, getCurrentInstance } from "vue";
import { usePaginationApi } from "@/hooks/usePaginationApi";
import { Search } from "@element-plus/icons-vue";
import { productRecordPage } from "@/api/procurementManagement/procurementInvoiceLedger.js";
import { onMounted } from "vue";
import { ElMessageBox } from "element-plus";
import { productRecordList } from "@/api/procurementManagement/procurementInvoiceLedger.js";
import { invoiceListPage } from "@/api/procurementManagement/procurementInvoiceLedger.js";
import dayjs from "dayjs";
defineOptions({
  name: "来票台账",
});
const { proxy } = getCurrentInstance();
const tableData = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
});
const total = ref(0);
// ç”¨æˆ·ä¿¡æ¯è¡¨å•弹框数据
const data = reactive({
  searchForm: {
    purchaseContractNumber: "",
    supplierName: "",
    issueDate: [
      dayjs().startOf("month").format("YYYY-MM-DD"),
      dayjs().endOf("month").format("YYYY-MM-DD"),
    ],
    issueDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
    issueDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
  },
  form: {
    issueDate: "", // å¼€ç¥¨æ—¥æœŸ
    purchaseLedgerId: "",
    purchaseLedgerNo: "",
    issUerId: "", // å¼€ç¥¨äººid
    issUer: "", // å¼€ç¥¨äººå§“名
  },
  rules: {
    purchaseLedgerId: [
      { required: true, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm } = toRefs(data);
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1;
  getList();
};
const paginationChange = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  const { issueDate, ...rest } = searchForm.value;
  invoiceListPage({ ...rest, ...page })
    .then((res) => {
      tableLoading.value = false;
      tableData.value = res.records;
      tableData.value.map((item) => {
        item.children = [];
      });
      total.value = res.total;
      expandedRowKeys.value = [];
    })
    .catch(() => {
      tableLoading.value = false;
    });
};
const formattedNumber = (row, column, cellValue) => {
  return parseFloat(cellValue).toFixed(2);
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const expandedRowKeys = ref([]);
// å±•开行
const expandChange = (row, expandedRows) => {
  if (expandedRows.length > 0) {
    expandedRowKeys.value = [];
    try {
      productRecordList({ id: row.id }).then((res) => {
        const index = tableData.value.findIndex((item) => item.id === row.id);
        if (index > -1) {
          tableData.value[index].children = res;
        }
        expandedRowKeys.value.push(row.id);
      });
    } catch (error) {
      console.log(error);
    }
  } else {
    expandedRowKeys.value = [];
  }
};
// ä¸»è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(param, ["invoiceAmount"], {
    ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
  });
};
// å­è¡¨åˆè®¡æ–¹æ³•
const summarizeChildrenTable = (param) => {
  return proxy.summarizeTable(
    param,
    [
      "taxInclusiveUnitPrice",
      "taxInclusiveTotalPrice",
      "taxExclusiveTotalPrice",
      "ticketsNum",
      "ticketsAmount",
      "futureTickets",
      "futureTicketsAmount",
    ],
const multipleVal = ref([]);
const {
  loading,
  filters,
  columns,
  dataList,
  pagination,
  getTableData,
  resetFilters,
  onCurrentChange,
} = usePaginationApi(
  productRecordPage,
    {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    purchaseContractNumber: undefined, // é‡‡è´­åˆåŒå·
    supplierName: undefined, // ä¾›åº”商
    createdAt: [], // æ¥ç¥¨æ—¥æœŸ
  },
  [
    {
      label: "采购合同号",
      prop: "purchaseContractNumber",
      align: "center",
    },
    {
      label: "销售合同号",
      prop: "salesContractNo",
      align: "center",
    },
    {
      label: "客户名称",
      prop: "customerName",
      align: "center",
    },
    {
      label: "供应商名称",
      prop: "supplierName",
      align: "center",
    },
    {
      label: "规格型号",
      prop: "specificationModel",
      align: "center",
    },
    {
      label: "发票号",
      prop: "invoiceNumber",
      align: "center",
    },
    {
      label: "合同金额(元)",
      prop: "taxInclusiveTotalPrice",
      align: "center",
      formatData: (cell) => {
        return parseFloat(cell).toFixed(2);
      },
    },
    {
      label: "开票日期",
      prop: "createdAt",
      align: "center",
    },
    {
      label: "开票金额",
      prop: "ticketsAmount",
      align: "center",
      formatData: (cell) => {
        return parseFloat(cell).toFixed(2);
      },
    },
    {
      label: "不含税金额",
      prop: "unTicketsPrice",
      align: "center",
      formatData: (cell) => {
        return parseFloat(cell).toFixed(2);
      },
    },
    {
      label: "增值税",
      prop: "invoiceAmount",
      align: "center",
    },
    // {
    //   fixed: "right",
    //   width: 120,
    //   label: "操作",
    //   dataType: "slot",
    //   slot: "operation",
    //   align: "center",
    // },
  ],
  {},
  {
    createdAt: (aim) => ({
      createdAtStart: aim[0],
      createdAtEnd: aim[1],
    }),
    }
  );
const handleSelectionChange = (val) => {
  multipleVal.value = val;
};
// å¯¼å‡º
@@ -286,24 +196,15 @@
    });
};
const changeDateRange = (date) => {
  if (date) {
    searchForm.receiptPaymentDateStart = date[0];
    searchForm.receiptPaymentDateEnd = date[1];
    getList();
  }
};
const clearRange = () => {
  searchForm.value.issueDate = [];
  searchForm.value.issueDateStart = undefined;
  searchForm.value.issueDateEnd = undefined;
  getList();
};
// const handleEdit = () => {};
onMounted(() => {
  getList();
  getTableData();
});
</script>
<style scoped lang="scss"></style>
<style lang="scss" scoped>
.table_list {
  margin-top: unset;
}
</style>
src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,311 @@
<template>
  <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"
        />
        <span class="search_title" style="margin-left: 10px">供应商:</span>
        <el-input
          v-model="searchForm.supplierName"
          style="width: 240px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
        <span class="search_title" style="margin-left: 10px">来票日期:</span>
        <el-date-picker
          style="width: 240px"
          v-model="searchForm.issueDate"
          value-format="YYYY-MM-DD"
          format="YYYY-MM-DD"
          type="daterange"
          start-placeholder="开始时间"
          end-placeholder="结束时间"
          clearable
          @change="changeDateRange"
          @clear="clearRange"
        />
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button @click="handleOut">导出</el-button>
      </div>
    </div>
    <div class="table_list">
      <el-table
        :data="tableData"
        border
        v-loading="tableLoading"
        :expand-row-keys="expandedRowKeys"
        :row-key="(row) => row.id"
        show-summary
        :summary-method="summarizeMainTable"
        @expand-change="expandChange"
        height="calc(100vh - 18.5em)"
      >
        <el-table-column align="center" label="序号" type="index" width="55" />
        <el-table-column type="expand">
          <template #default="props">
            <el-table
              :data="props.row.children"
              border
              show-summary
              :summary-method="summarizeChildrenTable"
            >
              <el-table-column
                align="center"
                label="序号"
                type="index"
                width="60"
              />
              <el-table-column label="产品大类" prop="productCategory" />
              <el-table-column label="规格型号" prop="specificationModel" />
              <el-table-column label="单位" prop="unit" />
              <el-table-column label="数量" prop="quantity" />
              <el-table-column label="税率(%)" prop="taxRate" />
              <el-table-column
                label="含税单价(元)"
                prop="taxInclusiveUnitPrice"
                :formatter="formattedNumber"
              />
              <el-table-column
                label="含税总价(元)"
                prop="taxInclusiveTotalPrice"
                :formatter="formattedNumber"
              />
              <el-table-column
                label="不含税总价(元)"
                prop="taxExclusiveTotalPrice"
                :formatter="formattedNumber"
              />
              <el-table-column label="本次来票数" prop="ticketsNum" />
              <el-table-column
                label="本次来票金额(元)"
                prop="ticketsAmount"
                :formatter="formattedNumber"
              />
              <el-table-column label="未来票数" prop="futureTickets" />
              <el-table-column
                label="未来票金额(元)"
                prop="futureTicketsAmount"
                :formatter="formattedNumber"
              />
            </el-table>
          </template>
        </el-table-column>
        <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="invoiceNumber"
          show-overflow-tooltip
        />
        <el-table-column
          label="合同金额(元)"
          prop="invoiceAmount"
          show-overflow-tooltip
          :formatter="formattedNumber"
        />
        <el-table-column label="开票人" prop="issUer" show-overflow-tooltip />
        <el-table-column
          label="开票日期"
          prop="issueDate"
          show-overflow-tooltip
        />
      </el-table>
      <pagination
        v-show="total > 0"
        :total="total"
        layout="total, sizes, prev, pager, next, jumper"
        :page="page.current"
        :limit="page.size"
        @pagination="paginationChange"
      />
    </div>
  </div>
</template>
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import { ref } from "vue";
import { Search } from "@element-plus/icons-vue";
import { ElMessageBox } from "element-plus";
import {
  invoiceListPage,
  productRecordList,
} from "@/api/procurementManagement/procurementInvoiceLedger.js";
import dayjs from "dayjs";
const { proxy } = getCurrentInstance();
const tableData = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
});
const total = ref(0);
// ç”¨æˆ·ä¿¡æ¯è¡¨å•弹框数据
const data = reactive({
  searchForm: {
    purchaseContractNumber: "",
    supplierName: "",
    issueDate: [
      dayjs().startOf("month").format("YYYY-MM-DD"),
      dayjs().endOf("month").format("YYYY-MM-DD"),
    ],
    issueDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
    issueDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
  },
  form: {
    issueDate: "", // å¼€ç¥¨æ—¥æœŸ
    purchaseLedgerId: "",
    purchaseLedgerNo: "",
    issUerId: "", // å¼€ç¥¨äººid
    issUer: "", // å¼€ç¥¨äººå§“名
  },
  rules: {
    purchaseLedgerId: [
      { required: true, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm } = toRefs(data);
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1;
  getList();
};
const paginationChange = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  const { issueDate, ...rest } = searchForm.value;
  invoiceListPage({ ...rest, ...page })
    .then((res) => {
      tableLoading.value = false;
      tableData.value = res.records;
      tableData.value.map((item) => {
        item.children = [];
      });
      total.value = res.total;
      expandedRowKeys.value = [];
    })
    .catch(() => {
      tableLoading.value = false;
    });
};
const formattedNumber = (row, column, cellValue) => {
  return parseFloat(cellValue).toFixed(2);
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const expandedRowKeys = ref([]);
// å±•开行
const expandChange = (row, expandedRows) => {
  if (expandedRows.length > 0) {
    expandedRowKeys.value = [];
    try {
      productRecordList({ id: row.id }).then((res) => {
        const index = tableData.value.findIndex((item) => item.id === row.id);
        if (index > -1) {
          tableData.value[index].children = res;
        }
        expandedRowKeys.value.push(row.id);
      });
    } catch (error) {
      console.log(error);
    }
  } else {
    expandedRowKeys.value = [];
  }
};
// ä¸»è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(param, ["invoiceAmount"], {
    ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
  });
};
// å­è¡¨åˆè®¡æ–¹æ³•
const summarizeChildrenTable = (param) => {
  return proxy.summarizeTable(
    param,
    [
      "taxInclusiveUnitPrice",
      "taxInclusiveTotalPrice",
      "taxExclusiveTotalPrice",
      "ticketsNum",
      "ticketsAmount",
      "futureTickets",
      "futureTicketsAmount",
    ],
    {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    }
  );
};
// å¯¼å‡º
const handleOut = () => {
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download("/purchase/registration/export", {}, "来票登记.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
const changeDateRange = (date) => {
  if (date) {
    searchForm.value.receiptPaymentDateStart = date[0];
    searchForm.value.receiptPaymentDateEnd = date[1];
    getList();
  }
};
const clearRange = () => {
  searchForm.value.issueDate = [];
  searchForm.value.issueDateStart = undefined;
  searchForm.value.issueDateEnd = undefined;
  getList();
};
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>
src/views/procurementManagement/procurementLedger/index.vue
@@ -9,7 +9,7 @@
          placeholder="请输入"
          @change="handleQuery"
          clearable
          prefix-icon="Search"
          :prefix-icon="Search"
        />
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
@@ -513,6 +513,7 @@
  productList,
  getPurchaseById,
  getOptions,
  createPurchaseNo,
} from "@/api/procurementManagement/procurementLedger.js";
const { proxy } = getCurrentInstance();
const tableData = ref([]);
@@ -701,6 +702,11 @@
  form.value = {};
  productData.value = [];
  fileList.value = [];
  if (operationType.value == "add") {
    createPurchaseNo().then((res) => {
      form.value.purchaseContractNumber = res.data;
    });
  }
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
src/views/procurementManagement/reportAnalysis/projectProfit/index.vue
@@ -1,6 +1,6 @@
<template>
  <div class="app-container">
    <el-form class="search_form" :inline="true" label-width="80px">
    <el-form :model="filters" :inline="true" label-width="80px">
      <el-form-item label="客户名称">
        <el-input v-model="filters.customerName" placeholder="请输入客户名称" />
      </el-form-item>
@@ -17,6 +17,7 @@
        :page="{
          current: pagination.currentPage,
          size: pagination.pageSize,
          total: pagination.total,
        }"
        @pagination="onCurrentChange"
      ></PIMTable>
src/views/procurementManagement/reportAnalysis/taxComparison/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
<template>
  <div class="app-container">
    <el-form :model="filters" :inline="true">
      <el-form-item label="日期">
        <el-date-picker
          style="width: 240px"
          v-model="filters.dateRange"
          value-format="YYYY-MM-DD"
          format="YYYY-MM-DD"
          type="daterange"
          start-placeholder="开始时间"
          end-placeholder="结束时间"
          clearable
          @change="getTableData"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="getTableData"> æœç´¢ </el-button>
        <el-button @click="resetFilters"> é‡ç½® </el-button>
      </el-form-item>
    </el-form>
    <div class="table_list">
      <PIMTable
        :column="columns"
        :tableData="dataList"
        :page="{
          current: pagination.currentPage,
          size: pagination.pageSize,
          total: pagination.total,
        }"
        @pagination="onCurrentChange"
      />
    </div>
  </div>
</template>
<script setup>
import { usePaginationApi } from "@/hooks/usePaginationApi";
import { onMounted } from "vue";
defineOptions({
  name: "增值税比对",
});
const {
  loading,
  filters,
  columns,
  dataList,
  pagination,
  getTableData,
  resetFilters,
  onCurrentChange,
} = usePaginationApi(
  () => {},
  {
    dateRange: [], // æ¥ç¥¨æ—¥æœŸ
  },
  [
    {
      label: "月份",
    },
    {
      label: "销项税额",
    },
    {
      label: "进项税额",
    },
    {
      label: "销-进",
    },
  ],
  {},
  {
    dateRange: (aim) => ({
      dateRangeStart: aim[0],
      dateRangeEnd: aim[1],
    }),
  }
);
onMounted(() => {
  getTableData();
});
</script>
<style lang="scss" scoped>
.table_list {
  margin-top: unset;
}
</style>
src/views/salesManagement/invoiceLedger/index.vue
@@ -26,6 +26,9 @@
            @clear="clearRange"
          />
        </el-form-item>
        <el-form-item label="不显示有发票行">
          <el-checkbox v-model="searchForm.status" @change="handleQuery" />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleQuery"> æœç´¢ </el-button>
          <el-button @click="resetForm"> é‡ç½® </el-button>
@@ -76,9 +79,15 @@
        />
        <el-table-column label="税率" prop="taxRate" show-overflow-tooltip />
        <el-table-column
          label="开票人"
          label="录入人"
          prop="invoicePerson"
          show-overflow-tooltip
        />
        <el-table-column
          label="录入日期"
          prop="createTime"
          show-overflow-tooltip
          :formatter="formatDate"
        />
        <el-table-column
          label="开票日期"
@@ -312,6 +321,7 @@
const data = reactive({
  searchForm: {
    searchText: "",
    status: false,
    invoiceDate: [
      dayjs().startOf("month").format("YYYY-MM-DD"),
      dayjs().endOf("month").format("YYYY-MM-DD"),
@@ -356,6 +366,9 @@
const formattedNumber = (row, column, cellValue) => {
  return parseFloat(cellValue).toFixed(2);
};
const formatDate = (row, column, cellValue) => {
  return dayjs(cellValue).format("YYYY-MM-DD HH:mm:ss");
};
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
src/views/salesManagement/invoiceRegistration/index.vue
@@ -12,12 +12,6 @@
            @change="handleQuery"
          />
        </el-form-item>
        <el-form-item label="未开票金额是否为0">
          <el-select v-model="searchForm.status" style="width: 90px" clearable>
            <el-option label="否" :value="0" />
            <el-option label="是" :value="1" />
          </el-select>
        </el-form-item>
        <el-form-item label="客户合同号">
          <el-input
            v-model="searchForm.customerContractNo"
@@ -33,15 +27,25 @@
          />
        </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-button @click="resetForm"> é‡ç½® </el-button>
        </el-form-item>
      </el-form>
    </div>
    <div class="table_list">
      <div class="flex justify-between">
        <div></div>
      <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
        æ–°å¢žç™»è®°
      </el-button>
      </div>
      <el-table
        :data="tableData"
        :border="true"
@@ -212,6 +216,48 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="录入人">
              <el-input v-model="form.createUer" placeholder="请输入录入人" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="开票日期" prop="issueDate">
              <el-date-picker
                style="width: 100%"
                v-model="form.issueDate"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="录入日期:" prop="createTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.createTime"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="发票号码:" prop="invoiceNo">
              <el-input
                v-model="form.invoiceNo"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-form-item label="产品信息:" prop="entryDate"> </el-form-item>
        </el-row>
@@ -295,6 +341,7 @@
                min="0"
                disabled
                v-model="scope.row.noInvoiceAmount"
                :formatter="formattedInputNumber"
                :precision="2"
                :step="0.01"
              ></el-input>
@@ -314,7 +361,7 @@
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import { ref } from "vue";
import { onMounted, ref } from "vue";
import { Search } from "@element-plus/icons-vue";
import { ElMessageBox } from "element-plus";
// import {userListNoPage} from "@/api/system/user.js";
@@ -342,9 +389,12 @@
const data = reactive({
  searchForm: {
    customerName: "",
    status: 0,
    status: false,
    customerContractNo: undefined, // å®¢æˆ·åˆåŒå·
    projectName: undefined, // é¡¹ç›®åç§°
    createUer: undefined, // å½•入人
    issueDate: undefined, // å¼€ç¥¨æ—¥æœŸ
    createTime: undefined, // å½•入日期:
  },
  form: {
    salesLedgerId: "",
@@ -370,6 +420,11 @@
    return cellValue;
  }
};
const formattedInputNumber = (value) => {
  return parseFloat(value).toFixed(2);
};
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
@@ -537,11 +592,22 @@
  ).toFixed(2);
};
onMounted(() => {
getList();
});
</script>
<style scoped lang="scss">
.table_list {
  margin-top: unset;
}
.flex {
  display: flex;
}
.justify-between {
  justify-content: space-between;
}
::v-deep(.el-checkbox__label) {
  font-weight: bold;
}
</style>
src/views/salesManagement/receiptPayment/index.vue
@@ -14,10 +14,10 @@
                @change="handleQuery"
              />
            </el-form-item>
            <el-form-item label="不显示待回款">
            <el-form-item>
              <el-checkbox
                v-model="searchForm.status"
                :label="0"
                label="不显示待回款为0"
                @change="handleQuery"
              />
            </el-form-item>
@@ -139,7 +139,7 @@
        />
        <el-table-column
          label="项目名称"
          prop="customerName"
          prop="projectName"
          show-overflow-tooltip
        />
        <el-table-column
@@ -550,4 +550,7 @@
.table_list {
  margin-top: unset;
}
::v-deep(.el-checkbox__label) {
  font-weight: bold;
}
</style>
src/views/salesManagement/receiptPaymentHistory/index.vue
@@ -63,6 +63,10 @@
    prop: "customerName",
  },
  {
    label: "项目名称",
    prop: "projectName",
  },
  {
    label: "回款金额(元)",
    prop: "receiptPaymentAmount",
    formatData: (params) => {
src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -200,22 +200,22 @@
const summarizeMainTable1 = (param) => {
  var summarizeTable = proxy.summarizeTable(
    param,
    ["invoiceAmount", "receiptAmount"],
    ["invoiceAmount", "receiptAmount", "unReceiptAmount"],
    {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
    }
  );
  // å–最后一行数据;
  if (receiptRecord.value?.length > 0) {
    const index = tableData.value.findIndex(
      (item) => item.id == customerId.value
    );
    summarizeTable[summarizeTable.length - 1] =
      tableData.value[index].unReceiptPaymentAmount.toFixed(2);
  } else {
    summarizeTable[summarizeTable.length - 1] = 0.0;
  }
  // if (receiptRecord.value?.length > 0) {
  //   const index = tableData.value.findIndex(
  //     (item) => item.id == customerId.value
  //   );
  //   summarizeTable[summarizeTable.length - 1] =
  //     tableData.value[index].unReceiptPaymentAmount.toFixed(2);
  // } else {
  //   summarizeTable[summarizeTable.length - 1] = 0.0;
  // }
  // const sb = tableData.findIndex((item) => item.id == customerId.value);
  // console.log(sb);
  return summarizeTable;