diff --git a/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java b/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
index 3746a38..abdbc28 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
@@ -12,9 +12,12 @@
 import com.supwisdom.dlpay.atte.service.AtteClassService;
 import com.supwisdom.dlpay.atte.service.AtteReportService;
 import com.supwisdom.dlpay.atte.service.AtteRestService;
+import com.supwisdom.dlpay.atte.service.HandRefreshService;
 import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import com.supwisdom.dlpay.framework.domain.TTaskLock;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.mainservice.dao.CardDao;
@@ -63,6 +66,8 @@
     private DeptDao deptDao;
     @Autowired
     private ApiCommonProxy commonProxy;
+    @Autowired
+    private HandRefreshService handRefreshService;
 
 
 
@@ -780,4 +785,123 @@
         }
         return jld_code;
     }
+
+
+    /**
+     *    测试
+     * @param model
+     * @return
+     */
+
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @RequestMapping("/createdtl")
+    public void test(@RequestParam(value = "start") String startdate,
+                     @RequestParam(value = "end") String enddate,Model model){
+        TTaskLock lock= null;
+        lock = systemUtilService.doLockTask("REFRESHDTL",null,"所有流水刷新");
+        if(lock==null){
+            return;
+        }
+        Integer cur=Integer.parseInt(DateUtil.getNow("yyyyMMdd"));
+        Integer start=Integer.parseInt(startdate);
+        Integer end=Integer.parseInt(enddate);
+        int cnt=1;
+        while (start<=end&&cnt<=10) {
+            if(start>cur){
+                return ;
+            }
+            atteClassService.createAtteDtl(startdate, null);
+            startdate = DateUtil.getNewDay(startdate, 1);
+            start = Integer.parseInt(startdate);
+            cnt++;
+        }
+        String hostdatetime = systemUtilService.getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
+        lock.setTaskstatus(0);
+        lock.setTasktime(hostdatetime);
+        systemUtilService.updateTaskLock(lock);
+
+    }
+
+
+
+    @RequestMapping("/refreshdtl")
+    public void refreshdtl(@RequestParam(value = "start") String startdate,
+                     @RequestParam(value = "end") String enddate,Model model){
+        TTaskLock lock= null;
+        lock = systemUtilService.doLockTask("REFRESHDTL",null,"所有流水刷新");
+        if(lock==null){
+            return;
+        }
+        Integer start=Integer.parseInt(startdate);
+        Integer end=Integer.parseInt(enddate);
+        int cnt=1;
+        while (start<=end&&cnt<=10) {
+            atteClassService.handleDtl(null,startdate);
+            startdate = DateUtil.getNewDay(startdate, 1);
+            start = Integer.parseInt(startdate);
+            cnt++;
+        }
+        String hostdatetime = systemUtilService.getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
+        lock.setTaskstatus(0);
+        lock.setTasktime(hostdatetime);
+        systemUtilService.updateTaskLock(lock);
+
+    }
+
+    @RequestMapping("/refreshreport")
+    public void refreshreport(@RequestParam(value = "start") String startdate,
+                           @RequestParam(value = "end") String enddate,Model model){
+        TTaskLock lock= null;
+        lock = systemUtilService.doLockTask("REFRESHDTL",null,"所有流水刷新");
+        if(lock==null){
+            return;
+        }
+        Integer start=Integer.parseInt(startdate);
+        Integer end=Integer.parseInt(enddate);
+        int cnt=1;
+        Integer cur=Integer.parseInt(DateUtil.getNow("yyyyMMdd"));
+        while (start<=end&&cnt<=10) {
+            if(start>=cur){
+                return ;
+            }
+            atteReportService.refreshReport(null,startdate,startdate);
+            startdate = DateUtil.getNewDay(startdate, 1);
+            start = Integer.parseInt(startdate);
+            cnt++;
+        }
+        String hostdatetime = systemUtilService.getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
+        lock.setTaskstatus(0);
+        lock.setTasktime(hostdatetime);
+        systemUtilService.updateTaskLock(lock);
+
+    }
+    @RequestMapping("/refresh")
+    public void refreshall(@RequestParam(value = "start") String startdate,
+                              @RequestParam(value = "end") String enddate,Model model){
+        TTaskLock lock= null;
+        lock = systemUtilService.doLockTask("REFRESHDTL",null,"所有流水刷新");
+        if(lock==null){
+            return;
+        }
+        Integer cur=Integer.parseInt(DateUtil.getNow("yyyyMMdd"));
+        Integer start=Integer.parseInt(startdate);
+        Integer end=Integer.parseInt(enddate);
+        int cnt=1;
+        while (start<=end&&cnt<=10) {
+            if(start>=cur){
+                return ;
+            }
+            handRefreshService.refreshbyhand(startdate,startdate,null);
+            startdate = DateUtil.getNewDay(startdate, 1);
+            start = Integer.parseInt(startdate);
+            cnt++;
+        }
+        String hostdatetime = systemUtilService.getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
+        lock.setTaskstatus(0);
+        lock.setTasktime(hostdatetime);
+        systemUtilService.updateTaskLock(lock);
+
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
index f7968ec..0cc130e 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
@@ -648,7 +648,7 @@
                 deptcode="-99";
             }
         }
