diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 4346bdc..06713bb 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -55,4 +55,4 @@
 spring.kafka.consumer.auto-commit-interval=100
 # 指定消息key和消息体的编解码方式
 spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
-spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
\ No newline at end of file
+spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
index c0b92e5..954a693 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
@@ -1,14 +1,12 @@
 package com.supwisdom.dlpay.api.bean;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 @Getter
 @Setter
 @AllArgsConstructor
 @NoArgsConstructor
+@ToString
 public class CitizenPayResponse extends ApiResponse {
   private String refno;
   private String billno;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserPointsParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserPointsParam.java
new file mode 100644
index 0000000..1941ca8
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserPointsParam.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;
+
+
+@Getter
+@Setter
+public class UserPointsParam extends APIRequestParam {
+  @Sign
+  private String idno;
+  @Sign
+  private String name;
+  @Sign
+  private int pageNo;
+  @Sign
+  private int pageSize;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    if (StringUtils.isEmpty(idno) && StringUtils.isEmpty(name)) {
+      throw new RequestParamCheckException("市民卡账号和姓名不能为空");
+    }
+    return true;
+  }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskParam.java
new file mode 100644
index 0000000..5adbbe3
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskParam.java
@@ -0,0 +1,26 @@
+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;
+
+
+@Getter
+@Setter
+public class UserTaskParam extends APIRequestParam {
+  @Sign
+  private String userid;
+  @Sign
+  private String taskid;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    if (StringUtils.isEmpty(userid) && StringUtils.isEmpty(taskid)) {
+      throw new RequestParamCheckException("用户号和任务号不能为空");
+    }
+    return true;
+  }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskResponse.java
new file mode 100644
index 0000000..5b31c44
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskResponse.java
@@ -0,0 +1,21 @@
+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.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserTaskResponse extends ApiResponse {
+  private List dataList;
+}
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 a8e7808..c803535 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
@@ -25,4 +25,13 @@
 
   @PostMapping("/api/user/testmsg")
   ApiResponse testmsg();
+
+  @PostMapping("/api/user/userTask")
+  ApiResponse userTask();
+
+  @PostMapping("/api/user/getTask")
+  ApiResponse getTPointsTaskNoPage();
+
+  @PostMapping("/api/user/getUserPoints")
+  ApiResponse getUserPoints(@RequestBody UserPointsParam param);
 }
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index 32ca0f3..805d85e 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -30,7 +30,7 @@
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(properties = {
-    "payapi.url=http://localhost:8099/payapi"},
+    "payapi.url=http://localhost:8080/payapi"},
     classes = CitizenCardPayProxyTest.class)
 @ImportAutoConfiguration({RibbonAutoConfiguration.class,
     FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class,
@@ -55,6 +55,8 @@
   private UserProxy userProxy;
   @Autowired
   private ConsumePropxy consumePropxy;
+  @Autowired
+  private TransactionProxy transactionProxy;
 
 
   @org.junit.Test
@@ -70,15 +72,49 @@
     System.out.println(version.getVersion());
 
     CitizenCardPayinitParam initParam = new CitizenCardPayinitParam();
-    initParam.setBillno("20190708172756000001");
-    initParam.setCardNo("20190619001");
-    initParam.setAmount(0);
-    initParam.setTransdate("20190708");
+    initParam.setBillno("201907081727560000175 ");
+    initParam.setCardNo("00015574");
+    initParam.setAmount(50000);
+    initParam.setTransdate("20200821");
     initParam.setTranstime("172713");
-    initParam.setShopaccno("2000000038");
+    initParam.setShopaccno("2000000012");
+    initParam.setDtltype("canteen");
     CitizenPayResponse payInit = citizenCardPayProxy.citizencardPayinit(initParam);
     assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(),
         payInit.getRetcode(), equalTo(0));
+    System.err.println(payInit);
+
+    CitizenCardPayfinishParam finishParam = new CitizenCardPayfinishParam();
+    finishParam.setRefno(payInit.getRefno());
+    CitizenPayResponse citizencardPayFinish = citizenCardPayProxy.citizencardPayFinish(finishParam);
+    System.err.println(citizencardPayFinish);
+  }
+
+  @org.junit.Test
+  public void citizencardPayRefund() {
+    ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+    helper.login(appid, secret);
+
+    ApiVersionResponse version = apiCommonProxy.apiVersion();
+
+    assertThat("get version error " + version.getException(),
+        version.getVersion(), notNullValue());
+
+
+    ConsumePayRefundParam initParam = new ConsumePayRefundParam();
+    initParam.setBillno("201907081727560000174 ");
+    initParam.setTransdate("20200821");
+    initParam.setTranstime("172713");
+    initParam.setShopaccno("2000000012");
+    initParam.setRequestbillno("201907081727560000174");
+    initParam.setRefundAmount(50000);
+
+    PayReverseResponse payInit = transactionProxy.payRefund(initParam);
+    assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(),
+        payInit.getRetcode(), equalTo(0));
+    System.err.println(payInit);
+
+
   }
 
   @Test
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 ebf8392..1826197 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
@@ -19,7 +19,9 @@
     @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);
 
-    List<TPersondtl> findAllByUseridAndTransdateAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
+    List<TPersondtl> findAllByUseridAndTransdateAndReverseFlagAndStatusAndTradeflag(String userid, String transdate,String reverseFlag,String status,String tradeflag);
 
-    List<TPersondtl> findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
+    List<TPersondtl> findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatusAndTradeflag(String userid, String transdate,String reverseFlag,String status,String tradeflag);
+
+    List<TPersondtl> findAllByTransdateAndReverseFlagAndStatusAndTradeflag(String transdate,String reverseFlag,String status,String tradeflag);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
index 0e49580..1bc0216 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.api.dao;
 
+import com.supwisdom.dlpay.api.domain.TPersondtl;
 import com.supwisdom.dlpay.api.domain.TShopdtl;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -16,4 +17,11 @@
 
   @Lock(LockModeType.OPTIMISTIC)
   List<TShopdtl> findAllByStatusAndUpdateBala(String status, Boolean flag);
