Merge branch 'hotfix/1.0.25'
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>