diff --git a/src/main/java/com/supwisdom/dlpay/conference/controller/ConfReportController.java b/src/main/java/com/supwisdom/dlpay/conference/controller/ConfReportController.java
index a77c228..b93540b 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/controller/ConfReportController.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/controller/ConfReportController.java
@@ -120,7 +120,7 @@
         }
     }
 
-    @GetMapping("/confreport/print")
+    @GetMapping("/confreport/print/print")
     public String printReport( @RequestParam(value = "confname", required = false) String confname,
                                   @RequestParam(value = "conftype", required = false) String conftype,
                                   @RequestParam(value = "startdate", required = false) String startdate,
@@ -151,4 +151,29 @@
         return "confreport/print/printindex";
     }
 
+    @GetMapping("/confreport/print/printatt")
+    public String printunatt( @RequestParam(value = "actualcnt", required = false) String actualcnt,
+                               @RequestParam(value = "attendrate", required = false) String attendrate,
+                               @RequestParam(value = "totcnt", required = false) String totcnt,
+                               @RequestParam(value = "confid", required = false) Integer confid,
+                              @RequestParam(value = "confdate", required = false) String confdate,
+                              @RequestParam(value = "confname", required = false) String confname,
+                              @RequestParam(value = "opercode",required = false) String opercode,
+                               ModelMap model) {
+        TOperator oper=managerService.getOperatorByOpercode(opercode);
+     //   String deptcode = oper.getDeptcode();
+        PageResult<ConfpeopleReportBean> bean=conferenceService.getConfPeopleReportForPrint(confid);
+
+        model.addAttribute("confdate", confdate);
+        model.addAttribute("confname", confname);
+        model.addAttribute("actualcnt", actualcnt);
+        model.addAttribute("attendrate", attendrate);
+        model.addAttribute("totcnt",totcnt);
+        model.addAttribute("showlist",bean.getData());
+        model.addAttribute("opername", oper == null ? "unknow" : oper.getOpername());
+        model.addAttribute("printdatetime",DateUtil.reformatDatetime(systemUtilService.getSysdatetime().getHostdatetime(),DateUtil.DATETIME_FMT,"yyyy-MM-dd HH:mm:ss"));
+
+        return "confreport/print/attindex";
+    }
+
 }
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 73cd92f..e2b54aa 100644
--- a/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
+++ b/src/main/java/com/supwisdom/dlpay/conference/service/ConferenceService.java
@@ -91,6 +91,9 @@
     PageResult<ConfpeopleReportBean> getConfPeopleReport(Integer confid, String searchkey,String attstatus, String deptcode,String attflag);
 
     @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<ConfpeopleReportBean> getConfPeopleReportForPrint(Integer confid);
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
     TConfPeople getTConfPeopleByConfidAndCustid(Integer confid,String custid) ;
 
     @Transactional(rollbackFor = Exception.class, readOnly = true)
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 82df227..b27841b 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
@@ -74,21 +74,21 @@
     private EntityManager entityManager;
 
     @Override
