用户消费金额与总订单数,按标签过滤会员,订单列表会员名称与导出
12个文件已修改
1个文件已添加
216 ■■■■ 已修改文件
framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/entity/vo/MemberSearchVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/service/MemberService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/MemberMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/OrderCountVO.java
New file
@@ -0,0 +1,27 @@
package cn.lili.modules.lmk.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * lmk-shop-java
 *
 * @author : zxl
 * @date : 2025-09-02 16:06
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderCountVO {
    /**
     * 订单总流水金额
     */
    private Double orderPriceCount;
    /**
     * 订单总数量
     */
    private Integer orderNumCount;
}
framework/src/main/java/cn/lili/modules/member/entity/vo/MemberSearchVO.java
@@ -4,6 +4,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * 会员搜索VO
 *
@@ -27,4 +29,7 @@
     */
    @ApiModelProperty(value = "会员状态")
    private String disabled;
    private List<String> tagIds;
}
framework/src/main/java/cn/lili/modules/member/service/MemberService.java
@@ -241,6 +241,8 @@
     */
    Token refreshStoreToken(String refreshToken);
    IPage<MemberVO> getMemberPageAndTag(MemberSearchVO memberSearchVO, PageVO page);
    /**
     * 会员积分变动
     *
framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
@@ -4,7 +4,6 @@
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.MD5;
import cn.lili.base.Result;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
@@ -57,7 +56,6 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.catalina.security.SecurityUtil;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
@@ -70,6 +68,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * 会员接口业务层实现
@@ -578,8 +577,36 @@
        queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled",
                memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0);
        queryWrapper.orderByDesc("create_time");
        return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper);
    }
    @Override
    public IPage<MemberVO> getMemberPageAndTag(MemberSearchVO memberSearchVO, PageVO page) {
        QueryWrapper<Member> queryWrapper = Wrappers.query();
        //用户名查询
        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername());
        //用户名查询
        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName());
        //按照电话号码查询
        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile());
        //按照会员状态查询
        queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled",
                memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0);
        queryWrapper.orderByDesc("create_time");
        if (CollectionUtils.isNotEmpty(memberSearchVO.getTagIds())) {
            // 使用inSql方法进行安全的子查询
            String tagIdsStr = memberSearchVO.getTagIds().stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));
            queryWrapper.inSql("id",
                    "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" +
                            tagIdsStr + ")");
            return this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper);
        }
        return this.baseMapper.pageByMemberVO(PageUtil.initPage(page),queryWrapper);
    }
    @Override
    @PointLogPoint
@@ -832,7 +859,6 @@
            if(StringUtils.isNotBlank(member.getFace()) && !member.getFace().contains("https")){
                member.setFace(cosUtil.getPreviewUrl(member.getFace()));
            }
        }
        return member;
    }
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDTO.java
@@ -87,4 +87,6 @@
    private Date completeTime;
    @ApiModelProperty(value = "店铺")
    private String storeName;
    private String nickName;
}
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderExportDetailDTO.java
@@ -90,4 +90,6 @@
    private String completeTime;
    @ApiModelProperty(value = "店铺")
    private String storeName;
    private String nickName;
}
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java
@@ -53,6 +53,8 @@
    @ApiModelProperty(value = "买家昵称")
    private String buyerName;
    @ApiModelProperty(value = "用户昵称")
    private String nickName;
    @ApiModelProperty(value = "订单状态")
    private String orderStatus;
@@ -172,6 +174,9 @@
        //订单来源
        wrapper.like(CharSequenceUtil.isNotEmpty(clientType), "o.client_type", clientType);
        //用户昵称
        wrapper.like(CharSequenceUtil.isNotEmpty(nickName),"m.nick_name",nickName);
        //按评价状态
        wrapper.eq(CharSequenceUtil.isNotEmpty(commentStatus), "oi.comment_status", commentStatus);
framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
@@ -60,8 +60,11 @@
            "oi.after_sale_status AS after_sale_status," +
            "o.logistics_time AS logistics_time," +
            "o.complete_time AS complete_time," +
            "o.store_name AS store_name " +
            " FROM li_order o LEFT JOIN li_order_item oi ON oi.order_sn = o.sn ${ew.customSqlSegment}")
            "o.store_name AS store_name, " +
            "m.nick_name AS nickName" +
            " FROM li_order o LEFT JOIN li_order_item oi ON oi.order_sn = o.sn " +
            "LEFT JOIN li_member m on m.id = o.member_id " +
            "${ew.customSqlSegment}")
    List<OrderExportDTO> queryExportOrder(@Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
    /**
@@ -102,8 +105,33 @@
            " FROM li_order o LEFT JOIN li_order_item AS oi on o.sn = oi.order_sn " +
            "LEFT JOIN li_member m on m.id = o.member_id " +
            "${ew.customSqlSegment}")
    IPage<OrderSimpleVO> queryByParams(IPage<OrderSimpleVO> page, @Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
    /**
     * 获得指定用户的订单
     * @param queryWrapper
     * @return
     */
    @Select("select o.sn,o.flow_price,o.create_time,o.order_status,o.pay_status,o.payment_method,o.payment_time,o.member_name,o.store_name as " +
            "store_name,o.store_id as store_id,o.client_type,o.order_type,o.deliver_status,o.order_promotion_type,o.seller_remark, " +
            "o.consignee_name AS consigneeName," +
            "o.consignee_mobile AS consigneeMobile," +
            "o.member_id AS memberId," +
            " GROUP_CONCAT(oi.goods_id) as group_goods_id," +
            " GROUP_CONCAT(oi.sku_id) as group_sku_id," +
            " GROUP_CONCAT(oi.num) as group_num" +
            ",GROUP_CONCAT(oi.image) as group_images" +
            ",GROUP_CONCAT(oi.goods_name) as group_name " +
            ",GROUP_CONCAT(oi.after_sale_status) as group_after_sale_status" +
            ",GROUP_CONCAT(oi.complain_status) as group_complain_status" +
            ",GROUP_CONCAT(oi.comment_status) as group_comment_status" +
            ",GROUP_CONCAT(oi.sn) as group_order_items_sn " +
            ",GROUP_CONCAT(oi.goods_price) as group_goods_price " +
            ",GROUP_CONCAT(oi.is_refund) as group_is_refund " +
            ",GROUP_CONCAT(oi.refund_price) as group_refund_price " +
            " FROM li_order o LEFT JOIN li_order_item AS oi on o.sn = oi.order_sn " +
            "${ew.customSqlSegment}")
    List<OrderSimpleVO> queryByParamsCount(@Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
    /**
     * 查询订单简短信息分页
     *
framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java
@@ -1,6 +1,7 @@
package cn.lili.modules.order.order.service;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.lmk.domain.vo.OrderCountVO;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.order.entity.dos.Order;
@@ -45,6 +46,13 @@
     */
    Order getBySn(String orderSn);
    /**
     * 统计用户的总金额以及订单已完成数
     *
     * @param id 会员id
     * @return
     */
    OrderCountVO countByIdOrder(String id);
    /**
     * 订单查询
@@ -338,4 +346,6 @@
     * @return 订单
     */
    Order updateSellerRemark(String orderSn, String sellerRemark);
}
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -27,6 +27,7 @@
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.lmk.domain.vo.OrderCountVO;
import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
@@ -251,6 +252,36 @@
    }
    @Override
    public OrderCountVO countByIdOrder(String id) {
        OrderSearchParams orderSearchParams = new OrderSearchParams();
        orderSearchParams.setOrderStatus(OrderStatusEnum.COMPLETED.name());
        orderSearchParams.setMemberId(id);
        QueryWrapper queryWrapper = orderSearchParams.queryWrapper();
        queryWrapper.groupBy("o.id");
        queryWrapper.orderByDesc("o.id");
        List<OrderSimpleVO> list =  this.baseMapper.queryByParamsCount(queryWrapper);
        OrderCountVO orderCountVO = new OrderCountVO();
        orderCountVO.setOrderNumCount(0);
        orderCountVO.setOrderPriceCount(0.0);
        if (CollectionUtil.isEmpty(list)) {
            return orderCountVO;
        }else {
            for (OrderSimpleVO vo : list) {
                if (vo == null) {
                    System.out.println("出现空元素");
                    continue; // 跳过null元素,或根据业务处理
                }
                orderCountVO.setOrderNumCount(orderCountVO.getOrderNumCount() + 1);
                Double flowPrice = vo.getFlowPrice() != null ? vo.getFlowPrice() : 0.0;
                orderCountVO.setOrderPriceCount(orderCountVO.getOrderPriceCount() + flowPrice);;
            }
        }
        return orderCountVO;
    }
    @Override
    public IPage<OrderSimpleVO> queryByParams(OrderSearchParams orderSearchParams,Boolean needHide) {
        QueryWrapper queryWrapper = orderSearchParams.queryWrapper();
        queryWrapper.groupBy("o.id");
@@ -265,17 +296,8 @@
            }
        }
