fix: 修改 systemutilservice currentTimestamp 为 null 的 bug
fix:修改  TAccount 没有@version 字段的 bug
diff --git a/config/application-devel-pg-local.properties b/config/application-devel-pg-local.properties
index b6561aa..e976303 100644
--- a/config/application-devel-pg-local.properties
+++ b/config/application-devel-pg-local.properties
@@ -20,3 +20,7 @@
 jwt.expiration=3600
 # user password
 auth.password.bcrypt.seed=
+
+##################################################
+## quartz task scheduler
+shopbalance.updater.cron = -
\ No newline at end of file
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 3c76bf5..ada087d 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -20,4 +20,9 @@
 jwt.expiration=3600
 auth.password.bcrypt.seed=
 spring.jackson.serialization.fail-on-empty-beans=false
-logging.level.org.springframework.web=DEBUG
\ No newline at end of file
+logging.level.org.springframework.web=DEBUG
+
+
+##################################################
+## quartz task scheduler
+shopbalance.updater.cron = -
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java b/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
index 2a89feb..3525011 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
@@ -53,7 +53,8 @@
   @Column(name = "MAX_BAL", precision = 15, scale = 2)
   private Double maxbal; // 最大余额限制
 
-  @Column(name = "LAST_TRANSTIME", length = 8)
+  @Version
+  @Column(name = "LAST_TRANSTIME")
   private Timestamp lasttranstime; //最后交易日期
 
   @Column(name = "LASTDAY_TRANSAMT", precision = 9, scale = 2)
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java b/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java
index c5bd5f4..63b1281 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java
@@ -20,7 +20,7 @@
   private Double amount;
 
   @Version
-  @Column(name = "update_time", nullable = false)
+  @Column(name = "update_time")
   private Timestamp updateTime;
 
   @Column(name = "lastRefno", nullable = false, length = 32)
diff --git a/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java b/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java
index 5e976e8..6f414a5 100644
--- a/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java
+++ b/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java
@@ -1,11 +1,10 @@
 package com.supwisdom.dlpay.api.repositories;
 
 import com.supwisdom.dlpay.api.domain.TPersondtl;
