增加大理门户修改卡片信息接口
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardInfo.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardInfo.java
new file mode 100644
index 0000000..11f9437
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardInfo.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
+public class QueryCardInfo {
+  private String id;
+  private String cardno;
+  private String cardtype;
+  private String cardphyid;
+  private String status;
+  private String transStatus;
+  private String expiredate;
+  private Boolean signed = false;
+  private String userid;
+  private String lastsaved;
+  private String tenantid = "";
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardResponse.java
new file mode 100644
index 0000000..61bb14f
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardResponse.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.*;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+public class QueryCardResponse extends ApiResponse {
+  QueryCardInfo card;
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonInfo.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonInfo.java
new file mode 100644
index 0000000..0426249
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonInfo.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
+public class QueryPersonInfo {
+  private String userid;
+  private String name;
+  private String sex;
+  private String status;
+  private String idtype;
+  private String idno;
+  private String country;
+  private String nation;
+  private String email;
+  private String tel;
+  private String mobile;
+  private String addr;
+  private String zipcode;
+  private String lastsaved;
+  private String tenantid = "";
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonResponse.java
new file mode 100644
index 0000000..035ff25
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonResponse.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.*;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+public class QueryPersonResponse extends ApiResponse {
+  QueryPersonInfo person;
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
index 2aece8f..45ea831 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
@@ -2,11 +2,12 @@
 
 import com.supwisdom.dlpay.api.bean.*;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.Map;
+
 @FeignClient(value = "userProxy", url = "${payapi.url}")
 public interface UserProxy {
   @PostMapping("/api/user/open")
@@ -37,11 +38,21 @@
   ApiResponse getUserPoints(@RequestBody UserPointsParam param);
 
   @PostMapping("/api/user/queryPersonDtl")
-  ApiResponse queryPersonDtl(@RequestBody QueryPersonDtlParam param);
+  Map<String, Object> queryPersonDtl(@RequestBody QueryPersonDtlParam param);
+
+  @PostMapping("/api/user/billcount")
+  Map<String, Object> billCount(@RequestParam("userid") String userid,@RequestParam("month") String month);
 
   @PostMapping("/api/user/queryPerson")
-  ApiResponse queryPerson(@RequestParam("userid") String userid);
+  QueryPersonResponse queryPerson(@RequestParam("userid") String userid);
 
   @PostMapping("/api/user/queryCard")
-  ApiResponse queryCard(@RequestBody QueryCardParam param);
+  QueryCardResponse queryCard(@RequestBody QueryCardParam param);
+
+  @PostMapping("/api/user/updateCardSign")
+  ApiResponse updateCardSign(@RequestParam("cardno") String cardno,@RequestParam("signed") Boolean signed);
+
+  @PostMapping("/api/user/updateCardTransStatus")
+  ApiResponse updateCardTransStatus(@RequestParam("cardno") String cardno,@RequestParam("status") String status);
+
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/DtlGroupResultBean.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/DtlGroupResultBean.kt
new file mode 100644
index 0000000..0e7ab74
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/DtlGroupResultBean.kt
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.api.bean
+
+import java.math.BigDecimal
+
+class DtlGroupResultBean {
+    var transtype:String = ""
+    var amount:BigDecimal = BigDecimal(0)
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
index 04a0a82..e0100f2 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
@@ -6,18 +6,15 @@
 import com.supwisdom.dlpay.api.service.KafkaSendMsgService
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import com.supwisdom.dlpay.system.bean.LevelBean
 import com.supwisdom.dlpay.system.service.PointsService
+import org.apache.commons.beanutils.BeanUtils
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
 import java.net.URLDecoder
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
 
 @RestController
 @RequestMapping("/api/user")
@@ -203,21 +200,64 @@
                 .success("ok"))
     }
 
+    @PostMapping("/billcount")
+    fun billCount(userid:String,month:String): ResponseEntity<Any> {
+        val page = useService.findDtlMonthCountByUserid(userid,month)
+        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("data", page!!)
+                .success("ok"))
+    }
+
     @PostMapping("/queryPerson")
     fun queryPersonDtl( userid:String ): ResponseEntity<Any> {
         val person = useService.findPersonByUserid(userid)
-                ?:ResponseEntity.ok(ResponseBodyBuilder.create()
+                ?:return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(500, "未找到[userid=${userid}]的用户"))
-        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("data", person)
-                .success("ok"))
+        return  ResponseEntity.ok(ResponseBodyBuilder.create()
+                .success(QueryPersonResponse().apply{
+                    this.retcode = 0
+                    this.retmsg = "ok"
+                    val personInfo = QueryPersonInfo()
+                    BeanUtils.copyProperties(personInfo,person)
+                    this.person = personInfo
+                },"ok"))
     }
 
     @PostMapping("/queryCard")
     fun queryCard(@RequestBody param: QueryCardParam): ResponseEntity<Any> {
         val card = cardService.getCardByCardNoOrUserid(param)
-                ?:ResponseEntity.ok(ResponseBodyBuilder.create()
+                ?:return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(500, "未找到指定条件的卡片"))
-        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("data", card)
-                .success("ok"))
+        return  ResponseEntity.ok(ResponseBodyBuilder.create()
+                .success(QueryCardResponse().apply {
+                    this.retcode = 0
+                    this.retmsg = "ok"
+                    val cardInfo = QueryCardInfo()
+                    BeanUtils.copyProperties(cardInfo,card)
+                    this.card = cardInfo
+                },"ok"))
+    }
+
+    @PostMapping("/updateCardSign")
+    fun updateCardSign(cardno:String,signed:Boolean):ResponseEntity<Any>{
+        val ret = cardService.updateCardSign(cardno, signed)
+        return if(ret.retcode==0){
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success(ret,"ok"))
+        }else{
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(ret.retcode, ret.retmsg))
+        }
+    }
+
+    @PostMapping("/updateCardTransStatus")
+    fun updateCardTransStatus(cardno:String,status:String):ResponseEntity<Any>{
+        val ret = cardService.updateCardTransStatus(cardno, status)
+        return if(ret.retcode==0){
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success(ret,"ok"))
+        }else{
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(ret.retcode, ret.retmsg))
+        }
     }
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt
index 7330e29..e99baab 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.api.service
 
