Administrator
9 days ago 8032e6933d3eda1ef701fcb1f70b2a0b2523c8d9
feat(mall): 添加活动订单相关功能

- 新增活动订单列表和详情接口
- 实现活动订单列表和详情页面的数据展示
- 添加活动订单相关的数据传输对象和视图对象
- 优化活动列表页面,增加活动地点字段
3 files added
6 files modified
262 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityOrderListDto.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 103 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderInfoVo.java 53 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderListVo.java 50 ●●●●● patch | view | raw | blame | history
src/main/resources/application-test.yml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/HappyActivityOptionMapper.xml 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java
@@ -3,8 +3,11 @@
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.ApiActivityOrderListDto;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
@@ -82,4 +85,24 @@
        return happyActivityService.payOrder(dto);
    }
    @ApiOperation(value = "我的报名-列表", notes = "我的报名-列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiActivityOrderListVo.class)
    })
    @PostMapping(value = "/orderList")
    public FebsResponse orderList(@RequestBody ApiActivityOrderListDto dto) {
        return happyActivityService.orderList(dto);
    }
    @ApiOperation(value = "我的报名-详情", notes = "我的报名-详情")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiActivityOrderInfoVo.class)
    })
    @GetMapping(value = "/orderInfo/{id}")
    public FebsResponse orderInfo(@PathVariable("id") Long id) {
        return happyActivityService.orderInfo(id);
    }
}
src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityOrderListDto.java
New file
@@ -0,0 +1,20 @@
package cc.mrbird.febs.mall.dto.activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "ApiActivityOrderListDto", description = "订单列表参数接收类")
public class ApiActivityOrderListDto {
    @ApiModelProperty(value = "一页数量", example = "10")
    private Integer pageSize;
    @ApiModelProperty(value = "第几页", example = "1")
    private Integer pageNum;
    @ApiModelProperty(value = "订单状态", example = "订单状态 1-待支付 2-待使用 3-已使用 4-售后")
    private Integer state;
}
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -2,6 +2,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.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.entity.HappyActivity;
import cc.mrbird.febs.mall.dto.ApiOperateDoDto;
@@ -48,4 +49,8 @@
    void addLikeCnt(Long sourceOptionId);
    void substructJoinCnt(Long activityId,Integer cnt);
    FebsResponse orderList(ApiActivityOrderListDto dto);
    FebsResponse orderInfo(Long id);
}
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -7,6 +7,7 @@
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.dto.activity.ApiActivityOrderListDto;
import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -14,6 +15,8 @@
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.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cn.hutool.core.bean.BeanUtil;
@@ -25,6 +28,7 @@
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
@@ -35,6 +39,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@@ -51,6 +56,7 @@
    private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
    private final IXcxPayService iXcxPayService;
    private final IApiMallMemberWalletService iApiMallMemberWalletService;
    private final HappyActivityCategoryMapper happyActivityCategoryMapper;
    @Override
    public FebsResponse activityList(ApiActivityInfoDto dto) {
@@ -492,6 +498,8 @@
        }
    }
    // 处理无需支付订单
    private void processNoPayOrder(HappyActivityOrder order, Long orderId) {
        updateOrderState(order, StateUpDownEnum.PAY_METHOD_NO_PAY.getCode(), StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode());
@@ -552,6 +560,101 @@
        return happyActivityOrder.getOrderNo();
    }
    @Override
    public FebsResponse orderList(ApiActivityOrderListDto dto) {
        // 获取当前登录用户的ID
        Long memberId = LoginUserUtil.getLoginUser().getId();
        ArrayList<ApiActivityOrderListVo> apiActivityOrderListVos = new ArrayList<>();
        LambdaQueryWrapper<HappyActivityOrder> happyActivityOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
        happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getMemberId, memberId);
        if(ObjectUtil.isNotEmpty(dto.getState())){
            happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getState, dto.getState());
        }
        happyActivityOrderLambdaQueryWrapper.orderByDesc(HappyActivityOrder::getCreatedTime);
        Page<HappyActivityOrder> page = new Page<>(dto.getPageNum(), dto.getPageSize());
        Page<HappyActivityOrder> voteActivityPage = happyActivityOrderMapper.selectPage(page, happyActivityOrderLambdaQueryWrapper);
        List<HappyActivityOrder> records = voteActivityPage.getRecords();
        if(CollUtil.isNotEmpty(records)){
            Set<Long> activityIds = records.stream().map(HappyActivityOrder::getActivityId).collect(Collectors.toSet());
            List<HappyActivity> happyActivities = this.baseMapper.selectList(
                    new LambdaQueryWrapper<HappyActivity>()
                            .select(
                                    HappyActivity::getCategoryId,
                                    HappyActivity::getName,
                                    HappyActivity::getStartTime,
                                    HappyActivity::getEndTime,
                                    HappyActivity::getAddress)
                            .in(HappyActivity::getId, activityIds)
            );
            Map<Long, HappyActivity> activityMap = happyActivities.stream().collect(Collectors.toMap(HappyActivity::getId, Function.identity()));
            Set<Long> categoryIds = happyActivities.stream().map(HappyActivity::getCategoryId).collect(Collectors.toSet());
            //stream流操作categoryIds得到一个Map<categoryId,HappyActivityCategory>的map对象
            List<HappyActivityCategory> happyActivityCategories = happyActivityCategoryMapper.selectList(
                    new LambdaQueryWrapper<HappyActivityCategory>()
                            .select(
                                    HappyActivityCategory::getId,
                                    HappyActivityCategory::getName)
                            .in(HappyActivityCategory::getId,categoryIds)
            );
            Map<Long, HappyActivityCategory> categoryMap = happyActivityCategories.stream().collect(Collectors.toMap(HappyActivityCategory::getId, Function.identity()));
            for(HappyActivityOrder happyActivityOrder : records){
                ApiActivityOrderListVo apiActivityOrderListVo = new ApiActivityOrderListVo();
                BeanUtil.copyProperties(happyActivityOrder, apiActivityOrderListVo);
                apiActivityOrderListVo.setActivityName(activityMap.get(happyActivityOrder.getActivityId()).getName());
                apiActivityOrderListVo.setStartTime(activityMap.get(happyActivityOrder.getActivityId()).getStartTime());
                apiActivityOrderListVo.setEndTime(activityMap.get(happyActivityOrder.getActivityId()).getEndTime());
                apiActivityOrderListVo.setAddress(activityMap.get(happyActivityOrder.getActivityId()).getAddress());
                apiActivityOrderListVo.setCategoryName(categoryMap.get(activityMap.get(happyActivityOrder.getActivityId()).getCategoryId()).getName());
                apiActivityOrderListVos.add(apiActivityOrderListVo);
            }
        }
        return new FebsResponse().success().data(apiActivityOrderListVos);
    }
    @Override
    public FebsResponse orderInfo(Long id) {
        // 获取当前登录用户的ID
        Long memberId = LoginUserUtil.getLoginUser().getId();
        ArrayList<ApiActivityOrderInfoVo> apiActivityOrderInfoVos = new ArrayList<>();
        HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id);
        HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrder.getActivityId());
        List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList(
                new LambdaQueryWrapper<HappyActivityOrderItem>()
                        .eq(HappyActivityOrderItem::getOrderId, happyActivityOrder.getActivityId())
                .eq(HappyActivityOrderItem::getMemberId, memberId)
        );
        if(CollUtil.isNotEmpty(happyActivityOrderItems)){
            for(HappyActivityOrderItem happyActivityOrderItem : happyActivityOrderItems){
                ApiActivityOrderInfoVo apiActivityOrderInfoVo = new ApiActivityOrderInfoVo();
                BeanUtil.copyProperties(happyActivityOrderItem, apiActivityOrderInfoVo);
                apiActivityOrderInfoVo.setOrderState(happyActivityOrder.getState());
                apiActivityOrderInfoVo.setActivityName(happyActivity.getName());
                apiActivityOrderInfoVo.setActivityStartTime(happyActivity.getStartTime());
                apiActivityOrderInfoVo.setActivityEndTime(happyActivity.getEndTime());
                apiActivityOrderInfoVo.setActivityAddress(happyActivity.getAddress());
                apiActivityOrderInfoVos.add(apiActivityOrderInfoVo);
            }
        }
        return new FebsResponse().success().data(apiActivityOrderInfoVos);
    }
    public static void main(String[] args) {
        Date date = new Date();
src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java
@@ -24,6 +24,9 @@
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "地点")
    private String address;
    @ApiModelProperty(value = "状态 0-未开始 1-报名中(进行中) 2-已结束")
    private Integer state;
