diff --git a/yudao-admin-vue3/src/api/promotion/activityinfo/index.ts b/yudao-admin-vue3/src/api/promotion/activityinfo/index.ts
new file mode 100644
index 0000000..044a9bc
--- /dev/null
+++ b/yudao-admin-vue3/src/api/promotion/activityinfo/index.ts
@@ -0,0 +1,51 @@
+import request from '@/config/axios'
+
+// 活动信息 VO
+export interface ActivityInfoVO {
+ id: number // 活动唯一ID
+ activityTitle: string // 活动标题
+ activityLocation: string // 活动地点
+ organizer: string // 活动主办方
+ startTime: Date // 活动开始时间
+ endTime: Date // 活动结束时间
+ price: number // 活动票价
+ status: string // 活动状态
+ activityType: string // 活动类型
+ capacity: number // 活动人数限制
+ registeredCount: number // 已报名人数
+ topicType: string // 专题类型
+}
+
+// 活动信息 API
+export const ActivityInfoApi = {
+ // 查询活动信息分页
+ getActivityInfoPage: async (params: any) => {
+ return await request.get({ url: `/promotion/activity-info/page`, params })
+ },
+
+ // 查询活动信息详情
+ getActivityInfo: async (id: number) => {
+ return await request.get({ url: `/promotion/activity-info/get?id=` + id })
+ },
+
+ // 新增活动信息
+ createActivityInfo: async (data: ActivityInfoVO) => {
+ return await request.post({ url: `/promotion/activity-info/create`, data })
+ },
+
+ // 修改活动信息
+ updateActivityInfo: async (data: ActivityInfoVO) => {
+ return await request.put({ url: `/promotion/activity-info/update`, data })
+ },
+
+ // 删除活动信息
+ deleteActivityInfo: async (id: number) => {
+ return await request.delete({ url: `/promotion/activity-info/delete?id=` + id })
+ },
+
+ // 导出活动信息 Excel
+ exportActivityInfo: async (params) => {
+ return await request.download({ url: `/promotion/activity-info/export-excel`, params })
+ },
+
+}
diff --git a/yudao-admin-vue3/src/api/promotion/registration/index.ts b/yudao-admin-vue3/src/api/promotion/registration/index.ts
new file mode 100644
index 0000000..d9169f6
--- /dev/null
+++ b/yudao-admin-vue3/src/api/promotion/registration/index.ts
@@ -0,0 +1,58 @@
+import request from '@/config/axios'
+
+// 活动报名 VO
+export interface RegistrationVO {
+ userName: string // 用户姓名
+ phoneNumber: string // 手机号
+ companyName: string // 公司名称
+ position: string // 职位
+ operationPlatform: string // 运营平台
+ mainCategory: string // 主营品类
+ agencyCity: string // 代理城市
+ productIntent: string // 产品意向
+ purpose: string // 参会目的
+ attendeeIdentity: string // 参会身份
+ registrationStatus: string // 报名状态
+ verificationCode: string // 核销码
+ verificationStatus: string // 核销状态
+ isPaid: string // 是否付费
+ reviewStatus: string // 审核状态
+}
+
+// 活动报名 API
+export const RegistrationApi = {
+ // 查询活动报名分页
+ getRegistrationPage: async (params: any) => {
+ return await request.get({ url: `/promotion/registration/page`, params })
+ },
+
+ // 查询活动报名详情
+ getRegistration: async (id: number) => {
+ return await request.get({ url: `/promotion/registration/get?id=` + id })
+ },
+
+ // 新增活动报名
+ createRegistration: async (data: RegistrationVO) => {
+ return await request.post({ url: `/promotion/registration/create`, data })
+ },
+
+ // 修改活动报名
+ updateRegistration: async (data: RegistrationVO) => {
+ return await request.put({ url: `/promotion/registration/update`, data })
+ },
+
+ // 删除活动报名
+ deleteRegistration: async (id: number) => {
+ return await request.delete({ url: `/promotion/registration/delete?id=` + id })
+ },
+
+ // 导出活动报名 Excel
+ exportRegistration: async (params) => {
+ return await request.download({ url: `/promotion/registration/export-excel`, params })
+ },
+ // 查询活动名称数据
+ getActivityNames: async () => {
+ return await request.get({ url: `/promotion/registration/getOrganization` })
+ },
+
+}
diff --git a/yudao-admin-vue3/src/utils/dict.ts b/yudao-admin-vue3/src/utils/dict.ts
index 8efdd00..8ceb88b 100644
--- a/yudao-admin-vue3/src/utils/dict.ts
+++ b/yudao-admin-vue3/src/utils/dict.ts
@@ -295,5 +295,24 @@ export enum DICT_TYPE {
// ========== 通用模块 ==========
ZERO_OR_ONE = 'zero_or_one',
IS_ACTIVATE = 'is_activate',
- CARD_STATUS = 'card_status'
+ CARD_STATUS = 'card_status',
+
+ // ========== 活动报名模块 ==========
+ PROMOTION_REGISTRATION_OPERATION_PLATFORM = 'promotion_registration_operation_platform',
+ PROMOTION_REGISTRATION_MAIN_CATEGORY = 'promotion_registration_main_category',
+ PROMOTION_REGISTRATION_AGENCY_CITY = 'promotion_registration_agency_city',
+ PROMOTION_REGISTRATION_PRODUCT_INTENT = 'promotion_registration_product_intent',
+ PROMOTION_REGISTRATION_PURPOSE = 'promotion_registration_purpose',
+ PROMOTION_REGISTRATION_ATTENDEE_IDENTITY = 'promotion_registration_attendee_identity',
+ PROMOTION_REGISTRATION_REGISTRATION_STATUS = 'promotion_registration_registration_status',
+ PROMOTION_REGISTRATION_VERIFICATION_STATUS = 'promotion_registration_verification_status',
+ PROMOTION_REGISTRATION_IS_PAID = 'promotion_registration_is_paid',
+ PROMOTION_REGISTRATION_REVIEW_STATUS = 'promotion_registration_review_status',
+
+ // ========== 活动信息模块 ==========
+ PROMOTION_ACTIVITY_INFO_STATUS = 'promotion_activity_info_status',
+ PROMOTION_ACTIVITY_INFO_ACTIVITY_TYPE = 'promotion_activity_info_activity_type',
+ PROMOTION_ACTIVITY_INFO_TOPIC_TYPE = 'promotion_activity_info_topic_type',
+
+
}
diff --git a/yudao-admin-vue3/src/views/promotion/activityinfo/ActivityInfoForm.vue b/yudao-admin-vue3/src/views/promotion/activityinfo/ActivityInfoForm.vue
new file mode 100644
index 0000000..e6ada17
--- /dev/null
+++ b/yudao-admin-vue3/src/views/promotion/activityinfo/ActivityInfoForm.vue
@@ -0,0 +1,180 @@
+
+
+
+
diff --git a/yudao-admin-vue3/src/views/promotion/activityinfo/index.vue b/yudao-admin-vue3/src/views/promotion/activityinfo/index.vue
new file mode 100644
index 0000000..3dc730b
--- /dev/null
+++ b/yudao-admin-vue3/src/views/promotion/activityinfo/index.vue
@@ -0,0 +1,370 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-admin-vue3/src/views/promotion/registration/RegistrationForm.vue b/yudao-admin-vue3/src/views/promotion/registration/RegistrationForm.vue
new file mode 100644
index 0000000..caf1dc7
--- /dev/null
+++ b/yudao-admin-vue3/src/views/promotion/registration/RegistrationForm.vue
@@ -0,0 +1,321 @@
+
+
+
+
diff --git a/yudao-admin-vue3/src/views/promotion/registration/index.vue b/yudao-admin-vue3/src/views/promotion/registration/index.vue
new file mode 100644
index 0000000..0a0a2a7
--- /dev/null
+++ b/yudao-admin-vue3/src/views/promotion/registration/index.vue
@@ -0,0 +1,374 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
index f2ad17a..88dd670 100644
--- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
+++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
@@ -170,4 +170,7 @@ public interface ErrorCodeConstants {
// ========== 客服人员 TODO 补充编号 ==========
ErrorCode SUPPORT_STAFF_NOT_EXISTS = new ErrorCode(1_023_000_000, "客服人员不存在");
+ ErrorCode REGISTRATION_NOT_EXISTS = new ErrorCode(1_024_000_000, "活动报名不存在");
+
+ ErrorCode ACTIVITY_INFO_NOT_EXISTS = new ErrorCode(1_025_000_000, "活动信息不存在");
}
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/ActivityInfoController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/ActivityInfoController.java
new file mode 100644
index 0000000..5213b93
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/ActivityInfoController.java
@@ -0,0 +1,103 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.activityinfo;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo.*;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.activityinfo.ActivityInfoDO;
+import cn.iocoder.yudao.module.promotion.service.activityinfo.ActivityInfoService;
+
+@Tag(name = "管理后台 - 活动信息")
+@RestController
+@RequestMapping("/promotion/activity-info")
+@Validated
+public class ActivityInfoController {
+
+ @Resource
+ private ActivityInfoService activityInfoService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建活动信息")
+ @PreAuthorize("@ss.hasPermission('promotion:activity-info:create')")
+ public CommonResult createActivityInfo(@Valid @RequestBody ActivityInfoSaveReqVO createReqVO) {
+ return success(activityInfoService.createActivityInfo(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新活动信息")
+ @PreAuthorize("@ss.hasPermission('promotion:activity-info:update')")
+ public CommonResult updateActivityInfo(@Valid @RequestBody ActivityInfoSaveReqVO updateReqVO) {
+ activityInfoService.updateActivityInfo(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除活动信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('promotion:activity-info:delete')")
+ public CommonResult deleteActivityInfo(@RequestParam("id") Long id) {
+ activityInfoService.deleteActivityInfo(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得活动信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('promotion:activity-info:query')")
+ public CommonResult getActivityInfo(@RequestParam("id") Long id) {
+ ActivityInfoDO activityInfo = activityInfoService.getActivityInfo(id);
+ return success(BeanUtils.toBean(activityInfo, ActivityInfoRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得活动信息分页")
+ @PreAuthorize("@ss.hasPermission('promotion:activity-info:query')")
+ public CommonResult> getActivityInfoPage(@Valid ActivityInfoPageReqVO pageReqVO) {
+ PageResult pageResult = activityInfoService.getActivityInfoPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ActivityInfoRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出活动信息 Excel")
+ @PreAuthorize("@ss.hasPermission('promotion:activity-info:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportActivityInfoExcel(@Valid ActivityInfoPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = activityInfoService.getActivityInfoPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "活动信息.xls", "数据", ActivityInfoRespVO.class,
+ BeanUtils.toBean(list, ActivityInfoRespVO.class));
+ }
+
+// // 获得活动名称数据
+// @GetMapping("/getOrganization")
+// @Operation(summary = "获得活动名称数据")
+// public CommonResult> getOrganization() {
+// List list = ActivityInfoService.getOrganization();
+// return success(list);
+// }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoPageReqVO.java
new file mode 100644
index 0000000..877fb1e
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoPageReqVO.java
@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 活动信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ActivityInfoPageReqVO extends PageParam {
+
+ @Schema(description = "活动标题")
+ private String activityTitle;
+
+ @Schema(description = "活动地点")
+ private String activityLocation;
+
+ @Schema(description = "活动主办方")
+ private String organizer;
+
+ @Schema(description = "活动开始时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] startTime;
+
+ @Schema(description = "活动结束时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] endTime;
+
+ @Schema(description = "活动票价")
+ private BigDecimal price;
+
+ @Schema(description = "活动状态")
+ private String status;
+
+ @Schema(description = "活动类型")
+ private String activityType;
+
+ @Schema(description = "活动人数限制")
+ private Integer capacity;
+
+ @Schema(description = "已报名人数")
+ private Integer registeredCount;
+
+ @Schema(description = "专题类型")
+ private String topicType;
+
+ @Schema(description = "记录创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoRespVO.java
new file mode 100644
index 0000000..c855978
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoRespVO.java
@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 活动信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ActivityInfoRespVO {
+
+ @Schema(description = "活动唯一ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动唯一ID")
+ private Long id;
+
+ @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动标题")
+ private String activityTitle;
+
+ @Schema(description = "活动地点", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动地点")
+ private String activityLocation;
+
+ @Schema(description = "活动主办方", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动主办方")
+ private String organizer;
+
+ @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动开始时间")
+ private LocalDateTime startTime;
+
+ @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动结束时间")
+ private LocalDateTime endTime;
+
+ @Schema(description = "活动票价")
+ @ExcelProperty("活动票价")
+ private BigDecimal price;
+
+ @Schema(description = "活动状态")
+ @ExcelProperty(value = "活动状态", converter = DictConvert.class)
+ @DictFormat("promotion_activity_info_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String status;
+
+ @Schema(description = "活动类型")
+ @ExcelProperty(value = "活动类型", converter = DictConvert.class)
+ @DictFormat("promotion_activity_info_activity_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String activityType;
+
+ @Schema(description = "活动人数限制", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("活动人数限制")
+ private Integer capacity;
+
+ @Schema(description = "已报名人数")
+ @ExcelProperty("已报名人数")
+ private Integer registeredCount;
+
+ @Schema(description = "专题类型")
+ @ExcelProperty(value = "专题类型", converter = DictConvert.class)
+ @DictFormat("promotion_activity_info_topic_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String topicType;
+
+ @Schema(description = "记录创建时间")
+ @ExcelProperty("记录创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoSaveReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoSaveReqVO.java
new file mode 100644
index 0000000..7048fa8
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/activityinfo/vo/ActivityInfoSaveReqVO.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 活动信息新增/修改 Request VO")
+@Data
+public class ActivityInfoSaveReqVO {
+
+ @Schema(description = "活动唯一ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long id;
+
+ @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "活动标题不能为空")
+ private String activityTitle;
+
+ @Schema(description = "活动地点", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "活动地点不能为空")
+ private String activityLocation;
+
+ @Schema(description = "活动主办方", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "活动主办方不能为空")
+ private String organizer;
+
+ @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "活动开始时间不能为空")
+ private LocalDateTime startTime;
+
+ @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "活动结束时间不能为空")
+ private LocalDateTime endTime;
+
+ @Schema(description = "活动票价")
+ private BigDecimal price;
+
+ @Schema(description = "活动状态")
+ private String status;
+
+ @Schema(description = "活动类型")
+ private String activityType;
+
+ @Schema(description = "活动人数限制", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "活动人数限制不能为空")
+ private Integer capacity;
+
+ @Schema(description = "已报名人数")
+ private Integer registeredCount;
+
+ @Schema(description = "专题类型")
+ private String topicType;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/RegistrationController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/RegistrationController.java
new file mode 100644
index 0000000..0c63326
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/RegistrationController.java
@@ -0,0 +1,123 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.registration;
+
+import cn.iocoder.yudao.module.promotion.dal.dataobject.activityinfo.ActivityInfoDO;
+import cn.iocoder.yudao.module.promotion.service.activityinfo.ActivityInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.promotion.controller.admin.registration.vo.*;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.registration.RegistrationDO;
+import cn.iocoder.yudao.module.promotion.service.registration.RegistrationService;
+
+@Slf4j
+@Tag(name = "管理后台 - 活动报名")
+@RestController
+@RequestMapping("/promotion/registration")
+@Validated
+public class RegistrationController {
+
+ @Resource
+ private RegistrationService registrationService;
+
+ @Resource
+ private ActivityInfoService ActivityInfoService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建活动报名")
+ @PreAuthorize("@ss.hasPermission('promotion:registration:create')")
+ public CommonResult createRegistration(@Valid @RequestBody RegistrationSaveReqVO createReqVO) {
+ return success(registrationService.createRegistration(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新活动报名")
+ @PreAuthorize("@ss.hasPermission('promotion:registration:update')")
+ public CommonResult updateRegistration(@Valid @RequestBody RegistrationSaveReqVO updateReqVO) {
+ registrationService.updateRegistration(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除活动报名")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('promotion:registration:delete')")
+ public CommonResult deleteRegistration(@RequestParam("id") Long id) {
+ registrationService.deleteRegistration(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得活动报名")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('promotion:registration:query')")
+ public CommonResult getRegistration(@RequestParam("id") Long id) {
+ RegistrationDO registration = registrationService.getRegistration(id);
+ return success(BeanUtils.toBean(registration, RegistrationRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得活动报名分页")
+ @PreAuthorize("@ss.hasPermission('promotion:registration:query')")
+// public CommonResult> getRegistrationPage(@Valid RegistrationPageReqVO pageReqVO) {
+// PageResult pageResult = registrationService.getRegistrationPage(pageReqVO);
+// return success(BeanUtils.toBean(pageResult, RegistrationRespVO.class));
+// }
+ public CommonResult> getRegistrationPage(@Valid RegistrationPageReqVO pageReqVO) {
+ PageResult pageResult = registrationService.getRegistrationPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, RegistrationRespVO.class));
+ }
+
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出活动报名 Excel")
+ @PreAuthorize("@ss.hasPermission('promotion:registration:export')")
+ @ApiAccessLog(operateType = EXPORT)
+// public void exportRegistrationExcel(@Valid RegistrationPageReqVO pageReqVO,
+// HttpServletResponse response) throws IOException {
+// pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+// List list = registrationService.getRegistrationPage(pageReqVO).getList();
+// // 导出 Excel
+// ExcelUtils.write(response, "活动报名.xls", "数据", RegistrationRespVO.class,
+// BeanUtils.toBean(list, RegistrationRespVO.class));
+// }
+ public void exportRegistrationExcel(@Valid RegistrationPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = registrationService.getRegistrationPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "活动报名.xls", "数据", RegistrationRespVO.class,
+ BeanUtils.toBean(list, RegistrationRespVO.class));
+ }
+
+ // 获得活动名称数据
+ @GetMapping("/getOrganization")
+ @Operation(summary = "获得活动名称数据")
+ public CommonResult> getOrganization() {
+ List list = ActivityInfoService.getOrganization();
+ return success(list);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationPageReqVO.java
new file mode 100644
index 0000000..134af76
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationPageReqVO.java
@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.registration.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 活动报名分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class RegistrationPageReqVO extends PageParam {
+
+ @Schema(description = "用户姓名")
+ private String userName;
+
+ @Schema(description = "运营平台")
+ private String operationPlatform;
+
+ @Schema(description = "代理城市")
+ private String agencyCity;
+
+ @Schema(description = "参会身份")
+ private String attendeeIdentity;
+
+ @Schema(description = "报名状态")
+ private String registrationStatus;
+
+ @Schema(description = "核销状态")
+ private String verificationStatus;
+
+ @Schema(description = "是否付费")
+ private String isPaid;
+
+ @Schema(description = "审核状态")
+ private String reviewStatus;
+
+ @Schema(description = "记录创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationRespVO.java
new file mode 100644
index 0000000..a8d6051
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationRespVO.java
@@ -0,0 +1,107 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.registration.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 活动报名 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RegistrationRespVO {
+
+ @Schema(description = "报名唯一ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("报名唯一ID")
+ private Long id;
+
+ @Schema(description = "用户姓名", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("用户姓名")
+ private String userName;
+
+ @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("手机号")
+ private String phoneNumber;
+
+ @Schema(description = "活动编号")
+ @ExcelProperty("活动编号")
+ private Long activityId;
+
+// @Schema(description = "活动名称")
+// @ExcelProperty("活动名称")
+// private String activityName;
+ @Schema(description = "活动名称")
+ @ExcelProperty("活动名称")
+ private String activityTitle;
+
+
+ @Schema(description = "公司名称")
+ @ExcelProperty("公司名称")
+ private String companyName;
+
+ @Schema(description = "职位")
+ @ExcelProperty("职位")
+ private String position;
+
+ @Schema(description = "运营平台")
+ @ExcelProperty(value = "运营平台", converter = DictConvert.class)
+ @DictFormat("promotion_registration_operation_platform") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String operationPlatform;
+
+ @Schema(description = "主营品类")
+ @ExcelProperty(value = "主营品类", converter = DictConvert.class)
+ @DictFormat("promotion_registration_main_category") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String mainCategory;
+
+ @Schema(description = "代理城市")
+ @ExcelProperty(value = "代理城市", converter = DictConvert.class)
+ @DictFormat("promotion_registration_agency_city") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String agencyCity;
+
+ @Schema(description = "产品意向")
+ @ExcelProperty(value = "产品意向", converter = DictConvert.class)
+ @DictFormat("promotion_registration_product_intent") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String productIntent;
+
+ @Schema(description = "参会目的")
+ @ExcelProperty(value = "参会目的", converter = DictConvert.class)
+ @DictFormat("promotion_registration_purpose") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String purpose;
+
+ @Schema(description = "参会身份")
+ @ExcelProperty(value = "参会身份", converter = DictConvert.class)
+ @DictFormat("promotion_registration_attendee_identity") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String attendeeIdentity;
+
+ @Schema(description = "报名状态", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty(value = "报名状态", converter = DictConvert.class)
+ @DictFormat("promotion_registration_registration_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String registrationStatus;
+
+ @Schema(description = "核销码")
+ @ExcelProperty("核销码")
+ private String verificationCode;
+
+ @Schema(description = "核销状态")
+ @ExcelProperty(value = "核销状态", converter = DictConvert.class)
+ @DictFormat("promotion_registration_verification_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String verificationStatus;
+
+ @Schema(description = "是否付费")
+ @ExcelProperty(value = "是否付费", converter = DictConvert.class)
+ @DictFormat("promotion_registration_is_paid") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String isPaid;
+
+ @Schema(description = "审核状态")
+ @ExcelProperty(value = "审核状态", converter = DictConvert.class)
+ @DictFormat("promotion_registration_review_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String reviewStatus;
+
+ @Schema(description = "记录创建时间")
+ @ExcelProperty("记录创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationSaveReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationSaveReqVO.java
new file mode 100644
index 0000000..3870b05
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/registration/vo/RegistrationSaveReqVO.java
@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.promotion.controller.admin.registration.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 活动报名新增/修改 Request VO")
+@Data
+public class RegistrationSaveReqVO {
+
+ @Schema(description = "报名唯一ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long id;
+
+ @Schema(description = "用户姓名", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "用户姓名不能为空")
+ private String userName;
+
+ @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "手机号不能为空")
+ private String phoneNumber;
+
+ @Schema(description = "活动编号")
+ private Long activityId;
+
+ @Schema(description = "公司名称")
+ private String companyName;
+
+ @Schema(description = "职位")
+ private String position;
+
+ @Schema(description = "运营平台")
+ private String operationPlatform;
+
+ @Schema(description = "主营品类")
+ private String mainCategory;
+
+ @Schema(description = "代理城市")
+ private String agencyCity;
+
+ @Schema(description = "产品意向")
+ private String productIntent;
+
+ @Schema(description = "参会目的")
+ private String purpose;
+
+ @Schema(description = "参会身份")
+ private String attendeeIdentity;
+
+ @Schema(description = "报名状态", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "报名状态不能为空")
+ private String registrationStatus;
+
+ @Schema(description = "核销码")
+ private String verificationCode;
+
+ @Schema(description = "核销状态")
+ private String verificationStatus;
+
+ @Schema(description = "是否付费")
+ private String isPaid;
+
+ @Schema(description = "审核状态")
+ private String reviewStatus;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/activityinfo/ActivityInfoDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/activityinfo/ActivityInfoDO.java
new file mode 100644
index 0000000..c0caf55
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/activityinfo/ActivityInfoDO.java
@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.promotion.dal.dataobject.activityinfo;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 活动信息 DO
+ *
+ * @author LCQ
+ */
+@TableName("promotion_activity_info")
+@KeySequence("promotion_activity_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ActivityInfoDO extends BaseDO {
+
+ /**
+ * 活动唯一ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 活动标题
+ */
+ private String activityTitle;
+ /**
+ * 活动地点
+ */
+ private String activityLocation;
+ /**
+ * 活动主办方
+ */
+ private String organizer;
+ /**
+ * 活动开始时间
+ */
+ private LocalDateTime startTime;
+ /**
+ * 活动结束时间
+ */
+ private LocalDateTime endTime;
+ /**
+ * 活动票价
+ */
+ private BigDecimal price;
+ /**
+ * 活动状态
+ *
+ * 枚举 {@link TODO promotion_activity_info_status 对应的类}
+ */
+ private String status;
+ /**
+ * 活动类型
+ *
+ * 枚举 {@link TODO promotion_activity_info_activity_type 对应的类}
+ */
+ private String activityType;
+ /**
+ * 活动人数限制
+ */
+ private Integer capacity;
+ /**
+ * 已报名人数
+ */
+ private Integer registeredCount;
+ /**
+ * 专题类型
+ *
+ * 枚举 {@link TODO promotion_activity_info_topic_type 对应的类}
+ */
+ private String topicType;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/registration/RegistrationDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/registration/RegistrationDO.java
new file mode 100644
index 0000000..43af757
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/registration/RegistrationDO.java
@@ -0,0 +1,118 @@
+package cn.iocoder.yudao.module.promotion.dal.dataobject.registration;
+
+import com.sun.xml.bind.v2.TODO;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 活动报名 DO
+ *
+ * @author LCQ
+ */
+@TableName("promotion_registration")
+@KeySequence("promotion_registration_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RegistrationDO extends BaseDO {
+
+ /**
+ * 报名唯一ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 用户姓名
+ */
+ private String userName;
+ /**
+ * 手机号
+ */
+ private String phoneNumber;
+ /**
+ * 公司名称
+ */
+ private String companyName;
+ /**
+ * 职位
+ */
+ private String position;
+ /**
+ * 运营平台
+ *
+ * 枚举 {@link TODO promotion_registration_operation_platform 对应的类}
+ */
+ private String operationPlatform;
+ /**
+ * 主营品类
+ *
+ * 枚举 {@link TODO promotion_registration_main_category 对应的类}
+ */
+ private String mainCategory;
+ /**
+ * 代理城市
+ *
+ * 枚举 {@link TODO promotion_registration_agency_city 对应的类}
+ */
+ private String agencyCity;
+ /**
+ * 产品意向
+ *
+ * 枚举 {@link TODO promotion_registration_product_intent 对应的类}
+ */
+ private String productIntent;
+ /**
+ * 参会目的
+ *
+ * 枚举 {@link TODO promotion_registration_purpose 对应的类}
+ */
+ private String purpose;
+ /**
+ * 参会身份
+ *
+ * 枚举 {@link TODO promotion_registration_attendee_identity 对应的类}
+ */
+ private String attendeeIdentity;
+ /**
+ * 关联活动ID(外键关联活动表)
+ */
+ private Long activityId;
+ /**
+ * 报名状态
+ *
+ * 枚举 {@link TODO promotion_registration_registration_status 对应的类}
+ */
+ private String registrationStatus;
+ /**
+ * 核销码
+ */
+ private String verificationCode;
+ /**
+ * 核销状态
+ *
+ * 枚举 {@link TODO promotion_registration_verification_status 对应的类}
+ */
+ private String verificationStatus;
+ /**
+ * 是否付费
+ *
+ * 枚举 {@link TODO promotion_registration_is_paid 对应的类}
+ */
+ private String isPaid;
+ /**
+ * 审核状态
+ *
+ * 枚举 {@link TODO promotion_registration_review_status 对应的类}
+ */
+ private String reviewStatus;
+
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/activityinfo/ActivityInfoMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/activityinfo/ActivityInfoMapper.java
new file mode 100644
index 0000000..d38fc39
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/activityinfo/ActivityInfoMapper.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.promotion.dal.mysql.activityinfo;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.activityinfo.ActivityInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo.*;
+
+/**
+ * 活动信息 Mapper
+ *
+ * @author LCQ
+ */
+@Mapper
+public interface ActivityInfoMapper extends BaseMapperX {
+
+ default PageResult selectPage(ActivityInfoPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ActivityInfoDO::getActivityTitle, reqVO.getActivityTitle())
+ .eqIfPresent(ActivityInfoDO::getActivityLocation, reqVO.getActivityLocation())
+ .eqIfPresent(ActivityInfoDO::getOrganizer, reqVO.getOrganizer())
+ .betweenIfPresent(ActivityInfoDO::getStartTime, reqVO.getStartTime())
+ .betweenIfPresent(ActivityInfoDO::getEndTime, reqVO.getEndTime())
+ .eqIfPresent(ActivityInfoDO::getPrice, reqVO.getPrice())
+ .eqIfPresent(ActivityInfoDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(ActivityInfoDO::getActivityType, reqVO.getActivityType())
+ .eqIfPresent(ActivityInfoDO::getCapacity, reqVO.getCapacity())
+ .eqIfPresent(ActivityInfoDO::getRegisteredCount, reqVO.getRegisteredCount())
+ .eqIfPresent(ActivityInfoDO::getTopicType, reqVO.getTopicType())
+ .betweenIfPresent(ActivityInfoDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ActivityInfoDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/registration/RegistrationMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/registration/RegistrationMapper.java
new file mode 100644
index 0000000..6abe368
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/registration/RegistrationMapper.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.promotion.dal.mysql.registration;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.registration.RegistrationDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.promotion.controller.admin.registration.vo.*;
+
+/**
+ * 活动报名 Mapper
+ *
+ * @author LCQ
+ */
+@Mapper
+public interface RegistrationMapper extends BaseMapperX {
+
+ default PageResult selectPage(RegistrationPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(RegistrationDO::getUserName, reqVO.getUserName())
+ .eqIfPresent(RegistrationDO::getOperationPlatform, reqVO.getOperationPlatform())
+ .eqIfPresent(RegistrationDO::getAgencyCity, reqVO.getAgencyCity())
+ .eqIfPresent(RegistrationDO::getAttendeeIdentity, reqVO.getAttendeeIdentity())
+ .eqIfPresent(RegistrationDO::getRegistrationStatus, reqVO.getRegistrationStatus())
+// .eqIfPresent(RegistrationDO::getActivityId, reqVO.getActivityId())
+ .eqIfPresent(RegistrationDO::getVerificationStatus, reqVO.getVerificationStatus())
+ .eqIfPresent(RegistrationDO::getIsPaid, reqVO.getIsPaid())
+ .eqIfPresent(RegistrationDO::getReviewStatus, reqVO.getReviewStatus())
+ .betweenIfPresent(RegistrationDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(RegistrationDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/activityinfo/ActivityInfoService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/activityinfo/ActivityInfoService.java
new file mode 100644
index 0000000..c2b0b45
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/activityinfo/ActivityInfoService.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.promotion.service.activityinfo;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo.*;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.activityinfo.ActivityInfoDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 活动信息 Service 接口
+ *
+ * @author LCQ
+ */
+public interface ActivityInfoService {
+
+
+ /**
+ * 创建活动信息
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createActivityInfo(@Valid ActivityInfoSaveReqVO createReqVO);
+
+ /**
+ * 更新活动信息
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateActivityInfo(@Valid ActivityInfoSaveReqVO updateReqVO);
+
+ /**
+ * 删除活动信息
+ *
+ * @param id 编号
+ */
+ void deleteActivityInfo(Long id);
+
+ /**
+ * 获得活动信息
+ *
+ * @param id 编号
+ * @return 活动信息
+ */
+ ActivityInfoDO getActivityInfo(Long id);
+
+ /**
+ * 获得活动信息分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 活动信息分页
+ */
+ PageResult getActivityInfoPage(ActivityInfoPageReqVO pageReqVO);
+
+
+ Map getActivityTitleMapByIds(Collection ids); // 新增方法声明
+
+ List getOrganization();
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/activityinfo/ActivityInfoServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/activityinfo/ActivityInfoServiceImpl.java
new file mode 100644
index 0000000..e2c42d0
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/activityinfo/ActivityInfoServiceImpl.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.promotion.service.activityinfo;
+
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import cn.iocoder.yudao.module.promotion.controller.admin.activityinfo.vo.*;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.activityinfo.ActivityInfoDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.promotion.dal.mysql.activityinfo.ActivityInfoMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
+
+/**
+ * 活动信息 Service 实现类
+ *
+ * @author LCQ
+ */
+@Service
+@Validated
+public class ActivityInfoServiceImpl implements ActivityInfoService {
+
+ @Resource
+ private ActivityInfoMapper activityInfoMapper;
+
+ @Override
+ public Long createActivityInfo(ActivityInfoSaveReqVO createReqVO) {
+ // 插入
+ ActivityInfoDO activityInfo = BeanUtils.toBean(createReqVO, ActivityInfoDO.class);
+ activityInfoMapper.insert(activityInfo);
+ // 返回
+ return activityInfo.getId();
+ }
+
+ @Override
+ public void updateActivityInfo(ActivityInfoSaveReqVO updateReqVO) {
+ // 校验存在
+ validateActivityInfoExists(updateReqVO.getId());
+ // 更新
+ ActivityInfoDO updateObj = BeanUtils.toBean(updateReqVO, ActivityInfoDO.class);
+ activityInfoMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteActivityInfo(Long id) {
+ // 校验存在
+ validateActivityInfoExists(id);
+ // 删除
+ activityInfoMapper.deleteById(id);
+ }
+
+ private void validateActivityInfoExists(Long id) {
+ if (activityInfoMapper.selectById(id) == null) {
+ throw exception(ACTIVITY_INFO_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public ActivityInfoDO getActivityInfo(Long id) {
+ return activityInfoMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getActivityInfoPage(ActivityInfoPageReqVO pageReqVO) {
+ return activityInfoMapper.selectPage(pageReqVO);
+ }
+
+
+ public Map getActivityTitleMapByIds(Collection ids) {
+ if (CollectionUtils.isEmpty(ids)) {
+ return Collections.emptyMap(); // 返回空 Map,避免生成无效 SQL
+ }
+ List activities = activityInfoMapper.selectBatchIds(ids);
+ return activities.stream()
+ .collect(Collectors.toMap(ActivityInfoDO::getId, ActivityInfoDO::getActivityTitle));
+ }
+
+ @Override
+ public List getOrganization() {
+ return activityInfoMapper.selectList();
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/registration/RegistrationService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/registration/RegistrationService.java
new file mode 100644
index 0000000..17e2d1f
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/registration/RegistrationService.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.promotion.service.registration;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.promotion.controller.admin.registration.vo.*;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.registration.RegistrationDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 活动报名 Service 接口
+ *
+ * @author LCQ
+ */
+public interface RegistrationService {
+
+ /**
+ * 创建活动报名
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createRegistration(@Valid RegistrationSaveReqVO createReqVO);
+
+ /**
+ * 更新活动报名
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateRegistration(@Valid RegistrationSaveReqVO updateReqVO);
+
+ /**
+ * 删除活动报名
+ *
+ * @param id 编号
+ */
+ void deleteRegistration(Long id);
+
+ /**
+ * 获得活动报名
+ *
+ * @param id 编号
+ * @return 活动报名
+ */
+ RegistrationDO getRegistration(Long id);
+
+ /**
+ * 获得活动报名分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 活动报名分页
+ */
+// PageResult getRegistrationPage(RegistrationPageReqVO pageReqVO);
+
+
+ // 原方法返回PageResult,改为返回PageResult
+ PageResult getRegistrationPage(RegistrationPageReqVO pageReqVO);
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/registration/RegistrationServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/registration/RegistrationServiceImpl.java
new file mode 100644
index 0000000..b9706e8
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/registration/RegistrationServiceImpl.java
@@ -0,0 +1,110 @@
+package cn.iocoder.yudao.module.promotion.service.registration;
+
+import cn.iocoder.yudao.module.promotion.service.activityinfo.ActivityInfoService;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import cn.iocoder.yudao.module.promotion.controller.admin.registration.vo.*;
+import cn.iocoder.yudao.module.promotion.dal.dataobject.registration.RegistrationDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.promotion.dal.mysql.registration.RegistrationMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
+
+/**
+ * 活动报名 Service 实现类
+ *
+ * @author LCQ
+ */
+@Service
+@Validated
+public class RegistrationServiceImpl implements RegistrationService {
+
+ @Resource
+ private RegistrationMapper registrationMapper;
+
+ @Resource
+ private ActivityInfoService activityInfoService; // 新增注入
+
+
+ @Override
+ public Long createRegistration(RegistrationSaveReqVO createReqVO) {
+ // 插入
+ RegistrationDO registration = BeanUtils.toBean(createReqVO, RegistrationDO.class);
+ registrationMapper.insert(registration);
+ // 返回
+ return registration.getId();
+ }
+
+ @Override
+ public void updateRegistration(RegistrationSaveReqVO updateReqVO) {
+ // 校验存在
+ validateRegistrationExists(updateReqVO.getId());
+ // 更新
+ RegistrationDO updateObj = BeanUtils.toBean(updateReqVO, RegistrationDO.class);
+ registrationMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteRegistration(Long id) {
+ // 校验存在
+ validateRegistrationExists(id);
+ // 删除
+ registrationMapper.deleteById(id);
+ }
+
+ private void validateRegistrationExists(Long id) {
+ if (registrationMapper.selectById(id) == null) {
+ throw exception(REGISTRATION_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public RegistrationDO getRegistration(Long id) {
+ return registrationMapper.selectById(id);
+ }
+
+// @Override
+// public PageResult getRegistrationPage(RegistrationPageReqVO pageReqVO) {
+// return registrationMapper.selectPage(pageReqVO);
+// }
+
+ @Override
+ public PageResult getRegistrationPage(RegistrationPageReqVO pageReqVO) {
+ // 1. 查询原始DO分页数据
+ PageResult pageResult = registrationMapper.selectPage(pageReqVO);
+
+ // 2. 提取所有活动ID并查询对应标题
+ Set activityIds = pageResult.getList().stream()
+ .map(RegistrationDO::getActivityId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ Map activityTitleMap = activityInfoService.getActivityTitleMapByIds(activityIds); // 依赖注入ActivityInfoService
+
+ // 3. 转换DO到RespVO并填充活动名称
+ List respList = pageResult.getList().stream()
+ .map(registrationDO -> {
+ RegistrationRespVO respVO = BeanUtils.toBean(registrationDO, RegistrationRespVO.class);
+ // 填充活动名称
+ respVO.setActivityTitle(
+ activityTitleMap.get(registrationDO.getActivityId())
+ );
+ return respVO;
+ })
+ .collect(Collectors.toList());
+
+ // 4. 返回新的RespVO分页结果
+ return new PageResult<>(respList, pageResult.getTotal());
+ }
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/registration/RegistrationMapper.xml b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/registration/RegistrationMapper.xml
new file mode 100644
index 0000000..14f6e57
--- /dev/null
+++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/registration/RegistrationMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file