修改流水入账逻辑
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index 30b15b1..d43abcf 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -342,4 +342,24 @@
   public static Boolean sameDay(Timestamp d1, Timestamp d2) {
     return (compareDay(d1, d2) == 0);
   }
+
+  /**
+   * 将给定时间增加指定小时数
+   */
+  public static String addDateHour(String day, int hour){
+    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
+    Date date = null;
+    try {
+      date = format.parse(day);
+    } catch (Exception ex) {
+      ex.printStackTrace();
+    }
+    if (date == null)
+      return "";
+    Calendar cal = Calendar.getInstance();
+    cal.setTime(date);
+    cal.add(Calendar.HOUR, hour);// 24小时制
+    date = cal.getTime();
+    return format.format(date);
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java b/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
index df2419d..a0cbaf5 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
@@ -7,4 +7,6 @@
     public final static String WATER_SHOP_ACCNO = "water_shopaccno";
     public final static String WATER_APPID = "water_appid";
     public final static String WATER_SECRET = "water_secret";
+    public final static String WATER_DTLCREDIT_MAXCOUNT = "water_dtlcredit_maxcount"; // 单笔流水每日最大入账次数
+    public final static String WATER_DTLCREDIT_INTERVALHOUR = "water_dtlcredit_intervalhour"; // 单笔流水入账间隔小时数
 }
diff --git a/src/main/java/com/supwisdom/dlpay/water/dao/CollectdtlDao.java b/src/main/java/com/supwisdom/dlpay/water/dao/CollectdtlDao.java
index c0095f5..fb8ac41 100644
--- a/src/main/java/com/supwisdom/dlpay/water/dao/CollectdtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/CollectdtlDao.java
@@ -24,10 +24,8 @@
     @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
     TCollectdtl findByEntrynoForUpdate(String entryno);
 
-    @Lock(LockModeType.PESSIMISTIC_WRITE)
-    @Query("select t from TCollectdtl  t where t.status='wip'")
-    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
-    List<TCollectdtl> findWipCollectdtl(Pageable pageable);
+    @Query("select t from TCollectdtl  t where t.status='wip' and t.lastCredit<?1 and t.nextCreditTime<?2")
+    List<TCollectdtl> findWipCollectdtl(String maxCredit,String currentTime,Pageable pageable);
 
     TCollectdtl findByCobillnoAndDeviceno(Integer cobillno, String deviceno);
 
diff --git a/src/main/java/com/supwisdom/dlpay/water/domain/TCollectdtl.java b/src/main/java/com/supwisdom/dlpay/water/domain/TCollectdtl.java
index 09c43f2..d1e2226 100644
--- a/src/main/java/com/supwisdom/dlpay/water/domain/TCollectdtl.java
+++ b/src/main/java/com/supwisdom/dlpay/water/domain/TCollectdtl.java
@@ -7,6 +7,7 @@
 @Table(name = "tb_collectdtl",
     indexes = {@Index(name = "collectdtl_userid", columnList = "userid"),
         @Index(name = "collectdtl_status", columnList = "transdate, status"),
+        @Index(name = "collectdtl_creditable",columnList = "status,lastcredit,nextcredittime"),
         @Index(name = "collectdtl_acc", columnList = "accdate")})
 @SequenceGenerator(name = "SEQ_COLLECT_BILLNO", sequenceName = "SEQ_COLLECT_BILLNO", allocationSize = 1)
 public class TCollectdtl {
@@ -65,6 +66,12 @@
   @Column(name = "cardphyid",length = 60)
   private String cardPhyId;
 
+  @Column(name = "lastcredit",length = 9)
+  private String lastCredit;
+
+  @Column(name = "nextcredittime",length = 14)
+  private String nextCreditTime;
+
   public String getCardPhyId() {
     return cardPhyId;
   }
@@ -193,4 +200,19 @@
     this.entryno = entryno;
   }
 
+  public String getLastCredit() {
+    return lastCredit;
+  }
+
+  public void setLastCredit(String lastCredit) {
+    this.lastCredit = lastCredit;
+  }
+
+  public String getNextCreditTime() {
+    return nextCreditTime;
+  }
+
+  public void setNextCreditTime(String nextCreditTime) {
+    this.nextCreditTime = nextCreditTime;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java b/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java
index d5f60d1..3e623de 100644
--- a/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java
+++ b/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.water.pay;
 
 import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
 import com.supwisdom.dlpay.framework.service.BusinessparaService;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.*;
@@ -18,6 +19,10 @@
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
 import static org.hamcrest.Matchers.equalTo;
 
 
@@ -50,6 +55,22 @@
     @Async("waterPay")
     public void waterPay(Integer cobillno) {
         TCollectdtl collectdtl = collectdtlService.findByCobillnoForUpdate(cobillno);
+        String lastCredit = collectdtl.getLastCredit();
+        SystemDateTime dateTime = systemUtilService.getSysdatetime();
+        String currentDate = dateTime.getHostdate();
+        String lastDate = lastCredit.substring(0, 8);
+        int count = Integer.valueOf(lastCredit.substring(8, 9));
+        String currentCredit;
+        if (currentDate.equals(lastDate)) {
+            currentCredit = currentDate + (count + 1);
+        }else {
+            currentCredit = currentDate + "1";
+        }
+        String intervalHour = businessparaService.findByParakey(WaterBudinessConstants.WATER_DTLCREDIT_INTERVALHOUR).getParaval();
+        String nextTime = DateUtil.addDateHour(dateTime.getHostdatetime(), Integer.valueOf(intervalHour));
+        collectdtl.setNextCreditTime(nextTime);
+        collectdtl.setLastCredit(currentCredit);
+        collectdtlService.saveCollectDtl(collectdtl);
         if (!TradeDict.DTL_STATUS_WIP.equals(collectdtl.getStatus())) {
             logger.error("待入账的采集流水" + cobillno + "状态不正确");
             return;
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java b/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
index a4546c3..09b2e30 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
@@ -50,4 +50,7 @@
 
     @Transactional(rollbackFor = Exception.class)
     Double getTodayAmount(String userid);
+
+    @Transactional(rollbackFor = Exception.class)
+    TCollectdtl saveCollectDtl(TCollectdtl dtl);
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
index f08f563..3ba083b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -97,10 +97,6 @@
             val personIdentity = userDataService.getPersonIdentityByThirdUid(param.citizenCardno)
                     ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                             .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "未查询到您的身份信息"))
-            if (personIdentity.cardphyId == null || personIdentity.cardphyId != param.cardphyid) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "物理卡号不匹配"))
-            }
             val notaccAmount = userDataService.subtract(personIdentity.coamount, personIdentity.accamount)
             //2. 通过 deviceno 查询设备费率参数
             val todayAmount = collectdtlService.getTodayAmount(personIdentity.person.userid) ?: 0.0
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/scheduler_task.kt b/src/main/kotlin/com/supwisdom/dlpay/water/scheduler_task.kt
index e68eeb7..b383383 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/scheduler_task.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/scheduler_task.kt
@@ -21,7 +21,7 @@
     @Autowired
     private lateinit var waterPayAsyncTask: WaterPayAsyncTask
 
