删除原来的记账模块,并注释部分未兼容新记账模块的代码
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlBusinessDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlBusinessDao.java
deleted file mode 100644
index 347e79a..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlBusinessDao.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.supwisdom.dlpay.api.dao;
-
-import com.supwisdom.dlpay.api.domain.TUserdtlBusiness;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface UserdtlBusinessDao extends JpaRepository<TUserdtlBusiness, String> {
- TUserdtlBusiness getByRefno(String refno);
-}
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
deleted file mode 100644
index 007cff7..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.supwisdom.dlpay.api.dao;
-
-import com.supwisdom.dlpay.api.domain.TUserdtl;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Lock;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.jpa.repository.QueryHints;
-import org.springframework.stereotype.Repository;
-
-import javax.persistence.LockModeType;
-import javax.persistence.QueryHint;
-
-@Repository
-public interface UserdtlDao extends JpaRepository<TUserdtl, String> {
- TUserdtl findByRefno(String refno);
-
- @Lock(LockModeType.PESSIMISTIC_WRITE)
- @Query("select dtl from TUserdtl dtl where dtl.refno = ?1")
- TUserdtl findByRefnoForUpdate(String refno);
-
- @Lock(LockModeType.PESSIMISTIC_WRITE)
- @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
- @Query("select dtl from TUserdtl dtl where dtl.refno = ?1")
- TUserdtl findByRefnoForUpdateNowait(String refno);
-
- @Lock(LockModeType.PESSIMISTIC_WRITE)
- @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
- @Query("select dtl from TUserdtl dtl where dtl.outtradeno = ?1 and dtl.shopaccno=?2 ")
- TUserdtl findByBillnoForUpdateNowait(String billno,String shopaccno);
-
- TUserdtl findByOuttradenoAndShopaccno(String outtradeno,String shopaccno);
-}
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java
index dc3fe04..3fd3be2 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java
@@ -3,7 +3,7 @@
import javax.persistence.*;
@Entity
-@Table(name = "TB_SUBJECtDTL",
+@Table(name = "TB_SUBJECTDTL",
indexes = {@Index(name = "subjdtl_accdate", columnList = "accdate"),
@Index(name = "subjdtl_subjno", columnList = "subjno")})
public class TSubjectdtl {
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
deleted file mode 100644
index 694e7a9..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package com.supwisdom.dlpay.api.domain;
-
-import javax.persistence.*;
-
-@Entity
-@Table(name = "TB_USERDTL",
- indexes = {@Index(name = "userdtl_transdate_idx", columnList = "transdate"),
- @Index(name = "userdtl_accdate_idx", columnList = "accdate"),
- @Index(name = "userdtl_status_idx", columnList = "status"),
- @Index(name = "userdtl_reverse_idx", columnList = "REVERSE_FLAG"),
- @Index(name = "userdtl_outtradeno_uk", unique = true, columnList = "outtradeno,shopaccno")})
-public class TUserdtl {
- @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 = "TOTAL_AMOUNT", precision = 9, scale = 2)
- private Double totalAmount; //订单总金额
-
- @Column(name = "AFTBAL", precision = 9, scale = 2)
- private Double aftbal;
-
- @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 = "SHOPACCNO", length = 20)
- private String shopaccno;
-
- @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 Double getAftbal() {
- return aftbal;
- }
-
- public void setAftbal(Double aftbal) {
- this.aftbal = aftbal;
- }
-
- 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 getShopaccno() {
- return shopaccno;
- }
-
- public void setShopaccno(String shopaccno) {
- this.shopaccno = shopaccno;
- }
-
- 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/TUserdtlBusiness.java b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtlBusiness.java
deleted file mode 100644
index 42ed8ca..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtlBusiness.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.supwisdom.dlpay.api.domain;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-
-import javax.persistence.*;
-import java.util.HashMap;
-import java.util.Map;
-
-@Entity
-@Table(name = "TB_USERDTL_BUSINESS")
-public class TUserdtlBusiness {
- @Id
- @Column(name = "REFNO", nullable = false, length = 32)
- private String refno;
-
- @Column(name = "JSON_CONTENT", length = 1000)
- private String jsonContent;
-
- @Transient
- private static final Gson gsonUtil = new Gson();
-
- public TUserdtlBusiness() {
- }
-
- public TUserdtlBusiness(String refno, String jsonContent) {
- this.refno = refno;
- this.jsonContent = jsonContent;
- }
-
- public TUserdtlBusiness(String refno, Map<String, String> map) {
- this.refno = refno;
- if (null == map || map.isEmpty()) {
- this.jsonContent = "";
- } else {
- this.jsonContent = gsonUtil.toJson(map);
- }
- }
-
- public String getRefno() {
- return refno;
- }
-
- public void setRefno(String refno) {
- this.refno = refno;
- }
-
- public String getJsonContent() {
- return jsonContent;
- }
-
- public void setJsonContent(String jsonContent) {
- this.jsonContent = jsonContent;
- }
-
- public Map<String, String> getContentMap() {
- Map<String, String> map = new HashMap<>(0);
- if (!StringUtil.isEmpty(this.jsonContent))
- map = gsonUtil.fromJson(this.jsonContent, new TypeToken<Map<String, String>>() {
- }.getType());
- return map;
- }
-}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index 3a03934..3b5bd5e 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -7,8 +7,8 @@
import com.supwisdom.dlpay.api.bean.SupStatusRevResp
import com.supwisdom.dlpay.api.bean.SupYktResp
import com.supwisdom.dlpay.api.bean.WechatReqResp
+import com.supwisdom.dlpay.api.domain.TPersondtl
import com.supwisdom.dlpay.api.domain.TShopdtl
-import com.supwisdom.dlpay.api.domain.TUserdtl
import com.supwisdom.dlpay.framework.util.*
import com.supwisdom.dlpay.util.Code
@@ -24,7 +24,7 @@
class CallService {
companion object {
- fun callYktPay(config: Map<String, String?>, paydtl: TUserdtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
+ fun callYktPay(config: Map<String, String?>, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
val code = CallBackResp()
val appid = config["appid"]
if (appid.isNullOrEmpty()) {
@@ -104,7 +104,7 @@
return code
}
- fun callWechatPay(config: Map<String, String>, paydtl: TUserdtl, time: String, wechattype: String,
+ fun callWechatPay(config: Map<String, String>, paydtl: TPersondtl, time: String, wechattype: String,
realip: String?, qrcode: String?, openid: String?): BaseResp {
val code = BaseResp()
val appid = config["appid"]
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
deleted file mode 100644
index 0304141..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
+++ /dev/null
@@ -1,373 +0,0 @@
-package com.supwisdom.dlpay.api
-
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TUserdtl
-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.TFeetypeConfig
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.util.*
-
-class AccountHolder<T> private constructor(val accountId: String, val idType: Int) {
- companion object {
- const val IDTYPE_PERSON = 1
- const val IDTYPE_SHOP = 2
- const val IDTYPE_SUBJECT = 3
- const val IDTYPE_FEETYPE = 4
-
- fun person(userid: String): AccountHolder<TAccount> {
- return AccountHolder(userid, IDTYPE_PERSON)
- }
-
- fun shop(shopid: String): AccountHolder<TShopacc> {
- return AccountHolder(shopid, IDTYPE_SHOP)
- }
-
- fun subject(subjNo: String): AccountHolder<TSubject> {
- return AccountHolder(subjNo, IDTYPE_SUBJECT)
- }
-
- fun feetype(feetype: String, paytype: String): AccountHolder<TFeetypeConfig> {
- return AccountHolder("$feetype@$paytype", IDTYPE_FEETYPE)
- }
- }
-
- internal lateinit var builder: PersonTransBuilder
-
- internal val childrenHolder = mutableListOf<AccountHolder<*>>()
-
-
- fun <U> with(holder: AccountHolder<U>): AccountHolder<T> {
- holder.builder = this.builder
- childrenHolder.add(holder)
- return this
- }
-
- @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
- fun <T> get(): T {
- return when (idType) {
- IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId)
- IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt())
- IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
- IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1])
- else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
- } as T
- }
-
- @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
- fun <T> withLock(): T {
- return when (idType) {
- IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId)
- IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt())
- IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
- IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1])
- else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
- } as T
- }
-}
-
-class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) {
- companion object {
- fun newBuilder(accUitl: AccountUtilServcie) = PersonTransBuilder(accUitl)
- }
-
- inner class TransDetail(val debitAccNo: String, val debitSubjNo: String,
- val creditAccNo: String, val creditSubjNo: String,
- val amount: Double, val summary: String,
- val rowno: Int)
-
- ///////////////////////////////////////////////////////////////////////////////
- // 以下为输入参数,调用接口时指定的参数值
- lateinit var person: TPerson
- lateinit var tradetype: Tradetype
- lateinit var refno: String
- lateinit var status: String
- lateinit var shopaccno: String
- val extendMap = mutableMapOf<String, String>() //存调第三方需要的参数信息
- val resultMap = mutableMapOf<String, String>() //存调第三方结果数据
-
- var transcode = 0
-
- var transDate = ""
- var transTime = ""
- /**
- * 是否允许透支
- */
- var overdraft = false
- var description = ""
-
- /**
- * 支付方式
- * */
- var paytype = "" //枚举?
- var payinfo = ""
-
- /**
- * 外部流水号
- * */
- var outtradeno = "" //发起支付系统的流水号(对接系统根据此流水号查询本地流水对账)
-
- var tryLockAccount = false
-
- ////////////////////////////////////////////////////////////////////////////////////
- // 以下为内部参数,不需要调用者处理
- val details = mutableListOf<TransDetail>()
- var amount: Double = 0.0
- var accountUtil = accUitl
-
- /////////////////////////////////////////////
-
- fun setOwner(per: TPerson): PersonTransBuilder {
- this.person = per
- return this
- }
-
- fun enableOverdraft(b: Boolean = false): PersonTransBuilder {
- this.overdraft = b
- return this
- }
-
- fun setTransDatetime(date: String, time: String): PersonTransBuilder {
- this.transDate = date
- this.transTime = time
- return this
- }
-
- fun setTransinfo(transcode: Int, description: String): PersonTransBuilder {
- this.transcode = transcode
- this.description = description
- return this
- }
-
- fun selectPaytype(paytype: String, payinfo: String): PersonTransBuilder {
- this.paytype = paytype
- this.payinfo = payinfo
- return this
- }
-
- fun setOuttradeno(outtradeno: String): PersonTransBuilder {
- this.outtradeno = outtradeno
- return this
- }
-
- fun chooseTradetype(tradetype: Tradetype): PersonTransBuilder {
- this.tradetype = tradetype
- return this
- }
-
- fun tryLock(lock: Boolean): PersonTransBuilder {
- this.tryLockAccount = lock
- return this
- }
-
- fun setRefno(refno: String): PersonTransBuilder {
- this.refno = refno
- return this
- }
-
- fun addExtendParam(key: String, value: String): PersonTransBuilder {
- this.extendMap.plus(mapOf(key to value))
- return this
- }
-
- fun addExtendParam(param: Map<String, String>): PersonTransBuilder {
- this.extendMap.plus(param)
- return this
- }
-
- fun addResult(key: String, value: String): PersonTransBuilder {
- this.resultMap.plus(mapOf(key to value))
- return this
- }
-
- fun addResult(param: Map<String, String>): PersonTransBuilder {
- this.resultMap.plus(param)
- return this
- }
-
- private fun prepareData() {
- if (transcode == 0) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未指定交易码")
- }
-
- // fixme : 是否要检查 recharge , consume 之外的类型
- when (this.tradetype) {
- //充值必须指明用户和支付方式
- Tradetype.RECHARGE -> {
- if (StringUtil.isEmpty(this.paytype))
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未指定充值方式")
- }
-
- //消费
- Tradetype.CONSUME -> {
- if (StringUtil.isEmpty(this.paytype))
- this.paytype = TradeDict.PAYTYPE_BALANCE //默认余额支付
- }
- }
-
- if (this.details.size < 1) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未指定交易明细")
- }
-
- amount = this.details.sumByDouble { detail ->
- detail.amount
- }
-
- if (!StringUtil.isEmpty(this.transDate) &&
- !DateUtil.checkDatetimeValid(this.transDate, "yyyyMMdd")) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易日期格式错误[yyyyMMdd]")
- }
- if (!StringUtil.isEmpty(this.transTime) &&
- !DateUtil.checkDatetimeValid(this.transTime, "HHmmss")) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易时间格式错误[HHmmss]")
- }
-
- if (StringUtil.isEmpty(this.outtradeno)) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未传递外部流水号")
- }
-
-
- }
-
- private fun preCheckAccount() {
- when (person.status) {
- TradeDict.STATUS_CLOSED ->
- throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR, "用户已注销")
- TradeDict.STATUS_LOCKED ->
- throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR, "用户已冻结锁定")
- }
- }
-
- @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
- fun <U> getAccountAndSubjNo(holder: AccountHolder<U>): Pair<String, String> {
- return if (this.tryLockAccount) {
- when (holder.idType) {
- AccountHolder.IDTYPE_PERSON -> holder.withLock<TAccount>().let {
- it.accno to it.subjno
- }
- AccountHolder.IDTYPE_SHOP -> holder.withLock<TShopacc>().let {
- if (this.shopaccno.isEmpty()) {
- this.shopaccno = it.shopaccno
- }
- it.shopaccno to it.subjno
- }
- AccountHolder.IDTYPE_SUBJECT -> holder.withLock<TSubject>().let {
- it.subjno to it.subjno
- }
- else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的账户类型")
- }
- } else {
- when (holder.idType) {
- AccountHolder.IDTYPE_PERSON -> holder.get<TAccount>().let {
- it.accno to it.subjno
- }
- AccountHolder.IDTYPE_SHOP -> holder.get<TShopacc>().let {
- if (this.shopaccno.isEmpty()) {
- this.shopaccno = it.shopaccno
- }
- it.shopaccno to it.subjno
- }
- AccountHolder.IDTYPE_SUBJECT -> holder.get<TSubject>().let {
- it.subjno to it.subjno
- }
- else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的账户类型")
- }
- }
- }
-
- fun <T, U> addDetail(debit: AccountHolder<T>, credit: AccountHolder<U>,
- amount: Double, summary: String): PersonTransBuilder {
- debit.builder = this
- credit.builder = this
-
- var debitAccNo: String
- var debitSubjNo: String
- getAccountAndSubjNo(debit).apply {
- debitAccNo = first
- debitSubjNo = second
- }
- var creditAccNo: String
- var creditSubjNo: String
- getAccountAndSubjNo(credit).apply {
- creditAccNo = first
- creditSubjNo = second
- }
- this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo,
- amount, summary, this.details.size + 1))
- return this
- }
-
- fun addDetail(accountHolder: AccountHolder<TFeetypeConfig>,
- amount: Double): PersonTransBuilder {
- accountHolder.builder = this
- val transtype = accountHolder.get<TFeetypeConfig>()
-
- var debitAccNo = ""
- var debitSubjNo = ""
-
- var creditAccNo = ""
- var creditSubjNo = ""
-
- accountHolder.childrenHolder.map {
- getAccountAndSubjNo(it)
- }.forEach {
- if (it.second == transtype.drsubjno) {
- debitAccNo = it.first
- debitSubjNo = it.second
- } else if (it.second == transtype.crsubjno) {
- creditAccNo = it.first
- creditSubjNo = it.second
- }
- }
-
- if (debitAccNo.isEmpty()) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
- "交易配置<${transtype.feetype}@${transtype.paytype}> 借方账号配置错误")
- }
- if (creditAccNo.isEmpty()) {
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
- "交易配置<${transtype.feetype}@${transtype.paytype}> 贷方账号配置错误")
- }
- this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo,
- amount, transtype.summary, this.details.size + 1))
- return this
- }
-
- /**
- * 一步交易完成
- */
- fun done(service: PersonBalancePayService): TUserdtl {
- prepareData()
- preCheckAccount()
- return service.process(this)
- }
-
- fun init(service: PersonBalancePayService): TUserdtl {
- prepareData()
- preCheckAccount()
- return service.init(this)
- }
-
- fun wip(service: PersonBalancePayService): TUserdtl {
- if (this.refno.isEmpty())
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
- return service.wip(this)
- }
-
- fun finish(service: PersonBalancePayService, status: String): TUserdtl {
- if (this.refno.isEmpty())
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
- this.status = status
- return service.finish(this)
- }
-
- fun success(service: PersonBalancePayService): TUserdtl {
- if (this.refno.isEmpty())
- throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
- this.status = TradeDict.DTL_STATUS_SUCCESS
- return service.finish(this)
- }
-}
\ No newline at end of file
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 bfa6eac..873aa8f 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
@@ -1,26 +1,29 @@
package com.supwisdom.dlpay.api.controller
-import com.supwisdom.dlpay.api.*
+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.domain.TAccount
-import com.supwisdom.dlpay.api.service.*
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.api.service.ConsumePayService
+import com.supwisdom.dlpay.api.service.TransactionService
+import com.supwisdom.dlpay.api.service.UserService
import com.supwisdom.dlpay.exception.RequestParamCheckException
import com.supwisdom.dlpay.exception.TransactionCheckException
import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.exception.TransactionProcessException
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.*
-import com.supwisdom.dlpay.util.ConstantUtil
-import com.supwisdom.dlpay.util.PaytypeUtil
-import org.apache.catalina.authenticator.SpnegoAuthenticator
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.security.core.Authentication
-import org.springframework.security.core.context.SecurityContextHolder
-import org.springframework.web.bind.annotation.*
+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
@@ -30,10 +33,6 @@
@Autowired
lateinit var accountUtilServcie: AccountUtilServcie
@Autowired
- lateinit var personBalancePayService: PersonBalancePayService
- @Autowired
- lateinit var paytypeService: PaytypeService
- @Autowired
lateinit var userService: UserService
@Autowired
lateinit var systemUtilService: SystemUtilService
@@ -48,31 +47,35 @@
/**
* 流水结果查询统一接口
* */
- fun queryDtlResult(@RequestBody param: QueryDtlResultParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ fun queryDtlResult(@RequestBody param: QueryDtlResultParam,
+ request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
try {
if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
}
- val dtl = if (StringUtil.isEmpty(param.refno)) {
- personBalancePayService.getUserdtlForUpdateNowait(param.refno!!)
- } else {
- personBalancePayService.getUserdtlByBillnoForUpdateNowait(param.billno!!, param.shopaccno!!)
- }
- 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("查询成功"))
-
+// 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("未实现功能")
} catch (ex: RequestParamCheckException) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
.requestException(ex, "请求参数错误"))
@@ -83,7 +86,8 @@
}
- private fun consumeMealer(param: CitizenCardPayinitParam, builder: TransactionBuilder,
+ private fun consumeMealer(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
+ builder: TransactionBuilder,
feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
TradeDict.PAYTYPE_BALANCE)
@@ -105,7 +109,8 @@
}
- private fun consumeDiscount(param: CitizenCardPayinitParam, builder: TransactionBuilder,
+ private fun consumeDiscount(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
+ builder: TransactionBuilder,
feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
TradeDict.PAYTYPE_BALANCE)
@@ -139,7 +144,7 @@
val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
val account = accountUtilServcie.readAccount(person.userid)
- val shopacc = accountUtilServcie.readShopbyAccno(param.shopaccno)
+ val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
val builder = TransactionBuilder().apply {
transDate = param.transdate
@@ -209,7 +214,7 @@
if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) {
val account = accountUtilServcie.readAccount(person.userid)
- val shopacc = accountUtilServcie.readShopbyAccno(param.shopaccno)
+ val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD)
val transaction = TransactionBuilder().apply {
transCode = TradeCode.TRANSCODE_CITIZENCARD_PAY
@@ -313,45 +318,45 @@
@PostMapping("/ykt/payinit")
fun yktPayInit(@RequestBody param: YktCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
try {
- if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
- 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)) {
- val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
- .chooseTradetype(Tradetype.CONSUME) //消费
- .also {
- if (null != person) it.setOwner(person)
- }
- .setTransinfo(TradeCode.TRANSCODE_YKTCARD_PAY, "一卡通支付")
- .setTransDatetime(param.transdate, param.transtime) //交易时间
- .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.stuempno)
- .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
- AccountHolder.shop(param.shopaccno),
- param.amount / 100.0, "一卡通支付")
- .also { builder ->
- param.feelist?.forEach {
- //fixme: 科目 -> 商户 与个人无关
- builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
- .with(AccountHolder.shop(param.shopaccno))
- .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
- , it.amount / 100.0)
- }
- }
- .addExtendParam("stuempno", param.stuempno)
- .addExtendParam("yktshopid", param.yktshopid ?: "")
- .addExtendParam("devphyid", param.devphyid ?: "")
- //.addExtendParam(param.extendmap) //fixme: 保存调一卡通附加参数 (是否直接传附加参数map)
- .init(personBalancePayService)
-
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .data("refno", dtl.refno)
- .data("amount", dtl.amount)
- .success("交易初始化成功"))
-
- }
+// if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+// 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)) {
+// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .chooseTradetype(Tradetype.CONSUME) //消费
+// .also {
+// if (null != person) it.setOwner(person)
+// }
+// .setTransinfo(TradeCode.TRANSCODE_YKTCARD_PAY, "一卡通支付")
+// .setTransDatetime(param.transdate, param.transtime) //交易时间
+// .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.stuempno)
+// .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
+// AccountHolder.shop(param.shopaccno),
+// param.amount / 100.0, "一卡通支付")
+// .also { builder ->
+// param.feelist?.forEach {
+// //fixme: 科目 -> 商户 与个人无关
+// builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
+// .with(AccountHolder.shop(param.shopaccno))
+// .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
+// , it.amount / 100.0)
+// }
+// }
+// .addExtendParam("stuempno", param.stuempno)
+// .addExtendParam("yktshopid", param.yktshopid ?: "")
+// .addExtendParam("devphyid", param.devphyid ?: "")
+// //.addExtendParam(param.extendmap) //fixme: 保存调一卡通附加参数 (是否直接传附加参数map)
+// .init(personBalancePayService)
+//
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .data("refno", dtl.refno)
+// .data("amount", dtl.amount)
+// .success("交易初始化成功"))
+//
+// }
return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
@@ -377,33 +382,34 @@
return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
}
-
- var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
- .setRefno(param.refno)
- .wip(personBalancePayService)
- val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
- val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
- dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
- if (code.retcode == "0") {
- dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
- .setRefno(param.refno)
- .addResult(code.data)
- .success(personBalancePayService) //流水置成功
-
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .data("refno", dtl.refno)
- .data("billno", dtl.outtradeno)
- .success())
- } else {
- PersonTransBuilder.newBuilder(accountUtilServcie)
- .setRefno(param.refno)
- .addResult("errmsg", code.retmsg!!)
- .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
-
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
- }
-
+//
+// var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .wip(personBalancePayService)
+// val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
+// val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
+// dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
+// if (code.retcode == "0") {
+// dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .addResult(code.data)
+// .success(personBalancePayService) //流水置成功
+//
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .data("refno", dtl.refno)
+// .data("billno", dtl.outtradeno)
+// .success())
+// } else {
+// PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .addResult("errmsg", code.retmsg!!)
+// .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
+//
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+// }
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
} catch (ex: RequestParamCheckException) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
.requestException(ex, "请求参数错误"))
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
index f099608..2337682 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
@@ -1,13 +1,10 @@
package com.supwisdom.dlpay.api.controller
-import com.supwisdom.dlpay.api.PersonTransBuilder
import com.supwisdom.dlpay.api.service.AccountUtilServcie
import com.supwisdom.dlpay.api.service.PaytypeService
-import com.supwisdom.dlpay.api.service.PersonBalancePayService
+import com.supwisdom.dlpay.api.service.TransactionService
import com.supwisdom.dlpay.framework.util.MD5
import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.XmlUtils
import com.supwisdom.dlpay.util.PaytypeUtil
import org.dom4j.io.SAXReader
import org.slf4j.LoggerFactory
@@ -17,7 +14,7 @@
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.RestController
-import java.util.HashMap
+import java.util.*
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
@@ -29,12 +26,13 @@
class NotifyController {
private val logger = LoggerFactory.getLogger(NotifyController::class.java)
@Autowired
- lateinit var personBalancePayService: PersonBalancePayService
- @Autowired
lateinit var paytypeService: PaytypeService
@Autowired
lateinit var accountUtilServcie: AccountUtilServcie
+ @Autowired
+ lateinit var transactionService: TransactionService
+
@RequestMapping(value = ["/wechat"])
@ResponseBody
fun index(@PathVariable schema: String, request: HttpServletRequest,
@@ -82,16 +80,13 @@
val return_code = map["return_code"]
val result_code = map["result_code"]
val out_trade_no = map["out_trade_no"]
- if (StringUtils.isEmpty(out_trade_no)) {
+ if (out_trade_no == null || StringUtils.isEmpty(out_trade_no)) {
return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单信息错误]]></return_msg></xml>"
}
if (!StringUtils.isEmpty(return_code) && "SUCCESS" == return_code
&& !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) {
//map.get("transaction_id") 第三方流水号
- PersonTransBuilder.newBuilder(accountUtilServcie)
- .setRefno(out_trade_no!!)
- .addResult(map)
- .success(personBalancePayService)
+ transactionService.success(out_trade_no)
}
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
} catch (e: Exception) {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
index 3c40253..8d891d8 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
@@ -3,8 +3,6 @@
import com.supwisdom.dlpay.api.dao.PaytypeDao
import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
-import com.supwisdom.dlpay.api.dao.UserdtlBusinessDao
-import com.supwisdom.dlpay.api.domain.TUserdtlBusiness
import com.supwisdom.dlpay.api.service.ConsumePayService
import com.supwisdom.dlpay.exception.TransactionProcessException
import com.supwisdom.dlpay.framework.util.TradeErrorCode
@@ -13,17 +11,15 @@
import org.springframework.stereotype.Service
@Service
-class ConsumePayServiceImpl: ConsumePayService{
+class ConsumePayServiceImpl : ConsumePayService {
@Autowired
lateinit var paytypeDao: PaytypeDao
@Autowired
lateinit var shopPaytypeDao: ShopPaytypeDao
@Autowired
lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
- @Autowired
- lateinit var userdtlBusinessDao: UserdtlBusinessDao
- override fun checkShopPaytype(shopaccno: String, paytype: String, anonymousflag: Boolean?): Boolean{
+ override fun checkShopPaytype(shopaccno: String, paytype: String, anonymousflag: Boolean?): Boolean {
paytypeDao.getByPaytype(paytype).let {
if (null == it) {
throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
@@ -88,12 +84,11 @@
it.forEach { result.plus(mapOf(it.configid to it.configValue)) }
return result
}
- } ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
+ }
+ ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
}
override fun getUserdtlExtendParamMap(refno: String): Map<String, String> {
- return userdtlBusinessDao.getByRefno(refno)?.let {
- it.contentMap
- } ?: mutableMapOf<String, String>()
+ TODO("未实现方法")
}
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
index 6ca0003..e54f063 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
@@ -1,30 +1,21 @@
package com.supwisdom.dlpay.api.service.impl
-import com.supwisdom.dlpay.api.PersonTransBuilder
import com.supwisdom.dlpay.api.dao.AccountDao
-import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao
-import com.supwisdom.dlpay.api.dao.UserdtlBusinessDao
-import com.supwisdom.dlpay.api.dao.UserdtlDao
import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TDebitCreditDtl
-import com.supwisdom.dlpay.api.domain.TUserdtl
-import com.supwisdom.dlpay.api.domain.TUserdtlBusiness
import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.PersonBalancePayService
import com.supwisdom.dlpay.exception.TransactionException
import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.dao.*
+import com.supwisdom.dlpay.framework.dao.FeetypeConfigDao
+import com.supwisdom.dlpay.framework.dao.ShopaccDao
+import com.supwisdom.dlpay.framework.dao.SubjectDao
import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
import com.supwisdom.dlpay.framework.domain.TShopacc
import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
import org.hibernate.exception.LockTimeoutException
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.dao.CannotAcquireLockException
import org.springframework.stereotype.Service
-import javax.persistence.EntityManager
-import javax.persistence.PersistenceContext
@Service
@@ -64,9 +55,9 @@
?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopId>不存在")
}
- override fun readShopbyAccno(shopacc: String): TShopacc {
- return shopaccDao.findByShopaccno(shopacc)
- ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopacc>不存在")
+ override fun readShopbyShopaccno(shopaccno: String): TShopacc {
+ return shopaccDao.findByShopaccno(shopaccno)
+ ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopaccno>不存在")
}
override fun readSubject(subjno: String): TSubject {
@@ -79,262 +70,3 @@
?: throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_EXISTS, "在支付方式<$paytype>下不存在费用类别<$feetype>")
}
}
-
-@Service
-class PersonBalancePayServiceImpl : PersonBalancePayService {
- @Autowired
- lateinit var userdtlDao: UserdtlDao
- @Autowired
- lateinit var debitCreditDtlDao: DebitCreditDtlDao
-
- @Autowired
- lateinit var accountDao: AccountDao
-
- @Autowired
- lateinit var userdtlBusinessDao: UserdtlBusinessDao
-
- @PersistenceContext
- lateinit var em: EntityManager
-
- @Autowired
- lateinit var systemUtilService: SystemUtilService
-
-
- private fun getlockAccount(accno: String): TAccount {
- return accountDao.getByAccnoForUpdate(accno)
- ?: throw throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账号<$accno>不存在")
- }
-
- private fun getlockAccountNowait(accno: String): TAccount {
- return try {
- accountDao.getByAccnoForUpdateNowait(accno)
- ?: throw throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账号<$accno>不存在")
- } catch (ex: Exception) {
- when (ex) {
- is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "账号<$accno>交易繁忙,请稍后再试")
- else -> throw ex
- }
- }
- }
-
- private fun getLockUserdtlNowait(refno: String): TUserdtl {
- return try {
- userdtlDao.findByRefnoForUpdateNowait(refno)
- ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
- } catch (ex: Exception) {
- when (ex) {
- is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.LOCK_READ_TIMEOUT, "交易参考号<$refno>流水被锁定,请稍后再试")
- else -> throw ex
- }
- }
- }
-
- private fun getLockUserdtl(refno: String): TUserdtl {
- return userdtlDao.findByRefnoForUpdate(refno)
- ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
- }
-
- private fun doDealAccount(accno: String, amount: Double, overdraft: Boolean): TAccount {
- val account = getlockAccount(accno)
- if (account.tacCheck())
- throw TransactionProcessException(TradeErrorCode.ACCOUNT_TAC_ERROR, "账户<$accno>tac校验异常")
-
- account.addAmount(amount) //入账
- if (account.checkOverflow())
- throw TransactionProcessException(TradeErrorCode.OVERFLOW_BALANCE_ERROR, "账户<$accno>已超最大余额限制")
-
- if (!overdraft && account.checkOverdraft())
- throw TransactionProcessException(TradeErrorCode.SHORT_BALANCE_ERROR, "账户<$accno>余额不足")
-
- return accountDao.save(account) //入库更新
- }
-
- private fun doDealShopacc(shopaccno: String, amount: Double) {
- return
- }
-
- override fun process(builder: PersonTransBuilder): TUserdtl {
- return finish(init(builder), TradeDict.DTL_STATUS_SUCCESS, builder.resultMap)
- }
-
- override fun init(builder: PersonTransBuilder): TUserdtl {
- //判断第三方流水号重复 标准:shopaccno + outtradeno 唯一?
- var userdtl = userdtlDao.findByOuttradenoAndShopaccno(builder.outtradeno, builder.shopaccno) //加锁?
- if (null != userdtl) {
- if (TradeDict.DTL_STATUS_INIT != userdtl.status) {
- throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复") //非初始化状态,直接报错
- }
- //fixme: 判断是同一笔交易重发(标准??) 是->已初始化直接返回;否 -> 报错:外部流水号重复
- if (builder.amount == userdtl.amount && builder.paytype == userdtl.paytype && builder.transDate == userdtl.transdate && builder.transTime == userdtl.transtime) {
- return userdtl // 交易日期,时间重发时是否会变??
- } else {
- throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复")
- }
- }
-
- userdtl = TUserdtl() // 新建流水
- userdtl.refno = systemUtilService.refno
- userdtl.accdate = systemUtilService.accdate
- userdtl.userid = builder.person.userid
- if (StringUtil.isEmpty(builder.transDate)) {
- userdtl.transdate = systemUtilService.sysdatetime.hostdate
- } else {
- userdtl.transdate = builder.transDate
- }
- if (StringUtil.isEmpty(builder.transTime)) {
- userdtl.transdate = systemUtilService.sysdatetime.hosttime
- } else {
- userdtl.transtime = builder.transTime
- }
- userdtl.paytype = builder.paytype
- userdtl.payinfo = builder.payinfo
- userdtl.transcode = builder.transcode
- if (StringUtil.isEmpty(builder.description)) {
- userdtl.transdesc = systemUtilService.getTranscodeName(builder.transcode, null)
- } else {
- userdtl.transdesc = builder.description
- }
- userdtl.outtradeno = builder.outtradeno
- userdtl.shopaccno = builder.shopaccno
-// userdtl.operid =
- when (builder.tradetype) {
- Tradetype.RECHARGE -> userdtl.tradeflag = 1
- Tradetype.CONSUME -> userdtl.tradeflag = 2
- }
- userdtl.createtime = systemUtilService.sysdatetime.hostdatetime
-
- userdtl.amount = builder.amount
- userdtl.status = TradeDict.DTL_STATUS_INIT
- userdtlDao.save(userdtl)
-
- builder.details.forEach {
- TDebitCreditDtl().apply {
- refno = userdtl.refno
- seqno = it.rowno
- drsubjno = it.debitSubjNo
- draccno = it.debitAccNo
- crsubjno = it.creditSubjNo
- craccno = it.creditAccNo
- amount = it.amount
- summary = it.summary
- debitCreditDtlDao.save(this)
- }
- }
-
- if (builder.extendMap.isNotEmpty()) {
- userdtlBusinessDao.save(TUserdtlBusiness(userdtl.refno, builder.extendMap)) //保存参数
- }
-
- return userdtl
- }
-
- override fun finish(paydtl: TUserdtl, status: String, businessData: Map<String, String>?): TUserdtl {
- return finish(paydtl.refno, status, businessData)
- }
-
- private fun fail(userdtl: TUserdtl, businessData: Map<String, String>?) {
- //失败
- if (TradeDict.DTL_STATUS_SUCCESS == userdtl.status)
- throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水已经交易成功")
- userdtl.status = TradeDict.DTL_STATUS_FAIL
- userdtl.endtime = systemUtilService.sysdatetime.hostdatetime
- userdtl.remark = businessData?.get("errmsg")
- userdtlDao.save(userdtl)
- }
-
- private fun success(userdtl: TUserdtl, businessData: Map<String, String>?) {
- if (TradeDict.DTL_STATUS_SUCCESS == userdtl.status) {
- return
- }
- //TODO 校验已经成功的流水,不重复入账
- debitCreditDtlDao.findByRefno(userdtl.refno).forEach { detail ->
- //个人账户入账
- if (Subject.SUBJNO_PERSONAL_DEPOSIT == detail.drsubjno) {
- doDealAccount(detail.draccno, -1 * detail.amount, false) //借方消费
- }
- if (Subject.SUBJNO_PERSONAL_DEPOSIT == detail.crsubjno) {
- doDealAccount(detail.craccno, detail.amount, false) //贷方充值
- }
-
- //商户入账
- if (Subject.SUBJNO_MACHANT_INCOME == detail.drsubjno) {
- doDealShopacc(detail.draccno, -1 * detail.amount)
- }
- if (Subject.SUBJNO_MACHANT_INCOME == detail.crsubjno) {
- doDealShopacc(detail.craccno, detail.amount)
- }
- }
-
- userdtl.status = TradeDict.DTL_STATUS_SUCCESS
- userdtl.accdate = systemUtilService.accdate //入账成功时更新
- userdtl.endtime = systemUtilService.sysdatetime.hostdatetime
- //TODO 存储一些业务参数
- userdtlDao.save(userdtl)
- }
-
- override fun finish(refno: String, status: String, businessData: Map<String, String>?): TUserdtl {
- val userdtl = getLockUserdtl(refno)
- return when (status) {
- TradeDict.DTL_STATUS_FAIL -> {
- fail(userdtl, businessData)
- userdtl
- }
- TradeDict.DTL_STATUS_SUCCESS -> {
- //成功
- success(userdtl, businessData)
- userdtl
- }
- else -> throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR, "未指定明确的交易结束状态")
- }
- }
-
- override fun wip(paydtl: TUserdtl): TUserdtl {
- return wip(paydtl.refno)
- }
-
- override fun wip(refno: String): TUserdtl {
- val userdtl = getLockUserdtlNowait(refno)
- if (TradeDict.DTL_STATUS_WIP == userdtl.status) {
- return userdtl
- }
-
- if (TradeDict.DTL_STATUS_INIT != userdtl.status) {
- throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_NOT_INIT,
- "交易参考号<$refno>非初始化流水")
- }
- userdtl.status = TradeDict.DTL_STATUS_WIP //待支付
- return userdtlDao.save(userdtl)
- }
-
- override fun wip(builder: PersonTransBuilder): TUserdtl {
- return wip(builder.refno)
- }
-
- override fun finish(builder: PersonTransBuilder): TUserdtl {
- return finish(builder.refno, builder.status, builder.resultMap)
- }
-
- override fun getUserdtlForUpdateNowait(refno: String): TUserdtl {
- return try {
- userdtlDao.findByRefnoForUpdateNowait(refno)
- ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "交易参考号<$refno>流水不存在")
- } catch (ex: Exception) {
- when (ex) {
- is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "流水<$refno>被锁定,请稍后再试")
- else -> throw ex
- }
- }
- }
-
- override fun getUserdtlByBillnoForUpdateNowait(billno: String, shopaccno: String): TUserdtl {
- return try {
- userdtlDao.findByBillnoForUpdateNowait(billno, shopaccno)
- ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "商户流水号<$billno>流水不存在")
- } catch (ex: Exception) {
- when (ex) {
- is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "商户流水号<$billno>流水被锁定,请稍后再试")
- else -> throw ex
- }
- }
- }
-}
\ No newline at end of file
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 4e355cf..ac98e14 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
@@ -384,6 +384,7 @@
throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>状态错误")
}
transaction.status = TradeDict.DTL_STATUS_SUCCESS
+ transaction.accdate = systemUtilService.accdate
if (transaction.person) {
// update account balance
transaction.personDtl?.let {
@@ -391,6 +392,7 @@
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
@@ -405,6 +407,7 @@
} ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
"商户流水<${transaction.refno}>不存在")
transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS
+ transaction.shopDtl.accdate = transaction.accdate
}
if (transaction.subject) {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
index ba07cda..f10c1a3 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
@@ -1,12 +1,9 @@
package com.supwisdom.dlpay.api.service
-import com.supwisdom.dlpay.api.PersonTransBuilder
import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TUserdtl
import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
import com.supwisdom.dlpay.framework.domain.TShopacc
import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.domain.TTranstype
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
@@ -20,56 +17,9 @@
fun readShopAcc(shopId: Int): TShopacc
- fun readShopbyAccno(shpoacc: String): TShopacc
+ fun readShopbyShopaccno(shopaccno: String): TShopacc
fun readSubject(subjno: String): TSubject
fun readFeetype(feetype: String, paytype: String): TFeetypeConfig
}
-
-interface PersonBalancePayService {
-
- /**
- * 一步完成交易
- */
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun process(builder: PersonTransBuilder): TUserdtl
-
- /**
- * 两步交易,交易初始化方法,检查交易参数,记录交易流水
- */
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun init(builder: PersonTransBuilder): TUserdtl
-
- /**
- * 两步交易,完成交易过程,包括更新交易状态(成功、失败),更新借贷双方余额
- */
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun finish(paydtl: TUserdtl, status: String, businessData: Map<String, String>?): TUserdtl
-
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun finish(refno: String, status: String, businessData: Map<String, String>?): TUserdtl
-
- /**
- * 两步交易,交易过程中判断交易状态,并更新交易状态为 wip
- * 如果交易记录被锁,立刻抛出异常
- * @throws TransactionProcessException
- */
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun wip(paydtl: TUserdtl): TUserdtl
-
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun wip(refno: String): TUserdtl
-
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun wip(builder: PersonTransBuilder): TUserdtl
-
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun finish(builder: PersonTransBuilder): TUserdtl
-
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun getUserdtlForUpdateNowait(refno: String): TUserdtl
-
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
- fun getUserdtlByBillnoForUpdateNowait(billno: String, shopaccno: String): TUserdtl
-}
\ No newline at end of file