zhangwencui
5 天以前 6864dad67ceac948d561f2db770a39cfa3518773
新增批号展示
已修改1个文件
483 ■■■■ 文件已修改
src/views/inventoryManagement/stockReport/index.vue 483 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockReport/index.vue
@@ -4,29 +4,26 @@
    <div class="search_form">
      <div class="search_left">
        <span class="search_title">报表类型:</span>
        <el-select
          v-model="searchForm.reportType"
        <el-select v-model="searchForm.reportType"
          style="width: 150px;"
          placeholder="请选择"
          @change="handleReportTypeChange"
        >
          <el-option label="日报" value="daily" />
          <el-option label="月报" value="monthly" />
          <el-option label="进出存报表" value="inout" />
                   @change="handleReportTypeChange">
          <el-option label="日报"
                     value="daily" />
          <el-option label="月报"
                     value="monthly" />
          <el-option label="进出存报表"
                     value="inout" />
        </el-select>
        <span class="search_title ml10">时间范围:</span>
         <el-date-picker
           v-if="searchForm.reportType === 'daily'"
        <el-date-picker v-if="searchForm.reportType === 'daily'"
           v-model="searchForm.singleDate"
           type="date"
           placeholder="请选择日期"
           format="YYYY-MM-DD"
           value-format="YYYY-MM-DD"
           style="width: 200px;"
         />
        <el-date-picker
          v-else-if="searchForm.reportType === 'monthly'"
                        style="width: 200px;" />
        <el-date-picker v-else-if="searchForm.reportType === 'monthly'"
          v-model="searchForm.monthRange"
          type="monthrange"
          range-separator="至"
@@ -34,10 +31,8 @@
          end-placeholder="结束月份"
          format="YYYY-MM-DD"
          value-format="YYYY-MM-DD"
          style="width: 240px;"
        />
        <el-date-picker
          v-else
                        style="width: 240px;" />
        <el-date-picker v-else
          v-model="searchForm.dateRange"
          type="daterange"
          range-separator="至"
@@ -45,22 +40,20 @@
          end-placeholder="结束日期"
          format="YYYY-MM-DD"
          value-format="YYYY-MM-DD"
          style="width: 240px;"
        />
        <el-button type="primary" @click="onSearch" style="margin-left: 10px">
                        style="width: 240px;" />
        <el-button type="primary"
                   @click="onSearch"
                   style="margin-left: 10px">
          查询
        </el-button>
        <el-button @click="handleReset">重置</el-button>
      </div>
      <div class="search_right">
<!--        <el-button type="success" @click="handleExport" icon="Download">-->
<!--          导出报表-->
<!--        </el-button>-->
      </div>
    </div>
