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..ebf8392 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,16 @@
 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> findAllByUseridAndTransdateAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
+
+    List<TPersondtl> findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatus(String userid, String transdate,String reverseFlag,String status);
 }
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..6454ba7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsActiveDao.java
@@ -0,0 +1,13 @@
+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;
+
+@Repository
+public interface PointsActiveDao extends JpaRepository<TPointsActive, Integer>, JpaSpecificationExecutor<TPointsActive> {
+
+}
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..db427c3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDetailDao.java
@@ -0,0 +1,14 @@
+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;
+
+@Repository
+public interface PointsDetailDao extends JpaRepository<TPointsDetail, Integer> {
+
+}
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..0f9f8ce
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PointsDtlDao.java
@@ -0,0 +1,23 @@
+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> findAllByUseridAndTypeAndFlagstatus(String userid, String type,String flagstatus);
+
+  TPointsdtl findAllByUseridAndTransdateAndRefno(String userid,String transdate,Integer refno);
+
+
+}
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..33027d8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPersonLevel.java
@@ -0,0 +1,114 @@
+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")
+  @NotNull
+  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..973a4ae
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPointsDetail.java
@@ -0,0 +1,68 @@
+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 = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @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;
+
+  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..8879b2c
--- /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 = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @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..0471725 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;
@@ -358,4 +359,53 @@
   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);
+  }
 }
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..d69548d 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,14 @@
   public static final String REVERSE_FLAG_WIP = "wip";
   public static final String REVERSE_FLAG_CANCEL = "cancel";
   public static final String REVERSE_FLAG_REFUND = "refund";
