diff --git a/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/BinUtil.java b/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/BinUtil.java
index ebb4f05..b04ecd4 100644
--- a/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/BinUtil.java
+++ b/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/BinUtil.java
@@ -58,10 +58,10 @@
   }
 
   public static String encodeBase64(byte[] data) {
-    return Base64.encodeBase64String(data);
+    return new Base64(true).encodeAsString(data);
   }
 
   public static byte[] decodeBase64(String data) {
-    return Base64.decodeBase64(data);
+    return new Base64(true).decode(data);
   }
 }
diff --git a/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/QrCode.java b/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/QrCode.java
index 93f6b60..fdbbf72 100644
--- a/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/QrCode.java
+++ b/bus-qrcode/src/main/java/com/supwisdom/dlpay/busqrcode/QrCode.java
@@ -209,11 +209,13 @@
       logger.info("=======================================================");
     }
 
+    final String randomStr = getRandomString(6); //随机数
     final String totp = genTOTPWithSeed(qrBuilder.seed, 8);
     final String encDataPlain = new StringJoin(DELIMITER)
         .add(qrBuilder.uid)
         .add(qrBuilder.scope)
-        .add(totp).toString();
+        .add(totp)
+        .add(randomStr).toString();
 
     final byte[] encData = aesEncryptCFB(qrBuilder.rootKey, encDataPlain.getBytes(), qrBuilder.iv);
     final String code = encodeBase64(encData);
@@ -247,7 +249,7 @@
       logger.info("Decode data : <" + encDataPlain + ">");
     }
     String[] fields = encDataPlain.split(DELIMITER);
-    if (fields.length < 3) {
+    if (fields.length < 4) {
       throw new RuntimeException("qrcode plain text format error!");
     }
     String uid = fields[0];
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/QueryCardParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardParam.java
new file mode 100644
index 0000000..934946b
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardParam.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.constraints.NotEmpty;
+
+@Getter
+@Setter
+public class QueryCardParam extends APIRequestParam {
+  @Sign
+  private String cardno;
+  @Sign
+  private String userid;
+  @Sign
+  @NotEmpty(message = "卡片类型不能为空")
+  private String cardtype;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    if (StringUtils.isEmpty(cardno) && StringUtils.isEmpty(userid)) {
+      throw new RequestParamCheckException("卡号或用户ID不能全为空");
+    }
+    return true;
+  }
+}
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/QueryPersonDtlParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonDtlParam.java
new file mode 100644
index 0000000..35d0b9d
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryPersonDtlParam.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+@Getter
+@Setter
+public class QueryPersonDtlParam extends APIRequestParam {
+  @Sign
+  @NotEmpty(message = "userid不能为空")
+  private String userid;
+  @Sign
+  @NotEmpty(message = "查询月份不能为空")
+  private String month;
+  @Sign
+  @NotEmpty(message = "起始页不能为空")
+  private Integer pageno;
+  @Sign
+  @NotEmpty(message = "每页条数不能为空")
+  private Integer pagesize;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    return true;
+  }
+}
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 c803535..55aa02e 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,9 +2,11 @@
 
 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 {
@@ -27,11 +29,30 @@
   ApiResponse testmsg();
 
   @PostMapping("/api/user/userTask")
-  ApiResponse userTask();
+  ApiResponse userTask(@RequestBody UserTaskParam param);
 
   @PostMapping("/api/user/getTask")
-  ApiResponse getTPointsTaskNoPage();
+  Map<String, Object> getTPointsTaskNoPage();
 
   @PostMapping("/api/user/getUserPoints")
-  ApiResponse getUserPoints(@RequestBody UserPointsParam param);
+  Map<String, Object> getUserPoints(@RequestBody UserPointsParam param);
+
+  @PostMapping("/api/user/queryPersonDtl")
+  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")
+  QueryPersonResponse queryPerson(@RequestParam("userid") String userid);
+
+  @PostMapping("/api/user/queryCard")
+  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/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
index 1826197..0f39c37 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -15,6 +15,7 @@
 @Repository
 public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
     Page<TPersondtl> findByUseridAndStatus(String userid,String status, Pageable pageable);
+    Page<TPersondtl> findByUseridAndStatusAndTransdateBetween(String userid, String status,String startdate,String enddate, Pageable pageable);
 
     @Query("select count(t.refno) as totalcnt,sum(t.amount) as totalamt from TPersondtl t where t.status='success' and t.accdate=?1 and t.sourceType=?2 and t.tenantid=?3 ")
     CountAmountBean getPersondtlSumInfo(String accdate, String sourcetype, String tenantid);
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java
index a0b32d3..3bfb71b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java
@@ -34,6 +34,9 @@
   @Column(name = "ENABLE")
   private String enable;
 
+  @Column(name = "ORDERNUM")
+  private Integer ordernum;
+
   public Integer getTaskid() {
     return taskid;
   }
@@ -97,4 +100,12 @@
   public void setEnable(String enable) {
     this.enable = enable;
   }
+
+  public Integer getOrdernum() {
+    return ordernum;
+  }
+
+  public void setOrdernum(Integer ordernum) {
+    this.ordernum = ordernum;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java
index 8d42159..34c2f98 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java
@@ -52,6 +52,17 @@
   @Transient
   private TPointsMain tPointsMain;
 
+  @Transient
+  private String typename;
+
+  public String getTypename() {
+    return typename;
+  }
+
+  public void setTypename(String typename) {
+    this.typename = typename;
+  }
+
   public TPointsMain gettPointsMain() {
     return tPointsMain;
   }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index 891af93..161b1c7 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -127,6 +127,9 @@
   public static final String TASK_FLAG_FINISH = "task";     //任务
   public static final String CONSUME_FLAG_OUTPOINTS = "outpoints";     //过期积分
 
+
+  public static final String DICT_POINTSDTL_TYPE = "pointsDtlTypeName";     //字典表类型
+
   //积分任务表的类型tb_points_task
   public static final String TASK_FLAG_FIRST = "first";
   public static final String TASK_FLAG_EVEDAY = "everyday";
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java
index 8bf82ae..c65cd8c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java
@@ -147,7 +147,7 @@
     tPointsMain.setName(param.getName());
     tPointsMain.setCardno(param.getIdno());
     tPointsMain.setLevelname(tPersonLevel.getName());
-    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize(), Sort.by(Sort.Direction.DESC, "id"));
 
 //    Page<TPointsdtl> page = pointsDtlDao.findAllByUserid(tCard.getUserid(),pageable);
 
@@ -175,6 +175,10 @@
 /*      page.getContent().get(0).settPointsMain(tPointsMain);*/
       for (TPointsdtl temp:page.getContent()){
         temp.settPointsMain(tPointsMain);
+        TDictionary byDicttypeAndDictval = dictionaryDao.getByDicttypeAndDictval(TradeDict.DICT_POINTSDTL_TYPE, temp.getType());
+        if (byDicttypeAndDictval != null) {
+          temp.setTypename(byDicttypeAndDictval.getDicttypename());
+        }
       }
     }
     return new PageResult<>(page);
