diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
new file mode 100644
index 0000000..ec8fadc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TSettlectl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+
+@Repository
+public interface SettleCtlDao extends JpaRepository<TSettlectl, Integer> {
+  @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+  TSettlectl findByBooksetno(Integer booksetno);
+
+  @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+  @Query(value = "from TSettlectl where booksetno=:booksetno ")
+  TSettlectl findByBooksetnoWithLock(@Param("booksetno") Integer booksetno);
+
+  @Modifying(clearAutomatically = true)
+  @Query(value = "update TB_SETTLECTL set PERIODYEAR=:peridyear,PERIODMONTH=:peridmonth where BOOKSETNO=1 ", nativeQuery = true)
+  void updateSettlePeriod(@Param("peridyear") int peridyear, @Param("peridmonth") int peridmonth);
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
new file mode 100644
index 0000000..73dbf10
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
@@ -0,0 +1,88 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "TB_SETTLECTL")
+public class TSettlectl {
+  @Id
+  @Column(name="BOOKSETNO", nullable = false, precision = 2)
+  private Integer booksetno;
+
+  @Column(name="PERIODYEAR", nullable = false, precision = 4)
+  private Integer periodYear;
+
+  @Column(name="PERIODMONTH", nullable = false, precision = 2)
+  private Integer periodMonth;
+
+  @Column(name="STATDATE", precision = 8)
+  private Integer statdate;
+
+  @Column(name="SETTLEDATE",nullable = false, precision = 8)
+  private Integer settledate;
+
+  @Column(name="STATUS", nullable = false, precision = 1)
+  private Integer status;
+
+  @Column(name="UPDTIME", length = 14)
+  private String updtime;
+
+  public Integer getBooksetno() {
+    return booksetno;
+  }
+
+  public void setBooksetno(Integer booksetno) {
+    this.booksetno = booksetno;
+  }
+
+  public Integer getPeriodYear() {
+    return periodYear;
+  }
+
+  public void setPeriodYear(Integer periodYear) {
+    this.periodYear = periodYear;
+  }
+
+  public Integer getPeriodMonth() {
+    return periodMonth;
+  }
+
+  public void setPeriodMonth(Integer periodMonth) {
+    this.periodMonth = periodMonth;
+  }
+
+  public Integer getStatdate() {
+    return statdate;
+  }
+
+  public void setStatdate(Integer statdate) {
+    this.statdate = statdate;
+  }
+
+  public Integer getSettledate() {
+    return settledate;
+  }
+
+  public void setSettledate(Integer settledate) {
+    this.settledate = settledate;
+  }
+
+  public Integer getStatus() {
+    return status;
+  }
+
+  public void setStatus(Integer status) {
+    this.status = status;
+  }
+
+  public String getUpdtime() {
+    return updtime;
+  }
+
+  public void setUpdtime(String updtime) {
+    this.updtime = updtime;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
new file mode 100644
index 0000000..eee9e5a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -0,0 +1,243 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.framework.core.DatabaseConfig;
+import com.supwisdom.dlpay.framework.dao.*;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.NumberUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Service
+public class SystemUtilServiceImpl implements SystemUtilService {
+  @Autowired
+  private DatabaseConfig databaseConfig;
+
+  @Autowired
+  private TaskLockDao taskLockDao;
+  @Autowired
+  private SettleCtlDao settleCtlDao;
+  @Autowired
+  private TranscodeDao transcodeDao;
+  @Autowired
+  private SysparaDao sysparaDao;
+  @Autowired
+  private BusinessparaDao businessparaDao;
+
+  private static final Logger logger = LoggerFactory.getLogger(SystemUtilServiceImpl.class);
+
+  public static class SystemDateTimeImpl implements SystemDateTime {
+    private Date now;
+    private static final SimpleDateFormat sdft = new SimpleDateFormat("yyyyMMddHHmmss");
+
+    public SystemDateTimeImpl(Date now) {
+      this.now = now;
+    }
+
+    @Override
+    public String getHostdate() {
+      return sdft.format(this.now).substring(0, 8);
+    }
+
+    @Override
+    public String getHosttime() {
+      return sdft.format(this.now).substring(8, 14);
+    }
+
+    @Override
+    public String getHostdatetime() {
+      return sdft.format(this.now);
+    }
+
+    @Override
+    public Date getSysdate() {
+      return this.now;
+    }
+  }
+
+  /**
+   * 获取oracle数据库时间
+   */
+  private SystemDateTime getOracleDatetime() {
+    return taskLockDao.getOracleDatetime();
+  }
+
+  private SystemDateTime getPGDatetime() {
+    return taskLockDao.getPGDatetime();
+  }
+
+  @Override
+  public SystemDateTime getSysdatetime() {
+    switch (databaseConfig.getPlatform()) {
+      case "postgresql":
+        return getPGDatetime();
+      default:
+        return getOracleDatetime();
+    }
+  }
+
+  @Override
+  public TTaskLock updateTaskLock(TTaskLock lock) {
+    return taskLockDao.save(lock);
+  }
+
+  @Override
+  public TTaskLock doLockTask(String taskcode, Integer minRecover, String remark) {
+    if (null == minRecover) minRecover = 10; //默认10分钟
+    String hostdatetime = getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
+    TTaskLock lock = taskLockDao.getTaskLockWithLock(taskcode);
+    if (lock != null) {
+      if (lock.getTaskstatus() == 1 && DateUtil.compareDatetime(DateUtil.getNewTime(hostdatetime, -60 * minRecover), lock.getTasktime()) < 0) {
+        // 被锁，正在执行操作
+        return null;
+      } else {
+        lock.setTaskstatus(1);
+        lock.setTasktime(hostdatetime);
+        taskLockDao.save(lock);
+        return lock;
+      }
+    } else {
+      lock = new TTaskLock();
+      lock.setTaskcode(taskcode);
+      lock.setTaskstatus(1);
+      lock.setTasktime(hostdatetime);
+      lock.setRemark(remark);
+      taskLockDao.save(lock);
+    }
+    return lock;
+  }
+
+  @Override
+  public String getAccdate() {
+    String hostdate = getSysdatetime().getHostdate();
+    TSettlectl settlectl = settleCtlDao.getOne(1);
+    if (null != settlectl && null != settlectl.getSettledate()) {
+      if (Integer.valueOf(hostdate) < settlectl.getSettledate().intValue()) {
+        return settlectl.getSettledate().toString();
+      }
+    }
+    return hostdate;
+  }
+
+  private String getOracleRefno() {
+    return taskLockDao.getOracleRefno();
+  }
+
+  @Override
+  public String getRefno() {
+    switch (databaseConfig.getPlatform()) {
+      case "postgresql":
+        return taskLockDao.getPgRefno();
+      default:
+        return taskLockDao.getOracleRefno();
+    }
+  }
+
+  @Override
+  public String getTranscodeName(int transocde, String defaultValue) {
+    TTranscode tTranscode = transcodeDao.getOne(transocde);
+    if (null != tTranscode && !StringUtil.isEmpty(tTranscode.getTransname())) {
+      return tTranscode.getTransname();
+    }
+    return defaultValue;
+  }
+
+  @Override
+  public String getSysparaValue(int paraid) {
+    TSyspara syspara = sysparaDao.findByParaid(paraid);
+    if (null != syspara) return syspara.getParaval();
+    return null;
+  }
+
+  @Override
+  public String getSysparaValue(int paraid, String defaultValue) {
+    String paraval = getSysparaValue(paraid);
+    if (null != paraval) return paraval;
+    return defaultValue;
+  }
+
+  @Override
+  public boolean getSysparaValueAsBoolean(int paraid) {
+    TSyspara syspara = sysparaDao.findByParaid(paraid);
+    if (null != syspara && "1".equals(syspara.getParaval())) return true;
+    return false;
+  }
+
+  @Override
+  public int getSysparaValueAsInt(int paraid, int defaultValue) {
+    TSyspara syspara = sysparaDao.findByParaid(paraid);
+    if (null != syspara && NumberUtil.isNumber(syspara.getParaval())) return Integer.parseInt(syspara.getParaval());
+    return defaultValue;
+  }
+
+  @Override
+  public double getSysparaValueAsDouble(int paraid, double defaultValue) {
+    TSyspara syspara = sysparaDao.findByParaid(paraid);
+    if (null != syspara && NumberUtil.isDecimal(syspara.getParaval())) return Double.parseDouble(syspara.getParaval());
+    return defaultValue;
+  }
+
+  @Override
+  public TSyspara getSyspara(int paraid){
+    return sysparaDao.findByParaid(paraid);
+  }
+
+  @Override
+  public TSyspara getSysparaValueForUpdate(int paraid){
+    return sysparaDao.findByParaidWithLock(paraid);
+  }
+
+  @Override
+  public TSyspara getSysparaValueForUpdateNowait(int paraid){
+    return sysparaDao.findByParaidWithLockNowait(paraid);
+  }
+
+  @Override
+  public String getBusinessValue(String parakey) {
+    if (!StringUtil.isEmpty(parakey)) {
+      TBusinesspara businesspara = businessparaDao.findByParakey(parakey.trim());
+      if (null != businesspara) return businesspara.getParaval();
+    }
+    return null;
+  }
+
+  @Override
+  public String getBusinessValue(String parakey, String defaultValue) {
+    String paraval = getBusinessValue(parakey);
+    if (!StringUtil.isEmpty(paraval)) return paraval;
+    return defaultValue;
+  }
+
+  @Override
+  public TBusinesspara getBusiness(String parakey) {
+    if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakey(parakey.trim());
+    return null;
+  }
+
+  @Override
+  public TBusinesspara getBusinessValueForUpdate(String parakey){
+    if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakeyForUpdate(parakey.trim());
+    return null;
+  }
+
+  @Override
+  public TBusinesspara getBusinessValueForUpdateNowait(String parakey) {
+    if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakeyForUpdateNowait(parakey.trim());
+    return null;
+  }
+
+  @Override
+  public String getSubsystemSignKey(String syscode){
+    // fixme: 验证数据无误性签名秘钥
+    return "";
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/water/dao/RegionDao.java b/src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java
similarity index 74%
rename from src/main/java/com/supwisdom/dlpay/water/dao/RegionDao.java
rename to src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java
index 4f9d450..8691348 100644
--- a/src/main/java/com/supwisdom/dlpay/water/dao/RegionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/AreaDao.java
@@ -10,7 +10,7 @@
 import java.util.Optional;
 
 @Repository
-public interface RegionDao extends JpaRepository<TArea, Integer> {
+public interface AreaDao extends JpaRepository<TArea, Integer> {
 
     List<TArea> findByParentId(Integer parentId);
 
@@ -18,17 +18,17 @@
 
     List<TArea> findByAvailableAndLevelNot(Integer available, Integer level);
 
-    Optional<TArea> findByAvailableAndRegino(Integer available, Integer regino);
+    Optional<TArea> findByAvailableAndAreano(Integer available, Integer regino);
 
     Page<TArea> findAllByAvailable(Integer available, Pageable pageable);
 
     Page<TArea> findByAvailableAndParentId(Integer available, Integer parentId, Pageable pageable);
 
-    Page<TArea> findAllByAvailableAndRegiNameContaining(Integer available, String regiName, Pageable pageable);
+    Page<TArea> findAllByAvailableAndAreaNameContaining(Integer available, String regiName, Pageable pageable);
 
-    TArea findAllByAvailableAndRegiName(Integer available, String reiName);
+    TArea findAllByAvailableAndAreaName(Integer available, String reiName);
 
-    TArea findByAvailableAndRegiNameAndReginoNot(Integer available, String reiName, Integer regino);
+    TArea findByAvailableAndAreaNameAndAreanoNot(Integer available, String reiName, Integer regino);
 
     List<TArea> findByAvailableAndParentId(Integer available, Integer parentId);
 }
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 a7a9348..c28dafa 100644
--- a/src/main/java/com/supwisdom/dlpay/water/dao/DeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/water/dao/DeviceDao.java
@@ -11,12 +11,10 @@
 @Repository
 public interface DeviceDao extends JpaRepository<TDevice, String>, JpaSpecificationExecutor<TDevice> {
 
-  List<TDevice> findByRegino(Integer regino);
+  List<TDevice> findByAreano(Integer regino);
 
-  List<TDevice> findByDevinameAndDevinoNot(String deviname, String devino);
+  List<TDevice> findByDevicenameAndDevicenoNot(String deviname, String devino);
 
-  List<TDevice> findByDeviname(String deviname);
+  List<TDevice> findByDevicename(String deviname);
 
-  @Query("select devistatus from TDevice group by devistatus")
-  List<String> groupStatus();
 }
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 8c3a0a4..27d6fb2 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
@@ -3,7 +3,7 @@
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.water.system.bean.RegionSearchBean;
-import com.supwisdom.dlpay.water.dao.RegionDao;
+import com.supwisdom.dlpay.water.dao.AreaDao;
 import com.supwisdom.dlpay.water.domain.TArea;
 import com.supwisdom.dlpay.water.service.AreaService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +17,7 @@
 public class AreaServiceImpl implements AreaService {
 
     @Autowired
-    private RegionDao regionDao;
+    private AreaDao regionDao;
 
     /**
      * 根据父区域id查询区域列表
@@ -31,7 +31,7 @@
         PageResult<TArea> result = new PageResult<>(regionDao.findByAvailableAndParentId(1, param.getParentId(), pageable));
         List<TArea> data = result.getData();
         if (param.getPageNo()==1) {
-            Optional<TArea> optional = regionDao.findByAvailableAndRegino(1, param.getParentId());
+            Optional<TArea> optional = regionDao.findByAvailableAndAreano(1, param.getParentId());
             if (optional.isPresent()) {
                 data = new ArrayList<>(data);
                 data.add(0, optional.get());
@@ -70,7 +70,7 @@
     public PageResult<TArea> queryAreasBySearchKey(RegionSearchBean param) {
         Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
         if (!StringUtil.isEmpty(param.getSearchKey())) {
-            return new PageResult<>(regionDao.findAllByAvailableAndRegiNameContaining(1, param.getSearchKey(), pageable));
+            return new PageResult<>(regionDao.findAllByAvailableAndAreaNameContaining(1, param.getSearchKey(), pageable));
         }
         return new PageResult<>(regionDao.findAllByAvailable(1, pageable));
     }
@@ -81,7 +81,7 @@
             region.setParentName("无");
             region.setLevel(1);
         } else {
-            Optional<TArea> optional = regionDao.findByAvailableAndRegino(1, region.getParentId());
+            Optional<TArea> optional = regionDao.findByAvailableAndAreano(1, region.getParentId());
             if (optional.isPresent()) {
                 region.setParentName(optional.get().getAreaName());
                 region.setLevel(optional.get().getLevel() + 1);
@@ -95,7 +95,7 @@
     }
 
     public boolean updateArea(TArea region) {
-        Optional<TArea> optional = regionDao.findByAvailableAndRegino(1, region.getAreano());
+        Optional<TArea> optional = regionDao.findByAvailableAndAreano(1, region.getAreano());
         if (optional.isPresent()) {
             TArea oldRegion = optional.get();
             oldRegion.setAreaName(region.getAreaName());
@@ -110,9 +110,9 @@
     @Override
     public boolean checkAreaName(TArea region) {
         if (region.getAreano() == null) {
-            return regionDao.findAllByAvailableAndRegiName(1, region.getAreaName()) == null;
+            return regionDao.findAllByAvailableAndAreaName(1, region.getAreaName()) == null;
         }else {
-            return regionDao.findByAvailableAndRegiNameAndReginoNot(1,
+            return regionDao.findByAvailableAndAreaNameAndAreanoNot(1,
                     region.getAreaName(),
                     region.getAreano()) == null;
         }
@@ -120,7 +120,7 @@
 
     @Override
     public boolean deleteArea(Integer regino) {
-        Optional<TArea> optional = regionDao.findByAvailableAndRegino(1, regino);
+        Optional<TArea> optional = regionDao.findByAvailableAndAreano(1, regino);
         if (optional.isPresent()) {
             TArea region = optional.get();
             region.setAvailable(0);
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
deleted file mode 100644
index 25cab05..0000000
--- a/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package com.supwisdom.dlpay.water.service.impl;
-
-import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.water.dao.DeviceDao;
-import com.supwisdom.dlpay.water.dao.RegionDao;
-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.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 RegionDao regionDao;
-
-  @Override
-  public boolean existSubDevice(Integer regino) {
-    List<TDevice> devices = deviceDao.findByRegino(regino);
-    return devices != null && devices.size() != 0;
-  }
-
-  @Override
-  public PageResult<TDevice> queryDeviceList(DeviceSearchBean param) {
-    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
-    return new PageResult<>(deviceDao.findAll(pageable));
-  }
-
-  @Override
-  public TDevice queryDeviceById(String devino) {
-    Optional<TDevice> optional = deviceDao.findById(devino);
-    return optional.orElse(null);
-  }
-
-  @Override
-  public boolean updateDevice(TDevice device) {
-    Optional<TDevice> deviOption = deviceDao.findById(device.getDeviceno());
-    Optional<TArea> regiOption = regionDao.findByAvailableAndRegino(1, device.getAreano());
-    if (deviOption.isPresent() && regiOption.isPresent()) {
-      TDevice oldDevice = deviOption.get();
-      TArea region = regiOption.get();
-      oldDevice.setDevicename(device.getDevicename());
-      oldDevice.setAreano(region.getAreano());
-      deviceDao.save(oldDevice);
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public boolean saveDevice(TDevice device) {
-    Optional<TArea> regiOption = regionDao.findByAvailableAndRegino(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().toString().length() != 8) {
-      result.put("flag", false);
-      result.put("msg", "请输入合法的设备编号");
-      return result;
-    }
-    Optional<TDevice> optional = deviceDao.findById(device.getDeviceno());
-    List<TDevice> devices;
-    if (optional.isPresent()) {
-      //  更新
-      devices = deviceDao.findByDevinameAndDevinoNot(device.getDevicename(), device.getDeviceno());
-      result.put("type", "update");
-    } else {
-      //  新增
-      devices = deviceDao.findByDeviname(device.getDevicename());
-      result.put("type", "insert");
-    }
-    if (devices != null && devices.size() != 0) {
-      result.put("flag", false);
-      result.put("msg", "已存在的设备名");
-      return result;
-    }
-    result.put("flag", true);
-    return result;
-  }
-
-  @Override
-  public boolean deleteDevice(String devino) {
-    TDevice device = queryDeviceById(devino);
-    if (device != null) {
-      device.setDeviceStatus("注销");
-      deviceDao.save(device);
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public List<String> groupStatus() {
-    List<String> status = deviceDao.groupStatus();
-    return status == null || status.size() == 0 ? null : status;
-  }
-
-  @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 (param.getDevino() != null) {
-        predicates.add(cb.equal(root.get("devino").as(Integer.class), param.getDevino()));
-      }
-      if (param.getRegino() != null) {
-        predicates.add(cb.equal(root.get("regino").as(Integer.class), param.getRegino()));
-      }
-      if (param.getDevistatus() != null) {
-        predicates.add(cb.equal(root.get("devistatus").as(String.class), param.getDevistatus()));
-      }
-      if (param.getDeviname() != null) {
-        predicates.add(cb.like(root.get("deviname"), "%" + param.getDeviname() + "%"));
-      }
-      Predicate[] pre = new Predicate[predicates.size()];
-      return query.where(predicates.toArray(pre)).getRestriction();
-    };
-    return new PageResult<>(deviceDao.findAll(specification, pageable));
-  }
-}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
deleted file mode 100644
index 71aab56..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
-import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.RequestParamCheckException
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.service.CommonService
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
-import java.net.URLDecoder
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-@RestController
-@RequestMapping("/api/user")
-class UserAPIController {
-    @Autowired
-    private lateinit var useService: UserService
-    @Autowired
-    private lateinit var commonService: CommonService
-
-    @PostMapping("/open")
-    fun openAccount(@RequestBody param: OpenUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-
-            if (!param.checkParam() || !param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            useService.findByThirdUniqueIdenty(param.uid).let {
-                if (null != it) {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.REGISTER_USER_EXIST, "该用户唯一号已经注册"))
-                }
-
-                param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码
-                param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) }  //解码
-                useService.registerUser(param).let {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .data("userid", it.userid)
-                            .data("uid", param.uid)
-                            .success())
-                }
-            }
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @PostMapping("/query")
-    fun queryAccount(@RequestBody param: QueryUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid).let {
-                if (null != it) {
-                    val account = useService.findAccountByUserid(it.userid, null)
-                    val pointacc = useService.findPointsAccountByUserid(it.userid)
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .data("userid", it.userid)
-                            .data("name", it.name)
-                            .data("idtype", it.idtype)
-                            .data("idno", it.idno)
-                            .data("mobile", it.mobile)
-                            .data("email", it.email)
-                            .data("status", it.status)
-                            .data("balance", account.let {
-                                if (null == it) {
-                                    0.0
-                                } else {
-                                    it.availbal
-                                }
-                            }) //账户余额
-                            .data("points", pointacc.let {
-                                if (null == it) {
-                                    0
-                                } else {
-                                    it.points
-                                }
-                            }) //积分
-                            .success())
-                }
-
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
-            }
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @PostMapping("/modify")
-    fun modifyAccount(@RequestBody param: ModifyUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid)?.let {
-                param.name = param.name?.let { URLDecoder.decode(param.name, Charsets.UTF_8.toString()) } //解码
-                param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
-                if (useService.modifyUserInfo(it, param)) {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .success("修改成功"))
-                } else {
-                    return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "账户信息修改失败"))
-                }
-            }
-
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
index 5561321..7e4c704 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -15,7 +15,7 @@
     @Autowired
     private lateinit var systemUtilService: SystemUtilService
 
-    @GetMapping("/login")
+    @GetMapping("/devicelogin")
     fun deviceLogin(@RequestBody param: DeviceLoginParam): ResponseEntity<Any> {
         TODO("")
     }
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
new file mode 100644
index 0000000..de0f0aa
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/service/device_service.kt
@@ -0,0 +1,138 @@
+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/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt b/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt
deleted file mode 100644
index c8b875f..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.supwisdom.dlpay
-
-import org.junit.runner.RunWith
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.test.context.junit4.SpringRunner
-
-@RunWith(SpringRunner::class)
-@SpringBootTest
-abstract class DlpayApplicationTests{
-
-}
diff --git a/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt b/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
deleted file mode 100644
index 62a56a3..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.supwisdom.dlpay
-
-import com.google.gson.Gson
-import org.junit.runner.RunWith
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.test.context.junit4.SpringRunner
-import org.springframework.test.web.servlet.MockMvc
-
-/**
- * mvc 基础测试类
- * 放置基础方法，如认证信息等
- */
-@RunWith(SpringRunner::class)
-@SpringBootTest
-@AutoConfigureMockMvc
-abstract class MvcBaseTest{
-    @Autowired
-    protected lateinit var mvc: MockMvc
-    val gson = Gson()
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt b/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
deleted file mode 100644
index 0899c9a..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.supwisdom.dlpay.controller
-
-import com.supwisdom.dlpay.MvcBaseTest
-import org.junit.Test
-import org.springframework.http.MediaType
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
-import org.springframework.test.web.servlet.result.MockMvcResultHandlers
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers
-
-/**
- * Created by shuwei on 2019/4/16.
- */
-class ApiControllerTest : MvcBaseTest() {
-    @Test
-    fun testYktPay() {
-        //TODO prepare data
-        val stuempno="10000097"
-        val ret = mvc.perform(MockMvcRequestBuilders.post("/ykt/payinit").content("")
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(MockMvcResultMatchers.status().isOk)
-                .andDo(MockMvcResultHandlers.print())
-                .andReturn()
-    }
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt b/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
deleted file mode 100644
index c8fd5ec..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.supwisdom.dlpay.controller
-
-import com.google.gson.Gson
-import com.supwisdom.dlpay.MvcBaseTest
-import com.supwisdom.dlpay.api.bean.OpenShopParam
-import com.supwisdom.dlpay.api.bean.QueryShopParam
-import com.supwisdom.dlpay.framework.domain.TShop
-import org.junit.Assert
-import org.junit.Test
-import org.springframework.http.MediaType
-import org.springframework.test.context.ActiveProfiles
-
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
-import org.springframework.test.web.servlet.result.MockMvcResultHandlers.print
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-@ActiveProfiles("devel-pg")
-class ShopControllerTest : MvcBaseTest() {
-    class RetBean {
-        var shopid: Int = 0
-        var retcode: Int = 0
-        lateinit var shop: TShop
-    }
-
-    @Test
-    fun open() {
-        val shopParam = OpenShopParam()
-        shopParam.shopUniqueId = "ykt_shop_20001"
-        shopParam.shopname = "测试名称"
-        val gson = Gson()
-        val ret = mvc.perform(post("/api/shop/open").content(gson.toJson(shopParam))
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk)
-                .andDo(print())
-                .andReturn()
-        val res = ret.response.contentAsString
-        Assert.assertNotNull(res)
-        val retBean = gson.fromJson(res, RetBean::class.java)
-        Assert.assertNotNull(retBean)
-        Assert.assertEquals(0, retBean.retcode)
-        Assert.assertNotNull(retBean.shopid)
-        Assert.assertNotEquals(0, retBean.shopid)
-    }
-
-    @Test
-    fun get() {
-        val shopParam = QueryShopParam()
-        shopParam.shopUniqueId = "ykt_shop_20001"
-        val gson = Gson()
-        val ret = mvc.perform(post("/shop/open").content(gson.toJson(shopParam))
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk)
-                .andDo(print())
-                .andReturn()
-        val resOpen = ret.response.contentAsString
-        Assert.assertNotNull(resOpen)
-        val retBeanOpen = gson.fromJson(resOpen, RetBean::class.java)
-        Assert.assertNotNull(retBeanOpen)
-        Assert.assertNotNull(retBeanOpen.shopid)
-        shopParam.shopid = retBeanOpen.shopid
-
-        val retGet = mvc.perform(get("/shop/get").content(gson.toJson(shopParam))
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(status().isOk)
-                .andDo(print())
-                .andReturn()
-        val res = retGet.response.contentAsString
-        Assert.assertNotNull(res)
-        val retBean = gson.fromJson(res, RetBean::class.java)
-        Assert.assertNotNull(retBean)
-        Assert.assertEquals(0, retBean.retcode)
-        Assert.assertNotNull(retBean.shop)
-        Assert.assertEquals(retBeanOpen.shopid, retBean.shop.shopid)
-    }
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt b/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
deleted file mode 100644
index 5dc498e..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.supwisdom.dlpay.controller
-
-import com.google.gson.Gson
-import com.supwisdom.dlpay.MvcBaseTest
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.framework.domain.TPerson
-import org.junit.Assert
-import org.junit.Test
-import org.springframework.http.MediaType
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
-import org.springframework.test.web.servlet.result.MockMvcResultHandlers
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers
-
-
-class UserControllerTest : MvcBaseTest() {
-
-    class RetBean {
-        var userid: String = ""
-        var retcode: Int = 0
-        lateinit var person: TPerson
-        lateinit var account: TAccount
-    }
-
-    @Test
-    fun open() {
-        val userParam = OpenUserParam()
-        userParam.uid = ""//random req
-        userParam.name = "测试名称"
-
-        val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam))
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(MockMvcResultMatchers.status().isOk)
-                .andDo(MockMvcResultHandlers.print())
-                .andReturn()
-        val res = ret.response.contentAsString
-        Assert.assertNotNull(res)
-        val retBean = gson.fromJson(res, RetBean::class.java)
-        Assert.assertNotNull(retBean)
-        Assert.assertEquals(0, retBean.retcode)
-        Assert.assertNotNull(retBean.userid)
-        Assert.assertNotEquals("", retBean.userid)
-    }
-
-    @Test
-    fun get() {
-
-        val userParam = QueryUserParam()
-        userParam.uid = "testuseruniqueId"//测试用
-        val gson = Gson()
-        val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam))
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(MockMvcResultMatchers.status().isOk)
-                .andDo(MockMvcResultHandlers.print())
-                .andReturn()
-        val resOpen = ret.response.contentAsString
-        Assert.assertNotNull(resOpen)
-        val retBeanOpen = gson.fromJson(resOpen, RetBean::class.java)
-        Assert.assertNotNull(retBeanOpen)
-        Assert.assertNotNull(retBeanOpen.userid)
-        userParam.userid = retBeanOpen.userid
-
-        val retGet = mvc.perform(MockMvcRequestBuilders.get("/api/user/query").content(gson.toJson(userParam))
-                .contentType(MediaType.APPLICATION_JSON))
-                .andExpect(MockMvcResultMatchers.status().isOk)
-                .andDo(MockMvcResultHandlers.print())
-                .andReturn()
-        val res = retGet.response.contentAsString
-        Assert.assertNotNull(res)
-        val retBean = gson.fromJson(res, RetBean::class.java)
-        Assert.assertNotNull(retBean)
-        Assert.assertEquals(0, retBean.retcode)
-        Assert.assertNotNull(retBean.person)
-        Assert.assertEquals(retBeanOpen.userid, retBean.person.userid)
-        Assert.assertNotNull(retBeanOpen.account)
-        Assert.assertEquals(retBeanOpen.person.userid, retBean.account.userid)
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt b/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
deleted file mode 100644
index 24853db..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.supwisdom.dlpay.controller
-
-import com.supwisdom.dlpay.MvcBaseTest
-import com.supwisdom.dlpay.framework.core.JwtConfig
-import com.supwisdom.dlpay.framework.util.HmacUtil
-import io.restassured.RestAssured
-import io.restassured.RestAssured.*
-import io.restassured.http.ContentType
-import io.restassured.path.json.JsonPath.from
-import org.hamcrest.MatcherAssert.assertThat
-import org.hamcrest.Matchers.*
-import org.junit.Before
-import org.junit.Test
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.boot.web.server.LocalServerPort
-import org.springframework.test.context.ActiveProfiles
-import java.text.SimpleDateFormat
-import java.util.*
-
-@ActiveProfiles("devel-pg-local")
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-class SecurityControllerTest : MvcBaseTest() {
-    val appid = "100001"
-    val appsecret = "oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk="
-
-    @LocalServerPort
-    private var port: Int = 0
-
-    @Autowired
-    lateinit var jwtConfig: JwtConfig
-
-    @Before
-    fun setUp() {
-        RestAssured.port = port
-    }
-
-    fun getJwt(id: String, secret: String): String {
-        val token = given().param("appid", id)
-                .`when`()
-                .get("/api/auth/gettoken")
-                .then()
-                .contentType(ContentType.JSON)
-                .statusCode(200)
-                .body("token", notNullValue())
-                .extract().path<String>("token")
-
-        val tokenCrypt = HmacUtil.HMACSHA256(token, secret)
-
-        return given().param("appid", id)
-                .param("secret", tokenCrypt)
-                .`when`()
-                .get("/api/auth/authentication")
-                .then()
-                .statusCode(200)
-                .contentType(ContentType.JSON)
-                .body("jwt", notNullValue())
-                .extract().response().let {
-                    val exp = it.path<String>("expiredAt").run {
-                        SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(this)
-                    }
-                    val now = Calendar.getInstance()
-                    assertThat(now.time, lessThanOrEqualTo(exp))
-                    it.path<String>("jwt")
-                }
-    }
-
-    @Test
-    fun testGetJwt() {
-        getJwt(appid, appsecret)
-    }
-
-    @Test
-    fun testGetJwtClient() {
-        val clientid = "000030450"
-        val response = given().param("appid", appid)
-                .`when`()
-                .get("/api/auth/gettoken/$clientid")
-                .then()
-                .statusCode(200)
-                .body("token", notNullValue())
-                .extract()
-
-        val token = from(response.body().asString()).getString("token")
-        val secret = HmacUtil.HMACSHA256(token, appsecret)
-
-        given().param("appid", appid)
-                .param("secret", secret)
-                .`when`()
-                .get("/api/auth/authentication/$clientid")
-                .then()
-                .statusCode(200)
-                .body("jwt", notNullValue())
-    }
-
-    @Test
-    fun testJwtRefresh() {
-        getJwt(appid, appsecret).also { jwt ->
-            given().header(jwtConfig.header, "${jwtConfig.tokenHeader}$jwt")
-                    .`when`()
-                    .get("/api/auth/refresh")
-                    .then()
-                    .statusCode(200)
-                    .body("jwt", notNullValue())
-        }
-    }
-
-    @Test
-    fun testAuthencationFail() {
-        given().param("appid", appid)
-                .`when`()
-                .get("/api/auth/gettoken")
-                .then()
-                .body("token", notNullValue())
-                .extract()
-                .path<String>("token").also { token ->
-                    given().param("appid", appid)
-                            .param("secret", token)
-                            .`when`()
-                            .get("/api/auth/authentication")
-                            .then()
-                            .statusCode(401)
-                }
-    }
-
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/password_test.kt b/src/test/kotlin/com/supwisdom/dlpay/password_test.kt
deleted file mode 100644
index a89d759..0000000
--- a/src/test/kotlin/com/supwisdom/dlpay/password_test.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.supwisdom.dlpay
-
-import org.junit.Test
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
-import org.springframework.security.crypto.password.DelegatingPasswordEncoder
-import org.springframework.security.crypto.password.PasswordEncoder
-import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder
-import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder
-import java.util.*
-
-
-class PasswordTest {
-    private fun encodePassword(pswd: String) {
-        val encoders = HashMap<String, PasswordEncoder>()
-        encoders["bcrypt"] = BCryptPasswordEncoder()
-        encoders["pbkdf2"] = Pbkdf2PasswordEncoder()
-        encoders["scrypt"] = SCryptPasswordEncoder()
-        val passwordEncoder = DelegatingPasswordEncoder("bcrypt", encoders)
-        println(passwordEncoder.encode(pswd))
-
-    }
-
-    @Test
-    fun testPassword() {
-        encodePassword("123456")
-    }
-}
\ No newline at end of file
