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 6454ba7..ae5b677 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
@@ -7,7 +7,10 @@
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface PointsActiveDao extends JpaRepository<TPointsActive, Integer>, JpaSpecificationExecutor<TPointsActive> {
 
+    List<TPointsActive> findAllByType(String type);
 }
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 0471725..909ee47 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
@@ -408,4 +408,19 @@
     DateFormat formatter = new SimpleDateFormat(pattern);
     return formatter.format(date);
   }
+
+
+  /*
+  * 判断当前日期是这个月的第几周
+  *
+  * */
+  public static int howWeeksByMonth(String datetemp) throws ParseException {
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+    Date date = sdf.parse(datetemp);
+    Calendar calendar = Calendar.getInstance();
+    calendar.setTime(date);
+    int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);
+    System.out.println(weekOfMonth);
+    return weekOfMonth;
+  }
 }
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 d69548d..c787449 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,7 @@
   *
   *
   * */
-  public static final String CONSUME_FLAG_SINGLE = "single";
-  public static final String CONSUME_FLAG_DAY = "day";
-  public static final String CONSUME_FLAG_MONTH = "month";
+  public static final String CONSUME_FLAG_SINGLE = "consume";
+  public static final String CONSUME_FLAG_DAY = "consumeday";
+  public static final String CONSUME_FLAG_MONTH = "consumemonth";
 }
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 7d242d3..bf63628 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
@@ -326,6 +326,12 @@
       @RequestParam(value = "enddate", required = false) String enddate,
       @RequestParam(value = "name", required = false) String name) {
     try {
+      if(StringUtils.isEmpty(startdate)){
+        startdate = DateUtil.getNow("yyyy年MM月dd日");
+      }
+      if(StringUtils.isEmpty(enddate)){
+        enddate = DateUtil.getNow("yyyy年MM月dd日");
+      }
       LevelBean levelBean = new LevelBean(name, startdate, enddate);
       return pointsService.getPointsReportList(levelBean);
     } catch (Exception e) {
@@ -334,4 +340,16 @@
     }
   }
 
+  @GetMapping("/pointsReport/param")
+  @PreAuthorize("hasPermission('/user/card','')")
+  @ResponseBody
+  public JsonResult getPointsReportParam() {
+    try {
+      return pointsService.getPointsReportParam();
+    } catch (Exception e) {
+      e.printStackTrace();
+      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 7da281c..19c3bd5 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
@@ -14,6 +14,7 @@
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.ParseException;
 import java.util.List;
 
 public interface PointsService {
@@ -75,7 +76,7 @@
   * */
   //单次消费进行积分处理
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  Boolean singleHandlePoints(String userid,Double amount,String billno);
+  Boolean singleHandlePoints(String userid,Double amount,String billno) throws ParseException;
 
   //日消费进行积分处理
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@@ -85,6 +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);*/
 
   /*
   *
@@ -115,4 +121,7 @@
   *
   * */
   PageResult<LevelBean>  getPointsReportList(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult getPointsReportParam();
 }
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 6204189..748c5bf 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
@@ -34,7 +34,9 @@
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -214,9 +216,10 @@
   }
 
   @Override
-  public Boolean singleHandlePoints(String userid, Double amount, String billno) {
+  public Boolean singleHandlePoints(String userid, Double amount, String billno) throws ParseException {
     int 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");
@@ -225,10 +228,51 @@
         rate = 2;
       }
     }
+    //1.1判断不循环
+    List<TPointsActive> noActives = pointsActiveDao.findAllByType("no");
+    for (TPointsActive noActivetemp : noActives) {
+      if (rate < Integer.parseInt(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());
+        }
+      }
+    }
+    //1.2判断年循环
+    List<TPointsActive> yearActives = pointsActiveDao.findAllByType("year");
+    for (TPointsActive yearActivetemp : yearActives) {
+      if (rate < Integer.parseInt(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());
+        }
+      }
+    }
+    //1.3判断月循环
+    List<TPointsActive> monthActives = pointsActiveDao.findAllByType("month");
+    for (TPointsActive monthActivetemp : monthActives) {
+      if (rate < Integer.parseInt(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());
+            }
+          }
+        }
+      }
+    }
     //2. 查询用户的等级，获取单次消费获得积分的规则
     TPersonLevel personLevel;
