zhubaomin
6 天以前 5cc8e75a7c432e133beb3220d8ce2f15ea16e084
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
2 文件已重命名
21个文件已修改
8个文件已添加
1372 ■■■■ 已修改文件
README.md 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeManagementCard.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voPr/VoManure.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voPr/VoSoil.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voPr/VoWeather.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeManagementCardMapper.xml 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/manure/ManureCtrl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/manure/ManureSv.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/manure/QueryVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/soil/QueryVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/soil/SoilCtrl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/soil/SoilSv.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/weather/QueryVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/weather/WeatherCtrl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/weather/WeatherSv.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java 257 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/CreateManagementCardDto.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoCallBack.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/ManagementCardStateENUM.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/文档/水肥气象墒情/MQTT指令不执行解决备忘.docx 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/文档/水肥气象墒情/MQTT设定时间参数备忘.docx 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -58,6 +58,47 @@
- **工具集**: Hutool 5.8.22
- **日志框架**: Log4j2 2.20.0
## ID生成器使用说明
系统使用自定义的IDLongGenerator来生成唯一的Long型ID,确保在分布式环境下的ID唯一性。
### IDLongGenerator特性
- **格式**: `年月日时分秒` + `3位自增序列` + `2位系统后缀`
- **长度**: 19位数字(如:20231218104504069**00**)
- **并发性**: æ”¯æŒåŒä¸€ç§’内生成1000个不同ID
- **分布式**: é€šè¿‡åŽç¼€åŒºåˆ†ä¸åŒå­ç³»ç»Ÿï¼Œé¿å…ID冲突
### ä½¿ç”¨æ–¹å¼
```java
// ä¾èµ–注入
@Autowired
private IDLongGenerator idLongGenerator;
// ç”ŸæˆID
Long id = idLongGenerator.generate();
```
### åº”用场景
- **管理卡创建**: createManagementCard方法中使用IDLongGenerator生成管理卡ID
- **实体主键**: æ‰€æœ‰ä¸šåŠ¡å®žä½“çš„ä¸»é”®ID生成
- **订单号**: ä¸šåŠ¡æµæ°´å·ç”Ÿæˆ
- **日志记录**: æ“ä½œè®°å½•的唯一标识
### é…ç½®è¯´æ˜Ž
系统启动时会自动设置ID后缀,不同的服务模块使用不同的后缀来避免ID冲突:
```xml
<!-- web.xml或Spring配置 -->
<context-param>
    <param-name>idSuffix</param-name>
    <param-value>01</param-value> <!-- ä¸åŒæœåŠ¡ä½¿ç”¨ä¸åŒåŽç¼€ -->
</context-param>
```
## å¼€å‘环境搭建
### å‰ç½®æ¡ä»¶
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStManureMapper.java
@@ -2,10 +2,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoPr.PrStManure;
import com.dy.pipIrrGlobal.voPr.VoManure;
import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
import com.dy.pipIrrGlobal.voPr.VoSoil;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -31,6 +34,23 @@
    List<VoMqttSimple> selectAllSimple() ;
    VoManure selectOne(Long id) ;
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•总数
     * @param params
     * @return
     */
    Long totalCount(Map<?, ?> params);
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•
     * @param params
     * @return
     */
    List<VoManure> selectSome(Map<?, ?> params);
    int updateByPrimaryKeySelective(PrStManure record);
    int updateByPrimaryKey(PrStManure record);
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStSoilMapper.java
@@ -3,9 +3,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
import com.dy.pipIrrGlobal.voPr.VoSoil;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -31,6 +33,22 @@
    List<VoMqttSimple> selectAllSimple() ;
    VoSoil selectOne(Long id) ;
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•总数
     * @param params
     * @return
     */
    Long totalCount(Map<?, ?> params);
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•
     * @param params
     * @return
     */
    List<VoSoil> selectSome(Map<?, ?> params);
    int updateByPrimaryKeySelective(PrStSoil record);
    int updateByPrimaryKey(PrStSoil record);
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrStWeatherMapper.java
@@ -3,9 +3,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoPr.PrStWeather;
import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
import com.dy.pipIrrGlobal.voPr.VoWeather;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -29,6 +31,22 @@
    PrStWeather selectByPrimaryKey(Long id);
    VoWeather selectOne(Long id) ;
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•总数
     * @param params
     * @return
     */
    Long totalCount(Map<?, ?> params);
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•
     * @param params
     * @return
     */
    List<VoWeather> selectSome(Map<?, ?> params);
    List<VoMqttSimple> selectAllSimple() ;
    int updateByPrimaryKeySelective(PrStWeather record);
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
@@ -35,6 +35,7 @@
    /**
     * ä¾æ®æ°´å¡åœ°å€èŽ·å–æ°´å¡ç¼–å·ï¼ˆ12月19日废弃)
     * 2024-06-30取消废弃,恢复使用
     *
     * @param cardAddr
     * @return
     */
@@ -42,6 +43,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取水卡表主键(12月19日添加后废弃)
     *
     * @param cardNum 16位水卡编号
     * @return æ°´å¡è¡¨ä¸»é”®
     */
@@ -49,6 +51,7 @@
    /**
     * æ ¹æ®è¡Œæ”¿åŒºåˆ’串模块查询水卡编号
     *
     * @param areaCode
     * @return
     */
@@ -56,6 +59,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取水卡表主键及农户编号
     *
     * @param cardNum
     * @return
     */
@@ -63,6 +67,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取水卡对应的农户id和姓名
     *
     * @param cardAddr
     * @param cardNum
     * @return
@@ -71,6 +76,7 @@
    /**
     * å¾—到水卡对象
     *
     * @param cardAddr
     * @param cardNum
     * @return
@@ -79,6 +85,7 @@
    /**
     * æ ¹æ®å†œæˆ·ä¸»é”®èŽ·å–æ°´å¡åˆ—è¡¨ï¼ˆç‰©ç†å¡+虚拟卡)
     *
     * @param clientId
     * @return
     */
@@ -86,6 +93,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取操作记录列表
     *
     * @param cardNum æ°´å¡ç¼–号
     * @return æ°´å¡æ“ä½œè®°å½•列表
     */
@@ -93,6 +101,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取余额
     *
     * @param cardNum æ°´å¡ç¼–号
     * @return ä½™é¢
     */
@@ -100,6 +109,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取充值总额
     *
     * @param cardNum
     * @return
     */
@@ -107,6 +117,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取卡片状态
     *
     * @param cardNum
     * @return
     */
@@ -114,6 +125,7 @@
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–æ°´å¡åˆ—è¡¨è®°å½•æ•°ï¼Œåº”ç”¨ç¨‹åºä½¿ç”¨
     *
     * @param params
     * @return
     */
@@ -121,6 +133,7 @@
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–æ°´å¡åˆ—è¡¨ï¼Œåº”ç”¨ç¨‹åºä½¿ç”¨
     *
     * @param params
     * @return
     */
@@ -128,18 +141,21 @@
    /**
     * èŽ·å–å·²æŒ‚å¤±ï¼Œæœªè¡¥å¡çš„è®°å½•æ•°é‡ï¼Œåº”ç”¨ç¨‹åºä½¿ç”¨
     *
     * @return
     */
    Long getUnreplacedRecordCount();
    /**
     * èŽ·å–å·²æŒ‚å¤±ï¼Œæœªè¡¥å¡çš„è®°å½•ï¼Œåº”ç”¨ç¨‹åºä½¿ç”¨
     *
     * @return
     */
    List<VoCards> getUnreplaced(Map<?, ?> params);
    /**
     * æ ¹æ®æŒ‡å®šæ°´å¡ç¼–号获取挂失记录数量(补卡、解锁使用)
     *
     * @param cardNum
     * @return
     */
@@ -147,6 +163,7 @@
    /**
     * æ ¹æ®æŒ‡å®šæ°´å¡ç¼–号获取已补卡数量(补卡、解锁使用)
     *
     * @param cardNum æ°´å¡ç¼–号
     * @return ç¬¦åˆæ¡ä»¶è®°å½•数,最多一条
     */
@@ -154,6 +171,7 @@
    /**
     * æ ¹æ®å†œæˆ·å§“名和手机号获取水卡列表记录数,应用程序使用
     *
     * @param params
     * @return
     */
@@ -161,14 +179,15 @@
    /**
     * æ ¹æ®å†œæˆ·å§“名和手机号获取水卡列表,应用程序使用
     *
     * @param params
     * @return
     */
    List<VoCards2> getCardsByClientNameAndPhone(Map<?, ?> params);
    /**
     * æ ¹æ®å†œæˆ·ID查询正常状态的水卡列表,小程序使用
     *
     * @param clientId
     * @return
     */
@@ -176,13 +195,15 @@
    /**
     * æ›´æ–°å®žä½“卡剩余金额
     *
     * @param id
     * @param money
     */
    void updateMoney(@Param("id")Long id , @Param("money")Double money);
    void updateMoney(@Param("id") Long id, @Param("money") Double money);
    /**
     *当前余额总量(物理卡)
     * å½“前余额总量(物理卡)
     *
     * @param
     * @return
     */
@@ -190,6 +211,7 @@
    /**
     * æ ¹æ®æ°´å¡åœ°å€èŽ·å–æ°´å¡æ•°é‡ï¼Œç”¨æ¥åˆ¤æ–­è¯¥å¡æ˜¯å¦å…è®¸å¼€å¡ï¼Œæ— æ•ˆå¡ç‰‡æŽ’é™¤åœ¨å¤–
     *
     * @param cardAddr
     * @return
     */
