积分模块
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>