张诺
12 小时以前 94605a200eb33add7ed68d36ba96e89d23220b62
feat(产品与库存): 增加辅单位字段并优化检验类别交互

- 在产品管理表单和表格中增加辅单位(subUnit)字段
- 在库存管理的多个页面显示主单位和辅单位列
- 将检验类别从下拉选择改为标签页切换,提升用户体验
- 新增库存时增加仓库编码、仓库名称和存货编码字段
- 统一产品导入模板下载接口名称和路径
已修改7个文件
162 ■■■■ 文件已修改
src/api/basicData/product.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/New.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Qualified.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Unqualified.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/rawMaterialRecord.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/metricBinding/index.vue 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/basicData/product.js
@@ -64,10 +64,11 @@
        params: query
    })
}
// 下载产品导入模板
export function downloadTemplate() {
//  下载产品导入模板
export function downloadProductModelImportTemplate() {
    return request({
        url: '/basic/product/downloadTemplate',
        url: '/basic/product/export',
        method: 'get',
        responseType: 'blob'
    })
src/views/basicData/product/index.vue
@@ -152,10 +152,22 @@
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="单位:" prop="unit">
            <el-form-item label="主单位:" prop="unit">
              <el-input
                v-model="modelForm.unit"
                placeholder="请输入单位"
                placeholder="请输入主单位"
                clearable
                @keydown.enter.prevent
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="辅单位:" prop="subUnit">
              <el-input
                v-model="modelForm.subUnit"
                placeholder="请输入辅单位"
                clearable
                @keydown.enter.prevent
              />
@@ -210,6 +222,10 @@
    prop: "unit",
  },
  {
    label: "辅单位",
    prop: "subUnit",
  },
  {
    dataType: "action",
    label: "操作",
    align: "center",
@@ -246,11 +262,14 @@
  modelForm: {
    model: "",
    unit: "",
    subUnit: "",
  },
  modelRules: {
    model: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请输入主单位", trigger: "blur" }],
    subUnit: [{ required: false, message: "请输入辅单位", trigger: "blur" }],
  },
});
const { form, rules, modelForm, modelRules } = toRefs(data);
// 查询产品树
src/views/inventoryManagement/stockManagement/New.vue
@@ -6,7 +6,7 @@
        width="800"
        @close="closeModal"
    >
      <el-form label-width="140px" :model="formState" label-position="top" ref="formRef">
      <el-form label-width="140px" :model="formState" :rules="rules" label-position="top" ref="formRef">
        <el-form-item
            label="产品名称"
            prop="productModelId"
@@ -31,10 +31,39 @@
        </el-form-item>
        <el-form-item
            label="单位"
            label="单位(主)"
            prop="unit"
        >
          <el-input v-model="formState.unit"  disabled />
        </el-form-item>
        <el-form-item
            label="单位(辅)"
            prop="subUnit"
        >
          <el-input v-model="formState.subUnit"  disabled />
        </el-form-item>
        <el-form-item
            label="仓库编码"
            prop="warehouseCode"
        >
          <el-select v-model="formState.warehouseCode" :options="warehouseCode" placeholder="请选择仓库编码" @change="handleWarehouseSelect">
            <el-option v-for="item in warehouseCode" :key="item.value" :label="item.value" :value="item.value" />
          </el-select>
        </el-form-item>
        <el-form-item
            label="仓库名称"
            prop="warehouseName"
        >
          <el-input v-model="formState.warehouseName"  disabled />
        </el-form-item>
        <el-form-item
            label="存货编码"
            prop="productCode"
        >
          <el-input v-model="formState.productCode"  />
        </el-form-item>
        <el-form-item
