Administrator
2025-04-24 795ce45b126ff828852cb4d728d1d8d222d3ea75
feat(mall): 添加门票核销功能

- 新增 ApiCheckOrderDto 和 ApiCheckOrderVo 类用于核销订单接口
- 在 ApiHappyActivityOrderController 中添加 checkOrder 方法处理核销请求
- 在 HappyActivityService 接口中添加 checkOrder 方法定义
- 在 HappyActivityServiceImpl 中实现 checkOrder 方法逻辑
- 更新 HappyActivityOrderItem 类,将 transfer_item_id 字段改为核销人员 memberId
- 在 MallMember 类中添加 checkOrder 字段标识是否为核销员
- 更新 MallMemberVo 类,添加 checkOrder 字段的 API 文档注释
- 在 StateUpDownEnum 枚举中添加核销员状态的注释
7 files modified
2 files added
126 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiCheckOrderDto.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 44 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiCheckOrderVo.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
@@ -74,6 +74,7 @@
     * 是否推荐到首页 0-不推荐 1-推荐
     * 删除标识 0-未删除 1-已删除
     * 使用状态 0-待使用 1-已使用
     * 是否是核销员 0-否 1-是
     */
    DOWN(0),
    UP(1);
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java
@@ -4,10 +4,12 @@
import cc.mrbird.febs.common.entity.FebsResponse;
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.service.HappyActivityService;
import cc.mrbird.febs.mall.vo.*;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
@@ -112,4 +114,14 @@
        return happyActivityService.orderDelete(id);
    }
    @ApiOperation(value = "核销门票", notes = "核销门票")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiCheckOrderVo.class)
    })
    @PostMapping(value = "/checkOrder")
    public FebsResponse checkOrder(@RequestBody @Validated ApiCheckOrderDto dto) {
        return happyActivityService.checkOrder(dto);
    }
}
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiCheckOrderDto.java
New file
@@ -0,0 +1,18 @@
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 = "ApiCheckOrderDto", description = "参数")
public class ApiCheckOrderDto {
    @NotBlank(message = "票号不能为空")
    @ApiModelProperty(value = "票号(手动输入,或者扫码)", example = "1")
    private String orderItemCode;
}
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java
@@ -21,7 +21,7 @@
     `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_item_id` bigint(20) DEFAULT NULL COMMENT '核销人员memberId',
     `transfer_state` int(11) DEFAULT '0' COMMENT '是否转赠 0-未转赠 1-已转赠',
     `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除',
     */
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -183,4 +183,6 @@
    private Date vipLevelTime;
    //是否是医生  0-否 1-是
    private Integer doctorState;
    //是否是核销员 0-否 1-是
    private Integer checkOrder;
}
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
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.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.entity.HappyActivity;
import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
@@ -61,4 +62,6 @@
    void activityEnd();
    void activityStart();
    FebsResponse checkOrder(ApiCheckOrderDto dto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -8,6 +8,7 @@
import cc.mrbird.febs.common.utils.ShareCodeUtil;
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.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -17,6 +18,7 @@
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.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IXcxPayService;
@@ -770,6 +772,48 @@
    }
    @Override
    public FebsResponse checkOrder(ApiCheckOrderDto dto) {
        // 获取当前登录用户的ID
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        if(StateUpDownEnum.UP.getCode() != mallMember.getCheckOrder()){
            throw new FebsException("您不是核销员!");
        }
        String orderItemCode = dto.getOrderItemCode();
        HappyActivityOrderItem happyActivityOrderItem = happyActivityOrderItemMapper.selectOne(
                new LambdaQueryWrapper<HappyActivityOrderItem>()
                        .eq(HappyActivityOrderItem::getCode, orderItemCode)
                        .eq(HappyActivityOrderItem::getState, StateUpDownEnum.DOWN.getCode())
                .last("limit 1")
        );
        if(happyActivityOrderItem != null){
            happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode());
            happyActivityOrderItem.setTransferItemId(memberId);
            happyActivityOrderItemMapper.updateById(happyActivityOrderItem);
            HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrderItem.getActivityId());
            ApiCheckOrderVo apiCheckOrderVo = new ApiCheckOrderVo();
            apiCheckOrderVo.setActivityName(happyActivity.getName());
            apiCheckOrderVo.setActivityStartTime(happyActivity.getStartTime());
            apiCheckOrderVo.setActivityEndTime(happyActivity.getEndTime());
            apiCheckOrderVo.setActivityAddress(happyActivity.getAddress());
            apiCheckOrderVo.setCode(happyActivityOrderItem.getCode());
            apiCheckOrderVo.setName(happyActivityOrderItem.getName());
            apiCheckOrderVo.setPhone(happyActivityOrderItem.getPhone());
            apiCheckOrderVo.setPrice(happyActivityOrderItem.getPrice());
            return new FebsResponse().success().data(apiCheckOrderVo);
        }
        return new FebsResponse().fail().message("核销失败!");
    }
    @Override
    public FebsResponse voteActivityHot(Long id) {
        ApiVoteActivityHotVo apiVoteActivityHotVo = new ApiVoteActivityHotVo();
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -102,4 +102,7 @@
    @ApiModelProperty(value = "是否是医生")
    private Integer doctorState;
    @ApiModelProperty(value = "是否是核销员 0-否 1-是")
    private Integer checkOrder;
}
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiCheckOrderVo.java
New file
@@ -0,0 +1,41 @@
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.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "ApiCheckOrderVo", description = "参数")
public class ApiCheckOrderVo {
    @ApiModelProperty(value = "活动名称")
    private String activityName;
    @ApiModelProperty(value = "活动开始时间(有效期)")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date activityStartTime;
    @ApiModelProperty(value = "活动结束时间(有效期)")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date activityEndTime;
    @ApiModelProperty(value = "活动地点")
    private String activityAddress;
    @ApiModelProperty(value = "票号")
    private String code;
    @ApiModelProperty(value = "报名人姓名")
    private String name;
    @ApiModelProperty(value = "报名人电话")
    private String phone;
    @ApiModelProperty(value = "实付金额")
    private BigDecimal price;
}