From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/views/mall/promotion/point/activity/PointActivityForm.vue | 227 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 227 insertions(+), 0 deletions(-)
diff --git a/src/views/mall/promotion/point/activity/PointActivityForm.vue b/src/views/mall/promotion/point/activity/PointActivityForm.vue
new file mode 100644
index 0000000..a09565c
--- /dev/null
+++ b/src/views/mall/promotion/point/activity/PointActivityForm.vue
@@ -0,0 +1,227 @@
+<template>
+ <Dialog v-model="dialogVisible" :title="dialogTitle" width="65%">
+ <Form
+ ref="formRef"
+ v-loading="formLoading"
+ :isCol="true"
+ :rules="rules"
+ :schema="allSchemas.formSchema"
+ >
+ <!-- 鍏堥�夋嫨 -->
+ <template #spuId>
+ <el-button v-if="!isFormUpdate" @click="spuSelectRef.open()">閫夋嫨鍟嗗搧</el-button>
+ <SpuAndSkuList
+ ref="spuAndSkuListRef"
+ :rule-config="ruleConfig"
+ :spu-list="spuList"
+ :spu-property-list-p="spuPropertyList"
+ >
+ <el-table-column align="center" label="鍙厬鎹㈠簱瀛�" min-width="168">
+ <template #default="{ row: sku }">
+ <el-input-number
+ v-model="sku.productConfig.stock"
+ :max="sku.stock"
+ :min="0"
+ class="w-100%"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column align="center" label="鍙厬鎹㈡鏁�" min-width="168">
+ <template #default="{ row: sku }">
+ <el-input-number v-model="sku.productConfig.count" :min="0" class="w-100%" />
+ </template>
+ </el-table-column>
+ <el-table-column align="center" label="鎵�闇�绉垎" min-width="168">
+ <template #default="{ row: sku }">
+ <el-input-number v-model="sku.productConfig.point" :min="0" class="w-100%" />
+ </template>
+ </el-table-column>
+ <el-table-column align="center" label="鎵�闇�閲戦(鍏�)" min-width="168">
+ <template #default="{ row: sku }">
+ <el-input-number
+ v-model="sku.productConfig.price"
+ :min="0"
+ :precision="2"
+ :step="0.1"
+ class="w-100%"
+ />
+ </template>
+ </el-table-column>
+ </SpuAndSkuList>
+ </template>
+ </Form>
+ <template #footer>
+ <el-button :disabled="formLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
+ <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+ </template>
+ </Dialog>
+ <SpuSelect ref="spuSelectRef" :isSelectSku="true" @confirm="selectSpu" />
+</template>
+<script lang="ts" setup>
+import { SpuAndSkuList, SpuProperty, SpuSelect } from '../../components'
+import { allSchemas, rules } from './pointActivity.data'
+import { cloneDeep } from 'lodash-es'
+import {
+ PointActivityApi,
+ PointActivityVO,
+ PointProductVO,
+ SkuExtension,
+ SpuExtension
+} from '@/api/mall/promotion/point'
+import * as ProductSpuApi from '@/api/mall/product/spu'
+import { getPropertyList, RuleConfig } from '@/views/mall/product/spu/components'
+import { convertToInteger, formatToFraction } from '@/utils'
+
+defineOptions({ name: 'PromotionSeckillActivityForm' })
+
+const { t } = useI18n() // 鍥介檯鍖�
+const message = useMessage() // 娑堟伅寮圭獥
+
+const dialogVisible = ref(false) // 寮圭獥鐨勬槸鍚﹀睍绀�
+const dialogTitle = ref('') // 寮圭獥鐨勬爣棰�
+const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛�1锛変慨鏀规椂鐨勬暟鎹姞杞斤紱2锛夋彁浜ょ殑鎸夐挳绂佺敤
+const formType = ref('') // 琛ㄥ崟鐨勭被鍨嬶細create - 鏂板锛泆pdate - 淇敼
+const formRef = ref() // 琛ㄥ崟 Ref
+const isFormUpdate = ref(false) // 鏄惁鏇存柊琛ㄥ崟
+
+// ================= 鍟嗗搧閫夋嫨鐩稿叧 =================
+
+const spuSelectRef = ref() // 鍟嗗搧鍜屽睘鎬ч�夋嫨 Ref
+const spuAndSkuListRef = ref() // sku 绉垎鍟嗗煄鍟嗗搧閰嶇疆缁勪欢Ref
+const ruleConfig: RuleConfig[] = [
+ {
+ name: 'productConfig.stock',
+ rule: (arg) => arg >= 1,
+ message: '鍟嗗搧鍙厬鎹㈠簱瀛樺繀椤诲ぇ浜庣瓑浜� 1 锛侊紒锛�'
+ },
+ {
+ name: 'productConfig.point',
+ rule: (arg) => arg >= 1,
+ message: '鍟嗗搧鎵�闇�鍏戞崲绉垎蹇呴』澶т簬绛変簬 1 锛侊紒锛�'
+ },
+ {
+ name: 'productConfig.count',
+ rule: (arg) => arg >= 1,
+ message: '鍟嗗搧鍙厬鎹㈡鏁板繀椤诲ぇ浜庣瓑浜� 1 锛侊紒锛�'
+ }
+]
+const spuList = ref<SpuExtension[]>([]) // 閫夋嫨鐨� spu
+const spuPropertyList = ref<SpuProperty<SpuExtension>[]>([])
+const selectSpu = (spuId: number, skuIds: number[]) => {
+ formRef.value.setValues({ spuId })
+ getSpuDetails(spuId, skuIds)
+}
+/**
+ * 鑾峰彇 SPU 璇︽儏
+ */
+const getSpuDetails = async (
+ spuId: number,
+ skuIds: number[] | undefined,
+ products?: PointProductVO[]
+) => {
+ const spuProperties: SpuProperty<SpuExtension>[] = []
+ const res = (await ProductSpuApi.getSpuDetailList([spuId])) as SpuExtension[]
+ if (res.length == 0) {
+ return
+ }
+ spuList.value = []
+ // 鍥犱负鍙兘閫夋嫨涓�涓�
+ const spu = res[0]
+ const selectSkus =
+ typeof skuIds === 'undefined' ? spu?.skus : spu?.skus?.filter((sku) => skuIds.includes(sku.id!))
+ selectSkus?.forEach((sku) => {
+ let config: PointProductVO = {
+ skuId: sku.id!,
+ stock: 0,
+ price: 0,
+ point: 0,
+ count: 0
+ }
+ if (typeof products !== 'undefined') {
+ const product = products.find((item) => item.skuId === sku.id)
+ if (product) {
+ product.price = formatToFraction(product.price) as any
+ }
+ config = product || config
+ }
+ sku.productConfig = config
+ })
+ spu.skus = selectSkus as SkuExtension[]
+ spuProperties.push({
+ spuId: spu.id!,
+ spuDetail: spu,
+ propertyList: getPropertyList(spu)
+ })
+ spuList.value.push(spu)
+ spuPropertyList.value = spuProperties
+}
+
+// ================= end =================
+
+/** 鎵撳紑寮圭獥 */
+const open = async (type: string, id?: number) => {
+ dialogVisible.value = true
+ dialogTitle.value = t('action.' + type)
+ formType.value = type
+ await resetForm()
+ // 淇敼鏃讹紝璁剧疆鏁版嵁
+ if (id) {
+ formLoading.value = true
+ try {
+ const data = (await PointActivityApi.getPointActivity(id)) as PointActivityVO
+ isFormUpdate.value = true
+ await getSpuDetails(
+ data.spuId!,
+ data.products?.map((sku) => sku.skuId),
+ data.products
+ )
+ formRef.value.setValues(data)
+ } finally {
+ formLoading.value = false
+ }
+ }
+}
+defineExpose({ open }) // 鎻愪緵 open 鏂规硶锛岀敤浜庢墦寮�寮圭獥
+
+/** 鎻愪氦琛ㄥ崟 */
+const emit = defineEmits(['success']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
+const submitForm = async () => {
+ // 鏍¢獙琛ㄥ崟
+ if (!formRef) return
+ const valid = await formRef.value.getElFormRef().validate()
+ if (!valid) return
+ // 鎻愪氦璇锋眰
+ formLoading.value = true
+ try {
+ // 鑾峰彇绉掓潃鍟嗗搧閰嶇疆
+ const products = cloneDeep(spuAndSkuListRef.value.getSkuConfigs('productConfig'))
+ products.forEach((item: PointProductVO) => {
+ item.price = convertToInteger(item.price)
+ })
+ const data = formRef.value.formModel as PointActivityVO
+ data.products = products
+ // 鐪熸鎻愪氦
+ if (formType.value === 'create') {
+ await PointActivityApi.createPointActivity(data)
+ message.success(t('common.createSuccess'))
+ } else {
+ await PointActivityApi.updatePointActivity(data)
+ message.success(t('common.updateSuccess'))
+ }
+ dialogVisible.value = false
+ // 鍙戦�佹搷浣滄垚鍔熺殑浜嬩欢
+ emit('success')
+ } finally {
+ formLoading.value = false
+ }
+}
+
+/** 閲嶇疆琛ㄥ崟 */
+const resetForm = async () => {
+ spuList.value = []
+ spuPropertyList.value = []
+ isFormUpdate.value = false
+ await nextTick()
+ formRef.value.getElFormRef().resetFields()
+}
+</script>
--
Gitblit v1.8.0