@@ -78,6 +107,13 @@
import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
import {createStockInventory} from "@/api/inventoryManagement/stockInventory.js";
import {createStockUnInventory} from "@/api/inventoryManagement/stockUninventory.js";
const { proxy } = getCurrentInstance();
// 获取字典
const { warehouse_code } = proxy.useDict(
  "warehouse_code"
);
const warehouseCode = computed(() => warehouse_code?.value || []);// 控制弹窗显示
const props = defineProps({
  visible: {
@@ -101,9 +137,23 @@
  productName: "",
  productModelName: "",
  unit: "",
  subUnit: "",
  productCode: "",
  warehouseCode: "",
  warehouseName: "",
  qualitity: 0,
  warnNum: 0,
  remark: '',
});
// 表单验证规则
const rules = ref({
  warehouseCode: [
    { required: true, message: '请选择仓库编码', trigger: 'change' },
  ],
  productCode: [
    { required: true, message: '请输入库存数量', trigger: 'blur' },
  ],
});
const isShow = computed({
@@ -117,8 +167,6 @@
const showProductSelectDialog = ref(false);
let { proxy } = getCurrentInstance()
const closeModal = () => {
  // 重置表单数据
  formState.value = {
@@ -126,10 +174,31 @@
    productModelId: undefined,
    productName: "",
    productModelName: "",
    description: '',
    unit: "",
    subUnit: "",
    qualitity: 0,
    productCode: "",
    warehouseCode: "",
    warehouseName: "",
    warnNum: 0,
    remark: '',
  };
  isShow.value = false;
};
// 仓库选择处理
const handleWarehouseSelect = (val) => {
  if (val) {
    console.log(val);
    // 过滤出来warehouseCode
    warehouseCode.value.find(item => {
      if(item.value == val){
        formState.value.warehouseName = item.label;
      }
    })
  }
}
// 产品选择处理
const handleProductSelect = async (products) => {
@@ -140,6 +209,7 @@
    formState.value.productModelName = product.model;
    formState.value.productModelId = product.id;
    formState.value.unit = product.unit;
    formState.value.subUnit = product.subUnit;
    showProductSelectDialog.value = false;
    // 触发表单验证更新
    proxy.$refs["formRef"]?.validateField('productModelId');
src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -27,7 +27,8 @@
        <el-table-column label="仓库" prop="warehouseName" show-overflow-tooltip />
        <el-table-column label="存货编码" prop="productCode" show-overflow-tooltip />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="单位(主单位)" prop="unit" show-overflow-tooltip />
        <el-table-column label="单位(辅单位)" prop="subUnit" show-overflow-tooltip />
        <el-table-column label="库存数量" prop="qualitity" show-overflow-tooltip />
        <el-table-column label="备注" prop="remark"  show-overflow-tooltip />
        <el-table-column label="最近更新时间" prop="updateTime" show-overflow-tooltip />
src/views/inventoryManagement/stockManagement/Unqualified.vue
@@ -27,7 +27,8 @@
        <el-table-column label="仓库" prop="warehouseName" show-overflow-tooltip />
        <el-table-column label="存货编码" prop="productCode" show-overflow-tooltip />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="单位(主单位)" prop="unit" show-overflow-tooltip />
        <el-table-column label="单位(辅单位)" prop="subUnit" show-overflow-tooltip />
        <el-table-column label="库存数量" prop="qualitity" show-overflow-tooltip />
        <el-table-column label="备注" prop="remark"  show-overflow-tooltip />
        <el-table-column label="最近更新时间" prop="updateTime" show-overflow-tooltip />
src/views/inventoryManagement/stockManagement/rawMaterialRecord.vue
@@ -27,7 +27,8 @@
        <el-table-column label="仓库" prop="warehouseName" show-overflow-tooltip />
        <el-table-column label="存货编码" prop="productCode" show-overflow-tooltip />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="单位(主单位)" prop="unit" show-overflow-tooltip />
        <el-table-column label="单位(辅单位)" prop="subUnit" show-overflow-tooltip />
        <el-table-column label="库存数量" prop="qualitity" show-overflow-tooltip />
        <el-table-column label="备注" prop="remark"  show-overflow-tooltip />
        <el-table-column label="最近更新时间" prop="updateTime" show-overflow-tooltip />
src/views/qualityManagement/metricBinding/index.vue
@@ -1,5 +1,10 @@
<template>
  <div class="app-container metric-binding">
    <el-tabs v-model="activeTab" @tab-change="handleTabChange" class="metric-tabs">
      <el-tab-pane label="原材料检验" name="0" />
      <el-tab-pane label="过程检验" name="1" />
      <el-tab-pane label="出厂检验" name="2" />
    </el-tabs>
    <el-row :gutter="16" class="metric-binding-row">
      <!-- 左侧:检测标准列表 -->
      <el-col :xs="24" :sm="24" :md="12" :lg="14" :xl="14" class="left-col">
@@ -42,21 +47,6 @@
            @change="handleQuery"
            @clear="handleQuery"
          />
        </template>
        <template #inspectTypeHeader>
          <el-select
            v-model="searchForm.inspectType"
            placeholder="类别"
            clearable
            size="small"
            style="width: 120px"
            @change="handleQuery"
            @clear="handleQuery"
          >
            <el-option label="原材料检验" value="0" />
            <el-option label="过程检验" value="1" />
            <el-option label="出厂检验" value="2" />
          </el-select>
        </template>
        <template #stateHeader>
          <el-select
@@ -167,6 +157,9 @@
const { proxy } = getCurrentInstance()
// 类别 Tab(0=原材料,1=过程,2=出厂)
const activeTab = ref('0')
// 左侧标准列表:整行内容居中(配合样式)
const rowClassNameCenter = () => 'row-center'
@@ -209,7 +202,6 @@
  {
    label: '类别',
    prop: 'inspectType',
    headerSlot: 'inspectTypeHeader',
    align: 'center',
    dataType: 'tag',
    formatData: (val) => {
@@ -251,6 +243,18 @@
  //   }
  // }
])
const handleTabChange = () => {
  searchForm.value.standardNo = ''
  searchForm.value.standardName = ''
  searchForm.value.state = ''
  searchForm.value.inspectType = activeTab.value
  page.current = 1
  currentStandard.value = null
  bindingTableData.value = []
  bindingSelectedRows.value = []
  getStandardList()
}
const currentStandard = ref(null)
@@ -426,6 +430,7 @@
}
onMounted(() => {
  searchForm.value.inspectType = activeTab.value
  getStandardList()
  getProcessList()
})
@@ -436,6 +441,10 @@
  padding: 0;
}
.metric-tabs {
  margin-bottom: 10px;
}
.metric-binding-row {
  width: 100%;
}