diff --git a/src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java b/src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java
index 8691348..38330f6 100644
--- a/src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java
@@ -14,7 +14,7 @@
 
     List<TArea> findByParentId(Integer parentId);
 
-    List<TArea> findAllByAvailable(Integer available);
+    List<TArea> findAllByAvailableOrderByAreano(Integer available);
 
     List<TArea> findByAvailableAndLevelNot(Integer available, Integer level);
 
@@ -22,7 +22,7 @@
 
     Page<TArea> findAllByAvailable(Integer available, Pageable pageable);
 
-    Page<TArea> findByAvailableAndParentId(Integer available, Integer parentId, Pageable pageable);
+    Page<TArea> findByAvailableAndParentIdOrderByAreano(Integer available, Integer parentId, Pageable pageable);
 
     Page<TArea> findAllByAvailableAndAreaNameContaining(Integer available, String regiName, Pageable pageable);
 
diff --git a/src/main/java/com/supwisdom/dlpay/water/dao/DeviceDao.java b/src/main/java/com/supwisdom/dlpay/water/dao/DeviceDao.java
index c28dafa..96b1daa 100644
--- a/src/main/java/com/supwisdom/dlpay/water/dao/DeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/DeviceDao.java
@@ -1,20 +1,26 @@
 package com.supwisdom.dlpay.water.dao;
 
 import com.supwisdom.dlpay.water.domain.TDevice;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
 @Repository
