spring
2026-03-17 4b9403d9f405d11342290a02a0c5148d01a033b3
fix: 库存报表页面未做页码分页(仓储物流的入库管理也没有分页)
已修改7个文件
159 ■■■■■ 文件已修改
src/views/basicData/product/ProductSelectDialog.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/consumablesLogistics/stockManagement/New.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/consumablesLogistics/stockManagement/Subtract.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/consumablesLogistics/stockReport/index.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/New.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Subtract.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockReport/index.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/ProductSelectDialog.vue
@@ -2,7 +2,13 @@
  <el-dialog v-model="visible" title="选择产品" width="900px" destroy-on-close :close-on-click-modal="false">
    <el-form :inline="true" :model="query" class="mb-2">
      <el-form-item label="产品大类">
        <el-input v-model="query.productName" placeholder="输入产品大类" clearable @keyup.enter="onSearch" />
        <el-input
          v-model="query.productName"
          placeholder="输入产品大类"
          clearable
          :disabled="Boolean(props.fixedProductName)"
          @keyup.enter="onSearch"
        />
      </el-form-item>
      <el-form-item label="型号名称">
@@ -44,7 +50,7 @@
<script setup lang="ts">
import { computed, onMounted, reactive, ref, watch, nextTick } from "vue";
import { ElMessage } from "element-plus";
import { productModelList } from '@/api/basicData/productModel'
import { productModelList } from "../../../api/basicData/productModel.js";
export type ProductRow = {
  id: number;
@@ -56,6 +62,8 @@
const props = defineProps<{
  modelValue: boolean;
  single?: boolean; // 是否只能选择一个,默认false(可选择多个)
  fixedProductName?: string; // 固定“产品大类”筛选(例如:耗材),传入后不可编辑且重置不清空
  excludeParentNames?: string[]; // 排除“类型”(parentName),例如:['耗材'](仅传入时生效)
}>();
const emit = defineEmits(['update:modelValue', 'confirm']);
@@ -128,7 +136,7 @@
}
function onReset() {
  query.productName = "";
  query.productName = props.fixedProductName ? props.fixedProductName : "";
  query.model = "";
  page.pageNum = 1;
  loadData();
@@ -161,8 +169,13 @@
      current: page.pageNum,
      size: page.pageSize,
    });
    tableData.value = res.records;
    total.value = res.total;
    const records = (res?.records || []) as any[];
    const exclude = (props.excludeParentNames || []).filter(Boolean);
    const filtered = exclude.length
      ? records.filter((r) => !exclude.includes(String(r?.parentName ?? "")))
      : records;
    tableData.value = filtered;
    total.value = exclude.length ? filtered.length : res.total;
  } finally {
    loading.value = false;
  }
@@ -172,6 +185,12 @@
watch(() => props.modelValue, (visible) => {
  if (visible) {
    multipleSelection.value = [];
    // 只有传了 fixedProductName 才启用“固定大类筛选”的特殊逻辑,其它场景保持原行为不变
    if (props.fixedProductName) {
      query.productName = props.fixedProductName;
      page.pageNum = 1;
      loadData();
    }
  }
});
src/views/consumablesLogistics/stockManagement/New.vue
@@ -120,6 +120,7 @@
      <!-- 产品选择弹窗 -->
      <ProductSelectDialog
          v-model="showProductSelectDialog"
          fixedProductName="耗材"
          @confirm="handleProductSelect"
          single
      />
