From 6edb607d2798c9c06a10932ebf3c439cb380bee7 Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Mon, 20 May 2019 08:31:07 +0800 Subject: [PATCH] =?utf8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/api/domain/TPersondtl.java | 245 ++++++++++++++++++ .../supwisdom/dlpay/api/domain/TShopdtl.java | 119 +++++++++ .../dlpay/api/service/consume_pay_service.kt | 6 +- .../dlpay/api/service/transaction_service.kt | 8 + .../dlpay/api/transaction_builder.kt | 102 +++++++- 5 files changed, 464 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java create mode 100644 src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java create mode 100644 src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java new file mode 100644 index 00000000..deaeaf34 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java @@ -0,0 +1,245 @@ +package com.supwisdom.dlpay.api.domain; + +import javax.persistence.*; + +@Entity +@Table(name = "TB_PERSONDTL", + indexes = {@Index(name = "prsndtl_transdate_idx", columnList = "transdate"), + @Index(name = "prsndtl_accdate_idx", columnList = "accdate"), + @Index(name = "prsndtl_status_idx", columnList = "status"), + @Index(name = "prsndtl_reverse_idx", columnList = "REVERSE_FLAG"), + @Index(name = "prsndtl_outtradeno_uk", unique = true, columnList = "outtradeno,shopaccno")}) +public class TPersondtl { + + @Id + @Column(name = "REFNO", nullable = false, length = 32) + private String refno; //流水号 + + @Column(name = "ACCDATE", length = 8) + private String accdate; //记账日期 + + @Column(name = "USERID", length = 32) + private String userid; //用户ID,或账号 + + @Column(name = "TRANSDATE", length = 8) + private String transdate; + + @Column(name = "TRANSTIME", length = 6) + private String transtime; + + @Column(name = "STATUS", length = 20) + private String status; + + @Column(name = "BEFBAL", precision = 9, scale = 2) + private Double befbal; + + @Column(name = "amount", precision = 9, scale = 2) + private Double amount; //实际付款金额 + + @Column(name = "PAYTYPE", length = 20) + private String paytype; //支付方式 balance,wechat,alipay + + @Column(name = "PAYINFO", length = 200) + private String payinfo; //记录支付信息备用字段 + + @Column(name = "TRANSCODE", precision = 4) + private Integer transcode; + + @Column(name = "TRANSDESC", length = 240) + private String transdesc; //交易描述 + + @Column(name = "OUTTRADENO", length = 60) + private String outtradeno; //第三方流水号 + + @Column(name = "OPPOSITEACCNO", length = 20) + private String oppositeAccNo; + + @Column(name = "OPERID", precision = 9) + private Integer operid; //操作员ID + + @Column(name = "REVERSE_FLAG", nullable = false, precision = 1) + private String reverseFlag = "none"; //none, cancel, reversed + + @Column(name = "REVERSE_AMOUNT", precision = 9, scale = 2) + private Double reverseAmount = 0D; //撤销金额填写 + + @Column(name = "TRADEFLAG", nullable = false, precision = 1) + private Integer tradeflag; //1-充值;2-消费 + + @Column(name = "REMARK", length = 240) + private String remark; + + @Column(name = "CREATETIME", length = 14) + private String createtime; //创建时间 + + @Column(name = "ENDTIME", length = 14) + private String endtime; //支付结束时间 + + public String getRefno() { + return refno; + } + + public void setRefno(String refno) { + this.refno = refno; + } + + public String getAccdate() { + return accdate; + } + + public void setAccdate(String accdate) { + this.accdate = accdate; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getTransdate() { + return transdate; + } + + public void setTransdate(String transdate) { + this.transdate = transdate; + } + + public String getTranstime() { + return transtime; + } + + public void setTranstime(String transtime) { + this.transtime = transtime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Double getBefbal() { + return befbal; + } + + public void setBefbal(Double befbal) { + this.befbal = befbal; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public String getPaytype() { + return paytype; + } + + public void setPaytype(String paytype) { + this.paytype = paytype; + } + + public String getPayinfo() { + return payinfo; + } + + public void setPayinfo(String payinfo) { + this.payinfo = payinfo; + } + + public Integer getTranscode() { + return transcode; + } + + public void setTranscode(Integer transcode) { + this.transcode = transcode; + } + + public String getTransdesc() { + return transdesc; + } + + public void setTransdesc(String transdesc) { + this.transdesc = transdesc; + } + + public String getOuttradeno() { + return outtradeno; + } + + public void setOuttradeno(String outtradeno) { + this.outtradeno = outtradeno; + } + + public String getOppositeAccNo() { + return oppositeAccNo; + } + + public void setOppositeAccNo(String oppositeAccNo) { + this.oppositeAccNo = oppositeAccNo; + } + + public Integer getOperid() { + return operid; + } + + public void setOperid(Integer operid) { + this.operid = operid; + } + + public String getReverseFlag() { + return reverseFlag; + } + + public void setReverseFlag(String reverseFlag) { + this.reverseFlag = reverseFlag; + } + + public Double getReverseAmount() { + return reverseAmount; + } + + public void setReverseAmount(Double reverseAmount) { + this.reverseAmount = reverseAmount; + } + + public Integer getTradeflag() { + return tradeflag; + } + + public void setTradeflag(Integer tradeflag) { + this.tradeflag = tradeflag; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime; + } + + public String getEndtime() { + return endtime; + } + + public void setEndtime(String endtime) { + this.endtime = endtime; + } +} diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java new file mode 100644 index 00000000..2649d023 --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java @@ -0,0 +1,119 @@ +package com.supwisdom.dlpay.api.domain; + +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.Table; + +@Table(name = "TB_SHOPDTL") +public class TShopdtl { + @Id + @Column(name = "refno", length = 32, nullable = false) + private String refno; + + @Column(name = "accdate", length = 8, nullable = false) + private String accdate; + + @Column(name = "shopaccno", length = 10, nullable = false) + private String shopaccno; + + @Column(name = "shopname", length = 200) + private String shopname; + + @Column(name = "amount", scale = 2, precision = 15) + private Double amount; + + @Column(name = "transdate", length = 8) + private String transDate; + + @Column(name = "transtime", length = 6) + private String transTime; + + @Column(name = "paytype", length = 20) + private String payType; + + @Column(name = "payinfo", length = 200) + private String payInfo; + + @Column(name = "status", length = 20) + private String status; + + public String getRefno() { + return refno; + } + + public void setRefno(String refno) { + this.refno = refno; + } + + public String getAccdate() { + return accdate; + } + + public void setAccdate(String accdate) { + this.accdate = accdate; + } + + public String getShopaccno() { + return shopaccno; + } + + public void setShopaccno(String shopaccno) { + this.shopaccno = shopaccno; + } + + public String getShopname() { + return shopname; + } + + public void setShopname(String shopname) { + this.shopname = shopname; + } + + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + public String getTransDate() { + return transDate; + } + + public void setTransDate(String transDate) { + this.transDate = transDate; + } + + public String getTransTime() { + return transTime; + } + + public void setTransTime(String transTime) { + this.transTime = transTime; + } + + public String getPayType() { + return payType; + } + + public void setPayType(String payType) { + this.payType = payType; + } + + public String getPayInfo() { + return payInfo; + } + + public void setPayInfo(String payInfo) { + this.payInfo = payInfo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt index 54d84753..9aa7d21a 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt @@ -4,12 +4,12 @@ import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional interface ConsumePayService{ - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) fun checkShopPaytype(shopaccno: String, paytype: String, anonymousflag: Boolean? = false): Boolean - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) fun getPaytypeConfig(paytype: String, shopaccno: String, anonymousflag: Boolean? = false, ignoreStatus: Boolean? = false): Map - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class]) fun getUserdtlExtendParamMap(refno: String): Map } \ No newline at end of file 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 new file mode 100644 index 00000000..c9e940ac --- /dev/null +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt @@ -0,0 +1,8 @@ +package com.supwisdom.dlpay.api.service + +import com.supwisdom.dlpay.api.TransactionBuilder + +interface TransactionService { +// fun + fun transaction(builder: TransactionBuilder) +} \ No newline at end of file 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 32ced967..0a7b86f5 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt @@ -1,9 +1,16 @@ package com.supwisdom.dlpay.api +import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.service.AccountUtilServcie import com.supwisdom.dlpay.api.service.PersonBalancePayService +import com.supwisdom.dlpay.exception.TransactionCheckException +import com.supwisdom.dlpay.framework.domain.TShopacc +import com.supwisdom.dlpay.framework.domain.TSubject +import com.supwisdom.dlpay.framework.util.Subject +import com.supwisdom.dlpay.framework.util.TradeErrorCode class PersonTranactionBuilder(val parent: TransactionBuilder) { + lateinit var person: TAccount var userid: String = "" var userName: String = "" var amount: Double = 0.0 @@ -18,6 +25,7 @@ class PersonTranactionBuilder(val parent: TransactionBuilder) { } class ShopTransactionBuilder(val parent: TransactionBuilder) { + lateinit var shopacc: TShopacc var shopaccno: String = "" var shopname: String = "" var amount: Double = 0.0 @@ -32,6 +40,7 @@ class ShopTransactionBuilder(val parent: TransactionBuilder) { } class SubjectTransactionBuilder(val parent: TransactionBuilder) { + lateinit var subject: TSubject var subjno: String = "" var subjName: String = "" var amount: Double = 0.0 @@ -42,17 +51,55 @@ class SubjectTransactionBuilder(val parent: TransactionBuilder) { } } +class AccountProxy(private val accountObj: T) { + fun getAccountNo(): String { + return when (accountObj) { + is TAccount -> (accountObj as TAccount).accno + is TShopacc -> (accountObj as TShopacc).shopaccno + is TSubject -> (accountObj as TSubject).subjno + else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "不支持的账户类型, $accountObj") + } + } + + fun getSubjectNo(): String { + return when (accountObj) { + is TAccount -> (accountObj as TAccount).subjno + is TShopacc -> (accountObj as TShopacc).subjno + is TSubject -> (accountObj as TSubject).subjno + else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "不支持的账户类型, $accountObj") + } + } + + fun getAccountName(): String { + return when (accountObj) { + is TAccount -> (accountObj as TAccount).accname + is TShopacc -> (accountObj as TShopacc).shopname + is TSubject -> (accountObj as TSubject).subjname + else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "不支持的账户类型, $accountObj") + } + } +} + +data class DebitCreditLine(val debit: AccountProxy<*>, val credit: AccountProxy<*>, + val amount: Double, val summary: String, + val seqno: Int) + // 在 constructor 中加入 service 接口 class TransactionBuilder { private lateinit var personBuilder: PersonTranactionBuilder private lateinit var shopBuilder: ShopTransactionBuilder private lateinit var subjectBuilder: SubjectTransactionBuilder + private val debitCreditLines = mutableListOf() + var transDate: String = "" var transTime: String = "" var transCode: Int = 0 //交易码,各明细流水统一 var refno: String = "" - var outtradeno:String="" //第三方流水号 + var outtradeno: String = "" //第三方流水号 val extendMap = mutableMapOf() //存调第三方需要的参数信息,存数据库 TB_USERDTL_BUSINESS val resultMap = mutableMapOf() //存调第三方结果数据 @@ -74,6 +121,13 @@ class TransactionBuilder { } } + fun addDebitCreditRecord(debit: AccountProxy, credit: AccountProxy, + amount: Double, summary: String): TransactionBuilder { + debitCreditLines.add(DebitCreditLine(debit, credit, amount, summary, + debitCreditLines.size + 1)) + return this + } + fun init(transactionService: PersonBalancePayService) { } @@ -84,7 +138,7 @@ class TransactionExample { fun example(accountUtilServcie: AccountUtilServcie, service: PersonBalancePayService, userid: String, shopid: Int, amount: Int, manageFee: Int, - transDate: String, transTime: String) { + transDate: String, transTime: String, payType: String) { val person = accountUtilServcie.readAccount(userid) val shop = accountUtilServcie.readShopAcc(shopid) @@ -94,27 +148,49 @@ class TransactionExample { this.transTime = transTime this.transCode = 3001 }.person().apply { - this.userid = userid // 可以再优化,直接用 person 对象 - this.userName = person.accname + this.person = person this.amount = (amount + manageFee) / 100.0 // 金额考虑减和加 this.summary = "POS消费" }.and().shop().apply { - this.shopaccno = shop.shopaccno // 可以再优化,直接用 shop 对象 - this.shopname = shop.shopname + this.shopacc = shop this.amount = amount / 100.0 // 金额考虑减和加 this.summary = "POS消费" }.and() - if (manageFee > 0) { - builder.subject().apply { + + if (payType == "balance") { + builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(shop), + amount / 100.0, "POS消费") + if (manageFee > 0) { val subject = accountUtilServcie.readSubject("2001") - this.subjno = subject.subjno - this.subjName = subject.subjname - this.amount = manageFee / 100.0 // 金额考虑减和加 - this.summary = "POS消费搭伙费" + builder.subject().apply { + this.subject = subject + this.amount = manageFee / 100.0 // 金额考虑减和加 + this.summary = "POS消费搭伙费" + }.and().addDebitCreditRecord(AccountProxy(person), AccountProxy(subject), manageFee / 100.0, + "POS消费搭伙费") } + } else if (payType == "wechat") { + accountUtilServcie.readSubject(Subject.SUBJNO_PAY_WECHAT).also { + builder.addDebitCreditRecord(AccountProxy(it), AccountProxy(person), + (amount + manageFee) / 100.0, "微信转账") + .addDebitCreditRecord(AccountProxy(person), AccountProxy(shop), + amount / 100.0, "微信支付消费") + } + + if (manageFee > 0) { + accountUtilServcie.readSubject("2001").also { + builder.subject().apply { + this.subject = it + this.amount = manageFee / 100.0 // 金额考虑减和加 + this.summary = "微信支付消费搭伙费" + }.and().addDebitCreditRecord(AccountProxy(person), AccountProxy(it), manageFee / 100.0, + "微信支付消费搭伙费") + } + } + } else { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的支付方式") } builder.init(service) - } } } \ No newline at end of file -- 2.17.1