From c4a0a66f61e1ccfefb0793fba5a9b62ccb7818ae Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 22 Apr 2025 16:10:29 +0800
Subject: [PATCH] feat(mall): 重构活动模块接口和数据结构

---
 src/main/java/cc/mrbird/febs/mall/dto/ApiOperateVoteDto.java                         |    2 
 src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java                    |    2 
 src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java         |   39 -
 src/main/resources/mapper/modules/HappyActivityOptionMapper.xml                      |   45 ++
 src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java         |  341 +++++++++++++++++--
 src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java                         |    6 
 src/main/java/cc/mrbird/febs/mall/vo/ApiConnectListInPageVo.java                     |   24 +
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivityConnect.java                   |   22 +
 src/main/resources/mapper/modules/HappyActivityMapper.xml                            |   41 --
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java                 |   41 ++
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityConnectMapper.java             |   14 
 src/main/java/cc/mrbird/febs/mall/dto/ApiPayOrderDto.java                            |   27 +
 src/main/java/cc/mrbird/febs/mall/dto/ApiConnectSaveDto.java                         |   29 +
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java                     |   43 ++
 src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java                 |   44 ++
 src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java                         |    4 
 src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionListVo.java                    |    2 
 src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterUserDto.java                 |   24 +
 src/main/java/cc/mrbird/febs/mall/vo/ApiCategoryInfoVo.java                          |    2 
 src/main/java/cc/mrbird/febs/mall/dto/ApiCreateOrderDto.java                         |   26 +
 src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java |    4 
 src/main/java/cc/mrbird/febs/mall/dto/ApiActivityDto.java                            |    2 
 src/main/java/cc/mrbird/febs/mall/dto/ApiConnectListDto.java                         |   13 
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderItemMapper.java           |    8 
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderMapper.java               |    7 
 src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java                  |   22 +
 src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java                  |   28 +
 src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java                              |    2 
 src/main/resources/application-test.yml                                              |    7 
 src/main/java/cc/mrbird/febs/mall/dto/ApiActivityInfoDto.java                        |    2 
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java                          |    2 
 src/main/java/cc/mrbird/febs/mall/vo/ApiVoteRecordInPageVo.java                      |    2 
 src/main/java/cc/mrbird/febs/mall/dto/ApiVoteRecordInPageDto.java                    |    2 
 src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterActivityDto.java             |    5 
 src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java |    2 
 src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionVo.java                        |    5 
 src/main/java/cc/mrbird/febs/mall/dto/ApiOperateDoDto.java                           |    2 
 src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityOrderController.java    |   85 +++++
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java                    |    8 
 src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java                          |    2 
 40 files changed, 854 insertions(+), 134 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
index c4f4ba4..1bfced4 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
@@ -27,6 +27,27 @@
     VOTE_OPTION_STATE_AUDIT_REFUSE(2),
 
     /**
+     * 支付状态 0-待支付 1-支付成功 2-支付失败
+     */
+    PAY_STATE_NOT_PAY(0),
+    PAY_STATE_PAY_SUCCESS(1),
+    PAY_STATE_PAY_FAIL(2),
+
+    /**
+     * 支付方式 1-余额支付 2-微信支付 3-积分支付 0-无需支付
+     */
+    PAY_METHOD_BALANCE(1),
+    PAY_METHOD_WECHAT(2),
+    PAY_METHOD_INTEGRAL(3),
+    PAY_METHOD_NO_PAY(0),
+
+    /**
+     * 是否众筹 0-关闭 1-开启(开启代表收取参与费用)
+     */
+    ACTIVITY_CROWDFUNDING_STATE_CLOSE(0),
+    ACTIVITY_CROWDFUNDING_STATE_OPEN(1),
+
+    /**
      * 活动类型 1-普通活动 2-众筹活动 3-投票活动
      */
     ACTIVITY_TYPE_NORMAL(1),
@@ -43,6 +64,7 @@
      * 状态 0-未开启 1-已开启
      * 是否推荐到首页 0-不推荐 1-推荐
      * 删除标识 0-未删除 1-已删除
+     * 使用状态 0-待使用 1-已使用
      */
     DOWN(0),
     UP(1);
diff --git a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
index ca1b5e0..9afaae3 100644
--- a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
+++ b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
@@ -17,6 +17,8 @@
 
     private String wecharPaynotifyUrl;
 
+    private String wecharActivityPaynotifyUrl;
+
     private String wecharRechargePaynotifyUrl;
     //测试支付的开关,true:支付0.01元
     private Boolean debug;
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java
index 182db24..40eb8c7 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java
@@ -2,7 +2,7 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.service.HappyActivityCategoryService;
-import cc.mrbird.febs.mall.vo.api.activity.category.ApiCategoryInfoVo;
+import cc.mrbird.febs.mall.vo.ApiCategoryInfoVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
@@ -19,7 +19,7 @@
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/api/happyCategory")
-@Api(value = "ApiHappyActivityCategoryController", tags = "365活动")
+@Api(value = "ApiHappyActivityCategoryController", tags = "365活动分类")
 public class ApiHappyActivityCategoryController {
 
     private final HappyActivityCategoryService happyActivityCategoryService;
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java
index 0c1adc8..0d4f8a5 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java
@@ -2,10 +2,9 @@
 
 import cc.mrbird.febs.common.annotation.Limit;
 import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.service.HappyActivityService;
-import cc.mrbird.febs.mall.vo.api.activity.*;
-import cc.mrbird.febs.mall.vo.api.activity.follow.ApiOperateDoDto;
-import cc.mrbird.febs.mall.vo.api.activity.options.*;
+import cc.mrbird.febs.mall.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
@@ -20,7 +19,7 @@
 @RestController
 @RequiredArgsConstructor
 @RequestMapping(value = "/api/happyActivity")
-@Api(value = "ApiHappyActivityController", tags = "365活动分类")
+@Api(value = "ApiHappyActivityController", tags = "365活动")
 public class ApiHappyActivityController{
 
     private final HappyActivityService happyActivityService;
@@ -45,7 +44,15 @@
         return happyActivityService.activityInfo(dto);
     }
 
-    @ApiOperation(value = "投票活动选项列表", notes = "投票活动选项列表")
+    @ApiOperation(value = "点赞关注转发", notes = "点赞关注转发")
+    @PostMapping(value = "/operateDo")
+    @Limit(key = "operateDo", period = 60, count = 1, name = "点赞关注转发接口", prefix = "limit")
+    public FebsResponse operateDo(@RequestBody @Validated ApiOperateDoDto dto) {
+
+        return happyActivityService.operateDo(dto);
+    }
+
+    @ApiOperation(value = "投票活动-选项列表", notes = "投票活动-选项列表")
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiActivityOptionListVo.class)
     })
