pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeMapper.java
@@ -162,4 +162,5 @@ * @return */ List<Long> getIntakeIdByNameExcludeId(@Param("id")Long id, @Param("intakeName")String intakeName); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmOnHourReportHistoryMapper.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoRm.RmOnHourReportHistory; import com.dy.pipIrrGlobal.voRm.VoOnHour; import com.dy.pipIrrGlobal.voSt.VoCumulativeFlow; import com.dy.pipIrrGlobal.voSt.VoIntake; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -71,4 +73,45 @@ */ List<VoOnHour> getOnHourReports_history(Map<?, ?> params); /** * 获取指定时间段内未上线取水口数量 * @param params * @return */ Long getNotOnlineIntakesCount(Map<?, ?> params); /** * 获取指定时间段内未上线的取水口 * @param params * @return */ List<VoIntake> getNotOnlineIntakes(Map<?, ?> params); /** * 获取累计流量超过指定值的取水口数量 * @param params * @return */ Long getLargeFlowIntakesCount(Map<?, ?> params); /** * 获取累计流量超过指定值的取水口 * @param params * @return */ List<VoCumulativeFlow> getLargeFlowIntakes(Map<?, ?> params); /** * 获取累计流量低于指定值的取水口数量 * @param params * @return */ Long getSmallFlowIntakesCount(Map<?, ?> params); /** * 获取累计流量低于指定值的取水口 * @param params * @return */ List<VoCumulativeFlow> getSmallFlowIntakes(Map<?, ?> params); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSt/VoCumulativeFlow.java
New file @@ -0,0 +1,28 @@ package com.dy.pipIrrGlobal.voSt; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; /** * @author ZhuBaoMin * @date 2024-08-01 16:12 * @LastEditTime 2024-08-01 16:12 * @Description 累计流量视图 */ @Data public class VoCumulativeFlow extends VoIntake { /** * 累计流量 */ private Float cumulativeFlow; /** * 数据获取日期 */ @JsonFormat(pattern = "yyyy-MM-dd") private Date getDate; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSt/VoIntake.java
New file @@ -0,0 +1,34 @@ package com.dy.pipIrrGlobal.voSt; import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.writer.ObjectWriterImplToString; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-08-01 14:03 * @LastEditTime 2024-08-01 14:03 * @Description 取水口统计结果视图对象 */ @Data public class VoIntake { private static final long serialVersionUID = 202408311404001L; /** * 取水口ID */ @JSONField(serializeUsing= ObjectWriterImplToString.class) private Long intakeId; /** * 取水口编号 */ private String intakeNum; /** * 取水口所属片区 */ private String blockName; } pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -72,7 +72,7 @@ pipIrr: global: dev: true #是否开发阶段,true或false dev: false #是否开发阶段,true或false dsName: ym #开发阶段,设置临时的数据库名称 mw: webPort: 8070 pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmOnHourReportHistoryMapper.xml
@@ -255,4 +255,93 @@ </trim> </select> <!--获取指定时间段内未上线取水口数量--> <select id="getNotOnlineIntakesCount" resultType="java.lang.Long"> SELECT COUNT(*) AS recordCount FROM pr_intake inta LEFT JOIN (SELECT * FROM rm_on_hour_report_history WHERE dt BETWEEN #{timeStart} AND #{timeStop}) his ON his.intake_id = inta.id INNER JOIN ba_block blo ON blo.id = inta.blockId WHERE his.intake_id IS NULL AND inta.deleted = 0 </select> <!--获取指定时间段内未上线的取水口--> <select id="getNotOnlineIntakes" resultType="com.dy.pipIrrGlobal.voSt.VoIntake"> SELECT inta.id AS intakeId, inta.name AS intakeNum, blo.name AS blockName FROM pr_intake inta LEFT JOIN (SELECT * FROM rm_on_hour_report_history WHERE dt BETWEEN #{timeStart} AND #{timeStop}) his ON his.intake_id = inta.id INNER JOIN ba_block blo ON blo.id = inta.blockId WHERE his.intake_id IS NULL AND inta.deleted = 0 ORDER BY inta.id <trim prefix="limit " > <if test="start != null and count != null"> #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER} </if> </trim> </select> <!--获取累计流量超过指定值的取水口数量--> <select id="getLargeFlowIntakesCount" resultType="java.lang.Long"> SELECT COUNT(*) AS recordCount FROM pr_intake inta INNER JOIN rm_on_hour_report_last hou ON hou.intake_id = inta.id INNER JOIN ba_block blo ON blo.id = inta.blockId WHERE inta.deleted = 0 AND hou.total_amount > #{totalAmount} </select> <!--获取累计流量超过指定值的取水口--> <select id="getLargeFlowIntakes" resultType="com.dy.pipIrrGlobal.voSt.VoCumulativeFlow"> SELECT inta.id AS intakeId, inta.name AS intakeNum, blo.name AS blockName, CAST(hou.total_amount AS DECIMAL(10, 2)) AS cumulativeFlow, hou.dt AS getDate FROM pr_intake inta INNER JOIN rm_on_hour_report_last hou ON hou.intake_id = inta.id INNER JOIN ba_block blo ON blo.id = inta.blockId WHERE inta.deleted = 0 AND hou.total_amount > #{totalAmount} ORDER BY hou.dt <trim prefix="limit " > <if test="start != null and count != null"> #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER} </if> </trim> </select> <!--获取累计流量低于指定值的取水口数量--> <select id="getSmallFlowIntakesCount" resultType="java.lang.Long"> SELECT COUNT(*) AS recordCount FROM pr_intake inta INNER JOIN rm_on_hour_report_last hou ON hou.intake_id = inta.id INNER JOIN ba_block blo ON blo.id = inta.blockId WHERE inta.deleted = 0 AND hou.total_amount < #{totalAmount} </select> <!--获取累计流量低于指定值的取水口--> <select id="getSmallFlowIntakes" resultType="com.dy.pipIrrGlobal.voSt.VoCumulativeFlow"> SELECT inta.id AS intakeId, inta.name AS intakeNum, blo.name AS blockName, <!-- FORMAT(hou.total_amount,2) AS cumulativeFlow,--> CAST(hou.total_amount AS DECIMAL(10, 2)) AS cumulativeFlow, hou.dt AS getDate FROM pr_intake inta INNER JOIN rm_on_hour_report_last hou ON hou.intake_id = inta.id INNER JOIN ba_block blo ON blo.id = inta.blockId WHERE inta.deleted = 0 AND hou.total_amount < #{totalAmount} ORDER BY hou.dt <trim prefix="limit " > <if test="start != null and count != null"> #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER} </if> </trim> </select> </mapper> pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/config/WebFilterConfiguration.java
New file @@ -0,0 +1,51 @@ package com.dy.pipIrrStatistics.config; import com.dy.common.webFilter.DevOfDataSourceNameSetFilter; import com.dy.common.webFilter.UserTokenFilter; import jakarta.servlet.Filter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author ZhuBaoMin * @date 2023/12/5 10:32 * @LastEditTime 2023/12/5 10:32 * @Description */ @Configuration public class WebFilterConfiguration { @Value("${pipIrr.global.dev}") public String isDevStage ;//是否为开发阶段 @Value("${pipIrr.global.dsName}") public String dsName ;//开发阶段的数据源名称 /** * DevOfDataSourceNameSetFilter与UserTokenFilter只能一个被配置上, * 所以他们的order都是1 */ private static final int order_UserTokenFilter = 1 ;//与下面 private static final int order_DevOfDataSourceNameSetFilter = 1 ; @Bean public FilterRegistrationBean<? extends Filter> RegFilter() { FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(); if(this.isDevStage != null && !this.isDevStage.trim().equals("") && this.isDevStage.trim().equalsIgnoreCase("true")){ filterRegistrationBean.setFilter(new DevOfDataSourceNameSetFilter()); filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则 filterRegistrationBean.addInitParameter("dataSourceName",dsName);//设置init参数 filterRegistrationBean.setName("DevOfDataSourceNameSetFilter");//设置过滤器名称 filterRegistrationBean.setOrder(order_DevOfDataSourceNameSetFilter);//执行次序 }else{ filterRegistrationBean.setFilter(new UserTokenFilter()); filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则 filterRegistrationBean.setName("UserTokenFilter");//设置过滤器名称 filterRegistrationBean.setOrder(order_UserTokenFilter);//执行次序 } return filterRegistrationBean; } } pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/config/WebListenerConfiguration.java
New file @@ -0,0 +1,56 @@ package com.dy.pipIrrStatistics.config; import com.dy.common.webListener.GenerateIdSetSuffixListener; import jakarta.servlet.ServletContextListener; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author ZhuBaoMin * @date 2023/12/5 10:33 * @LastEditTime 2023/12/5 10:33 * @Description */ @Configuration public class WebListenerConfiguration { /** * 启动顺序 */ //private static final int order_config = 0 ; private static final int order_idSetSuffix = 1 ; //private static final int order_init = 2 ; /* * 解析各种***.config配置的ConfigListener,暂时不采用此种配置方式 * @Bean public ConfigListener getGlConfigListener(){ return new ConfigListener() ; } /** * 外部提供Listener * @param listener 外部提供Listener * @return 注册Bean @Bean public ServletListenerRegistrationBean<? extends ServletContextListener> regConfigListener(ConfigListener listener) { ServletListenerRegistrationBean<ConfigListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>(); listenerRegistrationBean.setListener(listener); listenerRegistrationBean.setOrder(order_config); return listenerRegistrationBean; } */ /** * 内部提供listener,该listener在系统启动时,根据配置 设置ID产生器的后缀 * @return 注册Bean */ @Bean public ServletListenerRegistrationBean<? extends ServletContextListener> regSsoListener() { ServletListenerRegistrationBean<GenerateIdSetSuffixListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>(); listenerRegistrationBean.setListener(new GenerateIdSetSuffixListener()); listenerRegistrationBean.setOrder(order_idSetSuffix); return listenerRegistrationBean; } } pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/intake/IntakeSv.java
New file @@ -0,0 +1,115 @@ package com.dy.pipIrrStatistics.intake; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.daoRm.RmOnHourReportHistoryMapper; import com.dy.pipIrrGlobal.voSt.VoCumulativeFlow; import com.dy.pipIrrGlobal.voSt.VoIntake; import com.dy.pipIrrStatistics.intake.qo.CumulativeFlowQO; import com.dy.pipIrrStatistics.intake.qo.IntakeQO; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.DecimalFormat; import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.Optional; /** * @author ZhuBaoMin * @date 2024-08-01 13:58 * @LastEditTime 2024-08-01 13:58 * @Description */ @Slf4j @Service public class IntakeSv { @Autowired private RmOnHourReportHistoryMapper rmOnHourReportHistoryMapper; /** * 获取指定时间段内未上线的取水口 * @param qo * @return */ public QueryResultVo<List<VoIntake>> getNotOnlineIntakes(IntakeQO qo) { DecimalFormat df = new DecimalFormat("0.00"); /** * 补齐起止时间,如果开始时间为空,则默认为当前日期 */ String timeStart = qo.getTimeStart(); String timeStop = qo.getTimeStop(); if(timeStart != null) { timeStart = timeStart + " 00:00:00"; }else { timeStart = LocalDate.now() + " 00:00:00"; } if(timeStop != null) { timeStop = timeStop + " 23:59:59"; } qo.setTimeStart(timeStart); qo.setTimeStop(timeStop); // 生成查询参数 Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo) ; // 获取符合条件的记录数 Long itemTotal = Optional.ofNullable(rmOnHourReportHistoryMapper.getNotOnlineIntakesCount(params)).orElse(0L); QueryResultVo<List<VoIntake>> rsVo = new QueryResultVo<>() ; rsVo.pageSize = qo.pageSize ; rsVo.pageCurr = qo.pageCurr ; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = rmOnHourReportHistoryMapper.getNotOnlineIntakes(params); return rsVo ; } /** * 获取累计流量超过指定值的取水口 * @param qo * @return */ public QueryResultVo<List<VoCumulativeFlow>> getLargeFlowIntakes(CumulativeFlowQO qo) { // 生成查询参数 Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo) ; // 获取符合条件的记录数 Long itemTotal = Optional.ofNullable(rmOnHourReportHistoryMapper.getLargeFlowIntakesCount(params)).orElse(0L); QueryResultVo<List<VoCumulativeFlow>> rsVo = new QueryResultVo<>() ; rsVo.pageSize = qo.pageSize ; rsVo.pageCurr = qo.pageCurr ; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = rmOnHourReportHistoryMapper.getLargeFlowIntakes(params); return rsVo ; } /** * 获取累计流量低于指定值的取水口 * @param qo * @return */ public QueryResultVo<List<VoCumulativeFlow>> getSmallFlowIntakes(CumulativeFlowQO qo) { // 生成查询参数 Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo) ; // 获取符合条件的记录数 Long itemTotal = Optional.ofNullable(rmOnHourReportHistoryMapper.getSmallFlowIntakesCount(params)).orElse(0L); QueryResultVo<List<VoCumulativeFlow>> rsVo = new QueryResultVo<>() ; rsVo.pageSize = qo.pageSize ; rsVo.pageCurr = qo.pageCurr ; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = rmOnHourReportHistoryMapper.getSmallFlowIntakes(params); return rsVo ; } } pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/intake/IntkeCtrl.java
New file @@ -0,0 +1,93 @@ package com.dy.pipIrrStatistics.intake; import com.dy.common.aop.SsoAop; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.voSt.VoCumulativeFlow; import com.dy.pipIrrGlobal.voSt.VoIntake; import com.dy.pipIrrStatistics.intake.qo.CumulativeFlowQO; import com.dy.pipIrrStatistics.intake.qo.IntakeQO; import com.dy.pipIrrStatistics.result.StatisticlResultCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * @author ZhuBaoMin * @date 2024-08-01 13:57 * @LastEditTime 2024-08-01 13:57 * @Description */ @Slf4j @RestController @RequestMapping(path="statistics") @RequiredArgsConstructor public class IntkeCtrl { private final IntakeSv intakeSv; /** * 获取指定时间段内未上线的取水口 * @param qo * @return */ @GetMapping(path = "/getNotOnlineIntakes") @SsoAop() public BaseResponse<QueryResultVo<List<VoIntake>>> getNotOnlineIntakes(IntakeQO qo) { try { QueryResultVo<List<VoIntake>> res = intakeSv.getNotOnlineIntakes(qo); if(res.itemTotal == 0) { return BaseResponseUtils.buildErrorMsg(StatisticlResultCode.NO_RECORDS.getMessage()); } return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取开卡记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 获取累计流量超过指定值的取水口 * @param qo * @return */ @GetMapping(path = "/getLargeFlowIntakes") @SsoAop() public BaseResponse<QueryResultVo<List<VoCumulativeFlow>>> getLargeFlowIntakes(CumulativeFlowQO qo) { try { QueryResultVo<List<VoCumulativeFlow>> res = intakeSv.getLargeFlowIntakes(qo); if(res.itemTotal == 0) { return BaseResponseUtils.buildErrorMsg(StatisticlResultCode.NO_RECORDS.getMessage()); } return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取开卡记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 获取累计流量低于指定值的取水口 * @param qo * @return */ @GetMapping(path = "/getSmallFlowIntakes") @SsoAop() public BaseResponse<QueryResultVo<List<VoCumulativeFlow>>> getSmallFlowIntakes(CumulativeFlowQO qo) { try { QueryResultVo<List<VoCumulativeFlow>> res = intakeSv.getSmallFlowIntakes(qo); if(res.itemTotal == 0) { return BaseResponseUtils.buildErrorMsg(StatisticlResultCode.NO_RECORDS.getMessage()); } return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取开卡记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } } pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/intake/qo/CumulativeFlowQO.java
New file @@ -0,0 +1,20 @@ package com.dy.pipIrrStatistics.intake.qo; import com.dy.common.webUtil.QueryConditionVo; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-08-01 16:20 * @LastEditTime 2024-08-01 16:20 * @Description 累计流量查询对象 */ @Data public class CumulativeFlowQO extends QueryConditionVo { /** * 累计流量 */ private Double totalAmount; } pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/intake/qo/IntakeQO.java
New file @@ -0,0 +1,30 @@ package com.dy.pipIrrStatistics.intake.qo; import com.dy.common.webUtil.QueryConditionVo; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotBlank; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-08-01 14:31 * @LastEditTime 2024-08-01 14:31 * @Description */ @Data public class IntakeQO extends QueryConditionVo { /** * 开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd") private String timeStart; /** * 结束时间 */ @JsonFormat(pattern = "yyyy-MM-dd") @NotBlank(message = "结束时间不能为空") private String timeStop; } pipIrr-platform/pipIrr-web/pipIrr-web-statistics/src/main/java/com/dy/pipIrrStatistics/result/StatisticlResultCode.java
New file @@ -0,0 +1,20 @@ package com.dy.pipIrrStatistics.result; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author ZhuBaoMin * @date 2024-08-01 15:03 * @LastEditTime 2024-08-01 15:03 * @Description */ @Getter @AllArgsConstructor public enum StatisticlResultCode { NO_RECORDS(10001, "没有符合条件的记录"); private final Integer code; private final String message; }