jwt.expiration=3600
# user password
auth.password.bcrypt.seed=
+
+##################################################
+## quartz task scheduler
+shopbalance.updater.cron = -
\ No newline at end of file
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
@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)
private Double amount;
@Version
- @Column(name = "update_time", nullable = false)
+ @Column(name = "update_time")
private Timestamp updateTime;
@Column(name = "lastRefno", nullable = false, length = 32)
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);
}
package com.supwisdom.dlpay.framework.data;
import java.sql.Timestamp;
-import java.util.Date;
public interface SystemDateTime {
String getHostdate();
String getHostdatetime();
- Date getSysdate();
+ Timestamp getSysdate();
- Timestamp getCurrentTimestamp();
}
/**
* 取数据库日期
- * */
+ */
+ @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();
/**
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
TBusinesspara getBusinessValueForUpdateNowait(String parakey);
+
/********************** 获取【系统参数】【业务参数】通用方法 **********************/
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数据库时间
*/
-package com.supwisdom.dlpay
+package com.supwisdom.dlpay.api
import com.supwisdom.dlpay.api.repositories.ShopaccService
import mu.KotlinLogging
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 -> {
// 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)
shopaccService.recalcShopBalance(dtl.refno, true)
}
- @Scheduled(fixedRate = 5000)
+ @Scheduled(cron = "\${jobs.cronSchedule:-}")
fun dealShopUnupdatedDtl() {
shopaccService.findUnupdatedShopDtl(100).forEach {
doShopBlanceUpdate(it)
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 fun newAccounDayBal(dtl: TPersondtl, account: TAccount) = TAccountDayBal().apply {
- accno = account.accno
- accdate = dtl.accdate
- amount = 0.0
- checked = false
+ private lateinit var systemUtilServcie: SystemUtilService
+
+ 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 {
account.balance += dtl.amount
val sameDay = DateUtil.sameDay(account.lasttranstime,
- systemUtilServcie.sysdatetime.currentTimestamp) ?: false
+ systemUtilServcie.sysdatetime.sysdate) ?: false
if (!sameDay) {
account.lastdayTransamt = 0.0
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
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
@Autowired
private lateinit var transactionMainDao: TransactionMainDao
- @Autowired
- private lateinit var persondtlDao: PersondtlDao
-
@Autowired
private lateinit var accountService: AccountService
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
if (transaction.shop) {
transaction.shopDtl.remark = remark
}
- transaction.endTime = systemUtilService.sysdatetime.currentTimestamp
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
transactionMainDao.save(transaction)
return transaction
}
transaction.accdate = systemUtilService.accdate
transactionOnSuccess(transaction, remark, false)
- transaction.endTime = systemUtilService.sysdatetime.currentTimestamp
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
transactionMainDao.save(transaction)
return transaction
}
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
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
spring.thymeleaf.cache=false
spring.thymeleaf.enabled=true
+##################################################
+## quartz task scheduler
+shopbalance.updater.cron = 10/* * * * *
################################################
# user password
auth.password.bcrypt.length=10