@@ -55,7 +62,7 @@
         return happyActivityService.voteOptionList(id);
     }
 
-    @ApiOperation(value = "投票活动选项详情", notes = "投票活动选项详情")
+    @ApiOperation(value = "投票活动-选项详情", notes = "投票活动-选项详情")
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiActivityOptionVo.class)
     })
@@ -65,15 +72,7 @@
         return happyActivityService.voteOption(id);
     }
 
-    @ApiOperation(value = "点赞关注转发", notes = "点赞关注转发")
-    @PostMapping(value = "/operateDo")
-    @Limit(key = "operateDo", period = 60, count = 1, name = "点赞关注转发接口", prefix = "limit")
-    public FebsResponse operateDo(@RequestBody @Validated ApiOperateDoDto dto) {
-
-        return happyActivityService.operateDo(dto);
-    }
-
-    @ApiOperation(value = "投票活动选项投票", notes = "投票活动选项投票")
+    @ApiOperation(value = "投票活动-选项投票", notes = "投票活动-选项投票")
     @PostMapping(value = "/operateVote")
     @Limit(key = "operateVote", period = 60, count = 1, name = "投票接口", prefix = "limit")
     public FebsResponse operateVote(@RequestBody @Validated ApiOperateVoteDto dto) {
@@ -81,7 +80,7 @@
         return happyActivityService.operateVote(dto);
     }
 
-    @ApiOperation(value = "投票活动选项投票记录", notes = "投票活动选项投票记录")
+    @ApiOperation(value = "投票活动-选项投票记录", notes = "投票活动-选项投票记录")
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiVoteRecordInPageVo.class)
     })
