diff --git a/src/main/java/com/supwisdom/dlpay/conference/bean/ConfPeopleImportBean.java b/src/main/java/com/supwisdom/dlpay/conference/bean/ConfPeopleImportBean.java
new file mode 100644
index 0000000..b77c180
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/bean/ConfPeopleImportBean.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.conference.bean;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+
+import java.io.Serializable;
+
+public class ConfPeopleImportBean implements Serializable {
+    @Excel(name = "姓名")
+    private String custname;
+    @Excel(name="市民卡号")
+    private String cardno;
+
+
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/bean/ConferenceShowBean.java b/src/main/java/com/supwisdom/dlpay/conference/bean/ConferenceShowBean.java
new file mode 100644
index 0000000..942b92c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/bean/ConferenceShowBean.java
@@ -0,0 +1,86 @@
+package com.supwisdom.dlpay.conference.bean;
+
+public class ConferenceShowBean {
+    private String confname;
+    private String conftype;
+    private String confdate;
+    private String status;
+    private String remark;
+    private String starttime;
+    private String endtime;
+    private String attendtime;
+    private String timeperoid;
+
+    public String getConfname() {
+        return confname;
+    }
+
+    public void setConfname(String confname) {
+        this.confname = confname;
+    }
+
+
+    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 getConftype() {
+        return conftype;
+    }
+
+    public void setConftype(String conftype) {
+        this.conftype = conftype;
+    }
+
+    public String getConfdate() {
+        return confdate;
+    }
+
+    public void setConfdate(String confdate) {
+        this.confdate = confdate;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getTimeperoid() {
+        return timeperoid;
+    }
+
+    public void setTimeperoid(String timeperoid) {
+        this.timeperoid = timeperoid;
+    }
+
+    public String getAttendtime() {
+        return attendtime;
+    }
+
+    public void setAttendtime(String attendtime) {
+        this.attendtime = attendtime;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java b/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
new file mode 100644
index 0000000..3455a5e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
@@ -0,0 +1,197 @@
+package com.supwisdom.dlpay.conference.controller;
+
+import cn.afterturn.easypoi.entity.vo.MapExcelConstants;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.view.PoiBaseView;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.conference.bean.ConferenceShowBean;
+import com.supwisdom.dlpay.conference.service.ConferenceService;
+import com.supwisdom.dlpay.conference.util.ConferenceConstant;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+public class ConferenceController {
+    @Autowired
+    private ConferenceService conferenceService;
+
+
+    @GetMapping("/conference/index")
+    public String ConferenceView() {
+        return "conference/conflist";
+    }
+
+    @GetMapping("/conference/conflist")
+    @ResponseBody
+    public PageResult<ConferenceShowBean> searchDiscountRules(@RequestParam("page") Integer pageNo,
+                                                              @RequestParam("limit") Integer pageSize,
+                                                              @RequestParam(value = "confname", required = false) String confname,
+                                                              @RequestParam(value = "conftype", required = false) String conftype) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            return conferenceService.getConferenceInfos(confname, conftype, pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+  /*  @PostMapping("/discountconf/deleteconf")
+    @PreAuthorize("hasPermission('/discountconf/deleteconf','')")
+    @ResponseBody
+    public JsonResult deleteDiscountRule(@RequestParam("confid") Integer confid) {
+        try {
+            if (null == confid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (deviceDiscountRuleService.deleteDiscountRule(confid)) {
+                return JsonResult.ok("删除成功！");
+            } else {
+                return JsonResult.error("删除失败！");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+    @PostMapping("/discountconf/closeconf")
+    @PreAuthorize("hasPermission('/discountconf/closeconf','')")
+    @ResponseBody
+    public JsonResult closeDiscountRule(@RequestParam("confid") Integer confid) {
+        try {
+            if (null == confid) {
+                return JsonResult.error("参数传递错误");
+            }
+            if (deviceDiscountRuleService.closeDiscountRule(confid)) {
+                return JsonResult.ok("关闭成功！");
+            } else {
+                return JsonResult.error("关闭失败！");
+            }
+        } catch (WebCheckException ex) {
+            return JsonResult.error(ex.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }*/
+
+
+    @GetMapping("/conference/load4addconf")
+    public String load4addConference(Model model) {
+        String now=DateUtil.getNow("yyyyMMdd");
+        model.addAttribute("maxdate",DateUtil.reformatDatetime(now,"yyyyMMdd","yyyy-MM-dd"));
+        return "conference/confform";
+    }
+
+  
+
+    @PostMapping("/conference/addconf")
+    @ResponseBody
+    public JsonResult editDiscountRule(@RequestParam("confname") String confname,
+                                       @RequestParam("conftype") String conftype,
+                                       @RequestParam("confdate") String confdate,
+                                       @RequestParam("starttime") String starttime,
+                                       @RequestParam("endtime") String endtime,
+                                       @RequestParam("attendtime") String attendtime,
+                                       @RequestParam(value = "file", required = false) MultipartFile file,
+                                       @AuthenticationPrincipal UserDetails operUser,
+                                       HttpServletRequest request) {
+        try {
+            if (StringUtil.isEmpty(confname)
+                    || (!ConferenceConstant.CONFTYPE_LIST.equals(conftype) && !ConferenceConstant.CONFTYPE_NOLIST.equals(conftype) )
+                    || !DateUtil.checkDatetimeValid(starttime, "HH:mm")
+                    || !DateUtil.checkDatetimeValid(endtime, "HH:mm")
+                    || !DateUtil.checkDatetimeValid(attendtime, "HH:mm")) {
+                return JsonResult.error("参数传递错误");
+            } else if (DateUtil.compareDatetime(endtime, starttime, "HH:mm") <= 0) {
+                return JsonResult.error("时间范围错误，结束时间必须比起始时间大");
+            }else if (DateUtil.compareDatetime(starttime, attendtime, "HH:mm") <= 0) {
+                return JsonResult.error("时间范围错误，起始时间必须比签到时间大");
+            }
+            TOperator oper = (TOperator) operUser;
+            if (null == oper || StringUtil.isEmpty(oper.getOperid())) {
+                return JsonResult.error("登录过期，请重新登录");
+            }
+            System.out.println("file::"+file);
+            String path = request.getSession().getServletContext().getRealPath("upload");
+
+            String fpath=null;
+            if(null!=file){
+                String fileName = file.getOriginalFilename();
+                File targetFile = new File(path, fileName);
+                if (!targetFile.exists()) {
+                    targetFile.mkdirs();
+                }
+                file.transferTo(targetFile);
+                fpath=path + "/" + fileName;
+            }
+
+            if (conferenceService.saveNewConference(confname.trim(),DateUtil.unParseToDateFormat(confdate), conftype, DateUtil.unParseToDateFormat(starttime), DateUtil.unParseToDateFormat(endtime),DateUtil.unParseToDateFormat(attendtime), oper,fpath)) {
+                return JsonResult.ok("新增成功");
+            } else {
+                return JsonResult.error("新增失败");
+            }
+        }catch (WebCheckException e) {
+            return JsonResult.ok(599, e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return JsonResult.error("系统处理异常").put("exception", e);
+        }
+    }
+
+
+    @GetMapping("/conference/downloadexcel")
+    @ResponseBody
+    public void downloadDiscountRuleExcel(HttpServletRequest request, HttpServletResponse response, ModelMap map) {
+        try {
+            List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
+            /**
+             * 1. 设置列信息：name：列标题   key：	列属性
+             */
+            entity.add(new ExcelExportEntity("市民卡号", "cardno"));
+            entity.add(new ExcelExportEntity("姓名", "custname"));
+            List<Map> personList = new ArrayList<Map>();
+
+            /**
+             * 3.设置表格属性: title:标题  sheetName:工作簿名 type:表格类型
+             */
+            ExportParams params = new ExportParams(null, "sheet1", ExcelType.HSSF);
+            map.put(MapExcelConstants.MAP_LIST, personList);
+            map.put(MapExcelConstants.ENTITY_LIST, entity);
+            map.put(MapExcelConstants.PARAMS, params);
+            map.put(MapExcelConstants.FILE_NAME, "会议名单导入模板");//文件名
+            map.put("result", "导出excel文件完成");
+            PoiBaseView.render(map, request, response, MapExcelConstants.EASYPOI_MAP_EXCEL_VIEW);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("result", "导出excel文件失败");
+        }
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java
new file mode 100644
index 0000000..1a7cf7a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.conference.dao;
+
+
+import com.supwisdom.dlpay.conference.domain.TConfPeople;
+import com.supwisdom.dlpay.conference.domain.TConferenceDevbind;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ConfPeopleDao extends JpaRepository<TConfPeople, String> {
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java
new file mode 100644
index 0000000..4ef8249
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.conference.dao;
+
+
+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 com.supwisdom.dlpay.conference.domain.TConference;
+
+@Repository
+public interface ConferenceDao extends JpaRepository<TConference, Integer> , JpaSpecificationExecutor<TConference> {
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDevbindDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDevbindDao.java
new file mode 100644
index 0000000..ad6af9f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDevbindDao.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.conference.dao;
+
+
+import com.supwisdom.dlpay.conference.domain.TConferenceDevbind;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ConferenceDevbindDao extends JpaRepository<TConferenceDevbind, String> {
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java
new file mode 100644
index 0000000..ec104e4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.conference.dao;
+
+
+import com.supwisdom.dlpay.conference.domain.TConfPeople;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface NolistConfPeopleDao extends JpaRepository<TConfPeople, String> {
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java
new file mode 100644
index 0000000..b52fc7b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java
@@ -0,0 +1,90 @@
+package com.supwisdom.dlpay.conference.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_ConfPeople",
+        indexes = {@Index(name = "ConfPeople_confid_idx", columnList = "confid")})
+public class TConfPeople {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name="CARDNO", length = 8)
+  private String cardno;
+
+  @Column(name="CONFID", length = 9)
+  private Integer confid;
+
+  @Column(name="CUSTNAME", length = 60)
+  private String custname;
+
+  @Column(name="CUSTID", length = 32)
+  private String custid;
+
+  @Column(name="ATTSTATUS", nullable = false, length = 12)
+  private String attstatus;
+
+  @Column(name="LASTSAVED", length = 14)
+  private String lastsaved;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public Integer getConfid() {
+    return confid;
+  }
+
+  public void setConfid(Integer confid) {
+    this.confid = confid;
+  }
+
+  public String getCustname() {
+    return custname;
+  }
+
+  public void setCustname(String custname) {
+    this.custname = custname;
+  }
+
+  public String getCustid() {
+    return custid;
+  }
+
+  public void setCustid(String custid) {
+    this.custid = custid;
+  }
+
+  public String getAttstatus() {
+    return attstatus;
+  }
+
+  public void setAttstatus(String attstatus) {
+    this.attstatus = attstatus;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java
new file mode 100644
index 0000000..4ce3b5e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java
@@ -0,0 +1,153 @@
+package com.supwisdom.dlpay.conference.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_CONFERENCE")
+public class TConference {
+    @Id
+    @SequenceGenerator(name = "discount_ruleid", sequenceName = "SEQ_DISCOUNTRULEID", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "discount_ruleid")
+    @Column(name = "CONFID", nullable = false, precision = 9)
+    private Integer confid;
+
+    @Column(name = "CONFNAME", nullable = false, length = 200)
+    private String confname;
+
+    @Column(name = "CONFDATE", nullable = false, length = 8)
+    private String confdate;
+
+    @Column(name = "STARTTIME", nullable = false, length = 4)
+    private String starttime;
+
+    @Column(name = "ENDTIME", nullable = false, length = 4)
+    private String endtime;
+
+    @Column(name = "ATTENDTIME", nullable = false, length = 4)
+    private String attendtime;
+
+    @Column(name = "DEPARTCODE", length = 32)
+    private String departcode;
+
+    @Column(name = "STATUS", nullable = false, length = 10)
+    private String status;
+
+    @Column(name = "CONFTYPE", length = 10)
+    private String conftype;
+
+    @Column(name = "CREATE_OPERID", length = 32)
+    private String createOperid;
+
+    @Column(name = "CREATETIME", length = 14)
+    private String createtime;
+
+    @Column(name = "LASTSAVED", length = 14)
+    private String lastsaved;
+
+    @Column(name = "REMARK", length = 600)
+    private String remark;
+
+    public Integer getConfid() {
+        return confid;
+    }
+
+    public void setConfid(Integer confid) {
+        this.confid = confid;
+    }
+
+    public String getConfname() {
+        return confname;
+    }
+
+    public void setConfname(String confname) {
+        this.confname = confname;
+    }
+
+    public String getConfdate() {
+        return confdate;
+    }
+
+    public void setConfdate(String confdate) {
+        this.confdate = confdate;
+    }
+
+    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 getAttendtime() {
+        return attendtime;
+    }
+
+    public void setAttendtime(String attendtime) {
+        this.attendtime = attendtime;
+    }
+
+    public String getDepartcode() {
+        return departcode;
+    }
+
+    public void setDepartcode(String departcode) {
+        this.departcode = departcode;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getCreateOperid() {
+        return createOperid;
+    }
+
+    public void setCreateOperid(String createOperid) {
+        this.createOperid = createOperid;
+    }
+
+    public String getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(String createtime) {
+        this.createtime = createtime;
+    }
+
+    public String getLastsaved() {
+        return lastsaved;
+    }
+
+    public void setLastsaved(String lastsaved) {
+        this.lastsaved = lastsaved;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getConftype() {
+        return conftype;
+    }
+
+    public void setConftype(String conftype) {
+        this.conftype = conftype;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConferenceDevbind.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConferenceDevbind.java
new file mode 100644
index 0000000..e33217a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConferenceDevbind.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.conference.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_CONFERENCE_DEVBIND",
+    indexes = {@Index(name = "conference_devbind_uk", unique = true, columnList = "deviceid,confid")})
+public class TConferenceDevbind {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name = "DEVICEID", nullable = false, precision = 9)
+  private Integer deviceid;
+
+  @Column(name = "CONFID", nullable = false, precision = 9)
+  private Integer confid;
+
+  @Column(name = "CREATE_OPERID", length = 32)
+  private String createOperid;
+
+  @Column(name = "CREATETIME", length = 14)
+  private String createtime;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Integer getDeviceid() {
+    return deviceid;
+  }
+
+  public void setDeviceid(Integer deviceid) {
+    this.deviceid = deviceid;
+  }
+
+  public Integer getConfid() {
+    return confid;
+  }
+
+  public void setConfid(Integer confid) {
+    this.confid = confid;
+  }
+
+  public String getCreateOperid() {
+    return createOperid;
+  }
+
+  public void setCreateOperid(String createOperid) {
+    this.createOperid = createOperid;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java
new file mode 100644
index 0000000..1bcad07
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java
@@ -0,0 +1,90 @@
+package com.supwisdom.dlpay.conference.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_Nolist_ConfPeople",
+        indexes = {@Index(name = "NolistPeople_confid_idx", columnList = "confid")})
+public class TNolistConfPeople {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @Column(name="CARDNO", length = 8)
+  private Integer cardno;
+
+  @Column(name="CONFID", length = 9)
+  private Integer confid;
+
+  @Column(name="CUSTNAME", length = 60)
+  private String custname;
+
+  @Column(name="CUSTID", length = 32)
+  private String custid;
+
+  @Column(name="ATTSTATUS", nullable = false, length = 12)
+  private String attstatus;
+
+  @Column(name="LASTSAVED", length = 14)
+  private String lastsaved;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Integer getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(Integer cardno) {
+    this.cardno = cardno;
+  }
+
+  public Integer getConfid() {
+    return confid;
+  }
+
+  public void setConfid(Integer confid) {
+    this.confid = confid;
+  }
+
+  public String getCustname() {
+    return custname;
+  }
+
+  public void setCustname(String custname) {
+    this.custname = custname;
+  }
+
+  public String getCustid() {
+    return custid;
+  }
+
+  public void setCustid(String custid) {
+    this.custid = custid;
+  }
+
+  public String getAttstatus() {
+    return attstatus;
+  }
+
+  public void setAttstatus(String attstatus) {
+    this.attstatus = attstatus;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java b/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
new file mode 100644
index 0000000..6ae6352
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
@@ -0,0 +1,63 @@
+package com.supwisdom.dlpay.conference.service;
+
+import com.supwisdom.dlpay.conference.bean.ConferenceShowBean;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+public interface ConferenceService {
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype, int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean deleteConference(int confid) ;
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean closeConference(int confid) ;
+
+/*
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    boolean checkConferencenameExist(String confname,Integer confid);*/
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean saveNewConference(String confname,String confdate, String conftype, String starttime,
+                              String endtime, String attendtime, TOperator oper, String filepath) throws Exception;
+
+/*
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<TDiscountDetail> getConferenceDetails(String searchkey, int confid, int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<ConferenceShowBean> getCheckConferenceInfos(String status, int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean doCheckConference(int confid, boolean passflag, String reason, TOperator oper) throws Exception;
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    List<ConferenceSelectBean> getNormalConferences();
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<ConferenceBindShowBean> getConferenceDevBindInfo(String searchkey, int pageNo, int pageSize);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    TDiscountDevbind getDiscountDevbindById(String id);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    DiscountBean getCustomerDiscount(Integer deviceid, String termtime,String custid);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean deleteDiscountDevbind(TDiscountDevbind bind);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<DevparaBinddevShowBean> searchRuleBindDevices(Integer devgroupid, String searchkey, int confid);
+
+    @Transactional(rollbackFor = Exception.class)
+    boolean saveRuleBindDevices(int confid, List<Integer> deviceIds, TOperator oper)  ;
+*/
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/service/impl/ConferenceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/conference/service/impl/ConferenceServiceImpl.java
new file mode 100644
index 0000000..1186265
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/service/impl/ConferenceServiceImpl.java
@@ -0,0 +1,192 @@
+package com.supwisdom.dlpay.conference.service.impl;
+
+
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import com.supwisdom.dlpay.conference.bean.ConfPeopleImportBean;
+import com.supwisdom.dlpay.conference.bean.ConferenceShowBean;
+import com.supwisdom.dlpay.conference.dao.ConfPeopleDao;
+import com.supwisdom.dlpay.conference.dao.ConferenceDao;
+import com.supwisdom.dlpay.conference.domain.TConfPeople;
+import com.supwisdom.dlpay.conference.domain.TConference;
+import com.supwisdom.dlpay.conference.service.ConferenceService;
+import com.supwisdom.dlpay.conference.util.ConferenceConstant;
+import com.supwisdom.dlpay.doorlist.bean.CustomerListBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+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.mainservice.domain.TCard;
+import com.supwisdom.dlpay.mainservice.domain.TCustomer;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ConferenceServiceImpl implements ConferenceService {
+
+    @Autowired
+    private ConferenceDao conferenceDao;
+    @Autowired
+    private WebInterfaceService webInterfaceService;
+    @Autowired
+    private ConfPeopleDao confPeopleDao;
+
+    @Override
+    public PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype, int pageNo, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("confdate"));
+
+        Page<TConference> page = conferenceDao.findAll(new Specification<TConference>() {
+            @Override
+            public Predicate toPredicate(Root<TConference> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+                List<Predicate> predicates = new ArrayList<>();
+                if (!StringUtil.isEmpty(confname)) {
+                    predicates.add(criteriaBuilder.like(root.get("confname").as(String.class), "%" + confname.trim() + "%"));
+                }
+                if (!StringUtil.isEmpty(conftype)) {
+                    predicates.add(criteriaBuilder.equal(root.get("conftype").as(String.class), conftype));
+
+                }
+              /*  if (!StringUtil.isEmpty(status)) {
+                    predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), status));
+                }*/
+                return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+            }
+        }, pageable);
+        List<ConferenceShowBean> result = new ArrayList<>(0);
+        if (null != page && page.getTotalElements() > 0) {
+            for (TConference conf : page.getContent()) {
+                ConferenceShowBean bean = new ConferenceShowBean();
+                bean.setConfname(conf.getConfname());
+                bean.setConfdate(conf.getConfdate());
+                bean.setConftype(conf.getConftype());
+                bean.setStatus(conf.getStatus());
+                bean.setRemark(conf.getRemark());
+                bean.setStarttime(conf.getStarttime().substring(0, 2) + ":" + conf.getStarttime().substring(2));
+                bean.setEndtime(conf.getEndtime().substring(0, 2) + ":" + conf.getEndtime().substring(2));
+                bean.setTimeperoid(bean.getStarttime()+"~"+bean.getEndtime());
+                bean.setAttendtime(conf.getAttendtime().substring(0, 2) + ":" + conf.getAttendtime().substring(2));
+                result.add(bean);
+            }
+        }
+        return new PageResult<>(page.getTotalElements(), result);
+    }
+
+    @Override
+    public boolean deleteConference(int confid) {
+        return false;
+    }
+
+    @Override
+    public boolean closeConference(int confid) {
+        return false;
+    }
+
+    @Override
+    public boolean saveNewConference(String confname,String confdate, String conftype, String starttime, String endtime,String attendtime, TOperator oper, String fpath) throws Exception {
+        TConference conf = new TConference();
+        conf.setConftype(conftype);
+        conf.setConfname(confname);
+        conf.setAttendtime(attendtime);
+        conf.setConfdate(confdate);
+        conf.setStatus(ConferenceConstant.CONFSTATUS_UNSTART);
+        conf.setCreateOperid(oper.getOperid());
+        conf.setStarttime(starttime);
+        conf.setEndtime(endtime);
+        conf.setDepartcode(oper.getDeptcode());
+        String systime = DateUtil.getNow();
+        conf.setCreatetime(systime);
+        conf.setLastsaved(systime);
+        conf = conferenceDao.save(conf);
+
+        if(ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())){
+            return true;
+        }
+
+        List<String> successCardnos = new ArrayList<>(0);
+        List<String> errmsgList = new ArrayList<>(0);
+
+        ImportParams params = new ImportParams();
+        params.setTitleRows(0);
+        List<ConfPeopleImportBean> peoplelist = ExcelImportUtil.importExcel(new File(fpath), ConfPeopleImportBean.class, params);
+        if (peoplelist.size() <= 0) {
+            throw new WebCheckException("模板数据为空");
+        }
+
+        try {
+            for (int n = 0; n < peoplelist.size(); n++) {
+                String msg = "";
+                String cardno =peoplelist.get(n).getCardno().trim();
+                String name = peoplelist.get(n).getCustname().trim();
+                if (StringUtil.isEmpty(cardno)) {
+                    msg += "，市民卡号为空";
+                }
+                if (StringUtil.isEmpty(name)) {
+                    msg += "，姓名为空";
+                }
+                TCustomerInfo customer = webInterfaceService.getAllTCustomerList(name,cardno,null).get(0);
+                if (!StringUtil.isEmpty(cardno)) {
+                    if (null == customer) {
+                        msg += "，市民卡用户不存在";
+                    } else if (!customer.getCustname().equals(name)) {
+                        msg += "，市民卡号与姓名不匹配！";
+                    }
+                }
+                if (!StringUtil.isEmpty(cardno) && successCardnos.contains(cardno)) {
+                    msg += "，市民卡号重复！";
+                }
+
+
+                if (!StringUtil.isEmpty(msg)) {
+                    errmsgList.add("第" + (n + 1) + "行数据错误" + msg);
+                } else {
+                    TConfPeople people = new TConfPeople();
+                    people.setAttstatus(ConferenceConstant.ATTENDSTATUS_UNCHECK);
+                    people.setCardno(cardno);
+                    people.setCustid(customer.getCustid());
+                    people.setConfid(conf.getConfid());
+                    people.setLastsaved(DateUtil.getNow());
+                    people.setCustname(name);
+                    confPeopleDao.save(people); //保存明细
+
+                    successCardnos.add(cardno);
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new WebCheckException("模板格式有误，请确保卡号为文本格式");
+        }
+
+        if (!StringUtil.isEmpty(errmsgList)) {
+            StringBuffer errmsg = new StringBuffer("导入失败，名单存在错误！");
+            for (int j = 0; j < errmsgList.size(); j++) {
+                errmsg.append("<br/>" + errmsgList.get(j));
+                if (j > 10) {
+                    errmsg.append("<br/>错误太多，请仔细核对名单后再上传！");
+                }
+            }
+            throw new WebCheckException(errmsg.toString());
+        }
+        return true;
+
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java b/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java
new file mode 100644
index 0000000..549358d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.conference.util;
+
+public class ConferenceConstant {
+    public static final String CONFTYPE_LIST="list";
+    public static final String CONFTYPE_NOLIST="nolist";
+    public static final String CONFSTATUS_START="start";
+    public static final String CONFSTATUS_UNSTART="unstart";
+    public static final String CONFSTATUS_OVER="over";
+    public static final String CONFSTATUS_CLOSED="closed";
+    public static final String ATTENDSTATUS_UNCHECK="uncheck";
+    public static final String ATTENDSTATUS_CHECKED="checked";
+    public static final String ATTENDSTATUS_LATE="late";
+    public static final String ATTENDSTATUS_INSTEAD="instead";
+
+
+}
diff --git a/src/main/resources/templates/conference/confform.html b/src/main/resources/templates/conference/confform.html
new file mode 100644
index 0000000..cfc45f0
--- /dev/null
+++ b/src/main/resources/templates/conference/confform.html
@@ -0,0 +1,228 @@
+<div id="conference-form" lay-filter="conference-form-filter" class="layui-form model-form" style="padding: 10px 25px;">
+    <input type="hidden" id="conference-hidden-maxdate" th:value="${maxdate}"/>
+    <div class="layui-form-item">
+        <label class="confinput-label layui-form-label confinput-label">会议类型</label>
+        <div class="layui-input-block">
+            <input type="radio" name="conftype" id="form-conference-conftype-list"
+                   lay-filter="conference-conftype-filter" value="list" title="有名单" checked/>
+            <input type="radio" name="conftype" id="form-conference-conftype-nolist"
+                   lay-filter="conference-conftype-filter" value="nolist" title="无名单"/>
+
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="confinput-label layui-form-label"><span style="color: red">* </span>会议名称</label>
+        <div class="layui-input-block">
+            <input type="text" class="layui-input" name="confname" id="form-conference-confname" maxlength="20"
+                   style="width: 90%;"
+                   autocomplete="off" lay-verify="required|Confname"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="confinput-label layui-form-label"><span style="color: red">* </span>会议名称</label>
+        <div class="layui-input-inline">
+            <input type="text" name="confdate" id="form-conference-confdate" placeholder="会议日期" th:value="${maxdate}"
+                   autocomplete="off" class="layui-input"/>
+        </div>
+    </div>
+
+
+    <div class="layui-form-item">
+        <label class="confinput-label layui-form-label"><span style="color: red">* </span>会议时间段</label>
+        <div class="layui-input-inline" style="width: 100px;">
+            <input type="text" name="starttime" placeholder="9:00" id="form-conference-starttime" autocomplete="off"
+                   maxlength="5"
+                   class="layui-input" lay-verify="required"/>
+        </div>
+        <div class="layui-form-mid">-</div>
+        <div class="layui-input-inline" style="width: 100px;">
+            <input type="text" name="endtime" placeholder="12:00" id="form-conference-endtime" autocomplete="off"
+                   maxlength="5"
+                   class="layui-input" lay-verify="required"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="confinput-label layui-form-label"><span style="color: red">* </span>签到时间</label>
+        <div class="layui-input-inline" style="width: 100px;">
+            <input type="text" name="attendtime" placeholder="8:30" id="form-conference-attendtime" autocomplete="off"
+                   maxlength="5"
+                   class="layui-input" lay-verify="required"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item" id="conference-conflist">
+        <label class="confinput-label layui-form-label"><span style="color: red">* </span>会议人员</label>
+        <!-- <div class="layui-input-block">
+             <select lay-verify="required" name="listid" class="layui-select" id="conference-form-select-listid">
+                 <option th:each="lst:${listbeans}" th:value="${lst.listid}"
+                         th:text="${lst.listname}"></option>
+             </select>&emsp;
+         </div>-->
+        <div class="layui-input-inline" style="width: auto;">
+            <button type="button" class="layui-btn upoadfile-btn">
+                <i class="layui-icon">&#xe67c;</i>上传名单
+                <input type="file" name="file" id="form-conference-records" style="width:auto;"/>
+            </button>
+        </div>
+        <div class="layui-input-inline" style="padding-top: 15px;">
+            <a th:href="@{/conference/downloadexcel}"
+               style="color: blue;text-decoration: none;cursor: pointer;">下载名单模板</a>
+        </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="conference-form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</div>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'laydate', 'upload'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var laydate = layui.laydate;
+        var upload = layui.upload;
+
+        var confType = 'list';
+
+        form.render("select");
+        laydate.render({
+            elem: '#form-conference-starttime',
+            type: 'time',
+            format: 'HH:mm',
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#form-conference-endtime',
+            type: 'time',
+            format: 'HH:mm',
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#form-conference-attendtime',
+            type: 'time',
+            format: 'HH:mm',
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#form-conference-confdate',
+            min: $("#conference-hidden-maxdate").val(),
+            trigger: 'click'
+        });
+
+        form.render("radio");
+
+        form.on('radio(conference-conftype-filter)', function (data) {
+            changeDiscountRuletype(data.value);
+            confType = data.value;
+        });
+
+        var changeDiscountRuletype = function (val) {
+            if ('nolist' == val) {
+                $("#conference-conflist").hide();
+            } else {
+                $("#conference-conflist").show();
+            }
+        }
+
+        form.on('submit(conference-form-submit)', function (data) {
+            debugger
+            var token = $("meta[name='_csrf_token']").attr("value");
+            var vdata = data.field;
+            if (null == vdata.starttime || null == vdata.endtime) {
+                layer.msg("请选择时间段", {icon: 2, time: 1500});
+                return;
+            } else if (vdata.endtime <= vdata.starttime) {
+                layer.msg("请正确选择时间段", {icon: 2, time: 1500});
+                return;
+            } else if (vdata.starttime <= vdata.attendtime) {
+                layer.msg("签到时间必须早于开始时间", {icon: 2, time: 1500});
+                return;
+            }
+
+
+            var formData = new FormData();
+            formData.append("conftype", vdata.conftype);
+            formData.append("confname", vdata.confname);
+            formData.append("starttime", vdata.starttime);
+            formData.append("endtime", vdata.endtime);
+            formData.append("attendtime", vdata.attendtime);
+            formData.append("confdate",vdata.confdate);
+            var flag=false;
+            var files = $('#form-conference-records').prop('files');
+            for (var i = 0; i < files.length; i++) {
+                var filename = files[i].name;
+                var suffix = filename.substr(filename.lastIndexOf("."));
+                if ('.xls' != suffix && '.xlsx' != suffix) {
+                    layer.msg("请选择excel文件", {icon: 2, time: 1500});
+                    return;
+                }
+                formData.append('file', files[i]);
+                flag = true;
+            }
+            if (!flag&&"list"==vdata.conftype) {
+                layer.msg("请选择名单", {icon: 2, time: 1500});
+                return;
+            }
+
+            layer.load(2);
+            $.ajax({
+                type: "POST",
+                url: '[[@{/conference/addconf}]]',
+                dataType: 'json',
+                processData: false,
+                contentType: false,
+                data: formData,
+                headers: {
+                    'Accept': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1, time: 1500});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('[[@{/login}]]');
+                        }, 1000);
+                        return;
+                    } else if (result.code == 599) {
+                        //自定义错误
+                        layer.open({
+                            type: 0,
+                            title: "错误信息",
+                            icon: 2,
+                            area: ['600px', '400px'],
+                            content: result.msg
+                        });
+
+                    } else {
+                        layer.msg(result.msg, {icon: 2, time: 1500});
+                    }
+                },
+                error: function (err) {
+                    admin.errorBack(err);
+                }
+            });
+        });
+    });
+</script>
+
+<style>
+    .confinput-label {
+        width: 24%;
+    }
+
+    .upoadfile-btn input {
+        position: absolute;
+        font-size: 100px;
+        right: 0;
+        top: 0;
+        opacity: 0;
+        width: 113px;
+        height: 34px;
+    }
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/conference/conflist.html b/src/main/resources/templates/conference/conflist.html
new file mode 100644
index 0000000..e3e175d
--- /dev/null
+++ b/src/main/resources/templates/conference/conflist.html
@@ -0,0 +1,179 @@
+<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">
+            搜索：
+            <select id="search-conference-conftype">
+                <option value=""> 选择会议类型 </option>
+                <option value="list"> 有名单 </option>
+                <option value="nolist"> 无名单 </option>
+            </select>&emsp;
+            <input id="search-conference-confname" class="layui-input search-input" maxlength="20" type="text" placeholder="输入名称查询"/>&emsp;
+            <button id="btn-search-conference" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-conference-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+        </div>
+        <table class="layui-table" id="conferenceTable" lay-filter="conferenceTable-filter"></table>
+    </div>
+</div>
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="conference-table-bar">
+    {{# if(d.conftype=='list' ){ }}
+    <a class="layui-btn layui-btn layui-btn-xs" lay-event="detail">查看名单</a>
+    {{# } }}
+    {{# if(d.status=='closed' || d.status=='over'){ }}
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+    {{# } else if(d.status=='unstart'){ }}
+        <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="closed">关闭</a>
+    {{# } }}
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        var element = layui.element;
+
+        form.render("select");
+        // 渲染表格
+        table.render({
+            elem: '#conferenceTable',
+            url: '[[@{/conference/conflist}]]',
+            page: true,
+            cols: [
+                [
+                    {field: 'confname', title: '会议名称', align: 'center', fixed: 'left' },
+                    {field: 'confdate',width:150, title: '会议日期',  align: 'center'},
+                    {field: 'timeperoid',width:150, title: '会议时间',  align: 'center'},
+                    {field: 'attendtime',width:150, title: '签到时间',  align: 'center'},
+
+                    {
+                        field: 'conftype', title: '会议类型', align: 'center', width: 120,  sort: true, templet: function (d) {
+                            if ('list' == d.conftype) {
+                                return '有名单';
+                            } else if ('nolist' == d.conftype) {
+                                return '无名单';
+                            } else {
+                                return d.conftype;
+                            }
+                        }
+                    },
+                    {
+                        field: 'status', title: '状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                            if ('unstart' == d.status) {
+                                return '<span class="layui-badge layui-bg-orange">未开始</span>'
+                            } else if ('start' == d.status) {
+                                return '<span class="layui-badge layui-bg-green">进行中</span>';
+                            } else if ('closed' == d.status) {
+                                return '<span class="layui-badge layui-bg-gray">关闭</span>';
+                            } else if ('over' == d.status) {
+                                return '<span class="layui-badge">结束</span>';
+                            } else {
+                                return d.status;
+                            }
+                        }
+                    },
+                  /*  {field: 'remark', title: '备注',  align: 'center'},*/
+                    {align: 'center', title: '操作', width: 250, toolbar: '#conference-table-bar',  fixed: 'right'}
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-search-conference').click(function () {
+            var conftype = $("#search-conference-conftype").val();
+            var confname = $("#search-conference-confname").val();
+            table.reload('conferenceTable', {where: {conftype: conftype, confname: confname}, page: {curr: 1}});
+        });
+
+        $('#btn-conference-add').click(function () {
+            admin.popupCenter({
+                title: "新增会议",
+                path: '[[@{/conference/load4addconf}]]',
+                area: '500px',
+                finish: function () {
+                    table.reload('conferenceTable');
+                }
+            });
+        });
+
+        //监听单元格
+        table.on('tool(conferenceTable-filter)', function (obj) {
+            var data = obj.data;
+            if('del' == obj.event){
+                layer.confirm('确定直接删除会议【'+data.confname+'】吗?', {
+                    btn: ['确定', '取消']
+                },function(){
+                    layer.load(2);
+                    admin.go('[[@{/conference/deleterule}]]', {
+                        ruleid: data.ruleid,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, function (data) {
+                        console.log(data.code);
+                        layer.closeAll('loading');
+                        if (data.code == 200) {
+                            layer.msg(data.msg, {icon: 1});
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('[[@{/login}]]');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                        table.reload('conferenceTable');
+                    }, function (err) {
+                        admin.errorBack(err)
+                    });
+                });
+
+            }else if('closed' == obj.event){
+                layer.confirm('确定关闭会议【'+data.confname+'】吗?', {
+                    btn: ['确定', '取消']
+                },function(){
+                    layer.load(2);
+                    admin.go('[[@{/conference/closerule}]]', {
+                        ruleid: data.ruleid,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, function (data) {
+                        console.log(data.code);
+                        layer.closeAll('loading');
+                        if (data.code == 200) {
+                            layer.msg(data.msg, {icon: 1});
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('[[@{/login}]]');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                        table.reload('conferenceTable');
+                    }, function (err) {
+                        admin.errorBack(err)
+                    });
+                });
+
+            }else if('detail' == obj.event){
+                admin.popupCenter({
+                    title: "查看名单",
+                    path: '[[@{/conference/load4detail}]]?ruleid=' + data.ruleid,
+                    area: '600px',
+                    finish: function () {
+                        table.reload('conferenceTable');
+                    }
+                });
+            }
+        });
+
+    });
+</script>
\ No newline at end of file
