zhangwencui
昨天 8dfd0949932015627838054c708c2d053117b705
src/views/inventoryManagement/receiptManagement/index.vue
@@ -1,314 +1,432 @@
<template>
  <div class="app-container">
    <el-tabs v-model="activeTab" @tab-change="handleTabChange">
      <el-tab-pane label="成品入库" name="production">
    <el-tabs v-model="activeTab"
             @tab-change="handleTabChange">
      <el-tab-pane label="成品入库"
                   name="production">
        <div class="search_form">
          <div>
            <span class="search_title ml10">入库日期:</span>
            <el-date-picker
              v-model="searchForm.timeStr"
              type="date"
              placeholder="请选择日期"
              value-format="YYYY-MM-DD"
              format="YYYY-MM-DD"
              clearable
              @change="handleQuery"
            />
            <el-date-picker v-model="searchForm.timeStr"
                            type="date"
                            placeholder="请选择日期"
                            value-format="YYYY-MM-DD"
                            format="YYYY-MM-DD"
                            clearable
                            @change="handleQuery" />
            <span class="search_title ml10">产品大类:</span>
            <el-input
              v-model="searchForm.productCategory"
              style="width: 240px"
              placeholder="请输入"
              clearable
            />
            <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button>
            <el-input v-model="searchForm.productCategory"
                      style="width: 240px"
                      placeholder="请输入"
                      clearable />
            <el-button type="primary"
                       @click="handleQuery"
                       style="margin-left: 10px">搜索</el-button>
          </div>
          <div>
            <el-button @click="handleOut">导出</el-button>
            <el-button type="danger" plain @click="handleDelete">删除</el-button>
            <el-button type="danger"
                       plain
                       @click="handleDelete">删除</el-button>
          </div>
        </div>
        <div class="table_list">
          <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
            :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
            :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
            <el-table-column align="center" type="selection" width="55" />
            <el-table-column align="center" label="序号" type="index" width="60" />
            <el-table-column label="入库时间" prop="createTime" show-overflow-tooltip />
                  <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip />
            <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip />
            <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip />
            <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip />
                  <el-table-column label="入库数量" prop="inboundNum" width="100" show-overflow-tooltip />
                  <el-table-column label="单价(元)" prop="unitPrice" width="150"></el-table-column>
                  <el-table-column label="总价(元)" prop="totalPrice" width="150"></el-table-column>
            <el-table-column fixed="right" label="操作" min-width="60" align="center">
          <el-table :data="tableData"
                    border
                    v-loading="tableLoading"
                    @selection-change="handleSelectionChange"
                    :expand-row-keys="expandedRowKeys"
                    :row-key="row => row.id"
                    show-summary
                    style="width: 100%"
                    :summary-method="summarizeMainTable"
                    height="calc(100vh - 18.5em)">
            <el-table-column align="center"
                             type="selection"
                             width="55" />
            <el-table-column align="center"
                             label="序号"
                             type="index"
                             width="60" />
            <el-table-column label="入库时间"
                             prop="createTime"
                             show-overflow-tooltip />
            <el-table-column label="销售合同号"
                             prop="salesContractNo"
                             width="180"
                             show-overflow-tooltip />
            <el-table-column label="产品大类"
                             prop="productCategory"
                             show-overflow-tooltip />
            <el-table-column label="规格型号"
                             prop="specificationModel"
                             show-overflow-tooltip />
            <el-table-column label="单位"
                             prop="unit"
                             width="70"
                             show-overflow-tooltip />
            <el-table-column label="入库数量"
                             prop="inboundNum"
                             width="100"
                             show-overflow-tooltip />
            <el-table-column label="单价(元)"
                             prop="unitPrice"
                             width="150"></el-table-column>
            <el-table-column label="总价(元)"
                             prop="totalPrice"
                             width="150"></el-table-column>
            <!-- <el-table-column fixed="right"
                             label="操作"
                             min-width="60"
                             align="center">
              <template #default="scope">
                <el-button link type="primary" size="small" @click="openForm('edit', scope.row, 'production');">编辑</el-button>
                <el-button link
                           type="primary"
                           size="small"
                           @click="openForm('edit', scope.row, 'production');">编辑</el-button>
              </template>
            </el-table-column> -->
          </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>
      </el-tab-pane>
      <el-tab-pane label="原料入库"
                   name="purchase">
        <div class="search_form">
          <div>
            <span class="search_title ml10">入库日期:</span>
            <el-date-picker v-model="searchForm.timeStr"
                            type="date"
                            placeholder="请选择日期"
                            value-format="YYYY-MM-DD"
                            format="YYYY-MM-DD"
                            clearable
                            @change="handleQuery" />
            <span class="search_title ml10">产品大类:</span>
            <el-input v-model="searchForm.productCategory"
                      style="width: 240px"
                      placeholder="请输入"
                      clearable />
            <el-button type="primary"
                       @click="handleQuery"
                       style="margin-left: 10px">搜索</el-button>
          </div>
          <div>
            <el-button type="primary"
                       @click="openForm('add', 'purchase')">新增入库</el-button>
            <el-button @click="handleOut">导出</el-button>
            <el-button type="danger"
                       plain
                       @click="handleDelete">删除</el-button>
          </div>
        </div>
        <div class="table_list">
          <el-table :data="tableData"
                    border
                    v-loading="tableLoading"
                    @selection-change="handleSelectionChange"
                    :expand-row-keys="expandedRowKeys"
                    :row-key="row => row.id"
                    show-summary
                    style="width: 100%"
                    :summary-method="summarizeMainTable"
                    height="calc(100vh - 18.5em)">
            <el-table-column align="center"
                             type="selection"
                             width="55" />
            <el-table-column align="center"
                             label="序号"
                             type="index"
                             width="60" />
            <el-table-column label="入库时间"
                             prop="createTime"
                             width="100"
                             show-overflow-tooltip />
            <el-table-column label="采购合同号"
                             prop="purchaseContractNumber"
                             width="180"
                             show-overflow-tooltip />
            <el-table-column label="供应商名称"
                             prop="supplierName"
                             width="240"
                             show-overflow-tooltip />
            <el-table-column label="产品大类"
                             prop="productCategory"
                             show-overflow-tooltip />
            <el-table-column label="规格型号"
                             prop="specificationModel"
                             show-overflow-tooltip />
            <el-table-column label="单位"
                             prop="unit"
                             width="70"
                             show-overflow-tooltip />
            <el-table-column label="入库数量"
                             prop="inboundNum"
                             width="100"
                             show-overflow-tooltip />
            <el-table-column label="含税单价(元)"
                             prop="taxInclusiveUnitPrice"
                             width="150"></el-table-column>
            <el-table-column label="含税总价(元)"
                             prop="taxInclusiveTotalPrice"
                             width="150"></el-table-column>
            <el-table-column label="入库人"
                             prop="createBy"
                             width="80"
                             show-overflow-tooltip />
            <el-table-column fixed="right"
                             label="操作"
                             min-width="60"
                             align="center">
              <template #default="scope">
                <el-button link
                           :disabled="scope.row.type == 1"
                           type="primary"
                           size="small"
                           @click="openForm('edit', scope.row, 'purchase');">编辑</el-button>
              </template>
            </el-table-column>
          </el-table>
          <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
            :page="page.current" :limit="page.size" @pagination="paginationChange" />
          <pagination v-show="total > 0"
                      :total="total"
                      layout="total, sizes, prev, pager, next, jumper"
                      :page="page.current"
                      :limit="page.size"
                      @pagination="paginationChange" />
        </div>
      </el-tab-pane>
     <el-tab-pane label="原料入库" name="purchase">
       <div class="search_form">
         <div>
           <span class="search_title ml10">入库日期:</span>
           <el-date-picker
             v-model="searchForm.timeStr"
             type="date"
             placeholder="请选择日期"
             value-format="YYYY-MM-DD"
             format="YYYY-MM-DD"
             clearable
             @change="handleQuery"
           />
            <span class="search_title ml10">产品大类:</span>
            <el-input
              v-model="searchForm.productCategory"
              style="width: 240px"
              placeholder="请输入"
              clearable
            />
           <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button>
         </div>
         <div>
           <el-button type="primary" @click="openForm('add', 'purchase')">新增入库</el-button>
           <el-button @click="handleOut">导出</el-button>
           <el-button type="danger" plain @click="handleDelete">删除</el-button>
         </div>
       </div>
       <div class="table_list">
         <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
           :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
           :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
           <el-table-column align="center" type="selection" width="55" />
           <el-table-column align="center" label="序号" type="index" width="60" />
           <el-table-column label="入库时间" prop="createTime" width="100" show-overflow-tooltip />
                <el-table-column label="采购合同号" prop="purchaseContractNumber" width="180" show-overflow-tooltip />
