feat(order): 添加订单数量统计功能

- 新增 OrderNumVO 类用于订单数量统计
- 在 OrderService 接口中添加 getOrderNumVO 方法
- 在 OrderServiceImpl 类中实现 getOrderNumVO 方法
- 在 OrderMapper 接口中添加 getOrderNumVO SQL 查询
- 在 OrderManagerController 和 OrderStoreController 中添加获取订单数量的 API 接口- 优化物流公司的获取方式,
This commit is contained in:
pikachu1995@126.com
2025-08-29 11:37:41 +08:00
parent ca5887028a
commit 7627614284
5 changed files with 102 additions and 9 deletions

View File

@@ -0,0 +1,33 @@
package cn.lili.modules.order.aftersale.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 售后数量VO
*
* @author Bulbasaur
* @since 2021/3/12 10:32 上午
*/
@Data
public class AfterSaleNumVO {
@ApiModelProperty(value = "申请中售后数量")
private Integer applyNum;
@ApiModelProperty(value = "已通过售后数量")
private Integer passNum;
@ApiModelProperty(value = "已拒绝售后数量")
private Integer refuseNum;
@ApiModelProperty(value = "待卖家收货售后数量")
private Integer buyerReturnNum;
@ApiModelProperty(value = "卖家确认收货售后数量")
private Integer sellerConfirmNum;
@ApiModelProperty(value = "卖家终止售后售后数量")
private Integer sellerTerminationNum;
@ApiModelProperty(value = "买家取消售后售后数量")
private Integer buyerCancelNum;
@ApiModelProperty(value = "等待平台退款售后数量")
private Integer waitRefundNum;
@ApiModelProperty(value = "已完成售后数量")
private Integer completeNum;
}

View File

