mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	@@ -24,8 +24,11 @@ import org.springframework.web.bind.annotation.*;
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
			
		||||
 | 
			
		||||
@Tag(name = "管理后台 - 交易订单")
 | 
			
		||||
@@ -56,7 +59,9 @@ public class TradeOrderController {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 查询用户信息
 | 
			
		||||
        Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(convertSet(pageResult.getList(), TradeOrderDO::getUserId));
 | 
			
		||||
        Set<Long> userIds = CollUtil.unionDistinct(convertList(pageResult.getList(), TradeOrderDO::getUserId),
 | 
			
		||||
                convertList(pageResult.getList(), TradeOrderDO::getBrokerageUserId, Objects::nonNull));
 | 
			
		||||
        Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(userIds);
 | 
			
		||||
        // 查询订单项
 | 
			
		||||
        List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId(
 | 
			
		||||
                convertSet(pageResult.getList(), TradeOrderDO::getId));
 | 
			
		||||
@@ -64,6 +69,13 @@ public class TradeOrderController {
 | 
			
		||||
        return success(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/summary")
 | 
			
		||||
    @Operation(summary = "获得交易订单统计")
 | 
			
		||||
    @PreAuthorize("@ss.hasPermission('trade:order:query')")
 | 
			
		||||
    public CommonResult<TradeOrderSummaryRespVO> getOrderSummary(TradeOrderPageReqVO reqVO) {
 | 
			
		||||
        return success(tradeOrderQueryService.getOrderSummary(reqVO));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/get-detail")
 | 
			
		||||
    @Operation(summary = "获得交易订单详情")
 | 
			
		||||
    @Parameter(name = "id", description = "订单编号", required = true, example = "1")
 | 
			
		||||
 
 | 
			
		||||
@@ -145,4 +145,7 @@ public class TradeOrderBaseVO {
 | 
			
		||||
    @Schema(description = "VIP 减免金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "888")
 | 
			
		||||
    private Integer vipPrice;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "推广人编号", example = "1")
 | 
			
		||||
    private Long brokerageUserId;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package cn.iocoder.yudao.module.trade.controller.admin.order.vo;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
@@ -14,24 +14,20 @@ public class TradeOrderPageItemRespVO extends TradeOrderBaseVO {
 | 
			
		||||
    @Schema(description = "收件人地区名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "上海 上海市 普陀区")
 | 
			
		||||
    private String receiverAreaName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单项列表
 | 
			
		||||
     */
 | 
			
		||||
    @Schema(description = "订单项列表", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    private List<Item> items;
 | 
			
		||||
 | 
			
		||||
    // TODO @xiaobai:使用 MemberUserRespVO 返回哈;DTO 不直接给前端
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户信息
 | 
			
		||||
     */
 | 
			
		||||
    private MemberUserRespDTO user;
 | 
			
		||||
    @Schema(description = "用户信息", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    private MemberUserRespVO user;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "推广人信息")
 | 
			
		||||
    private MemberUserRespVO brokerageUser;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "管理后台 - 交易订单的分页项的订单项目")
 | 
			
		||||
    @Data
 | 
			
		||||
    public static class Item extends TradeOrderItemBaseVO {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 属性数组
 | 
			
		||||
         */
 | 
			
		||||
        @Schema(description = "属性列表", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
        private List<ProductPropertyValueDetailRespVO> properties;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,22 @@
 | 
			
		||||
package cn.iocoder.yudao.module.trade.controller.admin.order.vo;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
@Schema(description = "管理后台 - 交易订单统计 Response VO")
 | 
			
		||||
@Data
 | 
			
		||||
public class TradeOrderSummaryRespVO {
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
 | 
			
		||||
    private Long orderCount;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "订单金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
 | 
			
		||||
    private Long orderPayPrice;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "退款单数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
 | 
			
		||||
    private Long afterSaleCount;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
 | 
			
		||||
    private Long afterSalePrice;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -124,13 +124,17 @@ public interface TradeOrderConvert {
 | 
			
		||||
            TradeOrderPageItemRespVO orderVO = convert(order, xOrderItems);
 | 
			
		||||
            // 处理收货地址
 | 
			
		||||
            orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId()));
 | 
			
		||||
            // 增加用户昵称
 | 
			
		||||
            orderVO.setUser(memberUserMap.get(orderVO.getUserId()));
 | 
			
		||||
            // 增加用户信息
 | 
			
		||||
            orderVO.setUser(convertUser(memberUserMap.get(orderVO.getUserId())));
 | 
			
		||||
            // 增加推广人信息
 | 
			
		||||
            orderVO.setBrokerageUser(convertUser(memberUserMap.get(orderVO.getBrokerageUserId())));
 | 
			
		||||
            return orderVO;
 | 
			
		||||
        });
 | 
			
		||||
        return new PageResult<>(orderVOs, pageResult.getTotal());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    MemberUserRespVO convertUser(MemberUserRespDTO memberUserRespDTO);
 | 
			
		||||
 | 
			
		||||
    TradeOrderPageItemRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> items);
 | 
			
		||||
 | 
			
		||||
    ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean);
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.trade.dal.mysql.order;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
			
		||||
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
 | 
			
		||||
@@ -11,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
@Mapper
 | 
			
		||||
@@ -42,6 +44,26 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
 | 
			
		||||
                .orderByDesc(TradeOrderDO::getId));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default List<Map<String, Object>> selectOrderSummaryGroupByRefundStatus(TradeOrderPageReqVO reqVO, Set<Long> userIds) {
 | 
			
		||||
        return selectMaps(new MPJLambdaWrapperX<TradeOrderDO>()
 | 
			
		||||
                .selectAs(TradeOrderDO::getRefundStatus, TradeOrderDO::getRefundStatus)  // 售后状态
 | 
			
		||||
                .selectCount(TradeOrderDO::getId, "count") // 售后状态对应的数量
 | 
			
		||||
                .selectSum(TradeOrderDO::getPayPrice, "price")  // 售后状态对应的支付金额
 | 
			
		||||
                .likeIfPresent(TradeOrderDO::getNo, reqVO.getNo())
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getDeliveryType, reqVO.getDeliveryType())
 | 
			
		||||
                .inIfPresent(TradeOrderDO::getUserId, userIds)
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getType, reqVO.getType())
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus())
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
 | 
			
		||||
                .eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
 | 
			
		||||
                .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
 | 
			
		||||
                .likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
 | 
			
		||||
                .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
 | 
			
		||||
                .groupBy(TradeOrderDO::getRefundStatus)); // 按售后状态分组
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    default PageResult<TradeOrderDO> selectPage(AppTradeOrderPageReqVO reqVO, Long userId) {
 | 
			
		||||
        return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
 | 
			
		||||
                .eq(TradeOrderDO::getUserId, userId)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.service.order;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
 | 
			
		||||
@@ -64,6 +65,14 @@ public interface TradeOrderQueryService {
 | 
			
		||||
     */
 | 
			
		||||
    PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得订单统计
 | 
			
		||||
     *
 | 
			
		||||
     * @param reqVO 请求参数
 | 
			
		||||
     * @return 订单统计
 | 
			
		||||
     */
 | 
			
		||||
    TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 【会员】获得交易订单分页
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package cn.iocoder.yudao.module.trade.service.order;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.map.MapUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.hutool.extra.spring.SpringUtil;
 | 
			
		||||
@@ -8,6 +9,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
			
		||||
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
 | 
			
		||||
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
 | 
			
		||||
@@ -15,6 +17,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
 | 
			
		||||
@@ -85,24 +88,57 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO) {
 | 
			
		||||
        // 根据用户查询条件构建用户编号列表
 | 
			
		||||
        Set<Long> userIds = buildQueryConditionUserIds(reqVO);
 | 
			
		||||
        if (userIds == null) { // 没查询到用户,说明肯定也没他的订单
 | 
			
		||||
            return PageResult.empty();
 | 
			
		||||
        }
 | 
			
		||||
        // 分页查询
 | 
			
		||||
        return tradeOrderMapper.selectPage(reqVO, userIds);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Set<Long> buildQueryConditionUserIds(TradeOrderPageReqVO reqVO) {
 | 
			
		||||
        // 获得 userId 相关的查询
 | 
			
		||||
        Set<Long> userIds = new HashSet<>();
 | 
			
		||||
        if (StrUtil.isNotEmpty(reqVO.getUserMobile())) {
 | 
			
		||||
            MemberUserRespDTO user = memberUserApi.getUserByMobile(reqVO.getUserMobile());
 | 
			
		||||
            if (user == null) { // 没查询到用户,说明肯定也没他的订单
 | 
			
		||||
                return new PageResult<>();
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            userIds.add(user.getId());
 | 
			
		||||
        }
 | 
			
		||||
        if (StrUtil.isNotEmpty(reqVO.getUserNickname())) {
 | 
			
		||||
            List<MemberUserRespDTO> users = memberUserApi.getUserListByNickname(reqVO.getUserNickname());
 | 
			
		||||
            if (CollUtil.isEmpty(users)) { // 没查询到用户,说明肯定也没他的订单
 | 
			
		||||
                return new PageResult<>();
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            userIds.addAll(convertSet(users, MemberUserRespDTO::getId));
 | 
			
		||||
        }
 | 
			
		||||
        // 分页查询
 | 
			
		||||
        return tradeOrderMapper.selectPage(reqVO, userIds);
 | 
			
		||||
        return userIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO) {
 | 
			
		||||
        // 根据用户查询条件构建用户编号列表
 | 
			
		||||
        Set<Long> userIds = buildQueryConditionUserIds(reqVO);
 | 
			
		||||
        if (userIds == null) { // 没查询到用户,说明肯定也没他的订单
 | 
			
		||||
            return new TradeOrderSummaryRespVO();
 | 
			
		||||
        }
 | 
			
		||||
        // 查询每个售后状态对应的数量、金额
 | 
			
		||||
        List<Map<String, Object>> list = tradeOrderMapper.selectOrderSummaryGroupByRefundStatus(reqVO, null);
 | 
			
		||||
 | 
			
		||||
        TradeOrderSummaryRespVO vo = new TradeOrderSummaryRespVO().setAfterSaleCount(0L).setAfterSalePrice(0L);
 | 
			
		||||
        for (Map<String, Object> map : list) {
 | 
			
		||||
            Long count = MapUtil.getLong(map, "count", 0L);
 | 
			
		||||
            Long price = MapUtil.getLong(map, "price", 0L);
 | 
			
		||||
            // 未退款的计入订单,部分退款、全部退款计入售后
 | 
			
		||||
            if (TradeOrderRefundStatusEnum.NONE.getStatus().equals(MapUtil.getInt(map, "refundStatus"))) {
 | 
			
		||||
                vo.setOrderCount(count).setOrderPayPrice(price);
 | 
			
		||||
            } else {
 | 
			
		||||
                vo.setAfterSaleCount(vo.getAfterSaleCount() + count).setAfterSalePrice(vo.getAfterSalePrice() + price);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return vo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user