完善产品属性绑定

pull/744/head
没钱 2025-03-13 12:23:36 +08:00
parent 96e09786f1
commit 1984f0faa6
4 changed files with 79 additions and 82 deletions

View File

@ -223,6 +223,7 @@ export enum DICT_TYPE {
ERP_PRODUCT_PROPERTIES = 'erp_product_properties', // 产品配件属性 ERP_PRODUCT_PROPERTIES = 'erp_product_properties', // 产品配件属性
ERP_PRODUCT_COMMON_PROPERTIES = 'erp_product_common_properties', // 产品普通属性 ERP_PRODUCT_COMMON_PROPERTIES = 'erp_product_common_properties', // 产品普通属性
ERP_PRODUCT_INPUT_PROPERTIES = 'erp_product_input_properties', // 产品输入属性 ERP_PRODUCT_INPUT_PROPERTIES = 'erp_product_input_properties', // 产品输入属性
ERP_PRODUCT_BRAND = 'erp_product_brand', // 产品品牌

View File

@ -1,17 +1,11 @@
<!-- ERP 产品的新增/修改 --> <!-- ERP 产品的新增/修改 -->
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" /> <el-input v-model="formData.name" disabled placeholder="请输入名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -21,37 +15,36 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="分类" prop="categoryId"> <el-form-item label="分类" prop="categoryId">
<el-tree-select <el-tree-select filterable v-model="formData.categoryId" :data="categoryList" :props="defaultProps" check-strictly
v-model="formData.categoryId" default-expand-all placeholder="请选择分类" class="w-1/1" />
:data="categoryList" </el-form-item>
:props="defaultProps" </el-col>
check-strictly <el-col :span="12">
default-expand-all
placeholder="请选择分类" <el-form-item label="产品品牌" prop="brandId">
class="w-1/1" <el-select v-model="formData.brandId" placeholder="请输入产品品牌" filterable clearable class="!w-240px">
/> <el-option v-for="dict in getIntDictOptions(DICT_TYPE.ERP_PRODUCT_BRAND)" :key="dict.value"
:label="dict.label" :value="dict.value" @click="handleBrandModelClick(dict.label)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品型号" prop="model">
<el-input v-model="formData.model" @blur="handleModelBlur" placeholder="请输入产品型号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="单位" prop="unitId"> <el-form-item label="单位" prop="unitId">
<el-select v-model="formData.unitId" clearable placeholder="请选择单位" class="w-1/1"> <el-select v-model="formData.unitId" clearable placeholder="请选择单位" class="w-1/1">
<el-option <el-option v-for="unit in unitList" :key="unit.id" :label="unit.name" :value="unit.id" />
v-for="unit in unitList"
:key="unit.id"
:label="unit.name"
:value="unit.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status"> <el-radio-group v-model="formData.status">
<el-radio <el-radio v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value"
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" :value="dict.value">
:key="dict.value"
:value="dict.value"
>
{{ dict.label }} {{ dict.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
@ -60,11 +53,8 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="一物一码" prop="ifQr"> <el-form-item label="一物一码" prop="ifQr">
<el-radio-group v-model="formData.ifQr"> <el-radio-group v-model="formData.ifQr">
<el-radio <el-radio v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value"
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" :value="dict.value">
:key="dict.value"
:value="dict.value"
>
{{ dict.label }} {{ dict.label }}
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
@ -77,56 +67,31 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="保质期天数" prop="expiryDay"> <el-form-item label="保质期天数" prop="expiryDay">
<el-input-number <el-input-number v-model="formData.expiryDay" placeholder="请输入保质期天数" :min="0" :precision="0"
v-model="formData.expiryDay" class="!w-1/1" />
placeholder="请输入保质期天数"
:min="0"
:precision="0"
class="!w-1/1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="重量kg" prop="weight"> <el-form-item label="重量kg" prop="weight">
<el-input-number <el-input-number v-model="formData.weight" placeholder="请输入重量kg" :min="0" class="!w-1/1" />
v-model="formData.weight"
placeholder="请输入重量kg"
:min="0"
class="!w-1/1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="采购价格" prop="purchasePrice"> <el-form-item label="采购价格" prop="purchasePrice">
<el-input-number <el-input-number v-model="formData.purchasePrice" placeholder="请输入采购价格,单位:元" :min="0" :precision="2"
v-model="formData.purchasePrice" class="!w-1/1" />
placeholder="请输入采购价格,单位:元"
:min="0"
:precision="2"
class="!w-1/1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="销售价格" prop="salePrice"> <el-form-item label="销售价格" prop="salePrice">
<el-input-number <el-input-number v-model="formData.salePrice" placeholder="请输入销售价格,单位:元" :min="0" :precision="2"
v-model="formData.salePrice" class="!w-1/1" />
placeholder="请输入销售价格,单位:元"
:min="0"
:precision="2"
class="!w-1/1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="最低价格" prop="minPrice"> <el-form-item label="最低价格" prop="minPrice">
<el-input-number <el-input-number v-model="formData.minPrice" placeholder="请输入最低价格,单位:元" :min="0" :precision="2"
v-model="formData.minPrice" class="!w-1/1" />
placeholder="请输入最低价格,单位:元"
:min="0"
:precision="2"
class="!w-1/1"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -162,9 +127,11 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
name: undefined, name: '',
barCode: undefined, barCode: undefined,
categoryId: undefined, categoryId: undefined,
brandId: undefined,
model: undefined,
unitId: undefined, unitId: undefined,
status: 0, status: 0,
standard: undefined, standard: undefined,
@ -174,12 +141,14 @@ const formData = ref({
purchasePrice: undefined, purchasePrice: undefined,
salePrice: undefined, salePrice: undefined,
minPrice: undefined, minPrice: undefined,
ifQr:undefined ifQr: undefined
}) })
const formRules = reactive({ const formRules = reactive({
name: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }], name: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
barCode: [{ required: true, message: '产品条码不能为空', trigger: 'blur' }], barCode: [{ required: true, message: '产品条码不能为空', trigger: 'blur' }],
categoryId: [{ required: true, message: '产品分类编号不能为空', trigger: 'blur' }], categoryId: [{ required: true, message: '产品分类编号不能为空', trigger: 'blur' }],
brandId: [{ required: true, message: '产品品牌不能为空', trigger: 'blur' }],
model: [{ required: true, message: '产品型号不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位编号不能为空', trigger: 'blur' }], unitId: [{ required: true, message: '单位编号不能为空', trigger: 'blur' }],
status: [{ required: true, message: '产品状态不能为空', trigger: 'blur' }], status: [{ required: true, message: '产品状态不能为空', trigger: 'blur' }],
ifQr: [{ required: true, message: '一物一码不能为空', trigger: 'blur' }] ifQr: [{ required: true, message: '一物一码不能为空', trigger: 'blur' }]
@ -235,14 +204,32 @@ const submitForm = async () => {
formLoading.value = false formLoading.value = false
} }
} }
let brand = ''
/** 品牌选择后 */
const handleBrandModelClick = (label?:string) => {
if (label) {
brand = label
if (formData.value.model) {
formData.value.name = brand + ' ' + formData.value.model
}
}
}
/** 型号失去焦点后 */
const handleModelBlur = () => {
if (formData.value.model && brand!=='') {
formData.value.name = brand +' ' + formData.value.model
}
}
/** 重置表单 */ /** 重置表单 */
const resetForm = () => { const resetForm = () => {
formData.value = { formData.value = {
id: undefined, id: undefined,
name: undefined, name: '',
barCode: undefined, barCode: undefined,
categoryId: undefined, categoryId: undefined,
brandId: undefined,
model: undefined,
unitId: undefined, unitId: undefined,
status: CommonStatusEnum.ENABLE, status: CommonStatusEnum.ENABLE,
standard: undefined, standard: undefined,
@ -252,7 +239,7 @@ const resetForm = () => {
purchasePrice: undefined, purchasePrice: undefined,
salePrice: undefined, salePrice: undefined,
minPrice: undefined, minPrice: undefined,
ifQr:undefined ifQr: undefined
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

View File

@ -20,6 +20,7 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="分类" prop="categoryId"> <el-form-item label="分类" prop="categoryId">
<el-tree-select <el-tree-select
v-model="queryParams.categoryId" v-model="queryParams.categoryId"
@ -31,6 +32,7 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
@ -58,10 +60,15 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="条码" align="center" prop="barCode" /> <el-table-column label="条码" width="150" align="center" prop="barCode" />
<el-table-column label="名称" align="center" prop="name" /> <el-table-column label="名称" width="300" align="center" prop="name" />
<el-table-column label="规格" align="center" prop="standard" /> <el-table-column label="分类" width="150" align="center" prop="categoryName" />
<el-table-column label="分类" align="center" prop="categoryName" /> <el-table-column label="品牌" width="150" align="center" prop="brandId">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_PRODUCT_BRAND" :value="scope.row.brandId" />
</template>
</el-table-column>
<el-table-column label="型号" width="150" align="center" prop="model" />
<el-table-column label="单位" align="center" prop="unitName" /> <el-table-column label="单位" align="center" prop="unitName" />
<el-table-column <el-table-column
label="采购价格" label="采购价格"
@ -98,7 +105,7 @@
:formatter="dateFormatter" :formatter="dateFormatter"
width="180px" width="180px"
/> />
<el-table-column label="操作" align="center" width="160"> <el-table-column label="操作" align="center" fixed="right" width="160">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
@ -150,7 +157,7 @@ import download from '@/utils/download'
import { ProductApi, ProductVO } from '@/api/erp/product/product' import { ProductApi, ProductVO } from '@/api/erp/product/product'
import { ProductCategoryApi, ProductCategoryVO } from '@/api/erp/product/category' import { ProductCategoryApi, ProductCategoryVO } from '@/api/erp/product/category'
import ProductForm from './ProductForm.vue' import ProductForm from './ProductForm.vue'
import { DICT_TYPE } from '@/utils/dict' import { getIntDictOptions,DICT_TYPE } from '@/utils/dict'
import { defaultProps, handleTree } from '@/utils/tree' import { defaultProps, handleTree } from '@/utils/tree'
import { erpPriceTableColumnFormatter } from '@/utils' import { erpPriceTableColumnFormatter } from '@/utils'
import ProductPropertiesForm from './ProductPropertiesForm.vue' import ProductPropertiesForm from './ProductPropertiesForm.vue'
@ -168,7 +175,9 @@ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
name: undefined, name: undefined,
categoryId: undefined categoryId: undefined,
brandId: undefined,
model: undefined,
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //

View File

@ -67,10 +67,9 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编号" align="center" prop="id" /> <el-table-column label="编号" align="center" prop="id" />
<el-table-column label="产品id" align="center" prop="productId" /> <el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="分类属性" align="center" prop="productCategoryPropertiesId" /> <el-table-column label="分类属性" align="center" prop="productCategoryPropertiesValue" />
<el-table-column label="属性id" align="center" prop="productPropertiesProductId" /> <el-table-column label="属性名称" align="center" prop="productPropertiesName" />
<el-table-column label="分类属性值" align="center" prop="productCategoryPropertiesValue" />
<el-table-column <el-table-column
label="创建时间" label="创建时间"
align="center" align="center"
@ -142,6 +141,7 @@ const queryParams = reactive({
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
const productPropertiesCategory = ref() const productPropertiesCategory = ref()
/** 通过路由获取次产品属性关联的所有的值 */ /** 通过路由获取次产品属性关联的所有的值 */
const getProductPropertiesProductList = async () => { const getProductPropertiesProductList = async () => {
if(route.query.productCategoryPropertiesId){ if(route.query.productCategoryPropertiesId){