ffd170c8219bbf290a87a1b411a518968fce98d4..59da87cc7b9db21b01c8c2c0831619aff73d0f84
4 days ago Administrator
fix(mall): 修复活动订单删除功能
59da87 diff | tree
4 days ago Administrator
feat(votesActivity): 更新订单列表筛选状态
abac18 diff | tree
4 days ago Administrator
refactor(mall): 优化活动报名相关功能
6e3fcd diff | tree
4 days ago Administrator
feat(pay): 为幸福活动订单项生成代码
d42a45 diff | tree
4 days ago Administrator
fix: 修改文件名大小写
c0fceb diff | tree
4 days ago Administrator
refactor(mall): 重构活动订单核销接口并添加取消订单功能
e12b33 diff | tree
4 days ago Administrator
refactor(votesActivity): 修改门票剩余字段并优化订单列表接口调用
318ec2 diff | tree
4 days ago Administrator
refactor(votesActivity): 优化订单核销功能
7c99fc diff | tree
4 days ago Administrator
feat(votesActivity): 添加门票剩余字段
d9e617 diff | tree
4 days ago Administrator
fix(mall): 修复活动列表查询异常
ec7076 diff | tree
4 days ago Administrator
fix(mall): 修复活动订单状态筛选逻辑
122cfb diff | tree
4 days ago Administrator
feat(xcxPay): 添加活动订单回调路径排除
e5a62f diff | tree
4 days ago Administrator
feat(mall): 添加活动预期数量和剩余数量字段
d3e291 diff | tree
4 days ago Administrator
refactor(mall): 优化活动订单状态更新逻辑
f4ee25 diff | tree
4 days ago Administrator
feat(votesActivity): 为订单列表添加复选框
c1ef57 diff | tree
4 days ago Administrator
refactor(mall): 注释掉 ApiPayOrderDto 中的 @NotBlank 注解
2cac54 diff | tree
4 days ago Administrator
refactor(mall): 注释掉 ApiPayOrderDto 中的 @NotBlank 注解
28888e diff | tree
4 days ago Administrator
refactor: 修改系统启动后显示的名称
cad0aa diff | tree
4 days ago Administrator
refactor(mall): 移除 HappyActivityOrder 中的 JsonFormat 注解并添加日志记录
d9d84e diff | tree
4 days ago Administrator
feat(mall): 添加活动订单失效时间和状态处理
966ccd diff | tree
4 days ago Administrator
fix(mall): 修正活动余量计算逻辑
f9b452 diff | tree
4 days ago Administrator
feat(mall): 添加活动评论列表功能
d104e9 diff | tree
4 days ago Administrator
feat(mall): 添加活动评价功能
f92107 diff | tree
4 days ago Administrator
feat(mall): 添加活动评价功能并更新相关模型
7ce91d diff | tree
9 files added
3 files deleted
22 files modified
1963 ■■■■■ changed files
sql/febs_base.sql 621 ●●●●● patch | view | raw | blame | history
sql/febs_quartz.sql 158 ●●●●● patch | view | raw | blame | history
sql/xc_mall.sql 375 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java 13 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/AdminVotesActivityCategoryController.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityController.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/ViewHappyActivityController.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiPayOrderDto.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/AdminActivityCommentDto.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityCommentDto.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityOrderListDto.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiExpireOrderDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiPayOrderAddCommentDto.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityComment.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCommentMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java 13 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminHappyActivityService.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java 54 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 102 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/AdminActivityCommentVo.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityCommentVo.java 45 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderInfoVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderListVo.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java 18 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/HappyActivityOptionMapper.xml 43 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/votesActivity/commentList.html 145 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/votesActivity/discountUpdate.html 14 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/votesActivity/orderList.html 100 ●●●●● patch | view | raw | blame | history
sql/febs_base.sql
File was deleted
sql/febs_quartz.sql
File was deleted
sql/xc_mall.sql
File was deleted
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -32,6 +32,7 @@
        registration.excludePathPatterns("/api/xcxPay/wxpayCallback");
        registration.excludePathPatterns("/api/xcxPay/rechargeCallBack");
        registration.excludePathPatterns("/api/xcxPay/fapiaoCallBack");
        registration.excludePathPatterns("/api/xcxPay/activityOrderCallback");
        registration.excludePathPatterns("/api/happyCategory/allCategory");
        registration.excludePathPatterns("/api/happyCategory/indexCategory");
        registration.excludePathPatterns("/api/happyActivity/activityList");