+
+
+  List<TShopdtl> findAllByAccdateAndReverseFlagAndStatus(String transdate, String reverseFlag, String status);
+
+  List<TShopdtl> findAllByOppositeAccNoAndAccdateAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
+
+  List<TShopdtl> findAllByOppositeAccNoAndAccdateStartingWithAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/PointsOutdateTask.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/PointsOutdateTask.java
new file mode 100644
index 0000000..1251749
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/PointsOutdateTask.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.citizencard.task;
+
+import com.google.gson.Gson;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.supwisdom.dlpay.citizencard.bean.CitizencardLossResp;
+import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply;
+import com.supwisdom.dlpay.citizencard.service.CitizencardManagerService;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.service.PointsService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
+import org.apache.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.ws.rs.core.MediaType;
+import java.util.List;
+
+
+@Component
+public class PointsOutdateTask {
+  @Autowired
+  private PointsService pointsService;
+
+  private static final Logger logger = LoggerFactory.getLogger(PointsOutdateTask.class);
+  /**
+   * 积分过期任务
+   */
+  @Scheduled(cron = "${points.outdate.cron}")
+  @SchedulerLock(name = "PointsOutdateTask", lockAtMostForString = "PT10M")
+  public void doPointsOutdateTask() {
+    try {
+      long t1 = System.currentTimeMillis();
+      logger.info("执行积分过期任务：");
+
+      pointsService.pointsOutdate();
+      long t2 = System.currentTimeMillis();
+      logger.info("执行积分过期任务结束，耗时 " + (t2 - t1) + " ms");
+
+    } catch (Exception ex) {
+      logger.error("执行积分过期任务报错！");
+      ex.printStackTrace();
+    }
+  }
+  /**
+   * 积分补偿任务
+   */
+  @Scheduled(cron = "${points.consume.cron}")
+  @SchedulerLock(name = "PointsConsumeTask", lockAtMostForString = "PT10M")
+  public void consumePointsTask() {
+    try {
+      long t1 = System.currentTimeMillis();
+      logger.info("执行积分补偿任务：");
+
+      pointsService.pointsCompensate();
+      long t2 = System.currentTimeMillis();
+      logger.info("执行积分补偿任务结束，耗时 " + (t2 - t1) + " ms");
+
+    } catch (Exception ex) {
+      logger.error("执行积分补偿任务报错！");
+      ex.printStackTrace();
+    }
+  }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsActiveDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsActiveDao.java
index ae5b677..5bdf552 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsActiveDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsActiveDao.java
@@ -13,4 +13,6 @@
 public interface PointsActiveDao extends JpaRepository<TPointsActive, Integer>, JpaSpecificationExecutor<TPointsActive> {
 
     List<TPointsActive> findAllByType(String type);
+
+    TPointsActive findAllByName(String name);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java
index db427c3..8c33de2 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java
@@ -8,7 +8,10 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface PointsDetailDao extends JpaRepository<TPointsDetail, Integer> {
 
+  List<TPointsDetail> findAllByOutDateAndStatus(String outdate,String status);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java
index 0f9f8ce..0bbf7a3 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java
@@ -15,9 +15,22 @@
 
   Page<TPointsdtl> findAllByUserid(String userid, Pageable pageable);
 
-  List<TPointsdtl> findAllByUseridAndTypeAndFlagstatus(String userid, String type,String flagstatus);
+  List<TPointsdtl> findAllByUseridAndTypeAndFlagstatusAndTransdateAndStatus(String userid, String type,String flagstatus,String transdate,String status);
 
-  TPointsdtl findAllByUseridAndTransdateAndRefno(String userid,String transdate,Integer refno);
+  TPointsdtl findAllByUseridAndTransdateAndRefnoAndStatusAndFlagstatus(String userid,String transdate,Integer refno, String status,String flagstatus);
 
+  TPointsdtl findAllByUseridAndTransdateStartingWithAndRefnoAndStatusAndFlagstatus(String userid,String transdate,Integer refno, String status,String flagstatus);
+
+  TPointsdtl findAllByUseridAndBillnoAndTypeAndRefno(String userid,String billno,String type,Integer refno);
+
+  TPointsdtl findAllByUseridAndBillnoAndType(String userid,String billno,String type);
+
+  TPointsdtl findAllByUseridAndRefno(String userid,Integer refno);
+
+  TPointsdtl findAllByUseridAndRefnoAndType(String userid,Integer refno,String type);
+
+  TPointsdtl findAllByUseridAndDetailid(String userid,Integer detailid);
+
+  TPointsdtl findAllByUseridAndRefnoAndTransdate(String userid,Integer refno,String transdate);
 
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java
index 973a4ae..6493001 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java
@@ -9,8 +9,8 @@
 @Table(name = "TB_POINTS_DETAIL")
 public class TPointsDetail {
   @Id
-  @GenericGenerator(name = "idGenerator", strategy = "uuid")
-  @GeneratedValue(generator = "idGenerator")
+  @GenericGenerator(name = "idGeneratorDeta", strategy = "sequence")
+  @GeneratedValue(generator = "idGeneratorDeta")
   @Column(name = "DETAILID", nullable = false, precision = 32)
   private Integer detailid;
 
@@ -26,6 +26,17 @@
   @Column(name = "OUTDATE")
   private String outDate;
 
+  @Column(name = "STATUS")
+  private String status;
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
   public Integer getDetailid() {
     return detailid;
   }
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 8879b2c..8d42159 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
@@ -8,8 +8,8 @@
 @Table(name = "TB_POINTSDTL")
 public class TPointsdtl {
   @Id
-  @GenericGenerator(name = "idGenerator", strategy = "uuid")
-  @GeneratedValue(generator = "idGenerator")
+  @GenericGenerator(name = "idGeneratorDtl", strategy = "sequence")
+  @GeneratedValue(generator = "idGeneratorDtl")
   @Column(name = "ID", nullable = false, precision = 32)
   private Integer id;
 
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index 909ee47..efbf753 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -26,7 +26,15 @@
     return sdf.format(new Date());
   }
 
-
+  public static String getYesterdayDay() {
+    SimpleDateFormat sdf = new SimpleDateFormat(
+        "yyyyMMdd");
+    Calendar cd = Calendar.getInstance();
+    cd.setTime(new Date());
+    cd.add(Calendar.DATE, -1);//增加一天
+    Date date = cd.getTime();
+    return sdf.format(date);
+  }
   /**
    * Description: 根据类型返回一个当前时间 @param partten String @return String 格式：partten
    */
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 c787449..891af93 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
@@ -117,7 +117,37 @@
   *
   *
   * */
-  public static final String CONSUME_FLAG_SINGLE = "consume";
-  public static final String CONSUME_FLAG_DAY = "consumeday";
-  public static final String CONSUME_FLAG_MONTH = "consumemonth";
+  //积分流水表的类型tb_pointsdtl
+  public static final String CONSUME_FLAG_SINGLE = "consume";       //单次消费
+  public static final String CONSUME_FLAG_DAY = "consumeDay";       //日累计奖励
+  public static final String CONSUME_FLAG_MONTH = "consumeMonth";     //月累计奖励
+  public static final String CONSUME_SINGLE_REFUND = "consumeRefund";     //单次退款
+  public static final String CONSUME_DAY_REFUND = "consumeDayRefund";     //日累计奖励退款
+  public static final String CONSUME_MONTH_REFUND = "consumeMonthRefund";   //月累计奖励退款
+  public static final String TASK_FLAG_FINISH = "task";     //任务
+  public static final String CONSUME_FLAG_OUTPOINTS = "outpoints";     //过期积分
+
+  //积分任务表的类型tb_points_task
+  public static final String TASK_FLAG_FIRST = "first";
+  public static final String TASK_FLAG_EVEDAY = "everyday";
+  public static final String TASK_FLAG_EVETIME = "everytime";
+
+  //消费规则表的类型  tb_consume_points
+  public static final String CONSUME_POINTS_DAY = "day";
+  public static final String CONSUME_POINTS_MONTH = "month";
+
+  //积分明细表的状态tb_points_detail
+  public static final String DETAIL_FLAG_NORMAL = "normal";    //正常
+  public static final String DETAIL_FLAG_OUTDATE = "outdate";   //过期
+  public static final String DETAIL_FLAG_REFUND = "refund";     //退款
+
+  //积分活动日的状态tb_points_active
+  public static final String ACTIVE_FLAG_MONTH = "month";    //月循环
+  public static final String ACTIVE_FLAG_NO = "no";   //不循环
+  public static final String ACTIVE_FLAG_YEAR = "year";     //年循环
+
+  //参数表tb_businesspara
+  public static final String PARA_FLAG_CON = "consumePointsLi";   //积分消费上限
+  public static final String PARA_FLAG_TASK = "taskPointsLi";     //积分任务上限
+  public static final String PARA_FLAG_DAY = "dayPointsLi";     //积分过期时间
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/PointsController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/PointsController.java
index bf63628..273e6da 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/PointsController.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/PointsController.java
@@ -271,6 +271,17 @@
     if (levelBean.getPointsActive() != null) {
       levelBean.getPointsActive().setUpdatetime(DateUtil.getNow());
       levelBean.getPointsActive().setOperatorid(operator.getOpercode());
+      if(StringUtils.isEmpty(levelBean.getPointsActive().getName())||
+          StringUtils.isEmpty(levelBean.getPointsActive().getType())||
+          StringUtils.isEmpty(levelBean.getPointsActive().getRate())){
+        return JsonResult.error("名称，循环方式和积分倍速不能为空");
+      }
+      if(StringUtils.isEmpty(levelBean.getPointsActive().getId())){
+        TPointsActive pointsActive = pointsService.getActiveByName(levelBean.getPointsActive().getName());
+        if(pointsActive!=null){
+          return JsonResult.error("名称不能重复");
+        }
+      }
       return pointsService.saveActive(levelBean.getPointsActive());
     } else {
       return JsonResult.error("参数不能为空");
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/PointsService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/PointsService.java
index 19c3bd5..b32f9cf 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/PointsService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/PointsService.java
@@ -86,11 +86,11 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   Boolean monthHandlePoints(String userid,String billno);
 
- /* *//*
+  /*
   * 退款积分处理
-  * *//*
+  * */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  Boolean refundHandlePoints(String userid,String billno);*/
+  Boolean refundHandlePoints(String userid,String billno);
 
   /*
   *
@@ -104,6 +104,7 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult saveActive(TPointsActive tPointsActive);
 
+  TPointsActive getActiveByName(String name);
 
   /*
   *
@@ -124,4 +125,31 @@
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult getPointsReportParam();
+
+
+
+  /*
+  *手机端
+  * 任务完成接口
+  * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult finishTask (String userid,String taskid);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  JsonResult getTPointsTaskNoPage();
+
+
+  /*
+  *
+  * 积分过期
+  * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult pointsOutdate();
+
+  /*
+   *
+   * 积分补偿
+   * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult pointsCompensate() throws ParseException;
 }
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 748c5bf..8bf82ae 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
@@ -1,12 +1,8 @@
 package com.supwisdom.dlpay.system.service.impl;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.api.dao.CardDao;
-import com.supwisdom.dlpay.api.dao.PersonDao;
-import com.supwisdom.dlpay.api.dao.PersondtlDao;
-import com.supwisdom.dlpay.api.domain.TCard;
-import com.supwisdom.dlpay.api.domain.TPerson;
-import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.api.dao.*;
+import com.supwisdom.dlpay.api.domain.*;
 import com.supwisdom.dlpay.framework.dao.*;
 import com.supwisdom.dlpay.framework.domain.*;
 import com.supwisdom.dlpay.framework.util.DateUtil;
@@ -73,6 +69,10 @@
   private SysparaDao sysparaDao;
   @Autowired
   private BusinessparaDao businessparaDao;
+  @Autowired
+  private ShopdtlDao shopdtlDao;
+  @Autowired
+  private AccountDao accountDao;
 
   @Override
   public LevelBean getLevel() {
@@ -172,7 +172,10 @@
     }, pageable);
 
     if (page.getContent() != null && page.getContent().size() > 0) {
-      page.getContent().get(0).settPointsMain(tPointsMain);
+/*      page.getContent().get(0).settPointsMain(tPointsMain);*/
+      for (TPointsdtl temp:page.getContent()){
+        temp.settPointsMain(tPointsMain);
+      }
     }
     return new PageResult<>(page);
   }
@@ -187,8 +190,8 @@
   @Override
   public LevelBean getConpoints() {
     Sort sort = new Sort(Sort.Direction.ASC, "id");
-    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("month", sort);
-    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day", sort);
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
     LevelBean levelBean = new LevelBean();
     if (!StringUtil.isEmpty(monthlist)) levelBean.setMonthList(monthlist);
     if (!StringUtil.isEmpty(daylist)) levelBean.setDayList(daylist);
@@ -217,51 +220,51 @@
 
   @Override
   public Boolean singleHandlePoints(String userid, Double amount, String billno) throws ParseException {
-    int rate = 1;
+    double rate = 1;
     // 1.根据当天日期判断当天是否该用户的特殊日期或者生日，得到实际倍率
     String nowDateTemp = DateUtil.getNow("yyyyMMdd");
     TPerson person = personDao.findByUseridAndIdtype(userid, "idcard");
     if (person != null && !StringUtil.isEmpty(person.getIdno())) {
       String nowDate = DateUtil.getNow("MMdd");
-      String brithdate = person.getIdno().substring(10, 4);
+      String brithdate = person.getIdno().substring(10, 14);
       if (nowDate.equals(brithdate)) {
         rate = 2;
       }
     }
     //1.1判断不循环
-    List<TPointsActive> noActives = pointsActiveDao.findAllByType("no");
+    List<TPointsActive> noActives = pointsActiveDao.findAllByType(TradeDict.ACTIVE_FLAG_NO);
     for (TPointsActive noActivetemp : noActives) {
-      if (rate < Integer.parseInt(noActivetemp.getRate())) {
+      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) {
-          rate = Integer.parseInt(noActivetemp.getRate());
+          rate = Double.parseDouble(noActivetemp.getRate());
         }
       }
     }
     //1.2判断年循环
-    List<TPointsActive> yearActives = pointsActiveDao.findAllByType("year");
+    List<TPointsActive> yearActives = pointsActiveDao.findAllByType(TradeDict.ACTIVE_FLAG_YEAR);
     for (TPointsActive yearActivetemp : yearActives) {
-      if (rate < Integer.parseInt(yearActivetemp.getRate())) {
+      if (rate < Double.parseDouble(yearActivetemp.getRate())) {
         String yearStartdate = yearActivetemp.getStartdate();
         String yearEnddate = yearActivetemp.getEnddate();
         String yearDateTemp = DateUtil.getNow("MMdd");
         if (DateUtil.compareDatetime(yearDateTemp, yearStartdate) >= 0 && DateUtil.compareDatetime(yearEnddate, yearDateTemp) >= 0) {
-          rate = Integer.parseInt(yearActivetemp.getRate());
+          rate = Double.parseDouble(yearActivetemp.getRate());
         }
       }
     }
     //1.3判断月循环
-    List<TPointsActive> monthActives = pointsActiveDao.findAllByType("month");
+    List<TPointsActive> monthActives = pointsActiveDao.findAllByType(TradeDict.ACTIVE_FLAG_MONTH);
     for (TPointsActive monthActivetemp : monthActives) {
-      if (rate < Integer.parseInt(monthActivetemp.getRate())) {
+      if (rate < Double.parseDouble(monthActivetemp.getRate())) {
         int weekNumber = DateUtil.howWeeksByMonth(nowDateTemp);
         int weekday = DateUtil.getWeekday(nowDateTemp);
         if ((weekday == 7 && weekNumber - 1 == monthActivetemp.getWeeknumber()) || weekNumber == monthActivetemp.getWeeknumber()) {
           List<String> sList = Arrays.asList(monthActivetemp.getWeekday().split("[,]"));
           for (String emp : sList) {
             if (weekday == Integer.parseInt(emp)) {
-              rate = Integer.parseInt(monthActivetemp.getRate());
+              rate = Double.parseDouble(monthActivetemp.getRate());
             }
           }
         }
@@ -275,7 +278,7 @@
       tPointsMainTemp = pointsMain.orElse(null);
       Integer levelid = pointsMain.orElse(null).getLevelid();
       if (levelid != null) {
-        personLevel = personLevelDao.getOne(levelid);
+        personLevel = personLevelDao.findById(levelid).orElse(null);
       } else {
         if (pointsMain.orElse(null).getPoints() == null) {
           pointsMain.orElse(null).setPoints(0);
@@ -311,9 +314,9 @@
       //计算得到的积分
       resultPoints = resultInt * personLevel.getSinglePoints();
       //获得流水积分
-      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatus(userid, "consume", "in");
+      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatusAndTransdateAndStatus(userid, TradeDict.CONSUME_FLAG_SINGLE, "in",DateUtil.getNow("yyyyMMdd"),"init");
       int allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
-      TBusinesspara consumePointsLi = businessparaDao.findByParakey("consumePointsLi");
+      TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_CON);
       int pointslimit = 10000;
       if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
         pointslimit = Integer.parseInt(consumePointsLi.getParaval());
@@ -322,24 +325,35 @@
         if (allPoints + resultPoints >= pointslimit) {
           resultPoints = pointslimit - allPoints;
         }
+      }else {
+        resultPoints = 0;
       }
     }
+    //判断流水中是否有这条记录
+    TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_SINGLE);
+    if(tPointsdtl!=null){
+      return false;
+    }
     //4. 对积分的主子表和流水表进行添加，查询用户的积分，得到的积分去查询等级表更新用户的等级
-    return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_SINGLE, resultPoints * rate, personLevel.getId(), billno);
+    BigDecimal a1 = new BigDecimal(resultPoints);
+    BigDecimal aa = new BigDecimal(rate);
+    Double dd=a1.multiply(aa).doubleValue();
+    //Math.round(dd)  四舍五入     Math.floor(96.8)去掉小数凑整:不论小数是多少，都不进位   (int) Math.ceil(96.1)去掉小数凑整:不管小数是多少，都进一
+    return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_SINGLE, (int)Math.round(dd), personLevel.getId(), billno);
   }
 
   @Override
   public Boolean dayHandlePoints(String userid, String billno) {
     // 1.根据用户id查询积分流水表获得当日的消费金额
-    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMMdd"), "none", "success");
-    Double allConsume = tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    List<TPersondtl> tPersondtl = getShopdtlByUseridAndTransdateAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMMdd"), "none", "success");
+    Double allConsume = -tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
     // 2.循环日消费奖励规则
     Sort sort = new Sort(Sort.Direction.ASC, "id");
-    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day", sort);
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
     for (TConsumePoints temp : daylist) {
       // 3.判断用户是否达到日消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
-      if (allConsume > Double.parseDouble(temp.getConsumeamount())) {
-        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
+      if (allConsume >= Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefnoAndStatusAndFlagstatus(userid, DateUtil.getNow("yyyyMMdd"), temp.getId(),"init","in");
         if (tPointsdtltemp == null) {
           // 4.奖励的积分对积分主子表和流水表进行添加
           Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
@@ -361,7 +375,12 @@
           }else {
             tPointsMainTemp = tPointsMain.orElse(null);
           }
-          return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
+         /* //判断流水中是否有这条记录
+          TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_DAY);
+          if(tPointsdtl!=null){
+            return false;
+          }*/
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
         }
       }
     }
@@ -371,15 +390,15 @@
   @Override
   public Boolean monthHandlePoints(String userid, String billno) {
     // 1.根据用户id查询积分流水表获得当月的消费金额
-    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMM"), "none", "success");
-    Double allConsume = tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    List<TPersondtl> tPersondtl = getShopdtlByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMM"), "none", "success");
+    Double allConsume = -tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
     // 2.循环月消费奖励规则
     Sort sort = new Sort(Sort.Direction.ASC, "id");
-    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("month", sort);
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
     for (TConsumePoints temp : monthlist) {
       // 3.判断用户是否达到月消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
-      if (allConsume > Double.parseDouble(temp.getConsumeamount())) {
-        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
+      if (allConsume >= Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateStartingWithAndRefnoAndStatusAndFlagstatus(userid, DateUtil.getNow("yyyyMM"), temp.getId(),"init","in");
         if (tPointsdtltemp == null) {
           // 4.奖励的积分对积分主子表和流水表进行添加
           Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
@@ -401,28 +420,120 @@
           }else {
             tPointsMainTemp = tPointsMain.orElse(null);
           }
-          return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
+          /*TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_MONTH);
+          if(tPointsdtl!=null){
+            return false;
+          }*/
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_MONTH, temp.getPoints(), temp.getId(), billno);
         }
       }
     }
     return null;
   }
 
+  @Override
+  public Boolean refundHandlePoints(String userid, String billno) {
+    //1. 单次消费获得的积分处理 ,先查询原流水
+    TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_SINGLE);
+    if(tPointsdtl==null){
+      return false;
+    }
+    Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
+    if(tPointsMain.orElse(null)==null){
+      return false;
+    }
+    //查询是否有退款记录
+    TPointsdtl tPointsdtlCheckSin = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_SINGLE_REFUND);
+    if(tPointsdtlCheckSin!=null){
+      return false;
+    }
+    this.insertDtl(tPointsMain.orElse(null),TradeDict.CONSUME_SINGLE_REFUND,-Integer.parseInt(tPointsdtl.getPoints()),tPointsdtl.getRefno(),billno);
+    //原流水改为退款状态
+    tPointsdtl.setStatus("refund");
+    pointsDtlDao.save(tPointsdtl);
+    //2. 日奖励获得的积分处理
+    // 2.1.根据用户id查询积分流水表获得当日的消费金额
+    List<TPersondtl> tPersondtl = getShopdtlByUseridAndTransdateAndReverseFlagAndStatus(userid, tPointsdtl.getTransdate(), "none", "success");
+    Double allConsume = -tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    // 2.2.循环日消费奖励规则
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
+    for (TConsumePoints temp : daylist) {
+      // 2.3.判断用户是否达到日消费奖励积分的额度，没有达到再次判断是否获得过该规则的奖励
+      if (allConsume < Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefnoAndStatusAndFlagstatus(userid, tPointsdtl.getTransdate(), temp.getId(),"init","in");
+        if (tPointsdtltemp != null) {
+          tPointsdtltemp.setStatus("refund");
+          pointsDtlDao.save(tPointsdtltemp);
+          // 2.4.奖励的积分对积分主子表和流水表进行删除
+          Optional<TPointsMain> tPointsMainDay = pointsMainDao.findById(userid);
+          TPointsMain tPointsMainTemp;
+          tPointsMainTemp = tPointsMainDay.orElse(null);
+          TPointsdtl tPointsdtlCheckDay = pointsDtlDao.findAllByUseridAndBillnoAndTypeAndRefno(userid, billno, TradeDict.CONSUME_DAY_REFUND,temp.getId());
+          if(tPointsdtlCheckDay!=null){
+            continue;
+          }
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_DAY_REFUND, -Integer.parseInt(tPointsdtltemp.getPoints()), temp.getId(), billno);
+        }
+      }
+    }
+    //3. 月奖励获得的积分处理
+    // 3.1.根据用户id查询积分流水表获得当月的消费金额
+    List<TPersondtl> tPersondtlMonth = getShopdtlByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, tPointsdtl.getTransdate().substring(0,6), "none", "success");
+    Double allConsumeMonth = -tPersondtlMonth.stream().mapToDouble(o -> o.getAmount()).sum();
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
+    // 2.2.循环月消费奖励规则
+    for (TConsumePoints temp : monthlist) {
+      // 3.3.判断用户是否达到月消费奖励积分的额度，没有达到再次判断是否获得过该规则的奖励
+      if (allConsumeMonth < Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateStartingWithAndRefnoAndStatusAndFlagstatus(userid, tPointsdtl.getTransdate(), temp.getId(),"init","in");
+        if (tPointsdtltemp != null) {
+          tPointsdtltemp.setStatus("refund");
+          pointsDtlDao.save(tPointsdtltemp);
+          // 3.4.奖励的积分对积分主子表和流水表进行删除
+          Optional<TPointsMain> tPointsMainMonth = pointsMainDao.findById(userid);
+          TPointsMain tPointsMainTemp;
+          tPointsMainTemp = tPointsMainMonth.orElse(null);
+          TPointsdtl tPointsdtlCheckMonth = pointsDtlDao.findAllByUseridAndBillnoAndTypeAndRefno(userid, billno, TradeDict.CONSUME_MONTH_REFUND,temp.getId());
+          if(tPointsdtlCheckMonth!=null){
+            continue;
+          }
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_MONTH_REFUND, -Integer.parseInt(tPointsdtltemp.getPoints()), temp.getId(), billno);
+        }
+      }
+    }
+    return null;
+  }
+//主要处理消费，日奖励，月奖励，退款，过期的流水表
   public Boolean insertDtl(TPointsMain tPointsMain, String type, int points, Integer refno, String billno) {
     //主表流水
-    tPointsMain.setPoints(tPointsMain.getPoints() + points);
-    tPointsMain.setAccumPoints(tPointsMain.getAccumPoints() + points);
-    TPersonLevel tPersonLevelByPoints = getLevelByPoints(tPointsMain.getPoints());
-    if (tPersonLevelByPoints.getId() > tPointsMain.getLevelid()) {
-      tPointsMain.setLevelid(tPersonLevelByPoints.getId());
+    tPointsMain.setPoints((tPointsMain.getPoints() + points)>=0?tPointsMain.getPoints() + points:0);
+    //如果过期流水
+    if(points<0&&TradeDict.CONSUME_FLAG_OUTPOINTS.equals(type)){
+      tPointsMain.setOutPoints(tPointsMain.getOutPoints()+(-points));
+    }else {
+      tPointsMain.setAccumPoints((tPointsMain.getAccumPoints() + points)>=0?tPointsMain.getAccumPoints() + points:0);
     }
+    TPersonLevel tPersonLevelByPoints = getLevelByPoints(tPointsMain.getPoints());
+    //if (tPersonLevelByPoints.getId() > tPointsMain.getLevelid()) {
+      tPointsMain.setLevelid(tPersonLevelByPoints.getId());
+   // }
     tPointsMain.setUpdatetime(DateUtil.getNow());
     TPointsMain tPointsMainResult = pointsMainDao.save(tPointsMain);
     //子表流水
     TPointsDetail tPointsDetail = new TPointsDetail();
     tPointsDetail.setUserid(tPointsMain.getUserid());
     tPointsDetail.setPoints(points);
-    TBusinesspara consumePointsLi = businessparaDao.findByParakey("dayPointsLi");
+    if(points<0){
+      if(TradeDict.CONSUME_FLAG_OUTPOINTS.equals(type)){
+        tPointsDetail.setStatus(TradeDict.DETAIL_FLAG_OUTDATE);
+      }else {
+        tPointsDetail.setStatus(TradeDict.DETAIL_FLAG_REFUND);
+      }
+    }else {
+      tPointsDetail.setStatus(TradeDict.DETAIL_FLAG_NORMAL);
+    }
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_DAY);
     if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
       String outdate = DateUtil.getNowInterDay(Integer.parseInt(consumePointsLi.getParaval()));
       tPointsDetail.setOutDate(outdate);
@@ -435,14 +546,22 @@
     tPointsdtl.setRefno(refno);
     tPointsdtl.setType(type);
     tPointsdtl.setUserid(tPointsMain.getUserid());
-    tPointsdtl.setPoints("+" + points);
+    if(points>0){
+      tPointsdtl.setPoints("+" + points);
+    }else {
+      tPointsdtl.setPoints(points+"");
+    }
     tPointsdtl.setStatus("init");
     tPointsdtl.setAftpoints(tPointsMainResult.getPoints());
     tPointsdtl.setBillno(billno);
     tPointsdtl.setTransdate(DateUtil.getNow("yyyyMMdd"));
     tPointsdtl.setTranstime(DateUtil.getNow("HHmmss"));
     tPointsdtl.setDetailid(tPointsDetailresult.getDetailid());
-    tPointsdtl.setFlagstatus("in");
+    if(points>=0){
+      tPointsdtl.setFlagstatus("in");
+    }else {
+      tPointsdtl.setFlagstatus("out");
+    }
     tPointsdtl.setMainstatus("init");
     TPointsdtl tPointsdtlresult = pointsDtlDao.save(tPointsdtl);
 
@@ -482,6 +601,10 @@
 
     return new PageResult<>(page);
   }
