diff --git a/src/main/java/com/supwisdom/dlpay/conference/controller/ConfViewController.java b/src/main/java/com/supwisdom/dlpay/conference/controller/ConfViewController.java
new file mode 100644
index 0000000..cb6f8ae
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/controller/ConfViewController.java
@@ -0,0 +1,111 @@
+package com.supwisdom.dlpay.conference.controller;
+
+import com.supwisdom.dlpay.atte.service.AtteClassService;
+import com.supwisdom.dlpay.conference.service.ConferenceService;
+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.StringUtil;
+import com.supwisdom.dlpay.system.domain.TCustType;
+import com.supwisdom.dlpay.system.service.ManagerService;
+import com.supwisdom.dlpay.system.service.SystemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/confreview")
+public class ConfViewController {
+    @Autowired
+    private AtteClassService atteClassService;
+    @Autowired
+    private ConferenceService conferenceService;
+    @Autowired
+    private SystemService systemService;
+
+    /**
+     *    审核人管理
+     * @param
+     */
+    @GetMapping("/index")
+    public String reviewindex(){
+        return "confreview/index";
+    }
+
+    /**
+     *  获取审核人员名单
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value = "/custlist", method = RequestMethod.POST)
+    public Map getReviewerList(
+            @RequestParam(value = "perName", required = false, defaultValue = "") String perName,
+            @RequestParam(value = "custtypeid", required = false, defaultValue = "") String custtypeid,
+            @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+
+            String opertype=operUser.getOpertype();
+            String deptcode=operUser.getDeptcode();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                deptcode=null;
+            }else {
+                if(StringUtil.isEmpty(deptcode)){
+                    deptcode="-99";
+                }
+            }
+            List<TCustomerInfo> allcust=atteClassService.getAllCustomer(perName,deptcode,custtypeid);
+            List<TCustomerInfo> reviewlist=conferenceService.getConferenceReviewList(deptcode);
+            Boolean countIndex = false;
+            if (allcust.size() > 4000) {
+                countIndex = true;
+            }
+            allcust.removeAll(reviewlist);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+            map.put("allcust",allcust);
+            map.put("reviewlist",reviewlist);
+            map.put("countIndex", countIndex);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+    /**
+     *     保存审核人员
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value="/addreview", method = RequestMethod.POST)
+    public Map saveReview(@RequestParam(value = "idlist") List<String> custids,
+                          @AuthenticationPrincipal TOperator operUser,
+                          HttpServletRequest request, HttpServletResponse response) {
+        Map map=new HashMap();
+
+        try {
+            String opertype=operUser.getOpertype();
+            String deptcode=operUser.getDeptcode();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                deptcode=null;
+            }else {
+                if(StringUtil.isEmpty(deptcode)){
+                    deptcode="-99";
+                }
+            }
+            conferenceService.addConfReview(deptcode,operUser.getOpercode(),custids);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr","保存信息异常!");
+        }
+
+        return map;
+    }
+}
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 735f54a..311fdbb 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/controller/ConferenceController.java
@@ -147,6 +147,22 @@
         return "conference/confform";
     }
 
+    @GetMapping("/conference/load4updateconf")
+    public String load4UpdateConference(   @RequestParam("confid") Integer confid,
+                                           Model model) {
+        TConference conf=conferenceService.getConferenceById(confid);
+
+        String now = DateUtil.getNow("yyyyMMdd");
+        model.addAttribute("maxdate", DateUtil.reformatDatetime(now, "yyyyMMdd", "yyyy-MM-dd"));
+        model.addAttribute("starttime", DateUtil.reformatDatetime(conf.getStarttime(), "HHmm", "HH:mm"));
+        model.addAttribute("endtime", DateUtil.reformatDatetime(conf.getEndtime(), "HHmm", "HH:mm"));
+        model.addAttribute("attendtime", DateUtil.reformatDatetime(conf.getAttendtime(), "HHmm", "HH:mm"));
+        model.addAttribute("confname", conf.getConfname());
+        model.addAttribute("confid",conf.getConfid());
+        model.addAttribute("remark", conf.getRemark());
+        return "conference/confupdate";
+    }
+
 
     @PostMapping("/conference/addconf")
     @ResponseBody
@@ -193,6 +209,47 @@
         }
     }
 
+    @PostMapping("/conference/updateconf")
+    @ResponseBody
+    public JsonResult editConference(@RequestParam("confname") String confname,
+                                     @RequestParam("confid") Integer confid,
+                                     @RequestParam("confdate") String confdate,
+                                     @RequestParam("starttime") String starttime,
+                                     @RequestParam("endtime") String endtime,
+                                     @RequestParam("attendtime") String attendtime,
+                                     @RequestParam("remark") String remark,
+                                     @AuthenticationPrincipal UserDetails operUser,
+                                     HttpServletRequest request) {
+        try {
+            if (StringUtil.isEmpty(confname)
+                    ||null==confid
+                    || !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("登录过期，请重新登录");
+            }
+
+            if (conferenceService.saveConference(confid,confname.trim(), DateUtil.unParseToDateFormat(confdate), DateUtil.unParseToDateFormat(starttime), DateUtil.unParseToDateFormat(endtime), DateUtil.unParseToDateFormat(attendtime), remark)) {
+                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
diff --git a/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceReviewDao.java b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceReviewDao.java
new file mode 100644
index 0000000..864f320
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/dao/ConferenceReviewDao.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.conference.dao;
+
+
+import com.supwisdom.dlpay.conference.domain.TConfPeople;
+import com.supwisdom.dlpay.conference.domain.TConferenceReview;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ConferenceReviewDao extends JpaRepository<TConferenceReview, String> {
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/conference/domain/TConferenceReview.java b/src/main/java/com/supwisdom/dlpay/conference/domain/TConferenceReview.java
new file mode 100644
index 0000000..decd59d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/conference/domain/TConferenceReview.java
@@ -0,0 +1,41 @@
+package com.supwisdom.dlpay.conference.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="t_conference_review")
+public class TConferenceReview {
+
+    private String custid;
+    private String opercode;
+    private String updatetime;
+
+    @Id
+    @Column(name="custid",length = 32)
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+    @Column(name="opercode",length = 255)
+    public String getOpercode() {
+        return opercode;
+    }
+
+    public void setOpercode(String opercode) {
+        this.opercode = opercode;
+    }
+    @Column(name="updatetime",length = 14)
+    public String getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(String updatetime) {
+        this.updatetime = updatetime;
+    }
+}
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 e2b54aa..75f1613 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
@@ -8,6 +8,7 @@
 import com.supwisdom.dlpay.conference.bean.ConfpeopleReportBean;
 import com.supwisdom.dlpay.conference.bean.ConfpeopleShowBean;
 import com.supwisdom.dlpay.conference.domain.*;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
@@ -56,6 +57,10 @@
     @Transactional(rollbackFor = Exception.class)
     boolean saveNewConference(String confname,String confdate, String conftype, String starttime,
                               String endtime, String attendtime, TOperator oper, List<Integer> deviceid,String remark) throws Exception;
+    @Transactional(rollbackFor = Exception.class)
+    boolean saveConference(Integer confid,String confname,String confdate,  String starttime,
+                              String endtime, String attendtime,  String remark) throws Exception;
+
 
     @Transactional(rollbackFor = Exception.class)
     boolean saveConferencePeopleByExcel(Integer confid,String fpath) throws Exception;
@@ -114,4 +119,9 @@
     @Transactional(rollbackFor = Exception.class, readOnly = true)
     List<ConfPeopleApiBean> getConfPeopleListByConfid(Integer confid, String conftype) ;
 
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    public List<TCustomerInfo> getConferenceReviewList(String deptcode);
+
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addConfReview(String deptcode, String opercode, List<String> custidlist);
 }
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 b27841b..5685129 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
@@ -4,6 +4,7 @@
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.atte.domain.TAtteReview;
 import com.supwisdom.dlpay.conference.api.bean.ConfPeopleApiBean;
 import com.supwisdom.dlpay.conference.api.bean.ConferenceApiBean;
 import com.supwisdom.dlpay.conference.bean.*;
@@ -68,7 +69,8 @@
     private NolistConfPeopleDao nolistConfPeopleDao;
     @Autowired
     private CustomerDao customerDao;
-
+    @Autowired
+    private ConferenceReviewDao conferenceReviewDao;
 
     @PersistenceContext
     private EntityManager entityManager;
@@ -316,6 +318,23 @@
     }
 
     @Override
+    public boolean saveConference(Integer confid, String confname, String confdate, String starttime, String endtime, String attendtime, String remark) throws Exception {
+        TConference conf=conferenceDao.findByConfid(confid);
+        if(null==conf){
+            return false;
+        }
+        conf.setConfname(confname);
+        conf.setConfdate(confdate);
+        conf.setStarttime(starttime);
+        conf.setEndtime(endtime);
+        conf.setAttendtime(attendtime);
+        conf.setRemark(remark);
+        conferenceDao.save(conf);
+        return true;
+    }
+
+
+    @Override
     public boolean saveConferencePeopleByExcel(Integer confid, String fpath) throws Exception {
         TConference conference = conferenceDao.findByConfid(confid);
         if (null == conference) {
@@ -841,5 +860,53 @@
         return cnt.intValue();
     }
 
+    @Override
+    public List<TCustomerInfo> getConferenceReviewList(String deptcode) {
+        String sql = "select a.deptcode,a.custtypeid,a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate from T_Customer a left join t_card b on a.custid = b.custid " +
+                " where a.status='1' and b.status='normal' and b.transtatus='normal' ";
+        sql+= " and a.custid in ( select custid from t_conference_review ) ";
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+=" and a.deptcode= :dcode ";
+        }
+        sql +=" order by b.cardno desc ";
+        Query query = entityManager.createNativeQuery(sql, TCustomerInfo.class);
+        if(!StringUtil.isEmpty(deptcode)){
+            query.setParameter("dcode",deptcode);
+        }
+        List<TCustomerInfo> list = query.getResultList();
+        return list;
+    }
 
+    @Override
+    public boolean addConfReview(String deptcode, String opercode, List<String> custidlist) {
+        delConfReview(deptcode);
+        for (String custid:custidlist){
+            TConferenceReview reviewer=new TConferenceReview();
+            reviewer.setCustid(custid);
+            reviewer.setOpercode(opercode);
+            reviewer.setUpdatetime(DateUtil.getNow());
+            conferenceReviewDao.save(reviewer);
+        }
+        return true;
+    }
+
+    public boolean delConfReview(String deptcode) {
+        String sql=" delete from TConferenceReview where custid in (select custid from TCustomer where 1=1  ";
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+=" and deptcode = :dcode";
+        }
+        sql+=" ) ";
+        try {
+            Query query=entityManager.createQuery(sql);
+            if(!StringUtil.isEmpty(deptcode)){
+                query.setParameter("dcode",deptcode);
+            }
+            query.executeUpdate();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
 }
diff --git a/src/main/resources/templates/conference/conflist.html b/src/main/resources/templates/conference/conflist.html
index 8c8276c..2165d8a 100644
--- a/src/main/resources/templates/conference/conflist.html
+++ b/src/main/resources/templates/conference/conflist.html
@@ -32,11 +32,13 @@
 
     {{# if(d.status=='unstart'&&d.conftype=='list'){ }}
     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn layui-btn-xs" lay-event="edit">编辑</a>
     <a class="layui-btn layui-btn layui-btn-xs" lay-event="excel">excel导入</a>
     <a class="layui-btn layui-btn layui-btn-xs" lay-event="people">分配人员</a>
     <a class="layui-btn layui-btn layui-btn-xs" lay-event="qrcode">申请开门码</a>
     {{# } else if(d.status=='unstart'&&d.conftype=='nolist'){ }}
     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+    <a class="layui-btn layui-btn layui-btn-xs" lay-event="edit">编辑</a>
     <a class="layui-btn layui-btn layui-btn-xs" lay-event="qrcode">申请开门码</a>
     {{# } }}
 
@@ -78,7 +80,7 @@
                         }
                     },
                     {
-                        field: 'status', title: '状态', align: 'center', width: 120, sort: true, templet: function (d) {
+                        field: 'status', title: '状态', align: 'center', width: 100, sort: true, templet: function (d) {
                             if ('unstart' == d.status) {
                                 return '<span class="layui-badge layui-bg-orange">未开始</span>'
                             } else if ('start' == d.status) {
@@ -93,7 +95,7 @@
                         }
                     },
                     /*  {field: 'remark', title: '备注',  align: 'center'},*/
-                    {align: 'center', title: '操作', width: 310, toolbar: '#conference-table-bar', fixed: 'right'}
+                    {align: 'center', title: '操作', width: 340, toolbar: '#conference-table-bar', fixed: 'right'}
                 ]
             ]
         });
