修改流水入账逻辑
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, '测试');