-import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 public interface AccountService {
 
-  @Transactional(isolation = Isolation.SERIALIZABLE)
+  @Transactional
   void recalcAccountBalance(TPersondtl dtl, Double amount, boolean overdraft);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
index 0ba8274..b876d9d 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
@@ -1,7 +1,6 @@
 package com.supwisdom.dlpay.framework.data;
 
 import java.sql.Timestamp;
-import java.util.Date;
 
 public interface SystemDateTime {
   String getHostdate();
@@ -10,7 +9,6 @@
 
   String getHostdatetime();
 
-  Date getSysdate();
+  Timestamp getSysdate();
 
-  Timestamp getCurrentTimestamp();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
index af90257..e575265 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -11,29 +11,30 @@
 
   /**
    * 取数据库日期
-   * */
+   */
+  @Transactional
   SystemDateTime getSysdatetime();
 
   /**
    * 更新任务表
-   * */
+   */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TTaskLock updateTaskLock(TTaskLock lock);
 
   /**
    * 取任务表
-   * */
+   */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TTaskLock doLockTask(String taskcode, Integer minRecover, String remark);
 
   /**
    * 获取记账日期
-   * */
+   */
   String getAccdate();
 
   /**
    * 获取流水号
-   * */
+   */
   String getRefno();
 
   /**
@@ -73,6 +74,7 @@
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TBusinesspara getBusinessValueForUpdateNowait(String parakey);
+
   /********************** 获取【系统参数】【业务参数】通用方法 **********************/
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
index ff86a29..3ca5ef6 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -35,40 +35,6 @@
 
   private static final Logger logger = LoggerFactory.getLogger(SystemUtilServiceImpl.class);
 
-  public static class SystemDateTimeImpl implements SystemDateTime {
-    private Date now;
-    private static final SimpleDateFormat sdft = new SimpleDateFormat("yyyyMMddHHmmss");
-
-    public SystemDateTimeImpl(Date now) {
-      this.now = now;
-    }
-
-    @Override
-    public String getHostdate() {
-      return sdft.format(this.now).substring(0, 8);
-    }
-
-    @Override
-    public String getHosttime() {
-      return sdft.format(this.now).substring(8, 14);
-    }
-
-    @Override
-    public String getHostdatetime() {
-      return sdft.format(this.now);
-    }
-
-    @Override
-    public Date getSysdate() {
-      return this.now;
-    }
-
-    @Override
-    public Timestamp getCurrentTimestamp() {
-      return new Timestamp(this.now.getTime());
-    }
-  }
-
   /**
    * 获取oracle数据库时间
    */
diff --git a/src/main/kotlin/com/supwisdom/dlpay/account_process_async.kt b/src/main/kotlin/com/supwisdom/dlpay/api/account_process_async.kt
similarity index 98%
rename from src/main/kotlin/com/supwisdom/dlpay/account_process_async.kt
rename to src/main/kotlin/com/supwisdom/dlpay/api/account_process_async.kt
index 51be41f..83bfde8 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/account_process_async.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/account_process_async.kt
@@ -1,4 +1,4 @@
-package com.supwisdom.dlpay
+package com.supwisdom.dlpay.api
 
 import com.supwisdom.dlpay.api.repositories.ShopaccService
 import mu.KotlinLogging
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
index 6dcc9ee..c52dce2 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
@@ -73,16 +73,19 @@
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
                 this.opposite = AccountProxy(rechargeDrsubjno)
             }.and().addDebitCreditRecord(AccountProxy(rechargeDrsubjno), AccountProxy(account),
-                            param.amount / 100.0, "账户充值")
+                    param.amount / 100.0, "账户充值")
                     .also { builder ->
                         param.feelist?.forEach {
                             val feeamt = it.amount / 100.0
                             when (it.feetype) {
                                 TradeDict.PAYTYPE_RECHARGE_COUPON -> {
                                     //优惠折扣  优惠科目 -> 个人账户
-                                    val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.PAYTYPE_RECHARGE_COUPON, param.sourcetype)
-                                    val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方折扣科目
-                                    builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(account), feeamt, feetypeConfig.summary)
+                                    val feetypeConfig = accountUtilServcie
+                                            .readFeetype(TradeDict.PAYTYPE_RECHARGE_COUPON, param.sourcetype)
+                                    val subject = accountUtilServcie
+                                            .readSubject(feetypeConfig.drsubjno) //不同在借方折扣科目
+                                    builder.addDebitCreditRecord(AccountProxy(subject),
+                                            AccountProxy(account), feeamt, feetypeConfig.summary)
                                 }
                                 //fixme: 服务费暂缺
 //                                TradeDict.PAYTYPE_RECHARGE_SERVICEFEE -> {
@@ -92,7 +95,8 @@
 //                                    builder.addDebitCreditRecord(AccountProxy(rechargeDrsubjno), AccountProxy(subject), feeamt, feetypeConfig.summary)
 //
 //                                }
-                                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "充值费用清单不支持feetype<${it.feetype}>")
+                                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                        "充值费用清单不支持feetype<${it.feetype}>")
                             }
                         }
                     }.init(transactionService)
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt b/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
index a5846bb..2dec950 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
@@ -15,7 +15,7 @@
         shopaccService.recalcShopBalance(dtl.refno, true)
     }
 
