From 131ad9be5df3876eb07d743c7a31487d750229b4 Mon Sep 17 00:00:00 2001 From: wangqian <1406304305@qq.com> Date: Sat, 3 Jan 2026 12:30:34 +0800 Subject: [PATCH] 首页统计接口 --- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/MaintainSummaryController.java | 105 ++++++++++++++++++++++++--------------------------------------------------------------------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitCountByCompanyReqVO.java | 12 ------------ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java | 32 ++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitWorkOrderRespVo.java | 27 +++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/HomePageSummaryReqVO.java | 11 ++++++++++- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/MaintainProportionReqVO.java | 10 ---------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java | 25 +++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java | 13 +++++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryService.java | 63 +++++++++++++++++++++++++++++++++++++++++++++++---------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java | 689 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------- urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml | 253 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java | 11 +++++++++++ 13 files changed, 1181 insertions(+), 160 deletions(-) delete mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitCountByCompanyReqVO.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitWorkOrderRespVo.java delete mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/MaintainProportionReqVO.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java create mode 100644 urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java create mode 100644 urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/MaintainSummaryController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/MaintainSummaryController.java index 67e4975..62d8428 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/MaintainSummaryController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/MaintainSummaryController.java @@ -1,10 +1,8 @@ package com.zteits.urbanops.module.garden.controller.admin.homepage; import com.zteits.urbanops.framework.common.pojo.CommonResult; -import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; -import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitCountByCompanyReqVO; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitWorkOrderRespVo; import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.HomePageSummaryReqVO; -import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.MaintainProportionReqVO; import com.zteits.urbanops.module.garden.service.homepage.MaintainSummaryService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -30,89 +28,34 @@ public class MaintainSummaryController { @PostMapping("/getSummary") @Operation(summary = "首页汇总") - public CommonResult> getSummary(@Valid @RequestBody HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.selectMaintainSummary(req, companyId)); + public CommonResult> getSummary() { + return success(maintainSummaryService.getSummary()); } - @PostMapping("/getSummary/maintain_type") - @Operation(summary = "首页汇总-养护类型统计") - public CommonResult>>> getSummaryByMaintainType(@Valid @RequestBody HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getSummaryByMaintainType(req, companyId)); + @PostMapping("/getWorkTaskTrend") + @Operation(summary = "任务趋势图") + public CommonResult> getWorkTaskTrend(@Valid @RequestBody HomePageSummaryReqVO req) { + return success(maintainSummaryService.getWorkTaskTrend(req)); } - @PostMapping("/getSummary/maintain_type/proportion") - @Operation(summary = "首页汇总-养护类型占比") - public CommonResult>> getSummaryByMaintainProportion(@Valid @RequestBody HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getSummaryByMaintainProportion(req, companyId)); + @PostMapping("/getWorkOrderRatio") + @Operation(summary = "工单占比") + public CommonResult> getWorkOrderRatio(@Valid @RequestBody HomePageSummaryReqVO req) { + return success(maintainSummaryService.getWorkOrderRatio(req)); } - - @PostMapping("/getSummary/plant_type/proportion") - @Operation(summary = "首页汇总-植物类型占比") - public CommonResult>> getSummaryByPlantProportion(@Valid @RequestBody HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getSummaryByPlantProportion(req, companyId)); + @PostMapping("/getWorkOrderDistribution") + @Operation(summary = "子公司工单分布") + public CommonResult> getWorkOrderDistribution(@Valid @RequestBody HomePageSummaryReqVO req) { + return success(maintainSummaryService.getWorkOrderDistribution(req)); } - - @PostMapping("/getSummary/company") - @Operation(summary = "首页汇总-按公司统计") - public CommonResult> getSummaryByCompany(@Valid @RequestBody HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.selectSummaryByCompany(req, companyId)); + @PostMapping("/getWorkOrderHeatmap") + @Operation(summary = "工单热力图") + public CommonResult>> getWorkOrderHeatmap() { + return success(maintainSummaryService.getWorkOrderHeatmap()); } - - @PostMapping("/proportion/by/company") - @Operation(summary = "首页汇总-按公司统计提交量占比") - public CommonResult>> proportionByCompany(@Valid @RequestBody HomePageSummaryReqVO req) { - return success(maintainSummaryService.getProportionByCompany(req.beginTime, req.endTime)); - } - - @PostMapping("/commitCount/by/company") - @Operation(summary = "按公司统计-提交工单数量") - public CommonResult>> getCommitCountByCompany(@Valid @RequestBody CommitCountByCompanyReqVO req) { - return success(maintainSummaryService.getCommitCountByCompany(req)); - } - - @PostMapping("/pressing_type/by/company") - @Operation(summary = "按公司统计-紧急程度占比") - public CommonResult>> getPressingTypeByCompany(@Valid @RequestBody CommitCountByCompanyReqVO req) { - return success(maintainSummaryService.getPressingTypeByCompany(req)); - } - - @PostMapping("/process/order/xc") - @Operation(summary = "个人-巡查处理工单量排名") - public CommonResult>> getXcProcessOrder(@Valid @RequestBody CommitCountByCompanyReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getXcProcessOrder(companyId, req.beginTime, req.endTime)); - } - - @PostMapping("/process/order/yh") - @Operation(summary = "个人-养护处理工单量排名") - public CommonResult>> getProcessOrderReturn(@Valid @RequestBody CommitCountByCompanyReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getProcessOrderReturn(companyId, req.beginTime, req.endTime)); - } - - @PostMapping("/commitCount/group/commitDate") - @Operation(summary = "按时间统计-工单提交量") - public CommonResult>> getCommitCountByTime(@Valid @RequestBody CommitCountByCompanyReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getCommitCountByTime(companyId, req)); - } - - @PostMapping("/orderList/by/status") - @Operation(summary = "按单位-工单处理情况") - public CommonResult>> getOrderList(@Valid @RequestBody MaintainProportionReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getOrderList(companyId, req.getTaskStatus())); - } - - @PostMapping("/maintainTypeCount") - @Operation(summary = "首页汇总-养护类型统计") - public CommonResult> maintainTypeAndGrowthRate(@Valid @RequestBody HomePageSummaryReqVO req) { - Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); - return success(maintainSummaryService.getSummaryByMaintainTypeAndGrowthRate(req, companyId)); + @PostMapping("/getWorkOrderTrend") + @Operation(summary = "工单趋势图") + public CommonResult> getWorkOrderTrend(@Valid @RequestBody HomePageSummaryReqVO req) { + return success(maintainSummaryService.getWorkOrderTrend(req)); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitCountByCompanyReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitCountByCompanyReqVO.java deleted file mode 100644 index a198f02..0000000 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitCountByCompanyReqVO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.zteits.urbanops.module.garden.controller.admin.homepage.vo; - -import jakarta.validation.constraints.NotEmpty; -import lombok.Data; - -@Data -public class CommitCountByCompanyReqVO { - @NotEmpty - public String beginTime; - @NotEmpty - public String endTime; -} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java new file mode 100644 index 0000000..3500d39 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitTaskStatisticsRespVo.java @@ -0,0 +1,32 @@ +package com.zteits.urbanops.module.garden.controller.admin.homepage.vo; + +import lombok.Data; + +/** + * @Classname CommitTaskStatisticsResp + * @Description 任务公共返回 + * @Date 2025/12/30 16:12 + * @Created by wangqian + */ +@Data +public class CommitTaskStatisticsRespVo { + + private String dateValue; + + private String busiLine; + + private String busiLineName; + + private Integer planNum; + + private Integer planFinishNum; + + private Integer inspectionPlanNum; + + private Integer inspectionPlanFinishNum; + + private Integer maintainPlanNum; + + private Integer maintainPlanFinishNum; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitWorkOrderRespVo.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitWorkOrderRespVo.java new file mode 100644 index 0000000..e253034 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/CommitWorkOrderRespVo.java @@ -0,0 +1,27 @@ +package com.zteits.urbanops.module.garden.controller.admin.homepage.vo; + +import lombok.Data; + +/** + * @Classname CommitWorkOrderRespVo + * @Description 子公司分布返回 + * @Date 2025/12/30 22:01 + * @Created by wangqian + */ +@Data +public class CommitWorkOrderRespVo { + + private Long companyId; + + private String companyName; + //巡查 + private Integer patrolWorkOrde; + //ai + private Integer aiWorkOrde; + //12345 + private Integer outhWorkOrder; + + //网格 + private Integer gridWorkOrder; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/HomePageSummaryReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/HomePageSummaryReqVO.java index ceac347..06bf306 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/HomePageSummaryReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/HomePageSummaryReqVO.java @@ -1,12 +1,21 @@ package com.zteits.urbanops.module.garden.controller.admin.homepage.vo; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; import lombok.Data; @Data public class HomePageSummaryReqVO { + @NotEmpty + @Schema(description = "开始时间", example = "2025-01-01") public String beginTime; + /*结束时间*/ @NotEmpty + @Schema(description = "结束时间", example = "2025-12-10") public String endTime; -} \ No newline at end of file + @Schema(description = "查询类型", example = "类型:order_type,优先级:pressing_type,来源:source_id") + private String queryType; + @Schema(description = "查询状态", example = "新提交工单:1,进行中工单:2 ,已完成工单:3") + private String queryState; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/MaintainProportionReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/MaintainProportionReqVO.java deleted file mode 100644 index d97184b..0000000 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/MaintainProportionReqVO.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zteits.urbanops.module.garden.controller.admin.homepage.vo; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Data -public class MaintainProportionReqVO { - @NotNull - private Integer taskStatus; -} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java new file mode 100644 index 0000000..1111295 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/homepage/vo/WorkOrderTrendRespVo.java @@ -0,0 +1,25 @@ +package com.zteits.urbanops.module.garden.controller.admin.homepage.vo; + +import lombok.Data; + +/** + * @Classname CommitTaskStatisticsResp + * @Description 任务公共返回 + * @Date 2025/12/30 16:12 + * @Created by wangqian + */ +@Data +public class WorkOrderTrendRespVo { + + private String dateValue; + + private String busiLine; + + private String companyId; + + private String companyName; + + private String totalCount; + + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java new file mode 100644 index 0000000..60b0dce --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/homepage/HomepageSummaryMapper.java @@ -0,0 +1,90 @@ +package com.zteits.urbanops.module.garden.dal.mysql.homepage; + +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitTaskStatisticsRespVo; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitWorkOrderRespVo; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.WorkOrderTrendRespVo; +import com.zteits.urbanops.module.garden.dal.dataobject.departmentcost.DepartmentCostDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * @Classname HomepageSummaryMapper + * @Description 首页统计 + * @Date 2025/12/29 22:01 + * @Created by wangqian + */ +@Mapper +public interface HomepageSummaryMapper extends BaseMapperX { + + /** + * @Author wangqian + * @Description 根据条件汇总巡检计划已完成、未完成 + * @Date 2025/12/29 22:06 + */ + Map countInspectionPlanByCompanyId(@Param("companyId") Long companyId); + /** + * @Author wangqian + * @Description 根据条件汇总养护计划已完成、未完成 + * @Date 2025/12/29 22:06 + */ + Map countMaintainPlanByCompanyId(@Param("companyId") Long companyId); + /** + * @Author wangqian + * @Description 根据条件按业务线汇总进行中的工单 + * @Date 2025/12/29 22:06 + */ + List> countInProgressWorkOrder(@Param("companyId") Long companyId); + /** + * @Author wangqian + * @Description 已完成工单,根据工单类型汇总,无效工单:快速工单;有效工单:其他; + * @Date 2025/12/29 23:05 + */ + List> countCompletedWorkOrder(@Param("companyId") Long companyId); + /** + * @Author wangqian + * @Description 根据条件汇总业务线巡查计划次数 + * @Date 2025/12/30 16:24 + */ + List countInspectionPlanNumByBusiLine(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime); + + /** + * @Author wangqian + * @Description 根据条件汇总业务线养护计划次数 + * @Date 2025/12/30 16:24 + */ + List countMaintainPlanNumByBusiLine(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime); + + /** + * @Author wangqian + * @Description + * @Date 2025/12/30 19:26 + */ + List> countRatioByOrderType(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime); + + List> countRatioBySourceId(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime); + + List> countRatioByPressingType(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime); + + /** + * @Author wangqian + * @Description 公司+问题单类型汇总 + * @Date 2025/12/30 21:52 + */ + List countWorkOrderDistribution(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime); + /** + * @Author wangqian + * @Description 热力图 + * @Date 2025/12/31 14:29 + */ + List> countWorkOrderHeatmap(@Param("companyId") Long companyId); + /** + * @Author wangqian + * @Description 工单趋势 + * @Date 2025/12/30 23:40 + */ + List countWorkOrderTrend(@Param("companyId") Long companyId, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("queryState") String queryState); +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java new file mode 100644 index 0000000..37af8e6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java @@ -0,0 +1,13 @@ +package com.zteits.urbanops.module.garden.enums; + +/** + * @Classname CommonConstants + * @Description 公共静态参数 + * @Date 2026/1/3 10:15 + * @Created by wangqian + */ +public interface CommonConstants { + + public static final String DEFAULT_COUNT = "0"; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryService.java index 95c8748..f0ab4f6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryService.java @@ -1,24 +1,55 @@ package com.zteits.urbanops.module.garden.service.homepage; -import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitCountByCompanyReqVO; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitWorkOrderRespVo; import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.HomePageSummaryReqVO; -import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.MaintainProportionReqVO; import java.util.List; import java.util.Map; public interface MaintainSummaryService { - Map selectMaintainSummary(HomePageSummaryReqVO req, Long companyId); - Map>> getSummaryByMaintainType(HomePageSummaryReqVO req, Long companyId); - List> getSummaryByMaintainProportion(HomePageSummaryReqVO req, Long companyId); - List> getSummaryByPlantProportion(HomePageSummaryReqVO req, Long companyId); - Map selectSummaryByCompany(HomePageSummaryReqVO req, Long companyId); - List> getCommitCountByCompany(CommitCountByCompanyReqVO req); - List> getPressingTypeByCompany(CommitCountByCompanyReqVO req); - List> getProcessOrderReturn(Long companyId, String beginTime, String endTime); - List> getProportionByCompany(String beginTime, String endTime); - List> getXcProcessOrder(Long companyId, String beginTime, String endTime); - Map> getCommitCountByTime(Long companyId, CommitCountByCompanyReqVO req); - List> getOrderList(Long companyId, Integer taskStatus); - Map getSummaryByMaintainTypeAndGrowthRate(HomePageSummaryReqVO req, Long companyId); -} \ No newline at end of file + /** + * @Author wangqian + * @Description 首页汇总 巡查计划、养护计划、进行中工单、已完成工单 + * @Date 2025/12/29 21:31 + * @Param req + * @Return java.util.Map + */ + Map getSummary(); + /** + * @Author wangqian + * @Description 根据条件查询任务趋势 + * @Date 2025/12/29 23:40 + * @Param req + */ + Map getWorkTaskTrend(HomePageSummaryReqVO req); + /** + * @Author wangqian + * @Description 根据不同维度查询工单占比(工单类型、紧急程度、来源) + * @Date 2025/12/30 9:58 + * @Param req + * @Return java.util.Map + */ + Map getWorkOrderRatio(HomePageSummaryReqVO req); + /** + * @Author wangqian + * @Description 按公司、问题单类型分组,查询个问题单个数 + * @Date 2025/12/30 21:50 + * @Param req + */ + Map getWorkOrderDistribution(HomePageSummaryReqVO req); + /** + * @Author wangqian + * @Description 工单热量图 + * @Date 2025/12/31 14:26 + * @Return java.util.List> + */ + List> getWorkOrderHeatmap(); + /** + * @Author wangqian + * @Description 以时间+单位为维度,统计工单数量 + * @Date 2025/12/30 23:25 + * @Param req + * @Return java.util.Map + */ + Map getWorkOrderTrend(HomePageSummaryReqVO req); +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java index 89edc70..8616a79 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/MaintainSummaryServiceImpl.java @@ -1,76 +1,685 @@ package com.zteits.urbanops.module.garden.service.homepage; -import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitCountByCompanyReqVO; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.zteits.urbanops.framework.common.biz.system.dict.dto.DictDataRespDTO; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitTaskStatisticsRespVo; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.CommitWorkOrderRespVo; import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.HomePageSummaryReqVO; -import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.MaintainProportionReqVO; +import com.zteits.urbanops.module.garden.controller.admin.homepage.vo.WorkOrderTrendRespVo; +import com.zteits.urbanops.module.garden.dal.mysql.homepage.HomepageSummaryMapper; +import com.zteits.urbanops.module.garden.enums.CommonConstants; +import com.zteits.urbanops.module.system.api.dept.DeptApi; +import com.zteits.urbanops.module.system.api.dict.DictDataApi; +import com.zteits.urbanops.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import com.zteits.urbanops.module.system.enums.DictTypeConstants; +import jakarta.annotation.Resource; +import me.zhyd.oauth.utils.StringUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.zteits.urbanops.module.garden.enums.CommonConstants.DEFAULT_COUNT; @Service public class MaintainSummaryServiceImpl implements MaintainSummaryService { - @Override - public Map selectMaintainSummary(HomePageSummaryReqVO req, Long companyId) { - return Collections.emptyMap(); - } - @Override - public Map>> getSummaryByMaintainType(HomePageSummaryReqVO req, Long companyId) { - return Collections.emptyMap(); - } + @Resource + private HomepageSummaryMapper homepageSummaryMapper; + @Resource + private DeptApi deptApi; + @Resource + private DictDataApi dictDataApi; @Override - public List> getSummaryByMaintainProportion(HomePageSummaryReqVO req, Long companyId) { - return Collections.emptyList(); + public Map getSummary() { + Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + Map respMap = new HashMap<>(); + Long finalCompanyId = companyId; + // 巡查计划、已完成、未完成 + Map countInspectionPlan = countInspectionPlanByCompanyId(finalCompanyId); + // 养护计划、已挖成、未完成 + Map countMaintainPlan = countMaintainPlanByCompanyId(finalCompanyId); + // 进行中工单、园林、市政、物业 + Map countInProgressWorkOrder = countInProgressWorkOrder(finalCompanyId); + // 已完成工单 有效工单、无效工单 + Map countCompletedWorkOrder = countCompletedWorkOrder(finalCompanyId); + + // 等待所有查询完成 + respMap.put("inspectionPlan", countInspectionPlan); + respMap.put("maintainPlan", countMaintainPlan); + respMap.put("inProgressWorkOrder", countInProgressWorkOrder); + respMap.put("completedWorkOrder", countCompletedWorkOrder); + return respMap; } @Override - public List> getSummaryByPlantProportion(HomePageSummaryReqVO req, Long companyId) { - return Collections.emptyList(); - } + public Map getWorkTaskTrend(HomePageSummaryReqVO req) { + Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + Map chartData = new HashMap<>(); + //1、数据结构初始化 + List days = getDays(req.beginTime, req.endTime); + List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.BUSINESS_LINE); + List allBusiLines = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); + Map> defaultData = addTaskDefaultData(req, days, dictDataList); + //2、查询巡检计划汇总 + List inspectionPlanList = homepageSummaryMapper.countInspectionPlanNumByBusiLine(companyId, req.getBeginTime(), req.getEndTime()); + //根据业务线分组 + Map> inspectionPlanGroupMap = + inspectionPlanList.stream().filter(vo -> { + String busiLine = vo.getBusiLine(); + if (busiLine == null) { + return false; + } + return !busiLine.trim().isEmpty(); + }) + .collect(Collectors.groupingBy(CommitTaskStatisticsRespVo::getBusiLine)); + //3、查询养护计划汇总 + List maintainPlanList = homepageSummaryMapper.countMaintainPlanNumByBusiLine(companyId, req.getBeginTime(), req.getEndTime()); + //根据业务线分组 + Map> maintainPlanGroupMap = + maintainPlanList.stream().filter(vo -> { + String busiLine = vo.getBusiLine(); + if (busiLine == null) { + return false; + } + return !busiLine.trim().isEmpty(); + }) + .collect(Collectors.groupingBy(CommitTaskStatisticsRespVo::getBusiLine)); + + + + + // 步骤1:获取所有唯一的业务线(busiLine)集合 + for (String busiLine : allBusiLines) { + List defaultVoList = defaultData.get(busiLine); + if (CollectionUtils.isEmpty(defaultVoList)) { + // 若当前业务线无默认数据,直接跳过,无需赋值 + continue; + } + // ********** 第一步:处理巡检计划数据赋值 ********** + // 获取当前业务线的巡检计划列表(判空,避免null) + List inspectionPlans = inspectionPlanGroupMap.get(busiLine); + if (CollectionUtils.isNotEmpty(inspectionPlans)) { + // 联合标识:根据你的VO实际字段调整(示例:dateValue + "_" + busiLine,确保唯一匹配) + Map inspectionMap = inspectionPlans.stream() + .filter(inspectVo -> + inspectVo.getDateValue() != null && !inspectVo.getDateValue().trim().isEmpty() + && inspectVo.getBusiLine() != null + ) + .collect(Collectors.toMap( + // 键:唯一标识( + inspectVo -> inspectVo.getDateValue() + "_" + inspectVo.getBusiLine(), + // 值:巡检计划VO本身 + inspectVo -> inspectVo, + (existing, newValue) -> existing + )); + + // 遍历默认数据列表,匹配并赋值巡检计划数据 + for (CommitTaskStatisticsRespVo defaultVo : defaultVoList) { + // 构建默认VO的唯一标识(与巡检计划的标识保持一致) + String matchKey = defaultVo.getDateValue() + "_" + defaultVo.getBusiLine(); + if (inspectionMap.containsKey(matchKey)) { + CommitTaskStatisticsRespVo inspectVo = inspectionMap.get(matchKey); + defaultVo.setInspectionPlanNum(inspectVo.getInspectionPlanNum()); + defaultVo.setInspectionPlanFinishNum(inspectVo.getInspectionPlanFinishNum()); + } + } + } + // ********** 第二步:处理养护计划数据赋值********** + // 获取当前业务线的养护计划列表(判空,避免null) + List maintainPlans = maintainPlanGroupMap.get(busiLine); + if (CollectionUtils.isNotEmpty(maintainPlans)) { + // 构建「联合唯一标识-养护计划VO」Map,提高匹配效率 + Map maintainMap = maintainPlans.stream() + .filter(maintainVo -> + maintainVo.getDateValue() != null && !maintainVo.getDateValue().trim().isEmpty() + && maintainVo.getBusiLine() != null + ) + .collect(Collectors.toMap( + maintainVo -> maintainVo.getDateValue() + "_" + maintainVo.getBusiLine(), + maintainVo -> maintainVo, + (existing, newValue) -> existing + )); + // 遍历默认数据列表,匹配并赋值养护计划数据 + for (CommitTaskStatisticsRespVo defaultVo : defaultVoList) { + String matchKey = defaultVo.getDateValue() + "_" + defaultVo.getBusiLine(); + if (maintainMap.containsKey(matchKey)) { + CommitTaskStatisticsRespVo maintainVo = maintainMap.get(matchKey); + // 赋值: + defaultVo.setMaintainPlanNum(maintainVo.getMaintainPlanNum()); + defaultVo.setMaintainPlanFinishNum(maintainVo.getMaintainPlanFinishNum()); + + Integer inspectionNum = defaultVo.getInspectionPlanNum() == null ? 0 : defaultVo.getInspectionPlanNum(); + Integer maintainNum = defaultVo.getMaintainPlanNum() == null ? 0 : defaultVo.getMaintainPlanNum(); + Integer inspectionFinishNum = defaultVo.getInspectionPlanFinishNum() == null ? 0 : defaultVo.getInspectionPlanFinishNum(); + Integer maintainFinishNum = defaultVo.getMaintainPlanFinishNum() == null ? 0 : defaultVo.getMaintainPlanFinishNum(); + // 统一计算总计划数和总完成数 + defaultVo.setPlanNum(inspectionNum + maintainNum); + defaultVo.setPlanFinishNum(inspectionFinishNum + maintainFinishNum); + } + } + } + } + + chartData.put("data", defaultData); + //日期集合 + chartData.put("timeData",days); + return chartData; + } + /** + * @Author wangqian + * @Description 工单占比 + * @Date 2025/12/30 23:45 + */ @Override - public Map selectSummaryByCompany(HomePageSummaryReqVO req, Long companyId) { - return Collections.emptyMap(); + public Map getWorkOrderRatio(HomePageSummaryReqVO req) { + Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + if ("order_type".equals(req.getQueryType())) { + //工单类型 Q:快速工单,C:普通工单, A:ai工单,W:网格工单,O:12345工单 + // 1. 定义工单类型数组(便于后续扩展,新增类型只需在数组中添加) + List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.WORKORDER_TYPE); + List orderTypes = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); + // 2. 初始化响应Map并设置默认空字符串 + Map respMap = new HashMap<>(); + for (String type : orderTypes) { + respMap.put(type, "0"); + } + List> orderMap = homepageSummaryMapper.countRatioByOrderType(companyId, req.getBeginTime(), req.getEndTime()); + if (ObjectUtil.isNotEmpty(orderMap)) { + // 5. 批量遍历赋值,修复逻辑:值非空时覆盖默认值 + for (Map mapItem : orderMap) { + String orderType = mapItem.get("orderType"); + if (ObjectUtil.isNotEmpty(orderType) && respMap.containsKey(orderType)) { + String totalCount = String.valueOf(mapItem.get("totalCount")); + if (StringUtils.isNotEmpty(totalCount)) { + respMap.put(orderType, totalCount); + } + } + } + } + //合并C和Q + // 1. 获取respMap中C和Q的原始值 + Object cObj = respMap.get("C"); + Object qObj = respMap.get("Q"); + + // 2. 初始化C和Q的数值为0(避免空值或转换失败导致异常) + long cNum = 0; + long qNum = 0; + + // 3. 转换C值为数字(兼容String/Integer/Long类型,处理格式异常) + if (ObjectUtil.isNotEmpty(cObj)) { + cNum = Long.parseLong(cObj.toString().trim()); + } + // 4. 转换Q值为数字(同C值,兼容多类型并处理异常) + if (ObjectUtil.isNotEmpty(qObj)) { + qNum = Long.parseLong(qObj.toString().trim()); + } + // 5. 求和后赋值给C键,覆盖原有C值 + long totalCQ = cNum + qNum; + respMap.put("C", totalCQ); + + // 6. 删除Q键,确保最终返回的Map中无Q键 + respMap.remove("Q"); + + return respMap; + } else if ("source_id".equals(req.getQueryType())){ + //来源 事件来源 1、巡查,2、游客居民,3、12345,4、网格 5、大区经理 6、ai + // 1. 定义工单类型数组(便于后续扩展,新增类型只需在数组中添加) + List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.WORKORDER_SOURCE_TYPE); + List sourceIds = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); + + // 2. 初始化响应Map并设置默认空字符串 + Map respMap = sourceIds.stream() + .collect(Collectors.toMap( + sourceId -> sourceId, // 键:业务线 + unused -> DEFAULT_COUNT, // 值:默认0 + (existing, newValue) -> existing, // 重复业务线保留原有值 + HashMap::new // 指定返回HashMap类型 + )); + List> orderMap = homepageSummaryMapper.countRatioBySourceId(companyId, req.getBeginTime(), req.getEndTime()); + if (ObjectUtil.isNotEmpty(orderMap)) { + for (Map mapItem : orderMap) { + String sourceId = String.valueOf(mapItem.get("sourceId")); + if (ObjectUtil.isNotEmpty(sourceId) && respMap.containsKey(sourceId)) { + String totalCount = String.valueOf(mapItem.get("totalCount")); + if (StringUtils.isNotEmpty(totalCount)) { + respMap.put(sourceId, totalCount); + } + } + } + } + return respMap; + } else { + //默认紧急程度 工单紧急程度:特级、紧急、一般 + // 1. 定义工单类型数组(便于后续扩展,新增类型只需在数组中添加) + List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.WORKORDER_PRESSING_TYPE); + List pressingTypes = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); + // 2. 初始化响应Map并设置默认空字符串 + Map respMap = pressingTypes.stream() + .collect(Collectors.toMap( + pressingType -> pressingType, // 键:业务线 + unused -> DEFAULT_COUNT, // 值:默认0 + (existing, newValue) -> existing, // 重复业务线保留原有值 + HashMap::new // 指定返回HashMap类型 + )); + + List> orderMap = homepageSummaryMapper.countRatioByPressingType(companyId, req.getBeginTime(), req.getEndTime()); + if (ObjectUtil.isNotEmpty(orderMap)) { + for (Map mapItem : orderMap) { + String pressingType = String.valueOf(mapItem.get("pressingType")); + if (ObjectUtil.isNotEmpty(pressingType) && respMap.containsKey(pressingType)) { + String totalCount = String.valueOf(mapItem.get("totalCount")); + if (StringUtils.isNotEmpty(totalCount)) { + respMap.put(pressingType, totalCount); + } + } + } + } + return respMap; + } } + /** + * @Author wangqian + * @Description 子公司工单分布 + * @Date 2025/12/30 23:45 + */ + @Override + public Map getWorkOrderDistribution(HomePageSummaryReqVO req) { + Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + Map respMap = new HashMap<>(); + //初始化对象 + List respList = new ArrayList<>(); + List deptRespVOList = deptApi.getCompanyList(); + for (DeptRespVO deptRespVO : deptRespVOList) { + CommitWorkOrderRespVo vo = new CommitWorkOrderRespVo(); + vo.setCompanyId(deptRespVO.getId()); + vo.setCompanyName(deptRespVO.getName()); + vo.setPatrolWorkOrde(0); + vo.setGridWorkOrder(0); + vo.setAiWorkOrde(0); + vo.setOuthWorkOrder(0); + respList.add(vo); + } + + List countList = homepageSummaryMapper.countWorkOrderDistribution(companyId,req.getBeginTime(), req.getEndTime()); + Map companyIdMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(countList)) { + companyIdMap = countList.stream() + .collect(Collectors.toMap( + CommitWorkOrderRespVo::getCompanyId, + item -> item, + (existing, newValue) -> existing + )); + } + for (CommitWorkOrderRespVo respVo : respList) { + if (!companyIdMap.isEmpty()) { + CommitWorkOrderRespVo vo = companyIdMap.get(respVo.getCompanyId()); + if(vo != null) { + respVo.setAiWorkOrde(vo.getAiWorkOrde()); + respVo.setGridWorkOrder(vo.getGridWorkOrder()); + respVo.setPatrolWorkOrde(vo.getPatrolWorkOrde()); + respVo.setOuthWorkOrder(vo.getOuthWorkOrder()); + } + } + } + // 排序 + String[] companyNames = {"蓟城广安", "蓟城德胜", "西城园林", "三海投资", "绿美园林"}; + Map companyIndexMap = new HashMap<>(); + for (int i = 0; i < companyNames.length; i++) { + companyIndexMap.put(companyNames[i], i); + } + List sortedList = respList.stream() + // 过滤:仅保留companyNames中存在的单位 + .filter(item -> companyIndexMap.containsKey(item.getCompanyName())) + // 按预定义顺序排序 + .sorted(Comparator.comparing(item -> companyIndexMap.get(item.getCompanyName()))) + .collect(Collectors.toList()); + Map orderedMap = sortedList.stream() + .collect(Collectors.toMap( + CommitWorkOrderRespVo::getCompanyName, + Function.identity(), + (existing, replacement) -> existing, + LinkedHashMap::new + )); + + return orderedMap; + } + /** + * @Author wangqian + * @Description 热力图 + * @Date 2025/12/31 14:27 + */ @Override - public List> getCommitCountByCompany(CommitCountByCompanyReqVO req) { - return Collections.emptyList(); + public List> getWorkOrderHeatmap() { + Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + return homepageSummaryMapper.countWorkOrderHeatmap(companyId); } + /** + * @Author wangqian + * @Description 工单趋势图 + * @Date 2025/12/31 11:44 + */ @Override - public List> getPressingTypeByCompany(CommitCountByCompanyReqVO req) { - return Collections.emptyList(); + public Map getWorkOrderTrend(HomePageSummaryReqVO req) { + Long companyId = SecurityFrameworkUtils.getLoginUserDeptId(); + if(null == companyId || companyId == 0L || companyId == 100L){ + companyId = null; + } + if (StringUtils.isEmpty(req.getQueryState())) { + throw exception0(BAD_REQUEST.getCode(),"querystate不能为空"); + } + //返回对象 + Map chartData = new HashMap<>(); + // 1. 初始化响应Map + Map> respMap = addDefaultData(req); + // 2、汇总工单数量 + List countList = homepageSummaryMapper.countWorkOrderTrend(companyId, req.getBeginTime(), req.getEndTime(), req.getQueryState()); + Map> busiLineGroup; + if (CollectionUtils.isNotEmpty(countList)) { + busiLineGroup = countList.stream() + // 核心:过滤掉busiLine为null或空字符串(含全空格)的记录 + .filter(vo -> { + if (vo.getBusiLine() == null) { + return false; + } + return !vo.getBusiLine().trim().isEmpty(); + }) + .collect(Collectors.groupingBy(WorkOrderTrendRespVo::getBusiLine)); + } else { + busiLineGroup = new HashMap<>(); + } + // 3. 核心:按 busiLine + companyId + dateValue 赋值真实totalCount + // 遍历respMap中的每个业务线(key=业务线,value=该业务线默认VO列表) + for (Map.Entry> respEntry : respMap.entrySet()) { + String busiLine = respEntry.getKey(); // 当前业务线(如yl/sz/wy) + List defaultVoList = respEntry.getValue(); // 该业务线默认VO列表 + + // 3.1 从查询结果中,获取当前业务线对应的真实VO列表 + List realVoList = busiLineGroup.get(busiLine); + if (CollectionUtils.isEmpty(realVoList)) { + // 若当前业务线无查询结果,直接跳过,保留默认值0 + continue; + } + + // 3.2 构建「联合标识-真实totalCount」的Map,提高匹配效率 + // 联合标识:companyId_dateValue(因为busiLine已匹配,内部无需重复拼接) + Map realCountMap = realVoList.stream() + .filter(realVo -> realVo.getCompanyId() != null && realVo.getDateValue() != null) // 过滤空值,避免异常 + .collect(Collectors.toMap( + // 键:companyId + "_" + dateValue(唯一标识) + realVo -> realVo.getCompanyId() + "_" + realVo.getDateValue(), + // 值:真实的totalCount(注意:需根据你的VO类型调整,若为数字可直接赋值) + realVo -> realVo.getTotalCount(), + // 若存在重复联合标识,保留第一个值(避免报错) + (existing, newValue) -> existing + )); + + // 3.3 遍历默认VO列表,匹配并赋值真实totalCount + for (WorkOrderTrendRespVo defaultVo : defaultVoList) { + // 构建默认VO的联合标识,与真实值Map匹配 + String key = defaultVo.getCompanyId() + "_" + defaultVo.getDateValue(); + // 若存在真实值,替换默认值;不存在则保留0 + if (realCountMap.containsKey(key)) { + defaultVo.setTotalCount(realCountMap.get(key)); + } + } + } + chartData.put("data", respMap); + return chartData; } + /** + * @Author wangqian + * @Description 初始化返回对象 + * @Date 2025/12/31 22:27 + */ + private Map> addDefaultData(HomePageSummaryReqVO req){ + Map> respMap = new HashMap<>(); + List newList = new ArrayList<>(); + List days = getDays(req.beginTime, req.endTime); + List companyList = deptApi.getCompanyList(); + days.forEach(dayy->{ + companyList.forEach(resp ->{ + WorkOrderTrendRespVo type = new WorkOrderTrendRespVo(); + type.setDateValue(dayy); + type.setTotalCount("0"); // 默认总数为0 + type.setCompanyId(String.valueOf(resp.getId())); + type.setCompanyName(resp.getName()); + newList.add(type); + }); + }); - @Override - public List> getProcessOrderReturn(Long companyId, String beginTime, String endTime) { - return Collections.emptyList(); + List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.BUSINESS_LINE); + List busiLines = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); + + // 6. 为每个业务线生成专属列表并赋值busiLine + for (String type : busiLines) { + // 核心:通过map拷贝对象并设置busiLine,避免引用共享 + List busiLineList = newList.stream() + // 拷贝原对象,创建新对象并设置当前业务线 + .map(original -> { + WorkOrderTrendRespVo copy = new WorkOrderTrendRespVo(); + BeanUtils.copyProperties(original, copy); + // 设置当前业务线(核心:为该列表专属赋值) + copy.setBusiLine(type); + return copy; + }) + .collect(Collectors.toList()); + // 将业务线-对应列表存入Map + respMap.put(type, busiLineList); + } + return respMap; } - @Override - public List> getProportionByCompany(String beginTime, String endTime) { - return Collections.emptyList(); + /** + * @Author wangqian + * @Description 初始化任务趋势图 + * @Date 2026/1/3 10:43 + */ + private Map> addTaskDefaultData(HomePageSummaryReqVO req, List days, List dictDataList ){ + Map> respMap = new HashMap<>(); + List newList = new ArrayList<>(); + //1、日期赋值 + days.forEach(dayy->{ + CommitTaskStatisticsRespVo vo = new CommitTaskStatisticsRespVo(); + vo.setDateValue(dayy); + vo.setPlanNum(0); // 默认总数为0 + vo.setPlanFinishNum(0); + vo.setInspectionPlanNum(0); + vo.setInspectionPlanFinishNum(0); + vo.setMaintainPlanNum(0); + vo.setMaintainPlanFinishNum(0); + newList.add(vo); + }); + + // 2. 为每个业务线生成专属列表并赋值busiLine + for (DictDataRespDTO dto : dictDataList) { + // 核心:通过map拷贝对象并设置busiLine,避免引用共享 + List busiLineList = newList.stream() + // 拷贝原对象,创建新对象并设置当前业务线 + .map(original -> { + CommitTaskStatisticsRespVo copy = new CommitTaskStatisticsRespVo(); + BeanUtils.copyProperties(original, copy); + copy.setBusiLine(dto.getValue()); + copy.setBusiLineName(dto.getLabel()); + return copy; + }) + .collect(Collectors.toList()); + // 将业务线-对应列表存入Map + respMap.put(dto.getValue(), busiLineList); + } + return respMap; } + /** + * @Author wangqian + * @Description 巡检计划统计 + * @Date 2025/12/29 22:15 + * @Param companyId + * @Return java.util.Map + */ + private Map countInspectionPlanByCompanyId(Long companyId) { + return homepageSummaryMapper.countInspectionPlanByCompanyId(companyId); + } + /** + * @Author wangqian + * @Description 养护计划统计 + * @Date 2025/12/29 22:15 + * @Param companyId + * @Return java.util.Map + */ + private Map countMaintainPlanByCompanyId(Long companyId) { + return homepageSummaryMapper.countMaintainPlanByCompanyId(companyId); + } + /** + * @Author wangqian + * @Description 进行中的工单 + * @Date 2025/12/29 22:15 + * @Param companyId + * @Return java.util.Map + */ + private Map countInProgressWorkOrder(Long companyId) { + // 1. 定义工单类型数组(便于后续扩展,新增类型只需在数组中添加) + List dictDataList = dictDataApi.getDictDataList(DictTypeConstants.BUSINESS_LINE); + List busiLines = dictDataList.stream().map(DictDataRespDTO::getValue).collect(Collectors.toList()); - @Override - public List> getXcProcessOrder(Long companyId, String beginTime, String endTime) { - return Collections.emptyList(); + // 2. 初始化响应Map并设置默认空字符串 + Map respMap = busiLines.stream() + .collect(Collectors.toMap( + busiLine -> busiLine, // 键:业务线 + unused -> DEFAULT_COUNT, // 值:默认0 + (existing, newValue) -> existing, // 重复业务线保留原有值 + HashMap::new // 指定返回HashMap类型 + )); + Integer sumTotalCount = 0; + List> orderMap = homepageSummaryMapper.countInProgressWorkOrder(companyId); + if (ObjectUtil.isNotEmpty(orderMap)) { + for (Map mapItem : orderMap) { + String busiLine = mapItem.get("busiLine"); + if (ObjectUtil.isNotEmpty(busiLine) && respMap.containsKey(busiLine)) { + String totalCount = String.valueOf(mapItem.get("totalCount")); + if (ObjectUtil.isNotEmpty(totalCount)) { + respMap.put(busiLine, totalCount); + sumTotalCount = sumTotalCount + Integer.parseInt(totalCount); + } + } + } + } + respMap.put("totalCount", sumTotalCount); + return respMap; } - @Override - public Map> getCommitCountByTime(Long companyId, CommitCountByCompanyReqVO req) { - return Collections.emptyMap(); + private Map countCompletedWorkOrder(Long companyId) { + // 1. 定义工单类型数组(便于后续扩展,新增类型只需在数组中添加) + String[] queryTypes = {"validOrder", "invalidOrder"}; + // 2. 初始化响应Map并设置默认空字符串 + Map respMap = new HashMap<>(); + for (String type : queryTypes) { + respMap.put(type, "0"); + } + Integer sumTotalCount = 0; + List> orderMap = homepageSummaryMapper.countCompletedWorkOrder(companyId); + if (ObjectUtil.isNotEmpty(orderMap)) { + for (Map mapItem : orderMap) { + String busiLine = mapItem.get("validOrder"); + if (ObjectUtil.isNotEmpty(busiLine) && respMap.containsKey(busiLine)) { + String totalCount = String.valueOf(mapItem.get("totalCount")); + if (ObjectUtil.isNotEmpty(totalCount)) { + respMap.put(busiLine, totalCount); + sumTotalCount = sumTotalCount + Integer.parseInt(totalCount); + } + } + } + } + respMap.put("totalCount", sumTotalCount); + return respMap; } - @Override - public List> getOrderList(Long companyId, Integer taskStatus) { - return Collections.emptyList(); + public static List getDays(String startTime, String endTime) { + + // 返回的日期集合 + List days = new ArrayList(); + + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date start = dateFormat.parse(startTime); + Date end = dateFormat.parse(endTime); + + Calendar tempStart = Calendar.getInstance(); + tempStart.setTime(start); + + Calendar tempEnd = Calendar.getInstance(); + tempEnd.setTime(end); + //tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束) + while (tempStart.before(tempEnd)) { + days.add(dateFormat.format(tempStart.getTime())); + tempStart.add(Calendar.DAY_OF_YEAR, 1); + } + + } catch (ParseException e) { + e.printStackTrace(); + } + + return days; } - @Override - public Map getSummaryByMaintainTypeAndGrowthRate(HomePageSummaryReqVO req, Long companyId) { - return Collections.emptyMap(); + /** + * 字符串类型数字求和工具方法(兼容空值、非数字格式) + * @param num1 第一个数字字符串 + * @param num2 第二个数字字符串 + * @return 求和后的字符串(转换失败/空值按0处理) + */ + private String sumStringNum(String num1, String num2) { + // 转换第一个数字:空值/非数字按0处理 + long n1 = 0; + if (StringUtils.isNotEmpty(num1)) { + try { + n1 = Long.parseLong(num1.trim()); + } catch (NumberFormatException e) { + // 非数字格式,保持0(可选打印日志提示) + // log.warn("数字字符串转换失败:{}", num1); + } + } + + // 转换第二个数字:空值/非数字按0处理 + long n2 = 0; + if (StringUtils.isNotEmpty(num2)) { + try { + n2 = Long.parseLong(num2.trim()); + } catch (NumberFormatException e) { + // 非数字格式,保持0 + // log.warn("数字字符串转换失败:{}", num2); + } + } + + // 求和后转为字符串返回(与VO字段类型一致) + return String.valueOf(n1 + n2); } -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml b/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml new file mode 100644 index 0000000..c9b0e28 --- /dev/null +++ b/urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java index 67a9762..3a9b504 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java @@ -23,4 +23,15 @@ public interface DictTypeConstants { String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + String WORKORDER_SOURCE_TYPE = "workorder_source_type"; // 工单来源 + String WORKORDER_PRESSING_TYPE = "workorder_pressing_type"; // 工单紧急程度 + + String BUSINESS_LINE = "business_line"; // 业务线 + + String WORKORDER_TYPE = "work_order_type"; //工单类型 + + + + + } -- libgit2 0.21.4