<el-table-column label="供应商名称" prop="supplierName" width="240" show-overflow-tooltip />
           <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip />
           <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip />
           <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip />
                <el-table-column label="入库数量" prop="inboundNum" width="100" show-overflow-tooltip />
                <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" width="150"></el-table-column>
                <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" width="150"></el-table-column>
           <el-table-column label="入库人" prop="createBy" width="80" show-overflow-tooltip />
           <el-table-column fixed="right" label="操作" min-width="60" align="center">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="openForm('edit', scope.row, 'purchase');">编辑</el-button>
             </template>
           </el-table-column>
         </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>
     </el-tab-pane>
    </el-tabs>
    <form-dia ref="formDia" @close="handleQuery" @success="handleQuery"></form-dia>
    <form-dia-product ref="formDiaProduct" @close="handleQuery" @success="handleQuery"></form-dia-product>
    <form-dia ref="formDia"
              @close="handleQuery"
              @success="handleQuery"></form-dia>
    <form-dia-product ref="formDiaProduct"
                      @close="handleQuery"
                      @success="handleQuery"></form-dia-product>
  </div>
</template>
<script setup>
import pagination from '@/components/PIMTable/Pagination.vue'
import { ref, reactive, toRefs, onMounted, getCurrentInstance, nextTick } from 'vue'
import { ElMessageBox } from "element-plus";
import useUserStore from '@/store/modules/user'
import dayjs from 'dayjs'
import {
   getStockInPage,
   getStockInPageByProduction,
   delStockIn,
} from "@/api/inventoryManagement/stockIn.js";
import FormDia from './components/formDia.vue'
import FormDiaProduct from './components/formDiaProduct.vue'
  import pagination from "@/components/PIMTable/Pagination.vue";
  import {
    ref,
    reactive,
    toRefs,
    onMounted,
    getCurrentInstance,
    nextTick,
  } from "vue";
  import { ElMessageBox } from "element-plus";
  import useUserStore from "@/store/modules/user";
  import dayjs from "dayjs";
  import {
    getStockInPage,
    getStockInPageByProduction,
    delStockIn,
  } from "@/api/inventoryManagement/stockIn.js";
  import FormDia from "./components/formDia.vue";
  import FormDiaProduct from "./components/formDiaProduct.vue";