@@ -237,7 +241,7 @@
       if (rate < Double.parseDouble(noActivetemp.getRate())) {
         String noStartdate = noActivetemp.getStartdate();
         String noEnddate = noActivetemp.getEnddate();
-        if (DateUtil.compareDatetime(nowDateTemp, noStartdate) >= 0 && DateUtil.compareDatetime(noEnddate, nowDateTemp) >= 0) {
+        if (DateUtil.compareDatetime(DateUtil.getNow("yyyyMMddHHmmss"), noStartdate+"000000") >= 0 && DateUtil.compareDatetime(noEnddate+"235959", DateUtil.getNow("yyyyMMddHHmmss")) >= 0) {
           rate = Double.parseDouble(noActivetemp.getRate());
         }
       }
@@ -249,7 +253,8 @@
         String yearStartdate = yearActivetemp.getStartdate();
         String yearEnddate = yearActivetemp.getEnddate();
         String yearDateTemp = DateUtil.getNow("MMdd");
-        if (DateUtil.compareDatetime(yearDateTemp, yearStartdate) >= 0 && DateUtil.compareDatetime(yearEnddate, yearDateTemp) >= 0) {
+        String yearTemp = DateUtil.getNow("yyyy");
+        if (DateUtil.compareDatetime(yearTemp+yearDateTemp+"000000", yearTemp+yearStartdate+"000000") >= 0 && DateUtil.compareDatetime(yearTemp+yearEnddate+"000000", yearTemp+yearDateTemp+"000000") >= 0) {
           rate = Double.parseDouble(yearActivetemp.getRate());
         }
       }
@@ -786,10 +791,18 @@
       public Predicate toPredicate(Root<TPointsdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
         List<Predicate> predicates = new ArrayList<>();
         if (!StringUtil.isEmpty(param.getStartDate())) {
-          predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.formatDateStr(param.getStartDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
+          if (param.getStartDate().length() == 8) {
+            predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(param.getStartDate())));
+          } else {
+            predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.formatDateStr(param.getStartDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
+          }
         }
         if (!StringUtil.isEmpty(param.getEndDate())) {
-          predicates.add(criteriaBuilder.le(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.formatDateStr(param.getEndDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
+          if (param.getStartDate().length() == 8) {
+            predicates.add(criteriaBuilder.le(root.get("transdate").as(Long.class), Long.valueOf(param.getEndDate())));
+          } else {
+            predicates.add(criteriaBuilder.le(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.formatDateStr(param.getEndDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
+          }
         }
         if (param.getRefno() != null) {
           predicates.add(criteriaBuilder.equal(root.get("refno").as(Integer.class), param.getRefno()));
@@ -910,7 +923,7 @@
 
   @Override
   public JsonResult getTPointsTaskNoPage() {
-    return JsonResult.ok().put("dataList",pointsTaskDao.findAll());
+    return JsonResult.ok().put("dataList",pointsTaskDao.findAll(Sort.by(Sort.Direction.ASC,"ordernum")));
   }
 
   @Override
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 94b077b..14a7bf8 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")
@@ -167,7 +164,10 @@
         val ret = pointsService.finishTask(param.userid, param.taskid)
         return if(ret.get("code")==200){
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .success("ok"))
+                    .success(ApiResponse().apply {
+                        this.retcode = 0
+                        this.retmsg = "ok"
+                    }, "ok"))
         }else{
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(500, ret.get("msg") as String))
@@ -177,7 +177,7 @@
     fun getTPointsTaskNoPage(): ResponseEntity<Any> {
         val ret = pointsService.getTPointsTaskNoPage()
         return if(ret.get("code")==200){
-            ResponseEntity.ok(ResponseBodyBuilder.create().data("ret", ret.get("dataList")!!)
+            ResponseEntity.ok(ResponseBodyBuilder.create().data("data", ret.get("dataList")!!)
                     .success("ok"))
         }else{
             ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -195,4 +195,72 @@
         return  ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!)
                     .success("ok"))
     }
+
+    @PostMapping("/queryPersonDtl")
+    fun queryPersonDtl(@RequestBody param: QueryPersonDtlParam): ResponseEntity<Any> {
+        val page = useService.findPersondtlByUseridAndMonth(param)
+        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("data", page)
+                .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)
+                ?:return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(500, "未找到[userid=${userid}]的用户"))
+        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)
+                ?:return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(500, "未找到指定条件的卡片"))
+        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 b262bbb..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,6 +1,8 @@
 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
 import com.supwisdom.dlpay.api.domain.TCard
 import com.supwisdom.dlpay.api.domain.TPerson
@@ -22,4 +24,13 @@
 
     @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun getPersonByUserid(userid: String): UserInforResponse
+
+    @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 095115d..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,14 +1,13 @@
 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.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
 import com.supwisdom.dlpay.api.domain.TPerson
 import com.supwisdom.dlpay.api.service.CardService
 import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import com.supwisdom.dlpay.util.ConstantUtil
@@ -161,4 +160,43 @@
         resp.retmsg = "查询成功"
         return resp
     }
+
+    override fun getCardByCardNoOrUserid(param: QueryCardParam): TCard? {
+        if (!StringUtil.isEmpty(param.cardno)) {
+            return cardDao.findCardByCardnoAndCardtype(param.cardno,param.cardtype)
+        }else if (!StringUtil.isEmpty(param.userid)) {
+            return cardDao.findCardByUseridAndCardtype(param.userid,param.cardtype)
+        }
+        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 3256e61..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,17 +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.
@@ -30,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 {
@@ -179,6 +189,36 @@
         return PageResult<TPersondtl>(persondtlDao.findByUseridAndStatus(userid,TradeDict.DTL_STATUS_SUCCESS,pageable))
     }
 
+    override fun findPersondtlByUseridAndMonth(param: QueryPersonDtlParam): PageResult<TPersondtl> {
+        var pageable = PageRequest.of(param.pageno - 1, param.pagesize, Sort.Direction.DESC, "transdate","transtime")
+        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 f758859..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
@@ -2,6 +2,7 @@
 
 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.domain.*
 import com.supwisdom.dlpay.framework.util.PageResult
 import org.springframework.transaction.annotation.Propagation
@@ -45,6 +46,12 @@
     fun findPersondtlByUserid(userid:String, pageno :Int) : PageResult<TPersondtl>
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    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
