Quellcode durchsuchen

处理 AppBuilding, AppDeploying and AppRunning

reghao vor 4 Jahren
Ursprung
Commit
6247747b54
35 geänderte Dateien mit 563 neuen und 186 gelöschten Zeilen
  1. 5 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppDeployConfigController.java
  2. 10 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/StatusPageController.java
  3. 7 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppDeployConfigPageController.java
  4. 5 69
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppBuildingQuery.java
  5. 92 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppBuildingQueryImpl.java
  6. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppDeployingQuery.java
  7. 6 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppDeployingQueryImpl.java
  8. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppRunningQuery.java
  9. 27 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppRunningQueryImpl.java
  10. 48 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/config/impl/AppDeployConfigQueryImpl.java
  11. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/repository/AppBuildingRepository.java
  12. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/repository/AppDeployingRepository.java
  13. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/repository/AppRunningRepository.java
  14. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/AppDeployConfigDto.java
  15. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/AppBuilding.java
  16. 7 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/AppRunning.java
  17. 5 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppDeployConfigVo.java
  18. 42 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppRunningVo.java
  19. 0 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployConfigService.java
  20. 14 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppBuildingService.java
  21. 15 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppDeployingService.java
  22. 14 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppRunningService.java
  23. 47 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppBuildingServiceImpl.java
  24. 40 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppDeployConfigServiceImpl.java
  25. 54 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppDeployingServiceImpl.java
  26. 47 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppRunningServiceImpl.java
  27. 2 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImpl.java
  28. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPage.java
  29. 5 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPageImpl.java
  30. 5 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/BuildDeployPageImpl.java
  31. 5 5
      dmaster/src/main/resources/templates/app/config/app/deploy/add.html
  32. 26 4
      dmaster/src/main/resources/templates/app/config/app/deploy/detail.html
  33. 7 7
      dmaster/src/main/resources/templates/app/config/app/deploy/index.html
  34. 5 5
      dmaster/src/main/resources/templates/app/stat/index.html
  35. 8 6
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImplTest.java

+ 5 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppDeployConfigController.java

@@ -1,10 +1,8 @@
 package cn.reghao.autodop.dmaster.app.controller.config;
 
 import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
-import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import cn.reghao.autodop.dmaster.app.service.config.AppDeployConfigService;
 import cn.reghao.jdkutil.result.Result;