src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderInfoVo.java
New file
@@ -0,0 +1,53 @@
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 = "ApiActivityOrderInfoVo", description = "参数")
public class ApiActivityOrderInfoVo {
    @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 = "票据状态 0-待使用 1-已使用")
    private Integer state;
    @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
New file
@@ -0,0 +1,50 @@
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 = "ApiActivityOrderListVo", description = "参数")
public class ApiActivityOrderListVo {
    private Long id;
    @ApiModelProperty(value = "订单号")
    private String orderNo;
    @ApiModelProperty(value = "单价")
    private BigDecimal price;
    @ApiModelProperty(value = "数量")
    private Integer numCnt;
    @ApiModelProperty(value = "支付总金额")
    private BigDecimal amount;
    @ApiModelProperty(value = "支付状态 0-待支付 1-支付成功 2-支付失败")
    private Integer payState;
    @ApiModelProperty(value = "支付方式 1-余额支付 2-微信支付 3-积分支付 0-无需支付(免费)")
    private Integer payType;
    @ApiModelProperty(value = "支付时间")
    private Date payTime;
    @ApiModelProperty(value = "订单状态 1-待支付 2-待使用 3-已使用 4-售后")
    private Integer state;
    @ApiModelProperty(value = "活动名称")
    private String activityName;
    @ApiModelProperty(value = "活动开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startTime;
    @ApiModelProperty(value = "活动结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endTime;
    @ApiModelProperty(value = "活动地点")
    private String address;
    @ApiModelProperty(value = "活动类别")
    private String categoryName;
}
src/main/resources/application-test.yml
@@ -70,8 +70,8 @@
#  wecharpaySecret: CSxc168888CSxc168888CSxc168888xc
xcx:
  wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
  xcx_appid: wxad2fdb2fcad10fb21
  xcx_secret: 9bb58d655bff419feec3a6d948ca8b8d1
  xcx_appid: wxe8454293f5c4c143
  xcx_secret: 33c3ad513344cf6c16904e5d528b70ea
  debug: true
  wecharPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback
  wecharActivityPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback
src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -5,6 +5,7 @@
    <select id="selectActivityPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityInfoVo">
        select
            a.id,
            a.address,
            a.index_img,
            a.code,
            a.name,