@@ -89,14 +88,6 @@
     public FebsResponse voteRecordInPage(@RequestBody @Validated ApiVoteRecordInPageDto dto) {
 
         return happyActivityService.voteRecordInPage(dto);
-    }
-
-    @ApiOperation(value = "活动报名", notes = "活动报名")
-    @PostMapping(value = "/operateRegister")
-    @Limit(key = "operateRegister", period = 60, count = 1, name = "活动报名接口", prefix = "limit")
-    public FebsResponse operateRegister(@RequestBody @Validated ApiOperateRegisterActivityDto dto) {
-
-        return happyActivityService.operateRegister(dto);
     }
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityOrderController.java
new file mode 100644
index 0000000..771a30a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityOrderController.java
@@ -0,0 +1,85 @@
+package cc.mrbird.febs.mall.controller;
+
+import cc.mrbird.febs.common.annotation.Limit;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.*;
+import cc.mrbird.febs.mall.service.HappyActivityService;
+import cc.mrbird.febs.mall.vo.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/happyActivityOrder")
+@Api(value = "ApiHappyActivityOrderController", tags = "365活动订单")
+public class ApiHappyActivityOrderController {
+
+    private final HappyActivityService happyActivityService;
+
+    @ApiOperation(value = "活动报名-新增报名人", notes = "活动报名-新增报名人")
+    @PostMapping(value = "/addConnect")
+    @Limit(key = "addConnect", period = 60, count = 1, name = "活动报名-新增报名人", prefix = "limit")
+    public FebsResponse addConnect(@RequestBody @Validated ApiOperateRegisterUserDto dto) {
+
+        return happyActivityService.addConnect(dto);
+    }
+
+    @ApiOperation(value = "活动报名-报名人列表", notes = "活动报名-报名人列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiConnectListInPageVo.class)
+    })
+    @PostMapping(value = "/connectList")
+    public FebsResponse connectList(@RequestBody @Validated ApiConnectListDto dto) {
+
+        return happyActivityService.connectList(dto);
+    }
+
+    @ApiOperation(value = "活动报名-报名人详情", notes = "活动报名-报名人详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiConnectListInPageVo.class)
+    })
+    @GetMapping(value = "/connectInfo/{id}")
+    public FebsResponse connectInfo(@PathVariable("id") Long id) {
+
+        return happyActivityService.connectInfo(id);
+    }
+
+    @ApiOperation(value = "活动报名-报名人删除", notes = "活动报名-报名人删除")
+    @GetMapping(value = "/connectDel/{id}")
+    public FebsResponse connectDel(@PathVariable("id") Long id) {
+
+        return happyActivityService.connectDel(id);
+    }
+
+    @ApiOperation(value = "活动报名-报名人保存", notes = "活动报名-报名人保存")
+    @PostMapping(value = "/connectSave")
+    public FebsResponse connectSave(@RequestBody @Validated ApiConnectSaveDto dto) {
+
+        return happyActivityService.connectSave(dto);
+    }
+
+    @ApiOperation(value = "活动报名-报名-创建订单", notes = "活动报名-报名-创建订单")
+    @PostMapping(value = "/createOrder")
+    @Limit(key = "createOrder", period = 60, count = 1, name = "创建订单", prefix = "limit")
+    public FebsResponse createOrder(@RequestBody @Validated ApiCreateOrderDto dto) {
+
+        return happyActivityService.createOrder(dto);
+    }
+
+    @ApiOperation(value = "活动报名-报名-支付订单", notes = "活动报名-报名-支付订单")
+    @PostMapping(value = "/payOrder")
+    @Limit(key = "payOrder", period = 60, count = 1, name = "支付订单", prefix = "limit")
+    public FebsResponse payOrder(@RequestBody @Validated ApiPayOrderDto dto) {
+
+        return happyActivityService.payOrder(dto);
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiActivityDto.java
similarity index 91%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java
rename to src/main/java/cc/mrbird/febs/mall/dto/ApiActivityDto.java
index 1622193..65e9967 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiActivityDto.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiActivityInfoDto.java
similarity index 94%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java
rename to src/main/java/cc/mrbird/febs/mall/dto/ApiActivityInfoDto.java
index 80b14e8..7fa933f 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiActivityInfoDto.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiConnectListDto.java
similarity index 60%
copy from src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
copy to src/main/java/cc/mrbird/febs/mall/dto/ApiConnectListDto.java
index ba2864f..d8cc295 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiConnectListDto.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.options;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -7,9 +7,8 @@
 import javax.validation.constraints.NotNull;
 
 @Data
-@ApiModel(value = "ApiVoteRecordInPageDto", description = "参数")
-public class ApiVoteRecordInPageDto {
-
+@ApiModel(value = "ApiConnectListDto", description = "参数")
+public class ApiConnectListDto {
 
     @NotNull(message = "页码不能为空")
     @ApiModelProperty(value = "页码", example = "1")
@@ -19,8 +18,6 @@
     @ApiModelProperty(value = "每页数量", example = "10")
     private Integer pageSize;
 
-    @NotNull(message = "选项ID不能为空")
-    @ApiModelProperty(value = "选项ID")
-    private Long sourceOptionId;
-
+    @ApiModelProperty(hidden = true)
+    private Long memberId;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiConnectSaveDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiConnectSaveDto.java
new file mode 100644
index 0000000..19742b7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiConnectSaveDto.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiConnectSaveDto", description = "参数")
+public class ApiConnectSaveDto {
+
+    @NotNull(message = "ID不能为空")
+    @ApiModelProperty(value = "ID", example = "丽丽")
+    private Long id;
+
+    @NotBlank(message = "姓名不可为空")
+    @ApiModelProperty(value = "姓名", example = "丽丽")
+    private String name;
+
+    @NotBlank(message = "电话不可为空")
+    @ApiModelProperty(value = "电话", example = "丽丽")
+    private String phone;
+
+    @NotBlank(message = "地址不可为空")
+    @ApiModelProperty(value = "地址", example = "丽丽")
+    private String address;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiCreateOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiCreateOrderDto.java
new file mode 100644
index 0000000..be8e80b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiCreateOrderDto.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+@ApiModel(value = "ApiCreateOrderDto", description = "参数")
+public class ApiCreateOrderDto {
+
+    @NotNull(message = "活动ID不能为空")
+    @ApiModelProperty(value = "活动ID", example = "1")
+    private Long activityId;
+
+    @NotNull(message = "数量不能为空")
+    @ApiModelProperty(value = "数量", example = "1")
+    private Integer numCnt;
+
+    @NotNull(message = "报名人不能为空")
+    @ApiModelProperty(value = "报名人ID列表", example = "1")
+    private List<Long> connectIds;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateDoDto.java
similarity index 93%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java
rename to src/main/java/cc/mrbird/febs/mall/dto/ApiOperateDoDto.java
index 37ab08b..af863f9 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateDoDto.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.follow;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterActivityDto.java
similarity index 93%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java
rename to src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterActivityDto.java
index 50e21b3..ebe16c1 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterActivityDto.java
@@ -1,16 +1,17 @@
-package cc.mrbird.febs.mall.vo.api.activity;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 @Data
 @ApiModel(value = "ApiOperateRegisterActivityDto", description = "参数")
 public class ApiOperateRegisterActivityDto {
 
-    @NotBlank(message = "活动ID不可为空")
+    @NotNull(message = "活动ID不可为空")
     @ApiModelProperty(value = "活动ID", example = "1")
     private Long activityId;//投票活动ID
 
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterUserDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterUserDto.java
new file mode 100644
index 0000000..2324ff1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateRegisterUserDto.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiOperateRegisterUserDto", description = "参数")
+public class ApiOperateRegisterUserDto {
+
+    @NotBlank(message = "姓名不可为空")
+    @ApiModelProperty(value = "姓名", example = "丽丽")
+    private String name;
+
+    @NotBlank(message = "电话不可为空")
+    @ApiModelProperty(value = "电话", example = "丽丽")
+    private String phone;
+
+    @NotBlank(message = "地址不可为空")
+    @ApiModelProperty(value = "地址", example = "丽丽")
+    private String address;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateVoteDto.java
similarity index 92%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java
rename to src/main/java/cc/mrbird/febs/mall/dto/ApiOperateVoteDto.java
index 3402938..b91c6bd 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiOperateVoteDto.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.options;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiPayOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiPayOrderDto.java
new file mode 100644
index 0000000..a40652c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiPayOrderDto.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiPayOrderDto", description = "参数")
+public class ApiPayOrderDto {
+
+
+    @NotNull(message = "订单ID不能为空")
+    @ApiModelProperty(value = "订单ID", example = "1")
+    private Long orderId;
+
+    @NotNull(message = "支付方式不能为空")
+    @ApiModelProperty(value = "支付方式 1-余额支付 2-微信支付 3-积分支付 0-无需支付", example = "1")
+    private Integer payType;
+
+    @NotBlank(message = "支付密码不能为空")
+    @ApiModelProperty(value = "支付密码", example = "如果选择余额支付需要输入")
+    private String tradePwd;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiVoteRecordInPageDto.java
similarity index 92%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
rename to src/main/java/cc/mrbird/febs/mall/dto/ApiVoteRecordInPageDto.java
index ba2864f..2b7a2c0 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiVoteRecordInPageDto.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.options;
+package cc.mrbird.febs.mall.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java
index 83dd49f..da8abe5 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java
@@ -35,6 +35,7 @@
      `hot_state` int(11) DEFAULT '0' COMMENT '是否推荐到首页 0-不推荐 1-推荐',
      `back_img` varchar(500) DEFAULT NULL COMMENT '背景图片',
      `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除',
+     `vote_cnt` int(11) DEFAULT NULL COMMENT '投票数量',
      */
     private Long categoryId;
     private String code;
@@ -59,6 +60,7 @@
     private Integer hotState;
     private String backImg;
     private Integer deleteFlag;
+    private Integer voteCnt;
 
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityConnect.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityConnect.java
new file mode 100644
index 0000000..88a8faa
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityConnect.java
@@ -0,0 +1,22 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("happy_activity_connect")
+public class HappyActivityConnect extends BaseEntity {
+    /**
+     *
+     `member_id` bigint(20) DEFAULT NULL COMMENT '用户ID',
+     `name` varchar(100) DEFAULT NULL COMMENT '姓名',
+     `phone` varchar(100) DEFAULT NULL COMMENT '电话',
+     `address` varchar(200) DEFAULT NULL COMMENT '地址',
+     */
+
+    private Long memberId;
+    private String name;
+    private String phone;
+    private String address;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java
new file mode 100644
index 0000000..c815c20
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java
@@ -0,0 +1,43 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("happy_activity_order")
+public class HappyActivityOrder extends BaseEntity {
+    /**
+     *
+     `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+     `member_id` bigint(20) DEFAULT NULL,
+     `activity_id` bigint(20) DEFAULT NULL COMMENT '活动ID',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '单价',
+     `num_cnt` int(11) DEFAULT NULL COMMENT '数量',
+     `amount` decimal(20,2) DEFAULT NULL COMMENT '支付总金额',
+     `pay_state` int(11) DEFAULT NULL COMMENT '支付状态 0-待支付 1-支付成功 2-支付失败',
+     `pay_type` int(11) DEFAULT NULL COMMENT '支付方式 1-余额支付 2-微信支付 3-积分支付',
+     `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除',
+     `order_no` varchar(32) DEFAULT NULL COMMENT '订单号',
+     `pay_order_no` text COMMENT '支付订单号',
+     `wx_order_no` varchar(100) DEFAULT NULL COMMENT '微信订单编号',
+     */
+
+
+    private Long memberId;
+    private Long activityId;
+    private BigDecimal price;
+    private Integer numCnt;
+    private BigDecimal amount;
+    private Integer payState;
+    private Integer payType;
+    private Date payTime;
+    private Integer deleteFlag;
+    private String orderNo;
+    private String payOrderNo;
+    private String wxOrderNo;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java
new file mode 100644
index 0000000..6fa05ea
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java
@@ -0,0 +1,41 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("happy_activity_order_item")
+public class HappyActivityOrderItem extends BaseEntity {
+    /**
+     *
+     `member_id` bigint(20) DEFAULT NULL,
+     `activity_id` bigint(20) DEFAULT NULL COMMENT '活动ID',
+     `order_id` bigint(20) DEFAULT NULL COMMENT '订单ID',
+     `connect_id` bigint(20) DEFAULT NULL COMMENT '联系人ID',
+     `code` varchar(100) DEFAULT NULL COMMENT '唯一票号',
+     `price` decimal(20,2) DEFAULT NULL COMMENT '单价',
+     `name` varchar(100) DEFAULT NULL COMMENT '姓名',
+     `phone` varchar(100) DEFAULT NULL COMMENT '电话',
+     `address` varchar(500) DEFAULT NULL COMMENT '地址',
+     `state` int(11) DEFAULT '0' COMMENT '使用状态 0-待使用 1-已使用',
+     `transfer_item_id` bigint(20) DEFAULT NULL COMMENT '转赠来源ID(接收转赠之后,更新成新增的订单子表ID)',
+     `transfer_state` int(11) DEFAULT '0' COMMENT '是否转赠 0-未转赠 1-已转赠',
+     `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除',
+     */
+    private Long memberId;
+    private Long activityId;
+    private Long orderId;
+    private Long connectId;
+    private String code;
+    private BigDecimal price;
+    private String name;
+    private String phone;
+    private String address;
+    private Integer state;
+    private Long transferItemId;
+    private Integer transferState;
+    private Integer deleteFlag;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityConnectMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityConnectMapper.java
new file mode 100644
index 0000000..5053e1c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityConnectMapper.java
@@ -0,0 +1,14 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.dto.ApiConnectListDto;
+import cc.mrbird.febs.mall.entity.HappyActivityConnect;
+import cc.mrbird.febs.mall.vo.ApiConnectListInPageVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+public interface HappyActivityConnectMapper extends BaseMapper<HappyActivityConnect> {
+
+    Page<ApiConnectListInPageVo> selectConnectListPage(Page<ApiConnectListInPageVo> page, @Param("record")ApiConnectListDto dto);
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
index 34e8702..440c582 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -1,10 +1,10 @@
 package cc.mrbird.febs.mall.mapper;
 
 import cc.mrbird.febs.mall.entity.HappyActivity;
-import cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoDto;
-import cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoVo;
-import cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageDto;
-import cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageVo;
+import cc.mrbird.febs.mall.dto.ApiActivityInfoDto;
+import cc.mrbird.febs.mall.vo.ApiActivityInfoVo;
+import cc.mrbird.febs.mall.dto.ApiVoteRecordInPageDto;
+import cc.mrbird.febs.mall.vo.ApiVoteRecordInPageVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderItemMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderItemMapper.java
new file mode 100644
index 0000000..6ee9faf
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderItemMapper.java
@@ -0,0 +1,8 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.HappyActivityOrder;
+import cc.mrbird.febs.mall.entity.HappyActivityOrderItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface HappyActivityOrderItemMapper extends BaseMapper<HappyActivityOrderItem> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderMapper.java
new file mode 100644
index 0000000..36d9e72
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOrderMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.HappyActivityOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface HappyActivityOrderMapper extends BaseMapper<HappyActivityOrder> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
index 78dfe73..0460af0 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -1,13 +1,11 @@
 package cc.mrbird.febs.mall.service;
 
 import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.entity.HappyActivity;
-import cc.mrbird.febs.mall.vo.api.activity.ApiActivityDto;
-import cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoDto;
-import cc.mrbird.febs.mall.vo.api.activity.ApiOperateRegisterActivityDto;
-import cc.mrbird.febs.mall.vo.api.activity.follow.ApiOperateDoDto;
-import cc.mrbird.febs.mall.vo.api.activity.options.ApiOperateVoteDto;
-import cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageDto;
+import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
+import cc.mrbird.febs.mall.dto.ApiOperateVoteDto;
+import cc.mrbird.febs.mall.dto.ApiVoteRecordInPageDto;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 public interface HappyActivityService extends IService<HappyActivity> {
@@ -31,4 +29,22 @@
     FebsResponse voteRecordInPage(ApiVoteRecordInPageDto dto);
 
     FebsResponse operateRegister(ApiOperateRegisterActivityDto dto);
+
+    FebsResponse addConnect(ApiOperateRegisterUserDto dto);
+
+    FebsResponse connectList(ApiConnectListDto dto);
+
+    FebsResponse connectInfo(Long id);
+
+    FebsResponse connectDel(Long id);
+
+    FebsResponse connectSave(ApiConnectSaveDto dto);
+
+    FebsResponse createOrder(ApiCreateOrderDto dto);
+
+    FebsResponse payOrder(ApiPayOrderDto dto);
+
+    void addLikeCnt(Long sourceOptionId);
+
+    void substructJoinCnt(Long activityId,Integer cnt);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java
index 84246f9..13e5f6f 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java
@@ -5,7 +5,7 @@
 import cc.mrbird.febs.mall.entity.HappyActivityCategory;
 import cc.mrbird.febs.mall.mapper.HappyActivityCategoryMapper;
 import cc.mrbird.febs.mall.service.HappyActivityCategoryService;
-import cc.mrbird.febs.mall.vo.api.activity.category.ApiCategoryInfoVo;
+import cc.mrbird.febs.mall.vo.ApiCategoryInfoVo;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
index b088dd0..773d5c5 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -1,25 +1,28 @@
 package cc.mrbird.febs.mall.service.impl;
 
 import cc.mrbird.febs.common.entity.FebsResponse;
-import cc.mrbird.febs.common.enumerates.StateUpDownEnum;
+import cc.mrbird.febs.common.enumerates.*;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
-import cc.mrbird.febs.mall.entity.HappyActivity;
-import cc.mrbird.febs.mall.entity.HappyActivityOption;
-import cc.mrbird.febs.mall.entity.HappyFollow;
-import cc.mrbird.febs.mall.entity.MallMember;
-import cc.mrbird.febs.mall.mapper.HappyActivityMapper;
-import cc.mrbird.febs.mall.mapper.HappyActivityOptionMapper;
-import cc.mrbird.febs.mall.mapper.HappyFollowMapper;
-import cc.mrbird.febs.mall.mapper.MallMemberMapper;
+import cc.mrbird.febs.common.utils.MallUtils;
+import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.mall.dto.*;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.*;
 import cc.mrbird.febs.mall.service.HappyActivityService;
-import cc.mrbird.febs.mall.vo.api.activity.*;
-import cc.mrbird.febs.mall.vo.api.activity.follow.ApiOperateDoDto;
-import cc.mrbird.febs.mall.vo.api.activity.options.*;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
+import cc.mrbird.febs.mall.vo.*;
+import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
+import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
+import cc.mrbird.febs.pay.service.IXcxPayService;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -28,6 +31,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -40,6 +45,11 @@
     private final HappyFollowMapper happyFollowMapper;
     private final MallMemberMapper mallMemberMapper;
     private final HappyActivityOptionMapper happyActivityOptionMapper;
+    private final HappyActivityConnectMapper happyActivityConnectMapper;
+    private final HappyActivityOrderMapper happyActivityOrderMapper;
+    private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
+    private final IXcxPayService iXcxPayService;
+    private final IApiMallMemberWalletService iApiMallMemberWalletService;
 
     @Override
     public FebsResponse activityList(ApiActivityInfoDto dto) {
@@ -189,6 +199,7 @@
                         throw new FebsException("选项ID不能为空");
                     }
                     this.operateDoVote(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, sourceOptionId, type);
+                    this.addLikeCnt(sourceOptionId);
                 } else {
                     this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, type);
                 }
@@ -235,6 +246,18 @@
         Integer sourceType = dto.getSourceType();
         Integer type = StateUpDownEnum.VOTE.getCode();
 
+        HappyActivity happyActivity = this.baseMapper.selectById(sourceId);
+        if(StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() != happyActivity.getType()){
+            throw new FebsException("当前活动无法投票");
+        }
+
+        HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(sourceOptionId);
+        if (happyActivityOption == null) {
+            throw new FebsException("投票对象不存在");
+        }
+        if (StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode() != happyActivityOption.getState()) {
+            throw new FebsException("请重新选择投票对象");
+        }
         //验证当前登录人员今日是否已经投票
         List<HappyFollow> happyFollows = happyFollowMapper.selectList(
                 new LambdaQueryWrapper<HappyFollow>()
@@ -244,33 +267,11 @@
                         .eq(HappyFollow::getType, type)
                         .gt(HappyFollow::getCreatedTime, DateUtil.beginOfDay(new Date()))
         );
-        if (CollUtil.isNotEmpty(happyFollows)){
+        if (CollUtil.isNotEmpty(happyFollows) && happyFollows.size() >= happyActivity.getVoteCnt()){
             throw new FebsException("今日已经投票");
         }
-
-        if (StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode() == sourceType) {
-            HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(sourceOptionId);
-            if (happyActivityOption == null) {
-                throw new FebsException("投票对象不存在");
-            }
-            if (StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode() != happyActivityOption.getState()) {
-                throw new FebsException("请重新选择投票对象");
-            }
-
-            Integer likesCnt = happyActivityOption.getLikesCnt();
-            if (likesCnt == null) {
-                likesCnt = 0;
-            }
-            likesCnt += 1;
-            happyActivityOption.setLikesCnt(likesCnt);
-
-            boolean updateSuccess = happyActivityOptionMapper.updateById(happyActivityOption) > 0;
-            if (!updateSuccess) {
-                throw new FebsException("更新票数失败");
-            }
-
-            this.operateDoVote(memberId, sourceType, sourceId, sourceOptionId, type);
-        }
+        this.operateDoVote(memberId, sourceType, sourceId, sourceOptionId, type);
+        this.addLikeCnt(sourceOptionId);
         return new FebsResponse().success();
     }
 
@@ -307,9 +308,275 @@
 
     @Override
     public FebsResponse operateRegister(ApiOperateRegisterActivityDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
         return null;
     }
 
+    @Override
+    public FebsResponse addConnect(ApiOperateRegisterUserDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        HappyActivityConnect happyActivityConnect = new HappyActivityConnect();
+        happyActivityConnect.setMemberId(memberId);
+        happyActivityConnect.setName(dto.getName());
+        happyActivityConnect.setPhone(dto.getPhone());
+        happyActivityConnect.setAddress(dto.getAddress());
+        happyActivityConnectMapper.insert(happyActivityConnect);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public FebsResponse connectList(ApiConnectListDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        dto.setMemberId(memberId);
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiConnectListInPageVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        Page<ApiConnectListInPageVo> voteRecordInPage = happyActivityConnectMapper.selectConnectListPage(page, dto);
+        return new FebsResponse().success().data(voteRecordInPage);
+    }
+
+    @Override
+    public FebsResponse connectInfo(Long id) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        HappyActivityConnect happyActivityConnect = happyActivityConnectMapper.selectById(id);
+        ApiConnectListInPageVo apiConnectListInPageVo = new ApiConnectListInPageVo();
+        BeanUtil.copyProperties(happyActivityConnect,apiConnectListInPageVo);
+        return new FebsResponse().success().data(apiConnectListInPageVo);
+    }
+
+    @Override
+    public FebsResponse connectDel(Long id) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        happyActivityConnectMapper.deleteById(id);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public FebsResponse connectSave(ApiConnectSaveDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        Long id = dto.getId();
+        HappyActivityConnect happyActivityConnect = happyActivityConnectMapper.selectById(id);
+        if (happyActivityConnect == null) {
+            throw new FebsException("记录不存在");
+        }
+        happyActivityConnect.setName(dto.getName());
+        happyActivityConnect.setPhone(dto.getPhone());
+        happyActivityConnect.setAddress(dto.getAddress());
+        happyActivityConnectMapper.updateById(happyActivityConnect);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public FebsResponse createOrder(ApiCreateOrderDto dto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        if(CollUtil.isEmpty(dto.getConnectIds())){
+            throw new FebsException("请选择报名人");
+        }
+
+        List<Long> connectIds = dto.getConnectIds();
+        Integer numCnt = dto.getNumCnt();
+        if(numCnt != connectIds.size()){
+            throw new FebsException("报名人数与票的数量不匹配");
+        }
+
+        Long activityId = dto.getActivityId();
+        HappyActivity happyActivity = this.baseMapper.selectById(activityId);
+        if (ObjectUtil.isEmpty(happyActivity)) {
+            throw new FebsException("活动不存在");
+        }
+
+        Integer joinCnt = happyActivity.getJoinCnt();
+        if(joinCnt < numCnt){
+            throw new FebsException("报名额度剩下"+joinCnt+",请减少报名人数");
+        }
+        //支付总金额
+        BigDecimal amount = happyActivity.getPayAmount().multiply(new BigDecimal(dto.getNumCnt())).setScale(2, RoundingMode.DOWN);
+        if(amount.compareTo(BigDecimal.ZERO) < 0){
+            throw new FebsException("支付金额错误");
+        }
+        HappyActivityOrder happyActivityOrder = new HappyActivityOrder();
+        happyActivityOrder.setOrderNo(MallUtils.getOrderNum());
+        happyActivityOrder.setMemberId(memberId);
+        happyActivityOrder.setActivityId(dto.getActivityId());
+        happyActivityOrder.setPrice(happyActivity.getPayAmount());
+        happyActivityOrder.setNumCnt(dto.getNumCnt());
+        happyActivityOrder.setAmount(amount);
+        happyActivityOrder.setPayState(StateUpDownEnum.PAY_STATE_NOT_PAY.getCode());
+        happyActivityOrderMapper.insert(happyActivityOrder);
+
+        for(Long connectId : connectIds){
+            HappyActivityConnect happyActivityConnect = happyActivityConnectMapper.selectById(connectId);
+            HappyActivityOrderItem happyActivityOrderItem = new HappyActivityOrderItem();
+            happyActivityOrderItem.setMemberId(memberId);
+            happyActivityOrderItem.setActivityId(dto.getActivityId());
+            happyActivityOrderItem.setOrderId(happyActivityOrder.getId());
+            happyActivityOrderItem.setConnectId(connectId);
+            happyActivityOrderItem.setPrice(happyActivity.getPayAmount());
+
+            happyActivityOrderItem.setName(happyActivityConnect.getName());
+            happyActivityOrderItem.setPhone(happyActivityConnect.getPhone());
+            happyActivityOrderItem.setAddress(happyActivityConnect.getAddress());
+            happyActivityOrderItem.setState(StateUpDownEnum.DOWN.getCode());
+            happyActivityOrderItemMapper.insert(happyActivityOrderItem);
+        }
+
+        this.substructJoinCnt(activityId, happyActivityOrder.getNumCnt());
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("orderId",happyActivityOrder.getId());
+        stringObjectHashMap.put("amount",amount);
+
+        return new FebsResponse().success().data(stringObjectHashMap);
+    }
+
+    /**
+     * 支付订单函数,根据传入的支付订单数据对象处理不同支付类型的订单支付逻辑。
+     *
+     * @param dto 包含支付订单相关信息的数据传输对象,包括订单ID和支付类型等信息。
+     *            - orderId: 订单ID,用于查询订单信息。
+     *            - payType: 支付类型,决定支付逻辑的分支。
+     *            - tradePwd: 交易密码(可选),用于余额或积分支付时验证。
+     * @return FebsResponse 返回支付结果的响应对象,包含支付状态、订单信息等数据。
+     *         - orderInfo: 支付结果信息,可能是预支付ID或其他支付相关数据。
+     *         - orderNo: 订单编号。
+     *         - orderId: 订单ID。
+     *         - wxResultStr: 微信支付相关的结果字符串(仅在微信支付时返回)。
+     * @throws FebsException 如果订单不存在、已支付、支付失败或支付类型不支持,则抛出异常。
+     */
+    @Override
+    public FebsResponse payOrder(ApiPayOrderDto dto) {
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        Long orderId = dto.getOrderId();
+        Integer payType = dto.getPayType();
+
+        // 查询订单信息,确保订单存在且未支付
+        HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(orderId);
+        if (ObjectUtil.isEmpty(happyActivityOrder)) {
+            throw new FebsException("订单不存在");
+        }
+        if (happyActivityOrder.getPayState() == StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode()) {
+            throw new FebsException("订单已支付");
+        }
+
+        String payResultStr = "";
+        String wxResultStr = "";
+
+        try {
+            // 根据支付类型处理不同的支付逻辑
+            if (StateUpDownEnum.PAY_METHOD_NO_PAY.getCode() == payType) {
+                // 处理无需支付的订单逻辑
+                processNoPayOrder(happyActivityOrder, orderId);
+            } else if (StateUpDownEnum.PAY_METHOD_WECHAT.getCode() == payType) {
+                // 处理微信支付逻辑,生成支付请求数据并更新订单状态
+                BrandWCPayRequestData brandWCPayRequestData = iXcxPayService.startPaymentActivity(happyActivityOrder);
+                wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData);
+                payResultStr = brandWCPayRequestData.getPrepay_id();
+                updateOrderState(happyActivityOrder, payType, StateUpDownEnum.PAY_STATE_NOT_PAY.getCode());
+            } else if (StateUpDownEnum.PAY_METHOD_BALANCE.getCode() == payType ||
+                       StateUpDownEnum.PAY_METHOD_INTEGRAL.getCode() == payType) {
+                // 处理余额或积分支付逻辑,验证交易密码并完成支付
+                String payMethod = StateUpDownEnum.PAY_METHOD_BALANCE.getCode() == payType ? "balance" : "prizeScore";
+                payResultStr = balancePay(happyActivityOrder, dto.getTradePwd(), payMethod);
+                processPaidOrder(happyActivityOrder, orderId, payType);
+            } else {
+                // 如果支付类型不支持,抛出异常
+                throw new FebsException("不支持的支付类型");
+            }
+        } catch (Exception e) {
+            // 捕获支付过程中的异常,记录日志并抛出自定义异常
+            log.error("支付失败,订单ID:{},支付类型:{}", orderId, payType, e);
+            throw new FebsException("支付失败:" + e.getMessage());
+        }
+
+        // todo 支付失败要把对应的人数加回来
+
+        // 构造返回结果,包含支付相关信息
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderInfo", payResultStr);
+        map.put("orderNo", happyActivityOrder.getOrderNo());
+        map.put("orderId", happyActivityOrder.getId());
+        map.put("wxResultStr", wxResultStr);
+
+        return new FebsResponse().success().data(map).message("支付成功");
+    }
+
+
+    @Override
+    public void addLikeCnt(Long sourceOptionId) {
+        HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(sourceOptionId);
+        happyActivityOption.setLikesCnt(happyActivityOption.getLikesCnt() + 1);
+        happyActivityOptionMapper.updateById(happyActivityOption);
+    }
+
+    @Override
+    public void substructJoinCnt(Long activityId, Integer numCnt) {
+        HappyActivity happyActivity = this.baseMapper.selectById(activityId);
+        if(ObjectUtil.isNotEmpty(happyActivity)){
+            happyActivity.setJoinCnt(happyActivity.getJoinCnt() -numCnt);
+            this.baseMapper.updateById(happyActivity);
+        }
+    }
+
+    // 处理未支付订单
+    private void processNoPayOrder(HappyActivityOrder order, Long orderId) {
+        updateOrderState(order, StateUpDownEnum.PAY_METHOD_NO_PAY.getCode(), StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode());
+        generateOrderItemCodes(orderId);
+    }
+
+    // 处理已支付订单
+    private void processPaidOrder(HappyActivityOrder order, Long orderId, Integer payType) {
+        updateOrderState(order, payType, StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode());
+        generateOrderItemCodes(orderId);
+    }
+
+    // 更新订单状态
+    private void updateOrderState(HappyActivityOrder order, Integer payType, Integer payState) {
+        order.setPayState(payState);
+        order.setPayType(payType);
+        if (payState == StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode()) {
+            order.setPayTime(new Date());
+        }
+        happyActivityOrderMapper.updateById(order);
+    }
+
+    // 批量生成订单项编码
+    private void generateOrderItemCodes(Long orderId) {
+        List<HappyActivityOrderItem> items = happyActivityOrderItemMapper.selectList(
+            new LambdaQueryWrapper<HappyActivityOrderItem>()
+                .eq(HappyActivityOrderItem::getOrderId, orderId)
+        );
+        if (CollUtil.isNotEmpty(items)) {
+            for (HappyActivityOrderItem item : items) {
+                String code = ShareCodeUtil.toSerialCode(item.getOrderId()) + MallUtils.getRandomNum(8);
+                item.setCode(code);
+                happyActivityOrderItemMapper.updateById(item);
+            }
+        }
+    }
+
+
+    private String balancePay(HappyActivityOrder happyActivityOrder, String tradePwd, String field) {
+        if (StrUtil.isBlank(tradePwd)) {
+            throw new FebsException("支付密码错误");
+        }
+
+        MallMember mallMember = mallMemberMapper.selectById(happyActivityOrder.getMemberId());
+        if (StrUtil.isBlank(mallMember.getTradePassword())) {
+            throw new FebsException("未设置支付密码");
+        }
+
+        if (!SecureUtil.md5(tradePwd).equals(mallMember.getTradePassword())) {
+            throw new FebsException("支付密码错误");
+        }
+
+        int reduce = iApiMallMemberWalletService.reduce(happyActivityOrder.getAmount(), mallMember.getId(), field);
+        if (reduce == 2) {
+            throw new FebsException("余额不足");
+        }
+        return happyActivityOrder.getOrderNo();
+    }
+
+
     public static void main(String[] args) {
         Date date = new Date();
         //获取今日的凌晨的时间
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java
similarity index 95%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java
rename to src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java
index c2e531a..5ef7ba8 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity;
+package cc.mrbird.febs.mall.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionListVo.java
similarity index 91%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java
rename to src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionListVo.java
index dce99ba..fa07419 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionListVo.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.options;
+package cc.mrbird.febs.mall.vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionVo.java
similarity index 90%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java
rename to src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionVo.java
index 991d30c..9f9d7e3 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityOptionVo.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.options;
+package cc.mrbird.febs.mall.vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -40,4 +40,7 @@
 
     @ApiModelProperty(value = "是否签约mcn机构 0否 1是")
     private Integer mcnState;
+
+    @ApiModelProperty(value = "投票数量")
+    private Integer voteCnt;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java
similarity index 97%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java
rename to src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java
index 5decd94..056d4c8 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity;
+package cc.mrbird.febs.mall.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiCategoryInfoVo.java
similarity index 91%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java
rename to src/main/java/cc/mrbird/febs/mall/vo/ApiCategoryInfoVo.java
index 121dcbe..a6ba03a 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiCategoryInfoVo.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.category;
+package cc.mrbird.febs.mall.vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiConnectListInPageVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiConnectListInPageVo.java
new file mode 100644
index 0000000..d3a4cd8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiConnectListInPageVo.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.mall.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiConnectListInPageVo", description = "参数")
+public class ApiConnectListInPageVo {
+
+    @ApiModelProperty(value = "ID", example = "丽丽")
+    private Long id;
+
+    @ApiModelProperty(value = "姓名", example = "丽丽")
+    private String name;
+
+    @ApiModelProperty(value = "电话", example = "丽丽")
+    private String phone;
+
+    @ApiModelProperty(value = "地址", example = "丽丽")
+    private String address;
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiVoteRecordInPageVo.java
similarity index 92%
rename from src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java
rename to src/main/java/cc/mrbird/febs/mall/vo/ApiVoteRecordInPageVo.java
index dc1a495..2885bef 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiVoteRecordInPageVo.java
@@ -1,4 +1,4 @@
-package cc.mrbird.febs.mall.vo.api.activity.options;
+package cc.mrbird.febs.mall.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
index fe0ec26..dd7fe9c 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto;
 import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto;
+import cc.mrbird.febs.mall.entity.HappyActivityOrder;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
 import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
 import cc.mrbird.febs.pay.model.MemberWithdrawalDto;
@@ -21,6 +22,11 @@
     BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception;
 
     /**
+     * 发起支付(创建预付订单)
+     */
+    BrandWCPayRequestData startPaymentActivity(HappyActivityOrder dto) throws Exception;
+
+    /**
      * 发送订单送达消息
      */
     void pushOrderToAddress(OrderStateDto info);
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
index 0751acb..56ddd88 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
@@ -52,6 +52,12 @@
 public class XcxPayServiceImpl implements IXcxPayService {
 
     @Autowired
+    private HappyActivityOrderMapper happyActivityOrderMapper;
+
+    @Autowired
+    private HappyActivityMapper happyActivityMapper;
+
+    @Autowired
     private MallOrderInfoMapper mallOrderInfoMapper;
     @Autowired
     private MallMemberMapper mallMemberMapper;
@@ -202,6 +208,27 @@
         }
         mallOrderInfo.setWxOrderNo(payData.getPrepay_id());
         mallOrderInfoMapper.updateById(mallOrderInfo);
+        return payData;
+    }
+
+    @Override
+    public BrandWCPayRequestData startPaymentActivity(HappyActivityOrder dto) throws Exception {
+        BigDecimal unit = new BigDecimal("100");
+        BigDecimal money = new BigDecimal(dto.getAmount().toString());
+        BrandWCPayRequestData payData;
+        HappyActivity happyActivity = happyActivityMapper.selectById(dto.getActivityId());
+        String productNames = getActivityNames(happyActivity.getId(),dto.getNumCnt());
+        MallMember mallMember = mallMemberMapper.selectById(dto.getMemberId());
+        Boolean debug = xcxProperties.getDebug();
+        if (debug) {
+            payData = weixinServiceUtil.createActivityOrder("[测试]" + productNames, dto.getOrderNo(),
+                    1, mallMember.getOpenId(), String.valueOf(dto.getId()));
+        } else {
+            payData = weixinServiceUtil.createActivityOrder(productNames, dto.getOrderNo(),
+                    unit.multiply(money).intValue(),mallMember.getOpenId(), String.valueOf(dto.getId()));
+        }
+        dto.setWxOrderNo(payData.getPrepay_id());
+        happyActivityOrderMapper.updateById(dto);
         return payData;
     }
 
@@ -509,4 +536,21 @@
         }
         return productNames;
     }
+
+    /**
+     * 根据用户ID和订单ID获取所购买商品名称
+     * @return 所含商品名称(多个以","隔开)
+     */
+    public String getActivityNames(Long activityId,Integer numCnt) {
+        HappyActivity happyActivity = happyActivityMapper.selectById(activityId);
+        StringBuffer productNameBuffer = new StringBuffer();
+        Integer maxLength = 25;
+        String goodsName = happyActivity.getName();
+        if (goodsName.length() > maxLength) {
+            productNameBuffer.append(goodsName.substring(0, maxLength) + "*"+numCnt);
+        }else{
+            productNameBuffer.append(goodsName+"*"+numCnt);
+        }
+        return productNameBuffer.toString();
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
index 2ab1e5c..9b85918 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
@@ -37,6 +37,10 @@
 	 * @return 预支付订单返回的结果对象(该结果对象已封装),在H5页面使用该对象信息
 	 * @throws Exception
 	 */
+	public BrandWCPayRequestData createActivityOrder(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
+		String wecharActivityPaynotifyUrl = xcxProperties.getWecharActivityPaynotifyUrl();
+		return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharActivityPaynotifyUrl);
+	}
 	public BrandWCPayRequestData createOrder(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
 		String wecharPaynotifyUrl = xcxProperties.getWecharPaynotifyUrl();
 		return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharPaynotifyUrl);
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 9443759..6f2b51b 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -15,10 +15,10 @@
       datasource:
         # 数据源-1,名称为 base
         base:
-          username: db_blnka
-          password: blnka!@#123
+          username: root
+          password: root
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://121.37.162.173:3306/db_blnka?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://localhost:3306/happy_community_365?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
@@ -74,6 +74,7 @@
   xcx_secret: 9bb58d655bff419feec3a6d948ca8b8d1
   debug: true
   wecharPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback
+  wecharActivityPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback
   wecharRechargePaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/rechargeCallBack
   certLocalPath: /home/blnkaCert/apiclient_cert.p12
   wecharpayMchid: 1658958205
diff --git a/src/main/resources/mapper/modules/HappyActivityMapper.xml b/src/main/resources/mapper/modules/HappyActivityMapper.xml
index 90a0a01..e333c60 100644
--- a/src/main/resources/mapper/modules/HappyActivityMapper.xml
+++ b/src/main/resources/mapper/modules/HappyActivityMapper.xml
@@ -1,44 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="cc.mrbird.febs.mall.mapper.HappyActivityMapper">
+<mapper namespace="cc.mrbird.febs.mall.mapper.HappyActivityConnectMapper">
 
-    <select id="selectActivityPage" resultType="cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoVo">
+    <select id="selectConnectListPage" resultType="cc.mrbird.febs.mall.vo.ApiConnectListInPageVo">
         select
-            a.id,
-            a.index_img,
-            a.code,
-            a.name,
-            a.state,
-            a.join_cnt,
-            a.start_time,
-            a.end_time
-        from happy_activity a
-        <where>
-            a.state != 0
-            and a.DELETE_FLAG = 0
-            <if test="record != null">
-                <if test="record.query != null and record.query != ''">
-                    and a.name like CONCAT('%', CONCAT(#{record.query}, '%'))
-                </if>
-                <if test="record.hotState != null">
-                    and a.hot_state=#{record.hotState}
-                </if>
-                <if test="record.categoryId != null">
-                    and a.category_id=#{record.categoryId}
-                </if>
-            </if>
-        </where>
-        order by a.order_cnt asc, a.id desc
-    </select>
-
-    <select id="getVoteRecordInPage" resultType="cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageVo">
-        select
-            a.member_id as memberId,
-                a.created_time as createdTime
-        from happy_follow a
+            a.*
+        from happy_activity_connect a
         where
-            a.type = 4
-            and a.source_option_id = #{record.sourceOptionId}
+            a.member_id = #{record.memberId}
         order by a.id desc
     </select>
 
diff --git a/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml b/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
new file mode 100644
index 0000000..02086bc
--- /dev/null
+++ b/src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cc.mrbird.febs.mall.mapper.HappyActivityMapper">
+
+    <select id="selectActivityPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityInfoVo">
+        select
+            a.id,
+            a.index_img,
+            a.code,
+            a.name,
+            a.state,
+            a.join_cnt,
+            a.start_time,
+            a.end_time
+        from happy_activity a
+        <where>
+            a.state != 0
+            and a.DELETE_FLAG = 0
+            <if test="record != null">
+                <if test="record.query != null and record.query != ''">
+                    and a.name like CONCAT('%', CONCAT(#{record.query}, '%'))
+                </if>
+                <if test="record.hotState != null">
+                    and a.hot_state=#{record.hotState}
+                </if>
+                <if test="record.categoryId != null">
+                    and a.category_id=#{record.categoryId}
+                </if>
+            </if>
+        </where>
+        order by a.order_cnt asc, a.id desc
+    </select>
+
+    <select id="getVoteRecordInPage" resultType="cc.mrbird.febs.mall.vo.ApiVoteRecordInPageVo">
+        select
+            a.member_id as memberId,
+                a.created_time as createdTime
+        from happy_follow a
+        where
+            a.type = 4
+            and a.source_option_id = #{record.sourceOptionId}
+        order by a.id desc
+    </select>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1