大理H5补打卡功能
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/ClockInfo.java b/src/main/java/com/supwisdom/dlpay/atte/bean/ClockInfo.java
new file mode 100644
index 0000000..7426dbb
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/ClockInfo.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.atte.bean;
+
+public class ClockInfo {
+     private String custid;
+     private Integer timeid;
+     private String timename;
+     private String attedate;
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public Integer getTimeid() {
+        return timeid;
+    }
+
+    public void setTimeid(Integer timeid) {
+        this.timeid = timeid;
+    }
+
+    public String getTimename() {
+        return timename;
+    }
+
+    public void setTimename(String timename) {
+        this.timename = timename;
+    }
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/ClockSearchBean.java b/src/main/java/com/supwisdom/dlpay/atte/bean/ClockSearchBean.java
new file mode 100644
index 0000000..f6ccf0b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/ClockSearchBean.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.atte.bean;
+
+public class ClockSearchBean {
+    private String attedate;
+    private Integer custtypeid;
+    private String deptcode;
+    private Integer status;
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+
+    public Integer getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(Integer custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/ClockShowBean.java b/src/main/java/com/supwisdom/dlpay/atte/bean/ClockShowBean.java
new file mode 100644
index 0000000..cf86983
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/ClockShowBean.java
@@ -0,0 +1,113 @@
+package com.supwisdom.dlpay.atte.bean;
+
+public class ClockShowBean {
+    private Integer id;
+    private String custid;
+    private String custname;
+    private String attedate;
+    private Integer timeid;
+    private String timename;
+    private String deptname;
+    private String deptcode;
+    private Integer custtypeid;
+    private String custtypename;
+    private String remark;
+    private Integer status;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+
+    public Integer getTimeid() {
+        return timeid;
+    }
+
+    public void setTimeid(Integer timeid) {
+        this.timeid = timeid;
+    }
+
+    public String getTimename() {
+        return timename;
+    }
+
+    public void setTimename(String timename) {
+        this.timename = timename;
+    }
+
+    public String getDeptname() {
+        return deptname;
+    }
+
+    public void setDeptname(String deptname) {
+        this.deptname = deptname;
+    }
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+
+    public Integer getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(Integer custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getCusttypename() {
+        return custtypename;
+    }
+
+    public void setCusttypename(String custtypename) {
+        this.custtypename = custtypename;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+}
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 41080ed..d39236d 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/AppAtteController.java
@@ -1,6 +1,9 @@
 package com.supwisdom.dlpay.atte.controller;
 
+import com.supwisdom.dlpay.atte.bean.ClockInfo;
+import com.supwisdom.dlpay.atte.bean.ClockSearchBean;
 import com.supwisdom.dlpay.atte.bean.RestSearchBean;
+import com.supwisdom.dlpay.atte.domain.TAtteClock;
 import com.supwisdom.dlpay.atte.domain.TAtteRest;
 import com.supwisdom.dlpay.atte.service.AtteClassService;
 import com.supwisdom.dlpay.atte.service.AtteRestService;
@@ -253,4 +256,156 @@
 
     }
 
+    /**
+     *  补打卡页面
+     */
+    @GetMapping("/atte/clockindex")
+    public ModelAndView clockindex(@RequestParam(value = "custid")String custid){
+        ModelAndView model=new ModelAndView();
+        model.addObject("custid",custid);
+        model.setViewName("apph5/doclock");
+        return model;
+    }
+
+    /**
+     *  查询补卡时段
+     */
+    @RequestMapping("/atte/getclocklist")
+    @ResponseBody
+    public Map getclocklist(@RequestParam("custid") String custid,
+                            @RequestParam("attedate") String attedate){
+          Map map=new HashMap();
+
+        try {
+            if(StringUtil.isEmpty(custid)||StringUtil.isEmpty(attedate)){
+                map.put("errStr","查询错误!");
+                return map;
+            }
+            List<ClockInfo> list=atteRestService.getClockList(attedate,custid);
+            map.put("infolist",list);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr",e.getMessage());
+        }
+
+        return map;
+
+    }
+
+
+    /**
+     *    补打卡
+     * @param
+     */
+    @RequestMapping(value = "/atte/saveClock", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map saveClock(@RequestParam("custid") String custid,
+                       @RequestParam("attedate") String attedate,
+                       @RequestParam("timeid") Integer timeid,
+                       @RequestParam("remark") String remark,
+                       HttpServletRequest request){
+        Map map=new HashMap();
+        if(StringUtil.isEmpty(custid)||timeid==null||StringUtil.isEmpty(attedate)){
+            map.put("errStr","参数不能为空!");
+            return map;
+        }
+        if(atteRestService.canClock(attedate,custid,timeid)){
+            TAtteClock clock=new TAtteClock();
+            clock.setAttedate(attedate);
+            clock.setCustid(custid);
+            clock.setRemark(remark);
+            clock.setStatus(0);
+            clock.setTimeid(timeid);
+            clock.setUpdatetime(DateUtil.getNow());
+            if(!atteRestService.saveClock(clock)){
+                map.put("errStr","添加数据失败!");
+            }else{
+                map.put("errStr","");
+            }
+        }else {
+            map.put("errStr","所选日期时段已申请!");
+        }
+
+        return map;
+    }
+    /**
+     *  补打卡审核
+     */
+    @GetMapping("/atte/reviewClock")
+    public ModelAndView reviewClock(@RequestParam(value = "custid")String custid){
+        ModelAndView model=new ModelAndView();
+        model.addObject("custid",custid);
+        model.setViewName("apph5/reviewclock");
+
+        return model;
+    }
+
+    /**
+     *  补打卡审核列表
+     */
+    @RequestMapping(value = "/atte/getreviewclock")
+    @ResponseBody
+    public Map getreviewclock(@RequestParam("attedate") String attedate,
+                              @RequestParam("custid") String custid,
+                             @RequestParam(value="status", required = false, defaultValue = "") Integer status,
+                             @RequestParam(value = "custtypeid", required = false, defaultValue = "") Integer custtypeid,
+                             @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                             @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                             HttpServletRequest request){
+
+        Map map=new HashMap();
+        ClockSearchBean searchBean=new ClockSearchBean();
+        searchBean.setAttedate(attedate);
+        searchBean.setCusttypeid(custtypeid);
+        searchBean.setStatus(status);
+        TCustomer cust=webInterfaceService.findCustomerById(custid);
+        if(StringUtil.isEmpty(cust.getDeptcode())){
+            searchBean.setDeptcode("99");
+        }else {
+            searchBean.setDeptcode(cust.getDeptcode());
+        }
+        Pagination page=atteRestService.getClockPage(searchBean,pageNo,pageSize);
+        map.put("page",page);
+        return map;
+    }
+
+    /**
+     *  审核补打卡
+     */
+    @RequestMapping(value = "/atte/reviewclock")
+    @ResponseBody
+    public Map reviewclock(
+                        @RequestParam("status") Integer status,
+                        @RequestParam("id") Integer id,
+                        HttpServletRequest request){
+        Map map=new HashMap();
+
+        try {
+            if(status==null || id==null){
+                map.put("errStr","参数错误");
+                return map;
+            }
+            TAtteClock clock=atteRestService.getClockById(id);
+            if(clock!=null&&clock.getStatus()==0){
+                clock.setUpdatetime(DateUtil.getNow());
+                clock.setStatus(status);
+                atteRestService.updateClock(clock);
+                if(status==1){
+                   atteRestService.updateAtteDtl(clock.getCustid(),clock.getAttedate(),clock.getTimeid(),clock.getRemark());
+                }
+                map.put("errStr","");
+            }else {
+                map.put("errStr","参数错误!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr",e.getMessage());
+        }
+
+        return map;
+
+    }
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java
index 6896e79..b7f4c35 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java
@@ -74,4 +74,6 @@
     //辅警干警报表
     public Pagination getPReportWithPage(AttedtlSearchBean searchBean,int pageNo,int pageSize);
     public List<AtteReport> getPReportList(AttedtlSearchBean searchBean);
+
+    public TAtteDtl getDtl(Integer timeid,String attedate,String custid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClockDao.java b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClockDao.java
new file mode 100644
index 0000000..4989fe8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClockDao.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.atte.dao;
+
+import com.supwisdom.dlpay.atte.bean.ClockSearchBean;
+import com.supwisdom.dlpay.atte.domain.TAtteClock;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+public interface AtteClockDao {
+
+    public boolean saveClock(TAtteClock bean);
+
+    public boolean updateClock(TAtteClock bean);
+
+    public boolean canClock(String attedate,Integer timeid,String custid);
+
+    public Pagination getClockPage(ClockSearchBean searchBean,int pageNo,int pageSize);
+
+    public TAtteClock getClockById(Integer id);
+
+    public boolean isClock(String custid,Integer timeid,String attedate);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/AtteRestDao.java b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteRestDao.java
index 2b7a4bf..7ec31b5 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/dao/AtteRestDao.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteRestDao.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.atte.dao;
 
 import com.supwisdom.dlpay.atte.bean.AtteRestInfo;
+import com.supwisdom.dlpay.atte.bean.ClockInfo;
 import com.supwisdom.dlpay.atte.bean.RestSearchBean;
 import com.supwisdom.dlpay.atte.domain.TAtteRest;
 import com.supwisdom.dlpay.system.page.Pagination;
@@ -22,4 +23,7 @@
 
     //是否审核人
     public boolean isreview(String custid);
+
+    //补卡信息
+    public List<ClockInfo> getClockList(String attedate,String custid);
 }
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 4ee8c12..2a0c88c 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
@@ -824,4 +824,22 @@
         List<AtteReport> list=query.getResultList();
         return list;
     }
+
+    @Transactional
+    @Override
+    public TAtteDtl getDtl(Integer timeid, String attedate, String custid) {
+        if(StringUtil.isEmpty(attedate)||StringUtil.isEmpty(custid)||timeid==null){
+            return null;
+        }
+        String sql=" select bean from TAtteDtl bean where bean.custid=:cid and bean.attedate=:adate and bean.timeid=:tid ";
+         TypedQuery<TAtteDtl> query=entityManager.createQuery(sql,TAtteDtl.class);
+         query.setParameter("tid",timeid);
+         query.setParameter("adate",attedate);
+         query.setParameter("cid",custid);
+         List<TAtteDtl> list=query.getResultList();
+         if(list!=null&&list.size()>0){
+             return list.get(0);
+         }
+        return null;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClockDaoImpl.java b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClockDaoImpl.java
new file mode 100644
index 0000000..4726afa
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClockDaoImpl.java
@@ -0,0 +1,198 @@
+package com.supwisdom.dlpay.atte.dao.impl;
+
+import com.supwisdom.dlpay.atte.bean.AtteRestInfo;
+import com.supwisdom.dlpay.atte.bean.ClockSearchBean;
+import com.supwisdom.dlpay.atte.bean.ClockShowBean;
+import com.supwisdom.dlpay.atte.dao.AtteClockDao;
+import com.supwisdom.dlpay.atte.dao.AtteRestDao;
+import com.supwisdom.dlpay.atte.domain.TAtteClock;
+import com.supwisdom.dlpay.atte.domain.TAtteRest;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.apache.poi.ss.formula.functions.T;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Service
+public class AtteClockDaoImpl implements AtteClockDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public boolean saveClock(TAtteClock bean) {
+
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateClock(TAtteClock bean) {
+        boolean flag=false;
+        try {
+            entityManager.merge(bean);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public boolean canClock(String attedate, Integer timeid, String custid) {
+       if(StringUtil.isEmpty(attedate)||timeid==null||StringUtil.isEmpty(custid)){
+           return false;
+       }
+       String sql=" select a from TAtteClock a where a.attedate=:adate and a.timeid=:tid and a.custid=:cid and a.status=0 ";
+        TypedQuery<TAtteClock> query=entityManager.createQuery(sql,TAtteClock.class);
+        query.setParameter("adate",attedate);
+        query.setParameter("tid",timeid);
+        query.setParameter("cid",custid);
+        List<TAtteClock> list=query.getResultList();
+        if(list!=null&&list.size()>0){
+            return false;
+        }
+        return true;
+    }
+
+    @Transactional
+    @Override
+    public Pagination getClockPage(ClockSearchBean searchBean, int pageNo, int pageSize) {
+        StringBuffer sql=new StringBuffer();
+        sql.append(" select t.id,t.custid,c.custname,t.attedate,t.timeid,nc.timename,t.status,t.remark,ct.custtypeid,ct.custtypename,td.deptcode,td.deptname ")
+                .append(" from t_atte_clock t left join t_nc_time nc on t.timeid=nc.timeid ")
+                .append(" left join t_customer c on t.custid=c.custid ")
+                .append(" left join tb_custtype ct on c.custtypeid=ct.custtypeid ")
+                .append(" left join tb_dept td on c.deptcode=td.deptcode ")
+                .append(" where c.status='1' ");
+        if(!StringUtil.isEmpty(searchBean.getAttedate())){
+            sql.append(" and t.attedate=:adate");
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql.append(" and td.deptcode=:dcode ");
+        }
+        if(searchBean.getStatus()!=null){
+            sql.append(" and t.status=:stat ");
+        }
+        if(searchBean.getCusttypeid()!=null){
+            sql.append(" and ct.custtypeid=:ctypeid ");
+        }
+        Query query=entityManager.createNativeQuery(sql.toString());
+        if(!StringUtil.isEmpty(searchBean.getAttedate())){
+            query.setParameter("adate",searchBean.getAttedate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+          query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        if(searchBean.getStatus()!=null){
+            query.setParameter("stat",searchBean.getStatus());
+        }
+        if(searchBean.getCusttypeid()!=null){
+           query.setParameter("ctypeid",searchBean.getCusttypeid());
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ClockShowBean.class));
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<ClockShowBean> list=query.getResultList();
+        page.setList(list);
+        int totalCount= getClockCount(searchBean);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    public int  getClockCount(ClockSearchBean searchBean){
+        StringBuffer sql=new StringBuffer();
+        sql.append(" select count(t.id) ")
+                .append(" from t_atte_clock t left join t_nc_time nc on t.timeid=nc.timeid ")
+                .append(" left join t_customer c on t.custid=c.custid ")
+                .append(" left join tb_custtype ct on c.custtypeid=ct.custtypeid ")
+                .append(" left join tb_dept td on c.deptcode=td.deptcode ")
+                .append(" where c.status='1' ");
+        if(!StringUtil.isEmpty(searchBean.getAttedate())){
+            sql.append(" and t.attedate=:adate");
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql.append(" and td.deptcode=:dcode ");
+        }
+        if(searchBean.getStatus()!=null){
+            sql.append(" and t.status=:stat ");
+        }
+        if(searchBean.getCusttypeid()!=null){
+            sql.append(" and ct.custtypeid=:ctypeid ");
+        }
+        Query query=entityManager.createNativeQuery(sql.toString());
+        if(!StringUtil.isEmpty(searchBean.getAttedate())){
+            query.setParameter("adate",searchBean.getAttedate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        if(searchBean.getStatus()!=null){
+            query.setParameter("stat",searchBean.getStatus());
+        }
+        if(searchBean.getCusttypeid()!=null){
+            query.setParameter("ctypeid",searchBean.getCusttypeid());
+        }
+        int cnt=0;
+        Object obj=query.getSingleResult();
+        if(obj!=null){
+            cnt=Integer.parseInt(obj.toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public TAtteClock getClockById(Integer id) {
+        String sql=" select bean from TAtteClock bean ";
+        if(id!=null){
+            sql+=" where bean.id = :sid ";
+            TypedQuery<TAtteClock> query=entityManager.createQuery(sql,TAtteClock.class);
+            query.setParameter("sid",id);
+            List<TAtteClock> list=query.getResultList();
+            if(list!=null&&list.size()>0){
+                return list.get(0);
+            }
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean isClock(String custid, Integer timeid, String attedate) {
+         if(StringUtil.isEmpty(custid)||StringUtil.isEmpty(attedate)||timeid==null){
+             return false;
+         }
+         String sql=" select bean from TAtteClock bean where bean.status=1 and bean.attedate=:adate and bean.timeid=:tid and bean.custid=:cid ";
+         TypedQuery<TAtteClock> query=entityManager.createQuery(sql,TAtteClock.class);
+         query.setParameter("cid",custid);
+         query.setParameter("adate",attedate);
+         query.setParameter("tid",timeid);
+         List<TAtteClock> list=query.getResultList();
+         if(list!=null&&list.size()>0){
+             return true;
+         }
+        return false;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java
index 63e43d7..b247f7b 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteRestDaoImpl.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.atte.dao.impl;
 
 import com.supwisdom.dlpay.atte.bean.AtteRestInfo;
+import com.supwisdom.dlpay.atte.bean.ClockInfo;
 import com.supwisdom.dlpay.atte.bean.RestSearchBean;
 import com.supwisdom.dlpay.atte.dao.AtteRestDao;
 import com.supwisdom.dlpay.atte.domain.TAtteRest;
@@ -37,6 +38,7 @@
         return flag;
     }
 
+    @Transactional
     @Override
     public boolean updateAtteRest(TAtteRest bean) {
         boolean flag=false;
@@ -49,6 +51,7 @@
         return flag;
     }
 
+    @Transactional
     @Override
     public TAtteRest getAtteRestById(Integer id) {
         String sql=" select bean from TAtteRest bean ";
@@ -245,4 +248,22 @@
         }
         return false;
     }
+
+    @Transactional
+    @Override
+    public List<ClockInfo> getClockList(String attedate, String custid) {
+        if(StringUtil.isEmpty(attedate)||StringUtil.isEmpty(custid)){
+            return null;
+        }
+        String sql=" select d.custid,d.attedate,d.timeid,t.timename ";
+        sql+=" from t_atte_dtl d left join t_nc_time t on d.timeid=t.timeid where state=0 and d.custid=:cid and d.attedate=:adate ";
+        sql+=" and d.timeid not in (select timeid from t_atte_clock where attedate=:adate and custid=:cid and status=0 ) ";
+        sql+=" order by d.timeid ";
+        Query query=entityManager.createNativeQuery(sql);
+        query.setParameter("cid",custid);
+        query.setParameter("adate",attedate);
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ClockInfo.class));
+        List<ClockInfo> list=query.getResultList();
+        return list;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteClock.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteClock.java
new file mode 100644
index 0000000..438ef1b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteClock.java
@@ -0,0 +1,79 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="t_atte_clock")
+public class TAtteClock {
+    @Id
+    @Column(name = "ID", unique = true,  nullable = false, length = 32)
+    @GeneratedValue( strategy = GenerationType.AUTO)
+    private Integer id;
+    @Column(name="custid",length = 32)
+    private String custid;
+    @Column(name="attedate", length = 8)
+    private String attedate;
+    @Column(name = "TIMEID",nullable = false, precision = 9, scale = 0)
+    private Integer timeid;@Column(name="updatetime",length = 14)
+    private String updatetime;
+    @Column(name="status",length = 4)
+    private Integer status; // 0-未审核 1-已通过 2-未通过
+    @Column(name="remark",length = 60 )
+    private String remark;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+
+    public Integer getTimeid() {
+        return timeid;
+    }
+
+    public void setTimeid(Integer timeid) {
+        this.timeid = timeid;
+    }
+
+    public String getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(String updatetime) {
+        this.updatetime = updatetime;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/AtteRestService.java b/src/main/java/com/supwisdom/dlpay/atte/service/AtteRestService.java
index 262b902..f4d8ed2 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/service/AtteRestService.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/AtteRestService.java
@@ -1,12 +1,18 @@
 package com.supwisdom.dlpay.atte.service;
 
+import com.supwisdom.dlpay.atte.bean.ClockInfo;
+import com.supwisdom.dlpay.atte.bean.ClockSearchBean;
+import com.supwisdom.dlpay.atte.bean.ClockShowBean;
 import com.supwisdom.dlpay.atte.bean.RestSearchBean;
+import com.supwisdom.dlpay.atte.domain.TAtteClock;
 import com.supwisdom.dlpay.atte.domain.TAtteRest;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.springframework.data.domain.Page;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 public interface AtteRestService {
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     public boolean  saveAtteRest(TAtteRest bean);
@@ -26,4 +32,26 @@
 
     @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
     public boolean isreview(String custid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<ClockInfo> getClockList(String attedate,String custid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean canClock(String attedate,String custid,Integer timeid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean saveClock(TAtteClock bean);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateClock(TAtteClock bean);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getClockPage(ClockSearchBean searchBean, int pageNO, int pageSize);
+
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TAtteClock getClockById(Integer id);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateAtteDtl(String custid,String attedate,Integer timeid,String remark);
 }
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 6707c73..54d71c2 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
@@ -4,10 +4,7 @@
 import com.supwisdom.dlpay.atte.bean.AtteReport;
 import com.supwisdom.dlpay.atte.bean.AttedtlSearchBean;
 import com.supwisdom.dlpay.atte.bean.CustSearchBean;
-import com.supwisdom.dlpay.atte.dao.AtteClassDao;
-import com.supwisdom.dlpay.atte.dao.AtteRestDao;
-import com.supwisdom.dlpay.atte.dao.CustseaDao;
-import com.supwisdom.dlpay.atte.dao.SeasonDao;
+import com.supwisdom.dlpay.atte.dao.*;
 import com.supwisdom.dlpay.atte.domain.*;
 import com.supwisdom.dlpay.atte.service.AtteClassService;
 import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
@@ -54,6 +51,8 @@
     private SystemService systemService;
     @Autowired
     private BusinessparaDao businessparaDao;
+    @Autowired
+    AtteClockDao atteClockDao;
 
     @Override
     public Pagination getClassWithPage(String classname,String deptcode, int pageNo, int pageSize) {
@@ -216,6 +215,10 @@
                     }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());
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteRestServiceImpl.java b/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteRestServiceImpl.java
index 7acdd40..2e6ba17 100644
--- a/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteRestServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteRestServiceImpl.java
@@ -1,17 +1,32 @@
 package com.supwisdom.dlpay.atte.service.impl;
 
+import com.supwisdom.dlpay.atte.bean.ClockInfo;
+import com.supwisdom.dlpay.atte.bean.ClockSearchBean;
+import com.supwisdom.dlpay.atte.bean.ClockShowBean;
 import com.supwisdom.dlpay.atte.bean.RestSearchBean;
+import com.supwisdom.dlpay.atte.dao.AtteClassDao;
+import com.supwisdom.dlpay.atte.dao.AtteClockDao;
 import com.supwisdom.dlpay.atte.dao.AtteRestDao;
+import com.supwisdom.dlpay.atte.domain.TAtteClock;
+import com.supwisdom.dlpay.atte.domain.TAtteDtl;
 import com.supwisdom.dlpay.atte.domain.TAtteRest;
 import com.supwisdom.dlpay.atte.service.AtteRestService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.page.Pagination;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 @Service
 public class AtteRestServiceImpl implements AtteRestService {
     @Autowired
     AtteRestDao atteRestDao;
+    @Autowired
+    AtteClockDao atteClockDao;
+    @Autowired
+    AtteClassDao atteClassDao;
 
     @Override
     public boolean saveAtteRest(TAtteRest bean) {
@@ -42,4 +57,49 @@
     public boolean isreview(String custid) {
         return atteRestDao.isreview(custid);
     }
+
+    @Override
+    public List<ClockInfo> getClockList(String attedate, String custid) {
+        return atteRestDao.getClockList(attedate,custid);
+    }
+
+    @Override
+    public boolean canClock(String attedate, String custid, Integer timeid) {
+        return atteClockDao.canClock(attedate,timeid,custid);
+    }
+
+    @Override
+    public boolean saveClock(TAtteClock bean) {
+        return atteClockDao.saveClock(bean);
+    }
+
+    @Override
+    public boolean updateClock(TAtteClock bean) {
+        return atteClockDao.updateClock(bean);
+    }
+
+
+    @Override
+    public Pagination getClockPage(ClockSearchBean searchBean, int pageNO, int pageSize) {
+        return atteClockDao.getClockPage(searchBean,pageNO,pageSize);
+    }
+
+    @Override
+    public TAtteClock getClockById(Integer id) {
+        return atteClockDao.getClockById(id);
+    }
+
+    @Override
+    public boolean updateAtteDtl(String custid, String attedate, Integer timeid,String remark) {
+        TAtteDtl dtl=atteClassDao.getDtl(timeid,attedate,custid);
+        if(dtl!=null&&dtl.getState()==0){
+            dtl.setState(1);
+            dtl.setUpdatetime(DateUtil.getNow());
+            if(StringUtil.isEmpty(dtl.getRemark())){
+                dtl.setRemark(remark);
+            }
+            atteClassDao.updateAtteDtl(dtl);
+        }
+        return true;
+    }
 }
diff --git a/src/main/resources/templates/apph5/doclock.html b/src/main/resources/templates/apph5/doclock.html
new file mode 100644
index 0000000..a383f5f
--- /dev/null
+++ b/src/main/resources/templates/apph5/doclock.html
@@ -0,0 +1,348 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+
+<head>
+    <title>首页</title>
+    <meta name="_csrf_header" th:content="${_csrf.headerName}" />
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="/static/libs/layui/css/layui.css" th:href="@{/static/libs/layui/css/layui.css}"/>
+
+    <link rel="stylesheet" href="/static/res/assets/plugins/element-ui/theme-default/index.css"
+          th:href="@{/static/res/assets/plugins/element-ui/theme-default/index.css}"/>
+
+    <!--<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+    <!--<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.form.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/layer/layer.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/js/vue.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/element-ui/index.js}"></script>
+
+
+</head>
+
+<body>
+
+<div id="app1">
+    <div class="page-title" style="text-align:center; font-size: 24px;color: #FF8247;margin-top:7%">补打卡</div>
+    <br>
+
+    <el-form ref="tempform" :model="tempform" :rules="rules" size="mini" label-width="36%" style="margin-top:7%">
+
+        <el-form-item label="日期:" prop="attedate">
+            <div class="el-col el-col-18">
+                <div class="el-input" style="width: 187px;">
+                    <el-date-picker type="date" v-model="tempform.attedate" id="time"
+                                    :picker-options="pickerOptions0" :editable="false"
+                                    value-format="yyyyMMdd"
+                                    style="width:100%;"></el-date-picker>
+                </div>
+            </div>
+        </el-form-item>
+
+    </el-form>
+    <div  style="text-align:center; ">
+        <el-button type="primary" @click="searchDtl">查询</el-button>
+    </div>
+    <div class="row">
+        <div class="col-md-12" style="padding-left: 0px;padding-right: 0px">
+            <div class="box box-primary" style="margin-bottom: 15px">
+                <div class="box-body box-profile">
+                    <template>
+                        <el-table
+                                ref="singleTable"
+                                :data="tableData"
+                                highlight-current-row
+                                stripe
+                                border>
+                            <el-table-column
+                                    align="center">
+                                <template scope="scope">
+                                    <div class="weui-panel__bd">
+                                        <div class="weui-media-box weui-media-box_text">
+                                            <p class="weui-media-box__desc">
+                                            <div class="weui-cell__bd">
+                                                <span style="font-size:14px;color:#999; "></span>
+                                            </div>
+                                            <div style="display: flex;">
+
+                                                <div style="font-size:14px;color:#999;flex: 1">
+                                                    {{scope.row.timename}}
+                                                </div>
+                                                <div style="font-size:14px;color:#999;margin-left:10px">
+                                                    <el-button
+                                                            type="success"
+                                                            @click="addclock(scope.row)">申请</el-button>
+
+                                                </div>
+
+                                            </div>
+                                            </p>
+                                        </div>
+                                    </div>
+                                </template>
+                            </el-table-column>
+
+                        </el-table>
+
+                    </template>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <el-dialog :title="applytitle" :visible.sync="dialogFormVisible" size="large"
+               :modal-append-to-body='false' @close="closeDialog('applyform')">
+        <el-form ref="applyform" class="el-form-item " :model="applyform"
+                 :rules="rules" label-width="36%">
+            <el-form-item label="打卡时段:" prop="timename">
+                <el-col :span="18">
+                    <el-input v-model="applyform.timename" readonly style="width: 90%;" maxlength="20">
+                    </el-input>
+                </el-col>
+            </el-form-item>
+            <el-form-item label="备注:" prop="remark">
+                <el-col :span="18">
+                    <el-input type="textarea" style="width: 90%;" v-model="applyform.remark" placeholder="填写备注"
+                              >
+                    </el-input>
+                </el-col>
+            </el-form-item>
+
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <!--<el-button @click="resetForm('applyform') ">取 消</el-button>-->
+            <el-button type="primary"  @click="apply('applyform')">申请</el-button>
+
+
+        </div>
+    </el-dialog>
+
+</div>
+
+</body>
+
+<script>
+    var validatePhone = function (rule, value, callback) {
+        if (value == "") {
+            callback(new Error("请输入手机号"));
+        } else if (!isCellPhone(value)) {//引入methods中封装的检查手机格式的方法
+            callback(new Error("请输入正确的手机号!"));
+        } else {
+            callback();
+        }
+    }
+
+    var app_vue = new Vue({
+        el: '#app1',
+        data: {
+            dialogFormVisible: false,
+            confName: '1234',
+            tempform: {
+                attedate: '',
+            },
+            applyform:{
+                remark:'',
+                custid:'',
+                attedate:'',
+                timeid:'',
+                timename:''
+            },
+            applytitle:'申请',
+            tableData:[],
+            rtypelist: [],
+            bannerHeight: 1000,
+            screenWidth: 0,
+            userId: '',
+            pickerOptions0: {
+                disabledDate: function (time) {
+                    return false;
+                }
+            },pickerOptions1: {
+                disabledDate:function(time) {
+                    if(app_vue.tempform.startdate !=''){
+
+                        return time.getTime() < app_vue.tempform.startdate.getTime();
+                    }else {
+                        return time.getTime() > Date.now();
+                    }
+                }
+            },
+            rules: {
+                remark: [
+                    {required: true, message: '请输入备注', trigger: 'blur'}
+                ]
+            },
+        },
+
+        methods: {
+            apply: function (formName) {
+                var _that = this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function (valid) {
+                        if (valid) {
+                            vali = true;
+                        } else {
+                            vali = false;
+                        }
+                    });
+                if (vali == true) {
+                    saveTemp(_that, formName);
+                }
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            searchDtl:function(){
+                var that=this;
+                searchDtl(that);
+            },
+            indexChange: function (pre, next) {
+                var _self = this;
+                var devIdListTmp = _self.devIdList;
+                _self.selectDevId = devIdListTmp[pre];
+                // console.log(_self.selectDevId)
+
+            },
+            setSize: function () {
+                // 通过浏览器宽度(图片宽度)计算高度
+                this.bannerHeight = this.screenWidth;
+            },
+            addclock:function (row){
+               getFillData(this, row);
+                this.dialogFormVisible = true;
+            }
+        },
+        created: function () {
+            var _self = this;
+            // 首次加载时,需要调用一次
+            _self.screenWidth = window.innerWidth;
+            _self.setSize();
+
+        }
+    })
+
+    // 窗口大小发生改变时,调用一次
+    window.onresize = function () {
+        app_vue.screenWidth = window.innerWidth;
+        app_vue.setSize();
+    }
+    function getFillData(_self, row) {
+      _self.applyform.custid=row.custid;
+      _self.applyform.attedate=row.attedate;
+      _self.applyform.timeid=row.timeid;
+      _self.applyform.timename=row.timename;
+
+    }
+
+    function saveTemp(that, formName) {
+        var token = $("meta[name='_csrf_token']").attr("value");
+        var attedate=that.applyform.attedate;
+        var timeid=that.applyform.timeid;
+        var remark=that.applyform.remark;
+        var custid=that.applyform.custid;
+
+        $.ajax({
+            type: "post",
+            url: encodeURI("[[@{/app/atte/saveClock?attedate=}]]"+attedate+"&timeid="+timeid+"&remark="+remark+"&custid="+custid),
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN': token,
+            },
+            success: function (data) {
+
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2, time: 2000});
+                } else {
+                    layer.msg('申请成功!', {icon: 1, time: 1000});
+                    that.dialogFormVisible = false;
+                    searchDtl(that);
+                }
+            }
+        });
+    }
+
+
+    function isCellPhone(val) {
+        if (!/^1(3|4|5|6|7|8)\d{9}$/.test(val)) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+    function class_Formatdate(date){
+        if(date==null||date==''){
+            return '';
+        }
+        var d=new Date(date);
+        var month=d.getMonth() + 1+'';
+        var date=d.getDate()+'';
+        if(month.length==1){
+            month='0'+month;
+        }
+        if(date.length==1){
+            date='0'+date;
+        }
+        var formated=d.getFullYear() + '' + month + '' +date;
+
+        return formated;
+    }
+    function searchDtl(that){
+        var custid='[[${custid}]]';
+        var attedate=class_Formatdate(that.tempform.attedate);
+        if(attedate==''||attedate==undefined){
+            layer.msg("请选择日期!", {icon: 2, time: 2000});
+            return ;
+        }
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:"[[@{/app/atte/getclocklist?attedate=}]]"+attedate+"&custid="+custid,
+            success:function(ret){
+                if(ret.errStr != ''){
+                    layer.msg(ret.errStr, {icon: 2, time: 2000});
+                }
+                that.tableData=ret.infolist;
+            }
+        })
+    }
+
+
+</script>
+
+<style>
+
+    .el-carousel__item h3 {
+        color: #ff3366;
+        font-size: 14px;
+        opacity: 0.75;
+        line-height: 300px;
+        margin: 0;
+        /*background-color:#66cccc;
+        border: 0px solid #e5e5e5;
+        width: 50%;
+        left: 10%;
+        height: 100%;*/
+    }
+
+    .el-carousel__item:nth-child(2n) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item:nth-child(2n+1) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item .Carousel {
+        border-bottom: 1px solid #f1f4f8;
+    }
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/apph5/leavehistory.html b/src/main/resources/templates/apph5/leavehistory.html
index 9978c12..8253be8 100644
--- a/src/main/resources/templates/apph5/leavehistory.html
+++ b/src/main/resources/templates/apph5/leavehistory.html
@@ -253,7 +253,7 @@
         </el-form>
         <div slot="footer" style="text-align:center; ">
             <el-button type="primary" @click="saveTemp('tempform')">查 询</el-button>
-            <el-button type="primary" @click="closediv()">取 消</el-button>
+            <!--<el-button type="primary" @click="closediv()">取 消</el-button>-->
         </div>
     </el-dialog>
 </div>
diff --git a/src/main/resources/templates/apph5/reviewclock.html b/src/main/resources/templates/apph5/reviewclock.html
new file mode 100644
index 0000000..f411658
--- /dev/null
+++ b/src/main/resources/templates/apph5/reviewclock.html
@@ -0,0 +1,546 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+
+<head>
+    <title>首页</title>
+    <!--<meta name="_csrf_header" th:content="${_csrf.headerName}" />
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />-->
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="/static/libs/layui/css/layui.css" th:href="@{/static/libs/layui/css/layui.css}"/>
+
+    <link rel="stylesheet" href="/static/res/assets/plugins/element-ui/theme-default/index.css"
+          th:href="@{/static/res/assets/plugins/element-ui/theme-default/index.css}"/>
+    <link rel="stylesheet" href="/static/res/assets/css/wxpage.css"
+          th:href="@{/static/res/assets/css/wxpage.css}"/>
+    <!--<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.min.js}"></script>
+    <!--<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>-->
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/jquery/jquery.form.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/layer/layer.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/js/vue.min.js}"></script>
+    <script type="text/javascript" th:src="@{/static/res/assets/plugins/element-ui/index.js}"></script>
+
+
+</head>
+
+<body>
+
+<div id="app2">
+    <div class="page-title" style="text-align:center; font-size: 24px;color: #FF8247;margin-top:7%">补打卡审核</div><br>
+
+    <el-button type="primary" @click="showdiv()" style="float: right">筛 选</el-button>
+
+
+    <div class="row">
+        <div class="col-md-12" style="padding-left: 0px;padding-right: 0px">
+            <div class="box box-primary" style="margin-bottom: 15px">
+                <div class="box-body box-profile">
+                    <template>
+                        <el-table
+                                ref="singleTable"
+                                :data="tableData"
+                                highlight-current-row
+                                @current-change="currRowChange"
+                                stripe
+                                border>
+                            <el-table-column
+                                    prop="custid"
+                                    align="center"
+                                    v-show="false">
+                                <template scope="scope">
+                                    <div class="weui-panel__bd">
+                                        <div class="weui-media-box weui-media-box_text">
+                                            <h4 class="weui-media-box__title" style="display: flex">
+                                                <div style="flex: 1">{{scope.row.custname}}</div>
+                                                <div>{{scope.row.deptname}}</div>
+                                            </h4>
+                                            <p class="weui-media-box__desc">
+                                            <div class="weui-cell__bd">
+                                                <span style="font-size:14px;color:#999; "></span>
+                                            </div>
+                                            <div style="display: flex;">
+
+                                                <div style="font-size:14px;color:#999;flex: 1">
+                                                    补打卡时间{{scope.row.attedate}}--{{scope.row.timename}}
+                                                </div>
+                                                <div style="font-size:14px;color:#999;margin-left:10px">
+                                                    <span v-if="scope.row.status== '0'"><el-button
+                                                            type="warning"
+                                                            @click="editDtl(scope.row)">未审核</el-button></span>
+                                                    <span v-if="scope.row.status== '1'"><el-button
+                                                            type="success"
+                                                            @click="editDtl(scope.row)">已通过</el-button></span>
+                                                    <span v-if="scope.row.status== '2'"><el-button
+                                                            type="success"
+                                                            @click="editDtl(scope.row)">未通过</el-button></span>
+
+                                                </div>
+
+                                            </div>
+                                            </p>
+                                        </div>
+                                    </div>
+
+                                </template>
+                            </el-table-column>
+
+
+                        </el-table>
+                        <div class="clearfix"></div>
+                        <el-pagination
+                                @size-change="handleSizeChange"
+                                @current-change="currPageChange"
+                                :current-page="currPage"
+                                :page-sizes="[10, 20, 50, 100]"
+                                :page-size="pageSize"
+                                layout="prev, pager, next,sizes, jumper,total"
+                                :total="totSize">
+                        </el-pagination>
+
+                    </template>
+                </div>
+            </div>
+        </div>
+    </div>
+    <el-dialog :title="updatetitle2" :visible.sync="dialogFormVisible2" size="large"
+               :modal-append-to-body='false' @close="closeDialog('historyform')">
+        <el-form ref="historyform" class="el-form-item " :model="historyform"
+                 :rules="rules" label-width="36%">
+            <el-form-item label="姓名:" prop="custname">
+                <el-col :span="18">
+                    <el-input v-model="historyform.custname" readonly style="width: 90%;" maxlength="20">
+                    </el-input>
+                </el-col>
+            </el-form-item>
+            <el-form-item label="人员类别:" prop="custtypename">
+                <el-col :span="18">
+                    <el-input v-model="historyform.custtypename" readonly style="width: 90%;" maxlength="20">
+                    </el-input>
+                </el-col>
+            </el-form-item>
+
+            <el-form-item label="状态:" prop="statusname">
+                <el-col :span="18">
+                    <el-input v-model="historyform.statusname" readonly style="width: 90%;" maxlength="20">
+                    </el-input>
+                </el-col>
+            </el-form-item>
+            <el-form-item label="备注:" prop="remark">
+                <el-col :span="18">
+                    <el-input type="textarea" style="width: 90%;" v-model="historyform.remark" placeholder="填写备注"
+                              readonly>
+                    </el-input>
+                </el-col>
+            </el-form-item>
+
+
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <!--<el-button @click="resetForm('historyform') ">取 消</el-button>-->
+            <el-button type="primary" v-if="historyform.status== '0'" @click="review('historyform')">通过</el-button>
+            <el-button type="primary" v-if="historyform.status== '0'" @click="unreview('historyform')">不通过</el-button>
+
+
+        </div>
+    </el-dialog>
+    <el-dialog :title="updatetitle" :visible.sync="dialogFormVisible" style="width: 100%" :modal-append-to-body='false'
+               @close="closeDialog('tempform')" size="large">
+        <el-form ref="tempform" :model="tempform" data-parsley-validate
+                 class="el-form-item" style="width: 100%">
+            <el-form-item   prop="attedate">
+                <label slot="label">日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:</label>
+                <div class="el-col el-col-17">
+                    <div class="el-input" style="width: 90%;">
+                        <el-date-picker type="date" v-model="tempform.attedate" id="time"
+                                        :editable="false"
+                                        value-format="yyyyMMdd"
+                                        style="width:100%;"></el-date-picker>
+                    </div>
+                </div>
+            </el-form-item>
+            <el-form-item  prop="status">
+                <label slot="label">状&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;态:</label>
+                <div class="el-col el-col-17">
+                    <div class="el-input" style="width: 90%;">
+                        <el-select v-model="tempform.status" id="status">
+                            <el-option
+                                    v-for="status in statuslist"
+                                    :key="status.value"
+                                    :label="status.label"
+                                    :value="status.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+                </div>
+            </el-form-item>
+            <el-form-item label="人员类型:"  prop="custtype">
+                <div class="el-col el-col-17">
+                    <div class="el-input" style="width: 90%;">
+                        <el-select v-model="tempform.custtypeid" id="custtype">
+                            <el-option
+                                    v-for="status in custtypelist"
+                                    :key="status.value"
+                                    :label="status.label"
+                                    :value="status.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+                </div>
+            </el-form-item>
+
+        </el-form>
+        <div slot="footer" style="text-align:center; ">
+            <el-button type="primary" @click="saveTemp('tempform')">查 询</el-button>
+        </div>
+    </el-dialog>
+</div>
+
+
+</body>
+
+<script>
+    var validatePhone = function (rule, value, callback) {
+        if (value == "") {
+            callback(new Error("请输入手机号"));
+        } else if (!isCellPhone(value)) {//引入methods中封装的检查手机格式的方法
+            callback(new Error("请输入正确的手机号!"));
+        } else {
+            callback();
+        }
+    }
+
+    var app_vue = new Vue({
+        el: '#app2',
+        data: {
+            tableData: [],
+            confName: '1234',
+            currPage: 1,
+            pageSize: 20,
+            totSize: 0,
+            currentRow: null,
+            tempform: {
+                attedate: '',
+                custtypeid: '',
+                status: '',
+                custid:''
+            },
+            historyform: {
+                custid: '',
+                custname: '',
+                startdate: '',
+                enddate: '',
+                remark: '',
+                rtype: '',
+                status: '',
+                custtype: '',
+                id: ''
+            },
+            sexlist: [],
+            rtypelist: [],
+            custtypelist: [],
+            statuslist: [],
+            bannerHeight: 1000,
+            screenWidth: 0,
+            userId: '',
+            dialogFormVisible: false,
+            dialogFormVisible2: false,
+            dlgAllotDevVisible: false,
+            updatetitle: '筛选',
+            updatetitle2: '详情',
+            rules: {
+                /*visitorname: [
+                    {required: true, message: '请输入访客姓名', trigger: 'blur'},
+                ],
+                idno: [
+                    {required: true, message: '请输入访客身份证号', trigger: 'blur'}
+                ],
+                sex: [
+                    {required: true, message: '请输入访客性别', trigger: 'blur'}
+                ],
+                remarks: [
+                    {required: true, message: '请输入备注', trigger: 'blur'}
+                ],
+                phone: [
+                    {required: true, validator: validatePhone, trigger: 'blur'}
+                ]*/
+            },
+        },
+
+        methods: {
+            saveTemp: function (formName) {
+                var _that = this;
+                this.pagesize = 10;
+                this.currPage = 1;
+                if(this.tempform.attedate==''||this.tempform.attedate==undefined){
+                    layer.msg("请选择日期!", {icon: 2, time: 2000});
+                    return ;
+                }
+                this.dialogFormVisible = false;
+                commonQuery(this, this.currPage, this.pageSize);
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false;
+                this.dialogFormVisible2 = false;
+            },
+            review: function (formName) {
+                this.dialogFormVisible2 = false;
+
+                var _that = this;
+                this.pagesize = 10;
+                this.currPage = 1;
+                reviewupdate(this, 1,this.historyform.id);
+
+            },unreview: function (formName) {
+                this.dialogFormVisible2 = false;
+
+                var _that = this;
+                this.pagesize = 10;
+                this.currPage = 1;
+                reviewupdate(this, 2,this.historyform.id);
+
+            },
+            showdiv: function (row) {
+                this.dialogFormVisible = true;
+                this.updatetitle = "筛选"
+            },
+            editDtl: function (row) {
+                dtl_getFillData(this, row);
+                this.dialogFormVisible2 = true;
+                this.updatetitle2 = "详情"
+            },
+            closediv: function () {
+                this.dialogFormVisible2 = true;
+
+            },
+            closeDialog:function(formName) {
+                // this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            currRowChange: function (val) {
+                this.currentRow = val;
+            },
+            indexChange: function (pre, next) {
+                var _self = this;
+                var devIdListTmp = _self.devIdList;
+                _self.selectDevId = devIdListTmp[pre];
+                // console.log(_self.selectDevId)
+
+            },
+            setSize: function () {
+                // 通过浏览器宽度(图片宽度)计算高度
+                this.bannerHeight = this.screenWidth;
+            }, handleSizeChange: function (val) {
+                this.pageSize = val;
+                commonQuery(this,this.currPage, this.pageSize);
+                //console.log('每页条'+val);
+            }, currPageChange: function (val) {
+                this.currPage = val;
+                commonQuery(this, this.currPage, this.pageSize);
+                //console.log('当前页:'+val);
+            }
+
+        },
+        created: function () {
+            var _self = this;
+            // 首次加载时,需要调用一次
+            _self.screenWidth = window.innerWidth;
+            _self.setSize();
+            var confid = '[[${custid}]]';
+            console.log(confid);
+            _self.tempform.custid = confid;
+
+            var statl = [];
+            statl.push({
+                value: '',
+                label: '请选择'
+            });
+            statl.push({
+                value: '0',
+                label: '未审核'
+            });
+            statl.push({
+                value: '1',
+                label: '已通过'
+            });
+            statl.push({
+                value: '2',
+                label: '未通过'
+            });
+
+
+            _self.statuslist = statl;
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url: encodeURI("[[@{/app/atte/getcusttypelist}]]"),
+                success: function (ret) {
+
+                    var custtypes=ret.custtypelist;
+                    var custtypelist=[];
+                    for (var i = 0; i < custtypes.length; i++) {
+                        custtypelist.push({
+                            value: custtypes[i].custtypeid,
+                            label: custtypes[i].custtypename
+                        });
+                    }
+                    _self.custtypelist=custtypelist;
+
+                }
+            })
+
+        }
+    })
+
+    // 窗口大小发生改变时,调用一次
+    window.onresize = function () {
+        app_vue.screenWidth = window.innerWidth;
+        app_vue.setSize();
+    }
+
+    function showsearchform() {
+        $("#sear").show();
+    }
+
+    function closesearchform() {
+        $("#sear").hide();
+    }
+
+    function dtl_getFillData(_self, row) {
+        _self.historyform.custname = row.custname;
+        _self.historyform.custtype = row.custtype;
+        _self.historyform.custtypename = row.custtypename;
+        _self.historyform.status = row.status;
+        _self.historyform.id = row.id;
+        if (row.status == "0") {
+            _self.historyform.statusname = "未审核"
+        } else if (row.status == "1") {
+            _self.historyform.statusname = "已通过"
+        } else if (row.status == "2") {
+            _self.historyform.statusname = "未通过"
+        } else if (row.status == "3") {
+            _self.historyform.statusname = "取消"
+        } else {
+            _self.historyform.statusname = "删除"
+        }
+
+        _self.historyform.remark = row.remark;
+    }
+    function class_Formatdate(date){
+        if(date==null||date==''){
+            return '';
+        }
+        var d=new Date(date);
+        var month=d.getMonth() + 1+'';
+        var date=d.getDate()+'';
+        if(month.length==1){
+            month='0'+month;
+        }
+        if(date.length==1){
+            date='0'+date;
+        }
+        var formated=d.getFullYear() + '' + month + '' +date;
+
+        return formated;
+    }
+    function saveTempCustomer(_that, formdata, formName) {
+        var token = $("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "post",
+            url: encodeURI("[[@{/app/atte/getreviewlist}]]"),
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN': token,
+            },
+            data: JSON.stringify(formdata),
+            success: function (data) {
+
+                if (data.retcode != "0") {
+                    layer.msg(data.retmsg, {icon: 2, time: 2000});
+                    window.location = "[[@{/app/getapplyqrcode?visitorid=}]]" + data.visitorid;
+                } else {
+                    layer.msg('登记成功!', {icon: 1, time: 1000});
+                }
+            }
+        });
+    }
+
+    function commonQuery(_self, pageno, pagesize) {
+        var attedate=class_Formatdate(_self.tempform.attedate);
+        var custtypeid=_self.tempform.custtypeid;
+        var status=_self.tempform.status;
+        var custid=_self.tempform.custid;
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: "[[@{/app/atte/getreviewclock?attedate=}]]" + attedate + "&custtypeid=" + custtypeid + "&status=" + status + "&custid=" + custid + "&pageNo=" + pageno + "&pageSize=" + pagesize,
+            success: function (info) {
+                console.log(info)
+
+                _self.tableData = info.page.list;
+                _self.totSize = info.page.totalCount;
+            }
+        })
+    }
+
+    function reviewupdate(_self, status,id) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: "[[@{/app/atte/reviewclock?id=}]]" + id + "&status=" + status,
+            success: function (info) {
+                console.log(info)
+                if (info.errStr != "") {
+                    layer.msg(info.errStr, {icon: 2, time: 2000});
+                } else {
+                    layer.msg('审核成功!', {icon: 1, time: 1000});
+                }
+                commonQuery(_self,_self.currPage, _self.pageSize);
+
+            }
+        })
+    }
+
+    function isCellPhone(val) {
+        if (!/^1(3|4|5|6|7|8)\d{9}$/.test(val)) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+
+</script>
+
+<style>
+
+    .el-carousel__item h3 {
+        color: #ff3366;
+        font-size: 14px;
+        opacity: 0.75;
+        line-height: 300px;
+        margin: 0;
+        /*background-color:#66cccc;
+        border: 0px solid #e5e5e5;
+        width: 50%;
+        left: 10%;
+        height: 100%;*/
+    }
+
+    .el-carousel__item:nth-child(2n) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item:nth-child(2n+1) {
+        background-color: #ffffff;
+    }
+
+    .el-carousel__item .Carousel {
+        border-bottom: 1px solid #f1f4f8;
+    }
+</style>
\ No newline at end of file
diff --git a/src/main/resources/templates/atte/app/index.html b/src/main/resources/templates/atte/app/index.html
index 2ed64f1..5318c23 100644
--- a/src/main/resources/templates/atte/app/index.html
+++ b/src/main/resources/templates/atte/app/index.html
@@ -49,6 +49,16 @@
     </a>
 
 </div>
+<div class="weui-cells">
+    <a class="weui-cell weui-cell_access" th:href="@{'/app/atte/clockindex?custid='+${custid}}" >
+        <div class="weui-cell__bd">
+            <p>补打卡</p>
+        </div>
+        <div  class="weui-cell__ft">
+        </div>
+    </a>
+
+</div>
 
 
 
@@ -59,42 +69,7 @@
     $(function () {
 
     });
-    function add() {
-        var custid=[[${custid}]];
-        alert('ok');
-        $.ajax({
-            type: "get",
-            url: "[[@{/app/atte/addindex?custid=}]]"+custid,
-            dataType: "json",
-            success: function (data) {
 
-            }
-        });
-    }
-    function search(){
-        var custid=[[${custid}]];
-        $.ajax({
-            type: "get",
-            url: "[[@{app/atte/searchindex?custid=}]]"+custid,
-            dataType: "json",
-            success: function (data) {
-
-
-            }
-        });
-    }
-    function review() {
-        var custid=[[${custid}]];
-        $.ajax({
-            type: "get",
-            url: "[[@{app/atte/reviewindex?custid=}]]"+custid,
-            dataType: "json",
-            success: function (data) {
-
-
-            }
-        });
-    }
 
 </script>
 
diff --git a/src/main/resources/templates/atte/app/re_index.html b/src/main/resources/templates/atte/app/re_index.html
index 3e838d7..3dd8f97 100644
--- a/src/main/resources/templates/atte/app/re_index.html
+++ b/src/main/resources/templates/atte/app/re_index.html
@@ -50,6 +50,16 @@
 
 </div>
 <div class="weui-cells">
+    <a class="weui-cell weui-cell_access" th:href="@{'/app/atte/clockindex?custid='+${custid}}" >
+        <div class="weui-cell__bd">
+            <p>补打卡</p>
+        </div>
+        <div  class="weui-cell__ft">
+        </div>
+    </a>
+
+</div>
+<div class="weui-cells">
     <a class="weui-cell weui-cell_access" th:href="@{'/app/atte/reviewindex?custid='+${custid}}" >
         <div class="weui-cell__bd">
             <p>审核假条</p>
@@ -59,6 +69,16 @@
     </a>
 
 </div>
+<div class="weui-cells">
+    <a class="weui-cell weui-cell_access" th:href="@{'/app/atte/reviewClock?custid='+${custid}}" >
+        <div class="weui-cell__bd">
+            <p>补打卡审核</p>
+        </div>
+        <div  class="weui-cell__ft">
+        </div>
+    </a>
+
+</div>
 
 
 </body>