TCard定义和同步
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
index 91c7bac..174a3a3 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
@@ -3,10 +3,7 @@
import com.supwisdom.dlpay.api.domain.TAccount;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
-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.data.jpa.repository.*;
import org.springframework.data.repository.query.Param;
import javax.persistence.LockModeType;
@@ -39,4 +36,8 @@
@Query("select a from TAccount a where a.person.name like CONCAT('%',:accname,'%') ")
Page<TAccount> findAllByAccnameContaining(@Param("accname") String accname, Pageable pageable);
+
+ @Modifying
+ @Query("update TAccount set accname=?1 where userid=?2")
+ void updateAccnameByUserid(String accname, String userid);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
new file mode 100644
index 0000000..74473d8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TCard;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+public interface CardDao extends JpaRepository<TCard, String> {
+
+ @Query("from TCard t where t.cardno=?1 and t.cardtype=?2")
+ TCard findCardByCardnoAndCardtype(String cardno, String cardtype);
+
+ @Modifying
+ @Query("update TCard set status='closed' where userid=?1 and cardtype='bankcard' ")
+ void closedBankcardStatusByUserid(String userid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java
new file mode 100644
index 0000000..dcf8f49
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java
@@ -0,0 +1,151 @@
+package com.supwisdom.dlpay.api.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_CARD",
+ indexes = {@Index(name = "tb_card_uk", columnList = "cardno,cardtype", unique = true)})
+public class TCard {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "CARDNO", nullable = false, length = 32)
+ private String cardno;
+
+ @Column(name = "CARDTYPE", nullable = false, length = 20)
+ private String cardtype;
+
+ @Column(name = "CARDPHYID", length = 20)
+ private String cardphyid;
+
+ @Column(name = "STATUS", nullable = false, length = 20)
+ private String status; //normal/closed
+
+ @Column(name = "TRANS_STATUS", nullable = false, length = 20)
+ private String transStatus; //normal/loss/frozen/locked
+
+ @Column(name = "EXPIREDATE", length = 20)
+ private String expiredate;
+
+ @Column(name = "SIGNED", nullable = false, length = 10)
+ private Boolean signed = false; //签约状态
+
+ @Column(name = "USERID", nullable = false, length = 20)
+ private String userid;
+
+ @Column(name = "LASTSAVED", length = 20)
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public TCard() {
+ }
+
+ public TCard(String cardno, String cardtype, String cardphyid, String status, String transStatus, String expiredate, Boolean signed, String userid, String lastsaved) {
+ this.cardno = cardno;
+ this.cardtype = cardtype;
+ this.cardphyid = cardphyid;
+ this.status = status;
+ this.transStatus = transStatus;
+ this.expiredate = expiredate;
+ this.signed = signed;
+ this.userid = userid;
+ this.lastsaved = lastsaved;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getCardno() {
+ return cardno;
+ }
+
+ public void setCardno(String cardno) {
+ this.cardno = cardno;
+ }
+
+ public String getCardtype() {
+ return cardtype;
+ }
+
+ public void setCardtype(String cardtype) {
+ this.cardtype = cardtype;
+ }
+
+ public String getCardphyid() {
+ return cardphyid;
+ }
+
+ public void setCardphyid(String cardphyid) {
+ this.cardphyid = cardphyid;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getTransStatus() {
+ return transStatus;
+ }
+
+ public void setTransStatus(String transStatus) {
+ this.transStatus = transStatus;
+ }
+
+ public String getExpiredate() {
+ return expiredate;
+ }
+
+ public void setExpiredate(String expiredate) {
+ this.expiredate = expiredate;
+ }
+
+ public Boolean getSigned() {
+ return signed;
+ }
+
+ public void setSigned(Boolean signed) {
+ this.signed = signed;
+ }
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+
+ public String getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(String lastsaved) {
+ this.lastsaved = lastsaved;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java
index ddc4d15..ba7ac78 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java
@@ -110,6 +110,7 @@
value = value.replaceAll("'", "& #39;");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
+// value = value.replaceAll("'", "‘").replaceAll(";", ";").replaceAll("=", "").replaceAll("%", "").replaceAll("\\+", "");
value = value.replaceAll("script", "");
value = cleanSqlKeyWords(value);
return value;
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
index 3ccb2a7..95c4a86 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
@@ -11,12 +11,15 @@
public static final int SYSPARAID_NO1 = 1; //系统默认最大余额限制的ID
- public static final int SYSPARAID_NO2 = 2; //paraid=2
+ public static final int SYSPARAID_NO2 = 2; //默认免密额度
+ public static final int SYSPARAID_NO3 = 3; //默认日累计额度
public static final int SYSPARAID_NO2019 = 2019; //与卡管系统对接的应用ID
public static final int SYSPARAID_NO2020 = 2020; //与卡管系统对接的应用appkey
public static final int SYSPARAID_NO2021 = 2021; //与卡管系统对接的业务参数deskey
public static final double SYSPARA_NO1_DEFAULT = 10000.0; // 系统默认最大余额限制
+ public static final double SYSPARA_NO2_DEFAULT = 100.0; // 系统默认最大余额限制
+ public static final double SYSPARA_NO3_DEFAULT = 200.0; // 系统默认最大余额限制
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
index a525547..02afd88 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -33,4 +33,11 @@
* */
public static final int DICTTYPE_NO1 = 1; //冲正状态字典
public static final int DICTTYPE_NO2 = 2; //流水状态字典
+
+
+ /**
+ * 卡库同步的Cardtype
+ * */
+ public static final String CARDTYPE_CITIZENCARD = "citizencard";
+ public static final String CARDTYPE_BANKCARD = "bankcard";
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index 564689e..d373525 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -66,6 +66,18 @@
var idno: String = ""
var mobile: String? = null
var email: String? = null
+
+ fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(idtype) || StringUtil.isEmpty(idno) || StringUtil.isEmpty(username)) throw RequestParamCheckException("用户明细数据关键字段为空")
+ if (StringUtil.isEmpty(cardno) || StringUtil.isEmpty(cardphyid) || StringUtil.isEmpty(expiredate) || StringUtil.isEmpty(cardstatus)) throw RequestParamCheckException("卡片明细数据关键字段为空")
+ return true
+ }
+}
+
+class DaliDatasyncErrorDetail{
+ var cardno:String=""
+ var errcode:String=""
+ var errmsg:String=""
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
index 3f909c5..dea3d29 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
@@ -1,7 +1,10 @@
package com.supwisdom.dlpay.api.controller
+import com.google.gson.Gson
+import com.supwisdom.dlpay.api.bean.DaliDatasyncErrorDetail
import com.supwisdom.dlpay.api.bean.DaliDatasyncParam
import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.api.service.DaliDatasyncService
import com.supwisdom.dlpay.framework.ResponseBodyBuilder
import com.supwisdom.dlpay.framework.service.SystemUtilService
import com.supwisdom.dlpay.framework.util.StringUtil
@@ -14,6 +17,8 @@
class DaliDatasyncApiController {
@Autowired
lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ lateinit var daliDatasyncService: DaliDatasyncService
/**
* ============================================================================
@@ -45,14 +50,34 @@
.fail(2002, "请求参数错误[数据条数不匹配]"))
}
- datalist.forEach {
- TODO("更新数据逻辑")
+ var errlist = ArrayList<DaliDatasyncErrorDetail>(0)
+
+ datalist.forEach {detail->
+ try {
+ detail.checkParam()
+ daliDatasyncService.doUpdateUserInfos(detail)
+ } catch (e1: RequestParamCheckException) {
+ errlist.add(DaliDatasyncErrorDetail().apply {
+ cardno = detail.cardno
+ errcode = "2001"
+ errmsg = e1.message?:"明细数据关键字段为空"
+ })
+ }catch (e2: Exception){
+ errlist.add(DaliDatasyncErrorDetail().apply {
+ cardno = detail.cardno
+ errcode = "3000"
+ errmsg = e2.message?:"明细处理错误"
+ })
+ }
}
- return return ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "SUCCESS"))
+ return when(StringUtil.isEmpty(errlist)){
+ true -> ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "SUCCESS", "resultcode" to "0000", "resultmsg" to ""))
+ false -> ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "请求成功接收", "resultcode" to "0000", "resultmsg" to "明细数据处理有错", "data" to Gson().toJson(errlist)))
+ }
} catch (ex: RequestParamCheckException) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(ex.errCode, ex.message ?: "请求参数错误"))
+ .fail(2001, ex.message ?: "请求参数错误"))
} catch (e: Exception) {
e.printStackTrace()
return ResponseEntity.ok(ResponseBodyBuilder.create()
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
new file mode 100644
index 0000000..b85342f
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+interface DaliDatasyncService{
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ fun doUpdateUserInfos(bean: DaliDatasyncDetail): Boolean
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
new file mode 100644
index 0000000..c93f514
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
@@ -0,0 +1,134 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
+import com.supwisdom.dlpay.api.dao.AccountDao
+import com.supwisdom.dlpay.api.dao.CardDao
+import com.supwisdom.dlpay.api.dao.PersonDao
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TCard
+import com.supwisdom.dlpay.api.domain.TPerson
+import com.supwisdom.dlpay.api.service.DaliDatasyncService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.util.ConstantUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class DaliDatasyncServiceImpl : DaliDatasyncService {
+ @Autowired
+ lateinit var accountDao: AccountDao
+ @Autowired
+ lateinit var personDao: PersonDao
+ @Autowired
+ lateinit var cardDao: CardDao
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+
+ override fun doUpdateUserInfos(bean: DaliDatasyncDetail): Boolean {
+ val maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT)
+ val lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO2, SysparaUtil.SYSPARA_NO2_DEFAULT)
+ val daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO3, SysparaUtil.SYSPARA_NO3_DEFAULT)
+
+ val systime = systemUtilService.sysdatetime
+ var person = personDao.findByIdentity(bean.idtype.trim(), bean.idno.trim())
+ if (null != person) {
+ if (person.name != bean.username) {
+ person.name = bean.username
+ person.lastsaved = systime.hostdatetime
+ person = personDao.save(person)
+ accountDao.updateAccnameByUserid(person.name, person.userid)
+ }
+ } else {
+ person = TPerson().apply {
+ name = bean.username
+ status = TradeDict.STATUS_NORMAL
+ idtype = bean.idtype.trim()
+ idno = bean.idno.trim()
+ email = bean.email
+ mobile = bean.mobile
+ lastsaved = systime.hostdatetime
+ }
+ person.tenantid = TenantContext.getTenantSchema()
+ person = personDao.save(person)
+
+ var account = TAccount().apply {
+ accname = person.name
+ subjno = Subject.SUBJNO_PERSONAL_DEPOSIT
+ userid = person.userid
+ transStatus = person.status
+ balance = 0.00
+ availbal = 0.00
+ frozebal = 0.00
+ lowfreeFlag = false
+ this.lowfreeLimit = lowfreeLimit
+ this.daylimit = daylimit
+ this.maxbal = maxbal
+ lasttranstime = systime.sysdate
+ lastdayTransamt = 0.00
+ lastdayDpsamt = 0.00
+ opendate = systime.hostdate
+ }
+ account.generateTac()
+ account.tenantid = TenantContext.getTenantSchema()
+ accountDao.save(account)
+ }
+
+ var cityCard = cardDao.findCardByCardnoAndCardtype(bean.cardno.trim(), ConstantUtil.CARDTYPE_CITIZENCARD)
+ if (null != cityCard) {
+ //仅修改有效期和状态
+ if (cityCard.expiredate != bean.expiredate.trim()) {
+ cityCard.expiredate = bean.expiredate.trim()
+ }
+ //fixme: bean.cardstatus 判断修改状态
+
+ cardDao.save(cityCard)
+ } else {
+ cityCard = TCard().apply {
+ cardno = bean.cardno.trim()
+ cardtype = ConstantUtil.CARDTYPE_CITIZENCARD
+ cardphyid = bean.cardphyid.trim()
+ status = TradeDict.STATUS_NORMAL // fixme: bean.cardstatus 判断
+ transStatus = TradeDict.STATUS_NORMAL
+ expiredate = bean.expiredate.trim()
+ signed = false
+ userid = person.userid
+ lastsaved = systime.hostdatetime
+ }
+ cityCard.tenantid = TenantContext.getTenantSchema()
+ cardDao.save(cityCard)
+ }
+
+ if (!StringUtil.isEmpty(bean.bankcardno)) {
+ var bankCard = cardDao.findCardByCardnoAndCardtype(bean.bankcardno!!.trim(), ConstantUtil.CARDTYPE_BANKCARD)
+ if (null == bankCard) {
+ bankCard = TCard().apply {
+ cardno = bean.bankcardno!!.trim()
+ cardtype = ConstantUtil.CARDTYPE_BANKCARD
+ cardphyid = ""
+ status = TradeDict.STATUS_NORMAL // fixme: bean.cardstatus 判断
+ transStatus = TradeDict.STATUS_NORMAL
+ expiredate = "21991231"
+ signed = false
+ userid = person.userid
+ lastsaved = systime.hostdatetime
+ }
+ cardDao.closedBankcardStatusByUserid(bankCard.userid) //注销其他银行卡
+ bankCard.tenantid = TenantContext.getTenantSchema()
+ cardDao.save(bankCard) //绑定新的银行卡
+
+ } else {
+ if (bankCard.userid != person.userid) {
+ throw TransactionProcessException(3000, "银行卡已被人绑定")
+ }
+ }
+ }
+
+ return true
+ }
+
+
+
+}
\ No newline at end of file