// 获取当前日期
function getCurrentDate() {
  return dayjs().format('YYYY-MM-DD')
}
const { proxy } = getCurrentInstance()
const tableData = ref([])
const selectedRows = ref([])
const tableLoading = ref(false)
const formDia = ref()
const formDiaProduct = ref()
const activeTab = ref('production') // 当前激活的 tab
const page = reactive({
  current: 1,
  size: 100,
})
const total = ref(0)
const data = reactive({
  searchForm: {
    supplierName: '',
    customerName: '',
    productCategory:'',
    timeStr: '',
  },
})
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 params = { ...page }
  // 根据不同的 tab 类型传递不同的查询参数
  if (activeTab.value === 'production') {
    params.customerName = searchForm.value.customerName
    params.timeStr = searchForm.value.timeStr
  } else {
    params.supplierName = searchForm.value.supplierName
    params.timeStr = searchForm.value.timeStr
  // 获取当前日期
  function getCurrentDate() {
    return dayjs().format("YYYY-MM-DD");
  }
  params.productCategory = searchForm.value.productCategory
  // 根据不同的 tab 类型调用不同的接口
  const apiCall = activeTab.value === 'production'
    ? getStockInPageByProduction(params)
    : getStockInPage(params)
  apiCall.then(res => {
    tableLoading.value = false
    tableData.value = res.data.records
    // 前端计算总价:总价 = unitPrice * inboundNum
    tableData.value = tableData.value.map(item => {
      // 使用入库数量计算总价
      const inboundNum = Number(item.inboundNum) || 0
      const unitPrice = Number(item.unitPrice) || 0
      const taxInclusiveUnitPrice = Number(item.taxInclusiveUnitPrice) || 0
      // 根据标签页类型计算不同的总价
      if (activeTab.value === 'production') {
        // 成品库存:总价 = unitPrice * 入库数量
        item.totalPrice = (unitPrice * inboundNum).toFixed(2)
      } else {
        // 原料和材料库存:含税总价 = taxInclusiveUnitPrice * 入库数量
        item.taxInclusiveTotalPrice = (taxInclusiveUnitPrice * inboundNum).toFixed(2)
      }
      return item
    })
    total.value = res.data.total
  }).catch(() => {
    tableLoading.value = false
  })
}
// 切换 tab
const handleTabChange = (tabName) => {
  page.current = 1
  // 切换 tab 时清空搜索条件
  searchForm.value.supplierName = ''
  searchForm.value.customerName = ''
  searchForm.value.timeStr = ''
  searchForm.value.productCategory = ''
  getList()
}
  const { proxy } = getCurrentInstance();