<!--    &lt;!&ndash; 统计卡片 &ndash;&gt;-->
<!--    <div class="stats_cards" v-if="reportData.summary">-->
<!--      <el-row :gutter="20">-->
@@ -118,7 +111,6 @@
<!--        </el-col>-->
<!--      </el-row>-->
<!--    </div>-->
<!--    &lt;!&ndash; 图表区域 &ndash;&gt;-->
<!--    <div class="chart_section" v-if="reportData.chartData">-->
<!--      <el-row :gutter="20">-->
@@ -140,80 +132,62 @@
<!--        </el-col>-->
<!--      </el-row>-->
<!--    </div>-->
    <!-- 详细数据表格 -->
    <div class="table_section">
      <el-card>
        <template #header>
          <span>{{ getTableTitle() }}</span>
        </template>
         <el-table
           v-loading="tableLoading"
        <el-table v-loading="tableLoading"
           :data="reportData.tableData"
           border
           height="400"
           style="width: 100%"
           :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
         >
          <el-table-column
            align="center"
                  :header-cell-style="{ background: '#F0F1F5', color: '#333333' }">
          <el-table-column align="center"
            label="序号"
            type="index"
            width="60"
          />
           <el-table-column
             label="入库时间"
                           width="60" />
          <el-table-column label="入库时间"
             prop="createTime"
             width="200"
             show-overflow-tooltip
             v-if="searchForm.reportType !== 'inout'"
           />
           <el-table-column
             label="入库批次"
                           v-if="searchForm.reportType !== 'inout'" />
          <el-table-column label="入库批次"
             prop="inboundBatches"
             width="240"
                           width="180"
             show-overflow-tooltip
             v-if="searchForm.reportType !== 'inout'"
           />
           <el-table-column
             label="产品大类"
                           v-if="searchForm.reportType !== 'inout'" />
          <el-table-column label="批号"
                           prop="batchNo"
                           width="180"
                           show-overflow-tooltip
                           v-if="searchForm.reportType !== 'inout'" />
          <el-table-column label="产品大类"
             prop="productName"
             show-overflow-tooltip
           />
           <el-table-column
             label="规格型号"
                           show-overflow-tooltip />
          <el-table-column label="规格型号"
             prop="model"
             show-overflow-tooltip
           />
           <el-table-column
             label="单位"
                           show-overflow-tooltip />
          <el-table-column label="单位"
             prop="unit"
             show-overflow-tooltip
           />
           <el-table-column
             label="入库数量"
                           show-overflow-tooltip />
          <el-table-column label="入库数量"
             prop="totalStockIn"
             align="center"
             v-if="searchForm.reportType === 'inout'"
           />
           <el-table-column
               label="入库数量"
                           v-if="searchForm.reportType === 'inout'" />
          <el-table-column label="入库数量"
               prop="stockInNum"
               align="center"
               v-else
           />
           <el-table-column
             label="出库数量"
                           v-else />
          <el-table-column label="出库数量"
             prop="totalStockOut"
             width="100"
             align="center"
             v-if="searchForm.reportType === 'inout'"
           />
           <el-table-column
             label="现在库存"
                           v-if="searchForm.reportType === 'inout'" />
          <el-table-column label="现在库存"
             prop="currentStock"
             align="center"
           />
                           align="center" />
           <el-table-column label="来源"
                            prop="recordType"
                            v-if="searchForm.reportType !== 'inout'"
@@ -222,154 +196,153 @@
               {{ getRecordType(scope.row.recordType) }}
             </template>
           </el-table-column>
           <el-table-column
             label="入库人"
          <el-table-column label="入库人"
             prop="createBy"
             width="80"
             v-if="searchForm.reportType !== 'inout'"
             show-overflow-tooltip
           />
                           show-overflow-tooltip />
        </el-table>
        <pagination
          :total="total"
        <pagination :total="total"
          layout="total, sizes, prev, pager, next, jumper"
          :page="page.current"
          :limit="page.size"
          @pagination="paginationChange"
        />
                    @pagination="paginationChange" />
      </el-card>
    </div>
  </div>
</template>
<script setup>
import { ref, reactive, onMounted, nextTick, getCurrentInstance } from 'vue'
import { ElMessage } from 'element-plus'
import * as echarts from 'echarts'
import pagination from '@/components/PIMTable/Pagination.vue'
  import { ref, reactive, onMounted, nextTick, getCurrentInstance } from "vue";
  import { ElMessage } from "element-plus";
  import * as echarts from "echarts";
  import pagination from "@/components/PIMTable/Pagination.vue";
import {
  getStockInventoryInAndOutReportList,
  getStockInventoryReportList
    getStockInventoryReportList,
} from "@/api/inventoryManagement/stockInventory.js";
import {
  findAllQualifiedStockInRecordTypeOptions,findAllUnQualifiedStockInRecordTypeOptions,
    findAllQualifiedStockInRecordTypeOptions,
    findAllUnQualifiedStockInRecordTypeOptions,
} from "@/api/basicData/enum.js";
const { proxy } = getCurrentInstance()
  const { proxy } = getCurrentInstance();
// 响应式数据
const tableLoading = ref(false)
const trendChart = ref(null)
const comparisonChart = ref(null)
  const tableLoading = ref(false);
  const trendChart = ref(null);
  const comparisonChart = ref(null);
