diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 4346bdc..06713bb 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -55,4 +55,4 @@
 spring.kafka.consumer.auto-commit-interval=100
 # 指定消息key和消息体的编解码方式
 spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
-spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
\ No newline at end of file
+spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
index c0b92e5..954a693 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
@@ -1,14 +1,12 @@
 package com.supwisdom.dlpay.api.bean;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 @Getter
 @Setter
 @AllArgsConstructor
 @NoArgsConstructor
+@ToString
 public class CitizenPayResponse extends ApiResponse {
   private String refno;
   private String billno;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserPointsParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserPointsParam.java
new file mode 100644
index 0000000..1941ca8
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserPointsParam.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+
+@Getter
+@Setter
+public class UserPointsParam extends APIRequestParam {
+  @Sign
+  private String idno;
+  @Sign
+  private String name;
+  @Sign
+  private int pageNo;
+  @Sign
+  private int pageSize;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    if (StringUtils.isEmpty(idno) && StringUtils.isEmpty(name)) {
+      throw new RequestParamCheckException("市民卡账号和姓名不能为空");
+    }
+    return true;
+  }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskParam.java
new file mode 100644
index 0000000..5adbbe3
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskParam.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+
+@Getter
+@Setter
+public class UserTaskParam extends APIRequestParam {
+  @Sign
+  private String userid;
+  @Sign
+  private String taskid;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    if (StringUtils.isEmpty(userid) && StringUtils.isEmpty(taskid)) {
+      throw new RequestParamCheckException("用户号和任务号不能为空");
+    }
+    return true;
+  }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskResponse.java
new file mode 100644
index 0000000..5b31c44
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserTaskResponse.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserTaskResponse extends ApiResponse {
+  private List dataList;
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
index 7a17aec..1ab688d 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
@@ -38,4 +38,14 @@
 
   @RequestMapping(value = "/api/user/biz_query", method = RequestMethod.GET)
   CardBizResponse bizQuery(@RequestParam("refno") String refno);
+
+  @PostMapping("/api/user/userTask")
+  ApiResponse userTask();
+
+  @PostMapping("/api/user/getTask")
+  ApiResponse getTPointsTaskNoPage();
+
+  @PostMapping("/api/user/getUserPoints")
+  ApiResponse getUserPoints(@RequestBody UserPointsParam param);
+
 }
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index 1916f7a..16f82bb 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -54,6 +54,8 @@
   private UserProxy userProxy;
   @Autowired
   private ConsumePropxy consumePropxy;
+  @Autowired
+  private TransactionProxy transactionProxy;
 
 
   @org.junit.Test
@@ -69,15 +71,49 @@
     System.out.println(version.getVersion());
 
     CitizenCardPayinitParam initParam = new CitizenCardPayinitParam();
-    initParam.setBillno("20190708172756000001");
-    initParam.setCardNo("20190619001");
-    initParam.setAmount(0);
-    initParam.setTransdate("20190708");
+    initParam.setBillno("201907081727560000175 ");
+    initParam.setCardNo("00015574");
+    initParam.setAmount(50000);
+    initParam.setTransdate("20200821");
     initParam.setTranstime("172713");
-    initParam.setShopaccno("2000000038");
+    initParam.setShopaccno("2000000012");
+    initParam.setDtltype("canteen");
     CitizenPayResponse payInit = citizenCardPayProxy.citizencardPayinit(initParam);
     assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(),
         payInit.getRetcode(), equalTo(0));
+    System.err.println(payInit);
+
+    CitizenCardPayfinishParam finishParam = new CitizenCardPayfinishParam();
+    finishParam.setRefno(payInit.getRefno());
+    CitizenPayResponse citizencardPayFinish = citizenCardPayProxy.citizencardPayFinish(finishParam);
+    System.err.println(citizencardPayFinish);
+  }
+
+  @org.junit.Test
+  public void citizencardPayRefund() {
+    ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+    helper.login(appid, secret);
+
+    ApiVersionResponse version = apiCommonProxy.apiVersion();
+
+    assertThat("get version error " + version.getException(),
+        version.getVersion(), notNullValue());
+
+
+    ConsumePayRefundParam initParam = new ConsumePayRefundParam();
+    initParam.setBillno("201907081727560000174 ");
+    initParam.setTransdate("20200821");
+    initParam.setTranstime("172713");
+    initParam.setShopaccno("2000000012");
+    initParam.setRequestbillno("201907081727560000174");
+    initParam.setRefundAmount(50000);
+
+    PayReverseResponse payInit = transactionProxy.payRefund(initParam);
+    assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(),
+        payInit.getRetcode(), equalTo(0));
+    System.err.println(payInit);
+
+
   }
 
   @Test
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
index 988afaa..5483aa1 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
@@ -19,4 +19,8 @@
     TPerson findByUserid(String userid);
 
     Page<TPerson> findAllByNameContaining(String name, Pageable pageable);
+
+    TPerson findByUseridAndAndName(String userid,String name);
+
+    TPerson findByUseridAndIdtype(String userid,String idtype);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
index 18c15d9..1826197 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.api.domain.TPersondtl;
 import com.supwisdom.dlpay.framework.data.CountAmountBean;
+import com.supwisdom.dlpay.framework.domain.TPointsdtl;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -9,10 +10,18 @@
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
     Page<TPersondtl> findByUseridAndStatus(String userid,String status, Pageable pageable);
 
     @Query("select count(t.refno) as totalcnt,sum(t.amount) as totalamt from TPersondtl t where t.status='success' and t.accdate=?1 and t.sourceType=?2 and t.tenantid=?3 ")
     CountAmountBean getPersondtlSumInfo(String accdate, String sourcetype, String tenantid);
+
+    List<TPersondtl> findAllByUseridAndTransdateAndReverseFlagAndStatusAndTradeflag(String userid, String transdate,String reverseFlag,String status,String tradeflag);
+
+    List<TPersondtl> findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatusAndTradeflag(String userid, String transdate,String reverseFlag,String status,String tradeflag);
+
+    List<TPersondtl> findAllByTransdateAndReverseFlagAndStatusAndTradeflag(String transdate,String reverseFlag,String status,String tradeflag);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
index 0e49580..1bc0216 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.api.dao;
 
+import com.supwisdom.dlpay.api.domain.TPersondtl;
 import com.supwisdom.dlpay.api.domain.TShopdtl;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -16,4 +17,11 @@
 
   @Lock(LockModeType.OPTIMISTIC)
   List<TShopdtl> findAllByStatusAndUpdateBala(String status, Boolean flag);
