feat(statistics): 新增首页统计相关功能

- 新增 HomeStatsVO 作为首页统计数据传输对象,包含位置统计和位置列表
- 新增 IStatisticsService 接口及其实现类 StatisticsServiceImpl,提供首页统计数据获取方法
- 新增 StatisticsMapper 接口及对应 XML 实现位置统计和顶级位置列表的数据库查询
- 新增 StatisticsController 提供首页统计接口,支持前端获取统计数据
- 所有新增代码均为轻量级查询,避免跨分表查询带来的性能问题
main
zangch@mesnac.com 1 month ago
parent 8a2c7f257f
commit 6878770490

@ -0,0 +1,29 @@
package org.dromara.rfid.controller;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
import org.dromara.rfid.domain.vo.HomeStatsVO;
import org.dromara.rfid.service.IStatisticsService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*/
@RequiredArgsConstructor
@RestController
@RequestMapping("/rfid/statistics")
public class StatisticsController extends BaseController {
private final IStatisticsService statisticsService;
/**
*
*/
@GetMapping("/home")
public R<HomeStatsVO> getHomeStats() {
return R.ok(statisticsService.getHomeStats());
}
}

@ -0,0 +1,54 @@
package org.dromara.rfid.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* VO
*/
@Data
public class HomeStatsVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
private LocationStats locationStats;
/**
*
*/
private List<LocationItem> locations;
/**
*
*/
@Data
public static class LocationStats {
/** 位置总数 */
private Long totalLocations;
/** 车间数量 */
private Long workshopCount;
/** 工序数量 */
private Long processCount;
/** 工位数量 */
private Long stationCount;
}
/**
*
*/
@Data
public static class LocationItem {
private Long id;
private String locationCode;
private String locationAlias;
private String locationType;
/** 子位置数量 */
private Long childCount;
}
}

@ -0,0 +1,22 @@
package org.dromara.rfid.mapper;
import org.dromara.rfid.domain.vo.HomeStatsVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* Mapper
*/
@Mapper
public interface StatisticsMapper {
/**
*
*/
HomeStatsVO.LocationStats selectLocationStats();
/**
*
*/
List<HomeStatsVO.LocationItem> selectTopLocations();
}

@ -0,0 +1,14 @@
package org.dromara.rfid.service;
import org.dromara.rfid.domain.vo.HomeStatsVO;
/**
* Service
*/
public interface IStatisticsService {
/**
*
*/
HomeStatsVO getHomeStats();
}

@ -0,0 +1,26 @@
package org.dromara.rfid.service.impl;
import lombok.RequiredArgsConstructor;
import org.dromara.rfid.domain.vo.HomeStatsVO;
import org.dromara.rfid.mapper.StatisticsMapper;
import org.dromara.rfid.service.IStatisticsService;
import org.springframework.stereotype.Service;
/**
* Service
*/
@RequiredArgsConstructor
@Service
public class StatisticsServiceImpl implements IStatisticsService {
private final StatisticsMapper statisticsMapper;
@Override
public HomeStatsVO getHomeStats() {
HomeStatsVO vo = new HomeStatsVO();
// 仅查询 rfid_location 表,避免分表查询带来的性能问题
vo.setLocationStats(statisticsMapper.selectLocationStats());
vo.setLocations(statisticsMapper.selectTopLocations());
return vo;
}
}

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.rfid.mapper.StatisticsMapper">
<!-- 位置统计(轻量级,仅查询 rfid_location 表) -->
<select id="selectLocationStats" resultType="org.dromara.rfid.domain.vo.HomeStatsVO$LocationStats">
SELECT
COUNT(*) as totalLocations,
SUM(CASE WHEN location_type = '1' THEN 1 ELSE 0 END) as workshopCount,
SUM(CASE WHEN location_type = '2' THEN 1 ELSE 0 END) as processCount,
SUM(CASE WHEN location_type = '3' THEN 1 ELSE 0 END) as stationCount
FROM rfid_location
</select>
<!-- 顶级位置列表parent_id = 0 或 NULL -->
<select id="selectTopLocations" resultType="org.dromara.rfid.domain.vo.HomeStatsVO$LocationItem">
SELECT
l.id,
l.location_code as locationCode,
l.location_alias as locationAlias,
l.location_type as locationType,
(SELECT COUNT(*) FROM rfid_location c WHERE c.parent_id = l.id) as childCount
FROM rfid_location l
WHERE l.parent_id = 0 OR l.parent_id IS NULL
ORDER BY l.id
</select>
</mapper>
Loading…
Cancel
Save