feat(产品与库存): 增加辅单位字段并优化检验类别交互
- 在产品管理表单和表格中增加辅单位(subUnit)字段
- 在库存管理的多个页面显示主单位和辅单位列
- 将检验类别从下拉选择改为标签页切换,提升用户体验
- 新增库存时增加仓库编码、仓库名称和存货编码字段
- 统一产品导入模板下载接口名称和路径
| | |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 下载产品导入模板 |
| | | export function downloadTemplate() { |
| | | export function downloadProductModelImportTemplate() { |
| | | return request({ |
| | | url: '/basic/product/downloadTemplate', |
| | | url: '/basic/product/export', |
| | | method: 'get', |
| | | responseType: 'blob' |
| | | }) |
| | |
| | | </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 |
| | | /> |
| | |
| | | prop: "unit", |
| | | }, |
| | | { |
| | | label: "辅单位", |
| | | prop: "subUnit", |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "操作", |
| | | align: "center", |
| | |
| | | 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); |
| | | // 查询产品树 |
| | |
| | | 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" |
| | |
| | | </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 |
| | |
| | | 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: { |
| | |
| | | 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({ |
| | |
| | | |
| | | const showProductSelectDialog = ref(false); |
| | | |
| | | let { proxy } = getCurrentInstance() |
| | | |
| | | const closeModal = () => { |
| | | // 重置表单数据 |
| | | formState.value = { |
| | |
| | | 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) => { |
| | |
| | | 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'); |
| | |
| | | <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 /> |
| | |
| | | <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 /> |
| | |
| | | <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 /> |
| | |
| | | <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"> |
| | |
| | | @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 |
| | |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | | // 类别 Tab(0=原材料,1=过程,2=出厂) |
| | | const activeTab = ref('0') |
| | | |
| | | // 左侧标准列表:整行内容居中(配合样式) |
| | | const rowClassNameCenter = () => 'row-center' |
| | | |
| | |
| | | { |
| | | label: '类别', |
| | | prop: 'inspectType', |
| | | headerSlot: 'inspectTypeHeader', |
| | | align: 'center', |
| | | dataType: 'tag', |
| | | formatData: (val) => { |
| | |
| | | // } |
| | | // } |
| | | ]) |
| | | |
| | | 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) |
| | | |
| | |
| | | } |
| | | |
| | | onMounted(() => { |
| | | searchForm.value.inspectType = activeTab.value |
| | | getStandardList() |
| | | getProcessList() |
| | | }) |
| | |
| | | padding: 0; |
| | | } |
| | | |
| | | .metric-tabs { |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .metric-binding-row { |
| | | width: 100%; |
| | | } |