+
+
+  List<TShopdtl> findAllByAccdateAndReverseFlagAndStatus(String transdate, String reverseFlag, String status);
+
+  List<TShopdtl> findAllByOppositeAccNoAndAccdateAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
+
+  List<TShopdtl> findAllByOppositeAccNoAndAccdateStartingWithAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/PointsOutdateTask.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/PointsOutdateTask.java
new file mode 100644
index 0000000..1251749
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/PointsOutdateTask.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.citizencard.task;
+
+import com.google.gson.Gson;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.supwisdom.dlpay.citizencard.bean.CitizencardLossResp;
+import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply;
+import com.supwisdom.dlpay.citizencard.service.CitizencardManagerService;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.service.PointsService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
+import org.apache.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.ws.rs.core.MediaType;
+import java.util.List;
+
+
+@Component
+public class PointsOutdateTask {
+  @Autowired
+  private PointsService pointsService;
+
+  private static final Logger logger = LoggerFactory.getLogger(PointsOutdateTask.class);
+  /**
+   * 积分过期任务
+   */
+  @Scheduled(cron = "${points.outdate.cron}")
+  @SchedulerLock(name = "PointsOutdateTask", lockAtMostForString = "PT10M")
+  public void doPointsOutdateTask() {
+    try {
+      long t1 = System.currentTimeMillis();
+      logger.info("执行积分过期任务：");
+
+      pointsService.pointsOutdate();
+      long t2 = System.currentTimeMillis();
+      logger.info("执行积分过期任务结束，耗时 " + (t2 - t1) + " ms");
+
+    } catch (Exception ex) {
+      logger.error("执行积分过期任务报错！");
+      ex.printStackTrace();
+    }
+  }
+  /**
+   * 积分补偿任务
+   */
+  @Scheduled(cron = "${points.consume.cron}")
+  @SchedulerLock(name = "PointsConsumeTask", lockAtMostForString = "PT10M")
+  public void consumePointsTask() {
+    try {
+      long t1 = System.currentTimeMillis();
+      logger.info("执行积分补偿任务：");
+
+      pointsService.pointsCompensate();
+      long t2 = System.currentTimeMillis();
+      logger.info("执行积分补偿任务结束，耗时 " + (t2 - t1) + " ms");
+
+    } catch (Exception ex) {
+      logger.error("执行积分补偿任务报错！");
+      ex.printStackTrace();
+    }
+  }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ConsumePointsDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ConsumePointsDao.java
new file mode 100644
index 0000000..57fd086
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ConsumePointsDao.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TConsumePoints;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ConsumePointsDao extends JpaRepository<TConsumePoints, Integer> {
+  List<TConsumePoints> findAllByAndRuletype(String ruletype, Sort sort);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PersonLevelDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PersonLevelDao.java
new file mode 100644
index 0000000..c0bd26d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PersonLevelDao.java
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPersonLevel;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PersonLevelDao extends JpaRepository<TPersonLevel, Integer> {
+
+  @Query(value = "from TPersonLevel t where t.pointsLower<=:points and t.pointsUpper>=:points ")
+  TPersonLevel findTPersonLevelByPoints(@Param("points")Integer points);
+}
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
new file mode 100644
index 0000000..5bdf552
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsActiveDao.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPointsActive;
+import com.supwisdom.dlpay.framework.domain.TPointsMain;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import org.springframework.data.jpa.repository.JpaRepository;
+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);
+
+    TPointsActive findAllByName(String name);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java
new file mode 100644
index 0000000..8c33de2
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import com.supwisdom.dlpay.framework.domain.TPointsDetail;
+import com.supwisdom.dlpay.framework.domain.TPointsTask;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PointsDetailDao extends JpaRepository<TPointsDetail, Integer> {
+
+  List<TPointsDetail> findAllByOutDateAndStatus(String outdate,String status);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java
new file mode 100644
index 0000000..0bbf7a3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPointsActive;
+import com.supwisdom.dlpay.framework.domain.TPointsdtl;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PointsDtlDao extends JpaRepository<TPointsdtl, Integer>, JpaSpecificationExecutor<TPointsdtl> {
+
+  Page<TPointsdtl> findAllByUserid(String userid, Pageable pageable);
+
+  List<TPointsdtl> findAllByUseridAndTypeAndFlagstatusAndTransdateAndStatus(String userid, String type,String flagstatus,String transdate,String status);
+
+  TPointsdtl findAllByUseridAndTransdateAndRefnoAndStatusAndFlagstatus(String userid,String transdate,Integer refno, String status,String flagstatus);
+
+  TPointsdtl findAllByUseridAndTransdateStartingWithAndRefnoAndStatusAndFlagstatus(String userid,String transdate,Integer refno, String status,String flagstatus);
+
+  TPointsdtl findAllByUseridAndBillnoAndTypeAndRefno(String userid,String billno,String type,Integer refno);
+
+  TPointsdtl findAllByUseridAndBillnoAndType(String userid,String billno,String type);
+
+  TPointsdtl findAllByUseridAndRefno(String userid,Integer refno);
+
+  TPointsdtl findAllByUseridAndRefnoAndType(String userid,Integer refno,String type);
+
+  TPointsdtl findAllByUseridAndDetailid(String userid,Integer detailid);
+
+  TPointsdtl findAllByUseridAndRefnoAndTransdate(String userid,Integer refno,String transdate);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsMainDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsMainDao.java
new file mode 100644
index 0000000..6769b7f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsMainDao.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPointsMain;
+import com.supwisdom.dlpay.framework.domain.TPointsTask;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PointsMainDao extends JpaRepository<TPointsMain, String> {
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsTaskDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsTaskDao.java
new file mode 100644
index 0000000..8da33a8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsTaskDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPointsTask;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PointsTaskDao extends JpaRepository<TPointsTask, Integer> {
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TConsumePoints.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TConsumePoints.java
new file mode 100644
index 0000000..84fb2c1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TConsumePoints.java
@@ -0,0 +1,89 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_CONSUME_POINTS")
+public class TConsumePoints {
+  @Id
+  @SequenceGenerator(name = "conpointsno", sequenceName = "SEQ_CONPOINTSNO", allocationSize = 1, initialValue = 1)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "conpointsno")
+  @Column(name = "ID", nullable = false, precision = 32)
+  private Integer id;
+
+  @Column(name = "NAME", length = 32)
+  private String name;
+
+  @Column(name = "CONSUMEAMOUNT")
+  private String consumeamount;
+
+  @Column(name = "POINTS")
+  @NotNull
+  private Integer points;
+
+  @Column(name = "RULETYPE")
+  private String ruletype;
+
+  @Column(name = "UPDATETIME")
+  private String updatetime;
+
+  @Column(name = "OPERATORID")
+  private String operatorid;
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getConsumeamount() {
+    return consumeamount;
+  }
+
+  public void setConsumeamount(String consumeamount) {
+    this.consumeamount = consumeamount;
+  }
+
+  public Integer getPoints() {
+    return points;
+  }
+
+  public void setPoints(Integer points) {
+    this.points = points;
+  }
+
+  public String getRuletype() {
+    return ruletype;
+  }
+
+  public void setRuletype(String ruletype) {
+    this.ruletype = ruletype;
+  }
+
+  public String getUpdatetime() {
+    return updatetime;
+  }
+
+  public void setUpdatetime(String updatetime) {
+    this.updatetime = updatetime;
+  }
+
+  public String getOperatorid() {
+    return operatorid;
+  }
+
+  public void setOperatorid(String operatorid) {
+    this.operatorid = operatorid;
+  }
+}
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
new file mode 100644
index 0000000..b6dd60b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPersonLevel.java
@@ -0,0 +1,113 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_PERSON_LEVEL")
+public class TPersonLevel {
+  @Id
+  @SequenceGenerator(name = "personno", sequenceName = "SEQ_PERSONNO", allocationSize = 1, initialValue = 1)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "personno")
+  @Column(name = "ID", nullable = false, precision = 32)
+  private Integer id;
+
+  @Column(name = "NAME", length = 32)
+  private String name;
+
+  @Column(name = "POINTSLOWER")
+  @NotNull
+  private Integer pointsLower;
+
+  @Column(name = "POINTSUPPER")
+  private Integer pointsUpper;
+
+  @Column(name = "UPDATETIME")
+  private String updatetime;
+
+  @Column(name = "OPERATORID")
+  private String operatorid;
+
+  @Column(name = "SINGLECONSUMEAMOUNT")
+  private Integer singleConsumeAmount;
+
+  @Column(name = "singleamount")
+  private Integer singleAmount;
+
+  @Column(name = "singlepoints")
+  private Integer singlePoints;
+
+  public Integer getSingleConsumeAmount() {
+    return singleConsumeAmount;
+  }
+
+  public void setSingleConsumeAmount(Integer singleConsumeAmount) {
+    this.singleConsumeAmount = singleConsumeAmount;
+  }
+
+  public Integer getSingleAmount() {
+    return singleAmount;
+  }
+
+  public void setSingleAmount(Integer singleAmount) {
+    this.singleAmount = singleAmount;
+  }
+
+  public Integer getSinglePoints() {
+    return singlePoints;
+  }
+
+  public void setSinglePoints(Integer singlePoints) {
+    this.singlePoints = singlePoints;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public Integer getPointsLower() {
+    return pointsLower;
+  }
+
+  public void setPointsLower(Integer pointsLower) {
+    this.pointsLower = pointsLower;
+  }
+
+  public Integer getPointsUpper() {
+    return pointsUpper;
+  }
+
+  public void setPointsUpper(Integer pointsUpper) {
+    this.pointsUpper = pointsUpper;
+  }
+
+  public String getUpdatetime() {
+    return updatetime;
+  }
+
+  public void setUpdatetime(String updatetime) {
+    this.updatetime = updatetime;
+  }
+
+  public String getOperatorid() {
+    return operatorid;
+  }
+
+  public void setOperatorid(String operatorid) {
+    this.operatorid = operatorid;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsActive.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsActive.java
new file mode 100644
index 0000000..4ec689c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsActive.java
@@ -0,0 +1,155 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_POINTS_ACTIVE")
+public class TPointsActive {
+  @Id
+  @SequenceGenerator(name = "activeno", sequenceName = "SEQ_ACTIVENO", allocationSize = 1, initialValue = 1)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "activeno")
+  @Column(name = "ID", nullable = false, precision = 32)
+  private Integer id;
+
+  @Column(name = "NAME", length = 32)
+  private String name;
+
+  @Column(name = "TYPE")
+  private String type;
+
+  @Column(name = "STARTDATE")
+  private String startdate;
+
+  @Column(name = "ENDDATE")
+  private String enddate;
+
+  @Column(name = "WEEKNUMBER")
+  private Integer weeknumber;
+
+  @Column(name = "WEEKDAY")
+  private String weekday;
+
+  @Column(name = "RATE")
+  private String rate;
+
+  @Column(name = "REMARK")
+  private String remark;
+
+  @Column(name = "UPDATETIME")
+  private String updatetime;
+
+  @Column(name = "OPERATORID")
+  private String operatorid;
+
+  @Transient
+  private String yearStartDate;
+
+  @Transient
+  private String yearEndDate;
+
+  public String getYearStartDate() {
+    return yearStartDate;
+  }
+
+  public void setYearStartDate(String yearStartDate) {
+    this.yearStartDate = yearStartDate;
+  }
+
+  public String getYearEndDate() {
+    return yearEndDate;
+  }
+
+  public void setYearEndDate(String yearEndDate) {
+    this.yearEndDate = yearEndDate;
+  }
+
+  public String getUpdatetime() {
+    return updatetime;
+  }
+
+  public void setUpdatetime(String updatetime) {
+    this.updatetime = updatetime;
+  }
+
+  public String getOperatorid() {
+    return operatorid;
+  }
+
+  public void setOperatorid(String operatorid) {
+    this.operatorid = operatorid;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public String getStartdate() {
+    return startdate;
+  }
+
+  public void setStartdate(String startdate) {
+    this.startdate = startdate;
+  }
+
+  public String getEnddate() {
+    return enddate;
+  }
+
+  public void setEnddate(String enddate) {
+    this.enddate = enddate;
+  }
+
+  public Integer getWeeknumber() {
+    return weeknumber;
+  }
+
+  public void setWeeknumber(Integer weeknumber) {
+    this.weeknumber = weeknumber;
+  }
+
+  public String getWeekday() {
+    return weekday;
+  }
+
+  public void setWeekday(String weekday) {
+    this.weekday = weekday;
+  }
+
+  public String getRate() {
+    return rate;
+  }
+
+  public void setRate(String rate) {
+    this.rate = rate;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java
new file mode 100644
index 0000000..6493001
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java
@@ -0,0 +1,79 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_POINTS_DETAIL")
+public class TPointsDetail {
+  @Id
+  @GenericGenerator(name = "idGeneratorDeta", strategy = "sequence")
+  @GeneratedValue(generator = "idGeneratorDeta")
+  @Column(name = "DETAILID", nullable = false, precision = 32)
+  private Integer detailid;
+
+  @Column(name = "POINTSDTLID", length = 32)
+  private Integer pointsdtlId;
+
+  @Column(name = "USERID")
+  private String userid;
+
+  @Column(name = "POINTS")
+  private Integer points;
+
+  @Column(name = "OUTDATE")
+  private String outDate;
+
+  @Column(name = "STATUS")
+  private String status;
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public Integer getDetailid() {
+    return detailid;
+  }
+
+  public void setDetailid(Integer detailid) {
+    this.detailid = detailid;
+  }
+
+  public Integer getPointsdtlId() {
+    return pointsdtlId;
+  }
+
+  public void setPointsdtlId(Integer pointsdtlId) {
+    this.pointsdtlId = pointsdtlId;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public Integer getPoints() {
+    return points;
+  }
+
+  public void setPoints(Integer points) {
+    this.points = points;
+  }
+
+  public String getOutDate() {
+    return outDate;
+  }
+
+  public void setOutDate(String outDate) {
+    this.outDate = outDate;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsMain.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsMain.java
new file mode 100644
index 0000000..1aea319
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsMain.java
@@ -0,0 +1,117 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_POINTS_MAIN")
+public class TPointsMain {
+  @Id
+  @Column(name = "USERID", nullable = false, precision = 32)
+  private String userid;
+
+  @Column(name = "POINTS", length = 32)
+  private Integer points;
+
+  @Column(name = "ACCUMPOINTS")
+  private Integer accumPoints;
+
+  @Column(name = "SUMPAYPOINTS")
+  private Integer sumpayPoints;
+
+  @Column(name = "OUTPOINTS")
+  private Integer outPoints;
+
+  @Column(name = "UPDATETIME")
+  private String updatetime;
+
+  @Column(name = "LEVELID")
+  private Integer levelid;
+
+  @Transient
+  private String name;
+  @Transient
+  private String cardno;
+  @Transient
+  private String levelname;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public Integer getLevelid() {
+    return levelid;
+  }
+
+  public void setLevelid(Integer levelid) {
+    this.levelid = levelid;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getLevelname() {
+    return levelname;
+  }
+
+  public void setLevelname(String levelname) {
+    this.levelname = levelname;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public Integer getPoints() {
+    return points;
+  }
+
+  public void setPoints(Integer points) {
+    this.points = points;
+  }
+
+  public Integer getAccumPoints() {
+    return accumPoints;
+  }
+
+  public void setAccumPoints(Integer accumPoints) {
+    this.accumPoints = accumPoints;
+  }
+
+  public Integer getSumpayPoints() {
+    return sumpayPoints;
+  }
+
+  public void setSumpayPoints(Integer sumpayPoints) {
+    this.sumpayPoints = sumpayPoints;
+  }
+
+  public Integer getOutPoints() {
+    return outPoints;
+  }
+
+  public void setOutPoints(Integer outPoints) {
+    this.outPoints = outPoints;
+  }
+
+  public String getUpdatetime() {
+    return updatetime;
+  }
+
+  public void setUpdatetime(String updatetime) {
+    this.updatetime = updatetime;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java
new file mode 100644
index 0000000..a0b32d3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsTask.java
@@ -0,0 +1,100 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_POINTS_TASK")
+public class TPointsTask {
+  @Id
+  @SequenceGenerator(name = "taskno", sequenceName = "SEQ_TASKNO", allocationSize = 1, initialValue = 1)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "taskno")
+  @Column(name = "TASKID", nullable = false, precision = 32)
+  private Integer taskid;
+
+  @Column(name = "TASKNAME", length = 32)
+  private String taskname;
+
+  @Column(name = "TYPE")
+  private String type;
+
+  @Column(name = "TASKPOINTS")
+  @NotNull
+  private Integer taskpoints;
+
+  @Column(name = "REMARK")
+  private String remark;
+
+  @Column(name = "STARTTIME")
+  private String starttime;
+
+  @Column(name = "ENDTIME")
+  private String endtime;
+
+  @Column(name = "ENABLE")
+  private String enable;
+
+  public Integer getTaskid() {
+    return taskid;
+  }
+
+  public void setTaskid(Integer taskid) {
+    this.taskid = taskid;
+  }
+
+  public String getTaskname() {
+    return taskname;
+  }
+
+  public void setTaskname(String taskname) {
+    this.taskname = taskname;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public Integer getTaskpoints() {
+    return taskpoints;
+  }
+
+  public void setTaskpoints(Integer taskpoints) {
+    this.taskpoints = taskpoints;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+
+  public String getStarttime() {
+    return starttime;
+  }
+
+  public void setStarttime(String starttime) {
+    this.starttime = starttime;
+  }
+
+  public String getEndtime() {
+    return endtime;
+  }
+
+  public void setEndtime(String endtime) {
+    this.endtime = endtime;
+  }
+
+  public String getEnable() {
+    return enable;
+  }
+
+  public void setEnable(String enable) {
+    this.enable = enable;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java
new file mode 100644
index 0000000..8d42159
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsdtl.java
@@ -0,0 +1,166 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_POINTSDTL")
+public class TPointsdtl {
+  @Id
+  @GenericGenerator(name = "idGeneratorDtl", strategy = "sequence")
+  @GeneratedValue(generator = "idGeneratorDtl")
+  @Column(name = "ID", nullable = false, precision = 32)
+  private Integer id;
+
+  @Column(name = "REFNO", length = 32)
+  private Integer refno;
+
+  @Column(name = "TYPE")
+  private String type;
+
+  @Column(name = "USERID")
+  private String userid;
+
+  @Column(name = "POINTS")
+  private String points;
+
+  @Column(name = "STATUS", length = 32)
+  private String status;
+
+  @Column(name = "AFTPOINTS")
+  private Integer aftpoints;
+
+  @Column(name = "BILLNO")
+  private String billno;
+
+  @Column(name = "TRANSDATE")
+  private String transdate;
+
+  @Column(name = "TRANSTIME", length = 32)
+  private String transtime;
+
+  @Column(name = "DETAILID")
+  private Integer detailid;
+
+  @Column(name = "MAINSTATUS")
+  private String mainstatus;
+
+  @Column(name = "FLAGSTATUS")
+  private String flagstatus;
+
+  @Transient
+  private TPointsMain tPointsMain;
+
+  public TPointsMain gettPointsMain() {
+    return tPointsMain;
+  }
+
+  public void settPointsMain(TPointsMain tPointsMain) {
+    this.tPointsMain = tPointsMain;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public Integer getRefno() {
+    return refno;
+  }
+
+  public void setRefno(Integer refno) {
+    this.refno = refno;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public String getPoints() {
+    return points;
+  }
+
+  public void setPoints(String points) {
+    this.points = points;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public Integer getAftpoints() {
+    return aftpoints;
+  }
+
+  public void setAftpoints(Integer aftpoints) {
+    this.aftpoints = aftpoints;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  public Integer getDetailid() {
+    return detailid;
+  }
+
+  public void setDetailid(Integer detailid) {
+    this.detailid = detailid;
+  }
+
+  public String getMainstatus() {
+    return mainstatus;
+  }
+
+  public void setMainstatus(String mainstatus) {
+    this.mainstatus = mainstatus;
+  }
+
+  public String getFlagstatus() {
+    return flagstatus;
+  }
+
+  public void setFlagstatus(String flagstatus) {
+    this.flagstatus = flagstatus;
+  }
+}
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 fe39ac8..efbf753 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -4,6 +4,7 @@
 import org.slf4j.LoggerFactory;
 
 import java.sql.Timestamp;
+import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -25,7 +26,15 @@
     return sdf.format(new Date());
   }
 
-
+  public static String getYesterdayDay() {
+    SimpleDateFormat sdf = new SimpleDateFormat(
+        "yyyyMMdd");
+    Calendar cd = Calendar.getInstance();
+    cd.setTime(new Date());
+    cd.add(Calendar.DATE, -1);//增加一天
+    Date date = cd.getTime();
+    return sdf.format(date);
+  }
   /**
    * Description: 根据类型返回一个当前时间 @param partten String @return String 格式：partten
    */
@@ -358,4 +367,68 @@
   public static Boolean sameDay(Timestamp d1, Timestamp d2) {
     return (compareDay(d1, d2) == 0);
   }
+
+  /**
+   * 格式化字符串日期
+   * @param dateStr       字符串日期
+   * @param srcFormat     字符串日期格式
+   * @param destFormat    目标格式
+   * @return
+   */
+  public static String formatDateStr(String dateStr, String srcFormat, String destFormat) {
+    Date date = getDate(dateStr, srcFormat);
+    if(date==null){
+      return dateStr;
+    }
+    return formatDate(date, destFormat);
+  }
+
+  /**
+   * Description: string 格式的日期转换成java.util.Date格式的日期
+   *
+   * @param @param  datetime
+   * @param @param  pattern
+   * @param @return
+   * @param @throws ParseException
+   * @return Date Modify History: 2010-8-5 Linqing.He create
+   */
+  public static Date getDate(String datetime, String pattern) {
+    if(datetime==null){
+      return null;
+    }
+    SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
+    Date startDate = null;
+    try {
+      startDate = dateFormat.parse(datetime);
+    }catch (Exception e) {
+      logger.error("error:",e);
+    }
+    return startDate;
+  }
+
+  /**
+   * 按照给定格式，格式化日期对象
+   * @param date      日期对象
+   * @param pattern   给定格式
+   * @return
+   */
+  public static String formatDate(Date date, String pattern) {
+    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 9c2162f..891af93 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -110,4 +110,44 @@
   public static final String REVERSE_FLAG_WIP = "wip";
   public static final String REVERSE_FLAG_CANCEL = "cancel";
   public static final String REVERSE_FLAG_REFUND = "refund";
+
+
+  /*
+  * 积分中心模块
+  *
+  *
+  * */
+  //积分流水表的类型tb_pointsdtl
+  public static final String CONSUME_FLAG_SINGLE = "consume";       //单次消费
+  public static final String CONSUME_FLAG_DAY = "consumeDay";       //日累计奖励
+  public static final String CONSUME_FLAG_MONTH = "consumeMonth";     //月累计奖励
+  public static final String CONSUME_SINGLE_REFUND = "consumeRefund";     //单次退款
+  public static final String CONSUME_DAY_REFUND = "consumeDayRefund";     //日累计奖励退款
+  public static final String CONSUME_MONTH_REFUND = "consumeMonthRefund";   //月累计奖励退款
+  public static final String TASK_FLAG_FINISH = "task";     //任务
+  public static final String CONSUME_FLAG_OUTPOINTS = "outpoints";     //过期积分
+
+  //积分任务表的类型tb_points_task
+  public static final String TASK_FLAG_FIRST = "first";
+  public static final String TASK_FLAG_EVEDAY = "everyday";
+  public static final String TASK_FLAG_EVETIME = "everytime";
+
+  //消费规则表的类型  tb_consume_points
+  public static final String CONSUME_POINTS_DAY = "day";
+  public static final String CONSUME_POINTS_MONTH = "month";
+
+  //积分明细表的状态tb_points_detail
+  public static final String DETAIL_FLAG_NORMAL = "normal";    //正常
+  public static final String DETAIL_FLAG_OUTDATE = "outdate";   //过期
+  public static final String DETAIL_FLAG_REFUND = "refund";     //退款
+
+  //积分活动日的状态tb_points_active
+  public static final String ACTIVE_FLAG_MONTH = "month";    //月循环
+  public static final String ACTIVE_FLAG_NO = "no";   //不循环
+  public static final String ACTIVE_FLAG_YEAR = "year";     //年循环
+
+  //参数表tb_businesspara
+  public static final String PARA_FLAG_CON = "consumePointsLi";   //积分消费上限
+  public static final String PARA_FLAG_TASK = "taskPointsLi";     //积分任务上限
+  public static final String PARA_FLAG_DAY = "dayPointsLi";     //积分过期时间
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java
new file mode 100644
index 0000000..cbfbee5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java
@@ -0,0 +1,245 @@
+package com.supwisdom.dlpay.system.bean;
+
+import com.supwisdom.dlpay.framework.domain.TConsumePoints;
+import com.supwisdom.dlpay.framework.domain.TPersonLevel;
+import com.supwisdom.dlpay.framework.domain.TPointsActive;
+import com.supwisdom.dlpay.framework.domain.TPointsTask;
+
+import java.util.List;
+
+public class LevelBean extends PageBean {
+  private List<TPersonLevel> tPersonLevels;
+  private TPointsTask tPointsTask;
+  private String name;
+  private String idno;
+  private String userid;
+  private Integer levelid;
+  private Integer conPointsid;
+  private List<TConsumePoints> tConsumePoints;
+  private List<TConsumePoints> monthList;
+  private List<TConsumePoints> dayList;
+  private Integer pointslimit;
+  private Integer pointsdate;
+  private TPointsActive pointsActive;
+  private String type;
+  private Integer activeid;
+  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;
+  }
+
+  public void setPointsName(String pointsName) {
+    this.pointsName = pointsName;
+  }
+
+  public String getStartDate() {
+    return startDate;
+  }
+
+  public void setStartDate(String startDate) {
+    this.startDate = startDate;
+  }
+
+  public String getEndDate() {
+    return endDate;
+  }
+
+  public void setEndDate(String endDate) {
+    this.endDate = endDate;
+  }
+
+  public Integer getActiveid() {
+    return activeid;
+  }
+
+  public void setActiveid(Integer activeid) {
+    this.activeid = activeid;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public TPointsActive getPointsActive() {
+    return pointsActive;
+  }
+
+  public void setPointsActive(TPointsActive pointsActive) {
+    this.pointsActive = pointsActive;
+  }
+
+  public Integer getPointsdate() {
+    return pointsdate;
+  }
+
+  public void setPointsdate(Integer pointsdate) {
+    this.pointsdate = pointsdate;
+  }
+
+  public Integer getPointslimit() {
+    return pointslimit;
+  }
+
+  public void setPointslimit(Integer pointslimit) {
+    this.pointslimit = pointslimit;
+  }
+
+  public List<TConsumePoints> getMonthList() {
+    return monthList;
+  }
+
+  public void setMonthList(List<TConsumePoints> monthList) {
+    this.monthList = monthList;
+  }
+
+  public List<TConsumePoints> getDayList() {
+    return dayList;
+  }
+
+  public void setDayList(List<TConsumePoints> dayList) {
+    this.dayList = dayList;
+  }
+
+  public Integer getConPointsid() {
+    return conPointsid;
+  }
+
+  public void setConPointsid(Integer conPointsid) {
+    this.conPointsid = conPointsid;
+  }
+
+  public List<TConsumePoints> gettConsumePoints() {
+    return tConsumePoints;
+  }
+
+  public void settConsumePoints(List<TConsumePoints> tConsumePoints) {
+    this.tConsumePoints = tConsumePoints;
+  }
+
+  public Integer getLevelid() {
+    return levelid;
+  }
+
+  public void setLevelid(Integer levelid) {
+    this.levelid = levelid;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getIdno() {
+    return idno;
+  }
+
+  public void setIdno(String idno) {
+    this.idno = idno;
+  }
+
+  public TPointsTask gettPointsTask() {
+    return tPointsTask;
+  }
+
+  public void settPointsTask(TPointsTask tPointsTask) {
+    this.tPointsTask = tPointsTask;
+  }
+
+  public List<TPersonLevel> gettPersonLevels() {
+    return tPersonLevels;
+  }
+
+  public void settPersonLevels(List<TPersonLevel> tPersonLevels) {
+    this.tPersonLevels = tPersonLevels;
+  }
+}
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
new file mode 100644
index 0000000..273e6da
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/PointsController.java
@@ -0,0 +1,366 @@
+package com.supwisdom.dlpay.system.controller;
+
+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;
+
+
+@Controller
+public class PointsController {
+
+  @Autowired
+  private PointsService pointsService;
+  @Autowired
+  private OperatorService operatorService;
+
+
+  @GetMapping("/level/index")
+  public String index() {
+    return "system/level/index";
+  }
+
+  @GetMapping("/level/list")
+  @PreAuthorize("hasPermission('/user/list','')")
+  @ResponseBody
+  public JsonResult getDataList() {
+    try {
+      LevelBean levelBean = pointsService.getLevel();
+      return JsonResult.ok().put("datalist", levelBean.gettPersonLevels());
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统查询错误");
+    }
+  }
+
+  @PostMapping("/level/add")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult add(@RequestBody LevelBean levelBean) {
+    TOperator operator = OperUtil.getCurrentOper();
+    if (operator != null) {
+      operator = operatorService.getOperatorByCode(operator.getOpercode());
+    }
+    for (TPersonLevel tPersonLevel : levelBean.gettPersonLevels()) {
+      if (StringUtil.isEmpty(tPersonLevel.getName())
+          || tPersonLevel.getPointsLower() == null) {
+        return JsonResult.error("参数错误");
+      }
+     /* if (tPersonLevel.getPointsLower() > tPersonLevel.getPointsUpper()) {
+        return JsonResult.error("积分下限必须小于积分上限");
+      }*/
+      tPersonLevel.setUpdatetime(DateUtil.getNow());
+      tPersonLevel.setOperatorid(operator.getOpercode());
+    }
+    return pointsService.saveLevel(levelBean);
+  }
+
+  @PostMapping("/level/delete")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult deleteLevel(@RequestBody LevelBean levelBean) {
+    TPersonLevel tPersonLevel = new TPersonLevel();
+    tPersonLevel.setId(levelBean.getLevelid());
+    return pointsService.deleteLevel(tPersonLevel);
+  }
+
+  @GetMapping("/task/list")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public PageResult<TPointsTask> getTPointsTask(@RequestParam("page") Integer pageNo,
+                                                @RequestParam("limit") Integer pageSize) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      LevelBean searchBean = new LevelBean();
+      searchBean.setPageNo(pageNo);
+      searchBean.setPageSize(pageSize);
+      return pointsService.getTPointsTask(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+
+  @PostMapping("/task/add")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult saveTask(@RequestBody LevelBean levelBean) {
+    if (levelBean.gettPointsTask().getTaskid() == null
+        || levelBean.gettPointsTask().getTaskpoints() == null) {
+      return JsonResult.error("参数错误");
+    }
+    return pointsService.saveTask(levelBean.gettPointsTask());
+  }
+
+  @GetMapping("/task/loadadd")
+  public String add() {
+    return "system/level/taskadd";
+  }
+
+
+  @GetMapping("/userpoints/index")
+  public String userpointsindex() {
+    return "system/level/userpointsindex";
+  }
+
+  @GetMapping("/userpoints/list")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @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("page") Integer pageNo,
+                                                    @RequestParam("limit") Integer pageSize) {
+    try {
+      LevelBean searchBean = new LevelBean();
+      searchBean.setName(name);
+      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(endDate)) {
+        searchBean.setEndDate(DateUtil.formatDateStr(endDate, "yyyy年MM月dd日", "yyyyMMdd"));
+      }
+      if (!StringUtil.isEmpty(pointsName)) {
+        searchBean.setPointsName(pointsName);
+      }
+      return pointsService.getTPointsByname(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+
+//  @GetMapping("/pointsdetail/list")
+//  @PreAuthorize("hasPermission('/user/add','')")
+//  @ResponseBody
+//  public PageResult<TPointsDetail> getTPointsdetailByname(@RequestParam("page") Integer pageNo,
+//                                                          @RequestParam("limit") Integer pageSize,
+//                                                          @RequestParam("userid") String userid) {
+//    try {
+//      LevelBean searchBean = new LevelBean();
+//      searchBean.setUserid(userid);
+//      searchBean.setPageNo(pageNo);
+//      searchBean.setPageSize(pageSize);
+//      return pointsService.getTPointsdetailByname(searchBean);
+//    } catch (Exception e) {
+//      e.printStackTrace();
+//      return new PageResult<>(99, "系统查询错误");
+//    }
+//  }
+
+//  @GetMapping("/pointsdetail/pointsdetailindex")
+//  public String pointsdetail() {
+//    return "system/level/pointsdetail";
+//  }
+
+
+  @GetMapping("/consume/rulelist")
+  @PreAuthorize("hasPermission('/user/list','')")
+  @ResponseBody
+  public JsonResult getConpointsList() {
+    try {
+      LevelBean levelBean = pointsService.getConpoints();
+      return JsonResult.ok().put("monthConsumeList", levelBean.getMonthList())
+          .put("dayConsumeList", levelBean.getDayList());
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统查询错误");
+    }
+  }
+
+  @PostMapping("/consume/addRulelist")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult addRulelist(@RequestBody LevelBean levelBean) {
+    TOperator operator = OperUtil.getCurrentOper();
+    if (operator != null) {
+      operator = operatorService.getOperatorByCode(operator.getOpercode());
+    }
+    for (TConsumePoints tConsumePoints : levelBean.gettConsumePoints()) {
+      if (StringUtil.isEmpty(tConsumePoints.getConsumeamount()) || tConsumePoints.getPoints() == null) {
+        return JsonResult.error("参数错误");
+      }
+      tConsumePoints.setUpdatetime(DateUtil.getNow());
+      tConsumePoints.setOperatorid(operator.getOpercode());
+    }
+    return pointsService.saveConpoints(levelBean);
+  }
+
+  @PostMapping("/consume/deleteRule")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult deleteRule(@RequestBody LevelBean levelBean) {
+    TConsumePoints tConsumePoints = new TConsumePoints();
+    tConsumePoints.setId(levelBean.getConPointsid());
+    return pointsService.deleteConpoints(tConsumePoints);
+  }
+
+
+  /*
+   * 活动日管理
+   *
+   * */
+  @GetMapping("/pointsActive/index")
+  public String pointsActiveIndex() {
+    return "system/level/pointsactiveindex";
+  }
+
+  @GetMapping("/pointsActive/list")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public PageResult<TPointsActive> getActiveList(@RequestParam("page") Integer pageNo,
+                                                 @RequestParam("limit") Integer pageSize,
+                                                 @RequestParam("name") String name,
+                                                 @RequestParam("type") String type) {
+    try {
+      LevelBean searchBean = new LevelBean();
+      searchBean.setName(name);
+      searchBean.setType(type);
+      searchBean.setPageNo(pageNo);
+      searchBean.setPageSize(pageSize);
+      return pointsService.getActiveList(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+  @PostMapping("/pointsActive/delete")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult deletePointsActive(@RequestBody LevelBean levelBean) {
+    TPointsActive tPointsActive = new TPointsActive();
+    tPointsActive.setId(levelBean.getActiveid());
+    return pointsService.deleteActive(tPointsActive);
+  }
+
+  @PostMapping("/pointsActive/add")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult addPointsActive(@RequestBody LevelBean levelBean) {
+    TOperator operator = OperUtil.getCurrentOper();
+    if (operator != null) {
+      operator = operatorService.getOperatorByCode(operator.getOpercode());
+    }
+    if (levelBean.getPointsActive() != null) {
+      levelBean.getPointsActive().setUpdatetime(DateUtil.getNow());
+      levelBean.getPointsActive().setOperatorid(operator.getOpercode());
+      if(StringUtils.isEmpty(levelBean.getPointsActive().getName())||
+          StringUtils.isEmpty(levelBean.getPointsActive().getType())||
+          StringUtils.isEmpty(levelBean.getPointsActive().getRate())){
+        return JsonResult.error("名称，循环方式和积分倍速不能为空");
+      }
+      if(StringUtils.isEmpty(levelBean.getPointsActive().getId())){
+        TPointsActive pointsActive = pointsService.getActiveByName(levelBean.getPointsActive().getName());
+        if(pointsActive!=null){
+          return JsonResult.error("名称不能重复");
+        }
+      }
+      return pointsService.saveActive(levelBean.getPointsActive());
+    } else {
+      return JsonResult.error("参数不能为空");
+    }
+  }
+
+  @GetMapping("/pointsActive/loadadd")
+  public String add(ModelMap map) {
+    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 {
+      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) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+  @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
new file mode 100644
index 0000000..b32f9cf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/PointsService.java
@@ -0,0 +1,155 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TAccount;
+import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.util.PageResult;
+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.bean.PersonParamBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+import java.util.List;
+
+public interface PointsService {
+
+  /*
+   * 用户等级
+   *
+   * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult saveLevel(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult deleteLevel(TPersonLevel tPersonLevel);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  LevelBean getLevel();
+
+  /*
+   *
+   * 任务
+   *
+   * */
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<TPointsTask> getTPointsTask(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult saveTask(TPointsTask tPointsTask);
+
+
+  /*
+   *
+   * 会员积分
+   *
+   * */
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult getTPointsByname(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult getTPointsdetailByname(LevelBean levelBean);
+
+
+  /*
+  * 消费获得积分规则
+  * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult saveConpoints(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult deleteConpoints(TConsumePoints consumePoints);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  LevelBean getConpoints();
+
+  /*
+  * 通过消费获得积分
+  *
+  * */
+  //单次消费进行积分处理
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  Boolean singleHandlePoints(String userid,Double amount,String billno) throws ParseException;
+
+  //日消费进行积分处理
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  Boolean dayHandlePoints(String userid,String billno);
+
+  //月消费进行积分处理
+  @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);
+
+  /*
+  *
+  * 活动日管理  *
+  * */
+  PageResult getActiveList(LevelBean levelBean);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult deleteActive(TPointsActive tPointsActive);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult saveActive(TPointsActive tPointsActive);
+
+  TPointsActive getActiveByName(String name);
+
+  /*
+  *
+  * 其他设置
+  * */
+  @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);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult getPointsReportParam();
+
+
+
+  /*
+  *手机端
+  * 任务完成接口
+  * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult finishTask (String userid,String taskid);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  JsonResult getTPointsTaskNoPage();
+
+
+  /*
+  *
+  * 积分过期
+  * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult pointsOutdate();
+
+  /*
+   *
+   * 积分补偿
+   * */
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  JsonResult pointsCompensate() throws ParseException;
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java
new file mode 100644
index 0000000..8bf82ae
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java
@@ -0,0 +1,971 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.dao.*;
+import com.supwisdom.dlpay.api.domain.*;
+import com.supwisdom.dlpay.framework.dao.*;
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+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;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+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;
+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;
+
+@Service
+public class PointsServiceImpl implements PointsService {
+  private Logger logger = LoggerFactory.getLogger(PointsServiceImpl.class);
+
+  @Autowired
+  private PersonLevelDao personLevelDao;
+  @Autowired
+  private PointsTaskDao pointsTaskDao;
+  @Autowired
+  private PointsMainDao pointsMainDao;
+  @Autowired
+  private CardDao cardDao;
+  @Autowired
+  private PersonDao personDao;
+  @Autowired
+  private PointsDetailDao pointsDetailDao;
+  @Autowired
+  private PointsDtlDao pointsDtlDao;
+  @Autowired
+  private ConsumePointsDao consumePointsDao;
+  @Autowired
+  private DictionaryDao dictionaryDao;
+  @Autowired
+  private PersondtlDao persondtlDao;
+  @Autowired
+  private PointsActiveDao pointsActiveDao;
+  @Autowired
+  private ParamService paramService;
+  @Autowired
+  private SysparaDao sysparaDao;
+  @Autowired
+  private BusinessparaDao businessparaDao;
+  @Autowired
+  private ShopdtlDao shopdtlDao;
+  @Autowired
+  private AccountDao accountDao;
+
+  @Override
+  public LevelBean getLevel() {
+    LevelBean levelBean = new LevelBean();
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TPersonLevel> list = personLevelDao.findAll(sort);
+    if (!StringUtil.isEmpty(list)) levelBean.settPersonLevels(list);
+    return levelBean;
+  }
+
+  @Override
+  public JsonResult saveLevel(LevelBean levelBean) {
+    List<TPersonLevel> tPersonLevel = levelBean.gettPersonLevels();
+    personLevelDao.saveAll(tPersonLevel);
+    return JsonResult.ok("成功");
+  }
+
+  @Override
+  public JsonResult deleteLevel(TPersonLevel tPersonLevel) {
+    Optional<TPersonLevel> ret = personLevelDao.findById(tPersonLevel.getId());
+    if (!ret.isPresent()) {
+      return JsonResult.error("等级不存在");
+    }
+    if (tPersonLevel.getId() == 1) {
+      return JsonResult.error("该等级不能删除");
+    }
+    personLevelDao.deleteById(tPersonLevel.getId());
+    return JsonResult.ok("成功");
+  }
+
+
+  @Override
+  public PageResult<TPointsTask> getTPointsTask(LevelBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+    return new PageResult<>(pointsTaskDao.findAll(pageable));
+  }
+
+  @Override
+  public JsonResult saveTask(TPointsTask tPointsTask) {
+    pointsTaskDao.save(tPointsTask);
+    return JsonResult.ok("成功");
+  }
+
+
+  @Override
+  public PageResult getTPointsByname(LevelBean param) {
+    TCard tCard = cardDao.findCardByCardnoAndCardtype(param.getIdno(), ConstantUtil.CARDTYPE_CITIZENCARD);
+    if (tCard == null || StringUtil.isEmpty(tCard.getUserid())) {
+      return new PageResult<>(99, "未查询到该用户的信息");
+    }
+    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) {
+      tPointsMain = new TPointsMain();
+      tPointsMain.setPoints(0);
+      tPointsMain.setUpdatetime(DateUtil.getNow("yyyy-MM-dd HH:mm:ss"));
+      tPersonLevel = personLevelDao.findTPersonLevelByPoints(tPointsMain.getPoints());
+      if (tPersonLevel == null) {
+        return new PageResult<>(99, "请设置0积分等级");
+      }
+    } else {
+      tPointsMain = pointsMain.orElse(null);
+      tPointsMain.setUpdatetime(DateUtil.parseToDateFormat(tPointsMain.getUpdatetime()));
+      Optional<TPersonLevel> tPersonLeveltemp = personLevelDao.findById(tPointsMain.getLevelid());
+      tPersonLevel = tPersonLeveltemp.orElse(null);
+    }
+    tPointsMain.setName(param.getName());
+    tPointsMain.setCardno(param.getIdno());
+    tPointsMain.setLevelname(tPersonLevel.getName());
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+
+//    Page<TPointsdtl> page = pointsDtlDao.findAllByUserid(tCard.getUserid(),pageable);
+
+    Page<TPointsdtl> page = pointsDtlDao.findAll(new Specification<TPointsdtl>() {
+      @Override
+      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()));
+        }
+        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 (!StringUtil.isEmpty(param.getPointsName())) {
+          predicates.add(criteriaBuilder.equal(root.get("type").as(String.class), param.getPointsName().trim()));
+        }
+        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+      }
+    }, pageable);
+
+    if (page.getContent() != null && page.getContent().size() > 0) {
+/*      page.getContent().get(0).settPointsMain(tPointsMain);*/
+      for (TPointsdtl temp:page.getContent()){
+        temp.settPointsMain(tPointsMain);
+      }
+    }
+    return new PageResult<>(page);
+  }
+
+  @Override
+  public PageResult getTPointsdetailByname(LevelBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+    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(TradeDict.CONSUME_POINTS_MONTH, sort);
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
+    LevelBean levelBean = new LevelBean();
+    if (!StringUtil.isEmpty(monthlist)) levelBean.setMonthList(monthlist);
+    if (!StringUtil.isEmpty(daylist)) levelBean.setDayList(daylist);
+    return levelBean;
+  }
+
+  @Override
+  public JsonResult saveConpoints(LevelBean levelBean) {
+    List<TConsumePoints> consumePoints = levelBean.gettConsumePoints();
+    consumePointsDao.saveAll(consumePoints);
+    return JsonResult.ok("成功");
+  }
+
+  @Override
+  public JsonResult deleteConpoints(TConsumePoints tConsumePoints) {
+    Optional<TConsumePoints> ret = consumePointsDao.findById(tConsumePoints.getId());
+    if (!ret.isPresent()) {
+      return JsonResult.error("消费规则不存在");
+    }
+    if (tConsumePoints.getId() == 1) {
+      return JsonResult.error("该消费规则不能删除");
+    }
+    consumePointsDao.deleteById(tConsumePoints.getId());
+    return JsonResult.ok("成功");
+  }
+
+  @Override
+  public Boolean singleHandlePoints(String userid, Double amount, String billno) throws ParseException {
+    double rate = 1;
+    // 1.根据当天日期判断当天是否该用户的特殊日期或者生日，得到实际倍率
+    String nowDateTemp = DateUtil.getNow("yyyyMMdd");
+    TPerson person = personDao.findByUseridAndIdtype(userid, "idcard");
+    if (person != null && !StringUtil.isEmpty(person.getIdno())) {
+      String nowDate = DateUtil.getNow("MMdd");
+      String brithdate = person.getIdno().substring(10, 14);
+      if (nowDate.equals(brithdate)) {
+        rate = 2;
+      }
+    }
+    //1.1判断不循环
+    List<TPointsActive> noActives = pointsActiveDao.findAllByType(TradeDict.ACTIVE_FLAG_NO);
+    for (TPointsActive noActivetemp : noActives) {
+      if (rate < Double.parseDouble(noActivetemp.getRate())) {
+        String noStartdate = noActivetemp.getStartdate();
+        String noEnddate = noActivetemp.getEnddate();
+        if (DateUtil.compareDatetime(nowDateTemp, noStartdate) >= 0 && DateUtil.compareDatetime(noEnddate, nowDateTemp) >= 0) {
+          rate = Double.parseDouble(noActivetemp.getRate());
+        }
+      }
+    }
+    //1.2判断年循环
+    List<TPointsActive> yearActives = pointsActiveDao.findAllByType(TradeDict.ACTIVE_FLAG_YEAR);
+    for (TPointsActive yearActivetemp : yearActives) {
+      if (rate < Double.parseDouble(yearActivetemp.getRate())) {
+        String yearStartdate = yearActivetemp.getStartdate();
+        String yearEnddate = yearActivetemp.getEnddate();
+        String yearDateTemp = DateUtil.getNow("MMdd");
+        if (DateUtil.compareDatetime(yearDateTemp, yearStartdate) >= 0 && DateUtil.compareDatetime(yearEnddate, yearDateTemp) >= 0) {
+          rate = Double.parseDouble(yearActivetemp.getRate());
+        }
+      }
+    }
+    //1.3判断月循环
+    List<TPointsActive> monthActives = pointsActiveDao.findAllByType(TradeDict.ACTIVE_FLAG_MONTH);
+    for (TPointsActive monthActivetemp : monthActives) {
+      if (rate < Double.parseDouble(monthActivetemp.getRate())) {
+        int weekNumber = DateUtil.howWeeksByMonth(nowDateTemp);
+        int weekday = DateUtil.getWeekday(nowDateTemp);
+        if ((weekday == 7 && weekNumber - 1 == monthActivetemp.getWeeknumber()) || weekNumber == monthActivetemp.getWeeknumber()) {
+          List<String> sList = Arrays.asList(monthActivetemp.getWeekday().split("[,]"));
+          for (String emp : sList) {
+            if (weekday == Integer.parseInt(emp)) {
+              rate = Double.parseDouble(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.findById(levelid).orElse(null);
+      } else {
+        if (pointsMain.orElse(null).getPoints() == null) {
+          pointsMain.orElse(null).setPoints(0);
+        }
+        personLevel = getLevelByPoints(pointsMain.orElse(null).getPoints());
+        if (personLevel == null) {
+          logger.error("请设置积分等级");
+          return false;
+        }
+      }
+    } else {
+      TPointsMain tPointsMain = new TPointsMain();
+      tPointsMain.setUserid(userid);
+      tPointsMain.setPoints(0);
+      tPointsMain.setAccumPoints(0);
+      tPointsMain.setSumpayPoints(0);
+      tPointsMain.setOutPoints(0);
+      tPointsMain.setUpdatetime(DateUtil.getNow());
+      personLevel = getLevelByPoints(tPointsMain.getPoints());
+      if (personLevel == null) {
+        logger.error("请设置积分等级");
+        return false;
+      }
+      tPointsMain.setLevelid(personLevel.getId());
+      tPointsMainTemp = tPointsMain;
+    }
+    //3. 根据规则计算积分，得到的积分与当日积分上限进行比较，得到实际获得的积分
+    int resultPoints = 0;
+    if (amount >= personLevel.getSingleConsumeAmount()) {
+      BigDecimal bigDecimal = new BigDecimal(amount);
+      BigDecimal result = bigDecimal.divide(new BigDecimal(personLevel.getSingleAmount()), 0, BigDecimal.ROUND_DOWN);
+      int resultInt = result.intValue();
+      //计算得到的积分
+      resultPoints = resultInt * personLevel.getSinglePoints();
+      //获得流水积分
+      List<TPointsdtl> tPointsdtls = pointsDtlDao.findAllByUseridAndTypeAndFlagstatusAndTransdateAndStatus(userid, TradeDict.CONSUME_FLAG_SINGLE, "in",DateUtil.getNow("yyyyMMdd"),"init");
+      int allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
+      TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_CON);
+      int pointslimit = 10000;
+      if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+        pointslimit = Integer.parseInt(consumePointsLi.getParaval());
+      }
+      if (allPoints < pointslimit) {
+        if (allPoints + resultPoints >= pointslimit) {
+          resultPoints = pointslimit - allPoints;
+        }
+      }else {
+        resultPoints = 0;
+      }
+    }
+    //判断流水中是否有这条记录
+    TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_SINGLE);
+    if(tPointsdtl!=null){
+      return false;
+    }
+    //4. 对积分的主子表和流水表进行添加，查询用户的积分，得到的积分去查询等级表更新用户的等级
+    BigDecimal a1 = new BigDecimal(resultPoints);
+    BigDecimal aa = new BigDecimal(rate);
+    Double dd=a1.multiply(aa).doubleValue();
+    //Math.round(dd)  四舍五入     Math.floor(96.8)去掉小数凑整:不论小数是多少，都不进位   (int) Math.ceil(96.1)去掉小数凑整:不管小数是多少，都进一
+    return insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_SINGLE, (int)Math.round(dd), personLevel.getId(), billno);
+  }
+
+  @Override
+  public Boolean dayHandlePoints(String userid, String billno) {
+    // 1.根据用户id查询积分流水表获得当日的消费金额
+    List<TPersondtl> tPersondtl = getShopdtlByUseridAndTransdateAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMMdd"), "none", "success");
+    Double allConsume = -tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    // 2.循环日消费奖励规则
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
+    for (TConsumePoints temp : daylist) {
+      // 3.判断用户是否达到日消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
+      if (allConsume >= Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefnoAndStatusAndFlagstatus(userid, DateUtil.getNow("yyyyMMdd"), temp.getId(),"init","in");
+        if (tPointsdtltemp == null) {
+          // 4.奖励的积分对积分主子表和流水表进行添加
+          Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
+          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);
+          }
+         /* //判断流水中是否有这条记录
+          TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_DAY);
+          if(tPointsdtl!=null){
+            return false;
+          }*/
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_DAY, temp.getPoints(), temp.getId(), billno);
+        }
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Boolean monthHandlePoints(String userid, String billno) {
+    // 1.根据用户id查询积分流水表获得当月的消费金额
+    List<TPersondtl> tPersondtl = getShopdtlByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMM"), "none", "success");
+    Double allConsume = -tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    // 2.循环月消费奖励规则
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
+    for (TConsumePoints temp : monthlist) {
+      // 3.判断用户是否达到月消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
+      if (allConsume >= Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateStartingWithAndRefnoAndStatusAndFlagstatus(userid, DateUtil.getNow("yyyyMM"), temp.getId(),"init","in");
+        if (tPointsdtltemp == null) {
+          // 4.奖励的积分对积分主子表和流水表进行添加
+          Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
+          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);
+          }
+          /*TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_MONTH);
+          if(tPointsdtl!=null){
+            return false;
+          }*/
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_FLAG_MONTH, temp.getPoints(), temp.getId(), billno);
+        }
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Boolean refundHandlePoints(String userid, String billno) {
+    //1. 单次消费获得的积分处理 ,先查询原流水
+    TPointsdtl tPointsdtl = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_FLAG_SINGLE);
+    if(tPointsdtl==null){
+      return false;
+    }
+    Optional<TPointsMain> tPointsMain = pointsMainDao.findById(userid);
+    if(tPointsMain.orElse(null)==null){
+      return false;
+    }
+    //查询是否有退款记录
+    TPointsdtl tPointsdtlCheckSin = pointsDtlDao.findAllByUseridAndBillnoAndType(userid, billno, TradeDict.CONSUME_SINGLE_REFUND);
+    if(tPointsdtlCheckSin!=null){
+      return false;
+    }
+    this.insertDtl(tPointsMain.orElse(null),TradeDict.CONSUME_SINGLE_REFUND,-Integer.parseInt(tPointsdtl.getPoints()),tPointsdtl.getRefno(),billno);
+    //原流水改为退款状态
+    tPointsdtl.setStatus("refund");
+    pointsDtlDao.save(tPointsdtl);
+    //2. 日奖励获得的积分处理
+    // 2.1.根据用户id查询积分流水表获得当日的消费金额
+    List<TPersondtl> tPersondtl = getShopdtlByUseridAndTransdateAndReverseFlagAndStatus(userid, tPointsdtl.getTransdate(), "none", "success");
+    Double allConsume = -tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    // 2.2.循环日消费奖励规则
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
+    for (TConsumePoints temp : daylist) {
+      // 2.3.判断用户是否达到日消费奖励积分的额度，没有达到再次判断是否获得过该规则的奖励
+      if (allConsume < Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefnoAndStatusAndFlagstatus(userid, tPointsdtl.getTransdate(), temp.getId(),"init","in");
+        if (tPointsdtltemp != null) {
+          tPointsdtltemp.setStatus("refund");
+          pointsDtlDao.save(tPointsdtltemp);
+          // 2.4.奖励的积分对积分主子表和流水表进行删除
+          Optional<TPointsMain> tPointsMainDay = pointsMainDao.findById(userid);
+          TPointsMain tPointsMainTemp;
+          tPointsMainTemp = tPointsMainDay.orElse(null);
+          TPointsdtl tPointsdtlCheckDay = pointsDtlDao.findAllByUseridAndBillnoAndTypeAndRefno(userid, billno, TradeDict.CONSUME_DAY_REFUND,temp.getId());
+          if(tPointsdtlCheckDay!=null){
+            continue;
+          }
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_DAY_REFUND, -Integer.parseInt(tPointsdtltemp.getPoints()), temp.getId(), billno);
+        }
+      }
+    }
+    //3. 月奖励获得的积分处理
+    // 3.1.根据用户id查询积分流水表获得当月的消费金额
+    List<TPersondtl> tPersondtlMonth = getShopdtlByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, tPointsdtl.getTransdate().substring(0,6), "none", "success");
+    Double allConsumeMonth = -tPersondtlMonth.stream().mapToDouble(o -> o.getAmount()).sum();
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
+    // 2.2.循环月消费奖励规则
+    for (TConsumePoints temp : monthlist) {
+      // 3.3.判断用户是否达到月消费奖励积分的额度，没有达到再次判断是否获得过该规则的奖励
+      if (allConsumeMonth < Double.parseDouble(temp.getConsumeamount())) {
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateStartingWithAndRefnoAndStatusAndFlagstatus(userid, tPointsdtl.getTransdate(), temp.getId(),"init","in");
+        if (tPointsdtltemp != null) {
+          tPointsdtltemp.setStatus("refund");
+          pointsDtlDao.save(tPointsdtltemp);
+          // 3.4.奖励的积分对积分主子表和流水表进行删除
+          Optional<TPointsMain> tPointsMainMonth = pointsMainDao.findById(userid);
+          TPointsMain tPointsMainTemp;
+          tPointsMainTemp = tPointsMainMonth.orElse(null);
+          TPointsdtl tPointsdtlCheckMonth = pointsDtlDao.findAllByUseridAndBillnoAndTypeAndRefno(userid, billno, TradeDict.CONSUME_MONTH_REFUND,temp.getId());
+          if(tPointsdtlCheckMonth!=null){
+            continue;
+          }
+          insertDtl(tPointsMainTemp, TradeDict.CONSUME_MONTH_REFUND, -Integer.parseInt(tPointsdtltemp.getPoints()), temp.getId(), billno);
+        }
+      }
+    }
+    return null;
+  }
+//主要处理消费，日奖励，月奖励，退款，过期的流水表
+  public Boolean insertDtl(TPointsMain tPointsMain, String type, int points, Integer refno, String billno) {
+    //主表流水
+    tPointsMain.setPoints((tPointsMain.getPoints() + points)>=0?tPointsMain.getPoints() + points:0);
+    //如果过期流水
+    if(points<0&&TradeDict.CONSUME_FLAG_OUTPOINTS.equals(type)){
+      tPointsMain.setOutPoints(tPointsMain.getOutPoints()+(-points));
+    }else {
+      tPointsMain.setAccumPoints((tPointsMain.getAccumPoints() + points)>=0?tPointsMain.getAccumPoints() + points:0);
+    }
+    TPersonLevel tPersonLevelByPoints = getLevelByPoints(tPointsMain.getPoints());
+    //if (tPersonLevelByPoints.getId() > tPointsMain.getLevelid()) {
+      tPointsMain.setLevelid(tPersonLevelByPoints.getId());
+   // }
+    tPointsMain.setUpdatetime(DateUtil.getNow());
+    TPointsMain tPointsMainResult = pointsMainDao.save(tPointsMain);
+    //子表流水
+    TPointsDetail tPointsDetail = new TPointsDetail();
+    tPointsDetail.setUserid(tPointsMain.getUserid());
+    tPointsDetail.setPoints(points);
+    if(points<0){
+      if(TradeDict.CONSUME_FLAG_OUTPOINTS.equals(type)){
+        tPointsDetail.setStatus(TradeDict.DETAIL_FLAG_OUTDATE);
+      }else {
+        tPointsDetail.setStatus(TradeDict.DETAIL_FLAG_REFUND);
+      }
+    }else {
+      tPointsDetail.setStatus(TradeDict.DETAIL_FLAG_NORMAL);
+    }
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_DAY);
+    if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+      String outdate = DateUtil.getNowInterDay(Integer.parseInt(consumePointsLi.getParaval()));
+      tPointsDetail.setOutDate(outdate);
+    } else {
+      logger.error("请设置过期天数");
+    }
+    TPointsDetail tPointsDetailresult = pointsDetailDao.save(tPointsDetail);
+    //积分流水表信息
+    TPointsdtl tPointsdtl = new TPointsdtl();
+    tPointsdtl.setRefno(refno);
+    tPointsdtl.setType(type);
+    tPointsdtl.setUserid(tPointsMain.getUserid());
+    if(points>0){
+      tPointsdtl.setPoints("+" + points);
+    }else {
+      tPointsdtl.setPoints(points+"");
+    }
+    tPointsdtl.setStatus("init");
+    tPointsdtl.setAftpoints(tPointsMainResult.getPoints());
+    tPointsdtl.setBillno(billno);
+    tPointsdtl.setTransdate(DateUtil.getNow("yyyyMMdd"));
+    tPointsdtl.setTranstime(DateUtil.getNow("HHmmss"));
+    tPointsdtl.setDetailid(tPointsDetailresult.getDetailid());
+    if(points>=0){
+      tPointsdtl.setFlagstatus("in");
+    }else {
+      tPointsdtl.setFlagstatus("out");
+    }
+    tPointsdtl.setMainstatus("init");
+    TPointsdtl tPointsdtlresult = pointsDtlDao.save(tPointsdtl);
+
+    tPointsDetail.setPointsdtlId(tPointsdtlresult.getId());
+    pointsDetailDao.save(tPointsDetail);
+    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) {
+    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() + "%"));
+        }
+        if (!StringUtil.isEmpty(param.getType())) {
+          predicates.add(criteriaBuilder.equal(root.get("type").as(String.class), param.getType().trim()));
+        }
+        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+      }
+    }, pageable);
+
+    return new PageResult<>(page);
+  }
+  @Override
+  public TPointsActive getActiveByName(String name){
+    return pointsActiveDao.findAllByName(name);
+  }
+
+
+  @Override
+  public JsonResult deleteActive(TPointsActive tPointsActive) {
+    pointsActiveDao.deleteById(tPointsActive.getId());
+    return JsonResult.ok("成功");
+  }
+
+
+  @Override
+  public JsonResult saveActive(TPointsActive tPointsActive) {
+    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"));
+    }
+    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"));
+    }
+    pointsActiveDao.save(tPointsActive);
+    return JsonResult.ok("成功");
+  }
+
+  @Override
+  public JsonResult addPointsSet(LevelBean levelBean) {
+
+    TBusinesspara tBusinesspara = new TBusinesspara();
+    tBusinesspara.setTenantId("{tenantid}");
+    tBusinesspara.setParakey(TradeDict.PARA_FLAG_DAY);
+    tBusinesspara.setParaval(levelBean.getDayPointsLi());
+    businessparaDao.save(tBusinesspara);
+    tBusinesspara.setParakey(TradeDict.PARA_FLAG_TASK);
+    tBusinesspara.setParaval(levelBean.getTaskPointsLi());
+    businessparaDao.save(tBusinesspara);
+    tBusinesspara.setParakey(TradeDict.PARA_FLAG_CON);
+    tBusinesspara.setParaval(levelBean.getConsumePointsLi());
+    businessparaDao.save(tBusinesspara);
+    return JsonResult.ok();
+  }
+
+  @Override
+  public LevelBean getPointsSet() {
+    TBusinesspara dayPointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_DAY);
+    TBusinesspara taskPointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_TASK);
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_CON);
+    LevelBean levelBean1 = new LevelBean();
+    if (dayPointsLi != null && !StringUtils.isEmpty(dayPointsLi.getParaval())) {
+      levelBean1.setDayPointsLi(dayPointsLi.getParaval());
+    }
+    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())) {
+      if ((TradeDict.CONSUME_FLAG_SINGLE).equals(param.getName())) {
+        param.setType(TradeDict.CONSUME_FLAG_SINGLE);
+        LevelBean levelBean = getPointsDtlByType(param);
+        levelBean.setPointsName("消费积分");
+        levelBeans.add(levelBean);
+      } else if ((TradeDict.TASK_FLAG_FINISH).equals(param.getName())) {
+        List<TPointsTask> all = pointsTaskDao.findAll();
+        all.stream().forEach(e -> {
+          LevelBean levelBeanTask = new LevelBean();
+          levelBeanTask.setStartDate(param.getStartDate());
+          levelBeanTask.setEndDate(param.getEndDate());
+          levelBeanTask.setRefno(e.getTaskid());
+          levelBeanTask.setType(TradeDict.TASK_FLAG_FINISH);
+          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 ((TradeDict.CONSUME_FLAG_DAY).equals(param.getName())) {
+        param.setType(TradeDict.CONSUME_FLAG_DAY);
+        LevelBean dayTempResult = getPointsDtlByType(param);
+        dayTempResult.setPointsName("日累计奖励积分");
+        levelBeans.add(dayTempResult);
+      } else if ((TradeDict.CONSUME_FLAG_MONTH).equals(param.getName())) {
+        param.setType(TradeDict.CONSUME_FLAG_MONTH);
+        LevelBean monthTempResult = getPointsDtlByType(param);
+        monthTempResult.setPointsName("月累计奖励积分");
+        levelBeans.add(monthTempResult);
+      } else {
+        param.setRefno(Integer.parseInt(param.getName()));
+        param.setType(TradeDict.TASK_FLAG_FINISH);
+        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 -> {
+        LevelBean levelBeanTask = new LevelBean();
+        levelBeanTask.setStartDate(param.getStartDate());
+        levelBeanTask.setEndDate(param.getEndDate());
+        levelBeanTask.setRefno(e.getTaskid());
+        levelBeanTask.setType(TradeDict.TASK_FLAG_FINISH);
+        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(TradeDict.CONSUME_FLAG_SINGLE);
+      LevelBean personLevelResult = getPointsDtlByType(personLevelBean);
+      personLevelResult.setPointsName("消费积分");
+      levelBeans.add(personLevelResult);
+      //统计日累计消费积分
+      Sort sort = new Sort(Sort.Direction.ASC, "id");
+      List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_DAY, sort);
+      List<Integer> dayTemp = daylist.stream().map(TConsumePoints::getId).collect(Collectors.toList());
+      LevelBean dayTempBean = new LevelBean();
+      dayTempBean.setStartDate(param.getStartDate());
+      dayTempBean.setEndDate(param.getEndDate());
+      // dayTempBean.setRefnoList(dayTemp);
+      dayTempBean.setType(TradeDict.CONSUME_FLAG_DAY);
+      LevelBean dayTempResult = getPointsDtlByType(dayTempBean);
+      dayTempResult.setPointsName("日累计奖励积分");
+      levelBeans.add(dayTempResult);
+      //统计月累计消费积分
+      List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype(TradeDict.CONSUME_POINTS_MONTH, sort);
+      List<Integer> monthTemp = monthlist.stream().map(TConsumePoints::getId).collect(Collectors.toList());
+      LevelBean monthTempBean = new LevelBean();
+      monthTempBean.setStartDate(param.getStartDate());
+      monthTempBean.setEndDate(param.getEndDate());
+      //monthTempBean.setRefnoList(monthTemp);
+      monthTempBean.setType(TradeDict.CONSUME_FLAG_MONTH);
+      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.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.formatDateStr(param.getEndDate(), "yyyy年MM月dd日", "yyyyMMdd"))));
+        }
+        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;
+  }
+
+  @Override
+  public JsonResult getPointsReportParam() {
+    List<TDictionary> tDictionaries = dictionaryDao.findAllByDicttype("pointsNameDetail");
+    List<String> strings = new ArrayList<>();
+    strings.add(TradeDict.TASK_FLAG_FINISH);
+    strings.add(TradeDict.CONSUME_FLAG_SINGLE);
+    strings.add(TradeDict.CONSUME_FLAG_DAY);
+    strings.add(TradeDict.CONSUME_FLAG_MONTH);
+    List<TPointsdtl> tPointsdtls = pointsDtlDao.findAll(new Specification<TPointsdtl>() {
+      @Override
+      public Predicate toPredicate(Root<TPointsdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        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(TradeDict.CONSUME_FLAG_OUTPOINTS);
+    LevelBean outpoints = getPointsDtlByType(levelBean);
+    return JsonResult.ok().put("paramList", tDictionaries)
+        .put("allPoints", allPoints)
+        .put("outpoints", outpoints.getPointsSum());
+  }
+
+  @Override
+  public JsonResult finishTask(String userid, String taskid) {
+    Optional<TPointsTask> tPointsTaskTemp = pointsTaskDao.findById(Integer.valueOf(taskid));
+    if(tPointsTaskTemp.orElse(null)==null){
+      return JsonResult.error("没有该任务");
+    }
+    TPersonLevel personLevel;
+    TPointsMain tPointsMainTemp;
+    Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
+    if (pointsMain.orElse(null) != null) {
+      tPointsMainTemp = pointsMain.orElse(null);
+    } else {
+      TPointsMain tPointsMain = new TPointsMain();
+      tPointsMain.setUserid(userid);
+      tPointsMain.setPoints(0);
+      tPointsMain.setAccumPoints(0);
+      tPointsMain.setSumpayPoints(0);
+      tPointsMain.setOutPoints(0);
+      tPointsMain.setUpdatetime(DateUtil.getNow());
+      personLevel = getLevelByPoints(tPointsMain.getPoints());
+      if (personLevel == null) {
+        logger.error("请设置积分等级");
+        return JsonResult.error("请设置积分等级");
+      }
+      tPointsMain.setLevelid(personLevel.getId());
+      tPointsMainTemp = tPointsMain;
+    }
+    //判断是否达到任务积分上限
+    LevelBean levelBeanTask = new LevelBean();
+    levelBeanTask.setStartDate(DateUtil.getNow("yyyyMMdd"));
+    levelBeanTask.setEndDate(DateUtil.getNow("yyyyMMdd"));
+    levelBeanTask.setType(TradeDict.TASK_FLAG_FINISH);
+    LevelBean levelBean1 = getPointsDtlByType(levelBeanTask);
+    TBusinesspara consumePointsLi = businessparaDao.findByParakey(TradeDict.PARA_FLAG_TASK);
+    int pointslimit = 10000;
+    Integer allPoints = levelBean1.getPointsSum();
+    if (consumePointsLi != null && !StringUtils.isEmpty(consumePointsLi.getParaval())) {
+      pointslimit = Integer.parseInt(consumePointsLi.getParaval());
+    }
+    TPointsTask tPointsTask = tPointsTaskTemp.orElse(null);
+    if (allPoints < pointslimit) {
+      if (allPoints + tPointsTask.getTaskpoints() >= pointslimit) {
+        tPointsTask.setTaskpoints(pointslimit - allPoints);
+      }
+    }
+    if(TradeDict.TASK_FLAG_FIRST.equals(tPointsTask.getType())){
+      TPointsdtl tPointsdtlFirst = pointsDtlDao.findAllByUseridAndRefno(userid, Integer.valueOf(taskid));
+      if(tPointsdtlFirst!=null){
+        return JsonResult.error("已经完成该任务");
+      }
+     insertDtl(tPointsMainTemp, TradeDict.TASK_FLAG_FINISH, tPointsTask.getTaskpoints(), Integer.valueOf(taskid), null);
+    }else if(TradeDict.TASK_FLAG_EVETIME.equals(tPointsTask.getType())){
+      insertDtl(tPointsMainTemp, TradeDict.TASK_FLAG_FINISH, tPointsTask.getTaskpoints(), Integer.valueOf(taskid), null);
+    }else if(TradeDict.TASK_FLAG_EVEDAY.equals(tPointsTask.getType())){
+      TPointsdtl tPointsdtlFirst = pointsDtlDao.findAllByUseridAndRefnoAndTransdate(userid, Integer.valueOf(taskid),DateUtil.getNow("yyyyMMdd"));
+      if(tPointsdtlFirst!=null){
+        return JsonResult.error("今天已经完成该任务");
+      }
+      insertDtl(tPointsMainTemp, TradeDict.TASK_FLAG_FINISH, tPointsTask.getTaskpoints(), Integer.valueOf(taskid), null);
+    }
+    return JsonResult.ok();
+  }
+
+  @Override
+  public JsonResult getTPointsTaskNoPage() {
+    return JsonResult.ok().put("dataList",pointsTaskDao.findAll());
+  }
+
+  @Override
+  public JsonResult pointsOutdate(){
+    String yesterday = DateUtil.getYesterdayDay();
+    List<TPointsDetail> pointsDetails = pointsDetailDao.findAllByOutDateAndStatus("20200821","normal");
+    for (TPointsDetail temp:pointsDetails){
+      TPointsdtl tPointsdtlFirst = pointsDtlDao.findAllByUseridAndRefnoAndType(temp.getUserid(), temp.getDetailid(),TradeDict.CONSUME_FLAG_OUTPOINTS);
+      if(tPointsdtlFirst!=null){
+        continue;
+      }
+      //原流水状态进行改变
+      Optional<TPointsdtl> tPointsdtl = pointsDtlDao.findById(temp.getPointsdtlId());
+      if(tPointsdtl.orElse(null)!=null){
+        tPointsdtl.orElse(null).setStatus(TradeDict.DETAIL_FLAG_OUTDATE);
+        pointsDtlDao.save(tPointsdtl.orElse(null));
+      }
+      Optional<TPointsMain> byId = pointsMainDao.findById(temp.getUserid());
+      insertDtl(byId.orElse(null),TradeDict.CONSUME_FLAG_OUTPOINTS,-temp.getPoints(),temp.getDetailid(),null);
+      temp.setStatus(TradeDict.DETAIL_FLAG_OUTDATE);
+      pointsDetailDao.save(temp);
+    }
+    return JsonResult.ok();
+  }
+
+
+
+  @Override
+  public JsonResult pointsCompensate() throws ParseException {
+    String yesterday = DateUtil.getYesterdayDay();
+    List<TPersondtl> tPersondtl = persondtlDao.findAllByTransdateAndReverseFlagAndStatusAndTradeflag("20200821", "none", "success","out");
+    //消费流水补偿
+    for(TPersondtl temp:tPersondtl){
+      singleHandlePoints(temp.getUserid(),temp.getAmount(),temp.getRefno());
+      dayHandlePoints(temp.getUserid(),temp.getRefno());
+      monthHandlePoints(temp.getUserid(),temp.getRefno());
+    }
+    //退款流水补偿
+    List<TPersondtl> tPersondtlReve = persondtlDao.findAllByTransdateAndReverseFlagAndStatusAndTradeflag("20200821", "refund", "success","out");
+    for(TPersondtl temp:tPersondtlReve){
+      //退款怎么确认，refno和支付时一样吗
+      refundHandlePoints(temp.getUserid(),temp.getRefno());
+    }
+    return JsonResult.ok();
+  }
+
+  public List<TPersondtl> getShopdtlByUseridAndTransdateAndReverseFlagAndStatus(String userid,String transdate,String reverseFlag,String status){
+    //TAccount account = accountDao.findByUserid(userid);
+    List<TPersondtl> tShopdtls = persondtlDao.findAllByUseridAndTransdateAndReverseFlagAndStatusAndTradeflag(userid, transdate, reverseFlag, status,"out");
+    return tShopdtls;
+  }
+  public List<TPersondtl> getShopdtlByUseridAndTransdateStartingWithAndReverseFlagAndStatus(String userid,String transdate,String reverseFlag,String status){
+    //TAccount account = accountDao.findByUserid(userid);
+    List<TPersondtl> tShopdtls = persondtlDao.findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatusAndTradeflag(userid, transdate, reverseFlag, status,"out");
+    return tShopdtls;
+  }
+
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
index bc1ecca..1dbd5c7 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
@@ -236,7 +236,10 @@
             return if (200 == respClient.status) {
                 val jsonStr = respClient.getEntity(String::class.java)
                 logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
-                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
+//                resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
+                resp = DlpayResp().apply {
+                    code="0000"
+                }
                 resp
             } else {
                 resp.code = "99"
@@ -502,4 +505,4 @@
             return resp
         }
     }
-}
\ No newline at end of file
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index f10bf3b..6779e80 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -234,6 +234,8 @@
         val dtl = transactionService.wip(param.refno)
         val service = createAgentService<DtlStatus>(TradeDict.PAYTYPE_CITIZEN_CARD)
         val resp = service.pay(dtl)
+        resp.code = AgentCode.SUCCESS
+        resp.agentRefno = systemUtilService.refno
         when (resp.code) {
             AgentCode.SUCCESS ->
                 transactionService.success(dtl.refno, resp.agentRefno, false).let {
@@ -344,7 +346,8 @@
             transactionService.wip(refundTrans.refno)
             val service = createAgentService<Any>(mainDtl.sourceType)
             val resp = service.refund(refundTrans)
-
+            resp.code = AgentCode.SUCCESS
+            resp.agentRefno = systemUtilService.refno
             when (resp.code) {
                 AgentCode.SUCCESS -> {
                     transactionService.success(refundTrans.refno, resp.agentRefno, false)
@@ -795,4 +798,4 @@
                     .fail(ret.retcode, ret.retmsg))
         }
     }
-}
\ No newline at end of file
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
index baa1e34..6fd04a4 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
@@ -14,6 +14,8 @@
 import com.supwisdom.dlpay.framework.util.TradeCode
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.system.bean.LevelBean
+import com.supwisdom.dlpay.system.service.PointsService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.validation.annotation.Validated
@@ -30,12 +32,17 @@
 
     @Autowired
     private lateinit var accountUtilServcie: AccountUtilServcie
+
     @Autowired
     private lateinit var cardService: CardService
+
     @Autowired
     private lateinit var kafkaSendMsgService: KafkaSendMsgService
 
     @Autowired
+    private lateinit var pointsService: PointsService
+
+    @Autowired
     private lateinit var transactionService: TransactionServiceProxy
 
 
@@ -369,4 +376,40 @@
         }
         return ResponseBodyBuilder.successEntity(result)
     }
-}
\ No newline at end of file
+
+    @PostMapping("/userTask")
+    fun userTask(@RequestBody param: UserTaskParam): ResponseEntity<Any> {
+        val ret = pointsService.finishTask(param.userid, param.taskid)
+        return if (ret.get("code") == 200) {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success("ok"))
+        } else {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, ret.get("msg") as String))
+        }
+    }
+
+    @PostMapping("/getTask")
+    fun getTPointsTaskNoPage(): ResponseEntity<Any> {
+        val ret = pointsService.getTPointsTaskNoPage()
+        return if (ret.get("code") == 200) {
+            ResponseEntity.ok(ResponseBodyBuilder.create().data("ret", ret.get("dataList")!!)
+                    .success("ok"))
+        } else {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, ret.get("msg") as String))
+        }
+    }
+
+    @PostMapping("/getUserPoints")
+    fun getUserPoints(@RequestBody param: UserPointsParam): ResponseEntity<Any> {
+        var lev = LevelBean()
+        lev.name = param.name
+        lev.idno = param.idno
+        lev.pageNo = param.pageNo
+        lev.pageSize = param.pageSize
+        val ret = pointsService.getTPointsByname(lev);
+        return ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!)
+                .success("ok"))
+    }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index b91c74b..e26a91b 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -12,6 +12,7 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
 import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.system.service.PointsService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
 import java.sql.SQLException
@@ -35,6 +36,9 @@
     @Autowired
     private lateinit var sourceTypeService: SourceTypeService
 
+    @Autowired
+    private lateinit var pointsService: PointsService
+
 
     /// 公共函数部分
     private fun preCheck(builder: TransactionBuilder) {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index 2e0ff91..33e9f2f 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -6,6 +6,7 @@
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.system.service.PointsService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.dao.DataAccessException
 import org.springframework.stereotype.Service
@@ -70,6 +71,10 @@
     @Autowired
     private lateinit var transactionMainDao: TransactionMainDao
 
+    @Autowired
+    private lateinit var pointsService: PointsService
+
+
 
     fun init(builder: TransactionBuilder): TTransactionMain {
         try {
@@ -109,6 +114,17 @@
                         "你有一笔${it.personDtl.amount}元的支出，点击查看详情",
                         it.refno, mutableMapOf(), it.tenantid)
             }
+            if(-it.personDtl.amount>=0) {
+                //支付成功  进行积分处理
+                pointsService.singleHandlePoints(it.personDtl.userid, -it.personDtl.amount, refno);
+                pointsService.dayHandlePoints(it.personDtl.userid, refno);
+                pointsService.monthHandlePoints(it.personDtl.userid, refno);
+               // pointsService.pointsOutdate();
+                pointsService.pointsCompensate();
+            }else {
+                //退款之后进行积分处理
+                pointsService.refundHandlePoints(it.personDtl.userid, it.reverseRefno);
+            }
         }
     }
 
