README.md
New file @@ -0,0 +1,124 @@ # pipIrr 智能灌溉系统 ## 项目概述 pipIrr是一套基于Java的智能管道灌溉系统解决方案,用于实现水资源的智能化管理与灌溉控制。系统集成了远程终端控制、GIS地理信息、水资源监测与分析、微信接入等多种功能,为智慧农业和水利工程提供全面的技术支持。 ## 系统架构 系统采用微服务架构,基于Spring Boot 3构建,主要包括以下几个核心部分: - **前端应用层**:提供Web界面、移动应用、微信公众号等多种交互方式 - **业务服务层**:处理核心业务逻辑,包括灌溉管理、项目管理、数据统计等 - **中间件层**:提供RTU(远程终端单元)通信、第三方系统集成等功能 - **基础设施层**:提供数据存储、缓存、消息队列等基础服务 ## 模块说明 ### 父模块 (pipIrr-platform) 作为整个项目的父模块,管理依赖版本和构建配置。 ### 核心子模块 - **pipIrr-common**: 公共组件,提供工具类、通用配置等 - **pipIrr-global**: 全局配置和服务 - **pipIrr-web**: Web应用模块集合 - pipIrr-web-base: 基础数据服务 - pipIrr-web-sso: 单点登录服务 - pipIrr-web-irrigate: 灌溉管理 - pipIrr-web-gis: GIS地理信息服务 - pipIrr-web-project: 项目管理 - pipIrr-web-statistics: 数据统计分析 - pipIrr-web-remote: 远程控制 - pipIrr-web-wechat: 微信集成 - pipIrr-web-app: 移动应用服务 - pipIrr-web-file: 文件管理 - pipIrr-web-operation: 运维管理 - pipIrr-web-sell: 销售管理 - pipIrr-web-temp: 临时模块 - **pipIrr-mw**: 中间件服务 - pipIrr-mw-rtu: RTU设备通信 - pipIrr-mw-rtu3rd: 第三方RTU集成 - pipIrr-mw-simulate-rtu: RTU模拟器 - pipIrr-mwTest-server: 测试服务器 - pipIrr-mwTest-client: 测试客户端 ## 技术栈 - **基础框架**: Spring Boot 3.1.3 - **JDK版本**: Java 20 - **Web服务**: Tomcat 10.1.12 - **数据库**: MySQL 8.0.33 - **ORM框架**: MyBatis-Plus 3.5.3.2 - **数据库连接池**: Druid 1.2.20 - **API文档**: SpringDoc OpenAPI 2.2.0 - **JSON处理**: FastJSON 2.0.40 - **对象映射**: MapStruct 1.5.5.Final - **工具集**: Hutool 5.8.22 - **日志框架**: Log4j2 2.20.0 ## 开发环境搭建 ### 前置条件 - JDK 20 - Maven 3.8+ - MySQL 8.0+ - IDE推荐: IntelliJ IDEA ### 构建步骤 1. 克隆代码库 ```bash git clone <repository-url> ``` 2. 导入项目到IDE 使用IDEA导入Maven项目 3. 配置数据库 在相应配置文件中设置数据库连接信息 4. 编译项目 ```bash mvn clean package ``` ## 部署说明 ### 开发环境 ```bash mvn spring-boot:run -Dspring.profiles.active=dev ``` ### 生产环境 1. 打包应用 ```bash mvn clean package -Dspring.profiles.active=prod ``` 2. 运行jar包 ```bash java -jar <模块名>-<版本号>.jar ``` ## 项目文档 详细的项目文档位于 `pipIrr-platform/文档/` 目录下,包括: - API接口文档 - 数据库设计 - 部署指南 - 编码规范 ## 版本信息 当前版本: 1.0.0 ## 贡献指南 1. Fork 本仓库 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交变更 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 创建Pull Request pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
@@ -268,4 +268,18 @@ * @return */ VoTermCard getTermCardInfo(@Param("cardAddr")String cardAddr); /** * 获取已挂失水卡列表记录数量 * @param params * @return */ Long getLostCardsCount(Map<?, ?> params); /** * 获取已挂失水卡列表 * @param params * @return */ List<VoCards> getLostCards(Map<?, ?> params); } pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -808,4 +808,34 @@ ORDER BY card.createDt DESC LIMIT 1 </select> <!--获取已挂失水卡列表记录数量--> <select id="getLostCardsCount" parameterType="java.util.Map" resultType="java.lang.Long"> SELECT COUNT(*) AS recordCount FROM se_client_card card LEFT JOIN se_client cli ON card.clientId = cli.id WHERE card.state = 3 </select> <!--获取已挂失水卡列表--> <select id="getLostCards" resultType="com.dy.pipIrrGlobal.voSe.VoCards"> SELECT cli.clientNum, cli.name AS clientName, card.cardNum, cli.phone, cli.idCard, card.state AS cardState, '已挂失' AS stateName, '农户卡' AS cardType, FORMAT(card.money, 2) AS money FROM se_client_card card LEFT JOIN se_client cli ON card.clientId = cli.id WHERE card.state = 3 ORDER BY card.lossDtDt DESC <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-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
@@ -4,8 +4,16 @@ import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.common.webUtil.ResultCodeMsg; import com.dy.pipIrrGlobal.voSe.*; import com.dy.pipIrrTerminal.card.dto.*; import com.dy.pipIrrTerminal.card.qo.QoCards; import com.dy.pipIrrTerminal.card.qo.QoLostCards; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -256,4 +264,56 @@ } } /** * 根据指定条件获取水卡列表,终端应用程序使用 * @param vo * @return */ @Operation(summary = "获得一页水卡记录", description = "返回一页水卡数据") @ApiResponses(value = { @ApiResponse( responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, description = "返回一页水卡数据(BaseResponse.content:QueryResultVo[{}])", content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = VoCards.class))} ) }) @GetMapping(path = "getcards") @SsoAop() public BaseResponse<QueryResultVo<List<VoCards>>> getcards(QoCards vo){ try { QueryResultVo<List<VoCards>> res = cardSv.getCards(vo); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询水卡异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 获取已挂失的水卡列表,终端应用程序使用 * @param vo * @return */ @Operation(summary = "获得一页已挂失水卡记录", description = "返回一页已挂失水卡数据") @ApiResponses(value = { @ApiResponse( responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, description = "返回一页已挂失水卡数据(BaseResponse.content:QueryResultVo[{}])", content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = VoCards.class))} ) }) @GetMapping(path = "getlostcards") @SsoAop() public BaseResponse<QueryResultVo<List<VoCards>>> getLostCards(QoLostCards vo){ try { QueryResultVo<List<VoCards>> res = cardSv.getLostCards(vo); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询已挂失水卡异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } } pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
@@ -1,6 +1,7 @@ package com.dy.pipIrrTerminal.card; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.daoSe.*; import com.dy.pipIrrGlobal.pojoSe.SeCardOperate; @@ -8,11 +9,14 @@ import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory; import com.dy.pipIrrGlobal.voSe.*; import com.dy.pipIrrTerminal.card.dto.*; import com.dy.pipIrrTerminal.card.qo.QoCards; import com.dy.pipIrrTerminal.card.qo.QoLostCards; import com.dy.pipIrrTerminal.card.enums.CardStateENUM; import com.dy.pipIrrTerminal.card.enums.LastOperateENUM; import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM; import com.dy.pipIrrTerminal.card.enums.RechargeTypeENUM; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -1182,4 +1186,58 @@ return null; } /** * 根据指定条件获取水卡列表 * @param vo 查询条件 * @return 水卡列表 */ public QueryResultVo<List<VoCards>> getCards(QoCards vo) { Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo); Long itemTotal = seClientCardMapper.getCardsCount(params); QueryResultVo<List<VoCards>> rsVo = new QueryResultVo<>(); rsVo.pageSize = vo.pageSize; rsVo.pageCurr = vo.pageCurr; if (itemTotal > 0) { rsVo.calculateAndSet(itemTotal, params); List<VoCards> list = seClientCardMapper.getCards(params); rsVo.obj = list; } else { rsVo.obj = new ArrayList<>(); rsVo.itemTotal = 0L; } return rsVo; } /** * 获取已挂失的水卡列表 * @param vo 查询条件 * @return 已挂失的水卡列表 */ public QueryResultVo<List<VoCards>> getLostCards(QoLostCards vo) { Map<String, Object> params = new HashMap<>(); params.put("pageCurr", vo.pageCurr); params.put("pageSize", vo.pageSize); params.put("state", 2); // 挂失状态 Long itemTotal = seClientCardMapper.getLostCardsCount(params); QueryResultVo<List<VoCards>> rsVo = new QueryResultVo<>(); rsVo.pageSize = vo.pageSize; rsVo.pageCurr = vo.pageCurr; if (itemTotal > 0) { rsVo.calculateAndSet(itemTotal, params); List<VoCards> list = seClientCardMapper.getLostCards(params); rsVo.obj = list; } else { rsVo.obj = new ArrayList<>(); rsVo.itemTotal = 0L; } return rsVo; } } pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/qo/QoCards.java
New file @@ -0,0 +1,31 @@ package com.dy.pipIrrTerminal.card.qo; import com.dy.common.webUtil.QueryConditionVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; /** * @author ZhuBaoMin * @date 2025-01-15 * @LastEditTime 2025-01-15 * @Description 终端模块水卡记录查询条件 */ @Data @EqualsAndHashCode(callSuper = false) @ToString(callSuper = true) @NoArgsConstructor @AllArgsConstructor @Builder @Schema(name = "水卡记录查询条件") public class QoCards extends QueryConditionVo { @Schema(description = "农户编号") public Long clientNum; @Schema(description = "农户姓名") private String clientName; @Schema(description = "水卡编号") public Long cardNum; }