-public interface DeviceDao extends JpaRepository<TDevice, String>, JpaSpecificationExecutor<TDevice> {
+public interface DeviceDao extends JpaRepository<TDevice, Integer>, JpaSpecificationExecutor<TDevice> {
 
   List<TDevice> findByAreano(Integer regino);
 
-  List<TDevice> findByDevicenameAndDevicenoNot(String deviname, String devino);
+  TDevice findByDevicenoAndDeviceidNot(String deviceno, Integer deviceid);
 
-  List<TDevice> findByDevicename(String deviname);
+  TDevice findByDevicenameAndDeviceidNot(String devicename, Integer deviceid);
 
+  TDevice findByDevicename(String devicename);
+
+  TDevice findByDeviceno(String deviceno);
+
+  Page<TDevice> findAll(Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/water/domain/TDevice.java b/src/main/java/com/supwisdom/dlpay/water/domain/TDevice.java
index 2e148b2..52d4024 100644
--- a/src/main/java/com/supwisdom/dlpay/water/domain/TDevice.java
+++ b/src/main/java/com/supwisdom/dlpay/water/domain/TDevice.java
@@ -7,7 +7,7 @@
 public class TDevice {
   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "deviceid_seq")
-  @SequenceGenerator(name = "deviceid_seq", sequenceName = "seq_deviceid")
+  @SequenceGenerator(name = "deviceid_seq", sequenceName = "seq_deviceid", allocationSize = 1)
   private Integer deviceid;
 
   @Column(name = "deviceno", nullable = false, length = 8)
@@ -28,6 +28,17 @@
   @Column(name = "soft_verno", length = 30)
   private String softVer; // 软件版本
 
+  @Transient
+  private String areaname;
+
+  public String getAreaname() {
+    return areaname;
+  }
+
+  public void setAreaname(String areaname) {
+    this.areaname = areaname;
+  }
+
   public Integer getDeviceid() {
     return deviceid;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java b/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java
index fb750c5..2d63b08 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java
@@ -3,27 +3,31 @@
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.water.domain.TDevice;
 import com.supwisdom.dlpay.water.system.bean.DeviceSearchBean;
+import org.springframework.data.domain.Page;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
 
 public interface DeviceService {
-
-  boolean existSubDevice(Integer regino);
-
-  PageResult<TDevice> queryDeviceList(DeviceSearchBean param);
-
-  TDevice queryDeviceById(String devino);
-
-  boolean updateDevice(TDevice device);
-
-  boolean saveDevice(TDevice device);
-
-  Map<String, Object> checkParams(TDevice device);
-
-  boolean deleteDevice(String devino);
-
-  List<String> groupStatus();
-
-  PageResult<TDevice> queryDeviceByParams(DeviceSearchBean param);
+    @Transactional
+    boolean existSubDevice(Integer areano);
+    @Transactional
+    PageResult<TDevice> queryDeviceList(DeviceSearchBean param);
+    @Transactional
+    TDevice queryDeviceById(Integer deviceid);
+    @Transactional
+    boolean updateDevice(TDevice device);
+    @Transactional
+    boolean saveDevice(TDevice device);
+    @Transactional
+    Map<String, Object> checkParams(TDevice device);
+    @Transactional
+    boolean deleteDevice(Integer deviceid);
+    @Transactional
+    List<String> groupStatus();
+    @Transactional
+    PageResult<TDevice> queryDeviceByParams(DeviceSearchBean param);
+    @Transactional
+    PageResult<TDevice> queryAreaname(Page<TDevice> devicePage);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java b/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java
index 27d6fb2..cbb713f 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java
@@ -28,7 +28,7 @@
     @Override
     public PageResult<TArea> queryAreasByParentId(RegionSearchBean param) {
         Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
-        PageResult<TArea> result = new PageResult<>(regionDao.findByAvailableAndParentId(1, param.getParentId(), pageable));
+        PageResult<TArea> result = new PageResult<>(regionDao.findByAvailableAndParentIdOrderByAreano(1, param.getParentId(), pageable));
         List<TArea> data = result.getData();
         if (param.getPageNo()==1) {
             Optional<TArea> optional = regionDao.findByAvailableAndAreano(1, param.getParentId());
@@ -56,7 +56,7 @@
     }
 
     public List<TArea> queryAllAreas() {
-        List<TArea> regions = regionDao.findAllByAvailable(1);
+        List<TArea> regions = regionDao.findAllByAvailableOrderByAreano(1);
         return regions.size() != 0 ? regions : null;
     }
 
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
new file mode 100644
index 0000000..af018fa
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
@@ -0,0 +1,171 @@
+package com.supwisdom.dlpay.water.service.impl;
+
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.water.dao.AreaDao;
+import com.supwisdom.dlpay.water.dao.DeviceDao;
+import com.supwisdom.dlpay.water.domain.TDevice;
+import com.supwisdom.dlpay.water.domain.TArea;
+import com.supwisdom.dlpay.water.service.DeviceService;
+import com.supwisdom.dlpay.water.system.bean.DeviceSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.Predicate;
+import java.util.*;
+
+@Service
+public class DeviceServiceImpl implements DeviceService {
+    @Autowired
+    private DeviceDao deviceDao;
+
+    @Autowired
+    private AreaDao areaDao;
+
+    @Override
+    public boolean existSubDevice(Integer areano) {
+        List<TDevice> devices = deviceDao.findByAreano(areano);
+        return devices != null && devices.size() != 0;
+    }
+
+    @Override
+    public PageResult<TDevice> queryDeviceList(DeviceSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+        Page<TDevice> devicePage = deviceDao.findAll(pageable);
+        return queryAreaname(devicePage);
+    }
+
+    @Override
+    public TDevice queryDeviceById(Integer deviceid) {
+        Optional<TDevice> optional = deviceDao.findById(deviceid);
+        return optional.orElse(null);
+    }
+
+    @Override
+    public boolean updateDevice(TDevice device) {
+        Optional<TDevice> deviOption = deviceDao.findById(device.getDeviceid());
+        Optional<TArea> regiOption = areaDao.findByAvailableAndAreano(1, device.getAreano());
+        if (deviOption.isPresent() && regiOption.isPresent()) {
+            TDevice oldDevice = deviOption.get();
+            TArea region = regiOption.get();
+            oldDevice.setDevicename(device.getDevicename());
+            oldDevice.setDeviceno(device.getDeviceno());
+            oldDevice.setAreano(region.getAreano());
+            deviceDao.save(oldDevice);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean saveDevice(TDevice device) {
+        Optional<TArea> regiOption = areaDao.findByAvailableAndAreano(1, device.getAreano());
+        if (regiOption.isPresent()) {
+            TArea region = regiOption.get();
+            device.setAreano(region.getAreano());
+            device.setDeviceStatus("正常");
+            deviceDao.save(device);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public Map<String, Object> checkParams(TDevice device) {
+        Map<String, Object> result = new HashMap<>();
+        if (null == device.getDevicename()) {
+            result.put("flag", false);
+            result.put("msg", "设备名称不能为空");
+            return result;
+        }
+        if (null == device.getDeviceno()) {
+            result.put("flag", false);
+            result.put("msg", "设备编号不能为空");
+            return result;
+        }
+        if (device.getDeviceno().length() != 8) {
+            result.put("flag", false);
+            result.put("msg", "请输入合法的设备编号");
+            return result;
+        }
+        TDevice queryDevicename = null;
+        TDevice queryDevicenano = null;
+        if (device.getDeviceid() != null) {
+            queryDevicename = deviceDao.findByDevicenameAndDeviceidNot(device.getDevicename(), device.getDeviceid());
+            queryDevicenano = deviceDao.findByDevicenoAndDeviceidNot(device.getDeviceno(), device.getDeviceid());
+            result.put("type", "update");
+        } else {
+            queryDevicename = deviceDao.findByDevicename(device.getDevicename());
+            queryDevicenano = deviceDao.findByDeviceno(device.getDeviceno());
+            result.put("type", "insert");
+        }
+        if (queryDevicename != null) {
+            result.put("flag", false);
+            result.put("msg", "已存在的设备名");
+            return result;
+        }
+        if (queryDevicenano != null) {
+            result.put("flag", false);
+            result.put("msg", "已存在的设备编号");
+            return result;
+        }
+        result.put("flag", true);
+        return result;
+    }
+
+    @Override
+    public boolean deleteDevice(Integer deviceid) {
+        TDevice device = queryDeviceById(deviceid);
+        if (device != null) {
+            device.setDeviceStatus("注销");
+            deviceDao.save(device);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public List<String> groupStatus() {
+        List<String> list = new ArrayList<>();
+        list.add("正常");
+        list.add("注销");
+        return list;
+    }
+
+    @Override
+    public PageResult<TDevice> queryDeviceByParams(DeviceSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+        Specification<TDevice> specification = (Specification<TDevice>) (root, query, cb) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (!StringUtil.isEmpty(param.getDeviceno())) {
+                predicates.add(cb.equal(root.get("deviceno").as(Integer.class), param.getDeviceno()));
+            }
+            if (param.getAreano() != null) {
+                predicates.add(cb.equal(root.get("areano").as(Integer.class), param.getAreano()));
+            }
+            if (!StringUtil.isEmpty(param.getDeviceStatus())) {
+                predicates.add(cb.equal(root.get("deviceStatus").as(String.class), param.getDeviceStatus()));
+            }
+            if (!StringUtil.isEmpty(param.getDevicename())) {
+                predicates.add(cb.like(root.get("devicename"), "%" + param.getDevicename() + "%"));
+            }
+            Predicate[] pre = new Predicate[predicates.size()];
+            return query.where(predicates.toArray(pre)).getRestriction();
+        };
+        Page<TDevice> devicePage = deviceDao.findAll(specification, pageable);
+        return queryAreaname(devicePage);
+    }
+
+    @Override
+    public PageResult<TDevice> queryAreaname(Page<TDevice> devicePage) {
+        devicePage.get().forEach(device->{
+            Optional<TArea> optional = areaDao.findByAvailableAndAreano(1, device.getAreano());
+            optional.ifPresent(tArea -> device.setAreaname(tArea.getAreaName()));
+        });
+        return new PageResult<>(devicePage);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/water/system/bean/DeviceSearchBean.java b/src/main/java/com/supwisdom/dlpay/water/system/bean/DeviceSearchBean.java
index e2c742f..3fdd0a8 100644
--- a/src/main/java/com/supwisdom/dlpay/water/system/bean/DeviceSearchBean.java
+++ b/src/main/java/com/supwisdom/dlpay/water/system/bean/DeviceSearchBean.java
@@ -3,40 +3,40 @@
 import com.supwisdom.dlpay.system.bean.PageBean;
 
 public class DeviceSearchBean extends PageBean {
-    private String deviname;
-    private Integer devino;
-    private Integer regino;
-    private String devistatus;
+    private String devicename;
+    private String deviceno;
+    private Integer areano;
+    private String deviceStatus;
 
-    public String getDeviname() {
-        return deviname;
+    public String getDevicename() {
+        return devicename;
     }
 
-    public void setDeviname(String deviname) {
-        this.deviname = deviname;
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
     }
 
-    public Integer getDevino() {
-        return devino;
+    public String getDeviceno() {
+        return deviceno;
     }
 
-    public void setDevino(Integer devino) {
-        this.devino = devino;
+    public void setDeviceno(String deviceno) {
+        this.deviceno = deviceno;
     }
 
-    public Integer getRegino() {
-        return regino;
+    public Integer getAreano() {
+        return areano;
     }
 
-    public void setRegino(Integer regino) {
-        this.regino = regino;
+    public void setAreano(Integer areano) {
+        this.areano = areano;
     }
 
-    public String getDevistatus() {
-        return devistatus;
+    public String getDeviceStatus() {
+        return deviceStatus;
     }
 
-    public void setDevistatus(String devistatus) {
-        this.devistatus = devistatus;
+    public void setDeviceStatus(String deviceStatus) {
+        this.deviceStatus = deviceStatus;
     }
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt
index 717a8aa..d8fbcdd 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/water_controller.kt
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.util.PageResult
+import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import com.supwisdom.dlpay.framework.util.WaterErrorCode
 import com.supwisdom.dlpay.water.domain.TDevice
@@ -150,17 +151,17 @@
 
     @PostMapping("/region/del")
     @ResponseBody
-    fun del(@RequestParam("regino") regino: Int): ResponseEntity<Any> {
+    fun del(@RequestParam("areano") areano: Int): ResponseEntity<Any> {
         try {
-            if (areaService.existSubArea(regino)) {
+            if (areaService.existSubArea(areano)) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(WaterErrorCode.REQUEST_DATA_ERROR, "该区域存在子区域，删除失败"))
             }
-            if (deviceService.existSubDevice(regino)) {
+            if (deviceService.existSubDevice(areano)) {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(WaterErrorCode.REQUEST_DATA_ERROR, "该区域有关联设备，删除失败"))
             }
-            return if (areaService.deleteArea(regino)) {
+            return if (areaService.deleteArea(areano)) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .data("msg", "删除成功")
                         .success())
@@ -247,9 +248,9 @@
 
     @GetMapping("/device/devino/{devino}")
     @ResponseBody
-    fun checkDevino(@PathVariable devino: String): ResponseEntity<Any> {
+    fun checkDevino(@PathVariable deviceid: Int): ResponseEntity<Any> {
         try {
-            deviceService.queryDeviceById(devino)?.let {
+            deviceService.queryDeviceById(deviceid)?.let {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .data("flag", true)
                         .success())
@@ -265,9 +266,9 @@
 
     @PostMapping("/device/del")
     @ResponseBody
-    fun del(@RequestParam devino: String): ResponseEntity<Any> {
+    fun del(@RequestParam deviceid: Int): ResponseEntity<Any> {
         return try {
-            if (deviceService.deleteDevice(devino)) {
+            if (deviceService.deleteDevice(deviceid)) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .data("msg", "删除成功")
                         .success())
@@ -300,23 +301,25 @@
 
     @GetMapping("/device/search")
     @ResponseBody
-    fun queryRegions(@RequestParam("deviname", required = false) deviname: String,
-                     @RequestParam("devino", required = false) devino: Int,
-                     @RequestParam("regino", required = false) regino: Int,
-                     @RequestParam("devistatus", required = false) devistatus: String,
+    fun queryRegions(@RequestParam("devicename", required = false) devicename: String,
+                     @RequestParam("deviceno", required = false) deviceno: String,
+                     @RequestParam("areano", required = false) areanoStr: String,
+                     @RequestParam("deviceStatus", required = false) deviceStatus: String,
                      @RequestParam("page", defaultValue = "1", required = false) pageNo: Int,
                      @RequestParam("limit", defaultValue = "10", required = false) pageSize: Int): PageResult<TDevice> {
         try {
             if (pageNo < 1 || pageSize < 1) {
                 return PageResult(WaterErrorCode.REQUEST_DATA_ERROR, "请求参数错误")
             }
+            val areano:Int?
+            areano = if (StringUtil.isEmpty(areanoStr)) { null } else { areanoStr.toInt() }
             val searchBean = DeviceSearchBean().apply {
                 this.pageNo = pageNo
                 this.pageSize = pageSize
-                this.deviname = deviname
-                this.devino = devino
-                this.regino = regino
-                this.devistatus = devistatus
+                this.devicename = devicename
+                this.deviceno = deviceno
+                this.areano = areano
+                this.deviceStatus = deviceStatus
             }
             deviceService.queryDeviceByParams(searchBean)?.let {
                 return it
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/service/device_service.kt b/src/main/kotlin/com/supwisdom/dlpay/water/service/device_service.kt
deleted file mode 100644
index de0f0aa..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/water/service/device_service.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-package com.supwisdom.dlpay.water.service
-
-
-import com.supwisdom.dlpay.framework.util.PageResult
-import com.supwisdom.dlpay.water.dao.DeviceDao
-import com.supwisdom.dlpay.water.dao.AreaDao
-import com.supwisdom.dlpay.water.domain.TDevice
-import com.supwisdom.dlpay.water.system.bean.DeviceSearchBean
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.data.domain.PageRequest
-import org.springframework.data.jpa.domain.Specification
-import org.springframework.stereotype.Service
-
-import javax.persistence.criteria.Predicate
-import java.util.*
-
-@Service
-class DeviceServiceImpl : DeviceService {
-    @Autowired
-    private lateinit var deviceDao: DeviceDao
-
-    @Autowired
-    private lateinit var areaDao: AreaDao
-
-    override fun existSubDevice(regino: Int?): Boolean {
-        val devices = deviceDao.findByAreano(regino)
-        return devices != null && devices.size != 0
-    }
-
-    override fun queryDeviceList(param: DeviceSearchBean): PageResult<TDevice> {
-        val pageable = PageRequest.of(param.pageNo - 1, param.pageSize)
-        return PageResult(deviceDao.findAll(pageable))
-    }
-
-    override fun queryDeviceById(devino: String): TDevice? {
-        val optional = deviceDao.findById(devino)
-        return optional.orElse(null)
-    }
-
-    override fun updateDevice(device: TDevice): Boolean {
-        val deviOption = deviceDao.findById(device.deviceno)
-        val regiOption = areaDao.findByAvailableAndAreano(1, device.areano)
-        if (deviOption.isPresent && regiOption.isPresent) {
-            val oldDevice = deviOption.get()
-            val region = regiOption.get()
-            oldDevice.devicename = device.devicename
-            oldDevice.areano = region.areano
-            deviceDao.save(oldDevice)
-            return true
-        }
-        return false
-    }
-
-    override fun saveDevice(device: TDevice): Boolean {
-        val regiOption = areaDao.findByAvailableAndAreano(1, device.areano)
-        if (regiOption.isPresent) {
-            val region = regiOption.get()
-            device.areano = region.areano
-            device.deviceStatus = "正常"
-            deviceDao.save(device)
-            return true
-        }
-        return false
-    }
-
-    override fun checkParams(device: TDevice): Map<String, Any> {
-        val result = HashMap<String, Any>()
-        if (null == device.devicename) {
-            result["flag"] = false
-            result["msg"] = "设备名称不能为空"
-            return result
-        }
-        if (null == device.deviceno) {
-            result["flag"] = false
-            result["msg"] = "设备编号不能为空"
-            return result
-        }
-        if (device.deviceno.toString().length != 8) {
-            result["flag"] = false
-            result["msg"] = "请输入合法的设备编号"
-            return result
-        }
-        val optional = deviceDao.findById(device.deviceno)
-        val devices: List<TDevice>?
-        if (optional.isPresent) {
-            //  更新
-            devices = deviceDao.findByDevicenameAndDevicenoNot(device.devicename, device.deviceno)
-            result["type"] = "update"
-        } else {
-            //  新增
-            devices = deviceDao.findByDevicename(device.devicename)
-            result["type"] = "insert"
-        }
-        if (devices != null && devices.isNotEmpty()) {
-            result["flag"] = false
-            result["msg"] = "已存在的设备名"
-            return result
-        }
-        result["flag"] = true
-        return result
-    }
-
-    override fun deleteDevice(devino: String): Boolean {
-        val device = queryDeviceById(devino)
-        if (device != null) {
-            device.deviceStatus = "注销"
-            deviceDao.save(device)
-            return true
-        }
-        return false
-    }
-
-    override fun groupStatus(): List<String>? {
-        return listOf("normal", "closed")
-    }
-
-    override fun queryDeviceByParams(param: DeviceSearchBean): PageResult<TDevice> {
-        val pageable = PageRequest.of(param.pageNo - 1, param.pageSize)
-        val specification = Specification<TDevice> { root, query, cb ->
-            val predicates = ArrayList<Predicate>()
-            if (param.devino != null) {
-                predicates.add(cb.equal(root.get<String>("devino"), param.devino))
-            }
-            if (param.regino != null) {
-                predicates.add(cb.equal(root.get<Int>("areano"), param.regino))
-            }
-            if (param.devistatus != null) {
-                predicates.add(cb.equal(root.get<String>("devistatus"), param.devistatus))
-            }
-            if (param.deviname != null) {
-                predicates.add(cb.like(root.get("deviname"), "%" + param.deviname + "%"))
-            }
-            val array = predicates.toTypedArray()
-            query.where(*array).restriction
-        }
-        return PageResult(deviceDao.findAll(specification, pageable))
-    }
-}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 4c33b78..e263110 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -22,7 +22,8 @@
 spring.thymeleaf.mode=HTML5
 spring.thymeleaf.cache=false
 spring.thymeleaf.enabled=true
-
+#################################################
+#server.servlet.context-path=/water
 ################################################
 # user password
 auth.password.bcrypt.length=10
diff --git a/src/main/resources/templates/system/device/form.html b/src/main/resources/templates/system/device/form.html
index fc2dc0a..ea0db7e 100644
--- a/src/main/resources/templates/system/device/form.html
+++ b/src/main/resources/templates/system/device/form.html
@@ -1,5 +1,6 @@
 <!-- operator表单弹窗 -->
 <form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="deviceid" id="deviceid" type="hidden"/>
     <div class="layui-form-item">
         <label class="layui-form-label">设备名称</label>
         <div class="layui-input-block">
@@ -39,8 +40,8 @@
         //  清除admin域中的数据
         admin.putTempData('t_func', '');
         if (func) {
+            $('input[name="deviceid"]').attr('readonly', 'readonly');
             form.val('form', func);
-            $("#input-deviceno").attr('readonly', 'readonly');
             $.ajax({
                 url: "/region/all",
                 type: "GET",
@@ -88,23 +89,23 @@
                     if (!new RegExp("^\\d{8}$").test(value)) {
                         return '设备编号必须为8位数字';
                     }
-                    var msg = '';
-                    $.ajax({
-                        url: "device/deviceno/" + value,
-                        type: "GET",
-                        async: false,
-                        success: function (data) {
-                            if (data.flag) {
-                                msg = '已存在的设备编号'
-                            }
-                        },
-                        error: function (xhr) {
-                            console.log(xhr)
-                        }
-                    })
-                    if (msg !== '') {
-                        return msg;
-                    }
+                    // var msg = '';
+                    // $.ajax({
+                    //     url: "device/deviceno/" + value,
+                    //     type: "GET",
+                    //     async: false,
+                    //     success: function (data) {
+                    //         if (data.flag) {
+                    //             msg = '已存在的设备编号'
+                    //         }
+                    //     },
+                    //     error: function (xhr) {
+                    //         console.log(xhr)
+                    //     }
+                    // })
+                    // if (msg !== '') {
+                    //     return msg;
+                    // }
                 }
             }
         });
diff --git a/src/main/resources/templates/system/device/index.html b/src/main/resources/templates/system/device/index.html
index fbbd77f..7561500 100644
--- a/src/main/resources/templates/system/device/index.html
+++ b/src/main/resources/templates/system/device/index.html
@@ -15,7 +15,7 @@
                         <input id="devicename-search-value" class="layui-input search-input" type="text"/>
                     </div>
                     <div class="layui-col-md4">
-                        终端编号
+                        设备编号
                         <input id="deviceno-search-value" class="layui-input search-input" type="text"/>
                     </div>
                     <div class="layui-col-md3">
@@ -117,6 +117,8 @@
                     {field: 'deviceno', align: 'center', title: '设备编号', unresize: true},
                     {field: 'deviceStatus', align: 'center', title: '状态', unresize: true},
                     {field: 'areaname', align: 'center', title: '所在区域'},
+                    {field: 'deviceLineCheck', align: 'center', title: '心跳'},
+                    {field: 'softVer', align: 'center', title: '版本号'},
                     {
                         field: 'deviceId', align: 'center', title: '操作', unresize: true, templet: function (item) {
                             let html = ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>修改</a> ' +
@@ -138,15 +140,12 @@
             var deviceno = $('#deviceno-search-value').val();
             var areano = $('#select-region').val();
             var status = $('#select-status').val();
-            deviceno == '' ? 'null' : deviceno;
-            console.log(deviceno)
-            areano == "" ? 'null' : areano;
             table.reload('devicetable', {
                 where: {
                     devicename: devicename,
                     deviceno: deviceno,
                     areano: areano,
-                    devistatus: status
+                    deviceStatus: status
                 },
                 url: "/device/search"
             });
@@ -194,7 +193,7 @@
                 layer.load(2);
                 let token = $("meta[name='_csrf_token']").attr("value");
                 admin.go('/device/del', {
-                    deviceno: data.deviceno,
+                    deviceid: data.deviceid,
                     _csrf: token
                 }, function (data) {
                     console.log(data.code);