-    @Scheduled(cron = "0 */10 * * * ?")
+    @Scheduled(cron = "0 */2 * * * ?")
     @SchedulerLock(name = "dealCollectdtlAccountEntry", lockAtMostForString = "PT10M")
     fun queryCollectdtlResult() {
         val collectdtlList = collectdtlService.queryTransdtlNotEntry()
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt b/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt
index 74e6124..5269151 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt
@@ -2,11 +2,9 @@
 
 import com.supwisdom.dlpay.api.bean.UserInforResponse
 import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.service.BusinessparaService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.PageResult
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.WaterErrorCode
+import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.water.StartWaterRequest
 import com.supwisdom.dlpay.water.UploadRecordRequest
 import com.supwisdom.dlpay.water.bean.TransdtlCountSearchBean
@@ -53,6 +51,12 @@
     @Autowired
     private lateinit var systemUtilsService: SystemUtilService
 
+    @Autowired
+    private lateinit var businessparaService: BusinessparaService
+
+    @Autowired
+    private lateinit var systemUtilService: SystemUtilService
+
 
     override fun createNewTransdtl(dtl: TCollectdtl): TCollectdtl {
         collectdtlDao.save(dtl)
@@ -63,12 +67,20 @@
         val dtl = collectdtlDao.findByCobillnoForUpdate(record.cobillno)
                 ?: throw TransactionProcessException(WaterErrorCode.DATA_NOTFOUND_ERROR,
                         "交易订单号不存在")
+        val amount = record.amount
         if (record.transtatus == "2") {
             dtl.status = TradeDict.DTL_STATUS_FAIL
         } else if (record.transtatus == "1") {
-            dtl.status = TradeDict.DTL_STATUS_WIP
+            if (0 != amount) {
+                val dateTime = systemUtilService.sysdatetime
+                dtl.lastCredit = dateTime.hostdate + "0" // 0代表已尝试入账次数
+                dtl.nextCreditTime = dateTime.hostdatetime
+                dtl.status = TradeDict.DTL_STATUS_WIP
+            }else{
+                dtl.status = TradeDict.DTL_STATUS_SUCCESS
+            }
         }
-        dtl.amount = record.amount / 100.0
+        dtl.amount = amount / 100.0
         dtl.waterSumHundredLitre = record.flowsensors
         dtl.uploadTime = record.transdate + record.transtime
         dtl.uploadStatus = true
@@ -252,7 +264,11 @@
     }
 
     override fun queryTransdtlNotEntry(): List<TCollectdtl>? {
-        return collectdtlDao.findWipCollectdtl(PageRequest.of(0, 10))
+        val count = businessparaService.findByParakey(WaterBudinessConstants.WATER_DTLCREDIT_MAXCOUNT).paraval
+        val dateTime = systemUtilsService.sysdatetime
+        val date = dateTime.hostdate
+        val time = dateTime.hostdatetime
+        return collectdtlDao.findWipCollectdtl(date + count,time,PageRequest.of(0, 10))
     }
 
     override fun findByCobillnoForUpdate(cobillno: Int?): TCollectdtl {
@@ -340,4 +356,8 @@
         query.setParameter("date",systemUtilsService.sysdatetime.hostdate)
         return query.singleResult as Double?
     }
+
+    override fun saveCollectDtl(dtl: TCollectdtl): TCollectdtl?{
+        return collectdtlDao.save(dtl)
+    }
 }
\ No newline at end of file
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index df98ad0..f1d41c3 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -60,6 +60,8 @@
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_shopaccno', '2000000010');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_appid', '700001');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_secret', '5f788ce433ec44f299351cdf7f137e81');
+INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_dtlcredit_maxcount', '3');
+INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_dtlcredit_intervalhour', '1');
 
 
 INSERT INTO "tb_area"("areano", "address", "areaname", "available", "arealevel", "parentid", "remarks") VALUES (1, '测试路1号', '测试区域', 1, 1, 0, '测试');