增加导入用户信息功能
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
index 6ee3e99..a5384e2 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
@@ -1,10 +1,16 @@
 package com.supwisdom.dlpay.api.dao;
 
 import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.framework.domain.TPerson;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public interface PersonIdentityDao extends JpaRepository<TPersonIdentity, String> {
   TPersonIdentity getByThirdUid(String thirdUid);
+
+  @Query(value = "select * from TB_PERSON_IDENTITY where userid =:userid",nativeQuery = true)
+  TPersonIdentity getByUserid(@Param("userid")String userid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
index b61b293..1de4f1d 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
@@ -5,7 +5,8 @@
 import javax.persistence.*;
 
 @Entity
-@Table(name = "TB_PERSON_IDENTITY")
+@Table(name = "TB_PERSON_IDENTITY",
+    indexes = {@Index(name = "person_userid_idx", columnList = "userid")})
 public class TPersonIdentity {
   //  市民卡号
   @Id
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TPerson.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TPerson.java
index a2e361c..8b79e4c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TPerson.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TPerson.java
@@ -1,7 +1,5 @@
 package com.supwisdom.dlpay.framework.domain;
 
-import org.hibernate.annotations.GenericGenerator;
-
 import javax.persistence.*;
 
 @Entity
@@ -10,8 +8,6 @@
         @Index(name = "person_idno_uk", unique = true, columnList = "idtype,idno")})
 public class TPerson {
   @Id
-  @GenericGenerator(name = "idGenerator", strategy = "uuid")
-  @GeneratedValue(generator = "idGenerator")
   @Column(name = "USERID", nullable = false, length = 32)
   private String userid;
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
index 918cb87..8289e96 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.system.service;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.bean.UserInforResponse;
 import com.supwisdom.dlpay.api.domain.TAccount;
 import com.supwisdom.dlpay.api.domain.TPersonIdentity;
 import com.supwisdom.dlpay.api.domain.TPointsAccount;
@@ -9,6 +10,7 @@
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import com.supwisdom.dlpay.water.bean.UserAccountSearchBean;
 import com.supwisdom.dlpay.water.pojo.UserAccountDTO;
+import org.jetbrains.annotations.Nullable;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -45,6 +47,9 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     TPersonIdentity getPersonIdentityByThirdUid(String thirdUid);
 
+    @Transactional(rollbackFor = Exception.class)
+    TPersonIdentity getPersonIdentityByThirdUidOrUserid(String thirdUid,String userid);
+
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     TPersonIdentity updateCoamount(String thirdUid,Double amount);
 
@@ -54,5 +59,11 @@
     @Transactional(rollbackFor = Exception.class, readOnly = true)
     PageResult<UserAccountDTO> queryUserAccByParam(UserAccountSearchBean param);
 
+    @Transactional(rollbackFor = Exception.class)
+    TPersonIdentity saveUserInfoFromPayApi(UserInforResponse payApiUser, TPersonIdentity localIdentity,TPerson person);
+
     double subtract(Double minuend, Double subtractor);
+
+    @Transactional(rollbackFor = Exception.class)
+    TPerson savePerson(UserInforResponse userInfo);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
index ea422fd..b70140a 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.system.service.impl;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.bean.UserInforResponse;
 import com.supwisdom.dlpay.api.dao.AccountDao;
 import com.supwisdom.dlpay.api.dao.PersonDao;
 import com.supwisdom.dlpay.api.dao.PersonIdentityDao;
@@ -189,14 +190,20 @@
 
     @Override
     public TPersonIdentity getPersonIdentityByThirdUid(String thirdUid) {
-        TPersonIdentity personIdentity = personIdentityDao.getByThirdUid(thirdUid);
-        if (personIdentity != null) {
-            return personIdentity;
-        }
-        return null;
+        return personIdentityDao.getByThirdUid(thirdUid);
     }
 
-    @Override
+  @Override
+  public TPersonIdentity getPersonIdentityByThirdUidOrUserid(String thirdUid, String userid) {
+      TPersonIdentity personIdentity = personIdentityDao.getByThirdUid(thirdUid);
+      if (personIdentity != null) {
+        return personIdentity;
+      } else {
+        return personIdentityDao.getByUserid(userid);
+      }
+  }
+
+  @Override
     public TPersonIdentity updateCoamount(String thirdUid, Double amount) {
         TPersonIdentity personIdentity = personIdentityDao.getByThirdUid(thirdUid);
         if (null == personIdentity) {
@@ -249,7 +256,47 @@
         return new PageResult<>(count.longValue(), list);
     }
 
-    public double subtract(Double minuend,Double subtractor){
+    @Override
+    public TPersonIdentity saveUserInfoFromPayApi(UserInforResponse payApiUser, TPersonIdentity localIdentity,TPerson person) {
+        String dateTime = systemUtilService.getSysdatetime().getHostdatetime();
+        if (null == localIdentity) {
+            TPersonIdentity identity = buildNwIdentity(person, payApiUser, dateTime);
+            identity.setCoamount(0.0);
+            identity.setAccamount(0.0);
+            return personIdentityDao.save(identity);
+        } else {
+            if (payApiUser.getCardno().equals(localIdentity.getThirdUid())) {
+                localIdentity.setCardphyId(payApiUser.getCardphyid());
+                localIdentity.setStatus(payApiUser.getCardstatus());
+                localIdentity.setPerson(person);
+                return personIdentityDao.save(localIdentity);
+            } else {
+                TPersonIdentity identity = buildNwIdentity(person, payApiUser, dateTime);
+                identity.setCoamount(localIdentity.getCoamount());
+                identity.setAccamount(localIdentity.getAccamount());
+                personIdentityDao.delete(localIdentity);
+                return personIdentityDao.save(identity);
+            }
+        }
+    }
+
+    @Override
+    public TPerson savePerson(UserInforResponse userInfo) {
+        Optional<TPerson> optional = personDao.findById(userInfo.getUserid());
+        String dateTime = systemUtilService.getSysdatetime().getHostdatetime();
+        if (optional.isPresent()) {
+            TPerson person = optional.get();
+            savePersonInfo(person, userInfo, dateTime);
+            return personDao.save(person);
+        }else {
+            TPerson person = new TPerson();
+            person.setUserid(userInfo.getUserid());
+            savePersonInfo(person, userInfo, dateTime);
+            return personDao.save(person);
+        }
+    }
+
+    public double subtract(Double minuend, Double subtractor){
         if (minuend == null) {
             minuend = 0.0;
         }
@@ -266,4 +313,23 @@
                 new BigDecimal(String.valueOf(d2))
         ).doubleValue();
     }
+
+    private void savePersonInfo(TPerson person, UserInforResponse payApiUser,String dateTime) {
+        person.setIdtype(payApiUser.getIdtype());
+        person.setLastsaved(dateTime);
+        person.setMobile(payApiUser.getPhone());
+        person.setName(payApiUser.getUsername());
+        person.setSex(payApiUser.getSex());
+        person.setStatus(payApiUser.getTransstatus());
+    }
+
+    private TPersonIdentity buildNwIdentity(TPerson person, UserInforResponse payApiUser,String dateTime) {
+        TPersonIdentity identity = new TPersonIdentity();
+        identity.setThirdUid(payApiUser.getCardno());
+        identity.setCardphyId(payApiUser.getCardphyid());
+        identity.setCreatetime(dateTime);
+        identity.setStatus(payApiUser.getCardstatus());
+        identity.setPerson(person);
+        return identity;
+    }
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index 22591b6..68dbea4 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -41,18 +41,18 @@
     }
 }
 
-class QueryUserParam : APIRequestParam() {
-    @Sign
-    var userid: String? = null  // 用户ID二选一 (两者都传取userid)
-    @Sign
-    var uid: String? = null    // 用户ID二选一
-
-    override fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
-
-        return true
-    }
-}
+//class QueryUserParam : APIRequestParam() {
+//    @Sign
+//    var userid: String? = null  // 用户ID二选一 (两者都传取userid)
+//    @Sign
+//    var uid: String? = null    // 用户ID二选一
+//
+//    override fun checkParam(): Boolean {
+//        if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
+//
+//        return true
+//    }
+//}
 
 class ModifyUserParam : APIRequestParam() {
     @Sign
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
index 3ba083b..f433ab1 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -94,9 +94,22 @@
     @PostMapping("/card/purseinit")
     fun cardPurseInit(param: CardPayRequest): ResponseEntity<Any> {
         try {//1. 通过 citizenCardno 检查用户以及合法性
-            val personIdentity = userDataService.getPersonIdentityByThirdUid(param.citizenCardno)
-                    ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "未查询到您的身份信息"))
+            val userInfo = userProxy.querybycardno(QueryUserParam().apply {
+                this.citizencardno = param.citizenCardno
+            })
+            if (userInfo.retcode != 0) {
+                logger.error { "获取卡号为${param.citizenCardno}的用户信息失败,错误信息:${userInfo.retmsg}" }
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, userInfo.retmsg))
+            }
+            if (userInfo.cardstatus != TradeDict.STATUS_NORMAL || userInfo.transstatus != TradeDict.STATUS_NORMAL) {
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "用户消费状态异常"))
+            }
+            val person = userDataService.savePerson(userInfo)
+            val localIdentity = userDataService.
+                    getPersonIdentityByThirdUidOrUserid(param.citizenCardno,userInfo.userid)
+            val personIdentity = userDataService.saveUserInfoFromPayApi(userInfo, localIdentity,person)
             val notaccAmount = userDataService.subtract(personIdentity.coamount, personIdentity.accamount)
             //2. 通过 deviceno 查询设备费率参数
             val todayAmount = collectdtlService.getTodayAmount(personIdentity.person.userid) ?: 0.0
