Kaynağa Gözat

部署中心主机管理、升级包管理、升级状态查询页面提交

xujie 1 yıl önce
ebeveyn
işleme
6488d56784

+ 75 - 0
src/api/deploy/hostInfo.js

@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+import {exportFile} from '@/utils/request'
+
+//主机管理列表
+export function hostInfoList(data) {
+  return request({
+    url: '/api/deploy/hostInfo/list',
+    method: 'get',
+    params: data
+  })
+}
+export function appRunServerList(hostId) {
+  return request({
+    url: '/api/deploy/hostInfo/detail/'+hostId,
+    method: 'get',
+  })
+}
+
+export function agentVersionSelect() {
+  return request({
+    url: '/api/deploy/agentUpgrade/selectAllVersions',
+    method: 'get'
+  })
+}
+
+export function zipVersionSelect() {
+  return request({
+    url: '/api/deploy/hostInfo/selectCurrentVersions',
+    method: 'get'
+  })
+}
+
+export function targetVersionSelect() {
+  return request({
+    url: '/api/deploy/hostInfo/selectTargetVersions',
+    method: 'get'
+  })
+}
+export function upgradeVersionSelect() {
+  return request({
+    url: '/api/deploy/hostInfo/selectPackages',
+    method: 'get'
+  })
+}
+
+export function restartHostServer(hostId) {
+  return request({
+    url: '/api/deploy/hostInfo/restartApps/'+hostId,
+    method: 'get',
+  })
+}
+//删除主机
+export function deleteHost(hostId) {
+  return request({
+    url: '/api/deploy/hostInfo/delete/'+hostId,
+    method: 'delete'
+  })
+}
+
+//升级主机前校验
+export function validateUpgradeHost(data) {
+  return request({
+    url: '/api/deploy/hostInfo/batchUpgradeValidate',
+    method: 'post',
+    data: data
+  })
+}
+//批量升级主机
+export function upgradeHost(data) {
+  return request({
+    url: '/api/deploy/hostInfo/batchUpgrade',
+    method: 'post',
+    data: data
+  })
+}

+ 23 - 0
src/api/deploy/packageInfo.js

@@ -0,0 +1,23 @@
+import request from "@/utils/request";
+
+export function packageInfoList(data) {
+  return request({
+    url: '/api/deploy/appPackage/list',
+    method: 'get',
+    params: data
+  })
+}
+
+export function packageDetail(id) {
+  return request({
+    url: '/api/deploy/appPackage/detail/'+id,
+    method: 'get',
+  })
+}
+
+export function deletePackage(id) {
+  return request({
+    url: '/api/deploy/appPackage/delete/'+id,
+    method: 'delete',
+  })
+}

+ 27 - 0
src/api/deploy/upgradeStatus.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+import {exportFile} from '@/utils/request'
+
+//主机管理列表
+export function appUpgradeList(data) {
+  return request({
+    url: '/api/deploy/appUpgrade/list',
+    method: 'get',
+    params: data
+  })
+}
+
+export function upgradeHostList(data) {
+  return request({
+    url: '/api/deploy/appUpgrade/detail',
+    method: 'get',
+    params: data
+  })
+}
+
+export function upgradeAppList(data) {
+  return request({
+    url: '/api/deploy/appUpgrade/appsDetail',
+    method: 'get',
+    params: data
+  })
+}

+ 14 - 0
src/router/index.js

@@ -282,6 +282,20 @@ export const dynamicRoutes = [
       },
     ],
   },
+  {
+    path: "/deploy/upgrade",
+    component: Layout,
+    hidden: true,
+    //permissions: ["resumption:rule:contentmanage"],
+    children: [
+      {
+        path: "content/:id",
+        component: () => import("@/views/deploy/upgradeStatus/hostUpgrade.vue"),
+        name: "upgradeHostManager",
+        meta: { title: "主机升级详情", activeMenu: "/deploy/upgradeStatus" },
+      },
+    ],
+  },
 ];
 
 // 防止连续点击多次路由报错

+ 512 - 0
src/views/deploy/hostInfo/index.vue

