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