+
+
+  /*
+  * 积分中心模块
+  *
+  *
+  * */
+  public static final String CONSUME_FLAG_SINGLE = "single";
+  public static final String CONSUME_FLAG_DAY = "day";
+  public static final String CONSUME_FLAG_MONTH = "month";
 }
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..964ef8c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LevelBean.java
@@ -0,0 +1,173 @@
+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;
+
+  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..e3f43e0
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/PointsController.java
@@ -0,0 +1,282 @@
+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.domain.*;
+import com.supwisdom.dlpay.framework.security.OperUtil;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.LevelBean;
+import com.supwisdom.dlpay.system.service.OperatorService;
+import com.supwisdom.dlpay.system.service.PointsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+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())
+                            .put("pointsdate",levelBean.getPointsdate());
+    } 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
+          || tPersonLevel.getPointsUpper() == 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("pointslimit", levelBean.getPointslimit())
+          .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());
+      return pointsService.saveActive( levelBean.getPointsActive());
+    }else {
+      return JsonResult.error("参数不能为空");
+    }
+  }
+
+  @GetMapping("/pointsActive/loadadd")
+  public String add(ModelMap map) {
+    return "system/level/pointsactiveadd";
+  }
+
+}
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..c359f08
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/PointsService.java
@@ -0,0 +1,100 @@
+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.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);
+
+  //日消费进行积分处理
+  @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);
+
+
+  /*
+  *
+  * 活动日管理  *
+  * */
+  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);
+}
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..ab51abf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/PointsServiceImpl.java
@@ -0,0 +1,439 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.dao.CardDao;
+import com.supwisdom.dlpay.api.dao.PersonDao;
+import com.supwisdom.dlpay.api.dao.PersondtlDao;
+import com.supwisdom.dlpay.api.domain.TCard;
+import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+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.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 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.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@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;
+
+
+  @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);
+    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointsdate");
+    if(tDictionaries!=null&&tDictionaries.size()>0){
+      levelBean.setPointsdate(Integer.parseInt(tDictionaries.get(0).getDictval()));
+    }
+    return levelBean;
+  }
+
+  @Override
+  public JsonResult saveLevel(LevelBean levelBean) {
+    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointsdate");
+    if(tDictionaries!=null&&tDictionaries.size()>0){
+      tDictionaries.get(0).setDictval(levelBean.getPointsdate()+"");
+      dictionaryDao.save(tDictionaries.get(0));
+    }else {
+      TDictionary tDictionary = new TDictionary();
+      tDictionary.setDictcaption("积分中心的过期时间");
+      tDictionary.setDicttype("pointsdate");
+      tDictionary.setDicttypename("积分过期天数");
+      tDictionary.setDictval(levelBean.getPointsdate()+"");
+      tDictionary.setTenantId("{tenantid}");
+      dictionaryDao.save(tDictionary);
+    }
+    List<TPersonLevel> tPersonLevel = levelBean.gettPersonLevels();
+    personLevelDao.saveAll(tPersonLevel);
+    return JsonResult.ok("成功");
+  }
+
+  @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);
+    }
+    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("month",sort);
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day",sort);
+    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointslimit");
+    LevelBean levelBean = new LevelBean();
+    if(tDictionaries!=null&&tDictionaries.size()>0){
+      levelBean.setPointslimit(Integer.parseInt(tDictionaries.get(0).getDictval()));
+    }
+    if (!StringUtil.isEmpty(monthlist)) levelBean.setMonthList(monthlist);
+    if (!StringUtil.isEmpty(daylist)) levelBean.setDayList(daylist);
+    return levelBean;
+  }
+
+  @Override
+  public JsonResult saveConpoints(LevelBean levelBean) {
+    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointslimit");
+    if(tDictionaries!=null&&tDictionaries.size()>0){
+      tDictionaries.get(0).setDictval(levelBean.getPointslimit()+"");
+      dictionaryDao.save(tDictionaries.get(0));
+    }else {
+      TDictionary tDictionary = new TDictionary();
+      tDictionary.setDictcaption("积分中心的单日积分上限");
+      tDictionary.setDicttype("pointslimit");
+      tDictionary.setDicttypename("单日积分上限");
+      tDictionary.setDictval(levelBean.getPointslimit()+"");
+      tDictionary.setTenantId("{tenantid}");
+      dictionaryDao.save(tDictionary);
+    }
+    List<TConsumePoints> consumePoints = levelBean.gettConsumePoints();
+    consumePointsDao.saveAll(consumePoints);
+    return JsonResult.ok("成功");
+  }
+
+  @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) {
+    int rate = 1;
+    // 1.根据当天日期判断当天是否该用户的特殊日期或者生日，得到实际倍率
+    TPerson person =  personDao.findByUseridAndIdtype(userid,"idcard");
+    if(person!=null&&!StringUtil.isEmpty(person.getIdno())){
+      String nowDate = DateUtil.getNow("MMdd");
+      String brithdate = person.getIdno().substring(10,4);
+      if(nowDate.equals(brithdate)){
+        rate = 2;
+      }
+    }
+    //2. 查询用户的等级，获取单次消费获得积分的规则
+    TPersonLevel personLevel;
+    Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
+    if(pointsMain.orElse(null)!=null){
+      Integer levelid = pointsMain.orElse(null).getLevelid();
+      if(levelid!=null){
+        personLevel = personLevelDao.getOne(levelid);
+      }else {
+        if(pointsMain.orElse(null).getPoints()==null){
+          pointsMain.orElse(null).setPoints(0);
+        }
+        personLevel = personLevelDao.findTPersonLevelByPoints(pointsMain.orElse(null).getPoints());
+      }
+    }else {
+      return false;
+    }
+    //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.findAllByUseridAndTypeAndFlagstatus(userid,"","in");
+      int allPoints = tPointsdtls.stream().mapToInt(o -> Integer.parseInt(o.getPoints())).sum();
+      List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointslimit");
+      int pointslimit = 0;
+      if(tDictionaries!=null&&tDictionaries.size()>0){
+        pointslimit = Integer.parseInt(tDictionaries.get(0).getDictval());
+      }
+      if(allPoints<pointslimit){
+        if(allPoints+resultPoints>=pointslimit){
+          resultPoints = pointslimit - allPoints;
+        }
+      }
+    }
+    //4. 对积分的主子表和流水表进行添加，查询用户的积分，得到的积分去查询等级表更新用户的等级
+    insertDtl(userid, TradeDict.CONSUME_FLAG_SINGLE,resultPoints*rate,personLevel.getId(),billno);
+    return null;
+  }
+
+  @Override
+  public Boolean dayHandlePoints(String userid,String billno) {
+    // 1.根据用户id查询积分流水表获得当日的消费金额
+    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMMdd"),"none","success");
+    Double allConsume = tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    // 2.循环日消费奖励规则
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TConsumePoints> daylist = consumePointsDao.findAllByAndRuletype("day",sort);
+    for(TConsumePoints temp:daylist){
+      // 3.判断用户是否达到日消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
+      if(allConsume>Double.parseDouble(temp.getConsumeamount())){
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
+        if(tPointsdtltemp==null){
+          // 4.奖励的积分对积分主子表和流水表进行添加
+          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY,temp.getPoints(),temp.getId(),billno);
+        }
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public Boolean monthHandlePoints(String userid,String billno) {
+    // 1.根据用户id查询积分流水表获得当月的消费金额
+    List<TPersondtl> tPersondtl = persondtlDao.findAllByUseridAndTransdateStartingWithAndReverseFlagAndStatus(userid, DateUtil.getNow("yyyyMM"),"none","success");
+    Double allConsume = tPersondtl.stream().mapToDouble(o -> o.getAmount()).sum();
+    // 2.循环月消费奖励规则
+    Sort sort = new Sort(Sort.Direction.ASC, "id");
+    List<TConsumePoints> monthlist = consumePointsDao.findAllByAndRuletype("month",sort);
+    for(TConsumePoints temp:monthlist){
+    // 3.判断用户是否达到月消费奖励积分的额度，达到再次判断是否获得过该规则的奖励
+      if(allConsume>Double.parseDouble(temp.getConsumeamount())){
+        TPointsdtl tPointsdtltemp = pointsDtlDao.findAllByUseridAndTransdateAndRefno(userid, DateUtil.getNow("yyyyMMdd"), temp.getId());
+        if(tPointsdtltemp==null){
+          // 4.奖励的积分对积分主子表和流水表进行添加
+          insertDtl(userid, TradeDict.CONSUME_FLAG_DAY,temp.getPoints(),temp.getId(),billno);
+        }
+      }
+    }
+    return null;
+  }
+
+  public Boolean insertDtl(String userid,String type,int points,Integer refno,String billno){
+      //主表流水
+    TPointsMain tPointsMain;
+    Optional<TPointsMain> pointsMain = pointsMainDao.findById(userid);
+    if(pointsMain.orElse(null)!=null){
+      tPointsMain = pointsMain.orElse(null);
+      tPointsMain.setPoints(tPointsMain.getPoints()+points);
+      tPointsMain.setAccumPoints(tPointsMain.getAccumPoints()+points);
+      TPersonLevel tPersonLevelByPoints = personLevelDao.findTPersonLevelByPoints(tPointsMain.getPoints());
+      if(tPersonLevelByPoints.getId()>tPointsMain.getLevelid()){
+        tPointsMain.setLevelid(tPersonLevelByPoints.getId());
+      }
+    }else{
+      tPointsMain = new TPointsMain();
+      tPointsMain.setUserid(userid);
+      tPointsMain.setPoints(points);
+      tPointsMain.setAccumPoints(points);
+      TPersonLevel tPersonLevelByPoints = personLevelDao.findTPersonLevelByPoints(points);
+      tPointsMain.setLevelid(tPersonLevelByPoints.getId());
+    }
+    tPointsMain.setUpdatetime(DateUtil.getNow());
+    TPointsMain tPointsMainResult = pointsMainDao.save(tPointsMain);
+    //子表流水
+    TPointsDetail tPointsDetail = new TPointsDetail();
+    tPointsDetail.setUserid(userid);
+    tPointsDetail.setPoints(points);
+    List<TDictionary> tDictionaries =  dictionaryDao.findAllByDicttype("pointsdate");
+    if(tDictionaries!=null&&tDictionaries.size()>0){
+      String outdate = DateUtil.getNowInterDay(Integer.parseInt(tDictionaries.get(0).getDictval()));
+      tPointsDetail.setOutDate(outdate);
+    }else {
+      return false;
+    }
+    TPointsDetail tPointsDetailresult = pointsDetailDao.save(tPointsDetail);
+    //积分流水表信息
+    TPointsdtl tPointsdtl = new TPointsdtl();
+    tPointsdtl.setRefno(refno);
+    tPointsdtl.setType(type);
+    tPointsdtl.setUserid(userid);
+    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());
+    tPointsdtl.setFlagstatus("in");
+    tPointsdtl.setMainstatus("init");
+    TPointsdtl tPointsdtlresult = pointsDtlDao.save(tPointsdtl);
+
+    tPointsDetail.setPointsdtlId(tPointsdtlresult.getId());
+    pointsDetailDao.save(tPointsDetail);
+    return true;
+  }
+
+
+
+  @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 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("成功");
+  }
+}
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..3ba1de2 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
@@ -424,6 +424,7 @@
         originTrans.reverseFlag = TradeDict.REVERSE_FLAG_WIP
         originTrans.refundAmount = refundAmount
         transactionMainDao.save(originTrans)