@@ -0,0 +1,512 @@
+<template>
+  <div class="app-container">
+    <div class="main-right-box">
+      <!--    搜索条件    -->
+      <div class="main-search-box">
+        <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" size="small">
+          <el-form-item label="检查机构">
+            <org-tree
+              v-model="queryParams.hostOrg"
+              @defaultOrg="getDefaultOrg"
+              @checkChange="checkChange"
+              @click="clickTreeNode"
+              ref="orgTree"
+            ></org-tree>
+          </el-form-item>
+
+          <el-form-item label="主机IP" prop="hostIp">
+            <el-input v-model="queryParams.hostIp" :maxlength="50" clearable placeholder="请输入主机Ip"
+                      @keyup.enter.native="handleQuery"/>
+          </el-form-item>
+
+          <el-form-item label="主机名称" prop="hostName">
+            <el-input v-model="queryParams.hostName" :maxlength="50" clearable placeholder="请输入主机名称"
+                      @keyup.enter.native="handleQuery"/>
+          </el-form-item>
+
+          <el-form-item label="服务状态" prop="serverStatus">
+            <el-select style="width: 100%;" clearable v-model="queryParams.serverStatus" placeholder="请选择服务状态"
+            >
+              <el-option v-for="dict in dict.type.deploy_service_status" :key="dict.value" :label="dict.label"
+                         :value="dict.value"/>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="升级状态" prop="updateStatus">
+            <el-select style="width: 100%;" clearable v-model="queryParams.updateStatus" placeholder="请选择升级状态"
+            >
+              <el-option v-for="dict in dict.type.deploy_upgrade_status" :key="dict.value" :label="dict.label"
+                         :value="dict.value"/>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="当前版本号" prop="zipVersion">
+            <el-select
+              style="width: 100%"
+              v-model="queryParams.zipVersion"
+              placeholder="请选择当前版本号"
+              @change="onZipVersionChange"
+              clearable
+            >
+              <el-option
+                v-for="item in zipVersions"
+                :key="item.id"
+                :label="item.text"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="目标版本号" prop="targetVersion">
+            <el-select
+              style="width: 100%"
+              v-model="queryParams.targetVersion"
+              placeholder="请选择目标版本号"
+              @change="onTargetVersionChange"
+              clearable
+            >
+              <el-option
+                v-for="item in targetVersions"
+                :key="item.id"
+                :label="item.text"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="白令海版本" prop="agentVersion">
+            <el-select
+              style="width: 100%"
+              v-model="queryParams.agentVersion"
+              placeholder="请选择白令海版本"
+              @change="onAgentVersionChange"
+              clearable
+            >
+              <el-option
+                v-for="item in agentVersions"
+                :key="item.id"
+                :label="item.text"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="白令海状态" prop="hostStatus">
+            <el-select style="width: 100%;" clearable v-model="queryParams.hostStatus" placeholder="请选择白令海状态"
+            >
+              <el-option v-for="dict in dict.type.deploy_bering_status" :key="dict.value" :label="dict.label"
+                         :value="dict.value"/>
+            </el-select>
+          </el-form-item>
+        </el-form>
+
+
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery"
+            >搜索
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button icon="el-icon-refresh" size="mini" type="primary" @click="resetQuery"
+            >重置
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button icon="el-icon-position" size="mini" type="primary" @click="handleUpgrade"
+            >批量升级
+            </el-button>
+          </el-col>
+
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </div>
+
+      <el-table
+        v-loading="loading"
+        :data="hostInfoList"
+        border
+        height="646" size="small" @selection-change="handleSelectionChange">
+        <el-table-column align="center" type="selection" width="55"></el-table-column>
+        <el-table-column align="center" label="序号" width="100">
+          <template v-slot:default="scope">
+            <span v-text="getPageIndex(scope.$index)"> </span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="所属机构" prop="orgName"/>
+        <el-table-column align="center" label="主机名称" prop="hostName"/>
+        <el-table-column align="center" label="主机IP" prop="hostIp"/>
+        <el-table-column align="center" label="当前版本号" prop="zipVersion"/>
+        <el-table-column align="center" label="目标版本号" prop="targetVersion"/>
+        <el-table-column align="center" label="升级状态" prop="updateStatus">
+          <template slot-scope="scope">
+            <dict-tag :options="dict.type.deploy_upgrade_status" :value="scope.row.updateStatus"/>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="服务状态" prop="serverStatus">
+          <template slot-scope="scope">
+            <dict-tag :options="dict.type.deploy_service_status" :value="scope.row.serverStatus"/>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="白令海状态" prop="hostStatus">
+          <template slot-scope="scope">
+            <dict-tag :options="dict.type.deploy_bering_status" :value="scope.row.hostStatus"/>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="白令海版本号" prop="agentVersion"/>
+
+        <el-table-column
+          class-name="small-padding fixed-width"
+
+          label="操作"
+          align="center"
+          width="180"
+        >
+          <template slot-scope="{ row }">
+            <el-button
+              class="el-icon-view"
+              size="mini"
+              type="text"
+              @click="hostDetail(row.id)"
+            >详情
+            </el-button
+            >
+            <el-button
+              class="el-icon-refresh"
+              size="mini"
+              type="text"
+              @click="restartServer(row.id)"
+            >重启服务
+            </el-button
+            >
+            <el-button
+              class="el-icon-delete"
+              size="mini"
+              type="text"
+              @click="remove(row)"
+            >删除
+            </el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
+                  @pagination="getList"/>
+
+    </div>
+    <DialogCom :title="'主机服务升级'" :visible.sync="chooseZipFlag" append-to-body width="780px">
+        <div class="form-group" style="text-align: center;margin-top: 20px">
+          若主机当前版本号大于等于选中的升级包版本号,则不进行主机服务升级;并且离线主机,不进行升级!
+        </div>
+
+        <el-form ref="form" :model="form" :rules="rules" label-width="100px" :style="{height:'500px',margin:'35px'}">
+
+          <el-form-item label="升级包" prop="upgradeZip">
+            <el-select
+              style="width: 100%"
+              v-model="form.upgradeZip"
+              placeholder="请选择升级包"
+              @change="onUpgradeVersionChange"
+              clearable
+            >
+              <el-option
+                v-for="item in upgradeVersions"
+                :key="item.id"
+                :label="item.text"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+    </DialogCom>
+
+    <host-server-page ref="HostServer" ></host-server-page>
+  </div>
+</template>
+
+<script>
+import {
+  hostInfoList,agentVersionSelect,zipVersionSelect,targetVersionSelect,restartHostServer,deleteHost,validateUpgradeHost,upgradeHost,upgradeVersionSelect
+} from "@/api/deploy/hostInfo";
+import KFileUpload from "@/components/K-FileUpload/index.vue";
+import KTextarea from "@/components/common/textarea.vue";
+import OrgTree from "@/components/orgTree/orgQuerySelector.vue";
+import hostServerPage from "./serverPage.vue"
+
+export default {
+  name: "HostInfo",
+  components: {hostServerPage, OrgTree, KFileUpload, KTextarea},
+  dicts: ['deploy_upgrade_status', 'deploy_service_status','deploy_bering_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      formFileListDefaultValue: [],
+      downloadUrl: "",
+      // 选中数组
+      ids: [],
+      // 非单个停用
+      single: true,
+      // 非多个停用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 表数据
+      hostInfoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 日期范围
+      dateRange: [],
+      packageNameList: [],
+      //升级包选择弹窗
+      chooseZipFlag: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        hostOrg: null,
+        zipVersion: null,
+        targetVersion: null,
+        hostIp: null,
+        hostName: null,
+        serverStatus: null,
+        updateStatus: null,
+        agentVersion: null,
+        hostStatus: null
+      },
+      //升级参数
+      upgradeParams: {
+        hostIds:[],
+        zipId:null
+      },
+      // 表单参数
+      form: {},
+      zipVersions:[],
+      targetVersions:[],
+      agentVersions:[],
+      upgradeVersions:[],
+      // 表单校验
+      rules: {
+        upgradeZip: [
+          {required: true, message: "请选择升级包", trigger: "blur"}
+        ],
+      },
+      hostSelections: [],
+    };
+  },
+  created() {
+    agentVersionSelect().then((d) => {
+      this.agentVersions = d.data;
+    });
+    zipVersionSelect().then((d) => {
+      this.zipVersions = d.data;
+    });
+    targetVersionSelect().then((d) => {
+      this.targetVersions = d.data;
+    });
+  },
+  methods: {
+    getDefaultOrg(node) {
+      this.queryParams.hostOrg = node.id;
+      this.getList();
+    },
+    //单选框状态改变
+    checkChange(state) {
+      this.queryParams.checkSub = state;
+      this.getList();
+    },
+    // 节点单击事件
+    clickTreeNode(data) {
+      if(data==null){
+        return;
+      }
+      this.queryParams.hostOrg = data.id;
+      this.getList();
+    },
+
+    onZipVersionChange(val){
+      let data = this.zipVersions.find((a) => a.id === val);
+      if (data) {
+        this.queryParams.zipVersion = data.text;
+      }
+    },
+    onTargetVersionChange(val){
+      let data = this.targetVersions.find((a) => a.id === val);
+      if (data) {
+        this.queryParams.targetVersion = data.text;
+      }
+    },
+    onAgentVersionChange(val){
+      let data = this.agentVersions.find((a) => a.id === val);
+      if (data) {
+        this.queryParams.agentVersion = data.text;
+      }
+    },
+    onUpgradeVersionChange(val){
+      this.$refs["form"].clearValidate(["upgradeZip"]);
+    },
+    handleSelectionChange(selection) {
+      this.hostSelections = selection;
+    },
+    getPageIndex($index) {
+      //表格序号
+      return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + $index + 1
+    },
+    /** 查询主机列表 */
+    getList() {
+      this.loading = true;
+      hostInfoList(this.queryParams).then(response => {
+          this.hostInfoList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+          this.upgradeParams.hostIds = [];
+          this.hostSelections = [];
+        }
+      ).catch((err) => {
+        this.loading = false;
+      });
+    },
+
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    hostDetail(hostId) {
+      this.$refs.HostServer.show(hostId);
+    },
+    restartServer(hostId) {
+      this.$modal
+        .confirm("请确认是否重启主机内全部服务?")
+        .then(function () {
+        })
+        .then(() => {
+          restartHostServer(hostId).then((res) => {
+            let {code, msg} = res;
+            if (code == 200) {
+              this.getList();
+              this.$modal.msgSuccess("应用服务重启指令,下发成功!");
+            } else {
+              this.$modal.msgSuccess(msg);
+            }
+          });
+        });
+    },
+    remove(row) {
+      this.$modal
+        .confirm("删除主机,将清除系统中该主机的全部信息且不可恢复;是否确认?")
+        .then(function () {
+        })
+        .then(() => {
+          deleteHost(row.id).then((res) => {
+            let {code, msg} = res;
+            if (code == 200) {
+              this.getList();
+              this.$modal.msgSuccess("删除成功!");
+            } else {
+              this.$modal.msgError(msg);
+            }
+          });
+        });
+    },
+    handleUpgrade(){
+      if (this.hostSelections.length <= 0){
+        this.$modal.msgError("请选择需要升级的主机!");
+        return;
+      }
+      let flag = false;
+      //判断选择选择主机中是否有离线的主机
+      this.hostSelections.forEach((item) => {
+        if (item.hostStatus === 2){
+          flag = true;
+        }
+      })
+      if (flag){
+        this.$modal.msgError("选择升级主机中存在离线主机,请重新选择!");
+        return;
+      }
+
+      this.upgradeParams.hostIds = this.hostSelections.map((row) => row.id);
+
+      upgradeVersionSelect().then((d) => {
+        this.upgradeVersions = d.data;
+      });
+      this.chooseZipFlag = true;
+      this.queryParams.zipVersion = null;
+      this.reset();
+    },
+    submitForm(){
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.$modal
+            .confirm("是否创建升级任务?")
+            .then(function () {
+            })
+            .then(() => {
+              this.upgradeParams.zipId = this.form.upgradeZip;
+              validateUpgradeHost(this.upgradeParams).then((res) => {
+                let {code, msg} = res;
+                if (code == 200) {
+                  let data = res.data;
+                  if (data.status === 0){
+                    this.$modal.confirm(data.msg,function(){
+                      this.upgradeBatchHost(data);
+                    });
+                  }else {
+                    this.upgradeBatchHost(data);
+                  }
+                } else {
+                  this.$modal.msgError(msg);
+                }
+              });
+            });
+        }
+      });
+    },
+    upgradeBatchHost(param){
+      upgradeHost(param).then((res) => {
+        let {code, msg} = res;
+        if (code == 200) {
+          this.$modal.msgSuccess(msg);
+          this.resetQuery();
+          this.cancel();
+        } else {
+          this.$modal.msgError(msg);
+        }
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.chooseZipFlag = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        upgradeZip: null,
+      };
+      this.resetForm("form");
+    },
+  }
+};
+</script>
+<style lang="scss">
+.el-checkbox {
+  display: -webkit-box !important;
+}
+</style>