//        for (OrderSimpleVO vo : page.getRecords()){
//            Member member = memberMapperMapper.selectById(vo.getMemberId());
//            if (member != null){
//                vo.setNickName(member.getNickName());
//            }
//        }
        return page;
    }
    @Override
    public IPage<OrderSimpleXcxVO> queryByXcxParams(OrderSearchXcxParams orderSearchParams) {
        QueryWrapper queryWrapper = orderSearchParams.queryWrapper();
@@ -424,8 +446,6 @@
                vo.setConsigneeMobile(CommonUtil.maskMobile(vo.getConsigneeMobile()));
            }
        }
        XSSFWorkbook workbook = initOrderExportData(orderExportDTOS);
        try {
            // 设置响应头
@@ -517,6 +537,7 @@
            throw new ServiceException(ResultCode.ORDER_CAN_NOT_CANCEL);
        }
    }
    @Override
@@ -1436,7 +1457,7 @@
        // 创建表头
        Row header = sheet.createRow(0);
        String[] headers = {"主订单编号", "子订单编号", "选购商品", "商品数量", "商品ID", "商品单价", "订单应付金额",
                "运费", "优惠总金额", "平台优惠", "商家优惠", "商家改价", "支付方式", "收件人", "收件人手机号",
                "运费", "优惠总金额", "平台优惠", "商家优惠", "商家改价", "支付方式","卖家名称", "收件人", "收件人手机号",
                "省", "市", "区", "街道", "详细地址", "买家留言", "订单提交时间", "支付完成时间", "来源",
                "订单状态", "订单类型", "售后状态", "取消原因", "发货时间", "完成时间", "店铺"};