src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
@@ -4,7 +4,11 @@
@Getter
public enum StateUpDownEnum {
    /**
     * 活动订单失效时间
     *  分钟
     */
    ORDER_OVERTIME(30),
    /**
     * 来源类型 1-活动 2-社区圈子发布
@@ -27,12 +31,15 @@
    VOTE_OPTION_STATE_AUDIT_REFUSE(2),
    /**
     * 订单状态 1-待支付 2-待使用 3-已使用 4-售后
     * 订单状态 1-待支付 2-待使用 3-已使用 4-售后 5-已评价  6-删除 7-已失效
     */
    ORDER_STATE_WAIT_PAY(1),
    ORDER_STATE_WAIT_USE(2),
    ORDER_STATE_USED(3),
    ORDER_STATE_AFTER_SALE(4),
    ORDER_STATE_COMMENT(5),
    ORDER_STATE_DELETE(6),
    ORDER_STATE_OVERTIME(7),
    /**
     * 支付状态 0-待支付 1-支付成功 2-支付失败
@@ -75,6 +82,8 @@
     * 删除标识 0-未删除 1-已删除
     * 使用状态 0-待使用 1-已使用
     * 是否是核销员 0-否 1-是
     * 匿名状态 1:匿名 0:不匿名
     * 展示状态 1:显示 0:隐藏
     */
    DOWN(0),
    UP(1);
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java
@@ -63,7 +63,7 @@
            log.info("/ /`  / / \\ | |\\/| | |_) | |   | |_   | |  | |_  ");
            log.info("\\_\\_, \\_\\_/ |_|  | |_|   |_|__ |_|__  |_|  |_|__ ");
            log.info("                                                      ");
            log.info("blnka 权限系统启动完毕,地址:{}", url);
            log.info("快乐社区 权限系统启动完毕,地址:{}", url);
            boolean auto = febsProperties.isAutoOpenBrowser();
            if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) {
src/main/java/cc/mrbird/febs/mall/controller/activity/AdminVotesActivityCategoryController.java
@@ -10,6 +10,7 @@
import cc.mrbird.febs.common.utils.excl.ExcelVersion;
import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil;
import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto;
import cc.mrbird.febs.mall.dto.AdminMallGoodsCommentDto;
import cc.mrbird.febs.mall.dto.activity.*;
import cc.mrbird.febs.mall.entity.HappyActivity;
import cc.mrbird.febs.mall.entity.HappyActivityOption;
@@ -240,7 +241,7 @@
     */
    @PostMapping("checkOrder")
    @ControllerEndpoint(operation = "订单-手动核销", exceptionMessage = "操作失败")
    public FebsResponse checkOrder(@RequestBody AdminHappyActivityCheckOrderDto dto) {
    public FebsResponse checkOrder(@RequestBody List<Long> dto) {
        return adminHappyActivityService.checkOrder(dto);
    }
@@ -255,6 +256,25 @@
        return adminHappyActivityService.activityOrderDel(id);
    }
    /**
     * 评论列表
     */
    @GetMapping("commentList")
    public FebsResponse getCommentList(AdminActivityCommentDto dto, QueryRequest request) {
        Map<String, Object> data = getDataTable(adminHappyActivityService.getCommentListInPage(dto, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 评论列表-显示评论
     */
    @GetMapping("showStateSwitchOn/{id}")
    @ControllerEndpoint(operation = "评论列表-显示评论", exceptionMessage = "设置失败")
    public FebsResponse showStateSwitchOn(@NotNull(message = "{required}") @PathVariable Long id) {
        return adminHappyActivityService.showStateSwitchOn(id);
    }
    @SneakyThrows
    @GetMapping("/exportOptionList")
    public void exportOptionList(@RequestParam Map<String, String> params, HttpServletResponse response) {
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityController.java
@@ -3,11 +3,13 @@
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.dto.activity.ApiActivityCommentDto;
import cc.mrbird.febs.mall.dto.activity.ApiOperateValidRegisterActivityDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto;
import cc.mrbird.febs.mall.service.HappyActivityService;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.mall.vo.activity.ApiActivityCommentVo;
import cc.mrbird.febs.mall.vo.activity.ApiVoteActivityHotVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -48,6 +50,16 @@
        return happyActivityService.activityInfo(dto);
    }
    @ApiOperation(value = "活动评价", notes = "活动评价")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiActivityCommentVo.class)
    })
    @PostMapping(value = "/commentByActivityId")
    public FebsResponse commentByActivityId(@RequestBody ApiActivityCommentDto dto) {
        return new FebsResponse().success().data(happyActivityService.commentByActivityId(dto));
    }
    @ApiOperation(value = "点赞关注转发", notes = "点赞关注转发")
    @PostMapping(value = "/operateDo")
    public FebsResponse operateDo(@RequestBody @Validated ApiOperateDoDto dto) {
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java
@@ -5,6 +5,8 @@
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto;
import cc.mrbird.febs.mall.dto.activity.ApiCheckOrderDto;
import cc.mrbird.febs.mall.dto.activity.ApiExpireOrderDto;
import cc.mrbird.febs.mall.dto.activity.ApiPayOrderAddCommentDto;
import cc.mrbird.febs.mall.service.HappyActivityService;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderInfoVo;
@@ -70,6 +72,13 @@
        return happyActivityService.connectSave(dto);
    }
    @ApiOperation(value = "活动报名-报名-取消订单", notes = "活动报名-报名-创建订单")
    @PostMapping(value = "/expireOrder")
    public FebsResponse expireOrder(@RequestBody @Validated ApiExpireOrderDto dto) {
        return happyActivityService.expireOrder(dto);
    }
    @ApiOperation(value = "活动报名-报名-创建订单", notes = "活动报名-报名-创建订单")
    @PostMapping(value = "/createOrder")
    public FebsResponse createOrder(@RequestBody @Validated ApiCreateOrderDto dto) {
@@ -121,4 +130,11 @@
        return happyActivityService.checkOrder(dto);
    }
    @ApiOperation(value = "我的报名-评价", notes = "我的报名-评价")
    @PostMapping(value = "/addComment")
    public FebsResponse addComment(@RequestBody @Validated ApiPayOrderAddCommentDto dto) {
        return happyActivityService.addComment(dto);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/activity/ViewHappyActivityController.java
@@ -147,4 +147,15 @@
    public String orderList() {
        return FebsUtil.view("modules/votesActivity/orderList");
    }
    /**
     * 活动-订单评论列表
     */
    @GetMapping("commentList")
    @RequiresPermissions("commentList:view")
    public String commentList() {
        return FebsUtil.view("modules/votesActivity/commentList");
    }
}
src/main/java/cc/mrbird/febs/mall/dto/ApiPayOrderDto.java
@@ -20,7 +20,7 @@
    @ApiModelProperty(value = "支付方式 1-余额支付 2-微信支付 3-积分支付 0-无需支付", example = "1")
    private Integer payType;
    @NotBlank(message = "支付密码不能为空")
//    @NotBlank(message = "支付密码不能为空")
    @ApiModelProperty(value = "支付密码", example = "如果选择余额支付需要输入")
    private String tradePwd;
src/main/java/cc/mrbird/febs/mall/dto/activity/AdminActivityCommentDto.java
New file
@@ -0,0 +1,9 @@
package cc.mrbird.febs.mall.dto.activity;
import lombok.Data;
@Data
public class AdminActivityCommentDto {
    private Long activityId;
}
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityCommentDto.java
New file
@@ -0,0 +1,28 @@
package cc.mrbird.febs.mall.dto.activity;
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 = "ApiActivityCommentDto", description = "参数")
public class ApiActivityCommentDto {
    @ApiModelProperty(value = "页码", example = "1")
    private Integer pageNow;
    @ApiModelProperty(value = "每页数量", example = "10")
    private Integer pageSize;
    @NotNull(message = "活动ID不能为空")
    @ApiModelProperty(value = "活动ID", example = "1")
    private Long activityId;
    @ApiModelProperty(value = "评价等级", example = "1:好评2:中评3:差评")
    private Integer commentType;
}
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityOrderListDto.java
@@ -14,7 +14,7 @@
    @ApiModelProperty(value = "第几页", example = "1")
    private Integer pageNum;
    @ApiModelProperty(value = "订单状态", example = "订单状态 1-待支付 2-待使用 3-已使用 4-售后")
    @ApiModelProperty(value = "订单状态", example = "订单状态 1-待支付 2-待参加 3-待评价 4-售后 5-已评价")
    private Integer state;
}
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiExpireOrderDto.java
New file
@@ -0,0 +1,16 @@
package cc.mrbird.febs.mall.dto.activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "ApiExpireOrderDto", description = "参数")
public class ApiExpireOrderDto {
    @ApiModelProperty(value = "订单ID", example = "1")
    private List<Long> ids;
}
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiPayOrderAddCommentDto.java
New file
@@ -0,0 +1,29 @@
package cc.mrbird.febs.mall.dto.activity;
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 = "ApiPayOrderAddCommentDto", description = "参数")
public class ApiPayOrderAddCommentDto {
    @NotNull(message = "订单ID不能为空")
    @ApiModelProperty(value = "订单ID")
    private Long orderId;
    @NotNull(message = "评分不能为空")
    @ApiModelProperty(value = "评分  4.0")
    private Double star;
    @NotBlank(message = "评论不能为空")
    @ApiModelProperty(value = "评论")
    private String comment;
    private String images;
}
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityComment.java
New file
@@ -0,0 +1,36 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("happy_activity_comment")
public class HappyActivityComment extends BaseEntity {
    /**
     *
     `member_id` bigint(20) DEFAULT NULL COMMENT '会员ID',
     `order_id` bigint(20) DEFAULT NULL COMMENT '订单ID',
     `activity_id` bigint(20) DEFAULT NULL COMMENT '活动ID',
     `activity_name` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '活动名称',
     `star` double(5,1) DEFAULT NULL COMMENT '评分',
     `comment` text CHARACTER SET utf8mb4 COMMENT '评论',
     `images` text CHARACTER SET utf8mb4 COMMENT '图片',
     `show_state` int(11) DEFAULT '1' COMMENT '展示状态 1:显示 0:隐藏',
     `anonymous_state` int(11) DEFAULT '0' COMMENT '匿名状态 1:匿名 0:不匿名',
     */
    private Long memberId;
    private Long orderId;
    private Long activityId;
    private String activityName;
    private Double star;
    private String comment;
    private String images;
    private Integer showState;
    private Integer anonymousState;
    //查询条件 :评价等级 1:好评2:中评3:差评
    @TableField(exist = false)
    private Integer commentType;
}
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java
@@ -27,6 +27,7 @@
     `pay_order_no` text COMMENT '支付订单号',
     `wx_order_no` varchar(100) DEFAULT NULL COMMENT '微信订单编号',
     `state` int(11) DEFAULT '1' COMMENT '订单状态 1-待支付 2-待使用 3-已使用 4-售后',
     `fail_time` datetime DEFAULT NULL COMMENT '失效时间',
     */