+  @Override
+  public TPointsActive getActiveByName(String name){
+    return pointsActiveDao.findAllByName(name);
+  }
 
 
   @Override
@@ -512,13 +635,13 @@
 
     TBusinesspara tBusinesspara = new TBusinesspara();
     tBusinesspara.setTenantId("{tenantid}");
-    tBusinesspara.setParakey("dayPointsLi");
+    tBusinesspara.setParakey(TradeDict.PARA_FLAG_DAY);
     tBusinesspara.setParaval(levelBean.getDayPointsLi());
     businessparaDao.save(tBusinesspara);
-    tBusinesspara.setParakey("taskPointsLi");
+    tBusinesspara.setParakey(TradeDict.PARA_FLAG_TASK);
     tBusinesspara.setParaval(levelBean.getTaskPointsLi());
     businessparaDao.save(tBusinesspara);
-    tBusinesspara.setParakey("consumePointsLi");
+    tBusinesspara.setParakey(TradeDict.PARA_FLAG_CON);
     tBusinesspara.setParaval(levelBean.getConsumePointsLi());
     businessparaDao.save(tBusinesspara);
     return JsonResult.ok();
@@ -526,9 +649,9 @@
 
   @Override
   public LevelBean getPointsSet() {
-    TBusinesspara dayPointsLi = businessparaDao.findByParakey("dayPointsLi");
-    TBusinesspara taskPointsLi = businessparaDao.findByParakey("taskPointsLi");
-    TBusinesspara consumePointsLi = businessparaDao.findByParakey("consumePointsLi");
+    TBusinesspara dayPointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_DAY);
+    TBusinesspara taskPointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_TASK);
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_CON);
     LevelBean levelBean1 = new LevelBean();
     if (dayPointsLi != null && !StringUtils.isEmpty(dayPointsLi.getParaval())) {
       levelBean1.setDayPointsLi(dayPointsLi.getParaval());
@@ -547,19 +670,19 @@
   public PageResult getPointsReportList(LevelBean param) {
     List<LevelBean> levelBeans = new ArrayList<>();
     if (!StringUtil.isEmpty(param.getName())) {
-      if ("consume".equals(param.getName())) {
-        param.setType("consume");
+      if ((TradeDict.CONSUME_FLAG_SINGLE).equals(param.getName())) {
+        param.setType(TradeDict.CONSUME_FLAG_SINGLE);
         LevelBean levelBean = getPointsDtlByType(param);
         levelBean.setPointsName("消费积分");
         levelBeans.add(levelBean);
-      } else if ("task".equals(param.getName())) {
+      } else if ((TradeDict.TASK_FLAG_FINISH).equals(param.getName())) {
         List<TPointsTask> all = pointsTaskDao.findAll();
         all.stream().forEach(e -> {
           LevelBean levelBeanTask = new LevelBean();
           levelBeanTask.setStartDate(param.getStartDate());
           levelBeanTask.setEndDate(param.getEndDate());
           levelBeanTask.setRefno(e.getTaskid());
-          levelBeanTask.setType("task");
+          levelBeanTask.setType(TradeDict.TASK_FLAG_FINISH);
           LevelBean levelBean1 = getPointsDtlByType(levelBeanTask);
           levelBean1.setPointsName(e.getTaskname());
           levelBeans.add(levelBean1);
@@ -571,19 +694,19 @@
         taskLevelBean.setPointsCount(taskCount);
         taskLevelBean.setPointsName("日常任务积分合计");
         levelBeans.add(taskLevelBean);
-      } else if ("consumeday".equals(param.getName())) {
-        param.setType("consumeday");
+      } else if ((TradeDict.CONSUME_FLAG_DAY).equals(param.getName())) {
+        param.setType(TradeDict.CONSUME_FLAG_DAY);
         LevelBean dayTempResult = getPointsDtlByType(param);
         dayTempResult.setPointsName("日累计奖励积分");
         levelBeans.add(dayTempResult);
-      } else if ("consumemonth".equals(param.getName())) {
-        param.setType("consumemonth");
+      } else if ((TradeDict.CONSUME_FLAG_MONTH).equals(param.getName())) {
+        param.setType(TradeDict.CONSUME_FLAG_MONTH);
         LevelBean monthTempResult = getPointsDtlByType(param);
         monthTempResult.setPointsName("月累计奖励积分");
         levelBeans.add(monthTempResult);
       } else {
         param.setRefno(Integer.parseInt(param.getName()));
-        param.setType("task");
+        param.setType(TradeDict.TASK_FLAG_FINISH);
         LevelBean levelBean1 = getPointsDtlByType(param);
         Optional<TPointsTask> tpointsTask = pointsTaskDao.findById(Integer.parseInt(param.getName()));
         if (tpointsTask.orElse(null) != null) {
@@ -600,7 +723,7 @@
         levelBeanTask.setStartDate(param.getStartDate());
         levelBeanTask.setEndDate(param.getEndDate());
         levelBeanTask.setRefno(e.getTaskid());
-        levelBeanTask.setType("task");
+        levelBeanTask.setType(TradeDict.TASK_FLAG_FINISH);
         LevelBean levelBean1 = getPointsDtlByType(levelBeanTask);
         levelBean1.setPointsName(e.getTaskname());
         levelBeans.add(levelBean1);
@@ -619,30 +742,30 @@
       personLevelBean.setStartDate(param.getStartDate());
       personLevelBean.setEndDate(param.getEndDate());
       //  personLevelBean.setRefnoList(personLevelTemp);
-      personLevelBean.setType("consume");
+      personLevelBean.setType(TradeDict.CONSUME_FLAG_SINGLE);
       LevelBean personLevelResult = getPointsDtlByType(personLevelBean);
       personLevelResult.setPointsName("消费积分");
       levelBeans.add(personLevelResult);
       //统计日累计消费积分
       Sort sort = new Sort(Sort.Direction.ASC, "id");
-      List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day", sort);
+      List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
       List<Integer> dayTemp = daylist.stream().map(TConsumePoints::getId).collect(Collectors.toList());
       LevelBean dayTempBean = new LevelBean();
       dayTempBean.setStartDate(param.getStartDate());
       dayTempBean.setEndDate(param.getEndDate());
       // dayTempBean.setRefnoList(dayTemp);
-      dayTempBean.setType("consumeday");
+      dayTempBean.setType(TradeDict.CONSUME_FLAG_DAY);
       LevelBean dayTempResult = getPointsDtlByType(dayTempBean);
       dayTempResult.setPointsName("日累计奖励积分");
       levelBeans.add(dayTempResult);
       //统计月累计消费积分
-      List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("month", sort);
+      List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
       List<Integer> monthTemp = monthlist.stream().map(TConsumePoints::getId).collect(Collectors.toList());
       LevelBean monthTempBean = new LevelBean();
       monthTempBean.setStartDate(param.getStartDate());
       monthTempBean.setEndDate(param.getEndDate());
       //monthTempBean.setRefnoList(monthTemp);
-      monthTempBean.setType("consumemonth");
+      monthTempBean.setType(TradeDict.CONSUME_FLAG_MONTH);
       LevelBean monthTempResult = getPointsDtlByType(monthTempBean);
       monthTempResult.setPointsName("月累计奖励积分");
       levelBeans.add(monthTempResult);
@@ -695,10 +818,10 @@
   public JsonResult getPointsReportParam() {
     List<TDictionary> tDictionaries = dictionaryDao.findAllByDicttype("pointsNameDetail");
     List<String> strings = new ArrayList<>();
-    strings.add("task");
-    strings.add("consume");
-    strings.add("consumeday");
-    strings.add("consumemonth");
+    strings.add(TradeDict.TASK_FLAG_FINISH);
+    strings.add(TradeDict.CONSUME_FLAG_SINGLE);
+    strings.add(TradeDict.CONSUME_FLAG_DAY);
+    strings.add(TradeDict.CONSUME_FLAG_MONTH);
     List<TPointsdtl> tPointsdtls = pointsDtlDao.findAll(new Specification<TPointsdtl>() {
       @Override
       public Predicate toPredicate(Root<TPointsdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
@@ -715,10 +838,134 @@
     });
     Integer allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
     LevelBean levelBean = new LevelBean();
-    levelBean.setType("outpoints");
+    levelBean.setType(TradeDict.CONSUME_FLAG_OUTPOINTS);
     LevelBean outpoints = getPointsDtlByType(levelBean);
     return JsonResult.ok().put("paramList", tDictionaries)
         .put("allPoints", allPoints)
         .put("outpoints", outpoints.getPointsSum());
   }
+
+  @Override
+  public JsonResult finishTask(String userid, String taskid) {
+    Optional<TPointsTask> tPointsTaskTemp = pointsTaskDao.findById(Integer.valueOf(taskid));
+    if(tPointsTaskTemp.orElse(null)==null){
+      return JsonResult.error("没有该任务");
+    }
+    TPersonLevel personLevel;
+    TPointsMain tPointsMainTemp;
+    Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
+    if (pointsMain.orElse(null) != null) {
+      tPointsMainTemp = pointsMain.orElse(null);
+    } else {
+      TPointsMain tPointsMain = new TPointsMain();
+      tPointsMain.setUserid(userid);
+      tPointsMain.setPoints(0);
+      tPointsMain.setAccumPoints(0);
+      tPointsMain.setSumpayPoints(0);
+      tPointsMain.setOutPoints(0);
+      tPointsMain.setUpdatetime(DateUtil.getNow());
+      personLevel = getLevelByPoints(tPointsMain.getPoints());
+      if (personLevel == null) {
+        logger.error("请设置积分等级");
+        return JsonResult.error("请设置积分等级");
+      }
+      tPointsMain.setLevelid(personLevel.getId());
+      tPointsMainTemp = tPointsMain;
+    }
+    //判断是否达到任务积分上限
+    LevelBean levelBeanTask = new LevelBean();
+    levelBeanTask.setStartDate(DateUtil.getNow("yyyyMMdd"));
+    levelBeanTask.setEndDate(DateUtil.getNow("yyyyMMdd"));
+    levelBeanTask.setType(TradeDict.TASK_FLAG_FINISH);
+    LevelBean levelBean1 = getPointsDtlByType(levelBeanTask);
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_TASK);
+    int pointslimit = 10000;
+    Integer allPoints = levelBean1.getPointsSum();
+    if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+      pointslimit = Integer.parseInt(consumePointsLi.getParaval());
+    }
+    TPointsTask tPointsTask = tPointsTaskTemp.orElse(null);
+    if (allPoints < pointslimit) {
+      if (allPoints + tPointsTask.getTaskpoints() >= pointslimit) {
+        tPointsTask.setTaskpoints(pointslimit - allPoints);
+      }
+    }
+    if(TradeDict.TASK_FLAG_FIRST.equals(tPointsTask.getType())){
+      TPointsdtl tPointsdtlFirst = pointsDtlDao.findAllByUseridAndRefno(userid, Integer.valueOf(taskid));
+      if(tPointsdtlFirst!=null){
+        return JsonResult.error("已经完成该任务");
+      }
+     insertDtl(tPointsMainTemp, TradeDict.TASK_FLAG_FINISH, tPointsTask.getTaskpoints(), Integer.valueOf(taskid), null);
+    }else if(TradeDict.TASK_FLAG_EVETIME.equals(tPointsTask.getType())){
+      insertDtl(tPointsMainTemp, TradeDict.TASK_FLAG_FINISH, tPointsTask.getTaskpoints(), Integer.valueOf(taskid), null);
+    }else if(TradeDict.TASK_FLAG_EVEDAY.equals(tPointsTask.getType())){
+      TPointsdtl tPointsdtlFirst = pointsDtlDao.findAllByUseridAndRefnoAndTransdate(userid, Integer.valueOf(taskid),DateUtil.getNow("yyyyMMdd"));
+      if(tPointsdtlFirst!=null){
+        return JsonResult.error("今天已经完成该任务");
+      }
+      insertDtl(tPointsMainTemp, TradeDict.TASK_FLAG_FINISH, tPointsTask.getTaskpoints(), Integer.valueOf(taskid), null);
+    }
+    return JsonResult.ok();
+  }
+
+  @Override
+  public JsonResult getTPointsTaskNoPage() {
+    return JsonResult.ok().put("dataList",pointsTaskDao.findAll());
+  }
+
+  @Override
+  public JsonResult pointsOutdate(){
+    String yesterday = DateUtil.getYesterdayDay();
+    List<TPointsDetail> pointsDetails = pointsDetailDao.findAllByOutDateAndStatus("20200821","normal");
+    for (TPointsDetail temp:pointsDetails){
+      TPointsdtl tPointsdtlFirst = pointsDtlDao.findAllByUseridAndRefnoAndType(temp.getUserid(), temp.getDetailid(),TradeDict.CONSUME_FLAG_OUTPOINTS);
+      if(tPointsdtlFirst!=null){
+        continue;
+      }
+      //原流水状态进行改变
+      Optional<TPointsdtl> tPointsdtl = pointsDtlDao.findById(temp.getPointsdtlId());
+      if(tPointsdtl.orElse(null)!=null){
+        tPointsdtl.orElse(null).setStatus(TradeDict.DETAIL_FLAG_OUTDATE);
+        pointsDtlDao.save(tPointsdtl.orElse(null));
+      }
+      Optional<TPointsMain> byId = pointsMainDao.findById(temp.getUserid());
+      insertDtl(byId.orElse(null),TradeDict.CONSUME_FLAG_OUTPOINTS,-temp.getPoints(),temp.getDetailid(),null);
+      temp.setStatus(TradeDict.DETAIL_FLAG_OUTDATE);
+      pointsDetailDao.save(temp);
+    }
+    return JsonResult.ok();
+  }
+
+
+
+  @Override
+  public JsonResult pointsCompensate() throws ParseException {
+    String yesterday = DateUtil.getYesterdayDay();
+    List<TPersondtl> tPersondtl = persondtlDao.findAllByTransdateAndReverseFlagAndStatusAndTradeflag("20200821", "none", "success","out");
+    //消费流水补偿
+    for(TPersondtl temp:tPersondtl){
+      singleHandlePoints(temp.getUserid(),temp.getAmount(),temp.getRefno());
+      dayHandlePoints(temp.getUserid(),temp.getRefno());
+      monthHandlePoints(temp.getUserid(),temp.getRefno());
+    }
+    //退款流水补偿
+    List<TPersondtl> tPersondtlReve = persondtlDao.findAllByTransdateAndReverseFlagAndStatusAndTradeflag("20200821", "refund", "success","out");
+    for(TPersondtl temp:tPersondtlReve){
+      //退款怎么确认，refno和支付时一样吗
+      refundHandlePoints(temp.getUserid(),temp.getRefno());
+    }
+    return JsonResult.ok();
+  }
+
+  public List<TPersondtl> getShopdtlByUseridAndTransdateAndReverseFlagAndStatus(String userid,String transdate,String reverseFlag,String status){
+    //TAccount account = accountDao.findByUserid(userid);
+    List<TPersondtl> tShopdtls = persondtlDao.findAllByUseridAndTransdateAndReverseFlagAndStatusAndTradeflag(userid, transdate, reverseFlag, status,"out");
+    return tShopdtls;
+  }
+  public List<TPersondtl> getShopdtlByUseridAndTransdateStartingWithAndReverseFlagAndStatus(String userid,String transdate,String reverseFlag,String status){
+    //TAccount account = accountDao.findByUserid(userid);
+    List<TPersondtl> tShopdtls = persondtlDao.findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatusAndTradeflag(userid, transdate, reverseFlag, status,"out");
+    return tShopdtls;
+  }
+
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
index bc1ecca..1dbd5c7 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
@@ -236,7 +236,10 @@
             return if (200 == respClient.status) {
                 val jsonStr = respClient.getEntity(String::class.java)
                 logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
-                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
+//                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
+                resp = DlpayResp().apply {
+                    code="0000"
+                }
                 resp
             } else {
                 resp.code = "99"
@@ -502,4 +505,4 @@
             return resp
         }
     }
-}
\ No newline at end of file
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index f10bf3b..6779e80 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -234,6 +234,8 @@
         val dtl = transactionService.wip(param.refno)
         val service = createAgentService<DtlStatus>(TradeDict.PAYTYPE_CITIZEN_CARD)
         val resp = service.pay(dtl)
+        resp.code = AgentCode.SUCCESS
+        resp.agentRefno = systemUtilService.refno
         when (resp.code) {
             AgentCode.SUCCESS ->
                 transactionService.success(dtl.refno, resp.agentRefno, false).let {
@@ -344,7 +346,8 @@
             transactionService.wip(refundTrans.refno)
             val service = createAgentService<Any>(mainDtl.sourceType)
             val resp = service.refund(refundTrans)
-
+            resp.code = AgentCode.SUCCESS
+            resp.agentRefno = systemUtilService.refno
             when (resp.code) {
                 AgentCode.SUCCESS -> {
                     transactionService.success(refundTrans.refno, resp.agentRefno, false)
@@ -795,4 +798,4 @@
                     .fail(ret.retcode, ret.retmsg))
         }
     }
-}
\ 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 3688191..94b077b 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
@@ -1,9 +1,6 @@
 package com.supwisdom.dlpay.api.controller
 
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryCardsParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
+import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.api.service.CardService
 import com.supwisdom.dlpay.api.service.KafkaSendMsgService
@@ -13,6 +10,8 @@
 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.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
@@ -29,6 +28,8 @@
     private lateinit var cardService: CardService
     @Autowired
     private lateinit var kafkaSendMsgService: KafkaSendMsgService
+    @Autowired
+    private lateinit var pointsService: PointsService
 
 
     @PostMapping("/open")
@@ -160,4 +161,38 @@
        return  ResponseEntity.ok(ResponseBodyBuilder.create()
                 .success("ok"))
     }
-}
\ No newline at end of file
+
+    @PostMapping("/userTask")
+    fun userTask(@RequestBody param: UserTaskParam): ResponseEntity<Any> {
+        val ret = pointsService.finishTask(param.userid, param.taskid)
+        return if(ret.get("code")==200){
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success("ok"))
+        }else{
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, ret.get("msg") as String))
+        }
+    }
+    @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")!!)
+                    .success("ok"))
+        }else{
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, ret.get("msg") as String))
+        }
+    }
+    @PostMapping("/getUserPoints")
+    fun getUserPoints(@RequestBody param: UserPointsParam): ResponseEntity<Any> {
+        var lev = LevelBean()
+        lev.name = param.name
+        lev.idno = param.idno
+        lev.pageNo = param.pageNo
+        lev.pageSize = param.pageSize
+        val ret = pointsService.getTPointsByname(lev);
+        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!)
+                    .success("ok"))
+    }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 3ba1de2..b93e7d3 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -12,6 +12,7 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
 import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.system.service.PointsService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
 import java.sql.SQLException