@@ -275,14 +288,21 @@
             if (userInfo.cardstatus != TradeDict.STATUS_NORMAL || userInfo.transstatus != TradeDict.STATUS_NORMAL) {
                 return ModelAndView("error/500").addObject("errorMsg", "用户消费状态异常")
             }
+            val person = userDataService.savePerson(userInfo)
+            val localIdentity = userDataService.
+                    getPersonIdentityByThirdUidOrUserid(null,userInfo.userid)
+            val personIdentity = userDataService.saveUserInfoFromPayApi(userInfo, localIdentity,person)
             val collectDtl = collectdtlService.pretendAsCard(userInfo, cobillno)
             val deviceParam = deviceService.getParaMapByDeviceno(collectDtl.deviceno)
-            val personIdentity = userDataService.getPersonIdentityByThirdUid(userInfo.cardno)
-                    ?:  return ModelAndView("error/500").addObject("errorMsg", "未查询到您的身份信息")
             val notaccAmount = userDataService.subtract(personIdentity.coamount, personIdentity.accamount)
             if (notaccAmount > deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()) {
                 return ModelAndView("error/500").
-                        addObject("errorMsg", "你的未入账金额为${notaccAmount},已超过最大限额:${deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()}")
+                        addObject("errorMsg", "你的未入账金额为$notaccAmount,已超过最大限额:${deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()}")
+            }
+            val todayAmount = collectdtlService.getTodayAmount(personIdentity.person.userid) ?: 0.0
+            if (todayAmount > deviceParam[WaterDeviceParam.dayAmountLimit]!!.toInt()) {
+                return ModelAndView("error/500").
+                        addObject("errorMsg", "今日消费$todayAmount,已达每日限额")
             }
             if (collectDtl.status != TradeDict.DTL_STATUS_INIT) {
                 return ModelAndView("error/500").addObject("errorMsg", "流水状态异常")