一、需求分析
在部门员工管理模块中,需要统计各职位的员工人数,并提供一个接口供前端调用,返回的数据包括:
-
职位名称列表。
-
对应职位人数列表。
目标是实现从数据库查询职位人数统计数据,并以结构化数据形式返回,便于前端直接展示。
二、代码解读
JobOption 类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JobOption {
private List jobList;
private List dataList;
}
功能解读:
-
类注解:
-
@Data
:由 Lombok 提供,自动生成 getter/setter 方法、toString
方法、equals
和hashCode
方法。 -
@NoArgsConstructor
:生成无参构造方法。 -
@AllArgsConstructor
:生成包含所有字段的有参构造方法。
-
-
字段:
-
jobList
:存储职位名称的列表。 -
dataList
:存储职位对应人数的列表。
-
用途: JobOption
用于封装职位统计数据,包括职位名称和对应人数,作为控制层接口返回的数据对象。
Controller 层
@Slf4j
@RequestMapping("/report")
@RestController
public class ReportController {
@Autowired
private ReportService reportService;
@GetMapping("/empJobData")
public Result empJobData(){
log.info("统计员工职位人数");
JobOption jobOption = reportService.empJobData();
return Result.success(jobOption);
}
}
功能解读:
-
类注解:
-
@Slf4j
:引入日志功能,便于记录操作信息。 -
@RestController
:定义该类为 RESTful 控制器,返回 JSON 格式数据。 -
@RequestMapping("/report")
:定义基础访问路径/report
。
-
-
字段注解:
-
@Autowired
:自动注入ReportService
服务对象。
-
-
方法
empJobData
:-
路径映射:通过
@GetMapping("/empJobData")
将方法映射为/report/empJobData
。 -
日志记录:
log.info("统计员工职位人数");
记录方法调用日志。 -
服务调用:调用
reportService.empJobData()
获取统计数据。 -
返回数据:将
JobOption
对象包装为统一响应格式Result.success()
返回。
-
Service层
import java.util.stream.Collectors;
@Slf4j
@Service
public class ReportServiceImpl implements ReportService {
@Autowired
private EmpMapper empMapper;
@Autowired
private StudentMapper studentMapper;
@Override
public JobOption empJobData() {
List<Map> mapList = empMapper.getJobData();
log.info("部门员工信息量统计表: {}", mapList);
// 职位列表
List<Object> jobList = mapList.stream().map(map -> {
return map.get("pos");
}).collect(Collectors.toList());
// 职位人数列表
List<Object> dataList = mapList.stream().map(map -> {
return map.get("posCount");
}).collect(Collectors.toList());
return new JobOption(jobList, dataList);
}
}
功能解读:
-
类注解:
-
@Slf4j
:引入日志功能,便于记录查询结果。 -
@Service
:标记为服务层组件,交由 Spring 容器管理。
-
-
字段注解:
-
@Autowired
:注入EmpMapper
和StudentMapper
,分别用于操作员工和学生数据。
-
-
方法
empJobData
:-
查询数据:调用
empMapper.getJobData()
获取职位和人数统计的List<Map>
数据。 -
数据处理:
-
使用
Stream
的map
方法提取职位名称和对应人数,分别生成jobList
和dataList
。 -
返回数据:构造
JobOption
对象,将职位和人数列表返回。
-
Mapper层与动态SQL配置
@MapKey("pos")
List<Map> getJobData();
<select id="getJobData" resultType="java.util.Map">
select
( case job when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教研主管'
when 5 then '咨询师'
else '其他' end ) pos,
count(*) posCount
from emp group by job
</select>
功能解读:
-
将职位编号 (
job
) 转换为具体职位名称 (pos
)。 -
使用
count(*)
统计每个职位的人数 (posCount
)。 -
按
job
分组,生成统计数据。 -
结果示例:
{pos: '讲师', posCount: 10}
。
总结
通过上述模块的实现,完成了以下功能:
-
需求实现:提供职位名称及其对应人数的统计数据。
-
模块分层:
-
数据访问层(Mapper):执行 SQL 查询并返回统计结果。
-
服务层(Service):处理查询结果,封装为结构化数据。
-
控制层(Controller):返回统一格式的数据。
-