+ 87 - 0
src/views/deploy/hostInfo/serverPage.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="rule-type">
+    <DialogCom
+      @colse="onHide"
+      :title="'查看主机应用详情'"
+      :visible.sync="isShow"
+      width="900px"
+    >
+      <div class="page-body">
+        <el-table
+          v-loading="loading"
+          :data="appRunServerList"
+          border
+          height="650" size="small"
+        >
+          <el-table-column align="center" label="序号" width="100">
+            <template v-slot:default="scope">
+              <span v-text="getPageIndex(scope.$index)"> </span>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="应用名称" prop="appId"/>
+          <el-table-column align="center" label="中文描述" prop="appName"/>
+          <el-table-column align="center" label="版本号" prop="version"/>
+          <el-table-column align="center" label="状态" prop="running">
+            <template v-slot:default="scope">
+              <span v-if="scope.row.appType === 'Tool'">-</span>
+              <span v-else-if="scope.row.running" style="color: #00B83F"><i class="el-icon-check"/></span>
+              <span v-else style="color: red"><i class="el-icon-close"/></span>
+            </template>
+          </el-table-column>
+
+        </el-table>
+      </div>
+    </DialogCom>
+  </div>
+</template>
+
+<script>
+import {
+  appRunServerList
+} from "@/api/deploy/hostInfo";
+export default {
+  dicts: [],
+  data() {
+    return {
+      isShow: false,
+      // 遮罩层
+      loading: true,
+      // 表数据
+      appRunServerList: [],
+    };
+  },
+  watch: {},
+  computed: {
+
+  },
+  mounted() {},
+  methods: {
+    async show(id = "", other = {}) {
+      if (id) {
+        await appRunServerList(id).then((res) => {
+          let { code, msg, data } = res;
+          if (code == 200) {
+            this.appRunServerList = data;
+          } else {
+            this.$message.error(msg);
+          }
+        }).catch((err) => {
+          this.loading = false;
+        });
+      }
+      this.loading = false;
+      this.isShow = true;
+    },
+
+    // 事件
+    onHide() {
+      this.isShow = false;
+    },
+    getPageIndex($index) {
+      //表格序号
+      return $index + 1
+    },
+  },
+};
+</script>
+

