diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClassDaoImpl.java b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClassDaoImpl.java
index 39d6658..45faee3 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClassDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClassDaoImpl.java
@@ -578,7 +578,7 @@
         if(!StringUtil.isEmpty(searchBean.getCardno())){
             sql+="  and v.cardno like :cno ";
         }
-        sql+=" order by v.doorseqno ";
+        sql+=" order by v.transtime asc ,v.transdate asc  ";
         Query query=entityManager.createNativeQuery(sql, AtteDtl.class);
         if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
             query.setParameter("sdate",searchBean.getStartdate());
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
index f186935..ef21b52 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
@@ -19,6 +19,7 @@
     private String  operid;
     private String updatetime;
     private Integer apflag; //1-上午 2-下午；
+    private String atime;//时间
 
 
     @Id
@@ -112,4 +113,12 @@
     public void setApflag(Integer apflag) {
         this.apflag = apflag;
     }
+    @Column(name = "atime",length = 6)
+    public String getAtime() {
+        return atime;
+    }
+
+    public void setAtime(String atime) {
+        this.atime = atime;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteClassServiceImpl.java b/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteClassServiceImpl.java
index 5f66c91..6eefff5 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteClassServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteClassServiceImpl.java
@@ -298,12 +298,6 @@
             return min;
     }
 
-    public static void main(String[] args) {
-        String t1=DateUtil.getNow("yyyyMMdd")+"135000";
-        String t2=DateUtil.getNow("yyyyMMdd")+"134700";
-        long diff=DateUtil.getInterval(t2,t1);
-        System.out.println("时差"+diff/(1000*60));
-    }
 
     @Override
     public Pagination getAtteDtlInfoWithPage(AttedtlSearchBean searchBean, int pageNo, int pageSize) {
@@ -353,7 +347,7 @@
         for(AtteDtl dtl:list){
           List<TAtteDtl> details=atteClassDao.getDetailList(dtl.getCustid(),attedate) ;
            if(details!=null){
-                    String refno="";
+                    String atime="";
                    for(int i=0;i<details.size();i++){
                        TAtteDtl detail=details.get(i);
                        Integer nextid=null;
@@ -361,8 +355,11 @@
                            nextid=details.get(i+1).getTimeid();//考离时间段
                        }else if((i==1 || i==3)&&details.size()==4){
                            nextid=details.get(i-1).getTimeid();
+                           atime=details.get(i-1).getAtime();
                        }
-
+                        if(atime!=null&&atime.equals(dtl.getAttetime())){
+                            continue;
+                        }
                        int state= 0;
                        try {
                            state = getState(detail.getTimeid(),dtl.getAttetime(),nextid);
@@ -373,25 +370,19 @@
                            //e.printStackTrace();
                            continue;
                        }
-                       if(attedate.equals("20200528")||detail.getCustid().equals("2c9780826e1c635f016e1c9eea8a3d36")){
-                           System.out.println(state);
-                           System.out.println(detail.getTimeid()+"=="+nextid+"---"+dtl.getAttetime());
-                       }
 
                        if(detail.getState()==0&&state!=0){
-                           if(!refno.equals(dtl.getRefno())){
                                detail.setState(state);
                                detail.setUpdatetime(DateUtil.getNow());
+                               detail.setAtime(dtl.getAttetime());
                                atteClassDao.updateAtteDtl(detail);
-                               refno=dtl.getRefno();
-                           }
+
                        }else if(detail.getState()==2&&state==1){
-                           if(!refno.equals(dtl.getRefno())) {
                                detail.setState(state);
                                detail.setUpdatetime(DateUtil.getNow());
-                               refno = dtl.getRefno();
+                               detail.setAtime(dtl.getAttetime());
                                atteClassDao.updateAtteDtl(detail);
-                           }
+
                        }
                    }
 
@@ -416,14 +407,15 @@
             //考离
             TNcTime nexttime=ncTimeDao.findByTimeId(nextid);
             String lasttime=nexttime.getEtime().replace(":","")+"00";
-
-          d_min=getDiffMin(etime,lasttime);
-             if(bmin>0){  //
+            String s_time=nexttime.getBtime().replace(":","")+"00";
+            d_min=getDiffMin(etime,lasttime);
+            int n_emin=getDiffMin(s_time,attetime);
+             if(bmin>0||n_emin>0){  //
                  flag=0;
              }else {
                  if(emin>0){
                      flag=1;
-                 }else if(emin>-d_min){
+                 }else if(emin<0&&n_emin<0){
                      flag=2;
                  }else{
                      flag=0;
@@ -434,11 +426,13 @@
             TNcTime lasttime=ncTimeDao.findByTimeId(nextid);
             String endtime=lasttime.getEtime().replace(":","")+"00";
             d_min=getDiffMin(endtime,attetime);
-            if(d_min>0&&bmin>0){
+            if(emin<0||d_min<0){
+                flag=0;
+            }else if(d_min>0&&bmin>0){
                 flag=2;
-            }else if(bmin<=0&&emin>=0){
+            }else if(bmin<0&&emin>0){
                 flag=1;
-            }else {
+            }else{
                 flag=0;
             }
         }else{
diff --git a/src/main/resources/templates/atte/report/p_index.html b/src/main/resources/templates/atte/report/p_index.html
index 18ac05f..ec3a056 100644
--- a/src/main/resources/templates/atte/report/p_index.html
+++ b/src/main/resources/templates/atte/report/p_index.html
@@ -261,7 +261,7 @@
                 success:function(ret){
                     // //console.log(ret);
                      _self.totSize=ret.PageResult.totalCount;
-                    _self.tableData=ret.PageResult.list;
+                  //  _self.tableData=ret.PageResult.list;
                     var custtypelist = [];
                     var types=ret.custtypelist;
                     for (var i = 0; i < types.length; i++) {
@@ -310,7 +310,7 @@
         return formated;
     }
     function report_commonQuery(_self,pageno,pagesize) {
-
+        layer.msg("正在生成报表,请稍等！", {icon: 1, time: 1000});
         var token=$("meta[name='_csrf_token']").attr("value");
         var startdate=class_Formatdate(_self.preportform.startdate);
         var enddate=class_Formatdate(_self.preportform.enddate);
@@ -385,6 +385,7 @@
     };
     var LODOP;
     function print(that){
+        layer.msg("正在打印,请稍等！", {icon: 1, time: 1000});
         var startdate=class_Formatdate(that.preportform.startdate);
         var enddate=class_Formatdate(that.preportform.enddate);
         var custtypeid=that.preportform.custtypeid;
