diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/AnalysisLaborForceEmploymentController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/AnalysisLaborForceEmploymentController.java new file mode 100644 index 0000000..5c8b332 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/AnalysisLaborForceEmploymentController.java @@ -0,0 +1,101 @@ +package com.ruoyi.cms.controller; + +import com.ruoyi.cms.domain.dto.QueryParamDto; +import com.ruoyi.cms.service.AnalysisLaborForceEmploymentService; +import com.ruoyi.common.core.domain.AjaxResult; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 劳动力就业失业数据分析 + * + * @author 马宝龙 + * @date 2026/6/27 + */ +@RestController +@RequestMapping("/analysis/laborForceEmployment") +@RequiredArgsConstructor +public class AnalysisLaborForceEmploymentController { + + private final AnalysisLaborForceEmploymentService analysisLaborForceEmploymentService; + + /** + * 数据总览 + * + * @param dto 查询参数 + * @return 数据总览 + */ + @PostMapping("/overview") + public AjaxResult overview(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.overview(dto)); + } + + /** + * 城镇新增就业完成情况 + * + * @param dto 查询参数 + * @return 完成情况 + */ + @PostMapping("/taget") + public AjaxResult taget(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.taget(dto)); + } + + /** + * 就业产业情况分析 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/employIndustrySituation") + public AjaxResult employIndustrySituation(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.employIndustrySituation(dto)); + } + + /** + * 就业人员性别分布 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/employmentGender") + public AjaxResult employmentGender(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.employmentGender(dto)); + } + + /** + * 就业形式 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/employmentMode") + public AjaxResult employmentMode(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.employmentMode(dto)); + } + + /** + * 就业热力图 + * + * @param dto 查询参数 + * @return 热力图列表 + */ + @PostMapping("/employmentHeatmap") + public AjaxResult employmentHeatmap(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.employmentHeatmap(dto)); + } + + /** + * 失业热力图 + * + * @param dto 查询参数 + * @return 热力图列表 + */ + @PostMapping("/unemploymentHeatmap") + public AjaxResult unemploymentHeatmap(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisLaborForceEmploymentService.unemploymentHeatmap(dto)); + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/LaborForceEmploymentOverviewVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/LaborForceEmploymentOverviewVo.java new file mode 100644 index 0000000..7458be2 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/LaborForceEmploymentOverviewVo.java @@ -0,0 +1,79 @@ +package com.ruoyi.cms.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 劳动力就业失业数据分析 - 数据总览 + * + * @author 马宝龙 + * @date 2026/6/25 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class LaborForceEmploymentOverviewVo implements Serializable { + private static final long serialVersionUID = -8937737222196834158L; + /** + * 就业累计人数 + */ + private Long totalEmploymentCount; + /** + * 就业累计人数环比 + */ + private BigDecimal totalEmploymentCountMom; + /** + * 城镇新增就业人数 + */ + private Long townEmploymentCount; + /** + * 城镇新增就业人数环比 + */ + private BigDecimal townEmploymentCountMom; + /** + * 失业人员再就业人数 + */ + private Long unEmploymentEmploymentCount; + /** + * 失业人员再就业人数环比 + */ + private BigDecimal unEmploymentEmploymentCountMom; + /** + * 就业困难人员就业人数 + */ + private Long employmentDifficultyEmploymentCount; + /** + * 就业困难人员就业人数环比 + */ + private BigDecimal employmentDifficultyEmploymentCountMom; + /** + * 失业登记人数 + */ + private Long unemploymentCount; + /** + * 失业登记人数环比 + */ + private BigDecimal unemploymentCountMom; + /** + * 失业金申领人数 + */ + private Long unemploymentBenefitCount; + /** + * 失业登记人数环比 + */ + private BigDecimal unemploymentBenefitCountMom; + /** + * 享受失业服务人数 + */ + private Long receiveUnemploymentServiceCount; + /** + * 失业登记人数环比 + */ + private BigDecimal receiveUnemploymentServiceCountMom; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/LaborForceEmploymentTargetVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/LaborForceEmploymentTargetVo.java new file mode 100644 index 0000000..7ef2aa4 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/LaborForceEmploymentTargetVo.java @@ -0,0 +1,35 @@ +package com.ruoyi.cms.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 劳动力就业失业数据分析 - 城镇新增就业完成情况 + * + * @author 马宝龙 + * @date 2026/6/25 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class LaborForceEmploymentTargetVo implements Serializable { + private static final long serialVersionUID = 3984746858252701664L; + /** + * 完成率 + */ + private BigDecimal finishRate; + /** + * 当前完成 + */ + private Long currentFinishCount; + /** + * 全年完成 + */ + private Long overallYearFinishCount; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/AnalysisLaborForceEmploymentService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/AnalysisLaborForceEmploymentService.java new file mode 100644 index 0000000..3296168 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/AnalysisLaborForceEmploymentService.java @@ -0,0 +1,74 @@ +package com.ruoyi.cms.service; + +import com.ruoyi.cms.domain.dto.QueryParamDto; +import com.ruoyi.cms.domain.vo.HeatmapVo; +import com.ruoyi.cms.domain.vo.LaborForceEmploymentOverviewVo; +import com.ruoyi.cms.domain.vo.LaborForceEmploymentTargetVo; +import com.ruoyi.cms.domain.vo.QueryResultVo; + +import java.util.List; + +/** + * 劳动力就业失业数据分析 + * + * @author 马宝龙 + * @date 2026/6/27 + */ +public interface AnalysisLaborForceEmploymentService { + + /** + * 数据总览 + * + * @param dto 查询参数 + * @return 数据总览 + */ + LaborForceEmploymentOverviewVo overview(QueryParamDto dto); + + /** + * 城镇新增就业完成情况 + * + * @param dto 查询参数 + * @return 结果 + */ + LaborForceEmploymentTargetVo taget(QueryParamDto dto); + + /** + * 就业产业情况分析 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List employIndustrySituation(QueryParamDto dto); + + /** + * 就业人员性别分布 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List employmentGender(QueryParamDto dto); + + /** + * 就业形式 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List employmentMode(QueryParamDto dto); + + /** + * 就业热力图 + * + * @param dto 查询参数 + * @return 热力图列表 + */ + List employmentHeatmap(QueryParamDto dto); + + /** + * 失业热力图 + * + * @param dto 查询参数 + * @return 热力图列表 + */ + List unemploymentHeatmap(QueryParamDto dto); +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AnalysisLaborForceEmploymentServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AnalysisLaborForceEmploymentServiceImpl.java new file mode 100644 index 0000000..9d399f3 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AnalysisLaborForceEmploymentServiceImpl.java @@ -0,0 +1,151 @@ +package com.ruoyi.cms.service.impl; + +import com.ruoyi.cms.constant.CommonConstant; +import com.ruoyi.cms.domain.dto.QueryParamDto; +import com.ruoyi.cms.domain.vo.HeatmapVo; +import com.ruoyi.cms.domain.vo.LaborForceEmploymentOverviewVo; +import com.ruoyi.cms.domain.vo.LaborForceEmploymentTargetVo; +import com.ruoyi.cms.domain.vo.QueryResultVo; +import com.ruoyi.cms.service.AnalysisLaborForceEmploymentService; +import com.ruoyi.cms.util.MathUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuples; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * 劳动力就业失业数据分析 + * + * @author 马宝龙 + * @date 2026/6/27 + */ +@Service +@Validated +@Slf4j +public class AnalysisLaborForceEmploymentServiceImpl implements AnalysisLaborForceEmploymentService { + + @Override + public LaborForceEmploymentOverviewVo overview(QueryParamDto dto) { + return LaborForceEmploymentOverviewVo.builder() + .totalEmploymentCount(120000L) + .totalEmploymentCountMom(BigDecimal.valueOf(3.2)) + .townEmploymentCount(10000L) + .townEmploymentCountMom(BigDecimal.valueOf(-2.1)) + .unEmploymentEmploymentCount(2000L) + .unEmploymentEmploymentCountMom(BigDecimal.valueOf(6.05)) + .employmentDifficultyEmploymentCount(5000L) + .employmentDifficultyEmploymentCountMom(BigDecimal.valueOf(3.03)) + .unemploymentCount(4000L) + .unemploymentCountMom(BigDecimal.valueOf(-1.02)) + .unemploymentBenefitCount(3000L) + .unemploymentBenefitCountMom(BigDecimal.valueOf(4.01)) + .receiveUnemploymentServiceCount(1000L) + .receiveUnemploymentServiceCountMom(BigDecimal.valueOf(-3.01)) + .build(); + } + + @Override + public LaborForceEmploymentTargetVo taget(QueryParamDto dto) { + return LaborForceEmploymentTargetVo.builder() + .currentFinishCount(8500L) + .overallYearFinishCount(12000L) + .finishRate(BigDecimal.valueOf(70.83)) + .build(); + } + + @Override + public List employIndustrySituation(QueryParamDto dto) { + List list = new ArrayList<>(); + List> industryList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "第一产业"), + Tuples.of("2", "第二产业"), + Tuples.of("2", "第三产业") + ))); + for (Tuple2 industry : industryList) { + list.add(QueryResultVo.builder() + .code(industry.getT1()) + .desc(industry.getT2()) + .count((long) Math.floor(Math.random() * 100000) + 1) + .build()); + } + MathUtil.calculatePercentage(list); + return list; + } + + @Override + public List employmentGender(QueryParamDto dto) { + List list = new ArrayList<>(); + List> genderList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "男"), + Tuples.of("2", "女") + ))); + for (Tuple2 gender : genderList) { + list.add(QueryResultVo.builder() + .code(gender.getT1()) + .desc(gender.getT2()) + .count((long) Math.floor(Math.random() * 100000) + 1) + .build()); + } + MathUtil.calculatePercentage(list); + return list; + } + + @Override + public List employmentMode(QueryParamDto dto) { + List list = new ArrayList<>(); + List> modeList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "单位就业"), + Tuples.of("2", "灵活就业"), + Tuples.of("3", "个体经营"), + Tuples.of("4", "公益性岗位") + ))); + for (Tuple2 mode : modeList) { + list.add(QueryResultVo.builder() + .code(mode.getT1()) + .desc(mode.getT2()) + .count((long) Math.floor(Math.random() * 100000) + 1) + .build()); + } + MathUtil.calculatePercentage(list); + return list; + } + + @Override + public List employmentHeatmap(QueryParamDto dto) { + List list = new ArrayList<>(); + for (Tuple2 area : CommonConstant.AREA_LIST) { + list.add(HeatmapVo.builder() + .areaCode(area.getT1()) + .areaName(area.getT2()) + .count((long) Math.floor(Math.random() * 10000) + 1) + .build()); + } + MathUtil.calculatePercentageHeatmap(list); + return list; + } + + @Override + public List unemploymentHeatmap(QueryParamDto dto) { + List list = new ArrayList<>(); + for (Tuple2 area : CommonConstant.AREA_LIST) { + list.add(HeatmapVo.builder() + .areaCode(area.getT1()) + .areaName(area.getT2()) + .count((long) Math.floor(Math.random() * 5000) + 1) + .build()); + } + MathUtil.calculatePercentageHeatmap(list); + return list; + } +} \ No newline at end of file