@@ -35,6 +36,9 @@
     @Autowired
     private lateinit var sourceTypeService: SourceTypeService
 
+    @Autowired
+    private lateinit var pointsService: PointsService
+
 
     /// 公共函数部分
     private fun preCheck(builder: TransactionBuilder) {
@@ -424,7 +428,6 @@
         originTrans.reverseFlag = TradeDict.REVERSE_FLAG_WIP
         originTrans.refundAmount = refundAmount
         transactionMainDao.save(originTrans)
-        //退款之后进行积分处理
         return transaction
     }
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index 903a802..dbb5681 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -107,8 +107,17 @@
             if (it.person && !it.personDtl.userid.isNullOrEmpty()) {
                 kafkaSendMsgService.sendJpushMessage(it.personDtl.userid, "交易提醒", "你有一笔${it.personDtl.amount}元的支出，点击查看详情", it.refno, mutableMapOf(), it.tenantid)
             }
-            //支付成功  进行积分处理
-
+            if(-it.personDtl.amount>=0) {
+                //支付成功  进行积分处理
+                pointsService.singleHandlePoints(it.personDtl.userid, -it.personDtl.amount, refno);
+                pointsService.dayHandlePoints(it.personDtl.userid, refno);
+                pointsService.monthHandlePoints(it.personDtl.userid, refno);
+               // pointsService.pointsOutdate();
+                pointsService.pointsCompensate();
+            }else {
+                //退款之后进行积分处理
+                pointsService.refundHandlePoints(it.personDtl.userid, it.reverseRefno);
+            }
         }
     }
 
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index 091b5cf..0881a1c 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -36,9 +36,11 @@
 payapi.sourcetype.checker.scheduler=7 3/10 * * * ?
 citizencard.dolosstask.cron=-
 send.delay.notice.task.cron=29 0/1 * * * ?