@@ -1461,24 +1482,27 @@
            row.createCell(10).setCellValue(dto.getStoreMarketingCost()!=null?dto.getStoreMarketingCost():0);
            row.createCell(11).setCellValue(dto.getUpdatePrice()!=null?dto.getUpdatePrice():0);
            row.createCell(12).setCellValue(dto.getPaymentMethod());
            row.createCell(13).setCellValue(dto.getConsigneeName());
            row.createCell(14).setCellValue(dto.getConsigneeMobile());
            row.createCell(15).setCellValue(dto.getProvince());
            row.createCell(16).setCellValue(dto.getCity());
            row.createCell(17).setCellValue(dto.getDistrict());
            row.createCell(18).setCellValue(dto.getStreet());
            row.createCell(19).setCellValue(dto.getConsigneeDetail());
            row.createCell(20).setCellValue(dto.getRemark());
            row.createCell(21).setCellValue(dto.getCreateTime());
            row.createCell(22).setCellValue(dto.getPaymentTime());
            row.createCell(23).setCellValue(dto.getClientType());
            row.createCell(24).setCellValue(dto.getOrderStatus());
            row.createCell(25).setCellValue(dto.getOrderType());
            row.createCell(26).setCellValue(dto.getAfterSaleStatus());
            row.createCell(27).setCellValue(dto.getCancelReason());
            row.createCell(28).setCellValue(dto.getLogisticsTime());
            row.createCell(29).setCellValue(dto.getCompleteTime());
            row.createCell(30).setCellValue(dto.getStoreName());
            row.createCell(13).setCellValue(dto.getNickName());
            row.createCell(14).setCellValue(dto.getConsigneeName());
            row.createCell(15).setCellValue(dto.getConsigneeMobile());
            row.createCell(16).setCellValue(dto.getProvince());
            row.createCell(17).setCellValue(dto.getCity());
            row.createCell(18).setCellValue(dto.getDistrict());
            row.createCell(19).setCellValue(dto.getStreet());
            row.createCell(20).setCellValue(dto.getConsigneeDetail());
            row.createCell(21).setCellValue(dto.getRemark());
            row.createCell(22).setCellValue(dto.getCreateTime());
            row.createCell(23).setCellValue(dto.getPaymentTime());
            row.createCell(24).setCellValue(dto.getClientType());
            row.createCell(25).setCellValue(dto.getOrderStatus());
            row.createCell(26).setCellValue(dto.getOrderType());
            row.createCell(27).setCellValue(dto.getAfterSaleStatus());
            row.createCell(28).setCellValue(dto.getCancelReason());
            row.createCell(29).setCellValue(dto.getLogisticsTime());
            row.createCell(30).setCellValue(dto.getCompleteTime());
            row.createCell(31).setCellValue(dto.getStoreName());
        }
        //修改列宽