+import com.supwisdom.dlpay.api.bean.ApiResponse
 import com.supwisdom.dlpay.api.bean.CardsResponse
 import com.supwisdom.dlpay.api.bean.QueryCardParam
 import com.supwisdom.dlpay.api.bean.UserInforResponse
@@ -26,4 +27,10 @@
 
     @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun getCardByCardNoOrUserid(param: QueryCardParam): TCard?
+
+    @Transactional(rollbackFor = arrayOf(Exception::class))
+    fun updateCardSign(cardno:String,signed:Boolean): ApiResponse
+
+    @Transactional(rollbackFor = arrayOf(Exception::class))
+    fun updateCardTransStatus(cardno:String,status:String): ApiResponse
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
index daa42d8..9a0c135 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
@@ -1,9 +1,6 @@
 package com.supwisdom.dlpay.api.service.impl
 
-import com.supwisdom.dlpay.api.bean.CardsResponse
-import com.supwisdom.dlpay.api.bean.CitizenCardInfo
-import com.supwisdom.dlpay.api.bean.QueryCardParam
-import com.supwisdom.dlpay.api.bean.UserInforResponse
+import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.dao.CardDao
 import com.supwisdom.dlpay.api.dao.PersonDao
 import com.supwisdom.dlpay.api.domain.TCard
@@ -172,4 +169,34 @@
         }
         return null
     }
+
+    override fun updateCardSign(cardno: String, signed: Boolean): ApiResponse {
+        val result = ApiResponse().apply {
+            this.retcode = 1
+            this.retmsg = "卡片不存在"
+        }
+        val card = cardDao.findCardByCardnoAndCardtype(cardno, ConstantUtil.CARDTYPE_BANKCARD)
+                ?: return result
+        card.signed = signed
+        cardDao.save(card)
+        return result.apply {
+            this.retcode = 0
+            this.retmsg = "ok"
+        }
+    }
+
+    override fun updateCardTransStatus(cardno: String, status: String): ApiResponse {
+        val result = ApiResponse().apply {
+            this.retcode = 1
+            this.retmsg = "卡片不存在"
+        }
+        val card = cardDao.findCardByCardnoAndCardtype(cardno, ConstantUtil.CARDTYPE_BANKCARD)
+                ?: return result
+        card.transStatus = status
+        cardDao.save(card)
+        return result.apply {
+            this.retcode = 0
+            this.retmsg = "ok"
+        }
+    }
 }
