diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 73150e5..d17198f 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -31,4 +31,8 @@
 #payapi.appid=200001
 #payapi.secret=dc1d26c0d43e442588092c8d45c21bce
 
-
+## quartz task scheduler
+#sync.cardStatus.cron=0 0/10 * * * ?
+#apiLogin.refresh.cron=0 0/20 * * * ?
+conference.updatestatus.cron=0 0/1 * * * ? 
+conference.uploaddtl.cron=5/10 * * * * ? 
diff --git a/src/main/java/com/supwisdom/dlpay/conference/bean/ConfpeopleShowBean.java b/src/main/java/com/supwisdom/dlpay/conference/bean/ConfpeopleShowBean.java
new file mode 100644
index 0000000..f314880
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/bean/ConfpeopleShowBean.java
@@ -0,0 +1,112 @@
+package com.supwisdom.dlpay.conference.bean;
+
+public class ConfpeopleShowBean {
+    private String pid;
+    private Integer confid;
+    private String custid;
+    private String custname;
+    private String confname;
+    private String conftype;
+    private String cardno;
+    private String deptname;
+    private String attstatus;
+    private String atttime;
+    private String remark;
+    private String insteadcustid;
+
+    public String getPid() {
+        return pid;
+    }
+
+    public void setPid(String pid) {
+        this.pid = pid;
+    }
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    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 getConfname() {
+        return confname;
+    }
+
+    public void setConfname(String confname) {
+        this.confname = confname;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getDeptname() {
+        return deptname;
+    }
+
+    public void setDeptname(String deptname) {
+        this.deptname = deptname;
+    }
+
+    public String getAttstatus() {
+        return attstatus;
+    }
+
+    public void setAttstatus(String attstatus) {
+        this.attstatus = attstatus;
+    }
+
+    public String getAtttime() {
+        return atttime;
+    }
+
+    public void setAtttime(String atttime) {
+        this.atttime = atttime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getInsteadcustid() {
+        return insteadcustid;
+    }
+
+    public void setInsteadcustid(String insteadcustid) {
+        this.insteadcustid = insteadcustid;
+    }
+
+    public String getConftype() {
+        return conftype;
+    }
+
+    public void setConftype(String conftype) {
+        this.conftype = conftype;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/controller/ConfPeopleController.java b/src/main/java/com/supwisdom/dlpay/conference/controller/ConfPeopleController.java
new file mode 100644
index 0000000..4d49878
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/controller/ConfPeopleController.java
@@ -0,0 +1,125 @@
+package com.supwisdom.dlpay.conference.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.conference.bean.ConferenceShowBean;
+import com.supwisdom.dlpay.conference.bean.ConfpeopleShowBean;
+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.customer.bean.CustomerSearchBean;
+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.framework.util.WebConstant;
+import com.supwisdom.dlpay.mainservice.domain.TCustomer;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.ncmgr.service.NcService;
+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.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 java.util.List;
+
+@Controller
+public class ConfPeopleController {
+    @Autowired
+    private ConferenceService conferenceService;
+    @Autowired
+    private WebInterfaceService webInterfaceService;
+
+
+
+    @GetMapping("/confpeople/index")
+    public String ConferenceView(@AuthenticationPrincipal UserDetails operUser,
+                                 Model model) {
+        TOperator oper = (TOperator) operUser;
+        String deptcode=oper.getDeptcode();
+        List<TConference> conf=conferenceService.getAllConference(deptcode);
+        for(TConference c:conf){
+            String conftype="有名单";
+            if(ConferenceConstant.CONFTYPE_NOLIST.equals(c.getConftype())){
+                conftype="无名单";
+            }
+            String date= DateUtil.reformatDatetime(c.getConfdate(),"yyyyMMdd","yyyy-MM-dd");
+            c.setConfname(c.getConfname()+"  "+date+"  "+conftype);
+        }
+        model.addAttribute("conflist",conf);
+        return "confpeople/index";
+    }
+
+    @GetMapping("/confpeople/peoplelist")
+    @ResponseBody
+    public PageResult<ConfpeopleShowBean> searchConfPeople(@RequestParam("page") Integer pageNo,
+                                                              @RequestParam("limit") Integer pageSize,
+                                                              @RequestParam(value = "confid", required = false) Integer confid,
+                                                              @RequestParam(value = "attstatus", required = false) String attstatus,
+                                                           Model model) {
+        try {
+            if(null==confid){
+                return new PageResult<>(99, "请选择会议");
+            }
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            TConference conf=conferenceService.getConferenceById(confid);
+           /* if(null!=conf){
+                model.addAttribute("conf",conf);
+            }*/
+
+            return conferenceService.getConfPeoplePage(confid, attstatus,conf.getConftype(), pageNo, pageSize);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/confpeople/load4add")
+    public String load4ConfDetails(
+                                   @AuthenticationPrincipal UserDetails operUser,
+                                   Model model) {
+        CustomerSearchBean bean=new CustomerSearchBean();
+        TOperator oper = (TOperator) operUser;
+        String deptcode=oper.getDeptcode();
+        bean.setDeptcode(deptcode);
+        PageResult<TCustomerInfo> infolist=webInterfaceService.getCustomerInfoPage(bean);
+        List<TCustomerInfo> list=infolist.getData();
+        if(!StringUtil.isEmpty(list)){
+            model.addAttribute("custlist", list);
+        }
+
+        return "confpeople/form";
+    }
+
+    @PostMapping("/confpeople/editconfpeople")
+    @ResponseBody
+    public JsonResult editConfpeople(@RequestParam("pid") String pid,
+                                     @RequestParam("conftype") String conftype,
+                                     @RequestParam(value="attstatus") String attstatus,
+                                     @RequestParam(value="insteadcustid", required = false) String insteadcustid,
+                                     @RequestParam(value="remark", required = false) String remark
+                                    ) {
+        try{
+            if(!ConferenceConstant.ATTENDSTATUS_INSTEAD.equals(attstatus)){
+                insteadcustid="";
+                remark="";
+            }
+
+            return conferenceService.updateConfPeople(pid,conftype,insteadcustid,attstatus,remark);
+        }catch (Exception e){
+            e.printStackTrace();
+            return JsonResult.error("修改失败");
+
+        }
+
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java b/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
index bba9829..aa2e548 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
@@ -48,14 +48,17 @@
 
     @GetMapping("/conference/conflist")
     @ResponseBody
-    public PageResult<ConferenceShowBean> searchDiscountRules(@RequestParam("page") Integer pageNo,
+    public PageResult<ConferenceShowBean> searchConflist(@RequestParam("page") Integer pageNo,
                                                               @RequestParam("limit") Integer pageSize,
                                                               @RequestParam(value = "confname", required = false) String confname,
-                                                              @RequestParam(value = "conftype", required = false) String conftype) {
+                                                              @RequestParam(value = "conftype", required = false) String conftype,
+                                                         @AuthenticationPrincipal UserDetails operUser) {
         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);
+            TOperator oper = (TOperator) operUser;
+            String deptcode=oper.getDeptcode();
+            return conferenceService.getConferenceInfos(confname, conftype,deptcode, pageNo, pageSize);
         } catch (Exception e) {
             e.printStackTrace();
             return new PageResult<>(99, "系统查询错误");
@@ -82,27 +85,6 @@
         }
     }
 
-  /*  @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) {
@@ -117,7 +99,7 @@
 
     @PostMapping("/conference/addconf")
     @ResponseBody
-    public JsonResult editDiscountRule(@RequestParam("confname") String confname,
+    public JsonResult editConference(@RequestParam("confname") String confname,
                                        @RequestParam("conftype") String conftype,
                                        @RequestParam("confdate") String confdate,
                                        @RequestParam("starttime") String starttime,
@@ -144,7 +126,6 @@
             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;
@@ -174,7 +155,7 @@
 
     @GetMapping("/conference/downloadexcel")
     @ResponseBody
-    public void downloadDiscountRuleExcel(HttpServletRequest request, HttpServletResponse response, ModelMap map) {
+    public void downloadExcel(HttpServletRequest request, HttpServletResponse response, ModelMap map) {
         try {
             List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
             /**
@@ -215,7 +196,7 @@
 
     @GetMapping("/conference/load4detaillist")
     @ResponseBody
-    public PageResult<TConfPeople> searchDiscountRules(@RequestParam("page") Integer pageNo,
+    public PageResult<TConfPeople> searchConfPeople(@RequestParam("page") Integer pageNo,
                                                        @RequestParam("limit") Integer pageSize,
                                                        @RequestParam("confid") Integer confid,
                                                        @RequestParam(value = "searchkey", required = false) String searchkey) {
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConfDtlDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConfDtlDao.java
new file mode 100644
index 0000000..52eaccd
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConfDtlDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.conference.dao;
+
+
+import com.supwisdom.dlpay.conference.domain.TConfDtl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+@Repository
+public interface ConfDtlDao extends JpaRepository<TConfDtl, String> {
+    List<TConfDtl> findByUpdateflag(Integer flag);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java
index 2bb6128..a3d6e27 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConfPeopleDao.java
@@ -15,4 +15,5 @@
     @Query("delete from TConfPeople where confid=?1  ")
     void deleteConfPeopleByconfid(int confid);
 
+    TConfPeople findByConfidAndCustid(Integer confid,String custid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java
index 381688f..d18f7e7 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceDao.java
@@ -4,11 +4,22 @@
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 import com.supwisdom.dlpay.conference.domain.TConference;
 
+import java.util.List;
+
 @Repository
 public interface ConferenceDao extends JpaRepository<TConference, Integer> , JpaSpecificationExecutor<TConference> {
     TConference findByConfid(Integer confid);
 
+    List<TConference> findByConfdateAndStatus(String confdate, String status);
+
+    @Query("from TConference where deptcode=?1 order by confid desc")
+    List<TConference> findAllByDeptcodeOrderByConfdate(String deptcode);
+
+
+    @Query("from TConference order by confid desc")
+    List<TConference> findAllOrderByConfdate();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java
index ec104e4..908ea93 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/NolistConfPeopleDao.java
@@ -2,11 +2,12 @@
 
 
 import com.supwisdom.dlpay.conference.domain.TConfPeople;
+import com.supwisdom.dlpay.conference.domain.TNolistConfPeople;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface NolistConfPeopleDao extends JpaRepository<TConfPeople, String> {
+public interface NolistConfPeopleDao extends JpaRepository<TNolistConfPeople, String> {
 
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConfDtl.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConfDtl.java
new file mode 100644
index 0000000..a6b8d11
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConfDtl.java
@@ -0,0 +1,113 @@
+package com.supwisdom.dlpay.conference.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_CONFDTL",
+        indexes = {@Index(name = "TConfDtl_confid_idx", columnList = "confid")})
+public class TConfDtl {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
+  @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="CARDNO", length = 8)
+    private String cardno;
+
+  @Column(name="ATTDATE", length = 8)
+  private String attdate;
+
+  @Column(name="ATTTIME", length = 4)
+  private String atttime;
+
+  @Column(name="REMARK", length = 200)
+  private String remark;
+
+  @Column(name="UPDATEFLAG", length = 1)
+  private Integer updateflag;
+
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  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 getAttdate() {
+    return attdate;
+  }
+
+  public void setAttdate(String attdate) {
+    this.attdate = attdate;
+  }
+
+  public String getAtttime() {
+    return atttime;
+  }
+
+  public void setAtttime(String atttime) {
+    this.atttime = atttime;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+
+  public Integer getUpdateflag() {
+    return updateflag;
+  }
+
+  public void setUpdateflag(Integer updateflag) {
+    this.updateflag = updateflag;
+  }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java
index 2ef4af9..444b7a9 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConfPeople.java
@@ -11,8 +11,8 @@
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
   @GeneratedValue(generator = "idGenerator")
-  @Column(name = "ID", nullable = false, length = 32)
-  private String id;
+  @Column(name = "PID", nullable = false, length = 32)
+  private String pid;
 
   @Column(name="CARDNO", length = 8)
   private String cardno;
@@ -26,18 +26,27 @@
   @Column(name="CUSTID", length = 32)
   private String custid;
 
-  @Column(name="ATTSTATUS", nullable = false, length = 12)
+  @Column(name="ATTSTATUS",  length = 12)
   private String attstatus;
 
+  @Column(name="ATTTIME",  length = 4)
+  private String atttime;
+
   @Column(name="LASTSAVED", length = 14)
   private String lastsaved;
 
-  public String getId() {
-    return id;
+  @Column(name="INSTEADCUSTID", length = 32)
+  private String insteadcustid;
+
+  @Column(name="REMARK" , length = 200)
+  private String remark;
+
+  public String getPid() {
+    return pid;
   }
 
-  public void setId(String id) {
-    this.id = id;
+  public void setPid(String pid) {
+    this.pid = pid;
   }
 
   public String getCardno() {
@@ -87,4 +96,28 @@
   public void setLastsaved(String lastsaved) {
     this.lastsaved = lastsaved;
   }
+
+  public String getInsteadcustid() {
+    return insteadcustid;
+  }
+
+  public void setInsteadcustid(String insteadcustid) {
+    this.insteadcustid = insteadcustid;
+  }
+
+  public String getAtttime() {
+    return atttime;
+  }
+
+  public void setAtttime(String atttime) {
+    this.atttime = atttime;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java
index f477f54..8c99cd8 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConference.java
@@ -26,8 +26,8 @@
     @Column(name = "ATTENDTIME", nullable = false, length = 4)
     private String attendtime;
 
-    @Column(name = "DEPARTCODE", length = 32)
-    private String departcode;
+    @Column(name = "DEPTCODE", length = 32)
+    private String deptcode;
 
     @Column(name = "STATUS", nullable = false, length = 10)
     private String status;
@@ -95,12 +95,12 @@
         this.attendtime = attendtime;
     }
 
-    public String getDepartcode() {
-        return departcode;
+    public String getDeptcode() {
+        return deptcode;
     }
 
-    public void setDepartcode(String departcode) {
-        this.departcode = departcode;
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
     }
 
     public String getStatus() {
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java
index 1bcad07..a688f5c 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TNolistConfPeople.java
@@ -11,11 +11,11 @@
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
   @GeneratedValue(generator = "idGenerator")
-  @Column(name = "ID", nullable = false, length = 32)
-  private String id;
+  @Column(name = "PID", nullable = false, length = 32)
+  private String pid;
 
   @Column(name="CARDNO", length = 8)
-  private Integer cardno;
+  private String cardno;
 
   @Column(name="CONFID", length = 9)
   private Integer confid;
@@ -26,25 +26,34 @@
   @Column(name="CUSTID", length = 32)
   private String custid;
 
-  @Column(name="ATTSTATUS", nullable = false, length = 12)
+  @Column(name="ATTSTATUS", length = 12)
   private String attstatus;
 
+  @Column(name="ATTTIME", length = 4)
+  private String atttime;
+
   @Column(name="LASTSAVED", length = 14)
   private String lastsaved;
 
-  public String getId() {
-    return id;
+  @Column(name="INSTEADCUSTID", length = 32)
+  private String insteadcustid;
+
+  @Column(name="REMARK" , length = 200)
+  private String remark;
+
+  public String getPid() {
+    return pid;
   }
 
-  public void setId(String id) {
-    this.id = id;
+  public void setPid(String pid) {
+    this.pid = pid;
   }
 
-  public Integer getCardno() {
+  public String getCardno() {
     return cardno;
   }
 
-  public void setCardno(Integer cardno) {
+  public void setCardno(String cardno) {
     this.cardno = cardno;
   }
 
@@ -87,4 +96,28 @@
   public void setLastsaved(String lastsaved) {
     this.lastsaved = lastsaved;
   }
+
+  public String getAtttime() {
+    return atttime;
+  }
+
+  public void setAtttime(String atttime) {
+    this.atttime = atttime;
+  }
+
+  public String getInsteadcustid() {
+    return insteadcustid;
+  }
+
+  public void setInsteadcustid(String insteadcustid) {
+    this.insteadcustid = insteadcustid;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java b/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
index b195406..c04be47 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
@@ -1,8 +1,9 @@
 package com.supwisdom.dlpay.conference.service;
 
+import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.conference.bean.ConferenceShowBean;
-import com.supwisdom.dlpay.conference.domain.TConfPeople;
-import com.supwisdom.dlpay.conference.domain.TConferenceDevbind;
+import com.supwisdom.dlpay.conference.bean.ConfpeopleShowBean;
+import com.supwisdom.dlpay.conference.domain.*;
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
@@ -15,55 +16,52 @@
 public interface ConferenceService {
 
     @Transactional(rollbackFor = Exception.class, readOnly = true)
-    PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype, int pageNo, int pageSize);
+    PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype,String deptocde, int pageNo, int pageSize);
 
     @Transactional(rollbackFor = Exception.class)
     boolean deleteConference(int confid) throws Exception;
 
     @Transactional(rollbackFor = Exception.class, readOnly = true)
     TNcDevice getBindedDevice(int confid) ;
-/*
-    @Transactional(rollbackFor = Exception.class)
-    boolean closeConference(int confid) ;*/
 
-/*
     @Transactional(rollbackFor = Exception.class, readOnly = true)
-    boolean checkConferencenameExist(String confname,Integer confid);*/
+    List<TConference> getConferenceByDateAndStatus(String confdate,String status);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    List<TConference> getAllConference(String deptcode);
+
+    @Transactional(rollbackFor = Exception.class)
+    TConference updateConference(TConference conference);
+
+    @Transactional(rollbackFor = Exception.class)
+    TConference getConferenceById(Integer confid);
 
     @Transactional(rollbackFor = Exception.class)
     boolean saveNewConference(String confname,String confdate, String conftype, String starttime,
                               String endtime, String attendtime, TOperator oper, String filepath,Integer deviceid) throws Exception;
 
-
     @Transactional(rollbackFor = Exception.class, readOnly = true)
     PageResult<TConfPeople> getConferenceDetails(String searchkey, int confid, int pageNo, int pageSize);
-/*
+
     @Transactional(rollbackFor = Exception.class, readOnly = true)
-    PageResult<ConferenceShowBean> getCheckConferenceInfos(String status, int pageNo, int pageSize);
+    List<TConfDtl> getUnupdateConfDtl();
 
     @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);
+    TNolistConfPeople saveNolistConfPeople(TNolistConfPeople people) ;
 
     @Transactional(rollbackFor = Exception.class)
-    boolean deleteDiscountDevbind(TDiscountDevbind bind);
-
-    @Transactional(rollbackFor = Exception.class, readOnly = true)
-    PageResult<DevparaBinddevShowBean> searchRuleBindDevices(Integer devgroupid, String searchkey, int confid);
+    TConfPeople saveConfPeople(TConfPeople people) ;
 
     @Transactional(rollbackFor = Exception.class)
-    boolean saveRuleBindDevices(int confid, List<Integer> deviceIds, TOperator oper)  ;
-*/
+    void saveConfDtl(TConfDtl dtl) ;
 
+    @Transactional(rollbackFor = Exception.class)
+    JsonResult updateConfPeople(String id,String conftype,String insteadcustid,String attstatus,String remark) ;
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<ConfpeopleShowBean> getConfPeoplePage(Integer confid, String attstatus,String conftype, int pageNo, int pageSize);
+
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    TConfPeople getTConfPeopleByConfidAndCustid(Integer confid,String custid) ;
 }
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
index a807f2d..627afba 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/service/impl/ConferenceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/service/impl/ConferenceServiceImpl.java
@@ -3,19 +3,18 @@
 
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
+import com.supwisdom.dlpay.api.bean.JsonResult;
 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.dao.ConferenceDevbindDao;
-import com.supwisdom.dlpay.conference.domain.TConfPeople;
-import com.supwisdom.dlpay.conference.domain.TConference;
-import com.supwisdom.dlpay.conference.domain.TConferenceDevbind;
+import com.supwisdom.dlpay.conference.bean.ConfpeopleShowBean;
+import com.supwisdom.dlpay.conference.dao.*;
+import com.supwisdom.dlpay.conference.domain.*;
 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.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
@@ -26,6 +25,8 @@
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
 import com.supwisdom.dlpay.util.WebCheckException;
 import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -43,6 +44,7 @@
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.io.File;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -59,12 +61,19 @@
     private ConferenceDevbindDao conferenceDevbindDao;
     @Autowired
     private NcDeviceDao deviceDao;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private ConfDtlDao confDtlDao;
+    @Autowired
+    private NolistConfPeopleDao nolistConfPeopleDao;
+
 
     @PersistenceContext
     private EntityManager entityManager;
 
     @Override
-    public PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype, int pageNo, int pageSize) {
+    public PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype,String deptcode, int pageNo, int pageSize) {
         Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("confdate"));
 
         Page<TConference> page = conferenceDao.findAll(new Specification<TConference>() {
@@ -78,6 +87,10 @@
                     predicates.add(criteriaBuilder.equal(root.get("conftype").as(String.class), conftype));
 
                 }
+                if (!StringUtil.isEmpty(deptcode)) {
+                    predicates.add(criteriaBuilder.equal(root.get("deptcode").as(String.class), deptcode));
+
+                }
               /*  if (!StringUtil.isEmpty(status)) {
                     predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), status));
                 }*/
@@ -128,6 +141,35 @@
         }
         return null;
     }
+
+    @Override
+    public List<TConference> getConferenceByDateAndStatus(String confdate,String status) {
+
+        List<TConference> conflist=conferenceDao.findByConfdateAndStatus(confdate,status);
+        if(StringUtil.isEmpty(conflist)){
+            return null;
+        }
+        return conflist;
+    }
+
+    @Override
+    public List<TConference> getAllConference(String deptcode) {
+        if(!StringUtil.isEmpty(deptcode)){
+            return conferenceDao.findAllByDeptcodeOrderByConfdate(deptcode);
+        }
+        return conferenceDao.findAllOrderByConfdate();
+
+    }
+
+    @Override
+    public TConference updateConference(TConference conference) {
+        return conferenceDao.save(conference);
+    }
+
+    @Override
+    public TConference getConferenceById(Integer confid) {
+        return conferenceDao.findByConfid(confid);
+    }
 /*
     @Override
     public boolean closeConference(int confid) {
@@ -151,7 +193,7 @@
         conf.setCreateOperid(oper.getOperid());
         conf.setStarttime(starttime);
         conf.setEndtime(endtime);
-        conf.setDepartcode(oper.getDeptcode());
+        conf.setDeptcode(oper.getDeptcode());
         String systime = DateUtil.getNow();
         conf.setCreatetime(systime);
         conf.setLastsaved(systime);
@@ -248,7 +290,7 @@
     @Override
     public PageResult<TConfPeople> getConferenceDetails(String searchkey, int confid, int pageNo, int pageSize) {
         StringBuffer querySql = new StringBuffer("from TConfPeople t where t.confid=:confid ");
-        StringBuffer countSql = new StringBuffer("select count(t.id) as cnt from TConfPeople t where t.confid=:confid ");
+        StringBuffer countSql = new StringBuffer("select count(t.pid) as cnt from TConfPeople t where t.confid=:confid ");
         if (!StringUtil.isEmpty(searchkey)) {
             querySql.append(" and (t.cardno like :str or t.username like :str) ");
             countSql.append(" and (t.cardno like :str or t.username like :str) ");
@@ -269,6 +311,102 @@
         return new PageResult<>(count.longValue(), list);
     }
 
+    @Override
+    public List<TConfDtl> getUnupdateConfDtl() {
+        List<TConfDtl> dtl=confDtlDao.findByUpdateflag(ConferenceConstant.CONFDTL_STATUS_UNUPDATE);
+        if(!StringUtil.isEmpty(dtl)){
+            return dtl;
+        }
+        return null;
+    }
+
+    @Override
+    public TNolistConfPeople saveNolistConfPeople(TNolistConfPeople people) {
+        return nolistConfPeopleDao.save(people) ;
+    }
+
+    @Override
+    public TConfPeople saveConfPeople(TConfPeople people) {
+        return confPeopleDao.save(people);
+    }
+
+    @Override
+    public void saveConfDtl(TConfDtl dtl) {
+        confDtlDao.save(dtl);
+    }
+
+    @Override
+    public JsonResult updateConfPeople(String pid, String conftype, String insteadcustid, String attstatus, String remark) {
+        if(ConferenceConstant.CONFTYPE_NOLIST.equals(conftype)){
+            TNolistConfPeople people=nolistConfPeopleDao.getOne(pid);
+            if(null==people){
+                return JsonResult.error("修改失败，未查询到该用户");
+            }
+            people.setInsteadcustid(insteadcustid);
+            people.setAttstatus(attstatus);
+            people.setRemark(remark);
+            nolistConfPeopleDao.save(people);
+        }else{
+            TConfPeople people=confPeopleDao.getOne(pid);
+            if(null==people){
+                return JsonResult.error("修改失败，未查询到该用户");
+            }
+            people.setInsteadcustid(insteadcustid);
+            people.setAttstatus(attstatus);
+            people.setRemark(remark);
+            confPeopleDao.save(people);
+        }
+        return JsonResult.ok();
+    }
+
+    @Override
+    public PageResult<ConfpeopleShowBean> getConfPeoplePage(Integer confid, String attstatus,String conftype, int pageNo, int pageSize) {
+        String table="tb_conf_people";
+
+        if(ConferenceConstant.CONFTYPE_NOLIST.equals(conftype)){
+            table="tb_nolist_conf_people";
+        }
+
+        StringBuffer querySql=new StringBuffer("select a.confid,a.confname,b.custname,b.cardno,d.deptname,b.attstatus,b.atttime,b.custid,b.pid,b.remark,b.insteadcustid,a.conftype from "+table+" b  " +
+                "left join tb_conference a on a.confid=b.confid " +
+                "left join t_customer c on b.custid=c.custid " +
+                "left join tb_dept d on c.deptcode=d.deptcode " +
+                "where b.confid=:confid ");
+
+        StringBuffer countSql = new StringBuffer("select count(*) from "+table+" b  " +
+                "left join tb_conference a on a.confid=b.confid " +
+                "left join t_customer c on b.custid=c.custid " +
+                "left join tb_dept d on c.deptcode=d.deptcode " +
+                "where b.confid=:confid");
+
+
+        if (!StringUtil.isEmpty(attstatus)) {
+            querySql.append("and b.attstatus=:attstatus ");
+            countSql.append("and b.attstatus=:attstatus ");
+        }
+        querySql.append(" order by b.cardno ");
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+
+        query.setParameter("confid",confid);
+        countQuery.setParameter("confid",confid);
+        if (!StringUtil.isEmpty(attstatus)) {
+            query.setParameter("attstatus", attstatus);
+            countQuery.setParameter("attstatus", attstatus);
+        }
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ConfpeopleShowBean.class));
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize); //分页显示
+        List<ConfpeopleShowBean> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
+    }
+
+    @Override
+    public TConfPeople getTConfPeopleByConfidAndCustid(Integer confid, String custid) {
+        return confPeopleDao.findByConfidAndCustid(confid,custid);
+    }
+
 
     private String checkConfTimeError(String attendtime, String endtime,String confdate,String cardno) {
         Query query = entityManager.createNativeQuery("select a.confname from tb_conference a,TB_Conf_People b where a.confid=b.confid  " +
diff --git a/src/main/java/com/supwisdom/dlpay/conference/task/ConferenceTask.java b/src/main/java/com/supwisdom/dlpay/conference/task/ConferenceTask.java
new file mode 100644
index 0000000..a1f566e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/task/ConferenceTask.java
@@ -0,0 +1,146 @@
+package com.supwisdom.dlpay.conference.task;
+
+import com.supwisdom.dlpay.api.bean.CardsResponse;
+import com.supwisdom.dlpay.api.bean.CitizenCardInfo;
+import com.supwisdom.dlpay.api.bean.QueryCardsParam;
+import com.supwisdom.dlpay.app.bean.CustomerInfo;
+import com.supwisdom.dlpay.conference.domain.TConfDtl;
+import com.supwisdom.dlpay.conference.domain.TConfPeople;
+import com.supwisdom.dlpay.conference.domain.TConference;
+import com.supwisdom.dlpay.conference.domain.TNolistConfPeople;
+import com.supwisdom.dlpay.conference.service.ConferenceService;
+import com.supwisdom.dlpay.conference.util.ConferenceConstant;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.doorlist.service.DoorlistMgrService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.mainservice.domain.TCard;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
+import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.system.domain.TSystemParam;
+import com.supwisdom.dlpay.system.service.SystemService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Configuration      //1.主要用于标记配置类，兼备Component的效果。
+@EnableScheduling   // 2.开启定时任务
+public class ConferenceTask {
+
+    protected static Logger logger = LoggerFactory.getLogger(ConferenceTask.class);
+
+
+    @Autowired
+    private ConferenceService conferenceService;
+    @Autowired
+    private WebInterfaceService webInterfaceService;
+
+    @Scheduled(cron = "${conference.updatestatus.cron}")//每分钟执行一次
+    private void UpdateConferenceStatus(){
+        String confdate=DateUtil.getNow("yyyyMMdd");
+        String timenow=DateUtil.getNow("HHmm");
+        List<TConference> unstartconf=conferenceService.getConferenceByDateAndStatus(confdate, ConferenceConstant.CONFSTATUS_UNSTART);
+        if(null!=unstartconf){
+            logger.info("开始更新未开始会议");
+            for(TConference conf:unstartconf){
+                int compare=DateUtil.compareDatetime(timenow,conf.getStarttime(),"HHmm");
+                if(0<=compare){
+                    conf.setStatus(ConferenceConstant.CONFSTATUS_START);
+                    conferenceService.updateConference(conf);
+                }
+            }
+        }
+        List<TConference> startconf=conferenceService.getConferenceByDateAndStatus(confdate, ConferenceConstant.CONFSTATUS_START);
+        if(null!=startconf){
+            logger.info("开始更新已开始会议");
+               for(TConference conf:startconf){
+                   int compare=DateUtil.compareDatetime(timenow,conf.getEndtime(),"HHmm");
+                   if(0<=compare){
+                    conf.setStatus(ConferenceConstant.CONFSTATUS_OVER);
+                    conferenceService.updateConference(conf);
+                }
+            }
+        }
+    }
+
+    @Scheduled(cron = "${conference.uploaddtl.cron}")//每10秒执行一次
+    private void uploadConfDtl(){
+        List<TConfDtl> dtllist=conferenceService.getUnupdateConfDtl();
+        if(!StringUtil.isEmpty(dtllist)){
+            for(TConfDtl dtl:dtllist){
+                TConference conference=conferenceService.getConferenceById(dtl.getConfid());
+                if(null==conference){
+                    logger.error(dtl.getCustname()+"所属会议不存在");
+                    dtl.setUpdateflag(ConferenceConstant.CONFDTL_STATUS_UPDATED);
+                    dtl.setRemark(dtl.getCustname()+"所属会议不存在");
+                    conferenceService.saveConfDtl(dtl);
+                    continue;
+                }
+                TCustomerInfo info=webInterfaceService.getTCustomerByExcel(dtl.getCardno());
+                if(null==info){
+                    logger.error(dtl.getCustname()+"不存在");
+                    dtl.setUpdateflag(ConferenceConstant.CONFDTL_STATUS_UPDATED);
+                    dtl.setRemark(dtl.getCustname()+"不存在");
+                    conferenceService.saveConfDtl(dtl);
+                    continue;
+                }
+
+                String atttime=dtl.getAtttime();
+
+                int compareAttend=DateUtil.compareDatetime(atttime,conference.getAttendtime(),"HHmm");
+                int compareStart=DateUtil.compareDatetime(atttime,conference.getStarttime(),"HHmm");
+
+                if(-1==compareAttend){
+                    continue;
+                }
+                String attstatus;
+                if(-1==compareStart){
+                    attstatus= ConferenceConstant.ATTENDSTATUS_CHECKED;
+                }else{
+                    attstatus=ConferenceConstant.ATTENDSTATUS_LATE;
+                }
+                if(ConferenceConstant.CONFTYPE_NOLIST.equals(conference.getConftype())){
+                    TNolistConfPeople people=new TNolistConfPeople();
+
+                    people.setAttstatus(attstatus);
+                    people.setCardno(dtl.getCardno());
+                    people.setConfid(dtl.getConfid());
+                    people.setCustid(dtl.getCustid());
+                    people.setAtttime(atttime);
+                    people.setCustname(dtl.getCustname());
+                    people.setLastsaved(DateUtil.getNow());
+                    conferenceService.saveNolistConfPeople(people);
+                }else{
+                    TConfPeople people=conferenceService.getTConfPeopleByConfidAndCustid(dtl.getConfid(),dtl.getCustid());
+                    if(null==people){
+                        logger.error(dtl.getCustname()+"在会议中不存在");
+                        dtl.setUpdateflag(ConferenceConstant.CONFDTL_STATUS_UPDATED);
+                        dtl.setRemark(dtl.getCustname()+"在会议中不存在");
+                        conferenceService.saveConfDtl(dtl);
+                        continue;
+                    }
+                    people.setAttstatus(attstatus);
+                    people.setAtttime(atttime);
+                    conferenceService.saveConfPeople(people);
+                }
+                dtl.setUpdateflag(ConferenceConstant.CONFDTL_STATUS_UPDATED);
+                conferenceService.saveConfDtl(dtl);
+            }
+        }
+
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java b/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java
index c69aa14..ec63725 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/util/ConferenceConstant.java
@@ -1,5 +1,7 @@
 package com.supwisdom.dlpay.conference.util;
 
+import com.supwisdom.dlpay.framework.util.DateUtil;
+
 public class ConferenceConstant {
     public static final String CONFTYPE_LIST="list";
     public static final String CONFTYPE_NOLIST="nolist";
@@ -13,6 +15,16 @@
     public static final String ATTENDSTATUS_INSTEAD="instead";
     public static final String DEVICETYPE_CONFERENCE="H";
 
+    public static final Integer CONFDTL_STATUS_UPDATED=1;
+    public static final Integer CONFDTL_STATUS_UNUPDATE=0;
+
+
+    public static void main(String[] args) {
+        String i="1100";
+        String l="1200";
+        System.out.println(DateUtil.compareDatetime(l,i,"HHmm"));
+    }
+
 
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java
index 3b58f7a..aab4496 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/dao/impl/CustomerDaoImpl.java
@@ -147,7 +147,7 @@
     @Transactional
     @Override
     public TCustomerInfo getTCustomerByExcel(String cardno) {
-        String sql = "select a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate from t_customer a,t_card b  " +
+        String sql = "select a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate,a.deptcode,a.custtypeid from t_customer a,t_card b  " +
                 " where a.custid = b.custid and b.status = 'normal' and b.transtatus='normal' and cardno=?1 ";
         Query query = entityManager.createNativeQuery(sql, TCustomerInfo.class);
         query.setParameter(1, cardno);
diff --git a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
index 0d16da7..1dc753c 100644
--- a/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
+++ b/src/main/java/com/supwisdom/dlpay/mainservice/service/WebInterfaceService.java
@@ -146,4 +146,6 @@
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     PageResult<TCustomerInfo> getCustomerInfoPage(CustomerSearchBean bean);
 
+
+
     }
diff --git a/src/main/resources/templates/conference/confdetail.html b/src/main/resources/templates/conference/confdetail.html
index 58b8960..fc7afc2 100644
--- a/src/main/resources/templates/conference/confdetail.html
+++ b/src/main/resources/templates/conference/confdetail.html
@@ -1,8 +1,7 @@
 <div class="layui-card">
     <div class="layui-card-body">
         <div class="layui-form">
-            <span>绑定设备：</span>
-            <span th:text="${deviceName}"></span>
+            <span th:text="'绑定设备：'+${deviceName}"></span>
 
         </div>
         <div class="layui-form toolbar">
diff --git a/src/main/resources/templates/conference/confform.html b/src/main/resources/templates/conference/confform.html
index 3b29c0f..2a9b697 100644
--- a/src/main/resources/templates/conference/confform.html
+++ b/src/main/resources/templates/conference/confform.html
@@ -133,7 +133,6 @@
         }
 
         form.on('submit(conference-form-submit)', function (data) {
-            debugger
             var token = $("meta[name='_csrf_token']").attr("value");
             var vdata = data.field;
 
@@ -186,6 +185,7 @@
                     'Accept': 'application/json',
                     'X-CSRF-TOKEN': token,
                 },
+
                 success: function (result) {
                     layer.closeAll('loading');
                     if (result.code == 200) {
diff --git a/src/main/resources/templates/confpeople/form.html b/src/main/resources/templates/confpeople/form.html
new file mode 100644
index 0000000..2ef3aea
--- /dev/null
+++ b/src/main/resources/templates/confpeople/form.html
@@ -0,0 +1,134 @@
+<div id="confpeople-form" lay-filter="confpeople-form" class="layui-form model-form">
+    <input name="pid" id="confpeople-pid" type="hidden"/>
+    <input name="conftype" id="confpeople-conftype" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">签到状态</label>
+        <div class="layui-input-block">
+            <input type="radio" name="attstatus" id="form-confpeople-attstatus-checked"
+                   lay-filter="confpeople-attstatus-filter" value="checked" title="已签到"/>
+            <input type="radio" name="attstatus" id="form-confpeople-attstatus-uncheck"
+                   lay-filter="confpeople-attstatus-filter" value="uncheck" title="未签到"/>
+            <input type="radio" name="attstatus" id="form-confpeople-attstatus-late"
+                   lay-filter="confpeople-attstatus-filter" value="late" title="迟到"/>
+            <input type="radio" name="attstatus" id="form-confpeople-attstatus-instead"
+                   lay-filter="confpeople-attstatus-filter" value="instead" title="代签"/>
+
+        </div>
+    </div>
+
+    <div class="layui-form-item instead-form">
+        <label class="layui-form-label"><span style="color: red">* </span>代签人</label>
+        <div class="layui-input-block">
+            <select name="insteadcustid" class="layui-select" id="discountrule-form-select-listid" lay-search>
+                <option th:each="lst:${custlist}" th:value="${lst.custid}"
+                        th:text="${lst.custname}"></option>
+            </select>&emsp;
+        </div>
+    </div>
+    <div class="layui-form-item instead-form">
+        <label class="layui-form-label">备注</label>
+        <div class="layui-input-block">
+            <textarea name="remark" placeholder="请输入" class="layui-textarea"></textarea>
+        </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="confpeople-form-submit" lay-submit id="confpeople-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;
+
+        form.render("select");
+        form.render("radio");
+
+        var ct = admin.getTempData('t_people');
+        console.log(ct);
+        if (ct) {
+            form.val('confpeople-form', ct);
+        }
+        var attstatus = ct.attstatus;
+        if('instead'==attstatus){
+            $(".instead-form").show();
+        }
+
+        form.on('radio(confpeople-attstatus-filter)', function (data) {
+            changeconfpeopletype(data.value);
+            attstatus = data.value;
+        });
+
+        var changeconfpeopletype = function (val) {
+            if ('instead' != val) {
+                $(".instead-form").hide();
+            } else {
+                $(".instead-form").show();
+            }
+        }
+
+        form.on('submit(confpeople-form-submit)', function (data) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            var vdata = data.field;
+
+            var formData = new FormData();
+            formData.append("pid", vdata.pid);
+            formData.append("conftype", vdata.conftype);
+            formData.append("attstatus", vdata.attstatus);
+            formData.append("insteadcustid", vdata.insteadcustid);
+            formData.append("remark", vdata.remark);
+            layer.load(2);
+            debugger
+            $.ajax({
+                type: "POST",
+                url: '[[@{/confpeople/editconfpeople}]]',
+                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>
+    .instead-form{
+        display:none
+    }
+
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/confpeople/index.html b/src/main/resources/templates/confpeople/index.html
new file mode 100644
index 0000000..ab22d0a
--- /dev/null
+++ b/src/main/resources/templates/confpeople/index.html
@@ -0,0 +1,118 @@
+<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-confpeople-confid" style="width:280px" lay-search>
+                <option th:each="lst:${conflist}" th:value="${lst.confid}"
+                        th:text="${lst.confname}"></option>
+            </select>&emsp;
+
+            <select id="search-confpeople-attstatus">
+                <option value=""> 选择签到状态</option>
+                <option value="checked"> 已签到</option>
+                <option value="uncheck"> 未签到</option>
+                <option value="late"> 迟到</option>
+                <option value="instead"> 代签</option>
+            </select>&emsp;
+
+            <button id="btn-search-confpeople" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+
+        </div>
+        <table class="layui-table" id="confpeopleTable" lay-filter="confpeopleTable-filter"></table>
+    </div>
+
+</div>
+
+
+<!-- 表格操作列 -->
+<script type="text/html" id="confpeople-table-bar">
+    <a class="layui-btn layui-btn layui-btn-xs" lay-event="edit">查看\编辑</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: '#confpeopleTable',
+            url: '[[@{/confpeople/peoplelist}]]',
+            page: true,
+            cols: [
+                [
+                    {field: 'custname', title: '客户姓名', align: 'center'},
+                    {field: 'cardno', title: '卡号', align: 'center'},
+                    {field: 'deptname', title: '所属部门', align: 'center'},
+                    {field: 'attendtime', title: '签到时间', align: 'center'},
+
+                    {
+                        field: 'attstatus', title: '状态', align: 'center', sort: true, templet: function (d) {
+                            if ('uncheck' == d.attstatus) {
+                                return '<span class="layui-badge layui-bg-orange">未签到</span>'
+                            } else if ('checked' == d.attstatus) {
+                                return '<span class="layui-badge layui-bg-green">已签到</span>';
+                            } else if ('late' == d.attstatus) {
+                                return '<span class="layui-badge layui-bg-gray">迟到</span>';
+                            } else if ('instead' == d.attstatus) {
+                                return '<span class="layui-badge">代签</span>';
+                            } else {
+                                return d.attstatus;
+                            }
+                        }
+                    },
+                    {field: 'id', align: 'center', title: '操作', toolbar: '#confpeople-table-bar', fixed: 'right'}
+                ]
+            ]
+        });
+
+        // 搜索按钮点击事件
+        $('#btn-search-confpeople').click(function () {
+            var confid = $("#search-confpeople-confid").val();
+            var attstatus = $("#search-confpeople-attstatus").val();
+            table.reload('confpeopleTable', {where: {confid: confid, attstatus: attstatus}, page: {curr: 1}});
+
+
+        });
+        let showModel = function (data) {
+            let title = '查看/编辑'
+            admin.putTempData('t_people', data);
+            admin.popupCenter({
+                title: title,
+                path: '[[@{/confpeople/load4add}]]',
+                finish: function () {
+                    var confid=$("#search-confpeople-confid").val();
+                    table.reload('confpeopleTable', confid);
+                }
+            });
+        };
+
+
+        //监听单元格
+        table.on('tool(confpeopleTable-filter)', function (obj) {
+            var data = obj.data;
+            showModel(data);
+
+        });
+
+    });
+</script>
+
+<style>
+    .layui-form.toolbar .layui-form-select input {
+        width: 250px;
+    }
+
+</style>
\ No newline at end of file
