Administrator
17 hours ago 03bd93bf72ea24c2134c08bff69a3671202759ff
feat(mall): 优化活动订单列表接口和导出功能

- 新增 AdminHappyActivityOrderItemVo 类用于订单项展示
- 实现活动订单列表 V2 版本,增加订单项信息
- 更新订单导出功能,增加报名人、报名电话等信息
- 调整前端订单列表显示,增加新字段
7 files modified
1 files added
193 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/activity/AdminVotesActivityCategoryController.java 24 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminHappyActivityService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java 86 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/activity/AdminHappyActivityOrderItemVo.java 36 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/HappyActivityOptionMapper.xml 30 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/votesActivity/orderList.html 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/activity/AdminVotesActivityCategoryController.java
@@ -18,6 +18,7 @@
import cc.mrbird.febs.mall.entity.HappyActivityOrder;
import cc.mrbird.febs.mall.service.IAdminHappyActivityService;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderCheckVo;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderItemVo;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -242,6 +243,17 @@
    }
    /**
     * 订单
     * @return
     */
    @GetMapping("activityOrderListV2")
    public FebsResponse activityOrderListV2(AdminHappyActivityOrderDto dto, QueryRequest request) {
        Map<String, Object> data = getDataTable(adminHappyActivityService.activityOrderListV2(dto, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 订单-手动核销
     */
    @PostMapping("checkOrder")
@@ -334,18 +346,22 @@
        String title = happyActivity.getName() + "的订单";
        orderSheet.setTitle(title);
        String[] header = {"序号","用户", "编号", "单价", "数量","总价","使用状态", "支付方式"};
        String[] header = {"序号","用户", "报名人", "报名电话", "报名地址", "编号", "单价", "数量","总价","使用状态", "支付方式"};
        orderSheet.setHeaders(header);
        List<HappyActivityOrder> orderListForExport = adminHappyActivityService.getOrderListForExport(params);
//        List<HappyActivityOrder> orderListForExport = adminHappyActivityService.getOrderListForExport(params);
        List<AdminHappyActivityOrderItemVo> orderListForExport = adminHappyActivityService.getOrderListForExportV2(params);
        List<List<Object>> list = new ArrayList<>();
        if (orderListForExport.size() > 0) {
            int i = 0;
            for (HappyActivityOrder item : orderListForExport) {
            for (AdminHappyActivityOrderItemVo item : orderListForExport) {
                i++;
                List<Object> temp = new ArrayList<>();
                temp.add(i);
                temp.add(item.getName());
                temp.add(item.getMemberName());
                temp.add(item.getConnectName());
                temp.add(item.getConnectPhone());
                temp.add(item.getConnectAddress());
                temp.add(item.getOrderNo());
                temp.add(item.getPrice());
                temp.add(item.getNumCnt());
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -4,12 +4,14 @@
import cc.mrbird.febs.mall.entity.HappyActivity;
import cc.mrbird.febs.mall.dto.ApiActivityInfoDto;
import cc.mrbird.febs.mall.entity.HappyActivityOrder;
import cc.mrbird.febs.mall.entity.HappyActivityOrderItem;
import cc.mrbird.febs.mall.vo.ApiActivityInfoVo;
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.AdminHappyActivityOrderCheckVo;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderItemVo;
import cc.mrbird.febs.mall.vo.activity.ApiActivityCommentVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -32,6 +34,8 @@
    Page<HappyActivityOrder> selectOrderInPage(Page<HappyActivityOrder> page, @Param("record")AdminHappyActivityOrderDto dto);
    Page<AdminHappyActivityOrderItemVo> selectOrderItemInPage(Page<AdminHappyActivityOrderItemVo> 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);
src/main/java/cc/mrbird/febs/mall/service/IAdminHappyActivityService.java
@@ -7,6 +7,7 @@
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.vo.activity.AdminActivityCommentVo;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderCheckVo;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderItemVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -56,6 +57,8 @@
    IPage<HappyActivityOrder> activityOrderList(AdminHappyActivityOrderDto dto, QueryRequest request);
    IPage<AdminHappyActivityOrderItemVo> activityOrderListV2(AdminHappyActivityOrderDto dto, QueryRequest request);
    FebsResponse checkOrder(List<Long> dto);
    FebsResponse activityOrderDel(Long id);
@@ -68,6 +71,8 @@
    List<HappyActivityOrder> getOrderListForExport(Map<String, String> params);
    List<AdminHappyActivityOrderItemVo> getOrderListForExportV2(Map<String, String> params);
    IPage<AdminHappyActivityOrderCheckVo> activityOrderCheckList(AdminHappyActivityOrderCheckDto dto, QueryRequest request);
    FebsResponse checkOrderItem(List<Long> dto);
src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
@@ -13,6 +13,7 @@
import cc.mrbird.febs.mall.vo.AdminMallGoodsCommentVo;
import cc.mrbird.febs.mall.vo.activity.AdminActivityCommentVo;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderCheckVo;
import cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderItemVo;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
@@ -42,6 +43,7 @@
    private final HappyActivityOrderMapper happyActivityOrderMapper;
    private final HappyActivityCommentMapper happyActivityCommentMapper;
    private final HappyActivityOrderItemMapper happyActivityOrderItemMapper;
    private final HappyActivityConnectMapper happyActivityConnectMapper;
    private final HappyFollowMapper happyFollowMapper;
    private final MallMemberMapper mallMemberMapper;
    private final AgentProducer agentProducer;
@@ -378,6 +380,13 @@
    }
    @Override
    public IPage<AdminHappyActivityOrderItemVo> activityOrderListV2(AdminHappyActivityOrderDto dto, QueryRequest request) {
        Page<AdminHappyActivityOrderItemVo> page = new Page<>(request.getPageNum(), request.getPageSize());
        Page<AdminHappyActivityOrderItemVo> adminOptionVoIPage = this.baseMapper.selectOrderItemInPage(page, dto);
        return adminOptionVoIPage;
    }
    @Override
    public FebsResponse checkOrder(List<Long> ids) {
        if (CollUtil.isEmpty(ids)){
@@ -489,6 +498,83 @@
    }
    @Override
    public List<AdminHappyActivityOrderItemVo> getOrderListForExportV2(Map<String, String> params) {
        List<AdminHappyActivityOrderItemVo> list = new ArrayList<>();
        LambdaQueryWrapper<HappyActivityOrder> queryWrapper = new LambdaQueryWrapper<>();
        if(ObjectUtil.isNotEmpty(params.get("activityId"))){
            queryWrapper.eq(HappyActivityOrder::getActivityId, Long.valueOf(params.get("activityId")));
        }
        List<Integer> stateList = Arrays.asList(StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode(), StateUpDownEnum.ORDER_STATE_USED.getCode());
        queryWrapper.in(HappyActivityOrder::getState, stateList);
        queryWrapper.eq(HappyActivityOrder::getDeleteFlag, StateUpDownEnum.DOWN.getCode());
        queryWrapper.orderByDesc(HappyActivityOrder::getState);
        queryWrapper.orderByDesc(HappyActivityOrder::getId);
        List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList(queryWrapper);
        if(CollUtil.isNotEmpty(happyActivityOrders)){
            Map<Long, HappyActivityOrder> happyActivityOrderMap = happyActivityOrders.stream().collect(Collectors.toMap(HappyActivityOrder::getId, order -> order));
            Set<Long> orderIds = happyActivityOrders.stream().map(HappyActivityOrder::getId).collect(Collectors.toSet());
            List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList(
                    new LambdaQueryWrapper<HappyActivityOrderItem>()
                            .select(HappyActivityOrderItem::getConnectId)
                            .in(HappyActivityOrderItem::getOrderId, orderIds)
            );
            Set<Long> connectIds = happyActivityOrderItems.stream().map(HappyActivityOrderItem::getConnectId).collect(Collectors.toSet());
            List<HappyActivityConnect> happyActivityConnects = happyActivityConnectMapper.selectList(
                    new LambdaQueryWrapper<HappyActivityConnect>()
                            .select(HappyActivityConnect::getId,HappyActivityConnect::getName,HappyActivityConnect::getPhone,HappyActivityConnect::getAddress)
                            .in(HappyActivityConnect::getId, connectIds)
            );
            Map<Long, HappyActivityConnect> happyActivityConnectMap = happyActivityConnects.stream().collect(Collectors.toMap(HappyActivityConnect::getId, happyActivityConnect -> happyActivityConnect));
            Set<Long> collect = happyActivityOrders.stream().map(HappyActivityOrder::getMemberId).collect(Collectors.toSet());
            List<MallMember> mallMembers = mallMemberMapper.selectList(
                    new LambdaQueryWrapper<MallMember>()
                            .select(MallMember::getId,MallMember::getName)
                            .in(MallMember::getId, collect)
            );
            Map<Long, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getId, mallMember -> mallMember));
            happyActivityOrderItems.forEach(happyActivityOrderItem -> {
                AdminHappyActivityOrderItemVo vo = new AdminHappyActivityOrderItemVo();
                HappyActivityConnect happyActivityConnect = happyActivityConnectMap.get(happyActivityOrderItem.getConnectId());
                vo.setConnectName(happyActivityConnect.getName());
                vo.setConnectPhone(happyActivityConnect.getPhone());
                vo.setConnectAddress(happyActivityConnect.getAddress());
                HappyActivityOrder happyActivityOrder = happyActivityOrderMap.get(happyActivityOrderItem.getOrderId());
                vo.setId(happyActivityOrder.getId());
                vo.setCreatedTime(happyActivityOrder.getCreatedTime());
                vo.setMemberId(happyActivityOrder.getMemberId());
                vo.setActivityId(happyActivityOrder.getActivityId());
                vo.setPrice(happyActivityOrder.getPrice());
                vo.setNumCnt(happyActivityOrder.getNumCnt());
                vo.setAmount(happyActivityOrder.getAmount());
                vo.setPayState(happyActivityOrder.getPayState());
                vo.setPayType(happyActivityOrder.getPayType());
                vo.setPayTime(happyActivityOrder.getPayTime());
                vo.setDeleteFlag(happyActivityOrder.getDeleteFlag());
                vo.setOrderNo(happyActivityOrder.getOrderNo());
                vo.setPayOrderNo(happyActivityOrder.getPayOrderNo());
                vo.setWxOrderNo(happyActivityOrder.getWxOrderNo());
                vo.setState(happyActivityOrder.getState());
                vo.setFailTime(happyActivityOrder.getFailTime());
                MallMember mallMember = mallMemberMap.get(happyActivityOrderItem.getMemberId());
                if (ObjectUtil.isNotEmpty(mallMember)){
                    vo.setMemberName(mallMember.getName());
                }else{
                    vo.setMemberName("");
                }
            });
        }
        return list;
    }
    @Override
    public IPage<AdminHappyActivityOrderCheckVo> activityOrderCheckList(AdminHappyActivityOrderCheckDto dto, QueryRequest request) {
        Page<AdminHappyActivityOrderCheckVo> page = new Page<>(request.getPageNum(), request.getPageSize());
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -508,6 +508,7 @@
    }
    @Override
    @Transactional
    public FebsResponse createOrder(ApiCreateOrderDto dto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        if(CollUtil.isEmpty(dto.getConnectIds())){
src/main/java/cc/mrbird/febs/mall/vo/activity/AdminHappyActivityOrderItemVo.java
New file
@@ -0,0 +1,36 @@
package cc.mrbird.febs.mall.vo.activity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class AdminHappyActivityOrderItemVo {
    private Long id;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime;
    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;
    private Integer state;
    private Date failTime;
    private String connectName;
    private String connectPhone;
    private String connectAddress;
    private String memberName;//
    private String activityName;//
}
src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -110,6 +110,36 @@
        order by a.id desc
    </select>
    <select id="selectOrderItemInPage" resultType="cc.mrbird.febs.mall.vo.activity.AdminHappyActivityOrderItemVo">
        select
                a.*,
               e.name as connectName,
               e.phone as connectPhone,
               e.address as connectAddress,
               b.name as memberName,
               c.name as activityName
        from happy_activity_order_item d
        left join happy_activity_connect e on e.id = d.connect_id
        left join happy_activity_order a on a.id = d.order_id
        left join mall_member b on a.member_id = b.id
        left join happy_activity c on a.activity_id = c.id
        <where>
            and a.DELETE_FLAG = 0
            <if test="record != null">
                <if test="record.name != null and record.name != ''">
                    and b.name like CONCAT('%', CONCAT(#{record.name}, '%'))
                </if>
                <if test="record.state != null">
                    and a.state=#{record.state}
                </if>
                <if test="record.activityId != null">
                    and a.activity_id=#{record.activityId}
                </if>
            </if>
        </where>
        order by a.id desc
    </select>
    <select id="getVoteOptionRecordInPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityOptionListVo">
src/main/resources/templates/febs/views/modules/votesActivity/orderList.html
@@ -257,16 +257,19 @@
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'orderActivityTable',
                url: ctx + 'admin/happyActivity/activityOrderList',
                url: ctx + 'admin/happyActivity/activityOrderListV2',
                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'},
                    {field: 'memberName', title: '名称', minWidth: 100,align:'center'},
                    {field: 'orderNo', title: '订单编号', minWidth: 100,align:'center'},
                    {field: 'activityName', title: '活动名称', minWidth: 100,align:'center'},
                    {field: 'connectName', title: '报名人', minWidth: 100,align:'center'},
                    {field: 'connectPhone', title: '报名电话', minWidth: 100,align:'center'},
                    {field: 'connectAddress', title: '报名地址', minWidth: 100,align:'center'},
                    {field: 'price', title: '单价', minWidth: 100,align:'center'},
                    {field: 'numCnt', title: '数量', minWidth: 100,align:'center'},
                    {field: 'amount', title: '总价', minWidth: 100,align:'center'},