diff --git a/src/api/mall/promotion/combination/combinationactivity.ts b/src/api/mall/promotion/combination/combinationactivity.ts
new file mode 100644
index 00000000..bc946773
--- /dev/null
+++ b/src/api/mall/promotion/combination/combinationactivity.ts
@@ -0,0 +1,48 @@
+import request from '@/config/axios'
+
+export interface CombinationActivityVO {
+ id: number
+ name: string
+ spuId: number
+ totalLimitCount: number
+ singleLimitCount: number
+ startTime: Date
+ endTime: Date
+ userSize: number
+ totalNum: number
+ successNum: number
+ orderUserCount: number
+ virtualGroup: number
+ status: number
+ limitDuration: number
+}
+
+// 查询拼团活动列表
+export const getCombinationActivityPage = async (params) => {
+ return await request.get({ url: '/promotion/combination-activity/page', params })
+}
+
+// 查询拼团活动详情
+export const getCombinationActivity = async (id: number) => {
+ return await request.get({ url: '/promotion/combination-activity/get?id=' + id })
+}
+
+// 新增拼团活动
+export const createCombinationActivity = async (data: CombinationActivityVO) => {
+ return await request.post({ url: '/promotion/combination-activity/create', data })
+}
+
+// 修改拼团活动
+export const updateCombinationActivity = async (data: CombinationActivityVO) => {
+ return await request.put({ url: '/promotion/combination-activity/update', data })
+}
+
+// 删除拼团活动
+export const deleteCombinationActivity = async (id: number) => {
+ return await request.delete({ url: '/promotion/combination-activity/delete?id=' + id })
+}
+
+// 导出拼团活动 Excel
+export const exportCombinationActivity = async (params) => {
+ return await request.download({ url: '/promotion/combination-activity/export-excel', params })
+}
diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts
index c9d80618..003f7c1c 100644
--- a/src/utils/formatTime.ts
+++ b/src/utils/formatTime.ts
@@ -23,6 +23,13 @@ export function formatDate(date: Date, format?: string): string {
return dayjs(date).format(format)
}
+/**
+ * 获取当前的日期+时间
+ */
+export function getNowDateTime() {
+ return dayjs().format('YYYY-MM-DD HH:mm:ss')
+}
+
/**
* 获取当前日期是第几周
* @param dateTime 当前传入的日期值
diff --git a/src/views/mall/promotion/combination/activity/CombinationActivityForm.vue b/src/views/mall/promotion/combination/activity/CombinationActivityForm.vue
new file mode 100644
index 00000000..f0c22be5
--- /dev/null
+++ b/src/views/mall/promotion/combination/activity/CombinationActivityForm.vue
@@ -0,0 +1,74 @@
+
+
+
+
diff --git a/src/views/mall/promotion/combination/activity/combinationActivity.data.ts b/src/views/mall/promotion/combination/activity/combinationActivity.data.ts
new file mode 100644
index 00000000..1c423520
--- /dev/null
+++ b/src/views/mall/promotion/combination/activity/combinationActivity.data.ts
@@ -0,0 +1,168 @@
+import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
+import { dateFormatter, getNowDateTime } from '@/utils/formatTime'
+
+// 表单校验
+export const rules = reactive({
+ name: [required],
+ totalLimitCount: [required],
+ singleLimitCount: [required],
+ startTime: [required],
+ endTime: [required],
+ userSize: [required],
+ totalNum: [required],
+ successNum: [required],
+ orderUserCount: [required],
+ virtualGroup: [required],
+ status: [required],
+ limitDuration: [required]
+})
+
+// CrudSchema https://doc.iocoder.cn/vue3/crud-schema/
+const crudSchemas = reactive([
+ {
+ label: '拼团名称',
+ field: 'name',
+ isSearch: true,
+ isTable: false,
+ form: {
+ colProps: {
+ span: 24
+ }
+ }
+ },
+ {
+ label: '活动时间',
+ field: 'activityTime',
+ formatter: dateFormatter,
+ search: {
+ show: true,
+ component: 'DatePicker',
+ componentProps: {
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ type: 'datetimerange'
+ }
+ },
+ form: {
+ component: 'DatePicker',
+ componentProps: {
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ type: 'datetimerange'
+ },
+ value: [getNowDateTime(), getNowDateTime()],
+ colProps: {
+ span: 24
+ }
+ }
+ },
+ {
+ label: '参与人数',
+ field: 'orderUserCount',
+ isSearch: false,
+ form: {
+ component: 'InputNumber',
+ labelMessage: '参与人数不能少于两人',
+ value: 2
+ }
+ },
+ {
+ label: '限制时长',
+ field: 'limitDuration',
+ isSearch: false,
+ isTable: false,
+ form: {
+ component: 'InputNumber',
+ labelMessage: '限制时长(小时)',
+ componentProps: {
+ placeholder: '请输入限制时长(小时)'
+ }
+ }
+ },
+ {
+ label: '总限购数量',
+ field: 'totalLimitCount',
+ isSearch: false,
+ isTable: false,
+ form: {
+ component: 'InputNumber',
+ value: 0
+ }
+ },
+ {
+ label: '单次限购数量',
+ field: 'singleLimitCount',
+ isSearch: false,
+ isTable: false,
+ form: {
+ component: 'InputNumber',
+ value: 0
+ }
+ },
+ {
+ label: '购买人数',
+ field: 'userSize',
+ isSearch: false,
+ isForm: false
+ },
+ {
+ label: '开团组数',
+ field: 'totalNum',
+ isSearch: false,
+ isForm: false
+ },
+ {
+ label: '成团组数',
+ field: 'successNum',
+ isSearch: false,
+ isForm: false
+ },
+ {
+ label: '虚拟成团',
+ field: 'virtualGroup',
+ isSearch: false,
+ isTable: false,
+ form: {
+ component: 'InputNumber',
+ value: 0
+ }
+ },
+ {
+ label: '活动状态',
+ field: 'status',
+ dictType: DICT_TYPE.COMMON_STATUS,
+ dictClass: 'number',
+ isSearch: true,
+ isForm: false
+ },
+ {
+ label: '创建时间',
+ field: 'createTime',
+ formatter: dateFormatter,
+ isSearch: false,
+ isTable: false,
+ search: {
+ component: 'DatePicker',
+ componentProps: {
+ valueFormat: 'YYYY-MM-DD HH:mm:ss',
+ type: 'daterange',
+ defaultTime: [new Date('1 00:00:00'), new Date('1 23:59:59')]
+ }
+ },
+ isForm: false
+ },
+ {
+ label: '拼团商品',
+ field: 'spuId',
+ isSearch: false,
+ form: {
+ colProps: {
+ span: 24
+ }
+ }
+ },
+ {
+ label: '操作',
+ field: 'action',
+ isForm: false
+ }
+])
+export const { allSchemas } = useCrudSchemas(crudSchemas)
diff --git a/src/views/mall/promotion/combination/activity/index.vue b/src/views/mall/promotion/combination/activity/index.vue
new file mode 100644
index 00000000..09cc1a7f
--- /dev/null
+++ b/src/views/mall/promotion/combination/activity/index.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+