const searchForm = reactive({
  reportType: 'daily',
  singleDate: '',
    reportType: "daily",
    singleDate: "",
  dateRange: [],
  monthRange: []
})
    monthRange: [],
  });
const reportData = ref({
  summary: null,
  chartData: null,
  tableData: []
})
    tableData: [],
  });
const page = reactive({
  current: 1,
  size: 10,
})
  });
const total = ref(0)
  const total = ref(0);
const stockRecordTypeOptions = ref([])
  const stockRecordTypeOptions = ref([]);
const getRecordType = (recordType) => {
  return stockRecordTypeOptions.value.find(item => item.value === recordType)?.label || ''
}
  const getRecordType = recordType => {
    return (
      stockRecordTypeOptions.value.find(item => item.value === recordType)
        ?.label || ""
    );
  };
// 获取来源类型选项
const fetchStockRecordTypeOptions = () => {
  findAllQualifiedStockInRecordTypeOptions()
      .then(res => {
    findAllQualifiedStockInRecordTypeOptions().then(res => {
        stockRecordTypeOptions.value = res.data;
        findAllUnQualifiedStockInRecordTypeOptions()
          .then(res => {
          stockRecordTypeOptions.value = [...stockRecordTypeOptions.value,...res.data];
      })
      })
}
      findAllUnQualifiedStockInRecordTypeOptions().then(res => {
        stockRecordTypeOptions.value = [
          ...stockRecordTypeOptions.value,
          ...res.data,
        ];
      });
    });
  };
// 获取表格标题
const getTableTitle = () => {
  const typeMap = {
    daily: '日报详细数据',
    monthly: '月报详细数据',
    inout: '进出存报表详细数据'
  }
  return typeMap[searchForm.reportType] || '报表详细数据'
}
      daily: "日报详细数据",
      monthly: "月报详细数据",
      inout: "进出存报表详细数据",
    };
    return typeMap[searchForm.reportType] || "报表详细数据";
  };
// 报表类型改变
const handleReportTypeChange = () => {
  page.current = 1
    page.current = 1;
  reportData.value = {
    summary: null,
    chartData: null,
    tableData: []
  }
}
      tableData: [],
    };
  };
// 查询数据
const handleQuery = async () => {
  if (!validateSearchForm()) {
    return
      return;
  }
  
  tableLoading.value = true
    tableLoading.value = true;
  try {
    const baseParams = getQueryParams()
      const baseParams = getQueryParams();
    const params = {
      ...baseParams,
      current: page.current,
      size: page.size,
    }
    let response
      };
      let response;
    if (searchForm.reportType === 'inout') {
      response = await getStockInventoryInAndOutReportList(params)
      if (searchForm.reportType === "inout") {
        response = await getStockInventoryInAndOutReportList(params);
    } else {
      response = await getStockInventoryReportList(params)
        response = await getStockInventoryReportList(params);
    }
    if (response.code === 200) {
      reportData.value.tableData = response.data.records || []
      total.value = response.data.total || 0
        reportData.value.tableData = response.data.records || [];
        total.value = response.data.total || 0;
      // reportData.value.summary = response.data.summary
      // reportData.value.chartData = response.data.chartData
      // nextTick(() => {
      //   initCharts()
      // })
    }
  } catch (error) {
    ElMessage.error('查询失败:' + error.message)
      ElMessage.error("查询失败:" + error.message);
  } finally {
    tableLoading.value = false
      tableLoading.value = false;
  }
}
  };
// 查询按钮:重置到第一页并查询
const onSearch = () => {
  page.current = 1
  handleQuery()
}
    page.current = 1;
    handleQuery();
  };
// 分页变化
const paginationChange = (obj) => {
  page.current = obj.page
  page.size = obj.limit
  handleQuery()
}
  const paginationChange = obj => {
    page.current = obj.page;
    page.size = obj.limit;
    handleQuery();
  };