@@ -43,6 +44,7 @@
    private String payOrderNo;
    private String wxOrderNo;
    private Integer state;
    private Date failTime;
    @TableField(exist = false)
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCommentMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.HappyActivityComment;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface HappyActivityCommentMapper extends BaseMapper<HappyActivityComment> {
}
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -1,8 +1,6 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.dto.activity.AdminHappyActivityOrderDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto;
import cc.mrbird.febs.mall.dto.activity.*;
import cc.mrbird.febs.mall.entity.HappyActivity;
import cc.mrbird.febs.mall.dto.ApiActivityInfoDto;
import cc.mrbird.febs.mall.entity.HappyActivityOrder;
@@ -10,9 +8,14 @@
import cc.mrbird.febs.mall.dto.ApiVoteRecordInPageDto;
import cc.mrbird.febs.mall.vo.ApiActivityOptionListVo;
import cc.mrbird.febs.mall.vo.ApiVoteRecordInPageVo;
import cc.mrbird.febs.mall.vo.activity.AdminActivityCommentVo;
import cc.mrbird.febs.mall.vo.activity.ApiActivityCommentVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface HappyActivityMapper extends BaseMapper<HappyActivity> {
@@ -29,4 +32,8 @@
    Page<HappyActivityOrder> selectOrderInPage(Page<HappyActivityOrder> page, @Param("record")AdminHappyActivityOrderDto dto);
    Page<ApiActivityOptionListVo> getVoteOptionRecordInPage(Page<ApiActivityOptionListVo> page, @Param("record")ApiVoteOptionRecordInPageDto dto);
    List<ApiActivityCommentVo> selectActivityCommentPage(Page<ApiActivityCommentVo> page, @Param("record")ApiActivityCommentDto dto);
    IPage<AdminActivityCommentVo> getCommentListInPage(Page<AdminActivityCommentVo> page, @Param("record")AdminActivityCommentDto dto);
}
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -7,7 +7,10 @@
import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
import cc.mrbird.febs.mall.dto.ApiOperateVoteDto;
import cc.mrbird.febs.mall.dto.ApiVoteRecordInPageDto;
import cc.mrbird.febs.mall.vo.activity.ApiActivityCommentVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface HappyActivityService extends IService<HappyActivity> {
@@ -47,6 +50,8 @@
    FebsResponse connectSave(ApiConnectSaveDto dto);
    FebsResponse expireOrder(ApiExpireOrderDto dto);
    FebsResponse createOrder(ApiCreateOrderDto dto);
    FebsResponse payOrder(ApiPayOrderDto dto);
@@ -68,4 +73,8 @@
    void checkActivityItem(Long orderId);
    void overtimeJob();
    FebsResponse addComment(ApiPayOrderAddCommentDto dto);
    List<ApiActivityCommentVo> commentByActivityId(ApiActivityCommentDto dto);
}
src/main/java/cc/mrbird/febs/mall/service/IAdminHappyActivityService.java
@@ -5,6 +5,7 @@
import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto;
import cc.mrbird.febs.mall.dto.activity.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.vo.activity.AdminActivityCommentVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -54,9 +55,13 @@
    IPage<HappyActivityOrder> activityOrderList(AdminHappyActivityOrderDto dto, QueryRequest request);
    FebsResponse checkOrder(AdminHappyActivityCheckOrderDto dto);
    FebsResponse checkOrder(List<Long> dto);
    FebsResponse activityOrderDel(Long id);
    List<HappyActivityOption> getVoteOptionListForExport(Map<String, String> params);
    IPage<AdminActivityCommentVo> getCommentListInPage(AdminActivityCommentDto dto, QueryRequest request);
    FebsResponse showStateSwitchOn(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
@@ -3,12 +3,15 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.enumerates.StateUpDownEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto;
import cc.mrbird.febs.mall.dto.activity.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IAdminHappyActivityService;
import cc.mrbird.febs.mall.vo.AdminMallGoodsCommentVo;
import cc.mrbird.febs.mall.vo.activity.AdminActivityCommentVo;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -37,6 +40,7 @@
    private final HappyActivityCategoryMapper happyActivityCategoryMapper;
    private final HappyActivityOptionMapper happyActivityOptionMapper;
    private final HappyActivityOrderMapper happyActivityOrderMapper;
    private final HappyActivityCommentMapper happyActivityCommentMapper;
    private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
    private final HappyFollowMapper happyFollowMapper;
    private final MallMemberMapper mallMemberMapper;
@@ -204,6 +208,8 @@
        happyActivity.setName(dto.getName());
        happyActivity.setType(dto.getType());
        happyActivity.setJoinCnt(dto.getJoinCnt());
        happyActivity.setExpectCnt(dto.getJoinCnt());
        happyActivity.setSurplusCnt(dto.getSurplusCnt());
        happyActivity.setStartTime(dto.getStartTime());
        happyActivity.setEndTime(dto.getEndTime());
        happyActivity.setPhone(dto.getPhone());
@@ -365,26 +371,27 @@
    }
    @Override
    public FebsResponse checkOrder(AdminHappyActivityCheckOrderDto dto) {
    public FebsResponse checkOrder(List<Long> ids) {
        List<Long> ids = dto.getIds();
        if (CollUtil.isEmpty(ids)){
            return new FebsResponse().fail().message("请选择需要核销的订单");
        }
        for(Long id : ids){
            HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id);
            happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_USED.getCode());
            happyActivityOrderMapper.updateById(happyActivityOrder);
            if(StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode() == happyActivityOrder.getState()){
                happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_USED.getCode());
                happyActivityOrderMapper.updateById(happyActivityOrder);
            List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList(
                    new LambdaQueryWrapper<HappyActivityOrderItem>()
                            .eq(HappyActivityOrderItem::getOrderId, id)
            );
            if(CollUtil.isNotEmpty(happyActivityOrderItems)){
                happyActivityOrderItems.forEach(happyActivityOrderItem -> {
                    happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode());
                    happyActivityOrderItemMapper.updateById(happyActivityOrderItem);
                });
                List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList(
                        new LambdaQueryWrapper<HappyActivityOrderItem>()
                                .eq(HappyActivityOrderItem::getOrderId, id)
                );
                if(CollUtil.isNotEmpty(happyActivityOrderItems)){
                    happyActivityOrderItems.forEach(happyActivityOrderItem -> {
                        happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode());
                        happyActivityOrderItemMapper.updateById(happyActivityOrderItem);
                    });
                }
            }
        }
