jiaxing.zhou

feat(dashboard): 实现仪表板最近活动数据动态加载

- 为订单、出库、发票和返利模块添加最近记录查询接口
- 在仪表板服务中调用各业务模块真实数据替换模拟数据
- 新增时间格式化工具方法,支持显示相对时间
- 注入返利服务依赖并完善相关数据获取逻辑
- 移除无用的Set导入语句,优化代码结构
......@@ -73,6 +73,14 @@ public interface DeliveryMainService extends IService<DeliveryMain> {
* @return 待出库数量
*/
Integer getPendingDeliveryCount();
/**
* 获取最近的出库记录
*
* @param limit 限制数量
* @return 最近出库列表
*/
List<DeliveryRes> getRecentDeliveries(Integer limit);
}
......
......@@ -73,6 +73,14 @@ public interface InvoiceMainService extends IService<InvoiceMain> {
* @return 待开票数量
*/
Integer getPendingInvoiceCount();
/**
* 获取最近的发票记录
*
* @param limit 限制数量
* @return 最近发票列表
*/
List<InvoiceRes> getRecentInvoices(Integer limit);
}
......
......@@ -108,5 +108,13 @@ public interface OrderMainService extends IService<OrderMain> {
* @return 销售额
*/
Double getTodaySalesAmount(String date);
/**
* 获取最近的订单记录
*
* @param limit 限制数量
* @return 最近订单列表
*/
List<OrderRes> getRecentOrders(Integer limit);
}
......
......@@ -139,4 +139,12 @@ public interface RebateService extends IService<Rebate> {
* @return 趋势统计数据
*/
List<Map<String, Object>> getRebateTrendStats(String startDate, String endDate);
/**
* 获取最近的返利记录
*
* @param limit 限制数量
* @return 最近返利列表
*/
List<RebateRes> getRecentRebates(Integer limit);
}
......
package com.apple.erp.service.impl;
import com.apple.erp.dto.response.DashboardStatsRes;
import com.apple.erp.dto.OrderRes;
import com.apple.erp.dto.DeliveryRes;
import com.apple.erp.dto.InvoiceRes;
import com.apple.erp.dto.response.RebateRes;
import com.apple.erp.service.DashboardService;
import com.apple.erp.service.OrderMainService;
import com.apple.erp.service.DeliveryMainService;
import com.apple.erp.service.InvoiceMainService;
import com.apple.erp.service.RebateService;
import com.apple.erp.service.SessionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -16,7 +21,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 首页仪表板服务实现
......@@ -35,6 +39,9 @@ public class DashboardServiceImpl implements DashboardService {
private InvoiceMainService invoiceMainService;
@Autowired
private RebateService rebateService;
@Autowired
private SessionService sessionService;
@Override
......@@ -130,14 +137,15 @@ public class DashboardServiceImpl implements DashboardService {
private List<Map<String, Object>> getRecentOrders() {
List<Map<String, Object>> activities = new ArrayList<>();
try {
// 这里应该从数据库查询最近的订单
// 暂时返回模拟数据
List<OrderRes> recentOrders = orderMainService.getRecentOrders(2);
for (OrderRes order : recentOrders) {
Map<String, Object> activity = new HashMap<>();
activity.put("id", 1);
activity.put("id", order.getOrderId());
activity.put("type", "order");
activity.put("title", "新订单 ORD-2025-001 已创建");
activity.put("time", "2分钟前");
activity.put("title", "新订单 " + order.getOrderNo() + " 已创建");
activity.put("time", formatTimeAgo(order.getCreateTime()));
activities.add(activity);
}
} catch (Exception e) {
log.error("获取最近订单活动失败", e);
}
......@@ -150,14 +158,15 @@ public class DashboardServiceImpl implements DashboardService {
private List<Map<String, Object>> getRecentDeliveries() {
List<Map<String, Object>> activities = new ArrayList<>();
try {
// 这里应该从数据库查询最近的出库记录
// 暂时返回模拟数据
List<DeliveryRes> recentDeliveries = deliveryMainService.getRecentDeliveries(2);
for (DeliveryRes delivery : recentDeliveries) {
Map<String, Object> activity = new HashMap<>();
activity.put("id", 2);
activity.put("id", delivery.getDeliveryId());
activity.put("type", "delivery");
activity.put("title", "出库单 DEL-2025-001 已完成");
activity.put("time", "15分钟前");
activity.put("title", "出库单 " + delivery.getDeliveryNo() + " 已创建");
activity.put("time", formatTimeAgo(delivery.getCreateTime()));
activities.add(activity);
}
} catch (Exception e) {
log.error("获取最近出库活动失败", e);
}
......@@ -170,14 +179,15 @@ public class DashboardServiceImpl implements DashboardService {
private List<Map<String, Object>> getRecentInvoices() {
List<Map<String, Object>> activities = new ArrayList<>();
try {
// 这里应该从数据库查询最近的发票记录
// 暂时返回模拟数据
List<InvoiceRes> recentInvoices = invoiceMainService.getRecentInvoices(2);
for (InvoiceRes invoice : recentInvoices) {
Map<String, Object> activity = new HashMap<>();
activity.put("id", 3);
activity.put("id", invoice.getInvoiceId());
activity.put("type", "invoice");
activity.put("title", "发票 INV-2025-001 已开具");
activity.put("time", "1小时前");
activity.put("title", "发票 " + invoice.getInvoiceNo() + " 已开具");
activity.put("time", formatTimeAgo(invoice.getCreateTime()));
activities.add(activity);
}
} catch (Exception e) {
log.error("获取最近发票活动失败", e);
}
......@@ -190,14 +200,15 @@ public class DashboardServiceImpl implements DashboardService {
private List<Map<String, Object>> getRecentRebates() {
List<Map<String, Object>> activities = new ArrayList<>();
try {
// 这里应该从数据库查询最近的返利记录
// 暂时返回模拟数据
List<RebateRes> recentRebates = rebateService.getRecentRebates(2);
for (RebateRes rebate : recentRebates) {
Map<String, Object> activity = new HashMap<>();
activity.put("id", 4);
activity.put("id", rebate.getRebateId());
activity.put("type", "rebate");
activity.put("title", "返利计算已完成,共处理 25 条记录");
activity.put("time", "2小时前");
activity.put("title", "返利 " + rebate.getRebateNo() + " 已计算");
activity.put("time", formatTimeAgo(rebate.getCreateTime()));
activities.add(activity);
}
} catch (Exception e) {
log.error("获取最近返利活动失败", e);
}
......@@ -294,4 +305,28 @@ public class DashboardServiceImpl implements DashboardService {
return "0%";
}
}
/**
* 格式化时间为相对时间
*/
private String formatTimeAgo(java.time.LocalDateTime dateTime) {
if (dateTime == null) {
return "未知时间";
}
java.time.LocalDateTime now = java.time.LocalDateTime.now();
long minutes = java.time.Duration.between(dateTime, now).toMinutes();
if (minutes < 1) {
return "刚刚";
} else if (minutes < 60) {
return minutes + "分钟前";
} else if (minutes < 1440) { // 24小时
long hours = minutes / 60;
return hours + "小时前";
} else {
long days = minutes / 1440;
return days + "天前";
}
}
}
......
......@@ -20,6 +20,7 @@ import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
......@@ -235,6 +236,26 @@ public class DeliveryMainServiceImpl extends ServiceImpl<DeliveryMainMapper, Del
.eq(DeliveryMain::getDeliveryStatus, 0); // 0表示待出库
return Math.toIntExact(count(wrapper));
}
@Override
public List<DeliveryRes> getRecentDeliveries(Integer limit) {
try {
LambdaQueryWrapper<DeliveryMain> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DeliveryMain::getDelFlag, "0")
.orderByDesc(DeliveryMain::getCreateTime)
.last("LIMIT " + (limit != null ? limit : 5));
List<DeliveryMain> deliveries = list(wrapper);
return deliveries.stream().map(delivery -> {
DeliveryRes deliveryRes = new DeliveryRes();
BeanUtils.copyProperties(delivery, deliveryRes);
return deliveryRes;
}).collect(Collectors.toList());
} catch (Exception e) {
log.error("获取最近出库记录失败", e);
return new ArrayList<>();
}
}
}
......
......@@ -21,6 +21,7 @@ import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
......@@ -237,4 +238,23 @@ public class InvoiceMainServiceImpl extends ServiceImpl<InvoiceMainMapper, Invoi
return Math.toIntExact(count(wrapper));
}
@Override
public List<InvoiceRes> getRecentInvoices(Integer limit) {
try {
LambdaQueryWrapper<InvoiceMain> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(InvoiceMain::getDelFlag, "0")
.orderByDesc(InvoiceMain::getCreateTime)
.last("LIMIT " + (limit != null ? limit : 5));
List<InvoiceMain> invoices = list(wrapper);
return invoices.stream().map(invoice -> {
InvoiceRes invoiceRes = new InvoiceRes();
BeanUtils.copyProperties(invoice, invoiceRes);
return invoiceRes;
}).collect(Collectors.toList());
} catch (Exception e) {
log.error("获取最近发票记录失败", e);
return new ArrayList<>();
}
}
}
......
......@@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
......@@ -322,5 +323,25 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
return 0.0;
}
}
@Override
public List<OrderRes> getRecentOrders(Integer limit) {
try {
LambdaQueryWrapper<OrderMain> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderMain::getDelFlag, "0")
.orderByDesc(OrderMain::getCreateTime)
.last("LIMIT " + (limit != null ? limit : 5));
List<OrderMain> orders = list(wrapper);
return orders.stream().map(order -> {
OrderRes orderRes = new OrderRes();
BeanUtils.copyProperties(order, orderRes);
return orderRes;
}).collect(Collectors.toList());
} catch (Exception e) {
log.error("获取最近订单失败", e);
return new ArrayList<>();
}
}
}
......
......@@ -275,4 +275,24 @@ public class RebateServiceImpl extends ServiceImpl<RebateMapper, Rebate> impleme
log.info("获取返利趋势统计数据,开始日期:{},结束日期:{}", startDate, endDate);
return rebateMapper.getRebateTrendStats(startDate, endDate);
}
@Override
public List<RebateRes> getRecentRebates(Integer limit) {
try {
LambdaQueryWrapper<Rebate> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Rebate::getDelFlag, "0")
.orderByDesc(Rebate::getCreateTime)
.last("LIMIT " + (limit != null ? limit : 5));
List<Rebate> rebates = list(wrapper);
return rebates.stream().map(rebate -> {
RebateRes rebateRes = new RebateRes();
BeanUtils.copyProperties(rebate, rebateRes);
return rebateRes;
}).collect(Collectors.toList());
} catch (Exception e) {
log.error("获取最近返利记录失败", e);
return new ArrayList<>();
}
}
}
......