-import cn.reghao.jdkutil.result.ResultStatus;
 import cn.reghao.jdkutil.result.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -31,9 +29,9 @@ public class AppDeployConfigController {
     @ApiOperation(value = "添加/修改应用部署配置")
     @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
     public String add(@Validated AppDeployConfigDto appDeployConfigDto) {
-        Integer id = appDeployConfigDto.getAppDeployConfigId();
+        Integer appDeployConfigId = appDeployConfigDto.getAppDeployConfigId();
         Result result;
-        if (id == null) {
+        if (appDeployConfigId == null) {
             result = deployConfigService.add(appDeployConfigDto);
         } else {
             result = deployConfigService.modify(appDeployConfigDto);
@@ -44,8 +42,8 @@ public class AppDeployConfigController {
 
     @ApiOperation(value = "删除应用部署配置")
     @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String delete(@PathVariable("id") int appDeployConfigId) {
-
-        return WebBody.result(Result.result(ResultStatus.SUCCESS));
+    public String delete(@PathVariable("id") Integer appDeployConfigId) {
+        Result result = deployConfigService.delete(appDeployConfigId);
+        return WebBody.result(result);
     }
 }

+ 10 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/StatusPageController.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.app.controller.page;
 
 import cn.reghao.autodop.dmaster.app.db.query.AppRunningQuery;
 import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
-import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
+import cn.reghao.autodop.dmaster.app.model.vo.AppRunningVo;
 import cn.reghao.autodop.dmaster.util.db.PageList;
 import cn.reghao.autodop.dmaster.util.db.PageSort;
 import io.swagger.annotations.Api;
@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -29,7 +30,7 @@ import java.util.*;
 @Controller
 @RequestMapping("/app/stat")
 public class StatusPageController {
-    private AppRunningQuery runningQuery;
+    private final AppRunningQuery runningQuery;
 
     public StatusPageController(AppRunningQuery runningQuery) {
         this.runningQuery = runningQuery;
@@ -47,21 +48,22 @@ public class StatusPageController {
         if (appName != null) {
             Map<String, String> map = new HashMap<>();
             map.put("appName", appName);
-            List<AppRunning> list = runningQuery.queryAll(map);
-            Page<AppRunning> page = new PageImpl<>(list);
-            PageList<AppRunning> pageList = PageList.pageList(page);
+            List<AppRunningVo> list = runningQuery.queryAll(map).stream()
+                    .map(AppRunningVo::new).collect(Collectors.toList());
+            Page<AppRunningVo> page = new PageImpl<>(list);
+            PageList<AppRunningVo> pageList = PageList.pageList(page);
 
             model.addAttribute("env", env);
             model.addAttribute("page", page);
             model.addAttribute("list", pageList.getList());
-            return "/app/status";
+            return "/app/stat/index";
         }
 
         Map<String, String> queryMap = new HashMap<>();
         queryMap.put("env", env);
         PageRequest pageRequest = PageSort.pageRequest();
-        Page<AppRunning> appRunnings = runningQuery.queryByPage(queryMap, pageRequest);
-        PageList<AppRunning> pageList = PageList.pageList(appRunnings);
+        Page<AppRunningVo> appRunnings = runningQuery.queryByPage(queryMap, pageRequest).map(AppRunningVo::new);
+        PageList<AppRunningVo> pageList = PageList.pageList(appRunnings);
 
         model.addAttribute("env", env);
         model.addAttribute("page", appRunnings);

+ 7 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppDeployConfigPageController.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dmaster.app.controller.page.config;
 import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.AppDeployConfigVo;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import cn.reghao.autodop.dmaster.app.service.page.AppDeployConfigPage;
 import cn.reghao.autodop.dmaster.util.db.PageList;
@@ -39,8 +40,8 @@ public class AppDeployConfigPageController {
     @GetMapping("/{appId}")
     public String deployConfigIndexPage(@PathVariable("appId") String appId, Model model) {
         PageRequest pageRequest = PageSort.pageRequest();
-        Page<AppDeployConfig> page = deployConfigPage.indexPage(appId, pageRequest);
-        PageList<AppDeployConfig> pageList = PageList.pageList(page);
+        Page<AppDeployConfigVo> page = deployConfigPage.indexPage(appId, pageRequest);
+        PageList<AppDeployConfigVo> pageList = PageList.pageList(page);
 
         model.addAttribute("appId", appId);
         model.addAttribute("page", page);
@@ -63,12 +64,13 @@ public class AppDeployConfigPageController {
     public String editAppConfigPage(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId,
                                     Model model) {
         AppDeployConfig appDeployConfig = deployConfigPage.findByAppIdAndMachineId(appId, machineId);
-        List<KeyValue> machines = deployConfigPage.machines(appDeployConfig.getAppConfig().getEnv());
+        AppConfig appConfig = appDeployConfig.getAppConfig();
+        List<KeyValue> machines = deployConfigPage.machines(appConfig.getEnv());
 
         model.addAttribute("appId", appId);
         model.addAttribute("packType", appDeployConfig.getAppConfig().getPackerConfig().getType());
-        model.addAttribute("appDeployConfig", new AppDeployConfigDto(appDeployConfig));
         model.addAttribute("machines", machines);
+        model.addAttribute("appDeployConfig", new AppDeployConfigDto(appDeployConfig));
         return "/app/config/app/deploy/add";
     }
 
@@ -76,7 +78,7 @@ public class AppDeployConfigPageController {
     public String appConfigPage(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId,
                                 Model model) {
         AppDeployConfig appDeployConfig = deployConfigPage.findByAppIdAndMachineId(appId, machineId);
-        model.addAttribute("appDeployConfig", appDeployConfig);
+        model.addAttribute("appDeployConfig", new AppDeployConfigVo(appDeployConfig));
         return "/app/config/app/deploy/detail";
     }
 }

+ 5 - 69
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppBuildingQuery.java

@@ -1,85 +1,21 @@
 package cn.reghao.autodop.dmaster.app.db.query;
 
 import cn.reghao.autodop.dmaster.app.model.po.AppBuilding;
-import cn.reghao.autodop.dmaster.app.db.repository.AppBuildingRepository;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.vo.AppBuildingVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
 
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.JoinType;
-import javax.persistence.criteria.Predicate;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2021-06-02 15:01:18
  */
-@Service
-public class AppBuildingQuery {
-    private final AppBuildingRepository buildingRepository;
-
-    public AppBuildingQuery(AppBuildingRepository buildingRepository) {
-        this.buildingRepository = buildingRepository;
-    }
-
-    public Page<AppBuildingVO> queryByPage(Map<String, String> kv, Pageable pageable) {
-        Page<AppBuilding> appBuildings = innerJoin(kv, pageable);
-        return appBuildings.map(AppBuildingVO::new);
-    }
-
-    public List<AppBuildingVO> queryAll(Map<String, String> kv) {
-        Specification<AppBuilding> specification = specification(kv);
-        List<AppBuilding> appBuildings = buildingRepository.findAll(specification);
-        return appBuildings.stream().map(AppBuildingVO::new).collect(Collectors.toList());
-    }
-
-    public AppBuilding findByAppId(String appId) {
-        Specification<AppBuilding> specification = (root, query, cb) -> {
-            Join<AppBuilding, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
-            Predicate predicate = cb.equal(innerJoin.get("appId"), appId);
-            return cb.and(predicate);
-        };
-
-        List<AppBuilding> list = buildingRepository.findAll(specification);
-        if (!list.isEmpty()) {
-            return list.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    private Specification<AppBuilding> specification(Map<String, String> kv) {
-        return (root, query, cb) -> {
-            Join<AppBuilding, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
-            List<Predicate> predicates = new ArrayList<>();
-            kv.forEach((name, value) -> {
-                predicates.add(cb.like(innerJoin.get(name), "%" + value + "%"));
-            });
-
-            return cb.and(predicates.toArray(new Predicate[0]));
-        };
-    }
-
-    private Page<AppBuilding> innerJoin(Map<String, String> kv, Pageable pageable) {
-        Specification<AppBuilding> specification = (root, query, cb) -> {
-            Join<AppBuilding, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
-            List<Predicate> predicates = new ArrayList<>();
-            kv.forEach((name, value) -> {
-                //predicates.add(cb.like(innerJoin.get(name), "%" + value + "%"));
-                predicates.add(cb.equal(innerJoin.get(name), value));
-            });
-
-            return cb.and(predicates.toArray(new Predicate[0]));
-        };
-
-        return buildingRepository.findAll(specification, pageable);
-    }
+public interface AppBuildingQuery {
+    Page<AppBuildingVO> queryByPage(Map<String, String> kv, Pageable pageable);
+    List<AppBuildingVO> queryAll(Map<String, String> kv);
+    AppBuilding findByAppId(String appId);
+    AppBuilding findByAppConfig(AppConfig appConfig);
 }

+ 92 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppBuildingQueryImpl.java

@@ -0,0 +1,92 @@
+package cn.reghao.autodop.dmaster.app.db.query;
+
+import cn.reghao.autodop.dmaster.app.db.repository.AppBuildingRepository;
+import cn.reghao.autodop.dmaster.app.model.po.AppBuilding;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.AppBuildingVO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-06-02 15:01:18
+ */
+@Service
+public class AppBuildingQueryImpl implements AppBuildingQuery {
+    private final AppBuildingRepository buildingRepository;
+
+    public AppBuildingQueryImpl(AppBuildingRepository buildingRepository) {
+        this.buildingRepository = buildingRepository;
+    }
+
+    @Override
+    public Page<AppBuildingVO> queryByPage(Map<String, String> kv, Pageable pageable) {
+        Page<AppBuilding> appBuildings = innerJoin(kv, pageable);
+        return appBuildings.map(AppBuildingVO::new);
+    }
+
+    @Override
+    public List<AppBuildingVO> queryAll(Map<String, String> kv) {
+        Specification<AppBuilding> specification = specification(kv);
+        List<AppBuilding> appBuildings = buildingRepository.findAll(specification);
+        return appBuildings.stream().map(AppBuildingVO::new).collect(Collectors.toList());
+    }
+
+    @Override
+    public AppBuilding findByAppId(String appId) {
+        Specification<AppBuilding> specification = (root, query, cb) -> {
+            Join<AppBuilding, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
+            Predicate predicate = cb.equal(innerJoin.get("appId"), appId);
+            return cb.and(predicate);
+        };
+
+        List<AppBuilding> list = buildingRepository.findAll(specification);
+        if (!list.isEmpty()) {
+            return list.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    private Specification<AppBuilding> specification(Map<String, String> kv) {
+        return (root, query, cb) -> {
+            Join<AppBuilding, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
+            List<Predicate> predicates = new ArrayList<>();
+            kv.forEach((name, value) -> {
+                predicates.add(cb.like(innerJoin.get(name), "%" + value + "%"));
+            });
+
+            return cb.and(predicates.toArray(new Predicate[0]));
+        };
+    }
+
+    private Page<AppBuilding> innerJoin(Map<String, String> kv, Pageable pageable) {
+        Specification<AppBuilding> specification = (root, query, cb) -> {
+            Join<AppBuilding, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
+            List<Predicate> predicates = new ArrayList<>();
+            kv.forEach((name, value) -> {
+                //predicates.add(cb.like(innerJoin.get(name), "%" + value + "%"));
+                predicates.add(cb.equal(innerJoin.get(name), value));
+            });
+
+            return cb.and(predicates.toArray(new Predicate[0]));
+        };
+
+        return buildingRepository.findAll(specification, pageable);
+    }
+
+    @Override
+    public AppBuilding findByAppConfig(AppConfig appConfig) {
+        return buildingRepository.findByAppConfig(appConfig);
+    }
+}

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppDeployingQuery.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.db.query;
 
 import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 
 import java.util.List;
 import java.util.Map;
@@ -12,5 +13,6 @@ import java.util.Map;
 public interface AppDeployingQuery {
     List<AppDeploying> findByAppId(String appId);
     AppDeploying findByAppIdAndMachineId(String appId, String machineId);
+    AppDeploying findByAppDeployConfig(AppDeployConfig appDeployConfig);
     AppDeploying query(Map<String, String> kv);
 }

+ 6 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppDeployingQueryImpl.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.app.db.query;
 
 import cn.reghao.autodop.dmaster.app.db.repository.AppDeployingRepository;
 import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
@@ -35,6 +36,11 @@ public class AppDeployingQueryImpl implements AppDeployingQuery {
         return null;
     }
 
+    @Override
+    public AppDeploying findByAppDeployConfig(AppDeployConfig appDeployConfig) {
+        return deployingRepository.findByAppDeployConfig(appDeployConfig);
+    }
+
     @Override
     public AppDeploying query(Map<String, String> kv) {
         Specification<AppDeploying> specification = specification(kv);

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppRunningQuery.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.db.query;
 
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -13,6 +14,7 @@ import java.util.Map;
  */
 public interface AppRunningQuery {
     AppRunning findByAppIdAndMachineId(String appId, String machineId);
+    AppRunning findByAppDeploying(AppDeploying appDeploying);
     List<AppRunning> queryAll(Map<String, String> kv);
     Page<AppRunning> queryByPage(Map<String, String> kv, Pageable pageable);
 }

+ 27 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/AppRunningQueryImpl.java

@@ -1,12 +1,17 @@
 package cn.reghao.autodop.dmaster.app.db.query;
 
 import cn.reghao.autodop.dmaster.app.db.repository.AppRunningRepository;
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
 import javax.persistence.criteria.Predicate;
 import java.util.ArrayList;
 import java.util.List;
@@ -29,6 +34,11 @@ public class AppRunningQueryImpl implements AppRunningQuery {
         return null;
     }
 
+    @Override
+    public AppRunning findByAppDeploying(AppDeploying appDeploying) {
+        return runningRepository.findByAppDeploying(appDeploying);
+    }
+
     @Override
     public List<AppRunning> queryAll(Map<String, String> kv) {
         Specification<AppRunning> specification = specification(kv);
@@ -37,7 +47,7 @@ public class AppRunningQueryImpl implements AppRunningQuery {
 
     @Override
     public Page<AppRunning> queryByPage(Map<String, String> kv, Pageable pageable) {
-        Specification<AppRunning> specification = specification(kv);
+        Specification<AppRunning> specification = innerJoin(kv);
         return runningRepository.findAll(specification, pageable);
     }
 
@@ -52,4 +62,20 @@ public class AppRunningQueryImpl implements AppRunningQuery {
             return cb.and(predicates.toArray(new Predicate[0]));
         };
     }
+
+    private Specification<AppRunning> innerJoin(Map<String, String> kv) {
+        return (root, query, cb) -> {
+            Join<AppRunning, AppDeploying> innerJoin = root.join("appDeploying", JoinType.INNER);
+            Join<AppDeploying, AppDeployConfig> innerJoin2 = innerJoin.join("appDeployConfig", JoinType.INNER);
+            Join<AppDeployConfig, AppConfig> innerJoin3 = innerJoin2.join("appConfig", JoinType.INNER);
+
+            List<Predicate> predicates = new ArrayList<>();
+            kv.forEach((name, value) -> {
+                predicates.add(cb.like(innerJoin3.get(name), "%" + value + "%"));
+            });
+
+            // select * from app_building where app_id like '%test%' and app_name like '%测试%'
+            return cb.and(predicates.toArray(new Predicate[0]));
+        };
+    }
 }

+ 48 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/query/config/impl/AppDeployConfigQueryImpl.java

@@ -2,13 +2,17 @@ package cn.reghao.autodop.dmaster.app.db.query.config.impl;
 
 import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.repository.config.AppDeployConfigRepository;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
+import javax.persistence.criteria.Predicate;
 import java.util.List;
 
 /**
@@ -17,25 +21,60 @@ import java.util.List;
  */
 @Service
 public class AppDeployConfigQueryImpl implements AppDeployConfigQuery {
-    private final AppDeployConfigRepository appDeployConfigRepository;
+    private final AppDeployConfigRepository deployConfigRepository;
 
-    public AppDeployConfigQueryImpl(AppDeployConfigRepository appDeployConfigRepository) {
-        this.appDeployConfigRepository = appDeployConfigRepository;
+    public AppDeployConfigQueryImpl(AppDeployConfigRepository deployConfigRepository) {
+        this.deployConfigRepository = deployConfigRepository;
+    }
+
+    @Override
+    public AppDeployConfig findById(int id) {
+        return deployConfigRepository.findById(id).orElse(null);
     }
 
     @Override
     public List<AppDeployConfig> findByAppId(String appId) {
-        return Collections.emptyList();
+        Specification<AppDeployConfig> specification = (root, query, cb) -> {
+            Join<AppDeployConfig, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
+            Predicate predicate = cb.equal(innerJoin.get("appId"), appId);
+            return cb.and(predicate);
+        };
+
+        return deployConfigRepository.findAll(specification);
     }
 
     @Override
     public Page<AppDeployConfig> findByAppId(String appId, Pageable pageable) {
-        List<AppDeployConfig> list = Collections.emptyList();
-        return new PageImpl<>(list);
+        Specification<AppDeployConfig> specification = (root, query, cb) -> {
+            Join<AppDeployConfig, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
+            Predicate predicate = cb.equal(innerJoin.get("appId"), appId);
+            return cb.and(predicate);
+        };
+
+        return deployConfigRepository.findAll(specification, pageable);
     }
 
     @Override
     public AppDeployConfig findByAppIdAndMachineId(String appId, String machineId) {
-        return null;
+        Specification<AppDeployConfig> specification = (root, query, cb) -> {
+            Join<AppDeployConfig, AppConfig> innerJoin = root.join("appConfig", JoinType.INNER);
+            Predicate predicate = cb.equal(innerJoin.get("appId"), appId);
+
+            Join<AppDeployConfig, MachineHost> innerJoin1 = root.join("machineHost", JoinType.INNER);
+            Predicate predicate1 = cb.equal(innerJoin1.get("machineId"), machineId);
+
+            Predicate[] arr = new Predicate[2];
+            arr[0] = predicate;
+            arr[1] = predicate1;
+            return cb.and(arr);
+        };
+
+        List<AppDeployConfig> list = deployConfigRepository.findAll(specification);
+        if (!list.isEmpty()) {
+            // 若 list 不为空,则应该有且仅有一个元素
+            return list.get(0);
+        } else {
+            return null;
+        }
     }
 }

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/repository/AppBuildingRepository.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.db.repository;
 
 import cn.reghao.autodop.dmaster.app.model.po.AppBuilding;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
@@ -10,4 +11,5 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  */
 public interface AppBuildingRepository
         extends JpaRepository<AppBuilding, Integer>, JpaSpecificationExecutor<AppBuilding> {
+    AppBuilding findByAppConfig(AppConfig appConfig);
 }

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/repository/AppDeployingRepository.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.app.db.repository;
 
 import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
@@ -12,4 +13,5 @@ import java.util.List;
  */
 public interface AppDeployingRepository
         extends JpaRepository<AppDeploying, Integer>, JpaSpecificationExecutor<AppDeploying> {
+    AppDeploying findByAppDeployConfig(AppDeployConfig appDeployConfig);
 }

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/repository/AppRunningRepository.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.db.repository;
 
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
 import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -13,4 +14,5 @@ import java.util.List;
  * @date 2021-05-24 15:20:24
  */
 public interface AppRunningRepository extends JpaRepository<AppRunning, Integer>, JpaSpecificationExecutor<AppRunning> {
+    AppRunning findByAppDeploying(AppDeploying appDeploying);
 }

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/AppDeployConfigDto.java

@@ -33,6 +33,7 @@ public class AppDeployConfigDto implements Serializable {
     private String startHome;
 
     public AppDeployConfigDto(AppDeployConfig appDeployConfig) {
+        this.appDeployConfigId = appDeployConfig.getId();
         this.appId = appDeployConfig.getAppConfig().getAppId();
         this.machineId = appDeployConfig.getMachineHost().getMachineId();
         this.packType = appDeployConfig.getAppConfig().getPackerConfig().getType();

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/AppBuilding.java

@@ -33,8 +33,8 @@ public class AppBuilding extends BaseEntity<Integer> {
     private String packagePath;
     private String buildBy;
 
-    public AppBuilding(AppConfig app) {
-        this.appConfig = app;
+    public AppBuilding(AppConfig appConfig) {
+        this.appConfig = appConfig;
     }
 
     public void update(BuildLog buildLog) {

+ 7 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/AppRunning.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.model.po;
 
+import cn.reghao.autodop.common.msg.pub.dto.node.constant.NodeStatus;
 import cn.reghao.autodop.common.msg.rpc.dto.app.StatusResult;
 import cn.reghao.autodop.dmaster.util.db.BaseEntity;
 import lombok.*;
@@ -21,14 +22,17 @@ import java.time.LocalDateTime;
 public class AppRunning extends BaseEntity<Integer> {
     @OneToOne
     private AppDeploying appDeploying;
-    private Boolean isRunning;
+    private String status;
     private LocalDateTime startTime;
     private Integer pid;
     private LocalDateTime lastCheck;
 
-    public AppRunning update(AppDeploying appDeploying, StatusResult appStatus) {
+    public AppRunning(AppDeploying appDeploying) {
         this.appDeploying = appDeploying;
-        this.setIsRunning(appStatus.getIsRunning());
+    }
+
+    public AppRunning update(StatusResult appStatus) {
+        this.setStatus(NodeStatus.Online.name());
         this.setStartTime(appStatus.getStartTime());
         this.setPid(appStatus.getPid());
         this.setLastCheck(LocalDateTime.now());

+ 5 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppDeployConfigVo.java

@@ -10,11 +10,12 @@ import lombok.NoArgsConstructor;
  * @author reghao
  * @date 2020-05-13 16:59:20
  */
-@NoArgsConstructor
 @Data
 public class AppDeployConfigVo {
     private Integer appDeployConfigId;
     private String appId;
+    private String appName;
+    private String machineId;
     private String machineIpv4;
     private String packType;
     private String startScript;
@@ -22,7 +23,10 @@ public class AppDeployConfigVo {
     private String startHome;
 
     public AppDeployConfigVo(AppDeployConfig appDeployConfig) {
+        this.appDeployConfigId = appDeployConfig.getId();
         this.appId = appDeployConfig.getAppConfig().getAppId();
+        this.appName = appDeployConfig.getAppConfig().getAppName();
+        this.machineId = appDeployConfig.getMachineHost().getMachineId();
         this.machineIpv4 = appDeployConfig.getMachineHost().getMachineIpv4();
         this.packType = appDeployConfig.getAppConfig().getPackerConfig().getType();
         this.startScript = appDeployConfig.getStartScript();

+ 42 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppRunningVo.java

@@ -0,0 +1,42 @@
+package cn.reghao.autodop.dmaster.app.model.vo;
+
+import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
+import cn.reghao.jdkutil.converter.DateTimeConverter;
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2021-05-31 13:36:46
+ */
+@Data
+public class AppRunningVo {
+    private String appId;
+    private String appName;
+    private String machineId;
+    private String machineIpv4;
+    private int httpPort;
+    private String healthCheck;
+    private String packagePath;
+    private String status;
+    private String startTime;
+    private int pid;
+    private String lastCheck;
+
+    public AppRunningVo(AppRunning appRunning) {
+        AppConfig appConfig = appRunning.getAppDeploying().getAppDeployConfig().getAppConfig();
+        MachineHost machineHost = appRunning.getAppDeploying().getAppDeployConfig().getMachineHost();
+        this.appId = appConfig.getAppId();
+        this.appName = appConfig.getAppName();
+        this.machineId = machineHost.getMachineId();
+        this.machineIpv4 = machineHost.getMachineIpv4();
+        this.httpPort = appConfig.getHttpPort();
+        this.healthCheck = appConfig.getHealthCheck();
+        this.packagePath = "N/A";
+        this.status = appRunning.getStatus();
+        this.startTime = appRunning.getStartTime() != null ? DateTimeConverter.format(appRunning.getStartTime()) : "N/A";
+        this.pid = appRunning.getPid() != null ? appRunning.getPid() : -1;
+        this.lastCheck = appRunning.getLastCheck() != null ? DateTimeConverter.format(appRunning.getLastCheck()) : "N/A";
+    }
+}

+ 0 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildDeployConfigService.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
-
-/**
- * @author reghao
- * @date 2021-09-17 11:30:16
- */
-public interface BuildDeployConfigService {
-    void refreshAppBuilding(AppConfig appConfig);
-    void refreshAppDeploying(AppConfig appConfig);
-    void refreshAppRunning(AppConfig appConfig);
-    void delete(String appId);
-}

+ 14 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppBuildingService.java

@@ -0,0 +1,14 @@
+package cn.reghao.autodop.dmaster.app.service.config;
+
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 14:48:26
+ */
+public interface AppBuildingService {
+    void add(AppConfig appConfig);
+    void refresh(String appId, BuildLog buildLog);
+    void delete(AppConfig appConfig);
+}

+ 15 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppDeployingService.java

@@ -0,0 +1,15 @@
+package cn.reghao.autodop.dmaster.app.service.config;
+
+import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 14:45:22
+ */
+public interface AppDeployingService {
+    void add(AppDeployConfig appDeployConfig);
+    void refresh(String appId, String machineId, BuildLog buildLog, DeployResult deployResult);
+    void delete(AppDeployConfig appDeployConfig);
+}

+ 14 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppRunningService.java

@@ -0,0 +1,14 @@
+package cn.reghao.autodop.dmaster.app.service.config;
+
+import cn.reghao.autodop.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 14:48:39
+ */
+public interface AppRunningService {
+    void add(AppDeploying appDeploying);
+    void refresh(String appId, String machineId, StatusResult appStatus);
+    void delete(AppDeploying appDeploying);
+}

+ 47 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppBuildingServiceImpl.java

@@ -0,0 +1,47 @@
+package cn.reghao.autodop.dmaster.app.service.config.impl;
+
+import cn.reghao.autodop.dmaster.app.db.crud.AppBuildingCrud;
+import cn.reghao.autodop.dmaster.app.db.query.AppBuildingQuery;
+import cn.reghao.autodop.dmaster.app.model.po.AppBuilding;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.service.config.AppBuildingService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 14:48:26
+ */
+@Service
+public class AppBuildingServiceImpl implements AppBuildingService {
+    private final AppBuildingQuery buildingQuery;
+    private final AppBuildingCrud buildingCrud;
+
+    public AppBuildingServiceImpl(AppBuildingQuery buildingQuery, AppBuildingCrud buildingCrud) {
+        this.buildingQuery = buildingQuery;
+        this.buildingCrud = buildingCrud;
+    }
+
+    @Override
+    public void add(AppConfig appConfig) {
+        AppBuilding appBuilding = new AppBuilding(appConfig);
+        buildingCrud.save(appBuilding);
+    }
+
+    @Override
+    public void refresh(String appId, BuildLog buildLog) {
+        AppBuilding appBuilding = buildingQuery.findByAppId(appId);
+        if (appBuilding != null) {
+            appBuilding.update(buildLog);
+            buildingCrud.update(appBuilding);
+        }
+    }
+
+    @Override
+    public void delete(AppConfig appConfig) {
+        AppBuilding appBuilding = buildingQuery.findByAppConfig(appConfig);
+        if (appBuilding != null) {
+            buildingCrud.delete(appBuilding);
+        }
+    }
+}

+ 40 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppDeployConfigServiceImpl.java

@@ -1,5 +1,7 @@
 package cn.reghao.autodop.dmaster.app.service.config.impl;
 
+import cn.reghao.autodop.common.docker.po.Config;
+import cn.reghao.autodop.common.msg.rpc.dto.app.PackType;
 import cn.reghao.autodop.dmaster.app.db.crud.config.AppDeployConfigCrud;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
@@ -7,10 +9,12 @@ import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
 import cn.reghao.autodop.dmaster.app.service.config.AppDeployConfigService;
+import cn.reghao.autodop.dmaster.app.service.config.AppDeployingService;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
+import cn.reghao.jdkutil.serializer.JsonConverter;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -22,15 +26,18 @@ import org.springframework.transaction.annotation.Transactional;
 public class AppDeployConfigServiceImpl implements AppDeployConfigService {
     private final AppDeployConfigQuery deployConfigQuery;
     private final AppDeployConfigCrud deployConfigCrud;
-    private AppConfigQuery appConfigQuery;
-    private MachineHostQuery machineHostQuery;
+    private final AppConfigQuery appConfigQuery;
+    private final MachineHostQuery machineHostQuery;
+    private final AppDeployingService deployingService;
 
     public AppDeployConfigServiceImpl(AppDeployConfigQuery deployConfigQuery, AppDeployConfigCrud deployConfigCrud,
-                                      AppConfigQuery appConfigQuery, MachineHostQuery machineHostQuery) {
+                                      AppConfigQuery appConfigQuery, MachineHostQuery machineHostQuery,
+                                      AppDeployingService deployingService) {
         this.deployConfigQuery = deployConfigQuery;
         this.deployConfigCrud = deployConfigCrud;
         this.appConfigQuery = appConfigQuery;
         this.machineHostQuery = machineHostQuery;
+        this.deployingService = deployingService;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -39,32 +46,55 @@ public class AppDeployConfigServiceImpl implements AppDeployConfigService {
         String appId = appDeployConfigDto.getAppId();
         AppConfig appConfig = appConfigQuery.findByAppId(appId);
         if (appConfig == null) {
-
+            String msg = String.format("%s 不存在", appId);
+            return Result.result(ResultStatus.ERROR, msg);
         }
 
         String machineId = appDeployConfigDto.getMachineId();
         MachineHost machineHost = machineHostQuery.findByMachineId(machineId);
         if (machineHost == null) {
-
+            String msg = String.format("%s 不存在", machineId);
+            return Result.result(ResultStatus.ERROR, msg);
         }
 
+        // TODO 处理与 AppDeployConfig 关联的数据
+        // TODO 检测脚本是否合法
         String packType = appDeployConfigDto.getPackType();
         String startScript = appDeployConfigDto.getStartScript();
+        if (packType.equals(PackType.docker.name())) {
+            Config dockerConfig = JsonConverter.jsonToObject(startScript, Config.class);
+        }
 
-        //deployConfigCrud.save(appDeployConfig);
-        return Result.result(ResultStatus.SUCCESS, "msg");
+        AppDeployConfig appDeployConfig = new AppDeployConfig(appConfig, machineHost, packType, startScript);
+        appDeployConfig = deployConfigCrud.save(appDeployConfig);
+
+        deployingService.add(appDeployConfig);
+        return Result.result(ResultStatus.SUCCESS);
     }
 
     @Override
     public Result modify(AppDeployConfigDto appDeployConfigDto) {
-        //deployConfigCrud.update(appDeployConfig);
-        return Result.result(ResultStatus.SUCCESS, "msg");
+        int appDeployConfigId = appDeployConfigDto.getAppDeployConfigId();
+        AppDeployConfig appDeployConfig = deployConfigQuery.findById(appDeployConfigId);
+        if (appDeployConfig == null) {
+            String msg = String.format("%s 不存在", appDeployConfigId);
+            return Result.result(ResultStatus.ERROR, msg);
+        }
+
+        appDeployConfig.setStartScript(appDeployConfigDto.getStartScript());
+        deployConfigCrud.update(appDeployConfig);
+        return Result.result(ResultStatus.SUCCESS, "更新 startScript 成功");
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Result delete(int appDeployConfigId) {
+        // TODO 处理与 AppDeployConfig 关联的数据
         AppDeployConfig appDeployConfig = deployConfigQuery.findById(appDeployConfigId);
-        return Result.result(ResultStatus.SUCCESS);
+        if (appDeployConfig != null) {
+            deployingService.delete(appDeployConfig);
+            deployConfigCrud.delete(appDeployConfig);
+        }
+        return Result.result(ResultStatus.SUCCESS, "没有删除和 AppDeployConfig 关联的数据");
     }
 }

+ 54 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppDeployingServiceImpl.java

@@ -0,0 +1,54 @@
+package cn.reghao.autodop.dmaster.app.service.config.impl;
+
+import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
+import cn.reghao.autodop.dmaster.app.db.crud.AppDeployingCrud;
+import cn.reghao.autodop.dmaster.app.db.query.AppDeployingQuery;
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.po.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.service.config.AppDeployingService;
+import cn.reghao.autodop.dmaster.app.service.config.AppRunningService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 14:45:22
+ */
+@Service
+public class AppDeployingServiceImpl implements AppDeployingService {
+    private final AppDeployingQuery deployingQuery;
+    private final AppDeployingCrud deployingCrud;
+    private final AppRunningService runningService;
+
+    public AppDeployingServiceImpl(AppDeployingQuery deployingQuery, AppDeployingCrud deployingCrud,
+                                   AppRunningService runningService) {
+        this.deployingQuery = deployingQuery;
+        this.deployingCrud = deployingCrud;
+        this.runningService = runningService;
+    }
+
+    @Override
+    public void add(AppDeployConfig appDeployConfig) {
+        AppDeploying appDeploying = new AppDeploying(appDeployConfig);
+        deployingCrud.save(appDeploying);
+        runningService.add(appDeploying);
+    }
+
+    @Override
+    public void refresh(String appId, String machineId, BuildLog buildLog, DeployResult deployResult) {
+        AppDeploying appDeploying = deployingQuery.findByAppIdAndMachineId(appId, machineId);
+        if (appDeploying != null) {
+            appDeploying.update(buildLog, deployResult);
+            deployingCrud.update(appDeploying);
+        }
+    }
+
+    @Override
+    public void delete(AppDeployConfig appDeployConfig) {
+        AppDeploying appDeploying = deployingQuery.findByAppDeployConfig(appDeployConfig);
+        if (appDeploying != null) {
+            deployingCrud.delete(appDeploying);
+            runningService.delete(appDeploying);
+        }
+    }
+}

+ 47 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppRunningServiceImpl.java

@@ -0,0 +1,47 @@
+package cn.reghao.autodop.dmaster.app.service.config.impl;
+
+import cn.reghao.autodop.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.autodop.dmaster.app.db.crud.AppRunningCrud;
+import cn.reghao.autodop.dmaster.app.db.query.AppRunningQuery;
+import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
+import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
+import cn.reghao.autodop.dmaster.app.service.config.AppRunningService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 14:48:39
+ */
+@Service
+public class AppRunningServiceImpl implements AppRunningService {
+    private final AppRunningQuery runningQuery;
+    private final AppRunningCrud runningCrud;
+
+    public AppRunningServiceImpl(AppRunningQuery runningQuery, AppRunningCrud runningCrud) {
+        this.runningQuery = runningQuery;
+        this.runningCrud = runningCrud;
+    }
+
+    @Override
+    public void add(AppDeploying appDeploying) {
+        AppRunning appRunning = new AppRunning(appDeploying);
+        runningCrud.save(appRunning);
+    }
+
+    @Override
+    public void refresh(String appId, String machineId, StatusResult appStatus) {
+        AppRunning appRunning = runningQuery.findByAppIdAndMachineId(appId, machineId);
+        if (appRunning != null) {
+            appRunning.update(appStatus);
+            runningCrud.update(appRunning);
+        }
+    }
+
+    @Override
+    public void delete(AppDeploying appDeploying) {
+        AppRunning appRunning = runningQuery.findByAppDeploying(appDeploying);
+        if (appRunning != null) {
+            runningCrud.delete(appRunning);
+        }
+    }
+}

+ 2 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImpl.java

@@ -5,24 +5,18 @@ import cn.reghao.autodop.dmaster.app.db.query.AppBuildingQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.po.AppBuilding;
-import cn.reghao.autodop.dmaster.app.model.po.AppDeploying;
-import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
-import cn.reghao.autodop.dmaster.app.db.repository.AppBuildingRepository;
 import cn.reghao.autodop.dmaster.app.db.repository.AppDeployingRepository;
 import cn.reghao.autodop.dmaster.app.db.repository.AppRunningRepository;
-import cn.reghao.autodop.dmaster.app.service.BuildDeployConfigService;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 /**
  * @author reghao
  * @date 2021-06-04 10:01:41
  */
+@Deprecated
 @Service
-public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
+public class BuildDeployConfigServiceImpl {
     private AppConfigQuery appConfigQuery;
     private AppBuildingQuery appBuildingQuery;
     private AppBuildingCrud appBuildingCrud;
@@ -48,7 +42,6 @@ public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
      * @return
      * @date 2021-06-18 下午5:24
      */
-    @Override
     public void refreshAppBuilding(AppConfig app) {
         AppBuilding appBuilding = appBuildingQuery.findByAppId(app.getAppId());
         if (appBuilding == null) {
@@ -66,7 +59,6 @@ public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
      * @return
      * @date 2021-06-18 下午5:25
      */
-    @Override
     public void refreshAppDeploying(AppConfig app) {
     }
 
@@ -77,11 +69,9 @@ public class BuildDeployConfigServiceImpl implements BuildDeployConfigService {
      * @return
      * @date 2021-06-18 下午5:29
      */
-    @Override
     public void refreshAppRunning(AppConfig app) {
     }
 
-    @Override
     public void delete(String appId) {
         AppBuilding appBuilding = appBuildingQuery.findByAppId(appId);
         if (appBuilding != null) {

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPage.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.app.service.page;
 
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.AppDeployConfigVo;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -13,7 +14,7 @@ import java.util.List;
  * @date 2021-10-22 09:15:56
  */
 public interface AppDeployConfigPage {
-    Page<AppDeployConfig> indexPage(String appId, PageRequest pageRequest);
+    Page<AppDeployConfigVo> indexPage(String appId, PageRequest pageRequest);
     AppDeployConfig findByAppIdAndMachineId(String appId, String machineId);
     AppConfig appConfig(String appId);
     List<KeyValue> machines(String env);

+ 5 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPageImpl.java

@@ -4,6 +4,7 @@ import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.AppDeployConfigVo;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
 import org.springframework.data.domain.Page;
@@ -20,8 +21,8 @@ import java.util.stream.Collectors;
 @Service
 public class AppDeployConfigPageImpl implements AppDeployConfigPage {
     private final AppDeployConfigQuery deployConfigQuery;
-    private AppConfigQuery appConfigQuery;
-    private MachineHostQuery hostQuery;
+    private final AppConfigQuery appConfigQuery;
+    private final MachineHostQuery hostQuery;
 
     public AppDeployConfigPageImpl(AppDeployConfigQuery deployConfigQuery, AppConfigQuery appConfigQuery,
                                    MachineHostQuery hostQuery) {
@@ -31,8 +32,8 @@ public class AppDeployConfigPageImpl implements AppDeployConfigPage {
     }
 
     @Override
-    public Page<AppDeployConfig> indexPage(String appId, PageRequest pageRequest) {
-        return deployConfigQuery.findByAppId(appId, pageRequest);
+    public Page<AppDeployConfigVo> indexPage(String appId, PageRequest pageRequest) {
+        return deployConfigQuery.findByAppId(appId, pageRequest).map(AppDeployConfigVo::new);
     }
 
     @Override

+ 5 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/BuildDeployPageImpl.java

@@ -18,6 +18,7 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -75,18 +76,9 @@ public class BuildDeployPageImpl implements BuildDeployPage {
 
     @Override
     public List<AppDeployingVO> deployStatus(String appId) {
-        AppConfig app = appConfigQuery.findByIsDeleteFalseAndAppId(appId);
-        List<AppDeployConfig> deployConfigs = deployConfigQuery.findByAppId(appId);
-
-        List<AppDeployingVO> list = new ArrayList<>();
-        for (AppDeployConfig deployConfig : deployConfigs) {
-            Map<String, String> queryMap = new HashMap<>();
-            queryMap.put("appId", appId);
-            queryMap.put("machineId", deployConfig.getMachineHost().getMachineId());
-            AppDeploying deploying = deployingQuery.query(queryMap);
-            list.add(new AppDeployingVO(deploying));
-        }
-
-        return list;
+        return deployConfigQuery.findByAppId(appId).stream()
+                .map(deployingQuery::findByAppDeployConfig)
+                .map(AppDeployingVO::new)
+                .collect(Collectors.toList());
     }
 }

+ 5 - 5
dmaster/src/main/resources/templates/app/config/app/deploy/add.html

@@ -5,7 +5,7 @@
 <body>
 <div class="layui-form timo-compile">
     <form th:action="@{/api/app/config/app/deploy}">
-        <input type="hidden" name="id" th:if="${appDeloyConfig}" th:value="${appDeloyConfig?.id}"/>
+        <input type="hidden" name="appDeployConfigId" th:value="${appDeployConfig?.appDeployConfigId}"/>
         <table class="layui-table timo-detail-table">
             <tbody>
             <tr>
@@ -24,7 +24,7 @@
                         <div class="layui-form-item">
                         <div class="layui-input-inline">
                             <select name="machineId">
-                                <option th:each="item : ${machines}" th:value="${item.key}" th:selected="${appDeloyConfig.machineHost.machineId} eq ${item.key}">[[${item.value}]]</option>
+                                <option th:each="item : ${machines}" th:value="${item.key}" th:selected="${appDeployConfig?.machineId} eq ${item.key}">[[${item.value}]]</option>
                             </select>
                         </div>
                     </div>
@@ -53,7 +53,7 @@
                     <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
-                            <input class="layui-input" type="text" name="startHome" placeholder="可执行文件位置(可选)" required th:value="${appDeloyConfig?.startHome}">
+                            <input class="layui-input" type="text" name="startHome" placeholder="可执行文件位置(可选)" required th:value="${appDeployConfig?.startHome}">
                         </div>
                     </div>
                     </td>
@@ -64,7 +64,7 @@
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
-                            <textarea class="layui-textarea" name="startScript" placeholder="启动脚本" th:text="${appDeloyConfig?.startScript}"></textarea>
+                            <textarea class="layui-textarea" name="startScript" placeholder="启动脚本" th:text="${appDeployConfig?.startScript}"></textarea>
                         </div>
                     </div>
                 </td>
@@ -75,7 +75,7 @@
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
-                            <textarea class="layui-textarea" name="unpackScript" placeholder="解包脚本(可选)" th:text="${appDeloyConfig?.unpackScript}"></textarea>
+                            <textarea class="layui-textarea" name="unpackScript" placeholder="解包脚本(可选)" th:text="${appDeployConfig?.unpackScript}"></textarea>
                         </div>
                     </div>
                 </td>

+ 26 - 4
dmaster/src/main/resources/templates/app/config/app/deploy/detail.html

@@ -7,11 +7,33 @@
             <tbody>
             <tr>
                 <th>应用 ID</th>
-                <td th:text="${app.appId}"></td>
+                <td th:text="${appDeployConfig.appId}"></td>
                 <th>应用名称</th>
-                <td th:text="${app.appName}"></td>
-                <th>应用描述</th>
-                <td th:text="${app.description}"></td>
+                <td th:text="${appDeployConfig.appName}"></td>
+            </tr>
+            <tr>
+                <th>机器 ID</th>
+                <td th:text="${appDeployConfig.machineId}"></td>
+                <th>机器地址</th>
+                <td th:text="${appDeployConfig.machineIpv4}"></td>
+            </tr>
+            <tr>
+                <th>打包类型</th>
+                <td th:text="${appDeployConfig.packType}"></td>
+                <th>启动目录</th>
+                <td th:text="${appDeployConfig.startHome}"></td>
+            </tr>
+            <tr>
+                <th>启动脚本</th>
+                <td>
+                    <textarea class="layui-textarea" readonly="readonly" th:text="${appDeployConfig.startScript}"></textarea>
+                </td>
+            </tr>
+            <tr>
+                <th>解包脚本</th>
+                <td>
+                    <textarea class="layui-textarea" readonly="readonly" th:text="${appDeployConfig.unpackScript}"></textarea>
+                </td>
             </tr>
             </tbody>
         </table>

+ 7 - 7
dmaster/src/main/resources/templates/app/config/app/deploy/index.html

@@ -19,25 +19,25 @@
             <table class="layui-table timo-table">
                 <thead>
                 <tr>
+                    <th class="sortable" data-field="appName">应用</th>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
                     <th class="sortable" data-field="packType">打包类型</th>
                     <th class="sortable" data-field="startScript">启动脚本</th>
-                    <th class="sortable" data-field="unpackScript">解包脚本</th>
-                    <th class="sortable" data-field="startHome">启动目录</th>
                     <th>操作</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td th:text="${item.machineHost.machineIpv4}">机器地址</td>
+                    <td th:text="${item.appName}">应用</td>
+                    <td th:text="${item.machineIpv4}">机器地址</td>
                     <td th:text="${item.packType}">打包类型</td>
                     <td th:text="${item.startScript}">启动脚本</td>
-                    <td th:text="${item.unpackScript}">解包脚本</td>
-                    <td th:text="${item.startHome}">启动目录</td>
                     <td>
-                        <a class="open-popup" data-title="修改部署配置" th:attr="data-url=@{'/app/config/app/deploy/'+${appId}}"
+                        <a class="open-popup" data-title="部署配置详情" th:attr="data-url=@{'/app/config/app/deploy/detail/'+${appId}+'/'+${item.machineId}}"
+                           data-size="1000,500" href="#">详情</a>
+                        <a class="open-popup" data-title="修改部署配置" th:attr="data-url=@{'/app/config/app/deploy/edit/'+${appId}+'/'+${item.machineId}}"
                            data-size="1000,500" href="#">编辑</a>
-                        <a class="ajax-post" th:href="@{'/api/app/config/app/deploy?appId='+${appId}}">删除</a>
+                        <a class="ajax-delete" th:href="@{'/api/app/config/app/deploy/'+${item.appDeployConfigId}}">删除</a>
                     </td>
                 </tr>
                 </tbody>

+ 5 - 5
dmaster/src/main/resources/templates/app/stat/index.html

@@ -52,7 +52,7 @@
                     <th class="sortable" data-field="httpPort">HTTP 端口</th>
                     <th class="sortable" data-field="healthCheck">健康检查地址</th>
                     <th class="sortable" data-field="packagePath">包路径</th>
-                    <th class="sortable" data-field="isRunning">运行状态</th>
+                    <th class="sortable" data-field="status">运行状态</th>
                     <th class="sortable" data-field="startTime">启动时间</th>
                     <th class="sortable" data-field="pid">PID</th>
                     <th class="sortable" data-field="lastCheck">上次健康检查</th>
@@ -71,17 +71,17 @@
                     <td th:text="${item.httpPort}">HTTP 端口</td>
                     <td th:text="${item.healthCheck}">健康检查地址</td>
                     <td th:text="${item.packagePath}">包路径</td>
-                    <td th:text="${item.isRunning}">运行状态</td>
+                    <td th:text="${item.status}">运行状态</td>
                     <td th:text="${item.startTime}">启动时间</td>
                     <td th:text="${item.pid}">PID</td>
                     <td th:text="${item.lastCheck}">上次健康检查</td>
                     <td>
-                        <a class="open-popup" data-title="应用日志"
-                           th:attr="data-url=@{'/app/status/applog/'+${item.appId}+'/'+${item.machineId}}"
-                           data-size="1000,500" href="#">日志</a>
                         <a class="ajax-post" th:href="@{'/api/app/status/restart/'+${item.appId}+'/'+${item.machineId}}">重启</a>
                         <a class="ajax-post" th:href="@{'/api/app/status/stop/'+${item.appId}+'/'+${item.machineId}}">停止</a>
                         <a class="ajax-post" th:href="@{'/api/app/status/start/'+${item.appId}+'/'+${item.machineId}}">启动</a>
+                        <a class="open-popup" data-title="应用日志"
+                           th:attr="data-url=@{'/app/status/applog/'+${item.appId}+'/'+${item.machineId}}"
+                           data-size="1000,500" href="#">日志</a>
                     </td>
                 </tr>
                 </tbody>

+ 8 - 6
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImplTest.java

@@ -1,11 +1,10 @@
 package cn.reghao.autodop.dmaster.app.service.impl;
 
 import cn.reghao.autodop.dmaster.DmasterApplication;
-import cn.reghao.autodop.dmaster.app.db.crud.AppBuildingCrud;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
-import cn.reghao.autodop.dmaster.app.model.po.AppBuilding;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.service.config.AppBuildingService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,15 +22,18 @@ public class BuildDeployConfigServiceImplTest {
     @Autowired
     private AppConfigQuery appConfigQuery;
     @Autowired
-    private AppBuildingCrud appBuildingCrud;
+    private AppBuildingService buildingService;
 
     @Test
     public void generateAppBuilding() {
-        List<AppBuilding> list = appConfigQuery.findAll().stream()
+        List<AppConfig> list = appConfigQuery.findAll().stream()
                 .filter(appConfig -> appConfig.getEnv().equals(EnvList.prod.getName()))
-                .map(AppBuilding::new)
                 .collect(Collectors.toList());
-        appBuildingCrud.saveAll(list);
+
+        list.forEach(appBuilding -> {
+            buildingService.add(appBuilding);
+        });
+
         System.out.println();
     }
 }