@@ -197,14 +219,15 @@
    /**
     * æ ¹æ®æ°´å¡åœ°å€èŽ·å–æŒ‡å®šçŠ¶æ€çš„æ°´å¡æ•°é‡ï¼Œç”¨æ¥åˆ¤æ–­è¯¥å¡æ˜¯å¦å…è®¸å¼€å¡
     *
     * @param cardAddr
     * @return
     */
    Long getCountByCardAddrAndState(String cardAddr);
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´æ®µæ°´å¡ä½¿ç”¨æƒ…å†µè®°å½•æ•°é‡
     *
     * @param params
     * @return
     */
@@ -212,6 +235,7 @@
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´æ®µæ°´å¡ä½¿ç”¨æƒ…å†µï¼šå……å€¼åˆè®¡ã€æ¶ˆè´¹åˆè®¡ã€ä½™é¢
     *
     * @param params
     * @return
     */
@@ -219,37 +243,42 @@
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´æ®µå†…æ°´å¡å……å€¼æ€»è®¡
     *
     * @param timeStart
     * @param timeStop
     * @return
     */
    Float getTotalRecharge(@Param("timeStart")String timeStart, @Param("timeStop")String timeStop);
    Float getTotalRecharge(@Param("timeStart") String timeStart, @Param("timeStop") String timeStop);
    /**
     * èŽ·å–æŒ‡å®šæ—¶é—´æ®µå†…æ°´å¡æ¶ˆè´¹æ€»è®¡
     *
     * @param timeStart
     * @param timeStop
     * @return
     */
    Float getTotalConsumption(@Param("timeStart")String timeStart, @Param("timeStop")String timeStop);
    Float getTotalConsumption(@Param("timeStart") String timeStart, @Param("timeStop") String timeStop);
    /**
     * ä¾æ®æ°´å¡åœ°å€å°†æœ€åŽä¸€æ¡æ— æ•ˆçŠ¶æ€çš„æŒ‡å®šæ“ä½œè®°å½•æ”¹ä¸ºæœ‰æ•ˆ
     *
     * @param cardAddr
     * @param operateType
     * @return
     */
    Integer turnCardValidByAddr(@Param("cardAddr")String cardAddr, @Param("operateType")Integer operateType);
    Integer turnCardValidByAddr(@Param("cardAddr") String cardAddr, @Param("operateType") Integer operateType);
    /**
     * å……值机用根据订单号将水卡改为有效
     *
     * @param orderNumber
     * @return
     */
    Integer turnCardValidByOrderNumber(@Param("orderNumber")String orderNumber);
    Integer turnCardValidByOrderNumber(@Param("orderNumber") String orderNumber);
    /**
     * æ ¹æ®æ°´å¡ID获取原水卡ID,补卡通知中使用
     *
     * @param cardId
     * @return
     */
@@ -257,20 +286,23 @@
    /**
     * å……值机用根据补卡的订单号将挂失水卡余额置零
     *
     * @param orderNumber
     * @return
     */
    Integer emptyCardBalance(@Param("orderNumber")String orderNumber);
    Integer emptyCardBalance(@Param("orderNumber") String orderNumber);
    /**
     * å……值机用获取农户水卡信息
     *
     * @param cardAddr
     * @return
     */
    VoTermCard getTermCardInfo(@Param("cardAddr")String cardAddr);
    VoTermCard getTermCardInfo(@Param("cardAddr") String cardAddr);
    /**
     * èŽ·å–å·²æŒ‚å¤±æ°´å¡åˆ—è¡¨è®°å½•æ•°é‡
     *
     * @param params
     * @return
     */
@@ -278,6 +310,7 @@
    /**
     * èŽ·å–å·²æŒ‚å¤±æ°´å¡åˆ—è¡¨
     *
     * @param params
     * @return
     */
@@ -285,8 +318,17 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取卡信息
     *
     * @param cardNum
     * @return
     */
    VoCardByClientNum getCardByCardNum(@Param("cardNum") String cardNum);
    /**
     * æ£€æŸ¥å¡åœ°å€æ˜¯å¦å·²å­˜åœ¨ï¼ˆç®¡ç†å¡è¡¨ + å†œæˆ·æ°´å¡è¡¨ï¼‰
     *
     * @param cardAddr å¡åœ°å€
     * @return å­˜åœ¨çš„记录数量
     */
    Long checkCardAddrExists(@Param("cardAddr") String cardAddr);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeManagementCard.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson2.annotation.JSONField;
import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dy.common.po.BaseEntity;
@@ -20,7 +21,7 @@
 * @Description å……值机用管理卡
 */
@TableName(value="se_management_card", autoResultMap = true)
@TableName(value = "se_management_card", autoResultMap = true)
@Data
@Builder
@ToString
@@ -30,76 +31,89 @@
    public static final long serialVersionUID = 202506240651001L;
    /**
    * ä¸»é”®
    */
    @JSONField(serializeUsing= ObjectWriterImplToString.class)
     * ä¸»é”®
     */
    @JSONField(serializeUsing = ObjectWriterImplToString.class)
    @TableId(type = IdType.INPUT)
    private Long id;
    /**
    * é€šè®¯åè®®
    */
     * é€šè®¯åè®®
     */
    @NotBlank(message = "通讯协议不能为空")
    private String protocol;
    /**
    * å¡ç‰‡åœ°å€
    */
     * å¡ç‰‡åœ°å€
     */
    @NotBlank(message = "卡片地址不能为空")
    private String cardAddr;
    /**
    * è¯†åˆ«ç 
    */
     * è¯†åˆ«ç 
     */
    @NotBlank(message = "识别码不能为空")
    private String securityCode;
    /**
    * å¡ç‰‡ç±»åž‹;2-设置区域表号卡,3-取数卡,4-检查卡,5-测试卡,6-清零卡,7-IP设置卡,8-域名设置卡,9-GPS卡,10-时间配置卡
    */
     * å¡ç‰‡ç±»åž‹;2-设置区域表号卡,3-取数卡,4-检查卡,5-测试卡,6-清零卡,7-IP设置卡,8-域名设置卡,9-GPS卡,10-时间配置卡
     */
    @NotNull(message = "卡片类型不能为空")
    private Byte cardType;
    /**
    * å¼€å¡æ—¶é—´
    */
     * å¼€å¡æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @NotNull(message = "开卡时间不能为空")
    private Date createTime;
    /**
    * è®¢å•号
    */
     * è®¢å•号
     */
    private String orderNo;
    /**
    * 5级行政区划编码
    */
     * 5级行政区划编码
     */
    private String districtCode;
    /**
    * é¡¹ç›®ç¼–码
    */
     * é¡¹ç›®ç¼–码
     */
    private Integer projectNo;
    /**
    * IP地址
    */
     * IP地址
     */
    private String ip;
    /**
    * åŸŸå
    */
     * åŸŸå
     */
    private String domain;
    /**
    * å¼€å…³é˜€æ—¶é—´
    */
     * å¼€å…³é˜€æ—¶é—´
     */
    private Integer openClostTime;
    /**
    * å¤‡æ³¨ä¿¡æ¯
    */
     * å¤‡æ³¨ä¿¡æ¯
     */
    private String remarks;
    /**
     * æ³¨é”€æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("cancel_time")
    private Date cancelTime;
    /**
     * å¡ç‰‡çŠ¶æ€;1-正常,2-已注销,3-已挂失,4-未写卡
     */
    @NotNull(message = "卡片状态不能为空")
    private Byte state;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voPr/VoManure.java
New file
@@ -0,0 +1,63 @@
package com.dy.pipIrrGlobal.voPr;
import com.dy.common.po.BaseEntity;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author: liurunyu
 * @Date: 2025/6/24 17:11
 * @Description
 */