framework/src/main/resources/mapper/lmk/MemberMapper.xml
@@ -23,6 +23,7 @@
        <result column="last_login_date" property="lastLoginDate"/>
        <result column="grade_id" property="gradeId"/>
        <result column="experience" property="experience"/>
        <result column="create_time" property="createTime"/>
        <collection property="tags" ofType="cn.lili.modules.lmk.domain.vo.MemberTagVO">
            <id column="member_tag_id" property="id"/>
            <result column="tag_name" property="tagName"/>
manager-api/src/main/java/cn/lili/controller/order/OrderManagerController.java
@@ -8,6 +8,7 @@
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.lmk.domain.vo.OrderCountVO;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dto.OrderExportDTO;
@@ -64,6 +65,12 @@
        Boolean needHide = true;
        return ResultUtil.data(orderService.queryByParams(orderSearchParams,needHide));
    }
    @ApiOperation(value = "查询订单并统计金额与订单数")
    @GetMapping("/countOrder/{id}")
    public ResultMessage<OrderCountVO> countByIdOrder(@PathVariable("id") String id){
        return ResultUtil.data(orderService.countByIdOrder(id));
    }
    @ApiOperation(value = "更新订单状态")
    @GetMapping("/sendMessage/{snNo}")
    public ResultMessage<String> sendMqMessage(@PathVariable String  snNo) {
manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java
@@ -39,7 +39,7 @@
    @ApiOperation(value = "会员分页列表")
    @GetMapping
    public ResultMessage<IPage<MemberVO>> getByPage(MemberSearchVO memberSearchVO, PageVO page) {
        return ResultUtil.data(memberService.getMemberPage(memberSearchVO, page));
        return ResultUtil.data(memberService.getMemberPageAndTag(memberSearchVO, page));
    }
@@ -47,7 +47,8 @@
    @ApiImplicitParam(name = "id", value = "会员ID", required = true, dataType = "String", paramType = "path")
    @GetMapping(value = "/{id}")
    public ResultMessage<MemberVO> get(@PathVariable String id) {
        return ResultUtil.data(memberService.getMember(id));
        MemberVO memberVO = memberService.getMember(id);
        return ResultUtil.data(memberVO);
    }
    @ApiOperation(value = "添加会员")