|
|
@@ -12,19 +12,23 @@ import {
|
|
|
ElFormItem,
|
|
|
ElInputTag,
|
|
|
ElMessage,
|
|
|
- ElMessageBox
|
|
|
+ ElMessageBox,
|
|
|
+ ElSelect,
|
|
|
+ ElOption
|
|
|
} from 'element-plus'
|
|
|
import { Editor, EditorExpose } from '@/components/Editor'
|
|
|
-// import { IDomEditor } from '@wangeditor/editor'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
import { goodsData, attrsValue } from '@/api/goods/types'
|
|
|
import { getProductCategory, addProduct, getProductDetail, putProduct } from '@/api/goods'
|
|
|
import { UpImgButtom } from '@/components/UpFile'
|
|
|
+import { getStoreList } from '@/api/store'
|
|
|
+import { isArray } from 'lodash-es'
|
|
|
const pageTitle = ref('添加')
|
|
|
const { params } = useRoute()
|
|
|
const { push } = useRouter()
|
|
|
const actinoTabIndex = ref(1)
|
|
|
const formData = reactive<goodsData & { attrs_value: attrsValue[]; keyword: string[] }>({
|
|
|
+ store_id: '',
|
|
|
id: 0,
|
|
|
name: '',
|
|
|
video_open: 0,
|
|
|
@@ -58,52 +62,6 @@ const attrs_value = reactive<
|
|
|
ot_price: 0,
|
|
|
cost: 0
|
|
|
})
|
|
|
-
|
|
|
-const loadingData = ref(false)
|
|
|
-onMounted(async () => {
|
|
|
- if (params.type == 'add') {
|
|
|
- pageTitle.value = '添加商品'
|
|
|
- } else if (params.type == 'edit') {
|
|
|
- pageTitle.value = '编辑商品'
|
|
|
- try {
|
|
|
- const res = await getProductDetail(params.id)
|
|
|
- const data = res.data.storeInfo
|
|
|
- // console.log(data.cate_ids, 'res')
|
|
|
- formData.id = data.id
|
|
|
- formData.name = data.name
|
|
|
- formData.video_open = data.video_open
|
|
|
- formData.video_link = data.video_link
|
|
|
- formData.slider_image = data.slider_image
|
|
|
- formData.image = data.image
|
|
|
- formData.keyword = data.keyword.split(',')
|
|
|
- formData.cate_ids = data.cate_ids.map((re) => parseInt(re))
|
|
|
- formData.postage = data.postage
|
|
|
- formData.temp_id = data.temp_id
|
|
|
- formData.unit_name = data.unit_name
|
|
|
- formData.sales = data.sales
|
|
|
- formData.ficti = data.ficti
|
|
|
- formData.spec_type = data.spec_type
|
|
|
- formData.is_show = data.is_show
|
|
|
- formData.attrs = data.attrs
|
|
|
- formData.attrs_value = res.data.productValue.map((e) => e)
|
|
|
- formData.sort = data.sort
|
|
|
- formData.description = data.description
|
|
|
- // 判断是否单规格
|
|
|
- if (formData.spec_type == 0) {
|
|
|
- const values = res.data.productValue[0]
|
|
|
- // console.log(values, 'values')
|
|
|
- attrs_value.cost = values.cost
|
|
|
- attrs_value.price = values.price
|
|
|
- attrs_value.ot_price = values.ot_price
|
|
|
- attrs_value.stock = values.stock
|
|
|
- attrs_value.suk = values.suk
|
|
|
- attrs_value.image = [values.image]
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.log(error, 'error')
|
|
|
- }
|
|
|
- }
|
|
|
-})
|
|
|
const validateField = (field, errorMessage) => {
|
|
|
return {
|
|
|
message: errorMessage,
|
|
|
@@ -135,9 +93,10 @@ const getRulesForSpecType = (specType) => {
|
|
|
}
|
|
|
|
|
|
const rules = reactive({
|
|
|
+ store_id: [{ required: true, message: '请选择门店', trigger: 'change' }],
|
|
|
cate_ids: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
|
|
|
unit_name: [{ required: true, message: '请填写商品单位', trigger: 'change' }],
|
|
|
- name: [{ required: true, message: '请输入活动名称', trigger: 'blur' }],
|
|
|
+ name: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
|
|
|
image: [{ required: true, message: '请选择商品主图', trigger: 'change' }],
|
|
|
slider_image: [
|
|
|
{
|
|
|
@@ -145,7 +104,7 @@ const rules = reactive({
|
|
|
trigger: 'change',
|
|
|
required: true,
|
|
|
validator: (_, val, callback) => {
|
|
|
- // console.log(val, formData.slider_image, 'val')
|
|
|
+ console.log(val, formData.slider_image, 'val')
|
|
|
if (!val || val.length === 0) {
|
|
|
callback(new Error('请选择轮播图片'))
|
|
|
} else {
|
|
|
@@ -159,8 +118,8 @@ const rules = reactive({
|
|
|
const formRef = ref<FormInstance>()
|
|
|
|
|
|
const cateIdsProps = {
|
|
|
- // checkStrictly: true,
|
|
|
- emitPath: false,
|
|
|
+ checkStrictly: false,
|
|
|
+ // emitPath: false,
|
|
|
multiple: true,
|
|
|
lazy: true,
|
|
|
lazyLoad: (node, resolve) => {
|
|
|
@@ -183,14 +142,24 @@ const cateIdsProps = {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// const changeHtml = (editor: IDomEditor) => {
|
|
|
-// console.log(formData.description)
|
|
|
-// }
|
|
|
-
|
|
|
const editorRef = ref<typeof Editor & EditorExpose>()
|
|
|
+const flattenCateIds = (items: (number | number[])[]): Set<number> => {
|
|
|
+ const result = new Set<number>()
|
|
|
+
|
|
|
+ const flatten = (item: number | number[]) => {
|
|
|
+ if (isArray(item)) {
|
|
|
+ item.forEach(flatten)
|
|
|
+ } else {
|
|
|
+ result.add(item)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ items.forEach(flatten)
|
|
|
|
|
|
+ return result
|
|
|
+}
|
|
|
const save = async (formEl: FormInstance | undefined) => {
|
|
|
- if (!formEl) return
|
|
|
+ if (!formEl) return []
|
|
|
const valid = await formEl.validate((valid, fields) => {
|
|
|
if (valid) {
|
|
|
console.log('submit!')
|
|
|
@@ -200,12 +169,15 @@ const save = async (formEl: FormInstance | undefined) => {
|
|
|
ElMessage.error(fields[key][0].message)
|
|
|
return
|
|
|
}
|
|
|
- // console.log('error submit!', fields)
|
|
|
+ console.log('error submit!', fields)
|
|
|
}
|
|
|
})
|
|
|
// console.log(valid, 'params')
|
|
|
if (valid) {
|
|
|
+ const cateIds: number[] = Array.from(flattenCateIds(formData.cate_ids)).map((re) => re)
|
|
|
+ console.log(cateIds, 'cateIds')
|
|
|
const data: goodsData = {
|
|
|
+ store_id: formData.store_id,
|
|
|
name: formData.name,
|
|
|
video_open: formData.video_open,
|
|
|
video_link: formData.video_link,
|
|
|
@@ -213,7 +185,7 @@ const save = async (formEl: FormInstance | undefined) => {
|
|
|
info: formData.info,
|
|
|
image: formData.image,
|
|
|
keyword: formData.keyword,
|
|
|
- cate_ids: formData.cate_ids,
|
|
|
+ cate_ids: cateIds,
|
|
|
postage: formData.postage,
|
|
|
temp_id: formData.temp_id,
|
|
|
unit_name: formData.unit_name,
|
|
|
@@ -222,7 +194,7 @@ const save = async (formEl: FormInstance | undefined) => {
|
|
|
spec_type: formData.spec_type,
|
|
|
attrs: formData.attrs,
|
|
|
attrs_value: formData.attrs_value,
|
|
|
- description: formData.name,
|
|
|
+ description: formData.description,
|
|
|
sort: formData.sort,
|
|
|
is_show: formData.is_show
|
|
|
}
|
|
|
@@ -231,7 +203,7 @@ const save = async (formEl: FormInstance | undefined) => {
|
|
|
}
|
|
|
try {
|
|
|
let res = {}
|
|
|
- // console.log(params.type == 'add', '11111')
|
|
|
+ console.log(params.type == 'add', '11111')
|
|
|
if (params.type == 'add') {
|
|
|
res = await addProduct(data)
|
|
|
} else if (params.type == 'edit') {
|
|
|
@@ -244,7 +216,7 @@ const save = async (formEl: FormInstance | undefined) => {
|
|
|
title = '编辑'
|
|
|
}
|
|
|
ElMessage.success('保存成功')
|
|
|
- ElMessageBox.confirm(`${title}成功是否返回商铺列表`, '提示', {
|
|
|
+ ElMessageBox.confirm(`${title}成功是否返回商品列表`, '提示', {
|
|
|
confirmButtonText: '返回列表',
|
|
|
cancelButtonText: `继续${title}`,
|
|
|
type: 'warning'
|
|
|
@@ -260,6 +232,52 @@ const save = async (formEl: FormInstance | undefined) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const loadingData = ref(false)
|
|
|
+onMounted(async () => {
|
|
|
+ if (params.type == 'add') {
|
|
|
+ pageTitle.value = '添加商品'
|
|
|
+ } else if (params.type == 'edit') {
|
|
|
+ pageTitle.value = '编辑商品'
|
|
|
+ try {
|
|
|
+ const res = await getProductDetail(params.id)
|
|
|
+ const data = res.data.storeInfo
|
|
|
+ formData.id = data.id
|
|
|
+ formData.store_id = data.store_id
|
|
|
+ formData.name = data.name
|
|
|
+ formData.video_open = data.video_open
|
|
|
+ formData.video_link = data.video_link
|
|
|
+ formData.slider_image = data.slider_image
|
|
|
+ formData.image = data.image
|
|
|
+ formData.keyword = data.keyword.split(',')
|
|
|
+ formData.cate_ids = data.cate_ids.map((re) => parseInt(re))
|
|
|
+ formData.postage = data.postage
|
|
|
+ formData.temp_id = data.temp_id
|
|
|
+ formData.unit_name = data.unit_name
|
|
|
+ formData.sales = data.sales
|
|
|
+ formData.ficti = data.ficti
|
|
|
+ formData.spec_type = data.spec_type
|
|
|
+ formData.is_show = data.is_show
|
|
|
+ formData.attrs = data.attrs
|
|
|
+ formData.attrs_value = res.data.productValue.map((e) => e)
|
|
|
+ formData.sort = data.sort
|
|
|
+ formData.description = data.description
|
|
|
+ // 判断是否单规格
|
|
|
+ if (formData.spec_type == 0) {
|
|
|
+ const values = res.data.productValue[0]
|
|
|
+ // console.log(values, 'values')
|
|
|
+ attrs_value.cost = values.cost
|
|
|
+ attrs_value.price = values.price
|
|
|
+ attrs_value.ot_price = values.ot_price
|
|
|
+ attrs_value.stock = values.stock
|
|
|
+ attrs_value.suk = values.suk
|
|
|
+ attrs_value.image = [values.image]
|
|
|
+ }
|
|
|
+ getStore('', data.store_id)
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error, 'error')
|
|
|
+ }
|
|
|
+ }
|
|
|
+})
|
|
|
const backList = () => {
|
|
|
push('/goods/list')
|
|
|
}
|
|
|
@@ -289,6 +307,28 @@ const backList = () => {
|
|
|
// attrs_value.suk = '默认'
|
|
|
// attrs_value.image = []
|
|
|
// }
|
|
|
+const storeLoading = ref(false)
|
|
|
+const storeOptions = ref<any[]>([])
|
|
|
+const getStore = async (query = '', id = '') => {
|
|
|
+ try {
|
|
|
+ storeLoading.value = true
|
|
|
+ const res = await getStoreList({ page: 1, limit: 10, name: query, id })
|
|
|
+ if (res) {
|
|
|
+ storeOptions.value = res.data.list.map((item) => {
|
|
|
+ return {
|
|
|
+ value: item.id,
|
|
|
+ label: item.name
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ return []
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ } finally {
|
|
|
+ storeLoading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
</script>
|
|
|
<template>
|
|
|
<ContentWrap
|
|
|
@@ -317,6 +357,26 @@ const backList = () => {
|
|
|
placeholder="请选择商品分类"
|
|
|
/>
|
|
|
</ElFormItem>
|
|
|
+ <ElFormItem label="门店" prop="store_id">
|
|
|
+ <ElSelect
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ :disabled="params.type == 'edit'"
|
|
|
+ v-model="formData.store_id"
|
|
|
+ :remote-method="getStore"
|
|
|
+ :loading="storeLoading"
|
|
|
+ remote-show-suffix
|
|
|
+ placeholder="请选择门店"
|
|
|
+ >
|
|
|
+ <ElOption
|
|
|
+ v-for="item in storeOptions"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ />
|
|
|
+ </ElSelect>
|
|
|
+ </ElFormItem>
|
|
|
<ElFormItem label="商品名称" prop="name">
|
|
|
<ElInput v-model="formData.name" placeholder="请输入商品名称" />
|
|
|
</ElFormItem>
|