src/views/consumablesLogistics/stockManagement/Subtract.vue
@@ -158,6 +158,11 @@
  return props.record.parentName === '原材料';
})
const ledgerNetWeight = computed(() => {
  const n = Number(props.record?.netWeight ?? 0);
  return Number.isFinite(n) ? n : 0;
});
const initFormData = () => {
  if (props.record) {
    formState.value = {
@@ -221,7 +226,14 @@
  if (grossWeight != null && tareWeight != null) {
    const net = Number(grossWeight) - Number(tareWeight);
    const safeNet = Number(net.toFixed(2));
    formState.value.netWeight = safeNet > 0 ? safeNet : 0;
    const computedNet = safeNet > 0 ? safeNet : 0;
    const maxNet = ledgerNetWeight.value;
    if (Number.isFinite(maxNet) && maxNet > 0 && computedNet > maxNet) {
      formState.value.netWeight = Number(maxNet.toFixed(2));
      proxy?.$modal?.msgWarning?.(`领用净重不能超过台账净重(${maxNet.toFixed(2)} 吨)`);
      return;
    }
    formState.value.netWeight = computedNet;
  } else {
    formState.value.netWeight = undefined;
  }
@@ -255,6 +267,12 @@
        proxy.$modal.msgError("请选择规格");
        return;
      }
      const maxNet = ledgerNetWeight.value;
      const usedNet = Number(formState.value.netWeight ?? 0);
      if (Number.isFinite(maxNet) && maxNet > 0 && Number.isFinite(usedNet) && usedNet > maxNet) {
        proxy.$modal.msgError(`领用净重不能超过台账净重(${maxNet.toFixed(2)} 吨)`);
        return;
      }
      if (props.type === 'qualified') {
        subtractConsumablesIn(formState.value).then(res => {
          // 关闭模态框
src/views/consumablesLogistics/stockReport/index.vue
@@ -235,6 +235,19 @@
             show-overflow-tooltip
           />
        </el-table>
        <div style="margin-top: 12px; display: flex; justify-content: flex-end;">
          <el-pagination
            background
            layout="total, sizes, prev, pager, next, jumper"
            :total="page.total"
            v-model:page-size="page.size"
            v-model:current-page="page.current"
            :page-sizes="[10, 20, 50, 100]"
            @size-change="handlePageChange"
            @current-change="handlePageChange"
          />
        </div>
      </el-card>
    </div>
  </div>
@@ -272,6 +285,16 @@
  tableData: []
})
const page = reactive({
  current: 1,
  size: 10,
  total: 0,
})
const handlePageChange = () => {
  fetchList()
}
const stockRecordTypeOptions = ref([])
const getRecordType = (recordType) => {
@@ -306,7 +329,7 @@
}
// 查询数据
const handleQuery = async () => {
const fetchList = async () => {
  if (!validateSearchForm()) {
    return
  }
@@ -323,6 +346,7 @@
    }
    if (response.code === 200) {
      reportData.value.tableData = response.data.records
      page.total = Number(response.data.total ?? 0) || 0
      // reportData.value.summary = response.data.summary
      // reportData.value.chartData = response.data.chartData
      // nextTick(() => {
@@ -335,6 +359,12 @@
  } finally {
    tableLoading.value = false
  }
}
// 查询数据(按钮触发:回到第一页)
const handleQuery = () => {
  page.current = 1
  fetchList()
}
// // 生成假数据
// const generateMockData = () => {
@@ -396,7 +426,9 @@
    startMonth: "",
    endMonth: "",
    startDate: "",
    endDate: ""
    endDate: "",
    current: page.current,
    size: page.size,
  }
  
  if (searchForm.reportType === 'daily') {
@@ -418,6 +450,9 @@
  searchForm.singleDate = ''
  searchForm.dateRange = []
  searchForm.monthRange = []
  page.current = 1
  page.size = 10
  page.total = 0
  reportData.value = {
    summary: null,
    chartData: null,
src/views/inventoryManagement/stockManagement/New.vue
@@ -37,9 +37,9 @@
          <el-input v-model="formState.unit"  disabled />
        </el-form-item>
        <!-- productType === 1:半成品(允许手动填写数量入库) -->
        <!-- 半成品:允许手动填写数量入库 -->
        <el-form-item
            v-if="type === 'qualified' && formState.productType === 1"
            v-if="type === 'qualified' && (formState.parentName === '半成品' || formState.productType === 1)"
            label="数量"
            prop="qualitity"
            :rules="[
@@ -140,6 +140,7 @@
      <!-- 产品选择弹窗 -->
      <ProductSelectDialog
          v-model="showProductSelectDialog"
          :excludeParentNames="['耗材']"
          @confirm="handleProductSelect"
          single
      />
@@ -182,6 +183,7 @@
  productModelName: "",
  unit: "",
  productType: undefined,
  parentName: "",
  // 库存数量(半成品合格入库可手动填写)
  qualitity: undefined,
  // 过磅相关字段(仅原材料合格品使用)
@@ -216,6 +218,7 @@
    productModelName: "",
    unit: "",
    productType: undefined,
    parentName: "",
    qualitity: undefined,
    licensePlateNo: "",
    grossWeight: undefined,
@@ -243,6 +246,7 @@
    formState.value.productModelId = product.id;
    formState.value.unit = product.unit;
    formState.value.productType = product.productType;
    formState.value.parentName = product.parentName || "";
    showProductSelectDialog.value = false;
    // 触发表单验证更新
    proxy.$refs["formRef"]?.validateField('productModelId');
src/views/inventoryManagement/stockManagement/Subtract.vue
@@ -158,6 +158,11 @@
  return props.record.parentName === '原材料';
})
const ledgerNetWeight = computed(() => {
  const n = Number(props.record?.netWeight ?? 0);
  return Number.isFinite(n) ? n : 0;
});
const initFormData = () => {
  if (props.record) {
    formState.value = {
@@ -221,7 +226,14 @@
  if (grossWeight != null && tareWeight != null) {
    const net = Number(grossWeight) - Number(tareWeight);
    const safeNet = Number(net.toFixed(2));
    formState.value.netWeight = safeNet > 0 ? safeNet : 0;
    const computedNet = safeNet > 0 ? safeNet : 0;
    const maxNet = ledgerNetWeight.value;
    if (Number.isFinite(maxNet) && maxNet > 0 && computedNet > maxNet) {
      formState.value.netWeight = Number(maxNet.toFixed(2));
      proxy?.$modal?.msgWarning?.(`领用净重不能超过台账净重(${maxNet.toFixed(2)} 吨)`);
      return;
    }
    formState.value.netWeight = computedNet;
  } else {
    formState.value.netWeight = undefined;
  }
@@ -255,6 +267,12 @@
        proxy.$modal.msgError("请选择规格");
        return;
      }
      const maxNet = ledgerNetWeight.value;
      const usedNet = Number(formState.value.netWeight ?? 0);
      if (Number.isFinite(maxNet) && maxNet > 0 && Number.isFinite(usedNet) && usedNet > maxNet) {
        proxy.$modal.msgError(`领用净重不能超过台账净重(${maxNet.toFixed(2)} 吨)`);
        return;
      }
      if (props.type === 'qualified') {
        subtractStockInventory(formState.value).then(res => {
          // 关闭模态框
src/views/inventoryManagement/stockReport/index.vue
@@ -235,13 +235,26 @@
             show-overflow-tooltip
           />
        </el-table>
        <div style="margin-top: 12px; display: flex; justify-content: flex-end;">
          <el-pagination
            background
            layout="total, sizes, prev, pager, next, jumper"
            :total="page.total"
            v-model:page-size="page.size"
            v-model:current-page="page.current"
            :page-sizes="[10, 20, 50, 100]"
            @size-change="handlePageChange"
            @current-change="handlePageChange"
          />
        </div>
      </el-card>
    </div>
  </div>
</template>
<script setup>
import { ref, reactive, onMounted, nextTick } from 'vue'
import { ref, reactive, onMounted, nextTick, getCurrentInstance } from 'vue'
import { ElMessage } from 'element-plus'
import * as echarts from 'echarts'
import {
@@ -271,6 +284,16 @@
  chartData: null,
  tableData: []
})
const page = reactive({
  current: 1,
  size: 10,
  total: 0,
})
const handlePageChange = () => {
  fetchList()
}
const stockRecordTypeOptions = ref([])
@@ -305,8 +328,7 @@
  }
}
// 查询数据
const handleQuery = async () => {
const fetchList = async () => {
  if (!validateSearchForm()) {
    return
  }
@@ -323,6 +345,7 @@
    }
    if (response.code === 200) {
      reportData.value.tableData = response.data.records
      page.total = Number(response.data.total ?? 0) || 0
      // reportData.value.summary = response.data.summary
      // reportData.value.chartData = response.data.chartData
      // nextTick(() => {
@@ -335,6 +358,12 @@
  } finally {
    tableLoading.value = false
  }
}
// 查询数据(按钮触发:回到第一页)
const handleQuery = () => {
  page.current = 1
  fetchList()
}
// // 生成假数据
// const generateMockData = () => {
@@ -396,7 +425,9 @@
    startMonth: "",
    endMonth: "",
    startDate: "",
    endDate: ""
    endDate: "",
    current: page.current,
    size: page.size,
  }
  
  if (searchForm.reportType === 'daily') {
@@ -418,6 +449,9 @@
  searchForm.singleDate = ''
  searchForm.dateRange = []
  searchForm.monthRange = []
  page.current = 1
  page.size = 10
  page.total = 0
  reportData.value = {
    summary: null,
    chartData: null,