diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPersonLevel.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPersonLevel.java
index 33027d8..b6dd60b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPersonLevel.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPersonLevel.java
@@ -22,7 +22,6 @@
   private Integer pointsLower;
 
   @Column(name = "POINTSUPPER")
-  @NotNull
   private Integer pointsUpper;
 
   @Column(name = "UPDATETIME")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java
index 964ef8c..cbfbee5 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java
@@ -26,6 +26,78 @@
   private String startDate;
   private String endDate;
   private String pointsName;
+  private String consumePointsLi;
+  private String taskPointsLi;
+  private String dayPointsLi;
+  private Integer pointsSum;
+  private Integer pointsCount;
+  private Integer refno;
+  private List<Integer> refnoList;
+
+  public Integer getRefno() {
+    return refno;
+  }
+
+  public void setRefno(Integer refno) {
+    this.refno = refno;
+  }
+
+  public List<Integer> getRefnoList() {
+    return refnoList;
+  }
+
+  public void setRefnoList(List<Integer> refnoList) {
+    this.refnoList = refnoList;
+  }
+
+  public Integer getPointsSum() {
+    return pointsSum;
+  }
+
+  public void setPointsSum(Integer pointsSum) {
+    this.pointsSum = pointsSum;
+  }
+
+  public Integer getPointsCount() {
+    return pointsCount;
+  }
+
+  public void setPointsCount(Integer pointsCount) {
+    this.pointsCount = pointsCount;
+  }
+
+  public LevelBean() {
+  }
+
+  public LevelBean(String name, String startDate, String endDate) {
+    this.name = name;
+    this.startDate = startDate;
+    this.endDate = endDate;
+  }
+
+  public String getConsumePointsLi() {
+    return consumePointsLi;
+  }
+
+  public void setConsumePointsLi(String consumePointsLi) {
+    this.consumePointsLi = consumePointsLi;
+  }
+
+  public String getTaskPointsLi() {
+    return taskPointsLi;
+  }
+
+  public void setTaskPointsLi(String taskPointsLi) {
+    this.taskPointsLi = taskPointsLi;
+  }
+
+  public String getDayPointsLi() {
+    return dayPointsLi;
+  }
+
+  public void setDayPointsLi(String dayPointsLi) {
+    this.dayPointsLi = dayPointsLi;
+  }
 
   public String getPointsName() {
     return pointsName;
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 e3f43e0..7d242d3 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
@@ -2,16 +2,23 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.dao.DictionaryDao;
+import com.supwisdom.dlpay.framework.dao.SysparaDao;
 import com.supwisdom.dlpay.framework.domain.*;
 import com.supwisdom.dlpay.framework.security.OperUtil;
 import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.CitizenCardSearchBean;
+import com.supwisdom.dlpay.system.bean.CitizenCardShowBean;
 import com.supwisdom.dlpay.system.bean.LevelBean;
 import com.supwisdom.dlpay.system.service.OperatorService;
+import com.supwisdom.dlpay.system.service.ParamService;
 import com.supwisdom.dlpay.system.service.PointsService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -37,8 +44,7 @@
   public JsonResult getDataList() {
     try {
       LevelBean levelBean = pointsService.getLevel();
-      return JsonResult.ok().put("datalist",levelBean.gettPersonLevels())
-                            .put("pointsdate",levelBean.getPointsdate());
+      return JsonResult.ok().put("datalist", levelBean.gettPersonLevels());
     } catch (Exception e) {
       e.printStackTrace();
       return JsonResult.error("系统查询错误");
@@ -55,13 +61,12 @@
     }
     for (TPersonLevel tPersonLevel : levelBean.gettPersonLevels()) {
       if (StringUtil.isEmpty(tPersonLevel.getName())
-          || tPersonLevel.getPointsLower() == null
-          || tPersonLevel.getPointsUpper() == null) {
+          || tPersonLevel.getPointsLower() == null) {
         return JsonResult.error("参数错误");
       }
-      if (tPersonLevel.getPointsLower() > tPersonLevel.getPointsUpper()) {
+     /* if (tPersonLevel.getPointsLower() > tPersonLevel.getPointsUpper()) {
         return JsonResult.error("积分下限必须小于积分上限");
-      }
+      }*/
       tPersonLevel.setUpdatetime(DateUtil.getNow());
       tPersonLevel.setOperatorid(operator.getOpercode());
     }
@@ -123,9 +128,9 @@
   @ResponseBody
   public PageResult<TPointsDetail> getTPointsByname(@RequestParam("name") String name,
                                                     @RequestParam("idno") String idno,
-                                                    @RequestParam(value = "startDate",required = false) String startDate,
-                                                    @RequestParam(value = "endDate",required = false) String endDate,
-                                                    @RequestParam(value = "pointsName",required = false) String pointsName,
+                                                    @RequestParam(value = "startDate", required = false) String startDate,
+                                                    @RequestParam(value = "endDate", required = false) String endDate,
+                                                    @RequestParam(value = "pointsName", required = false) String pointsName,
                                                     @RequestParam("page") Integer pageNo,
                                                     @RequestParam("limit") Integer pageSize) {
     try {
@@ -134,13 +139,13 @@
       searchBean.setIdno(idno);
       searchBean.setPageNo(pageNo);
       searchBean.setPageSize(pageSize);
-      if(!StringUtil.isEmpty(startDate)){
-        searchBean.setStartDate(DateUtil.formatDateStr(startDate,"yyyy年MM月dd日","yyyyMMdd"));
+      if (!StringUtil.isEmpty(startDate)) {
+        searchBean.setStartDate(DateUtil.formatDateStr(startDate, "yyyy年MM月dd日", "yyyyMMdd"));
       }
-      if(!StringUtil.isEmpty(endDate)){
-        searchBean.setEndDate(DateUtil.formatDateStr(endDate,"yyyy年MM月dd日","yyyyMMdd"));
+      if (!StringUtil.isEmpty(endDate)) {
+        searchBean.setEndDate(DateUtil.formatDateStr(endDate, "yyyy年MM月dd日", "yyyyMMdd"));
       }
-      if(!StringUtil.isEmpty(pointsName)){
+      if (!StringUtil.isEmpty(pointsName)) {
         searchBean.setPointsName(pointsName);
       }
       return pointsService.getTPointsByname(searchBean);
@@ -182,7 +187,6 @@
     try {
       LevelBean levelBean = pointsService.getConpoints();
       return JsonResult.ok().put("monthConsumeList", levelBean.getMonthList())
-          .put("pointslimit", levelBean.getPointslimit())
           .put("dayConsumeList", levelBean.getDayList());
     } catch (Exception e) {
       e.printStackTrace();
@@ -218,11 +222,10 @@
   }
 
 
-
   /*
-  * 活动日管理
-  *
-  * */
+   * 活动日管理
+   *
+   * */
   @GetMapping("/pointsActive/index")
   public String pointsActiveIndex() {
     return "system/level/pointsactiveindex";
@@ -265,11 +268,11 @@
     if (operator != null) {
       operator = operatorService.getOperatorByCode(operator.getOpercode());
     }
-    if( levelBean.getPointsActive()!=null){
+    if (levelBean.getPointsActive() != null) {
       levelBean.getPointsActive().setUpdatetime(DateUtil.getNow());
       levelBean.getPointsActive().setOperatorid(operator.getOpercode());
-      return pointsService.saveActive( levelBean.getPointsActive());
-    }else {
+      return pointsService.saveActive(levelBean.getPointsActive());
+    } else {
       return JsonResult.error("参数不能为空");
     }
   }
@@ -279,4 +282,56 @@
     return "system/level/pointsactiveadd";
   }
 
+  @PostMapping("/pointsSet/add")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult addPointsSet(@RequestBody LevelBean levelBean) {
+
+    if (!StringUtils.isEmpty(levelBean.getDayPointsLi()) &&
+        !StringUtils.isEmpty(levelBean.getTaskPointsLi()) &&
+        !StringUtils.isEmpty(levelBean.getConsumePointsLi())) {
+      return pointsService.addPointsSet(levelBean);
+    } else {
+      return JsonResult.error("参数不能为空");
+    }
+  }
+
+  @GetMapping("/pointsSet/list")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult getPointsSet() {
+    try {
+      return JsonResult.ok().put("data", pointsService.getPointsSet());
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统查询错误");
+    }
+  }
+
+
+  /*
+   * 发放积分统计
+   *
+   * */
+  @GetMapping("/pointsReport/index")
+  public String pointsReportIndex() {
+    return "system/level/pointsreport";
+  }
+
+  @GetMapping("/pointsReport/list")
+  @PreAuthorize("hasPermission('/user/card','')")
+  @ResponseBody
+  public PageResult<LevelBean> getPointsReportList(
+      @RequestParam(value = "startdate", required = false) String startdate,
+      @RequestParam(value = "enddate", required = false) String enddate,
+      @RequestParam(value = "name", required = false) String name) {
+    try {
+      LevelBean levelBean = new LevelBean(name, startdate, enddate);
+      return pointsService.getPointsReportList(levelBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
 }
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 c359f08..7da281c 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
@@ -97,4 +97,22 @@
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult saveActive(TPointsActive tPointsActive);
+
+
+  /*
+  *
+  * 其他设置
+  * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult addPointsSet(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  LevelBean getPointsSet();
+
+
+  /*
+  *发放积分统计
+  *
+  * */
+  PageResult<LevelBean>  getPointsReportList(LevelBean levelBean);
 }
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 ab51abf..6204189 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
@@ -14,6 +14,7 @@
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.TradeDict;
 import com.supwisdom.dlpay.system.bean.LevelBean;
+import com.supwisdom.dlpay.system.service.ParamService;
 import com.supwisdom.dlpay.system.service.PointsService;
 import com.supwisdom.dlpay.util.ConstantUtil;
 import org.slf4j.Logger;
@@ -25,6 +26,8 @@
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -34,6 +37,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 @Service
 public class PointsServiceImpl implements PointsService {
@@ -61,7 +65,12 @@
   private PersondtlDao persondtlDao;
   @Autowired
   private PointsActiveDao pointsActiveDao;
-
+  @Autowired
+  private ParamService paramService;
+  @Autowired
+  private SysparaDao sysparaDao;
+  @Autowired
+  private BusinessparaDao businessparaDao;
 
   @Override
   public LevelBean getLevel() {
@@ -69,28 +78,11 @@
     Sort sort = new Sort(Sort.Direction.ASC, "id");
     List<TPersonLevel> list = personLevelDao.findAll(sort);
     if (!StringUtil.isEmpty(list)) levelBean.settPersonLevels(list);
-    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointsdate");
-    if(tDictionaries!=null&&tDictionaries.size()>0){
-      levelBean.setPointsdate(Integer.parseInt(tDictionaries.get(0).getDictval()));
-    }
     return levelBean;
   }
 
   @Override
   public JsonResult saveLevel(LevelBean levelBean) {
-    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointsdate");
-    if(tDictionaries!=null&&tDictionaries.size()>0){
-      tDictionaries.get(0).setDictval(levelBean.getPointsdate()+"");
-      dictionaryDao.save(tDictionaries.get(0));
-    }else {
-      TDictionary tDictionary = new TDictionary();
-      tDictionary.setDictcaption("积分中心的过期时间");
-      tDictionary.setDicttype("pointsdate");
-      tDictionary.setDicttypename("积分过期天数");
-      tDictionary.setDictval(levelBean.getPointsdate()+"");
-      tDictionary.setTenantId("{tenantid}");
-      dictionaryDao.save(tDictionary);
-    }
     List<TPersonLevel> tPersonLevel = levelBean.gettPersonLevels();
     personLevelDao.saveAll(tPersonLevel);
     return JsonResult.ok("成功");
@@ -126,25 +118,25 @@
   @Override
   public PageResult getTPointsByname(LevelBean param) {
     TCard tCard = cardDao.findCardByCardnoAndCardtype(param.getIdno(), ConstantUtil.CARDTYPE_CITIZENCARD);
-    if(tCard==null||StringUtil.isEmpty(tCard.getUserid())){
+    if (tCard == null || StringUtil.isEmpty(tCard.getUserid())) {
       return new PageResult<>(99, "未查询到该用户的信息");
     }
-    TPerson tPerson = personDao.findByUseridAndAndName(tCard.getUserid(),param.getName());
-    if(tPerson==null){
+    TPerson tPerson = personDao.findByUseridAndAndName(tCard.getUserid(), param.getName());
+    if (tPerson == null) {
       return new PageResult<>(99, "未查询到该用户的信息");
     }
     Optional<TPointsMain> pointsMain = pointsMainDao.findById(tCard.getUserid());
     TPointsMain tPointsMain;
     TPersonLevel tPersonLevel;
-    if(pointsMain.orElse(null)==null){
+    if (pointsMain.orElse(null) == null) {
       tPointsMain = new TPointsMain();
       tPointsMain.setPoints(0);
       tPointsMain.setUpdatetime(DateUtil.getNow("yyyy-MM-dd HH:mm:ss"));
       tPersonLevel = personLevelDao.findTPersonLevelByPoints(tPointsMain.getPoints());
-      if(tPersonLevel==null){
+      if (tPersonLevel == null) {
         return new PageResult<>(99, "请设置0积分等级");
       }
-    }else{
+    } else {
       tPointsMain = pointsMain.orElse(null);
       tPointsMain.setUpdatetime(DateUtil.parseToDateFormat(tPointsMain.getUpdatetime()));
       Optional<TPersonLevel> tPersonLeveltemp = personLevelDao.findById(tPointsMain.getLevelid());
@@ -162,7 +154,7 @@
       public Predicate toPredicate(Root<TPointsdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
         List<Predicate> predicates = new ArrayList<>();
         if (!StringUtil.isEmpty(tCard.getUserid())) {
-          predicates.add(criteriaBuilder.equal(root.get("userid").as(String.class),  tCard.getUserid().trim()));
+          predicates.add(criteriaBuilder.equal(root.get("userid").as(String.class), tCard.getUserid().trim()));
         }
         if (!StringUtil.isEmpty(param.getStartDate())) {
           predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(param.getStartDate()))));
@@ -177,7 +169,7 @@
       }
     }, pageable);
 
-    if(page.getContent()!=null&&page.getContent().size()>0){
+    if (page.getContent() != null && page.getContent().size() > 0) {
       page.getContent().get(0).settPointsMain(tPointsMain);
     }
     return new PageResult<>(page);
@@ -186,21 +178,16 @@
   @Override
   public PageResult getTPointsdetailByname(LevelBean param) {
     Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
-    return new PageResult<>(pointsDtlDao.findAllByUserid(param.getUserid(),pageable));
+    return new PageResult<>(pointsDtlDao.findAllByUserid(param.getUserid(), pageable));
   }
 
 
-
   @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<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointslimit");
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("month", sort);
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day", sort);
     LevelBean levelBean = new LevelBean();
-    if(tDictionaries!=null&&tDictionaries.size()>0){
-      levelBean.setPointslimit(Integer.parseInt(tDictionaries.get(0).getDictval()));
-    }
     if (!StringUtil.isEmpty(monthlist)) levelBean.setMonthList(monthlist);
     if (!StringUtil.isEmpty(daylist)) levelBean.setDayList(daylist);
     return levelBean;
@@ -208,19 +195,6 @@
 
   @Override
   public JsonResult saveConpoints(LevelBean levelBean) {
-    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointslimit");
-    if(tDictionaries!=null&&tDictionaries.size()>0){
-      tDictionaries.get(0).setDictval(levelBean.getPointslimit()+"");
-      dictionaryDao.save(tDictionaries.get(0));
-    }else {
-      TDictionary tDictionary = new TDictionary();
-      tDictionary.setDictcaption("积分中心的单日积分上限");
-      tDictionary.setDicttype("pointslimit");
-      tDictionary.setDicttypename("单日积分上限");
-      tDictionary.setDictval(levelBean.getPointslimit()+"");
-      tDictionary.setTenantId("{tenantid}");
-      dictionaryDao.save(tDictionary);
-    }
     List<TConsumePoints> consumePoints = levelBean.gettConsumePoints();
     consumePointsDao.saveAll(consumePoints);
     return JsonResult.ok("成功");
@@ -240,75 +214,75 @@
   }
 
   @Override
-  public Boolean singleHandlePoints(String userid, Double amount,String billno) {
+  public Boolean singleHandlePoints(String userid, Double amount, String billno) {
     int rate = 1;
     // 1.根据当天日期判断当天是否该用户的特殊日期或者生日，得到实际倍率
-    TPerson person =  personDao.findByUseridAndIdtype(userid,"idcard");
-    if(person!=null&&!StringUtil.isEmpty(person.getIdno())){
+    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);
-      if(nowDate.equals(brithdate)){
+      String brithdate = person.getIdno().substring(10, 4);
+      if (nowDate.equals(brithdate)) {
         rate = 2;
       }
     }
     //2. 查询用户的等级，获取单次消费获得积分的规则
     TPersonLevel personLevel;
     Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
-    if(pointsMain.orElse(null)!=null){
+    if (pointsMain.orElse(null) != null) {
       Integer levelid = pointsMain.orElse(null).getLevelid();
-      if(levelid!=null){
+      if (levelid != null) {
         personLevel = personLevelDao.getOne(levelid);
-      }else {
-        if(pointsMain.orElse(null).getPoints()==null){
+      } else {
+        if (pointsMain.orElse(null).getPoints() == null) {
           pointsMain.orElse(null).setPoints(0);
         }
         personLevel = personLevelDao.findTPersonLevelByPoints(pointsMain.orElse(null).getPoints());
       }
-    }else {
+    } else {
       return false;
     }
     //3. 根据规则计算积分，得到的积分与当日积分上限进行比较，得到实际获得的积分
     int resultPoints = 0;
-    if(amount >= personLevel.getSingleConsumeAmount()){
+    if (amount >= personLevel.getSingleConsumeAmount()) {
       BigDecimal bigDecimal = new BigDecimal(amount);
-      BigDecimal result = bigDecimal.divide(new BigDecimal(personLevel.getSingleAmount()),0,BigDecimal.ROUND_DOWN);
+      BigDecimal result = bigDecimal.divide(new BigDecimal(personLevel.getSingleAmount()), 0, BigDecimal.ROUND_DOWN);
       int resultInt = result.intValue();
       //计算得到的积分
       resultPoints = resultInt * personLevel.getSinglePoints();
       //获得流水积分
-      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatus(userid,"","in");
+      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatus(userid, "", "in");
       int allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
-      List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointslimit");
+      List<TDictionary> tDictionaries = dictionaryDao.findAllByDicttype("pointslimit");
       int pointslimit = 0;
-      if(tDictionaries!=null&&tDictionaries.size()>0){
+      if (tDictionaries != null && tDictionaries.size() > 0) {
         pointslimit = Integer.parseInt(tDictionaries.get(0).getDictval());
       }
-      if(allPoints<pointslimit){
-        if(allPoints+resultPoints>=pointslimit){
+      if (allPoints < pointslimit) {
+        if (allPoints + resultPoints >= pointslimit) {
           resultPoints = pointslimit - allPoints;
         }
       }
     }
     //4. 对积分的主子表和流水表进行添加，查询用户的积分，得到的积分去查询等级表更新用户的等级
-    insertDtl(userid, TradeDict.CONSUME_FLAG_SINGLE,resultPoints*rate,personLevel.getId(),billno);
+    insertDtl(userid, TradeDict.CONSUME_FLAG_SINGLE, resultPoints * rate, personLevel.getId(), billno);
     return null;
   }
 
   @Override
-  public Boolean dayHandlePoints(String userid,String billno) {
+  public Boolean dayHandlePoints(String userid, String billno) {
     // 1.根据用户id查询积分流水表获得当日的消费金额
-    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMMdd"),"none","success");
+    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateAndReverseFlagAndStatus(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);
-    for(TConsumePoints temp:daylist){
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day", sort);
+    for (TConsumePoints temp : daylist) {
       // 3.判断用户是否达到日消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
-      if(allConsume>Double.parseDouble(temp.getConsumeamount())){
+      if (allConsume > Double.parseDouble(temp.getConsumeamount())) {
         TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
-        if(tPointsdtltemp==null){
+        if (tPointsdtltemp == null) {
           // 4.奖励的积分对积分主子表和流水表进行添加
-          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY,temp.getPoints(),temp.getId(),billno);
+          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
         }
       }
     }
@@ -316,39 +290,39 @@
   }
 
   @Override
-  public Boolean monthHandlePoints(String userid,String billno) {
+  public Boolean monthHandlePoints(String userid, String billno) {
     // 1.根据用户id查询积分流水表获得当月的消费金额
-    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMM"),"none","success");
+    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatus(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);
-    for(TConsumePoints temp:monthlist){
-    // 3.判断用户是否达到月消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
-      if(allConsume>Double.parseDouble(temp.getConsumeamount())){
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("month", sort);
+    for (TConsumePoints temp : monthlist) {
+      // 3.判断用户是否达到月消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
+      if (allConsume > Double.parseDouble(temp.getConsumeamount())) {
         TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
-        if(tPointsdtltemp==null){
+        if (tPointsdtltemp == null) {
           // 4.奖励的积分对积分主子表和流水表进行添加
-          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY,temp.getPoints(),temp.getId(),billno);
+          insertDtl(userid, 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(String userid, String type, int points, Integer refno, String billno) {
+    //主表流水
     TPointsMain tPointsMain;
     Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
-    if(pointsMain.orElse(null)!=null){
+    if (pointsMain.orElse(null) != null) {
       tPointsMain = pointsMain.orElse(null);
-      tPointsMain.setPoints(tPointsMain.getPoints()+points);
-      tPointsMain.setAccumPoints(tPointsMain.getAccumPoints()+points);
+      tPointsMain.setPoints(tPointsMain.getPoints() + points);
+      tPointsMain.setAccumPoints(tPointsMain.getAccumPoints() + points);
       TPersonLevel tPersonLevelByPoints = personLevelDao.findTPersonLevelByPoints(tPointsMain.getPoints());
-      if(tPersonLevelByPoints.getId()>tPointsMain.getLevelid()){
+      if (tPersonLevelByPoints.getId() > tPointsMain.getLevelid()) {
         tPointsMain.setLevelid(tPersonLevelByPoints.getId());
       }
-    }else{
+    } else {
       tPointsMain = new TPointsMain();
       tPointsMain.setUserid(userid);
       tPointsMain.setPoints(points);
@@ -362,11 +336,11 @@
     TPointsDetail tPointsDetail = new TPointsDetail();
     tPointsDetail.setUserid(userid);
     tPointsDetail.setPoints(points);
-    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointsdate");
-    if(tDictionaries!=null&&tDictionaries.size()>0){
+    List<TDictionary> tDictionaries = dictionaryDao.findAllByDicttype("pointsdate");
+    if (tDictionaries != null && tDictionaries.size() > 0) {
       String outdate = DateUtil.getNowInterDay(Integer.parseInt(tDictionaries.get(0).getDictval()));
       tPointsDetail.setOutDate(outdate);
-    }else {
+    } else {
       return false;
     }
     TPointsDetail tPointsDetailresult = pointsDetailDao.save(tPointsDetail);
@@ -375,7 +349,7 @@
     tPointsdtl.setRefno(refno);
     tPointsdtl.setType(type);
     tPointsdtl.setUserid(userid);
-    tPointsdtl.setPoints("+"+points);
+    tPointsdtl.setPoints("+" + points);
     tPointsdtl.setStatus("init");
     tPointsdtl.setAftpoints(tPointsMainResult.getPoints());
     tPointsdtl.setBillno(billno);
@@ -392,19 +366,18 @@
   }
 
 
-
   @Override
   public PageResult getActiveList(LevelBean param) {
-    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize(),Sort.by("id"));
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize(), Sort.by("id"));
     Page<TPointsActive> page = pointsActiveDao.findAll(new Specification<TPointsActive>() {
       @Override
       public Predicate toPredicate(Root<TPointsActive> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
         List<Predicate> predicates = new ArrayList<>();
         if (!StringUtil.isEmpty(param.getName())) {
-          predicates.add(criteriaBuilder.like(root.get("name").as(String.class), "%" +param.getName().trim()  + "%"));
+          predicates.add(criteriaBuilder.like(root.get("name").as(String.class), "%" + param.getName().trim() + "%"));
         }
         if (!StringUtil.isEmpty(param.getType())) {
-          predicates.add(criteriaBuilder.equal(root.get("type").as(String.class),  param.getType().trim()));
+          predicates.add(criteriaBuilder.equal(root.get("type").as(String.class), param.getType().trim()));
         }
         return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
       }
@@ -423,17 +396,159 @@
 
   @Override
   public JsonResult saveActive(TPointsActive tPointsActive) {
-    if("no".equals(tPointsActive.getType())){
+    if ("no".equals(tPointsActive.getType())) {
       tPointsActive.setWeeknumber(null);
-      tPointsActive.setStartdate(DateUtil.formatDateStr(tPointsActive.getStartdate(),"yyyy年MM月dd日","yyyyMMdd"));
-      tPointsActive.setEnddate(DateUtil.formatDateStr(tPointsActive.getEnddate(),"yyyy年MM月dd日","yyyyMMdd"));
+      tPointsActive.setStartdate(DateUtil.formatDateStr(tPointsActive.getStartdate(), "yyyy年MM月dd日", "yyyyMMdd"));
+      tPointsActive.setEnddate(DateUtil.formatDateStr(tPointsActive.getEnddate(), "yyyy年MM月dd日", "yyyyMMdd"));
     }
-    if("year".equals(tPointsActive.getType())){
+    if ("year".equals(tPointsActive.getType())) {
       tPointsActive.setWeeknumber(null);
-      tPointsActive.setStartdate(DateUtil.formatDateStr(tPointsActive.getYearStartDate(),"MM月dd日","MMdd"));
-      tPointsActive.setEnddate(DateUtil.formatDateStr(tPointsActive.getYearEndDate(),"MM月dd日","MMdd"));
+      tPointsActive.setStartdate(DateUtil.formatDateStr(tPointsActive.getYearStartDate(), "MM月dd日", "MMdd"));
+      tPointsActive.setEnddate(DateUtil.formatDateStr(tPointsActive.getYearEndDate(), "MM月dd日", "MMdd"));
     }
     pointsActiveDao.save(tPointsActive);
     return JsonResult.ok("成功");
   }
+
+  @Override
+  public JsonResult addPointsSet(LevelBean levelBean) {
+
+    TBusinesspara tBusinesspara = new TBusinesspara();
+    tBusinesspara.setTenantId("{tenantid}");
+    tBusinesspara.setParakey("dayPointsLi");
+    tBusinesspara.setParaval(levelBean.getDayPointsLi());
+    businessparaDao.save(tBusinesspara);
+    tBusinesspara.setParakey("taskPointsLi");
+    tBusinesspara.setParaval(levelBean.getTaskPointsLi());
+    businessparaDao.save(tBusinesspara);
+    tBusinesspara.setParakey("consumePointsLi");
+    tBusinesspara.setParaval(levelBean.getConsumePointsLi());
+    businessparaDao.save(tBusinesspara);
+    return JsonResult.ok();
+  }
+
+  @Override
+  public LevelBean getPointsSet() {
+    TBusinesspara dayPointsLi = businessparaDao.findByParakey("dayPointsLi");
+    TBusinesspara taskPointsLi = businessparaDao.findByParakey("taskPointsLi");
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey("consumePointsLi");
+    LevelBean levelBean1 = new LevelBean();
+    if (dayPointsLi != null && !StringUtils.isEmpty(dayPointsLi.getParaval())) {
+      levelBean1.setDayPointsLi(dayPointsLi.getParaval());
+    }
+    if (taskPointsLi != null && !StringUtils.isEmpty(taskPointsLi.getParaval())) {
+      levelBean1.setTaskPointsLi(taskPointsLi.getParaval());
+    }
+    if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+      levelBean1.setConsumePointsLi(consumePointsLi.getParaval());
+    }
+    return levelBean1;
+  }
+
+
+  @Override
+  public PageResult getPointsReportList(LevelBean param) {
+    List<LevelBean> levelBeans = new ArrayList<>();
+    if (!StringUtil.isEmpty(param.getName())) {
+      LevelBean levelBean = getPointsDtlByType(param);
+      levelBeans.add(levelBean);
+      return new PageResult<>(levelBeans);
+    } else {
+      //统计每个任务获取的积分
+      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);
+      //统计单次消费积分
+      List<TPersonLevel> personLevels = personLevelDao.findAll();
+      List<Integer> personLevelTemp = personLevels.stream().map(TPersonLevel::getId).collect(Collectors.toList());
+      LevelBean personLevelBean = new LevelBean();
+      personLevelBean.setStartDate(param.getStartDate());
+      personLevelBean.setEndDate(param.getEndDate());
+    //  personLevelBean.setRefnoList(personLevelTemp);
+      personLevelBean.setType("consume");
+      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<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");
+      LevelBean dayTempResult = getPointsDtlByType(dayTempBean);
+      dayTempResult.setPointsName("日累计奖励积分");
+      levelBeans.add(dayTempResult);
+      //统计月累计消费积分
+      List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("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");
+      LevelBean monthTempResult = getPointsDtlByType(monthTempBean);
+      monthTempResult.setPointsName("月累计奖励积分");
+      levelBeans.add(monthTempResult);
+      //消费积分合计
+      LevelBean consume = new LevelBean();
+      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());
+      return new PageResult<>(levelBeans);
+    }
+  }
+
+  LevelBean getPointsDtlByType(LevelBean param) {
+    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 (!StringUtil.isEmpty(param.getStartDate())) {
+          predicates.add(criteriaBuilder.ge(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(param.getStartDate()))));
+        }
+        if (!StringUtil.isEmpty(param.getEndDate())) {
+          predicates.add(criteriaBuilder.le(root.get("transdate").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(param.getEndDate()))));
+        }
+        if (param.getRefno()!=null) {
+          predicates.add(criteriaBuilder.equal(root.get("refno").as(Integer.class), param.getRefno()));
+        }
+        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()){
+            in.value(refnoTemp);
+          }
+          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.setPointsSum(allPoints);
+    levelBean.setPointsCount(tPointsdtls.size());
+    return levelBean;
+  }
 }
diff --git a/payapi/src/main/resources/templates/system/level/index.html b/payapi/src/main/resources/templates/system/level/index.html
index 1766c08..ced51a0 100644
--- a/payapi/src/main/resources/templates/system/level/index.html
+++ b/payapi/src/main/resources/templates/system/level/index.html
@@ -3,6 +3,7 @@
         <li class="layui-this">会员等级设置</li>
         <li>日常任务积分设置</li>
         <li>消费奖励积分设置</li>
+        <li>其他设置</li>
         <span class="layui-breadcrumb pull-right">
           <a href="#">积分中心</a>
           <a><cite>积分规则管理</cite></a>
@@ -10,42 +11,69 @@
     </ul>
     <div class="layui-tab-content">
         <div class="layui-tab-item layui-show" style="background-color: white">
-            <form id="level-form" lay-filter="user-form" class="layui-form model-form">
+            <form id="level-form" lay-filter="user-form" class="layui-form model-form layui-form-pane">
                 <div style="margin: 20px">
                     <button type="button" class="layui-btn" id="add">添加等级</button>
                     <button type="button" class="layui-btn" lay-filter="level-form-submit" lay-submit>保存
                     </button>
                 </div>
-                <div style="margin: 20px;background-color: darkgray" id="levelstr" >
+                <div style="margin: 20px;background-color: darkgray" id="levelstr">
 
-                    <div class="levelclass layui-card" ><div class="layui-card-header">1级会员设置:</div>
+                    <div class="levelclass layui-card">
+                        <div class="layui-card-header" style="font-weight: 700">1级会员设置:</div>
                         <div class="layui-card-body">
-                            会员名称为  <input type="text" name="name" required lay-verify="required" autocomplete="off"
-                               class="layui-input"
-                               style="width: 150px;display: inline;height: 35px;margin: 6px" id="lename">
-                        ,累计积分为
-                        <input type="number" name="pointsLower" required lay-verify="required"
-                               autocomplete="off"
-                               class="layui-input"
-                               style="width: 80px;display: inline;height: 35px;margin: 6px" id="lelow">---
-                        <input type="number" name="pointsUpper" required lay-verify="required"
-                               autocomplete="off"
-                               class="layui-input"
-                               style="width: 80px;display: inline;height: 35px;margin: 6px" id="leupp">分。
-                        <input type="text" name="levelid" id="levelid1" style="display: none"/>
-                        <div style="margin-left: 85px">订单实付金额满
-                            <input type="number" name="singleConsumeAmount" id="singleConsumeAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元时，每消费
-                            <input type="number" name="singleAmount"  id="singleAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元，可获得
-                            <input type="number" name="singlePoints" id="singlePoints" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>积分;
-                        </div>
+                            <div style="display: flex;width: 398px;float: left;margin-left: 90px">
+                                <div style="display: inline;margin-top: 8px;margin-right: 15px">会员名称</div>
+                                <input type="text" name="name" required lay-verify="required"
+                                       autocomplete="off"
+                                       class="layui-input"
+                                       style="width: 210px;display: inline;height: 38px;text-align: center"
+                                       id="lename">
+                            </div>
+                            <div style="display: flex;width: 400px">
+                                <div style="display: inline;margin-top: 8px;margin-right: 15px">累计积分</div>
+                                <div class="layui-form-item" style="display: inline">
+                                    <label class="layui-form-label" style="width: 80px">大于</label>
+                                    <div class="layui-input-inline" style="margin-right: 0px;width: 150px">
+                                        <input type="number" name="pointsLower" required lay-verify="required"
+                                               autocomplete="off"
+                                               class="layui-input"
+                                               id="lelow" style="text-align: center">
+                                    </div>
+                                    <label class="layui-form-label" style="width: 60px">分</label>
+                                </div>
+                            </div>
+                            <input type="text" name="levelid" id="levelid1" style="display: none"/>
+                            <div style="display: flex;margin-left: 90px">
+                                <div style="display: inline;margin-top: 8px;margin-right: 15px">单笔消费</div>
+                                <div class="layui-form-item" style="display: inline">
+                                    <label class="layui-form-label" style="width: 80px">实付满</label>
+                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">
+                                        <input type="number" name="singleConsumeAmount"
+                                               id="singleConsumeAmount" class="layui-input"
+                                               style="text-align: center" required lay-verify="required"/>
+                                    </div>
+                                    <label class="layui-form-label" style="width: 110px">元，每消费</label>
+                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">
+                                        <input type="number" name="singleAmount" id="singleAmount"
+                                               class="layui-input" required style="text-align: center"
+                                               lay-verify="required"/>
+                                    </div>
+                                    <label class="layui-form-label" style="width: 110px">元，可获得</label>
+                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">
+                                        <input type="number" name="singlePoints" id="singlePoints"
+                                               class="layui-input" required style="text-align: center"
+                                               lay-verify="required"/>
+                                    </div>
+                                    <label class="layui-form-label" style="width: 60px">分</label>
+                                </div>
+                            </div>
                         </div>
                     </div>
+
+
                 </div>
-                <div style="margin: 20px">
-                    <div style="font-weight: 700">积分到期设置</div>
-                    <div>每隔<input type="number" name="pointsdate" id="pointsdate" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>
-                        日,清除积分。<span style="font-weight: 200">(不影响历史积分,从修改当日起生效。)</span></div>
-                </div>
+
             </form>
         </div>
         <div class="layui-tab-item" style="background-color: white">
@@ -77,13 +105,6 @@
                                 <input type="text" name="conPointsid" id="conPointsid" style="display: none"/>
                             </div>
                         </div>
-                        <div>单日消费积分上限
-                            <input type="text" name="pointslimit" required lay-verify="required"
-                                   autocomplete="off"
-                                   class="layui-input"
-                                   style="width: 60px;display: inline;height: 28px;margin: 6px"
-                                   id="pointslimit">积分。
-                        </div>
                     </div>
                 </div>
                 <div style="margin: 20px">
@@ -113,10 +134,60 @@
                 </div>
             </form>
         </div>
+        <div class="layui-tab-item" style="background-color: white">
+            <form id="set-form" lay-filter="set-form" class="layui-form model-form layui-form-pane">
+                <button type="button" class="layui-btn" lay-filter="set-form-submit" lay-submit
+                        style="margin-left: 20px">保存
+                </button>
+                <div class=" layui-card">
+                    <div class="layui-card-header" style="font-weight: 700">积分上限设置</div>
+                    <div class="layui-card-body">
+                        <div style="display:flex;width: 400px">
+                            <div style="display: inline;margin-top: 8px;margin-right: 15px">单日消费积分上限</div>
+                            <div class="layui-form-item" style="display: inline">
+                                <div class="layui-input-inline" style="margin-right: 0px;width: 150px">
+                                    <input type="number"  required lay-verify="required" autocomplete="off" class="layui-input"
+                                           id="consumePointsLi" style="text-align: center">
+                                </div>
+                                <label class="layui-form-label" style="width: 60px">分</label>
+                            </div>
+                        </div>
+                        <div style="display:flex;width: 400px">
+                            <div style="display: inline;margin-top: 8px;margin-right: 15px">单日任务积分上限</div>
+                            <div class="layui-form-item" style="display: inline">
+                                <div class="layui-input-inline" style="margin-right: 0px;width: 150px">
+                                    <input type="number"  required lay-verify="required" autocomplete="off"
+                                           class="layui-input"
+                                           id="taskPointsLi" style="text-align: center">
+                                </div>
+                                <label class="layui-form-label" style="width: 60px">分</label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class=" layui-card">
+                    <div class="layui-card-header" style="font-weight: 700">积分到期设置</div>
+                    <div class="layui-card-body">
+                        <div style="display:flex;width: 600px">
+                            <div style="display: inline;margin-top: 8px;margin-right: 15px">每隔</div>
+                            <div class="layui-form-item" style="display: inline">
+                                <div class="layui-input-inline" style="margin-right: 0px;width: 150px">
+                                    <input type="number"  required lay-verify="required" autocomplete="off"
+                                           class="layui-input" id="dayPointsLi" style="text-align: center">
+                                </div>
+                                <label class="layui-form-label" style="width: 60px">日</label>
+                            </div>
+                            <div style="display: inline;margin-top: 8px;margin-right: 15px">
+                                清除积分。<span style="font-weight: 200">(不影响历史积分,从修改当日起生效。)</span></div>
+                        </div>
+                    </div>
+                </div>
+            </form>
+        </div>
     </div>
 </div>
 <script>
-    layui.use(['layer', 'upload', 'form', 'element', 'admin', 'table'], function () {
+    layui.use(['layer', 'upload', 'form', 'element', 'admin', 'table', 'layedit'], function () {
         //
         //   等级添加
         //
@@ -159,8 +230,8 @@
                 });
                 tPersonLevels.push(tperson);
             });
-            let pointsdate = $("#pointsdate").val();
-            var data = {'tPersonLevels': tPersonLevels,'pointsdate': pointsdate};
+
+            var data = {'tPersonLevels': tPersonLevels};
             var url = '[[@{/level/add}]]';
             layer.confirm('确认保存?', {
                 icon: 3, title: '提示'
@@ -181,7 +252,8 @@
                         layer.closeAll('loading');
                         if (result.code === 200) {
                             layer.msg(result.msg, {icon: 1});
-                            parent.location.reload();
+                            admin.refresh();
+                            // parent.location.reload();
                         } else if (result.code === 401) {
                             layer.msg(result.msg, {icon: 2, time: 1500}, function () {
                                 location.replace('[[@{/login}]]');
@@ -202,24 +274,48 @@
         });
         var x = 2;
         $("#add").click(function () {
-            let str = ' <div class="levelclass layui-card" ><div class="layui-card-header"> ' + x +
-                '级会员设置: </div>\n' +
-                '                        <div class="layui-card-body"> 会员名称为 ' +
-                '<input type="text" name="name" required lay-verify="required" autocomplete="off"' +
-                'class="layui-input" style="width: 150px;display: inline;height: 35px;margin: 6px">' +
-                '   ,累计积分为 ' +
-                '<input type="number" name="pointsLower" required lay-verify="required" autocomplete="off" class="layui-input"' +
-                'style="width: 80px;display: inline;height: 35px;margin: 6px">--- ' +
-                '<input type="number" name="pointsUpper" required lay-verify="required" autocomplete="off"' +
-                'class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px">分。 ' +
-                ' <input type="number" name="levelid' + x + '" id="levelid" style="display: none"/> ' +
+            let str = ' <div class="levelclass layui-card"><div class="layui-card-header" style="font-weight: 700"> ' + x +
+                '级会员设置:</div> <div class="layui-card-body"><div style="display: flex;width: 398px;float: left;margin-left: 90px">' +
+                '<div style="display: inline;margin-top: 8px;margin-right: 15px">   会员名称</div> ' +
+                '<input type="text" name="name" required lay-verify="required"  autocomplete="off"  class="layui-input"   ' +
+                'style="width: 210px;display: inline;height: 38px;text-align: center"  id="lename"></div>   ' +
+                '<div style="display: flex;width: 400px">\n' +
+                '                                <div style="display: inline;margin-top: 8px;margin-right: 15px">累计积分</div>\n' +
+                '                                <div class="layui-form-item" style="display: inline">\n' +
+                '                                    <label class="layui-form-label" style="width: 80px">大于</label>\n' +
+                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 150px">\n' +
+                '                                        <input type="number" name="pointsLower" required lay-verify="required"\n' +
+                '                                               autocomplete="off" style="text-align: center"' +
+                '                                               class="layui-input"\n' +
+                '                                               id="lelow">\n' +
+                '                                    </div>\n' +
+                '                                    <label class="layui-form-label" style="width: 60px">分</label>\n' +
+                '                                </div>\n' +
+                '                            </div>\n' +
+                '                            <input type="text" name="levelid" id="levelid' + x + '" style="display: none"/>\n' +
+                '                            <div style="display: flex;margin-left: 90px">\n' +
+                '                                <div style="display: inline;margin-top: 8px;margin-right: 15px">单笔消费</div>\n' +
+                '                                <div class="layui-form-item" style="display: inline">\n' +
+                '                                    <label class="layui-form-label" style="width: 80px">实付满</label>\n' +
+                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">\n' +
+                '                                        <input type="number" name="singleConsumeAmount" id="singleConsumeAmount" class="layui-input" style="text-align: center" required lay-verify="required"/>\n' +
+                '                                    </div>\n' +
+                '                                    <label class="layui-form-label" style="width: 110px">元，每消费</label>\n' +
+                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">\n' +
+                '                                        <input type="number" name="singleAmount" id="singleAmount" class="layui-input" required\n' +
+                '                                               lay-verify="required" style="text-align: center"/>\n' +
+                '                                    </div>\n' +
+                '                                    <label class="layui-form-label" style="width: 110px">元，可获得</label>\n' +
+                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">\n' +
+                '                                        <input type="number" name="singlePoints" id="singlePoints" class="layui-input" required\n' +
+                '                                               lay-verify="required" style="text-align: center"/>\n' +
+                '                                    </div>\n' +
+                '                                    <label class="layui-form-label" style="width: 60px">分</label>\n' +
                 '<button type="button" class="layui-btn layui-btn-danger removeclass" id="removeid' + x + '" style="display: inline">删除</button>' +
-                '<div style="margin-left: 85px">订单实付金额满\n' +
-                '<input type="number" name="singleConsumeAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元时，每消费\n' +
-                '<input type="number" name="singleAmount"  class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元，可获得\n' +
-                '<input type="number" name="singlePoints" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>积分;\n' +
-                '</div>  </div>'
-            '</div>';
+                '                                </div>\n' +
+                '                            </div>\n' +
+                '                        </div>\n' +
+                '                    </div>';
             if (x !== 2) {
                 let temp = x - 1;
                 document.getElementById("removeid" + temp).style.display = "none";
@@ -254,7 +350,7 @@
                                 if (tempp > 1) {
                                     document.getElementById("removeid" + tempp).style.display = "inline";
                                 }
-                                $(_this).parent().parent().remove();
+                                $(_this).parent().parent().parent().parent().remove();
                                 x--;
                             } else if (result.code === 401) {
                                 layer.msg(result.msg, {icon: 2, time: 1500}, function () {
@@ -275,7 +371,7 @@
                     if (tempp > 1) {
                         document.getElementById("removeid" + tempp).style.display = "inline";
                     }
-                    $(_this).parent().parent().remove();
+                    $(_this).parent().parent().parent().parent().remove();
                     x--;
                 }
                 layer.close(index);
@@ -308,27 +404,52 @@
                             $("#singleConsumeAmount").val(datalist[i].singleConsumeAmount);
                             $("#singleAmount").val(datalist[i].singleAmount);
                             $("#singlePoints").val(datalist[i].singlePoints);
-                            $("#pointsdate").val(result.pointsdate);
                         }
                         if (i > 0) {
-                            var strr = ' <div class="levelclass layui-card" ><div class="layui-card-header">  ' + x +
-                                '级会员设置: </div>\n' +
-                                '                        <div class="layui-card-body"> 会员名称为 ' +
-                                '<input type="text" name="name" required lay-verify="required" autocomplete="off"' + 'value="' + datalist[i].name + '"' +
-                                'class="layui-input" style="width: 150px;display: inline;height: 35px;margin: 6px">' +
-                                '   ,累计积分为 ' +
-                                '<input type="number" name="pointsLower" required lay-verify="required" autocomplete="off" class="layui-input"' + 'value="' + datalist[i].pointsLower + '"' +
-                                'style="width: 80px;display: inline;height: 35px;margin: 6px">--- ' +
-                                '<input type="number" name="pointsUpper" required lay-verify="required" autocomplete="off"' + 'value="' + datalist[i].pointsUpper + '"' +
-                                'class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px">分。 ' +
-                                ' <input type="text" name="levelid" id="levelid' + x + '" style="display: none" ' + 'value="' + datalist[i].id + '"/> ' +
+                            var strr = ' <div class="levelclass layui-card"><div class="layui-card-header" style="font-weight: 700"> ' + x +
+                                '级会员设置:</div> <div class="layui-card-body"><div style="display: flex;width: 398px;float: left;margin-left: 90px">' +
+                                '<div style="display: inline;margin-top: 8px;margin-right: 15px">   会员名称</div> ' +
+                                '<input type="text" name="name" required lay-verify="required"  autocomplete="off" ' + 'value="' + datalist[i].name + '"' +
+                                ' class="layui-input"   ' +
+                                'style="width: 210px;display: inline;height: 38px;text-align: center"  id="lename"></div>   ' +
+                                '<div style="display: flex;width: 400px">\n' +
+                                '                                <div style="display: inline;margin-top: 8px;margin-right: 15px">累计积分</div>\n' +
+                                '                                <div class="layui-form-item" style="display: inline">\n' +
+                                '                                    <label class="layui-form-label" style="width: 80px">大于</label>\n' +
+                                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 150px">\n' +
+                                '                                        <input type="number" name="pointsLower" required lay-verify="required"\n' + 'value="' + datalist[i].pointsLower + '"' +
+                                '                                               autocomplete="off" style="text-align: center" \n' +
+                                '                                               class="layui-input"\n' +
+                                '                                               id="lelow">\n' +
+                                '                                    </div>\n' +
+                                '                                    <label class="layui-form-label" style="width: 60px">分</label>\n' +
+                                '                                </div>\n' +
+                                '                            </div>\n' +
+                                '                            <input type="text" name="levelid" id="levelid' + x + '" style="display: none"' + ' value="' + datalist[i].id + '"/> ' +
+                                '                            <div style="display: flex;margin-left: 90px">\n' +
+                                '                                <div style="display: inline;margin-top: 8px;margin-right: 15px">单笔消费</div>\n' +
+                                '                                <div class="layui-form-item" style="display: inline">\n' +
+                                '                                    <label class="layui-form-label" style="width: 80px">实付满</label>\n' +
+                                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">\n' +
+                                '                                        <input type="number" name="singleConsumeAmount" style="text-align: center" id="singleConsumeAmount" class="layui-input" ' + 'value="' + datalist[i].singleConsumeAmount + '" required lay-verify="required"/>\n' +
+                                '                                    </div>\n' +
+                                '                                    <label class="layui-form-label" style="width: 110px">元，每消费</label>\n' +
+                                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">\n' +
+                                '                                        <input type="number" name="singleAmount" id="singleAmount" style="text-align: center" class="layui-input" ' + 'value="' + datalist[i].singleAmount + '" required\n' +
+                                '                                               lay-verify="required"/>\n' +
+                                '                                    </div>\n' +
+                                '                                    <label class="layui-form-label" style="width: 110px">元，可获得</label>\n' +
+                                '                                    <div class="layui-input-inline" style="margin-right: 0px;width: 110px">\n' +
+                                '                                        <input type="number" name="singlePoints" id="singlePoints" class="layui-input"  ' + 'value="' + datalist[i].singlePoints + '"required\n' +
+                                '                                               lay-verify="required" style="text-align: center"/>\n' +
+                                '                                    </div>\n' +
+                                '                                    <label class="layui-form-label" style="width: 60px">分</label>\n' +
                                 '<button type="button" class="layui-btn layui-btn-danger removeclass" id="removeid' + x + '" style="display: inline">删除</button>' +
-                                '<div style="margin-left: 85px">订单实付金额满\n' +
-                                '<input type="number" name="singleConsumeAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" ' + 'value="' + datalist[i].singleConsumeAmount + '"required lay-verify="required" />元时，每消费\n' +
-                                '<input type="number" name="singleAmount"  class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" ' + 'value="' + datalist[i].singleAmount + '" required lay-verify="required"/>元，可获得\n' +
-                                '<input type="number" name="singlePoints" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" ' + 'value="' + datalist[i].singlePoints + '" required lay-verify="required"/>积分;\n' +
-                                '</div></div>'
-                            '</div>';
+                                '                                </div>\n' +
+                                '                            </div>\n' +
+                                '                        </div>\n' +
+                                '                    </div>'
+                            ;
                             if (x !== 2) {
                                 let temp = x - 1;
                                 document.getElementById("removeid" + temp).style.display = "none";
@@ -415,7 +536,6 @@
         form.on('submit(consume-form-submit)', function (data) {
             let token = $("meta[name='_csrf_token']").attr("value");
             let tConsumePoints = [];
-            let pointslimit;
             $('.consumeclass').each(function (index, e) {
                 let tConsumePoint = {}
                 $(this).find('input[type="text"]').each(function (index, e) {
@@ -442,8 +562,7 @@
                 });
                 tConsumePoints.push(tConsumePoint);
             });
-            pointslimit = $("#pointslimit").val();
-            var data = {'tConsumePoints': tConsumePoints,'pointslimit':pointslimit};
+            var data = {'tConsumePoints': tConsumePoints};
             layer.confirm('确认保存?', {
                 icon: 3, title: '提示'
 
@@ -629,90 +748,179 @@
         //
         let monthConsumeList = [];
         let dayConsumeList = [];
-        let getrulelist = function(){
+        let getrulelist = function () {
             $.ajax({
-            type: "GET",
-            dataType: "json",
-            url: '[[@{/consume/rulelist}]]',
-            headers: {
-                'Accept': 'application/json',
-                'Content-Type': 'application/json',
-            },
-            success: function (result) {
-                layer.closeAll('loading');
-                if (result.code === 200) {
-                    monthConsumeList = result.monthConsumeList
-                    dayConsumeList = result.dayConsumeList
-                    for(let temp=0;temp<=conx;temp++){
-                        $("#removecon"+temp).parent().remove();
-                    }
-                    for(let temp=0;temp<=conMonthx;temp++){
-                        $("#removeMonthcon"+temp).parent().remove();
-                    }
-                    conx = 2;
-                    conMonthx = 2;
-                    for (let i = 0; i < dayConsumeList.length; i++) {
-                        if (i === 0) {
-                            $("#conAmount").val(dayConsumeList[i].consumeamount);
-                            $("#conPoints").val(dayConsumeList[i].points);
-                            $("#conPointsid").val(dayConsumeList[i].id);
-                            $("#pointslimit").val(result.pointslimit);
+                type: "GET",
+                dataType: "json",
+                url: '[[@{/consume/rulelist}]]',
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                },
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code === 200) {
+                        monthConsumeList = result.monthConsumeList
+                        dayConsumeList = result.dayConsumeList
+                        for (let temp = 0; temp <= conx; temp++) {
+                            $("#removecon" + temp).parent().remove();
                         }
-                        if (i > 0) {
-                            let daystrr =  ' <div class="consumeclass">当日累计消费金额满 ' +
-                                '<input type="text" name="conAmount" required lay-verify="required" autocomplete="off" ' + 'value="' + dayConsumeList[i].consumeamount + '"' +
-                                'class="layui-input" style="width: 60px;display: inline;height: 28px;margin: 6px" id="lename">' +
-                                '元时，可额外获得 <input type="text" name="conPoints" required lay-verify="required" ' + 'value="' + dayConsumeList[i].points + '" ' +
-                                '  autocomplete="off"  class="layui-input" ' +
-                                'style="width: 60px;display: inline;height: 28px;margin: 6px" id="lelow">积分;' +
-                                ' <input type="text" name="conPointsid" id="conPointsid' + conx + '" style="display: none" ' + 'value="' + dayConsumeList[i].id + '"/> ' +
-                                '<button type="button" class="layui-btn layui-btn-danger removeconsume" id="removecon' + conx + '" style="display: inline">删除</button></div>';
-                            if (conx !== 2) {
-                                let temp = conx - 1;
-                                document.getElementById("removecon" + temp).style.display = "none";
+                        for (let temp = 0; temp <= conMonthx; temp++) {
+                            $("#removeMonthcon" + temp).parent().remove();
+                        }
+                        conx = 2;
+                        conMonthx = 2;
+                        for (let i = 0; i < dayConsumeList.length; i++) {
+                            if (i === 0) {
+                                $("#conAmount").val(dayConsumeList[i].consumeamount);
+                                $("#conPoints").val(dayConsumeList[i].points);
+                                $("#conPointsid").val(dayConsumeList[i].id);
                             }
-                            $("#consumeid").append(daystrr);
-                            conx++;
-                        }
-                    }
-                    for (let i = 0; i < monthConsumeList.length; i++) {
-                        if (i === 0) {
-                            $("#conMonthAmount").val(monthConsumeList[i].consumeamount);
-                            $("#conMonthPoints").val(monthConsumeList[i].points);
-                            $("#conMonthPointsid").val(monthConsumeList[i].id);
-                        }
-                        if (i > 0) {
-                            let monthstrr = ' <div class="consumeclass">当月累计消费金额满 ' +
-                                '<input type="text" name="conMonthAmount" required lay-verify="required" autocomplete="off" ' + 'value="' + monthConsumeList[i].consumeamount + '" ' +
-                                'class="layui-input" style="width: 60px;display: inline;height: 28px;margin: 6px" id="lename">' +
-                                '元时，可额外获得 <input type="text" name="conMonthPoints" required lay-verify="required" ' + 'value="' + monthConsumeList[i].points + '"' +
-                                '  autocomplete="off"  class="layui-input" ' +
-                                'style="width: 60px;display: inline;height: 28px;margin: 6px" id="lelow">积分;' +
-                                ' <input type="text" name="conMonthPointsid" id="conMonthPointsid' + conMonthx + '" style="display: none"  ' + 'value="' + monthConsumeList[i].id + '"/> ' +
-                                '<button type="button" class="layui-btn layui-btn-danger removeMonthconsume" id="removeMonthcon' + conMonthx + '" style="display: inline">删除</button></div>';
-                            if (conMonthx !== 2) {
-                                let temp = conMonthx - 1;
-                                document.getElementById("removeMonthcon" + temp).style.display = "none";
+                            if (i > 0) {
+                                let daystrr = ' <div class="consumeclass">当日累计消费金额满 ' +
+                                    '<input type="text" name="conAmount" required lay-verify="required" autocomplete="off" ' + 'value="' + dayConsumeList[i].consumeamount + '"' +
+                                    'class="layui-input" style="width: 60px;display: inline;height: 28px;margin: 6px" id="lename">' +
+                                    '元时，可额外获得 <input type="text" name="conPoints" required lay-verify="required" ' + 'value="' + dayConsumeList[i].points + '" ' +
+                                    '  autocomplete="off"  class="layui-input" ' +
+                                    'style="width: 60px;display: inline;height: 28px;margin: 6px" id="lelow">积分;' +
+                                    ' <input type="text" name="conPointsid" id="conPointsid' + conx + '" style="display: none" ' + 'value="' + dayConsumeList[i].id + '"/> ' +
+                                    '<button type="button" class="layui-btn layui-btn-danger removeconsume" id="removecon' + conx + '" style="display: inline">删除</button></div>';
+                                if (conx !== 2) {
+                                    let temp = conx - 1;
+                                    document.getElementById("removecon" + temp).style.display = "none";
+                                }
+                                $("#consumeid").append(daystrr);
+                                conx++;
                             }
-                            $("#consumeMonthid").append(monthstrr);
-                            conMonthx++;
                         }
+                        for (let i = 0; i < monthConsumeList.length; i++) {
+                            if (i === 0) {
+                                $("#conMonthAmount").val(monthConsumeList[i].consumeamount);
+                                $("#conMonthPoints").val(monthConsumeList[i].points);
+                                $("#conMonthPointsid").val(monthConsumeList[i].id);
+                            }
+                            if (i > 0) {
+                                let monthstrr = ' <div class="consumeclass">当月累计消费金额满 ' +
+                                    '<input type="text" name="conMonthAmount" required lay-verify="required" autocomplete="off" ' + 'value="' + monthConsumeList[i].consumeamount + '" ' +
+                                    'class="layui-input" style="width: 60px;display: inline;height: 28px;margin: 6px" id="lename">' +
+                                    '元时，可额外获得 <input type="text" name="conMonthPoints" required lay-verify="required" ' + 'value="' + monthConsumeList[i].points + '"' +
+                                    '  autocomplete="off"  class="layui-input" ' +
+                                    'style="width: 60px;display: inline;height: 28px;margin: 6px" id="lelow">积分;' +
+                                    ' <input type="text" name="conMonthPointsid" id="conMonthPointsid' + conMonthx + '" style="display: none"  ' + 'value="' + monthConsumeList[i].id + '"/> ' +
+                                    '<button type="button" class="layui-btn layui-btn-danger removeMonthconsume" id="removeMonthcon' + conMonthx + '" style="display: inline">删除</button></div>';
+                                if (conMonthx !== 2) {
+                                    let temp = conMonthx - 1;
+                                    document.getElementById("removeMonthcon" + temp).style.display = "none";
+                                }
+                                $("#consumeMonthid").append(monthstrr);
+                                conMonthx++;
+                            }
+                        }
+                    } 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});
                     }
-                } 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});
                 }
-            },
-            error: function () {
-                layer.closeAll('loading');
-                layer.msg("请求服务器失败！", {icon: 2});
-            }
-        });
+            });
         }
         getrulelist();
+
+
+
+        /*
+        * 其他设置
+        *
+        * */
+
+        /*
+        *
+        * 消费奖励积分设置
+        * */
+        form.on('submit(set-form-submit)', function (data) {
+            let token = $("meta[name='_csrf_token']").attr("value");
+            let consumePointsLi =  $("#consumePointsLi").val();
+            let taskPointsLi =  $("#taskPointsLi").val();
+            let dayPointsLi =  $("#dayPointsLi").val();
+            var data = {'consumePointsLi': consumePointsLi, 'taskPointsLi': taskPointsLi,'dayPointsLi': dayPointsLi};
+            layer.confirm('确认保存?', {
+                icon: 3, title: '提示'
+
+            }, function (index) {
+                layer.load(2);
+                $.ajax({
+                    type: "POST",
+                    dataType: "json",
+                    url: '[[@{/pointsSet/add}]]',
+                    headers: {
+                        'Accept': 'application/json',
+                        'Content-Type': 'application/json',
+                        'X-CSRF-TOKEN': token,
+                    },
+                    data: JSON.stringify(data),
+                    success: function (result) {
+                        layer.closeAll('loading');
+                        if (result.code === 200) {
+                            layer.msg(result.msg, {icon: 1});
+                            getPointsSet();
+                        } 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});
+                    }
+                });
+                layer.close(index);
+            });
+            return false;
+        });
+
+        let getPointsSet = function () {
+            $.ajax({
+                type: "GET",
+                dataType: "json",
+                url: '[[@{/pointsSet/list}]]',
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                },
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code === 200) {
+                       let  dataSet = result.data;
+                       console.log(dataSet)
+                        $("#consumePointsLi").val(dataSet.consumePointsLi);
+                        $("#taskPointsLi").val(dataSet.taskPointsLi);
+                        $("#dayPointsLi").val(dataSet.dayPointsLi);
+                    } 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});
+                }
+            });
+        }
+        getPointsSet();
     })
 </script>
diff --git a/payapi/src/main/resources/templates/system/level/pointsdetail.html b/payapi/src/main/resources/templates/system/level/pointsdetail.html
deleted file mode 100644
index 29d326f..0000000
--- a/payapi/src/main/resources/templates/system/level/pointsdetail.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<table class="layui-table" id="pointsDetailTable" lay-filter="pointsDetailTable-filter"></table>
-<script>
-    layui.use(['layer', 'table', 'admin', 'form', 'formSelects'], function () {
-        var layer = layui.layer;
-        var admin = layui.admin;
-        var form = layui.form;
-        var table = layui.table;
-        var bean = admin.getTempData('t_bean');
-        console.log(bean)
-        if (bean) {
-            table.render({
-                elem: '#pointsDetailTable',
-                url: '[[@{/pointsdetail/list}]]',
-                page: true,
-                where: {userid: bean.userid},
-                cols: [
-                    [
-                        {
-                            field: 'type',
-                            title: '积分来源',
-                            width: 140,
-                            align: 'center',
-                            fixed: 'left',
-                            sort: true
-                        },
-                        {field: 'points', title: '积分变化', width: 130, align: 'center'},
-                        {
-                            field: 'transtime',
-                            title: '时间',
-                            width: 160,
-                            align: 'center',
-                            templet: function (item) {
-                                let datetemp = item.transdate + item.transtime;
-                                return admin.formatDate(datetemp);
-                            }
-                        }
-                    ]
-                ]
-            });
-        }
-    });
-</script>
diff --git a/payapi/src/main/resources/templates/system/level/pointsreport.html b/payapi/src/main/resources/templates/system/level/pointsreport.html
new file mode 100644
index 0000000..c326e0c
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/pointsreport.html
@@ -0,0 +1,117 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">发放积分统计</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">积分中心</a>
+          <a><cite>发放积分统计</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <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"
+                           placeholder="开始日期"
+                           autocomplete="off" class="layui-input"/>
+                </div>
+                -
+                <div class="layui-input-inline" style="width: 120px;">
+                    <input type="text" name="endDate" id="endDate" placeholder="结束日期"
+                           autocomplete="off"
+                           class="layui-input"/>
+                </div>
+            </div>
+            积分名称：
+            <select id="points-name">
+                <option value=""> 全部</option>
+                <option value="consume">消费获得</option>
+                <option value="task">任务获得</option>
+            </select>
+
+            <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
+                    class="layui-icon"></i>清 空
+            </button>
+        </div>
+        <table class="layui-table" id="pointsReportTable" lay-filter="pointsReportTable"></table>
+    </div>
+</div>
+
+<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>
+    </div>
+</script>
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        var laydate = layui.laydate;
+        form.render("select");
+        laydate.render({
+            elem: '#startDate'
+            ,format: 'yyyy年MM月dd日'
+        });
+        laydate.render({
+            elem: '#endDate'
+            ,format: 'yyyy年MM月dd日'
+        });
+        // 渲染表格
+        table.render({
+            elem: '#pointsReportTable',
+            url: '[[@{/pointsReport/list}]]',
+            page: false,
+            toolbar:'#subjectday-toolbar',
+            defaultToolbar: [],
+            where: {startdate: null, enddate: null},
+            cols: [
+                [
+                    {
+                        field: 'pointsName',
+                        title: '积分名称',
+                        width: 300,
+                        align: 'center'
+
+                    },
+                    {
+                        field: 'pointsCount',
+                        title: '次数',
+                        width: 320,
+                        align: 'center'
+
+                    },
+                    {
+                        field: 'pointsSum',
+                        title: '积分',
+                        width: 320,
+                        align: 'center'
+
+                    }
+
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-chkstatus-search').click(function () {
+            let name = $("#search-chkstatus-searchkey").val();
+            let startDate = $("#startDate").val();
+            let endDate = $("#endDate").val();
+            table.reload('userPointsTable', {where: {name: name, startdate:startDate,enddate:endDate}});
+        });
+
+        $('#btn-reset-sysparam').click(function () {
+            $("#search-chkstatus-searchkey").val("");
+            $("#startDate").val("");
+            $("#endDate").val("");
+        });
+
+
+    });
+</script>
