|
|
@@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.dromara.common.core.context.PlatformContext;
|
|
|
+import org.dromara.common.core.domain.R;
|
|
|
import org.dromara.common.core.enums.*;
|
|
|
import org.dromara.common.core.exception.ServiceException;
|
|
|
import org.dromara.common.core.exception.api.ZhongcheException;
|
|
|
@@ -56,6 +57,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.sql.SQLIntegrityConstraintViolationException;
|
|
|
import java.time.LocalDate;
|
|
|
+import java.time.ZoneId;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
@@ -140,6 +142,8 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
|
|
|
|
|
|
private final IOrderAssignmentService orderAssignmentService;
|
|
|
|
|
|
+ private final OrderReturnMapper orderReturnMapper;
|
|
|
+
|
|
|
/**
|
|
|
* 查询订单主信息
|
|
|
*
|
|
|
@@ -2029,4 +2033,108 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<OrderIndexDataVo> orderIndexData() {
|
|
|
+ OrderIndexDataVo vo = new OrderIndexDataVo();
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ Date todayStart = Date.from(today.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ Date todayEnd = Date.from(today.plusDays(1).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ Date monthStart = Date.from(today.withDayOfMonth(1).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+
|
|
|
+ // ========== 1. 统计卡片 ==========
|
|
|
+ // 今日订单数
|
|
|
+ Long todayOrders = baseMapper.selectCount(new LambdaQueryWrapper<OrderMain>()
|
|
|
+ .ge(OrderMain::getCreateTime, todayStart)
|
|
|
+ .lt(OrderMain::getCreateTime, todayEnd));
|
|
|
+ vo.setTodayOrders(todayOrders);
|
|
|
+
|
|
|
+ // 待发货订单数
|
|
|
+ Long pendingDelivery = baseMapper.selectCount(new LambdaQueryWrapper<OrderMain>()
|
|
|
+ .eq(OrderMain::getOrderStatus, OrderStatus.PENDING_SHIPMENT.getCode()));
|
|
|
+ vo.setPendingDeliveryOrders(pendingDelivery);
|
|
|
+
|
|
|
+ // 本月成交额
|
|
|
+ List<OrderMain> monthlyOrders = baseMapper.selectList(new LambdaQueryWrapper<OrderMain>()
|
|
|
+ .select(OrderMain::getTotalAmount)
|
|
|
+ .ge(OrderMain::getCreateTime, monthStart)
|
|
|
+ .lt(OrderMain::getCreateTime, todayEnd));
|
|
|
+ BigDecimal monthlyRevenue = monthlyOrders.stream()
|
|
|
+ .map(OrderMain::getTotalAmount)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ vo.setMonthlyRevenue(monthlyRevenue);
|
|
|
+
|
|
|
+ // 售后退款订单数
|
|
|
+ Long afterSaleOrders = orderReturnMapper.selectCount(new LambdaQueryWrapper<OrderReturn>()
|
|
|
+ .gt(OrderReturn::getReturnStatus, 0));
|
|
|
+ vo.setAfterSaleOrders(afterSaleOrders);
|
|
|
+
|
|
|
+ // ========== 2. 近七日订单趋势 ==========
|
|
|
+ List<OrderIndexDataVo.DayTrend> weeklyTrend = new ArrayList<>();
|
|
|
+ for (int i = 6; i >= 0; i--) {
|
|
|
+ LocalDate date = today.minusDays(i);
|
|
|
+ Date dayStart = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ Date dayEnd = Date.from(date.plusDays(1).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
|
|
|
+ Long count = baseMapper.selectCount(new LambdaQueryWrapper<OrderMain>()
|
|
|
+ .ge(OrderMain::getCreateTime, dayStart)
|
|
|
+ .lt(OrderMain::getCreateTime, dayEnd));
|
|
|
+
|
|
|
+ OrderIndexDataVo.DayTrend trend = new OrderIndexDataVo.DayTrend();
|
|
|
+ trend.setDate(date.format(DateTimeFormatter.ofPattern("MM-dd")));
|
|
|
+ trend.setCount(count);
|
|
|
+ weeklyTrend.add(trend);
|
|
|
+ }
|
|
|
+ vo.setWeeklyTrend(weeklyTrend);
|
|
|
+
|
|
|
+ // ========== 3. 平台订单占比(按 assigneeType: srm, bp, zy) ==========
|
|
|
+ List<OrderMain> platformOrders = baseMapper.selectList(new LambdaQueryWrapper<OrderMain>()
|
|
|
+ .select(OrderMain::getAssigneeType)
|
|
|
+ .isNotNull(OrderMain::getAssigneeType)
|
|
|
+ .ne(OrderMain::getAssigneeType, ""));
|
|
|
+ Map<String, Long> platformCountMap = platformOrders.stream()
|
|
|
+ .collect(Collectors.groupingBy(OrderMain::getAssigneeType, Collectors.counting()));
|
|
|
+
|
|
|
+ List<OrderIndexDataVo.PlatformProportion> proportions = new ArrayList<>();
|
|
|
+ proportions.add(buildProportion("供应商", platformCountMap.getOrDefault("srm", 0L)));
|
|
|
+ proportions.add(buildProportion("伙伴商", platformCountMap.getOrDefault("bp", 0L)));
|
|
|
+ proportions.add(buildProportion("自营客户", platformCountMap.getOrDefault("zy", 0L)));
|
|
|
+ vo.setPlatformProportion(proportions);
|
|
|
+
|
|
|
+ // ========== 4. 最新订单列表(前10条) ==========
|
|
|
+ List<OrderMain> latestOrders = baseMapper.selectList(new LambdaQueryWrapper<OrderMain>()
|
|
|
+ .orderByDesc(OrderMain::getCreateTime)
|
|
|
+ .last("LIMIT 10"));
|
|
|
+
|
|
|
+ Set<Long> customerIds = latestOrders.stream()
|
|
|
+ .map(OrderMain::getCustomerId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ Map<Long, String> customerNameMap = customerIds.isEmpty()
|
|
|
+ ? Collections.emptyMap()
|
|
|
+ : remoteCustomerService.selectCustomerNameByIds(customerIds);
|
|
|
+
|
|
|
+ List<OrderIndexDataVo.LatestOrder> latestOrderList = latestOrders.stream().map(order -> {
|
|
|
+ OrderIndexDataVo.LatestOrder lo = new OrderIndexDataVo.LatestOrder();
|
|
|
+ lo.setOrderNo(order.getOrderNo());
|
|
|
+ lo.setCustomerName(customerNameMap.get(order.getCustomerId()));
|
|
|
+ lo.setOrderSource(order.getOrderSource());
|
|
|
+ lo.setAmount(order.getTotalAmount());
|
|
|
+ lo.setStatus(order.getOrderStatus());
|
|
|
+ if (order.getCreateTime() != null) {
|
|
|
+ lo.setCreateTime(order.getCreateTime());
|
|
|
+ }
|
|
|
+ return lo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ vo.setLatestOrders(latestOrderList);
|
|
|
+
|
|
|
+ return R.ok(vo);
|
|
|
+ }
|
|
|
+
|
|
|
+ private OrderIndexDataVo.PlatformProportion buildProportion(String name, Long value) {
|
|
|
+ OrderIndexDataVo.PlatformProportion proportion = new OrderIndexDataVo.PlatformProportion();
|
|
|
+ proportion.setName(name);
|
|
|
+ proportion.setValue(value);
|
|
|
+ return proportion;
|
|
|
+ }
|
|
|
}
|