消费积分处理
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>