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 1ab688d..1da07a8 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
@@ -4,6 +4,8 @@
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Map;
+
 @FeignClient(value = "userProxy", url = "${payapi.url}")
 public interface UserProxy {
   @PostMapping("/api/user/open")
@@ -40,12 +42,30 @@
   CardBizResponse bizQuery(@RequestParam("refno") String refno);
 
   @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 6fd04a4..ce7a15a 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
@@ -16,12 +16,12 @@
 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.validation.annotation.Validated
 import org.springframework.web.bind.annotation.*
 import java.net.URLDecoder
-import javax.validation.Valid
 import kotlin.math.roundToInt
 
 @RestController
@@ -382,8 +382,11 @@
         val ret = pointsService.finishTask(param.userid, param.taskid)
         return if (ret.get("code") == 200) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .success("ok"))
-        } else {
+                    .success(ApiResponse().apply {
+                        this.retcode = 0
+                        this.retmsg = "ok"
+                    }, "ok"))
+        }else{
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .fail(500, ret.get("msg") as String))
         }
@@ -392,8 +395,8 @@
     @PostMapping("/getTask")
     fun getTPointsTaskNoPage(): ResponseEntity<Any> {
         val ret = pointsService.getTPointsTaskNoPage()
-        return if (ret.get("code") == 200) {
-            ResponseEntity.ok(ResponseBodyBuilder.create().data("ret", ret.get("dataList")!!)
+        return if(ret.get("code")==200){
+            ResponseEntity.ok(ResponseBodyBuilder.create().data("data", ret.get("dataList")!!)
                     .success("ok"))
         } else {
             ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -412,4 +415,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 d202f78..734d138 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
@@ -162,4 +161,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