@@ -395,6 +402,10 @@
    public FebsResponse activityOrderDel(Long id) {
        HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id);
        if(StateUpDownEnum.ORDER_STATE_OVERTIME.getCode() != happyActivityOrder.getState()){
            throw new FebsException("该订单状态不是已失效状态!");
        }
        if(ObjectUtil.isNotEmpty(happyActivityOrder)){
            happyActivityOrder.setDeleteFlag(StateUpDownEnum.UP.getCode());
            happyActivityOrderMapper.updateById(happyActivityOrder);
@@ -417,4 +428,21 @@
        }
        return happyActivityOptionMapper.selectList(queryWrapper);
    }
    @Override
    public IPage<AdminActivityCommentVo> getCommentListInPage(AdminActivityCommentDto dto, QueryRequest request) {
        Page<AdminActivityCommentVo> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<AdminActivityCommentVo> adminActivityCommentVoIPage = this.baseMapper.getCommentListInPage(page, dto);
        return adminActivityCommentVoIPage;
    }
    @Override
    public FebsResponse showStateSwitchOn(Long id) {
        HappyActivityComment happyActivityComment = happyActivityCommentMapper.selectById(id);
        Integer showState = StateUpDownEnum.UP.getCode() == happyActivityComment.getShowState() ? StateUpDownEnum.DOWN.getCode() : StateUpDownEnum.UP.getCode();
        happyActivityComment.setShowState(showState);
        happyActivityCommentMapper.updateById(happyActivityComment);
        return new FebsResponse().success().message("操作成功");
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -14,10 +14,7 @@
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderInfoVo;
import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderListVo;
import cc.mrbird.febs.mall.vo.activity.ApiCheckOrderVo;
import cc.mrbird.febs.mall.vo.activity.ApiVoteActivityHotVo;
import cc.mrbird.febs.mall.vo.activity.*;
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
@@ -54,6 +51,7 @@
    private final HappyActivityOptionMapper happyActivityOptionMapper;
    private final HappyActivityConnectMapper happyActivityConnectMapper;
    private final HappyActivityOrderMapper happyActivityOrderMapper;
    private final HappyActivityCommentMapper happyActivityCommentMapper;
    private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
    private final IXcxPayService iXcxPayService;
    private final IApiMallMemberWalletService iApiMallMemberWalletService;
@@ -114,6 +112,14 @@
        );
        if(happyActivity != null){
            BeanUtil.copyProperties(happyActivity,apiActivityVo);
            Integer commentCount = happyActivityCommentMapper.selectCount(
                    new LambdaQueryWrapper<HappyActivityComment>()
                            .eq(HappyActivityComment::getActivityId, happyActivity.getId())
                            .eq(HappyActivityComment::getShowState, StateUpDownEnum.UP.getCode())
            );
            apiActivityVo.setCommentCount(commentCount);
            List<HappyFollow> happyFollows = happyFollowMapper.selectList(
                    new LambdaQueryWrapper<HappyFollow>()
                            .select(HappyFollow::getId, HappyFollow::getType)
@@ -409,6 +415,7 @@
                new LambdaQueryWrapper<HappyActivityConnect>()
                        .eq(HappyActivityConnect::getMemberId, memberId)
                        .eq(HappyActivityConnect::getName, dto.getName())
                        .eq(HappyActivityConnect::getPhone, dto.getPhone())
        );
        if(CollUtil.isNotEmpty(happyActivityConnects)){
            throw new FebsException("已经添加过该联系人");
@@ -465,6 +472,26 @@
    }
    @Override
    public FebsResponse expireOrder(ApiExpireOrderDto dto) {
        if(CollUtil.isEmpty(dto.getIds())){
            throw new FebsException("请选择订单");
        }
        dto.getIds().forEach(id -> {
            HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id);
            if(ObjectUtil.isNotEmpty(happyActivityOrder)){
                Long activityId = happyActivityOrder.getActivityId();
                Integer numCnt = happyActivityOrder.getNumCnt();
                this.baseMapper.updateHappyActivitySurplusCnt(activityId,numCnt);
                happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_OVERTIME.getCode());
                happyActivityOrderMapper.updateById(happyActivityOrder);
            }
        });
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse createOrder(ApiCreateOrderDto dto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        if(CollUtil.isEmpty(dto.getConnectIds())){
@@ -478,6 +505,24 @@
        }
        Long activityId = dto.getActivityId();
        List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList(
                new LambdaQueryWrapper<HappyActivityOrderItem>()
                        .eq(HappyActivityOrderItem::getActivityId, activityId)
                        .in(HappyActivityOrderItem::getConnectId, connectIds)
        );
        if(CollUtil.isNotEmpty(happyActivityOrderItems)){
            //stream流操作happyActivityOrderItems,返回一个orderId的Set集合
            Set<Long> orderIdSet = happyActivityOrderItems.stream().map(HappyActivityOrderItem::getOrderId).collect(Collectors.toSet());
            List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList(
                    new LambdaQueryWrapper<HappyActivityOrder>()
                            .in(HappyActivityOrder::getId, orderIdSet)
                            .in(HappyActivityOrder::getState, Arrays.asList(StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode()))
            );
            if(CollUtil.isNotEmpty(happyActivityOrders)){
                throw new FebsException("有报名人重复报名了活动,请重新选择");
            }
        }
        HappyActivity happyActivity = this.baseMapper.selectById(activityId);
        if (ObjectUtil.isEmpty(happyActivity)) {
            throw new FebsException("活动不存在");
@@ -498,6 +543,7 @@
        if(amount.compareTo(BigDecimal.ZERO) < 0){
            throw new FebsException("支付金额错误");
        }
        DateTime failTime = DateUtil.offsetMinute(new Date(), StateUpDownEnum.ORDER_OVERTIME.getCode());
        HappyActivityOrder happyActivityOrder = new HappyActivityOrder();
        happyActivityOrder.setOrderNo(MallUtils.getOrderNum());
        happyActivityOrder.setMemberId(memberId);
@@ -506,6 +552,9 @@
        happyActivityOrder.setNumCnt(dto.getNumCnt());
        happyActivityOrder.setAmount(amount);
        happyActivityOrder.setPayState(StateUpDownEnum.PAY_STATE_NOT_PAY.getCode());
        happyActivityOrder.setPayType(StateUpDownEnum.PAY_METHOD_WECHAT.getCode());
        happyActivityOrder.setFailTime(failTime);
        log.info("创建订单,订单号="+JSONUtil.parse(happyActivityOrder));
        happyActivityOrderMapper.insert(happyActivityOrder);
        for(Long connectId : connectIds){
@@ -529,6 +578,7 @@
        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
        stringObjectHashMap.put("orderId",happyActivityOrder.getId());
        stringObjectHashMap.put("amount",amount);
        stringObjectHashMap.put("failTime",failTime);
        return new FebsResponse().success().data(stringObjectHashMap);
    }
@@ -592,8 +642,6 @@
            log.error("支付失败,订单ID:{},支付类型:{}", orderId, payType, e);
            throw new FebsException("支付失败:" + e.getMessage());
        }
        // todo 支付失败要把对应的人数加回来
        // 构造返回结果,包含支付相关信息
        Map<String, Object> map = new HashMap<>();
@@ -683,7 +731,7 @@
        LambdaQueryWrapper<HappyActivityOrder> happyActivityOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
        happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getMemberId, memberId);
        if(ObjectUtil.isNotEmpty(dto.getState())){
        if(ObjectUtil.isNotEmpty(dto.getState()) && dto.getState() != 0){
            happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getState, dto.getState());
        }
        happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getDeleteFlag, StateUpDownEnum.DOWN.getCode());
