diff --git a/src/main/java/com/supwisdom/dlpay/atte/Test.java b/src/main/java/com/supwisdom/dlpay/atte/Test.java
new file mode 100644
index 0000000..af20887
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/Test.java
@@ -0,0 +1,5 @@
+package com.supwisdom.dlpay.atte;
+
+public class Test {
+    
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/AtteDetailInfo.java b/src/main/java/com/supwisdom/dlpay/atte/bean/AtteDetailInfo.java
new file mode 100644
index 0000000..d999a7d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/AtteDetailInfo.java
@@ -0,0 +1,101 @@
+package com.supwisdom.dlpay.atte.bean;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class AtteDetailInfo {
+    private String custname;
+    private String custtypeid;
+    private String attedate;
+    private String remark;
+    @Id
+    private String atteno;
+    private int state;
+    private String cardno;
+    private String timeid;
+    private String deptcode;
+    private String oldstate;
+
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(String custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getAtteno() {
+        return atteno;
+    }
+
+    public void setAtteno(String atteno) {
+        this.atteno = atteno;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void setState(int state) {
+        this.state = state;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getTimeid() {
+        return timeid;
+    }
+
+    public void setTimeid(String timeid) {
+        this.timeid = timeid;
+    }
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+
+    public String getOldstate() {
+        return oldstate;
+    }
+
+    public void setOldstate(String oldstate) {
+        this.oldstate = oldstate;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/AtteDtl.java b/src/main/java/com/supwisdom/dlpay/atte/bean/AtteDtl.java
new file mode 100644
index 0000000..97747aa
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/AtteDtl.java
@@ -0,0 +1,99 @@
+package com.supwisdom.dlpay.atte.bean;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class AtteDtl {
+    private String attedate;
+    private String attetime;
+    @Id
+    private String refno;
+    private String custname;
+    private String custid;
+    private Integer custtypeid;
+    private String devicename;
+    private String deviceid;
+    private String cardno;
+    private String deptcode;
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+
+    public String getAttetime() {
+        return attetime;
+    }
+
+    public void setAttetime(String attetime) {
+        this.attetime = attetime;
+    }
+
+    public String getRefno() {
+        return refno;
+    }
+
+    public void setRefno(String refno) {
+        this.refno = refno;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public Integer getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(Integer custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getDevicename() {
+        return devicename;
+    }
+
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
+    }
+
+    public String getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(String deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/AttedtlSearchBean.java b/src/main/java/com/supwisdom/dlpay/atte/bean/AttedtlSearchBean.java
new file mode 100644
index 0000000..aba9081
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/AttedtlSearchBean.java
@@ -0,0 +1,67 @@
+package com.supwisdom.dlpay.atte.bean;
+
+public class AttedtlSearchBean {
+    private String startdate;
+    private String enddate;
+    private String custname;
+    private String custtypeid;
+    private String cardno;
+    private String deptcode;
+    private String devname;
+
+    public String getStartdate() {
+        return startdate;
+    }
+
+    public void setStartdate(String startdate) {
+        this.startdate = startdate;
+    }
+
+    public String getEnddate() {
+        return enddate;
+    }
+
+    public void setEnddate(String enddate) {
+        this.enddate = enddate;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(String custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+
+    public String getDevname() {
+        return devname;
+    }
+
+    public void setDevname(String devname) {
+        this.devname = devname;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/bean/CustSearchBean.java b/src/main/java/com/supwisdom/dlpay/atte/bean/CustSearchBean.java
new file mode 100644
index 0000000..5247b29
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/bean/CustSearchBean.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.atte.bean;
+
+public class CustSearchBean {
+    private String custtypeid;
+    private String deptcode;
+    private String custname;
+    private String attedate;
+
+    public String getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(String custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
new file mode 100644
index 0000000..432b416
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/controller/CustAtteController.java
@@ -0,0 +1,809 @@
+package com.supwisdom.dlpay.atte.controller;
+
+import com.supwisdom.dlpay.atte.bean.AttedtlSearchBean;
+import com.supwisdom.dlpay.atte.domain.TAtteClass;
+import com.supwisdom.dlpay.atte.domain.TAtteDtl;
+import com.supwisdom.dlpay.atte.domain.TSeaCusttype;
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.atte.service.AtteClassService;
+import com.supwisdom.dlpay.atte.service.CustseaService;
+import com.supwisdom.dlpay.atte.service.SeasonService;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.mainservice.service.WebInterfaceService;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.ncmgr.domain.TNcTime;
+import com.supwisdom.dlpay.ncmgr.domain.TNcTimegrp;
+import com.supwisdom.dlpay.ncmgr.domain.TNcWeektime;
+import com.supwisdom.dlpay.ncmgr.service.NcService;
+import com.supwisdom.dlpay.system.domain.TCustType;
+import com.supwisdom.dlpay.system.domain.TDept;
+import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.SystemService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Controller
+@RequestMapping("/atte")
+public class CustAtteController {
+
+    private static Logger log= LoggerFactory.getLogger(CustAtteController.class);
+
+    @Autowired
+    SeasonService seasonService;
+    @Autowired
+    NcService ncService;
+    @Autowired
+    CustseaService custseaService;
+    @Autowired
+    private SystemService systemService;
+    @Autowired
+    AtteClassService atteClassService;
+
+    @GetMapping("/rule/index")
+    public String seasonindex(){
+        return "atte/role/index";
+    }
+    /**
+     *  查询规则列表
+     */
+    @ResponseBody
+    @RequestMapping(value="/rule/list")
+    public Map loadseasonlist(HttpServletRequest request,
+                              HttpServletResponse response,
+                              @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                              @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                              @RequestParam(value = "season", required = true, defaultValue = "") String season,
+                              @AuthenticationPrincipal TOperator operUser) {
+
+            Map map=new HashMap();
+            try {
+                Pagination page=null;
+                String opertype=operUser.getOpertype();
+                String deptcode=operUser.getDeptcode();
+                if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                    page=seasonService.getSeasonWithPage(season,null,pageNo,pageSize);
+                }else {
+
+                    if(StringUtil.isEmpty(deptcode)){
+                        deptcode="-1";
+                    }
+                    page=seasonService.getSeasonWithPage(season,deptcode,pageNo,pageSize);
+                }
+                List<TNcWeektime> weeklist=ncService.findAllNcWeekTime();
+                map.put("PageResult",page);
+                map.put("weeklist",weeklist);
+                List<TCustType> custtypelist=systemService.findAllCusttype();
+                map.put("custtypelist",custtypelist);
+                List<TDept> deptlist=systemService.findAllDept();
+                map.put("deptlist",deptlist);
+                map.put("operator",operUser);
+                for(TDept dept:deptlist){
+                    if(dept.getDeptcode().equals(operUser.getDeptcode())){
+                        map.put("dept",dept);
+                    }
+                }
+            }catch (Exception e) {
+                e.printStackTrace();
+                log.error("查询考勤规则失败：" + e.getMessage());
+            }
+        return map;
+    }
+    /**
+     *  获取规则信息
+     */
+    @ResponseBody
+    @RequestMapping("/loadSeasonForUpdate")
+    public Map loadSeasonForUpdate( @RequestParam(value = "sid") int id){
+        Map map=new HashMap();
+        try {
+            TSeason season=seasonService.getSeasonById(id);
+            map.put("season",season);
+            List<TNcWeektime> list=ncService.findAllNcWeekTime();
+            map.put("weekgrp",list);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     *  添加考勤规则
+     */
+    @ResponseBody
+    @RequestMapping(value="/addSeason",method = {RequestMethod.POST})
+    public Map addSeason(@RequestBody TSeason postData,
+                         HttpServletRequest request, HttpServletResponse response) {
+            Map map=new HashMap();
+        try {
+            TSeason season=seasonService.findBySeason(postData.getSeason());
+             if(season==null){
+                 int id=seasonService.getMaxSeasonId()+1;
+                 TSeason newseason=new TSeason();
+                 newseason.setAddtime(DateUtil.getNow());
+                 newseason.setUpdatetime(DateUtil.getNow());
+                 newseason.setId(id);
+                 newseason.setWeekid(postData.getWeekid());
+                 newseason.setSeason(postData.getSeason());
+                 newseason.setDeptcode(postData.getDeptcode());
+                 newseason.setCusttypeid(postData.getCusttypeid());
+                 newseason.setStatus(2);
+                 seasonService.saveSeason(newseason);
+                 map.put("errStr", "");
+             }else{
+                 map.put("errStr","规则名称已存在");
+                 return map;
+             }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "添加规则失败！");
+            log.error("添加规则失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     *  修改规则
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updateSeason",method = {RequestMethod.POST})
+    public Map updateSeason(@RequestBody TSeason bean,
+                            HttpServletRequest request) {
+        Map map=new HashMap();
+
+        try {
+            if(bean==null){
+                map.put("errStr","请选择规则");
+                return map;
+            }
+            TSeason temp=seasonService.findSeasonByIdAndName(bean.getId(),bean.getSeason());
+            if(temp!=null){
+                map.put("errStr","该规则名称已存在，请从新修改！");
+                return map;
+            }
+            TSeason open=seasonService.getOpenRule(bean.getCusttypeid()+"",bean.getDeptcode());
+                if(open!=null&&open.getId()!=bean.getId()){
+                    map.put("errStr","所选部门,人员类别下存在已启用的规则!");
+                    return map;
+                }
+             TSeason season=seasonService.getSeasonById(bean.getId());
+                  season.setSeason(bean.getSeason());
+                  season.setCusttypeid(bean.getCusttypeid());
+                  season.setDeptcode(bean.getDeptcode());
+                  season.setUpdatetime(DateUtil.getNow());
+                  season.setWeekid(bean.getWeekid());
+                seasonService.updateSeason(season);
+                  map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr","修改规则失败！");
+            log.error("修改规则失败信息:",e.getMessage());
+        }
+        return map;
+
+    }
+    /**
+     *  启用停用规则
+     */
+    @ResponseBody
+    @RequestMapping(value = "/stoporopenrule",method = {RequestMethod.POST})
+    public Map openOrStop(@RequestParam(value = "id") int id,
+                            HttpServletRequest request) {
+        Map map=new HashMap();
+
+        try {
+            seasonService.stoporopen(id);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr","启用/停用考勤规则失败！");
+            log.error("启用/停用考勤规则:",e.getMessage());
+        }
+        return map;
+
+    }
+    /**
+     *  删除考勤规则
+     */
+    @ResponseBody
+    @RequestMapping(value="/deleteSeason",method = {RequestMethod.GET})
+    public Map deleteSeason(@RequestParam(value = "id") int id,
+                            HttpServletRequest request, HttpServletResponse response) {
+        Map map=new HashMap();
+        int flag=0;
+        String message="";
+        try {
+            seasonService.deleteSeason(id);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("删除考勤规则异常",e.getMessage());
+            message=e.getMessage();
+            flag=1;
+        }
+        map.put("flag",flag);
+        map.put("message", message);
+        return map;
+    }
+    /**
+     *  人员类别绑定时令页面
+     */
+    @GetMapping("/custsea/index")
+    public String  custseaindex(){
+        return "atte/custsea/index";
+    }
+
+    /**
+     *   类别时令列表
+     */
+    @ResponseBody
+    @RequestMapping(value="/custsea/list")
+    public Map loadcustsealist(HttpServletRequest request,
+                              HttpServletResponse response,
+                              @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                              @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                              @RequestParam(value = "custtypename", required = true, defaultValue = "") String custtypename) {
+        Map map=new HashMap();
+
+        try {
+            Pagination page=null;
+            page=custseaService.getCustseaWithPage(custtypename,pageNo,pageSize);
+            map.put("PageResult",page);
+            List<TSeason> seasonlist=seasonService.findAllSeason();
+            map.put("seasonlist",seasonlist);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+            List<TDictionaryId> dicts = systemService.findTDictionaryByType(8);
+            map.put("dicts", dicts);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("查询客户类别时令列表错误：",e.getMessage());
+        }
+        return map;
+
+    }
+    /**
+     *  获取类别时令信息
+     */
+    @ResponseBody
+    @RequestMapping("/loadCustseaForUpdate")
+    public Map loadCustseaForUpdate( @RequestParam(value = "custtypeid") int custtypeid){
+        Map map=new HashMap();
+        try {
+            TSeaCusttype custsea=custseaService.getCustseaById(custtypeid);
+            map.put("custsea",custsea);
+            List<TSeason> seasonlist=seasonService.findAllSeason();
+            map.put("seasonlist",seasonlist);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+    /**
+     *  修改或添加  类别时令
+     */
+    @ResponseBody
+    @RequestMapping(value="/saveOrUpdateCustsea",method = {RequestMethod.GET})
+    public Map saveOrUpdateCustsea(@RequestParam(value = "id") int id,
+                                   @RequestParam(value = "custtypeid",defaultValue = "0") int custtypeid,
+                            HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+
+        try {
+            if (!custseaService.exist(custtypeid)){
+                TSeaCusttype newCustsea=new TSeaCusttype();
+                newCustsea.setCusttypeid(custtypeid);
+                newCustsea.setId(id);
+                newCustsea.setUpdatetime(DateUtil.getNow());
+                custseaService.saveCustsea(newCustsea);
+            }else{
+                TSeaCusttype oldCustsea=custseaService.getCustseaById(custtypeid);
+                oldCustsea.setId(id);
+                oldCustsea.setUpdatetime(DateUtil.getNow());
+                custseaService.updateCustsea(oldCustsea);
+            }
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr",e.getMessage());
+        }
+        return map;
+    }
+    /**
+     *  分配设备
+     */
+    @RequestMapping("/assign/index")
+    public String assginindex(Model model){
+        return "/season/index";
+    }
+    /**
+     *  查询设备
+     */
+    @ResponseBody
+    @RequestMapping(value = "/assign/devlist",method = {RequestMethod.GET})
+    public Map getAssignDev( @RequestParam(value = "ruleid") Integer ruleid,
+                             @RequestParam(value = "devname") String devname,
+                             @RequestParam(value = "devtype") String  devtype,
+                             HttpServletRequest request, HttpServletResponse response) {
+            Map map=new HashMap();
+
+        try {
+            List<TNcDevice> list=custseaService.getAllCanAssign(ruleid,devname,devtype);
+            map.put("canassignlist",list);
+            List<TNcDevice> list1=custseaService.getAllDevByCusttype(ruleid);
+            map.put("hasassignlist",list1);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return map ;
+    }
+    /**
+     *  分配设备
+     */
+    @ResponseBody
+    @RequestMapping(value = "/assign/save",method = {RequestMethod.POST})
+    public Map saveDevCusttype(@RequestParam(value = "ruleid") String ruleid,
+                               @RequestParam(value = "ids") String ids,
+                               HttpServletRequest request, HttpServletResponse response) {
+        Map map=new HashMap();
+
+        try {
+
+            custseaService.assignDevRule(ids,ruleid);
+            map.put("okFlag","1");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return map;
+    }
+    /**
+     *  考勤排班
+     */
+    @GetMapping("/class/index")
+    public String classindex(){
+        return "atte/class/index";
+    }
+
+    @ResponseBody
+    @RequestMapping("/class/list")
+    public Map loadClassList(HttpServletRequest request,
+                             HttpServletResponse response,
+                             @AuthenticationPrincipal TOperator operUser,
+                             @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                             @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                             @RequestParam(value = "classname", required = true, defaultValue = "") String classname) {
+
+        Map map=new HashMap();
+
+        try {
+            Pagination page=null;
+            String opertype=operUser.getOpertype();
+            String deptcode=operUser.getDeptcode();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                page=atteClassService.getClassWithPage(classname,null,pageNo,pageSize);
+            }else {
+
+                if(StringUtil.isEmpty(deptcode)){
+                    deptcode="-1";
+                }
+                page=atteClassService.getClassWithPage(classname,deptcode,pageNo,pageSize);
+            }
+            map.put("PageResult",page);
+            map.put("errStr","");
+            List<TNcTimegrp> timegrplist = ncService.findAllNcTimeGrp();
+            map.put("timelist",timegrplist);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+            List<TDept> deptlist=systemService.findAllDept();
+            map.put("deptlist",deptlist);
+            map.put("operator",operUser);
+            for(TDept dept:deptlist){
+                if(dept.getDeptcode().equals(operUser.getDeptcode())){
+                    map.put("dept",dept);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr",e.getMessage());
+        }
+
+        return map;
+    }
+    /**
+     *  获取班次信息
+     */
+    @ResponseBody
+    @RequestMapping("/loadClassForUpdate")
+    public Map loadClassForUpdate( @RequestParam(value = "classid") Integer classid){
+        Map map=new HashMap();
+        try {
+            TAtteClass atteclass=atteClassService.getClassById(classid);
+            map.put("atteclass",atteclass);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     *  添加班次
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value="/addClass",method = {RequestMethod.POST})
+    public Map addClass( @RequestParam(value = "classname") String classname,
+                                   @RequestParam(value = "workorno") int workorno,
+                                  @RequestParam(value = "startdate") String startdate,
+                                  @RequestParam(value = "enddate") String enddate,
+                         @RequestParam(value = "timegrpid") Integer timegrpid,
+                         @RequestParam(value = "deptcode") String deptcode,
+                                   HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        try {
+            TAtteClass old=atteClassService.getClassByName(classname);
+            if(old==null){
+                if(!atteClassService.canAddClass(deptcode,workorno,startdate,enddate,0)){
+                    map.put("errStr","班次时间已存在");
+                    return map;
+                }
+                TAtteClass atteClass=new TAtteClass();
+                atteClass.setClassid(1+atteClassService.getMaxClassid());
+                atteClass.setClassname(classname);
+                atteClass.setStartdate(startdate);
+                atteClass.setEnddate(enddate);
+                atteClass.setStatus(1);
+                atteClass.setTimegrpid(timegrpid);
+                atteClass.setUpdatetime(DateUtil.getNow());
+                atteClass.setWorkorno(workorno);
+                atteClass.setDeptcode(deptcode);
+                atteClassService.saveAtteClass(atteClass);
+                map.put("errStr","");
+            }else{
+                map.put("errStr","班次名称已存在");
+                return map;
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr",e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     *   修改班次
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updateClass",method = {RequestMethod.POST})
+    public Map updateClass(@RequestBody TAtteClass bean,
+                           @RequestParam(value = "startdate") String startdate,
+                           @RequestParam(value = "enddate") String enddate,
+                            HttpServletRequest request) {
+        Map map=new HashMap();
+
+        try {
+            if(bean==null){
+                map.put("errStr","请选择班次！");
+                return map;
+            }
+            TAtteClass old=atteClassService.getClassByName(bean.getClassname());
+            if(old.getClassid()!=bean.getClassid()){
+                map.put("errStr","班次名称已存在！");
+                return map;
+            }
+            if(atteClassService.canAddClass(bean.getDeptcode(),bean.getWorkorno(),bean.getStartdate(),bean.getEnddate(),bean.getClassid())){
+                TAtteClass newclass=atteClassService.getClassById(bean.getClassid());
+                newclass.setWorkorno(bean.getWorkorno());
+                newclass.setStartdate(startdate);
+                newclass.setEnddate(enddate);
+                newclass.setTimegrpid(bean.getTimegrpid());
+                newclass.setUpdatetime(DateUtil.getNow());
+                newclass.setClassname(bean.getClassname());
+                newclass.setDeptcode(bean.getDeptcode());
+                atteClassService.updateClass(newclass);
+            }else{
+                map.put("errStr","班次时间存在！");
+                return map;
+            }
+
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr","修改班次失败！");
+            log.error("修改班次失败信息:",e.getMessage());
+        }
+        return map;
+
+    }
+    /**
+     * 获取排班的人员名单
+     *
+     * @param perName
+     * @param cardno
+     * @param bankcardno
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getCustomerList", method = RequestMethod.POST)
+    public Map getCustomerList(@RequestParam(value = "classid", required = false, defaultValue = "0") Integer classid,
+                              @RequestParam(value = "perName", required = false, defaultValue = "") String perName,
+                                   @RequestParam(value = "custtypeid", required = false, defaultValue = "") String custtypeid,
+                                   @RequestParam(value = "deptcode", required = false, defaultValue = "") String deptcode) {
+        Map map = new HashMap();
+        try {
+            TAtteClass atteClass=atteClassService.getClassById(classid);
+            List<TCustomerInfo> allcust=atteClassService.getAllCustomer(perName,atteClass.getDeptcode(),custtypeid);
+            List<TCustomerInfo> hasclasscust=atteClassService.hasClassCust(classid);
+            Boolean countIndex = false;
+            if (allcust.size() > 4000) {
+                countIndex = true;
+            }
+            allcust.removeAll(hasclasscust);
+            map.put("allcust",allcust);
+            map.put("hasclasscust",hasclasscust);
+            map.put("countIndex", countIndex);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("名单查询失败--" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     *     考勤排班
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping("/addCustClass")
+    public Map saveCustClass(@RequestParam(value = "idlist") List<String> custids,
+                               @RequestParam(value = "classid") Integer classid,
+                               HttpServletRequest request, HttpServletResponse response) {
+        Map map=new HashMap();
+
+        try {
+            if(classid==null){
+                map.put("errStr","请选择班次！");
+                return map;
+            }
+            atteClassService.addClassCust(classid,custids);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr","添加班次人员异常!");
+        }
+
+        return map;
+    }
+    /**
+     *  删除班次
+     */
+    @ResponseBody
+    @RequestMapping(value="/deleteClass",method = {RequestMethod.POST})
+    public Map deleteClass(@RequestParam(value = "classid") int classid,
+                            HttpServletRequest request, HttpServletResponse response) {
+        Map map=new HashMap();
+        int flag=0;
+        String message="";
+        try {
+            atteClassService.deleteAtteClass(classid);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("删除班次异常",e.getMessage());
+            message=e.getMessage();
+            flag=1;
+        }
+        map.put("flag",flag);
+        map.put("message", message);
+        return map;
+    }
+
+
+    //手动生成考勤名单
+    @ResponseBody
+    @RequestMapping("/adddtlbyhand")
+    public Map adddtl(@RequestParam(value = "startdate") String startdate,
+                      @RequestParam(value = "enddate") String enddate,
+                      @AuthenticationPrincipal TOperator operUser,
+                      HttpServletRequest request, HttpServletResponse response) {
+        Map map=new HashMap();
+        String opertype=operUser.getOpertype();
+        String deptcode=operUser.getDeptcode();
+        if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                deptcode=null;
+        }else {
+            if(StringUtil.isEmpty(deptcode)){
+                deptcode="-1";
+            }
+        }
+        atteClassService.addBatchDtl(startdate,enddate,deptcode);
+        atteClassService.handleDtl(deptcode,startdate);
+        return map;
+    }
+
+    /**
+     *    考勤流水页面
+     * @param
+     */
+    @GetMapping("/dtl/index")
+    public String dtlindex(){
+        return "atte/dtl/index";
+    }
+
+    /**
+     *    考勤流水列表
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value="/dtl/list",method = {RequestMethod.POST})
+    public Map loadattedtllist(HttpServletRequest request,
+                               HttpServletResponse response,
+                               @AuthenticationPrincipal TOperator operUser,
+                               @RequestBody AttedtlSearchBean searchBean,
+                               @RequestParam(value = "startdate") String  startdate,
+                               @RequestParam(value = "enddate") String  enddate,
+                               @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                               @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize
+                              ) {
+        Map map=new HashMap();
+
+        try {
+            String deptcode=operUser.getDeptcode();
+            String opertype=operUser.getOpertype();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                deptcode=null;
+            }else {
+                if(StringUtil.isEmpty(deptcode)){
+                    deptcode="-1";
+                }
+            }
+            searchBean.setDeptcode(deptcode);
+            searchBean.setStartdate(startdate);
+            searchBean.setEnddate(enddate);
+            Pagination page=null;
+            page=atteClassService.getDtlWithPage(searchBean,pageNo,pageSize);
+            map.put("PageResult",page);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+//            List<TNcTime> timelist=ncService.findAllNcTime();
+//            map.put("timelist",timelist);
+            List<TDept> deptlist=systemService.findAllDept();
+            map.put("deptlist",deptlist);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("查询考勤流水信息出错：",e.getMessage());
+        }
+        return map;
+
+    }
+
+
+
+    /**
+     *    考勤状态页面
+     * @param
+     */
+    @GetMapping("/timedtl/index")
+    public String timedtlindex(){
+        return "atte/timedtl/index";
+    }
+
+    /**
+     *    考勤明细列表
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value="/timedtl/list",method = {RequestMethod.POST})
+    public Map loadtimedtllist(HttpServletRequest request,
+                               HttpServletResponse response,
+                               @AuthenticationPrincipal TOperator operUser,
+                               @RequestBody AttedtlSearchBean searchBean,
+                               @RequestParam(value = "startdate") String  startdate,
+                               @RequestParam(value = "enddate") String  enddate,
+                               @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                               @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize
+    ) {
+        Map map=new HashMap();
+
+        try {
+            String opertype=operUser.getOpertype();
+            String deptcode=operUser.getDeptcode();
+            if (!StringUtil.isEmpty(opertype) &&(opertype.equals("S")||opertype.equals("P"))){
+                deptcode=null;
+            }else {
+
+                if(StringUtil.isEmpty(deptcode)){
+                    deptcode="-1";
+                }
+            }
+            searchBean.setDeptcode(deptcode);
+            searchBean.setStartdate(startdate);
+            searchBean.setEnddate(enddate);
+            Pagination page=null;
+            page=atteClassService.getAtteDtlInfoWithPage(searchBean,pageNo,pageSize);
+            map.put("PageResult",page);
+            List<TCustType> custtypelist=systemService.findAllCusttype();
+            map.put("custtypelist",custtypelist);
+            List<TNcTime> timelist=ncService.findAllNcTime();
+            map.put("timelist",timelist);
+            List<TDept> deptlist=systemService.findAllDept();
+            map.put("deptlist",deptlist);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("查询考勤流水信息出错：",e.getMessage());
+        }
+        return map;
+
+    }
+
+    /**
+     *  修改考勤状态
+     * @param
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updatetimeDtl",method = {RequestMethod.POST})
+    public Map updateState(@RequestParam(value = "atteno") String atteno,
+                           @RequestParam(value = "state") Integer state,
+                           @RequestParam(value = "remark",defaultValue = " ") String remark,
+                           HttpServletRequest request) {
+        Map map=new HashMap();
+        try {
+            TAtteDtl dtl=atteClassService.getDtlByAtteno(atteno);
+            if(dtl==null){
+                map.put("errStr","请选择流水");
+                return map;
+            }
+            dtl.setUpdatetime(DateUtil.getNow());
+            dtl.setOldstate(dtl.getState());
+            dtl.setState(state);
+            dtl.setRemark(remark);
+            atteClassService.updateAtteDtl(dtl);
+            map.put("errStr","");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr","修改考勤流水状态失败！");
+            log.error("修改考勤流水状态失败:",e.getMessage());
+        }
+        return map;
+
+    }
+
+    /**
+     *    请销假页面
+     * @param
+     */
+    @GetMapping("/app/index")
+    public String appindex(){
+        return "atte/app/appindex";
+    }
+
+
+    public static void main(String[] args) {
+        String s1=DateUtil.getNow("yyyyMMdd")+"140000";
+        String s2=DateUtil.getNow("yyyyMMdd")+"143000";
+        long dif=DateUtil.getInterval(s1,s2);
+        System.out.println(dif);
+        System.out.println((int)(dif/(1000*60)));
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java
new file mode 100644
index 0000000..b717462
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/AtteClassDao.java
@@ -0,0 +1,64 @@
+package com.supwisdom.dlpay.atte.dao;
+
+import com.supwisdom.dlpay.atte.bean.AtteDtl;
+import com.supwisdom.dlpay.atte.bean.AttedtlSearchBean;
+import com.supwisdom.dlpay.atte.bean.CustSearchBean;
+import com.supwisdom.dlpay.atte.domain.TAtteClass;
+import com.supwisdom.dlpay.atte.domain.TAtteDtl;
+import com.supwisdom.dlpay.atte.domain.TClassCust;
+import com.supwisdom.dlpay.customer.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface AtteClassDao {
+    public Pagination getClassWithPage(String classname,String deptcode, int pageNo, int pageSize);
+
+    public TAtteClass getClassById(Integer classid);
+
+    public boolean saveAtteClass(TAtteClass atteClass);
+
+    public TAtteClass getClassByName(String classname);
+
+    public int getMaxClassid();
+
+    public boolean existClass(String deptcode,String startdate, String enddate, int workorno, int exceptid);
+
+    public boolean updateClass(TAtteClass atteClass);
+
+    List<TCustomerInfo> hasClassCust(int classid);
+
+    public TClassCust getByIdAndDate(String custid, String attedate);
+
+    public boolean delClassCustByClassid(Integer classid);
+
+    public boolean addClassCust(TClassCust bean);
+
+    public boolean delClassCust(TClassCust bean);
+
+    //获取考勤流水号
+    public String getAtteNo(String attedate);
+    //保存流水
+    public boolean saveAtteDtl(TAtteDtl dtl);
+    //
+    //获取排班人员
+    public List<TCustomerInfo> getAtteCust(CustSearchBean searchBean);
+    //获取考勤明细信息
+    public Pagination getAttedtlWithPage(AttedtlSearchBean searchBean,int pageNo,int pageSize);
+    //修改明细
+    public boolean updateAtteDtl(TAtteDtl dtl);
+    //
+    public TAtteDtl getDtlByAtteno(String atteno);
+    //获取人员信息
+    public List<TCustomerInfo> getCustInfo(CustSearchBean searchBean);
+
+    //获取流水
+    public Pagination getDtlWithPage(AttedtlSearchBean searchBean,int pageNo,int pageSize);
+    //流水
+    public List<AtteDtl> getDtlList(AttedtlSearchBean searchBean);
+    //删除流水
+    public boolean delAtteDtl(String attedate,String deptcode);
+    //明细
+    public List<TAtteDtl> getDetailList(String custid,String attedate);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/CustseaDao.java b/src/main/java/com/supwisdom/dlpay/atte/dao/CustseaDao.java
new file mode 100644
index 0000000..de1cfb3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/CustseaDao.java
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.atte.dao;
+
+import com.supwisdom.dlpay.atte.domain.TDevCusttype;
+import com.supwisdom.dlpay.atte.domain.TSeaCusttype;
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface CustseaDao {
+    public Pagination getCustseaWithPage(String custtypename, int pageNo, int pageSize);
+
+    public TSeaCusttype getCustseaById(Integer custtypeid);
+
+    public boolean updateCustsea(TSeaCusttype tSeaCusttype);
+
+    public boolean saveCustsea(TSeaCusttype tSeaCusttype);
+
+    public boolean exist(Integer custtypeid);
+
+    public List<TNcDevice> getAllCanAssign(Integer ruleid,String devname,String devtype);
+
+    public List<TNcDevice> getAllDevByCusttype(Integer ruleid);
+
+    public boolean deleteDevRuleid(Integer ruleid);
+
+    public boolean addDevRuleid(TDevCusttype bean);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/SeasonDao.java b/src/main/java/com/supwisdom/dlpay/atte/dao/SeasonDao.java
new file mode 100644
index 0000000..8990c79
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/SeasonDao.java
@@ -0,0 +1,28 @@
+package com.supwisdom.dlpay.atte.dao;
+
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface SeasonDao {
+    public Pagination getSeasonWithPage(String season,String deptcode, int pageNo, int pageSize);
+
+    public TSeason getSeasonById(Integer id);
+
+    public TSeason findBySeason(String season);
+
+    public boolean saveSeason(TSeason season);
+
+    public int getMaxSeasonId();
+
+    public TSeason getSeasonByIdAndName(Integer id,String season);
+
+    public boolean updateSeason(TSeason season);
+
+    public boolean deleteSeason(int id);
+
+    public List<TSeason> findAllSeason();
+
+    public TSeason getOpenRule(Integer custtypid,String deptcode);
+}
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
new file mode 100644
index 0000000..e332dd6
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/AtteClassDaoImpl.java
@@ -0,0 +1,625 @@
+package com.supwisdom.dlpay.atte.dao.impl;
+
+import com.supwisdom.dlpay.atte.bean.AtteDetailInfo;
+import com.supwisdom.dlpay.atte.bean.AtteDtl;
+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.domain.TAtteClass;
+import com.supwisdom.dlpay.atte.domain.TAtteDtl;
+import com.supwisdom.dlpay.atte.domain.TClassCust;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Service
+public class AtteClassDaoImpl implements AtteClassDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getClassWithPage(String classname,String deptcode, int pageNo, int pageSize) {
+        String sql=" select bean from TAtteClass bean where bean.status=1 ";
+        if(!StringUtil.isEmpty(classname)){
+            sql+=" and bean.classname like :name ";
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+=" and bean.deptcode = :dcode ";
+        }
+        sql+=" order by bean.startdate desc";
+        TypedQuery<TAtteClass> query=entityManager.createQuery(sql,TAtteClass.class);
+        if(!StringUtil.isEmpty(classname)){
+            query.setParameter("name","%"+classname+"%");
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            query.setParameter("dcode",deptcode);
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TAtteClass> list=query.getResultList();
+        page.setList(list);
+        int totalCount=getClassCount(classname,deptcode);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    public int getClassCount(String classname,String deptcode){
+        String sql=" select count(bean.classid) from TAtteClass bean where bean.status=1 ";
+        if(!StringUtil.isEmpty(classname)){
+            sql+=" and bean.classname like :name ";
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+=" and bean.deptcode = :dcode ";
+        }
+        Query query=entityManager.createQuery(sql);
+        if(!StringUtil.isEmpty(classname)){
+            query.setParameter("name","%"+classname+"%");
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            query.setParameter("dcode",deptcode);
+        }
+         List list=query.getResultList();
+        int cnt=0;
+        if(list!=null&&list.size()>0){
+            cnt=Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public TAtteClass getClassById(Integer classid) {
+        String sql="select bean from TAtteClass bean where classid = :cid ";
+        if(classid!=null){
+            TypedQuery<TAtteClass> query=entityManager.createQuery(sql,TAtteClass.class);
+            query.setParameter("cid",classid);
+            List<TAtteClass> list=query.getResultList();
+            if(list!=null&&list.size()>0){
+                return list.get(0);
+            }
+        }
+        return null;
+    }
+    @Transactional
+    @Override
+    public boolean saveAtteClass(TAtteClass atteClass) {
+        boolean flag=false;
+
+        try {
+            entityManager.persist(atteClass);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public TAtteClass getClassByName(String classname) {
+        String sql=" select bean from TAtteClass bean where bean.status=1 ";
+        if(!StringUtil.isEmpty(classname)){
+            sql+=" and bean.classname = :name ";
+            TypedQuery<TAtteClass> query=entityManager.createQuery(sql,TAtteClass.class);
+            query.setParameter("name",classname);
+            List<TAtteClass> list=query.getResultList();
+            if(list!=null&&list.size()>0){
+                return list.get(0);
+            }
+        }
+        return null;
+    }
+    @Transactional
+    @Override
+    public int getMaxClassid() {
+        String sql=" select max(c.classid) from TAtteClass c";
+        Query query=entityManager.createQuery(sql);
+        Object object=query.getSingleResult();
+        if(object!=null){
+            return (int) object;
+        }
+        return 0;
+    }
+    @Transactional
+    @Override
+    public boolean existClass(String deptcode,String startdate, String enddate, int workorno,int exceptid) {
+        String sql=" select a from TAtteClass a where a.status=1 and a.deptcode=:dcode and a.workorno= :won and a.classid!=:expid ";
+        if(!StringUtil.isEmpty(startdate)&&!StringUtil.isEmpty(enddate)){
+            sql+=" and ( (:sdate between a.startdate and a.enddate) or (:edate between a.startdate and a.enddate)  ";
+            sql+=" or (:sdate < a.startdate and :edate > a.enddate ) )";
+            TypedQuery<TAtteClass> query=entityManager.createQuery(sql,TAtteClass.class);
+            query.setParameter("sdate",startdate);
+            query.setParameter("edate",enddate);
+            query.setParameter("won",workorno);
+            query.setParameter("expid",exceptid);
+            query.setParameter("dcode",deptcode);
+            List<TAtteClass> list=query.getResultList();
+            if(list!=null&&list.size()>0){
+                return true;
+            }
+        }
+        return false;
+    }
+    @Transactional
+    @Override
+    public boolean updateClass(TAtteClass atteClass) {
+        boolean flag=false;
+
+        try {
+            entityManager.merge(atteClass);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<TCustomerInfo> hasClassCust(int classid) {
+        String sql = "select a.deptcode,a.custtypeid,a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate from T_Customer a left join t_card b on a.custid = b.custid " +
+                " where a.status='1' and b.status='normal' and b.transtatus='normal' ";
+        sql+= " and exists (select * from t_class_cust t where t.classid = :cid and a.custid=t.custid ) ";
+        sql +=" order by b.cardno desc ";
+        Query query = entityManager.createNativeQuery(sql, TCustomerInfo.class);
+        query.setParameter("cid",classid);
+        List<TCustomerInfo> list = query.getResultList();
+        return list;
+    }
+    @Transactional
+    @Override
+    public TClassCust getByIdAndDate(String custid, String attedate) {
+        if(!StringUtil.isEmpty(custid)&&!StringUtil.isEmpty(attedate)){
+            String sql=" select bean from TClassCust bean where bean.custid=:cid and bean.attedate = :adate ";
+            TypedQuery<TClassCust> query=entityManager.createQuery(sql,TClassCust.class);
+            query.setParameter("cid", custid);
+            query.setParameter("adate",attedate);
+            List<TClassCust> list=query.getResultList();
+            if(list!=null&&list.size()>0){
+                return list.get(0);
+            }
+        }
+        return null;
+    }
+    @Transactional
+    @Override
+    public boolean delClassCustByClassid(Integer classid) {
+        if(classid!=null){
+            String sql=" delete from TClassCust where classid=:cid ";
+
+            try {
+                Query query=entityManager.createQuery(sql);
+                query.setParameter("cid",classid);
+                query.executeUpdate();
+                return true;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Transactional
+    @Override
+    public boolean addClassCust(TClassCust bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public boolean delClassCust(TClassCust bean) {
+        boolean flag=false;
+        try {
+            entityManager.remove(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public String getAtteNo(String attedate) {
+        String sql=" select to_char(cast(nextval('seq_attedtl') as INTEGER),'FM000000') ";
+        Query query=entityManager.createNativeQuery(sql);
+        List list=query.getResultList();
+        if(list!=null&&list.size()>0){
+            String atteno=attedate+list.get(0).toString();
+            return atteno;
+        }
+        return null;
+    }
+    @Transactional
+    @Override
+    public boolean saveAtteDtl(TAtteDtl dtl) {
+        boolean flag=false;
+        try {
+            entityManager.persist(dtl);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public List<TCustomerInfo> getAtteCust(CustSearchBean searchBean) {
+        String sql = "select a.deptcode,a.custtypeid,a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate from T_Customer a left join t_card b on a.custid = b.custid " +
+                " where a.status='1' and b.status='normal' and b.transtatus='normal' ";
+        sql+=" and (EXISTS ( select * from t_atte_rule r where r.status=1 and r.deptcode=a.deptcode and r.custtypeid=cast(a.custtypeid as INTEGER) ) or a.custid in (select custid from t_class_cust where attedate=:adate )  ) ";
+        if (!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql +=" and a.deptcode = :dcode ";
+        }
+        sql +=" order by b.cardno desc ";
+        Query query = entityManager.createNativeQuery(sql, TCustomerInfo.class);
+        query.setParameter("adate",searchBean.getAttedate());
+        if (!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode", searchBean.getDeptcode());
+        }
+        List<TCustomerInfo> list = query.getResultList();
+        return list;
+    }
+
+    @Override
+    public Pagination getAttedtlWithPage(AttedtlSearchBean searchBean, int pageNo, int pageSize) {
+        StringBuffer sql=new StringBuffer();
+        sql.append(" select t.timeid,t.atteno,t.attedate,t.remark,c.custname,c.custtypeid,b.cardno,t.state,c.deptcode,t.oldstate    from t_atte_dtl t left join t_customer c on t.custid=c.custid ");
+            sql.append(" left join t_card b on b.custid=t.custid where c.status='1' and b.status='normal'   ");
+            if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+                sql.append(" and t.attedate between :sdate and :edate ");
+              }
+            if(!StringUtil.isEmpty(searchBean.getCustname())){
+                sql.append(" and c.custname like :cname ");
+            }
+            if(!StringUtil.isEmpty(searchBean.getCardno())){
+                sql.append(" and b.cardno like :cno ");
+            }
+            if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+                sql.append(" and c.custtypeid = :ctypeid ");
+            }
+            if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+                sql.append(" and c.deptcode = :dcode ");
+            }
+            sql.append(" order by t.atteno desc ");
+            Query query=entityManager.createNativeQuery(sql.toString(), AtteDetailInfo.class);
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            query.setParameter("sdate",searchBean.getStartdate());
+            query.setParameter("edate",searchBean.getEnddate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            query.setParameter("cname","%"+searchBean.getCustname()+"%");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            query.setParameter("cno",searchBean.getCardno());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+           query.setParameter("ctypeid",searchBean.getCusttypeid());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<AtteDetailInfo> list=query.getResultList();
+        page.setList(list);
+        int totalCount= getAttedtlCount(searchBean);
+        page.setTotalCount(totalCount);
+        return page;
+
+    }
+
+    public int getAttedtlCount(AttedtlSearchBean searchBean){
+        int result=0;
+        StringBuffer sql=new StringBuffer();
+        sql.append(" select count(t.atteno)   from t_atte_dtl t left join t_customer c on t.custid=c.custid ");
+        sql.append(" left join t_card b on b.custid=t.custid where c.status='1' and b.status='normal'  ");
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            sql.append(" and t.attedate between :sdate and :edate ");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            sql.append(" and c.custname like :cname ");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            sql.append(" and b.cardno like :cno ");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            sql.append(" and c.custtypeid = :ctypeid ");
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql.append(" and c.deptcode = :dcode");
+        }
+        Query query=entityManager.createNativeQuery(sql.toString());
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            query.setParameter("sdate",searchBean.getStartdate());
+            query.setParameter("edate",searchBean.getEnddate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            query.setParameter("cname","%"+searchBean.getCustname()+"%");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            query.setParameter("cno",searchBean.getCardno());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            query.setParameter("ctypeid",searchBean.getCusttypeid());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        Object object=query.getSingleResult();
+        if(object!=null){
+            result= Integer.parseInt(object.toString());
+        }
+        return result;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateAtteDtl(TAtteDtl dtl) {
+        boolean flag=false;
+        try {
+            entityManager.merge(dtl);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Override
+    public TAtteDtl getDtlByAtteno(String atteno) {
+        if(StringUtil.isEmpty(atteno)){
+            return null;
+        }
+        String sql=" select bean from TAtteDtl bean where atteno = :ano ";
+        TypedQuery<TAtteDtl> query=entityManager.createQuery(sql,TAtteDtl.class);
+        query.setParameter("ano",atteno);
+        List<TAtteDtl> list=query.getResultList();
+        if(list!=null&&list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public List<TCustomerInfo> getCustInfo(CustSearchBean searchBean) {
+        String sql = "select a.deptcode,a.custtypeid,a.custid,a.custname,b.cardno,b.bankcardno,b.cardphyid,b.expiredate from T_Customer a left join t_card b on a.custid = b.custid " +
+                " where a.status='1' and b.status='normal' and b.transtatus='normal' ";
+        if (!StringUtil.isEmpty(searchBean.getCustname())){
+            sql += " and a.custname like :perName ";
+        }
+        if (!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql +=" and a.deptcode = :dcode ";
+        }
+        if (!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            sql +=" and a.custtypeid = :ctypeid ";
+        }
+        sql +=" order by b.cardno desc ";
+        Query query = entityManager.createNativeQuery(sql, TCustomerInfo.class);
+        if (!StringUtil.isEmpty(searchBean.getCustname())){
+            query.setParameter("perName", "%"+searchBean.getCustname()+"%");
+        }
+        if (!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode", searchBean.getDeptcode());
+        }
+        if (!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            query.setParameter("ctypeid", searchBean.getCusttypeid());
+        }
+        List<TCustomerInfo> list = query.getResultList();
+        return list;
+    }
+
+    @Override
+    public Pagination getDtlWithPage(AttedtlSearchBean searchBean, int pageNo, int pageSize) {
+        String sql=" select v.transdate attedate,v.transtime attetime,v.doorseqno refno,v.custname,v.custid,c.custtypeid,d.devname devicename,d.deviceid,v.cardno,c.deptcode " ;
+        sql+=" from v_atte_dtl v left join t_nc_device d on cast( v.deviceid as INTEGER) = d.deviceid left join t_customer c on c.custid=v.custid where 1=1 ";
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            sql+=" and v.transdate between :sdate and :edate ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            sql+="  and v.custname like :cname ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            sql+="  and c.custtypeid = :ctypeid ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql+="  and c.deptcode = :dcode ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getDevname())){
+            sql+="  and d.devname like :dname";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            sql+="  and v.cardno like :cno ";
+        }
+        sql+=" order by v.doorseqno ";
+        Query query=entityManager.createNativeQuery(sql, AtteDtl.class);
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            query.setParameter("sdate",searchBean.getStartdate());
+            query.setParameter("edate",searchBean.getEnddate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            query.setParameter("cname","%"+searchBean.getCustname()+"%");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            query.setParameter("ctypeid",Integer.parseInt(searchBean.getCusttypeid()));
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDevname())){
+            query.setParameter("dname",searchBean.getDevname());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            query.setParameter("cno",searchBean.getCardno());
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<AtteDtl> list=query.getResultList();
+        page.setList(list);
+        int totalCount= getDtlCount(searchBean);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    public int getDtlCount(AttedtlSearchBean searchBean){
+        String sql=" select v.transdate attedate,v.transtime attetime,v.doorseqno refno,v.custname,v.custid,c.custtypeid,d.devname devicename,d.deviceid,v.cardno,c.deptcode " ;
+        sql+=" from v_atte_dtl v left join t_nc_device d on cast( v.deviceid as INTEGER) = d.deviceid left join t_customer c on c.custid=v.custid where 1=1 ";
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            sql+=" and v.transdate between :sdate and :edate ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            sql+="  and v.custname like :cname ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            sql+="  and c.custtypeid = :ctypeid ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql+="  and c.deptcode = :dcode ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getDevname())){
+            sql+="  and d.devname like :dname";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            sql+="  and v.cardno like :cno ";
+        }
+        sql+=" order by v.doorseqno ";
+        Query query=entityManager.createNativeQuery(sql, AtteDtl.class);
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            query.setParameter("sdate",searchBean.getStartdate());
+            query.setParameter("edate",searchBean.getEnddate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            query.setParameter("cname","%"+searchBean.getCustname()+"%");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            query.setParameter("ctypeid",Integer.parseInt(searchBean.getCusttypeid()));
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDevname())){
+            query.setParameter("dname",searchBean.getDevname());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            query.setParameter("cno",searchBean.getCardno());
+        }
+        List<AtteDtl> list=query.getResultList();
+        if(list!=null){
+            return list.size();
+        }
+        return 0;
+    }
+
+    @Override
+    public boolean delAtteDtl(String attedate, String deptcode) {
+        if(!StringUtil.isEmpty(attedate)){
+            String sql=" delete from t_atte_dtl t  where t.attedate=:adate ";
+             if(!StringUtil.isEmpty(deptcode)){
+                 sql+=" and t.custid in (select c.custid from t_customer c where c.deptcode = :dcode )";
+             }
+            try {
+                Query query=entityManager.createNativeQuery(sql);
+                if(!StringUtil.isEmpty(deptcode)){
+                    query.setParameter("dcode",deptcode);
+                }
+                query.setParameter("adate",attedate);
+                query.executeUpdate();
+                return true;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public List<AtteDtl> getDtlList(AttedtlSearchBean searchBean) {
+        String sql=" select v.transdate attedate,v.transtime attetime,v.doorseqno refno,v.custname,v.custid,c.custtypeid,d.devname devicename,d.deviceid,v.cardno,c.deptcode " ;
+        sql+=" from v_atte_dtl v left join t_nc_device d on cast( v.deviceid as INTEGER) = d.deviceid left join t_customer c on c.custid=v.custid where 1=1 ";
+        sql+=" and exists (select DISTINCT r.deviceid from t_dev_rule r where r.deviceid=cast(v.deviceid as INTEGER) and r.ruleid in (select ar.id from t_atte_rule ar where ar.custtypeid=cast(c.custtypeid as INTEGER) and ar.deptcode=c.deptcode and ar.status=1 )) ";
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            sql+=" and v.transdate between :sdate and :edate ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            sql+="  and v.custname like :cname ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            sql+="  and c.custtypeid = :ctypeid ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            sql+="  and c.deptcode = :dcode ";
+        }
+        if(!StringUtil.isEmpty(searchBean.getDevname())){
+            sql+="  and d.devname like :dname";
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            sql+="  and v.cardno like :cno ";
+        }
+        sql+=" order by v.doorseqno ";
+        Query query=entityManager.createNativeQuery(sql, AtteDtl.class);
+        if(!StringUtil.isEmpty(searchBean.getStartdate())&&!StringUtil.isEmpty(searchBean.getEnddate())){
+            query.setParameter("sdate",searchBean.getStartdate());
+            query.setParameter("edate",searchBean.getEnddate());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCustname())){
+            query.setParameter("cname","%"+searchBean.getCustname()+"%");
+        }
+        if(!StringUtil.isEmpty(searchBean.getCusttypeid())){
+            query.setParameter("ctypeid",Integer.parseInt(searchBean.getCusttypeid()));
+        }
+        if(!StringUtil.isEmpty(searchBean.getDeptcode())){
+            query.setParameter("dcode",searchBean.getDeptcode());
+        }
+        if(!StringUtil.isEmpty(searchBean.getDevname())){
+            query.setParameter("dname",searchBean.getDevname());
+        }
+        if(!StringUtil.isEmpty(searchBean.getCardno())){
+            query.setParameter("cno",searchBean.getCardno());
+        }
+
+        List<AtteDtl> list=query.getResultList();
+
+        return list;
+    }
+
+    @Override
+    public List<TAtteDtl> getDetailList(String custid,String attedate) {
+        if(StringUtil.isEmpty(custid)||StringUtil.isEmpty(attedate)){
+            return null;
+        }
+        String sql=" select bean from TAtteDtl bean where bean.status=1 and  bean.attedate= :adate and bean.custid= :cid ";
+
+        Query query=entityManager.createQuery(sql,TAtteDtl.class);
+        query.setParameter("adate",attedate);
+        query.setParameter("cid",custid);
+
+        List<TAtteDtl> list=query.getResultList();
+
+        return list;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/CustseaDaoImpl.java b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/CustseaDaoImpl.java
new file mode 100644
index 0000000..260bb29
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/CustseaDaoImpl.java
@@ -0,0 +1,184 @@
+package com.supwisdom.dlpay.atte.dao.impl;
+
+import com.supwisdom.dlpay.atte.dao.CustseaDao;
+import com.supwisdom.dlpay.atte.domain.TDevCusttype;
+import com.supwisdom.dlpay.atte.domain.TSeaCusttype;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Repository
+public class CustseaDaoImpl implements CustseaDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getCustseaWithPage(String custtypename, int pageNo, int pageSize) {
+        StringBuffer sql=new StringBuffer(" select c.custtypeid,t.id,t.updatetime    from tb_custtype c left join t_sea_custtype t on c.custtypeid=t.custtypeid where 1=1 ");
+        if(!StringUtil.isEmpty(custtypename)){
+            sql.append("  and c.custtypename like :name ");
+        }
+        Query query=entityManager.createNativeQuery(sql.toString(), TSeaCusttype.class);
+        if (!StringUtil.isEmpty(custtypename)){
+            query.setParameter("name","%"+custtypename+"%");
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TSeaCusttype> list=query.getResultList();
+        page.setList(list);
+        int totalCount=getCustseaCount(custtypename);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+    private int getCustseaCount(String custtypename){
+        String sql=" select count(custtypeid) from tb_custtype where 1=1 ";
+        if (!StringUtil.isEmpty(custtypename)){
+            sql+=" and custtypename like :name ";
+        }
+        Query query=entityManager.createNativeQuery(sql);
+        if (!StringUtil.isEmpty(custtypename)){
+            query.setParameter("name","%"+custtypename+"%");
+        }
+        int cnt=0;
+        List list=query.getResultList();
+        if(list!=null && list.size()>0){
+            cnt=Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public TSeaCusttype getCustseaById(Integer custtypeid) {
+        String sql=" select c.custtypeid,t.id,t.updatetime    from tb_custtype c left join t_sea_custtype t on c.custtypeid=t.custtypeid where c.custtypeid=:cid ";
+        Query query=entityManager.createNativeQuery(sql,TSeaCusttype.class);
+        query.setParameter("cid",custtypeid);
+        List<TSeaCusttype> list=query.getResultList();
+        return list.size()==0?null:list.get(0);
+    }
+    @Transactional
+    @Override
+    public boolean updateCustsea(TSeaCusttype tSeaCusttype) {
+        boolean flag=false;
+
+        try {
+            entityManager.merge(tSeaCusttype);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveCustsea(TSeaCusttype tSeaCusttype) {
+        boolean flag=false;
+        try {
+            entityManager.persist(tSeaCusttype);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public boolean exist(Integer custtypeid) {
+        String sql=" select count(custtypeid) from t_sea_custtype where custtypeid=:sid ";
+        Query query=entityManager.createNativeQuery(sql);
+        query.setParameter("sid",custtypeid);
+        List list=query.getResultList();
+        int cnt=0;
+        if(list!=null&&list.size()>0){
+            cnt= Integer.parseInt(list.get(0).toString());
+        }
+        if(cnt>0){
+            return true;
+        }
+        return false;
+    }
+
+    @Transactional
+    @Override
+    public List<TNcDevice> getAllCanAssign(Integer ruleid,String devname,String devtype) {
+        String sql=" select * from t_nc_device c where c.operflag='A' and  "+
+                " c.deviceid not in (select deviceid from t_dev_rule where ruleid= :rid ) ";
+        if(!StringUtil.isEmpty(devname)){
+            sql+= " and c.devname like :cname ";
+        }
+        if(!StringUtil.isEmpty(devtype)){
+            sql+=" and c.devtype = :ctype ";
+        }
+        sql+= " order by c.deviceid ";
+        Query query=entityManager.createNativeQuery(sql,TNcDevice.class);
+        query.setParameter("rid",ruleid);
+        if(!StringUtil.isEmpty(devname)){
+           query.setParameter("cname","%"+devname+"%");
+        }
+        if(!StringUtil.isEmpty(devtype)){
+            query.setParameter("ctype",devtype);
+        }
+        List<TNcDevice> list=query.getResultList();
+        return list;
+    }
+    @Transactional
+    @Override
+    public List<TNcDevice> getAllDevByCusttype(Integer ruleid) {
+        String sql=" select * from t_nc_device c left join t_dev_rule t on c.deviceid=t.deviceid  where 1=1";
+         if (ruleid!=null){
+             sql+="  and t.ruleid = :typeid ";
+         }
+         sql+= " order by c.deviceid ";
+         Query query=entityManager.createNativeQuery(sql,TNcDevice.class);
+        if (ruleid!=null){
+            query.setParameter("typeid",ruleid);
+        }
+         List<TNcDevice> list=query.getResultList();
+        return list;
+    }
+
+    @Transactional
+    @Override
+    public boolean deleteDevRuleid(Integer ruleid) {
+        String sql=" delete from TDevCusttype where ruleid =:rid ";
+        if(ruleid!=null){
+
+            Query query= null;
+            try {
+                query = entityManager.createQuery(sql);
+                query.setParameter("rid",ruleid);
+                query.executeUpdate();
+                return true;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+    @Transactional
+    @Override
+    public boolean addDevRuleid(TDevCusttype bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/dao/impl/SeasondaoImpl.java b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/SeasondaoImpl.java
new file mode 100644
index 0000000..1c53280
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/dao/impl/SeasondaoImpl.java
@@ -0,0 +1,204 @@
+package com.supwisdom.dlpay.atte.dao.impl;
+
+import com.supwisdom.dlpay.atte.dao.SeasonDao;
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Repository
+public class SeasondaoImpl implements SeasonDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getSeasonWithPage(String season,String deptcode, int pageNo, int pageSize) {
+        String sql=" select bean from TSeason bean where bean.status!=0 ";
+        if(!StringUtil.isEmpty(season)){
+            sql+= " and bean.season like :name ";
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+= " and bean.deptcode= :dcode ";
+        }
+        sql+=" order by bean.id ";
+        TypedQuery<TSeason> query=entityManager.createQuery(sql,TSeason.class);
+        if(!StringUtil.isEmpty(season)){
+            query.setParameter("name","%"+season+"%");
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            query.setParameter("dcode",deptcode);;
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TSeason> list=query.getResultList();
+        page.setList(list);
+        int totalCount=getSeasonCount(season,deptcode);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    @Transactional
+    @Override
+    public TSeason getSeasonById(Integer id) {
+        String sql="select bean from TSeason bean where status!=0 and id = :sid";
+        TypedQuery<TSeason> query=entityManager.createQuery(sql,TSeason.class);
+        query.setParameter("sid",id);
+        List<TSeason> list=query.getResultList();
+        return list.size()==0?null:list.get(0);
+    }
+
+    private int getSeasonCount(String season,String deptcode){
+        String sql=" select count(bean.id) from TSeason bean where bean.status!=0 ";
+        if(!StringUtil.isEmpty(season)){
+            sql+= " and bean.season like :name ";
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+= " and bean.deptcode= :dcode ";
+        }
+        Query query = entityManager.createQuery(sql);
+        if(!StringUtil.isEmpty(season)){
+            query.setParameter("name","%"+season+"%");
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            query.setParameter("dcode",deptcode);;
+        }
+        int cnt = 0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public TSeason findBySeason(String season) {
+        String sql=" select bean from TSeason bean where bean.season=:name ";
+        TypedQuery<TSeason> query=entityManager.createQuery(sql,TSeason.class);
+         query.setParameter("name",season);
+         List<TSeason> list=query.getResultList();
+         if(list!=null&&list.size()>0){
+             return list.get(0);
+         }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveSeason(TSeason season) {
+        boolean flag=false;
+        try {
+            entityManager.persist(season);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public int getMaxSeasonId() {
+        String sql=" select max(s.id) from TSeason s ";
+        Query query=entityManager.createQuery(sql);
+        Object result=query.getSingleResult();
+        if(result!=null){
+            return (int)result;
+        }
+        return 0;
+    }
+
+    @Transactional
+    @Override
+    public TSeason getSeasonByIdAndName(Integer id, String season) {
+        String sql="select bean from TSeason bean where 1=1 and id <>:sid ";
+        if (!StringUtil.isEmpty(season)){
+            sql+= " and bean.season = :name";
+        }
+        TypedQuery<TSeason> query=entityManager.createQuery(sql,TSeason.class);
+        query.setParameter("sid",id);
+        if(!StringUtil.isEmpty(season)){
+            query.setParameter("name",season);
+        }
+        List<TSeason> list=query.getResultList();
+        if(list!=null&&list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateSeason(TSeason season) {
+        boolean flag=false;
+
+        try {
+            entityManager.merge(season);
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+    @Transactional
+    @Override
+    public boolean deleteSeason(int id) {
+        boolean flag=false;
+
+        try {
+            String sql=" update t_atte_rule  set status=0 where id = ?1 ";
+            Query query=entityManager.createNativeQuery(sql);
+            query.setParameter(1,id);
+            query.executeUpdate();
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<TSeason> findAllSeason() {
+        String sql=" select bean from TSeason bean where status=1 ";
+        TypedQuery<TSeason> query=entityManager.createQuery(sql,TSeason.class);
+        List<TSeason> list=query.getResultList();
+        return list;
+    }
+    @Transactional
+    @Override
+    public TSeason getOpenRule(Integer custtypid, String deptcode) {
+        String sql=" select bean from TSeason  bean where bean.status=1 ";
+        if(custtypid!=null){
+            sql+=" and bean.custtypeid =:ctypeid ";
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            sql+=" and bean.deptcode = :dcode";
+        }
+        TypedQuery<TSeason> query=entityManager.createQuery(sql,TSeason.class);
+
+        if(custtypid!=null){
+            query.setParameter("ctypeid",custtypid);
+        }
+        if(!StringUtil.isEmpty(deptcode)){
+            query.setParameter("dcode",deptcode);
+        }
+        List<TSeason> 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/domain/ClassId.java b/src/main/java/com/supwisdom/dlpay/atte/domain/ClassId.java
new file mode 100644
index 0000000..7a13359
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/ClassId.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import java.io.Serializable;
+
+public class ClassId implements Serializable {
+    private String custid;
+    private String attedate;
+
+    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;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/CustDev.java b/src/main/java/com/supwisdom/dlpay/atte/domain/CustDev.java
new file mode 100644
index 0000000..37e0728
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/CustDev.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import java.io.Serializable;
+
+public class CustDev implements Serializable {
+    private Integer deviceid;
+    private Integer ruleid;
+
+    public Integer getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(Integer deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public Integer getRuleid() {
+        return ruleid;
+    }
+
+    public void setRuleid(Integer ruleid) {
+        this.ruleid = ruleid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteClass.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteClass.java
new file mode 100644
index 0000000..43e8eca
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteClass.java
@@ -0,0 +1,95 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="t_atte_class")
+public class TAtteClass {
+
+    private Integer classid;
+    private String classname;
+    private String startdate;
+    private String enddate;
+    private Integer status;
+    private Integer workorno;
+    private String updatetime;
+    private Integer timegrpid;
+    private String deptcode;
+
+    @Id
+    @Column(name="classid")
+    public Integer getClassid() {
+        return classid;
+    }
+
+    public void setClassid(Integer classid) {
+        this.classid = classid;
+    }
+    @Column(name="classname")
+    public String getClassname() {
+        return classname;
+    }
+
+    public void setClassname(String classname) {
+        this.classname = classname;
+    }
+    @Column(name="startdate")
+    public String getStartdate() {
+        return startdate;
+    }
+
+    public void setStartdate(String startdate) {
+        this.startdate = startdate;
+    }
+    @Column(name="enddate")
+    public String getEnddate() {
+        return enddate;
+    }
+
+    public void setEnddate(String enddate) {
+        this.enddate = enddate;
+    }
+    @Column(name="status")
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+    @Column(name="workorno")
+    public Integer getWorkorno() {
+        return workorno;
+    }
+
+    public void setWorkorno(Integer workorno) {
+        this.workorno = workorno;
+    }
+    @Column(name="updatetime")
+    public String getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(String updatetime) {
+        this.updatetime = updatetime;
+    }
+    @Column(name="timegrpid")
+    public Integer getTimegrpid() {
+        return timegrpid;
+    }
+
+    public void setTimegrpid(Integer timegrpid) {
+        this.timegrpid = timegrpid;
+    }
+
+    @Column(name="deptcode")
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
new file mode 100644
index 0000000..38a046e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TAtteDtl.java
@@ -0,0 +1,106 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "t_atte_dtl")
+public class TAtteDtl {
+    private String atteno;
+    private String custid;
+    private String attedate;
+    private Integer timeid;
+    private Integer state;
+    private Integer status;
+    private String remark;
+    private Integer oldstate;
+    private String  operid;
+    private String updatetime;
+
+
+    @Id
+    @Column(name = "atteno")
+    public String getAtteno() {
+        return atteno;
+    }
+
+    public void setAtteno(String atteno) {
+        this.atteno = atteno;
+    }
+    @Column(name = "custid")
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+    @Column(name = "attedate")
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+    @Column(name = "timeid")
+    public Integer getTimeid() {
+        return timeid;
+    }
+
+    public void setTimeid(Integer timeid) {
+        this.timeid = timeid;
+    }
+    @Column(name = "state")
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+    @Column(name = "status")
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @Column(name = "remark")
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+    @Column(name = "oldstate")
+    public Integer getOldstate() {
+        return oldstate;
+    }
+
+    public void setOldstate(Integer oldstate) {
+        this.oldstate = oldstate;
+    }
+    @Column(name = "operid")
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+    @Column(name = "updatetime")
+    public String getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(String updatetime) {
+        this.updatetime = updatetime;
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TClassCust.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TClassCust.java
new file mode 100644
index 0000000..493391f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TClassCust.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name="t_class_cust")
+@IdClass(ClassId.class)
+public class TClassCust {
+    private Integer classid;
+    private String custid;
+    private String attedate;
+
+    @Column(name="classid")
+    public Integer getClassid() {
+        return classid;
+    }
+
+    public void setClassid(Integer classid) {
+        this.classid = classid;
+    }
+    @Id
+    @Column(name="custid")
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+    @Column(name="attedate")
+    public String getAttedate() {
+        return attedate;
+    }
+
+    public void setAttedate(String attedate) {
+        this.attedate = attedate;
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TDevCusttype.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TDevCusttype.java
new file mode 100644
index 0000000..42563d6
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TDevCusttype.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import org.springframework.data.repository.cdi.Eager;
+
+import javax.persistence.*;
+
+@Entity
+@IdClass(CustDev.class)
+@Table(name="t_dev_rule")
+public class TDevCusttype {
+    private Integer ruleid;
+    private Integer deviceid;
+    @Id
+    @Column(name="ruleid")
+    public Integer getRuleid() {
+        return ruleid;
+    }
+
+    public void setRuleid(Integer ruleid) {
+        this.ruleid = ruleid;
+    }
+
+    @Id
+    @Column(name="deviceid")
+    public Integer getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(Integer deviceid) {
+        this.deviceid = deviceid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TSeaCusttype.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TSeaCusttype.java
new file mode 100644
index 0000000..36b84e8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TSeaCusttype.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="t_sea_custtype")
+public class TSeaCusttype {
+    private Integer custtypeid;
+    private Integer id;
+    private String updatetime;
+
+    @Id
+    @Column(name = "custtypeid", unique = true, nullable = false)
+    public Integer getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(Integer custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+    @Column(name="id")
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+    @Column(name="updatetime")
+    public String getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(String updatetime) {
+        this.updatetime = updatetime;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/domain/TSeason.java b/src/main/java/com/supwisdom/dlpay/atte/domain/TSeason.java
new file mode 100644
index 0000000..7cea29a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/domain/TSeason.java
@@ -0,0 +1,86 @@
+package com.supwisdom.dlpay.atte.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+@Entity
+@Table(name="t_atte_rule")
+public class TSeason implements Serializable {
+    private Integer id;
+    private String season;
+    private Integer weekid;
+    private Integer status;
+    private String addtime;
+    private String updatetime;
+    private Integer custtypeid;
+    private String deptcode;
+
+    @Id
+    @Column(name = "id", unique = true, nullable = false)
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+    @Column(name = "rulename")
+    public String getSeason() {
+        return season;
+    }
+
+    public void setSeason(String season) {
+        this.season = season;
+    }
+    @Column(name = "weekid",  nullable = false)
+    public Integer getWeekid() {
+        return weekid;
+    }
+
+    public void setWeekid(Integer weekid) {
+        this.weekid = weekid;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+    @Column(name = "addtime")
+    public String getAddtime() {
+        return addtime;
+    }
+
+    public void setAddtime(String addtime) {
+        this.addtime = addtime;
+    }
+    @Column(name = "updatetime")
+    public String getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(String updatetime) {
+        this.updatetime = updatetime;
+    }
+    @Column(name="custtypeid")
+    public Integer getCusttypeid() {
+        return custtypeid;
+    }
+
+    public void setCusttypeid(Integer custtypeid) {
+        this.custtypeid = custtypeid;
+    }
+    @Column(name="deptcode")
+    public String getDeptcode() {
+        return deptcode;
+    }
+
+    public void setDeptcode(String deptcode) {
+        this.deptcode = deptcode;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/AtteClassService.java b/src/main/java/com/supwisdom/dlpay/atte/service/AtteClassService.java
new file mode 100644
index 0000000..5442097
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/AtteClassService.java
@@ -0,0 +1,78 @@
+package com.supwisdom.dlpay.atte.service;
+
+import com.supwisdom.dlpay.atte.bean.AtteDtl;
+import com.supwisdom.dlpay.atte.bean.AttedtlSearchBean;
+import com.supwisdom.dlpay.atte.domain.TAtteClass;
+import com.supwisdom.dlpay.atte.domain.TAtteDtl;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+
+public interface AtteClassService {
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getClassWithPage(String classname,String deptcode, int pageNo, int pageSize);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TAtteClass getClassById(Integer classid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean saveAtteClass(TAtteClass atteClass);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TAtteClass getClassByName(String classname);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public int getMaxClassid();
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean canAddClass(String deptcode,int workorno,String startdate,String enddate,int exceptid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateClass(TAtteClass atteClass);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<TCustomerInfo> hasClassCust(Integer classid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<TCustomerInfo> getAllCustomer(String perName, String deptcode, String custtypeid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean addClassCust(Integer classid,List<String> custidlist);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean deleteAtteClass(Integer classid);
+
+    //生成考勤名单  attedate
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean createAtteDtl(String attedate,String deptcode);
+
+    //查询考勤明细信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getAtteDtlInfoWithPage(AttedtlSearchBean searchBean,int pageNo,int pageSize);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateAtteDtl(TAtteDtl dtl);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TAtteDtl getDtlByAtteno(String atteno);
+
+    //批量生产考勤名单
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean addBatchDtl(String startdate,String enddate,String deptcode);
+
+    //查询考勤流水信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getDtlWithPage(AttedtlSearchBean searchBean,int pageNo,int pageSize);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<AtteDtl> getDtlList(AttedtlSearchBean searchBean);
+
+    //处理考勤流水
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean handleDtl(String deptcode,String attedate);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/CustseaService.java b/src/main/java/com/supwisdom/dlpay/atte/service/CustseaService.java
new file mode 100644
index 0000000..20910a8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/CustseaService.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.atte.service;
+
+import com.supwisdom.dlpay.atte.domain.TSeaCusttype;
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface CustseaService {
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getCustseaWithPage(String custtypename, int pageNo, int pageSize);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TSeaCusttype getCustseaById(Integer custtypeid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateCustsea(TSeaCusttype tSeaCusttype);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean saveCustsea(TSeaCusttype tSeaCusttype);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean exist(Integer custtypeid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<TNcDevice> getAllCanAssign(Integer ruleid,String devname,String devtype);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<TNcDevice> getAllDevByCusttype(Integer ruleid);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public void assignDevRule(String ids,String ruleid);
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/SeasonService.java b/src/main/java/com/supwisdom/dlpay/atte/service/SeasonService.java
new file mode 100644
index 0000000..63d6202
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/SeasonService.java
@@ -0,0 +1,43 @@
+package com.supwisdom.dlpay.atte.service;
+
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface SeasonService {
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getSeasonWithPage(String season,String deptcode,int pageNo, int pageSize);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TSeason getSeasonById(Integer id);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TSeason findBySeason(String season);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean saveSeason(TSeason season);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public int getMaxSeasonId();
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TSeason findSeasonByIdAndName(Integer id,String season);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateSeason(TSeason season);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean deleteSeason(int id);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<TSeason> findAllSeason();
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean stoporopen(Integer id);
+
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TSeason getOpenRule(String custtypeid,String deptcode);
+}
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
new file mode 100644
index 0000000..02ae69b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/impl/AtteClassServiceImpl.java
@@ -0,0 +1,380 @@
+package com.supwisdom.dlpay.atte.service.impl;
+
+import com.supwisdom.dlpay.atte.bean.AtteDtl;
+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.CustseaDao;
+import com.supwisdom.dlpay.atte.dao.SeasonDao;
+import com.supwisdom.dlpay.atte.domain.*;
+import com.supwisdom.dlpay.atte.service.AtteClassService;
+import com.supwisdom.dlpay.doorlist.bean.TCustomerInfo;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.mainservice.dao.CustomerDao;
+import com.supwisdom.dlpay.ncmgr.dao.NcTimeDao;
+import com.supwisdom.dlpay.ncmgr.dao.NcTimeGrpDao;
+import com.supwisdom.dlpay.ncmgr.dao.NcWeekTimeDao;
+import com.supwisdom.dlpay.ncmgr.domain.TNcTime;
+import com.supwisdom.dlpay.ncmgr.domain.TNcTimegrp;
+import com.supwisdom.dlpay.ncmgr.domain.TNcWeektime;
+import com.supwisdom.dlpay.system.domain.TCustType;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.SystemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class AtteClassServiceImpl implements AtteClassService {
+    @Autowired
+    AtteClassDao atteClassDao;
+    @Autowired
+    CustomerDao customerDao;
+    @Autowired
+    CustseaDao custseaDao;
+    @Autowired
+    SeasonDao seasonDao;
+    @Autowired
+     NcTimeGrpDao ncTimeGrpDao;
+    @Autowired
+     NcWeekTimeDao ncWeekTimeDao;
+    @Autowired
+    NcTimeDao ncTimeDao;
+    @Autowired
+    private SystemService systemService;
+
+    @Override
+    public Pagination getClassWithPage(String classname,String deptcode, int pageNo, int pageSize) {
+        return atteClassDao.getClassWithPage(classname,deptcode,pageNo,pageSize);
+    }
+
+    @Override
+    public TAtteClass getClassById(Integer classid) {
+        return atteClassDao.getClassById(classid);
+    }
+
+    @Override
+    public boolean saveAtteClass(TAtteClass atteClass) {
+        return atteClassDao.saveAtteClass(atteClass);
+    }
+
+    @Override
+    public TAtteClass getClassByName(String classname) {
+        return atteClassDao.getClassByName(classname);
+    }
+
+    @Override
+    public int getMaxClassid() {
+        return atteClassDao.getMaxClassid();
+    }
+
+    @Override
+    public boolean canAddClass(String deptcode,int workorno, String startdate, String enddate,int exceptid) {
+        if(StringUtil.isEmpty(startdate)||StringUtil.isEmpty(enddate)){
+            return false;
+        }
+        if(atteClassDao.existClass(deptcode,startdate,enddate,workorno,exceptid)){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public boolean updateClass(TAtteClass atteClass) {
+        return atteClassDao.updateClass(atteClass);
+    }
+
+    @Override
+    public List<TCustomerInfo> hasClassCust(Integer classid) {
+        if(classid==null){
+            return null;
+        }
+        return atteClassDao.hasClassCust(classid);
+    }
+
+    @Override
+    public List<TCustomerInfo> getAllCustomer(String perName, String deptcode, String custtypeid) {
+        CustSearchBean searchBean=new CustSearchBean();
+        searchBean.setCusttypeid(custtypeid);
+        searchBean.setDeptcode(deptcode);
+        searchBean.setCustname(perName);
+        return atteClassDao.getCustInfo(searchBean);
+    }
+
+    @Override
+    public boolean addClassCust(Integer classid, List<String> custidlist) {
+            TAtteClass atteClass=getClassById(classid);
+            if(atteClass==null){
+                return false;
+            }
+            atteClassDao.delClassCustByClassid(classid);
+            String sdate=atteClass.getStartdate();
+            String edate=atteClass.getEnddate();
+            Integer start=Integer.parseInt(sdate);
+            Integer end=Integer.parseInt(edate);
+            while (start<=end){
+                for (String custid:custidlist){
+                    TClassCust oldbean=atteClassDao.getByIdAndDate(custid,sdate);
+                    if(oldbean!=null){
+                        atteClassDao.delClassCust(oldbean);
+                    }
+                    TClassCust newbean=new TClassCust();
+                    newbean.setClassid(classid);
+                    newbean.setAttedate(sdate);
+                    newbean.setCustid(custid);
+                    atteClassDao.addClassCust(newbean);
+                }
+                sdate= DateUtil.getNewDay(sdate,1);
+                start=Integer.parseInt(sdate);
+            }
+            atteClass.setUpdatetime(DateUtil.getNow());
+            atteClassDao.updateClass(atteClass);
+        return true;
+    }
+
+    @Override
+    public boolean deleteAtteClass(Integer classid) {
+        TAtteClass atteClass=atteClassDao.getClassById(classid);
+        if(atteClass==null){
+            return false;
+        }
+        atteClass.setStatus(0); // 1-正常 0-删除
+        atteClass.setUpdatetime(DateUtil.getNow());
+        atteClassDao.updateClass(atteClass); //删除班次
+        atteClassDao.delClassCustByClassid(classid); //删除班次绑定的人员
+        return true;
+    }
+
+
+    /**
+     *   生成考勤人员名单
+     */
+
+    @Override
+    public boolean createAtteDtl(String attedate,String deptcode) {
+      if(StringUtil.isEmpty(attedate)){
+          return false;
+      }
+      //删除原流水
+        atteClassDao.delAtteDtl(attedate,deptcode);
+        CustSearchBean searchBean=new CustSearchBean();
+        searchBean.setDeptcode(deptcode);
+        searchBean.setAttedate(attedate);
+        // 获取考勤人员
+        List<TCustomerInfo> custlist=atteClassDao.getAtteCust(searchBean);
+
+        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());
+            for(Integer timeid:map.keySet()){
+                if(timeid!=null){
+                    TAtteDtl dtl=new TAtteDtl();
+                    dtl.setAttedate(attedate);
+                    dtl.setAtteno(atteClassDao.getAtteNo(attedate));
+                    dtl.setCustid(cust.getCustid());
+                    dtl.setState(0);
+                    dtl.setStatus(1);
+                    dtl.setTimeid(timeid);
+                    dtl.setUpdatetime(DateUtil.getNow());
+                    atteClassDao.saveAtteDtl(dtl);
+                }
+            }
+
+        }
+        return true;
+    }
+
+    private Integer getTimegrp(TCustomerInfo cust,String attedate){
+        Integer timegrpid=null;
+        if(cust.getCusttypeid()==null||StringUtil.isEmpty(cust.getDeptcode())){
+            return timegrpid;
+        }
+        TSeason season=seasonDao.getOpenRule(cust.getCusttypeid(),cust.getDeptcode());
+        if(season==null&&season.getWeekid()==null){
+            return timegrpid;
+        }
+        TNcWeektime weektime=ncWeekTimeDao.findByWeekTimeId(season.getWeekid());
+        if(weektime==null){
+            return timegrpid;
+        }
+        int weekday=DateUtil.getWeekday(attedate);
+        switch (weekday){
+            case 1:
+                timegrpid=weektime.getDay1grpid();
+                break;
+            case 2:
+                timegrpid=weektime.getDay2grpid();
+                break;
+            case 3:
+                timegrpid=weektime.getDay3grpid();
+                break;
+            case 4:
+                timegrpid=weektime.getDay4grpid();
+                break;
+            case 5:
+                timegrpid=weektime.getDay5grpid();
+                break;
+            case 6:
+                timegrpid=weektime.getDay6grpid();
+                break;
+            case 7:
+                timegrpid=weektime.getDay7grpid();
+                break;
+            default:
+                timegrpid=0;
+                    break;
+        }
+        return timegrpid;
+
+    }
+
+    /**   HHmmss
+     *  获取时差 （min）
+     *
+     */
+    public int getDiffMin(String starttime,String endtime){
+        String stime=DateUtil.getNow("yyyyMMdd")+starttime;
+        String etime=DateUtil.getNow("yyyyMMdd")+endtime;
+        long diff=DateUtil.getInterval(stime,etime); // 毫秒
+        int min= (int) (diff/(1000*60));
+            return min;
+    }
+
+    @Override
+    public Pagination getAtteDtlInfoWithPage(AttedtlSearchBean searchBean, int pageNo, int pageSize) {
+        return atteClassDao.getAttedtlWithPage(searchBean,pageNo,pageSize);
+    }
+
+    @Override
+    public boolean updateAtteDtl(TAtteDtl dtl) {
+        return atteClassDao.updateAtteDtl(dtl);
+    }
+
+    @Override
+    public TAtteDtl getDtlByAtteno(String atteno) {
+        return atteClassDao.getDtlByAtteno(atteno);
+    }
+
+
+    @Override
+    public boolean addBatchDtl(String startdate, String enddate, String deptcode) {
+        Integer start=Integer.parseInt(startdate);
+        Integer end=Integer.parseInt(enddate);
+        while (start<=end){
+            createAtteDtl(startdate,deptcode);
+            startdate= DateUtil.getNewDay(startdate,1);
+            start=Integer.parseInt(startdate);
+        }
+        return true;
+    }
+
+    @Override
+    public Pagination getDtlWithPage(AttedtlSearchBean searchBean, int pageNo, int pageSize) {
+        return atteClassDao.getDtlWithPage(searchBean,pageNo,pageSize);
+    }
+
+    @Override
+    public List<AtteDtl> getDtlList(AttedtlSearchBean searchBean) {
+        return atteClassDao.getDtlList(searchBean);
+    }
+
+    @Override
+    public boolean handleDtl(String deptcode, String attedate) {
+        AttedtlSearchBean searchBean=new AttedtlSearchBean();
+        searchBean.setDeptcode(deptcode);
+        searchBean.setStartdate(attedate);
+        searchBean.setEnddate(attedate);
+        List<AtteDtl> list=atteClassDao.getDtlList(searchBean);
+        for(AtteDtl dtl:list){
+          List<TAtteDtl> details=atteClassDao.getDetailList(dtl.getCustid(),attedate) ;
+           if(details!=null){
+               for(TAtteDtl detail:details){
+                int state=getState(detail.getTimeid(),dtl.getAttetime());
+                if(detail.getState()==0){
+                    detail.setState(state);
+                    detail.setUpdatetime(DateUtil.getNow());
+                    atteClassDao.updateAtteDtl(detail);
+                }else if(detail.getState()==2&&state==1){
+                    detail.setState(state);
+                    detail.setUpdatetime(DateUtil.getNow());
+                    atteClassDao.updateAtteDtl(detail);
+                }
+               }
+           }
+        }
+        return true;
+    }
+
+    // 判断流水状态 0-未打卡 1-正常 2-迟到/早退 3-请假
+    public int getState(Integer timeid,String attetime){
+        int flag=0;
+        TNcTime time=ncTimeDao.findByTimeId(timeid);
+        if(time==null){
+            return flag;
+        }
+        String btime=time.getBtime().replace(":","")+"00";
+        String etime=time.getEtime().replace(":","")+"00";
+        int bmin=getDiffMin(attetime,btime);
+        int emin=getDiffMin(attetime,etime);
+        if(time.getTimetype()==1){   //考到
+             if(bmin>0){  //
+                 flag=0;
+             }else {
+                 if(emin>0){
+                     flag=1;
+                 }else if(emin>-60){
+                     flag=2;
+                 }else{
+                     flag=0;
+                 }
+             }
+        }else if(time.getTimetype()==2){ //考离
+            if(bmin>60){
+                flag=0;
+            }else if(bmin<60&&bmin>0){
+                flag=2;
+            }else if(bmin<0&&emin>0){
+                flag=1;
+            }else{
+                flag=0;
+            }
+        }else{
+            if(bmin<0&&emin>0){
+                flag=1;
+            }else{
+                flag=0;
+            }
+        }
+        return flag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/impl/CustseaServiceImpl.java b/src/main/java/com/supwisdom/dlpay/atte/service/impl/CustseaServiceImpl.java
new file mode 100644
index 0000000..ca77501
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/impl/CustseaServiceImpl.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.atte.service.impl;
+
+import com.supwisdom.dlpay.atte.dao.CustseaDao;
+import com.supwisdom.dlpay.atte.domain.TDevCusttype;
+import com.supwisdom.dlpay.atte.domain.TSeaCusttype;
+import com.supwisdom.dlpay.atte.service.CustseaService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+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 CustseaServiceImpl implements CustseaService {
+    @Autowired
+    CustseaDao custseaDao;
+    @Override
+    public Pagination getCustseaWithPage(String custtypename, int pageNo, int pageSize) {
+        return custseaDao.getCustseaWithPage(custtypename,pageNo,pageSize);
+    }
+
+    @Override
+    public TSeaCusttype getCustseaById(Integer custtypeid) {
+        return custseaDao.getCustseaById(custtypeid);
+    }
+
+    @Override
+    public boolean updateCustsea(TSeaCusttype tSeaCusttype) {
+        return custseaDao.updateCustsea(tSeaCusttype);
+    }
+
+    @Override
+    public boolean saveCustsea(TSeaCusttype tSeaCusttype) {
+        return custseaDao.saveCustsea(tSeaCusttype);
+    }
+
+    @Override
+    public boolean exist(Integer  custtypeid) {
+        return custseaDao.exist(custtypeid);
+    }
+
+    @Override
+    public List<TNcDevice> getAllCanAssign(Integer ruleid,String devname,String devtype) {
+        return custseaDao.getAllCanAssign(ruleid,devname,devtype);
+    }
+
+    @Override
+    public List<TNcDevice> getAllDevByCusttype(Integer ruleid) {
+        return custseaDao.getAllDevByCusttype(ruleid);
+    }
+
+    @Override
+    public void assignDevRule(String ids, String ruleid) {
+            if(custseaDao.deleteDevRuleid(Integer.parseInt(ruleid))){
+                if(!StringUtil.isEmpty(ids)){
+
+                    String[] strs=ids.split(",");
+                    for(String id:strs){
+                        if (!StringUtil.isEmpty(id)) {
+                            TDevCusttype custdev=new TDevCusttype();
+                            custdev.setRuleid(Integer.parseInt(ruleid));
+                            custdev.setDeviceid(Integer.parseInt(id));
+                            custseaDao.addDevRuleid(custdev);
+                        }
+                    }
+                }
+            }
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/service/impl/SeasonServiceImpl.java b/src/main/java/com/supwisdom/dlpay/atte/service/impl/SeasonServiceImpl.java
new file mode 100644
index 0000000..0eef3c8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/service/impl/SeasonServiceImpl.java
@@ -0,0 +1,91 @@
+package com.supwisdom.dlpay.atte.service.impl;
+
+import com.supwisdom.dlpay.atte.dao.SeasonDao;
+import com.supwisdom.dlpay.atte.domain.TSeason;
+import com.supwisdom.dlpay.atte.service.SeasonService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+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 SeasonServiceImpl implements SeasonService {
+    @Autowired
+    SeasonDao seasonDao;
+
+    @Override
+    public Pagination getSeasonWithPage(String season,String deptcode ,int pageNo, int pageSize) {
+        return seasonDao.getSeasonWithPage(season,deptcode,pageNo,pageSize);
+    }
+
+    @Override
+    public TSeason getSeasonById(Integer id) {
+
+        return seasonDao.getSeasonById(id);
+    }
+
+    @Override
+    public TSeason findBySeason(String season) {
+        return seasonDao.findBySeason(season);
+    }
+
+    @Override
+    public boolean saveSeason(TSeason season) {
+        return seasonDao.saveSeason(season);
+    }
+
+    @Override
+    public int getMaxSeasonId() {
+
+        return seasonDao.getMaxSeasonId();
+    }
+
+    @Override
+    public TSeason findSeasonByIdAndName(Integer id, String season) {
+        return seasonDao.getSeasonByIdAndName(id,season);
+    }
+
+    @Override
+    public boolean updateSeason(TSeason season) {
+        return seasonDao.updateSeason(season);
+    }
+
+    @Override
+    public boolean deleteSeason(int id) {
+        return seasonDao.deleteSeason(id);
+    }
+
+    @Override
+    public List<TSeason> findAllSeason() {
+        return seasonDao.findAllSeason();
+    }
+
+    @Override
+    public boolean stoporopen(Integer id) {
+        TSeason season=seasonDao.getSeasonById(id);
+        if(season==null){
+            return false;
+        }
+        season.setUpdatetime(DateUtil.getNow());
+        if(season.getStatus()==1){
+            season.setStatus(2); //停用
+        }else{
+            TSeason open=seasonDao.getOpenRule(season.getCusttypeid()+"",season.getDeptcode());
+            if(open!=null){
+                open.setStatus(2);
+                open.setUpdatetime(DateUtil.getNow());
+                seasonDao.updateSeason(open);
+            }
+            season.setStatus(1); //启用
+        }
+        seasonDao.updateSeason(season);
+        return true;
+    }
+
+    @Override
+    public TSeason getOpenRule(String custtypeid, String deptcode) {
+        return seasonDao.getOpenRule(custtypeid,deptcode);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java b/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java
new file mode 100644
index 0000000..626b098
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/atte/task/CreateAtteDtlTask.java
@@ -0,0 +1,53 @@
+package com.supwisdom.dlpay.atte.task;
+
+import com.supwisdom.dlpay.atte.service.AtteClassService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.task.SyncCustomerTask;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+@Configuration      //1.主要用于标记配置类，兼备Component的效果。
+@EnableScheduling   // 2.开启定时任务
+public class CreateAtteDtlTask implements ApplicationRunner {
+    protected static Logger logger = LoggerFactory.getLogger(CreateAtteDtlTask.class);
+    @Autowired
+    AtteClassService atteClassService;
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+
+    }
+
+    @Scheduled(cron = "${atte.create.dtl}")//每天一点生成流水
+    public void createAtteDtl(){
+
+        String attedate= null;
+        try {
+            String now = DateUtil.getNow();
+            logger.info("时间:" + now + "--生成考勤名单");
+            attedate = DateUtil.getNow("yyyyMMdd");
+            atteClassService.createAtteDtl(attedate,null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    @Scheduled(cron = "${atte.refresh.dtl}")//每十分钟刷新一次考勤状态
+    public void refreshAtteDtl(){
+        try {
+            String now = DateUtil.getNow();
+            logger.info("时间:" + now + "--刷新考勤状态");
+          String  attedate = DateUtil.getNow("yyyyMMdd");
+            atteClassService.handleDtl(null,attedate);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java b/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java
index cc51b13..786c5d2 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java
@@ -5,6 +5,7 @@
 	private String timename;
 	private String btime;
 	private String etime;
+	private Integer timetype;
 	public String getTimename() {
 		return timename;
 	}
@@ -29,5 +30,13 @@
 	public void setEtime(String etime) {
 		this.etime = etime;
 	}
+
+	public Integer getTimetype() {
+		return timetype;
+	}
+
+	public void setTimetype(Integer timetype) {
+		this.timetype = timetype;
+	}
 }
 
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
index 6b014f8..7b64d26 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -567,6 +567,7 @@
                 ts.setTimename(postData.getTimename());
                 ts.setBtime(postData.getBtime());
                 ts.setEtime(postData.getEtime());
+                ts.setTimetype(postData.getTimetype());
                 ts.setOperflag("A");
                 ts.setSyncflag("");
                 ts.setUpdtime(DateUtil.getNow());
@@ -611,6 +612,7 @@
             time.setTimename(bean.getTimename());
             time.setBtime(bean.getBtime());
             time.setEtime(bean.getEtime());
+            time.setTimetype(bean.getTimetype());
             time.setOperflag("A");//操作标记  A：添加   D：删除
             time.setSyncflag("");
             time.setUpdtime(DateUtil.getNow());
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java
index 12bb210..4e2e2aa 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java
@@ -22,6 +22,7 @@
 	private String syncflag;
 	private String synctime;
 	private String updtime;
+	private Integer timetype;
 
 	// Constructors
 
@@ -121,4 +122,12 @@
 		this.updtime = updtime;
 	}
 
+	@Column(name = "timetype")
+	public Integer getTimetype() {
+		return timetype;
+	}
+
+	public void setTimetype(Integer timetype) {
+		this.timetype = timetype;
+	}
 }
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 16d3b2b..038d33c 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -45,6 +45,8 @@
 sync.cardStatus.cron=0 0/10 * * * ?
 apiLogin.refresh.cron=0 0/20 * * * ?
 
+atte.create.dtl=0 0 1 * * ?
+atte.refresh.dtl=0 0/10 * * * ?
 spring.redis.database=2
 
 
diff --git a/src/main/resources/templates/atte/app/appindex.html b/src/main/resources/templates/atte/app/appindex.html
new file mode 100644
index 0000000..750467b
--- /dev/null
+++ b/src/main/resources/templates/atte/app/appindex.html
@@ -0,0 +1,189 @@
+<!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="block" style="background:#ffffff";>
+                <br>
+                <span class="demonstration" style="text-align: center;display:block; font-size: 20px;color: #9932CC">选择请假日期</span><br><br>
+                    <!--动态将图片轮播图的容器高度设置成与图片一致-->
+                <el-form ref="dateDiaForm" style="text-align: center;display:block;" :model="dateDiaForm"  label-width="36%">
+                    <el-form-item label="开始日期:" prop="startdate">
+                        <el-col :span="18">
+                            <el-date-picker
+                                    v-model="dateDiaForm.startdate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="结束日期:" prop="enddate">
+                        <el-col :span="18">
+                            <el-date-picker
+                                    v-model="dateDiaForm.enddate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </el-col>
+                    </el-form-item>
+                </el-form>
+                    <el-button type="success" @click="openDoor" style=" display:block;margin:0 auto;width:100px;height:100px;border-radius:50px;border:solid rgb(100,100,100) 0px; font-size: 20px" >申请</el-button>
+            </div>
+
+        </div>
+
+</body>
+
+<script>
+    var app1_vue = new Vue({
+        el:'#app1',
+        data:{
+            devNameList: [],
+            devIdList:[],
+            selectDevName:'',
+            selectDevId:'',
+            // 图片父容器高度
+            bannerHeight :1000,
+            // 浏览器宽度
+            screenWidth :0,
+            userId:'',
+            dateDiaForm:{
+                startdate:'',
+                enddate:''
+            }
+        },
+
+        methods:{
+            indexChange: function (pre, next) {
+                var _self = this;
+                var devIdListTmp = _self.devIdList;
+                _self.selectDevId=devIdListTmp[pre];
+                // console.log(_self.selectDevId)
+
+            },
+            openDoor:function () {
+                var devId = app1_vue.selectDevId;
+                app_openDoor(devId);
+            },
+            setSize:function () {
+                // 通过浏览器宽度(图片宽度)计算高度
+                this.bannerHeight =  this.screenWidth;
+            },
+        },
+        created:function(){
+            var _self = this;
+            // 首次加载时,需要调用一次
+            _self.screenWidth =  window.innerWidth;
+            _self.setSize();
+
+            var userId='[[${userId}]]';
+            _self.userId = userId;
+
+            // $.ajax({
+            //     type: "get",
+            //     dataType: "json",
+            //     url: "[[@{/app/loadAppDevList?userId=}]]"+userId,
+            //     success: function (ret) {
+            //         var ut = ret.devList;
+            //         if (ut == null){
+            //             confirm("不具有开门权限");
+            //         }
+            //         var names = [];
+            //         var ids = [];
+            //         for (var i = 0; i < ut.length; i++) {
+            //             names.push(ut[i].devname);
+            //             ids.push(ut[i].deviceid);
+            //         }
+            //         _self.devNameList = names;
+            //         _self.devIdList= ids;
+            //
+            //     }
+            // })
+        }
+
+    })
+
+    function app_openDoor(devId) {
+        var userId = app1_vue.userId;
+        console.log(userId);
+        layer.confirm('你确定要开启此门吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url:encodeURI("[[@{/app/openDoorById?devId=}]]"+devId+"&userId="+userId),
+                success:function (ret) {
+                    if (ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录',{icon: 2,time:1000});
+                        window.location = "[[@{/login}]]";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 2000});
+                    } else {
+                        layer.msg('开门成功', {icon: 1, time: 2000});
+                    }
+                }
+            })
+        });
+
+    }
+
+    // 窗口大小发生改变时,调用一次
+    window.onresize = function(){
+        app1_vue.screenWidth =  window.innerWidth;
+        app1_vue.setSize();
+    }
+
+
+
+
+</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/test.html b/src/main/resources/templates/atte/app/test.html
new file mode 100644
index 0000000..95d8a7c
--- /dev/null
+++ b/src/main/resources/templates/atte/app/test.html
@@ -0,0 +1,168 @@
+<!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="block" style="background:#ffffff;">
+                <br>
+                <span class="demonstration" style="text-align: center;display:block; font-size: 20px;color: #9932CC">选择要开门的设备</span><br><br>
+                    <!--动态将图片轮播图的容器高度设置成与图片一致-->
+
+                    <el-button type="success" @click="openDoor" style=" display:block;margin:0 auto;width:100px;height:100px;border-radius:50px;border:solid rgb(100,100,100) 0px; font-size: 20px" >开门</el-button>
+            </div>
+
+        </div>
+
+</body>
+
+<script>
+    var app1_vue = new Vue({
+        el:'#app1',
+        data:{
+            devNameList: [],
+            devIdList:[],
+            selectDevName:'',
+            selectDevId:'',
+            // 图片父容器高度
+            bannerHeight :1000,
+            // 浏览器宽度
+            screenWidth :0,
+            userId:''
+        },
+
+        methods:{
+            indexChange: function (pre, next) {
+                var _self = this;
+                var devIdListTmp = _self.devIdList;
+                _self.selectDevId=devIdListTmp[pre];
+                // console.log(_self.selectDevId)
+
+            },
+            openDoor:function () {
+                var devId = app_vue.selectDevId;
+                app_openDoor(devId);
+            },
+            setSize:function () {
+                // 通过浏览器宽度(图片宽度)计算高度
+                this.bannerHeight =  this.screenWidth;
+            },
+        },
+        created:function(){
+            var _self = this;
+            // 首次加载时,需要调用一次
+            _self.screenWidth =  window.innerWidth;
+            _self.setSize();
+
+            var userId='[[${userId}]]';
+            _self.userId = userId;
+
+            // $.ajax({
+            //     type: "get",
+            //     dataType: "json",
+            //     url: "[[@{/app/loadAppDevList?userId=}]]"+userId,
+            //     success: function (ret) {
+            //         var ut = ret.devList;
+            //         if (ut == null){
+            //             confirm("不具有开门权限");
+            //         }
+            //         var names = [];
+            //         var ids = [];
+            //         for (var i = 0; i < ut.length; i++) {
+            //             names.push(ut[i].devname);
+            //             ids.push(ut[i].deviceid);
+            //         }
+            //         _self.devNameList = names;
+            //         _self.devIdList= ids;
+            //
+            //     }
+            // })
+        }
+
+    })
+
+    function app_openDoor(devId) {
+        var userId = app_vue.userId;
+        console.log(userId);
+        layer.confirm('你确定要开启此门吗?',{icon: 3,title: '请确认',offset: '30%'},function (index) {
+            $.ajax({
+                type: "get",
+                dataType: "json",
+                url:encodeURI("[[@{/app/openDoorById?devId=}]]"+devId+"&userId="+userId),
+                success:function (ret) {
+                    if (ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录',{icon: 2,time:1000});
+                        window.location = "[[@{/login}]]";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 2000});
+                    } else {
+                        layer.msg('开门成功', {icon: 1, time: 2000});
+                    }
+                }
+            })
+        });
+
+    }
+
+    // 窗口大小发生改变时,调用一次
+    window.onresize = function(){
+        app_vue.screenWidth =  window.innerWidth;
+        app_vue.setSize();
+    }
+
+
+
+
+</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/class/index.html b/src/main/resources/templates/atte/class/index.html
new file mode 100644
index 0000000..c27fc99
--- /dev/null
+++ b/src/main/resources/templates/atte/class/index.html
@@ -0,0 +1,938 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">考勤排班</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">人员考勤</a>
+          <a><cite>考勤排班</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body" >
+      <div id="classapp">
+         <div id="classdiv" >
+            <el-form :inline="true" ref="classform" :model="classform" data-parsley-validate class="form-horizontal form-label-left">
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">班次名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="classform.classname"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div    class="col-md-3">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="custsea_qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="addClass">添加班次</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        border
+                        max-height="2000"
+                        style="width: 100%">
+                    <el-table-column
+                            prop="classid"
+                            label="ID"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="classname"
+                            label="班次名称"
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="workorno"
+                            label="班次类别"
+                            :formatter="classtypefor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="deptcode"
+                            label="部门"
+                            :formatter="deptfor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="timegrpid"
+                            label="时间组"
+                            :formatter="timefor">
+
+                    </el-table-column>
+                    <el-table-column
+                            prop="startdate"
+                            label="开始日期"
+                            :formatter="startdatefor"
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="enddate"
+                            label="结束日期"
+                            :formatter="enddatefor"
+                           >
+                    </el-table-column>
+
+                    <el-table-column
+                            label="操作"
+                           >
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="编辑" @click="editClass(scope.row.classid)">编辑</button>
+                            <button type="button" class="btn btn-danger btn-xs" @click="delClass(scope.row.classid)" title="删除" >删除</button>
+                            <button type="button" class="btn btn-danger btn-xs" @click="assignCust(scope.row.classid)" title="添加人员" >添加人员</button>
+                        </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>
+
+            <!--添加修改班次-->
+            <el-dialog :title="classtitle" :visible.sync="dialogFormVisible" top="80px" size="tiny" :modal-append-to-body='false' @close="closeDialog('classDiaForm')">
+                <el-form ref="classDiaForm" class="el-form-item el-form-item--mini" :model="classDiaForm" size="mini" :rules="rules"  label-width="36%">
+                    <el-form-item label="班次名称:" prop="classname">
+                        <el-col :span="18">
+                            <el-input  v-model="classDiaForm.classname"   style="width: 187px;" maxlength="20">
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="班次类别:" prop="workorno">
+                        <el-col :span="18">
+                            <el-select v-model="classDiaForm.workorno" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="workorno in typegrplist"
+                                        :key="workorno.value"
+                                        :label="workorno.label"
+                                        :value="workorno.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item  label="部门:" prop="deptcode">
+                        <el-col :span="18">
+                            <el-select v-if=" oper.opertype == 'S' ||oper.opertype == 'P' "  v-model="classDiaForm.deptcode" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="deptcode in deptlist"
+                                        :key="deptcode.value"
+                                        :label="deptcode.label"
+                                        :value="deptcode.value">
+                                </el-option>
+                            </el-select>
+                            <el-input readonly v-if=" oper.opertype != 'S' && oper.opertype != 'P'" v-model="dept.deptname"     style="width: 187px;" maxlength="20">
+                            </el-input>
+
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="时间组:" prop="timegrpid">
+                        <el-col :span="18">
+                            <el-select v-model="classDiaForm.timegrpid" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="timegrpid in timelist"
+                                        :key="timegrpid.value"
+                                        :label="timegrpid.label"
+                                        :value="timegrpid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="开始日期:" prop="startdate">
+                        <el-col :span="18">
+                            <el-date-picker
+                                    v-model="classDiaForm.startdate" type="date" :picker-options="pickerOptions0"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="结束日期:" prop="enddate">
+                        <el-col :span="18">
+                            <el-date-picker
+                                    v-model="classDiaForm.enddate" type="date" :picker-options="pickerOptions1"
+                                    placeholder="选择日期" :editable="false" value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </el-col>
+                    </el-form-item>
+
+
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('classDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveClass('classDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </div>
+
+
+
+
+     <!--人员选择-->
+    <div id="assign_custSelect" style="display: none">
+        <div>
+            <el-form :inline="true" ref="devform" :model="person_person" data-parsley-validate
+                     class="form-horizontal form-label-left">
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">姓名:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="person_person.custname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <!--<div class="col-md-3" >-->
+                    <!--<div class="form-group">-->
+                        <!--<label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">部门:</span>-->
+                        <!--</label>-->
+                        <!--<div class="col-md-8 col-sm-12 col-xs-12">-->
+                            <!--<el-select v-model="person_person.deptcode"-->
+                                       <!--filterable-->
+                                       <!--clearable-->
+                                       <!--placeholder="请选择">-->
+                                <!--<el-option-->
+                                        <!--v-for="deptcode in deptlist"-->
+                                        <!--:key="deptcode.value"-->
+                                        <!--:label="deptcode.label"-->
+                                        <!--:value="deptcode.value">-->
+                                <!--</el-option>-->
+                            <!--</el-select>-->
+                        <!--</div>-->
+                    <!--</div>-->
+                <!--</div>-->
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">人员类别:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="person_person.custtypeid"
+                                       filterable
+                                       clearable
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="custtypeid in custtypelist"
+                                        :key="custtypeid.value"
+                                        :label="custtypeid.label"
+                                        :value="custtypeid.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-3" >
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="searchCust" id="cust_qrybtn">查 询</button>
+                    </div>
+                </div>
+            </el-form>
+
+        </div>
+
+
+
+
+
+        <div id="assign_devSel">
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md5" style="width: 45%">
+                    <div class="layui-card">
+                        <div class="layui-card-header" style="margin-bottom: 10px" v-if="person_lefttable">
+                            可分配人员({{person_lefttable.length}}人)
+                        </div>
+                        <div id="addDoorlist_pensonS-tb" class="layui-card-body">
+
+                            <template>
+                                <el-table
+                                        height="480"
+                                        ref="multipleTable"
+                                        :data="person_lefttable"
+                                        tooltip-effect="dark"
+                                        style="width: 100%;"
+                                        stripe
+                                        border
+                                        @selection-change="lefttableSelect">
+                                    <el-table-column
+                                            fixed
+                                            type="selection"
+                                           >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="cardno"
+                                            label="卡号"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="custname"
+                                            label="姓名"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            prop="bankcardno"
+                                            label="银行卡号"
+                                            >
+                                    </el-table-column>
+                                </el-table>
+                            </template>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="layui-col-md1" style="width: 10%">
+                    <div style="width:5%;height:400px;display:inline-block;padding:0;margin-left: 5px; float:left">
+                        <div style="position: absolute;top:55%;width:5%;padding:0;margin: 0;text-align: center;left: 28%">
+                            <el-button class="el-icon-d-arrow-right" :disabled="per_addBtn_dis" @click="person_addBtn"></el-button>
+                        </div>
+                        <div style="position: absolute;top:80%;width:5%;padding:0;margin: 0;text-align: center;left: 28%">
+                            <el-button class="el-icon-d-arrow-left" :disabled="per_delBtn_dis" @click="person_delBtn"></el-button>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="layui-col-md5" style="width: 45%">
+                    <div class="layui-card">
+
+                        <div class="layui-card-header" style="margin-bottom: 10px" v-if="person_righttable">
+                            已分配人员({{person_righttable.length}}人)
+                        </div>
+                        <div  class="layui-card-body">
+                            <template>
+                                <el-table
+                                        height="480"
+                                        ref="multipleTable"
+                                        :data="person_righttable"
+                                        tooltip-effect="dark"
+                                        style="width: 100%;"
+                                        stripe
+                                        border
+                                        @selection-change="rightTableSelect">
+                                    <el-table-column
+                                            fixed
+                                            type="selection"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="cardno"
+                                            label="卡号"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            sortable
+                                            prop="custname"
+                                            label="姓名"
+                                            >
+                                    </el-table-column>
+                                    <el-table-column
+                                            prop="bankcardno"
+                                            label="银行卡号"
+                                            >
+                                    </el-table-column>
+                                </el-table>
+                            </template>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-row layui-col-space15">
+            <div style="float:left;margin:0px 0 0 30%;"><el-button style="margin-top: 12px;" @click="prev_btn">返回</el-button></div>
+            <div style="float:left;margin:0px 0 0 10%;"><el-button style="margin-top: 12px;" @click="save_btn">保存</el-button></div>
+        </div>
+    </div>
+    </div>
+    </div>
+
+</div>
+
+<script>
+    var class_vue = new Vue({
+        el: '#classapp',
+        data:{
+            oper:'',
+            readonly:true,
+            dept:'',
+            tableData: [],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            sel_classid:'',
+            currentRow: null,
+            classform:{
+                classname:'',
+            },
+            person_person:{
+                custname:'',
+                custtypeid:'',
+                deptcode:''
+            },
+            devtypes:[],
+            typegrplist:[{value:1,label:'工作日'},{value:2,label:'节假日'},],
+            person_lefttable:[],
+            person_righttable:[],
+            custtypelist:[],
+            timelist:[],
+            deptlist:[],
+            leftTableSelection:[],
+            rightTableSelection:[],
+            per_addBtn_dis:true,
+            per_delBtn_dis:true,
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            classtitle:'添加班次',
+            classDiaForm:{
+                classid:'',
+                classname:'',
+                startdate:'',
+                enddate:'',
+                status:'',
+                workorno:'',
+                timegrpid:'',
+                deptcode:''
+            },
+            pickerOptions0: {
+                disabledDate:function(time) {
+                    return time.getTime() <Date.now();
+                }
+            },
+            pickerOptions1: {
+                disabledDate:function(time) {
+                    if(class_vue.classDiaForm.startdate !=''){
+
+                        return time.getTime() < class_vue.classDiaForm.startdate.getTime();
+                    }else {
+                        return time.getTime() < Date.now();
+                    }
+                }
+            },
+            rules:{
+                classname:[
+                    { required: true, message: '请输入班次名称', trigger: 'blur' },
+                    { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+                workorno:[
+                    { required: true, message: ' ',},
+                ],
+                timegrpid:[
+                    { required: true, message: ' '},
+                ],
+                startdate:[
+                    { required: true,message: ' ', },
+                ],
+                enddate:[
+                    { required: true ,message: ' ',},
+                ],
+                deptcode:[
+                    { required: true ,message: ' ',},
+                ],
+            },
+
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                class_commonQuery(this,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                class_commonQuery(this,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                class_commonQuery(this,this.currPage,this.pageSize);
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            saveClass:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    class_saveData(_that,formName);
+                }
+            },
+            editClass:function (id) {
+                class_getFillData(this,id);
+                this.dialogFormVisible = true;
+                this.classtitle="修改班次"
+            },
+            classtypefor:function (row) {
+
+                return classtype_grpname(row.workorno);
+            },
+            deptfor:function (row) {
+
+                return dept_grpname(row.deptcode);
+            },
+            timefor:function(row){
+                return timegrp_grpname(row.timegrpid);
+            },
+
+            startdatefor:function(row){
+                if(row.startdate != null) {
+                    return dateformatter(row.startdate);
+                }
+            },
+            enddatefor:function(row){
+                if(row.enddate != null) {
+                    return dateformatter(row.enddate);
+                }
+            },
+
+            assignCust:function(id){
+                this.sel_classid=id;
+                $("#classdiv").hide();
+                $("#assign_custSelect").show();
+                $("#cust_qrybtn").click();
+            },
+            searchCust:function(){
+                var that=this;
+                    addAllCustList(that);
+            },
+            lefttableSelect:function(val) {
+                //console.log(val);
+                this.leftTableSelection = val;
+                this.per_addBtn_dis=this.leftTableSelection<=0;
+            },
+            rightTableSelect:function(val) {
+                this.rightTableSelection = val;
+                this.per_delBtn_dis=this.rightTableSelection<=0;
+            },
+            person_addBtn:function(){
+                var _self=this;
+                var left=_self.leftTableSelection;
+                var right=[];
+                right=left.splice(0,left.length);
+                var dev={};
+                for(var i=0;i<right.length;i++){
+                    if($.inArray(right[i],_self.person_righttable)==-1) {
+                        _self.person_righttable.push(right[i]);
+                    }
+                }
+                var leftData=this.person_lefttable;
+                for(var i=0;i<right.length;i++){
+                    var s = $.inArray(right[i],leftData );
+                    if (s != -1) {
+                        leftData.splice(s, 1);
+                    }
+                }
+                this.per_addBtn_dis=true;
+            },
+            person_delBtn:function(){
+                var right=this.rightTableSelection;
+                var rightData=this.person_righttable;
+                for(var i=0;i<right.length;i++) {
+                    var s = $.inArray(right[i], rightData);//判断是否在rightData中存在这个值，存在返回下标，不存在返回-1
+                    if (s != -1) {
+                        rightData.splice(s, 1);
+                    }
+                }
+                for(var i=0;i<right.length;i++) {
+                    this.person_lefttable.push(right[i]);
+                }
+                this.per_delBtn_dis = true;
+            },
+            save_btn: function () {
+                var that=this;
+                save_cust_class(that);
+            },
+            prev_btn:function (){
+                $("#classdiv").show();
+                $("#assign_custSelect").hide();
+                this.person_lefttable=[];
+                this.person_righttable=[];
+            },
+            addClass:function(){
+                class_getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.classtitle="添加班次";
+                // var id=7;
+                // var cdate='20200404';
+                // $.ajax({
+                //     type:"get",
+                //     dataType:"json",
+                //     url:"[[@{/atte/adddtlbyhand?custtypeid=}]]"+id+"&attedate="+cdate,
+                //     success:function(ret){
+                //         alert('ok');
+                //     }
+                // })
+
+            },
+            delClass:function(id){
+                class_deletedata(id);
+            }
+        },
+        created:function(){
+            var _self=this;
+
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/atte/class/list?classname=}]]",
+                success:function(ret){
+                    //console.log(ret);
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                    _self.oper=ret.operator;
+                    var times=ret.timelist;
+                    var timelist=[];
+                    for (var i = 0; i < times.length; i++) {
+                        timelist.push({
+                            value: times[i].timegrpid,
+                            label: times[i].timegrpname
+                        });
+                    }
+                    _self.timelist=timelist;
+                    var depts=ret.deptlist;
+                    var deptlist=[];
+                    for (var i = 0; i < depts.length; i++) {
+                        deptlist.push({
+                            value: depts[i].deptcode,
+                            label: depts[i].deptname
+                        });
+                    }
+                    _self.deptlist=deptlist;
+                    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;
+                    if(ret.dept!=null){
+                        _self.dept=ret.dept;
+                    }
+                }
+            })
+        }
+
+    })
+    function save_cust_class(that){
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var classid=that.sel_classid;
+        var idlist=new Array();
+        var right=that.person_righttable;
+        // if(right.length==0){
+        //     layer.msg("请选择人员！",{icon:2,time:1000});
+        //     return '';
+        // }
+        for(var i=0;i<right.length;i++){
+            idlist.push(right[i].custid);
+        }
+
+        $.ajax({
+            type: "POST",
+            url:"[[@{atte/addCustClass?classid=}]]"+classid+"&idlist="+idlist,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            success: function (data) {
+
+                if (data.errStr == undefined) {
+                    layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                    window.location = "login";
+                    return;
+                }
+                if(data.errStr != ''){
+                    layer.msg(data.errStr, {icon: 2, time: 1000});
+                    return ;
+                }
+                if (data.errStr == ''){
+                    layer.msg('添加班次人员成功！', {icon: 1, time: 1000});
+                    $("#cust_qrybtn").click();
+                    return ;
+                }
+            }
+        });
+    }
+    function addAllCustList(that){
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var custname=that.person_person.custname;
+        var deptcode=that.person_person.deptcode;
+        var custtypeid=that.person_person.custtypeid;
+        var classid=that.sel_classid;
+        that.person_lefttable=[];
+        var url="[[@{/atte/getCustomerList?}]]"+"perName="+custname+"&custtypeid="+custtypeid
+            +"&deptcode="+deptcode+"&classid="+classid ;
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            contentType: "application/json",
+            data: "",
+            success: function (data) {
+                if(data.countIndex == undefined){
+                    layer.msg('用户认证已过期，请重新登录',{icon:2,time:1000});
+                    window.location="login";
+                    return;
+                }
+
+                if(data.countIndex){
+                    layer.msg('人员数量过大，请输入查询条件！',{icon:2,time:3000});
+                }else{
+                   // addDoorlist_vue.person_lefttable=data.pNotInResult;
+                    var allcust=data.allcust;
+                    var hasclasscust=data.hasclasscust;
+                   that.person_righttable=hasclasscust;
+                    that.person_lefttable=allcust;
+                }
+            }
+        });
+
+    }
+
+    function timeformatter(time){
+
+        return time.substr(0,4)+'-'+time.substr(4,2)+'-'+time.substr(6,2)+' '
+            +time.substr(8,2)+':'+time.substr(10,2)+':'+time.substr(12,2);
+
+    }
+    function dateformatter(time){
+        return time.substr(0,4)+'-'+time.substr(4,2)+'-'+time.substr(6,2);
+    }
+
+
+    function classtype_grpname(workorno){
+        var list = class_vue.typegrplist;
+
+        if(workorno!=null){
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == workorno){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function dept_grpname(deptcode){
+        var list = class_vue.deptlist;
+
+        if(deptcode!=null){
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == deptcode){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function timegrp_grpname(timegrpid){
+        var list = class_vue.timelist;
+
+        if(timegrpid!=null){
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == timegrpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function devtype_grpname(devtype){
+        var list=class_vue.devtypes;
+        if(devtype!=null){
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == devtype){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+
+    function class_commonQuery(_self,pageno,pagesize) {
+       var classname=_self.classform.classname;
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:"[[@{/atte/class/list?classname=}]]"+classname+"&pageNo="+pageno+"&pageSize="+pagesize,
+            success:function(ret){
+                _self.totSize=ret.PageResult.totalCount;
+                _self.tableData=ret.PageResult.list;
+                if(_self.totSize == 0 ){
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+                if (ret.errStr != ''){
+                    lay.msg(ret.errStr,{icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+    function class_getFillData(_self,classid){
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:encodeURI("[[@{/atte/loadClassForUpdate?classid=}]]"+classid),
+            success:function(ret){
+                if (ret.atteclass!=null ){
+                    _self.classDiaForm = ret.atteclass;
+                    var start=ret.atteclass.startdate;
+                    var end=ret.atteclass.enddate;
+                    _self.classDiaForm.startdate=new Date(start.substr(0, 4), start.substr(4, 2)-1, start.substr(6, 2));
+                    _self.classDiaForm.enddate=new Date(end.substr(0, 4), end.substr(4, 2)-1, end.substr(6, 2));
+                }
+                if(_self.oper.opertype!='S' &&_self.oper.opertype != 'P'){
+                    _self.classDiaForm.deptcode=_self.oper.deptcode
+                }
+            }
+        })
+    }
+
+    function class_saveData(_that,formName) {
+        var sdate=_that.classDiaForm.startdate;
+        var edate=_that.classDiaForm.enddate;
+        var startdate=class_Formatdate(sdate);
+        var enddate=class_Formatdate(edate);
+        if(startdate>enddate){
+            layer.msg("结束时间不能小于开始时间！", {icon: 2, time: 1000});
+            return '';
+        }
+        var classname=_that.classDiaForm.classname;
+        var workorno=_that.classDiaForm.workorno;
+        var classid=_that.classDiaForm.classid;
+        var timegrpid=_that.classDiaForm.timegrpid;
+        var deptcode=_that.classDiaForm.deptcode;
+        var url;
+        var data='';
+        if(class_vue.classtitle=='添加班次'){
+            var url="[[@{/atte/addClass?classname=}]]"+classname+"&workorno="+workorno+"&startdate="+startdate+"&enddate="+enddate+"&timegrpid="+timegrpid+"&deptcode="+deptcode;
+        }else{
+            var url="[[@{/atte/updateClass?startdate=}]]"+startdate+"&enddate="+enddate+"&deptcode="+deptcode;
+            data=JSON.stringify(_that.classDiaForm);
+        }
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data:data,
+            success: function (data) {
+                if (data.errStr == undefined) {
+                    layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                    window.location = "login";
+                    return;
+                }
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2, time: 1000});
+                } else {
+                    layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                    class_refreshThisTable();
+                    _that.$refs[formName].resetFields();
+                    _that.dialogFormVisible = false;
+                }
+
+            }
+        });
+
+
+    }
+    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 class_refreshThisTable(){
+        class_commonQuery(class_vue,class_vue.currPage,class_vue.pageSize);
+    }
+
+    function class_deletedata(id){
+        var token=$("meta[name='_csrf_token']").attr("value");
+        layer.confirm('你确定要删除选择的班次吗?', {icon: 3, title:'请确认',offset:'30%'}, function(index){
+            $.ajax({
+                type:"post",
+                dataType:"json",
+                url:"[[@{/atte/deleteClass?classid=}]]"+id,
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success:function(ret){
+                    //console.log(ret);
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon:2,time:1000});
+                    }else{
+                        if(ret.flag==0) {
+                            layer.msg('删除成功', {icon: 1, time: 1000});
+                            class_refreshThisTable();
+                        }else {
+                            layer.msg(ret.message, {icon:2,time:3000});
+                        }
+                    }
+                }
+            })
+        });
+    }
+
+
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/atte/dtl/index.html b/src/main/resources/templates/atte/dtl/index.html
new file mode 100644
index 0000000..7d2d7f0
--- /dev/null
+++ b/src/main/resources/templates/atte/dtl/index.html
@@ -0,0 +1,491 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">考勤流水</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">人员考勤</a>
+          <a><cite>考勤流水</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body" >
+        <div id="attedtlapp">
+            <el-form :inline="true" ref="attedtlform" :model="attedtlform" data-parsley-validate class="form-horizontal form-label-left">
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">开始日期:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-date-picker style="width: 100%"
+                                    v-model="attedtlform.startdate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">结束日期:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-date-picker style="width: 100%"
+                                    v-model="attedtlform.enddate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">卡号:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="attedtlform.cardno" placeholder="输入%模糊查询"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">姓名:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="attedtlform.custname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">设备名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="attedtlform.devname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">人员类别:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="attedtlform.custtypeid" style="width:100%;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="custtypeid in typegrplist"
+                                        :key="custtypeid.value"
+                                        :label="custtypeid.label"
+                                        :value="custtypeid.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div    class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;"></span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                        <button type="button" class="btn btn-info" @click="query" id="attedtl_qrybtn">查 询</button>
+                        </div>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        border
+                        max-height="2000"
+                        style="width: 100%">
+
+                    <el-table-column
+                            prop="refno"
+                            label="流水号"
+                            sortable
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="custname"
+                            label="姓名"
+                            sortable
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="cardno"
+                            label="卡号"
+                            sortable
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="attedate"
+                            label="日期"
+                            :formatter="attedatefor"
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="attetime"
+                            label="打卡时间"
+                            :formatter="attetimefor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="devname"
+                            label="设备名称"
+                            >
+                    </el-table-column>
+
+
+                    <el-table-column
+                            prop="custtypeid"
+                            label="人员类别"
+                            :formatter="custtypefor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="deptcode"
+                            label="部门"
+                            :formatter="deptfor"
+                    >
+                    </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>
+
+<script>
+    var attedtl_vue = new Vue({
+        el: '#attedtlapp',
+        data:{
+            tableData: [],
+            deptlist:[],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            stategrplist:[{value:0,label:'未打卡'},{value:1,label:'正常'},{value:2,label:'迟到'},{value:3,label:'请假'},{value:4,label:'旷工'},],
+            attedtlform:{
+                startdate:Date.now(),
+                enddate:Date.now(),
+                cardno:'',
+                custname:'',
+                custtypeid:'',
+                deptcode:'',
+                devname:''
+            },
+            timegrplist:[],
+            typegrplist:[],
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            updatetitle:'修改考勤状态',
+            dtlDiaForm:{
+                atteno:'',
+                custname:'',
+                state:'',
+                remark:''
+            },
+            rules: {
+                season: [
+                    { required: true, message: '请输入时令名', trigger: 'blur' },
+                    { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+
+
+            },
+
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                attedtl_commonQuery(this,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                attedtl_commonQuery(this,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            attedatefor:function(row){
+                if(row.attedate!= null){
+                    return dateformatter(row.attedate);
+                }
+            },
+            attetimefor:function(row){
+                if(row.attetime!= null){
+                    return timeformatter(row.attetime);
+                }
+            },
+            endtimefor:function(row){
+                if(row.endtime!= null){
+                    return timeformatter(row.endtime);
+                }
+            },
+            statefor:function(row){
+                if(row.state!= null){
+                    return state_grpname(row.state);
+                }
+            },
+            timenamefor:function(row){
+                if(row.timeid!=null){
+                    return timeid_grpname(row.timeid);
+                }
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                attedtl_commonQuery(this,this.currPage,this.pageSize);
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            saveState:function (formName) {
+
+                 var _that=this;
+                    attedtl_saveData(_that,formName);
+
+            },
+            editDtl:function (row) {
+                 dtl_getFillData(this,row);
+                 this.dialogFormVisible = true;
+                 this.updatetitle="修改流水状态"
+            },
+            custtypefor:function (row) {
+                return custtype_grpname(row.custtypeid);
+            },
+            deptfor:function (row) {
+                return dept_grpname(row.deptcode);
+            },
+            refreshdtl:function (){
+                var _that=this;
+                refreshAtteDtl(_that);
+            }
+
+        },
+        created:function(){
+            var _self=this;
+            var token=$("meta[name='_csrf_token']").attr("value");
+            var startdate=class_Formatdate(_self.attedtlform.startdate);
+            var enddate=class_Formatdate(_self.attedtlform.enddate);
+            $.ajax({
+                type:"post",
+                dataType:"json",
+                url:"[[@{/atte/dtl/list?startdate=}]]"+startdate+"&enddate="+enddate,
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data:JSON.stringify(_self.attedtlform),
+                success:function(ret){
+                    // //console.log(ret);
+                    // _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                    var custtypelist = [];
+                    var types=ret.custtypelist;
+                    for (var i = 0; i < types.length; i++) {
+                        custtypelist.push({
+                            value: types[i].custtypeid,
+                            label: types[i].custtypename
+                        });
+                    }
+                    _self.typegrplist=custtypelist;
+                    var deptlist = [];
+                    var depts=ret.deptlist;
+                    for (var i = 0; i < depts.length; i++) {
+                        deptlist.push({
+                            value: depts[i].deptcode,
+                            label: depts[i].deptname
+                        });
+                    }
+                    _self.deptlist=deptlist;
+                }
+            })
+        }
+
+    })
+    function refreshAtteDtl(that){
+        var startdate=class_Formatdate(that.attedtlform.startdate);
+        var enddate=class_Formatdate(that.attedtlform.enddate);
+        if(startdate== '' || enddate=='') {
+            layer.msg("请选择日期", {icon: 2, time: 1000});
+            return;
+        }
+        if(startdate>enddate){
+            layer.msg("开始日期不能大于结束日期！", {icon: 2, time: 1000});
+            return;
+        }
+        layer.confirm('你确定要刷新所选日期的流水吗?', {icon: 3, title:'请确认',offset:'30%'},function (){
+
+        })
+    }
+    function dateformatter(time){
+        return time.substr(0,4)+'-'+time.substr(4,2)+'-'+time.substr(6,2);
+    }
+    function timeformatter(time){
+        return time.substr(0,2)+':'+time.substr(2,2)+':'+time.substr(4,2);
+    }
+
+    function custtype_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = attedtl_vue.typegrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function dept_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = attedtl_vue.deptlist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function state_grpname(grpid){
+        if(grpid!=null){
+            var list = attedtl_vue.stategrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+
+    function timeid_grpname(grpid){
+        if(grpid!=null){
+            var list = attedtl_vue.timegrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    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 attedtl_commonQuery(_self,pageno,pagesize) {
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var startdate=class_Formatdate(_self.attedtlform.startdate);
+        var enddate=class_Formatdate(_self.attedtlform.enddate);
+        $.ajax({
+            type:"post",
+            dataType:"json",
+            url:"[[@{/atte/dtl/list?startdate=}]]"+startdate+"&enddate="+enddate+"&pageNo="+pageno+"&pageSize="+pagesize,
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data:JSON.stringify(_self.attedtlform),
+            success:function(ret){
+                _self.totSize=ret.PageResult.totalCount;
+                _self.tableData=ret.PageResult.list;
+                if(_self.totSize == 0 ){
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+
+            }
+        })
+    }
+
+    function dtl_getFillData(_self,row){
+            _self.dtlDiaForm.atteno=row.atteno;
+            _self.dtlDiaForm.custname=row.custname;
+            _self.dtlDiaForm.state=row.state;
+            _self.dtlDiaForm.remark=row.remark;
+    }
+
+    function attedtl_saveData(_that,formName) {
+            var atteno=_that.dtlDiaForm.atteno;
+            var state=_that.dtlDiaForm.state;
+            var remark=_that.dtlDiaForm.remark;
+            var token=$("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                url: '[[@{/atte/updateDtl?atteno=}]]'+atteno+"&state="+state+"&remark="+remark,
+                dataType: "json",
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success: function (data) {
+                    if (data.errStr == undefined) {
+                        layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                        window.location = "login";
+                        return;
+                    }
+                    if (data.errStr != "") {
+                        layer.msg(data.errStr, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                        _that.dialogFormVisible = false;
+                        dtl_refreshThisTable();
+                        _that.$refs[formName].resetFields();
+                    }
+                }
+            })
+
+    }
+
+    function dtl_refreshThisTable(){
+        attedtl_commonQuery(attedtl_vue,attedtl_vue.currPage,attedtl_vue.pageSize);
+    };
+
+
+
+
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/atte/role/index.html b/src/main/resources/templates/atte/role/index.html
new file mode 100644
index 0000000..2728f59
--- /dev/null
+++ b/src/main/resources/templates/atte/role/index.html
@@ -0,0 +1,807 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">考勤规则管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">人员考勤</a>
+          <a><cite>考勤规则管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body" >
+       <div id="seasonapp">
+           <div id="rulediv" >
+            <el-form :inline="true" ref="seasonform" :model="seasonform" data-parsley-validate class="form-horizontal form-label-left">
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">规则名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="seasonform.season"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div    class="col-md-3">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="season_qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="addSeason">添加规则</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        border
+                        max-height="2000"
+                        style="width: 100%">
+                    <el-table-column
+                            prop="id"
+                            label="ID"
+                            sortable
+                            width="100">
+                    </el-table-column>
+                    <el-table-column
+                            prop="season"
+                            label="规则名称"
+                            sortable
+                            width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="weekid"
+                            label="时间周"
+                            width="150"
+                            :formatter="weekfor">
+                    </el-table-column>
+                    <el-table-column
+                            prop="deptcode"
+                            label="部门"
+                            width="200"
+                            :formatter="deptfor"
+                            >
+                    </el-table-column>
+                    <el-table-column
+                            prop="custtypeid"
+                            label="人员类别"
+                            width="200"
+                            :formatter="custtypefor"
+                            >
+                    </el-table-column>
+                    <el-table-column
+                            label="操作"
+                           >
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" v-if="scope.row.status=='2'" title="编辑规则" @click="editSeason(scope.row.id)">编辑</button>
+                            <button type="button" class="btn btn-danger btn-xs" v-if="scope.row.status=='2'" title="删除规则" @click="delSeason(scope.row.id)">删除</button>
+                            <button type="button" class="btn btn-success btn-xs" title="启用规则"
+                                    @click="openSeason(scope.row.id)" v-if="scope.row.status=='2' ">启用
+                            </button>
+                            <button type="button" class="btn btn-warning btn-xs" title="停用规则"
+                                    @click="stopSeason(scope.row.id)" v-if="scope.row.status=='1' ">停用
+                            </button>
+                            <button type="button" class="btn btn-danger btn-xs" @click="assignDev(scope.row.id)" title="分配设备" >分配设备</button>
+                        </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>
+
+            <!--添加修改时令-->
+            <el-dialog :title="seasontitle" :visible.sync="dialogFormVisible" top="80px" size="tiny" :modal-append-to-body='false' @close="closeDialog('seasonDiaForm')">
+                <el-form ref="seasonDiaForm" class="el-form-item el-form-item--mini" :model="seasonDiaForm" size="mini" :rules="rules" label-width="36%">
+                    <el-form-item label="规则名称:" prop="season">
+                        <el-col :span="18">
+                            <el-input v-model="seasonDiaForm.season" style="width: 187px;" maxlength="20">
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="时间周:" prop="weekid">
+                        <el-col :span="18">
+                            <el-select v-model="seasonDiaForm.weekid" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="weekid in weekgrplist"
+                                        :key="weekid.value"
+                                        :label="weekid.label"
+                                        :value="weekid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item  label="部门:" prop="deptcode">
+                        <el-col :span="18">
+                            <el-select v-if=" oper.opertype == 'S' ||oper.opertype == 'P' "  v-model="seasonDiaForm.deptcode" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="deptcode in deptlist"
+                                        :key="deptcode.value"
+                                        :label="deptcode.label"
+                                        :value="deptcode.value">
+                                </el-option>
+                            </el-select>
+                            <el-input readonly v-if=" oper.opertype != 'S' && oper.opertype != 'P'" v-model="dept.deptname"     style="width: 187px;" maxlength="20">
+                            </el-input>
+
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="人员类别:" prop="custtypeid">
+                        <el-col :span="18">
+                            <el-select v-model="seasonDiaForm.custtypeid" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="custtypeid in custtypelist"
+                                        :key="custtypeid.value"
+                                        :label="custtypeid.label"
+                                        :value="custtypeid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('seasonDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveSeason('seasonDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </div>
+
+           <!--设备选择-->
+           <div id="assign_devSelect" style="display: none">
+               <div>
+                   <el-form :inline="true" ref="devform" :model="dev_device" data-parsley-validate
+                            class="form-horizontal form-label-left">
+                       <div class="col-md-3" >
+                           <div class="form-group">
+                               <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">设备名称:</span>
+                               </label>
+                               <div class="col-md-8 col-sm-12 col-xs-12">
+                                   <el-input v-model="dev_device.devname" ></el-input>
+                               </div>
+                           </div>
+                       </div>
+                       <div class="col-md-3" >
+                           <div class="form-group">
+                               <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">设备类型:</span>
+                               </label>
+                               <div class="col-md-8 col-sm-12 col-xs-12">
+                                   <el-select v-model="dev_device.devtype"
+                                              filterable
+                                              clearable
+                                              placeholder="请选择">
+                                       <el-option
+                                               v-for="devtype in devtypes"
+                                               :key="devtype.value"
+                                               :label="devtype.label"
+                                               :value="devtype.value">
+                                       </el-option>
+                                   </el-select>
+                               </div>
+                           </div>
+                       </div>
+                       <div class="col-md-3" >
+                           <div class="form-group">
+                               <button type="button" class="btn btn-info" @click="searchDev" id="dev_qrybtn">查 询</button>
+                           </div>
+                       </div>
+                   </el-form>
+
+               </div>
+
+
+
+
+
+               <div id="assign_devSel">
+                   <div class="layui-row layui-col-space15">
+                       <div class="layui-col-md5" style="width: 45%">
+                           <div class="layui-card">
+                               <div class="layui-card-header" style="margin-bottom: 10px" v-if="dev_lefttable">
+                                   可分配设备({{dev_lefttable.length}}台)
+                               </div>
+                               <div id="addDoorlist_pensonS-tb" class="layui-card-body">
+
+                                   <template>
+                                       <el-table
+                                               height="480"
+                                               ref="multipleTable"
+                                               :data="dev_lefttable"
+                                               tooltip-effect="dark"
+                                               style="width: 100%;"
+                                               stripe
+                                               border
+                                               @selection-change="lefttableSelect">
+                                           <el-table-column
+                                                   fixed
+                                                   type="selection"
+                                           >
+                                           </el-table-column>
+                                           <el-table-column
+                                                   sortable
+                                                   prop="deviceid"
+                                                   label="编号"
+                                           >
+                                           </el-table-column>
+                                           <el-table-column
+                                                   sortable
+                                                   prop="devname"
+                                                   label="设备名称"
+                                           >
+                                           </el-table-column>
+                                           <el-table-column
+                                                   prop="devtype"
+                                                   label="设备类型"
+                                                   :formatter="devtypefor"
+                                           >
+                                           </el-table-column>
+                                       </el-table>
+                                   </template>
+                               </div>
+                           </div>
+                       </div>
+
+                       <div class="layui-col-md1" style="width: 10%">
+                           <div style="width:5%;height:400px;display:inline-block;padding:0;margin-left: 5px; float:left">
+                               <div style="position: absolute;top:55%;width:5%;padding:0;margin: 0;text-align: center;left: 28%">
+                                   <el-button class="el-icon-d-arrow-right" :disabled="per_addBtn_dis" @click="dev_addBtn"></el-button>
+                               </div>
+                               <div style="position: absolute;top:80%;width:5%;padding:0;margin: 0;text-align: center;left: 28%">
+                                   <el-button class="el-icon-d-arrow-left" :disabled="per_delBtn_dis" @click="dev_delBtn"></el-button>
+                               </div>
+                           </div>
+                       </div>
+
+                       <div class="layui-col-md5" style="width: 45%">
+                           <div class="layui-card">
+
+                               <div class="layui-card-header" style="margin-bottom: 10px" v-if="dev_righttable">
+                                   已分配设备({{dev_righttable.length}}台)
+                               </div>
+                               <div  class="layui-card-body">
+                                   <template>
+                                       <el-table
+                                               height="480"
+                                               ref="multipleTable"
+                                               :data="dev_righttable"
+                                               tooltip-effect="dark"
+                                               style="width: 100%;"
+                                               stripe
+                                               border
+                                               @selection-change="rightTableSelect">
+                                           <el-table-column
+                                                   fixed
+                                                   type="selection"
+                                           >
+                                           </el-table-column>
+                                           <el-table-column
+                                                   sortable
+                                                   prop="deviceid"
+                                                   label="编号"
+                                           >
+                                           </el-table-column>
+                                           <el-table-column
+                                                   sortable
+                                                   prop="devname"
+                                                   label="设备名称"
+                                           >
+                                           </el-table-column>
+                                           <el-table-column
+                                                   prop="devtype"
+                                                   label="设备类型"
+                                                   :formatter="devtypefor"
+                                           >
+                                           </el-table-column>
+                                       </el-table>
+                                   </template>
+                               </div>
+                           </div>
+                       </div>
+                   </div>
+               </div>
+
+               <div class="layui-row layui-col-space15">
+                   <div style="float:left;margin:0px 0 0 30%;"><el-button style="margin-top: 12px;" @click="prev_btn">返回</el-button></div>
+                   <div style="float:left;margin:0px 0 0 10%;"><el-button style="margin-top: 12px;" @click="save_dev">保存</el-button></div>
+               </div>
+           </div>
+       </div>
+    </div>
+</div>
+
+<script>
+    var season_vue = new Vue({
+        el: '#seasonapp',
+        data:{
+            oper:'',
+            tableData: [],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            seasonform:{
+                season:'',
+            },
+            dept:'',
+            sel_ruleid:'',
+            weekgrplist:[],
+            custtypelist:[],
+            deptlist:[],
+            dev_device:{
+                devname:'',
+                devtype:''
+            },
+            dev_lefttable:[],
+            dev_righttable:[],
+            leftTableSelection:[],
+            rightTableSelection:[],
+            per_addBtn_dis:true,
+            per_delBtn_dis:true,
+            devtypes:[],
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            seasontitle:'添加规则',
+            seasonDiaForm:{
+                id:'',
+                season:'',
+                weekid:'',
+                deptcode:'',
+                custtypeid:'',
+                status:''
+            },
+            rules: {
+                season: [
+                    { required: true, message: '请输入时令名', trigger: 'blur' },
+                    { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+                weekid:[
+                    { required: true, message: ' ',},
+                ],
+                deptcode:[
+                    { required: true, message: ' '},
+                ],
+                custtypeid:[
+                    { required: true,message: ' ', },
+                ],
+
+            },
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                season_commonQuery(this,this.seasonform.season,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                season_commonQuery(this,this.seasonform.season,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            delSeason:function (row) {
+                season_deletedata(row);
+            },
+            openSeason:function (row) {
+                stoporopen(row,1);
+            },
+            stopSeason:function (row) {
+                stoporopen(row,2);
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                season_commonQuery(this,this.seasonform.season,this.currPage,this.pageSize);
+            },
+            addSeason:function (formName) {
+                season_getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.seasontitle="添加规则";
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            saveSeason:function (formName) {
+
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    season_saveData(_that,_that.seasonDiaForm,formName);
+
+                }
+
+            },
+            editSeason:function (id) {
+                season_getFillData(this,id);
+                this.dialogFormVisible = true;
+                this.seasontitle="修改规则"
+            },
+            weekfor:function (row) {
+                return weektime_grpname(row.weekid);
+            },
+            deptfor:function (row) {
+                return dept_grpname(row.deptcode);
+            },
+            custtypefor:function (row) {
+                return custtype_grpname(row.custtypeid);
+            },
+            assignDev:function(id){
+                this.sel_ruleid=id;
+                $("#rulediv").hide();
+                $("#assign_devSelect").show();
+                $("#dev_qrybtn").click();
+            },
+            searchDev:function(devname,devtype){
+                var that=this;
+                addAllDevList(that);
+            },
+            lefttableSelect:function(val) {
+                //console.log(val);
+                this.leftTableSelection = val;
+                this.per_addBtn_dis=this.leftTableSelection<=0;
+            },
+            rightTableSelect:function(val) {
+                this.rightTableSelection = val;
+                this.per_delBtn_dis=this.rightTableSelection<=0;
+            },
+            devtypefor:function(row){
+                return devtype_grpname(row.devtype);
+            },
+            dev_addBtn:function(){
+                var _self=this;
+                var left=_self.leftTableSelection;
+                var right=[];
+                right=left.splice(0,left.length);
+                var dev={};
+
+                for(var i=0;i<right.length;i++){
+                    if($.inArray(right[i],_self.dev_righttable)==-1) {
+                        _self.dev_righttable.push(right[i]);
+                    }
+                }
+                this.per_addBtn_dis=true;
+            },
+            dev_delBtn:function(){
+                var right=this.rightTableSelection;
+                var rightData=this.dev_righttable;
+                for(var i=0;i<right.length;i++) {
+                    var s = $.inArray(right[i], rightData);//判断是否在rightData中存在这个值，存在返回下标，不存在返回-1
+                    if (s != -1) {
+                        rightData.splice(s, 1);
+                    }
+                }
+                this.per_delBtn_dis = true;
+            },
+            save_dev: function () {
+                var that=this;
+                save_dev_rule(that);
+            },
+            prev_btn:function (){
+                $("#rulediv").show();
+                $("#assign_devSelect").hide();
+                this.dev_lefttable=[];
+                this.dev_righttable=[];
+            }
+
+        },
+        created:function(){
+            var _self=this;
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/atte/rule/list?season=}]]",
+                success:function(ret){
+                    //console.log(ret);
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                    _self.oper=ret.operator;
+                    var weeklist = [];
+                    var weeks=ret.weeklist;
+                    for (var i = 0; i < weeks.length; i++) {
+                        weeklist.push({
+                            value: weeks[i].weekid,
+                            label: weeks[i].weekname
+                        });
+                    }
+                    _self.weekgrplist=weeklist;
+                    var deptlist = [];
+                    var depts=ret.deptlist;
+                    for (var i = 0; i < depts.length; i++) {
+                        deptlist.push({
+                            value: depts[i].deptcode,
+                            label: depts[i].deptname
+                        });
+                    }
+                    _self.deptlist=deptlist;
+                    var custtypelist = [];
+                    var custtypes=ret.custtypelist;
+                    for (var i = 0; i < custtypes.length; i++) {
+                        custtypelist.push({
+                            value: custtypes[i].custtypeid,
+                            label: custtypes[i].custtypename
+                        });
+                    }
+                    if(ret.dept!=null){
+                        _self.dept=ret.dept;
+                    }
+                    _self.custtypelist=custtypelist;
+                }
+            })
+        }
+
+    })
+    function save_dev_rule(that){
+        var ids='';
+        var list=that.dev_righttable;
+        for(var i=0;i<list.length;i++) {
+            ids=ids+','+list[i].deviceid;
+        }
+        var ruleid=season_vue.sel_ruleid;
+        var token=$("meta[name='_csrf_token']").attr("value");
+
+        $.ajax({
+            type: "POST",
+            url:"[[@{atte/assign/save?ids=}]]"+ids+"&ruleid="+ruleid,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            success: function (data) {
+
+                if (data.okFlag == '1') {
+                    layer.msg("保存成功！",{icon:1,time:1000});
+                }
+                $("#dev_qrybtn").click();
+            }
+        });
+    }
+    function addAllDevList(that){
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var ruleid=that.sel_ruleid;
+        var devname=that.dev_device.devname;
+
+        var devtype=that.dev_device.devtype;
+        $.ajax({
+            type: "get",
+            url: "[[@{atte/assign/devlist?ruleid=}]]"+ruleid+"&devname="+devname+"&devtype="+devtype,
+            dataType: "json",
+            success: function (data) {
+
+
+                if (data.canassignlist.length==0 && data.hasassignlist.length==0 ){
+                    layer.msg('没有记录！',{icon:2,time:1000});
+                    return;
+                }
+                season_vue.dev_lefttable=data.canassignlist;
+                season_vue.dev_righttable=data.hasassignlist;
+
+            }
+        });
+    }
+    function devtype_grpname(devtype){
+        var list=season_vue.devtypes;
+        if(devtype!=null){
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == devtype){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function weektime_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = season_vue.weekgrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function dept_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = season_vue.deptlist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function custtype_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = season_vue.custtypelist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+
+    function season_commonQuery(_self,season,pageno,pagesize) {
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:encodeURI("[[@{/atte/rule/list?season=}]]"+season+"&pageNo="+pageno+"&pageSize="+pagesize),
+            success:function(ret){
+                _self.totSize=ret.PageResult.totalCount;
+                _self.tableData=ret.PageResult.list;
+                if(_self.totSize == 0 ){
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+    function season_getFillData(_self,id){
+        $.ajax({
+            type:"get",
+            dataType:"json",
+            url:encodeURI("[[@{/atte/loadSeasonForUpdate?sid=}]]"+id),
+            success:function(ret){
+                var weeklist = [];
+                var weeks=ret.weekgrp;
+                for (var i = 0; i < weeks.length; i++) {
+                    weeklist.push({
+                        value: weeks[i].weekid,
+                        label: weeks[i].weekname
+                    });
+                }
+                console.log(weeklist);
+                if (ret.season!=null){
+                    _self.seasonDiaForm = ret.season;
+                }
+                if(_self.oper.opertype!='S' &&_self.oper.opertype != 'P'){
+                    _self.seasonDiaForm.deptcode=_self.oper.deptcode
+                }
+                _self.weekgrplist=weeklist;
+            }
+        })
+    }
+
+    function season_saveData(_that,formdata,formName) {
+        var url;
+        if(season_vue.seasontitle == "添加规则"){
+            url = encodeURI("[[@{/atte/addSeason}]]");
+        }
+        if(season_vue.seasontitle == "修改规则"){
+            url = encodeURI("[[@{/atte/updateSeason}]]");
+        }
+
+            var token=$("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                url: url,
+                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.errStr == undefined) {
+                        layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                        window.location = "login";
+                        return;
+                    }
+                    if (data.errStr != "") {
+                        layer.msg(data.errStr, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                        season_refreshThisTable();
+                        _that.$refs[formName].resetFields();
+                        _that.dialogFormVisible = false;
+                    }
+                }
+            });
+
+    }
+
+    function season_refreshThisTable(){
+        season_commonQuery(season_vue,season_vue.seasonform.season,season_vue.currPage,season_vue.pageSize);
+    };
+
+    function season_deletedata(id){
+        layer.confirm('你确定要删除选择的规则吗?', {icon: 3, title:'请确认',offset:'30%'}, function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/atte/deleteSeason?id=}]]"+id,
+                success:function(ret){
+                    //console.log(ret);
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon:2,time:1000});
+                    }else{
+                        if(ret.flag==0) {
+                            layer.msg('删除成功', {icon: 1, time: 1000});
+                            season_refreshThisTable();
+                        }else {
+                            layer.msg(ret.message, {icon:2,time:3000});
+                        }
+                    }
+                }
+            })
+        });
+    }
+
+    function stoporopen(id,flag){
+        var msg='';
+        if(flag==1){
+            msg='你确定要启用该规则,并停用该部门,人员类别下其他规则？';
+        }else{
+            msg='你确定要停用该规则？';
+        }
+        var token=$("meta[name='_csrf_token']").attr("value");
+        layer.confirm(msg, {icon: 3, title:'请确认',offset:'30%'}, function(index){
+            $.ajax({
+                type:"post",
+                dataType:"json",
+                url:"[[@{/atte/stoporopenrule?id=}]]"+id,
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success:function(ret){
+                    //console.log(ret);
+                    if(ret.errStr == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location="login";
+                        return;
+                    }
+                    if (ret.errStr != "") {
+                        layer.msg(ret.errStr, {icon:2,time:1000});
+                    }else{
+                        if(flag==1) {
+                            layer.msg('启用成功', {icon: 1, time: 1000});
+                        }else {
+                            layer.msg('停用成功', {icon: 1, time: 1000});
+                        }
+                        season_refreshThisTable();
+                    }
+                }
+            })
+        });
+    }
+
+
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/atte/timedtl/index.html b/src/main/resources/templates/atte/timedtl/index.html
new file mode 100644
index 0000000..9b353a0
--- /dev/null
+++ b/src/main/resources/templates/atte/timedtl/index.html
@@ -0,0 +1,551 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">考勤状态维护</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">人员考勤</a>
+          <a><cite>考勤状态维护</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body" >
+        <div id="timedtlapp">
+            <el-form :inline="true" ref="attedtlform" :model="attedtlform" data-parsley-validate class="form-horizontal form-label-left">
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">开始日期:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-date-picker style="width: 100%"
+                                    v-model="attedtlform.startdate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">结束日期:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-date-picker style="width: 100%"
+                                    v-model="attedtlform.enddate" type="date"
+                                    placeholder="选择日期" :editable="false"  value-format="yyyyMMdd">
+                            </el-date-picker>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">卡号:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="attedtlform.cardno" placeholder="输入%模糊查询"></el-input>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">姓名:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="attedtlform.custname" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">人员类别:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-select v-model="attedtlform.custtypeid" style="width:100%;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="custtypeid in typegrplist"
+                                        :key="custtypeid.value"
+                                        :label="custtypeid.label"
+                                        :value="custtypeid.value">
+                                </el-option>
+                            </el-select>
+                        </div>
+                    </div>
+                </div>
+
+
+                <div    class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;"></span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                        <button type="button" class="btn btn-info" @click="query" id="attedtl_qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="refreshdtl">刷新流水</button>
+                        </div>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singleTable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        border
+                        max-height="2000"
+                        style="width: 100%">
+                    <el-table-column
+                            label="操作">
+
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="修改考勤状态" @click="editDtl(scope.row)">修改考勤状态</button>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                            prop="atteno"
+                            label="流水号"
+                            sortable
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="custname"
+                            label="姓名"
+                            sortable
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="cardno"
+                            label="卡号"
+                            sortable
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="attedate"
+                            label="日期"
+                            :formatter="attedatefor"
+                           >
+                    </el-table-column>
+                    <el-table-column
+                            prop="timeid"
+                            label="考勤时段"
+                            :formatter="timenamefor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="state"
+                            label="考勤状态"
+                            :formatter="statefor"
+                            >
+                    </el-table-column>
+                    <el-table-column
+                            prop="oldstate"
+                            label="原始状态"
+                            :formatter="oldstatefor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="custtypeid"
+                            label="人员类别"
+                            :formatter="custtypefor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="deptcode"
+                            label="部门"
+                            :formatter="deptfor"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                            prop="remark"
+                            label="备注"
+                    >
+                    </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>
+
+            <!--修改考勤状态-->
+            <el-dialog :title="updatetitle" :visible.sync="dialogFormVisible" top="80px" size="tiny" :modal-append-to-body='false' @close="closeDialog('dtlDiaForm')">
+                <el-form ref="dtlDiaForm" class="el-form-item el-form-item--mini" :model="dtlDiaForm" size="mini" :rules="rules" label-width="36%">
+                    <el-form-item label="姓名:" prop="custname">
+                        <el-col :span="18">
+                            <el-input v-model="dtlDiaForm.custname" readonly style="width: 250px;" maxlength="20">
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="考勤状态:" prop="state">
+                        <el-col :span="18">
+                            <el-select v-model="dtlDiaForm.state" style="width: 250px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="state in stategrplist"
+                                        :key="state.value"
+                                        :label="state.label"
+                                        :value="state.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+                    <el-form-item label="备注:" prop="remark">
+                        <el-col :span="18">
+                            <el-input type="textarea" v-model="dtlDiaForm.remark" placeholder="填写备注" style="width: 250px;" >
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('dtlDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveState('dtlDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+        </div>
+
+
+    </div>
+</div>
+
+<script>
+    var timedtl_vue = new Vue({
+        el: '#timedtlapp',
+        data:{
+            tableData: [],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            stategrplist:[{value:0,label:'未打卡'},{value:1,label:'正常'},{value:2,label:'迟到'},{value:3,label:'请假'},{value:4,label:'旷工'},],
+            attedtlform:{
+                startdate:Date.now(),
+                enddate:Date.now(),
+                cardno:'',
+                custname:'',
+                custtypeid:'',
+                deptcode:''
+            },
+            timegrplist:[],
+            typegrplist:[],
+            deptlist:[],
+            dialogFormVisible: false,
+            dlgAllotDevVisible:false,
+            updatetitle:'修改考勤状态',
+            dtlDiaForm:{
+                atteno:'',
+                custname:'',
+                state:'',
+                remark:''
+            },
+            rules: {
+                season: [
+                    { required: true, message: '请输入时令名', trigger: 'blur' },
+                    { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+
+
+            },
+
+        },
+        methods: {
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                attedtl_commonQuery(this,this.currPage,val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                attedtl_commonQuery(this,this.currPage,this.pageSize);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            attedatefor:function(row){
+                if(row.attedate!= null){
+                    return dateformatter(row.attedate);
+                }
+            },
+            statimefor:function(row){
+                if(row.statime!= null){
+                    return timeformatter(row.statime);
+                }
+            },
+            statefor:function(row){
+                if(row.state!= null){
+                    return state_grpname(row.state);
+                }
+            },
+            oldstatefor:function(row){
+                if(row.oldstate!= null){
+                    return state_grpname(row.oldstate);
+                }
+            },
+            timenamefor:function(row){
+                if(row.timeid!=null){
+                    return timeid_grpname(row.timeid);
+                }
+            },
+            query:function () {
+                this.pagesize=10;
+                this.currPage=1;
+                attedtl_commonQuery(this,this.currPage,this.pageSize);
+            },
+            resetForm:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            closeDialog:function(formName) {
+                this.$refs[formName].resetFields();
+                this.dialogFormVisible = false
+            },
+            saveState:function (formName) {
+
+                 var _that=this;
+                    attedtl_saveData(_that,formName);
+
+            },
+            editDtl:function (row) {
+                 dtl_getFillData(this,row);
+                 this.dialogFormVisible = true;
+                 this.updatetitle="修改流水状态"
+            },
+            custtypefor:function (row) {
+                return custtype_grpname(row.custtypeid);
+            },
+            deptfor:function (row) {
+                return dept_grpname(row.deptcode);
+            },
+            refreshdtl:function (){
+                var _that=this;
+                refreshAtteDtl(_that);
+            }
+
+        },
+        created:function(){
+            var _self=this;
+            var token=$("meta[name='_csrf_token']").attr("value");
+            var startdate=class_Formatdate(_self.attedtlform.startdate);
+            var enddate=class_Formatdate(_self.attedtlform.enddate);
+            $.ajax({
+                type:"post",
+                dataType:"json",
+                url:"[[@{/atte/timedtl/list?startdate=}]]"+startdate+"&enddate="+enddate,
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data:JSON.stringify(_self.attedtlform),
+                success:function(ret){
+                    // //console.log(ret);
+                    // _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                    var custtypelist = [];
+                    var types=ret.custtypelist;
+                    for (var i = 0; i < types.length; i++) {
+                        custtypelist.push({
+                            value: types[i].custtypeid,
+                            label: types[i].custtypename
+                        });
+                    }
+                    var timelist=[];
+                    var times=ret.timelist;
+                    for (var i = 0; i < times.length; i++) {
+                        timelist.push({
+                            value: times[i].timeid,
+                            label: times[i].timename
+                        });
+                    }
+                    var deptlist=[];
+                    var depts=ret.deptlist;
+                    for (var i = 0; i < depts.length; i++) {
+                        deptlist.push({
+                            value: depts[i].deptcode,
+                            label: depts[i].deptname
+                        });
+                    }
+                    _self.deptlist=deptlist;
+                    _self.timegrplist=timelist;
+                    _self.typegrplist=custtypelist;
+                }
+            })
+        }
+
+    })
+    function refreshAtteDtl(that){
+        var startdate=class_Formatdate(that.attedtlform.startdate);
+        var enddate=class_Formatdate(that.attedtlform.enddate);
+        if(startdate== '' || enddate=='') {
+            layer.msg("请选择日期", {icon: 2, time: 1000});
+            return;
+        }
+        if(startdate>enddate){
+            layer.msg("开始日期不能大于结束日期！", {icon: 2, time: 1000});
+            return;
+        }
+        layer.confirm('你确定要刷新所选日期的流水吗?', {icon: 3, title:'请确认',offset:'30%'},function (){
+
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/atte/adddtlbyhand?enddate=}]]"+enddate+"&startdate="+startdate,
+                success:function(ret){
+                    layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                    dtl_refreshThisTable();
+                }
+            })
+        })
+    }
+    function dateformatter(time){
+        return time.substr(0,4)+'-'+time.substr(4,2)+'-'+time.substr(6,2);
+    }
+    function timeformatter(time){
+        return time.substr(0,2)+':'+time.substr(2,2)+':'+time.substr(4,2);
+    }
+
+    function dept_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = timedtl_vue.deptlist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function custtype_grpname(grpid){
+//        console.log(typeof timeid)
+        if(grpid!=null){
+            var list = timedtl_vue.typegrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    function state_grpname(grpid){
+        if(grpid!=null){
+            var list = timedtl_vue.stategrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+
+    function timeid_grpname(grpid){
+        if(grpid!=null){
+            var list = timedtl_vue.timegrplist;
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == grpid){
+                    return list[i].label;
+                }
+            }
+        }
+    }
+    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 attedtl_commonQuery(_self,pageno,pagesize) {
+
+        var token=$("meta[name='_csrf_token']").attr("value");
+        var startdate=class_Formatdate(_self.attedtlform.startdate);
+        var enddate=class_Formatdate(_self.attedtlform.enddate);
+        $.ajax({
+            type:"post",
+            dataType:"json",
+            url:"[[@{/atte/timedtl/list?startdate=}]]"+startdate+"&enddate="+enddate+"&pageNo="+pageno+"&pageSize="+pagesize,
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data:JSON.stringify(_self.attedtlform),
+            success:function(ret){
+                _self.totSize=ret.PageResult.totalCount;
+                _self.tableData=ret.PageResult.list;
+                if(_self.totSize == 0 ){
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+
+            }
+        })
+    }
+
+    function dtl_getFillData(_self,row){
+            _self.dtlDiaForm.atteno=row.atteno;
+            _self.dtlDiaForm.custname=row.custname;
+            _self.dtlDiaForm.state=row.state;
+            _self.dtlDiaForm.remark=row.remark;
+    }
+
+    function attedtl_saveData(_that,formName) {
+            var atteno=_that.dtlDiaForm.atteno;
+            var state=_that.dtlDiaForm.state;
+            var remark=_that.dtlDiaForm.remark;
+            if(remark==null){
+                remark='';
+            }
+            var token=$("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                url: '[[@{/atte/updatetimeDtl?atteno=}]]'+atteno+"&state="+state+"&remark="+remark,
+                dataType: "json",
+                contentType: "application/json",
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                success: function (data) {
+                    if (data.errStr == undefined) {
+                        layer.msg('用户认证已过期，请重新登录', {icon: 2, time: 1000});
+                        window.location = "login";
+                        return;
+                    }
+                    if (data.errStr != "") {
+                        layer.msg(data.errStr, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('保存信息成功!', {icon: 1, time: 1000});
+                        _that.dialogFormVisible = false;
+                        dtl_refreshThisTable();
+                        _that.$refs[formName].resetFields();
+                    }
+                }
+            })
+
+    }
+
+    function dtl_refreshThisTable(){
+        attedtl_commonQuery(timedtl_vue,timedtl_vue.currPage,timedtl_vue.pageSize);
+    };
+
+
+
+
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/ncmgr/nc_time.html b/src/main/resources/templates/ncmgr/nc_time.html
index 28f38f7..506dc3e 100644
--- a/src/main/resources/templates/ncmgr/nc_time.html
+++ b/src/main/resources/templates/ncmgr/nc_time.html
@@ -54,6 +54,13 @@
                             width="200">
                     </el-table-column>
                     <el-table-column
+                            prop="timetype"
+                            label="时段类型"
+                            sortable
+                            :formatter="timetypefor"
+                            width="190">
+                    </el-table-column>
+                    <el-table-column
                             prop="updtime"
                             label="更新时间"
                             :formatter="updform">
@@ -90,6 +97,18 @@
                             </div>
                         </div>
                     </el-form-item>
+                    <el-form-item label="时段类型:" prop="timetype">
+                        <el-col :span="18">
+                            <el-select v-model="timeDiaForm.timetype" style="width: 187px;" clearable filterable placeholder="请选择">
+                                <el-option
+                                        v-for="timetype in timetypelist"
+                                        :key="timetype.value"
+                                        :label="timetype.label"
+                                        :value="timetype.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
                     <el-form-item label="开始时间:"  prop="btime">
                         <el-col :span="15">
                             <el-time-picker placeholder="选择时间" @change="pickbTime" v-model="timeDiaForm.btime" style="width: 187px"></el-time-picker>
@@ -123,13 +142,15 @@
             timeform:{
                 timename:''
             },
+            timetypelist:[{value:0,label:'默认'},{value:1,label:'考到'},{value:2,label:'考离'}],
             dialogFormVisible: false,
             dlgAllotDevVisible:false,
             timeDiaForm:{
                 timeid:'',
                 timename:'',
                 btime:new Date(),
-                etime:new Date()
+                etime:new Date(),
+                timetype:0
             },
             rules:{
                 timename:[
@@ -219,6 +240,12 @@
                 if(row.updtime != null) {
                     return time_timeformatter(row.updtime);
                 }
+            },
+            timetypefor:function(row){
+                if(row.timetype ==null){
+                    row.timetype=0;
+                }
+                return timetype_formatter(row.timetype);
             }
         },
         created:function(){
@@ -243,6 +270,17 @@
 //        return [year,month,date].join('-')+' '+[hour,moment,second].join(':');
 
     }
+    function timetype_formatter(type){
+        var list = time_vue.timetypelist;
+
+        if(type!=null){
+            for(var i=0;i<list.length;i++){
+                if(list[i].value == type){
+                    return list[i].label;
+                }
+            }
+        }
+    }
     function time_refreshThisTable(){
         time_commonQuery(time_vue,time_vue.timeform.timename,time_vue.currPage,time_vue.pageSize);
     };
@@ -306,6 +344,12 @@
                     _self.timeDiaForm.btime = new Date(year,mon,day,btime[0],btime[1]);
                     _self.timeDiaForm.etime = new Date(year,mon,day,etime[0],etime[1]);
                 }
+                if(ret.time==null || ret.time.timetype==null){
+                    _self.timeDiaForm.timetype==0;
+                }else{
+                    _self.timeDiaForm.timetype=ret.time.timetype;
+                }
+
             }
         })
     }