-        handRefreshService.refreshbyhand(startdate,enddate,deptcode);
+        //handRefreshService.refreshbyhand(startdate,enddate,deptcode);
         return map;
     }
 
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 c3dd941..97fe433 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
@@ -237,7 +237,7 @@
     @Transactional
     @Override
     public String getAtteNo(String attedate) {
-        String sql=" select to_char(cast(nextval('seq_attedtl') as INTEGER),'FM000000') ";
+        String sql=" select to_char(cast(nextval('seq_attedtl') as INTEGER),'FM000000000000') ";
         Query query=entityManager.createNativeQuery(sql);
         List list=query.getResultList();
         if(list!=null&&list.size()>0){
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 ef21b52..3d29696 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
@@ -23,7 +23,7 @@
 
 
     @Id
-    @Column(name = "atteno",length = 14)
+    @Column(name = "atteno",length = 20)
     public String getAtteno() {
         return atteno;
     }
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 f210c31..7132ab9 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
@@ -24,7 +24,10 @@
 import com.supwisdom.dlpay.system.domain.TCustType;
 import com.supwisdom.dlpay.system.page.Pagination;
 import com.supwisdom.dlpay.system.service.SystemService;
+import com.supwisdom.dlpay.task.SyncCustomerTask;
 import org.apache.xmlbeans.impl.tool.Diff;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -56,6 +59,7 @@
     private BusinessparaDao businessparaDao;
     @Autowired
     AtteClockDao atteClockDao;
+    protected static Logger logger = LoggerFactory.getLogger(AtteClassServiceImpl.class);
 
 
     @Override
@@ -177,75 +181,93 @@
         searchBean.setAttedate(attedate);
         // 获取考勤人员
         List<TCustomerInfo> custlist=atteClassDao.getAtteCust(searchBean);
+        logger.info("考勤名单总数"+custlist.size());
+        try {
+            for (TCustomerInfo cust:custlist){
+                TClassCust classCust=atteClassDao.getByIdAndDate(cust.getCustid(),attedate);
+                TNcTimegrp timegrp=null;
+                TAtteClass atteClass=null;
+                if(classCust==null){
+                    // 无排班
+                  Integer timegrpid=getTimegrp(cust,attedate);
+                    if(timegrpid!=null){
+                        timegrp=ncTimeGrpDao.findByTimeGrpId(timegrpid);
+                    }else {
+                        logger.info("timegrpid为空"+cust.getCustname());
+                    }
+                }else{
+                    logger.info("考勤排班");
+                    atteClass=atteClassDao.getClassById(classCust.getClassid());
+                    if(atteClass!=null&&atteClass.getWorkorno()==1){
+                        timegrp=ncTimeGrpDao.findByTimeGrpId(atteClass.getTimegrpid());
+                    }
 
-        for (TCustomerInfo cust:custlist){
-            TClassCust classCust=atteClassDao.getByIdAndDate(cust.getCustid(),attedate);
-            TNcTimegrp timegrp=null;
-            TAtteClass atteClass=null;
-            if(classCust==null){
-                // 无排班
-              Integer timegrpid=getTimegrp(cust,attedate);
-                if(timegrpid!=null){
-                    timegrp=ncTimeGrpDao.findByTimeGrpId(timegrpid);
                 }
-            }else{
 
-                atteClass=atteClassDao.getClassById(classCust.getClassid());
-                if(atteClass!=null&&atteClass.getWorkorno()==1){
-                    timegrp=ncTimeGrpDao.findByTimeGrpId(atteClass.getTimegrpid());
+                if(timegrp==null){
+                    continue;
+                }
+                Map<Integer,Integer> map=new HashMap<>();
+                map.put(timegrp.getTimeid1(),timegrp.getTimeid1());
+                map.put(timegrp.getTimeid2(),timegrp.getTimeid2());
+                map.put(timegrp.getTimeid3(),timegrp.getTimeid3());
+                map.put(timegrp.getTimeid4(),timegrp.getTimeid4());
+                map.put(timegrp.getTimeid5(),timegrp.getTimeid5());
+                map.put(timegrp.getTimeid6(),timegrp.getTimeid6());
+
+                try {
+
+                    logger.info(cust.getCustname()+" "+map.size()+"-生成名单开始"+DateUtil.getNow());
+                    for(Integer timeid:map.keySet()){
+                        if(timeid!=null){
+                        logger.info("创建名单  "+timeid);
+                            TAtteDtl dtl=new TAtteDtl();
+                            dtl.setAttedate(attedate);
+                            dtl.setAtteno(atteClassDao.getAtteNo(attedate));
+                            dtl.setCustid(cust.getCustid());
+                            TAtteRest rest=atteRestDao.getRest(cust.getCustid(),attedate);
+                            if(rest!=null){  //查询假条
+                                dtl.setState(rest.getRtype());
+                            }else{
+                                dtl.setState(0);
+                            }
+                            //判断有无补打卡
+                            if(dtl.getState()==0&&atteClockDao.isClock(cust.getCustid(),timeid,attedate)){
+                                dtl.setState(1);
+                            }
+                            dtl.setStatus(1);
+                            dtl.setTimeid(timeid);
+                            dtl.setUpdatetime(DateUtil.getNow());
+                            TNcTime time=ncTimeDao.findByTimeId(timeid);
+                            String etime=time.getEtime().replace(":","")+"00";
+                            String divtime="130000";
+                            TBusinesspara para=businessparaDao.findByParakey("divtime");
+                            if(para!=null&&!StringUtil.isEmpty(para.getParaval())){
+                                divtime=para.getParaval();
+                            }
+                            int diff=getDiffMin(divtime,etime);
+                            if(diff>0){
+                                dtl.setApflag(2);
+                            }else{
+                                dtl.setApflag(1);
+                            }
+                            TAtteDtl oldbean=atteClassDao.getDtl(timeid,attedate,cust.getCustid());
+                            if(oldbean==null){
+                                logger.info("oldbean is null");
+                                atteClassDao.saveAtteDtl(dtl);
+                            }
+                        }
+                    }
+                    logger.info(cust.getCustname()+"-生成名单结束"+DateUtil.getNow());
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    return false;
                 }
 
             }
-
-            if(timegrp==null){
-                continue;
-            }
-            Map<Integer,Integer> map=new HashMap<>();
-            map.put(timegrp.getTimeid1(),timegrp.getTimeid1());
-            map.put(timegrp.getTimeid2(),timegrp.getTimeid2());
-            map.put(timegrp.getTimeid3(),timegrp.getTimeid3());
-            map.put(timegrp.getTimeid4(),timegrp.getTimeid4());
-            map.put(timegrp.getTimeid5(),timegrp.getTimeid5());
-            map.put(timegrp.getTimeid6(),timegrp.getTimeid6());
-            for(Integer timeid:map.keySet()){
-                if(timeid!=null){
-                    TAtteDtl dtl=new TAtteDtl();
-                    dtl.setAttedate(attedate);
-                    dtl.setAtteno(atteClassDao.getAtteNo(attedate));
-                    dtl.setCustid(cust.getCustid());
-                    TAtteRest rest=atteRestDao.getRest(cust.getCustid(),attedate);
-                    if(rest!=null){  //查询假条
-                        dtl.setState(rest.getRtype());
-                    }else{
-                        dtl.setState(0);
-                    }
-                    //判断有无补打卡
-                    if(dtl.getState()==0&&atteClockDao.isClock(cust.getCustid(),timeid,attedate)){
-                        dtl.setState(1);
-                    }
-                    dtl.setStatus(1);
-                    dtl.setTimeid(timeid);
-                    dtl.setUpdatetime(DateUtil.getNow());
-                    TNcTime time=ncTimeDao.findByTimeId(timeid);
-                    String etime=time.getEtime().replace(":","")+"00";
-                    String divtime="130000";
-                    TBusinesspara para=businessparaDao.findByParakey("divtime");
-                    if(para!=null&&!StringUtil.isEmpty(para.getParaval())){
-                        divtime=para.getParaval();
-                    }
-                    int diff=getDiffMin(divtime,etime);
-                    if(diff>0){
-                        dtl.setApflag(2);
-                    }else{
-                        dtl.setApflag(1);
-                    }
-                    TAtteDtl oldbean=atteClassDao.getDtl(timeid,attedate,cust.getCustid());
-                    if(oldbean==null){
-                        atteClassDao.saveAtteDtl(dtl);
-                    }
-                }
-            }
-
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
         }
         return true;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java b/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java
index a109e20..459df1e 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java
@@ -38,7 +38,7 @@
         String attedate= null;
         try {
             String now = DateUtil.getNow();
-            logger.info("时间:" + now + "--生成考勤名单");
+            logger.info("n时间:" + now + "--生成考勤名单");
             attedate = DateUtil.getNow("yyyyMMdd");
 
             TTaskLock lock= null;
@@ -60,7 +60,7 @@
     public void refreshAtteDtl(){
         try {
             String now = DateUtil.getNow();
-            logger.info("时间:" + now + "--刷新考勤状态");
+            logger.info("n时间:" + now + "--刷新考勤状态");
           String  attedate = DateUtil.getNow("yyyyMMdd");
             atteClassService.handleDtl(null,attedate);
         } catch (Exception e) {
@@ -68,13 +68,13 @@
         }
     }
 
-    @Scheduled(cron = "${atte.create.dtl}")//每天一点生成前一天报表
+    @Scheduled(cron = "${atte.create.report}")//每天一点生成前一天报表
     public void createAtteReport(){
 
         String attedate= null;
         try {
             String now = DateUtil.getNow();
-            logger.info("时间:" + now + "--生成前一天考勤报表");
+            logger.info("n时间:" + now + "--生成前一天考勤报表");
           String  cdate=DateUtil.getNow("yyyyMMdd");
             attedate=DateUtil.getNewDay(cdate,-1);
             atteReportService.refreshReport(null,attedate,attedate);
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index bf27274..2902ad9 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -47,8 +47,10 @@
 sync.cardStatus.cron=0 0/10 * * * ?
 apiLogin.refresh.cron=0 0/20 * * * ?
 
-atte.create.dtl=0 0 2 * * ?
-atte.refresh.dtl=0 0/30 * * * ?
+atte.create.dtl=0 0 1 * * ?
+atte.refresh.dtl=0 0 8,10,12,14,16,18,19,21 * * ?
+atte.create.report=0 0 4 * * ?
+
 spring.redis.database=2
 
 