\ 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 8b40673..ce708b1 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
@@ -1,18 +1,25 @@
 package com.supwisdom.dlpay.api.service.impl
 
+import com.supwisdom.dlpay.api.bean.DtlGroupResultBean
 import com.supwisdom.dlpay.api.bean.ModifyUserParam
 import com.supwisdom.dlpay.api.bean.OpenUserParam
 import com.supwisdom.dlpay.api.bean.QueryPersonDtlParam
 import com.supwisdom.dlpay.api.dao.*
 import com.supwisdom.dlpay.api.domain.*
-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.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
+import org.hibernate.query.NativeQuery
+import org.hibernate.transform.Transformers
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.data.domain.PageRequest
 import org.springframework.data.domain.Sort
 import org.springframework.stereotype.Service
+import java.math.BigDecimal
+import javax.persistence.EntityManager
+import javax.persistence.PersistenceContext
+import javax.persistence.Query
 
 /**
  * Created by shuwei on 2019/4/15.
@@ -31,6 +38,8 @@
     private lateinit var systemUtilService: SystemUtilService
     @Autowired
     private lateinit var persondtlDao: PersondtlDao
+    @PersistenceContext
+    private lateinit var em: EntityManager
 
 
     override fun registerUser(param: OpenUserParam): TPerson {
@@ -185,6 +194,31 @@
         return PageResult<TPersondtl>(persondtlDao.findByUseridAndStatusAndTransdateBetween(param.userid,TradeDict.DTL_STATUS_SUCCESS,param.month+"00",param.month+"32",pageable))
     }
 
+    @Suppress("JpaQueryApiInspection")
+    override fun findDtlMonthCountByUserid(userid: String, month: String): Map<String, Any>? {
+        val totalSql = "select sum(cast(amount as decimal(18,2))) total from tb_persondtl where userid =:userid and transdate between :startdate and :enddate and status = 'success' and tradeflag = 'out'"
+        val totalQuery: Query = em.createNativeQuery(totalSql)
+        totalQuery.setParameter("userid", userid)
+        totalQuery.setParameter("startdate", month + "00")
+        totalQuery.setParameter("enddate", month + "32")
+        val list = totalQuery.resultList
+        val result = HashMap<String,Any>()
+        if (list.isNotEmpty()&&list[0]!=null) {
+            result["total"] = list[0] as BigDecimal
+            val groupSql = "select transdesc transtype,sum(cast(amount as decimal(18,2))) amount from tb_persondtl where userid =:userid and transdate between :startdate and :enddate and status = 'success' and tradeflag = 'out' group by transdesc"
+            val groupQuery = em.createNativeQuery(groupSql)
+            groupQuery.setParameter("userid", userid)
+            groupQuery.setParameter("startdate", month + "00")
+            groupQuery.setParameter("enddate", month + "32")
+            val nativeQuery = groupQuery.unwrap(NativeQuery::class.java)
+            nativeQuery.setResultTransformer(Transformers.aliasToBean(DtlGroupResultBean::class.java))
+            result["group"] = nativeQuery.resultList
+        } else {
+            result["total"] = 0
+        }
+        return result
+    }
+
     override fun findPersondtlDetailByUserid(userid: String, billno: String): TPersondtl? {
         var dtl = persondtlDao.findById(billno)
         if(dtl.isPresent){
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
index 30cb60c..26fc2ff 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -49,6 +49,9 @@
     fun findPersondtlByUseridAndMonth(param: QueryPersonDtlParam) : PageResult<TPersondtl>
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun findDtlMonthCountByUserid(userid:String,month: String) : Map<String,Any>?
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun findPersondtlDetailByUserid(userid:String, billno :String) : TPersondtl?
 
 }
\ No newline at end of file