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/domain/TSyspara.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
index 3434b87..d669146 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
@@ -28,7 +28,7 @@
   private String paraunit;
 
   @Column(name = "VALUETYPE", length = 10)
-  private String valueType = SysparaUtil.SYSPARA_VALUETYPE_STRING;
+  private String valueType = SysparaUtil.VALUETYPE_STRING;
 
   @Column(name = "EDITFLAG", precision = 1)
   @NotNull
@@ -156,17 +156,17 @@
    */
   public boolean checkValueInvalid() {
     if (!StringUtil.isEmpty(this.paraval)) {
-      if (SysparaUtil.SYSPARA_VALUETYPE_AMOUNT.equals(this.valueType) && !NumberUtil.isAmount(this.paraval)) {
+      if (SysparaUtil.VALUETYPE_AMOUNT.equals(this.valueType) && !NumberUtil.isAmount(this.paraval)) {
         return true; //参数值非金额类型
-      } else if (SysparaUtil.SYSPARA_VALUETYPE_DECIMAL.equals(this.valueType) && !NumberUtil.isDecimal(this.paraval)) {
+      } else if (SysparaUtil.VALUETYPE_DECIMAL.equals(this.valueType) && !NumberUtil.isDecimal(this.paraval)) {
         return true; //参数值非数值类型
-      } else if (SysparaUtil.SYSPARA_VALUETYPE_NUMBER.equals(this.valueType) && !NumberUtil.isNumber(this.paraval)) {
+      } else if (SysparaUtil.VALUETYPE_NUMBER.equals(this.valueType) && !NumberUtil.isNumber(this.paraval)) {
         return true; //参数值非整数
-      } else if (SysparaUtil.SYSPARA_VALUETYPE_SWITCH.equals(this.valueType) && !"1".equals(this.paraval) && !"0".equals(this.paraval)) {
+      } else if (SysparaUtil.VALUETYPE_SWITCH.equals(this.valueType) && !"1".equals(this.paraval) && !"0".equals(this.paraval)) {
         return true; //参数值非开关量 0/1
-      } else if (SysparaUtil.SYSPARA_VALUETYPE_DATE.equals(this.valueType) && !DateUtil.checkDatetimeValid(this.paraval, "yyyyMMdd")) {
+      } else if (SysparaUtil.VALUETYPE_DATE.equals(this.valueType) && !DateUtil.checkDatetimeValid(this.paraval, "yyyyMMdd")) {
         return true; //参数值非日期格式
-      } else if (SysparaUtil.SYSPARA_VALUETYPE_DATETIME.equals(this.valueType) && !DateUtil.checkDatetimeValid(this.paraval, "yyyyMMddHHmmss")) {
+      } else if (SysparaUtil.VALUETYPE_DATETIME.equals(this.valueType) && !DateUtil.checkDatetimeValid(this.paraval, "yyyyMMddHHmmss")) {
         return true; //参数值非日期时间格式
       }
     }
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 652a35c..a67d6ff 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
@@ -1,23 +1,26 @@
 package com.supwisdom.dlpay.framework.util;
 
 public class SysparaUtil {
-  public static final String SYSPARA_VALUETYPE_AMOUNT = "amount"; //金额类型 Double
-  public static final String SYSPARA_VALUETYPE_SWITCH = "switch"; //开关类型 Boolean 0/1
-  public static final String SYSPARA_VALUETYPE_DATE = "date"; //日期类型 yyyyMMdd
-  public static final String SYSPARA_VALUETYPE_DATETIME = "datetime"; //日期+时间 yyyyMMddHHmmss
-  public static final String SYSPARA_VALUETYPE_DECIMAL = "decimal"; //数值
-  public static final String SYSPARA_VALUETYPE_NUMBER = "number "; //整数,包含正负
-  public static final String SYSPARA_VALUETYPE_STRING = "string"; //字符串
+  public static final String VALUETYPE_AMOUNT = "amount"; //金额类型 Double
+  public static final String VALUETYPE_SWITCH = "switch"; //开关类型 Boolean 0/1
+  public static final String VALUETYPE_DATE = "date"; //日期类型 yyyyMMdd
+  public static final String VALUETYPE_DATETIME = "datetime"; //日期+时间 yyyyMMddHHmmss
+  public static final String VALUETYPE_DECIMAL = "decimal"; //数值
+  public static final String VALUETYPE_NUMBER = "number "; //整数,包含正负
+  public static final String VALUETYPE_STRING = "string"; //字符串
 
 
-  public static final int SYSPARAID_NO1 = 1; //系统默认最大余额限制的ID
-  public static final int SYSPARAID_NO2 = 2; //paraid=2
-  public static final int SYSPARAID_NO3 = 3; //手机端用户过期时间(秒)
+  public static final int BALANCE_LIMIT = 1; //系统默认最大余额限制的ID
+  public static final int MOBILE_LOGIN_EXPIRE_IN_SECONDS = 4; //手机端用户过期时间(秒)
+  public static final int NOPASS_LIMIT = 2; //默认免密额度
+  public static final int DAY_PAY_LIMIT = 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 int DLCARDMANAGER_APPID = 2019; //与卡管系统对接的应用ID
+  public static final int DLCARDMANAGER_SECRET = 2020; //与卡管系统对接的应用appkey
+  public static final int DLCARDMANAGER_DESKEY = 2021; //与卡管系统对接的业务参数deskey
 
-  public static final double SYSPARA_NO1_DEFAULT = 10000.0; // 系统默认最大余额限制
+  public static final double DEFAULT_BALANCE_LIMIT = 10000.0; // 系统默认最大余额限制
+  public static final double DEFAULT_NOPASS_LIMIT = 100.0; // 默认免密额度
+  public static final double DEFAULT_DAY_PAY_LIMIT = 200.0; // 默认日累计额度
 
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
index 7fc2400..0cc0b4d 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -114,7 +114,7 @@
       account.setAvailbal(0.0);
       account.setFrozebal(0.0);
       account.setLowfreeFlag(false);
-      account.setMaxbal(systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT));
+      account.setMaxbal(systemUtilService.getSysparaValueAsDouble(SysparaUtil.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT));
       account.setLastdayDpsamt(0.0);
       account.setLastdayTransamt(0.0);
       account.setOpendate(systemDateTime.getHostdate());
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 6f56ce7..4bd34fe 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -40,4 +40,10 @@
 
   public static final String PAGE_USERXIEYI = "xieyi";//用户协议页面
   public static final String PAGE_BANKXIEYI = "bankxieyi";//银行协议页面
+
+  /**
+   * 卡库同步的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 dade3f2..5b5c19c 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
 
     /**
      * ============================================================================
@@ -25,9 +30,9 @@
     fun daliDatasync(@RequestBody param: DaliDatasyncParam): ResponseEntity<Any> {
         try {
             param.checkParam()
-            val appid = systemUtilService.getSysparaValue(SysparaUtil.SYSPARAID_NO2019)
-            val appkey = systemUtilService.getSysparaValue(SysparaUtil.SYSPARAID_NO2020)
-            val deskey = systemUtilService.getSysparaValue(SysparaUtil.SYSPARAID_NO2021)
+            val appid = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_APPID)
+            val appkey = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_SECRET)
+            val deskey = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_DESKEY)
             if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(appkey) || StringUtil.isEmpty(deskey)) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(1000, "系统参数未配置"))
@@ -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 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()
@@ -60,4 +85,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
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..be69c42
--- /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.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT)
+        val lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.NOPASS_LIMIT, SysparaUtil.DEFAULT_NOPASS_LIMIT)
+        val daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.DAY_PAY_LIMIT, SysparaUtil.DEFAULT_DAY_PAY_LIMIT)
+
+        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
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
index 6a17565..80ad233 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -7,7 +7,6 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.domain.TOperator
 import com.supwisdom.dlpay.framework.util.*
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.data.domain.PageRequest
@@ -68,7 +67,7 @@
                 lowfreeFlag = false
                 lowfreeLimit = lowfreeLimit
                 daylimit = daylimit
-                maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT)
+                maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.BALANCE_LIMIT, SysparaUtil.DEFAULT_BALANCE_LIMIT)
                 lasttranstime = systemdatetime.sysdate
                 lastdayTransamt = 0.0
                 lastdayDpsamt = 0.0
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
index 19d96ea..bd43e6f 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -3,11 +3,9 @@
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.supwisdom.dlpay.api.bean.JsonResult
 import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.ValidateCodeException
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.domain.JwtRedis
-import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
@@ -48,7 +46,7 @@
         logger.error(request.getParameter("platform"))
         val temp = authentication.principal as TBMobileUser
         val user = mobileUserDao.findByPhone(temp.phone)
-        val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3,60*60*24*3)
+        val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.MOBILE_LOGIN_EXPIRE_IN_SECONDS,60*60*24*3)
         jwtConfig.expiration = exp.toLong()
         if (user != null) {
             //TODO 从数据取jwtConfig.expiration
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index cf9247c..dc9457e 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -154,7 +154,7 @@
         }
         val encoder = BCryptPasswordEncoder()
         user!!.loginpwd = encoder.encode(pwd)
-        val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3, 60 * 60 * 24 * 3)
+        val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.MOBILE_LOGIN_EXPIRE_IN_SECONDS, 60 * 60 * 24 * 3)
         jwtConfig.expiration = exp.toLong()
         val authorities: Collection<GrantedAuthority> = AuthorityUtils.createAuthorityList("ROLE_USER")
         user.auths = authorities