临时提交
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 0000000..deaeaf3
--- /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 0000000..2649d02
--- /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 54d8475..9aa7d21 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.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<String, String?>
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
fun getUserdtlExtendParamMap(refno: String): Map<String, String>
}
\ 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 0000000..c9e940a
--- /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 32ced96..0a7b86f 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 ShopTransactionBuilder(val parent: TransactionBuilder) {
+ lateinit var shopacc: TShopacc
var shopaccno: String = ""
var shopname: String = ""
var amount: Double = 0.0
@@ -32,6 +40,7 @@
}
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 AccountProxy<T>(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<DebitCreditLine>()
+
var transDate: String = ""
var transTime: String = ""
var transCode: Int = 0 //交易码,各明细流水统一
var refno: String = ""
- var outtradeno:String="" //第三方流水号
+ var outtradeno: String = "" //第三方流水号
val extendMap = mutableMapOf<String, String>() //存调第三方需要的参数信息,存数据库 TB_USERDTL_BUSINESS
val resultMap = mutableMapOf<String, String>() //存调第三方结果数据
@@ -74,6 +121,13 @@
}
}
+ fun <T, U> addDebitCreditRecord(debit: AccountProxy<T>, credit: AccountProxy<U>,
+ 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 @@
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 @@
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