@Data
@JsonPropertyOrder({ "id", "fboxId", "no", "name", "lng", "lat", "remark"})
@Schema(title = "水肥机值对象")
public class VoManure  implements BaseEntity {
    private static final long serialVersionUID = 202506241715001L;
    /**
     * ä¸»é”®
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(title = "水肥机ID")
    public Long id;
    /**
     * FBox序列号
     */
    @Schema(title = "FBox序列号")
    public String fboxId ;
    /**
     * æ°´è‚¥ç«™ç¼–号
     */
    @Schema(title = "编号")
    public Integer no ;
    /**
     * æ°´è‚¥ç«™åç§°
     */
    @Schema(title = "名称")
    public String name;
    /**
     * ç»åº¦
     */
    @Schema(title = "经度")
    public Double lng;
    /**
     * çº¬åº¦
     */
    @Schema(title = "纬度")
    public Double lat;
    /**
     * å¤‡æ³¨
     */
    @Schema(title = "备注")
    public String remark;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voPr/VoSoil.java
New file
@@ -0,0 +1,63 @@
package com.dy.pipIrrGlobal.voPr;
import com.dy.common.po.BaseEntity;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author: liurunyu
 * @Date: 2025/6/24 17:11
 * @Description
 */
@Data
@JsonPropertyOrder({ "id", "fboxId", "no", "name", "lng", "lat", "remark"})
@Schema(title = "墒情站值对象")
public class VoSoil implements BaseEntity {
    private static final long serialVersionUID = 202506241715002L;
    /**
     * ä¸»é”®
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(title = "墒情站ID")
    public Long id;
    /**
     * FBox序列号
     */
    @Schema(title = "FBox序列号")
    public String fboxId ;
    /**
     * æ°´è‚¥ç«™ç¼–号
     */
    @Schema(title = "编号")
    public Integer no ;
    /**
     * æ°´è‚¥ç«™åç§°
     */
    @Schema(title = "名称")
    public String name;
    /**
     * ç»åº¦
     */
    @Schema(title = "经度")
    public Double lng;
    /**
     * çº¬åº¦
     */
    @Schema(title = "纬度")
    public Double lat;
    /**
     * å¤‡æ³¨
     */
    @Schema(title = "备注")
    public String remark;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voPr/VoWeather.java
New file
@@ -0,0 +1,63 @@
package com.dy.pipIrrGlobal.voPr;
import com.dy.common.po.BaseEntity;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @Author: liurunyu
 * @Date: 2025/6/24 17:11
 * @Description
 */
@Data
@JsonPropertyOrder({ "id", "fboxId", "no", "name", "lng", "lat", "remark"})
@Schema(title = "气象站值对象")
public class VoWeather implements BaseEntity {
    private static final long serialVersionUID = 202506241715003L;
    /**
     * ä¸»é”®
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(title = "气象站ID")
    public Long id;
    /**
     * FBox序列号
     */
    @Schema(title = "FBox序列号")
    public String fboxId ;
    /**
     * æ°´è‚¥ç«™ç¼–号
     */
    @Schema(title = "编号")
    public Integer no ;
    /**
     * æ°´è‚¥ç«™åç§°
     */
    @Schema(title = "名称")
    public String name;
    /**
     * ç»åº¦
     */
    @Schema(title = "经度")
    public Double lng;
    /**
     * çº¬åº¦
     */
    @Schema(title = "纬度")
    public Double lat;
    /**
     * å¤‡æ³¨
     */
    @Schema(title = "备注")
    public String remark;
}
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStManureMapper.xml
@@ -39,6 +39,55 @@
    from pr_st_manure
    where deleted != 1 ;
  </select>
  <select id="selectOne" parameterType="java.lang.Long" resultType="com.dy.pipIrrGlobal.voPr.VoManure">
    <!--@mbg.generated-->
    SELECT tb.id,
    tb.fbox_id AS fboxId,
    tb.`no`,
    tb.`name`,
    tb.lng,
    tb.lat,
    tb.remark
    FROM pr_st_manure tb
    where id = #{id,jdbcType=BIGINT}
  </select>
  <!--根据指定条件查询总数-->
  <select id="totalCount" parameterType="java.util.Map" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM pr_st_manure tb
    <where>
      tb.deleted != 1
      <if test="name != null and name != ''">
        AND tb.name LIKE CONCAT('%', #{name}, '%')
      </if>
    </where>
  </select>
  <!--根据指定条件查询-->
  <select id="selectSome" parameterType="java.util.Map" resultType="com.dy.pipIrrGlobal.voPr.VoManure">
    SELECT tb.id,
    tb.fbox_id AS fboxId,
    tb.`no`,
    tb.`name`,
    tb.lng,
    tb.lat,
    tb.remark
    FROM pr_st_manure tb
    <where>
      tb.deleted != 1
      <if test="name != null and name != ''">
        AND tb.name LIKE CONCAT('%', #{name}, '%')
      </if>
    </where>
    ORDER BY tb.id DESC
    <trim prefix="limit ">
      <if test="start != null and count != null">
        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
      </if>
    </trim>
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from pr_st_manure
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStSoilMapper.xml
@@ -39,6 +39,53 @@
    from pr_st_soil
    where deleted != 1 ;
  </select>
  <select id="selectOne" parameterType="java.lang.Long" resultType="com.dy.pipIrrGlobal.voPr.VoSoil">
    <!--@mbg.generated-->
    SELECT tb.id,
    tb.fbox_id AS fboxId,
    tb.`no`,
    tb.`name`,
    tb.lng,
    tb.lat,
    tb.remark
    FROM pr_st_soil tb
    where id = #{id,jdbcType=BIGINT}
  </select>
  <!--根据指定条件查询总数-->
  <select id="totalCount" parameterType="java.util.Map" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM pr_st_soil tb
    <where>
      tb.deleted != 1
      <if test="name != null and name != ''">
        AND tb.name LIKE CONCAT('%', #{name}, '%')
      </if>
    </where>
  </select>
  <!--根据指定条件查询-->
  <select id="selectSome" parameterType="java.util.Map" resultType="com.dy.pipIrrGlobal.voPr.VoSoil">
    SELECT tb.id,
    tb.fbox_id AS fboxId,
    tb.`no`,
    tb.`name`,
    tb.lng,
    tb.lat,
    tb.remark
    FROM pr_st_soil tb
    <where>
      tb.deleted != 1
      <if test="name != null and name != ''">
        AND tb.name LIKE CONCAT('%', #{name}, '%')
      </if>
    </where>
    ORDER BY tb.id DESC
    <trim prefix="limit ">
      <if test="start != null and count != null">
        #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
      </if>
    </trim>
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from pr_st_soil
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrStWeatherMapper.xml
@@ -32,6 +32,54 @@
    from pr_st_weather
    where id = #{id,jdbcType=BIGINT}
  </select>
  <select id="selectOne" parameterType="java.lang.Long" resultType="com.dy.pipIrrGlobal.voPr.VoWeather">
    <!--@mbg.generated-->
    SELECT tb.id,
    tb.fbox_id AS fboxId,
    tb.`no`,
    tb.`name`,
    tb.lng,
    tb.lat,
    tb.remark
    FROM pr_st_weather tb
    where id = #{id,jdbcType=BIGINT}
  </select>
  <!--根据指定条件查询总数-->
  <select id="totalCount" parameterType="java.util.Map" resultType="java.lang.Long">
    SELECT COUNT(*) AS recordCount
    FROM pr_st_weather tb
    <where>
      tb.deleted != 1
      <if test="name != null and name != ''">
        AND tb.name LIKE CONCAT('%', #{name}, '%')
      </if>
    </where>
  </select>
  <!--根据指定条件查询-->
  <select id="selectSome" parameterType="java.util.Map" resultType="com.dy.pipIrrGlobal.voPr.VoWeather">
    SELECT tb.id,
    tb.fbox_id AS fboxId,
    tb.`no`,
    tb.`name`,
    tb.lng,
    tb.lat,
    tb.remark
    FROM pr_st_weather tb
    <where>
      tb.deleted != 1
      <if test="name != null and name != ''">
        AND tb.name LIKE CONCAT('%', #{name}, '%')
      </if>
    </where>
    ORDER BY tb.id DESC
    <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="selectAllSimple" resultType="com.dy.pipIrrGlobal.voPr.VoMqttSimple">
    <!--@mbg.generated-->
    select
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -864,4 +864,21 @@
    ORDER BY card.createDt DESC
    LIMIT 1
  </select>
  <!--检查卡地址是否已存在(管理卡表 + å†œæˆ·æ°´å¡è¡¨ï¼‰-->
  <select id="checkCardAddrExists" resultType="java.lang.Long">
    SELECT COUNT(*) AS totalCount FROM (
      -- æ£€æŸ¥ç®¡ç†å¡è¡¨ä¸­æ­£å¸¸(1)和挂失(3)状态的记录,排除已注销(2)和未写卡(4)
      SELECT card_addr FROM se_management_card
      WHERE card_addr = #{cardAddr}
        AND state IN (1, 3)
      UNION ALL
      -- æ£€æŸ¥å†œæˆ·æ°´å¡è¡¨ä¸­æ­£å¸¸(1)和挂失(3)状态的记录
      SELECT cardAddr FROM se_client_card
      WHERE cardAddr = #{cardAddr}
        AND state IN (1, 3)
    ) AS combined_result
  </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeManagementCardMapper.xml
@@ -17,11 +17,13 @@
    <result column="domain" jdbcType="VARCHAR" property="domain" />
    <result column="open_clost_time" jdbcType="INTEGER" property="openClostTime" />
    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
    <result column="cancel_time" jdbcType="TIMESTAMP" property="cancelTime" />
    <result column="state" jdbcType="TINYINT" property="state" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, protocol, card_addr, security_code, card_type, create_time, order_no, district_code, 
    project_no, ip, `domain`, open_clost_time, remarks
    project_no, ip, `domain`, open_clost_time, remarks, cancel_time, state
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
@@ -41,12 +43,12 @@
      security_code, card_type, create_time, 
      order_no, district_code, project_no, 
      ip, `domain`, open_clost_time, 
      remarks)
      remarks, cancel_time, state)
    values (#{id,jdbcType=BIGINT}, #{protocol,jdbcType=VARCHAR}, #{cardAddr,jdbcType=VARCHAR}, 
      #{securityCode,jdbcType=VARCHAR}, #{cardType,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, 
      #{orderNo,jdbcType=VARCHAR}, #{districtCode,jdbcType=VARCHAR}, #{projectNo,jdbcType=INTEGER}, 
      #{ip,jdbcType=VARCHAR}, #{domain,jdbcType=VARCHAR}, #{openClostTime,jdbcType=INTEGER}, 
      #{remarks,jdbcType=VARCHAR})
      #{remarks,jdbcType=VARCHAR}, #{cancelTime,jdbcType=TIMESTAMP}, #{state,jdbcType=TINYINT})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeManagementCard">
    <!--@mbg.generated-->
@@ -91,6 +93,12 @@
      <if test="remarks != null">
        remarks,
      </if>
      <if test="cancelTime != null">
        cancel_time,
      </if>
      <if test="state != null">
        state,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
@@ -131,6 +139,12 @@
      </if>
      <if test="remarks != null">
        #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="cancelTime != null">
        #{cancelTime,jdbcType=TIMESTAMP},
      </if>
      <if test="state != null">
        #{state,jdbcType=TINYINT},
      </if>
    </trim>
  </insert>
@@ -174,6 +188,12 @@
      <if test="remarks != null">
        remarks = #{remarks,jdbcType=VARCHAR},
      </if>
      <if test="cancelTime != null">
        cancel_time = #{cancelTime,jdbcType=TIMESTAMP},
      </if>
      <if test="state != null">
        state = #{state,jdbcType=TINYINT},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
@@ -191,7 +211,9 @@
      ip = #{ip,jdbcType=VARCHAR},
      `domain` = #{domain,jdbcType=VARCHAR},
      open_clost_time = #{openClostTime,jdbcType=INTEGER},
      remarks = #{remarks,jdbcType=VARCHAR}
      remarks = #{remarks,jdbcType=VARCHAR},
      cancel_time = #{cancelTime,jdbcType=TIMESTAMP},
      state = #{state,jdbcType=TINYINT}
    where id = #{id,jdbcType=BIGINT}
  </update>
</mapper>
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/manure/ManureCtrl.java
@@ -3,8 +3,10 @@
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.common.webUtil.ResultCodeMsg;
import com.dy.pipIrrGlobal.pojoPr.PrStManure;
import com.dy.pipIrrGlobal.voPr.VoManure;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -19,6 +21,7 @@
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
@@ -39,6 +42,30 @@
        this.sv = sv ;
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢æ°´è‚¥æœºè®°å½•
     * @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 = VoManure.class))}
            )
    })
    @GetMapping(path = "/some")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoManure>>> some(QueryVo vo){
        try {
            return BaseResponseUtils.buildSuccess(this.sv.selectSome(vo));
        } catch (Exception e) {
            log.error("获取水肥机记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
        }
    }
    /**
     * å¾—到一套水肥机数据
@@ -50,13 +77,13 @@
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一套水肥机数据(BaseResponse.content:{})",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = PrStManure.class))}
                            schema = @Schema(implementation = VoManure.class))}
            )
    })
    @GetMapping(path = "one")
    @SsoAop()
    public BaseResponse<PrStManure> one(Long id){
        return BaseResponseUtils.buildSuccess(this.sv.selectById(id));
    public BaseResponse<VoManure> one(Long id){
        return BaseResponseUtils.buildSuccess(this.sv.selectOne(id));
    }
    /**
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/manure/ManureSv.java
@@ -1,14 +1,18 @@
package com.dy.pipIrrProject.mqtt.manure;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoPr.PrStManureMapper;
import com.dy.pipIrrGlobal.pojoPr.PrStManure;
import com.dy.pipIrrGlobal.voPr.VoManure;
import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
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 org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -27,12 +31,30 @@
    }
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•
     *
     * @param queryVo æŸ¥è¯¢å€¼å¯¹è±¡
     * @return è®°å½•列表
     */
    public QueryResultVo<List<VoManure>> selectSome(QueryVo queryVo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
        Long itemTotal = dao.totalCount(params);
        QueryResultVo<List<VoManure>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = queryVo.pageSize;
        rsVo.pageCurr = queryVo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = dao.selectSome(params);
        return rsVo;
    }
    /**
     * å¾—到一个实体
     * @param id å®žä½“ID
     * @return å®žä½“
     */
    public PrStManure selectById(Long id){
        return this.dao.selectById(id) ;
    public VoManure selectOne(Long id){
        return this.dao.selectOne(id) ;
    }
    /**
     * ä¿å­˜ï¼ˆæ·»åŠ ï¼‰è§†é¢‘ç›‘æŽ§ç‚¹
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/manure/QueryVo.java
New file
@@ -0,0 +1,23 @@
package com.dy.pipIrrProject.mqtt.manure;
import com.dy.common.webUtil.QueryConditionVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
/**
 * @Author: liurunyu
 * @Date: 2025/6/24 17:21
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(name = "水肥机查询条件")
public class QueryVo extends QueryConditionVo {
    @Schema(description = "水肥机名称")
    public String name;
}
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/soil/QueryVo.java
New file
@@ -0,0 +1,23 @@
package com.dy.pipIrrProject.mqtt.soil;
import com.dy.common.webUtil.QueryConditionVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
/**
 * @Author: liurunyu
 * @Date: 2025/6/24 17:21
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(name = "墒情站查询条件")
public class QueryVo extends QueryConditionVo {
    @Schema(description = "墒情站名称")
    public String name;
}
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/soil/SoilCtrl.java
@@ -3,8 +3,11 @@
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.common.webUtil.ResultCodeMsg;
import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
import com.dy.pipIrrGlobal.voPr.VoSoil;
import com.dy.pipIrrProject.mqtt.manure.QueryVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -19,6 +22,7 @@
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
@@ -39,6 +43,30 @@
        this.sv = sv ;
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢å¢’情站记录
     * @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 = VoSoil.class))}
            )
    })
    @GetMapping(path = "/some")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoSoil>>> some(QueryVo vo){
        try {
            return BaseResponseUtils.buildSuccess(this.sv.selectSome(vo));
        } catch (Exception e) {
            log.error("获取墒情站记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
        }
    }
    /**
     * å¾—到一套墒情站数据
@@ -50,13 +78,13 @@
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一套墒情站数据(BaseResponse.content:{})",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = PrStSoil.class))}
                            schema = @Schema(implementation = VoSoil.class))}
            )
    })
    @GetMapping(path = "one")
    @SsoAop()
    public BaseResponse<PrStSoil> one(Long id){
        return BaseResponseUtils.buildSuccess(this.sv.selectById(id));
    public BaseResponse<VoSoil> one(Long id){
        return BaseResponseUtils.buildSuccess(this.sv.selectOne(id));
    }
    /**
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/soil/SoilSv.java
@@ -1,14 +1,19 @@
package com.dy.pipIrrProject.mqtt.soil;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoPr.PrStSoilMapper;
import com.dy.pipIrrGlobal.pojoPr.PrStSoil;
import com.dy.pipIrrGlobal.voPr.VoSoil;
import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
import com.dy.pipIrrProject.mqtt.manure.QueryVo;
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 org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -25,15 +30,31 @@
    public List<VoMqttSimple> allSimple(){
        return this.dao.selectAllSimple() ;
    }
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•
     *
     * @param queryVo æŸ¥è¯¢å€¼å¯¹è±¡
     * @return è®°å½•列表
     */
    public QueryResultVo<List<VoSoil>> selectSome(QueryVo queryVo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
        Long itemTotal = dao.totalCount(params);
        QueryResultVo<List<VoSoil>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = queryVo.pageSize;
        rsVo.pageCurr = queryVo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = dao.selectSome(params);
        return rsVo;
    }
    /**
     * å¾—到一个实体
     * @param id å®žä½“ID
     * @return å®žä½“
     */
    public PrStSoil selectById(Long id){
        return this.dao.selectById(id) ;
    public VoSoil selectOne(Long id){
        return this.dao.selectOne(id) ;
    }
    /**
     * ä¿å­˜ï¼ˆæ·»åŠ ï¼‰è§†é¢‘ç›‘æŽ§ç‚¹
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/weather/QueryVo.java
New file
@@ -0,0 +1,23 @@
package com.dy.pipIrrProject.mqtt.weather;
import com.dy.common.webUtil.QueryConditionVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
/**
 * @Author: liurunyu
 * @Date: 2025/6/24 17:21
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(name = "气象站查询条件")
public class QueryVo extends QueryConditionVo {
    @Schema(description = "气象站名称")
    public String name;
}
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/weather/WeatherCtrl.java
@@ -3,8 +3,11 @@
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.common.webUtil.ResultCodeMsg;
import com.dy.pipIrrGlobal.pojoPr.PrStWeather;
import com.dy.pipIrrGlobal.voPr.VoWeather;
import com.dy.pipIrrProject.mqtt.manure.QueryVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -19,6 +22,7 @@
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
@@ -39,6 +43,30 @@
        this.sv = sv ;
    }
    /**
     * åˆ†é¡µæŸ¥è¯¢æ°”象站记录
     * @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 = VoWeather.class))}
            )
    })
    @GetMapping(path = "/some")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoWeather>>> some(QueryVo vo){
        try {
            return BaseResponseUtils.buildSuccess(this.sv.selectSome(vo));
        } catch (Exception e) {
            log.error("获取气象站记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
        }
    }
    /**
     * å¾—到一套气象站数据
@@ -50,13 +78,13 @@
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一套气象站数据(BaseResponse.content:{})",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = PrStWeather.class))}
                            schema = @Schema(implementation = VoWeather.class))}
            )
    })
    @GetMapping(path = "one")
    @SsoAop()
    public BaseResponse<PrStWeather> one(Long id){
        return BaseResponseUtils.buildSuccess(this.sv.selectById(id));
    public BaseResponse<VoWeather> one(Long id){
        return BaseResponseUtils.buildSuccess(this.sv.selectOne(id));
    }
    /**
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/mqtt/weather/WeatherSv.java
@@ -1,14 +1,19 @@
package com.dy.pipIrrProject.mqtt.weather;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoPr.PrStWeatherMapper;
import com.dy.pipIrrGlobal.pojoPr.PrStWeather;
import com.dy.pipIrrGlobal.voPr.VoMqttSimple;
import com.dy.pipIrrGlobal.voPr.VoWeather;
import com.dy.pipIrrProject.mqtt.manure.QueryVo;
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 org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -25,15 +30,31 @@
    public List<VoMqttSimple> allSimple(){
        return this.dao.selectAllSimple() ;
    }
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶æŸ¥è¯¢è®°å½•
     *
     * @param queryVo æŸ¥è¯¢å€¼å¯¹è±¡
     * @return è®°å½•列表
     */
    public QueryResultVo<List<VoWeather>> selectSome(QueryVo queryVo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
        Long itemTotal = dao.totalCount(params);
        QueryResultVo<List<VoWeather>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = queryVo.pageSize;
        rsVo.pageCurr = queryVo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = dao.selectSome(params);
        return rsVo;
    }
    /**
     * å¾—到一个实体
     * @param id å®žä½“ID
     * @return å®žä½“
     */
    public PrStWeather selectById(Long id){
        return this.dao.selectById(id) ;
    public VoWeather selectOne(Long id){
        return this.dao.selectOne(id) ;
    }
    /**
     * ä¿å­˜ï¼ˆæ·»åŠ ï¼‰è§†é¢‘ç›‘æŽ§ç‚¹
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
@@ -48,9 +48,11 @@
     */
    @PostMapping(path = "termActiveCard", consumes = MediaType.APPLICATION_JSON_VALUE)
    @SsoAop()
    public BaseResponse<VoTermActiveCard> termActiveCard(@RequestBody @Valid ActiveCard po, BindingResult bindingResult) {
    public BaseResponse<VoTermActiveCard> termActiveCard(@RequestBody @Valid ActiveCard po,
            BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.activeOrReissueTermCard(po);
@@ -72,7 +74,8 @@
    @SsoAop()
    public BaseResponse<VoTermCommon> termRecharge(@RequestBody @Valid DtoRecharge po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.addRecharge(po, null);
@@ -94,7 +97,8 @@
    @SsoAop()
    public BaseResponse<Boolean> termReportLoss(@RequestBody @Valid DtoLoss po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.reportLoss(po);
@@ -116,7 +120,8 @@
    @SsoAop()
    public BaseResponse<Boolean> termUnlock(@RequestBody @Valid DtoUnlock po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.unlock(po);
@@ -138,7 +143,8 @@
    @SsoAop()
    public BaseResponse<VoTermCommon> termReissue(@RequestBody @Valid DtoReissue po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.reissue(po);
@@ -160,7 +166,8 @@
    @SsoAop()
    public BaseResponse<VoTermCommon> termCancel(@RequestBody @Valid DtoCancel po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.cancel(po);
@@ -173,22 +180,25 @@
    /**
     * è¡¥æ‰£
     *
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "termRepay", consumes = MediaType.APPLICATION_JSON_VALUE)
    @SsoAop()
    public BaseResponse<VoRepaySupplement> termRepay(@RequestBody @Valid DtoRepaySupplement po, BindingResult bindingResult) {
    public BaseResponse<VoRepaySupplement> termRepay(@RequestBody @Valid DtoRepaySupplement po,
            BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        if(po.getRepayMorny()  == null || po.getRepayMorny() <= 0) {
        if (po.getRepayMorny() == null || po.getRepayMorny() <= 0) {
            return BaseResponseUtils.buildErrorMsg("补扣金额不能为空且需大于0");
        }
        if(po.getRepayMorny() > po.getBalance()) {
        if (po.getRepayMorny() > po.getBalance()) {
            return BaseResponseUtils.buildErrorMsg("补扣金额不能大于补扣前余额");
        }
@@ -201,18 +211,21 @@
    /**
     * è¿”还
     *
     * @param po
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "supplement", consumes = MediaType.APPLICATION_JSON_VALUE)
    @SsoAop()
    public BaseResponse<VoRepaySupplement> supplement(@RequestBody @Valid DtoRepaySupplement po, BindingResult bindingResult) {
    public BaseResponse<VoRepaySupplement> supplement(@RequestBody @Valid DtoRepaySupplement po,
            BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        if(po.getSupplementMoney() == null || po.getSupplementMoney() <= 0) {
        if (po.getSupplementMoney() == null || po.getSupplementMoney() <= 0) {
            return BaseResponseUtils.buildErrorMsg("返还金额不能为空且需大于0");
        }
@@ -234,7 +247,8 @@
    @SsoAop()
    public BaseResponse<Boolean> termCallBack(@RequestBody @Valid DtoCallBack po, BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Map map_result = cardSv.callBack(po);
@@ -246,93 +260,85 @@
    /**
     * è¯»å–卡信息
     *
     * @param cardAddr
     * @return
     */
    @GetMapping(path = "readCard")
    @SsoAop()
    public BaseResponse<VoTermCard> readCard(@RequestParam String cardAddr){
    public BaseResponse<VoTermCard> readCard(@RequestParam String cardAddr) {
        try {
            VoTermCard voTermCard = cardSv.readCard(cardAddr);
            if(voTermCard == null) {
            if (voTermCard == null) {
                return BaseResponseUtils.buildNonExist();
            }
            return BaseResponseUtils.buildSuccess(voTermCard);
        } catch (Exception e) {
            log.error("查询农户异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
            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))}
            )
            @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){
    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()) ;
            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))}
            )
            @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){
    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()) ;
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取卡信息
     *
     * @param cardNum æ°´å¡ç¼–号
     * @return
     */
    @Operation(summary = "根据水卡编号获取卡信息", description = "根据水卡编号获取对应的卡信息")
    @ApiResponses(value = {
            @ApiResponse(
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回卡信息(BaseResponse.content:VoCardByClientNum)",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = VoCardByClientNum.class))}
            )
            @ApiResponse(responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, description = "返回卡信息(BaseResponse.content:VoCardByClientNum)", content = {
                    @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = VoCardByClientNum.class)) })
    })
    @GetMapping(path = "getcardbycardnum")
    @SsoAop()
    public BaseResponse<VoCardByClientNum> getCardByCardNum(@RequestParam String cardNum){
    public BaseResponse<VoCardByClientNum> getCardByCardNum(@RequestParam String cardNum) {
        try {
            VoCardByClientNum res = cardSv.getCardByCardNum(cardNum);
            if (res == null) {
@@ -341,7 +347,46 @@
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("根据水卡编号查询卡信息异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
    /**
     * åˆ›å»ºç®¡ç†å¡
     *
     * @param dto           åˆ›å»ºç®¡ç†å¡å‚æ•°
     * @param bindingResult å‚数验证结果
     * @return åˆ›å»ºç»“æžœ
     */
    @Operation(summary = "创建管理卡", description = "创建充值机用管理卡")
    @ApiResponses(value = {
            @ApiResponse(responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, description = "创建成功,返回订单号", content = {
                    @Content(mediaType = MediaType.APPLICATION_JSON_VALUE) })
    })
    @PostMapping(path = "createManagementCard", consumes = MediaType.APPLICATION_JSON_VALUE)
    @SsoAop()
    public BaseResponse<String> createManagementCard(@RequestBody @Valid CreateManagementCardDto dto,
            BindingResult bindingResult) {
        if (bindingResult != null && bindingResult.hasErrors()) {
            return BaseResponseUtils
                    .buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        // éªŒè¯å¡ç‰‡ç±»åž‹æ˜¯å¦åœ¨å…è®¸èŒƒå›´å†…
        if (dto.getCardType() < 2 || dto.getCardType() > 10) {
            return BaseResponseUtils.buildErrorMsg("卡片类型必须在2-10之间");
        }
        // æ£€æŸ¥å¡ç‰‡åœ°å€æ˜¯å¦å·²å­˜åœ¨
        if (cardSv.isCardAddrExists(dto.getCardAddr())) {
            return BaseResponseUtils.buildErrorMsg("该卡片地址已存在,请使用其他地址");
        }
        Map<String, Object> result = cardSv.createManagementCard(dto);
        if ((Boolean) result.get("success")) {
            return BaseResponseUtils.buildSuccess((String) result.get("content"));
        } else {
            return BaseResponseUtils.buildErrorMsg(result.get("msg").toString());
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
@@ -6,6 +6,7 @@
import com.dy.pipIrrGlobal.daoSe.*;
import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.pojoSe.SeManagementCard;
import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
import com.dy.pipIrrGlobal.voSe.*;
import com.dy.pipIrrTerminal.card.dto.*;
@@ -13,6 +14,7 @@
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.ManagementCardStateENUM;
import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM;
import com.dy.pipIrrTerminal.card.enums.RechargeTypeENUM;
import lombok.extern.slf4j.Slf4j;
@@ -21,6 +23,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dy.common.util.IDLongGenerator;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -54,11 +57,18 @@
    @Autowired
    private SeManagerCardMapper seManagerCardMapper;
    @Autowired
    private SeManagementCardMapper seManagementCardMapper;
    @Autowired
    private IDLongGenerator idLongGenerator;
    @Value("${project.projectNo}")
    private Integer projectNo;
    /**
     * æ ¹æ®æ°´å¡åœ°å€åˆ¤æ–­è¯¥å¡æ˜¯å¦å¯ä»¥å¼€å¡
     *
     * @param cardAddr
     * @return true:可以开卡
     */
@@ -80,6 +90,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以充值
     *
     * @param po
     * @return true:可以充值
     */
@@ -90,7 +101,7 @@
        String stateName = Optional.ofNullable(seClientCardMapper.getCardStateByCardNum(po.getCardNum())).orElse("");
        // å•独充值时卡片必须为正常
        if((po.getRechargeType() == RechargeTypeENUM.RECHARGE.getCode()) && !stateName.equals("正常")) {
        if ((po.getRechargeType() == RechargeTypeENUM.RECHARGE.getCode()) && !stateName.equals("正常")) {
            map.put("msg", stateName + ", " + "水卡状态不支持当前操作");
            return map;
        }
@@ -101,6 +112,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以挂失
     *
     * @param po
     * @return true:可以报失
     */
@@ -111,7 +123,7 @@
        Long cardNum = po.getCardNum();
        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
        if(stateName == null || stateName.equals("") || !stateName.equals("正常")) {
        if (stateName == null || stateName.equals("") || !stateName.equals("正常")) {
            map.put("msg", stateName + ", " + "水卡状态不支持当前操作");
            return map;
        }
@@ -127,7 +139,7 @@
        CardSimple card = new CardSimple();
        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
        //card.setProtocol(map_card.get("protocol").toString());
        // card.setProtocol(map_card.get("protocol").toString());
        map.put("success", true);
        map.put("content", card);
@@ -136,6 +148,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以解锁
     *
     * @param po
     * @return
     */
@@ -167,8 +180,10 @@
        map.put("content", card);
        return map;
    }
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以补卡
     *
     * @param po
     * @return true:可以补卡
     */
@@ -180,7 +195,7 @@
        Long cardNum = po.getCardNum();
        Integer lostCount = seClientCardMapper.getLostCount(cardNum);
        Integer replacedCount = seClientCardMapper.getReplacedCount(cardNum);
        if(lostCount == 0 || replacedCount > 0) {
        if (lostCount == 0 || replacedCount > 0) {
            map.put("msg", "水卡未挂失或已补卡,不能补卡");
            return map;
        }
@@ -212,6 +227,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以注销
     *
     * @param po
     * @return
     */
@@ -222,7 +238,7 @@
        Long cardNum = po.getCardNum();
        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
        if(stateName == null || stateName.equals("") || !stateName.equals("正常")) {
        if (stateName == null || stateName.equals("") || !stateName.equals("正常")) {
            map.put("msg", stateName + ", " + "水卡状态不支持当前操作");
            return map;
        }
@@ -246,6 +262,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以补扣
     *
     * @param po
     * @return
     */
@@ -256,7 +273,7 @@
        Long cardNum = po.getCardNum();
        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
        if(stateName == null || stateName.equals("") || !stateName.equals("正常")) {
        if (stateName == null || stateName.equals("") || !stateName.equals("正常")) {
            map.put("msg", stateName + ", " + "水卡状态不支持当前操作");
            return map;
        }
@@ -280,6 +297,7 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号判断该卡是否可以返还
     *
     * @param po
     * @return
     */
@@ -290,7 +308,7 @@
        Long cardNum = po.getCardNum();
        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
        if(stateName == null || stateName.equals("") || !stateName.equals("正常")) {
        if (stateName == null || stateName.equals("") || !stateName.equals("正常")) {
            map.put("msg", stateName + ", " + "水卡状态不支持当前操作");
            return map;
        }
@@ -314,6 +332,7 @@
    /**
     * æ ¹æ®å†œæˆ·ç¼–号获取5级行政区划串areaCode,补卡过程中开新卡使用
     *
     * @param clientId
     * @return
     */
@@ -435,6 +454,7 @@
    /**
     * å¼€å¡é™„加充值
     *
     * @param po
     * @param cardNum
     * @return
@@ -468,6 +488,7 @@
    /**
     * æ¿€æ´»æˆ–补卡
     *
     * @param po
     * @return
     */
@@ -485,7 +506,7 @@
        }
        Map map_cardNum = generateCardNum(po.getClientId());
        if(map_cardNum.get("success").equals(false)) {
        if (map_cardNum.get("success").equals(false)) {
            map.put("msg", map_cardNum.get("msg").toString());
            return map;
        }
@@ -493,14 +514,14 @@
        String orderNo = generateOrderNo();
        Map map_addCardAndOperate = addCardAndOperate(po, cardNum, orderNo);
        if(map_addCardAndOperate.get("success").equals(false)) {
        if (map_addCardAndOperate.get("success").equals(false)) {
            map.put("msg", map_addCardAndOperate.get("msg").toString());
            return map;
        }
        if (amount != null && amount > 0 && originalCardId == null) {
            Map map_plusRecharge = plusRecharge(po, cardNum, orderNo);
            if(map_plusRecharge.get("success").equals(false)) {
            if (map_plusRecharge.get("success").equals(false)) {
                map.put("msg", map_plusRecharge.get("msg").toString());
                return map;
            }
@@ -525,6 +546,7 @@
    /**
     * å……值
     *
     * @param po
     * @return
     */
@@ -535,7 +557,7 @@
        map.put("content", null);
        Map map_canRecharge = canRecharge(po);
        if(map_canRecharge.get("success").equals(false)) {
        if (map_canRecharge.get("success").equals(false)) {
            map.put("msg", map_canRecharge.get("msg").toString());
            return map;
        }
@@ -550,7 +572,7 @@
        }
        Long cardId = Long.parseLong(map_cardAndClient.get("cardId").toString());
        Long clientId = Long.parseLong(map_cardAndClient.get("clientId").toString());
        if(orderNo == null || orderNo.length() <= 0) {
        if (orderNo == null || orderNo.length() <= 0) {
            orderNo = generateOrderNo();
        }
@@ -617,6 +639,7 @@
    /**
     * è¡¥å¡
     *
     * @param po
     * @return
     */
@@ -627,7 +650,7 @@
        map.put("content", null);
        Map map_canReissue = canReissue(po);
        if(map_canReissue.get("success").equals(false)) {
        if (map_canReissue.get("success").equals(false)) {
            map.put("msg", map_canReissue.get("msg").toString());
            return map;
        }
@@ -661,6 +684,7 @@
    /**
     * æŒ‚失
     *
     * @param po
     * @return
     */
@@ -671,7 +695,7 @@
        map.put("content", null);
        Map map_canReportLoss = canReportLoss(po);
        if(map_canReportLoss.get("success").equals(false)) {
        if (map_canReportLoss.get("success").equals(false)) {
            map.put("msg", map_canReportLoss.get("msg").toString());
            return map;
        }
@@ -688,7 +712,8 @@
        seClientCard.setLossdtdt(new Date());
        seClientCard.setState(CardStateENUM.LOSS.getCode());
        seClientCard.setLastoper(LastOperateENUM.LOSS.getCode());
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard)).orElse(0);
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard))
                .orElse(0);
        if (rec_updateClientCard == 0) {
            map.put("msg", "挂失失败-农户卡修改异常");
            return map;
@@ -718,6 +743,7 @@
    /**
     * è§£é”
     *
     * @param po
     * @return
     */
@@ -728,7 +754,7 @@
        map.put("content", null);
        Map map_canUnlock = canUnlock(po);
        if(map_canUnlock.get("success").equals(false)) {
        if (map_canUnlock.get("success").equals(false)) {
            map.put("msg", map_canUnlock.get("msg").toString());
            return map;
        }
@@ -738,8 +764,8 @@
        /**
         * ä¿®æ”¹å†œæˆ·å¡ä¿¡æ¯ï¼š
         *      æŒ‚失时间
         *      æœ€åŽæ“ä½œç±»åž‹-4
         * æŒ‚失时间
         * æœ€åŽæ“ä½œç±»åž‹-4
         */
        SeClientCard seClientCard = new SeClientCard();
        seClientCard.setId(cardId);
@@ -747,7 +773,8 @@
        seClientCard.setMoney(po.getMoney());
        seClientCard.setState(CardStateENUM.NORMAL.getCode());
        seClientCard.setLastoper(LastOperateENUM.UNLOCK.getCode());
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard)).orElse(0);
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard))
                .orElse(0);
        if (rec_updateClientCard == 0) {
            map.put("msg", "解锁失败-农户卡修改异常");
            return map;
@@ -779,6 +806,7 @@
    /**
     * é”€å¡
     *
     * @param po
     * @return
     */
@@ -789,8 +817,8 @@
        map.put("content", null);
        String orderNo = generateOrderNo();
        Map map_canCancel  = canCancel(po);
        if(map_canCancel.get("success").equals(false)) {
        Map map_canCancel = canCancel(po);
        if (map_canCancel.get("success").equals(false)) {
            map.put("msg", map_canCancel.get("msg").toString());
            return map;
        }
@@ -828,6 +856,7 @@
    /**
     * è¡¥æ‰£
     *
     * @param po
     * @return
     */
@@ -840,8 +869,8 @@
        Date operateTime = new Date();
        Double waterPrice = Optional.ofNullable(prWaterPriceMapper.getPrice()).orElse(0.0);
        Map map_canRepay  = canRepay(po);
        if(map_canRepay.get("success").equals(false)) {
        Map map_canRepay = canRepay(po);
        if (map_canRepay.get("success").equals(false)) {
            map.put("msg", map_canRepay.get("msg").toString());
            return map;
        }
@@ -880,6 +909,7 @@
    /**
     * è¿”还
     *
     * @param po
     * @return
     */
@@ -892,8 +922,8 @@
        Date operateTime = new Date();
        Double waterPrice = Optional.ofNullable(prWaterPriceMapper.getPrice()).orElse(0.0);
        Map map_canSupplement  = canSupplement(po);
        if(map_canSupplement.get("success").equals(false)) {
        Map map_canSupplement = canSupplement(po);
        if (map_canSupplement.get("success").equals(false)) {
            map.put("msg", map_canSupplement.get("msg").toString());
            return map;
        }
@@ -906,7 +936,7 @@
        seCardOperate.setClientId(clientId);
        seCardOperate.setMoney(po.getBalance());
        seCardOperate.setRefundAmount(po.getSupplementMoney());
        seCardOperate.setOperateType(OperateTypeENUM.WRITE_BACK.getCode());
        seCardOperate.setOperateType(OperateTypeENUM.SUPPLEMENT.getCode());
        seCardOperate.setRemarks(po.getRemarks());
        seCardOperate.setOperator(po.getOperator());
        seCardOperate.setOperateDt(operateTime);
@@ -931,6 +961,7 @@
    /**
     * æ“ä½œå›žè°ƒ
     *
     * @param po
     * @return
     */
@@ -944,21 +975,28 @@
        Integer operateType = po.getOperateType();
        String orderNumber = po.getOrderNumber();
        // å…ˆæ£€æŸ¥æ˜¯å¦ä¸ºç®¡ç†å¡
        if (operateType.equals(OperateTypeENUM.MANAGEMENT_CARD_WRITE.getCode().intValue())) {
            // ç®¡ç†ç±»åž‹å¡å†™å¡é€»è¾‘
            return handleManagementCardWrite(cardAddr, orderNumber);
        }
        // å¤„理农户卡逻辑
        Long cardId = seClientCardMapper.getCardIdByAddr(cardAddr);
        if (cardId == null || cardId.equals(0)) {
            map.put("msg", "您指定的水卡不存在");
            return map;
        }
        if(operateType == 1) {
        if (operateType.equals(OperateTypeENUM.ACTIVE.getCode().intValue())) {
            /**
             * å¼€å¡æ“ä½œæ‰§è¡Œé€šçŸ¥
             *  1.依据订单号将无效状态的操作记录改为有效
             *  2.依据水卡ID将无效状态的水卡记录改为有效
             *  3.如果开卡同步充值
             *      ä¿®æ”¹å……值操作记录为有效
             *      ä¿®æ”¹å……值历史记录为有效
             *      ä¿®æ”¹æ°´å¡è¡¨çš„æ“ä½œä¿¡æ¯
             * 1.依据订单号将无效状态的操作记录改为有效
             * 2.依据水卡ID将无效状态的水卡记录改为有效
             * 3.如果开卡同步充值
             * ä¿®æ”¹å……值操作记录为有效
             * ä¿®æ”¹å……值历史记录为有效
             * ä¿®æ”¹æ°´å¡è¡¨çš„æ“ä½œä¿¡æ¯
             */
            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
            Integer rec_card = turnCardValidByOrderNumber(orderNumber);
@@ -967,12 +1005,12 @@
                return map;
            }
            if(isMergeRecharge(cardId)) {
            if (isMergeRecharge(cardId)) {
                turnOperateValidByOrderNumber(orderNumber + "p");
                turnRechargeHistoryValidByOrderNumber(orderNumber);
                updateCard(cardId, orderNumber+"p");
                updateCard(cardId, orderNumber + "p");
            }
        } else if (operateType == 2) {
        } else if (operateType.equals(OperateTypeENUM.RECHARGE.getCode().intValue())) {
            /**
             * å……值操作执行通知
             * 1. æ“ä½œè®°å½•改为有效
@@ -981,8 +1019,8 @@
             */
            turnOperateValidByOrderNumber(orderNumber + "p");
            turnRechargeHistoryValidByOrderNumber(orderNumber);
            updateCard(cardId, orderNumber+"p");
        }else if (operateType == 3) {
            updateCard(cardId, orderNumber + "p");
        } else if (operateType.equals(OperateTypeENUM.CANCEL.getCode().intValue())) {
            /**
             * é”€å¡æ“ä½œæ‰§è¡Œé€šçŸ¥
             * 1. æ“ä½œè®°å½•改为有效
@@ -996,13 +1034,13 @@
                return map;
            }
        } else if (operateType == 4) {
        } else if (operateType.equals(OperateTypeENUM.REISSUE.getCode().intValue())) {
            /**
             * è¡¥å¡æ“ä½œæ‰§è¡Œé€šçŸ¥
             * 1. æ–°æ°´å¡è®°å½•改为有效
             * 2. å¼€å¡æ“ä½œè®°å½•改为有效
             * 3. å¦‚果存在退还金额
             *     æ¸…空原卡余额
             * æ¸…空原卡余额
             */
            Integer rec_card = turnCardValidByOrderNumber(orderNumber);
            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
@@ -1011,7 +1049,7 @@
                map.put("msg", "补卡回调失败");
                return map;
            }
        } else if (operateType == 5) {
        } else if (operateType.equals(OperateTypeENUM.REFUND.getCode().intValue())) {
            /**
             * è¡¥æ‰£æ“ä½œæ‰§è¡Œé€šçŸ¥
             * 1. æ“ä½œè®°å½•改为有效
@@ -1023,7 +1061,7 @@
                map.put("msg", "补扣回调失败");
                return map;
            }
        } else if (operateType == 6) {
        } else if (operateType.equals(OperateTypeENUM.SUPPLEMENT.getCode().intValue())) {
            /**
             * è¿”还操作执行通知
             * 1. æ“ä½œè®°å½•改为有效
@@ -1039,6 +1077,48 @@
        map.put("success", true);
        map.put("msg", "操作成功");
        return map;
    }
    /**
     * å¤„理管理类型卡写卡回调
     *
     * @param cardAddr    å¡åœ°å€
     * @param orderNumber è®¢å•号
     * @return å¤„理结果
     */
    private Map<String, Object> handleManagementCardWrite(String cardAddr, String orderNumber) {
        Map<String, Object> map = new HashMap<>();
        map.put("success", false);
        map.put("content", null);
        try {
            // æ ¹æ®å¡åœ°å€å’Œè®¢å•号查找管理卡
            SeManagementCard managementCard = seManagementCardMapper.selectOne(
                    com.baomidou.mybatisplus.core.toolkit.Wrappers.<SeManagementCard>lambdaQuery()
                            .eq(SeManagementCard::getCardAddr, cardAddr)
                            .eq(SeManagementCard::getOrderNo, orderNumber));
            if (managementCard == null) {
                map.put("msg", "未找到对应的管理卡记录");
                return map;
            }
            // æ›´æ–°ç®¡ç†å¡çŠ¶æ€ä¸ºæ­£å¸¸
            managementCard.setState(ManagementCardStateENUM.NORMAL.getCode());
            int updateResult = seManagementCardMapper.updateByPrimaryKeySelective(managementCard);
            if (updateResult > 0) {
                map.put("success", true);
                map.put("msg", "管理卡写卡完成,状态已更新为正常");
            } else {
                map.put("msg", "管理卡状态更新失败");
            }
        } catch (Exception e) {
            log.error("处理管理卡写卡回调异常", e);
            map.put("msg", "处理管理卡写卡回调时发生异常:" + e.getMessage());
        }
        return map;
    }
@@ -1084,12 +1164,13 @@
    /**
     * å¦‚果补卡时退还了金额,清空挂失卡余额
     *
     * @param orderNumber
     */
    public Integer emptyCardBalance(String orderNumber) {
        Integer rec_empty = 0;
        Float noTradeAmount = seCardOperateMapper.getNoTradeAmount(orderNumber);
        if(noTradeAmount != null && noTradeAmount > 0) {
        if (noTradeAmount != null && noTradeAmount > 0) {
            rec_empty = seClientCardMapper.emptyCardBalance(orderNumber);
        }
        return rec_empty;
@@ -1097,6 +1178,7 @@
    /**
     * ä¿®æ”¹æ³¨é”€æ°´å¡è¡¨çš„记录及余额(0)
     *
     * @param orderNumber
     * @return
     */
@@ -1114,6 +1196,7 @@
    /**
     * ä¿®æ”¹è¡¥æ‰£æ°´å¡è¡¨è®°å½•及余额
     *
     * @param cardId
     * @param orderNumber
     * @return
@@ -1135,6 +1218,7 @@
    /**
     * ä¿®æ”¹è¿”还水卡表记录及余额
     *
     * @param cardId
     * @param orderNumber
     * @return
@@ -1156,6 +1240,7 @@
    /**
     * åˆ¤æ–­æŒ‡å®šæ°´å¡æ˜¯å¦ä¸ºæŒ‚失状态且无补卡记录
     *
     * @param cardNum
     * @return
     */
@@ -1170,17 +1255,18 @@
    /**
     * è¯»å–水卡信息
     *
     * @param cardAddr
     * @return
     */
    public VoTermCard readCard(String cardAddr) {
        VoTermCard voTermCard = seClientCardMapper.getTermCardInfo(cardAddr);
        if(voTermCard != null) {
        if (voTermCard != null) {
            return voTermCard;
        }
        VoTermCard voTermManagerCard = seManagerCardMapper.getTermManagerCardInfo(cardAddr);
        if(voTermManagerCard != null) {
        if (voTermManagerCard != null) {
            return voTermManagerCard;
        }
@@ -1189,6 +1275,7 @@
    /**
     * æ ¹æ®æŒ‡å®šæ¡ä»¶èŽ·å–æ°´å¡åˆ—è¡¨
     *
     * @param vo æŸ¥è¯¢æ¡ä»¶
     * @return æ°´å¡åˆ—表
     */
@@ -1214,6 +1301,7 @@
    /**
     * èŽ·å–å·²æŒ‚å¤±çš„æ°´å¡åˆ—è¡¨
     *
     * @param vo æŸ¥è¯¢æ¡ä»¶
     * @return å·²æŒ‚失的水卡列表
     */
@@ -1222,7 +1310,7 @@
        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<>();
@@ -1243,10 +1331,87 @@
    /**
     * æ ¹æ®æ°´å¡ç¼–号获取卡信息
     *
     * @param cardNum æ°´å¡ç¼–号
     * @return å¡ä¿¡æ¯
     */
    public VoCardByClientNum getCardByCardNum(String cardNum) {
        return seClientCardMapper.getCardByCardNum(cardNum);
    }
    /**
     * åˆ›å»ºç®¡ç†å¡
     *
     * @param dto åˆ›å»ºç®¡ç†å¡DTO
     * @return åˆ›å»ºç»“æžœ
     */
    @Transactional(rollbackFor = Exception.class)
    public Map<String, Object> createManagementCard(CreateManagementCardDto dto) {
        Map<String, Object> result = new HashMap<>();
        result.put("success", false);
        try {
            // æ£€æŸ¥å¡åœ°å€æ˜¯å¦å·²å­˜åœ¨
            if (isCardAddrExists(dto.getCardAddr())) {
                result.put("msg", "创建失败-此卡地址已存在");
                return result;
            }
            // å‚考termActiveCard逻辑:生成订单号
            String orderNo = generateOrderNo();
            // ä½¿ç”¨IDLongGenerator生成唯一ID
            Long id = idLongGenerator.generate();
            Date createTime = new Date();
            // æž„建管理卡对象
            SeManagementCard managementCard = SeManagementCard.builder()
                    .id(id)
                    .protocol(dto.getProtocol())
                    .cardAddr(dto.getCardAddr())
                    .securityCode(dto.getSecurityCode())
                    .cardType(dto.getCardType())
                    .createTime(createTime)
                    .orderNo(orderNo)
                    .districtCode(dto.getDistrictCode())
                    .projectNo(dto.getProjectNo() != null ? dto.getProjectNo() : this.projectNo)
                    .ip(dto.getIp())
                    .domain(dto.getDomain())
                    .openClostTime(dto.getOpenClostTime())
                    .remarks(dto.getRemarks())
                    .state(ManagementCardStateENUM.UNWRITTEN.getCode()) // é»˜è®¤çŠ¶æ€ä¸ºæœªå†™å¡
                    .build();
            // æ’入数据库
            int insertResult = seManagementCardMapper.insertSelective(managementCard);
            if (insertResult > 0) {
                result.put("success", true);
                result.put("content", orderNo); // è¿”回订单号
                result.put("msg", "请求成功");
            } else {
                result.put("msg", "管理卡创建失败-数据库插入异常");
            }
        } catch (Exception e) {
            log.error("创建管理卡异常: {}", e.getMessage(), e);
            result.put("msg", "管理卡创建失败: " + e.getMessage());
        }
        return result;
    }
    /**
     * æ£€æŸ¥å¡ç‰‡åœ°å€æ˜¯å¦å·²å­˜åœ¨
     *
     * @param cardAddr å¡ç‰‡åœ°å€
     * @return true-已存在,false-不存在
     */
    public boolean isCardAddrExists(String cardAddr) {
        // ä½¿ç”¨ä¸€æ¬¡æŸ¥è¯¢æ£€æŸ¥ä¸¤ä¸ªè¡¨ä¸­æ˜¯å¦å­˜åœ¨è¯¥å¡åœ°å€
        // 1. ç®¡ç†å¡è¡¨ï¼šæ‰€æœ‰è®°å½•都检查
        // 2. å†œæˆ·æ°´å¡è¡¨ï¼šåªæ£€æŸ¥æ­£å¸¸(1)和挂失(3)状态的记录
        Long totalCount = seClientCardMapper.checkCardAddrExists(cardAddr);
        return totalCount != null && totalCount > 0;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/CreateManagementCardDto.java
New file
@@ -0,0 +1,81 @@
package com.dy.pipIrrTerminal.card.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2025-01-20
 * @Description åˆ›å»ºç®¡ç†å¡DTO
 */
@Data
@Schema(name = "创建管理卡DTO")
public class CreateManagementCardDto {
    /**
     * é€šè®¯åè®®
     */
    @NotBlank(message = "通讯协议不能为空")
    @Schema(description = "通讯协议", example = "RS485")
    private String protocol;
    /**
     * å¡ç‰‡åœ°å€
     */
    @NotBlank(message = "卡片地址不能为空")
    @Schema(description = "卡片地址", example = "001")
    private String cardAddr;
    /**
     * è¯†åˆ«ç 
     */
    @NotBlank(message = "识别码不能为空")
    @Schema(description = "识别码", example = "A0B1C289")
    private String securityCode;
    /**
     * å¡ç‰‡ç±»åž‹
     * 2-设置区域表号卡,3-取数卡,4-检查卡,5-测试卡,6-清零卡,7-IP设置卡,8-域名设置卡,9-GPS卡,10-时间配置卡
     */
    @NotNull(message = "卡片类型不能为空")
    @Schema(description = "卡片类型", example = "2", allowableValues = { "2", "3", "4", "5", "6", "7", "8", "9", "10" })
    private Byte cardType;
    /**
     * 5级行政区划编码
     */
    @Schema(description = "5级行政区划编码", example = "110101")
    private String districtCode;
    /**
     * é¡¹ç›®ç¼–码
     */
    @Schema(description = "项目编码", example = "1001")
    private Integer projectNo;
    /**
     * IP地址
     */
    @Schema(description = "IP地址", example = "192.168.1.100")
    private String ip;
    /**
     * åŸŸå
     */
    @Schema(description = "域名", example = "example.com")
    private String domain;
    /**
     * å¼€å…³é˜€æ—¶é—´
     */
    @Schema(description = "开关阀时间(秒)", example = "30")
    private Integer openClostTime;
    /**
     * å¤‡æ³¨ä¿¡æ¯
     */
    @Schema(description = "备注信息", example = "管理卡备注")
    private String remarks;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoCallBack.java
@@ -32,7 +32,7 @@
    private String orderNumber;
    /**
     * æ“ä½œç±»åž‹ï¼š1-开卡,2-充值,3-销卡,4-补卡,5-补扣
     * æ“ä½œç±»åž‹ï¼š1-开卡,2-充值,3-销卡,4-补卡,5-补扣,6-返还,7-管理类型卡写卡
     */
    @NotNull(message = "操作类型不能为空")
    private Integer operateType;
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/ManagementCardStateENUM.java
New file
@@ -0,0 +1,23 @@
package com.dy.pipIrrTerminal.card.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author ZhuBaoMin
 * @date 2025-01-20
 * @LastEditTime 2025-01-20
 * @Description ç®¡ç†å¡çŠ¶æ€æžšä¸¾
 */
@Getter
@AllArgsConstructor
public enum ManagementCardStateENUM {
    NORMAL((byte) 1, "正常"),
    CANCELLED((byte) 2, "已注销"),
    LOSS((byte) 3, "已挂失"),
    UNWRITTEN((byte) 4, "未写卡");
    private final Byte code;
    private final String message;
}
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/enums/OperateTypeENUM.java
@@ -7,22 +7,25 @@
 * @author ZhuBaoMin
 * @date 2025-05-08 11:45
 * @LastEditTime 2025-05-08 11:45
 * @Description
 * @Description æ“ä½œç±»åž‹æžšä¸¾
 */
@Getter
@AllArgsConstructor
public enum OperateTypeENUM {
    ACTIVE((byte)1, "开卡"),
    RECHARGE((byte)2, "充值"),
    CANCEL((byte)3, "销卡"),
    REISSUE((byte)4, "补卡"),
    REFUND((byte)5, "补扣"),
    LOSS((byte)6, "挂失"),
    REVERSAL((byte)7, "冲正"),
    UNLOCK((byte)8, "解锁"),
    CONSUME((byte)9, "消费"),
    WRITE_BACK((byte)10, "反写");
    ACTIVE((byte) 1, "开卡"),
    RECHARGE((byte) 2, "充值"),
    CANCEL((byte) 3, "销卡"),
    REISSUE((byte) 4, "补卡"),
    REFUND((byte) 5, "补扣"),
    SUPPLEMENT((byte) 6, "返还"),
    MANAGEMENT_CARD_WRITE((byte) 7, "管理类型卡写卡"),
    // ä¿ç•™å…¶ä»–系统使用的枚举值
    LOSS((byte) 8, "挂失"),
    UNLOCK((byte) 9, "解锁"),
    REVERSAL((byte) 10, "冲正"),
    CONSUME((byte) 11, "消费"),
    WRITE_BACK((byte) 12, "反写");
    private final Byte code;
    private final String message;
pipIrr-platform/Îĵµ/Ë®·ÊÆøÏóÉÊÇé/MQTTÖ¸Áî²»Ö´Ðнâ¾ö±¸Íü.docx
Binary files differ
pipIrr-platform/Îĵµ/Ë®·ÊÆøÏóÉÊÇé/MQTTÉ趨ʱ¼ä²ÎÊý±¸Íü.docx
Binary files differ