From: Tang Cheng Date: Mon, 24 Jun 2019 03:27:11 +0000 (+0800) Subject: refactor: 优化参数名 X-Git-Tag: 1.0.0^2~153 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=a49d4fcf5dfab1d30e979ef05d215a58d542de75;p=epayment%2Ffood_payapi.git refactor: 优化参数名 --- 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 cc1b9c75..25fc46c5 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java @@ -2,6 +2,7 @@ package com.supwisdom.dlpay.api.domain; import com.supwisdom.dlpay.framework.util.MD5; import com.supwisdom.dlpay.framework.util.MoneyUtil; +import com.supwisdom.dlpay.framework.util.TradeDict; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @@ -11,7 +12,7 @@ import java.sql.Timestamp; @Entity @Table(name = "TB_ACCOUNT", indexes = {@Index(name = "acc_userid_idx", columnList = "userid"), - @Index(name = "acc_status_idx", columnList = "status"), + @Index(name = "acc_status_idx", columnList = "transStatus"), @Index(name = "acc_subjno_uk", unique = true, columnList = "subjno,userid")}) public class TAccount implements Serializable { @Id @@ -29,8 +30,8 @@ public class TAccount implements Serializable { @Column(name = "USERID", nullable = false, length = 32) private String userid; //用户ID - @Column(name = "STATUS", nullable = false, length = 20) - private String status; //状态:normal-正常;closed-注销;locked-冻结 + @Column(name = "TRANS_STATUS", nullable = false, length = 20) + private String transStatus = TradeDict.STATUS_NORMAL; //状态:normal-正常;closed-注销;locked-冻结 @Column(name = "BALANCE", nullable = false, precision = 15, scale = 2) private Double balance; //总余额 @@ -79,11 +80,11 @@ public class TAccount implements Serializable { public TAccount() { } - public TAccount(String accname, String subjno, String userid, String status, Double balance, Double availbal, Double frozebal, Boolean lowfreeFlag, Double lowfreeLimit, Double daylimit, Double maxbal, Timestamp lasttranstime, Double lastdayTransamt, Double lastdayDpsamt, String tac, String opendate, String closedate) { + public TAccount(String accname, String subjno, String userid, String transStatus, Double balance, Double availbal, Double frozebal, Boolean lowfreeFlag, Double lowfreeLimit, Double daylimit, Double maxbal, Timestamp lasttranstime, Double lastdayTransamt, Double lastdayDpsamt, String tac, String opendate, String closedate) { this.accname = accname; this.subjno = subjno; this.userid = userid; - this.status = status; + this.transStatus = transStatus; this.balance = balance; this.availbal = availbal; this.frozebal = frozebal; @@ -131,12 +132,12 @@ public class TAccount implements Serializable { this.userid = userid; } - public String getStatus() { - return status; + public String getTransStatus() { + return transStatus; } - public void setStatus(String status) { - this.status = status; + public void setTransStatus(String transStatus) { + this.transStatus = transStatus; } public Double getBalance() { 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 d132e794..54591d4b 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java @@ -1,5 +1,7 @@ package com.supwisdom.dlpay.api.domain; +import com.supwisdom.dlpay.framework.util.TradeDict; + import javax.persistence.*; @Entity @@ -33,7 +35,7 @@ public class TPersondtl { private String transtime; @Column(name = "STATUS", length = 20, nullable = false) - private String status; + private String status = TradeDict.DTL_STATUS_NONE; @Column(name = "BEFBAL", precision = 9, scale = 2) private Double befbal; 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 604e7f58..e351fea4 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java @@ -1,6 +1,7 @@ package com.supwisdom.dlpay.api.domain; import com.supwisdom.dlpay.framework.util.Subject; +import com.supwisdom.dlpay.framework.util.TradeDict; import javax.persistence.*; @@ -29,6 +30,9 @@ public class TTransactionMain { @Column(name = "checkdate", length = 8) private String checkDate; + @Column(name = "transcode") + private Integer transCode; + @Column(name = "person") private Boolean person = false; @@ -39,7 +43,7 @@ public class TTransactionMain { private Boolean subject = false; @Column(name = "status", length = 20) - private String status = "none"; + private String status = TradeDict.DTL_STATUS_NONE; @Column(name = "sourcetype", length = 20) private String sourceType = ""; @@ -65,8 +69,18 @@ public class TTransactionMain { @Column(name = "end_time") private Timestamp endTime; + @Column(name = "reverse_type", nullable = false) + private String reverseType = TradeDict.REVERSE_FLAG_NONE; // 流水标识, none - 正常交易流水, cancel - 撤销流水, refund - 退款流水 + + // 撤销、退款原流水参考号 + @Column(name = "reverse_refno") + private String reverseRefno = ""; + @Column(name = "reverse_flag", nullable = false, length = 10) - private String reverseFlag = "none"; // 冲正标识, none - 未冲正, refund - 被退款, cancel - 被冲正 + private String reverseFlag = TradeDict.REVERSE_FLAG_NONE; // 冲正标识, none - 未冲正, refund - 被退款, cancel - 被冲正 + + @Column(name = "refund_amount", nullable = false) + private Double refundAmount = 0.0; @OneToOne(targetEntity = TPersondtl.class, fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "refno", referencedColumnName = "refno") @@ -253,6 +267,38 @@ public class TTransactionMain { this.sourceType = sourceType; } + public Integer getTransCode() { + return transCode; + } + + public void setTransCode(Integer transCode) { + this.transCode = transCode; + } + + public String getReverseType() { + return reverseType; + } + + public void setReverseType(String reverseType) { + this.reverseType = reverseType; + } + + public String getReverseRefno() { + return reverseRefno; + } + + public void setReverseRefno(String reverseRefno) { + this.reverseRefno = reverseRefno; + } + + public Double getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Double refundAmount) { + this.refundAmount = refundAmount; + } + public Double sumAmountByAccno(String accno, String subjno, String debitOrCredit) { Double debitSum = 0.0; diff --git a/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java b/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java index bfa90470..16e429ab 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java +++ b/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java @@ -48,7 +48,7 @@ public class ValidateCodeFilter extends OncePerRequestFilter{ try { validate(request); } catch (ValidateCodeException e) { - //response.setStatus(HttpStatus.OK.value()); + //response.setTransStatus(HttpStatus.OK.value()); //response.setContentType("application/json;charset=UTF-8"); //response.getWriter().write(objectMapper.writeValueAsString(JsonResult.error(400, e.getMessage()))); //response.sendError(HttpStatus.UNAUTHORIZED.value(),e.getMessage()); diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java b/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java index e090b632..f18d092f 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java +++ b/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java @@ -39,7 +39,7 @@ public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailu } setDefaultFailureUrl("/login"); super.onAuthenticationFailure(request, response, new ValidateCodeException(errmsg)); - /*response.setStatus(HttpStatus.OK.value()); + /*response.setTransStatus(HttpStatus.OK.value()); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(JsonResult.error(400, errmsg)));*/ } diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java index 06def11a..1d7b899d 100644 --- a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java +++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java @@ -104,7 +104,7 @@ public class UserDataServiceImpl implements UserDataService { account.setAccname(person.getName()); account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT); account.setUserid(person.getUserid()); - account.setStatus(person.getStatus()); + account.setTransStatus(person.getStatus()); account.setBalance(0.0); account.setAvailbal(0.0); account.setFrozebal(0.0); @@ -123,7 +123,7 @@ public class UserDataServiceImpl implements UserDataService { public JsonResult deleteUser(String userid) { TAccount account = accountDao.findByUserid(userid); if (account != null) { - if (!TradeDict.STATUS_CLOSED.equals(account.getStatus()) && account.getBalance() != 0) { + if (!TradeDict.STATUS_CLOSED.equals(account.getTransStatus()) && account.getBalance() != 0) { return JsonResult.error("该用户账户未注销且余额不为0,无法删除"); } else { accountDao.delete(account); @@ -146,7 +146,7 @@ public class UserDataServiceImpl implements UserDataService { Optional opt = accountDao.findById(accno); if (opt.isPresent()) { TAccount acc = opt.get(); - acc.setStatus(TradeDict.STATUS_CLOSED); + acc.setTransStatus(TradeDict.STATUS_CLOSED); accountDao.save(acc); return JsonResult.ok("操作成功"); } else { 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 cff556be..447a3f24 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 @@ -160,11 +160,11 @@ class ConsumeFeetype { class QueryDtlResultParam : APIRequestParam() { @Sign - var refno:String?=null //二选一 + var refno: String? = null //二选一 @Sign - var billno:String?=null //二选一 (billno+shopaccno) ä¼ billno时,shopaccno必传 + var billno: String? = null //二选一 (billno+shopaccno) ä¼ billno时,shopaccno必传 @Sign - var shopaccno: String?=null + var shopaccno: String? = null override fun checkParam(): Boolean { if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水唯一号不能为空") @@ -203,7 +203,7 @@ class CitizenCardPayinitParam : APIRequestParam() { class CitizenCardPayfinishParam : APIRequestParam() { @Sign - var refno:String="" + var refno: String = "" override fun checkParam(): Boolean { if (StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易参考号不能为空") @@ -242,7 +242,7 @@ class YktCardPayinitParam : APIRequestParam() { if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]") if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]") if (StringUtil.isEmpty(stuempno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通唯一号不能为空") - if(!StringUtil.isEmpty(yktshopid) && !NumberUtil.isDigits(yktshopid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通商户号非整数") + if (!StringUtil.isEmpty(yktshopid) && !NumberUtil.isDigits(yktshopid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通商户号非整数") return true } @@ -250,13 +250,13 @@ class YktCardPayinitParam : APIRequestParam() { class ConsumePayCancelParam : APIRequestParam() { @Sign - var refno:String? = null //流水号 + var refno: String? = null //流水号 @Sign - var billno:String?=null //订单号 + var billno: String? = null //订单号 @Sign - var shopaccno:String?=null //商户号 + var shopaccno: String? = null //商户号 @Sign - var requestbillno:String="" //退款请求唯一标识 + var requestbillno: String = "" //退款请求唯一标识 @Sign var transdate: String = "" //必传 @Sign @@ -272,6 +272,33 @@ class ConsumePayCancelParam : APIRequestParam() { } } +class ConsumePayRefundParam : APIRequestParam() { + @Sign + var refno: String? = null //流水号 + @Sign + var billno: String? = null //订单号 + @Sign + var shopaccno: String? = null //商户号 + + @Sign + var refundAmount: Int = 0 // 退款金额 + + @Sign + var requestbillno: String = "" //退款请求唯一标识 + @Sign + var transdate: String = "" //必传 + @Sign + var transtime: String = "" //必传 + + override fun checkParam(): Boolean { + if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "原流水唯一号不能为空") + if (StringUtil.isEmpty(requestbillno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "撤销或退款流水号不能为空") + if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]") + if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]") + + return true + } +} // ============================ RECHARGE ============================ // @@ -305,10 +332,10 @@ class CommonRechargeInitParam : APIRequestParam() { class CommonRechargeConfirmParam : APIRequestParam() { @Sign - var refno:String = "" //流水号 + var refno: String = "" //流水号 override fun checkParam(): Boolean { - if(StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水号不能为空") + if (StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水号不能为空") return true } 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 414ad1bc..4530820d 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 @@ -5,15 +5,11 @@ 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 import com.supwisdom.dlpay.api.service.TransactionServiceProxy import com.supwisdom.dlpay.api.service.UserService -import com.supwisdom.dlpay.exception.RequestParamCheckException -import com.supwisdom.dlpay.exception.TransactionException import com.supwisdom.dlpay.framework.ResponseBodyBuilder -import com.supwisdom.dlpay.framework.domain.TShopacc import com.supwisdom.dlpay.framework.service.CommonService import com.supwisdom.dlpay.framework.service.SystemUtilService import com.supwisdom.dlpay.framework.util.Subject @@ -22,13 +18,10 @@ import com.supwisdom.dlpay.framework.util.TradeDict import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity -import org.springframework.security.core.Authentication import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse @RestController @RequestMapping("/api/consume") @@ -41,12 +34,6 @@ class ConsumeAPIController { lateinit var systemUtilService: SystemUtilService @Autowired lateinit var consumePayService: ConsumePayService - @Autowired - lateinit var commonService: CommonService - - @Autowired - lateinit var transactionMainDao: TransactionMainDao - @Autowired lateinit var transactionService: TransactionServiceProxy @@ -252,9 +239,16 @@ class ConsumeAPIController { @PostMapping("/paycancel") fun payCancel(@RequestBody param: ConsumePayCancelParam): ResponseEntity { consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let { + val builder = TransactionBuilder().apply { + setTransInfo(param.transdate, param.transtime, it.transCode, it.sourceType) + setOutTransInfo(it.outId, param.requestbillno) + } + val cancelTrans = builder.cancelInit(it.refno, transactionService) //fixme: 撤销逻辑 - - + if (it.sourceType.isNotEmpty()) { + // 第三方冲正 + } + transactionService.success(cancelTrans.refno) return ResponseEntity.ok(ResponseBodyBuilder.create() .success("交易确认成功")) } ?: return ResponseEntity.ok(ResponseBodyBuilder.create() @@ -267,9 +261,23 @@ class ConsumeAPIController { * ============================================================================ * */ @PostMapping("/payrefund") - fun payRefund(@RequestBody param: ConsumePayCancelParam): ResponseEntity { - return ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "退款逻辑未实现")) + fun payRefund(@RequestBody param: ConsumePayRefundParam): ResponseEntity { + consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let { + val builder = TransactionBuilder().apply { + setTransInfo(param.transdate, param.transtime, it.transCode, it.sourceType) + setOutTransInfo(it.outId, param.requestbillno) + } + val refundTrans = builder.refundInit(it.refno, + param.refundAmount / 100.0, transactionService) + //fixme: 撤销逻辑 + if (it.sourceType.isNotEmpty()) { + // 第三方冲正 + } + transactionService.success(refundTrans.refno) + return ResponseEntity.ok(ResponseBodyBuilder.create() + .success("交易确认成功")) + } ?: return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在")) } /** 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 2c71695e..1f9f468f 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,6 +1,8 @@ package com.supwisdom.dlpay.api.service.impl +import com.supwisdom.dlpay.api.AccountProxy import com.supwisdom.dlpay.api.TransactionBuilder +import com.supwisdom.dlpay.api.dao.AccountDao import com.supwisdom.dlpay.api.dao.TransactionMainDao import com.supwisdom.dlpay.api.domain.* import com.supwisdom.dlpay.api.repositories.AccountService @@ -8,11 +10,12 @@ import com.supwisdom.dlpay.api.service.SourceTypeService import com.supwisdom.dlpay.api.service.TransactionService import com.supwisdom.dlpay.exception.TransactionCheckException import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.dao.ShopaccDao +import com.supwisdom.dlpay.framework.dao.SubjectDao 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.hibernate.Transaction import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service import java.sql.SQLException @@ -27,15 +30,24 @@ class TransactionServiceImpl : TransactionService { @Autowired private lateinit var accountService: AccountService + @Autowired + private lateinit var accountDao: AccountDao + + @Autowired + private lateinit var shopaccDao: ShopaccDao + + @Autowired + private lateinit var subjectDao: SubjectDao + @Autowired private lateinit var systemUtilService: SystemUtilService @Autowired private lateinit var sourceTypeService: SourceTypeService + /// 公共函数部分 private fun preCheck(builder: TransactionBuilder) { builder.preCheck() - } private fun builderRecords(builder: TransactionBuilder, status: String): TTransactionMain { @@ -53,8 +65,11 @@ class TransactionServiceImpl : TransactionService { createTime = systemUtilService.sysdatetime.sysdate operid = builder.operId opertype = builder.operType - reverseFlag = builder.tradeType + reverseFlag = builder.reverseType checkable = sourceType.checkable + transCode = builder.transCode + reverseType = TradeDict.REVERSE_FLAG_NONE + refundAmount = 0.0 checkDate = null settleDate = null this.sourceType = sourceType.sourceType @@ -210,14 +225,6 @@ class TransactionServiceImpl : TransactionService { } } - override fun init(builder: TransactionBuilder): TTransactionMain { - return builderRecords(builder, TradeDict.DTL_STATUS_INIT) - } - - override fun wip(builder: TransactionBuilder): TTransactionMain { - return builderRecords(builder, TradeDict.DTL_STATUS_WIP) - } - private fun updateRecordStatus(transaction: TTransactionMain, status: String) { if (transaction.person) { transaction.personDtl?.also { @@ -254,6 +261,16 @@ class TransactionServiceImpl : TransactionService { transaction.status = status } + ///////////////////////////////////////////////////////////////////// + // 业务接口 + override fun init(builder: TransactionBuilder): TTransactionMain { + return builderRecords(builder, TradeDict.DTL_STATUS_INIT) + } + + override fun wip(builder: TransactionBuilder): TTransactionMain { + return builderRecords(builder, TradeDict.DTL_STATUS_WIP) + } + override fun wip(refno: String): TTransactionMain { val transaction = transactionMainDao.findByRefnoForUpdate(refno) ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误") @@ -272,11 +289,6 @@ class TransactionServiceImpl : TransactionService { return fail(refno, "") } - - override fun success(refno: String): TTransactionMain { - return success(refno, "") - } - override fun fail(refno: String, remark: String): TTransactionMain { val transaction = transactionMainDao.findByRefnoForUpdate(refno) ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误") @@ -298,6 +310,36 @@ class TransactionServiceImpl : TransactionService { return transaction } + ////////////////////////////////////////////////////////////////// + // 成功 + private fun transactionOnSuccess(transaction: TTransactionMain, remark: String, overdraft: Boolean) { + if (transaction.person) { + // update account balance + val amount = transaction.sumAmountByAccno( + transaction.personDtl.accountNo, Subject.SUBJNO_PERSONAL_DEPOSIT, + "both") + if (amount.absoluteValue.compareTo(0.0) != 0) { + transaction.personDtl?.let { + transaction.personDtl.accdate = transaction.accdate + accountService.recalcAccountBalance(it, amount, overdraft) + } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, + "个人流水<${transaction.refno}>不存在") + } + transaction.personDtl.status = TradeDict.DTL_STATUS_SUCCESS + transaction.personDtl.remark = remark + } + if (transaction.shop) { + transaction.shopDtl.updateBala = false + transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS + transaction.shopDtl.accdate = transaction.accdate + transaction.shopDtl.remark = remark + } + + if (transaction.subject) { + // update subject balance + } + } + override fun success(refno: String, remark: String): TTransactionMain { val transaction = transactionMainDao.findByRefnoForUpdate(refno) ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "参考号<$refno>错误,流水不存在") @@ -315,72 +357,86 @@ class TransactionServiceImpl : TransactionService { return transaction } - private fun preCheckRefund(transaction: TTransactionMain, amount: Double) { - - } - - override fun refund(originRefno: String): TTransactionMain { - val originTransation = transactionMainDao.findByRefnoForUpdate(originRefno) - ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, - "退款流水<$originRefno>不存在") - - preCheckRefund(originTransation, 0.0) - TODO("") + override fun success(refno: String): TTransactionMain { + return success(refno, "") } - override fun refundInit(originRefno: String): TTransactionMain { + ////////////////////////////////////////////////////////////////// + // 回退业务接口,包括撤销和退款 + override fun refundInit(originRefno: String, builder: TransactionBuilder): TTransactionMain { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun refundConfirm(refno: String): TTransactionMain { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } + override fun cancelInit(originRefno: String, builder: TransactionBuilder): TTransactionMain { + val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno) + ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS + , "被冲正流水不存在") + if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) { + throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR, + "原流水不是成功状态") + } + if (originTrans.reverseFlag != TradeDict.REVERSE_FLAG_NONE) { + throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR, + "原流水已被冲正") + } - override fun refundFail(refno: String): TTransactionMain { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } + doReversePreCheck(originTrans, builder) - override fun cancel(originRefno: String): TTransactionMain { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } + builder.preCheck() + val transaction = doReverseProcess(originTrans, builder) - override fun cancelInit(originRefno: String): TTransactionMain { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + originTrans.reverseFlag = TradeDict.REVERSE_FLAG_CANCEL + transactionMainDao.save(originTrans) + return transaction } - override fun cancelConfirm(refno: String): TTransactionMain { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + private fun getOppositeTradeFlag(flag: String): String { + return if (flag == TradeDict.TRADE_FLAG_IN) { + TradeDict.TRADE_FLAG_OUT + } else { + TradeDict.TRADE_FLAG_IN + } } - override fun cancelFail(refno: String): TTransactionMain { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } + private fun doReverseProcess(originTrans: TTransactionMain, builder: TransactionBuilder): TTransactionMain { - private fun transactionOnSuccess(transaction: TTransactionMain, remark: String, overdraft: Boolean) { - if (transaction.person) { - // update account balance - val amount = transaction.sumAmountByAccno( - transaction.personDtl.accountNo, Subject.SUBJNO_PERSONAL_DEPOSIT, - "both") - if (amount.absoluteValue.compareTo(0.0) != 0) { - transaction.personDtl?.let { - transaction.personDtl.accdate = transaction.accdate - accountService.recalcAccountBalance(it, amount, overdraft) - } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, - "个人流水<${transaction.refno}>不存在") + if (originTrans.person) { + builder.person().apply { + setAmount(-originTrans.personDtl.amount, getOppositeTradeFlag(originTrans.personDtl.tradeflag)) + opposite = AccountProxy(builder.shop().shopacc) } - transaction.personDtl.status = TradeDict.DTL_STATUS_SUCCESS - transaction.personDtl.remark = remark } - if (transaction.shop) { - transaction.shopDtl.updateBala = false - transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS - transaction.shopDtl.accdate = transaction.accdate - transaction.shopDtl.remark = remark + if (originTrans.shop) { + builder.shop().apply { + setAmount(-originTrans.shopDtl.amount, getOppositeTradeFlag(originTrans.shopDtl.tradeflag)) + opposite = AccountProxy(builder.person().person) + } } + TODO("") +// originTrans.details.forEach { +// builder.addDebitCreditRecord() +// } + } - if (transaction.subject) { - // update subject balance + private fun doReversePreCheck(originTrans: TTransactionMain, builder: TransactionBuilder) { + if (originTrans.person) { + val account = accountDao.findByUserid(originTrans.personDtl.userid) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, + "账户不存在") + builder.person(account) + } + if (originTrans.shop) { + val shopacc = shopaccDao.findByShopaccno(originTrans.shopDtl.shopaccno) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, + "商户不存在") + builder.shop(shopacc) + } + + if (originTrans.subject) { + val subject = subjectDao.findBySubjno(originTrans.subjectDtl.subjectno) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, + "科目不存在") + builder.subject(subject) } } 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 7c5f900d..7d241860 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 @@ -61,7 +61,7 @@ class UserServiceImpl : UserService { accname = person.name subjno = Subject.SUBJNO_PERSONAL_DEPOSIT userid = person.userid - status = person.status + transStatus = person.status balance = 0.0 availbal = 0.0 frozebal = 0.0 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 b53672a3..2eb17528 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 @@ -36,31 +36,13 @@ interface TransactionService { * 退款类业务 */ @Transactional - fun refund(originRefno: String): TTransactionMain - - @Transactional - fun refundInit(originRefno: String): TTransactionMain - - @Transactional - fun refundConfirm(refno: String): TTransactionMain - - @Transactional - fun refundFail(refno: String): TTransactionMain + fun refundInit(originRefno: String, builder: TransactionBuilder): TTransactionMain /** * 撤销业务 */ @Transactional - fun cancel(originRefno: String): TTransactionMain - - @Transactional - fun cancelInit(originRefno: String): TTransactionMain - - @Transactional - fun cancelConfirm(refno: String): TTransactionMain - - @Transactional - fun cancelFail(refno: String): TTransactionMain + fun cancelInit(originRefno: String, builder: TransactionBuilder): TTransactionMain // 补帐接口 @Transactional @@ -94,10 +76,6 @@ class TransactionServiceProxy { return transactionService.wip(refno) } - fun wip(builder: TransactionBuilder): TTransactionMain { - return transactionService.wip(builder) - } - fun fail(refno: String): TTransactionMain { return transactionService.fail(refno) } @@ -118,8 +96,12 @@ class TransactionServiceProxy { return success(refno, "") } - fun cancel(refno: String): TTransactionMain { - TODO("not implementation") + fun cancel(originRefno: String, builder: TransactionBuilder, confirm: Boolean): TTransactionMain { + val trans = transactionService.cancelInit(originRefno, builder) + if (confirm) { + return success(trans.refno) + } + return trans } fun refund(originRefno: String, newRefno: String): TTransactionMain { 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 59c05bb3..45831a55 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt @@ -175,19 +175,9 @@ class TransactionBuilder { return this } - var tradeType: String = "none" + var reverseType: String = "none" private set - fun refund(): TransactionBuilder { - this.tradeType = TradeDict.REVERSE_FLAG_REFUND - return this - } - - fun cancel(): TransactionBuilder { - this.tradeType = TradeDict.REVERSE_FLAG_CANCEL - return this - } - // 以下属性可以在子表中不同 var payinfo: String = "" @@ -260,7 +250,7 @@ class TransactionBuilder { } private fun checkAmount(amount: Double): Boolean { - return if (tradeType == TradeDict.REVERSE_FLAG_NONE) { + return if (reverseType == TradeDict.REVERSE_FLAG_NONE) { amount >= 0.0 } else { amount <= 0.0 @@ -283,7 +273,7 @@ class TransactionBuilder { "交易码错误") } - if (tradeType !in VALID_REVERSEFLAG) { + if (reverseType !in VALID_REVERSEFLAG) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "冲正标志错误") } @@ -300,6 +290,10 @@ class TransactionBuilder { } if (hasPerson()) { person().also { + if (it.person.transStatus != TradeDict.STATUS_NORMAL) { + throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR, + "个人状态错误") + } if (it.tradeFlag !in VALID_TRADEFLAG) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "个人交易收支方向错误") @@ -321,6 +315,10 @@ class TransactionBuilder { if (hasShop()) { shop().also { + if (it.shopacc.status != TradeDict.STATUS_NORMAL) { + throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR, + "商户状态错误") + } if (it.tradeFlag !in VALID_TRADEFLAG) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "商户交易收支方向错误") @@ -341,15 +339,24 @@ class TransactionBuilder { return transactionService.init(this) } - fun wip(transactionService: TransactionServiceProxy): TTransactionMain { - return transactionService.wip(this) + fun refund(originRefno: String, amount: Double, transactionService: TransactionServiceProxy): TTransactionMain { + this.reverseType = TradeDict.REVERSE_FLAG_REFUND + return transactionService.refund(originRefno, "") } - fun cancel(transactionService: TransactionServiceProxy, originRefno: String): TTransactionMain { - TODO("not implement") + fun refundInit(originRefno: String, amount: Double, transactionService: TransactionServiceProxy): TTransactionMain { + this.reverseType = TradeDict.REVERSE_FLAG_REFUND + return transactionService.refund(originRefno, "") } - fun refund(transactionService: TransactionServiceProxy, originRefno: String, amount: Double): TTransactionMain { - TODO("not implement") + fun cancel(originRefno: String, transactionService: TransactionServiceProxy): TTransactionMain { + this.reverseType = TradeDict.REVERSE_FLAG_CANCEL + return transactionService.cancel(originRefno, this, true) } + + fun cancelInit(originRefno: String, transactionService: TransactionServiceProxy): TTransactionMain { + this.reverseType = TradeDict.REVERSE_FLAG_CANCEL + return transactionService.cancel(originRefno, this, false) + } + } diff --git a/src/main/resources/db/migration/V1.0__init_data.sql b/src/main/resources/db/migration/V1.0__init_data.sql index 0d0cc5eb..acc8d097 100644 --- a/src/main/resources/db/migration/V1.0__init_data.sql +++ b/src/main/resources/db/migration/V1.0__init_data.sql @@ -1,7 +1,7 @@ -insert into tb_apiclient(appid, secret, status, roles) +insert into tb_apiclient(appid, secret, transStatus, roles) values ('100001', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal', 'ROLE_THIRD_ADMIN'); INSERT INTO tb_operator( - operid, closedate, opendate, opercode, opername, operpwd, opertype, status) + operid, closedate, opendate, opercode, opername, operpwd, opertype, transStatus) VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal'); INSERT INTO tb_role( diff --git a/src/main/resources/templates/system/dtl/shopdtl.html b/src/main/resources/templates/system/dtl/shopdtl.html index 8cb48e79..536b7d9c 100644 --- a/src/main/resources/templates/system/dtl/shopdtl.html +++ b/src/main/resources/templates/system/dtl/shopdtl.html @@ -45,7 +45,7 @@
- @@ -181,7 +181,7 @@ sourcetype: $("#shopdtl-search-sourcetype").val(), tradeflag: $("#shopdtl-search-tradeflag").val(), transcode: $("#shopdtl-search-transcode").val(), - status: $("#shopdtl-search-status").val() + transStatus: $("#shopdtl-search-transStatus").val() }, page: {curr: 1} }); }); @@ -197,7 +197,7 @@ "sourcetype": "", "tradeflag": "", "transcode": "", - "status": "" + "transStatus": "" }); form.render("select"); treeSelect.revokeNode('shopdtl-search-shopaccno-filter'); @@ -216,17 +216,17 @@ {field: 'shopname', title: '商户名称', align: 'center', width: 250}, {field: 'amount', title: '交易金额', align: 'center', width: 120, sort: true}, { - field: 'status', title: '状态', align: 'center', width: 90, templet: function (item) { - if (item.status == 'init') { + field: 'transStatus', title: '状态', align: 'center', width: 90, templet: function (item) { + if (item.transStatus == 'init') { return '初始化'; - } else if (item.status == 'success') { + } else if (item.transStatus == 'success') { return '成功'; - } else if (item.status == 'fail') { + } else if (item.transStatus == 'fail') { return '失败'; - } else if (item.status == 'wip') { + } else if (item.transStatus == 'wip') { return '待支付'; } else { - return item.status; + return item.transStatus; } } }, diff --git a/src/main/resources/templates/system/dtl/userdtl.html b/src/main/resources/templates/system/dtl/userdtl.html index 943588ed..4291d599 100644 --- a/src/main/resources/templates/system/dtl/userdtl.html +++ b/src/main/resources/templates/system/dtl/userdtl.html @@ -45,7 +45,7 @@
- @@ -147,7 +147,7 @@ sourcetype: $("#userdtl-search-sourcetype").val(), tradeflag: $("#userdtl-search-tradeflag").val(), transcode: $("#userdtl-search-transcode").val(), - status: $("#userdtl-search-status").val() + transStatus: $("#userdtl-search-transStatus").val() }, page: {curr: 1} }); }); @@ -163,7 +163,7 @@ "sourcetype": "", "tradeflag": "", "transcode": "", - "status": "" + "transStatus": "" }); form.render("select"); }); @@ -181,17 +181,17 @@ {field: 'userName', title: '姓名', align: 'center', width: 150}, {field: 'amount', title: '交易金额', align: 'center', width: 120, sort: true}, { - field: 'status', title: '状态', align: 'center', width: 90, templet: function (item) { - if (item.status == 'init') { + field: 'transStatus', title: '状态', align: 'center', width: 90, templet: function (item) { + if (item.transStatus == 'init') { return '初始化'; - } else if (item.status == 'success') { + } else if (item.transStatus == 'success') { return '成功'; - } else if (item.status == 'fail') { + } else if (item.transStatus == 'fail') { return '失败'; - } else if (item.status == 'wip') { + } else if (item.transStatus == 'wip') { return '待支付'; } else { - return item.status; + return item.transStatus; } } }, diff --git a/src/main/resources/templates/system/operator/index.html b/src/main/resources/templates/system/operator/index.html index 6cbcf98e..96ba2bc4 100644 --- a/src/main/resources/templates/system/operator/index.html +++ b/src/main/resources/templates/system/operator/index.html @@ -31,10 +31,10 @@ @@ -64,7 +64,7 @@ {type: 'numbers', fixed: 'left'}, {field: 'opercode', title: '管理员账号', fixed: 'left', sort: true}, {field: 'opername', title: '管理员名称', sort: true}, - {field: 'status', title: '状态', sort: true, width: 100, templet: '#oper-tpl-state'}, + {field: 'transStatus', title: '状态', sort: true, width: 100, templet: '#oper-tpl-state'}, { field: 'sex', title: '性别', sort: true, width: 80, align: 'center', templet: function (item) { if (item.sex == 'male') { diff --git a/src/main/resources/templates/system/param/apiclientpara.html b/src/main/resources/templates/system/param/apiclientpara.html index 4c8e214e..d8292d74 100644 --- a/src/main/resources/templates/system/param/apiclientpara.html +++ b/src/main/resources/templates/system/param/apiclientpara.html @@ -29,7 +29,7 @@