From: Tang Cheng Date: Thu, 23 May 2019 01:40:32 +0000 (+0800) Subject: 优化记账接口 X-Git-Tag: 1.0.0^2~200 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=b2c7cce9121c83faf00758a2c98d8dcd7e2e5d62;p=epayment%2Ffood_payapi.git 优化记账接口 --- diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java index 376b528a..bb52bba6 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java @@ -72,7 +72,7 @@ public class TPersondtl { private Double reverseAmount = 0D; //撤销金额填写 @Column(name = "TRADEFLAG", nullable = false, length = 10) - private String tradeflag; //deposit-充值;pay-消费 + private String tradeflag; // out - 支出,in - 收入 @Column(name = "REMARK", length = 240) private String remark; diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java index 14dcb5d4..d65da130 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java @@ -39,8 +39,11 @@ public class TShopdtl { @Column(name = "payinfo", length = 200) private String payInfo; - @Column(name = "tradeflag", length = 6) - private String tradeflag; + @Column(name = "tradeflag", length = 6, nullable = false) + private String tradeflag; // out - 支出 , in - 收入 + + @Column(name = "TRANSDESC", length = 240) + private String transdesc; //交易描述 @Column(name = "status", length = 20) private String status; @@ -51,6 +54,9 @@ public class TShopdtl { @Column(name = "OPPOSITEACCNAME", length = 200) private String oppositeAccName; + @Column(name = "REMARK", length = 240) + private String remark; + public String getRefno() { return refno; } @@ -162,4 +168,20 @@ public class TShopdtl { public void setTradeflag(String tradeflag) { this.tradeflag = tradeflag; } + + public String getTransdesc() { + return transdesc; + } + + public void setTransdesc(String transdesc) { + this.transdesc = transdesc; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } } diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java index 6c7507d2..78983aee 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java @@ -1,7 +1,5 @@ package com.supwisdom.dlpay.api.domain; -import com.supwisdom.dlpay.framework.domain.TSubject; - import javax.persistence.*; import java.sql.Timestamp; @@ -185,4 +183,37 @@ public class TTransactionMain { public void setEndTime(Timestamp endTime) { this.endTime = endTime; } + + public Double sumAmountByAccno(String accno, String subjno, + int balanceFlag, String debitOrCredit) { + Double debitSum = 0.0; + Double creditSum = 0.0; + for (TDebitCreditDtl dtl : getDetails()) { + if (dtl.getDraccno().equals(accno) && dtl.getDrsubjno().equals(subjno)) { + debitSum += dtl.getAmount(); + } + if (dtl.getCraccno().equals(accno) && dtl.getCrsubjno().equals(subjno)) { + creditSum += dtl.getAmount(); + } + } + if ("debit".equals(debitOrCredit)) { + if (balanceFlag == 2) { + return -debitSum; + } else { + return debitSum; + } + } else if ("credit".equals(debitOrCredit)) { + if (balanceFlag == 1) { + return -creditSum; + } else { + return creditSum; + } + } else { + if (balanceFlag == 2) { + return -(debitSum - creditSum); + } else { + return debitSum - creditSum; + } + } + } } diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java b/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java index 402a9b42..14fc1d7d 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java @@ -9,7 +9,7 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; -public class APIRequestParam { +public abstract class APIRequestParam { @Sign private String sign; @Sign @@ -97,4 +97,6 @@ public class APIRequestParam { } return calcSignAndCheck(paramMap,key); } + + public abstract boolean checkParam(); } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt index f96ba95c..f47651df 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt @@ -1,22 +1,27 @@ package com.supwisdom.dlpay.api import com.supwisdom.dlpay.framework.ResponseBodyBuilder +import com.supwisdom.dlpay.framework.util.APIRequestParam import com.supwisdom.dlpay.framework.util.TradeErrorCode -import org.aspectj.lang.JoinPoint +import mu.KotlinLogging +import org.aspectj.lang.ProceedingJoinPoint +import org.aspectj.lang.annotation.Around import org.aspectj.lang.annotation.Aspect -import org.aspectj.lang.annotation.Before import org.aspectj.lang.annotation.Pointcut import org.springframework.http.ResponseEntity import org.springframework.stereotype.Component import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.RestControllerAdvice +import javax.servlet.http.HttpServletRequest -@RestControllerAdvice +@RestControllerAdvice("com.supwisdom.dlpay.api") class RestControllerAdvice { + val logger = KotlinLogging.logger { } @ExceptionHandler - fun handleException(ex: Exception): ResponseEntity { + fun handleException(ex: Exception, request: HttpServletRequest): ResponseEntity { + logger.error { "Request unhandler exception, url<${request.requestURI}>, ex<${ex.cause}>" } return ResponseEntity.ok().body(ResponseBodyBuilder.create() .exception(TradeErrorCode.BUSINESS_DEAL_ERROR, ex.cause)) } @@ -26,14 +31,29 @@ class RestControllerAdvice { @Aspect class RestControllerAspect { - @Pointcut("execution( * com.supwisdom.dlpay.api..*(..))") - private fun beforeRequest() { + private val logger = KotlinLogging.logger { } + + @Pointcut("@within(org.springframework.web.bind.annotation.RestController)") + fun restcontroller() { + } + + @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)") + fun postmapping() { } - @Before("beforeRequest()") - fun check(point: JoinPoint) { - point.args.forEach { - println("request : $it") + @Around("restcontroller() && postmapping() && args(.., @RequestBody body)") + @Throws(Throwable::class) + fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any): Any { + return try { + if (body is APIRequestParam) { + body.checkParam() + } + val result = joinPoint.proceed() + logger.debug(result.toString()) + result + } catch (t: Throwable) { + logger.error { "request error , ex<${t.message}>" } + throw t } } } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt index f498fee8..6e067569 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt @@ -27,7 +27,7 @@ class OpenUserParam : APIRequestParam() { @Sign var zipcode: String? = null - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空") if (StringUtil.isEmpty(name)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "姓名不能为空") if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]") @@ -47,7 +47,7 @@ class QueryUserParam : APIRequestParam() { @Sign var uid: String? = null // 用户ID二选一 - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空") return true @@ -78,7 +78,7 @@ class ModifyUserParam : APIRequestParam() { @Sign var zipcode: String? = null - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空") if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]") if (!StringUtil.isEmpty(idtype) && !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件类型非法") @@ -118,7 +118,7 @@ class OpenShopParam : APIRequestParam() { @Sign var zipcode: String? = null - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(shopUniqueId)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一号不能为空") if (ConstantUtil.SHOPTYPE_GROUP != shoptype && ConstantUtil.SHOPTYPE_LEAF != shoptype) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定商户类型") if (StringUtil.isEmpty(shopname)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户名称不能为空") @@ -140,7 +140,7 @@ class QueryShopParam : APIRequestParam() { @Sign var shopUniqueId: String? = null //注册传的商户唯一号 - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(shopUniqueId) && null == shopid && StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一标志不能为空") return true @@ -166,7 +166,7 @@ class QueryDtlResultParam : APIRequestParam() { @Sign var shopaccno: String?=null - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水唯一号不能为空") return true @@ -189,7 +189,7 @@ class CitizenCardPayinitParam : APIRequestParam() { @Sign var transtime: String = "" //必传 - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(cardNo)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "卡唯一号不能为空") if (StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户") if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零") @@ -205,7 +205,7 @@ class CitizenCardPayfinishParam : APIRequestParam() { @Sign var refno:String="" - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易参考号不能为空") return true @@ -234,7 +234,7 @@ class YktCardPayinitParam : APIRequestParam() { @Sign var devphyid: String? = null - fun checkParam(): Boolean { + override fun checkParam(): Boolean { if (StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户") if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零") diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt index 873aa8f8..eb124dda 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt @@ -4,6 +4,7 @@ import com.supwisdom.dlpay.api.AccountProxy import com.supwisdom.dlpay.api.CallService import com.supwisdom.dlpay.api.TransactionBuilder import com.supwisdom.dlpay.api.bean.* +import com.supwisdom.dlpay.api.dao.TransactionMainDao import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.service.AccountUtilServcie import com.supwisdom.dlpay.api.service.ConsumePayService @@ -41,6 +42,9 @@ class ConsumeController { @Autowired lateinit var commonService: CommonService + @Autowired + lateinit var transactionMainDao: TransactionMainDao + @Autowired lateinit var transactionService: TransactionService @@ -55,27 +59,26 @@ class ConsumeController { .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } -// val dtl = if (StringUtil.isEmpty(param.refno)) { -// personBalancePayService.getUserdtlForUpdateNowait(param.refno!!) -// } else { -// personBalancePayService.getUserdtlByBillnoForUpdateNowait(param.billno!!, param.shopaccno!!) -// } -// val dtl = if( param.refno.isNullOrEmpty()) { -// transactionService. -// } -// val person = dtl.userid?.let { userService.findPersonByUserid(dtl.userid) } -// return ResponseEntity.ok(ResponseBodyBuilder.create() -// .data("refno", dtl.refno) -// .data("amount", dtl.amount) -// .data("paytype", dtl.paytype) -// .data("payinfo", dtl.payinfo) -// .also { -// if (null != person) { -// it.data("name", person.name) -// } -// } -// .success("查询成功")) - TODO("未实现功能") + val dtl = transactionMainDao.findByRefnoForUpdate(param.refno) + ?: return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号错误<${param.refno}>")) + + val person = if (dtl.person) { + userService.findPersonByUserid(dtl.personDtl.userid) + } else { + null + } + return ResponseEntity.ok(ResponseBodyBuilder.create() + .data("refno", dtl.refno) + .data("amount", dtl.personDtl.amount) + .data("paytype", dtl.personDtl.paytype) + .data("payinfo", dtl.personDtl.payinfo) + .also { + if (null != person) { + it.data("name", person.name) + } + } + .success("查询成功")) } catch (ex: RequestParamCheckException) { return ResponseEntity.ok(ResponseBodyBuilder.create() .requestException(ex, "请求参数错误")) @@ -83,7 +86,6 @@ class ConsumeController { return ResponseEntity.ok(ResponseBodyBuilder.create() .transException(et, "查询错误")) } - } private fun consumeMealer(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam, @@ -151,15 +153,18 @@ class ConsumeController { transTime = param.transtime paytype = TradeDict.PAYTYPE_BALANCE transCode = TradeCode.TRANSCODE_BALANCE_PAY + payinfo = "账户余额消费" + outId = shopacc.shopaccno + outtradeno = param.billno }.person(account).apply { - description = "账户余额支付" - summary = "账户余额消费" + description = "账户余额消费" amount = param.amount / 100.0 opposite = AccountProxy(shopacc) + tradeOut() }.and().shop(shopacc).apply { - summary = "账户余额消费" amount = param.amount / 100.0 opposite = AccountProxy(account) + tradeIn() }.and() param.feelist?.forEach { @@ -222,18 +227,16 @@ class ConsumeController { transTime = param.transtime paytype = TradeDict.PAYTYPE_CITIZEN_CARD payinfo = "市民卡代扣消费" + description = "市民卡代扣消费" outId = shopacc.shopaccno outtradeno = param.billno }.person(account).apply { amount = param.amount / 100.0 opposite = AccountProxy(shopacc) - description = "市民卡代扣消费" - summary = "市民卡代扣消费" tradeOut() }.and().shop(shopacc).apply { amount = param.amount / 100.0 opposite = AccountProxy(account) - summary = "市民卡代扣消费" tradeIn() }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account), param.amount / 100.0, "市民卡代扣消费") @@ -316,12 +319,12 @@ class ConsumeController { * ============================================================================ * */ @PostMapping("/ykt/payinit") - fun yktPayInit(@RequestBody param: YktCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { + fun yktPayInit(@RequestBody param: YktCardPayinitParam, authentication: Authentication): ResponseEntity { try { -// if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { -// return ResponseEntity.ok(ResponseBodyBuilder.create() -// .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) -// } + if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) { + return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) + } // // val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } //没注册,可能匿名? // if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person == null)) { @@ -376,9 +379,9 @@ class ConsumeController { * ============================================================================ * */ @PostMapping("/ykt/payfinish") - fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { + fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity { try { - if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { + if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) { return ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } 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 ac98e143..a0777971 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 @@ -9,6 +9,7 @@ import com.supwisdom.dlpay.api.service.TransactionService import com.supwisdom.dlpay.exception.TransactionCheckException import com.supwisdom.dlpay.exception.TransactionProcessException import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.dlpay.framework.util.Subject import com.supwisdom.dlpay.framework.util.TradeDict import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired @@ -20,6 +21,11 @@ import java.sql.Timestamp @Service class TransactionServiceImpl : TransactionService { + companion object { + val PERSON_BALANCE_FLAG = 2 + val SHOP_BALANCE_FLAG = 2 + } + @Autowired lateinit var transactionMainDao: TransactionMainDao @@ -122,7 +128,6 @@ class TransactionServiceImpl : TransactionService { createTime = Timestamp(systemUtilService.sysdatetime.sysdate.time) } - if (builder.hasPerson()) { TPersondtl().apply { this.refno = transaction.refno @@ -147,6 +152,7 @@ class TransactionServiceImpl : TransactionService { oppositeAccNo = builder.person().opposite.getAccountNo() oppositeAccName = builder.person().opposite.getAccountName() reverseFlag = builder.reverseFlag + remark = builder.person().remark this.status = status }.also { // save persondtl @@ -173,8 +179,10 @@ class TransactionServiceImpl : TransactionService { this.tradeflag = builder.shop().tradeFlag() this.shopaccno = builder.shop().shopacc.shopaccno this.shopname = builder.shop().shopacc.shopname + this.transdesc = builder.shop().description this.oppositeAccNo = builder.shop().opposite.getAccountNo() this.oppositeAccName = builder.shop().opposite.getAccountName() + this.remark = builder.shop().remark this.status = status }.also { // save shopdtl @@ -221,8 +229,9 @@ class TransactionServiceImpl : TransactionService { if (builder.hasPerson()) { val dc = getDebitOrCredit(builder.person().tradeFlag()) - sumBalanceFromDetails(transaction.details, builder.person().person.accno, - builder.person().person.subjno, 2, dc).also { + transaction.sumAmountByAccno(builder.person().person.accno, + Subject.SUBJNO_PERSONAL_DEPOSIT, + PERSON_BALANCE_FLAG, dc).also { if (transaction.personDtl.amount != it) { throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "输入金额错误,个人余额不符<${transaction.personDtl.amount}>") @@ -232,8 +241,9 @@ class TransactionServiceImpl : TransactionService { if (builder.hasShop()) { val dc = getDebitOrCredit(builder.shop().tradeFlag()) - sumBalanceFromDetails(transaction.details, builder.shop().shopacc.shopaccno, - builder.shop().shopacc.subjno, 2, dc).also { + transaction.sumAmountByAccno(builder.shop().shopacc.shopaccno, + Subject.SUBJNO_MACHANT_INCOME, + SHOP_BALANCE_FLAG, dc).also { if (transaction.shopDtl.amount != it) { throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "输入金额错误,商户余额不符<${transaction.shopDtl.amount}>") @@ -242,8 +252,8 @@ class TransactionServiceImpl : TransactionService { } if (builder.hasSubject()) { - sumBalanceFromDetails(transaction.details, builder.subject().subject.subjno, - transaction.subjectDtl.subjectno, + transaction.sumAmountByAccno(builder.subject().subject.subjno, + builder.subject().subject.subjno, builder.subject().subject.balflag, "both").also { if (transaction.subjectDtl.amount != it) { @@ -277,38 +287,6 @@ class TransactionServiceImpl : TransactionService { return builderRecords(builder, TradeDict.DTL_STATUS_WIP) } - private fun sumBalanceFromDetails(details: List, - accno: String, subjno: String, - balanceFlag: Int, - debitOrCredit: String = "debit"): Double { - - val debitAmount = details.sumByDouble { line -> - if (line.drsubjno == subjno && line.draccno == accno) { - line.amount - } else { - 0.0 - } - } - val creditAmount = details.sumByDouble { line -> - if (line.crsubjno == subjno && line.craccno == accno) { - line.amount - } else { - 0.0 - } - } - return when (debitOrCredit) { - "debit" -> { - if (balanceFlag == 2) debitAmount * -1.0 else debitAmount - } - "credit" -> { - if (balanceFlag == 2) creditAmount else creditAmount * -1.0 - } - "both" -> creditAmount - debitAmount - else -> throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, - "结算借贷方向余额错误") - } - } - private fun updateRecordStatus(transaction: TTransactionMain, status: String) { if (transaction.person) { transaction.personDtl?.also { @@ -387,25 +365,35 @@ class TransactionServiceImpl : TransactionService { transaction.accdate = systemUtilService.accdate if (transaction.person) { // update account balance - transaction.personDtl?.let { - if (accountRepository.recalcAccountBalance(it, it.amount, false) != 1) { - throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, - "个人账户交易冲突") - } - transaction.personDtl.accdate = transaction.accdate - } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, - "个人流水<${transaction.refno}>不存在") + val amount = transaction.sumAmountByAccno( + transaction.personDtl.accountNo, Subject.SUBJNO_PERSONAL_DEPOSIT, + PERSON_BALANCE_FLAG, "both") + if (amount.compareTo(0.0) != 0) { + transaction.personDtl?.let { + if (accountRepository.recalcAccountBalance(it, amount, false) != 1) { + throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, + "个人账户交易冲突") + } + transaction.personDtl.accdate = transaction.accdate + } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, + "个人流水<${transaction.refno}>不存在") + } transaction.personDtl.status = TradeDict.DTL_STATUS_SUCCESS } if (transaction.shop) { // update shop balance - transaction.shopDtl?.let { - if (shopaccRepository.recalcShopBalance(it, it.amount, false) != 1) { - throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, - "商户账户交易冲突") - } - } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, - "商户流水<${transaction.refno}>不存在") + val amount = transaction.sumAmountByAccno( + transaction.shopDtl.shopaccno, Subject.SUBJNO_MACHANT_INCOME, + SHOP_BALANCE_FLAG, "both") + if (amount.compareTo(0.0) != 0) { + transaction.shopDtl?.let { + if (shopaccRepository.recalcShopBalance(it, it.amount, false) != 1) { + throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY, + "商户账户交易冲突") + } + } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, + "商户流水<${transaction.refno}>不存在") + } transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS transaction.shopDtl.accdate = transaction.accdate } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt index 40abd488..7dd9f806 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt @@ -22,6 +22,15 @@ open class SubTransactionBuilder(val parent: TransactionBuilder) { return if (field.isEmpty()) parent.payinfo else field } + var description: String = "" + get() { + return if (field.isEmpty()) parent.description else field + } + + var remark: String = "" + get() { + return if (field.isEmpty()) parent.remark else field + } lateinit var opposite: AccountProxy<*> @@ -55,22 +64,16 @@ open class SubTransactionBuilder(val parent: TransactionBuilder) { class PersonTranactionBuilder(parent: TransactionBuilder, val person: TAccount) : SubTransactionBuilder(parent) { var amount: Double = 0.0 - var summary: String = "" - var description: String = "" - } class ShopTransactionBuilder(parent: TransactionBuilder, val shopacc: TShopacc) : SubTransactionBuilder(parent) { var amount: Double = 0.0 - var summary: String = "" } class SubjectTransactionBuilder(parent: TransactionBuilder, val subject: TSubject) : SubTransactionBuilder(parent) { var amount: Double = 0.0 - var summary: String = "" - } class AccountProxy(private val accountObj: T) { @@ -130,6 +133,8 @@ class TransactionBuilder { var outtradeno: String = "" //第三方流水号 var outId: String = "" var reverseFlag: String = "none" + var description: String = "" + var remark: String = "" fun person(): PersonTranactionBuilder { return this.personBuilder