@@ -4,6 +4,7 @@ package cn.lili.modules.order.aftersale.service;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleNumVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
@@ -30,6 +31,9 @@ public interface AfterSaleService extends IService<AfterSale> {
*/
IPage<AfterSaleVO> getAfterSalePages(AfterSaleSearchParams saleSearchParams);
AfterSaleNumVO getAfterSaleNumVO(AfterSaleSearchParams saleSearchParams);
/**
* 查询导出售后信息
*

View File

@@ -2,7 +2,6 @@ package cn.lili.modules.order.aftersale.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
@@ -18,6 +17,7 @@ import cn.lili.modules.order.aftersale.aop.AfterSaleLogPoint;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleNumVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import cn.lili.modules.order.aftersale.mapper.AfterSaleMapper;
@@ -39,16 +39,13 @@ import cn.lili.modules.system.entity.dos.Logistics;
import cn.lili.modules.system.entity.vo.Traces;
import cn.lili.modules.system.service.LogisticsService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.AfterSaleTagsEnum;
import cn.lili.rocketmq.tags.OrderTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
@@ -56,6 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -98,11 +96,6 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
/**
* RocketMQ
*/
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@@ -112,6 +105,55 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
return baseMapper.queryByParams(PageUtil.initPage(saleSearchParams), saleSearchParams.queryWrapper());
}
@Override
public AfterSaleNumVO getAfterSaleNumVO(AfterSaleSearchParams saleSearchParams) {
AfterSaleNumVO afterSaleNumVO = new AfterSaleNumVO();
// 获取基础查询条件
QueryWrapper<AfterSale> baseWrapper = saleSearchParams.queryWrapper();
// 使用聚合查询一次性获取所有状态的售后数量
List<Map<String, Object>> results = this.baseMapper.selectMaps(
baseWrapper.select(
"COUNT(CASE WHEN service_status = 'APPLY' THEN 1 END) as applyNum",
"COUNT(CASE WHEN service_status = 'PASS' THEN 1 END) as passNum",
"COUNT(CASE WHEN service_status = 'REFUSE' THEN 1 END) as refuseNum",
"COUNT(CASE WHEN service_status = 'BUYER_RETURN' THEN 1 END) as buyerReturnNum",
"COUNT(CASE WHEN service_status = 'SELLER_CONFIRM' THEN 1 END) as sellerConfirmNum",
"COUNT(CASE WHEN service_status = 'SELLER_TERMINATION' THEN 1 END) as sellerTerminationNum",
"COUNT(CASE WHEN service_status = 'BUYER_CANCEL' THEN 1 END) as buyerCancelNum",
"COUNT(CASE WHEN service_status = 'WAIT_REFUND' THEN 1 END) as waitRefundNum",
"COUNT(CASE WHEN service_status = 'COMPLETE' THEN 1 END) as completeNum"
)
);
if (!results.isEmpty()) {
Map<String, Object> result = results.get(0);
afterSaleNumVO.setApplyNum(((Number) result.get("applyNum")).intValue());
afterSaleNumVO.setPassNum(((Number) result.get("passNum")).intValue());
afterSaleNumVO.setRefuseNum(((Number) result.get("refuseNum")).intValue());
afterSaleNumVO.setBuyerReturnNum(((Number) result.get("buyerReturnNum")).intValue());
afterSaleNumVO.setSellerConfirmNum(((Number) result.get("sellerConfirmNum")).intValue());
afterSaleNumVO.setSellerTerminationNum(((Number) result.get("sellerTerminationNum")).intValue());
afterSaleNumVO.setBuyerCancelNum(((Number) result.get("buyerCancelNum")).intValue());
afterSaleNumVO.setWaitRefundNum(((Number) result.get("waitRefundNum")).intValue());
afterSaleNumVO.setCompleteNum(((Number) result.get("completeNum")).intValue());
} else {
// 如果没有结果设置默认值为0
afterSaleNumVO.setApplyNum(0);
afterSaleNumVO.setPassNum(0);
afterSaleNumVO.setRefuseNum(0);
afterSaleNumVO.setBuyerReturnNum(0);
afterSaleNumVO.setSellerConfirmNum(0);
afterSaleNumVO.setSellerTerminationNum(0);
afterSaleNumVO.setBuyerCancelNum(0);
afterSaleNumVO.setWaitRefundNum(0);
afterSaleNumVO.setCompleteNum(0);
}
return afterSaleNumVO;
}
@Override
public List<AfterSale> exportAfterSaleOrder(AfterSaleSearchParams saleSearchParams) {
return this.list(saleSearchParams.queryWrapper());

View File

@@ -4,6 +4,7 @@ import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleNumVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import cn.lili.modules.order.aftersale.service.AfterSaleService;
@@ -43,6 +44,12 @@ public class AfterSaleManagerController {
return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams));
}
@ApiOperation(value = "获取售后数量")
@GetMapping(value = "/afterSaleNumVO")
public ResultMessage<AfterSaleNumVO> getAfterSaleNumVO(AfterSaleSearchParams afterSaleSearchParams) {
return ResultUtil.data(afterSaleService.getAfterSaleNumVO(afterSaleSearchParams));
}
@ApiOperation(value = "获取导出售后服务列表列表")
@GetMapping(value = "/exportAfterSaleOrder")
public ResultMessage<List<AfterSale>> exportAfterSaleOrder(AfterSaleSearchParams searchParams) {

View File

@@ -6,6 +6,7 @@ import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleNumVO;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import cn.lili.modules.order.aftersale.service.AfterSaleService;
@@ -53,6 +54,12 @@ public class AfterSaleStoreController {
return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams));
}
@ApiOperation(value = "获取售后数量")
@GetMapping(value = "/afterSaleNumVO")
public ResultMessage<AfterSaleNumVO> getAfterSaleNumVO(AfterSaleSearchParams afterSaleSearchParams) {
return ResultUtil.data(afterSaleService.getAfterSaleNumVO(afterSaleSearchParams));
}
@ApiOperation(value = "获取导出售后服务列表列表")
@GetMapping(value = "/exportAfterSaleOrder")
public ResultMessage<List<AfterSale>> exportAfterSaleOrder(AfterSaleSearchParams searchParams) {