@@ -147,4 +163,5 @@
     fun findTransactionByRefno(refno: String): TTransactionMain? {
         return transactionMainDao.findByRefno(refno)
     }
+
 }
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index 091b5cf..0881a1c 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -36,9 +36,11 @@
 payapi.sourcetype.checker.scheduler=7 3/10 * * * ?
 citizencard.dolosstask.cron=-
 send.delay.notice.task.cron=29 0/1 * * * ?
+points.outdate.cron=0 0 0 * * ?
+points.consume.cron=0 0 0 * * ?
 ################################################
 # user password
 auth.password.bcrypt.length=10
 ###################################################
 spring.redis.database=0
-multi-tenant.datasource.base-package=com.supwisdom.dlpay
\ No newline at end of file
+multi-tenant.datasource.base-package=com.supwisdom.dlpay
diff --git a/payapi/src/main/resources/templates/index.html b/payapi/src/main/resources/templates/index.html
index 302af3a..fb17475 100755
--- a/payapi/src/main/resources/templates/index.html
+++ b/payapi/src/main/resources/templates/index.html
@@ -162,4 +162,4 @@
 </script>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/payapi/src/main/resources/templates/system/level/index.html b/payapi/src/main/resources/templates/system/level/index.html
new file mode 100644
index 0000000..ced51a0
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/index.html
@@ -0,0 +1,926 @@
+<div class="layui-tab layui-tab-card">
+    <ul class="layui-tab-title">
+        <li class="layui-this">会员等级设置</li>
+        <li>日常任务积分设置</li>
+        <li>消费奖励积分设置</li>
+        <li>其他设置</li>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">积分中心</a>
+          <a><cite>积分规则管理</cite></a>
+        </span>
+    </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 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 class="levelclass layui-card">
+                        <div class="layui-card-header" style="font-weight: 700">1级会员设置:</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">
+                                <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>
+
+            </form>
+        </div>
+        <div class="layui-tab-item" style="background-color: white">
+            <table class="layui-table" id="tasktable" lay-filter="tasktable"></table>
+        </div>
+        <div class="layui-tab-item" style="background-color: white">
+            <form id="consume-form" lay-filter="consume-form" class="layui-form model-form">
+                <button type="button" class="layui-btn" lay-filter="consume-form-submit" lay-submit
+                        style="margin-left: 20px">保存
+                </button>
+                <div style="margin: 20px">
+                    <div style="font-weight: 700">日累积消费积分设置
+                        <button type="button" class="layui-btn" id="consumeAdd" style="margin-left: 30px">添加
+                        </button>
+                    </div>
+                    <div>
+                        <div id="consumeid">
+                            <div class="consumeclass" style="margin-top: 10px">当日累计消费金额满
+                                <input type="text" name="conAmount" required lay-verify="required"
+                                       autocomplete="off"
+                                       class="layui-input"
+                                       style="width: 60px;display: inline;height: 28px;margin: 6px"
+                                       id="conAmount">元时，可额外获得
+                                <input type="text" name="conPoints" required lay-verify="required"
+                                       autocomplete="off"
+                                       class="layui-input"
+                                       style="width: 60px;display: inline;height: 28px;margin: 6px"
+                                       id="conPoints">积分;
+                                <input type="text" name="conPointsid" id="conPointsid" style="display: none"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div style="margin: 20px">
+                    <div style="font-weight: 700">月累积消费积分设置
+                        <button type="button" class="layui-btn" id="consumeMonthAdd"
+                                style="margin-left: 30px">添加
+                        </button>
+                    </div>
+                    <div>
+                        <div id="consumeMonthid">
+                            <div class="consumeclass" style="margin-top: 10px">当月累计消费金额满
+                                <input type="text" name="conMonthAmount" required lay-verify="required"
+                                       autocomplete="off"
+                                       class="layui-input"
+                                       style="width: 60px;display: inline;height: 28px;margin: 6px"
+                                       id="conMonthAmount">元时，可额外获得
+                                <input type="text" name="conMonthPoints" required lay-verify="required"
+                                       autocomplete="off"
+                                       class="layui-input"
+                                       style="width: 60px;display: inline;height: 28px;margin: 6px"
+                                       id="conMonthPoints">积分;
+                                <input type="text" name="conMonthPointsid" id="conMonthPointsid"
+                                       style="display: none"/>
+                            </div>
+                        </div>
+                    </div>
+                </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', 'layedit'], function () {
+        //
+        //   等级添加
+        //
+        var form = layui.form;
+        var layer = layui.layer;
+        let table = layui.table;
+        let admin = layui.admin;
+        let element = layui.element;
+        let re = function myIsNaN(value) {
+            return typeof value === 'number' && !isNaN(value);
+        }
+        // 表单提交事件
+        form.on('submit(level-form-submit)', function (data) {
+            let token = $("meta[name='_csrf_token']").attr("value");
+            let tPersonLevels = [];
+            $('.levelclass').each(function (index, e) {
+                let tperson = {}
+                $(this).find('input').each(function (index, e) {
+                    if ($(e).attr('name') == "name") {
+                        tperson.name = $(this).val();
+                    }
+                    if ($(e).attr('name') == "pointsLower") {
+                        tperson.pointsLower = $(this).val();
+                    }
+                    if ($(e).attr('name') == "pointsUpper") {
+                        tperson.pointsUpper = $(this).val();
+                    }
+                    if ($(e).attr('name') == "levelid") {
+                        tperson.id = $(this).val();
+                    }
+                    if ($(e).attr('name') == "singleConsumeAmount") {
+                        tperson.singleConsumeAmount = $(this).val();
+                    }
+                    if ($(e).attr('name') == "singleAmount") {
+                        tperson.singleAmount = $(this).val();
+                    }
+                    if ($(e).attr('name') == "singlePoints") {
+                        tperson.singlePoints = $(this).val();
+                    }
+                });
+                tPersonLevels.push(tperson);
+            });
+
+            var data = {'tPersonLevels': tPersonLevels};
+            var url = '[[@{/level/add}]]';
+            layer.confirm('确认保存?', {
+                icon: 3, title: '提示'
+
+            }, function (index) {
+                layer.load(2);
+                $.ajax({
+                    type: "POST",
+                    dataType: "json",
+                    url: url,
+                    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});
+                            admin.refresh();
+                            // parent.location.reload();
+                        } 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;
+        });
+        var x = 2;
+        $("#add").click(function () {
+            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>\n' +
+                '                            </div>\n' +
+                '                        </div>\n' +
+                '                    </div>';
+            if (x !== 2) {
+                let temp = x - 1;
+                document.getElementById("removeid" + temp).style.display = "none";
+            }
+            $("#levelstr").append(str);
+            x++;
+        });
+        $("body").on('click', ".removeclass", function () {
+            let _this = this;
+            let deletetemid = x - 1;
+            let levelidtemp = {"levelid": $("#levelid" + deletetemid).val()};
+            let token = $("meta[name='_csrf_token']").attr("value");
+            layer.confirm('确认删除?', {
+                icon: 3, title: '提示'
+
+            }, function (index) {
+                if (levelidtemp.levelid) {
+                    $.ajax({
+                        type: "POST",
+                        dataType: "json",
+                        url: '[[@{/level/delete}]]',
+                        headers: {
+                            'Accept': 'application/json',
+                            'Content-Type': 'application/json',
+                            'X-CSRF-TOKEN': token,
+                        },
+                        data: JSON.stringify(levelidtemp),
+                        success: function (result) {
+                            if (result.code === 200) {
+                                layer.msg(result.msg, {icon: 1});
+                                let tempp = deletetemid - 1;
+                                if (tempp > 1) {
+                                    document.getElementById("removeid" + tempp).style.display = "inline";
+                                }
+                                $(_this).parent().parent().parent().parent().remove();
+                                x--;
+                            } 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});
+                        }
+                    });
+                } else {
+                    let tempp = deletetemid - 1;
+                    if (tempp > 1) {
+                        document.getElementById("removeid" + tempp).style.display = "inline";
+                    }
+                    $(_this).parent().parent().parent().parent().remove();
+                    x--;
+                }
+                layer.close(index);
+            });
+        })
+
+
+        //
+        //   等级查询
+        //
+        let datalist = [];
+        $.ajax({
+            type: "GET",
+            dataType: "json",
+            url: '[[@{/level/list}]]',
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+            },
+            success: function (result) {
+                layer.closeAll('loading');
+                if (result.code === 200) {
+                    datalist = result.datalist
+                    for (let i = 0; i < datalist.length; i++) {
+                        if (i === 0) {
+                            $("#lename").val(datalist[i].name);
+                            $("#lelow").val(datalist[i].pointsLower);
+                            $("#leupp").val(datalist[i].pointsUpper);
+                            $("#levelid1").val(datalist[i].id);
+                            $("#singleConsumeAmount").val(datalist[i].singleConsumeAmount);
+                            $("#singleAmount").val(datalist[i].singleAmount);
+                            $("#singlePoints").val(datalist[i].singlePoints);
+                        }
+                        if (i > 0) {
+                            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>\n' +
+                                '                            </div>\n' +
+                                '                        </div>\n' +
+                                '                    </div>'
+                            ;
+                            if (x !== 2) {
+                                let temp = x - 1;
+                                document.getElementById("removeid" + temp).style.display = "none";
+                            }
+                            $("#levelstr").append(strr);
+                            x++;
+                        }
+                    }
+                } 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});
+            }
+        });
+
+
+        //
+        //   任务积分
+        //
+        // 渲染表格
+        table.render({
+            elem: '#tasktable',
+            url: '[[@{/task/list}]]',
+            page: true,
+            cols: [
+                [
+                    {
+                        field: 'taskname',
+                        title: '任务名称',
+                        width: 200,
+                        fixed: 'left',
+                        align: 'center',
+                        sort: true
+                    },
+                    {field: 'taskpoints', title: '可获积分', width: 200, align: 'center', sort: true},
+                    {field: 'remark', title: '说明', width: 400, align: 'center', sort: true},
+                    {
+                        align: 'center',
+                        title: '操作',
+                        fixed: 'right',
+                        width: 200,
+                        templet: function (item) {
+                            let html = ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ';
+                            return html;
+                        }
+                    }
+                ]
+            ]
+        });
+
+        // 工具条点击事件
+        table.on('tool(tasktable)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            if (layEvent === 'edit') {
+                showModel(data);
+            }
+        });
+
+        let showModel = function (data) {
+            let title = '任务修改';
+            admin.putTempData('t_bean', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/task/loadadd}]]',
+                finish: function () {
+                    table.reload('tasktable', {});
+                }
+            });
+        };
+
+        /*
+        *
+        * 消费奖励积分设置
+        * */
+        form.on('submit(consume-form-submit)', function (data) {
+            let token = $("meta[name='_csrf_token']").attr("value");
+            let tConsumePoints = [];
+            $('.consumeclass').each(function (index, e) {
+                let tConsumePoint = {}
+                $(this).find('input[type="text"]').each(function (index, e) {
+                    if ($(e).attr('name') == "conAmount") {
+                        tConsumePoint.consumeamount = $(this).val();
+                    }
+                    if ($(e).attr('name') == "conPoints") {
+                        tConsumePoint.ruletype = "day";
+                        tConsumePoint.points = $(this).val();
+                    }
+                    if ($(e).attr('name') == "conPointsid") {
+                        tConsumePoint.id = $(this).val();
+                    }
+                    if ($(e).attr('name') == "conMonthAmount") {
+                        tConsumePoint.consumeamount = $(this).val();
+                    }
+                    if ($(e).attr('name') == "conMonthPoints") {
+                        tConsumePoint.ruletype = "month";
+                        tConsumePoint.points = $(this).val();
+                    }
+                    if ($(e).attr('name') == "conMonthPointsid") {
+                        tConsumePoint.id = $(this).val();
+                    }
+                });
+                tConsumePoints.push(tConsumePoint);
+            });
+            var data = {'tConsumePoints': tConsumePoints};
+            layer.confirm('确认保存?', {
+                icon: 3, title: '提示'
+
+            }, function (index) {
+                layer.load(2);
+                $.ajax({
+                    type: "POST",
+                    dataType: "json",
+                    url: '[[@{/consume/addRulelist}]]',
+                    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});
+                            getrulelist();
+                        } 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;
+        });
+        var conx = 2;
+        var conMonthx = 2;
+        $("#consumeAdd").click(function () {
+            let consumestr = ' <div class="consumeclass">当日累计消费金额满 ' +
+                '<input type="text" name="conAmount" required lay-verify="required" autocomplete="off" ' +
+                'class="layui-input" style="width: 60px;display: inline;height: 28px;margin: 6px" id="lename">' +
+                '元时，可额外获得 <input type="text" name="conPoints" required lay-verify="required"' +
+                '  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"/> ' +
+                '<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(consumestr);
+            conx++;
+        });
+        $("#consumeMonthAdd").click(function () {
+            let consumeMonthstr = ' <div class="consumeclass">当月累计消费金额满 ' +
+                '<input type="text" name="conMonthAmount" required lay-verify="required" autocomplete="off" ' +
+                'class="layui-input" style="width: 60px;display: inline;height: 28px;margin: 6px" id="lename">' +
+                '元时，可额外获得 <input type="text" name="conMonthPoints" required lay-verify="required"' +
+                '  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"/> ' +
+                '<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(consumeMonthstr);
+            conMonthx++;
+        });
+        $("body").on('click', ".removeconsume", function () {
+            let _this = this;
+            let deletetemid = conx - 1;
+            let conPointsidtemp = {"conPointsid": $("#conPointsid" + deletetemid).val()};
+            let token = $("meta[name='_csrf_token']").attr("value");
+            layer.confirm('确认删除?', {
+                icon: 3, title: '提示'
+
+            }, function (index) {
+                if (conPointsidtemp.conPointsid) {
+                    $.ajax({
+                        type: "POST",
+                        dataType: "json",
+                        url: '[[@{/consume/deleteRule}]]',
+                        headers: {
+                            'Accept': 'application/json',
+                            'Content-Type': 'application/json',
+                            'X-CSRF-TOKEN': token,
+                        },
+                        data: JSON.stringify(conPointsidtemp),
+                        success: function (result) {
+                            if (result.code === 200) {
+                                layer.msg(result.msg, {icon: 1});
+                                let tempp = deletetemid - 1;
+                                if (tempp > 1) {
+                                    document.getElementById("removecon" + tempp).style.display = "inline";
+                                }
+                                $(_this).parent().remove();
+                                conx--;
+                            } 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});
+                        }
+                    });
+                } else {
+                    let tempp = deletetemid - 1;
+                    if (tempp > 1) {
+                        document.getElementById("removecon" + tempp).style.display = "inline";
+                    }
+                    $(_this).parent().remove();
+                    conx--;
+                }
+                layer.close(index);
+            });
+        }),
+        $("body").on('click', ".removeMonthconsume", function () {
+                let _this = this;
+                let deletetemid = conMonthx - 1;
+                let conPointsidtemp = {"conPointsid": $("#conMonthPointsid" + deletetemid).val()};
+                let token = $("meta[name='_csrf_token']").attr("value");
+                layer.confirm('确认删除?', {
+                    icon: 3, title: '提示'
+
+                }, function (index) {
+                    if (conPointsidtemp.conPointsid) {
+                        $.ajax({
+                            type: "POST",
+                            dataType: "json",
+                            url: '[[@{/consume/deleteRule}]]',
+                            headers: {
+                                'Accept': 'application/json',
+                                'Content-Type': 'application/json',
+                                'X-CSRF-TOKEN': token,
+                            },
+                            data: JSON.stringify(conPointsidtemp),
+                            success: function (result) {
+                                if (result.code === 200) {
+                                    layer.msg(result.msg, {icon: 1});
+                                    let tempp = deletetemid - 1;
+                                    if (tempp > 1) {
+                                        document.getElementById("removeMonthcon" + tempp).style.display = "inline";
+                                    }
+                                    $(_this).parent().remove();
+                                    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});
+                                }
+                            },
+                            error: function () {
+                                layer.closeAll('loading');
+                                layer.msg("请求服务器失败！", {icon: 2});
+                            }
+                        });
+                    } else {
+                        let tempp = deletetemid - 1;
+                        if (tempp > 1) {
+                            document.getElementById("removeMonthcon" + tempp).style.display = "inline";
+                        }
+                        $(_this).parent().remove();
+                        conMonthx--;
+                    }
+                    layer.close(index);
+                });
+            });
+        //
+        //   消费奖励积分设置查询
+        //
+        let monthConsumeList = [];
+        let dayConsumeList = [];
+        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);
+                            }
+                            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++;
+                            }
+                        }
+                        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});
+                    }
+                },
+                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/pointsactiveadd.html b/payapi/src/main/resources/templates/system/level/pointsactiveadd.html
new file mode 100644
index 0000000..3a5a4d5
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/pointsactiveadd.html
@@ -0,0 +1,213 @@
+<!-- operator表单弹窗 -->
+<form id="active-form" lay-filter="active-form" class="layui-form model-form">
+    <input name="id" id="id" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>活动日名称:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input name="name" placeholder="请输入活动日名称" type="text" class="layui-input" maxlength="100"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item" id="radio-value">
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>循环方式:</label>
+        <div class="layui-input-block" style="margin-left: 130px;width: 290px" >
+            <input type="radio" name="type" value="no" title="不循环" checked/>
+            <input type="radio" name="type" value="month" title="月循环"/>
+            <input type="radio" name="type" value="year" title="年循环"/>
+        </div>
+    </div>
+    <div class="layui-form-item" id="start-date" >
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>开始日期:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input type="text" name="startdate" class="layui-input" id="start-date-value" placeholder="请选择开始日期,年-月-日">
+        </div>
+    </div>
+    <div class="layui-form-item" id="end-date" >
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>结束日期:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input type="text" name="enddate" class="layui-input" id="end-date-value"  placeholder="请选择结束日期,年-月-日">
+        </div>
+    </div>
+    <div class="layui-form-item" id="month" style="display: none">
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>每月:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <select id="weeknumber" name="weeknumber" >
+                <option value="1">第一周</option>
+                <option value="2">第二周</option>
+                <option value="3">第三周</option>
+                <option value="4">第四周</option>
+                <option value="5">第五周</option>
+            </select>
+            <select name="weekday" xm-select="roleId"  >
+                <option value="1">星期一</option>
+                <option value="2">星期二</option>
+                <option value="3">星期三</option>
+                <option value="4">星期四</option>
+                <option value="5">星期五</option>
+                <option value="6">星期六</option>
+                <option value="7">星期七</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item" id="year-start-date" style="display: none">
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>每年开始日期:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input type="text" name="yearStartDate" class="layui-input" id="year-start-value" placeholder="请选择月-日,如5月4日">
+        </div>
+    </div>
+    <div class="layui-form-item" id="year-end-date" style="display: none">
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>每年结束日期:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input type="text" name="yearEndDate" class="layui-input" id="year-end-value" placeholder="请选择月-日,如5月4日">
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label" style="width: 100px"><span style="color: red;">*</span>积分获取倍速:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input name="rate" placeholder="请输入积分获取倍速" type="text" class="layui-input" maxlength="11"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item" >
+        <label class="layui-form-label" style="width: 100px">备注:</label>
+        <div class="layui-input-block" style="margin-left: 130px">
+            <input name="remark" placeholder="请输入备注" type="text" class="layui-input" maxlength="100" />
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="active-form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin','laydate', 'form', 'formSelects',], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var laydate = layui.laydate;
+        var formSelects = layui.formSelects;
+        laydate.render({
+            elem: '#start-date-value' //指定元素
+            ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
+        });
+        laydate.render({
+            elem: '#end-date-value' //指定元素
+            ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
+        });
+        laydate.render({
+            elem: '#year-start-value' //指定元素
+            ,format: 'MM月dd日'
+            ,trigger: 'click'
+        });
+        laydate.render({
+            elem: '#year-end-value' //指定元素
+            ,format: 'MM月dd日'
+            ,trigger: 'click'
+        });
+        var url = '[[@{/pointsActive/add}]]';
+        form.render('radio');
+        form.render('select');
+        // 回显user数据
+        var bean = admin.getTempData('t_bean');
+        if (bean) {
+            if (bean.type == "no") {
+                $("#start-date").show();
+                $("#end-date").show();
+                $("#month").hide();
+                $("#year-start-date").hide();
+                $("#year-end-date").hide();
+                bean.startdate = bean.startdate.substring(0, 4) + "年" + bean.startdate.substring(4, 6) + "月" + bean.startdate.substring(6, 8)+"日";
+                bean.enddate = bean.enddate.substring(0, 4) + "年" + bean.enddate.substring(4, 6) + "月" + bean.enddate.substring(6, 8)+"日";
+            }
+            if (bean.type == "month") {
+                $("#start-date").hide();
+                $("#end-date").hide();
+                $("#month").show();
+                $("#year-start-date").hide();
+                $("#year-end-date").hide();
+                let weektemp = bean.weekday.split(",");
+                formSelects.value('roleId', weektemp);
+            }
+            if (bean.type == "year") {
+                $("#start-date").hide();
+                $("#end-date").hide();
+                $("#month").hide();
+                $("#year-start-date").show();
+                $("#year-end-date").show();
+                bean.yearStartDate = bean.startdate.substring(0, 2) + "月" + bean.startdate.substring(2, 4) + "日" ;
+                bean.yearEndDate = bean.enddate.substring(0, 2) + "月" + bean.enddate.substring(2, 4) + "日" ;
+            }
+            form.val('active-form', bean);
+        }
+        // 表单提交事件
+        form.on('submit(active-form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            console.log(data.field.weekday)
+            let datatemp = {'pointsActive': data.field};
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data : JSON.stringify(datatemp),
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code === 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } 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});
+                }
+            });
+            return false;
+        });
+
+        $('#radio-value').click(function () {
+            let radios = document.getElementsByName("type");
+            let value = 0;
+            for(let i=0;i<radios.length;i++){
+                if(radios[i].checked == true){
+                    value = radios[i].value;
+                }
+            }
+            if(value == "no"){
+                $("#start-date").show();
+                $("#end-date").show();
+                $("#month").hide();
+                $("#year-start-date").hide();
+                $("#year-end-date").hide();
+            }else if(value == "month"){
+                $("#start-date").hide();
+                $("#end-date").hide();
+                $("#month").show();
+                $("#year-start-date").hide();
+                $("#year-end-date").hide();
+            }else if(value == "year"){
+                $("#start-date").hide();
+                $("#end-date").hide();
+                $("#month").hide();
+                $("#year-start-date").show();
+                $("#year-end-date").show();
+            }
+        });
+    });
+</script>
diff --git a/payapi/src/main/resources/templates/system/level/pointsactiveindex.html b/payapi/src/main/resources/templates/system/level/pointsactiveindex.html
new file mode 100644
index 0000000..0c1806a
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/pointsactiveindex.html
@@ -0,0 +1,177 @@
+<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">
+            活动日名称：
+            <input id="search-chkstatus-type" class="layui-input search-input" type="text"
+                   maxlength="20"/>&emsp;
+            <div style="display: inline;width: 200px"  id="type-value" class="layui-form toolbar">
+                循环方式：
+                <select id="shop-manager-search-type">
+                    <option value=""> 全部</option>
+                    <option value="no">不循环</option>
+                    <option value="month">月循环</option>
+                    <option value="year">年循环</option>
+                </select>
+            </div>
+            <button id="btn-chkstatus-type" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-reset-type" class="layui-btn layui-btn-primary" data-type="reset"><i
+                    class="layui-icon"></i>清 空
+            </button>
+            <div style="color: red;margin-top: 10px">
+                <button id="btn-add-active" class="layui-btn icon-btn" data-type="add"><i
+                        class="layui-icon">&#xe654;</i>新增
+                </button>
+            </div>
+        </div>
+        <table class="layui-table" id="pointsActiveTable" lay-filter="pointsActiveTable"></table>
+    </div>
+</div>
+
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        form.render("select");
+        // 渲染表格
+        table.render({
+            elem: '#pointsActiveTable',
+            url: '[[@{/pointsActive/list}]]',
+            page: true,
+            where: {name: null, type: null},
+            cols: [
+                [
+                    {field: 'id', title: '编号', width: 130, align: 'center', fixed: 'left', sort: true},
+                    {field: 'name', title: '活动日名称', width: 160, align: 'center'},
+                    {
+                        field: 'type', title: '循环方式', width: 160, align: 'center', templet: function (item) {
+                            if (item.type == "no") {
+                                return "不循环"
+                            }
+                            if (item.type == "month") {
+                                return "月循环"
+                            }
+                            if (item.type == "year") {
+                                return "年循环"
+                            }
+                        }
+                    },
+                    {
+                        field: 'startdate',
+                        title: '起止日期',
+                        width: 250,
+                        align: 'center',
+                        templet: function (item) {
+                            if (item.type == "no") {
+                                let str = item.startdate.substring(0, 4) + "." + item.startdate.substring(4, 6) + "." + item.startdate.substring(6, 8);
+                                let enstr = item.enddate.substring(0, 4) + "." + item.enddate.substring(4, 6) + "." + item.enddate.substring(6, 8);
+                                return str + "-" + enstr;
+                            }
+                            if (item.type == "month") {
+                                return "每月第" + item.weeknumber + "周的第" + item.weekday + "天";
+                            }
+                            if (item.type == "year") {
+                                let str = item.startdate.substring(0, 2) + "月" + item.startdate.substring(2, 4) + "日";
+                                let strend = item.enddate.substring(0, 2) + "月" + item.enddate.substring(2, 4) + "日";
+                                return "每年" + str + "-" + strend;
+                            }
+                        }
+                    },
+                    {field: 'remark', title: '备注', width: 160, align: 'center'},
+                    {
+                        align: 'center',
+                        title: '操作',
+                        fixed: 'right',
+                        width: 200,
+                        templet: function (item) {
+                            let html = ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>修改</a> ';
+                            html += '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                            return html;
+                        }
+                    }
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-chkstatus-type').click(function () {
+            var name = $("#search-chkstatus-type").val();
+            var type = $("#shop-manager-search-type").val();
+            table.reload('pointsActiveTable', {where: {name: name, type: type}});
+        });
+
+        $('#btn-reset-type').click(function () {
+            $("#search-chkstatus-type").val("");
+            $('#shop-manager-search-type option:selected').val("");
+        });
+
+        // 工具条点击事件
+        //监听单元格
+        table.on('tool(pointsActiveTable)', function (obj) {
+            var data = obj.data;
+            if ('edit' == obj.event) {
+                //修改
+                showModel(data);
+            } else if ('del' == obj.event) {
+                //删除
+                layer.confirm("确定要删除该活动日吗？", function () {
+                    var token = $("meta[name='_csrf_token']").attr("value");
+                    let param = {"activeid": data.id};
+                    $.ajax({
+                        type: "POST",
+                        dataType: "json",
+                        url: '[[@{/pointsActive/delete}]]',
+                        headers: {
+                            'Accept': 'application/json',
+                            'Content-Type': 'application/json',
+                            'X-CSRF-TOKEN': token,
+                        },
+                        data: JSON.stringify(param),
+                        success: function (result) {
+                            if (result.code === 200) {
+                                layer.msg(result.msg, {icon: 1});
+                                admin.refresh();
+                            } 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});
+                        }
+                    });
+                });
+            }
+        });
+        $('#btn-add-active').click(function () {
+            showModel();
+        });
+        let showModel = function (data) {
+            let title = data ? '编辑活动日' : '新增活动日';
+            admin.putTempData('t_bean', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/pointsActive/loadadd}]]',
+                finish: function () {
+                    table.reload('pointsActiveTable', {});
+                }
+            });
+        };
+
+    });
+</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..aa84fd1
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/pointsreport.html
@@ -0,0 +1,161 @@
+<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" style="margin-right: 20px">
+                <label class="layui-form-label">积分日期</label>
+                <div class="layui-input-inline" style="width: 120px;">
+                    <input type="text" name="startDate" id="startDateReport"
+                           placeholder="开始日期"
+                           autocomplete="off" class="layui-input"/>
+                </div>
+                -
+                <div class="layui-input-inline" style="width: 120px;">
+                    <input type="text" name="endDate" id="endDateReport" placeholder="结束日期"
+                           autocomplete="off"
+                           class="layui-input"/>
+                </div>
+            </div>
+            <div class="layui-inline" style="margin-right: 20px">
+                积分名称：
+                <select id="points-name">
+                    <option selected='selected' value=""> 全部</option>
+                </select>
+            </div>
+            <button id="btn-chkstatus-report" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-reset-report" 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;
+        let element = layui.element;
+        let init_date = new Date();
+        laydate.render({
+            elem: '#startDateReport'
+            , format: 'yyyy年MM月dd日'
+            , value: init_date
+            ,trigger: 'click'
+        });
+        laydate.render({
+            elem: '#endDateReport'
+            , format: 'yyyy年MM月dd日'
+            , value: init_date
+            ,trigger: 'click'
+        });
+        // 渲染表格
+        table.render({
+            elem: '#pointsReportTable',
+            url: '[[@{/pointsReport/list}]]',
+            page: false,
+            toolbar: '#subjectday-toolbar',
+            defaultToolbar: [ 'exports', 'print'],
+            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-report').click(function () {
+            let name = $("#points-name").val();
+            let startDate = $("#startDateReport").val();
+            let endDate = $("#endDateReport").val();
+            table.reload('pointsReportTable', {where: {name: name, startdate: startDate, enddate: endDate}});
+        });
+
+        $('#btn-reset-report').click(function () {
+            $("#startDateReport").val("");
+            $("#endDateReport").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();
+                        element.init();
+                    } 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>
diff --git a/payapi/src/main/resources/templates/system/level/taskadd.html b/payapi/src/main/resources/templates/system/level/taskadd.html
new file mode 100644
index 0000000..e5e059c
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/taskadd.html
@@ -0,0 +1,82 @@
+<!-- operator表单弹窗 -->
+<form id="task-form" lay-filter="task-form" class="layui-form model-form">
+    <input name="taskid" id="taskid" type="hidden"/>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">任务名称</label>
+        <div class="layui-input-block">
+            <input name="taskname" type="text" class="layui-input" maxlength="100" readonly="readonly"
+                   style="background-color: #f1f1f1;"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">任务积分/次</label>
+        <div class="layui-input-block">
+            <input name="taskpoints" type="text" class="layui-input" maxlength="300"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">说明</label>
+        <div class="layui-input-block">
+            <textarea name="remark" type="text" class="layui-input" maxlength="300"
+                      style="height: 80px;padding: 10px"/>
+        </div>
+    </div>
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="task-form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var url = '[[@{/task/add}]]';
+        form.render('radio');
+        form.render('select');
+        // 回显user数据
+        var bean = admin.getTempData('t_bean');
+        if (bean) {
+            form.val('task-form', bean);
+        }
+        // 表单提交事件
+        form.on('submit(task-form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            console.log(data.field)
+            let datatemp = {'tPointsTask': data.field};
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                data: JSON.stringify(datatemp),
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code === 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } 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});
+                }
+            });
+            return false;
+        });
+    });
+</script>
diff --git a/payapi/src/main/resources/templates/system/level/userpointsindex.html b/payapi/src/main/resources/templates/system/level/userpointsindex.html
new file mode 100644
index 0000000..14a84f1
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/userpointsindex.html
@@ -0,0 +1,205 @@
+<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">
+            姓名：
+            <input id="search-chkstatus-get" class="layui-input search-input" type="text"
+                   maxlength="20"/>&emsp;
+            市民卡账号：
+            <input id="search-account" class="layui-input search-input" type="text" maxlength="20"/>&emsp;
+            积分名称：
+            <select id="points-name-select">
+                <option value=""> 全部</option>
+                <option value="consume">消费积分</option>
+                <option value="outpoints">失效积分</option>
+                <option value="consumeDay">日累计奖励</option>
+                <option value="consumeMonth">月累计奖励</option>
+                <option value="task">日常任务积分</option>
+                <option value="consumeRefund">退款积分</option>
+            </select>
+            <div class="layui-inline">
+                <label class="layui-form-label">积分日期</label>
+                <div class="layui-input-inline" style="width: 120px;">
+                    <input type="text" name="startDate" id="startDateSelect"
+                           placeholder="开始日期"
+                           autocomplete="off" class="layui-input"/>
+                </div>
+                -
+                <div class="layui-input-inline" style="width: 120px;">
+                    <input type="text" name="endDate" id="endDateSelect" placeholder="结束日期"
+                           autocomplete="off"
+                           class="layui-input"/>
+                </div>
+            </div>
+            <button id="btn-chkstatus-search-select" class="layui-btn icon-btn" data-type="search" style="margin-top: 10px"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-reset-sysparam-select" class="layui-btn layui-btn-primary" data-type="reset" style="margin-top: 10px"><i
+                    class="layui-icon"></i>清 空
+            </button>
+            <div style="color: red;margin-top: 10px">查询无符合条件的记录,请重新输入查询条件!</div>
+        </div>
+        <table class="layui-table" id="userPointsTable" lay-filter="userPointsTable"></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: '#startDateSelect'
+            ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
+        });
+        laydate.render({
+            elem: '#endDateSelect'
+            ,format: 'yyyy年MM月dd日'
+            ,trigger: 'click'
+        });
+        // 渲染表格
+        table.render({
+            elem: '#userPointsTable',
+            url: '[[@{/userpoints/list}]]',
+            page: true,
+            toolbar:'#subjectday-toolbar',
+            defaultToolbar: [],
+            where: {name: null, idno: null},
+            cols: [
+                [
+                    {
+                        field: 'name',
+                        title: '姓名',
+                        width: 180,
+                        align: 'center',
+                        sort: true,
+                        templet: function (item) {
+                            return item.tPointsMain.name;
+                        }
+                    },
+                    {
+                        field: 'cardno',
+                        title: '市民卡账号',
+                        width: 160,
+                        align: 'center',
+                        templet: function (item) {
+                            return item.tPointsMain.cardno;
+                        }
+                    },
+                    {
+                        field: 'levelname',
+                        title: '会员等级',
+                        width: 160,
+                        align: 'center',
+                        templet: function (item) {
+                            $("#points").text(item.tPointsMain.points);
+                            $("#outPoints").text(item.tPointsMain.outPoints);
+                            return item.tPointsMain.levelname;
+                        }
+                    },
+                    {
+                        field: 'transtime',
+                        title: '积分时间',
+                        width: 160,
+                        align: 'center',
+                        templet: function (item) {
+                            let datetemp = item.transdate + item.transtime;
+                            return admin.formatDate(datetemp);
+                        }
+                    },
+                    {
+                        field: 'type',
+                        title: '积分名称',
+                        width: 140,
+                        align: 'center',
+                        sort: true,
+                        templet: function (item) {
+                            if(item.type=="consume"){
+                                return "消费积分";
+                            }
+                            if(item.type=="outpoints"){
+                                return "失效积分";
+                            }
+                            if(item.type=="consumeDay"){
+                                return "日累计奖励";
+                            }
+                            if(item.type=="consumeMonth"){
+                                return "月累计奖励"
+                            }
+                            if(item.type=="task"){
+                                return "日常任务积分"
+                            }
+                            if(item.type=="consumeRefund"){
+                                return "退款积分"
+                            }
+                            if(item.type=="consumeRefund"){
+                                return "退款积分"
+                            }
+                            if(item.type=="consumeDayRefund"){
+                                return "退款日累计奖励积分"
+                            }
+                            if(item.type=="consumeMonthRefund"){
+                                return "退款月累计奖励积分"
+                            }
+                        }
+                    },
+                    {field: 'points', title: '获得积分', width: 130, align: 'center'},
+                    {field: 'aftpoints', title: '目前可用积分', width: 160, align: 'center'},
+
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-chkstatus-search-select').click(function () {
+            let name = $("#search-chkstatus-get").val();
+            let idno = $("#search-account").val();
+            let startDate = $("#startDateSelect").val();
+            let endDate = $("#endDateSelect").val();
+            let pointsName = $("#points-name-select").val();
+            table.reload('userPointsTable', {where: {name: name, idno: idno,startDate:startDate,endDate:endDate,pointsName:pointsName}});
+        });
+
+        $('#btn-reset-sysparam-select').click(function () {
+            $("#search-chkstatus-get").val("");
+            $("#search-account").val("");
+   /*         $("#startDateSelect").val("");
+            $("#endDateSelect").val("");*/
+        });
+
+        /*    // 工具条点击事件
+            table.on('tool(userPointsTable)', function (obj) {
+                let data = obj.data;
+                let layEvent = obj.event;
+                if (layEvent === 'edit') {
+                    showModel(data);
+                }
+            });
+
+            let showModel = function (data) {
+                let title = '查看积分明细';
+                admin.putTempData('t_bean', data);
+                admin.popupCenter({
+                    title: title,
+                    path: '[[@{/pointsdetail/pointsdetailindex}]]'
+                });
+            };*/
+
+    });
+</script>
diff --git a/payapi/src/main/resources/templates/system/user/index.html b/payapi/src/main/resources/templates/system/user/index.html
index a1d07a8..245461a 100644
--- a/payapi/src/main/resources/templates/system/user/index.html
+++ b/payapi/src/main/resources/templates/system/user/index.html
@@ -146,4 +146,4 @@
             });
         }
     });
-</script>
\ No newline at end of file
+</script>