+ 351 - 0
src/views/deploy/package/index.vue

@@ -0,0 +1,351 @@
+<template>
+  <div class="app-container">
+    <div class="main-right-box">
+      <!--    搜索条件    -->
+      <div class="main-search-box">
+        <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" size="small">
+
+          <el-form-item label="上传包名" prop="zipName">
+            <el-input v-model="queryParams.zipName" :maxlength="50" clearable placeholder="请输入上传包名"
+                      @keyup.enter.native="handleQuery"/>
+          </el-form-item>
+
+          <el-form-item label="版本号" prop="zipVersion">
+            <el-input v-model="queryParams.zipVersion" :maxlength="50" clearable placeholder="请输入版本号"
+                      @keyup.enter.native="handleQuery"/>
+          </el-form-item>
+
+<!--          <el-form-item label="适用主机" prop="hostTypeName">
+            <el-select style="width: 100%;" clearable v-model="queryParams.hostTypeName" placeholder="请选择机构类型"
+            >
+              <el-option v-for="dict in dict.type.deploy_service_status" :key="dict.value" :label="dict.label"
+                         :value="dict.value"/>
+            </el-select>
+          </el-form-item>-->
+
+        </el-form>
+
+
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery"
+            >搜索
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button icon="el-icon-refresh" size="mini" type="primary" @click="resetQuery"
+            >重置
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button icon="el-icon-upload" size="mini" type="primary" @click="showUpload"
+            >上传升级包
+            </el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </div>
+
+      <el-table
+        v-loading="loading"
+        :data="packageInfoList"
+        border
+        height="646" size="small" >
+        <el-table-column align="center" label="序号" width="60">
+          <template v-slot:default="scope">
+            <span v-text="getPageIndex(scope.$index)"> </span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="上传包名" prop="zipName"/>
+        <el-table-column align="center" label="版本号" prop="zipVersion"/>
+<!--        <el-table-column align="center" label="适用主机" prop="hostTypeName"/>-->
+        <el-table-column align="center" label="上传时间" prop="uploadDate"/>
+        <el-table-column align="center" label="发布日期" prop="publishDate"/>
+        <el-table-column align="center" label="升级包大小" prop="zipSize"/>
+        <el-table-column align="center" label="描述" prop="zipService" :show-overflow-tooltip="true" scoped-slot="zipService" width="300"/>
+        <el-table-column
+          class-name="small-padding fixed-width"
+          label="操作"
+          align="center"
+          width="180"
+        >
+          <template slot-scope="{ row }">
+            <el-button
+              class="el-icon-view"
+              size="mini"
+              type="text"
+              @click="showDetail(row.id)"
+            >详情
+            </el-button
+            >
+            <el-button
+              class="el-icon-delete"
+              size="mini"
+              type="text"
+              @click="remove(row)"
+            >删除
+            </el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
+                  @pagination="getList"/>
+
+    </div>
+
+    <DialogCom
+      @colse="onHide"
+      :title="'查看升级包应用详情'"
+      :visible.sync="open"
+      width="1200px"
+    >
+      <div class="page-body">
+        <el-table
+          v-loading="loading"
+          :data="packageServerList"
+          border
+          height="650" size="small"
+        >
+          <el-table-column align="center" label="序号" width="100">
+            <template v-slot:default="scope">
+              <span v-text="getPageIndex(scope.$index)"> </span>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="产品名称" prop="productName"/>
+          <el-table-column align="center" label="应用标识" :show-overflow-tooltip="true" scoped-slot="appId" prop="appId"/>
+          <el-table-column align="center" label="应用类型" prop="appType"/>
+          <el-table-column align="center" label="应用描述" :show-overflow-tooltip="true" scoped-slot="appName" prop="appName"/>
+          <el-table-column align="center" label="应用版本号" prop="version"/>
+        </el-table>
+      </div>
+    </DialogCom>
+
+
+    <DialogCom
+      :title="upload.title"
+      :visible.sync="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".zip"
+        :headers="upload.headers"
+        :action="upload.url"
+        :disabled="upload.isUploading"
+        :before-upload="handleBeforeUpload"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :on-error="handleFileFailed"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <!-- 上传提示 -->
+        <div class="el-upload__tip" slot="tip" v-if="showTip">
+          文件
+          <template v-if="fileSize">大小不超过<b style="color: #f56c6c">{{ fileSize }}MB</b></template>
+          <template v-if="fileType"> 格式为<b style="color: #f56c6c">{{ fileType.join("/") }}</b></template>
+          的文件
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer" style="margin-top: 10px">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </DialogCom>
+  </div>
+</template>
+
+<script>
+import {
+  packageInfoList,packageDetail,deletePackage
+} from "@/api/deploy/packageInfo";
+import {upgradeVersionSelect} from "@/api/deploy/hostInfo";
+import { getToken } from "@/utils/auth";
+
+export default {
+  name: "HostPackage",
+  computed: {
+    // 是否显示提示
+    showTip() {
+      return this.isShowTip && (this.fileType || this.fileSize);
+    },
+  },
+  components: { },
+  dicts: [],
+  data() {
+    return {
+      fileSize: 1000,
+      fileType: ['zip'],
+      isShowTip: true,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个停用
+      single: true,
+      // 非多个停用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 表数据
+      packageInfoList: [],
+      // 表数据
+      packageServerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        zipName: null,
+        zipVersion: null,
+        hostTypeName: null,
+      },
+      typeNames:[],
+      // 设备导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "上传升级包",
+        // 是否停用上传
+        isUploading: false,
+
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url:
+          process.env.NODE_ENV === "development"
+            ? process.env.VUE_APP_BASE_API + "/api/deploy/appPackage/upload"
+            : window.origin + "/api/deploy/appPackage/upload",
+      },
+    };
+  },
+  created() {
+    // agentVersionSelect().then((d) => {
+    //   this.agentVersions = d.data;
+    // });
+    this.getList();
+  },
+  methods: {
+    getPageIndex($index) {
+      //表格序号
+      return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + $index + 1
+    },
+    /** 查询升级包列表 */
+    getList() {
+      this.loading = true;
+      packageInfoList(this.queryParams).then(response => {
+          this.packageInfoList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      ).catch((err) => {
+        this.loading = false;
+      });
+    },
+
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    hostDetail(hostId) {
+      this.$refs.HostServer.show(hostId);
+    },
+    showDetail(packageId){
+      packageDetail(packageId).then((d) => {
+        this.packageServerList = d.data;
+      });
+      this.open = true;
+    },
+    remove(row) {
+      this.$modal
+        .confirm("确定删除该升级包?")
+        .then(function () {
+        })
+        .then(() => {
+          deletePackage(row.id).then((res) => {
+            let {code, msg} = res;
+            if (code === 200) {
+              this.getList();
+              this.$modal.msgSuccess("删除成功!");
+            } else {
+              this.$modal.msgError(msg);
+            }
+          });
+        });
+    },
+    // 事件
+    onHide() {
+      this.open = false;
+    },
+    showUpload(){
+      this.upload.open = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+        "上传升级包成功!" +
+        "</div>",
+        "上传结果",
+        { dangerouslyUseHTMLString: true }
+      );
+      this.getList();
+    },
+    // 文件上传成功处理
+    handleFileFailed(err, file, fileList) {
+      let myError = err.toString();
+      myError = myError.replace("Error: ","");
+      myError = JSON.parse(myError);
+      this.upload.isUploading = false;
+      this.$alert(
+        "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
+        myError.msg +
+        "</div>",
+        "上传结果",
+        { dangerouslyUseHTMLString: true }
+      );
+    },
+    handleBeforeUpload(){
+
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 提交上传文件
+    submitFileForm() {
+      let files = this.$refs.upload.uploadFiles;
+      if (files.length <= 0){
+        this.$modal.msgError("请选择上传文件!");
+        return;
+      }
+      this.$refs.upload.submit();
+    },
+  }
+};
+</script>
+