@@ -183,7 +185,18 @@
                         table.reload('conferenceTable');
                     }
                 });
-            }else if ('people' == obj.event) {
+            } else if ('edit' == obj.event) {
+                admin.putTempData('t_conf', data);
+                admin.popupCenter({
+                    title: "修改会议",
+                    path: '[[@{/conference/load4updateconf}]]?confid='+ data.confid,
+                    area: '500px',
+                    finish: function () {
+                        table.reload('conferenceTable');
+                    }
+                });
+            }
+            else if ('people' == obj.event) {
                 admin.popupCenter({
                     title: "分配人员",
                     area: '900px',
diff --git a/src/main/resources/templates/conference/confupdate.html b/src/main/resources/templates/conference/confupdate.html
new file mode 100644
index 0000000..79b7356
--- /dev/null
+++ b/src/main/resources/templates/conference/confupdate.html
@@ -0,0 +1,188 @@
+<div id="confupdate-form" lay-filter="confupdate-form-filter" class="layui-form model-form" style="padding: 10px 25px;">
+    <input type="hidden" id="confupdate-hidden-maxdate" th:value="${maxdate}"/>
+    <input type="hidden" id="confupdate-hidden-confid" name="confid" th:value="${confid}"/>
+    <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-confupdate-confname"
+                   style="width: 90%;"
+                   autocomplete="off" lay-verify="required|Confname" th:value="${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-confupdate-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-confupdate-starttime" autocomplete="off"
+                   maxlength="5"
+                   class="layui-input" lay-verify="required" th:value="${starttime}"/>
+        </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-confupdate-endtime" autocomplete="off"
+                   maxlength="5"
+                   class="layui-input" lay-verify="required" th:value="${endtime}"/>
+        </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-confupdate-attendtime" autocomplete="off"
+                   maxlength="5"
+                   class="layui-input" lay-verify="required" th:value="${attendtime}"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label confinput-label">会议概要</label>
+        <div class="layui-input-block">
+            <textarea name="remark" placeholder="请输入" class="layui-textarea" th:value="${remark}"></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="confupdate-form-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</div>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'laydate', 'upload','formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var laydate = layui.laydate;
+
+        laydate.render({
+            elem: '#form-confupdate-starttime',
+            type: 'time',
+            format: 'HH:mm',
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#form-confupdate-endtime',
+            type: 'time',
+            format: 'HH:mm',
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#form-confupdate-attendtime',
+            type: 'time',
+            format: 'HH:mm',
+            trigger: 'click'
+        });
+        laydate.render({
+            elem: '#form-confupdate-confdate',
+            min: $("#confupdate-hidden-maxdate").val(),
+            trigger: 'click'
+        });
+
+       /* form.on('radio(confupdate-conftype-filter)', function (data) {
+            changeDiscountRuletype(data.value);
+            confType = data.value;
+        });*/
+
+     /*   var changeDiscountRuletype = function (val) {
+            if ('nolist' == val) {
+                $("#confupdate-conflist").hide();
+            } else {
+                $("#confupdate-conflist").show();
+            }
+        }*/
+
+        form.on('submit(confupdate-form-submit)', function (data) {
+            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("confid", vdata.confid);
+            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);
+
+            formData.append("remark",vdata.remark);
+
+            layer.load(2);
+            $.ajax({
+                type: "POST",
+                url: '[[@{/conference/updateconf}]]',
+                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%;
+    }
+
+    .xm-select-parent .xm-select-title div.xm-select-label>span{
+        height: 22px;
+    }
+
+    .upoadfile-btn input {
+        position: absolute;
+        font-size: 100px;
+        right: 0;
+        top: 0;
+        opacity: 0;
+        width: 113px;
+        height: 34px;
+    }
+</style>
+
diff --git a/src/main/resources/templates/confreport/detail.html b/src/main/resources/templates/confreport/detail.html
index 0663470..71e3c06 100644
--- a/src/main/resources/templates/confreport/detail.html
+++ b/src/main/resources/templates/confreport/detail.html
@@ -278,7 +278,7 @@
 
             LODOP = getLodop();
             LODOP.PRINT_INIT("会议报表");
-            LODOP.SET_PRINT_PAGESIZE(2, 0, 0,"A4");
+            LODOP.SET_PRINT_PAGESIZE(1, 0, 0,"A4");
             LODOP.ADD_PRINT_URL(30, 20, "95%", "90%", encodeURI(url));
             LODOP.ADD_PRINT_HTM("95%", "48%", 150, 50, "<font style='font-size:12px'><span tdata='pageNO'>##</span>/<span tdata='pageCount'>&nbsp;&nbsp;##</span></font>");
             LODOP.SET_PRINT_STYLEA(0, "ItemType", 1);
diff --git a/src/main/resources/templates/confreport/print/attindex.html b/src/main/resources/templates/confreport/print/attindex.html
index 6529dfd..5fe49c8 100644
--- a/src/main/resources/templates/confreport/print/attindex.html
+++ b/src/main/resources/templates/confreport/print/attindex.html
@@ -112,7 +112,7 @@
                 <td width="18%"
                     style="text-align: left;" ></td>
                 <td width="5%">&nbsp;</td>
-                <td width="12%" style="text-align: right;padding-right: 5px;">审核人签字：</td>
+                <td width="12%" style="text-align: right;padding-right: 5px;">审核签字：</td>
                 <td width="18%"
                     style="text-align: left;border-bottom: 1px solid #666;"></td>
                 <td width="5%">&nbsp;</td>
diff --git a/src/main/resources/templates/confreview/index.html b/src/main/resources/templates/confreview/index.html
new file mode 100644
index 0000000..3310fa7
--- /dev/null
+++ b/src/main/resources/templates/confreview/index.html
@@ -0,0 +1,570 @@
+<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 id="confreviewapp">
+
+
+    <div id="assign_custSelect" >
+        <div>
+            <el-form :inline="true" ref="devform" :model="person_person" data-parsley-validate
+                     class="form-horizontal form-label-left">
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">姓名:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="person_person.custname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <!--<div class="col-md-3" >-->
+                    <!--<div class="form-group">-->
+                        <!--<label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">部门:</span>-->
+                        <!--</label>-->
+                        <!--<div class="col-md-8 col-sm-12 col-xs-12">-->
+                            <!--<el-select v-model="person_person.deptcode"-->
+                                       <!--filterable-->
+                                       <!--clearable-->
+                                       <!--placeholder="请选择">-->
+                                <!--<el-option-->
+                                        <!--v-for="deptcode in deptlist"-->
+                                        <!--:key="deptcode.value"-->
+                                        <!--:label="deptcode.label"-->
+                                        <!--:value="deptcode.value">-->
+                                <!--</el-option>-->
+                            <!--</el-select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+                <!--</div>-->
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">人员类别:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="person_person.custtypeid"
+                                       filterable
+                                       clearable
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="custtypeid in custtypelist"
+                                        :key="custtypeid.value"
+                                        :label="custtypeid.label"
+                                        :value="custtypeid.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="searchCust" id="cust_qrybtn">查 询</button>
+                    </div>
+                </div>
+            </el-form>
+
+        </div>
+
+
+
+
+
+        <div id="assign_devSel">
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md5" style="width: 45%">
+                    <div class="layui-card">
+                        <div class="layui-card-header" style="margin-bottom: 10px" v-if="person_lefttable">
+                            可分配人员({{person_lefttable.length}}人)
+                        </div>
+                        <div id="addDoorlist_pensonS-tb" class="layui-card-body">
+
+                            <template>
+                                <el-table
+                                        height="480"
+                                        ref="multipleTable"
+                                        :data="person_lefttable"
+                                        tooltip-effect="dark"
+                                        style="width: 100%;"
+                                        stripe
+                                        border
+                                        @selection-change="lefttableSelect">
+                                    <el-table-column
+                                            fixed
+                                            type="selection"
+                                           >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="cardno"
+                                            label="卡号"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="custname"
+                                            label="姓名"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            prop="bankcardno"
+                                            label="银行卡号"
+                                            >
+                                    </el-table-column>
+                                </el-table>
+                            </template>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="layui-col-md1" style="width: 10%">
+                    <div style="width:5%;height:400px;display:inline-block;padding:0;margin-left: 5px; float:left">
+                        <div style="position: absolute;top:55%;width:5%;padding:0;margin: 0;text-align: center;left: 28%">
+                            <el-button class="el-icon-d-arrow-right" :disabled="per_addBtn_dis" @click="person_addBtn"></el-button>
+                        </div>
+                        <div style="position: absolute;top:80%;width:5%;padding:0;margin: 0;text-align: center;left: 28%">
+                            <el-button class="el-icon-d-arrow-left" :disabled="per_delBtn_dis" @click="person_delBtn"></el-button>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="layui-col-md5" style="width: 45%">
+                    <div class="layui-card">
+
+                        <div class="layui-card-header" style="margin-bottom: 10px" v-if="person_righttable">
+                            报名人员({{person_righttable.length}}人)
+                        </div>
+                        <div  class="layui-card-body">
+                            <template>
+                                <el-table
+                                        height="480"
+                                        ref="multipleTable"
+                                        :data="person_righttable"
+                                        tooltip-effect="dark"
+                                        style="width: 100%;"
+                                        stripe
+                                        border
+                                        @selection-change="rightTableSelect">
+                                    <el-table-column
+                                            fixed
+                                            type="selection"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="cardno"
+                                            label="卡号"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="custname"
+                                            label="姓名"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            prop="bankcardno"
+                                            label="银行卡号"
+                                            >
+                                    </el-table-column>
+                                </el-table>
+                            </template>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-row layui-col-space15">
+            <div style="float:left;margin:0px 0 0 30%;"></div>
+            <div style="float:left;margin:0px 0 0 10%;"><el-button style="margin-top: 12px;" @click="save_btn">保存</el-button></div>
+        </div>
+    </div>
+    </div>
+    </div>
+
+</div>
+
+<script>
+    var review_vue = new Vue({
+        el: '#confreviewapp',
+        data:{
+            oper:'',
+            readonly:true,
+            dept:'',
+            tableData: [],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            sel_classid:'',
+            currentRow: null,
+            classform:{
+                classname:'',
+            },
+            person_person:{
+                custname:'',
+                custtypeid:'',
+                deptcode:''
+            },
+            devtypes:[],
+            typegrplist:[{value:1,label:'工作日'},{value:2,label:'节假日'},],
+            person_lefttable:[],
+            person_righttable:[],
+            custtypelist:[],
+            timelist:[],
+            deptlist:[],
+            leftTableSelection:[],
+            rightTableSelection:[],
+            per_addBtn_dis:true,
+            per_delBtn_dis:true,
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            classtitle:'添加班次',
+
+            pickerOptions0: {
+                disabledDate:function(time) {
+                    return time.getTime() <Date.now();
+                }
+            },
+            pickerOptions1: {
+                disabledDate:function(time) {
+                    if(review_vue.classDiaForm.startdate !=''){
+
+                        return time.getTime() < review_vue.classDiaForm.startdate.getTime();
+                    }else {
+                        return time.getTime() < Date.now();
+                    }
+                }
+            },
+            rules:{
+                classname:[
+                    { required: true, message: '请输入班次名称', trigger: 'blur' },
+                    { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+                workorno:[
+                    { required: true, message: ' ',},
+                ],
+                timegrpid:[
+                    { required: true, message: ' '},
+                ],
+                startdate:[
+                    { required: true,message: ' ', },
+                ],
+                enddate:[
+                    { required: true ,message: ' ',},
+                ],
+                deptcode:[
+                    { required: true ,message: ' ',},
+                ],
+            },
+
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                class_commonQuery(this,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                class_commonQuery(this,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                class_commonQuery(this,this.currPage,this.pageSize);
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            saveClass:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    class_saveData(_that,formName);
+                }
+            },
+            editClass:function (id) {
+                class_getFillData(this,id);
+                this.dialogFormVisible = true;
+                this.classtitle="修改班次"
+            },
+            classtypefor:function (row) {
+
+                return classtype_grpname(row.workorno);
+            },
+            deptfor:function (row) {
+
+                return dept_grpname(row.deptcode);
+            },
+            timefor:function(row){
+                return timegrp_grpname(row.timegrpid);
+            },
+
+            startdatefor:function(row){
+                if(row.startdate != null) {
+                    return dateformatter(row.startdate);
+                }
+            },
+            enddatefor:function(row){
+                if(row.enddate != null) {
+                    return dateformatter(row.enddate);
+                }
+            },
+
+            assignCust:function(id){
+                this.sel_classid=id;
+                $("#classdiv").hide();
+                $("#assign_custSelect").show();
+                $("#cust_qrybtn").click();
+            },
+            searchCust:function(){
+                var that=this;
+                    addAllCustList(that);
+            },
+            lefttableSelect:function(val) {
+                //console.log(val);
+                this.leftTableSelection = val;
+                this.per_addBtn_dis=this.leftTableSelection<=0;
+            },
+            rightTableSelect:function(val) {
+                this.rightTableSelection = val;
+                this.per_delBtn_dis=this.rightTableSelection<=0;
+            },
+            person_addBtn:function(){
+                var _self=this;
+                var left=_self.leftTableSelection;
+                var right=[];
+                right=left.splice(0,left.length);
+                var dev={};
+                for(var i=0;i<right.length;i++){
+                    if($.inArray(right[i],_self.person_righttable)==-1) {
+                        _self.person_righttable.push(right[i]);
+                    }
+                }
+                var leftData=this.person_lefttable;
+                for(var i=0;i<right.length;i++){
+                    var s = $.inArray(right[i],leftData );
+                    if (s != -1) {
+                        leftData.splice(s, 1);
+                    }
+                }
+                this.per_addBtn_dis=true;
+            },
+            person_delBtn:function(){
+                var right=this.rightTableSelection;
+                var rightData=this.person_righttable;
+                for(var i=0;i<right.length;i++) {
+                    var s = $.inArray(right[i], rightData);//判断是否在rightData中存在这个值，存在返回下标，不存在返回-1
+                    if (s != -1) {
+                        rightData.splice(s, 1);
+                    }
+                }
+                for(var i=0;i<right.length;i++) {
+                    this.person_lefttable.push(right[i]);
+                }
+                this.per_delBtn_dis = true;
+            },
+            save_btn: function () {
+                var that=this;
+                save_review(that);
+            },
+            prev_btn:function (){
+                $("#classdiv").show();
+                $("#assign_custSelect").hide();
+                this.person_lefttable=[];
+                this.person_righttable=[];
+            },
+            addClass:function(){
+                class_getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.classtitle="添加班次";
+
+
+            },
+            delClass:function(id){
+                class_deletedata(id);
+            }
+        },
+        created:function(){
+            var that=this;
+
+            var token=$("meta[name='_csrf_token']").attr("value");
+            var custname=that.person_person.custname;
+            var custtypeid=that.person_person.custtypeid;
+            that.person_lefttable=[];
+            var url="[[@{/confreview/custlist?}]]"+"perName="+custname+"&custtypeid="+custtypeid
+            ;
+            $.ajax({
+                type: "POST",
+                url: url,
+                dataType: "json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                contentType: "application/json",
+                data: "",
+                success: function (data) {
+
+                    if(data.countIndex){
+                        layer.msg('人员数量过大，请输入查询条件！',{icon:2,time:3000});
+                    }else{
+                        // addDoorlist_vue.person_lefttable=data.pNotInResult;
+                        var allcust=data.allcust;
+                        var reviewlist=data.reviewlist;
+                        that.person_righttable=reviewlist;
+                        that.person_lefttable=allcust;
+                    }
+                    var custtypelist = [];
+                    var types=data.custtypelist;
+                    for (var i = 0; i < types.length; i++) {
+                        custtypelist.push({
+                            value: types[i].custtypeid,
+                            label: types[i].custtypename
+                        });
+                    }
+                    that.custtypelist=custtypelist;
+                }
+            });
+        }
+
+    })
+    function save_review(that){
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+
+        var idlist=new Array();
+        var right=that.person_righttable;
+
+        for(var i=0;i<right.length;i++){
+            idlist.push(right[i].custid);
+        }
+
+        $.ajax({
+            type: "POST",
+            url:"[[@{confreview/addreview?}]]"+"idlist="+idlist,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            success: function (data) {
+
+                if (data.errStr == undefined) {
+                    layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                    window.location = "login";
+                    return;
+                }
+                if(data.errStr != ''){
+                    layer.msg(data.errStr, {icon: 2, time: 1000});
+                    return ;
+                }
+                if (data.errStr == ''){
+                    layer.msg('保存成功！', {icon: 1, time: 1000});
+                    $("#cust_qrybtn").click();
+                    return ;
+                }
+            }
+        });
+    }
+    function addAllCustList(that){
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var custname=that.person_person.custname;
+        var custtypeid=that.person_person.custtypeid;
+        var url="[[@{/confreview/custlist?}]]"+"perName="+custname+"&custtypeid="+custtypeid;
+
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            contentType: "application/json",
+            data: "",
+            success: function (data) {
+                if(data.countIndex){
+                    layer.msg('人员数量过大，请输入查询条件！',{icon:2,time:3000});
+                }else{
+                   // addDoorlist_vue.person_lefttable=data.pNotInResult;
+                    var allcust=data.allcust;
+                    var reviewlist=data.reviewlist;
+                    var num=allcust.length;
+                   that.person_righttable=reviewlist;
+                    that.person_lefttable=allcust;
+                }
+            }
+        });
+
+    }
+
+
+
+
+
+/*
+
+
+
+    function class_commonQuery(_self,pageno,pagesize) {
+       var classname=_self.classform.classname;
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:"[[@{/atte/class/list?classname=}]]"+classname+"&pageNo="+pageno+"&pageSize="+pagesize,
+            success:function(ret){
+                _self.totSize=ret.PageResult.totalCount;
+                _self.tableData=ret.PageResult.list;
+                if(_self.totSize == 0 ){
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+                if (ret.errStr != ''){
+                    lay.msg(ret.errStr,{icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+
+
+
+
+
+
+
+    function class_refreshThisTable(){
+        class_commonQuery(review_vue,review_vue.currPage,review_vue.pageSize);
+    }*/
+
+
+
+
+
+</script>
\ No newline at end of file
