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 a8e7808..c803535 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
@@ -25,4 +25,13 @@
 
   @PostMapping("/api/user/testmsg")
   ApiResponse testmsg();
+
+  @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 32ca0f3..805d85e 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
@@ -30,7 +30,7 @@
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(properties = {
-    "payapi.url=http://localhost:8099/payapi"},
+    "payapi.url=http://localhost:8080/payapi"},
     classes = CitizenCardPayProxyTest.class)
 @ImportAutoConfiguration({RibbonAutoConfiguration.class,
     FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class,
@@ -55,6 +55,8 @@
   private UserProxy userProxy;
   @Autowired
   private ConsumePropxy consumePropxy;
+  @Autowired
+  private TransactionProxy transactionProxy;
 
 
   @org.junit.Test
@@ -70,15 +72,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 3688191..94b077b 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
@@ -1,9 +1,6 @@
 package com.supwisdom.dlpay.api.controller
 
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryCardsParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
+import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.api.service.CardService
 import com.supwisdom.dlpay.api.service.KafkaSendMsgService
@@ -13,6 +10,8 @@
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.system.bean.LevelBean
+import com.supwisdom.dlpay.system.service.PointsService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
@@ -29,6 +28,8 @@
     private lateinit var cardService: CardService
     @Autowired
     private lateinit var kafkaSendMsgService: KafkaSendMsgService
+    @Autowired
+    private lateinit var pointsService: PointsService
 
 
     @PostMapping("/open")
@@ -160,4 +161,38 @@
        return  ResponseEntity.ok(ResponseBodyBuilder.create()
                 .success("ok"))
     }
-}
\ No newline at end of file
+
+    @PostMapping("/userTask")
+    fun userTask(@RequestBody param: UserTaskParam): ResponseEntity<Any> {
+        val ret = pointsService.finishTask(param.userid, param.taskid)
+        return if(ret.get("code")==200){
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success("ok"))
+        }else{
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, ret.get("msg") as String))
+        }
+    }
+    @PostMapping("/getTask")
+    fun getTPointsTaskNoPage(): ResponseEntity<Any> {
+        val ret = pointsService.getTPointsTaskNoPage()
+        return if(ret.get("code")==200){
+            ResponseEntity.ok(ResponseBodyBuilder.create().data("ret", ret.get("dataList")!!)
+                    .success("ok"))
+        }else{
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, ret.get("msg") as String))
+        }
+    }
+    @PostMapping("/getUserPoints")
+    fun getUserPoints(@RequestBody param: UserPointsParam): ResponseEntity<Any> {
+        var lev = LevelBean()
+        lev.name = param.name
+        lev.idno = param.idno
+        lev.pageNo = param.pageNo
+        lev.pageSize = param.pageSize
+        val ret = pointsService.getTPointsByname(lev);
+        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("page", ret!!)
+                    .success("ok"))
+    }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 5e431b7..b93e7d3 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -12,6 +12,7 @@
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
 import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.system.service.PointsService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
 import java.sql.SQLException
@@ -35,6 +36,9 @@
     @Autowired
     private lateinit var sourceTypeService: SourceTypeService
 
+    @Autowired
+    private lateinit var pointsService: PointsService
+
 
     /// 公共函数部分
     private fun preCheck(builder: TransactionBuilder) {
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 861212a..dbb5681 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -5,6 +5,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
@@ -66,6 +67,10 @@
     @Autowired
     private lateinit var kafkaSendMsgService: KafkaSendMsgService
 
+    @Autowired
+    private lateinit var pointsService: PointsService
+
+
 
     fun init(builder: TransactionBuilder): TTransactionMain {
         try {
@@ -102,6 +107,17 @@
             if (it.person && !it.personDtl.userid.isNullOrEmpty()) {
                 kafkaSendMsgService.sendJpushMessage(it.personDtl.userid, "交易提醒", "你有一笔${it.personDtl.amount}元的支出，点击查看详情", it.refno, mutableMapOf(), it.tenantid)
             }
+            if(-it.personDtl.amount>=0) {
+                //支付成功  进行积分处理
+                pointsService.singleHandlePoints(it.personDtl.userid, -it.personDtl.amount, refno);
+                pointsService.dayHandlePoints(it.personDtl.userid, refno);
+                pointsService.monthHandlePoints(it.personDtl.userid, refno);
+               // pointsService.pointsOutdate();
+                pointsService.pointsCompensate();
+            }else {
+                //退款之后进行积分处理
+                pointsService.refundHandlePoints(it.personDtl.userid, it.reverseRefno);
+            }
         }
     }
 
@@ -137,4 +153,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
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>