-    public PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype,String deptcode,String confdate, int pageNo, int pageSize) {
-        Page<TConference> page = getConferencePage(confname, conftype, deptcode, "","","", pageNo, pageSize);
+    public PageResult<ConferenceShowBean> getConferenceInfos(String confname, String conftype, String deptcode, String confdate, int pageNo, int pageSize) {
+        Page<TConference> page = getConferencePage(confname, conftype, deptcode, "", "", "", pageNo, pageSize);
         List<ConferenceShowBean> result = new ArrayList<>(0);
         if (null != page && page.getTotalElements() > 0) {
             for (TConference conf : page.getContent()) {
                 ConferenceShowBean bean = new ConferenceShowBean();
                 bean.setConfname(conf.getConfname());
-                bean.setConfdate(DateUtil.reformatDatetime(conf.getConfdate(),"yyyyMMdd","yyyy-MM-dd"));
+                bean.setConfdate(DateUtil.reformatDatetime(conf.getConfdate(), "yyyyMMdd", "yyyy-MM-dd"));
                 bean.setConftype(conf.getConftype());
                 bean.setStatus(conf.getStatus());
                 bean.setConfid(conf.getConfid());
                 bean.setRemark(conf.getRemark());
                 bean.setStarttime(conf.getStarttime().substring(0, 2) + ":" + conf.getStarttime().substring(2));
                 bean.setEndtime(conf.getEndtime().substring(0, 2) + ":" + conf.getEndtime().substring(2));
-                bean.setTimeperoid(bean.getStarttime()+"~"+bean.getEndtime());
+                bean.setTimeperoid(bean.getStarttime() + "~" + bean.getEndtime());
                 bean.setAttendtime(conf.getAttendtime().substring(0, 2) + ":" + conf.getAttendtime().substring(2));
                 result.add(bean);
             }
@@ -97,43 +97,43 @@
     }
 
     @Override
-    public PageResult<ConfReportShowBean> getConfReportPage(String confname, String conftype, String deptcode, String startdate,String enddate,String status, int pageNo, int pageSize) {
-        Page<TConference> page = getConferencePage(confname, conftype, deptcode, startdate,enddate,status, pageNo, pageSize);
+    public PageResult<ConfReportShowBean> getConfReportPage(String confname, String conftype, String deptcode, String startdate, String enddate, String status, int pageNo, int pageSize) {
+        Page<TConference> page = getConferencePage(confname, conftype, deptcode, startdate, enddate, status, pageNo, pageSize);
         List<ConfReportShowBean> result = new ArrayList<>(0);
-        DecimalFormat format=new DecimalFormat("0.00");
+        DecimalFormat format = new DecimalFormat("0.00");
         if (null != page && page.getTotalElements() > 0) {
             for (TConference conf : page.getContent()) {
-                ConfReportShowBean bean=new ConfReportShowBean();
+                ConfReportShowBean bean = new ConfReportShowBean();
                 bean.setConfname(conf.getConfname());
-                bean.setConfdate(DateUtil.reformatDatetime(conf.getConfdate(),"yyyyMMdd","yyyy-MM-dd"));
+                bean.setConfdate(DateUtil.reformatDatetime(conf.getConfdate(), "yyyyMMdd", "yyyy-MM-dd"));
                 bean.setConftype(conf.getConftype());
                 bean.setConfid(conf.getConfid());
-                String starttime=conf.getStarttime().substring(0, 2) + ":" + conf.getStarttime().substring(2);
-                String endtime=conf.getEndtime().substring(0, 2) + ":" + conf.getEndtime().substring(2);
-                bean.setTimeperoid(starttime+"~"+endtime);
+                String starttime = conf.getStarttime().substring(0, 2) + ":" + conf.getStarttime().substring(2);
+                String endtime = conf.getEndtime().substring(0, 2) + ":" + conf.getEndtime().substring(2);
+                bean.setTimeperoid(starttime + "~" + endtime);
                 bean.setAttendtime(conf.getAttendtime().substring(0, 2) + ":" + conf.getAttendtime().substring(2));
-                if(ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())){
-                    Integer totcnt=getNoListConfPeopleTotalCount(conf.getConfid());
-                    Integer actualcnt=nolistConfPeopleDao.countByConfid(conf.getConfid());
-                    Float rate=0f;
-                    if(0!=totcnt){
-                        rate=actualcnt*100f/totcnt;
+                if (ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())) {
+                    Integer totcnt = getNoListConfPeopleTotalCount(conf.getConfid());
+                    Integer actualcnt = nolistConfPeopleDao.countByConfid(conf.getConfid());
+                    Float rate = 0f;
+                    if (0 != totcnt) {
+                        rate = actualcnt * 100f / totcnt;
                     }
-                    bean.setActualcnt(actualcnt+"");
-                    bean.setTotcnt(totcnt+"");
-                    bean.setAttendrate(format.format(rate)+"%");
+                    bean.setActualcnt(actualcnt + "");
+                    bean.setTotcnt(totcnt + "");
+                    bean.setAttendrate(format.format(rate) + "%");
 
-                }else if(ConferenceConstant.CONFTYPE_LIST.equals(conf.getConftype())){
+                } else if (ConferenceConstant.CONFTYPE_LIST.equals(conf.getConftype())) {
                     Integer totcnt = getListConfPeopleTotalCount(conf.getConfid());
-                    Integer actualcnt=getConfPeopleActualCount(conf.getConfid());
-                    Float rate=0f;
-                    if(0!=totcnt){
-                        rate=actualcnt*100f/totcnt;
-                        bean.setAttendrate(format.format(rate)+"%");
+                    Integer actualcnt = getConfPeopleActualCount(conf.getConfid());
+                    Float rate = 0f;
+                    if (0 != totcnt) {
+                        rate = actualcnt * 100f / totcnt;
+                        bean.setAttendrate(format.format(rate) + "%");
                     }
-                    bean.setActualcnt(actualcnt+"");
-                    bean.setTotcnt(totcnt+"");
-                    bean.setAttendrate(format.format(rate)+"%");
+                    bean.setActualcnt(actualcnt + "");
+                    bean.setTotcnt(totcnt + "");
+                    bean.setAttendrate(format.format(rate) + "%");
                 }
                 result.add(bean);
 
@@ -143,13 +143,13 @@
     }
 
     @NotNull
-    private Page<TConference> getConferencePage(String confname, String conftype, String deptcode, String startdate,String enddate,String status, int pageNo, int pageSize) {
-        Sort.Order order1=new Sort.Order(Sort.Direction.DESC, "confdate");
-        Sort.Order order2=new Sort.Order(Sort.Direction.DESC, "confid");
+    private Page<TConference> getConferencePage(String confname, String conftype, String deptcode, String startdate, String enddate, String status, int pageNo, int pageSize) {
+        Sort.Order order1 = new Sort.Order(Sort.Direction.DESC, "confdate");
+        Sort.Order order2 = new Sort.Order(Sort.Direction.DESC, "confid");
         List<Sort.Order> list = new ArrayList<>();
         list.add(order1);
         list.add(order2);
-        Sort sort =Sort.by(list);
+        Sort sort = Sort.by(list);
         Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort);
 
 
@@ -163,9 +163,9 @@
                 if (!StringUtil.isEmpty(conftype)) {
                     predicates.add(criteriaBuilder.equal(root.get("conftype").as(String.class), conftype));
                 }
-                List<String> childdplist=null;
-                if(!StringUtil.isEmpty(deptcode)){
-                    childdplist = customerDao.getChildDeptlist( deptcode);
+                List<String> childdplist = null;
+                if (!StringUtil.isEmpty(deptcode)) {
+                    childdplist = customerDao.getChildDeptlist(deptcode);
                 }
                 if (!StringUtil.isEmpty(childdplist)) {
                     predicates.add(root.get("deptcode").in(childdplist));
@@ -186,7 +186,7 @@
     }
 
     @Override
-    public boolean deleteConference(int confid) throws Exception{
+    public boolean deleteConference(int confid) throws Exception {
         TConference conf = conferenceDao.findByConfid(confid);
         if (null == conf) {
             throw new WebCheckException("餐补规则不存在！");
@@ -202,8 +202,8 @@
 
     @Override
     public boolean deleteConfPeople(String pid) throws Exception {
-        TConfPeople people=confPeopleDao.getOne(pid);
-        if(null == people){
+        TConfPeople people = confPeopleDao.getOne(pid);
+        if (null == people) {
             throw new WebCheckException("会议人员不存在");
         }
         confPeopleDao.delete(people);
@@ -212,11 +212,11 @@
 
     @Override
     public List<TNcDevice> getBindedDevices(int confid) {
-        List<TConferenceDevbind> bind=conferenceDevbindDao.findAllByConfid(confid);
-        List<TNcDevice> list=new ArrayList<>();
-        if(!StringUtil.isEmpty(bind)){
-            for(TConferenceDevbind b:bind){
-                TNcDevice dev=deviceDao.findDevById(b.getDeviceid());
+        List<TConferenceDevbind> bind = conferenceDevbindDao.findAllByConfid(confid);
+        List<TNcDevice> list = new ArrayList<>();
+        if (!StringUtil.isEmpty(bind)) {
+            for (TConferenceDevbind b : bind) {
+                TNcDevice dev = deviceDao.findDevById(b.getDeviceid());
                 list.add(dev);
             }
             return list;
@@ -226,24 +226,24 @@
 
     @Override
     public boolean checkDevBindRelationship(int confid, int deviceid) {
-        TConferenceDevbind bind = conferenceDevbindDao.findByConfidAndDeviceid(confid,deviceid);
-        if(null!=bind){
+        TConferenceDevbind bind = conferenceDevbindDao.findByConfidAndDeviceid(confid, deviceid);
+        if (null != bind) {
             return true;
         }
         return false;
     }
 
     @Override
-    public List<TConference> getConferenceByDateAndStatus(String confdate,String status) {
+    public List<TConference> getConferenceByDateAndStatus(String confdate, String status) {
 
         List<TConference> conflist;
-        if(!StringUtil.isEmpty(status)){
-            conflist=conferenceDao.findByConfdateAndStatus(confdate,status);
-        }else{
-            conflist=conferenceDao.findByConfdate(confdate);
+        if (!StringUtil.isEmpty(status)) {
+            conflist = conferenceDao.findByConfdateAndStatus(confdate, status);
+        } else {
+            conflist = conferenceDao.findByConfdate(confdate);
         }
 
-        if(StringUtil.isEmpty(conflist)){
+        if (StringUtil.isEmpty(conflist)) {
             return null;
         }
         return conflist;
@@ -251,7 +251,7 @@
 
     @Override
     public List<TConference> getAllConference(String deptcode) {
-        if(!StringUtil.isEmpty(deptcode)){
+        if (!StringUtil.isEmpty(deptcode)) {
             return conferenceDao.findAllByDeptcodeOrderByConfdate(deptcode);
         }
         return conferenceDao.findAllOrderByConfdate();
@@ -274,12 +274,12 @@
     }*/
 
     @Override
-    public boolean saveNewConference(String confname,String confdate, String conftype, String starttime, String endtime,String attendtime, TOperator oper, List<Integer> deviceid,String remark) throws Exception {
+    public boolean saveNewConference(String confname, String confdate, String conftype, String starttime, String endtime, String attendtime, TOperator oper, List<Integer> deviceid, String remark) throws Exception {
 
-        for(Integer i : deviceid){
-            String errdevname=checkTimeErrorDevice(attendtime,endtime,confdate,i);
-            if(!StringUtil.isEmpty(errdevname)){
-                throw new WebCheckException("设备《"+ errdevname+"》存在时间冲突，请重新选择设备");
+        for (Integer i : deviceid) {
+            String errdevname = checkTimeErrorDevice(attendtime, endtime, confdate, i);
+            if (!StringUtil.isEmpty(errdevname)) {
+                throw new WebCheckException("设备《" + errdevname + "》存在时间冲突，请重新选择设备");
             }
         }
 
@@ -304,8 +304,8 @@
         conf.setRemark(remark);
         conf = conferenceDao.save(conf);
 
-        for(Integer i : deviceid){
-            TConferenceDevbind bind=new TConferenceDevbind();
+        for (Integer i : deviceid) {
+            TConferenceDevbind bind = new TConferenceDevbind();
             bind.setConfid(conf.getConfid());
             bind.setCreateOperid(oper.getOperid());
             bind.setCreatetime(systime);
@@ -317,8 +317,8 @@
 
     @Override
     public boolean saveConferencePeopleByExcel(Integer confid, String fpath) throws Exception {
-        TConference conference=conferenceDao.findByConfid(confid);
-        if(null==conference){
+        TConference conference = conferenceDao.findByConfid(confid);
+        if (null == conference) {
             throw new WebCheckException("会议不存在");
         }
         List<String> successCardnos = new ArrayList<>(0);
@@ -334,7 +334,7 @@
         try {
             for (int n = 0; n < peoplelist.size(); n++) {
                 String msg = "";
-                String cardno =peoplelist.get(n).getCardno().trim();
+                String cardno = peoplelist.get(n).getCardno().trim();
                 String name = peoplelist.get(n).getCustname().trim();
                 if (StringUtil.isEmpty(cardno)) {
                     msg += "，市民卡号为空";
@@ -342,10 +342,10 @@
                 if (StringUtil.isEmpty(name)) {
                     msg += "，姓名为空";
                 }
-                TCustomerInfo customer=null;
-                List<TCustomerInfo> customerlist = webInterfaceService.getAllTCustomerList(null,cardno,null);
-                if(customerlist.size()>0){
-                    customer=customerlist.get(0);
+                TCustomerInfo customer = null;
+                List<TCustomerInfo> customerlist = webInterfaceService.getAllTCustomerList(null, cardno, null);
+                if (customerlist.size() > 0) {
+                    customer = customerlist.get(0);
                 }
                 if (!customer.getCustname().equals(name)) {
                     msg += "，市民卡号与姓名不匹配！";
@@ -353,16 +353,16 @@
                 if (!StringUtil.isEmpty(cardno) && successCardnos.contains(cardno)) {
                     msg += "，市民卡号重复！";
                 }
-                String errconfname=checkConfTimeError(conference.getAttendtime(),conference.getEndtime(),conference.getConfdate(),cardno);
-                if(!StringUtil.isEmpty(errconfname)){
-                    msg += "，市民卡号[" + cardno + "]在会议："+errconfname+"中已存在！";
+                String errconfname = checkConfTimeError(conference.getAttendtime(), conference.getEndtime(), conference.getConfdate(), cardno);
+                if (!StringUtil.isEmpty(errconfname)) {
+                    msg += "，市民卡号[" + cardno + "]在会议：" + errconfname + "中已存在！";
                 }
 
                 if (!StringUtil.isEmpty(msg)) {
                     errmsgList.add("第" + (n + 1) + "行数据错误" + msg);
                 } else {
-                    String atttype=ConferenceConstant.ATTTYPE_SELF;
-                    String custid=customer.getCustid();
+                    String atttype = ConferenceConstant.ATTTYPE_SELF;
+                    String custid = customer.getCustid();
                     saveNewConfPeople(confid, cardno, name, atttype, custid);
 
                     successCardnos.add(cardno);
@@ -393,31 +393,31 @@
         List<String> successCardnos = new ArrayList<>(0);
         List<String> errmsgList = new ArrayList<>(0);
 
-        for (String card :cardnos) {
+        for (String card : cardnos) {
             String msg = "";
-            TCustomerInfo customer=new TCustomerInfo();
-            List<TCustomerInfo> customerlist = webInterfaceService.getAllTCustomerList(null,card,null);
+            TCustomerInfo customer = new TCustomerInfo();
+            List<TCustomerInfo> customerlist = webInterfaceService.getAllTCustomerList(null, card, null);
 
-            if(customerlist.size()>0){
-                customer=customerlist.get(0);
-            }else{
-                msg+=",对应用户不存在";
+            if (customerlist.size() > 0) {
+                customer = customerlist.get(0);
+            } else {
+                msg += ",对应用户不存在";
             }
-            TConference conference=conferenceDao.findByConfid(confid);
-            if(null==conference){
-                msg+=",会议不存在";
+            TConference conference = conferenceDao.findByConfid(confid);
+            if (null == conference) {
+                msg += ",会议不存在";
             }
 
-            String errconfname=checkConfTimeError(conference.getAttendtime(),conference.getEndtime(),conference.getConfdate(),card);
-            if(!StringUtil.isEmpty(errconfname)){
-                msg += "，市民卡号[" + card + "]在会议："+errconfname+"中已存在！";
+            String errconfname = checkConfTimeError(conference.getAttendtime(), conference.getEndtime(), conference.getConfdate(), card);
+            if (!StringUtil.isEmpty(errconfname)) {
+                msg += "，市民卡号[" + card + "]在会议：" + errconfname + "中已存在！";
             }
             if (!StringUtil.isEmpty(msg)) {
                 errmsgList.add("，市民卡号[" + card + "]错误" + msg);
-            } else{
-                String atttype=ConferenceConstant.ATTTYPE_SELF;
-                String custid=customer.getCustid();
-                saveNewConfPeople(confid,customer.getCardno(),customer.getCustname(),atttype,custid);
+            } else {
+                String atttype = ConferenceConstant.ATTTYPE_SELF;
+                String custid = customer.getCustid();
+                saveNewConfPeople(confid, customer.getCardno(), customer.getCustname(), atttype, custid);
             }
 
 
@@ -474,24 +474,24 @@
 
     @Override
     public List<TConfDtl> getUnupdateConfDtl() {
-        List<TConfDtl> dtl=confDtlDao.findByUpdateflag(ConferenceConstant.CONFDTL_STATUS_UNUPDATE);
-        if(!StringUtil.isEmpty(dtl)){
+        List<TConfDtl> dtl = confDtlDao.findByUpdateflag(ConferenceConstant.CONFDTL_STATUS_UNUPDATE);
+        if (!StringUtil.isEmpty(dtl)) {
             return dtl;
         }
         return null;
     }
 
     @Override
-    public List<ConferenceApiBean> getConferneceForDevice(String confdate,Integer deviceid) {
-        StringBuffer querySql=new StringBuffer("select a.confid,a.confname,a.conftype," +
+    public List<ConferenceApiBean> getConferneceForDevice(String confdate, Integer deviceid) {
+        StringBuffer querySql = new StringBuffer("select a.confid,a.confname,a.conftype," +
                 "a.confdate,a.status,a.starttime,a.endtime,a.attendtime,c.devname as confarea from tb_conference a " +
                 "left join tb_conference_devbind b on a.confid=b.confid " +
                 "left join t_nc_device c on b.deviceid=c.deviceid " +
                 "where a.confdate=:confdate and c.deviceid=:deviceid");
 
         Query query = entityManager.createNativeQuery(querySql.toString());
-        query.setParameter("confdate",confdate);
-        query.setParameter("deviceid",deviceid);
+        query.setParameter("confdate", confdate);
+        query.setParameter("deviceid", deviceid);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ConferenceApiBean.class));
         List<ConferenceApiBean> list = query.getResultList();
         return list;
@@ -499,7 +499,7 @@
 
     @Override
     public TNolistConfPeople saveNolistConfPeople(TNolistConfPeople people) {
-        return nolistConfPeopleDao.save(people) ;
+        return nolistConfPeopleDao.save(people);
     }
 
     @Override
@@ -515,13 +515,13 @@
     @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){
+        if (ConferenceConstant.CONFTYPE_NOLIST.equals(conftype)) {
+            TNolistConfPeople people = nolistConfPeopleDao.getOne(pid);
+            if (null == people) {
                 return JsonResult.error("修改失败，未查询到该用户");
             }
-            TConference conf=conferenceDao.findByConfid(people.getConfid());
-            if(null==conf){
+            TConference conf = conferenceDao.findByConfid(people.getConfid());
+            if (null == conf) {
                 return JsonResult.error("修改失败，会议不存在");
             }
 
@@ -530,35 +530,35 @@
             people.setRemark(remark);
             nolistConfPeopleDao.save(people);
 
-        }else{
-            TConfPeople people=confPeopleDao.getOne(pid);
-            if(null==people){
+        } else {
+            TConfPeople people = confPeopleDao.getOne(pid);
+            if (null == people) {
                 return JsonResult.error("修改失败，未查询到该用户");
             }
-            TConference conf=conferenceDao.findByConfid(people.getConfid());
-            if(null==conf){
+            TConference conf = conferenceDao.findByConfid(people.getConfid());
+            if (null == conf) {
                 return JsonResult.error("修改失败，会议不存在");
             }
-            if(null!=people.getAtttime()){
+            if (null != people.getAtttime()) {
                 return JsonResult.error("已签到人员不可修改状态");
             }
 
-            if(ConferenceConstant.ATTENDSTATUS_INSTEAD.equals(attstatus)){
-                if(ConferenceConstant.CONFSTATUS_OVER.equals(conf.getStatus())||ConferenceConstant.CONFSTATUS_START.equals(conf.getStatus())){
+            if (ConferenceConstant.ATTENDSTATUS_INSTEAD.equals(attstatus)) {
+                if (ConferenceConstant.CONFSTATUS_OVER.equals(conf.getStatus()) || ConferenceConstant.CONFSTATUS_START.equals(conf.getStatus())) {
                     return JsonResult.error("已开始或结束的会议不能代签");
                 }
-                List<TCustomerInfo> clist=customerDao.getAllTCustomerList("","","",insteadcustid);
-                if(clist.size()<=0){
+                List<TCustomerInfo> clist = customerDao.getAllTCustomerList("", "", "", insteadcustid);
+                if (clist.size() <= 0) {
                     return JsonResult.error("代签人员不存在");
                 }
-                TCustomerInfo cust=clist.get(0);
-                saveNewConfPeople(conf.getConfid(),cust.getCardno(),cust.getCustname(),ConferenceConstant.ATTTYPE_INSTEAD,insteadcustid);
+                TCustomerInfo cust = clist.get(0);
+                saveNewConfPeople(conf.getConfid(), cust.getCardno(), cust.getCustname(), ConferenceConstant.ATTTYPE_INSTEAD, insteadcustid);
             }
 
             people.setInsteadcustid(insteadcustid);
             people.setAttstatus(attstatus);
             people.setRemark(remark);
-            if(ConferenceConstant.ATTENDSTATUS_HANDCHECK.equals(attstatus)){
+            if (ConferenceConstant.ATTENDSTATUS_HANDCHECK.equals(attstatus)) {
                 people.setAtttime("----");
             }
             confPeopleDao.save(people);
@@ -569,29 +569,29 @@
     }
 
     @Override
-    public PageResult<ConfpeopleShowBean> getConfPeoplePage(Integer confid, String attstatus,String atttype, int pageNo, int pageSize) {
-        TConference conf=conferenceDao.findByConfid(confid);
-        if(null==conf){
+    public PageResult<ConfpeopleShowBean> getConfPeoplePage(Integer confid, String attstatus, String atttype, int pageNo, int pageSize) {
+        TConference conf = conferenceDao.findByConfid(confid);
+        if (null == conf) {
             return new PageResult<>(99, "会议不存在");
         }
-        String table="tb_conf_people";
+        String table = "tb_conf_people";
 
-        if(ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())){
-            table="tb_nolist_conf_people";
+        if (ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())) {
+            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,e.custname as insteadcustname,b.atttype from "+table+" b  " +
+        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,e.custname as insteadcustname,b.atttype 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 " +
                 "left join t_customer e on b.insteadcustid=e.custid " +
                 "where b.confid=:confid and b.atttype!='temp' " +
                 "union " +
-                "select a.confid,a.confname,b.custname,b.cardno,b.remark as deptname,b.attstatus,b.atttime,b.custid,b.pid,'临时人员' as remark,'' as insteadcustid,a.conftype,'' as insteadcustname,b.atttype  from "+table+" b  " +
+                "select a.confid,a.confname,b.custname,b.cardno,b.remark as deptname,b.attstatus,b.atttime,b.custid,b.pid,'临时人员' as remark,'' as insteadcustid,a.conftype,'' as insteadcustname,b.atttype  from " + table + " b  " +
                 "left join tb_conference a on a.confid=b.confid " +
-                "where b.confid=:confid and b.atttype='temp' " );
+                "where b.confid=:confid and b.atttype='temp' ");
 
-        StringBuffer countSql = new StringBuffer("select count(*) from "+table+" b  " +
+        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 " +
@@ -611,8 +611,8 @@
         Query query = entityManager.createNativeQuery(querySql.toString());
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
 
-        query.setParameter("confid",confid);
-        countQuery.setParameter("confid",confid);
+        query.setParameter("confid", confid);
+        countQuery.setParameter("confid", confid);
         if (!StringUtil.isEmpty(attstatus)) {
             query.setParameter("attstatus", attstatus);
             countQuery.setParameter("attstatus", attstatus);
@@ -626,67 +626,101 @@
     }
 
     @Override
-    public PageResult<ConfpeopleReportBean> getConfPeopleReport(Integer confid,String searchkey, String attstatus, String deptcode,String attflag) {
-        TConference conf=conferenceDao.findByConfid(confid);
-        if(null==conf){
+    public PageResult<ConfpeopleReportBean> getConfPeopleReport(Integer confid, String searchkey, String attstatus, String deptcode, String attflag) {
+        TConference conf = conferenceDao.findByConfid(confid);
+        if (null == conf) {
             return null;
         }
-        String table="tb_conf_people";
+        String table = "tb_conf_people";
 
-        if(ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())){
-            table="tb_nolist_conf_people";
+        if (ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())) {
+            table = "tb_nolist_conf_people";
         }
 
-        StringBuffer querySql=new StringBuffer("select b.custname,d.deptname,b.attstatus,b.atttime,b.remark,e.custname as insteadcustname,b.atttype from "+table+" b  " +
+        StringBuffer querySql = new StringBuffer("select b.custname,d.deptname,b.attstatus,b.atttime,b.remark,e.custname as insteadcustname,b.atttype 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 " +
                 "left join t_customer e on b.insteadcustid=e.custid " +
-                "where b.confid=:confid and b.atttime is "+attflag +" null and b.atttype !='temp' " );
-        if(!StringUtil.isEmpty(attflag)){
+                "where b.confid=:confid and b.atttime is " + attflag + " null and b.atttype !='temp' ");
+        if (!StringUtil.isEmpty(attflag)) {
             querySql.append("union " +
-                    "select b.custname,b.remark as deptname,b.attstatus,b.atttime,'' as remark,'' as insteadcustname,b.atttype from "+table+" b  " +
+                    "select b.custname,b.remark as deptname,b.attstatus,b.atttime,'' as remark,'' as insteadcustname,b.atttype from " + table + " b  " +
                     "where b.confid=:confid and b.atttype ='temp' ");
         }
         if (!StringUtil.isEmpty(attstatus)) {
             querySql.append(" and b.attstatus=:attstatus ");
         }
-        if(!StringUtil.isEmpty(deptcode)){
-            List<String> deptlist=customerDao.getChildDeptlist(deptcode);
-            if(!StringUtil.isEmpty(deptlist)){
-                querySql.append(" and d.deptcode in ('"+ StringUtils.join(deptlist.toArray(),"','")+"') ");
+
+        if (!StringUtil.isEmpty(deptcode)) {
+            List<String> deptlist = customerDao.getChildDeptlist(deptcode);
+            if (!StringUtil.isEmpty(deptlist)) {
+                querySql.append(" and d.deptcode in ('" + StringUtils.join(deptlist.toArray(), "','") + "') ");
             }
         }
-        if(!StringUtil.isEmpty(searchkey)){
+        if (!StringUtil.isEmpty(searchkey)) {
             querySql.append("and b.custname=:searchkey");
         }
-        querySql.append(" order by atttime ");
+        querySql.append(" order by deptname");
 
-
+        System.out.println(querySql.toString());
 
         Query query = entityManager.createNativeQuery(querySql.toString());
-        query.setParameter("confid",confid);
-        if(!StringUtil.isEmpty(searchkey)){
+        query.setParameter("confid", confid);
+        if (!StringUtil.isEmpty(searchkey)) {
             query.setParameter("searchkey", searchkey);
         }
-        if(!StringUtil.isEmpty(attstatus)){
+        if (!StringUtil.isEmpty(attstatus)) {
             query.setParameter("attstatus", attstatus);
         }
 
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ConfpeopleReportBean.class));
         List<ConfpeopleReportBean> list = query.getResultList();
-        return  new PageResult<>(list);
+        return new PageResult<>(list);
     }
 
+    @Override
+    public PageResult<ConfpeopleReportBean> getConfPeopleReportForPrint(Integer confid) {
+        TConference conf = conferenceDao.findByConfid(confid);
+        if (null == conf) {
+            return null;
+        }
+        String table = "tb_conf_people";
+
+        if (ConferenceConstant.CONFTYPE_NOLIST.equals(conf.getConftype())) {
+            table = "tb_nolist_conf_people";
+        }
+
+        StringBuffer querySql = new StringBuffer("select b.custname,d.deptname,b.attstatus,b.atttime,b.remark,e.custname as insteadcustname,b.atttype 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 " +
+                "left join t_customer e on b.insteadcustid=e.custid " +
+                "where b.confid=:confid and b.atttype !='temp' ");
+        querySql.append("union " +
+                "select b.custname,b.remark as deptname,b.attstatus,b.atttime,'' as remark,'' as insteadcustname,b.atttype from " + table + " b  " +
+                "where b.confid=:confid and b.atttype ='temp' ");
+
+        querySql.append(" order by deptname");
+
+        System.out.println(querySql.toString());
+
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        query.setParameter("confid", confid);
+
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ConfpeopleReportBean.class));
+        List<ConfpeopleReportBean> list = query.getResultList();
+        return new PageResult<>(list);
+    }
 
     @Override
     public TConfPeople getTConfPeopleByConfidAndCustid(Integer confid, String custid) {
-        return confPeopleDao.findByConfidAndCustid(confid,custid);
+        return confPeopleDao.findByConfidAndCustid(confid, custid);
     }
 
     @Override
     public TNolistConfPeople getNolistConfPeopleByConfidAndCustid(Integer confid, String custid) {
-        return nolistConfPeopleDao.findByConfidAndCustid(confid,custid);
+        return nolistConfPeopleDao.findByConfidAndCustid(confid, custid);
 
     }
 
@@ -696,7 +730,7 @@
         list.add(ConferenceConstant.ATTENDSTATUS_CHECKED);
         list.add(ConferenceConstant.ATTENDSTATUS_HANDCHECK);
         list.add(ConferenceConstant.ATTENDSTATUS_LATE);
-        return confPeopleDao.countByConfidAndAttstatusInAndAtttypeNot(confid,list,ConferenceConstant.ATTTYPE_TEMP);
+        return confPeopleDao.countByConfidAndAttstatusInAndAtttypeNot(confid, list, ConferenceConstant.ATTTYPE_TEMP);
     }
 
     @Override
@@ -705,7 +739,7 @@
         list.add(ConferenceConstant.ATTENDSTATUS_INSTEAD);
         list.add(ConferenceConstant.ATTENDSTATUS_CLOSED);
 
-        return confPeopleDao.countByConfidAndAttstatusNotInAndAtttypeNot(confid,list,ConferenceConstant.ATTTYPE_TEMP);
+        return confPeopleDao.countByConfidAndAttstatusNotInAndAtttypeNot(confid, list, ConferenceConstant.ATTTYPE_TEMP);
     }
 
     @Override
@@ -715,7 +749,7 @@
 
     @Override
     public List<ConfPeopleApiBean> getConfPeopleListByDevphyid(String devphyid, String confdate) {
-        StringBuffer querySql=new StringBuffer("select a.custname,a.attstatus,a.atttime from tb_conf_people a " +
+        StringBuffer querySql = new StringBuffer("select a.custname,a.attstatus,a.atttime from tb_conf_people a " +
                 "left join tb_conference b on a.confid=b.confid  " +
                 "left join tb_conference_devbind c on b.confid=c.confid " +
                 "left join t_nc_device d on c.deviceid=d.deviceid " +
@@ -729,8 +763,8 @@
 
 
         Query query = entityManager.createNativeQuery(querySql.toString());
-        query.setParameter("devphyid",devphyid);
-        query.setParameter("confdate",confdate);
+        query.setParameter("devphyid", devphyid);
+        query.setParameter("confdate", confdate);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ConfPeopleApiBean.class));
         List<ConfPeopleApiBean> list = query.getResultList();
         return list;
@@ -738,21 +772,21 @@
 
     @Override
     public List<ConfPeopleApiBean> getConfPeopleListByConfid(Integer confid, String conftype) {
-        String table="tb_conf_people";
-        if(ConferenceConstant.CONFTYPE_NOLIST.equals(conftype)){
-            table="tb_nolist_conf_people";
+        String table = "tb_conf_people";
+        if (ConferenceConstant.CONFTYPE_NOLIST.equals(conftype)) {
+            table = "tb_nolist_conf_people";
         }
-        StringBuffer querySql=new StringBuffer("select a.custname,a.attstatus,a.atttime,c.deptname,d.custtypename from "+table+" a " +
+        StringBuffer querySql = new StringBuffer("select a.custname,a.attstatus,a.atttime,c.deptname,d.custtypename from " + table + " a " +
                 "left join t_customer b on a.custid=b.custid " +
                 "left join tb_dept c on b.deptcode=c.deptcode " +
-                "left join tb_custtype d on b.custtypeid=d.custtypeid "+
-                    "where a.atttime is not null and a.atttype != 'temp' and a.confid=:confid " +
-                "UNION "+
+                "left join tb_custtype d on b.custtypeid=d.custtypeid " +
+                "where a.atttime is not null and a.atttype != 'temp' and a.confid=:confid " +
+                "UNION " +
                 "select a.custname,a.attstatus,a.atttime,a.remark as deptname," +
-                "'临时人员' as custtypename from "+table+" a "+
+                "'临时人员' as custtypename from " + table + " a " +
                 "where  confid=:confid and a.atttype='temp'");
         Query query = entityManager.createNativeQuery(querySql.toString());
-        query.setParameter("confid",confid);
+        query.setParameter("confid", confid);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ConfPeopleApiBean.class));
         List<ConfPeopleApiBean> list = query.getResultList();
         return list;
@@ -760,7 +794,7 @@
     }
 
 
-    private String checkConfTimeError(String attendtime, String endtime,String confdate,String cardno) {
+    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  " +
                 "and  (a.status='unstart' or a.status='start') " +
                 "and b.cardno=:cardno " +
@@ -771,13 +805,13 @@
         query.setParameter("attendtime", attendtime);
         query.setParameter("endtime", endtime);
         List<String> confname = query.getResultList();
-        if(!StringUtil.isEmpty(confname)){
+        if (!StringUtil.isEmpty(confname)) {
             return confname.get(0);
         }
         return null;
     }
 
-    private String checkTimeErrorDevice(String attendtime, String endtime,String confdate,Integer deviceid) {
+    private String checkTimeErrorDevice(String attendtime, String endtime, String confdate, Integer deviceid) {
         Query query = entityManager.createNativeQuery("select c.devname from tb_conference a " +
                 "left join tb_conference_devbind b on a.confid=b.confid " +
                 "left join t_nc_device c on b.deviceid=c.deviceid " +
@@ -790,7 +824,7 @@
         query.setParameter("attendtime", attendtime);
         query.setParameter("endtime", endtime);
         List<String> confname = query.getResultList();
-        if(!StringUtil.isEmpty(confname)){
+        if (!StringUtil.isEmpty(confname)) {
             return confname.get(0);
         }
         return null;
@@ -802,7 +836,7 @@
                 "on p.custid=t.custid left join tb_dept d on d.deptcode=t.deptcode where confid=:confid)");
         query.setParameter("confid", confid);
         BigInteger cnt = (BigInteger) query.getSingleResult();
-        System.out.println("cnt:::"+cnt);
+        System.out.println("cnt:::" + cnt);
 
         return cnt.intValue();
     }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index b823768..9b5eaa6 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -203,7 +203,7 @@
                         .antMatchers("/login", "/login/form","/app/**").permitAll()
                         .antMatchers("/static/**").permitAll()
                         .antMatchers("/code/image").permitAll()
-                        .antMatchers("/confreport/print").permitAll()
+                        .antMatchers("/confreport/print/**").permitAll()
                         .antMatchers("/atte/print/**").permitAll()
                         .antMatchers("/**").hasAnyRole("USER", "ADMIN")
                         .anyRequest().authenticated()
diff --git a/src/main/resources/templates/confreport/detail.html b/src/main/resources/templates/confreport/detail.html
index 7d94f42..0663470 100644
--- a/src/main/resources/templates/confreport/detail.html
+++ b/src/main/resources/templates/confreport/detail.html
@@ -19,10 +19,13 @@
                         </div>
                         姓名：
                         <input id="search-confreport-searchkey" type="text" class="layui-input search-input"
-                               maxlength="20" style="width: 200px;" placeholder="输入姓名"/>&emsp;
+                               maxlength="20" style="width: 100px;" placeholder="输入姓名"/>&emsp;
                         <button id="btn-search-confreport-att" class="layui-btn icon-btn"><i
                                 class="layui-icon">&#xe615;</i>搜索
                         </button>
+                        <button id="btn-print-confreport-att" class="layui-btn icon-btn"><i
+                                class="layui-icon">&#xe615;</i>打印
+                        </button>
                         <table class="layui-table" id="confreport-table"
                                lay-filter="confreport-table-filter"></table>
                     </div>
@@ -41,11 +44,10 @@
                         </div>
                         姓名：
                         <input id="search-confreport-searchkey-unatt" type="text" class="layui-input search-input"
-                               maxlength="20" style="width: 200px;" placeholder="输入姓名"/>&emsp;
+                               maxlength="20" style="width: 100px;" placeholder="输入姓名"/>&emsp;
                         <button id="btn-search-confreport-unatt" class="layui-btn icon-btn"><i
                                 class="layui-icon">&#xe615;</i>搜索
                         </button>
-
                         <table class="layui-table" id="confreport-table-unatt"
                                lay-filter="confreport-table-filter"></table>
                     </div>
@@ -259,6 +261,33 @@
                 }
             });
         });
+        $('#btn-print-confreport-att').click(function () {
+            var data = admin.getTempData('confdetail');
+
+
+            var actualcnt = data.actualcnt;
+            var totcnt = data.totcnt;
+            var attendrate = data.attendrate;
+            var confid=data.confid;
+            var confdate=data.confdate;
+            var confname=data.confname;
+            var opercode=admin.getTempData('opercode');
+
+            var url = '/confreport/print/printatt?confid=' + confid + '&attendrate=' + attendrate +
+                '&totcnt=' + totcnt + '&actualcnt=' + actualcnt+'&confdate=' + confdate+'&confname=' + confname+'&opercode=' + opercode;
+
+            LODOP = getLodop();
+            LODOP.PRINT_INIT("会议报表");
+            LODOP.SET_PRINT_PAGESIZE(2, 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);
+            LODOP.SET_PRINT_STYLEA(0, "HOrient", 3);
+            LODOP.SET_PRINT_STYLEA(0, "VOrient", 3);
+            LODOP.SET_SHOW_MODE("NP_NO_RESULT", true);
+            LODOP.SET_PRINT_MODE("FULL_WIDTH_FOR_OVERFLOW",true);
+            LODOP.PREVIEW();
+        });
 
     });
 </script>
\ No newline at end of file
diff --git a/src/main/resources/templates/confreport/index.html b/src/main/resources/templates/confreport/index.html
index 5da8028..8470a3c 100644
--- a/src/main/resources/templates/confreport/index.html
+++ b/src/main/resources/templates/confreport/index.html
@@ -151,10 +151,10 @@
             var confname = $("#search-confreport-confname").val();
             var startdate = $("#search-confreport-startdate").val();
             var enddate = $("#search-confreport-enddate").val();
-            var url = '/confreport/print?startdate=' + startdate + '&enddate=' + enddate + '&conftype=' + conftype + '&confname=' + confname+ '&opercode=' + opercode;
+            var url = '/confreport/print/print?startdate=' + startdate + '&enddate=' + enddate + '&conftype=' + conftype + '&confname=' + confname+ '&opercode=' + opercode;
 
             LODOP = getLodop();
-            LODOP.PRINT_INIT("考勤报表");
+            LODOP.PRINT_INIT("会议报表");
             LODOP.SET_PRINT_PAGESIZE(2, 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>");
@@ -171,7 +171,10 @@
         //监听单元格
         table.on('tool(confreportTable-filter)', function (obj) {
             var data = obj.data;
+            var opercode = $("#confreport-opercode").val();
             if ('detail' == obj.event) {
+                admin.putTempData('confdetail', data);
+                admin.putTempData('opercode',opercode)
                 admin.popupCenter({
                     title: data.confname,
                     path: '[[@{/confreport/load4detail}]]?confid=' + data.confid,
diff --git a/src/main/resources/templates/confreport/print/attindex.html b/src/main/resources/templates/confreport/print/attindex.html
new file mode 100644
index 0000000..6529dfd
--- /dev/null
+++ b/src/main/resources/templates/confreport/print/attindex.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+<head>
+    <meta charset="UTF-8">
+    <title>会议签到报表</title>
+
+    <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}"/>
+    <link rel="stylesheet" th:href="@{/static/custom/css/custom.css}"/>
+</head>
+<body>
+<div class="layui-card">
+    <div class="layui-card-header" style="text-align: center;">
+        <h1 th:text="${confname+'签到人员表'}"></h1>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            <div style="float: left;padding-left: 10px;font-size:16px" th:text="${'日期：'+ confdate }"></div>
+            <span style="float: left;padding-left: 10px;font-size:16px" th:text="${'名单人数：'+totcnt}"></span>
+            <span style="float: left;padding-left: 10px;font-size:16px" th:text="${'参会人数：'+actualcnt }"></span>
+            <span style="float: left;padding-left: 10px;font-size:16px" th:text="${'参会率：'+attendrate }"></span>
+        </div>
+        <table class="layui-table sw-table sw-print">
+            <thead>
+            <tr>
+                <th  style="text-align: center;">姓名</th>
+                <th  style="text-align: center;">部门</th>
+                <th  style="text-align: center;">签到时间</th>
+                <th  style="text-align: center;">签到方式</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr th:if="${null==showlist || showlist.size()==0}">
+                <td colspan="13">无数据</td>
+            </tr>
+            <div th:remove="tag" th:if="${null!=showlist && showlist.size()>0}" th:each="data:${showlist}"
+                 >
+                <tr>
+                    <td th:text="${data.custname}"></td>
+                    <td th:text="${data.deptname}"></td>
+                    <div th:switch="${data.attstatus}">
+                        <div th:case="'uncheck'">
+                            <td>未签到</td>
+                        </div>
+                        <div th:case="'checked'">
+                            <td>已签到</td>
+                        </div>
+                        <div th:case="'handcheck'">
+                            <td>手工签到</td>
+                        </div>
+                        <div th:case="'closed'">
+                            <td>关闭</td>
+                        </div>
+                        <div th:case="'late'">
+                            <td>迟到</td>
+                        </div>
+                        <div th:case="'instead'">
+                            <td>被代签</td>
+                        </div>
+                    </div>
+
+                    <div th:switch="${data.atttype}">
+                        <div th:case="'instead'">
+                            <td>代签</td>
+                        </div>
+                        <div th:case="'self'">
+                            <td>实签</td>
+                        </div>
+                        <div th:case="'temp'">
+                            <td>临时</td>
+                        </div>
+                    </div>
+
+                </tr>
+
+            </div>
+            <!--<div th:if="${null!=sum}">
+                <tr>
+                    <td colspan="4" >合计：</td>
+                    <td th:text="${sum.cnt1}"></td>
+                    <td th:text="${sum.cnt2}"></td>
+                    <td th:text="${sum.cnt3}"></td>
+                    <td th:text="${sum.cnt4}"></td>
+                    <td th:text="${sum.cnts}"></td>
+                </tr>
+            </div>-->
+            </tbody>
+        </table>
+        <!--<div class="layui-form toolbar">-->
+            <!--<div style="float: left;padding-left: 3px;" th:text="${'制表人：'+opername+' &nbsp;&nbsp; '+ printdatetime}"></div>-->
+        <!--</div>-->
+    </div>
+    <div class="layui-card-body" style="margin-top: 25px;">
+    <div class="col-sm-12">
+        <table width="100%">
+            <tr style="height: 25px;">
+                <td width="12%" style="text-align: right;padding-right: 5px;"></td>
+                <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="18%"
+                    style="text-align: left;border-bottom: 1px solid #666;" th:text="${opername}"></td>
+                <td width="5%">&nbsp;</td>
+                <td width="12%" style="text-align: right;padding-right: 5px;">制表日期：</td>
+                <td width="18%"
+                    style="text-align: left;border-bottom: 1px solid #666;" th:text="${printdatetime}">
+                </td>
+            </tr>
+            <tr style="height: 25px;"></tr>
+            <tr style="height: 25px;">
+                <td width="12%" style="text-align: right;padding-right: 5px;"></td>
+                <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="18%"
+                    style="text-align: left;border-bottom: 1px solid #666;"></td>
+                <td width="5%">&nbsp;</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>
+            </tr>
+        </table>
+    </div>
+    </div>
+</div>
+</body>
+</html>
\ No newline at end of file