+ 223 - 0
src/views/deploy/upgradeStatus/hostUpgrade.vue

@@ -0,0 +1,223 @@
+<template>
+  <div class="app-container">
+    <div class="main-right-box">
+      <!--    搜索条件    -->
+      <div class="main-search-box">
+        <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" size="small">
+
+          <el-form-item label="组织机构" prop="orgName">
+            <el-input v-model="queryParams.orgName" :maxlength="50" clearable placeholder="请输入组织机构"/>
+          </el-form-item>
+
+          <el-form-item label="状态" prop="status">
+            <el-select style="width: 100%;" clearable v-model="queryParams.status" placeholder="请选择状态"
+            >
+              <el-option v-for="dict in dict.type.deploy_upgrade_status" :key="dict.value" :label="dict.label"
+                         :value="dict.value"/>
+            </el-select>
+          </el-form-item>
+
+        </el-form>
+
+
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery"
+            >搜索
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button icon="el-icon-refresh" size="mini" type="primary" @click="resetQuery"
+            >重置
+            </el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </div>
+
+      <el-table
+        v-loading="loading"
+        :data="upgradeHostList"
+        border
+        height="646" size="small" >
+        <el-table-column align="center" label="序号" width="60">
+          <template v-slot:default="scope">
+            <span v-text="getPageIndex(scope.$index)"> </span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="批次号" prop="batchCode" :show-overflow-tooltip="true" scoped-slot="batchCode"/>
+        <el-table-column align="center" label="所属机构" prop="orgName"/>
+        <el-table-column align="center" label="版本号" prop="zipVersion"/>
+        <el-table-column align="center" label="状态" prop="status">
+          <template v-slot:default="scope">
+            <span v-if="scope.row.status === 0" style="color: #000000">进行中</span>
+            <span v-else-if="scope.row.status === 1" style="color: #00B83F">成功</span>
+            <span v-else-if="scope.row.status === 2" style="color: red">失败</span>
+            <span v-else-if="scope.row.status === 3" style="color: #f0ad4e">重试中</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="主机名称" prop="hostName"/>
+        <el-table-column align="center" label="主机IP" prop="hostIp" :show-overflow-tooltip="true" scoped-slot="hostIp"/>
+        <el-table-column align="center" label="创建时间" prop="createTime"/>
+        <el-table-column align="center" label="结束时间" prop="finishTime"/>
+        <el-table-column
+          class-name="small-padding fixed-width"
+          label="操作"
+          align="center"
+          width="120"
+        >
+          <template slot-scope="{ row }">
+            <el-button
+              class="el-icon-view"
+              size="mini"
+              type="text"
+              @click="showUpgradeApps(row)"
+            >详情
+            </el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
+                  @pagination="getList"/>
+    </div>
+
+    <DialogCom
+      @colse="onHide"
+      :title="'查看升级应用详情'"
+      :visible.sync="open"
+      width="1200px"
+    >
+      <div class="page-body">
+        <el-table
+          v-loading="loading"
+          :data="upgradeAppList"
+          border
+          height="650" size="small"
+        >
+          <el-table-column align="center" label="序号" width="100">
+            <template v-slot:default="scope">
+              <span v-text="getPageIndex(scope.$index)"> </span>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="批次号" :show-overflow-tooltip="true" scoped-slot="batchNumber" prop="batchNumber"/>
+          <el-table-column align="center" label="应用标识" :show-overflow-tooltip="true" scoped-slot="appId" prop="appId"/>
+          <el-table-column align="center" label="当前版本号" prop="nowVersion"/>
+          <el-table-column align="center" label="目标版本号" prop="targeVersion"/>
+          <el-table-column align="center" label="进度描述" prop="deployDescription"/>
+          <el-table-column align="center" label="状态" prop="taskStatus">
+            <template v-slot:default="scope">
+              <span v-if="scope.row.status === 0" style="color: #000000">进行中</span>
+              <span v-else-if="scope.row.status === 1" style="color: #00B83F">成功</span>
+              <span v-else-if="scope.row.status === 2" style="color: red">失败</span>
+              <span v-else-if="scope.row.status === 3" style="color: #f0ad4e">重试中</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </DialogCom>
+
+  </div>
+</template>
+
+<script>
+import {
+  upgradeHostList, upgradeAppList
+} from "@/api/deploy/upgradeStatus";
+import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
+import dayjs from "dayjs";
+
+export default {
+  name: "UpgradeStatus",
+  computed: {
+  },
+  components: { DataRangePicker, dayjs},
+  dicts: ['deploy_upgrade_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个停用
+      single: true,
+      // 非多个停用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 表数据
+      upgradeHostList: [],
+      upgradeAppList:[],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orgName: null,
+        status: null,
+      },
+    };
+  },
+  created() {
+    // agentVersionSelect().then((d) => {
+    //   this.agentVersions = d.data;
+    // });
+    //this.getList();
+  },
+  mounted() {
+    let id = this.$route.params.id;
+    if (!id) {
+      this.$tab.closePageAndPushPrev();
+      return;
+    }
+    this.queryParams.id = id;
+    this.getList();
+  },
+  methods: {
+    getPageIndex($index) {
+      //表格序号
+      return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + $index + 1
+    },
+    /** 查询升级包列表 */
+    getList() {
+      upgradeHostList(this.queryParams).then(response => {
+          this.upgradeHostList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      ).catch((err) => {
+        this.loading = false;
+      });
+    },
+
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    showUpgradeApps(row){
+      upgradeAppList({hostId:row.hostId,batchNumber:row.batchCode}).then((d) => {
+        this.upgradeAppList = d.data;
+      });
+      this.open = true;    },
+    // 事件
+    onHide() {
+      this.open = false;
+    },
+  }
+};
+</script>
+