+        //退款之后进行积分处理
         return transaction
     }
 
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..903a802 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,8 @@
             if (it.person && !it.personDtl.userid.isNullOrEmpty()) {
                 kafkaSendMsgService.sendJpushMessage(it.personDtl.userid, "交易提醒", "你有一笔${it.personDtl.amount}元的支出，点击查看详情", it.refno, mutableMapOf(), it.tenantid)
             }
+            //支付成功  进行积分处理
+
         }
     }
 
@@ -137,4 +144,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
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..1766c08
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/index.html
@@ -0,0 +1,718 @@
+<div class="layui-tab layui-tab-card">
+    <ul class="layui-tab-title">
+        <li class="layui-this">会员等级设置</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">
+                <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">1级会员设置:</div>
+                        <div class="layui-card-body">
+                            会员名称为  <input type="text" name="name" required lay-verify="required" autocomplete="off"
+                               class="layui-input"
+                               style="width: 150px;display: inline;height: 35px;margin: 6px" id="lename">
+                        ,累计积分为
+                        <input type="number" name="pointsLower" required lay-verify="required"
+                               autocomplete="off"
+                               class="layui-input"
+                               style="width: 80px;display: inline;height: 35px;margin: 6px" id="lelow">---
+                        <input type="number" name="pointsUpper" required lay-verify="required"
+                               autocomplete="off"
+                               class="layui-input"
+                               style="width: 80px;display: inline;height: 35px;margin: 6px" id="leupp">分。
+                        <input type="text" name="levelid" id="levelid1" style="display: none"/>
+                        <div style="margin-left: 85px">订单实付金额满
+                            <input type="number" name="singleConsumeAmount" id="singleConsumeAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元时，每消费
+                            <input type="number" name="singleAmount"  id="singleAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元，可获得
+                            <input type="number" name="singlePoints" id="singlePoints" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>积分;
+                        </div>
+                        </div>
+                    </div>
+                </div>
+                <div style="margin: 20px">
+                    <div style="font-weight: 700">积分到期设置</div>
+                    <div>每隔<input type="number" name="pointsdate" id="pointsdate" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>
+                        日,清除积分。<span style="font-weight: 200">(不影响历史积分,从修改当日起生效。)</span></div>
+                </div>
+            </form>
+        </div>
+        <div class="layui-tab-item" style="background-color: white">
+            <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>单日消费积分上限
+                            <input type="text" name="pointslimit" required lay-verify="required"
+                                   autocomplete="off"
+                                   class="layui-input"
+                                   style="width: 60px;display: inline;height: 28px;margin: 6px"
+                                   id="pointslimit">积分。
+                        </div>
+                    </div>
+                </div>
+                <div style="margin: 20px">
+                    <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>
+</div>
+<script>
+    layui.use(['layer', 'upload', 'form', 'element', 'admin', 'table'], 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);
+            });
+            let pointsdate = $("#pointsdate").val();
+            var data = {'tPersonLevels': tPersonLevels,'pointsdate': pointsdate};
+            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});
+                            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"> ' + x +
+                '级会员设置: </div>\n' +
+                '                        <div class="layui-card-body"> 会员名称为 ' +
+                '<input type="text" name="name" required lay-verify="required" autocomplete="off"' +
+                'class="layui-input" style="width: 150px;display: inline;height: 35px;margin: 6px">' +
+                '   ,累计积分为 ' +
+                '<input type="number" name="pointsLower" required lay-verify="required" autocomplete="off" class="layui-input"' +
+                'style="width: 80px;display: inline;height: 35px;margin: 6px">--- ' +
+                '<input type="number" name="pointsUpper" required lay-verify="required" autocomplete="off"' +
+                'class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px">分。 ' +
+                ' <input type="number" name="levelid' + x + '" id="levelid" style="display: none"/> ' +
+                '<button type="button" class="layui-btn layui-btn-danger removeclass" id="removeid' + x + '" style="display: inline">删除</button>' +
+                '<div style="margin-left: 85px">订单实付金额满\n' +
+                '<input type="number" name="singleConsumeAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元时，每消费\n' +
+                '<input type="number" name="singleAmount"  class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>元，可获得\n' +
+                '<input type="number" name="singlePoints" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" required lay-verify="required"/>积分;\n' +
+                '</div>  </div>'
+            '</div>';
+            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().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().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);
+                            $("#pointsdate").val(result.pointsdate);
+                        }
+                        if (i > 0) {
+                            var strr = ' <div class="levelclass layui-card" ><div class="layui-card-header">  ' + x +
+                                '级会员设置: </div>\n' +
+                                '                        <div class="layui-card-body"> 会员名称为 ' +
+                                '<input type="text" name="name" required lay-verify="required" autocomplete="off"' + 'value="' + datalist[i].name + '"' +
+                                'class="layui-input" style="width: 150px;display: inline;height: 35px;margin: 6px">' +
+                                '   ,累计积分为 ' +
+                                '<input type="number" name="pointsLower" required lay-verify="required" autocomplete="off" class="layui-input"' + 'value="' + datalist[i].pointsLower + '"' +
+                                'style="width: 80px;display: inline;height: 35px;margin: 6px">--- ' +
+                                '<input type="number" name="pointsUpper" required lay-verify="required" autocomplete="off"' + 'value="' + datalist[i].pointsUpper + '"' +
+                                'class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px">分。 ' +
+                                ' <input type="text" name="levelid" id="levelid' + x + '" style="display: none" ' + 'value="' + datalist[i].id + '"/> ' +
+                                '<button type="button" class="layui-btn layui-btn-danger removeclass" id="removeid' + x + '" style="display: inline">删除</button>' +
+                                '<div style="margin-left: 85px">订单实付金额满\n' +
+                                '<input type="number" name="singleConsumeAmount" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" ' + 'value="' + datalist[i].singleConsumeAmount + '"required lay-verify="required" />元时，每消费\n' +
+                                '<input type="number" name="singleAmount"  class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" ' + 'value="' + datalist[i].singleAmount + '" required lay-verify="required"/>元，可获得\n' +
+                                '<input type="number" name="singlePoints" class="layui-input" style="width: 80px;display: inline;height: 35px;margin: 6px" ' + 'value="' + datalist[i].singlePoints + '" required lay-verify="required"/>积分;\n' +
+                                '</div></div>'
+                            '</div>';
+                            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 = [];
+            let pointslimit;
+            $('.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);
+            });
+            pointslimit = $("#pointslimit").val();
+            var data = {'tConsumePoints': tConsumePoints,'pointslimit':pointslimit};
+            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);
+                            $("#pointslimit").val(result.pointslimit);
+                        }
+                        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();
+    })
+</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..16eed53
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/pointsactiveadd.html
@@ -0,0 +1,209 @@
+<!-- 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日'
+        });
+        laydate.render({
+            elem: '#end-date-value' //指定元素
+            ,format: 'yyyy年MM月dd日'
+        });
+        laydate.render({
+            elem: '#year-start-value' //指定元素
+            ,format: 'MM月dd日'
+        });
+        laydate.render({
+            elem: '#year-end-value' //指定元素
+            ,format: 'MM月dd日'
+        });
+        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..88d7d54
--- /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-searchkey" 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-status">
+                    <option value=""> 全部</option>
+                    <option value="no">不循环</option>
+                    <option value="month">月循环</option>
+                    <option value="year">年循环</option>
+                </select>
+            </div>
+            <button id="btn-chkstatus-search" class="layui-btn icon-btn" data-type="search"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i
+                    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-search').click(function () {
+            var name = $("#search-chkstatus-searchkey").val();
+            var type = $("#shop-manager-search-status").val();
+            table.reload('pointsActiveTable', {where: {name: name, type: type}});
+        });
+
+        $('#btn-reset-sysparam').click(function () {
+            $("#search-chkstatus-searchkey").val("");
+            $('#shop-manager-search-status 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/pointsdetail.html b/payapi/src/main/resources/templates/system/level/pointsdetail.html
new file mode 100644
index 0000000..29d326f
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/pointsdetail.html
@@ -0,0 +1,42 @@
+<table class="layui-table" id="pointsDetailTable" lay-filter="pointsDetailTable-filter"></table>
+<script>
+    layui.use(['layer', 'table', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var table = layui.table;
+        var bean = admin.getTempData('t_bean');
+        console.log(bean)
+        if (bean) {
+            table.render({
+                elem: '#pointsDetailTable',
+                url: '[[@{/pointsdetail/list}]]',
+                page: true,
+                where: {userid: bean.userid},
+                cols: [
+                    [
+                        {
+                            field: 'type',
+                            title: '积分来源',
+                            width: 140,
+                            align: 'center',
+                            fixed: 'left',
+                            sort: true
+                        },
+                        {field: 'points', title: '积分变化', width: 130, align: 'center'},
+                        {
+                            field: 'transtime',
+                            title: '时间',
+                            width: 160,
+                            align: 'center',
+                            templet: function (item) {
+                                let datetemp = item.transdate + item.transtime;
+                                return admin.formatDate(datetemp);
+                            }
+                        }
+                    ]
+                ]
+            });
+        }
+    });
+</script>
diff --git a/payapi/src/main/resources/templates/system/level/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..0e98a3e
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/level/userpointsindex.html
@@ -0,0 +1,170 @@
+<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-searchkey" 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">
+                <option value=""> 全部</option>
+                <option value="consume">消费获得</option>
+                <option value="task">任务获得</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="startDate"
+                           placeholder="开始日期"
+                           autocomplete="off" class="layui-input"/>
+                </div>
+                -
+                <div class="layui-input-inline" style="width: 120px;">
+                    <input type="text" name="endDate" id="endDate" placeholder="结束日期"
+                           autocomplete="off"
+                           class="layui-input"/>
+                </div>
+            </div>
+            <button id="btn-chkstatus-search" class="layui-btn icon-btn" data-type="search" style="margin-top: 10px"><i
+                    class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-reset-sysparam" 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: '#startDate'
+            ,format: 'yyyy年MM月dd日'
+        });
+        laydate.render({
+            elem: '#endDate'
+            ,format: 'yyyy年MM月dd日'
+        });
+        // 渲染表格
+        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
+                    },
+                    {field: 'points', title: '获得积分', width: 130, align: 'center'},
+                    {field: 'aftpoints', title: '目前可用积分', width: 160, align: 'center'},
+
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-chkstatus-search').click(function () {
+            let name = $("#search-chkstatus-searchkey").val();
+            let idno = $("#search-account").val();
+            let startDate = $("#startDate").val();
+            let endDate = $("#endDate").val();
+            let pointsName = $("#points-name").val();
+            table.reload('userPointsTable', {where: {name: name, idno: idno,startDate:startDate,endDate:endDate,pointsName:pointsName}});
+        });
+
+        $('#btn-reset-sysparam').click(function () {
+            $("#search-chkstatus-searchkey").val("");
+            $("#search-account").val("");
+            $("#startDate").val("");
+            $("#endDate").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>