// // 生成假数据
// const generateMockData = () => {
//   // 生成统计卡片假数据
@@ -403,24 +376,24 @@
// }
// 验证搜索表单
const validateSearchForm = () => {
  if (searchForm.reportType === 'daily') {
    if (searchForm.reportType === "daily") {
    if (!searchForm.singleDate) {
      ElMessage.warning('请选择日期')
      return false
        ElMessage.warning("请选择日期");
        return false;
    }
  } else if (searchForm.reportType === 'inout') {
    } else if (searchForm.reportType === "inout") {
    if (!searchForm.dateRange || searchForm.dateRange.length !== 2) {
      ElMessage.warning('请选择日期范围')
      return false
        ElMessage.warning("请选择日期范围");
        return false;
    }
  } else if (searchForm.reportType === 'monthly') {
    } else if (searchForm.reportType === "monthly") {
    if (!searchForm.monthRange || searchForm.monthRange.length !== 2) {
      ElMessage.warning('请选择月份范围')
      return false
        ElMessage.warning("请选择月份范围");
        return false;
    }
  }
  return true
}
    return true;
  };
// 获取查询参数
const getQueryParams = () => {
@@ -430,45 +403,45 @@
    startMonth: "",
    endMonth: "",
    startDate: "",
    endDate: ""
  }
      endDate: "",
    };
  
  if (searchForm.reportType === 'daily') {
    params.reportDate = searchForm.singleDate
  } else if (searchForm.reportType === 'monthly') {
    params.startMonth = searchForm.monthRange[0]
    params.endMonth = searchForm.monthRange[1]
    if (searchForm.reportType === "daily") {
      params.reportDate = searchForm.singleDate;
    } else if (searchForm.reportType === "monthly") {
      params.startMonth = searchForm.monthRange[0];
      params.endMonth = searchForm.monthRange[1];
  } else {
    params.startDate = searchForm.dateRange[0]
    params.endDate = searchForm.dateRange[1]
      params.startDate = searchForm.dateRange[0];
      params.endDate = searchForm.dateRange[1];
  }
  
  return params
}
    return params;
  };
// 重置搜索
const handleReset = () => {
  searchForm.reportType = 'daily'
  searchForm.singleDate = ''
  searchForm.dateRange = []
  searchForm.monthRange = []
    searchForm.reportType = "daily";
    searchForm.singleDate = "";
    searchForm.dateRange = [];
    searchForm.monthRange = [];
  reportData.value = {
    summary: null,
    chartData: null,
    tableData: []
  }
}
      tableData: [],
    };
  };
// 导出报表
const handleExport = async () => {
  if (!validateSearchForm()) {
    return
      return;
  }
  
  try {
    const params = getQueryParams()
      const params = getQueryParams();
    // const response = await exportStockReport(params)
    proxy.download("/stockin/exportCopy", params, '库存报表.xlsx')
      proxy.download("/stockin/exportCopy", params, "库存报表.xlsx");
    // 创建下载链接
    // const blob = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
    // const url = window.URL.createObjectURL(blob)
@@ -482,116 +455,118 @@
    
    // ElMessage.success('导出成功')
  } catch (error) {
    ElMessage.error('导出失败:' + error.message)
      ElMessage.error("导出失败:" + error.message);
  }
}
  };
// 初始化图表
const initCharts = () => {
  if (!reportData.value.chartData) return
    if (!reportData.value.chartData) return;
  
  initTrendChart()
  initComparisonChart()
}
    initTrendChart();
    initComparisonChart();
  };
