diff --git a/apps/web-ele/src/views/infra/codegen/index.vue b/apps/web-ele/src/views/infra/codegen/index.vue index fc94fce44..ffd139613 100644 --- a/apps/web-ele/src/views/infra/codegen/index.vue +++ b/apps/web-ele/src/views/infra/codegen/index.vue @@ -90,6 +90,7 @@ async function onDelete(row: InfraCodegenApi.CodegenTable) { async function onDeleteBatch() { await confirm('确定要批量删除该代码生成配置吗?'); await deleteCodegenTableList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } diff --git a/apps/web-ele/src/views/infra/config/index.vue b/apps/web-ele/src/views/infra/config/index.vue index 5e1f63da1..031fbe06f 100644 --- a/apps/web-ele/src/views/infra/config/index.vue +++ b/apps/web-ele/src/views/infra/config/index.vue @@ -69,6 +69,7 @@ async function onDelete(row: InfraConfigApi.Config) { async function onDeleteBatch() { await confirm('确定要批量删除该参数吗?'); await deleteConfigList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } diff --git a/apps/web-ele/src/views/infra/dataSourceConfig/index.vue b/apps/web-ele/src/views/infra/dataSourceConfig/index.vue index 43188b058..7c44f87c8 100644 --- a/apps/web-ele/src/views/infra/dataSourceConfig/index.vue +++ b/apps/web-ele/src/views/infra/dataSourceConfig/index.vue @@ -57,6 +57,7 @@ async function onDelete(row: InfraDataSourceConfigApi.DataSourceConfig) { async function onDeleteBatch() { await confirm('确定要批量删除该数据源吗?'); await deleteDataSourceConfigList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } diff --git a/apps/web-ele/src/views/infra/demo/demo01/index.vue b/apps/web-ele/src/views/infra/demo/demo01/index.vue index a0c2bb9ae..bb4c5a906 100644 --- a/apps/web-ele/src/views/infra/demo/demo01/index.vue +++ b/apps/web-ele/src/views/infra/demo/demo01/index.vue @@ -64,6 +64,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo01ContactList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/demo03/erp/index.vue b/apps/web-ele/src/views/infra/demo/demo03/erp/index.vue index 17ef8e123..0cc703dac 100644 --- a/apps/web-ele/src/views/infra/demo/demo03/erp/index.vue +++ b/apps/web-ele/src/views/infra/demo/demo03/erp/index.vue @@ -70,6 +70,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03StudentList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue b/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue index 78bd4d665..83314c08c 100644 --- a/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue +++ b/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue @@ -69,6 +69,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03CourseList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue b/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue index 9fb8fc238..0c8db98a0 100644 --- a/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue +++ b/apps/web-ele/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue @@ -69,6 +69,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03GradeList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/demo03/inner/index.vue b/apps/web-ele/src/views/infra/demo/demo03/inner/index.vue index ce1938e81..a179de870 100644 --- a/apps/web-ele/src/views/infra/demo/demo03/inner/index.vue +++ b/apps/web-ele/src/views/infra/demo/demo03/inner/index.vue @@ -69,6 +69,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03StudentList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/demo03/normal/index.vue b/apps/web-ele/src/views/infra/demo/demo03/normal/index.vue index ff99c665b..305dc3930 100644 --- a/apps/web-ele/src/views/infra/demo/demo03/normal/index.vue +++ b/apps/web-ele/src/views/infra/demo/demo03/normal/index.vue @@ -64,6 +64,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03StudentList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/general/demo01/index.vue b/apps/web-ele/src/views/infra/demo/general/demo01/index.vue index 4e16a6292..5962ac037 100644 --- a/apps/web-ele/src/views/infra/demo/general/demo01/index.vue +++ b/apps/web-ele/src/views/infra/demo/general/demo01/index.vue @@ -121,6 +121,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo01ContactList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/general/demo03/erp/index.vue b/apps/web-ele/src/views/infra/demo/general/demo03/erp/index.vue index 24cdd1d92..b3b3fa800 100644 --- a/apps/web-ele/src/views/infra/demo/general/demo03/erp/index.vue +++ b/apps/web-ele/src/views/infra/demo/general/demo03/erp/index.vue @@ -133,6 +133,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03StudentList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue b/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue index 69772b7c0..087f8ec90 100644 --- a/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue +++ b/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue @@ -77,6 +77,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03CourseList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue b/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue index a1cc8057f..5465c054a 100644 --- a/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue +++ b/apps/web-ele/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue @@ -77,6 +77,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03GradeList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/general/demo03/inner/index.vue b/apps/web-ele/src/views/infra/demo/general/demo03/inner/index.vue index afaab7bc2..f95f06db3 100644 --- a/apps/web-ele/src/views/infra/demo/general/demo03/inner/index.vue +++ b/apps/web-ele/src/views/infra/demo/general/demo03/inner/index.vue @@ -129,6 +129,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03StudentList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/apps/web-ele/src/views/infra/demo/general/demo03/normal/index.vue b/apps/web-ele/src/views/infra/demo/general/demo03/normal/index.vue index 3a4052163..b3e47596b 100644 --- a/apps/web-ele/src/views/infra/demo/general/demo03/normal/index.vue +++ b/apps/web-ele/src/views/infra/demo/general/demo03/normal/index.vue @@ -122,6 +122,7 @@ async function handleDeleteBatch() { }); try { await deleteDemo03StudentList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); await getList(); } finally { diff --git a/apps/web-ele/src/views/infra/file/index.vue b/apps/web-ele/src/views/infra/file/index.vue index 0d2e87f29..27d3d5558 100644 --- a/apps/web-ele/src/views/infra/file/index.vue +++ b/apps/web-ele/src/views/infra/file/index.vue @@ -79,6 +79,7 @@ async function onDelete(row: InfraFileApi.File) { async function onDeleteBatch() { await confirm('确定要批量删除该文件吗?'); await deleteFileList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } diff --git a/apps/web-ele/src/views/infra/fileConfig/index.vue b/apps/web-ele/src/views/infra/fileConfig/index.vue index 21095febd..8cc1f3dd8 100644 --- a/apps/web-ele/src/views/infra/fileConfig/index.vue +++ b/apps/web-ele/src/views/infra/fileConfig/index.vue @@ -103,6 +103,7 @@ async function onDelete(row: InfraFileConfigApi.FileConfig) { async function onDeleteBatch() { await confirm('确定要批量删除该文件配置吗?'); await deleteFileConfigList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } diff --git a/apps/web-ele/src/views/infra/job/index.vue b/apps/web-ele/src/views/infra/job/index.vue index 5bdb2aac8..6c3ebf662 100644 --- a/apps/web-ele/src/views/infra/job/index.vue +++ b/apps/web-ele/src/views/infra/job/index.vue @@ -122,6 +122,7 @@ async function onDelete(row: InfraJobApi.Job) { async function onDeleteBatch() { await confirm('确定要批量删除该任务吗?'); await deleteJobList(checkedIds.value); + checkedIds.value = []; ElMessage.success($t('ui.actionMessage.deleteSuccess')); onRefresh(); } diff --git a/apps/web-ele/src/views/mall/product/spu/components/data.ts b/apps/web-ele/src/views/mall/product/spu/components/data.ts index 50463a42d..ded4e7666 100644 --- a/apps/web-ele/src/views/mall/product/spu/components/data.ts +++ b/apps/web-ele/src/views/mall/product/spu/components/data.ts @@ -1,6 +1,7 @@ -import type { MallSpuApi } from '#/api/mall/product/spu'; import type { PropertyAndValues } from './model'; +import type { MallSpuApi } from '#/api/mall/product/spu'; + /** * 获得商品的规格列表 - 商品相关的公共函数 * diff --git a/apps/web-ele/src/views/mall/product/spu/components/description-form.vue b/apps/web-ele/src/views/mall/product/spu/components/description-form.vue index 53b1c0741..139b8ead6 100644 --- a/apps/web-ele/src/views/mall/product/spu/components/description-form.vue +++ b/apps/web-ele/src/views/mall/product/spu/components/description-form.vue @@ -1,14 +1,16 @@ + - - diff --git a/apps/web-ele/src/views/mall/product/spu/components/product-property-add-form.vue b/apps/web-ele/src/views/mall/product/spu/components/product-property-add-form.vue index e74826645..48189d5c3 100644 --- a/apps/web-ele/src/views/mall/product/spu/components/product-property-add-form.vue +++ b/apps/web-ele/src/views/mall/product/spu/components/product-property-add-form.vue @@ -1,26 +1,25 @@ .includes(propertyId!)) { + skuPropertyIds.push(propertyId!); + } + }), + ); + const propertyIds = propertyList.map((item) => item.id); + return skuPropertyIds.length === propertyIds.length; +}; + +/** 构建所有排列组合 */ +const build = ( + propertyValuesList: MallSpuApi.Property[][], +): MallSpuApi.Property[] | MallSpuApi.Property[][] => { + if (!propertyValuesList || propertyValuesList.length === 0) { + return []; + } else if (propertyValuesList.length === 1) { + return propertyValuesList[0] || []; + } else { + const result: MallSpuApi.Property[][] = []; + const rest = build(propertyValuesList.slice(1)); + if (propertyValuesList[0] && Array.isArray(rest)) { + for (let i = 0; i < propertyValuesList[0].length; i++) { + for (const restItem of rest) { + const currentItem = propertyValuesList[0][i]; + // 第一次不是数组结构,后面的都是数组结构 + if (Array.isArray(restItem)) { + result.push([currentItem!, ...restItem]); + } else if (restItem) { + // 确保restItem不是undefined,并进行类型断言 + result.push([currentItem!, restItem as MallSpuApi.Property]); + } + } + } + } + return result; + } +}; + +/** 监听属性列表,生成相关参数和表头 */ +watch( + () => props.propertyList, + (propertyList: PropertyAndValues[]) => { + // 如果不是多规格则结束 + if (!formData.value!.specType) { + return; + } + // 如果当前组件作为批量添加数据使用,则重置表数据 + if (props.isBatch) { + skuList.value = [ + { + price: 0, + marketPrice: 0, + costPrice: 0, + barCode: '', + picUrl: '', + stock: 0, + weight: 0, + volume: 0, + firstBrokeragePrice: 0, + secondBrokeragePrice: 0, + }, + ]; + } + + // 判断代理对象是否为空 + if (JSON.stringify(propertyList) === '[]') { + return; + } + // 重置表头 + tableHeaders.value = []; + // 生成表头 + propertyList.forEach((item, index) => { + // name加属性项index区分属性值 + tableHeaders.value.push({ prop: `name${index}`, label: item.name }); + }); + // 如果回显的 sku 属性和添加的属性一致则不处理 + if (validateData(propertyList)) { + return; + } + // 添加新属性没有属性值也不做处理 + if (propertyList.some((item) => !item.values || isEmpty(item.values))) { + return; + } + // 生成 table 数据,即 sku 列表 + generateTableData(propertyList); + }, + { + deep: true, + immediate: true, + }, +); +const activitySkuListRef = ref>(); + +const getSkuTableRef = () => { + return activitySkuListRef.value; +}; +// 暴露出生成 sku 方法,给添加属性成功时调用 +defineExpose({ generateTableData, validateSku, getSkuTableRef }); + + - + - - + - diff --git a/apps/web-ele/src/views/mall/product/spu/modules/form.vue b/apps/web-ele/src/views/mall/product/spu/modules/form.vue index a1619905a..38871d39e 100644 --- a/apps/web-ele/src/views/mall/product/spu/modules/form.vue +++ b/apps/web-ele/src/views/mall/product/spu/modules/form.vue @@ -1,16 +1,19 @@