+    TPointsMain tPointsMainTemp;
     Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
     if (pointsMain.orElse(null) != null) {
+      tPointsMainTemp = pointsMain.orElse(null);
       Integer levelid = pointsMain.orElse(null).getLevelid();
       if (levelid != null) {
         personLevel = personLevelDao.getOne(levelid);
@@ -236,10 +280,27 @@
         if (pointsMain.orElse(null).getPoints() == null) {
           pointsMain.orElse(null).setPoints(0);
         }
-        personLevel = personLevelDao.findTPersonLevelByPoints(pointsMain.orElse(null).getPoints());
+        personLevel = getLevelByPoints(pointsMain.orElse(null).getPoints());
+        if (personLevel == null) {
+          logger.error("请设置积分等级");
+          return false;
+        }
       }
     } else {
-      return false;
+      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 false;
+      }
+      tPointsMain.setLevelid(personLevel.getId());
+      tPointsMainTemp = tPointsMain;
     }
     //3. 根据规则计算积分，得到的积分与当日积分上限进行比较，得到实际获得的积分
     int resultPoints = 0;
@@ -250,12 +311,12 @@
       //计算得到的积分
       resultPoints = resultInt * personLevel.getSinglePoints();
       //获得流水积分
-      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatus(userid, "", "in");
+      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatus(userid, "consume", "in");
       int allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
-      List<TDictionary> tDictionaries = dictionaryDao.findAllByDicttype("pointslimit");
-      int pointslimit = 0;
-      if (tDictionaries != null && tDictionaries.size() > 0) {
-        pointslimit = Integer.parseInt(tDictionaries.get(0).getDictval());
+      TBusinesspara consumePointsLi = businessparaDao.findByParakey("consumePointsLi");
+      int pointslimit = 10000;
+      if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+        pointslimit = Integer.parseInt(consumePointsLi.getParaval());
       }
       if (allPoints < pointslimit) {
         if (allPoints + resultPoints >= pointslimit) {
@@ -264,8 +325,7 @@
       }
     }
     //4. 对积分的主子表和流水表进行添加，查询用户的积分，得到的积分去查询等级表更新用户的等级
-    insertDtl(userid, TradeDict.CONSUME_FLAG_SINGLE, resultPoints * rate, personLevel.getId(), billno);
-    return null;
+    return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_SINGLE, resultPoints * rate, personLevel.getId(), billno);
   }
 
   @Override
@@ -282,7 +342,26 @@
         TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
         if (tPointsdtltemp == null) {
           // 4.奖励的积分对积分主子表和流水表进行添加
-          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
+          Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
+          TPointsMain tPointsMainTemp;
+          if(tPointsMain.orElse(null)==null){
+            tPointsMainTemp = new TPointsMain();
+            tPointsMainTemp.setUserid(userid);
+            tPointsMainTemp.setPoints(0);
+            tPointsMainTemp.setAccumPoints(0);
+            tPointsMainTemp.setSumpayPoints(0);
+            tPointsMainTemp.setOutPoints(0);
+            tPointsMainTemp.setUpdatetime(DateUtil.getNow());
+            TPersonLevel personLevel = getLevelByPoints(tPointsMainTemp.getPoints());
+            if (personLevel == null) {
+              logger.error("请设置积分等级");
+              return false;
+            }
+            tPointsMainTemp.setLevelid(personLevel.getId());
+          }else {
+            tPointsMainTemp = tPointsMain.orElse(null);
+          }
+          return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
         }
       }
     }