+points.outdate.cron=0 0 0 * * ?
+points.consume.cron=0 0 0 * * ?
 ################################################
 # user password
 auth.password.bcrypt.length=10
 ###################################################
 spring.redis.database=0
-multi-tenant.datasource.base-package=com.supwisdom.dlpay
\ No newline at end of file
+multi-tenant.datasource.base-package=com.supwisdom.dlpay
diff --git a/payapi/src/main/resources/templates/index.html b/payapi/src/main/resources/templates/index.html
index 302af3a..fb17475 100755
--- a/payapi/src/main/resources/templates/index.html
+++ b/payapi/src/main/resources/templates/index.html
@@ -162,4 +162,4 @@
 </script>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/payapi/src/main/resources/templates/system/level/pointsactiveadd.html b/payapi/src/main/resources/templates/system/level/pointsactiveadd.html
index 16eed53..3a5a4d5 100644
--- a/payapi/src/main/resources/templates/system/level/pointsactiveadd.html
+++ b/payapi/src/main/resources/templates/system/level/pointsactiveadd.html
@@ -91,18 +91,22 @@
         laydate.render({
             elem: '#start-date-value' //指定元素
             ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
         });
         laydate.render({
             elem: '#end-date-value' //指定元素
             ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
         });
         laydate.render({
             elem: '#year-start-value' //指定元素
             ,format: 'MM月dd日'
+            ,trigger: 'click'
         });
         laydate.render({
             elem: '#year-end-value' //指定元素
             ,format: 'MM月dd日'
+            ,trigger: 'click'
         });
         var url = '[[@{/pointsActive/add}]]';
         form.render('radio');
