修改了流水统计的逻辑
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