// 打开弹框
const openForm = async (type, row, tabType) => {
  const currentTab = tabType || activeTab.value
  await nextTick(() => {
    if (currentTab === 'production') {
         formDiaProduct.value?.openDialog(type, row)
      }else {
      formDia.value?.openDialog(type, row)
    }
  })
}
  const tableData = ref([]);
  const selectedRows = ref([]);
  const tableLoading = ref(false);
  const formDia = ref();
  const formDiaProduct = ref();
  const activeTab = ref("production"); // 当前激活的 tab
// 表格选择数据
const handleSelectionChange = (selection) => {
  selectedRows.value = selection.filter(item => item.id)
}
  const page = reactive({
    current: 1,
    size: 100,
  });
  const total = ref(0);
const expandedRowKeys = ref([])
  const data = reactive({
    searchForm: {
      supplierName: "",
      customerName: "",
      productCategory: "",
      timeStr: "",
    },
  });
  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 params = { ...page };
// 主表合计方法
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice'])
}
// 导出
const handleOut = () => {
  ElMessageBox.confirm('是否确认导出?', '导出', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning',
  }).then(() => {
    // 根据不同的 tab 类型调用不同的导出接口
    let exportUrl = "/stockin/export"
    if (activeTab.value === 'production') {
      exportUrl = "/stockin/exportOne"
    }
    proxy.download(exportUrl, {}, '入库台账.xlsx')
  }).catch(() => {
    proxy.$modal.msg("已取消")
  })
}
// 删除
const handleDelete = () => {
  if (selectedRows.value.length === 0) {
    proxy.$modal.msgWarning('请选择数据')
    return
  }
  const ids = selectedRows.value.map(item => item.id)
  ElMessageBox.confirm('选中的内容将被删除,是否确认删除?', '删除', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning',
  }).then(() => {
    // 根据当前 tab 类型选择不同的删除接口和type参数
    let deleteApi, deleteParams
    if (activeTab.value === 'production') {
      // 成品删除,type传2
      deleteApi = delStockIn
      deleteParams = { ids, type: 2 }
    // 根据不同的 tab 类型传递不同的查询参数
    if (activeTab.value === "production") {
      params.customerName = searchForm.value.customerName;
      params.timeStr = searchForm.value.timeStr;
    } else {
      // 原料删除,type传1
      deleteApi = delStockIn
      deleteParams = { ids, type: 1 }
      params.supplierName = searchForm.value.supplierName;
      params.timeStr = searchForm.value.timeStr;
    }
    deleteApi(deleteParams).then(() => {
      proxy.$modal.msgSuccess("删除成功")
      getList()
    }).catch(() => {
      proxy.$modal.msgError("删除失败")
    })
  }).catch(() => {
    proxy.$modal.msg("已取消")
  })
}
    params.productCategory = searchForm.value.productCategory;