-    @Scheduled(fixedRate = 5000)
+    @Scheduled(cron = "\${jobs.cronSchedule:-}")
     fun dealShopUnupdatedDtl() {
         shopaccService.findUnupdatedShopDtl(100).forEach {
             doShopBlanceUpdate(it)
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt
index fb88e55..42e5974 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt
@@ -7,31 +7,35 @@
 import com.supwisdom.dlpay.framework.domain.TShopacc
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.DateUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.TradeDict.*
+import com.supwisdom.dlpay.framework.util.TradeDict.DTL_STATUS_SUCCESS
+import com.supwisdom.dlpay.framework.util.TradeDict.TRADE_FLAG_OUT
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Repository
+import org.springframework.stereotype.Service
 import java.sql.Timestamp
 import javax.persistence.EntityManager
 import javax.persistence.LockModeType
 import javax.persistence.OptimisticLockException
 import javax.persistence.PersistenceContext
 
-@Repository
+@Service
 class AccountServiceImpl : AccountService {
 
     @PersistenceContext
     private lateinit var entityManager: EntityManager
 
     @Autowired
-    lateinit var systemUtilServcie: SystemUtilService
+    private lateinit var systemUtilServcie: SystemUtilService
 
-    private fun newAccounDayBal(dtl: TPersondtl, account: TAccount) = TAccountDayBal().apply {
-        accno = account.accno
-        accdate = dtl.accdate
-        amount = 0.0
-        checked = false
+    private fun newAccounDayBal(dtl: TPersondtl, account: TAccount): TAccountDayBal {
+        return TAccountDayBal().apply {
+            accno = account.accno
+            accdate = dtl.accdate
+            amount = 0.0
+            updateTime = systemUtilServcie.sysdatetime.sysdate
+            checked = false
+        }
     }
 
     private fun doRecalcAccountBalance(dtl: TPersondtl, amount: Double, account: TAccount): TAccountDayBal {
@@ -63,7 +67,7 @@
                     account.balance += dtl.amount
 
                     val sameDay = DateUtil.sameDay(account.lasttranstime,
-                            systemUtilServcie.sysdatetime.currentTimestamp) ?: false
+                            systemUtilServcie.sysdatetime.sysdate) ?: false
 
                     if (!sameDay) {
                         account.lastdayTransamt = 0.0
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 608f899..d81db90 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -1,12 +1,10 @@
 package com.supwisdom.dlpay.api.service.impl
 
-import com.supwisdom.dlpay.ShopAccBalanceAsyncTask
 import com.supwisdom.dlpay.api.TransactionBuilder
 import com.supwisdom.dlpay.api.dao.PersondtlDao
 import com.supwisdom.dlpay.api.dao.TransactionMainDao
 import com.supwisdom.dlpay.api.domain.*
 import com.supwisdom.dlpay.api.repositories.AccountService
-import com.supwisdom.dlpay.api.repositories.ShopaccService
 import com.supwisdom.dlpay.api.service.SourceTypeService
 import com.supwisdom.dlpay.api.service.TransactionService
 import com.supwisdom.dlpay.exception.TransactionCheckException
@@ -17,8 +15,6 @@
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
 import java.sql.SQLException
 import java.sql.Timestamp
 import kotlin.math.absoluteValue
@@ -36,9 +32,6 @@
     private lateinit var transactionMainDao: TransactionMainDao
 
     @Autowired
-    private lateinit var persondtlDao: PersondtlDao
-
-    @Autowired
     private lateinit var accountService: AccountService
 
     @Autowired
@@ -64,7 +57,7 @@
                 accdate = systemUtilService.accdate
                 outTradeNo = builder.outtradeno
                 outId = builder.outId
-                createTime = Timestamp(systemUtilService.sysdatetime.sysdate.time)
+                createTime = systemUtilService.sysdatetime.sysdate
                 operid = builder.operId
                 opertype = builder.operType
                 reverseFlag = builder.tradeType
@@ -310,7 +303,7 @@
         if (transaction.shop) {
             transaction.shopDtl.remark = remark
         }
-        transaction.endTime = systemUtilService.sysdatetime.currentTimestamp
+        transaction.endTime = systemUtilService.sysdatetime.sysdate
         transactionMainDao.save(transaction)
         return transaction
     }
@@ -327,7 +320,7 @@
         transaction.accdate = systemUtilService.accdate
         transactionOnSuccess(transaction, remark, false)
 
-        transaction.endTime = systemUtilService.sysdatetime.currentTimestamp
+        transaction.endTime = systemUtilService.sysdatetime.sysdate
         transactionMainDao.save(transaction)
         return transaction
     }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
index 1049c26..7c5f900 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -69,7 +69,7 @@
                 lowfreeLimit = lowfreeLimit
                 daylimit = daylimit
                 maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT)
-                lasttranstime = systemdatetime.currentTimestamp
+                lasttranstime = systemdatetime.sysdate
                 lastdayTransamt = 0.0
                 lastdayDpsamt = 0.0
                 opendate = systemdatetime.hostdate
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index 223a12b..48e9e29 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -1,68 +1,71 @@
 package com.supwisdom.dlpay.api.service
 
-import com.supwisdom.dlpay.ShopAccBalanceAsyncTask
+import com.supwisdom.dlpay.api.ShopAccBalanceAsyncTask
 import com.supwisdom.dlpay.api.TransactionBuilder
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Component
+import org.springframework.stereotype.Service
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
 interface TransactionService {
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun init(builder: TransactionBuilder): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun wip(refno: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun wip(builder: TransactionBuilder): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun fail(refno: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun fail(refno: String, remark: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun success(refno: String, remark: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun success(refno: String): TTransactionMain
 
     // 撤销接口冲正类接口
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun reverse(originRefno: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun reverseInit(originRefno: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun reverseConfirm(refno: String): TTransactionMain
 
+    @Transactional
     fun reverseFail(refno: String): TTransactionMain
 
     // 冲正类接口
     /**
      * 冲正业务
      */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun cancel(originRefno: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun cancelInit(originRefno: String): TTransactionMain
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun cancelConfirm(refno: String): TTransactionMain
 
+    @Transactional
     fun cancelFail(refno: String): TTransactionMain
 
     // 补帐接口
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+    @Transactional
     fun repair(refno: String, remark: String): TTransactionMain
 }
 
-@Component
+@Service
 class TransactionServiceProxy {
     @Autowired
     private lateinit var transactionService: TransactionService
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 4c33b78..a4d11c5 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -23,6 +23,9 @@
 spring.thymeleaf.cache=false
 spring.thymeleaf.enabled=true
 
+##################################################
+## quartz task scheduler
+shopbalance.updater.cron = 10/* * * * *
 ################################################
 # user password
 auth.password.bcrypt.length=10