积分模块
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("");*/
         });
 
         /*    // 工具条点击事件