onMounted(() => {
  getList()
})
    // 根据不同的 tab 类型调用不同的接口
    const apiCall =
      activeTab.value === "production"
        ? getStockInPageByProduction(params)
        : getStockInPage(params);
    apiCall
      .then(res => {
        tableLoading.value = false;
        tableData.value = res.data.records;
        // 前端计算总价:总价 = unitPrice * inboundNum
        tableData.value = tableData.value.map(item => {
          // 使用入库数量计算总价
          const inboundNum = Number(item.inboundNum) || 0;
          const unitPrice = Number(item.unitPrice) || 0;
          const taxInclusiveUnitPrice = Number(item.taxInclusiveUnitPrice) || 0;
          // 根据标签页类型计算不同的总价
          if (activeTab.value === "production") {
            // 成品库存:总价 = unitPrice * 入库数量
            item.totalPrice = (unitPrice * inboundNum).toFixed(2);
          } else {
            // 原料和材料库存:含税总价 = taxInclusiveUnitPrice * 入库数量
            item.taxInclusiveTotalPrice = (
              taxInclusiveUnitPrice * inboundNum
            ).toFixed(2);
          }
          return item;
        });
        total.value = res.data.total;
      })
      .catch(() => {
        tableLoading.value = false;
      });
  };
  // 切换 tab
  const handleTabChange = tabName => {
    page.current = 1;
    // 切换 tab 时清空搜索条件
    searchForm.value.supplierName = "";
    searchForm.value.customerName = "";
    searchForm.value.timeStr = "";
    searchForm.value.productCategory = "";
    getList();
  };
  // 打开弹框
  const openForm = async (type, row, tabType) => {
    const currentTab = tabType || activeTab.value;
    await nextTick(() => {
      if (currentTab === "production") {
        formDiaProduct.value?.openDialog(type, row);
      } else {
        formDia.value?.openDialog(type, row);
      }
    });
  };
  // 表格选择数据
  const handleSelectionChange = selection => {
    selectedRows.value = selection.filter(item => item.id);
  };
  const expandedRowKeys = ref([]);
  // 主表合计方法
  const summarizeMainTable = param => {
    return proxy.summarizeTable(param, [
      "contractAmount",
      "taxInclusiveTotalPrice",
      "taxExclusiveTotalPrice",
    ]);
  };
  // 导出
  const handleOut = () => {
    ElMessageBox.confirm("是否确认导出?", "导出", {
      confirmButtonText: "确认",
      cancelButtonText: "取消",
      type: "warning",
    })
      .then(() => {
        // 根据不同的 tab 类型调用不同的导出接口
        let exportUrl = "/stockin/export";
        if (activeTab.value === "production") {
          exportUrl = "/stockin/exportOne";
        }
        proxy.download(exportUrl, {}, "入库台账.xlsx");
      })
      .catch(() => {
        proxy.$modal.msg("已取消");
      });
  };
  // 删除
  const handleDelete = () => {
    if (selectedRows.value.length === 0) {
      proxy.$modal.msgWarning("请选择数据");
      return;
    }
    const ids = selectedRows.value.map(item => item.id);
    ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除", {
      confirmButtonText: "确认",
      cancelButtonText: "取消",
      type: "warning",
    })
      .then(() => {
        // 根据当前 tab 类型选择不同的删除接口和type参数
        let deleteApi, deleteParams;
        if (activeTab.value === "production") {
          // 成品删除,type传2
          deleteApi = delStockIn;
          deleteParams = { ids, type: 2 };
        } else {
          // 原料删除,type传1
          deleteApi = delStockIn;
          deleteParams = { ids, type: 1 };
        }
        deleteApi(deleteParams)
          .then(() => {
            proxy.$modal.msgSuccess("删除成功");
            getList();
          })
          .catch(() => {
            proxy.$modal.msgError("删除失败");
          });
      })
      .catch(() => {
        proxy.$modal.msg("已取消");
      });
  };
  onMounted(() => {
    getList();
  });
</script>
<style scoped lang="scss"></style>