diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
index c052817..98dd04d 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/controller/NcMgrController.java
@@ -877,4 +877,163 @@
     }
 
 
+    /**
+     * 获取设备时间周
+     * @param request
+     * @param response
+     * @param pageNo
+     * @param pageSize
+     * @param weekid
+     * @param devname
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/loaddevweekList")
+    public Map loaddevweekList(
+            HttpServletRequest request,
+            HttpServletResponse response,
+            @RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+            @RequestParam(value = "weekid") int weekid,
+            @RequestParam(value = "devname") String devname) {
+        Map map = new HashMap();
+        try {
+            Pagination page = null;
+            page = ncService.getNcDevWeekWithPage(weekid, devname, pageNo, pageSize, map);
+            map.put("PageResult", page);
+            List<TNcWeektime> weektime = ncService.findAllNcWeekTime();
+            map.put("weektime", weektime);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error("查询时间组失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 删除设备时间周
+     * @param devid
+     * @param weekid
+     * @param request
+     * @param response
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/deleteNcdevweek", method = {RequestMethod.GET})
+    public Map deleteNcdevweek(@RequestParam(value = "devid") int devid,
+                               @RequestParam(value = "weekid") int weekid,
+                               HttpServletRequest request, HttpServletResponse response) {
+        String message = "";
+        Map map = new HashMap();
+        try {
+            ncService.delDevWeekById(devid,weekid);
+            ncService.updListVersion();
+            RedisUtil.incr("zcard_max_version");
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = "删除设备时间周出现异常!";
+            logger.error("删除设备时间周失败：" + e.getMessage());
+        }
+        map.put("message", message);
+        return map;
+    }
+
+    /**
+     * 添加设备时间周
+     * @param weekid
+     * @param devids
+     * @param request
+     * @param beans
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addNcdevweek", method = {RequestMethod.POST})
+    public Map addNcdevweek(
+            @RequestParam(value = "weekid", required = true) int weekid,
+            @RequestParam(value = "devids", required = true) String devids,
+            HttpServletRequest request,
+            @RequestBody String[] beans) {
+        Map map = new HashMap();
+        String errStr="";
+            try {
+                int maxDevWeekVersion = ncService.findMaxDevWeekVersion();
+                if(beans != null && beans.length > 0){
+                    String[] devlist=beans;
+                    ncService.deleteDevWeekByWeekId(weekid);
+                    for (int i=0;i<devlist.length;i++){
+                        TNcDevweek devweek = new TNcDevweek();
+                        TNcDevweekId tNcDevweekId = new TNcDevweekId();
+                        tNcDevweekId.setDevid(Integer.parseInt(devlist[i]));
+                        tNcDevweekId.setWeekid(weekid);
+                        devweek.setId(tNcDevweekId);
+                        TNcDevice dev = ncService.findDevById(Integer.parseInt(devlist[i]));
+                        devweek.setDevname(dev.getDevname());
+                        TNcWeektime wt = ncService.findByWeekTimeId(weekid);
+                        devweek.setWeekname(wt.getWeekname());
+                        devweek.setUpdatetime(DateUtil.getNow());
+                        devweek.setVersion(maxDevWeekVersion);
+                        boolean b = ncService.saveDevWeek(devweek);
+                        map.put("errStr", "");
+                    }
+                    ncService.updListVersion();
+                    RedisUtil.incr("zcard_max_version");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                map.put("errStr", "分配设备失败");
+                logger.error("分配设备失败：" + e.getMessage());
+            }
+
+        return map;
+    }
+
+    /**
+     * 根据id查询已选取此时间周的设备
+     * @param reWeekId
+     * @param request
+     * @param response
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value="/getChosenDev")
+    public Map getChosenDev(
+            @RequestParam(value = "reWeekId",required=true) int reWeekId,
+            HttpServletRequest request,
+            HttpServletResponse response){
+        Map map = new HashMap();
+        try{
+            List<TNcDevweek> chosenDev = ncService.findChosenDev(reWeekId);
+            map.put("chosenDev",chosenDev);//已做出选择的设备
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error("查询已做出选择设备失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+    /**
+     * 获取设备时间周信息
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/loadforadddevweek")
+    public Map loadforadddevweek(
+            HttpServletRequest request,
+            HttpServletResponse response) {
+        Map map = new HashMap();
+        try {
+            List<TNcWeektime> weektime = ncService.findAllNcWeekTime();
+            map.put("weektime", weektime);//时间周
+            List<TNcDevice> device = ncService.findAllNcDevices();
+            map.put("device", device);//设备
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error("查询设备失败：" + e.getMessage());
+        }
+        return map;
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java
index 8624521..117cf82 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDevWeekDao.java
@@ -1,5 +1,22 @@
 package com.supwisdom.dlpay.ncmgr.dao;
 
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevweek;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
 public interface NcDevWeekDao {
     public boolean updListVersion();
+
+    public Pagination getNcDevWeekWithPage(int weekid, String devname, int pageNo, int pageSize);
+
+    public void delDevWeekById(int devid,int weekid);
+
+    public int findMaxDevWeekVersion();
+
+    public void deleteDevWeekByWeekId(int weekId);
+
+    public boolean saveDevWeek(TNcDevweek devweek);
+
+    public List<TNcDevweek> findChosenDev(int weekId);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
index 908aa52..dfd7458 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcDeviceDao.java
@@ -33,4 +33,6 @@
     public TNcDevice getDevInfoByDevid(int devid);
 
     public boolean delDevById(int devid);
+
+    public List<TNcDevice> findAllNcDevices();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java
index a6a0515..1060b9a 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/NcWeekTimeDao.java
@@ -24,4 +24,6 @@
     public List getDevWeekByWeekid(int id);
 
     public boolean delByWeekId(int id);
+
+    public List<TNcWeektime> findAllNcWeekTime();
 }
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
index 566c33c..7aaa0f1 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDevWeekDaoImpl.java
@@ -1,12 +1,17 @@
 package com.supwisdom.dlpay.ncmgr.dao.impl;
 
+import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.ncmgr.dao.NcDevWeekDao;
+import com.supwisdom.dlpay.ncmgr.domain.TNcDevweek;
+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 NcDevWeekDaoImpl implements NcDevWeekDao {
@@ -27,4 +32,98 @@
         }
         return flag;
     }
+
+    @Transactional
+    @Override
+    public Pagination getNcDevWeekWithPage(int weekid, String devname, int pageNo, int pageSize) {
+        String sql = " select bean from TNcDevweek bean where 1>0 ";
+        if (!StringUtil.isEmpty(devname)) {
+            sql += " and bean.devname like :devname ";
+        }
+        if (weekid!=0) {
+            sql+=" and bean.id.weekid=:wid ";
+        }
+        TypedQuery<TNcDevweek> query = entityManager.createQuery(sql, TNcDevweek.class);
+        if (!StringUtil.isEmpty(devname)) {
+            query.setParameter("devname", "%"+devname+"%");
+        }
+        if (weekid!=0) {
+            query.setParameter("wid", weekid);
+        }
+        List<TNcDevweek> 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 void delDevWeekById(int devid, int weekid) {
+        try {
+            String sql = "delete from T_NC_DEVWEEK where devid=?1 and weekid=?2";
+            Query query = entityManager.createNativeQuery(sql);
+            query.setParameter(1, devid);
+            query.setParameter(2, weekid);
+            query.executeUpdate();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Transactional
+    @Override
+    public int findMaxDevWeekVersion() {
+        try{
+            String sql = "select max(r.version) from TNcDevweek r";
+            Query query = entityManager.createQuery(sql);
+            Object result = query.getSingleResult();
+            if (result == null){
+                return 0;
+            }else{
+                return  (int)result;
+            }
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    @Transactional
+    @Override
+    public void deleteDevWeekByWeekId(int weekId) {
+        String sql="delete from T_NC_DEVWEEK where weekid=?1";
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter(1,weekId);
+        query.executeUpdate();
+    }
+
+    @Transactional
+    @Override
+    public boolean saveDevWeek(TNcDevweek devweek) {
+        boolean flag=false;
+        try {
+            entityManager.persist(devweek);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<TNcDevweek> findChosenDev(int weekId) {
+        String sql="select r  from TNcDevweek r where r.id.weekid=:id";
+        TypedQuery<TNcDevweek> query = entityManager.createQuery(sql, TNcDevweek.class);
+        query.setParameter("id", weekId);
+        List<TNcDevweek> list = query.getResultList();
+        return list;
+    }
 }
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
index ac6e59a..12927b3 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcDeviceDaoImpl.java
@@ -236,4 +236,13 @@
         }
         return flag;
     }
+
+    @Transactional
+    @Override
+    public List<TNcDevice> findAllNcDevices() {
+        String sql = "select r from TNcDevice r order by r.deviceid";
+        TypedQuery<TNcDevice> query = entityManager.createQuery(sql, TNcDevice.class);
+        List<TNcDevice> list = query.getResultList();
+        return list;
+    }
 }
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
index e276015..7be59b3 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcTimeDaoImpl.java
@@ -23,7 +23,7 @@
     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 ");
+            sql+=" and bean.timename like :timename ";
         }
         TypedQuery<TNcTime> query = entityManager.createQuery(sql, TNcTime.class);
         if (!timename.equals("")){
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
index 1d4a67a..ee9c8a8 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/dao/impl/NcWeekTimeDaoImpl.java
@@ -155,4 +155,13 @@
         }
         return flag;
     }
+
+    @Transactional
+    @Override
+    public List<TNcWeektime> findAllNcWeekTime() {
+        String sql = " select r from TNcWeektime r where r.adddelflag=1 order by r.weekid";
+        TypedQuery<TNcWeektime> query = entityManager.createQuery(sql, TNcWeektime.class);
+        List<TNcWeektime> list = query.getResultList();
+        return list;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevweek.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevweek.java
new file mode 100644
index 0000000..9375cc2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevweek.java
@@ -0,0 +1,92 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.*;
+
+/**
+ * TNcDevweek entity. @author MyEclipse Persistence Tools
+ */
+@Entity
+@Table(name = "T_NC_DEVWEEK")
+public class TNcDevweek implements java.io.Serializable {
+
+	// Fields
+	private TNcDevweekId id;
+	private String devname;
+	private String weekname;
+	private String updatetime;
+	private Integer version;
+
+	// Constructors
+
+	/** default constructor */
+	public TNcDevweek() {
+	}
+
+
+
+	/** full constructor */
+	public TNcDevweek(TNcDevweekId id, String devname,
+			String weekname, String updatetime, Integer version) {
+		this.id = id;
+		this.devname = devname;
+		this.weekname = weekname;
+		this.updatetime = updatetime;
+		this.version = version;
+	}
+
+	// Property accessors
+
+	@EmbeddedId
+	@AttributeOverrides({
+			@AttributeOverride(name = "devid",column = @Column(name = "DEVID", nullable = false, precision = 9, scale = 0)),
+			@AttributeOverride(name = "weekid",column = @Column(name = "WEEKID", nullable = false, precision = 9, scale = 0))
+	})
+	public TNcDevweekId getId() {
+		return id;
+	}
+
+	public void setId(TNcDevweekId id) {
+		this.id = id;
+	}
+
+	@Column(name = "DEVNAME", length = 120)
+	public String getDevname() {
+		return this.devname;
+	}
+
+	public void setDevname(String devname) {
+		this.devname = devname;
+	}
+
+	@Column(name = "WEEKNAME", length = 120)
+	public String getWeekname() {
+		return this.weekname;
+	}
+
+	public void setWeekname(String weekname) {
+		this.weekname = weekname;
+	}
+
+	@Column(name = "UPDATETIME", length = 14)
+	public String getUpdatetime() {
+		return this.updatetime;
+	}
+
+	public void setUpdatetime(String updatetime) {
+		this.updatetime = updatetime;
+	}
+
+	@Column(name = "VERSION", precision = 6, scale = 0)
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	public String toString() {
+		return super.toString();
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevweekId.java b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevweekId.java
new file mode 100644
index 0000000..ae387ed
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/domain/TNcDevweekId.java
@@ -0,0 +1,76 @@
+package com.supwisdom.dlpay.ncmgr.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * TNcDevweekId entity. @author MyEclipse Persistence Tools
+ */
+@Embeddable
+public class TNcDevweekId implements java.io.Serializable {
+
+	// Fields
+
+	private Integer devid;
+	private Integer weekid;
+
+	// Constructors
+
+	/** default constructor */
+	public TNcDevweekId() {
+	}
+
+	/** full constructor */
+	public TNcDevweekId(Integer devid, Integer weekid) {
+		this.devid = devid;
+		this.weekid = weekid;
+	}
+
+	// Property accessors
+
+	@Column(name = "DEVID", nullable = false, precision = 9, scale = 0)
+	public Integer getDevid() {
+		return this.devid;
+	}
+
+	public void setDevid(Integer devid) {
+		this.devid = devid;
+	}
+
+	@Column(name = "WEEKID", nullable = false, precision = 9, scale = 0)
+	public Integer getWeekid() {
+		return this.weekid;
+	}
+
+	public void setWeekid(Integer weekid) {
+		this.weekid = weekid;
+	}
+
+	public boolean equals(Object other) {
+		if ((this == other))
+			return true;
+		if ((other == null))
+			return false;
+		if (!(other instanceof TNcDevweekId))
+			return false;
+		TNcDevweekId castOther = (TNcDevweekId) other;
+
+		return ((this.getDevid() == castOther.getDevid()) || (this.getDevid() != null
+				&& castOther.getDevid() != null && this.getDevid().equals(
+				castOther.getDevid())))
+				&& ((this.getWeekid() == castOther.getWeekid()) || (this
+						.getWeekid() != null && castOther.getWeekid() != null && this
+						.getWeekid().equals(castOther.getWeekid())));
+	}
+
+	public int hashCode() {
+		int result = 17;
+
+		result = 37 * result
+				+ (getDevid() == null ? 0 : this.getDevid().hashCode());
+		result = 37 * result
+				+ (getWeekid() == null ? 0 : this.getWeekid().hashCode());
+		return result;
+	}
+
+}
\ 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
index 0a729cc..12b48f6 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/NcService.java
@@ -144,4 +144,28 @@
 
     //根据id删除时间周
     public boolean delByWeekId(int id);
+
+    //根据查询条件分页获取设备绑定时间周信息
+    public Pagination getNcDevWeekWithPage(int weekid,String devname,int pageNo, int pageSize,Map map);
+
+    //获取所有时间周
+    public List<TNcWeektime> findAllNcWeekTime();
+
+    //根据设备编号和时间周id删除对应设备时间周
+    public void delDevWeekById(int devid,int weekid);
+
+    //获取最大设备时间周版本
+    public int findMaxDevWeekVersion();
+
+    //根据时间周id删除设备绑定的时间周
+    public void deleteDevWeekByWeekId(int weekId);
+
+    //保存设备时间周
+    public boolean saveDevWeek(TNcDevweek devweek);
+
+    //根据id查询已选取此时间周的设备
+    public List<TNcDevweek> findChosenDev(int weekId);
+
+    //获取所有设备
+    public List<TNcDevice> findAllNcDevices();
 }
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
index 4063309..bf5eb5b 100644
--- a/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/ncmgr/service/impl/NcServiceImpl.java
@@ -263,4 +263,46 @@
     public boolean delByWeekId(int id) {
         return ncWeekTimeDao.delByWeekId(id);
     }
+
+    @Override
+    public Pagination getNcDevWeekWithPage(int weekid, String devname, int pageNo, int pageSize, Map map) {
+        Pagination page = ncDevWeekDao.getNcDevWeekWithPage(weekid, devname, pageNo, pageSize);
+        map.put("devWeekPage", page);
+        return page;
+    }
+
+    @Override
+    public List<TNcWeektime> findAllNcWeekTime() {
+        return ncWeekTimeDao.findAllNcWeekTime();
+    }
+
+    @Override
+    public void delDevWeekById(int devid, int weekid) {
+        ncDevWeekDao.delDevWeekById(devid, weekid);
+    }
+
+    @Override
+    public int findMaxDevWeekVersion() {
+        return ncDevWeekDao.findMaxDevWeekVersion();
+    }
+
+    @Override
+    public void deleteDevWeekByWeekId(int weekId) {
+        ncDevWeekDao.deleteDevWeekByWeekId(weekId);
+    }
+
+    @Override
+    public boolean saveDevWeek(TNcDevweek devweek) {
+        return ncDevWeekDao.saveDevWeek(devweek);
+    }
+
+    @Override
+    public List<TNcDevweek> findChosenDev(int weekId) {
+        return ncDevWeekDao.findChosenDev(weekId);
+    }
+
+    @Override
+    public List<TNcDevice> findAllNcDevices() {
+        return ncDeviceDao.findAllNcDevices();
+    }
 }
diff --git a/src/main/resources/templates/ncmgr/nc_devweek.html b/src/main/resources/templates/ncmgr/nc_devweek.html
index 71a3650..857c611 100644
--- a/src/main/resources/templates/ncmgr/nc_devweek.html
+++ b/src/main/resources/templates/ncmgr/nc_devweek.html
@@ -348,12 +348,17 @@
             }
         }
         var dataStr = '{"weekid":"' + weekid+ '","devids":"' + devids+ '"}';
-
+        var token=$("meta[name='_csrf_token']").attr("value");
         $.ajax({
             type: "POST",
             url: encodeURI("/ncmgr/addNcdevweek?weekid="+weekid+"&devids="+devids),
             dataType: "json",
             contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
             data:JSON.stringify(_that.chosenDevs),
             success: function (data) {
                 /*if(data.errStr == undefined){
@@ -395,4 +400,17 @@
         });
     }
 
-</script>
\ No newline at end of file
+</script>
+
+<style>
+    .el-checkbox-group.el-transfer-panel__list{
+        height:250px;
+    }
+    .el-transfer-panel{
+        width:260px;
+    }
+    .el-transfer-panel__body{
+        height:330px;
+        width:250px;
+    }
+</style>
\ No newline at end of file