// 初始化趋势图
const initTrendChart = () => {
  if (!trendChart.value) return
    if (!trendChart.value) return;
  
  const chart = echarts.init(trendChart.value)
    const chart = echarts.init(trendChart.value);
  const option = {
    title: {
      text: '库存变化趋势',
      left: 'center'
        text: "库存变化趋势",
        left: "center",
    },
    tooltip: {
      trigger: 'axis'
        trigger: "axis",
    },
    legend: {
      data: ['库存量'],
      top: 30
        data: ["库存量"],
        top: 30,
    },
    xAxis: {
      type: 'category',
      data: reportData.value.chartData.trendDates || []
        type: "category",
        data: reportData.value.chartData.trendDates || [],
    },
    yAxis: {
      type: 'value'
    },
    series: [{
      name: '库存量',
      type: 'line',
      data: reportData.value.chartData.trendValues || [],
      smooth: true,
      itemStyle: {
        color: '#409EFF'
      }
    }]
  }
  chart.setOption(option)
}
// 初始化对比图
const initComparisonChart = () => {
  if (!comparisonChart.value) return
  const chart = echarts.init(comparisonChart.value)
  const option = {
    title: {
      text: '进出库对比',
      left: 'center'
    },
    tooltip: {
      trigger: 'axis'
    },
    legend: {
      data: ['入库', '出库'],
      top: 30
    },
    xAxis: {
      type: 'category',
      data: reportData.value.chartData.comparisonDates || []
    },
    yAxis: {
      type: 'value'
        type: "value",
    },
    series: [
      {
        name: '入库',
        type: 'bar',
          name: "库存量",
          type: "line",
          data: reportData.value.chartData.trendValues || [],
          smooth: true,
          itemStyle: {
            color: "#409EFF",
          },
        },
      ],
    };
    chart.setOption(option);
  };
  // 初始化对比图
  const initComparisonChart = () => {
    if (!comparisonChart.value) return;
    const chart = echarts.init(comparisonChart.value);
    const option = {
      title: {
        text: "进出库对比",
        left: "center",
      },
      tooltip: {
        trigger: "axis",
      },
      legend: {
        data: ["入库", "出库"],
        top: 30,
      },
      xAxis: {
        type: "category",
        data: reportData.value.chartData.comparisonDates || [],
      },
      yAxis: {
        type: "value",
      },
      series: [
        {
          name: "入库",
          type: "bar",
        data: reportData.value.chartData.inValues || [],
        itemStyle: {
          color: '#67C23A'
        }
            color: "#67C23A",
          },
      },
      {
        name: '出库',
        type: 'bar',
          name: "出库",
          type: "bar",
        data: reportData.value.chartData.outValues || [],
        itemStyle: {
          color: '#F56C6C'
        }
      }
    ]
  }
  chart.setOption(option)
}
            color: "#F56C6C",
          },
        },
      ],
    };
    chart.setOption(option);
  };
// 组件挂载时设置默认时间
onMounted(() => {
  const today = new Date()
  searchForm.singleDate = today.toISOString().split('T')[0]
    const today = new Date();
    searchForm.singleDate = today.toISOString().split("T")[0];
  
  const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000)
    const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
  searchForm.dateRange = [
    yesterday.toISOString().split('T')[0],
    today.toISOString().split('T')[0]
  ]
      yesterday.toISOString().split("T")[0],
      today.toISOString().split("T")[0],
    ];
  fetchStockRecordTypeOptions()
    fetchStockRecordTypeOptions();
  // 初始化加载一次数据
  handleQuery()
})
    handleQuery();
  });
</script>
<style scoped>
@@ -653,19 +628,19 @@
}
.stats_icon.in {
  background: linear-gradient(135deg, #67C23A, #85CE61);
    background: linear-gradient(135deg, #67c23a, #85ce61);
}
.stats_icon.out {
  background: linear-gradient(135deg, #F56C6C, #F78989);
    background: linear-gradient(135deg, #f56c6c, #f78989);
}
.stats_icon.stock {
  background: linear-gradient(135deg, #409EFF, #66B1FF);
    background: linear-gradient(135deg, #409eff, #66b1ff);
}
.stats_icon.turnover {
  background: linear-gradient(135deg, #E6A23C, #EEBE77);
    background: linear-gradient(135deg, #e6a23c, #eebe77);
}
.stats_info {
@@ -700,7 +675,7 @@
}
:deep(.el-table .el-table__header-wrapper th) {
  background-color: #F0F1F5 !important;
    background-color: #f0f1f5 !important;
  color: #333333;
  font-weight: 600;
}