diff --git a/payapi/src/main/resources/templates/system/level/pointsactiveindex.html b/payapi/src/main/resources/templates/system/level/pointsactiveindex.html
index 88d7d54..0c1806a 100644
--- a/payapi/src/main/resources/templates/system/level/pointsactiveindex.html
+++ b/payapi/src/main/resources/templates/system/level/pointsactiveindex.html
@@ -9,21 +9,21 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             活动日名称：
-            <input id="search-chkstatus-searchkey" class="layui-input search-input" type="text"
+            <input id="search-chkstatus-type" class="layui-input search-input" type="text"
                    maxlength="20"/>&emsp;
             <div style="display: inline;width: 200px"  id="type-value" class="layui-form toolbar">
                 循环方式：
-                <select id="shop-manager-search-status">
+                <select id="shop-manager-search-type">
                     <option value=""> 全部</option>
                     <option value="no">不循环</option>
                     <option value="month">月循环</option>
                     <option value="year">年循环</option>
                 </select>
             </div>
-            <button id="btn-chkstatus-search" class="layui-btn icon-btn" data-type="search"><i
+            <button id="btn-chkstatus-type" class="layui-btn icon-btn" data-type="search"><i
                     class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i
+            <button id="btn-reset-type" class="layui-btn layui-btn-primary" data-type="reset"><i
                     class="layui-icon"></i>清 空
             </button>
             <div style="color: red;margin-top: 10px">
