修改了流水统计的逻辑
diff --git a/src/main/java/com/supwisdom/dlpay/water/dao/DtlCountDateDao.java b/src/main/java/com/supwisdom/dlpay/water/dao/DtlCountDateDao.java
new file mode 100644
index 0000000..1b49a6e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/DtlCountDateDao.java
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.water.dao;
+
+import com.supwisdom.dlpay.water.domain.TdtlCountDate;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
+
+@Repository
+public interface DtlCountDateDao extends JpaRepository<TdtlCountDate,Integer> {
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    @Query("select t from TdtlCountDate t where t.id=1")
+    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+    TdtlCountDate findCountDateForUpdate();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/water/dao/TransdtlCountDao.java b/src/main/java/com/supwisdom/dlpay/water/dao/TransdtlCountDao.java
index 732f124..fcd3c4d 100644
--- a/src/main/java/com/supwisdom/dlpay/water/dao/TransdtlCountDao.java
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/TransdtlCountDao.java
@@ -5,9 +5,8 @@
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
-import java.util.List;
-
 @Repository
 public interface TransdtlCountDao extends JpaRepository<TTransdtlCount, String>, JpaSpecificationExecutor<TTransdtlCount> {
-    List<TTransdtlCount> findByAccdate(String accdate);
+
+    int countByAccdate(String accdate);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/water/domain/TdtlCountDate.java b/src/main/java/com/supwisdom/dlpay/water/domain/TdtlCountDate.java
new file mode 100644
index 0000000..7464d24
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/water/domain/TdtlCountDate.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.water.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Table(name = "tb_dtlcountdate")
+@Entity
+public class TdtlCountDate {
+    @Id
+    private Integer id;
+
+    @Column(name = "countdate",length = 8)
+    private String countdate;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getCountdate() {
+        return countdate;
+    }
+
+    public void setCountdate(String countdate) {
+        this.countdate = countdate;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/water/pay/PayInit.java b/src/main/java/com/supwisdom/dlpay/water/pay/PayInit.java
index b5af832..84fbf7a 100644
--- a/src/main/java/com/supwisdom/dlpay/water/pay/PayInit.java
+++ b/src/main/java/com/supwisdom/dlpay/water/pay/PayInit.java
@@ -2,13 +2,12 @@
 
 import com.supwisdom.dlpay.api.bean.ApiVersionResponse;
 import com.supwisdom.dlpay.framework.service.BusinessparaService;
-import com.supwisdom.dlpay.framework.util.Constants;
 import com.supwisdom.dlpay.framework.util.WaterBudinessConstants;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.ApiCommonProxy;
 import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
+import com.supwisdom.dlpay.water.service.CollectdtlService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.stereotype.Component;
@@ -26,9 +25,9 @@
     @Autowired
     private BusinessparaService businessparaService;
 
-    private  String appid;
+    private String appid;
 
-    private  String secret;
+    private String secret;
 
     @Autowired
     private ApiLoginProxy apiLoginProxy;
@@ -36,14 +35,22 @@
     @Autowired
     private ApiCommonProxy apiCommonProxy;
 
+    @Autowired
+    private CollectdtlService collectdtlService;
+
     @PostConstruct
     public void login() {
-        appid=businessparaService.findByParakey(WaterBudinessConstants.WATER_APPID).getParaval();
-        secret=businessparaService.findByParakey(WaterBudinessConstants.WATER_SECRET).getParaval();
+        appid = businessparaService.findByParakey(WaterBudinessConstants.WATER_APPID).getParaval();
+        secret = businessparaService.findByParakey(WaterBudinessConstants.WATER_SECRET).getParaval();
         ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
-        helper.login(appid,secret);
+        helper.login(appid, secret);
         ApiVersionResponse version = apiCommonProxy.apiVersion();
         assertThat("get version error " + version.getException(),
                 version.getVersion(), notNullValue());
     }
+
+    @PostConstruct
+    public void initDtlCountDate() {
+        collectdtlService.initDtlCountDate();
+    }
 }
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 683c3f9..58bfa28 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
@@ -5,7 +5,6 @@
 import com.supwisdom.dlpay.water.UserAuthRequest;
 import com.supwisdom.dlpay.water.bean.TransdtlCountSearchBean;
 import com.supwisdom.dlpay.water.domain.TCollectdtl;
-import com.supwisdom.dlpay.water.domain.TTransdtlCount;
 import com.supwisdom.dlpay.water.pojo.TCollectdtlDTO;
 import com.supwisdom.dlpay.water.bean.TransdtlSearchBean;
 import com.supwisdom.dlpay.water.pojo.TTransdtlCountVO;
@@ -40,5 +39,8 @@
     TCollectdtl findByCobillnoForUpdate(Integer cobillno);
 
     @Transactional(rollbackFor = Exception.class)
-    void generateCountdtl(String accdate);
+    void generateCountdtl();
+
+    @Transactional(rollbackFor = Exception.class)
+    void initDtlCountDate();
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt
index 8821de6..33a5dda 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt
@@ -568,7 +568,7 @@
     @GetMapping("/areapara/loadbindadd")
     fun loadBindView(model: Model): String {
         model.addAttribute("grouplist", tAreaparaService.queryAllAreaparaGroups())
-        return "/system/areaparabind/form"
+        return "system/areaparabind/form"
     }
 
     @PostMapping("/areapara/addbindareapara")
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 8f1ffe6..f546b16 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/scheduler_task.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/scheduler_task.kt
@@ -40,12 +40,10 @@
     @Autowired
     private lateinit var collectdtlService: CollectdtlService
 
-    @Autowired
-    private lateinit var systemUtilsService: SystemUtilService
     @Scheduled(cron = "0 0 1 * * ?")
     @SchedulerLock(name = "generateCountdtl",lockAtMostForString = "PT10M")
     fun generateCountdtl() {
-        collectdtlService.generateCountdtl(systemUtilsService.sysdatetime.hostdate)
+        collectdtlService.generateCountdtl()
     }
 }
 
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 37f69c5..02268b9 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
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.water.service
 
 import com.supwisdom.dlpay.exception.TransactionProcessException
+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
@@ -12,8 +13,10 @@
 import com.supwisdom.dlpay.water.domain.TCollectdtl
 import com.supwisdom.dlpay.water.pojo.TCollectdtlDTO
 import com.supwisdom.dlpay.water.bean.TransdtlSearchBean
+import com.supwisdom.dlpay.water.dao.DtlCountDateDao
 import com.supwisdom.dlpay.water.dao.TransdtlCountDao
 import com.supwisdom.dlpay.water.domain.TTransdtlCount
+import com.supwisdom.dlpay.water.domain.TdtlCountDate
 import com.supwisdom.dlpay.water.pojo.TTransdtlCountDTO
 import com.supwisdom.dlpay.water.pojo.TTransdtlCountVO
 import mu.KotlinLogging
@@ -21,14 +24,13 @@
 import org.hibernate.transform.Transformers
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.data.domain.PageRequest
-import org.springframework.data.jpa.domain.Specification
 import org.springframework.stereotype.Service
 import java.lang.IllegalStateException
 import java.lang.RuntimeException
 import java.math.BigInteger
-import java.util.ArrayList
+import java.text.SimpleDateFormat
+import java.util.*
 import javax.persistence.EntityManager
-import javax.persistence.criteria.Predicate
 
 @Service
 class CollectdtlServiceImpl : CollectdtlService {
@@ -44,6 +46,12 @@
     @Autowired
     private lateinit var transdtlCountDao: TransdtlCountDao
 
+    @Autowired
+    private lateinit var dtlCountDateDao: DtlCountDateDao
+
+    @Autowired
+    private lateinit var systemUtilsService: SystemUtilService
+
 
     override fun createNewTransdtl(dtl: TCollectdtl): TCollectdtl {
         collectdtlDao.save(dtl)
@@ -217,8 +225,8 @@
             countQuery.setParameter("maxaccdate", timerange[1])
         }
         if (!StringUtil.isEmpty(param.devicename)) {
-            query.setParameter("devicename", "%"+param.devicename.trim()+"%")
-            countQuery.setParameter("devicename", "%"+param.devicename.trim()+"%")
+            query.setParameter("devicename", "%" + param.devicename.trim() + "%")
+            countQuery.setParameter("devicename", "%" + param.devicename.trim() + "%")
         }
         param.areano?.let {
             query.setParameter("areano", param.areano)
@@ -229,7 +237,7 @@
         query.unwrap(NativeQueryImpl::class.java).setResultTransformer(Transformers.aliasToBean(TTransdtlCountVO::class.java))
         val list = query.resultList as List<TTransdtlCountVO>
         val count = countQuery.singleResult as BigInteger
-        return PageResult(count.longValueExact(),list)
+        return PageResult(count.longValueExact(), list)
     }
 
     override fun queryTransdtlNotEntry(): List<TCollectdtl>? {
@@ -240,18 +248,29 @@
         return collectdtlDao.findByCobillnoForUpdate(cobillno) ?: throw RuntimeException("采集流水号:" + cobillno + "未找到")
     }
 
-    override fun generateCountdtl(accdate: String?) {
-        val countList=transdtlCountDao.findByAccdate(accdate)
-        if (countList != null && countList.size!=0) {
-            logger.error { accdate+"的统计流水已生成!" }
+    override fun generateCountdtl() {
+        val dtlcountDate = dtlCountDateDao.findCountDateForUpdate()
+        val currentDate = systemUtilsService.sysdatetime.hostdate
+        if (dtlcountDate.countdate.toInt() >= currentDate.toInt()) {
+            logger.error { "统计流水日期<${dtlcountDate.countdate}>应小于当前日期<$currentDate>" }
             return
         }
-        val list = ArrayList<TTransdtlCount>(300)
-        try {
-            val querySql = "select t3.deviceno,t3.areano,coalesce(t4.accdate,:accdate) accdate,t4.mode,coalesce(t4.amount,0) amount,coalesce(t4.water,0) water,coalesce(t4.count,0) " +
-                    "count from tb_device t3 LEFT JOIN (select t1.deviceno,t1.accdate,t1.mode,t1.amount,t1.water,t1.count,t2.areano from (select deviceno,accdate,mode,sum(amount) amount,sum(water_in_100ml) water,count(cobillno) count " +
-                    "from tb_collectdtl where accdate=:accdate and status = 'success' group by deviceno,mode,accdate) t1 LEFT JOIN " +
-                    "(select deviceno,areano from tb_device) t2 on t1.deviceno=t2.deviceno) t4 on t3.deviceno=t4.deviceno"
+        val count = daysBetween(dtlcountDate.countdate, currentDate)
+        var accdate = dtlcountDate.countdate
+        val querySql = "select t3.deviceno,t3.areano,coalesce(t4.accdate,:accdate) accdate,t4.mode,coalesce(t4.amount,0) amount,coalesce(t4.water,0) water,coalesce(t4.count,0) " +
+                "count from tb_device t3 LEFT JOIN (select t1.deviceno,t1.accdate,t1.mode,t1.amount,t1.water,t1.count,t2.areano from (select deviceno,accdate,mode,sum(amount) amount,sum(water_in_100ml) water,count(cobillno) count " +
+                "from tb_collectdtl where accdate=:accdate and status = 'success' group by deviceno,mode,accdate) t1 LEFT JOIN " +
+                "(select deviceno,areano from tb_device) t2 on t1.deviceno=t2.deviceno) t4 on t3.deviceno=t4.deviceno"
+        for (i in 1..count) {
+            if (accdate.toInt() >= currentDate.toInt()) {
+                logger.error { "统计流水日期<$accdate>应小于当前日期<$currentDate>" }
+                return
+            }
+            if (transdtlCountDao.countByAccdate(accdate)>0) {
+                logger.error { accdate + "的统计流水已生成!" }
+                return
+            }
+            val list = ArrayList<TTransdtlCount>(300)
             val query = em.createNativeQuery(querySql)
             query.setParameter("accdate", accdate)
             query.unwrap(NativeQueryImpl::class.java).setResultTransformer(Transformers.aliasToBean(TTransdtlCountDTO::class.java))
@@ -268,8 +287,38 @@
                 list.add(transCount)
             }
             transdtlCountDao.saveAll(list)
-        } finally {
-            list.clear()
+            accdate = nextDay(accdate)
+        }
+        dtlcountDate.countdate=accdate
+        dtlCountDateDao.save(dtlcountDate)
+    }
+
+    private fun daysBetween(date1: String, date2: String): Int {
+        val sdf = SimpleDateFormat("yyyyMMdd")
+        val cal = Calendar.getInstance()
+        cal.time = sdf.parse(date1)
+        val time1 = cal.timeInMillis
+        cal.time = sdf.parse(date2)
+        val time2 = cal.timeInMillis
+        val between = (time2 - time1) / (1000 * 3600 * 24)
+        return Integer.parseInt(between.toString())
+    }
+
+    private fun nextDay(date: String): String {
+        val sdf = SimpleDateFormat("yyyyMMdd")
+        val cal = Calendar.getInstance()
+        cal.time = sdf.parse(date)
+        cal.add(Calendar.DATE, 1)
+        return sdf.format(cal.time)
+    }
+
+    override fun initDtlCountDate() {
+        val dtlCountDate = dtlCountDateDao.findCountDateForUpdate()
+        if (dtlCountDate == null) {
+            val countDate = TdtlCountDate()
+            countDate.id = 1
+            countDate.countdate = systemUtilsService.sysdatetime.hostdate
+            dtlCountDateDao.save(countDate)
         }
     }
 }
\ No newline at end of file