@@ -303,52 +382,59 @@
         TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
         if (tPointsdtltemp == null) {
           // 4.奖励的积分对积分主子表和流水表进行添加
-          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
+          Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
+          TPointsMain tPointsMainTemp;
+          if(tPointsMain.orElse(null)==null){
+            tPointsMainTemp = new TPointsMain();
+            tPointsMainTemp.setUserid(userid);
+            tPointsMainTemp.setPoints(0);
+            tPointsMainTemp.setAccumPoints(0);
+            tPointsMainTemp.setSumpayPoints(0);
+            tPointsMainTemp.setOutPoints(0);
+            tPointsMainTemp.setUpdatetime(DateUtil.getNow());
+            TPersonLevel personLevel = getLevelByPoints(tPointsMainTemp.getPoints());
+            if (personLevel == null) {
+              logger.error("请设置积分等级");
+              return false;
+            }
+            tPointsMainTemp.setLevelid(personLevel.getId());
+          }else {
+            tPointsMainTemp = tPointsMain.orElse(null);
+          }
+          return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
         }
       }
     }
     return null;
   }
 
-  public Boolean insertDtl(String userid, String type, int points, Integer refno, String billno) {
+  public Boolean insertDtl(TPointsMain tPointsMain, String type, int points, Integer refno, String billno) {
     //主表流水
-    TPointsMain tPointsMain;
-    Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
-    if (pointsMain.orElse(null) != null) {
-      tPointsMain = pointsMain.orElse(null);
-      tPointsMain.setPoints(tPointsMain.getPoints() + points);
-      tPointsMain.setAccumPoints(tPointsMain.getAccumPoints() + points);
-      TPersonLevel tPersonLevelByPoints = personLevelDao.findTPersonLevelByPoints(tPointsMain.getPoints());
-      if (tPersonLevelByPoints.getId() > tPointsMain.getLevelid()) {
-        tPointsMain.setLevelid(tPersonLevelByPoints.getId());
-      }
-    } else {
-      tPointsMain = new TPointsMain();
-      tPointsMain.setUserid(userid);
-      tPointsMain.setPoints(points);
-      tPointsMain.setAccumPoints(points);
-      TPersonLevel tPersonLevelByPoints = personLevelDao.findTPersonLevelByPoints(points);
+    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.setUpdatetime(DateUtil.getNow());
     TPointsMain tPointsMainResult = pointsMainDao.save(tPointsMain);
     //子表流水
     TPointsDetail tPointsDetail = new TPointsDetail();
-    tPointsDetail.setUserid(userid);
+    tPointsDetail.setUserid(tPointsMain.getUserid());
     tPointsDetail.setPoints(points);
-    List<TDictionary> tDictionaries = dictionaryDao.findAllByDicttype("pointsdate");
-    if (tDictionaries != null && tDictionaries.size() > 0) {
-      String outdate = DateUtil.getNowInterDay(Integer.parseInt(tDictionaries.get(0).getDictval()));
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey("dayPointsLi");
+    if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+      String outdate = DateUtil.getNowInterDay(Integer.parseInt(consumePointsLi.getParaval()));
       tPointsDetail.setOutDate(outdate);
     } else {
-      return false;
+      logger.error("请设置过期天数");
     }
     TPointsDetail tPointsDetailresult = pointsDetailDao.save(tPointsDetail);
     //积分流水表信息
     TPointsdtl tPointsdtl = new TPointsdtl();
     tPointsdtl.setRefno(refno);
     tPointsdtl.setType(type);
-    tPointsdtl.setUserid(userid);
+    tPointsdtl.setUserid(tPointsMain.getUserid());
     tPointsdtl.setPoints("+" + points);
     tPointsdtl.setStatus("init");
     tPointsdtl.setAftpoints(tPointsMainResult.getPoints());
@@ -365,6 +451,17 @@
     return true;
   }
 
+  public TPersonLevel getLevelByPoints(Integer points) {
+    Sort sort = new Sort(Sort.Direction.DESC, "id");
+    List<TPersonLevel> all = personLevelDao.findAll(sort);
+    for (TPersonLevel temp : all) {
+      if (points >= temp.getPointsLower()) {
+        return temp;
+      }
+    }
+    return null;
+  }
+
 
   @Override
   public PageResult getActiveList(LevelBean param) {
@@ -450,13 +547,55 @@
   public PageResult getPointsReportList(LevelBean param) {
     List<LevelBean> levelBeans = new ArrayList<>();
     if (!StringUtil.isEmpty(param.getName())) {
-      LevelBean levelBean = getPointsDtlByType(param);
-      levelBeans.add(levelBean);
+      if ("consume".equals(param.getName())) {
+        param.setType("consume");
+        LevelBean levelBean = getPointsDtlByType(param);
+        levelBean.setPointsName("消费积分");
+        levelBeans.add(levelBean);
+      } else if ("task".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");
+          LevelBean levelBean1 = getPointsDtlByType(levelBeanTask);
+          levelBean1.setPointsName(e.getTaskname());
+          levelBeans.add(levelBean1);
+        });
+        Integer taskSum = levelBeans.stream().mapToInt(o -> o.getPointsSum()).sum();
+        Integer taskCount = levelBeans.stream().mapToInt(o -> o.getPointsCount()).sum();
+        LevelBean taskLevelBean = new LevelBean();
+        taskLevelBean.setPointsSum(taskSum);
+        taskLevelBean.setPointsCount(taskCount);
+        taskLevelBean.setPointsName("日常任务积分合计");
+        levelBeans.add(taskLevelBean);
+      } else if ("consumeday".equals(param.getName())) {
+        param.setType("consumeday");
+        LevelBean dayTempResult = getPointsDtlByType(param);
+        dayTempResult.setPointsName("日累计奖励积分");
+        levelBeans.add(dayTempResult);
+      } else if ("consumemonth".equals(param.getName())) {
+        param.setType("consumemonth");
+        LevelBean monthTempResult = getPointsDtlByType(param);
+        monthTempResult.setPointsName("月累计奖励积分");
+        levelBeans.add(monthTempResult);
+      } else {
+        param.setRefno(Integer.parseInt(param.getName()));
+        param.setType("task");
+        LevelBean levelBean1 = getPointsDtlByType(param);
+        Optional<TPointsTask> tpointsTask = pointsTaskDao.findById(Integer.parseInt(param.getName()));
+        if (tpointsTask.orElse(null) != null) {
+          levelBean1.setPointsName(tpointsTask.orElse(null).getTaskname());
+        }
+        levelBeans.add(levelBean1);
+      }
       return new PageResult<>(levelBeans);
     } else {
       //统计每个任务获取的积分
       List<TPointsTask> all = pointsTaskDao.findAll();
-      all.stream().forEach( e -> {
+      all.stream().forEach(e -> {
         LevelBean levelBeanTask = new LevelBean();
         levelBeanTask.setStartDate(param.getStartDate());
         levelBeanTask.setEndDate(param.getEndDate());
@@ -479,7 +618,7 @@
       LevelBean personLevelBean = new LevelBean();
       personLevelBean.setStartDate(param.getStartDate());
       personLevelBean.setEndDate(param.getEndDate());
-    //  personLevelBean.setRefnoList(personLevelTemp);
+      //  personLevelBean.setRefnoList(personLevelTemp);
       personLevelBean.setType("consume");
       LevelBean personLevelResult = getPointsDtlByType(personLevelBean);
       personLevelResult.setPointsName("消费积分");
@@ -491,7 +630,7 @@
       LevelBean dayTempBean = new LevelBean();
       dayTempBean.setStartDate(param.getStartDate());
       dayTempBean.setEndDate(param.getEndDate());
-     // dayTempBean.setRefnoList(dayTemp);
+      // dayTempBean.setRefnoList(dayTemp);
       dayTempBean.setType("consumeday");
       LevelBean dayTempResult = getPointsDtlByType(dayTempBean);
       dayTempResult.setPointsName("日累计奖励积分");
@@ -509,8 +648,8 @@
       levelBeans.add(monthTempResult);
       //消费积分合计
       LevelBean consume = new LevelBean();
-      consume.setPointsSum(personLevelResult.getPointsSum()+dayTempResult.getPointsSum()+monthTempResult.getPointsSum());
-      consume.setPointsCount(personLevelResult.getPointsCount()+dayTempResult.getPointsCount()+monthTempResult.getPointsCount());
+      consume.setPointsSum(personLevelResult.getPointsSum() + dayTempResult.getPointsSum() + monthTempResult.getPointsSum());
+      consume.setPointsCount(personLevelResult.getPointsCount() + dayTempResult.getPointsCount() + monthTempResult.getPointsCount());
       consume.setPointsName("消费积分合计");
       levelBeans.add(consume);
       //all.stream().map(TPointsTask::getTaskid).collect(Collectors.toList());
@@ -524,20 +663,20 @@
       public Predicate toPredicate(Root<TPointsdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
         List<Predicate> predicates = new ArrayList<>();
         if (!StringUtil.isEmpty(param.getStartDate())) {
-          predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(param.getStartDate()))));
+          predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.formatDateStr(param.getStartDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
         }
         if (!StringUtil.isEmpty(param.getEndDate())) {
-          predicates.add(criteriaBuilder.le(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(param.getEndDate()))));
+          predicates.add(criteriaBuilder.le(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.formatDateStr(param.getEndDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
         }
-        if (param.getRefno()!=null) {
+        if (param.getRefno() != null) {
           predicates.add(criteriaBuilder.equal(root.get("refno").as(Integer.class), param.getRefno()));
         }
-        if (param.getType()!=null) {
+        if (param.getType() != null) {
           predicates.add(criteriaBuilder.equal(root.get("type").as(String.class), param.getType()));
         }
         if (!CollectionUtils.isEmpty(param.getRefnoList())) {
           CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get("refno"));
-          for (Integer refnoTemp:param.getRefnoList()){
+          for (Integer refnoTemp : param.getRefnoList()) {
             in.value(refnoTemp);
           }
           predicates.add(criteriaBuilder.and(in));
@@ -551,4 +690,35 @@
     levelBean.setPointsCount(tPointsdtls.size());
     return levelBean;
   }
+
+  @Override
+  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");
+    List<TPointsdtl> tPointsdtls = pointsDtlDao.findAll(new Specification<TPointsdtl>() {
+      @Override
+      public Predicate toPredicate(Root<TPointsdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(strings)) {
+          CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get("type"));
+          for (String temp : strings) {
+            in.value(temp);
+          }
+          predicates.add(criteriaBuilder.and(in));
+        }
+        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+      }
+    });
+    Integer allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
+    LevelBean levelBean = new LevelBean();
+    levelBean.setType("outpoints");
+    LevelBean outpoints = getPointsDtlByType(levelBean);
+    return JsonResult.ok().put("paramList", tDictionaries)
+        .put("allPoints", allPoints)
+        .put("outpoints", outpoints.getPointsSum());
+  }
 }
diff --git a/payapi/src/main/resources/templates/system/level/pointsreport.html b/payapi/src/main/resources/templates/system/level/pointsreport.html
index c326e0c..76a5ece 100644
--- a/payapi/src/main/resources/templates/system/level/pointsreport.html
+++ b/payapi/src/main/resources/templates/system/level/pointsreport.html
@@ -8,7 +8,7 @@
     </div>
     <div class="layui-card-body">
         <div class="layui-form toolbar">
-            <div class="layui-inline">
+            <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"
@@ -22,17 +22,16 @@
                            class="layui-input"/>
                 </div>
             </div>
-            积分名称：
-            <select id="points-name">
-                <option value=""> 全部</option>
-                <option value="consume">消费获得</option>
-                <option value="task">任务获得</option>
-            </select>
-
+            <div class="layui-inline" style="margin-right: 20px">
+                积分名称：
+                <select id="points-name">
+                    <option selected='selected' value=""> 全部</option>
+                </select>
+            </div>
             <button id="btn-chkstatus-search" 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-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i
                     class="layui-icon"></i>清 空
             </button>
         </div>
@@ -42,8 +41,11 @@
 
 <script type="text/html" id="subjectday-toolbar">
     <div class="layui-btn-container">
-        <button class="layui-btn layui-btn-sm" id="btn-fold-subjectday" lay-event="subjectdayShowFold" style="color: #020202;background-color: #f2f2f2;font-weight: 700">
-            <div>累计获得积分：<span id="points" style="color: #0096f8">0</span> 累计失效积分：<span id="outPoints" style="color: #0096f8">0</span></div>
+        <button class="layui-btn layui-btn-sm" id="btn-fold-subjectday" lay-event="subjectdayShowFold"
+                style="color: #020202;background-color: #f2f2f2;font-weight: 700">
+            <div>累计发放积分：<span id="points" style="color: #0096f8">0</span> 累计回收积分：<span id="outPoints"
+                                                                                       style="color: #0096f8">0</span>
+            </div>
         </button>
     </div>
 </script>
@@ -53,22 +55,25 @@
         var table = layui.table;
         var admin = layui.admin;
         var laydate = layui.laydate;
-        form.render("select");
+
+        let init_date = new Date();
         laydate.render({
             elem: '#startDate'
-            ,format: 'yyyy年MM月dd日'
+            , format: 'yyyy年MM月dd日'
+            , value: init_date
         });
         laydate.render({
             elem: '#endDate'
-            ,format: 'yyyy年MM月dd日'
+            , format: 'yyyy年MM月dd日'
+            , value: init_date
         });
         // 渲染表格
         table.render({
             elem: '#pointsReportTable',
             url: '[[@{/pointsReport/list}]]',
             page: false,
-            toolbar:'#subjectday-toolbar',
-            defaultToolbar: [],
+            toolbar: '#subjectday-toolbar',
+            defaultToolbar: [ 'exports', 'print'],
             where: {startdate: null, enddate: null},
             cols: [
                 [
@@ -100,18 +105,54 @@
 
         // 搜索按钮点击事件
         $('#btn-chkstatus-search').click(function () {
-            let name = $("#search-chkstatus-searchkey").val();
+            let name = $("#points-name").val();
             let startDate = $("#startDate").val();
             let endDate = $("#endDate").val();
-            table.reload('userPointsTable', {where: {name: name, startdate:startDate,enddate:endDate}});
+            table.reload('pointsReportTable', {where: {name: name, startdate: startDate, enddate: endDate}});
         });
 
         $('#btn-reset-sysparam').click(function () {
-            $("#search-chkstatus-searchkey").val("");
             $("#startDate").val("");
             $("#endDate").val("");
         });
 
-
+        let getPointsReportParam = function () {
+            $.ajax({
+                type: "GET",
+                dataType: "json",
+                url: '[[@{/pointsReport/param}]]',
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                },
+                success: function (result) {
+                    if (result.code === 200) {
+                        let  dataSet = result.paramList;
+                        let  allPoints = result.allPoints;
+                        let  outpoints = result.outpoints;
+                        $("#points").text(allPoints);
+                        $("#outPoints").text(outpoints);
+                        for(let i=0;i<dataSet.length;i++){
+                            if(dataSet[i].dictval!=="outpoints"){
+                                $("#points-name").append('<option  value="'+dataSet[i].dictval+'">'+dataSet[i].dicttypename+'</option>');
+                            }
+                        }
+                        form.render("select");
+                    } else if (result.code === 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('[[@{/login}]]');
+                        }, 1000);
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+        }
+        getPointsReportParam();
     });
 </script>