+ 211 - 0
src/views/deploy/upgradeStatus/index.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="app-container">
+    <div class="main-right-box">
+      <!--    搜索条件    -->
+      <div class="main-search-box">
+        <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" size="small">
+
+          <el-form-item class="searchTitle" prop="dateRange" label="任务时间">
+            <DataRangePicker
+              v-model="dateRange"
+              key="daterange"
+              type="daterange"
+              :clearable="true"
+            />
+          </el-form-item>
+
+          <el-form-item label="升级批次号" prop="batchCode">
+            <el-input v-model="queryParams.batchCode" :maxlength="50" clearable placeholder="请输入版本号"/>
+          </el-form-item>
+
+          <el-form-item label="版本号" prop="zipVersion">
+            <el-input v-model="queryParams.zipVersion" :maxlength="50" clearable placeholder="请输入版本号"/>
+          </el-form-item>
+
+          <el-form-item label="状态" prop="status">
+            <el-select style="width: 100%;" clearable v-model="queryParams.status" placeholder="请选择状态"
+            >
+              <el-option v-for="dict in dict.type.deploy_upgrade_status" :key="dict.value" :label="dict.label"
+                         :value="dict.value"/>
+            </el-select>
+          </el-form-item>
+
+          <!--          <el-form-item label="适用主机" prop="hostTypeName">
+                      <el-select style="width: 100%;" clearable v-model="queryParams.hostTypeName" placeholder="请选择机构类型"
+                      >
+                        <el-option v-for="dict in dict.type.deploy_service_status" :key="dict.value" :label="dict.label"
+                                   :value="dict.value"/>
+                      </el-select>
+                    </el-form-item>-->
+
+        </el-form>
+
+
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery"
+            >搜索
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button icon="el-icon-refresh" size="mini" type="primary" @click="resetQuery"
+            >重置
+            </el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </div>
+
+      <el-table
+        v-loading="loading"
+        :data="packageInfoList"
+        border
+        height="646" size="small" >
+        <el-table-column align="center" label="序号" width="60">
+          <template v-slot:default="scope">
+            <span v-text="getPageIndex(scope.$index)"> </span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="升级批次号" prop="batchCode"/>
+        <el-table-column align="center" label="版本号" prop="zipVersion"/>
+        <!--        <el-table-column align="center" label="适用主机" prop="hostTypeName"/>-->
+        <el-table-column align="center" label="机构数量" prop="orgSize"/>
+        <el-table-column align="center" label="主机数量" prop="hostSize"/>
+        <el-table-column align="center" label="创建时间" prop="createTime"/>
+        <el-table-column align="center" label="结束时间" prop="finishTime"/>
+        <el-table-column align="center" label="状态" prop="status">
+          <template v-slot:default="scope">
+            <span v-if="scope.row.status === 0" style="color: #000000">进行中</span>
+            <span v-else-if="scope.row.status === 1" style="color: #00B83F">成功</span>
+            <span v-else-if="scope.row.status === 2" style="color: red">失败</span>
+            <span v-else-if="scope.row.status === 3" style="color: #f0ad4e">重试中</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          class-name="small-padding fixed-width"
+          label="操作"
+          align="center"
+          width="120"
+        >
+          <template slot-scope="{ row }">
+            <el-button
+              class="el-icon-view"
+              size="mini"
+              type="text"
+              @click="onManageContent(row)"
+            >详情
+            </el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
+                  @pagination="getList"/>
+
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  appUpgradeList
+} from "@/api/deploy/upgradeStatus";
+import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
+import dayjs from "dayjs";
+
+export default {
+  name: "UpgradeStatus",
+  computed: {
+  },
+  components: { DataRangePicker, dayjs},
+  dicts: ['deploy_upgrade_status'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个停用
+      single: true,
+      // 非多个停用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 表数据
+      packageInfoList: [],
+      // 表数据
+      packageServerList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 日期范围
+      dateRange: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        startDate: null,
+        endDate: null,
+        batchCode: null,
+        status: null,
+      },
+    };
+  },
+  created() {
+    // agentVersionSelect().then((d) => {
+    //   this.agentVersions = d.data;
+    // });
+    this.getList();
+  },
+  methods: {
+    getPageIndex($index) {
+      //表格序号
+      return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + $index + 1
+    },
+    /** 查询升级包列表 */
+    getList() {
+      this.loading = true;
+      console.log("123456")
+      if (this.dateRange && this.dateRange.length > 0){
+        this.queryParams.startDate = dayjs(this.dateRange[0]).format('YYYY-MM-DD HH:mm:ss');
+        this.queryParams.endDate = dayjs(this.dateRange[1]).format('YYYY-MM-DD HH:mm:ss');
+      }else {
+        this.queryParams.startDate = null;
+        this.queryParams.endDate = null;
+      }
+      appUpgradeList(this.queryParams).then(response => {
+          this.packageInfoList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      ).catch((err) => {
+        this.loading = false;
+      });
+    },
+
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    onManageContent(row){
+      const id = row.id;
+      //路由名称:upgradeHostManager
+      //this.$router.push({ name:"upgradeHostManager",params:{id:id,hostId:row.hostId}});
+      let path = `/deploy/upgrade/content/${id}`;
+      this.$router.push(path);
+    },
+  }
+};
+</script>
+