@@ -697,6 +745,7 @@
            List<HappyActivity> happyActivities = this.baseMapper.selectList(
                    new LambdaQueryWrapper<HappyActivity>()
                            .select(
                                    HappyActivity::getId,
                                    HappyActivity::getCategoryId,
                                    HappyActivity::getName,
                                    HappyActivity::getStartTime,
@@ -912,7 +961,7 @@
        List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList(
                new LambdaQueryWrapper<HappyActivityOrder>()
                        .eq(HappyActivityOrder::getState, StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode())
                        .lt(HappyActivityOrder::getCreatedTime, DateUtil.offsetMinute(new Date(), -10))
                        .lt(HappyActivityOrder::getFailTime, new Date())
        );
        if(CollUtil.isNotEmpty(happyActivityOrders)){
            happyActivityOrders.forEach(happyActivityOrder -> {
@@ -921,13 +970,48 @@
                Integer numCnt = happyActivityOrder.getNumCnt();
                this.baseMapper.updateHappyActivitySurplusCnt(activityId,numCnt);
                happyActivityOrder.setDeleteFlag(StateUpDownEnum.UP.getCode());
                happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_OVERTIME.getCode());
                happyActivityOrderMapper.updateById(happyActivityOrder);
            });
        }
    }
    @Override
    public FebsResponse addComment(ApiPayOrderAddCommentDto dto) {
        // 获取当前登录用户的ID
        Long memberId = LoginUserUtil.getLoginUser().getId();
        Long orderId = dto.getOrderId();
        HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(orderId);
        if(StateUpDownEnum.ORDER_STATE_USED.getCode() != happyActivityOrder.getState()){
            throw new FebsException("该订单状态不是已使用状态!");
        }
        happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_COMMENT.getCode());
        happyActivityOrderMapper.updateById(happyActivityOrder);
        HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrder.getActivityId());
        HappyActivityComment happyActivityComment = new HappyActivityComment();
        happyActivityComment.setActivityId(happyActivity.getId());
        happyActivityComment.setActivityName(happyActivity.getName());
        happyActivityComment.setMemberId(memberId);
        happyActivityComment.setOrderId(orderId);
        happyActivityComment.setStar(dto.getStar());
        happyActivityComment.setComment(dto.getComment());
        happyActivityComment.setImages(dto.getImages());
        happyActivityCommentMapper.insert(happyActivityComment);
        return new FebsResponse().success().message("操作成功");
    }
    @Override
    public List<ApiActivityCommentVo> commentByActivityId(ApiActivityCommentDto dto) {
        Page<ApiActivityCommentVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
        return this.baseMapper.selectActivityCommentPage(page,dto);
    }
    @Override
    public FebsResponse voteActivityHot(Long id) {
        ApiVoteActivityHotVo apiVoteActivityHotVo = new ApiVoteActivityHotVo();
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java
@@ -81,4 +81,8 @@
    @ApiModelProperty(value = "背景图片")
    private String backImg;
    @ApiModelProperty(value = "评论数量")
    private Integer commentCount;
}
src/main/java/cc/mrbird/febs/mall/vo/activity/AdminActivityCommentVo.java
New file
@@ -0,0 +1,41 @@
package cc.mrbird.febs.mall.vo.activity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class AdminActivityCommentVo {
    private Long id;
    @ApiModelProperty(value = "姓名")
    private String memberName;
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    @ApiModelProperty(value = "活动名称")
    private String activityName;
    @ApiModelProperty(value = "评价时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime;
    @ApiModelProperty(value = "评分  4.0")
    private Double star;
    @ApiModelProperty(value = "评论")
    private String comment;
    @ApiModelProperty(value = "图片")
    private String images;
    @ApiModelProperty(value = "是否匿名评价 1:匿名 2:不匿名")
    private Integer anonymousState;
    @ApiModelProperty(value = "展示状态 1:显示 2:隐藏")
    private Integer showState;
}
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityCommentVo.java
New file
@@ -0,0 +1,45 @@
package cc.mrbird.febs.mall.vo.activity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel(value = "ApiActivityCommentVo", description = "参数")
public class ApiActivityCommentVo {
    @ApiModelProperty(value = "头像")
    private String avatar;
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "评价时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime;
    @ApiModelProperty(value = "评分  4.0")
    private Double star;
    @ApiModelProperty(value = "评论")
    private String comment;
    @ApiModelProperty(value = "图片")
    private String images;
    @ApiModelProperty(value = "是否匿名评价 1:匿名 2:不匿名")
    private Integer anonymousState;
    @ApiModelProperty(value = "好评 大于四星")
    private Integer greatNum;
    @ApiModelProperty(value = "好评 大于三星小于四星")
    private Integer goodNum;
    @ApiModelProperty(value = "差评 小于三星")
    private Integer badNum;
}
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderInfoVo.java
@@ -43,8 +43,6 @@
    @ApiModelProperty(value = "实付金额")
    private BigDecimal price;
    @ApiModelProperty(value = "订单状态 1-待支付 2-待使用 3-已使用 4-售后")
    private Integer orderState;
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderListVo.java
@@ -42,6 +42,10 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endTime;
    @ApiModelProperty(value = "订单失效时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date failTime;
    @ApiModelProperty(value = "活动地点")
    private String address;
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -3,7 +3,9 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.*;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.ShareCodeUtil;
import cc.mrbird.febs.common.utils.SpringContextHolder;
import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto;
import cc.mrbird.febs.mall.entity.*;
@@ -18,10 +20,12 @@
import cc.mrbird.febs.pay.util.Util;
import cc.mrbird.febs.pay.util.WechatConfigure;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -47,6 +51,7 @@
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@@ -56,6 +61,7 @@
public class XcxPayController {
    private final HappyActivityOrderMapper happyActivityOrderMapper;
    private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
    private final MallOrderInfoMapper mallOrderInfoMapper;
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMemberWalletMapper mallMemberWalletMapper;
@@ -422,6 +428,18 @@
                            happyActivityOrder.setWxOrderNo(transaction_id);
                            happyActivityOrderMapper.updateById(happyActivityOrder);
                            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(10);
                                    item.setCode(code);
                                    happyActivityOrderItemMapper.updateById(item);
                                }
                            }
                            mallMoneyFlowService.addMoneyFlow(
                                    happyActivityOrder.getMemberId(),
                                    happyActivityOrder.getAmount().negate(),
src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -57,7 +57,7 @@
    <update id="updateHappyActivitySurplusCnt" >
        update happy_activity set surplus_cnt = likes_cnt + #{cnt} where id = #{id}
        update happy_activity set surplus_cnt = surplus_cnt + #{cnt} where id = #{id}
    </update>
    <select id="getVoteOptionInPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityOptionListVo">
@@ -136,4 +136,45 @@
        order by a.likes_cnt desc
    </select>
    <select id="selectActivityCommentPage" resultType="cc.mrbird.febs.mall.vo.activity.ApiActivityCommentVo">
        select
        a.*,
        b.name name,
        b.avatar avatar
        from happy_activity_comment a
        left join mall_member b on b.id = a.member_id
        <where>
            <if test="record != null">
                <if test="record.activityId != null and record.activityId != ''">
                    and a.activity_id = #{record.activityId}
                </if>
                <if test="record.commentType != null and record.commentType != '' and record.commentType == 1">
                    and a.star <![CDATA[ > ]]> 4
                </if>
                <if test="record.commentType != null and record.commentType != '' and record.commentType == 2">
                    and (a.star <![CDATA[ >= ]]> 3 and a.star <![CDATA[ <= ]]> 4)
                </if>
                <if test="record.commentType != null and record.commentType != '' and record.commentType == 3">
                    and (a.star <![CDATA[ < ]]> 3 )
                </if>
            </if>
        </where>
        group by a.id
        order by a.created_time desc
    </select>
    <select id="getCommentListInPage" resultType="cc.mrbird.febs.mall.vo.activity.AdminActivityCommentVo">
        select
               a.*,
                b.name memberName,
                c.order_no orderNo
        from happy_activity_comment a
        left join mall_member b on a.member_id = b.id
        left join happy_activity_order c on a.order_id = c.id
        where a.activity_id = #{record.activityId}
        order by a.created_time desc
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/votesActivity/commentList.html
New file
@@ -0,0 +1,145 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-activity-comment" lay-title="评论列表">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-form-item">
                            <div class="layui-col-md10">
                                <div class="layui-inline">
                                    <label class="layui-form-label layui-form-label-sm">活动</label>
                                    <div class="layui-input-inline">
                                        <select name="activityId" class="activity-type-comment">
                                            <option value="">请选择</option>
                                        </select>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="activityCommentTable" lay-data="{id: 'activityCommentTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- 表格操作栏 start -->
<script type="text/html" id="showStateSwitch">
    {{# if(d.showState === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="showStateSwitch">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="showStateSwitch">
    {{# } }}
</script>
<script id="showScreenHost" type="text/html">
    {{# var srr=d.images.split(",");
    for(var j in srr) { srr[j] }}
    <div style="margin:0 10px; display:inline-block !important; display:inline;  max-width:100px; max-height:100px;">
        <img style=" max-width:100px; max-height:100px;" src="{{srr[j]}}" alt=""/>
    </div>
    {{# } }}
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            $view = $('#febs-activity-comment'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'phone', type: null},
            tableIns;
        form.render();
        //(下拉框)
        $.get(ctx + 'admin/happyActivity/allOrderActivities', function (res) {
            var data = res.data;
            for (let k in data)
            {
                $(".activity-type-comment").append("<option value='" + data[k].id + "'>" + data[k].name + "</option>");
            }
            layui.use('form', function () {
                var form = layui.form;
                form.render();
            });
        });
        // 表格初始化
        initTable();
        // 初始化表格操作栏各个按钮功能
        table.on('tool(activityCommentTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
        });
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'activityCommentTable',
                url: ctx + 'admin/happyActivity/commentList',
                cols: [[
                        {field: 'memberName', title: '用户', minWidth: 100,align:'left'},
                        {field: 'orderNo', title: '订单编号', minWidth: 80,align:'left'},
                        {field: 'goodsName', title: '活动名称', minWidth: 80,align:'left'},
                        {field: 'showState', title: '是否展示', templet: '#showStateSwitch', minWidth: 80,align:'center'},
                        {field: 'images', title: '图片', align: 'center', templet: '#showScreenHost', width: 400},
                        {field: 'star', title: '评分', minWidth: 50,align:'left'},
                        {field: 'comment', title: '评论', minWidth: 120,align:'left'},
                        {field: 'createdTime', title: '评价时间', minWidth: 180,align:'left'},
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                activityId: $searchForm.find("select[name='activityId']").val(),
            };
        }
        function showStateSwitchOn(id) {
            febs.get(ctx + 'admin/happyActivity/showStateSwitchOn/' + id, null, function () {
                febs.alert.success('设置成功');
                $query.click();
            });
        }
        form.on('switch(showStateSwitch)', function (data) {
            if (data.elem.checked) {
                showStateSwitchOn(data.value);
            } else {
                showStateSwitchOn(data.value);
            }
        })
    })
</script>
src/main/resources/templates/febs/views/modules/votesActivity/discountUpdate.html
@@ -131,15 +131,22 @@
                                            </select>
                                        </div>
                                    </div>
                                </div>
                                <div class="layui-row layui-col-space10 layui-form-item">
                                    <div class="layui-col-lg6">
                                        <label class="layui-form-label febs-form-item-require">门票总数:</label>
                                        <div class="layui-input-block">
                                            <input type="text" name="joinCnt" lay-verify="required"
                                                   placeholder="" autocomplete="off" class="layui-input">
                                            <div class="layui-form-mid layui-word-aux">门票总数</div>
                                        </div>
                                    </div>
                                </div>
                                <div class="layui-row layui-col-space10 layui-form-item">
                                    <div class="layui-col-lg6">
                                        <label class="layui-form-label febs-form-item-require">门票剩余:</label>
                                        <div class="layui-input-block">
                                            <input type="text" name="surplusCnt" lay-verify="required"
                                                   placeholder="" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                    <div class="layui-col-lg6">
@@ -370,6 +377,7 @@
                "payAmount": activity.payAmount,
                "orderCnt": activity.orderCnt,
                "hotState": activity.hotState,
                "surplusCnt": activity.surplusCnt,
                "voteCnt": activity.voteCnt,
                "addState": activity.addState,
            });
src/main/resources/templates/febs/views/modules/votesActivity/orderList.html
@@ -16,12 +16,14 @@
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">状态</label>
                                        <div class="layui-input-inline">
                                            <select name="status">
                                            <select name="state">
                                                <option value="">请选择</option>
                                                <option value="1">待支付</option>
                                                <option value="2">待使用</option>
                                                <option value="3">已使用</option>
                                                <option value="4">售后</option>
                                                <option value="5">已评价</option>
                                                <option value="7">已失效</option>
                                            </select>
                                        </div>
                                    </div>
@@ -78,6 +80,9 @@
    2: {title: '待使用', color: 'orange'},
    3: {title: '已使用', color: 'green'},
    4: {title: '售后', color: 'red'},
    5: {title: '已评价', color: 'black'},
    6: {title: '删除', color: 'black'},
    7: {title: '已失效', color: 'black'},
    }[d.state];
    }}
    <span class="layui-badge febs-bg-{{state.color}}">{{ state.title }}</span>
@@ -171,47 +176,77 @@
        // 初始化表格操作栏各个按钮功能
        table.on('toolbar(orderActivityTable)', function (obj) {
            console.log("触发事件:", obj.event); // 调试信息
            let event = obj.event;
            let id = obj.config.id;
            let checkStatus = table.checkStatus(id);
            if(event === 'checkOrder'){
            if (event === 'checkOrder') {
                let data = checkStatus.data;
                let ids = [];
                for(let i = 0;i < data.length;i++){
                    if(data[i].state != 2){
                        febs.alert.warn('请选择待使用的订单');
                        return;
                    }else{
                        ids.push(data[i].id);
                    }
                }
                console.log(ids);
                if(ids == null || ids == ""){
                // 校验 data 是否为空或未定义
                if (!Array.isArray(data) || data.length === 0) {
                    febs.alert.warn('请选择需要核销的订单');
                    return;
                }
                $.ajax({
                    'url':ctx + 'admin/happyActivity/checkOrder',
                    'type':'post',
                    'dataType':'json',
                    'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
                    'traditional': true,//ajax传递数组必须添加属性
                    'data':ids,
                    'success':function (data) {
                        if(data.code==200){
                            febs.alert.success('操作成功');
                            $query.click();
                        }else{
                            febs.alert.warn(data.message);
                        }
                    },
                    'error':function () {
                        febs.alert.warn('服务器繁忙');
                let ids = [];
                let hasInvalidOrder = false;
                // 遍历数据,筛选符合条件的订单
                for (let i = 0; i < data.length; i++) {
                    if (data[i].state !== 2) {
                        hasInvalidOrder = true;
                        break; // 提前中断循环,避免无意义的继续遍历
                    } else {
                        ids.push(data[i].id);
                    }
                })
                }
                if (hasInvalidOrder) {
                    febs.alert.warn('请选择待使用的订单');
                    return;
                }
                if (ids.length === 0) { // 正确判断数组是否为空
                    febs.alert.warn('请选择需要核销的订单');
                    return;
                }
                // 封装 AJAX 请求为独立函数
                function sendCheckOrderRequest(ids, successCallback, errorCallback) {
                    $.ajax({
                        url: ctx + 'admin/happyActivity/checkOrder', // 硬编码路径建议提取为配置项
                        type: 'post',
                        dataType: 'json',
                        headers: { 'Content-Type': 'application/json;charset=utf-8' },
                        traditional: true,
                        data: JSON.stringify(ids), // 确保传递的是 JSON 格式
                        success: function (response) {
                            if (response.code === 200) {
                                successCallback(response);
                            } else {
                                errorCallback(response.message);
                            }
                        },
                        error: function (xhr, status, error) {
                            errorCallback(`服务器繁忙: ${error}`); // 捕获具体错误信息
                        }
                    });
                }
                // 调用封装的请求函数
                sendCheckOrderRequest(ids,
                    function onSuccess(response) {
                        febs.alert.success('操作成功');
                        $query.click();
                    },
                    function onError(message) {
                        febs.alert.warn(message);
                    }
                );
            }
        });
        function initorderActivityTable() {
@@ -222,6 +257,7 @@
                toolbar:"#orderActivityToolbar",
                defaultToolbar:[],
                cols: [[
                    {type: 'checkbox'},
                    {type: 'numbers', title: '', width: 80},
                    {title: '操作', toolbar: '#orderActivityOption', minWidth: 200, align: 'center'},
                    {field: 'name', title: '名称', minWidth: 100,align:'center'},