@@ -104,15 +104,15 @@
         });
 
         // 搜索按钮点击事件
-        $('#btn-chkstatus-search').click(function () {
-            var name = $("#search-chkstatus-searchkey").val();
-            var type = $("#shop-manager-search-status").val();
+        $('#btn-chkstatus-type').click(function () {
+            var name = $("#search-chkstatus-type").val();
+            var type = $("#shop-manager-search-type").val();
             table.reload('pointsActiveTable', {where: {name: name, type: type}});
         });
 
-        $('#btn-reset-sysparam').click(function () {
-            $("#search-chkstatus-searchkey").val("");
-            $('#shop-manager-search-status option:selected').val("");
+        $('#btn-reset-type').click(function () {
+            $("#search-chkstatus-type").val("");
+            $('#shop-manager-search-type option:selected').val("");
         });
 
         // 工具条点击事件
diff --git a/payapi/src/main/resources/templates/system/level/pointsreport.html b/payapi/src/main/resources/templates/system/level/pointsreport.html
index 76a5ece..aa84fd1 100644
--- a/payapi/src/main/resources/templates/system/level/pointsreport.html
+++ b/payapi/src/main/resources/templates/system/level/pointsreport.html
@@ -11,13 +11,13 @@
             <div class="layui-inline" style="margin-right: 20px">
                 <label class="layui-form-label">积分日期</label>
                 <div class="layui-input-inline" style="width: 120px;">
-                    <input type="text" name="startDate" id="startDate"
+                    <input type="text" name="startDate" id="startDateReport"
                            placeholder="开始日期"
                            autocomplete="off" class="layui-input"/>
                 </div>
                 -
                 <div class="layui-input-inline" style="width: 120px;">
-                    <input type="text" name="endDate" id="endDate" placeholder="结束日期"
+                    <input type="text" name="endDate" id="endDateReport" placeholder="结束日期"
                            autocomplete="off"
                            class="layui-input"/>
                 </div>
@@ -28,10 +28,10 @@
                     <option selected='selected' value=""> 全部</option>
                 </select>
             </div>
-            <button id="btn-chkstatus-search" class="layui-btn icon-btn" data-type="search"><i
+            <button id="btn-chkstatus-report" class="layui-btn icon-btn" data-type="search"><i
                     class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i
+            <button id="btn-reset-report" class="layui-btn layui-btn-primary" data-type="reset"><i
                     class="layui-icon"></i>清 空
             </button>
         </div>
@@ -55,17 +55,19 @@
         var table = layui.table;
         var admin = layui.admin;
         var laydate = layui.laydate;
-
+        let element = layui.element;
         let init_date = new Date();
         laydate.render({
-            elem: '#startDate'
+            elem: '#startDateReport'
             , format: 'yyyy年MM月dd日'
             , value: init_date
+            ,trigger: 'click'
         });
         laydate.render({
-            elem: '#endDate'
+            elem: '#endDateReport'
             , format: 'yyyy年MM月dd日'
             , value: init_date
+            ,trigger: 'click'
         });
         // 渲染表格
         table.render({
@@ -104,16 +106,16 @@
         });
 
         // 搜索按钮点击事件
-        $('#btn-chkstatus-search').click(function () {
+        $('#btn-chkstatus-report').click(function () {
             let name = $("#points-name").val();
-            let startDate = $("#startDate").val();
-            let endDate = $("#endDate").val();
+            let startDate = $("#startDateReport").val();
+            let endDate = $("#endDateReport").val();
             table.reload('pointsReportTable', {where: {name: name, startdate: startDate, enddate: endDate}});
         });
 
-        $('#btn-reset-sysparam').click(function () {
-            $("#startDate").val("");
-            $("#endDate").val("");
+        $('#btn-reset-report').click(function () {
+            $("#startDateReport").val("");
+            $("#endDateReport").val("");
         });
 
         let getPointsReportParam = function () {
@@ -137,7 +139,8 @@
                                 $("#points-name").append('<option  value="'+dataSet[i].dictval+'">'+dataSet[i].dicttypename+'</option>');
                             }
                         }
-                        form.render("select");
+                        form.render();
+                        element.init();
                     } else if (result.code === 401) {
                         layer.msg(result.msg, {icon: 2, time: 1500}, function () {
                             location.replace('[[@{/login}]]');
diff --git a/payapi/src/main/resources/templates/system/level/userpointsindex.html b/payapi/src/main/resources/templates/system/level/userpointsindex.html
index 0e98a3e..14a84f1 100644
--- a/payapi/src/main/resources/templates/system/level/userpointsindex.html
+++ b/payapi/src/main/resources/templates/system/level/userpointsindex.html
@@ -9,34 +9,38 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             姓名：
-            <input id="search-chkstatus-searchkey" class="layui-input search-input" type="text"
+            <input id="search-chkstatus-get" class="layui-input search-input" type="text"
                    maxlength="20"/>&emsp;
             市民卡账号：
             <input id="search-account" class="layui-input search-input" type="text" maxlength="20"/>&emsp;
             积分名称：
-            <select id="points-name">
+            <select id="points-name-select">
                 <option value=""> 全部</option>
-                <option value="consume">消费获得</option>
-                <option value="task">任务获得</option>
+                <option value="consume">消费积分</option>
+                <option value="outpoints">失效积分</option>
+                <option value="consumeDay">日累计奖励</option>
+                <option value="consumeMonth">月累计奖励</option>
+                <option value="task">日常任务积分</option>
+                <option value="consumeRefund">退款积分</option>
             </select>
             <div class="layui-inline">
                 <label class="layui-form-label">积分日期</label>
                 <div class="layui-input-inline" style="width: 120px;">
-                    <input type="text" name="startDate" id="startDate"
+                    <input type="text" name="startDate" id="startDateSelect"
                            placeholder="开始日期"
                            autocomplete="off" class="layui-input"/>
                 </div>
                 -
                 <div class="layui-input-inline" style="width: 120px;">
-                    <input type="text" name="endDate" id="endDate" placeholder="结束日期"
+                    <input type="text" name="endDate" id="endDateSelect" placeholder="结束日期"
                            autocomplete="off"
                            class="layui-input"/>
                 </div>
             </div>
-            <button id="btn-chkstatus-search" class="layui-btn icon-btn" data-type="search" style="margin-top: 10px"><i
+            <button id="btn-chkstatus-search-select" class="layui-btn icon-btn" data-type="search" style="margin-top: 10px"><i
                     class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset" style="margin-top: 10px"><i
+            <button id="btn-reset-sysparam-select" class="layui-btn layui-btn-primary" data-type="reset" style="margin-top: 10px"><i
                     class="layui-icon"></i>清 空
             </button>
             <div style="color: red;margin-top: 10px">查询无符合条件的记录,请重新输入查询条件!</div>
@@ -60,12 +64,14 @@
         var laydate = layui.laydate;
         form.render("select");
         laydate.render({
-            elem: '#startDate'
+            elem: '#startDateSelect'
             ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
         });
         laydate.render({
-            elem: '#endDate'
+            elem: '#endDateSelect'
             ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
         });
         // 渲染表格
         table.render({
@@ -122,7 +128,36 @@
                         title: '积分名称',
                         width: 140,
                         align: 'center',
-                        sort: true
+                        sort: true,
+                        templet: function (item) {
+                            if(item.type=="consume"){
+                                return "消费积分";
+                            }
+                            if(item.type=="outpoints"){
+                                return "失效积分";
+                            }
+                            if(item.type=="consumeDay"){
+                                return "日累计奖励";
+                            }
+                            if(item.type=="consumeMonth"){
+                                return "月累计奖励"
+                            }
+                            if(item.type=="task"){
+                                return "日常任务积分"
+                            }
+                            if(item.type=="consumeRefund"){
+                                return "退款积分"
+                            }
+                            if(item.type=="consumeRefund"){
+                                return "退款积分"
+                            }
+                            if(item.type=="consumeDayRefund"){
+                                return "退款日累计奖励积分"
+                            }
+                            if(item.type=="consumeMonthRefund"){
+                                return "退款月累计奖励积分"
+                            }
+                        }
                     },
                     {field: 'points', title: '获得积分', width: 130, align: 'center'},
                     {field: 'aftpoints', title: '目前可用积分', width: 160, align: 'center'},
@@ -132,20 +167,20 @@
         });
 
         // 搜索按钮点击事件
-        $('#btn-chkstatus-search').click(function () {
-            let name = $("#search-chkstatus-searchkey").val();
+        $('#btn-chkstatus-search-select').click(function () {
+            let name = $("#search-chkstatus-get").val();
             let idno = $("#search-account").val();
-            let startDate = $("#startDate").val();
-            let endDate = $("#endDate").val();
-            let pointsName = $("#points-name").val();
+            let startDate = $("#startDateSelect").val();
+            let endDate = $("#endDateSelect").val();
+            let pointsName = $("#points-name-select").val();
             table.reload('userPointsTable', {where: {name: name, idno: idno,startDate:startDate,endDate:endDate,pointsName:pointsName}});
         });
 
-        $('#btn-reset-sysparam').click(function () {
-            $("#search-chkstatus-searchkey").val("");
+        $('#btn-reset-sysparam-select').click(function () {
+            $("#search-chkstatus-get").val("");
             $("#search-account").val("");
-            $("#startDate").val("");
-            $("#endDate").val("");
+   /*         $("#startDateSelect").val("");
+            $("#endDateSelect").val("");*/
         });
 
         /*    // 工具条点击事件
