zuoxiao
2 天以前 62bf2ee66bb60c98a4c52df5b04ae735e75da583
feat(card): 添加水卡记录查询功能

- 在 SeClientCardMapper 中新增获取已挂失水卡列表和记录数量的方法
- 添加 QoCards 类作为水卡记录查询条件的传输对象
- 在 CardCtrl 中实现获取水卡列表和已挂失水卡列表的接口
- 在 CardSv 中实现获取水卡列表和已挂失水卡列表的业务逻辑- 更新 README.md,添加项目概述、系统架构、模块说明等信息
2个文件已添加
4个文件已修改
317 ■■■■■ 已修改文件
README.md 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/qo/QoCards.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}