diff --git a/build.gradle b/build.gradle
index c97349e..e073b25 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,6 +56,9 @@
     implementation group: 'commons-codec', name: 'commons-codec', version: '1.6'
     implementation files('libs/ojdbc6.jar')
 
+    implementation 'cn.afterturn:easypoi-web:3.0.3'
+    implementation 'cn.afterturn:easypoi-base:3.0.3'
+
 
     annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
 
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcDevBean.java b/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcDevBean.java
new file mode 100644
index 0000000..107133c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcDevBean.java
@@ -0,0 +1,85 @@
+package com.supwisdom.dlpay.ncmgr.bean;
+
+public class NcDevBean {
+    private int deviceid;
+    private String devname;
+    private String devphyid;
+    private String ip;
+    private int fdevid;
+    private String devtype;
+    private int devno;
+    private String usetype;
+    private String buildingid;
+
+    public int getDeviceid() {
+        return deviceid;
+    }
+
+    public void setDeviceid(int deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    public String getDevname() {
+        return devname;
+    }
+
+    public void setDevname(String devname) {
+        this.devname = devname;
+    }
+
+    public String getDevphyid() {
+        return devphyid;
+    }
+
+    public void setDevphyid(String devphyid) {
+        this.devphyid = devphyid;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public int getFdevid() {
+        return fdevid;
+    }
+
+    public void setFdevid(int fdevid) {
+        this.fdevid = fdevid;
+    }
+
+    public String getDevtype() {
+        return devtype;
+    }
+
+    public void setDevtype(String devtype) {
+        this.devtype = devtype;
+    }
+
+    public int getDevno() {
+        return devno;
+    }
+
+    public void setDevno(int devno) {
+        this.devno = devno;
+    }
+
+    public String getBuildingid() {
+        return buildingid;
+    }
+
+    public void setBuildingid(String buildingid) {
+        this.buildingid = buildingid;
+    }
+
+    public String getUsetype() {
+        return usetype;
+    }
+
+    public void setUsetype(String usetype) {
+        this.usetype = usetype;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java b/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java
new file mode 100644
index 0000000..cc51b13
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/bean/NcTimeBean.java
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.ncmgr.bean;
+
+public class NcTimeBean {
+	private int timeid;
+	private String timename;
+	private String btime;
+	private String etime;
+	public String getTimename() {
+		return timename;
+	}
+	public void setTimename(String timename) {
+		this.timename = timename;
+	}
+	public int getTimeid() {
+		return timeid;
+	}
+	public void setTimeid(int timeid) {
+		this.timeid = timeid;
+	}
+	public String getBtime() {
+		return btime;
+	}
+	public void setBtime(String btime) {
+		this.btime = btime;
+	}
+	public String getEtime() {
+		return etime;
+	}
+	public void setEtime(String etime) {
+		this.etime = etime;
+	}
+}
+
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
new file mode 100644
index 0000000..c052817
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -0,0 +1,880 @@
+package com.supwisdom.dlpay.ncmgr.controller;
+
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.ncmgr.bean.NcDevBean;
+import com.supwisdom.dlpay.ncmgr.bean.NcTimeBean;
+import com.supwisdom.dlpay.ncmgr.domain.*;
+import com.supwisdom.dlpay.ncmgr.service.NcService;
+import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.SystemService;
+import com.supwisdom.dlpay.util.RedisUtil;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/ncmgr")
+public class NcMgrController {
+    protected static Logger logger = Logger.getLogger(NcMgrController.class);
+
+    @Autowired
+    private NcService ncService;
+    @Autowired
+    private SystemService systemService;
+
+    @RequestMapping("/devindex")
+    public String devindex(ModelMap model) {
+        return "ncmgr/nc_dev";
+    }
+
+    @GetMapping("/timeindex")
+    public String timeindex() {
+        return "ncmgr/nc_time";
+    }
+
+    @GetMapping("/timegrpindex")
+    public String timegrpdex() {
+        return "ncmgr/nc_timegrp";
+    }
+
+    @GetMapping("/weektimeindex")
+    public String weektimeindex() {
+        return "ncmgr/nc_weektime";
+    }
+
+    @RequestMapping("/devweek")
+    public String devweek(ModelMap model){
+        return "ncmgr/nc_devweek";
+    }
+
+    /**
+     * 查询设备信息
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param devname
+     * @param buildingid
+     * @param devtype
+     * @return
+     */
+    @RequestMapping("/loadDevList")
+    @ResponseBody
+    public Map loadDevList(HttpServletRequest request,
+                           HttpServletResponse response,
+                           @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                           @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                           @RequestParam(value = "devname", required = false, defaultValue = "") String devname,
+                           @RequestParam(value = "buildingid", required = false, defaultValue = "") String buildingid,
+                           @RequestParam(value = "devtype", required = false, defaultValue = "") String devtype){
+        Map map = new HashMap();
+        try{
+            Pagination page = null;
+            page = ncService.getNcDeviceWithPage(devname, pageNo, pageSize, map, buildingid, devtype);
+            map.put("PageResult", page);
+            List<TDictionaryId> dicts = systemService.findTDictionaryByType(8);
+            map.put("dicts", dicts);
+            List<TBuilding> buildings = ncService.getAllBuilding();
+            map.put("buildings", buildings);
+            List<TNcDevice> devices = ncService.getDevByType("C");
+            map.put("devices", devices);
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error("查询设备失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 获取设备信息
+     * @param deviceid
+     * @return
+     */
+    @RequestMapping("/loadNcDevForUpdate")
+    @ResponseBody
+    public Map loadNcDevForUpdate(@RequestParam(value = "deviceid") int deviceid){
+        Map map = new HashMap();
+        try {
+            TNcDevice device = ncService.findDevById(deviceid);
+            map.put("device", device);
+            List<TDictionaryId> dicts = systemService.findTDictionaryByType(8);//设备类型  C：控制器  R：读头
+            map.put("dicts", dicts);
+            List<TBuilding> buildings = ncService.getAllBuilding();
+            map.put("buildings", buildings);
+            List<TNcDevice> devices = ncService.getDevByType("C");//根据设备类型获取设备
+            map.put("devices", devices);
+            List<TDictionaryId> devUseType = systemService.findTDictionaryByType(16);//获取设备使用类别
+            map.put("devUseType", devUseType);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 添加或修改设备
+     * @param postData
+     * @param request
+     * @param response
+     * @return
+     */
+    @PostMapping("/saveNcDev")
+    @ResponseBody
+    public Map saveNcDev(@RequestBody NcDevBean postData,
+                         HttpServletRequest request, HttpServletResponse response){
+        Map map = new HashMap();
+        try {
+            //需要校验名称，读头编号，物理编号是否重复
+            //大于0则更新，否则为新加记录
+            TNcDevice device;
+            if (postData.getDeviceid()>0) {
+                device = ncService.validDevName(postData.getDeviceid(), postData.getDevname());
+                if (device != null && device.getDeviceid() > 0) {
+                    map.put("errStr", "设备名称已经存在!");
+                    return map;
+                }
+                device = ncService.validDevPhyid(postData.getDeviceid(),postData.getDevphyid());
+                if (device !=null && device.getDeviceid()>0){
+                    map.put("errStr", "设备物理编号已经存在!");
+                    return map;
+                }
+                if(postData.getDevtype().equals("R")){
+                    device = ncService.validDevNo(postData.getFdevid(),postData.getDevno(),postData.getDeviceid());
+                    if (device !=null && device.getDeviceid()>0){
+                        map.put("errStr", "该控制器下读头号已经存在!");
+                        return map;
+                    }
+                    TNcDevice fDev = ncService.findDevById(postData.getFdevid());
+                    TBuilding buidingF = ncService.getBuidingById(fDev.getBuildingid());
+                    if (!postData.getBuildingid().equals(buidingF.getBuildingid())){
+                        map.put("errStr", "该读头和其控制器读头楼栋不一致!");
+                        return map;
+                    }
+                }
+
+                TNcDevice devUpdate = ncService.findDevById(postData.getDeviceid());
+                devUpdate.setDevname(postData.getDevname());
+                devUpdate.setDevphyid(postData.getDevphyid());
+                devUpdate.setDevtype(postData.getDevtype());
+                devUpdate.setFdevid(postData.getFdevid());
+                devUpdate.setDevno(postData.getDevno());
+                devUpdate.setIp(postData.getIp());
+                devUpdate.setOperflag("A");
+                devUpdate.setSyncfalg("S");
+                devUpdate.setUpdtime(DateUtil.getNow());
+                devUpdate.setSynctime(DateUtil.getNow());
+                devUpdate.setBuildingid(postData.getBuildingid());
+                TBuilding buiding = ncService.getBuidingById(postData.getBuildingid());
+                devUpdate.setBuildingname(buiding.getBuildingname());
+
+                ncService.updateDevice(devUpdate);
+
+                map.put("errStr", "");
+            }else {
+                //添加设备
+                device = ncService.validDevName(0,postData.getDevname());
+                if (device !=null && device.getDeviceid()>0){
+                    map.put("errStr", "设备名称已经存在!");
+                    return map;
+                }
+                device = ncService.validDevPhyid(0,postData.getDevphyid());
+                if (device !=null && device.getDeviceid()>0){
+                    map.put("errStr", "设备物理编号已经存在!");
+                    return map;
+                }
+                if(postData.getDevtype().equals("R")){
+                    device = ncService.validDevNo(postData.getFdevid(),postData.getDevno(),0);
+                    if (device !=null && device.getDeviceid()>0){
+                        map.put("errStr", "该控制器下读头号已经存在!");
+                        return map;
+                    }
+                    TNcDevice fDev = ncService.findDevById(postData.getFdevid());
+                    TBuilding buidingF = ncService.getBuidingById(fDev.getBuildingid());
+                    if (!postData.getBuildingid().equals(buidingF.getBuildingid())){
+                        map.put("errStr", "该读头和其控制器读头楼栋不一致!");
+                        return map;
+                    }
+                }
+                if(postData.getDevtype().equals("R")){
+                    RedisUtil.del("ncdev_" + postData.getDevphyid() + "_" + postData.getDevno());
+                    RedisUtil.set("ncdev_" + postData.getDevphyid() + "_" + postData.getDevno(),String.valueOf(postData.getDeviceid()));
+                }
+
+                int maxId = ncService.getMaxId();
+                TNcDevice devAdd = new TNcDevice();
+                devAdd.setDeviceid(maxId+1);
+                devAdd.setDevname(postData.getDevname());
+                devAdd.setDevphyid(postData.getDevphyid().toUpperCase());
+                devAdd.setDevtype(postData.getDevtype());
+                devAdd.setFdevid(postData.getFdevid());
+                devAdd.setDevno(postData.getDevno());
+                devAdd.setIp(postData.getIp());
+                devAdd.setBuildingid(postData.getBuildingid());
+                TBuilding buiding = ncService.getBuidingById(postData.getBuildingid());
+                devAdd.setBuildingname(buiding.getBuildingname());
+                devAdd.setOperflag("A");
+                devAdd.setSyncfalg("S");
+                devAdd.setUpdtime(DateUtil.getNow());
+                devAdd.setSynctime(DateUtil.getNow());
+                devAdd.setUsetype(postData.getUsetype());
+                TNcDevice fdev = ncService.findDevById(postData.getFdevid());
+                if(postData.getDevtype().equals("R")){
+                    RedisUtil.set("ncdev_" + fdev.getDevphyid() + "_" + postData.getDevno(),String.valueOf(maxId+1));
+                }
+                ncService.saveDevice(devAdd);
+                map.put("errStr", "");
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("errStr", "添加设备失败！");
+            logger.error("添加设备失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 设备删除
+     * @param devid
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/deleteNcDev", method = {RequestMethod.GET})
+    @ResponseBody
+    public Map deleteNcDev(@RequestParam(value = "devid") int devid,
+                              HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        String message = "";
+        try {
+            TNcDevice dev = ncService.getDevInfoByDevid(devid);
+            if(dev!=null){
+                RedisUtil.del("ncdev_" + dev.getDevphyid() + "_" + dev.getDevno());
+            }
+
+            ncService.delDevById(devid);
+            RedisUtil.incr("zcard_max_version");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = "删除设备出现异常!";
+            logger.error("删除设备失败：" + e.getMessage());
+        }
+        map.put("message", message);
+        return map;
+
+    }
+
+    /**
+     * 清除设备名单
+     * @param devid
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/listClean", method = {RequestMethod.GET})
+    @ResponseBody
+    public Map listClean(@RequestParam(value = "devid") int devid,
+                         HttpServletRequest request, HttpServletResponse response){
+        Map map = new HashMap();
+        String message="";
+        try{
+            TNcCardlist cleanList = ncService.getCleanList(devid + "");
+            if (cleanList==null) {
+                //如果该设备没有清空专用名单则添加一个(直接添加到同步表里)
+                TNcCardlist tNcCardlist = new TNcCardlist();
+                long listid = RedisUtil.incr("seq_door");
+                tNcCardlist.setListid(listid + "");
+                tNcCardlist.setCustid(0);
+                tNcCardlist.setStuempno("");
+                tNcCardlist.setCustname(devid + "设备清除名单");
+                tNcCardlist.setCardno(0);
+                tNcCardlist.setCardphyid("FFFFFFFF");
+                tNcCardlist.setDeptcode("");
+                tNcCardlist.setDeptname("");
+                tNcCardlist.setClosedate("20991231");
+                tNcCardlist.setDeviceid(devid + "");
+                //清除名单专用标志
+                tNcCardlist.setOperflag("C");
+                tNcCardlist.setRectime(DateUtil.getNow());
+                tNcCardlist.setSynctime("");
+                tNcCardlist.setSyncflag("N");
+                tNcCardlist.setRtnflag("N");
+                tNcCardlist.setRtntime("");
+                ncService.saveCardlist(tNcCardlist);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            message = "设备名单清空异常!";
+            logger.error("设备名单清空失败："+e.getMessage());
+        }
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 设备名单重下
+     * @param devid
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/listReload", method = {RequestMethod.GET})
+    @ResponseBody
+    public Map listReload(@RequestParam(value = "devid") int devid,
+                          HttpServletRequest request, HttpServletResponse response){
+        Map map = new HashMap();
+        String message="";
+        try{
+            //修改该设备名单同步标志为未同步
+            ncService.updateForListReload(devid+"");
+        }catch (Exception e){
+            e.printStackTrace();
+            message = "设备名单重下异常!";
+            logger.error("设备名单重下失败"+e.getMessage());
+        }
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 获取时间段
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param timename
+     * @return
+     */
+    @RequestMapping(value = "/loadTimeList")
+    @ResponseBody
+    public Map loadTimeList(HttpServletRequest request,
+                            HttpServletResponse response,
+                            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                            @RequestParam(value = "timename", required = true, defaultValue = "") String timename){
+        Map map = new HashMap();
+        try {
+            Pagination page = null;
+            page = ncService.getNcTimeWithPage(timename, pageNo, pageSize, map);
+            map.put("PageResult", page);
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error("查询设备失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除时间段
+     * @param timeid
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/deleteNcTime", method = {RequestMethod.GET})
+    @ResponseBody
+    public Map deleteNcTime(@RequestParam(value = "timeid") int timeid,
+                            HttpServletRequest request, HttpServletResponse response){
+        Map map = new HashMap();
+        String message = "";
+        int flag=0;
+        try {
+            List<String> timegrpIdById = ncService.getTimegrpIdById(timeid);
+            if(timegrpIdById.size()>0){
+                message = "时间段已被应用于时间组，删除失败！";
+                flag=1;
+            }else {
+                ncService.delTimeByTimeId(timeid);
+                ncService.updListVersion();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = "删除时间段出现异常!";
+            logger.error("删除时间段失败：" + e.getMessage());
+        }
+        map.put("flag",flag);
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 获取时间段信息
+     * @param timeid
+     * @return
+     */
+    @RequestMapping("/loadNcTimeForUpdate")
+    @ResponseBody
+    public Map loadNcTimeForUpdate(@RequestParam(value = "timeid") int timeid) {
+        Map map = new HashMap();
+        try {
+            TNcTime time = ncService.findByTimeId(timeid);
+            map.put("time", time);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 添加时间段
+     * @param postData
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/addNcTime", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map addNcTime(@RequestBody NcTimeBean postData,
+                              HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        try {
+            TNcTime time = ncService.findByTimeName(postData.getTimename());
+            TNcTime ts = null;
+            if (time == null) {
+                int timeid = ncService.getMaxTimeId();
+                ts = new TNcTime();
+                ts.setTimeid(timeid+1);
+                ts.setTimename(postData.getTimename());
+                ts.setBtime(postData.getBtime());
+                ts.setEtime(postData.getEtime());
+                ts.setOperflag("A");
+                ts.setSyncflag("");
+                ts.setUpdtime(DateUtil.getNow());
+
+                ncService.saveTime(ts);
+                map.put("errStr", "");
+            } else {
+                map.put("errStr", "时间段名称已经存在，请修改！");
+                return map;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "添加时间段失败！");
+            logger.error("添加时间段失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 修改时间段信息
+     * @param bean
+     * @param request
+     * @return
+     */
+    @RequestMapping(value = "/updateNcTime", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map updateNcTime(@RequestBody NcTimeBean bean,
+                                 HttpServletRequest request) {
+        Map map = new HashMap();
+        try {
+            if (bean == null) {
+                map.put("errStr", "请先选择时间段，然后再修改！");
+                return map;
+            }
+            TNcTime temp = ncService.findByIdAndName(bean.getTimeid(), bean.getTimename());
+            if (temp != null) {
+                map.put("errStr", "该时间段名称已存在，请重新修改!");
+                return map;
+            }
+
+            TNcTime time = ncService.findByTimeId(bean.getTimeid());
+            time.setTimename(bean.getTimename());
+            time.setBtime(bean.getBtime());
+            time.setEtime(bean.getEtime());
+            time.setOperflag("A");//操作标记  A：添加   D：删除
+            time.setSyncflag("");
+            time.setUpdtime(DateUtil.getNow());
+            ncService.updateTime(time);
+            ncService.updListVersion();
+            RedisUtil.incr("zcard_max_version");
+            map.put("errStr", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "修改时间段信息失败!");
+            logger.error("时间段信息修改：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 分页获取所有时间组信息
+     *
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param timegrpname 时间组名称
+     * @return
+     */
+    @RequestMapping(value = "/loadTimegrpList")
+    @ResponseBody
+    public Map loadTimegrpList(
+            HttpServletRequest request,
+            HttpServletResponse response,
+            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+            @RequestParam(value = "timegrpname", required = true, defaultValue = "") String timegrpname) {
+        Map map = new HashMap();
+        try {
+            Pagination page = null;
+            page = ncService.getNcTimeGrpWithPage(timegrpname, pageNo, pageSize, map);
+            List<TNcTime> timelist = ncService.findAllNcTime();
+            map.put("PageResult", page);
+            map.put("timelist", timelist);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error("查询时间组失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 获取时间组信息
+     *
+     * @param timegrpid 时间组编号
+     * @return
+     */
+    @RequestMapping("/loadNcTimeGrpForUpdate")
+    @ResponseBody
+    public Map loadNcTimeGrpForUpdate(
+                                        @RequestParam(value = "timegrpid") int timegrpid) {
+        Map map = new HashMap();
+        try {
+            TNcTimegrp timegrp = ncService.findByTimeGrpId(timegrpid);
+            map.put("timegrp", timegrp);
+            List<TNcTime> timelist = ncService.findAllNcTime();
+            map.put("timelist", timelist);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error("获取时间组信息失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+
+    /**
+     * 添加时间组
+     *
+     * @param postData 时间组信息
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/addNcTimegrp", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map addNcTime(@RequestBody TNcTimegrp postData,
+                              HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        try {
+            TNcTimegrp timegrp = ncService.findByTimeGrpName(postData.getTimegrpname());
+
+            TNcTimegrp ts = null;
+            if (timegrp == null) {
+                int timegrpid = ncService.getMaxTimeGrpId();
+                ts = new TNcTimegrp();
+                ts.setTimegrpid(timegrpid+1);
+                ts.setTimegrpname(postData.getTimegrpname());
+                ts.setTimeid1(postData.getTimeid1());
+                ts.setTimeid2(postData.getTimeid2());
+                ts.setTimeid3(postData.getTimeid3());
+                ts.setTimeid4(postData.getTimeid4());
+                ts.setTimeid5(postData.getTimeid5());
+                ts.setTimeid6(postData.getTimeid6());
+                ts.setAdddelflag(1);
+                ts.setDownstatus(0);
+                ts.setUpdatetime(DateUtil.getNow());
+
+                ncService.saveTimegrp(ts);
+                map.put("errStr", "");
+            } else {
+                map.put("errStr", "时间组名称已经存在，请修改！");
+                return map;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "添加时间组失败！");
+            logger.error("添加时间组失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 修改时间组信息
+     * @param bean
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updateNcTimegrp", method = {RequestMethod.POST})
+    public Map updateNcTimegrp(@RequestBody TNcTimegrp bean,
+                                    HttpServletRequest request) {
+        Map map = new HashMap();
+        try {
+            if (bean == null) {
+                map.put("errStr", "请先选择时间组，然后再修改！");
+                return map;
+            }
+            TNcTimegrp temp = ncService.findByGrpIdAndName(bean.getTimegrpid(), bean.getTimegrpname());
+            if (temp != null) {
+                map.put("errStr", "该时间组名称已存在，请重新修改!");
+                return map;
+            }
+
+            TNcTimegrp timegrp = ncService.findByTimeGrpId(bean.getTimegrpid());
+            timegrp.setTimegrpname(bean.getTimegrpname());
+            timegrp.setTimeid1(bean.getTimeid1());
+            timegrp.setTimeid2(bean.getTimeid2());
+            timegrp.setTimeid3(bean.getTimeid3());
+            timegrp.setTimeid4(bean.getTimeid4());
+            timegrp.setTimeid5(bean.getTimeid5());
+            timegrp.setTimeid6(bean.getTimeid6());
+            timegrp.setAdddelflag(1);
+            timegrp.setDownstatus(0);
+            timegrp.setUpdatetime(DateUtil.getNow());
+            ncService.updateTimegrp(timegrp);
+            ncService.updListVersion();
+            RedisUtil.incr("zcard_max_version");
+            map.put("errStr", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "修改时间组信息失败!");
+            logger.error("时间组信息修改：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除时间组
+     * @param timegrpid
+     * @param request
+     * @param response
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/deleteNcTimegrp", method = {RequestMethod.GET})
+    public Map deleteNcTimegrp(@RequestParam(value = "timegrpid") int timegrpid,
+                                  HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        String message = "";
+        int flag = 0;
+            try {
+                List<String> weekTimeById = ncService.getWeekTimeById(timegrpid);
+                if(weekTimeById.size()>0){
+                    message="时间组已应用于时间周，删除失败！";
+                    flag=1;
+                }else {
+                    ncService.delByGrpId(timegrpid);
+                    ncService.updListVersion();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                message = "删除时间组出现异常!";
+                logger.error("删除时间组失败：" + e.getMessage());
+            }
+        map.put("flag",flag);
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 查询获取时间周信息列表
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param weektimename
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/loadweektimeList")
+    public Map loadweektimeList(
+            HttpServletRequest request,
+            HttpServletResponse response,
+            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+            @RequestParam(value = "weektimename", required = true, defaultValue = "") String weektimename) {
+        Map map = new HashMap();
+        try {
+            Pagination page = null;
+            page = ncService.getNcWeekTimeWithPage(weektimename, pageNo, pageSize, map);
+            List<TNcTimegrp> timegrp = ncService.findAllNcTimeGrp();
+            map.put("PageResult", page);
+            map.put("timegrp", timegrp);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error("查询时间组失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+
+    /**
+     * 获取时间周信息
+     *
+     * @param weektimeid 时间周编号
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadNcweektimeForUpdate")
+    public Map loadNcweektimeForUpdate(
+                                          @RequestParam(value = "weektimeid") int weektimeid) {
+        Map map = new HashMap();
+        try {
+            TNcWeektime weektime = ncService.findByWeekTimeId(weektimeid);
+            map.put("weektime", weektime);//时间周
+            List<TNcTimegrp> timegrp = ncService.findAllNcTimeGrp();
+            map.put("timegrp", timegrp);//时间组信息
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 添加时间周
+     * @param postData
+     * @param request
+     * @param response
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addNcweektime", method = {RequestMethod.POST})
+    public Map addNcweektime(@RequestBody TNcWeektime postData,
+                                  HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        try {
+            TNcWeektime weektime = ncService.findByWeekTimeName(postData.getWeekname());
+
+            TNcWeektime ts = null;
+            int weektimeid=ncService.getMaxWeekId();//weekid最小值3，最大值15
+            if (weektimeid==0){
+                weektimeid=3;
+            }else{
+                weektimeid= weektimeid+1;
+            }
+
+            if(weektimeid>=15){
+                map.put("errStr","时间周数量超限！");
+            }
+            if (weektime == null) {
+                ts = new TNcWeektime();
+                ts.setWeekid(weektimeid);
+                ts.setWeekname(postData.getWeekname());
+                ts.setDay1grpid(postData.getDay1grpid());
+                ts.setDay2grpid(postData.getDay2grpid());
+                ts.setDay3grpid(postData.getDay3grpid());
+                ts.setDay4grpid(postData.getDay4grpid());
+                ts.setDay5grpid(postData.getDay5grpid());
+                ts.setDay6grpid(postData.getDay6grpid());
+                ts.setDay7grpid(postData.getDay7grpid());
+                ts.setAdddelflag(1);
+                ts.setDownstatus(0);
+                ts.setUpdatetime(DateUtil.getNow());
+
+                ncService.saveWeektime(ts);
+                map.put("errStr", "");
+            } else {
+                map.put("errStr", "时间周名称已经存在，请修改！");
+                return map;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "添加时间周失败！");
+            logger.error("添加时间周失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 修改时间周信息
+     * @param bean
+     * @param request
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/updateNcweektime", method = {RequestMethod.POST})
+    public Map updateNcweektime(@RequestBody TNcWeektime bean,
+                                     HttpServletRequest request) {
+        Map map = new HashMap();
+        try {
+            if (bean == null) {
+                map.put("errStr", "请先选择时间周，然后再修改！");
+                return map;
+            }
+            TNcWeektime temp = ncService.findByWeekIdAndName(bean.getWeekid(), bean.getWeekname());
+            if (temp != null) {
+                map.put("errStr", "该时间周名称已存在，请重新修改!");
+                return map;
+            }
+
+            TNcWeektime weektime = ncService.findByWeekTimeId(bean.getWeekid());
+            weektime.setWeekname(bean.getWeekname());
+            weektime.setDay1grpid(bean.getDay1grpid());
+            weektime.setDay2grpid(bean.getDay2grpid());
+            weektime.setDay3grpid(bean.getDay3grpid());
+            weektime.setDay4grpid(bean.getDay4grpid());
+            weektime.setDay5grpid(bean.getDay5grpid());
+            weektime.setDay6grpid(bean.getDay6grpid());
+            weektime.setDay7grpid(bean.getDay7grpid());
+            weektime.setAdddelflag(1);
+            weektime.setDownstatus(0);
+            weektime.setUpdatetime(DateUtil.getNow());
+            ncService.updateWeektime(weektime);
+            ncService.updListVersion();
+            RedisUtil.incr("zcard_max_version");
+            map.put("errStr", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "修改时间周信息失败!");
+            logger.error("时间周信息修改：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除时间周
+     * @param weektimeid
+     * @param request
+     * @param response
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/deleteNcweektime", method = {RequestMethod.GET})
+    public Map deleteNcweektime(@RequestParam(value = "weektimeid") int weektimeid,
+                                   HttpServletRequest request, HttpServletResponse response) {
+        Map map = new HashMap();
+        int flag=0;
+        String message="";
+        try {
+            List devWeekByWeekid = ncService.getDevWeekByWeekid(weektimeid);
+            if(devWeekByWeekid.size()>0){
+                message = "时间周已绑定设备，删除失败！";
+                flag=1;
+            }else {
+                ncService.delByWeekId(weektimeid);
+                ncService.updListVersion();
+                /*//删除doortime表中的时间周
+                webInterfaceService.delDoorTime("XKP_"+weektimeid);*/
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = "删除时间周出现异常!";
+            logger.error("删除时间周失败：" + e.getMessage());
+        }
+
+        map.put("flag",flag);
+        map.put("message", message);
+        return map;
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcCardListDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcCardListDao.java
new file mode 100644
index 0000000..b739b5d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcCardListDao.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.ncmgr.dao;
+
+import com.supwisdom.dlpay.ncmgr.domain.TNcCardlist;
+
+public interface NcCardListDao {
+
+    public TNcCardlist getCleanList(String devid);
+
+    public boolean saveCardlist(TNcCardlist bean);
+
+    public void updateForListReload(String devid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java
new file mode 100644
index 0000000..8624521
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java
@@ -0,0 +1,5 @@
+package com.supwisdom.dlpay.ncmgr.dao;
+
+public interface NcDevWeekDao {
+    public boolean updListVersion();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
new file mode 100644
index 0000000..908aa52
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.ncmgr.dao;
+
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevice;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+import java.util.Map;
+
+public interface NcDeviceDao {
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid, String devtype);
+
+    public List<TBuilding> getAllBuilding();
+
+    public TBuilding getBuidingById(String id);
+
+    public List<TNcDevice> getDevByType(String type);
+
+    public TNcDevice findDevById(int id);
+
+    public TNcDevice validDevName(int devid,String devname);
+
+    public TNcDevice validDevPhyid(int devid,String devPhyid);
+
+    public TNcDevice validDevNo(int fdevid,int devno,int devid);
+
+    public boolean updateDevice(TNcDevice bean);
+
+    public int getMaxId();
+
+    public boolean saveDevice(TNcDevice bean);
+
+    public TNcDevice getDevInfoByDevid(int devid);
+
+    public boolean delDevById(int devid);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcTimeDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcTimeDao.java
new file mode 100644
index 0000000..00b5f39
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcTimeDao.java
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.ncmgr.dao;
+
+import com.supwisdom.dlpay.ncmgr.domain.TNcTime;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface NcTimeDao {
+
+    public Pagination getNcTimeWithPage(String time, int pageNo, int pageSize);
+
+    public List<String> getTimegrpIdById(int id);
+
+    public boolean delTimeByTimeId(int id);
+
+    public TNcTime findByTimeId(int id);
+
+    public TNcTime findByTimeName(String name);
+
+    public int getMaxTimeId();
+
+    public boolean saveTime(TNcTime bean);
+
+    public TNcTime findByIdAndName(int id, String name);
+
+    public boolean updateTime(TNcTime bean);
+
+    public List<TNcTime> findAllNcTime();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcTimeGrpDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcTimeGrpDao.java
new file mode 100644
index 0000000..b7f2885
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcTimeGrpDao.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.ncmgr.dao;
+
+import com.supwisdom.dlpay.ncmgr.domain.TNcTimegrp;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface NcTimeGrpDao {
+
+    public Pagination getNcTimeGrpWithPage(String time, int pageNo, int pageSize);
+
+    public TNcTimegrp findByTimeGrpId(int id);
+
+    public TNcTimegrp findByTimeGrpName(String name);
+
+    public int getMaxTimeGrpId();
+
+    public boolean saveTimegrp(TNcTimegrp bean);
+
+    public TNcTimegrp findByGrpIdAndName(int id,String name);
+
+    public boolean updateTimegrp(TNcTimegrp bean);
+
+    public List<String> getWeekTimeById(int id);
+
+    public boolean delByGrpId(int id);
+
+    public List<TNcTimegrp> findAllNcTimeGrp();
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java
new file mode 100644
index 0000000..a6a0515
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.ncmgr.dao;
+
+import com.supwisdom.dlpay.ncmgr.domain.TNcWeektime;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface NcWeekTimeDao {
+
+    public Pagination getNcWeekTimeWithPage(String time, int pageNo, int pageSize);
+
+    public TNcWeektime findByWeekTimeId(int id);
+
+    public TNcWeektime findByWeekTimeName(String name);
+
+    public int getMaxWeekId();
+
+    public boolean saveWeektime(TNcWeektime bean);
+
+    public TNcWeektime findByWeekIdAndName(int id,String name);
+
+    public boolean updateWeektime(TNcWeektime bean);
+
+    public List getDevWeekByWeekid(int id);
+
+    public boolean delByWeekId(int id);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcCardListDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcCardListDaoImpl.java
new file mode 100644
index 0000000..96d22b3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcCardListDaoImpl.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.ncmgr.dao.impl;
+
+import com.supwisdom.dlpay.ncmgr.dao.NcCardListDao;
+import com.supwisdom.dlpay.ncmgr.domain.TNcCardlist;
+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;
+
+@Repository
+public class NcCardListDaoImpl implements NcCardListDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public TNcCardlist getCleanList(String devid) {
+        String sql = "select t from TNcCardlist t where t.deviceid=:devid and t.operflag = 'C'";
+        TypedQuery<TNcCardlist> query = entityManager.createQuery(sql, TNcCardlist.class);
+        query.setParameter(devid, devid);
+        TNcCardlist result = query.getSingleResult();
+        return result;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveCardlist(TNcCardlist bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public void updateForListReload(String devid) {
+        String sql = "update T_NC_CARDLIST set syncflag='N' ,synctime='' "+
+                " where deviceid=?1 and operflag != 'C'";
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter(1, devid);
+        query.executeUpdate();
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
new file mode 100644
index 0000000..566c33c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.ncmgr.dao.impl;
+
+import com.supwisdom.dlpay.ncmgr.dao.NcDevWeekDao;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+@Repository
+public class NcDevWeekDaoImpl implements NcDevWeekDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public boolean updListVersion() {
+        boolean flag=false;
+        try {
+            String sql = "update T_NC_DEVWEEK set version=version+1";
+            Query query = entityManager.createNativeQuery(sql);
+            query.executeUpdate();
+            flag=true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
new file mode 100644
index 0000000..ac6e59a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
@@ -0,0 +1,239 @@
+package com.supwisdom.dlpay.ncmgr.dao.impl;
+
+import com.supwisdom.dlpay.ncmgr.dao.NcDeviceDao;
+import com.supwisdom.dlpay.ncmgr.domain.TBuilding;
+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;
+import java.util.Map;
+
+@Repository
+public class NcDeviceDaoImpl implements NcDeviceDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, String buildingid, String devtype) {
+        String sql ="select * from T_Nc_Device bean where 1>0 and operflag='A'";
+        if(!devname.equals("")){
+            sql+="and devname like :devname ";
+        }
+        if(!buildingid.equals("")){
+            sql+="and  buildingid = :buildingid ";
+        }
+        if(!devtype.equals("")){
+            sql+="and  devtype = :devtype ";
+        }
+        sql+="order by devtype";
+        Query query = entityManager.createNativeQuery(sql,TNcDevice.class);
+
+        if(!devname.equals("")){
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if(!buildingid.equals("")){
+            query.setParameter("buildingid", buildingid);
+        }
+        if(!devtype.equals("")){
+            query.setParameter("devtype", devtype);
+        }
+        List<TNcDevice> list = query.getResultList();
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        page.setList(list);
+        int totalCount = list.size();
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    @Transactional
+    @Override
+    public List<TBuilding> getAllBuilding() {
+        String sql = " select b FROM TBuilding b WHERE b.flag='A' ";
+        TypedQuery<TBuilding> query = entityManager.createQuery(sql, TBuilding.class);
+        List<TBuilding> list = query.getResultList();
+        return list;
+    }
+
+    @Override
+    public TBuilding getBuidingById(String id) {
+        String sql = "select b from TBuilding b where b.flag='A' and b.buildingid=:buildingid";
+        TypedQuery<TBuilding> query = entityManager.createQuery(sql, TBuilding.class);
+        query.setParameter("buildingid", id);
+        List<TBuilding> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public List<TNcDevice> getDevByType(String type) {
+        String sql = "select r from TNcDevice r where r.devtype=?1 and r.operflag='A' order by r.devname";
+        Query query = entityManager.createQuery(sql);
+        query.setParameter(1, type);
+        List<TNcDevice> list = query.getResultList();
+        return list;
+    }
+
+    @Transactional
+    @Override
+    public TNcDevice findDevById(int id) {
+        String sql = " select r from TNcDevice r where  r.deviceid=:deviceid";
+        Query query = entityManager.createQuery(sql,TNcDevice.class);
+        query.setParameter("deviceid", id);
+        List<TNcDevice> list = query.getResultList();
+        if (list.size()>0) {
+            TNcDevice device = list.get(0);
+            return device;
+        }else {
+            return null;
+        }
+    }
+
+    @Transactional
+    @Override
+    public TNcDevice validDevName(int devid, String devname) {
+        String sql="";
+        if (devid==0){
+            sql="select d from TNcDevice d where d.devname=:devname";
+        }else {
+            sql="select d from TNcDevice d where d.deviceid != :devid  and d.devname=:devname";
+        }
+        TypedQuery<TNcDevice> query = entityManager.createQuery(sql, TNcDevice.class);
+        if (devid>0){
+            query.setParameter("devid", devid);
+        }
+        query.setParameter("devname", devname);
+        List<TNcDevice> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TNcDevice validDevPhyid(int devid, String devPhyid) {
+        String sql="";
+        if (devid==0){
+            sql="select d from TNcDevice d where d.devphyid=:devphyid";
+        }else {
+            sql="select d from TNcDevice d where d.deviceid!=:devid and d.devphyid=:devphyid";
+        }
+        TypedQuery<TNcDevice> query = entityManager.createQuery(sql, TNcDevice.class);
+        if (devid>0){
+            query.setParameter("devid", devid);
+        }
+        query.setParameter("devphyid", devPhyid);
+        List<TNcDevice> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TNcDevice validDevNo(int fdevid, int devno, int devid) {
+        String sql="";
+        if (devid==0){
+            sql="select d from TNcDevice d where d.fdevid=:fdevid and d.devno=:devno ";
+        }else {
+            sql="select d from TNcDevice d where d.fdevid=:fdevid and d.devno=:devno and d.deviceid!=:devid ";
+        }
+        TypedQuery<TNcDevice> query = entityManager.createQuery(sql, TNcDevice.class);
+        if (devid>0){
+            query.setParameter("devid", devid);
+        }
+        query.setParameter("fdevid", fdevid);
+        query.setParameter("devno", devno);
+        List<TNcDevice> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateDevice(TNcDevice bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public int getMaxId() {
+        String sql = " select Max(deviceid) from t_nc_device";
+        Query query = entityManager.createNativeQuery(sql);
+        Object result = query.getSingleResult();
+        if (result!=null){
+            return (int)result;
+        }
+        return 1;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveDevice(TNcDevice bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TNcDevice getDevInfoByDevid(int devid) {
+        String sql = "select t.deviceid,t.devno,t.devname,t.fdevid,t.devtype," +
+                " t.usetype,dev.devphyid from t_nc_device t left join t_nc_device" +
+                " dev on t.fdevid=dev.deviceid where t.deviceid=?1";
+        Query query = entityManager.createNativeQuery(sql, TNcDevice.class);
+        query.setParameter(1,devid);
+        List list = query.getResultList();
+        if (list.size()>0){
+            return (TNcDevice) list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean delDevById(int devid) {
+        boolean flag=false;
+        try {
+            String sql = "delete T_Nc_Device where deviceid=?1";
+            Query query = entityManager.createNativeQuery(sql);
+            query.setParameter(1, devid);
+            query.executeUpdate();
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
new file mode 100644
index 0000000..e276015
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
@@ -0,0 +1,171 @@
+package com.supwisdom.dlpay.ncmgr.dao.impl;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.dao.NcTimeDao;
+import com.supwisdom.dlpay.ncmgr.domain.TNcTime;
+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 NcTimeDaoImpl implements NcTimeDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getNcTimeWithPage(String timename, int pageNo, int pageSize) {
+        String sql = " select bean from TNcTime bean where 1>0 ";
+        if (!timename.equals("")) {
+            sql+=(" and bean.timename like :timename ");
+        }
+        TypedQuery<TNcTime> query = entityManager.createQuery(sql, TNcTime.class);
+        if (!timename.equals("")){
+            query.setParameter("timename", "%"+timename+"%");
+        }
+        List<TNcTime> list = query.getResultList();
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        page.setList(list);
+        int totalCount = list.size();
+        page.setTotalCount(totalCount);
+        return page;
+
+    }
+
+    @Transactional
+    @Override
+    public List<String> getTimegrpIdById(int id) {
+        String sql = "select timegrpid from t_nc_timegrp where " +
+                " timeid1=?1 or timeid2=?2 or timeid3=?3 or timeid4=?4 " +
+                " or timeid5=?5 or timeid6=?6 ";
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter(1, id);
+        query.setParameter(2, id);
+        query.setParameter(3, id);
+        query.setParameter(4, id);
+        query.setParameter(5, id);
+        query.setParameter(6, id);
+        List<String> list = query.getResultList();
+
+        return list;
+    }
+
+    @Transactional
+    @Override
+    public boolean delTimeByTimeId(int id) {
+        boolean flag = false;
+        try {
+            String sql = "delete from TNcTime t where t.timeid=?1";
+            Query query = entityManager.createQuery(sql);
+            query.setParameter(1, id);
+            query.executeUpdate();
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TNcTime findByTimeId(int id) {
+        String sql = "select r from TNcTime r where r.timeid=:id";
+        TypedQuery<TNcTime> query = entityManager.createQuery(sql, TNcTime.class);
+        query.setParameter("id", id);
+        List<TNcTime> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TNcTime findByTimeName(String name) {
+        String sql = "select r from TNcTime r where r.timename=:timename";
+        TypedQuery<TNcTime> query = entityManager.createQuery(sql, TNcTime.class);
+        query.setParameter("timename", name);
+        List<TNcTime> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public int getMaxTimeId() {
+        String sql = " select Max(timeid) from t_nc_time";
+        Query query = entityManager.createNativeQuery(sql);
+        Object result = query.getSingleResult();
+        if (result!=null){
+            return (int)result;
+        }
+        return 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveTime(TNcTime bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TNcTime findByIdAndName(int id, String name) {
+        String sql = "select bean from TNcTime bean where bean.timename=?1 ";
+        if (id!=0) {
+            sql += " and bean.timeid<>:timeid ";
+        }
+        TypedQuery<TNcTime> query = entityManager.createQuery(sql, TNcTime.class);
+        query.setParameter(1, name);
+        if (id!=0) {
+            query.setParameter("timeid", id);
+        }
+        List<TNcTime> list = query.getResultList();
+        if (list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateTime(TNcTime bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<TNcTime> findAllNcTime() {
+        String sql = " select r from TNcTime r order by r.timeid";
+        TypedQuery<TNcTime> query = entityManager.createQuery(sql, TNcTime.class);
+        List<TNcTime> list = query.getResultList();
+        return list;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java
new file mode 100644
index 0000000..3d9e931
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeGrpDaoImpl.java
@@ -0,0 +1,167 @@
+package com.supwisdom.dlpay.ncmgr.dao.impl;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.dao.NcTimeGrpDao;
+import com.supwisdom.dlpay.ncmgr.domain.TNcTimegrp;
+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 NcTimeGrpDaoImpl implements NcTimeGrpDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getNcTimeGrpWithPage(String timename, int pageNo, int pageSize) {
+        String sql = "select bean from TNcTimegrp bean where 1>0 ";
+        if (!timename.isEmpty()){
+            sql+= " and bean.timegrpname like :timename ";
+        }
+        TypedQuery<TNcTimegrp> query = entityManager.createQuery(sql, TNcTimegrp.class);
+        if (!timename.isEmpty()){
+            query.setParameter("timename", "%"+timename+"%");
+        }
+        List<TNcTimegrp> list = query.getResultList();
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        page.setList(list);
+        int totalCount = list.size();
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    @Transactional
+    @Override
+    public TNcTimegrp findByTimeGrpId(int id) {
+        String sql = "select r from TNcTimegrp r where r.timegrpid=:id";
+        TypedQuery<TNcTimegrp> query = entityManager.createQuery(sql, TNcTimegrp.class);
+        query.setParameter("id", id);
+        List<TNcTimegrp> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TNcTimegrp findByTimeGrpName(String name) {
+        String sql = " select r from TNcTimegrp r where r.timegrpname=:name";
+        TypedQuery<TNcTimegrp> query = entityManager.createQuery(sql, TNcTimegrp.class);
+        query.setParameter("name", name);
+        List<TNcTimegrp> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public int getMaxTimeGrpId() {
+        String sql = "select Max(timegrpid) from t_nc_timegrp";
+        Query query = entityManager.createNativeQuery(sql);
+        Object result = query.getSingleResult();
+        if (result!=null){
+            return (int)result;
+        }
+        return 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveTimegrp(TNcTimegrp bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TNcTimegrp findByGrpIdAndName(int id, String name) {
+        String sql = "select bean from TNcTimegrp bean where bean.timegrpname=?1 ";
+        if (!StringUtil.isEmpty(name)) {
+            sql += " and bean.timegrpid<>:timeid ";
+        }
+        TypedQuery<TNcTimegrp> query = entityManager.createQuery(sql, TNcTimegrp.class);
+        query.setParameter(1, name);
+        if (id!=0){
+            query.setParameter("timeid", id);
+        }
+        List<TNcTimegrp> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateTimegrp(TNcTimegrp bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<String> getWeekTimeById(int id) {
+        try{
+            String sql = "select t.weekid from TNcWeektime t where (t.day1grpid=:id or t.day2grpid=:id " +
+                    " or t.day3grpid=:id or t.day4grpid=:id or t.day5grpid=:id or t.day6grpid=:id " +
+                    " or t.day7grpid=:id) and t.adddelflag='1'";
+            Query query = entityManager.createQuery(sql);
+            query.setParameter("id",id);
+            List list = query.getResultList();
+            return list;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean delByGrpId(int id) {
+        boolean flag = false;
+        try {
+            String sql = "delete from TNcTimegrp t where t.timegrpid=?1";
+            Query query = entityManager.createQuery(sql);
+            query.setParameter(1, id);
+            query.executeUpdate();
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Override
+    public List<TNcTimegrp> findAllNcTimeGrp() {
+        String sql = " select r from TNcTimegrp r order by r.timegrpid";
+        TypedQuery<TNcTimegrp> query = entityManager.createQuery(sql, TNcTimegrp.class);
+        return query.getResultList();
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
new file mode 100644
index 0000000..1d4a67a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
@@ -0,0 +1,158 @@
+package com.supwisdom.dlpay.ncmgr.dao.impl;
+
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.ncmgr.dao.NcWeekTimeDao;
+import com.supwisdom.dlpay.ncmgr.domain.TNcWeektime;
+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 NcWeekTimeDaoImpl implements NcWeekTimeDao {
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getNcWeekTimeWithPage(String time, int pageNo, int pageSize) {
+        String sql = " select bean from TNcWeektime bean where 1>0 and bean.adddelflag=1 ";
+        if (!StringUtil.isEmpty(time)){
+            sql +=" and bean.weekname like :timename ";
+        }
+        TypedQuery<TNcWeektime> query = entityManager.createQuery(sql, TNcWeektime.class);
+        if (!StringUtil.isEmpty(time)){
+            query.setParameter("timename", "%"+time+"%");
+        }
+        List<TNcWeektime> list = query.getResultList();
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        page.setList(list);
+        int totalCount = list.size();
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    @Transactional
+    @Override
+    public TNcWeektime findByWeekTimeId(int id) {
+        String sql = "select r from TNcWeektime r where r.weekid=:id";
+        TypedQuery<TNcWeektime> query = entityManager.createQuery(sql, TNcWeektime.class);
+        query.setParameter("id", id);
+        List<TNcWeektime> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TNcWeektime findByWeekTimeName(String name) {
+        String sql = " select r from TNcWeektime r where r.weekname=:name";
+        TypedQuery<TNcWeektime> query = entityManager.createQuery(sql, TNcWeektime.class);
+        query.setParameter("name", name);
+        List<TNcWeektime> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public int getMaxWeekId() {
+        String sql = "select max(r.weekid) from TNcWeektime r ";
+        Query query = entityManager.createQuery(sql);
+        Object result = query.getSingleResult();
+        if (result!=null){
+            return (int)result;
+        }
+        return 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveWeektime(TNcWeektime bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TNcWeektime findByWeekIdAndName(int id, String name) {
+        String sql = "select bean from TNcWeektime bean where bean.weekname=?1 ";
+        if (!StringUtil.isEmpty(name)) {
+            sql += " and bean.weekid<>:timeid ";
+        }
+        TypedQuery<TNcWeektime> query = entityManager.createQuery(sql, TNcWeektime.class);
+        query.setParameter(1, name);
+        if (id!=0) {
+            query.setParameter("timeid", id);
+        }
+        List<TNcWeektime> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateWeektime(TNcWeektime bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List getDevWeekByWeekid(int id) {
+        try{
+            String sql = "select DEVID from T_NC_DEVWEEK t where weekid=?1";
+            Query query = entityManager.createNativeQuery(sql);
+            query.setParameter(1,id);
+            List list = query.getResultList();
+            return list;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean delByWeekId(int id) {
+        boolean flag = false;
+        try {
+            String sql = "UPDATE T_NC_WEEKTIME SET ADDDELFLAG=0 where weekid=?1 ";
+            Query query = entityManager.createNativeQuery(sql);
+            query.setParameter(1, id);
+            query.executeUpdate();
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
new file mode 100644
index 0000000..41ee916
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TBuilding.java
@@ -0,0 +1,102 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * TBuilding entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_BUILDING")
+public class TBuilding implements java.io.Serializable {
+
+	// Fields
+
+	private String buildingid;
+	private String buildingname;
+	private String synctime;
+	private String updtime;
+	private String flag;
+	private String buildingdesc;
+
+	// Constructors
+
+	/** default constructor */
+	public TBuilding() {
+	}
+
+	/** minimal constructor */
+	public TBuilding(String buildingid) {
+		this.buildingid = buildingid;
+	}
+
+	/** full constructor */
+	public TBuilding(String buildingid, String buildingname, String synctime,
+                     String updtime, String flag, String buildingdesc) {
+		this.buildingid = buildingid;
+		this.buildingname = buildingname;
+		this.synctime = synctime;
+		this.updtime = updtime;
+		this.flag = flag;
+		this.buildingdesc = buildingdesc;
+	}
+
+	// Property accessors
+	@Id
+	@Column(name = "BUILDINGID", unique = true, nullable = false, length = 32)
+	public String getBuildingid() {
+		return this.buildingid;
+	}
+
+	public void setBuildingid(String buildingid) {
+		this.buildingid = buildingid;
+	}
+
+	@Column(name = "BUILDINGNAME", length = 300)
+	public String getBuildingname() {
+		return this.buildingname;
+	}
+
+	public void setBuildingname(String buildingname) {
+		this.buildingname = buildingname;
+	}
+
+	@Column(name = "SYNCTIME", length = 20)
+	public String getSynctime() {
+		return this.synctime;
+	}
+
+	public void setSynctime(String synctime) {
+		this.synctime = synctime;
+	}
+
+	@Column(name = "UPDTIME", length = 14)
+	public String getUpdtime() {
+		return this.updtime;
+	}
+
+	public void setUpdtime(String updtime) {
+		this.updtime = updtime;
+	}
+
+	@Column(name = "FLAG", length = 1)
+	public String getFlag() {
+		return this.flag;
+	}
+
+	public void setFlag(String flag) {
+		this.flag = flag;
+	}
+
+	@Column(name = "BUILDINGDESC", length = 300)
+	public String getBuildingdesc() {
+		return this.buildingdesc;
+	}
+
+	public void setBuildingdesc(String buildingdesc) {
+		this.buildingdesc = buildingdesc;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcCardlist.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcCardlist.java
new file mode 100644
index 0000000..1206a42
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcCardlist.java
@@ -0,0 +1,224 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * TNcCardlist entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_NC_CARDLIST")
+public class TNcCardlist implements java.io.Serializable {
+
+	// Fields
+
+	private String listid;
+	private Integer custid;
+	private String stuempno;
+	private String custname;
+	private Integer cardno;
+	private String cardphyid;
+	private String deptcode;
+	private String deptname;
+	private String closedate;
+	private String deviceid;
+	private String operflag;
+	private String rectime;
+	private String synctime;
+	private String syncflag;
+	private String rtnflag;
+	private String rtntime;
+	private Integer conferenceid;
+
+	@Column(name = "conferenceid", length=8)
+	public Integer getConferenceid() {
+		return conferenceid;
+	}
+
+	public void setConferenceid(Integer conferenceid) {
+		this.conferenceid = conferenceid;
+	}
+	// Constructors
+
+	/** default constructor */
+	public TNcCardlist() {
+	}
+
+	/** minimal constructor */
+	public TNcCardlist(String listid) {
+		this.listid = listid;
+	}
+
+	/** full constructor */
+	public TNcCardlist(String listid, Integer custid, String stuempno,
+                       String custname, Integer cardno, String cardphyid, String deptcode,
+                       String deptname, String closedate, String deviceid,
+                       String operflag, String rectime, String synctime, String syncflag,
+                       String rtnflag, String rtntime) {
+		this.listid = listid;
+		this.custid = custid;
+		this.stuempno = stuempno;
+		this.custname = custname;
+		this.cardno = cardno;
+		this.cardphyid = cardphyid;
+		this.deptcode = deptcode;
+		this.deptname = deptname;
+		this.closedate = closedate;
+		this.deviceid = deviceid;
+		this.operflag = operflag;
+		this.rectime = rectime;
+		this.synctime = synctime;
+		this.syncflag = syncflag;
+		this.rtnflag = rtnflag;
+		this.rtntime = rtntime;
+	}
+
+	// Property accessors
+	@Id
+	@Column(name = "LISTID", unique = true, nullable = false, length = 32)
+	public String getListid() {
+		return this.listid;
+	}
+
+	public void setListid(String listid) {
+		this.listid = listid;
+	}
+
+	@Column(name = "CUSTID", precision = 9, scale = 0)
+	public Integer getCustid() {
+		return this.custid;
+	}
+
+	public void setCustid(Integer custid) {
+		this.custid = custid;
+	}
+
+	@Column(name = "STUEMPNO", length = 20)
+	public String getStuempno() {
+		return this.stuempno;
+	}
+
+	public void setStuempno(String stuempno) {
+		this.stuempno = stuempno;
+	}
+
+	@Column(name = "CUSTNAME", length = 60)
+	public String getCustname() {
+		return this.custname;
+	}
+
+	public void setCustname(String custname) {
+		this.custname = custname;
+	}
+
+	@Column(name = "CARDNO", precision = 9, scale = 0)
+	public Integer getCardno() {
+		return this.cardno;
+	}
+
+	public void setCardno(Integer cardno) {
+		this.cardno = cardno;
+	}
+
+	@Column(name = "CARDPHYID", length = 20)
+	public String getCardphyid() {
+		return this.cardphyid;
+	}
+
+	public void setCardphyid(String cardphyid) {
+		this.cardphyid = cardphyid;
+	}
+
+	@Column(name = "DEPTCODE", length = 20)
+	public String getDeptcode() {
+		return this.deptcode;
+	}
+
+	public void setDeptcode(String deptcode) {
+		this.deptcode = deptcode;
+	}
+
+	@Column(name = "DEPTNAME", length = 60)
+	public String getDeptname() {
+		return this.deptname;
+	}
+
+	public void setDeptname(String deptname) {
+		this.deptname = deptname;
+	}
+
+	@Column(name = "CLOSEDATE", length = 14)
+	public String getClosedate() {
+		return this.closedate;
+	}
+
+	public void setClosedate(String closedate) {
+		this.closedate = closedate;
+	}
+
+	@Column(name = "DEVICEID", length = 32)
+	public String getDeviceid() {
+		return this.deviceid;
+	}
+
+	public void setDeviceid(String deviceid) {
+		this.deviceid = deviceid;
+	}
+
+	@Column(name = "OPERFLAG", length = 3)
+	public String getOperflag() {
+		return this.operflag;
+	}
+
+	public void setOperflag(String operflag) {
+		this.operflag = operflag;
+	}
+
+	@Column(name = "RECTIME", length = 14)
+	public String getRectime() {
+		return this.rectime;
+	}
+
+	public void setRectime(String rectime) {
+		this.rectime = rectime;
+	}
+
+	@Column(name = "SYNCTIME", length = 14)
+	public String getSynctime() {
+		return this.synctime;
+	}
+
+	public void setSynctime(String synctime) {
+		this.synctime = synctime;
+	}
+
+	@Column(name = "SYNCFLAG", length = 3)
+	public String getSyncflag() {
+		return this.syncflag;
+	}
+
+	public void setSyncflag(String syncflag) {
+		this.syncflag = syncflag;
+	}
+
+	@Column(name = "RTNFLAG", length = 3)
+	public String getRtnflag() {
+		return this.rtnflag;
+	}
+
+	public void setRtnflag(String rtnflag) {
+		this.rtnflag = rtnflag;
+	}
+
+	@Column(name = "RTNTIME", length = 14)
+	public String getRtntime() {
+		return this.rtntime;
+	}
+
+	public void setRtntime(String rtntime) {
+		this.rtntime = rtntime;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
new file mode 100644
index 0000000..e2ceb63
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevice.java
@@ -0,0 +1,198 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * TNcDevice entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_NC_DEVICE")
+public class TNcDevice implements java.io.Serializable {
+
+	// Fields
+	private Integer deviceid;
+	@Excel(name = "终端物理编号")
+	private String devphyid;
+	@Excel(name = "设备名称")
+	private String devname;
+	@Excel(name = "IP地址")
+	private String ip;
+	private String operflag;
+	private String syncfalg;
+	private String synctime;
+	private String updtime;
+	@Excel(name = "上级设备编号")
+	private Integer fdevid;
+	@Excel(name = "设备类型")
+	private String devtype;
+	@Excel(name = "读头号")
+	private Integer devno;
+	@Excel(name = "设备使用类型")
+	private String usetype;
+	@Excel(name="设备所在楼栋编号")
+	private String buildingid;
+	@Excel(name = "设备所在楼栋名称")
+	private String buildingname;
+
+	// Constructors
+
+	/** default constructor */
+	public TNcDevice() {
+	}
+
+	/** minimal constructor */
+	public TNcDevice(Integer deviceid) {
+		this.deviceid = deviceid;
+	}
+
+	/** full constructor */
+	public TNcDevice(Integer deviceid, String devphyid, String devname,
+                     String ip, String operflag, String syncfalg, String synctime,
+                     String updtime, Integer fdevid, String devtype, Integer devno, String usetype) {
+		this.deviceid = deviceid;
+		this.devphyid = devphyid;
+		this.devname = devname;
+		this.ip = ip;
+		this.operflag = operflag;
+		this.syncfalg = syncfalg;
+		this.synctime = synctime;
+		this.updtime = updtime;
+		this.fdevid = fdevid;
+		this.devtype = devtype;
+		this.devno = devno;
+		this.usetype = usetype;
+	}
+
+	// Property accessors
+	@Id
+	@Column(name = "DEVICEID", unique = true, nullable = false, precision = 9, scale = 0)
+	public Integer getDeviceid() {
+		return this.deviceid;
+	}
+
+	public void setDeviceid(Integer deviceid) {
+		this.deviceid = deviceid;
+	}
+
+	@Column(name = "DEVPHYID", length = 32)
+	public String getDevphyid() {
+		return this.devphyid;
+	}
+
+	public void setDevphyid(String devphyid) {
+		this.devphyid = devphyid;
+	}
+
+	@Column(name = "DEVNAME", length = 120)
+	public String getDevname() {
+		return this.devname;
+	}
+
+	public void setDevname(String devname) {
+		this.devname = devname;
+	}
+
+	@Column(name = "IP", length = 32)
+	public String getIp() {
+		return this.ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	@Column(name = "OPERFLAG", length = 3)
+	public String getOperflag() {
+		return this.operflag;
+	}
+
+	public void setOperflag(String operflag) {
+		this.operflag = operflag;
+	}
+
+	@Column(name = "SYNCFALG", length = 3)
+	public String getSyncfalg() {
+		return this.syncfalg;
+	}
+
+	public void setSyncfalg(String syncfalg) {
+		this.syncfalg = syncfalg;
+	}
+
+	@Column(name = "SYNCTIME", length = 20)
+	public String getSynctime() {
+		return this.synctime;
+	}
+
+	public void setSynctime(String synctime) {
+		this.synctime = synctime;
+	}
+
+	@Column(name = "UPDTIME", length = 20)
+	public String getUpdtime() {
+		return this.updtime;
+	}
+
+	public void setUpdtime(String updtime) {
+		this.updtime = updtime;
+	}
+
+	@Column(name = "FDEVID", precision = 9, scale = 0)
+	public Integer getFdevid() {
+		return this.fdevid;
+	}
+
+	public void setFdevid(Integer fdevid) {
+		this.fdevid = fdevid;
+	}
+
+	@Column(name = "DEVTYPE", length = 6)
+	public String getDevtype() {
+		return this.devtype;
+	}
+
+	public void setDevtype(String devtype) {
+		this.devtype = devtype;
+	}
+
+	@Column(name = "DEVNO", precision = 4, scale = 0)
+	public Integer getDevno() {
+		return this.devno;
+	}
+
+	public void setDevno(Integer devno) {
+		this.devno = devno;
+	}
+
+	@Column(name = "USETYPE", length = 20)
+	public String getUsetype() {
+		return this.usetype;
+	}
+
+	public void setUsetype(String usetype) {
+		this.usetype = usetype;
+	}
+
+	@Column(name = "BUILDINGID",length = 32)
+	public String getBuildingid() {
+		return buildingid;
+	}
+
+	public void setBuildingid(String buildingid) {
+		this.buildingid = buildingid;
+	}
+
+	@Column(name = "BUILDINGNAME",length = 255)
+	public String getBuildingname() {
+		return buildingname;
+	}
+
+	public void setBuildingname(String buildingname) {
+		this.buildingname = buildingname;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java
new file mode 100644
index 0000000..12bb210
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTime.java
@@ -0,0 +1,124 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * TNcTime entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_NC_TIME")
+public class TNcTime implements java.io.Serializable {
+
+	// Fields
+
+	private Integer timeid;
+	private String timename;
+	private String btime;
+	private String etime;
+	private String operflag;
+	private String syncflag;
+	private String synctime;
+	private String updtime;
+
+	// Constructors
+
+	/** default constructor */
+	public TNcTime() {
+	}
+
+	/** minimal constructor */
+	public TNcTime(Integer timeid) {
+		this.timeid = timeid;
+	}
+
+	/** full constructor */
+	public TNcTime(Integer timeid, String timename, String btime, String etime,
+                   String operflag, String syncflag, String synctime, String updtime) {
+		this.timeid = timeid;
+		this.timename = timename;
+		this.btime = btime;
+		this.etime = etime;
+		this.operflag = operflag;
+		this.syncflag = syncflag;
+		this.synctime = synctime;
+		this.updtime = updtime;
+	}
+
+	// Property accessors
+	@Id
+	@Column(name = "TIMEID", unique = true, nullable = false, precision = 9, scale = 0)
+	public Integer getTimeid() {
+		return this.timeid;
+	}
+
+	public void setTimeid(Integer timeid) {
+		this.timeid = timeid;
+	}
+
+	@Column(name = "TIMENAME", length = 120)
+	public String getTimename() {
+		return this.timename;
+	}
+
+	public void setTimename(String timename) {
+		this.timename = timename;
+	}
+
+	@Column(name = "BTIME", length = 6)
+	public String getBtime() {
+		return this.btime;
+	}
+
+	public void setBtime(String btime) {
+		this.btime = btime;
+	}
+
+	@Column(name = "ETIME", length = 6)
+	public String getEtime() {
+		return this.etime;
+	}
+
+	public void setEtime(String etime) {
+		this.etime = etime;
+	}
+
+	@Column(name = "OPERFLAG", length = 3)
+	public String getOperflag() {
+		return this.operflag;
+	}
+
+	public void setOperflag(String operflag) {
+		this.operflag = operflag;
+	}
+
+	@Column(name = "SYNCFLAG", length = 3)
+	public String getSyncflag() {
+		return this.syncflag;
+	}
+
+	public void setSyncflag(String syncflag) {
+		this.syncflag = syncflag;
+	}
+
+	@Column(name = "SYNCTIME", length = 20)
+	public String getSynctime() {
+		return this.synctime;
+	}
+
+	public void setSynctime(String synctime) {
+		this.synctime = synctime;
+	}
+
+	@Column(name = "UPDTIME", length = 20)
+	public String getUpdtime() {
+		return this.updtime;
+	}
+
+	public void setUpdtime(String updtime) {
+		this.updtime = updtime;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTimegrp.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTimegrp.java
new file mode 100644
index 0000000..f630aeb
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcTimegrp.java
@@ -0,0 +1,227 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * TNcTimegrp entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_NC_TIMEGRP")
+public class TNcTimegrp implements java.io.Serializable {
+
+	// Fields
+
+	private Integer timegrpid;
+	private String timegrpname;
+	private Integer timeid1;
+	private Integer timeid2;
+	private Integer timeid3;
+	private Integer timeid4;
+	private Integer timeid5;
+	private Integer timeid6;
+	private Integer timeid7;
+	private Integer timeid8;
+	private Integer adddelflag;
+	private Integer downstatus;
+	private String updatetime;
+	private Integer timeid9;
+	private Integer timeid10;
+	private Integer timeid11;
+	private Integer timeid12;
+
+	// Constructors
+
+	/** default constructor */
+	public TNcTimegrp() {
+	}
+
+	/** minimal constructor */
+	public TNcTimegrp(Integer timegrpid) {
+		this.timegrpid = timegrpid;
+	}
+
+	/** full constructor */
+	public TNcTimegrp(Integer timegrpid, String timegrpname, Integer timeid1,
+                      Integer timeid2, Integer timeid3, Integer timeid4, Integer timeid5,
+                      Integer timeid6, Integer timeid7, Integer timeid8,
+					  Integer adddelflag, Integer downstatus, String updatetime,
+                      Integer timeid9, Integer timeid10, Integer timeid11,
+                      Integer timeid12) {
+		this.timegrpid = timegrpid;
+		this.timegrpname = timegrpname;
+		this.timeid1 = timeid1;
+		this.timeid2 = timeid2;
+		this.timeid3 = timeid3;
+		this.timeid4 = timeid4;
+		this.timeid5 = timeid5;
+		this.timeid6 = timeid6;
+		this.timeid7 = timeid7;
+		this.timeid8 = timeid8;
+		this.adddelflag = adddelflag;
+		this.downstatus = downstatus;
+		this.updatetime = updatetime;
+		this.timeid9 = timeid9;
+		this.timeid10 = timeid10;
+		this.timeid11 = timeid11;
+		this.timeid12 = timeid12;
+	}
+
+	// Property accessors
+	@Id
+	@Column(name = "TIMEGRPID", unique = true, nullable = false, precision = 9, scale = 0)
+	public Integer getTimegrpid() {
+		return this.timegrpid;
+	}
+
+	public void setTimegrpid(Integer timegrpid) {
+		this.timegrpid = timegrpid;
+	}
+
+	@Column(name = "TIMEGRPNAME", length = 60)
+	public String getTimegrpname() {
+		return this.timegrpname;
+	}
+
+	public void setTimegrpname(String timegrpname) {
+		this.timegrpname = timegrpname;
+	}
+
+	@Column(name = "TIMEID1", precision = 9, scale = 0)
+	public Integer getTimeid1() {
+		return this.timeid1;
+	}
+
+	public void setTimeid1(Integer timeid1) {
+		this.timeid1 = timeid1;
+	}
+
+	@Column(name = "TIMEID2", precision = 9, scale = 0)
+	public Integer getTimeid2() {
+		return this.timeid2;
+	}
+
+	public void setTimeid2(Integer timeid2) {
+		this.timeid2 = timeid2;
+	}
+
+	@Column(name = "TIMEID3", precision = 9, scale = 0)
+	public Integer getTimeid3() {
+		return this.timeid3;
+	}
+
+	public void setTimeid3(Integer timeid3) {
+		this.timeid3 = timeid3;
+	}
+
+	@Column(name = "TIMEID4", precision = 9, scale = 0)
+	public Integer getTimeid4() {
+		return this.timeid4;
+	}
+
+	public void setTimeid4(Integer timeid4) {
+		this.timeid4 = timeid4;
+	}
+
+	@Column(name = "TIMEID5", precision = 9, scale = 0)
+	public Integer getTimeid5() {
+		return this.timeid5;
+	}
+
+	public void setTimeid5(Integer timeid5) {
+		this.timeid5 = timeid5;
+	}
+
+	@Column(name = "TIMEID6", precision = 9, scale = 0)
+	public Integer getTimeid6() {
+		return this.timeid6;
+	}
+
+	public void setTimeid6(Integer timeid6) {
+		this.timeid6 = timeid6;
+	}
+
+	@Column(name = "TIMEID7", precision = 9, scale = 0)
+	public Integer getTimeid7() {
+		return this.timeid7;
+	}
+
+	public void setTimeid7(Integer timeid7) {
+		this.timeid7 = timeid7;
+	}
+
+	@Column(name = "TIMEID8", precision = 9, scale = 0)
+	public Integer getTimeid8() {
+		return this.timeid8;
+	}
+
+	public void setTimeid8(Integer timeid8) {
+		this.timeid8 = timeid8;
+	}
+
+	@Column(name = "ADDDELFLAG", precision = 1, scale = 0)
+	public Integer getAdddelflag() {
+		return this.adddelflag;
+	}
+
+	public void setAdddelflag(Integer adddelflag) {
+		this.adddelflag = adddelflag;
+	}
+
+	@Column(name = "DOWNSTATUS", precision = 9, scale = 0)
+	public Integer getDownstatus() {
+		return this.downstatus;
+	}
+
+	public void setDownstatus(Integer downstatus) {
+		this.downstatus = downstatus;
+	}
+
+	@Column(name = "UPDATETIME", length = 30)
+	public String getUpdatetime() {
+		return this.updatetime;
+	}
+
+	public void setUpdatetime(String updatetime) {
+		this.updatetime = updatetime;
+	}
+
+	@Column(name = "TIMEID9", precision = 9, scale = 0)
+	public Integer getTimeid9() {
+		return this.timeid9;
+	}
+
+	public void setTimeid9(Integer timeid9) {
+		this.timeid9 = timeid9;
+	}
+
+	@Column(name = "TIMEID10", precision = 9, scale = 0)
+	public Integer getTimeid10() {
+		return this.timeid10;
+	}
+
+	public void setTimeid10(Integer timeid10) {
+		this.timeid10 = timeid10;
+	}
+
+	@Column(name = "TIMEID11", precision = 9, scale = 0)
+	public Integer getTimeid11() {
+		return this.timeid11;
+	}
+
+	public void setTimeid11(Integer timeid11) {
+		this.timeid11 = timeid11;
+	}
+
+	@Column(name = "TIMEID12", precision = 9, scale = 0)
+	public Integer getTimeid12() {
+		return this.timeid12;
+	}
+
+	public void setTimeid12(Integer timeid12) {
+		this.timeid12 = timeid12;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcWeektime.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcWeektime.java
new file mode 100644
index 0000000..347a894
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcWeektime.java
@@ -0,0 +1,170 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * TNcWeektime entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_NC_WEEKTIME")
+public class TNcWeektime implements java.io.Serializable {
+
+	// Fields
+
+	private Integer weekid;
+	private String weekname;
+	private Integer day1grpid;
+	private Integer day2grpid;
+	private Integer day3grpid;
+	private Integer day4grpid;
+	private Integer day5grpid;
+	private Integer day6grpid;
+	private Integer day7grpid;
+	private Integer adddelflag;
+	private Integer downstatus;
+	private String updatetime;
+
+	// Constructors
+
+	/** default constructor */
+	public TNcWeektime() {
+	}
+
+	/** minimal constructor */
+	public TNcWeektime(Integer weekid) {
+		this.weekid = weekid;
+	}
+
+	/** full constructor */
+	public TNcWeektime(Integer weekid, String weekname, Integer day1grpid,
+                       Integer day2grpid, Integer day3grpid, Integer day4grpid,
+                       Integer day5grpid, Integer day6grpid, Integer day7grpid,
+					   Integer adddelflag, Integer downstatus, String updatetime) {
+		this.weekid = weekid;
+		this.weekname = weekname;
+		this.day1grpid = day1grpid;
+		this.day2grpid = day2grpid;
+		this.day3grpid = day3grpid;
+		this.day4grpid = day4grpid;
+		this.day5grpid = day5grpid;
+		this.day6grpid = day6grpid;
+		this.day7grpid = day7grpid;
+		this.adddelflag = adddelflag;
+		this.downstatus = downstatus;
+		this.updatetime = updatetime;
+	}
+
+	// Property accessors
+	@Id
+	@Column(name = "WEEKID", unique = true, nullable = false, precision = 9, scale = 0)
+	public Integer getWeekid() {
+		return this.weekid;
+	}
+
+	public void setWeekid(Integer weekid) {
+		this.weekid = weekid;
+	}
+
+	@Column(name = "WEEKNAME", length = 60)
+	public String getWeekname() {
+		return this.weekname;
+	}
+
+	public void setWeekname(String weekname) {
+		this.weekname = weekname;
+	}
+
+	@Column(name = "DAY1GRPID", precision = 9, scale = 0)
+	public Integer getDay1grpid() {
+		return this.day1grpid;
+	}
+
+	public void setDay1grpid(Integer day1grpid) {
+		this.day1grpid = day1grpid;
+	}
+
+	@Column(name = "DAY2GRPID", precision = 9, scale = 0)
+	public Integer getDay2grpid() {
+		return this.day2grpid;
+	}
+
+	public void setDay2grpid(Integer day2grpid) {
+		this.day2grpid = day2grpid;
+	}
+
+	@Column(name = "DAY3GRPID", precision = 9, scale = 0)
+	public Integer getDay3grpid() {
+		return this.day3grpid;
+	}
+
+	public void setDay3grpid(Integer day3grpid) {
+		this.day3grpid = day3grpid;
+	}
+
+	@Column(name = "DAY4GRPID", precision = 9, scale = 0)
+	public Integer getDay4grpid() {
+		return this.day4grpid;
+	}
+
+	public void setDay4grpid(Integer day4grpid) {
+		this.day4grpid = day4grpid;
+	}
+
+	@Column(name = "DAY5GRPID", precision = 9, scale = 0)
+	public Integer getDay5grpid() {
+		return this.day5grpid;
+	}
+
+	public void setDay5grpid(Integer day5grpid) {
+		this.day5grpid = day5grpid;
+	}
+
+	@Column(name = "DAY6GRPID", precision = 9, scale = 0)
+	public Integer getDay6grpid() {
+		return this.day6grpid;
+	}
+
+	public void setDay6grpid(Integer day6grpid) {
+		this.day6grpid = day6grpid;
+	}
+
+	@Column(name = "DAY7GRPID", precision = 9, scale = 0)
+	public Integer getDay7grpid() {
+		return this.day7grpid;
+	}
+
+	public void setDay7grpid(Integer day7grpid) {
+		this.day7grpid = day7grpid;
+	}
+
+	@Column(name = "ADDDELFLAG", precision = 1, scale = 0)
+	public Integer getAdddelflag() {
+		return this.adddelflag;
+	}
+
+	public void setAdddelflag(Integer adddelflag) {
+		this.adddelflag = adddelflag;
+	}
+
+	@Column(name = "DOWNSTATUS", precision = 9, scale = 0)
+	public Integer getDownstatus() {
+		return this.downstatus;
+	}
+
+	public void setDownstatus(Integer downstatus) {
+		this.downstatus = downstatus;
+	}
+
+	@Column(name = "UPDATETIME", length = 30)
+	public String getUpdatetime() {
+		return this.updatetime;
+	}
+
+	public void setUpdatetime(String updatetime) {
+		this.updatetime = updatetime;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
new file mode 100644
index 0000000..0a729cc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
@@ -0,0 +1,147 @@
+package com.supwisdom.dlpay.ncmgr.service;
+
+import com.supwisdom.dlpay.ncmgr.domain.*;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+import java.util.Map;
+
+public interface NcService {
+    //根据查询条件分页获取所有设备
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, Map map, String buildingid, String devtype);
+
+    //获取所有楼栋信息
+    public List<TBuilding> getAllBuilding();
+
+    //根据楼栋id获取楼栋信息
+    public TBuilding getBuidingById(String id);
+
+    //根据设备类型获取所有设备
+    public List<TNcDevice> getDevByType(String type);
+
+    //根据设备id获取设备
+    public TNcDevice findDevById(int id);
+
+    //验证设备名称
+    public TNcDevice validDevName(int devid,String devname);
+
+    //验证设备物理编号
+    public TNcDevice validDevPhyid(int devid,String devPhyid);
+
+    //验证读头号
+    public TNcDevice validDevNo(int fdevid,int devno,int devid);
+
+    //修改设备
+    public boolean updateDevice(TNcDevice bean);
+
+    //获取设备最大主键
+    public int getMaxId();
+
+    //保存设备
+    public boolean saveDevice(TNcDevice bean);
+
+    //根据设备编号获取设备及父设备信息
+    public TNcDevice getDevInfoByDevid(int devid);
+
+    //根据设备编号删除设备
+    public void delDevById(int devid);
+
+    //设备名单清空(获取清空所用名单)
+    public TNcCardlist getCleanList(String devid);
+
+    //保存同步名单信息
+    public boolean saveCardlist(TNcCardlist bean);
+
+    //设备名单重下(修改该设备已同步名单为未同步)
+    public void updateForListReload(String devid);
+
+    //根据查询条件分页获取所有时间段信息
+    public Pagination getNcTimeWithPage(String time,int pageNo, int pageSize,Map map);
+
+    //根据时间段
+    public List<String> getTimegrpIdById(int id);
+
+    //根据时间段id删除时间段
+    public boolean delTimeByTimeId(int id);
+
+    //DevWeek数据所有版本号+1
+    public boolean updListVersion();
+
+    //根据时间段id获取时间段信息
+    public TNcTime findByTimeId(int id);
+
+    //根据时间段名称获取时间段信息
+    public TNcTime findByTimeName(String name);
+
+    //获取时间段最大主键
+    public int getMaxTimeId();
+
+    //保存时间段
+    public boolean saveTime(TNcTime bean);
+
+    //根据id和名称获取时间段信息
+    public TNcTime findByIdAndName(int id, String name);
+
+    //修改时间段
+    public boolean updateTime(TNcTime bean);
+
+    //根据查询条件分页获取时间组
+    public Pagination getNcTimeGrpWithPage(String time,int pageNo, int pageSize,Map map);
+
+    //获取所有时间段
+    public List<TNcTime> findAllNcTime();
+
+    //根据id获取时间组信息
+    public TNcTimegrp findByTimeGrpId(int id);
+
+    //根据时间组名称获取时间组信息
+    public TNcTimegrp findByTimeGrpName(String name);
+
+    //获取时间组最大id主键
+    public int getMaxTimeGrpId();
+
+    //保存时间组
+    public boolean saveTimegrp(TNcTimegrp bean);
+
+    //根据id和名称查询时间组是否存在
+    public TNcTimegrp findByGrpIdAndName(int id,String name);
+
+    //修改时间组
+    public boolean updateTimegrp(TNcTimegrp bean);
+
+    //根据时间组id查询此时间组是否被时间周使用
+    public List<String> getWeekTimeById(int id);
+
+    //根据id删除时间组
+    public boolean delByGrpId(int id);
+
+    //根据查询条件分页获取时间周
+    public Pagination getNcWeekTimeWithPage(String time,int pageNo, int pageSize,Map map);
+
+    //获取所有时间组
+    public List<TNcTimegrp> findAllNcTimeGrp();
+
+    //根据id获取时间周信息
+    public TNcWeektime findByWeekTimeId(int id);
+
+    //根据名称获取时间周信息
+    public TNcWeektime findByWeekTimeName(String name);
+
+    //获取最大时间周id 只支持3-15
+    public int getMaxWeekId();
+
+    //保存时间周
+    public boolean saveWeektime(TNcWeektime bean);
+
+    //根据id和名称查询时间周是否存在
+    public TNcWeektime findByWeekIdAndName(int id,String name);
+
+    //修改时间周
+    public boolean updateWeektime(TNcWeektime bean);
+
+    //根据时间周id查询设备绑定时间周情况
+    public List getDevWeekByWeekid(int id);
+
+    //根据id删除时间周
+    public boolean delByWeekId(int id);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
new file mode 100644
index 0000000..4063309
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
@@ -0,0 +1,266 @@
+package com.supwisdom.dlpay.ncmgr.service.impl;
+
+import com.supwisdom.dlpay.ncmgr.dao.*;
+import com.supwisdom.dlpay.ncmgr.domain.*;
+import com.supwisdom.dlpay.ncmgr.service.NcService;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class NcServiceImpl implements NcService {
+    @Autowired
+    private NcDeviceDao ncDeviceDao;
+    @Autowired
+    private NcCardListDao ncCardListDao;
+    @Autowired
+    private NcTimeDao ncTimeDao;
+    @Autowired
+    private NcDevWeekDao ncDevWeekDao;
+    @Autowired
+    private NcTimeGrpDao ncTimeGrpDao;
+    @Autowired
+    private NcWeekTimeDao ncWeekTimeDao;
+
+
+    @Override
+    public Pagination getNcDeviceWithPage(String devname, int pageNo, int pageSize, Map map, String buildingid, String devtype) {
+        Pagination page = ncDeviceDao.getNcDeviceWithPage(devname, pageNo, pageSize, buildingid, devtype);
+        map.put("devPage", page);
+        return page;
+    }
+
+    @Override
+    public List<TBuilding> getAllBuilding() {
+        return ncDeviceDao.getAllBuilding();
+    }
+
+    @Override
+    public TBuilding getBuidingById(String id) {
+        return ncDeviceDao.getBuidingById(id);
+    }
+
+    @Override
+    public List<TNcDevice> getDevByType(String type) {
+        return ncDeviceDao.getDevByType(type);
+    }
+
+    @Override
+    public TNcDevice findDevById(int id) {
+        return ncDeviceDao.findDevById(id);
+    }
+
+    @Override
+    public TNcDevice validDevName(int devid, String devname) {
+        return ncDeviceDao.validDevName(devid, devname);
+    }
+
+    @Override
+    public TNcDevice validDevPhyid(int devid, String devPhyid) {
+        return ncDeviceDao.validDevPhyid(devid, devPhyid);
+    }
+
+    @Override
+    public TNcDevice validDevNo(int fdevid, int devno, int devid) {
+        return ncDeviceDao.validDevNo(fdevid, devno, devid);
+    }
+
+    @Override
+    public boolean updateDevice(TNcDevice bean) {
+        return ncDeviceDao.updateDevice(bean);
+    }
+
+    @Override
+    public int getMaxId() {
+        return ncDeviceDao.getMaxId();
+    }
+
+    @Override
+    public boolean saveDevice(TNcDevice bean) {
+        return ncDeviceDao.saveDevice(bean);
+    }
+
+    @Override
+    public TNcDevice getDevInfoByDevid(int devid) {
+        return ncDeviceDao.getDevInfoByDevid(devid);
+    }
+
+    @Override
+    public void delDevById(int devid) {
+        ncDeviceDao.delDevById(devid);
+    }
+
+    @Override
+    public TNcCardlist getCleanList(String devid) {
+        return ncCardListDao.getCleanList(devid);
+    }
+
+    @Override
+    public boolean saveCardlist(TNcCardlist bean) {
+        return ncCardListDao.saveCardlist(bean);
+    }
+
+    @Override
+    public void updateForListReload(String devid) {
+
+    }
+
+    @Override
+    public Pagination getNcTimeWithPage(String time, int pageNo, int pageSize,Map map) {
+        Pagination page = ncTimeDao.getNcTimeWithPage(time, pageNo, pageSize);
+        map.put("timePage", page);
+        return page;
+    }
+
+    @Override
+    public List<String> getTimegrpIdById(int id) {
+        return ncTimeDao.getTimegrpIdById(id);
+    }
+
+    @Override
+    public boolean delTimeByTimeId(int id) {
+        return ncTimeDao.delTimeByTimeId(id);
+    }
+
+    @Override
+    public boolean updListVersion() {
+        return ncDevWeekDao.updListVersion();
+    }
+
+    @Override
+    public TNcTime findByTimeId(int id) {
+        return ncTimeDao.findByTimeId(id);
+    }
+
+    @Override
+    public TNcTime findByTimeName(String name) {
+        return ncTimeDao.findByTimeName(name);
+    }
+
+    @Override
+    public int getMaxTimeId() {
+        return ncTimeDao.getMaxTimeId();
+    }
+
+    @Override
+    public boolean saveTime(TNcTime bean) {
+        return ncTimeDao.saveTime(bean);
+    }
+
+    @Override
+    public TNcTime findByIdAndName(int id, String name) {
+        return ncTimeDao.findByIdAndName(id, name);
+    }
+
+    @Override
+    public boolean updateTime(TNcTime bean) {
+        return ncTimeDao.updateTime(bean);
+    }
+
+    @Override
+    public Pagination getNcTimeGrpWithPage(String time, int pageNo, int pageSize, Map map) {
+        Pagination page = ncTimeGrpDao.getNcTimeGrpWithPage(time, pageNo, pageSize);
+        map.put("timeGrpPage", page);
+        return page;
+    }
+
+    @Override
+    public List<TNcTime> findAllNcTime() {
+        return ncTimeDao.findAllNcTime();
+    }
+
+    @Override
+    public TNcTimegrp findByTimeGrpId(int id) {
+        return ncTimeGrpDao.findByTimeGrpId(id);
+    }
+
+    @Override
+    public TNcTimegrp findByTimeGrpName(String name) {
+        return ncTimeGrpDao.findByTimeGrpName(name);
+    }
+
+    @Override
+    public int getMaxTimeGrpId() {
+        return ncTimeGrpDao.getMaxTimeGrpId();
+    }
+
+    @Override
+    public boolean saveTimegrp(TNcTimegrp bean) {
+        return ncTimeGrpDao.saveTimegrp(bean);
+    }
+
+    @Override
+    public TNcTimegrp findByGrpIdAndName(int id, String name) {
+        return ncTimeGrpDao.findByGrpIdAndName(id, name);
+    }
+
+    @Override
+    public boolean updateTimegrp(TNcTimegrp bean) {
+        return ncTimeGrpDao.updateTimegrp(bean);
+    }
+
+    @Override
+    public List<String> getWeekTimeById(int id) {
+        return ncTimeGrpDao.getWeekTimeById(id);
+    }
+
+    @Override
+    public boolean delByGrpId(int id) {
+        return ncTimeGrpDao.delByGrpId(id);
+    }
+
+    @Override
+    public Pagination getNcWeekTimeWithPage(String time, int pageNo, int pageSize, Map map) {
+        Pagination page = ncWeekTimeDao.getNcWeekTimeWithPage(time, pageNo, pageSize);
+        map.put("weekTimePage", page);
+        return page;
+    }
+
+    @Override
+    public List<TNcTimegrp> findAllNcTimeGrp() {
+        return ncTimeGrpDao.findAllNcTimeGrp();
+    }
+
+    @Override
+    public TNcWeektime findByWeekTimeId(int id) {
+        return ncWeekTimeDao.findByWeekTimeId(id);
+    }
+
+    @Override
+    public TNcWeektime findByWeekTimeName(String name) {
+        return ncWeekTimeDao.findByWeekTimeName(name);
+    }
+
+    @Override
+    public int getMaxWeekId() {
+        return ncWeekTimeDao.getMaxWeekId();
+    }
+
+    @Override
+    public boolean saveWeektime(TNcWeektime bean) {
+        return ncWeekTimeDao.saveWeektime(bean);
+    }
+
+    @Override
+    public TNcWeektime findByWeekIdAndName(int id, String name) {
+        return ncWeekTimeDao.findByWeekIdAndName(id, name);
+    }
+
+    @Override
+    public boolean updateWeektime(TNcWeektime bean) {
+        return ncWeekTimeDao.updateWeektime(bean);
+    }
+
+    @Override
+    public List getDevWeekByWeekid(int id) {
+        return ncWeekTimeDao.getDevWeekByWeekid(id);
+    }
+
+    @Override
+    public boolean delByWeekId(int id) {
+        return ncWeekTimeDao.delByWeekId(id);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
index 53f8e03..48d2bfc 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -29,31 +29,6 @@
         return "system/role/index";
     }
 
-    @RequestMapping("/ncmgr/devindex")
-    public String devindex(ModelMap model) {
-        return "ncmgr/nc_dev";
-    }
-
-    @GetMapping("/ncmgr/timeindex")
-    public String timeindex() {
-        return "ncmgr/nc_time";
-    }
-
-    @GetMapping("/ncmgr/timegrpindex")
-    public String timegrpdex() {
-        return "ncmgr/nc_timegrp";
-    }
-
-    @GetMapping("/ncmgr/weektimeindex")
-    public String weektimeindex() {
-        return "ncmgr/nc_weektime";
-    }
-
-    @RequestMapping("/ncmgr/devweek")
-    public String devweek(ModelMap model){
-        return "ncmgr/nc_devweek";
-    }
-
     @RequestMapping("/doorlistMgr/downDoorList")
     public String downDoorList(ModelMap model){
         return "doorlist/addDoorlist";
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
index fa5f3c5..de3ec24 100644
--- a/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/DictionaryDaoImpl.java
@@ -102,6 +102,7 @@
         return list;
     }
 
+    @Transactional
     @Override
     public List<TDictionaryId> findByType(int type, String dicVal) {
         String sql = "select bean.id from TDictionary bean where bean.id.dicttype=?1 and bean.id.dictval = ?2";
diff --git a/src/main/kotlin/com/supwisdom/dlpay/ncmgr/ncmgr_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/ncmgr/ncmgr_controller.kt
deleted file mode 100644
index e68cf6b..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/ncmgr/ncmgr_controller.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.supwisdom.dlpay.ncmgr
-
-class NcMgrController{
-
-}
\ No newline at end of file
diff --git a/src/main/resources/templates/ncmgr/nc_dev.html b/src/main/resources/templates/ncmgr/nc_dev.html
index 6e53085..f4983e2 100644
--- a/src/main/resources/templates/ncmgr/nc_dev.html
+++ b/src/main/resources/templates/ncmgr/nc_dev.html
@@ -41,15 +41,15 @@
                 </div>
                 <div class="col-md-3" >
                     <div class="form-group">
-                        <label class="control-label col-md-6 col-sm-12 col-xs-12" style="font-size: 14px;">设备使用类型:</span>
+                        <label class="control-label col-md-6 col-sm-12 col-xs-12" style="font-size: 14px;">设备所在楼栋:</span>
                         </label>
                         <div class="col-md-6 col-sm-12 col-xs-12">
-                            <el-select v-model="devform.usetype" style="width: 140px" filterable placeholder="请选择">
+                            <el-select v-model="devform.buildingname" style="width: 140px" filterable placeholder="请选择">
                                 <el-option
-                                        v-for="usetype in usetypes"
-                                        :key="usetype.value"
-                                        :label="usetype.label"
-                                        :value="usetype.value">
+                                        v-for="building in buildings"
+                                        :key="building.value"
+                                        :label="building.label"
+                                        :value="building.value">
                                 </el-option>
                             </el-select>
                         </div>
@@ -103,10 +103,9 @@
                             :formatter="typeform">
                     </el-table-column>
                     <el-table-column
-                            prop="devtype"
-                            label="设备使用类型"
-                            width="140"
-                            :formatter="usetypeform">
+                            prop="buildingname"
+                            label="设备所在楼栋"
+                            width="140">
                     </el-table-column>
                     <el-table-column
                             prop="ip"
@@ -239,6 +238,23 @@
                             </el-input>
                         </el-col>
                     </el-form-item>
+                    <el-form-item label="所在楼栋:" prop="buildingid">
+                        <el-col :span="18">
+                            <el-select v-model="devUpform.buildingid"
+                                       style="width: 187px;" clearable
+                                       filterable
+                                       :disabled="buildingDis"
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="buildingid in buildings"
+                                        :key="buildingid.value"
+                                        :label="buildingid.label"
+                                        :value="buildingid.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
                     <el-form-item label="继续添加:" prop="continueadd" v-show="checkvisible === true">
                         <el-col :span="18">
                             <el-checkbox v-model="continueadd">选中后保存不会退出窗口</el-checkbox>
@@ -287,16 +303,18 @@
             currentRow: null,
             devnoDis: false,
             fdevDis: false,
+            buildingDis:false,
             phyDis: false,
             devform: {
                 devname: '',
-                usetype: '',
+                buildingname: '',
                 devtype: ''
             },
             checkvisible: true,
             continueadd: true,
             devtypes: [],
             fdevs: [],
+            buildings:[],
             devusetypes: [],
             dialogFormVisible: false,
             dlgAllotDevVisible: false,
@@ -310,9 +328,9 @@
                 devphyid: '',
                 devno: '',
                 ip: '',
+                buildingid:'',
             },
 
-            usetypes: [],
             rules: {
                 devname: [
                     {required: true, message: '请输入设备名', trigger: 'blur'},
@@ -373,6 +391,7 @@
                 this.dialogFormVisible = false;
             },
             saveDev: function (formName) {
+
                 var _that = this;
                 var vali = false;
                 if (this.devUpform.devtype == "C") {
@@ -474,7 +493,7 @@
                     //console.log(ret);
                     _self.totSize = ret.PageResult.totalCount;
                     _self.tableData = ret.PageResult.list;
-                    var ut = ret.usetypes;
+                    var ut = ret.buildings;
                     var rows = [];
                     rows.push({
                         value: '',
@@ -482,17 +501,11 @@
                     });
                     for (var i = 0; i < ut.length; i++) {
                         rows.push({
-                            value: ut[i].dictval,
-                            label: ut[i].dictcaption
+                            value: ut[i].buildingid,
+                            label: ut[i].buildingname
                         });
                     }
-                    var devUseTypeVal = [];
-                    var devusetypeName = [];
-                    var useTypes = ret.usetypes;
-                    for (var i = 0; i < useTypes.length; i++) {
-                        devUseTypeVal.push(useTypes[i]["dictval"]);
-                        devusetypeName.push(useTypes[i]["dictcaption"]);
-                    }
+
 
                     var dictlist = [];
                     var dict = ret.dicts;
@@ -508,10 +521,8 @@
                         });
                     }
                     vue.devtypes = dictlist;
-                    vue.usetypeVals = devUseTypeVal;
-                    vue.usetypeNames = devusetypeName;
-                    vue.usetypes = rows;
-                    vue.devform.usetype = '';
+                    vue.buildings = rows;
+                    vue.devform.builddingname = '';
                 }
             })
         }
@@ -529,7 +540,7 @@
         $.ajax({
             type: "get",
             dataType: "json",
-            url: encodeURI("/ncmgr/loadDevList?devname=" + rolename.devname + "&pageNo=" + pageno + "&pageSize=" + pagesize + "&usetype=" + rolename.usetype + "&devtype=" + rolename.devtype),
+            url: encodeURI("/ncmgr/loadDevList?devname=" + rolename.devname + "&pageNo=" + pageno + "&pageSize=" + pagesize + "&buildingid=" + rolename.buildingname + "&devtype=" + rolename.devtype),
             success: function (ret) {
                 _self.totSize = ret.PageResult.totalCount;
                 _self.tableData = ret.PageResult.list;
@@ -572,6 +583,14 @@
                         value: dev[i].deviceid
                     });
                 }
+                var buildinglist=[];
+                var buildingdata = ret.buildings;
+                for (var i = 0; i < buildingdata.length; i++) {
+                    buildinglist.push({
+                        label: buildingdata[i].buildingname,
+                        value: buildingdata[i].buildingid
+                    });
+                }
                 if (ret.device != null) {
                     //console.log(ret.oper);
                     _self.devUpform.deviceid = ret.device.deviceid;
@@ -593,6 +612,7 @@
                 }
                 _self.devtypes = dictlist;
                 _self.fdevs = devlist;
+                _self.buildings = buildinglist;
                 _self.devusetypes = devUseType;
             }
         })
@@ -607,11 +627,17 @@
             layer.msg('需要选择上级设备', {icon: 2, time: 1000});
             return;
         }
+        var token=$("meta[name='_csrf_token']").attr("value");
         $.ajax({
-            type: "POST",
+            type: "post",
             url: encodeURI("/ncmgr/saveNcDev"),
             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) {
diff --git a/src/main/resources/templates/ncmgr/nc_time.html b/src/main/resources/templates/ncmgr/nc_time.html
index ae43cb1..422e01c 100644
--- a/src/main/resources/templates/ncmgr/nc_time.html
+++ b/src/main/resources/templates/ncmgr/nc_time.html
@@ -324,12 +324,17 @@
         if(vue.timetitile == "修改时间段"){
             url = encodeURI("/ncmgr/updateNcTime")
         }
-
+        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){
diff --git a/src/main/resources/templates/ncmgr/nc_timegrp.html b/src/main/resources/templates/ncmgr/nc_timegrp.html
index e49f7b7..43f42eb 100644
--- a/src/main/resources/templates/ncmgr/nc_timegrp.html
+++ b/src/main/resources/templates/ncmgr/nc_timegrp.html
@@ -414,11 +414,17 @@
             layer.msg('至少选择一个时间段！', {icon: 2,time:1000});
             return '';
         }else {
+            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){
diff --git a/src/main/resources/templates/ncmgr/nc_weektime.html b/src/main/resources/templates/ncmgr/nc_weektime.html
index 28c3084..01490cb 100644
--- a/src/main/resources/templates/ncmgr/nc_weektime.html
+++ b/src/main/resources/templates/ncmgr/nc_weektime.html
@@ -229,7 +229,6 @@
             pageSize:10,
             totSize:0,
             currentRow: null,
-            cxt:'${pageContext.request.contextPath}',
             weektimeform:{
                 weektimename:'',
             },
@@ -333,7 +332,7 @@
             $.ajax({
                 type:"get",
                 dataType:"json",
-                url:this.cxt+"/ncmgr/loadweektimeList?weektimename=",
+                url:"/ncmgr/loadweektimeList?weektimename=",
                 success:function(ret){
                     //console.log(ret);
                     _self.totSize=ret.PageResult.totalCount;
@@ -369,7 +368,7 @@
         $.ajax({
             type:"get",
             dataType:"json",
-            url:encodeURI(vue.cxt+"/ncmgr/loadweektimeList?weektimename="+weektimename+"&pageNo="+pageno+"&pageSize="+pagesize),
+            url:encodeURI("/ncmgr/loadweektimeList?weektimename="+weektimename+"&pageNo="+pageno+"&pageSize="+pagesize),
             success:function(ret){
                 _self.totSize=ret.PageResult.totalCount;
                 _self.tableData=ret.PageResult.list;
@@ -384,7 +383,7 @@
         $.ajax({
             type:"get",
             dataType:"json",
-            url:encodeURI(vue.cxt+"/ncmgr/loadNcweektimeForUpdate?weektimeid="+id),
+            url:encodeURI("/ncmgr/loadNcweektimeForUpdate?weektimeid="+id),
             success:function(ret){
                 var timelist = [];
                 var times=ret.timegrp;
@@ -408,10 +407,10 @@
     function saveData(_that,formdata,formName) {
         var url;
         if(vue.weektimetitle == "添加时间周"){
-            url = encodeURI(vue.cxt+"/ncmgr/addNcweektime");
+            url = encodeURI("/ncmgr/addNcweektime");
         }
         if(vue.weektimetitle == "修改时间周"){
-            url = encodeURI(vue.cxt+"/ncmgr/updateNcweektime");
+            url = encodeURI("/ncmgr/updateNcweektime");
         }
         var timeid1=formdata.day1grpid;
         var timeid2=formdata.day2grpid;
@@ -424,11 +423,17 @@
             layer.msg('至少选择一天！', {icon: 2,time:1000});
             return '';
         }else {
+            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) {
@@ -458,7 +463,7 @@
             $.ajax({
                 type:"get",
                 dataType:"json",
-                url:vue.cxt+"/ncmgr/deleteNcweektime?weektimeid="+id,
+                url:"/ncmgr/deleteNcweektime?weektimeid="+id,
                 success:function(ret){
                     //console.log(ret);
                     if(ret.message == undefined){
