diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/AnalysisKeyGroupServiceSituationController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/AnalysisKeyGroupServiceSituationController.java new file mode 100644 index 0000000..77285c1 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/AnalysisKeyGroupServiceSituationController.java @@ -0,0 +1,101 @@ +package com.ruoyi.cms.controller; + +import com.ruoyi.cms.domain.dto.QueryParamDto; +import com.ruoyi.cms.service.AnalysisKeyGroupServiceSituationService; +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/26 + */ +@RestController +@RequestMapping("/analysis/keyGroupServiceSituation") +@RequiredArgsConstructor +public class AnalysisKeyGroupServiceSituationController { + + private final AnalysisKeyGroupServiceSituationService analysisKeyGroupServiceSituationService; + + /** + * 数据总览 + * + * @param dto 查询参数 + * @return 数据总览 + */ + @PostMapping("/overview") + public AjaxResult overview(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.overview(dto)); + } + + /** + * 服务覆盖范围 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/serviceCoverage") + public AjaxResult serviceCoverage(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.serviceCoverage(dto)); + } + + /** + * 帮扶服务类型分析 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/helpServiceType") + public AjaxResult helpServiceType(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.helpServiceType(dto)); + } + + /** + * 帮扶成效评估 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/helpResultScore") + public AjaxResult helpResultScore(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.helpResultScore(dto)); + } + + /** + * 不同重点人群差异化分析 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/keyGroupDifferentiation") + public AjaxResult keyGroupDifferentiation(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.keyGroupDifferentiation(dto)); + } + + /** + * 帮扶过程与满意度 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/helpProcessSatisfaction") + public AjaxResult helpProcessSatisfaction(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.helpProcessSatisfaction(dto)); + } + + /** + * 问题与建议 + * + * @param dto 查询参数 + * @return 结果列表 + */ + @PostMapping("/questionAndSuggestion") + public AjaxResult questionAndSuggestion(@RequestBody QueryParamDto dto) { + return AjaxResult.success(analysisKeyGroupServiceSituationService.questionAndSuggestion(dto)); + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationHelpScoreVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationHelpScoreVo.java new file mode 100644 index 0000000..5ec3668 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationHelpScoreVo.java @@ -0,0 +1,43 @@ +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 KeyGroupServiceSituationHelpScoreVo implements Serializable { + private static final long serialVersionUID = -8478307079421272922L; + /** + * 编码 + */ + private String code; + /** + * 描述 + */ + private String desc; + /** + * 就业率 + */ + private BigDecimal employmentRate; + /** + * 收入改善 + */ + private BigDecimal incomeImprovement; + /** + * 生活质量改善 + */ + private BigDecimal lifeQualityImprovement; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationHelpTypeVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationHelpTypeVo.java new file mode 100644 index 0000000..80884d0 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationHelpTypeVo.java @@ -0,0 +1,43 @@ +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 KeyGroupServiceSituationHelpTypeVo implements Serializable { + private static final long serialVersionUID = -8478307079421272922L; + /** + * 编码 + */ + private String code; + /** + * 描述 + */ + private String desc; + /** + * 服务人数 + */ + private Long serviceCount; + /** + * 满意度 + */ + private BigDecimal serviceSatisfaction; + /** + * 成效评分 + */ + private BigDecimal resultScore; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationKeyGroupScoreVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationKeyGroupScoreVo.java new file mode 100644 index 0000000..4a2f213 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationKeyGroupScoreVo.java @@ -0,0 +1,47 @@ +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 KeyGroupServiceSituationKeyGroupScoreVo implements Serializable { + private static final long serialVersionUID = -8478307079421272922L; + /** + * 编码 + */ + private String code; + /** + * 描述 + */ + private String desc; + /** + * 服务覆盖率 + */ + private BigDecimal serviceCoverageRate; + /** + * 就业率 + */ + private BigDecimal employmentRate; + /** + * 收入改善 + */ + private BigDecimal incomeImprovement; + /** + * 满意度 + */ + private BigDecimal serviceSatisfaction; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationOverviewVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationOverviewVo.java new file mode 100644 index 0000000..6f54800 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/KeyGroupServiceSituationOverviewVo.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 KeyGroupServiceSituationOverviewVo implements Serializable { + private static final long serialVersionUID = -8478307079421272922L; + /** + * 服务对象人数 + */ + private Long serviceTargetCount; + /** + * 服务对象人数环比 + */ + private BigDecimal serviceTargetCountMom; + /** + * 服务需求人数 + */ + private Long serviceDemandCount; + /** + * 服务需求人数环比 + */ + private BigDecimal serviceDemandCountMom; + /** + * 实际服务人数 + */ + private Long actualServiceCount; + /** + * 实际服务人数环比 + */ + private BigDecimal actualServiceCountMom; + /** + * 实际服务人次 + */ + private Long actualServiceTimes; + /** + * 实际服务人次环比 + */ + private BigDecimal actualServiceTimesMom; + /** + * 服务覆盖率 + */ + private BigDecimal serviceCoverageRate; + /** + * 服务覆盖率环比 + */ + private BigDecimal serviceCoverageRateMom; + /** + * 帮扶后就业率 + */ + private BigDecimal afterHelpEmploymentRate; + /** + * 帮扶后就业率环比 + */ + private BigDecimal afterHelpEmploymentRateMom; + /** + * 帮扶资金投放 + */ + private Long helpFundPutCount; + /** + * 帮扶资金投放环比 + */ + private BigDecimal helpFundPutCountMom; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/AnalysisKeyGroupServiceSituationService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/AnalysisKeyGroupServiceSituationService.java new file mode 100644 index 0000000..f60c943 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/AnalysisKeyGroupServiceSituationService.java @@ -0,0 +1,76 @@ +package com.ruoyi.cms.service; + +import com.ruoyi.cms.domain.dto.QueryParamDto; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationHelpScoreVo; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationHelpTypeVo; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationKeyGroupScoreVo; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationOverviewVo; +import com.ruoyi.cms.domain.vo.QueryResultVo; + +import java.util.List; + +/** + * 重点人群跟踪服务情况分析 + * + * @author 马宝龙 + * @date 2026/6/26 + */ +public interface AnalysisKeyGroupServiceSituationService { + + + /** + * 数据总览 + * + * @param dto 查询参数 + * @return 数据总览 + */ + KeyGroupServiceSituationOverviewVo overview(QueryParamDto dto); + + /** + * 服务覆盖范围 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List serviceCoverage(QueryParamDto dto); + + /** + * 帮扶服务类型分析 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List helpServiceType(QueryParamDto dto); + + /** + * 帮扶成效评估 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List helpResultScore(QueryParamDto dto); + + /** + * 不同重点人群差异化分析 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List keyGroupDifferentiation(QueryParamDto dto); + + /** + * 帮扶过程与满意度 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List helpProcessSatisfaction(QueryParamDto dto); + + /** + * 问题与建议 + * + * @param dto 查询参数 + * @return 结果列表 + */ + List questionAndSuggestion(QueryParamDto dto); +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AnalysisKeyGroupServiceSituationServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AnalysisKeyGroupServiceSituationServiceImpl.java new file mode 100644 index 0000000..fc7cf22 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AnalysisKeyGroupServiceSituationServiceImpl.java @@ -0,0 +1,183 @@ +package com.ruoyi.cms.service.impl; + +import com.ruoyi.cms.domain.dto.QueryParamDto; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationHelpScoreVo; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationHelpTypeVo; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationKeyGroupScoreVo; +import com.ruoyi.cms.domain.vo.KeyGroupServiceSituationOverviewVo; +import com.ruoyi.cms.domain.vo.QueryResultVo; +import com.ruoyi.cms.service.AnalysisKeyGroupServiceSituationService; +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/26 + */ +@Service +@Validated +@Slf4j +public class AnalysisKeyGroupServiceSituationServiceImpl implements AnalysisKeyGroupServiceSituationService { + + @Override + public KeyGroupServiceSituationOverviewVo overview(QueryParamDto dto) { + return KeyGroupServiceSituationOverviewVo.builder() + .serviceTargetCount(15000L) + .serviceTargetCountMom(BigDecimal.valueOf(5.2)) + .serviceDemandCount(12000L) + .serviceDemandCountMom(BigDecimal.valueOf(3.8)) + .actualServiceCount(10800L) + .actualServiceCountMom(BigDecimal.valueOf(6.5)) + .actualServiceTimes(25600L) + .actualServiceTimesMom(BigDecimal.valueOf(8.1)) + .serviceCoverageRate(BigDecimal.valueOf(90.0)) + .serviceCoverageRateMom(BigDecimal.valueOf(2.3)) + .afterHelpEmploymentRate(BigDecimal.valueOf(72.5)) + .afterHelpEmploymentRateMom(BigDecimal.valueOf(1.8)) + .helpFundPutCount(3200L) + .helpFundPutCountMom(BigDecimal.valueOf(12.5)) + .build(); + } + + @Override + public List serviceCoverage(QueryParamDto dto) { + List list = new ArrayList<>(); + List> coverageList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "失业人员"), + Tuples.of("2", "高校毕业生"), + Tuples.of("3", "残疾人"), + Tuples.of("4", "低收入家庭"), + Tuples.of("5", "零就业家庭"), + Tuples.of("6", "其他重点人群") + ))); + for (Tuple2 item : coverageList) { + list.add(QueryResultVo.builder() + .code(item.getT1()) + .desc(item.getT2()) + .count((long) Math.floor(Math.random() * 10000) + 1) + .anotherCount((long) Math.floor(Math.random() * 10000) + 1) + .rate(BigDecimal.valueOf(Math.random() * 100 + 1).setScale(1, RoundingMode.HALF_UP)) + .build()); + } + return list; + } + + @Override + public List helpServiceType(QueryParamDto dto) { + List list = new ArrayList<>(); + List> typeList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "职业指导"), + Tuples.of("2", "创业服务"), + Tuples.of("3", "职业培训"), + Tuples.of("4", "就业援助"), + Tuples.of("5", "职业介绍"), + Tuples.of("6", "就业见习") + ))); + for (Tuple2 item : typeList) { + list.add(KeyGroupServiceSituationHelpTypeVo.builder() + .code(item.getT1()) + .desc(item.getT2()) + .serviceCount((long) Math.floor(Math.random() * 5000) + 1) + .serviceSatisfaction(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .resultScore(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .build()); + } + return list; + } + + @Override + public List helpResultScore(QueryParamDto dto) { + List list = new ArrayList<>(); + for (int i = 0; i < 12; i++) { + list.add(KeyGroupServiceSituationHelpScoreVo.builder() + .code(i + 1 + "") + .desc(i + 1 + "月") + .employmentRate(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .incomeImprovement(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .lifeQualityImprovement(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .build()); + } + return list; + } + + @Override + public List keyGroupDifferentiation(QueryParamDto dto) { + List list = new ArrayList<>(); + List> groupList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "失业人员"), + Tuples.of("2", "高校毕业生"), + Tuples.of("3", "残疾人"), + Tuples.of("4", "低收入家庭"), + Tuples.of("5", "零就业家庭"), + Tuples.of("6", "其他重点人群") + ))); + for (Tuple2 item : groupList) { + list.add(KeyGroupServiceSituationKeyGroupScoreVo.builder() + .code(item.getT1()) + .desc(item.getT2()) + .serviceCoverageRate(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .employmentRate(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .incomeImprovement(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .serviceSatisfaction(new BigDecimal(Math.random() * 100).setScale(2, RoundingMode.HALF_UP)) + .build()); + } + return list; + } + + @Override + public List helpProcessSatisfaction(QueryParamDto dto) { + List list = new ArrayList<>(); + List> satisfactionList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "服务态度"), + Tuples.of("2", "服务专业性"), + Tuples.of("3", "整体满意度"), + Tuples.of("4", "帮扶效果"), + Tuples.of("5", "服务响应时间") + ))); + for (Tuple2 item : satisfactionList) { + list.add(QueryResultVo.builder() + .code(item.getT1()) + .desc(item.getT2()) + .amount(new BigDecimal(Math.random() * 5).setScale(2, RoundingMode.HALF_UP)) + .build()); + } + return list; + } + + @Override + public List questionAndSuggestion(QueryParamDto dto) { + List list = new ArrayList<>(); + List> suggestionList = + Collections.unmodifiableList(new ArrayList<>(Arrays.asList( + Tuples.of("1", "帮扶资源不足"), + Tuples.of("2", "服务人员专业性不够"), + Tuples.of("3", "帮扶方式单一"), + Tuples.of("4", "跟踪服务不及时"), + Tuples.of("5", "信息系统不完善") + ))); + for (Tuple2 item : suggestionList) { + list.add(QueryResultVo.builder() + .code(item.getT1()) + .desc(item.getT2()) + .count((long) Math.floor(Math.random() * 1000) + 1) + .build()); + } + return list; + } +} \ No newline at end of file