Ver Fonte

合并线下

qinzhipeng_v há 5 anos atrás
pai
commit
5ee58aa2c8

+ 9 - 0
src/api/HMvehicle.js

@@ -10,6 +10,15 @@ export function createHmVirtualDevice(data) {
   })
 }
 
+// 激活设备
+export function activeHmVirtualDevice(params) {
+  return request({
+    url: HMvehicleUrl + '/virtual-devices/ebike/activeDevice',
+    method: 'get',
+    params
+  })
+}
+
 // 查询设备信息
 export function queryDeviceInfo(params) {
   return request({

+ 1 - 1
src/apiConfig/api.js

@@ -6,4 +6,4 @@ export const mockUrl = 'http://10.179.24.176:8980' // 线下
 
 export const qualityUrl = 'http://10.179.209.19:8898' // 质量度量
 
-export const HMvehicleUrl = 'http://172.23.163.15:9999' // 电单车
+export const HMvehicleUrl = 'http://10.96.113.197:9999' // 电单车

+ 1 - 4
src/layout/components/AppMain.vue

@@ -1,10 +1,7 @@
 <template>
   <section class="app-main">
     <transition name="fade-transform" mode="out-in">
-      <keep-alive>
-        <router-view v-if="$route.meta.keepAlive" :key="key" />
-        <router-view v-if="!$route.meta.keepAlive" :key="key" />
-      </keep-alive>
+      <router-view :key="key" />
     </transition>
   </section>
 </template>

+ 11 - 5
src/router/index.js

@@ -485,11 +485,17 @@ export const constantRoutes = [
         meta: { title: '单车' }
       },
       {
-        path: 'HTvehicl1e',
-        name: '电单车'
-        // hidden: true,
-        // component: () => import('@/views/virtualDevices/HTvehicle'),
-        // meta: { title: '电单车' }
+        path: 'ebike',
+        name: '电单车',
+        component: () => import('@/views/virtualDevices/HMvehicle.vue'),
+        meta: { title: '电单车' }
+      },
+      {
+        path: 'ebike/ebikeCreate',
+        name: '新增电单车',
+        hidden: true,
+        component: () => import('@/views/virtualDevices/HMvehicleCreate.vue'),
+        meta: { title: '新增电单车' }
       }
     ]
   },

+ 12 - 5
src/views/Platform/bugManage/bugCreate.vue

@@ -7,7 +7,7 @@
           <div class="line-between">
             <el-form-item label="类型" prop="bugType" label-width="124px">
               <el-select v-model="form.bugType" style="width:76%;" placeholder="类型">
-                <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.code" />
+                <el-option v-for="item in bugTypeStr" :key="item.code" :label="item.name" :value="item.code" />
               </el-select>
             </el-form-item>
             <el-form-item label="所处阶段" prop="stage" label-width="147px">
@@ -74,7 +74,7 @@
           <el-form-item label="bug描述" prop="bugDescribe" label-width="112px"><el-input v-model="form.bugDescribe" type="textarea" placeholder="bug描述" rows="2" style="width:89.6%;" /></el-form-item>
           <div class="line-between">
             <el-form-item label="当前处理人" prop="currentHandler" label-width="124px">
-              <el-select v-model="form.currentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+              <el-select v-model="form.currentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsCurrentHandler"
                   :key="item.id"
@@ -84,7 +84,7 @@
               </el-select>
             </el-form-item>
             <el-form-item label="bug责任人" prop="assigner" label-width="147px">
-              <el-select v-model="form.assigner" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+              <el-select v-model="form.assigner" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsAssigner"
                   :key="item.id"
@@ -217,8 +217,8 @@ export default {
         status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
         platformType: [{ required: true, message: '平台类型不能为空', trigger: 'change' }],
         stage: [{ required: true, message: '所处阶段不能为空', trigger: 'change' }],
-        assigner: [{ required: true, message: 'bug责任人不能为空', trigger: 'blur' }],
-        currentHandler: [{ required: true, message: 'bug处理人不能为空', trigger: 'blur' }],
+        assigner: [{ required: true, message: 'bug责任人不能为空', trigger: 'change' }],
+        currentHandler: [{ required: true, message: 'bug处理人不能为空', trigger: 'change' }],
         bugDescribe: [{ required: true, message: 'bug描述不能为空', trigger: 'change' }],
         clientType: [{ required: true, message: '业务模块不能为空', trigger: 'change' }]
       },
@@ -239,6 +239,9 @@ export default {
     this.bugListSelect()
     this.forkDown()
   },
+  mounted() {
+    this.$refs.form.resetFields()
+  },
   methods: {
     createdDis() {
       this.dis = true
@@ -336,6 +339,10 @@ export default {
       }
       this.$set(this.form, 'moduleId', '')
     },
+    // 点击一次更新一次
+    realTimeChange(e) {
+      if (e === true) this.getMember()
+    },
     // 人员搜索
     getMember() {
       const objDataAssigner = { bizId: this.form.bizId, email: '', role: 'rd' }

+ 7 - 3
src/views/Platform/bugManage/bugQuery.vue

@@ -94,7 +94,7 @@
     <el-dialog :visible.sync="dialogInDevelopment" width="40%" @close="cancelInput()">
       <el-form ref="refeshDevelopmentDialog" :model="pauseData" :rules="serviceDataRules">
         <el-form-item label="开发RD" prop="pauseCurrentHandler" label-width="30%">
-          <el-select v-model="pauseData.pauseCurrentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+          <el-select v-model="pauseData.pauseCurrentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
             <el-option
               v-for="item in optionsCurrentHandlerRD"
               :key="item.id"
@@ -112,7 +112,7 @@
     <el-dialog :visible.sync="dialogWaitTest" width="40%" @close="cancelInput()">
       <el-form ref="refeshWaitTestDialog" :model="pauseData" :rules="serviceDataRules">
         <el-form-item label="验收QA" prop="pauseCurrentHandler" label-width="30%">
-          <el-select v-model="pauseData.pauseCurrentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+          <el-select v-model="pauseData.pauseCurrentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
             <el-option
               v-for="item in optionsCurrentHandlerQA"
               :key="item.id"
@@ -128,7 +128,7 @@
         </el-form-item>
         <el-form-item style="flex-grow:1" label="bug类型" prop="bugTypePause" label-width="30%">
           <el-select v-model="pauseData.bugTypePause" placeholder="bug类型" style="width:76%;">
-            <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.code" />
+            <el-option v-for="item in bugTypeStr" :key="item.code" :label="item.name" :value="item.code" />
           </el-select>
         </el-form-item>
         <el-form-item label="修复方式" prop="pauseReasonsAndSolutionForTheProblem" label-width="30%"><el-input v-model="pauseData.pauseReasonsAndSolutionForTheProblem" type="textarea" autocomplete="off" rows="3" style="width:76%;" /></el-form-item>
@@ -302,6 +302,10 @@ export default {
         this.formUpdateValue = {}
       }
     },
+    // 点击一次更新一次
+    realTimeChange(e) {
+      if (e === true) this.getMember()
+    },
     // 人员搜索
     getMember(role) {
       const objDataCurrentHandler = { bizId: this.form.bizId, email: '', role: role }

+ 7 - 3
src/views/Platform/bugManage/bugUpdate.vue

@@ -7,7 +7,7 @@
           <div class="line-between">
             <el-form-item label="类型" prop="bugType" label-width="124px">
               <el-select v-model="form.bugType" style="width:76%;" placeholder="类型">
-                <el-option v-for="item in bugTypeStr" :key="item.name" :label="item.name" :value="item.code" />
+                <el-option v-for="item in bugTypeStr" :key="item.code" :label="item.name" :value="item.code" />
               </el-select>
             </el-form-item>
             <el-form-item label="所处阶段" prop="stage" label-width="147px">
@@ -62,7 +62,7 @@
           <el-form-item label="bug描述" prop="bugDescribe" label-width="112px"><el-input v-model="form.bugDescribe" type="textarea" placeholder="bug描述" rows="2" style="width:89.6%;" /></el-form-item>
           <div class="line-between">
             <el-form-item label="当前处理人" prop="currentHandler" label-width="124px">
-              <el-select v-model="form.currentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+              <el-select v-model="form.currentHandler" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsCurrentHandler"
                   :key="item.id"
@@ -72,7 +72,7 @@
               </el-select>
             </el-form-item>
             <el-form-item label="bug责任人" prop="assigner" label-width="147px">
-              <el-select v-model="form.assigner" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+              <el-select v-model="form.assigner" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsAssigner"
                   :key="item.id"
@@ -347,6 +347,10 @@ export default {
       }
       this.$set(this.form, 'moduleId', '')
     },
+    // 点击一次更新一次
+    realTimeChange(e) {
+      if (e === true) this.getMember()
+    },
     // 人员搜索
     getMember() {
       const objDataAssigner = { bizId: this.form.bizId, email: '', role: 'rd' }

+ 11 - 3
src/views/Platform/defectManagement.vue

@@ -413,7 +413,7 @@ export default {
       userNames: localStorage.getItem('realname'),
       bizJson: localStorage.getItem('key'),
       pageSize: 20,
-      curIndex: 0,
+      curIndex: 1,
       total: 0,
       show2: '',
       form: {
@@ -445,6 +445,7 @@ export default {
     this.bugListSelect()
   },
   mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
     this.getQueryData()
   },
   methods: {
@@ -489,7 +490,7 @@ export default {
     dataQuery(e) {
       this.bizJson = localStorage.getItem('key')
       this.indexPage = e
-      this.curIndex = 0
+      this.curIndex = 1
       this.indexPage.bizId = this.bizJson
       this.indexPage.pageSize = this.pageSize
       this.indexPage.curIndex = this.curIndex
@@ -512,6 +513,13 @@ export default {
       this.indexPage.bizId = this.bizJson
       this.indexPage.pageSize = this.pageSize
       this.indexPage.curIndex = this.curIndex
+      if (this.timeShow) {
+        this.indexPage.gmtCreateBegin = this.timeInterval[0]
+        this.indexPage.gmtCreateEnd = this.timeInterval[1]
+      } else {
+        this.indexPage.gmtCreateBegin = ''
+        this.indexPage.gmtCreateEnd = ''
+      }
       bugList(this.indexPage).then(res => {
         this.tableData = res.data
         this.total = res.total
@@ -651,7 +659,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 700px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)

+ 28 - 15
src/views/projectManage/projectList/projectCreate.vue

@@ -3,7 +3,7 @@
     <div class="block">
       <el-form ref="form" :model="form" :rules="serviceDataRules">
         <div class="block-flex">
-          <el-form-item label="项目名称" prop="name" label-width="110px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:90%;" /></el-form-item>
+          <el-form-item label="项目名称" prop="name" label-width="112px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:89.6%;" /></el-form-item>
           <div class="line-between">
             <el-form-item label="业务线" prop="bizId" label-width="124px">
               <el-select v-model="form.bizId" style="width:76%;" placeholder="请选择" @change="clickChangePlatform(form.bizId)">
@@ -37,8 +37,8 @@
             <el-form-item label="版本" label-width="147px"><el-input v-model="form.version" autocomplete="off" placeholder="请填写" style="width:76%;" /></el-form-item>
           </div>
           <div class="line-between">
-            <el-form-item label="产品" label-width="124px">
-              <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="产品" label-width="124px" prop="pm">
+              <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsPM"
                   :key="item.id"
@@ -47,8 +47,8 @@
                 />
               </el-select>
             </el-form-item>
-            <el-form-item label="开发" label-width="147px">
-              <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="开发" label-width="147px" prop="rd">
+              <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsRD"
                   :key="item.id"
@@ -59,8 +59,8 @@
             </el-form-item>
           </div>
           <div class="line-between">
-            <el-form-item label="测试" label-width="124px">
-              <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="测试" label-width="124px" prop="qa">
+              <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsQA"
                   :key="item.id"
@@ -80,12 +80,12 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="需求文档" label-width="110px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:90%;" /></el-form-item>
-          <el-form-item label="描述" label-width="110px"><el-input v-model="form.description" type="textarea" placeholder="请填写" rows="3" style="width:90%;" /></el-form-item>
-          <el-form-item label="详细信息" label-width="110px">
-            <div id="wangeditor" class="force-height" style="margin-bottom:22px;width:90%;" />
+          <el-form-item label="需求文档" label-width="112px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
+          <el-form-item label="描述" label-width="112px"><el-input v-model="form.description" type="textarea" placeholder="请填写" rows="3" style="width:89.6%;" /></el-form-item>
+          <el-form-item label="详细信息" label-width="112px">
+            <div id="wangeditor" class="force-height" style="margin-bottom:22px;width:89.6%;" />
           </el-form-item>
-          <el-form-item label="备注" label-width="110px"><el-input v-model="form.remarks" type="textarea" placeholder="请填写" rows="3" style="width:90%;" /></el-form-item>
+          <el-form-item label="备注" label-width="112px"><el-input v-model="form.remarks" type="textarea" placeholder="请填写" rows="3" style="width:89.6%;" /></el-form-item>
           <el-form-item class="submit">
             <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
             <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">确 定</el-button>
@@ -131,7 +131,10 @@ export default {
         platForm: [{ required: true, message: '平台类型不能为空', trigger: 'change' }],
         status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
         name: [{ required: true, message: '项目名称不能为空', trigger: 'change' }],
-        priority: [{ required: true, message: '优先级不能为空', trigger: 'change' }]
+        priority: [{ required: true, message: '优先级不能为空', trigger: 'change' }],
+        pm: [{ required: true, message: '产品人员不能为空', trigger: 'change' }],
+        rd: [{ required: true, message: '开发人员不能为空', trigger: 'change' }],
+        qa: [{ required: true, message: '测试人员不能为空', trigger: 'change' }]
         // stage: [{ required: true, message: '进展不能为空', trigger: 'change' }]
       }
     }
@@ -145,6 +148,8 @@ export default {
     }
   },
   mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+    this.$refs.form.resetFields()
     if (!this.$route.query.id) {
       const editor = new E('#wangeditor')
       editor.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table', 'foreColor']
@@ -213,6 +218,10 @@ export default {
         }
       })
     },
+    // 点击一次更新一次
+    realTimeChange(e) {
+      if (e === true) this.getMember()
+    },
     // 人员搜索
     getMember() {
       this.objDataPM = { bizId: this.form.bizId, email: '', role: 'pm' }
@@ -291,12 +300,12 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 700px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
       border-radius 7px
-      width 93%
+      width 96%
       margin 25px 0
       padding 29px 50px
     .block >>> .el-form-item__content
@@ -312,6 +321,10 @@ export default {
     .force-height >>> .w-e-text-container
       height auto !important
       min-height 110px !important
+      z-index 0 !important
+    .force-height >>> .w-e-toolbar .w-e-menu
+      position relative
+      z-index 0 !important
     .line-between
       width 100%
       display flex

+ 44 - 8
src/views/projectManage/projectList/projectListIndex.vue

@@ -61,6 +61,14 @@
                 <div>
                   <el-button size="mini" type="primary" plain @click="projectShowData(scope.row.id)">编辑</el-button>
                   <el-button size="mini" type="danger" plain @click="dialogBug(scope.row.id)">删除</el-button>
+                  <el-dropdown style="margin-left:10px" trigger="click">
+                    <el-button size="mini" type="primary">···</el-button>
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item icon="el-icon-coin" @click.native="createDailyReport(scope.row)">新建日报报告</el-dropdown-item>
+                      <el-dropdown-item icon="el-icon-coin" @click.native="createReport(scope.row)">新建准出报告</el-dropdown-item>
+                      <el-dropdown-item icon="el-icon-coin" @click.native="changeaddTaskData(scope.row)">新建任务</el-dropdown-item>
+                    </el-dropdown-menu>
+                  </el-dropdown>
                   <el-dialog
                     :visible.sync="dialogVisible"
                     width="30%"
@@ -75,7 +83,7 @@
               </template>
             </el-table-column>
           </el-table>
-          <el-pagination background style="margin-top:30px;" align="center" :current-page="curIndex" :page-size="pageSize" layout="prev, pager, next" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
+          <el-pagination background style="margin-top:30px;" align="center" :current-page="curIndex" :page-size="pageSize" layout="prev, pager, next" :total="total" @current-change="handleCurrentChange" />
         </div>
       </div>
     </div>
@@ -97,6 +105,7 @@ export default {
       curIndex: 1,
       pageSize: 20,
       total: 0,
+      pauseJumpData: {},
       dialogVisible: false,
       statusOptionss: [],
       pauseId: '',
@@ -108,6 +117,9 @@ export default {
   created() {
     this.getList()
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+  },
   methods: {
     // id Bug
     dialogBug(e) {
@@ -136,14 +148,13 @@ export default {
       }
       projectInit(this.queryListData).then(response => {
         this.list = response.data
-        if (response.data) {
-          this.total = response.data.length
-        }
+        this.total = response.total
         this.statusOptionss = response.query.processStatusEnumList
       })
     },
     dataQuery(queryCode) {
       this.Arra = []
+      this.curIndex = 1
       queryCode.statusString !== '' ? this.Arra.push(queryCode.statusString) : ''
       queryCode.status = this.Arra
       queryCode.bizId = localStorage.getItem('key')
@@ -153,6 +164,33 @@ export default {
         res.code === 200 ? this.list = res.data : this.errorFun(res.msg)
       })
     },
+    dataQueryInSearch(queryCode) {
+      this.Arra = []
+      queryCode.statusString !== '' ? this.Arra.push(queryCode.statusString) : ''
+      queryCode.status = this.Arra
+      queryCode.bizId = localStorage.getItem('key')
+      queryCode.pageSize = this.pageSize
+      queryCode.curIndex = this.curIndex
+      projectInit(queryCode).then(res => {
+        res.code === 200 ? this.list = res.data : this.errorFun(res.msg)
+      })
+    },
+    // 新建日报报告
+    createDailyReport(scope) {
+      this.$router.push({ path: '/Platform/presentation/DailyNewsAdded', query: { projectId: scope }})
+    },
+    // 新建准出报告
+    createReport(scope) {
+      if (scope.platFormString !== '服务端') {
+        this.$router.push({ path: '/Platform/presentation/ClientAcceptance', query: { projectId: scope }}) // 客户端
+      } else {
+        this.$router.push({ path: '/Platform/presentation/Acceptance', query: { projectId: scope }}) // 服务端
+      }
+    },
+    // 任务创建
+    changeaddTaskData(scope) {
+      this.$router.push({ name: '任务创建', query: { id: scope.id }})
+    },
     projectShow(e) {
       this.$router.push({ name: '项目查看', query: { id: e }})
     },
@@ -162,11 +200,9 @@ export default {
     createdCode() {
       this.$router.push({ name: '项目创建' })
     },
-    handleSizeChange(size) {
-      this.pageSize = size
-    },
     handleCurrentChange(curIndex) {
       this.curIndex = curIndex
+      this.dataQueryInSearch(this.queryCode)
     },
     successFun(successText) {
       this.$notify({ title: 'Success', message: `${successText} Successfully`, type: 'success', duration: 2000 })
@@ -184,7 +220,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 700px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)

+ 5 - 2
src/views/projectManage/projectList/projectPreview.vue

@@ -251,6 +251,9 @@ export default {
     this.bugListSelect()
     this.idDetail()
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+  },
   methods: {
     deleteTaskDataOut(e) {
       this.deleteTaskDialogVisible = true
@@ -386,7 +389,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 1000px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
@@ -401,7 +404,7 @@ export default {
       width 100%
       margin 25px 0
       padding 10px 30px
-      height calc(100vh - 425px)
+      height calc(100vh - 482px)
     .block-end >>> th
       background-color #F0F2F4 !important
     .block-end >>> .el-tabs__nav-wrap::after

+ 25 - 14
src/views/projectManage/taskList/taskCreate.vue

@@ -3,7 +3,7 @@
     <el-form ref="form" :model="form" :rules="serviceDataRules">
       <div class="block">
         <div class="block-flex">
-          <el-form-item label="任务名称" prop="name" label-width="110px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:90%;" /></el-form-item>
+          <el-form-item label="任务名称" prop="name" label-width="112px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:89.6%;" /></el-form-item>
           <div class="line-between">
             <el-form-item label="优先级" prop="priority" label-width="124px">
               <el-select v-model="form.priority" style="width:76%;" placeholder="请选择">
@@ -52,8 +52,8 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="需求文档" label-width="110px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:90%;" /></el-form-item>
-          <el-form-item label="技术文档" label-width="110px"><el-input v-model="form.devUrl" placeholder="请填写" style="width:90%;" /></el-form-item>
+          <el-form-item label="需求文档" label-width="112px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
+          <el-form-item label="技术文档" label-width="112px"><el-input v-model="form.devUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
           <!-- <el-form-item class="submit">
             <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
             <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">保 存</el-button>
@@ -71,8 +71,8 @@
             </el-form-item>
           </div>
           <div class="line-between">
-            <el-form-item label="产品" label-width="124px">
-              <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="产品" label-width="124px" prop="pm">
+              <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsPM"
                   :key="item.id"
@@ -81,8 +81,8 @@
                 />
               </el-select>
             </el-form-item>
-            <el-form-item label="开发" label-width="147px">
-              <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="开发" label-width="147px" prop="rd">
+              <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsRD"
                   :key="item.id"
@@ -93,8 +93,8 @@
             </el-form-item>
           </div>
           <div class="line-between-add">
-            <el-form-item label="测试" label-width="124px">
-              <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="测试" label-width="124px" prop="qa">
+              <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsQA"
                   :key="item.id"
@@ -104,7 +104,7 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="描述" label-width="110px"><el-input v-model="form.description" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
+          <el-form-item label="描述" label-width="112px"><el-input v-model="form.description" type="textarea" placeholder="bug描述" rows="3" style="width:89.6%;" /></el-form-item>
         </div>
       </div>
       <div class="block">
@@ -130,7 +130,7 @@
               <el-date-picker v-model="form.onlinePlanTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
             </el-form-item>
           </div>
-          <el-form-item label="备注" label-width="142px"><el-input v-model="form.remark" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
+          <el-form-item label="备注" label-width="146px"><el-input v-model="form.remark" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
           <el-form-item class="submit">
             <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
             <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">确 定</el-button>
@@ -183,7 +183,10 @@ export default {
         name: [{ required: true, message: '任务名称不能为空', trigger: 'change' }],
         priority: [{ required: true, message: '优先级不能为空', trigger: 'change' }],
         // stage: [{ required: true, message: '进展不能为空', trigger: 'change' }],
-        clientType: [{ required: true, message: '工程模块为空', trigger: 'change' }]
+        clientType: [{ required: true, message: '工程模块为空', trigger: 'change' }],
+        pm: [{ required: true, message: '产品人员不能为空', trigger: 'change' }],
+        rd: [{ required: true, message: '开发人员不能为空', trigger: 'change' }],
+        qa: [{ required: true, message: '测试人员不能为空', trigger: 'change' }]
       }
     }
   },
@@ -195,6 +198,10 @@ export default {
       this.forkdown()
     }
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+    this.$refs.form.resetFields()
+  },
   methods: {
     bugListSelect() {
       bugGetEnum().then(res => {
@@ -256,6 +263,10 @@ export default {
       }
       this.$set(this.form, 'clientType', '')
     },
+    // 点击一次更新一次
+    realTimeChange(e) {
+      if (e === true) this.getMember()
+    },
     // 人员搜索
     getMember() {
       this.objDataPM = { bizId: this.form.bizId, email: '', role: 'pm' }
@@ -312,12 +323,12 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 700px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
       border-radius 7px
-      width 95%
+      width 96%
       margin 20px auto
       padding 29px 50px
     .block >>> .el-form-item__content

+ 111 - 7
src/views/projectManage/taskList/taskListIndex.vue

@@ -63,6 +63,15 @@
                     <div>
                       <el-button size="mini" type="primary" plain @click="projectShowData(scope.row.id)">编辑</el-button>
                       <el-button size="mini" type="danger" plain @click="dialogBug(scope.row.id)">删除</el-button>
+                      <el-dropdown style="margin-left:10px" trigger="click">
+                        <el-button size="mini" type="primary">···</el-button>
+                        <el-dropdown-menu slot="dropdown">
+                          <el-dropdown-item icon="el-icon-coin" @click.native="createReport(1, scope.row)">新建提测报告</el-dropdown-item>
+                          <el-dropdown-item icon="el-icon-coin" @click.native="createReport(2, scope.row)">新建日报报告</el-dropdown-item>
+                          <el-dropdown-item icon="el-icon-coin" @click.native="createReport(3, scope.row)">新建准出报告</el-dropdown-item>
+                          <el-dropdown-item icon="el-icon-coin" @click.native="createReport(4, scope.row)">新建bug</el-dropdown-item>
+                        </el-dropdown-menu>
+                      </el-dropdown>
                       <el-dialog
                         :visible.sync="dialogVisible"
                         width="30%"
@@ -77,7 +86,7 @@
                   </template>
                 </el-table-column>
               </el-table>
-              <el-pagination background style="margin-top:30px;" align="center" :current-page="curIndex" :page-size="pageSize" layout="prev, pager, next" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
+              <el-pagination background style="margin-top:30px;" align="center" :current-page="curIndex" :page-size="pageSize" layout="prev, pager, next" :total="total" @current-change="handleCurrentChange" />
             </div>
           </el-tab-pane>
           <el-tab-pane label="看板" name="second">
@@ -115,6 +124,9 @@ export default {
   created() {
     this.bugListSelectBeforeGet()
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+  },
   methods: {
     async bugListSelectBeforeGet() {
       await bugGetEnum().then(res => {
@@ -123,9 +135,8 @@ export default {
       // 任务list
       taskListGet({ bizId: this.bizJson }).then(response => {
         this.tableData = response.data
-        if (response.data) {
-          this.total = response.data.length
-        }
+        this.total = response.total
+        this.loadingOnlineProcess = false
         // const processStatusEnumMap = this.processStatusEnumList.reduce((a, c) => {
         //   return {
         //     ...a,
@@ -136,6 +147,15 @@ export default {
       })
     },
     dataQuery(queryCode) {
+      this.curIndex = 1
+      queryCode.bizId = localStorage.getItem('key')
+      queryCode.pageSize = this.pageSize
+      queryCode.curIndex = this.curIndex
+      taskListGet(queryCode).then(res => {
+        res.code === 200 ? this.tableData = res.data : this.errorFun(res.msg)
+      })
+    },
+    dataQueryInSearch(queryCode) {
       queryCode.bizId = localStorage.getItem('key')
       queryCode.pageSize = this.pageSize
       queryCode.curIndex = this.curIndex
@@ -146,6 +166,40 @@ export default {
     createdCode() {
       this.$router.push({ name: '任务创建' })
     },
+    // 创建日报 提测 准出 Bug报告跳转
+    createReport(e, ele) {
+      if (ele.typeString !== '服务端') {
+        switch (e) {
+          case 1:
+            this.$router.push({ path: '/Platform/presentation/PresentReport', query: { task: ele }}) // 客户端提测
+            break
+          case 2:
+            this.$router.push({ path: '/Platform/presentation/DailyNewsAdded', query: { task: ele }}) // 客户端日报
+            break
+          case 3:
+            this.$router.push({ path: '/Platform/presentation/ClientAcceptance', query: { task: ele }}) // 客户端准出
+            break
+          case 4:
+            this.$router.push({ name: '新建Bug', query: { id: ele.id }}) // 缺陷报告
+            break
+        }
+      } else {
+        switch (e) {
+          case 1:
+            this.$router.push({ path: '/Platform/presentation/presentationReport', query: { task: ele }}) // 服务端提测
+            break
+          case 2:
+            this.$router.push({ path: '/Platform/presentation/DailyNewsAdded', query: { task: ele }}) // 服务端日报
+            break
+          case 3:
+            this.$router.push({ path: '/Platform/presentation/Acceptance', query: { task: ele }}) // 服务端准出
+            break
+          case 4:
+            this.$router.push({ name: '新建Bug', query: { id: ele.id }}) // 缺陷报告
+            break
+        }
+      }
+    },
     // id Bug
     dialogBug(e) {
       this.dialogVisible = true
@@ -164,11 +218,60 @@ export default {
       })
       this.dialogVisible = false
     },
-    handleSizeChange(size) {
-      this.pageSize = size
-    },
+    // // 看板移动更新
+    // checkMove(evt) {
+    //   this.pauseFromId = evt.draggedContext.element.id
+    // },
+    // targetRecording(e) {
+    //   this.pauseTarget = e
+    //   const formTask = { id: this.pauseFromId, status: this.pauseTarget }
+    //   const userData = { id: '', ename: this.userInformation, name: this.userNames }
+    //   const objData = { taskInfo: formTask, user: userData }
+    //   updateTaskList(objData).then(response => {
+    //     if (response.code === 200) {
+    //       this.kanBanDrag()
+    //       this.successFun('operating')
+    //     } else {
+    //       this.errorFun(response.msg)
+    //     }
+    //   })
+    // },
+    // // 看板获取
+    // kanBanDrag() {
+    //   this.loadingOnlineProcess = true
+    //   const initValue = { bizId: this.bizJson }
+    //   listMap(initValue).then((res) => {
+    //     this.labelDrag = res.data
+    //     this.loadingOnlineProcess = false
+    //   })
+    // },
+    // // 标签页研发质量
+    // handleClick() {
+    //   if (this.activeName === 'second') {
+    //     this.kanBanDrag()
+    //   } else if (this.activeName === 'first') {
+    //     this.bugListSelectBeforeGet()
+    //   } else {
+    //     this.errorFun('获取数据失败')
+    //   }
+    // },
+    // // 看板查询
+    // kanBanQuery(e) {
+    //   for (const key in e) {
+    //     if (!e[key]) {
+    //       delete e[key]
+    //     }
+    //   }
+    //   e.bizId = this.bizJson
+    //   this.loadingOnlineProcess = true
+    //   listMap(e).then((res) => {
+    //     this.labelDrag = res.data
+    //     this.loadingOnlineProcess = false
+    //   })
+    // },
     handleCurrentChange(curIndex) {
       this.curIndex = curIndex
+      this.dataQueryInSearch()
     },
     taskShow(e) {
       this.$router.push({ name: '任务查看', query: { id: e }})
@@ -192,6 +295,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)

+ 4 - 1
src/views/projectManage/taskList/taskPreview.vue

@@ -296,6 +296,9 @@ export default {
     this.bugListSelect()
     this.getList()
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+  },
   methods: {
     // id get
     getList() {
@@ -421,7 +424,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 1000px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)

+ 24 - 13
src/views/projectManage/taskList/taskUpdateCreate.vue

@@ -3,7 +3,7 @@
     <el-form ref="form" :model="form" :rules="serviceDataRules">
       <div class="block">
         <div class="block-flex">
-          <el-form-item label="任务名称" prop="name" label-width="110px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:90%;" /></el-form-item>
+          <el-form-item label="任务名称" prop="name" label-width="112px"><el-input v-model="form.name" autocomplete="off" placeholder="普惠质量产品工具平台..." style="width:89.6%;" /></el-form-item>
           <div class="line-between">
             <el-form-item label="优先级" prop="priority" label-width="124px">
               <el-select v-model="form.priority" style="width:76%;" placeholder="请选择">
@@ -52,8 +52,8 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="需求文档" label-width="110px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:90%;" /></el-form-item>
-          <el-form-item label="技术文档" label-width="110px"><el-input v-model="form.devUrl" placeholder="请填写" style="width:90%;" /></el-form-item>
+          <el-form-item label="需求文档" label-width="112px"><el-input v-model="form.mrdUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
+          <el-form-item label="技术文档" label-width="112px"><el-input v-model="form.devUrl" placeholder="请填写" style="width:89.6%;" /></el-form-item>
           <!-- <el-form-item class="submit">
             <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
             <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">保 存</el-button>
@@ -71,8 +71,8 @@
             </el-form-item>
           </div>
           <div class="line-between">
-            <el-form-item label="产品" label-width="124px">
-              <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="产品" label-width="124px" prop="pm">
+              <el-select v-model="form.pm" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsPM"
                   :key="item.id"
@@ -81,8 +81,8 @@
                 />
               </el-select>
             </el-form-item>
-            <el-form-item label="开发" label-width="147px">
-              <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="开发" label-width="147px" prop="rd">
+              <el-select v-model="form.rd" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsRD"
                   :key="item.id"
@@ -93,8 +93,8 @@
             </el-form-item>
           </div>
           <div class="line-between-add">
-            <el-form-item label="测试" label-width="124px">
-              <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;">
+            <el-form-item label="测试" label-width="124px" prop="qa">
+              <el-select v-model="form.qa" multiple filterable placeholder="公司邮箱前缀" style="width:76%;" @visible-change="realTimeChange">
                 <el-option
                   v-for="item in optionsQA"
                   :key="item.id"
@@ -104,7 +104,7 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="描述" label-width="110px"><el-input v-model="form.description" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
+          <el-form-item label="描述" label-width="112px"><el-input v-model="form.description" type="textarea" placeholder="bug描述" rows="3" style="width:89.6%;" /></el-form-item>
         </div>
       </div>
       <div class="block">
@@ -130,7 +130,7 @@
               <el-date-picker v-model="form.onlinePlanTime" align="left" size="medium" type="datetime" style="width:76%;" placeholder="选择日期" />
             </el-form-item>
           </div>
-          <el-form-item label="备注" label-width="142px"><el-input v-model="form.remark" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
+          <el-form-item label="备注" label-width="146px"><el-input v-model="form.remark" type="textarea" placeholder="bug描述" rows="3" style="width:90%;" /></el-form-item>
           <el-form-item class="submit">
             <el-button type="danger" plain size="mini" @click="$router.go(-1)">取 消</el-button>
             <el-button class="move-button" size="mini" type="primary" @click="createFormData(form)">确 定</el-button>
@@ -183,7 +183,10 @@ export default {
         name: [{ required: true, message: '任务名称不能为空', trigger: 'change' }],
         priority: [{ required: true, message: '优先级不能为空', trigger: 'change' }],
         // stage: [{ required: true, message: '进展不能为空', trigger: 'change' }],
-        clientType: [{ required: true, message: '工程模块为空', trigger: 'change' }]
+        clientType: [{ required: true, message: '工程模块为空', trigger: 'change' }],
+        pm: [{ required: true, message: '产品人员不能为空', trigger: 'change' }],
+        rd: [{ required: true, message: '开发人员不能为空', trigger: 'change' }],
+        qa: [{ required: true, message: '测试人员不能为空', trigger: 'change' }]
       }
     }
   },
@@ -191,6 +194,10 @@ export default {
     this.bugListSelect()
     this.idDetail()
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+    this.$refs.form.resetFields()
+  },
   methods: {
     bugListSelect() {
       bugGetEnum().then(res => {
@@ -252,6 +259,10 @@ export default {
       }
       this.$set(this.form, 'clientType', '')
     },
+    // 点击一次更新一次
+    realTimeChange(e) {
+      if (e === true) this.getMember()
+    },
     // 人员搜索
     getMember() {
       this.objDataPM = { bizId: this.form.bizId, email: '', role: 'pm' }
@@ -308,7 +319,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 700px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)

+ 210 - 15
src/views/quality/qualityMeasurement.vue

@@ -19,12 +19,23 @@
     </el-header>
     <el-container style="height:calc(100vh - 140px);">
       <el-aside class="aside">
-        <el-tree ref="treeBox" :default-expanded-keys="expandedClient" accordion :data="dealWithBusinessDate" node-key="id" highlight-current :props="defaultProps" style="margin-top:20px" @node-click="handleNodeClick" />
+        <el-tree
+          ref="treeBox"
+          :default-expanded-keys="expandedClient"
+          icon-class="el-icon-caret-right"
+          accordion
+          :data="dealWithBusinessDate"
+          node-key="id"
+          highlight-current
+          :props="defaultProps"
+          style="margin-top:20px;min-width:100%;display:inline-block !important;"
+          @node-click="handleNodeClick"
+        />
       </el-aside>
       <el-main class="combine-table">
         <el-tabs v-model="activeIndexSecondary" @tab-click="handleClick">
           <el-tab-pane :label="guild" name="first">
-            <!-- 上线过程 -->
+            <!-- 上线过程 客户端-->
             <h4>1. 上线过程</h4>
             <el-table
               v-show="pauseKey === 5"
@@ -34,12 +45,176 @@
               size="mini"
             >
               <el-table-column
-                label="上线数"
+                label="上线数"
                 align="center"
               >
                 <template slot-scope="scope"><a href="javascript:void(0)" style="color:#20a0ff" @click="toClientView()">{{ scope.row.clientOnlineCount }}</a></template>
               </el-table-column>
             </el-table>
+            <!-- 线上问题 客户端-->
+            <h4 v-show="pauseKey === 5">2. 线上问题</h4>
+            <el-table
+              v-show="pauseKey === 5"
+              :data="[problemData]"
+              border
+              style="width: 100%"
+              size="mini"
+            >
+              <el-table-column
+                prop="totalCount"
+                label="问题总数"
+                width="170"
+                align="center"
+              />
+              <el-table-column
+                prop="name"
+                label="免提测上线数"
+                align="center"
+              >
+                <el-table-column
+                  prop="totalP0"
+                  label="P0"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+                <el-table-column
+                  prop="totalP1"
+                  label="P1"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+                <el-table-column
+                  prop="totalP2"
+                  label="P2"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+                <el-table-column
+                  prop="totalP3"
+                  label="P3"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+                <el-table-column
+                  prop="totalP4"
+                  label="P4"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+                <el-table-column
+                  prop="totalP5"
+                  label="P5"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+                <el-table-column
+                  prop="totalP6"
+                  label="P6"
+                  width="calc(10/7)%"
+                  align="center"
+                />
+              </el-table-column>
+            </el-table>
+            <el-table
+              v-show="pauseKey === 5"
+              :data="[problemData]"
+              border
+              style="width: 100%"
+              class="move-border-top"
+              size="mini"
+            >
+              <el-table-column
+                prop="handleDurationPercent"
+                label="线上问题处理完成率"
+                style="width:25%;"
+                align="center"
+              />
+              <el-table-column
+                prop="avgHandleDuration"
+                label="线上问题平均处理时长(H)"
+                style="width:25%;"
+                align="center"
+              />
+            </el-table>
+            <!-- 线下缺陷 客户端-->
+            <h4 v-show="pauseKey === 5">3. 线下缺陷</h4>
+            <el-table
+              v-show="pauseKey === 5"
+              :data="[DefeatData]"
+              border
+              style="width: 100%"
+              size="mini"
+            >
+              <el-table-column
+                label="提报bug数"
+                align="center"
+              >
+                <template slot-scope="scope"><a href="javascript:void(0)" style="color:#20a0ff" @click="toDefectView()">{{ scope.row.totalBugNum }}</a></template>
+              </el-table-column>
+              <el-table-column
+                prop="avgBugNum"
+                label="人均bug数"
+                align="center"
+              />
+              <el-table-column
+                prop="avgRepairTime"
+                label="bug平均修复时常"
+                width="120"
+                align="center"
+              />
+              <el-table-column
+                label="bug修复率"
+                align="center"
+              >
+                <template slot-scope="scope">{{ scope.row.avgRepairTime | toPercent }}</template>
+              </el-table-column>
+              <el-table-column
+                prop="totalP0"
+                label="P0"
+                width="55"
+                align="center"
+              />
+              <el-table-column
+                prop="totalP1"
+                label="P1"
+                width="55"
+                align="center"
+              />
+              <el-table-column
+                prop="totalP2"
+                label="P2"
+                width="55"
+                align="center"
+              />
+              <el-table-column
+                prop="totalOthers"
+                label="其他分级"
+                align="center"
+              />
+              <el-table-column
+                prop="reopenNum"
+                label="reopen"
+                align="center"
+              />
+              <el-table-column
+                prop="checkInTest"
+                label="提测"
+                width="55"
+                align="center"
+              />
+              <el-table-column
+                prop="checkInRepulse"
+                label="提测打回"
+                align="center"
+              />
+              <el-table-column
+                prop="stepOut"
+                label="准出"
+                width="55"
+                align="center"
+              />
+            </el-table>
+            <!-- 上线过程-->
             <el-table
               v-show="pauseKey !== 5"
               :data="[onlineProcess]"
@@ -298,7 +473,7 @@
                 align="center"
               />
               <el-table-column
-                prop="aveHandleDuration"
+                prop="avgHandleDuration"
                 label="线上问题平均处理时长(H)"
                 style="width:25%;"
                 align="center"
@@ -320,7 +495,7 @@
                 <template slot-scope="scope"><a href="javascript:void(0)" style="color:#20a0ff" @click="toDefectView()">{{ scope.row.totalBugNum }}</a></template>
               </el-table-column>
               <el-table-column
-                prop="avgBugs"
+                prop="avgBugNum"
                 label="人均bug数"
                 align="center"
               />
@@ -337,6 +512,7 @@
                 <template slot-scope="scope">{{ scope.row.avgRepairTime | toPercent }}</template>
               </el-table-column>
               <el-table-column
+                prop="totalP0"
                 label="P0"
                 width="55"
                 align="center"
@@ -542,7 +718,8 @@ export default {
           child: each.details.map(detail => ({
             ...detail,
             name: detail.osType,
-            id: each.name + detail.appKey + detail.osType
+            id: each.name + detail.appKey + detail.osType,
+            idForData: detail.id
           }))
         }))
         this.pauseTreeNode = this.dealWithBusinessDate[0].child[0] ? this.dealWithBusinessDate[0].child[0] : ''
@@ -556,17 +733,25 @@ export default {
     clientAfter() {
       this.guild = this.treeGuideClient(this.dealWithBusinessDate, this.pauseTreeNode.id).join('/')
       // const pretermitSearch = { appKey: 'f9a0bc6213db35deb155ff08bffa90a9', startTime: this.timeInterval[0], endTime: this.timeInterval[1] }
-      const pretermitSearch = { appKey: this.pauseTreeNode.appKey }
-      getHotpatch(pretermitSearch).then((res) => {
-        res.code === 0 ? this.clientOnline[0].clientOnlineCount = res.data : this.errorFun(res.msg)
+      const pretermitSearch = { appKey: this.pauseTreeNode.appKey, startTime: this.timeInterval[0], endTime: this.timeInterval[1] }
+      const pretermitSearchOthers = { id: this.pauseTreeNode.idForData, type: this.pauseTreeNode.type, startTime: this.timeInterval[0], endTime: this.timeInterval[1] }
+      // getHotpatch(pretermitSearch).then((res) => {
+      //   res.code === 0 ? this.clientOnline[0].clientOnlineCount = res.data : this.errorFun(res.msg)
+      //   this.loadingOnlineProcess = false
+      // })
+      axios.all([getHotpatch(pretermitSearch), getOnlineProblem(pretermitSearchOthers), getOnlineVitium(pretermitSearchOthers)]).then(axios.spread((resAllCount, resProblem, resDefeat) => {
+        resAllCount.code === 0 ? this.clientOnline[0].clientOnlineCount = resAllCount.data : this.errorFun(resAllCount.msg)
+        this.problemData = resProblem.code === 0 ? resProblem.data : ''
+        this.DefeatData = resDefeat.code === 0 ? resDefeat.data : ''
+        // Object.assign(this.onlineProcess, this.toPercent([this.onlineProcess.allRollbackPercent, this.onlineProcess.preLess5MinPercent, this.onlineProcess.preRollbackPercent, this.onlineProcess.rollbackPercent, this.onlineProcess.noTestPercent]))
         this.loadingOnlineProcess = false
-      })
+      }))
     },
     // 部门table数据不需要缺陷数据
     deleteAfter() {
       this.guild = this.treeGuide(this.dealWithBusinessDate, this.pauseTreeNode.id, this.pauseTreeNode.type).join('/')
       const pretermitSearch = { id: this.pauseTreeNode.id, type: this.pauseKey, startTime: this.timeInterval[0], endTime: this.timeInterval[1] }
-      axios.all([getOnlineAllCount(pretermitSearch), getOnlineProblem({ id: this.pauseTreeNode.id })]).then(axios.spread((resAllCount, resProblem) => {
+      axios.all([getOnlineAllCount(pretermitSearch), getOnlineProblem(pretermitSearch)]).then(axios.spread((resAllCount, resProblem) => {
         this.onlineProcess = resAllCount.code === 0 ? resAllCount.data : ''
         this.problemData = resProblem.code === 0 ? resProblem.data : ''
         // Object.assign(this.onlineProcess, this.toPercent([this.onlineProcess.allRollbackPercent, this.onlineProcess.preLess5MinPercent, this.onlineProcess.preRollbackPercent, this.onlineProcess.rollbackPercent, this.onlineProcess.noTestPercent]))
@@ -577,7 +762,7 @@ export default {
     allCountAndProlemGet() {
       this.guild = this.treeGuide(this.dealWithBusinessDate, this.pauseTreeNode.id, this.pauseTreeNode.type).join('/')
       const pretermitSearch = { id: this.pauseTreeNode.id, type: this.pauseKey, startTime: this.timeInterval[0], endTime: this.timeInterval[1] }
-      axios.all([getOnlineAllCount(pretermitSearch), getOnlineProblem({ id: this.pauseTreeNode.id }), getOnlineVitium(pretermitSearch)]).then(axios.spread((resAllCount, resProblem, resDefeat) => {
+      axios.all([getOnlineAllCount(pretermitSearch), getOnlineProblem(pretermitSearch), getOnlineVitium(pretermitSearch)]).then(axios.spread((resAllCount, resProblem, resDefeat) => {
         this.onlineProcess = resAllCount.code === 0 ? resAllCount.data : ''
         this.problemData = resProblem.code === 0 ? resProblem.data : ''
         this.DefeatData = resDefeat.code === 0 ? resDefeat.data : ''
@@ -645,7 +830,7 @@ export default {
       const { href } = this.$router.resolve({
         name: '热修复过程',
         query: {
-          appKey: this.pauseTreeNode.appKey
+          appKey: this.pauseTreeNode.appKey, startTime: this.timeInterval[0], endTime: this.timeInterval[1]
         }
       })
       window.open(href, '_blank')
@@ -769,6 +954,7 @@ export default {
       width 72px
     .aside
       width 12.9% !important
+      overflow-x scroll
       margin 0 0 2% 1.5%
       background-color white
       border-radius 7px
@@ -801,9 +987,18 @@ export default {
       font-size 12px
       padding 0
     .aside >>> .el-tree-node__content .el-tree-node__label
-      font-size 13px
+      font-size 14px
     .aside >>> .el-tree-node__children .el-tree-node__label
-      font-size 12px
+      font-size 13px
+    .aside >>> .el-tree-node__children
+      opacity 0.8
+    .aside >>> .el-tree-node__expand-icon
+      font-size 14px
+      color black
+      opacity 0.6
+    .aside >>> .el-tree-node__expand-icon.is-leaf
+      color transparent !important
+      cursor default !important
     // .aside >>> .el-tree-node__children
     //   overflow auto
 </style>

+ 167 - 142
src/views/virtualDevices/HMvehicle.vue

@@ -1,123 +1,127 @@
 <template>
-  <div id="init-window" style="position:relative">
-    <router-view />
-    <div style="position: absolute;width: 100%;">
-      <div class="set-background">
-        <div class="block">
-          <el-form :model="queryCode">
-            <div class="set-between">
-              <div class="special-input">
-                <el-input v-model="queryCode.vehicleId" placeholder="车辆ID" clearable />
-                <el-input v-model="queryCode.ecuId" placeholder="ECUID" clearable />
-                <el-input v-model="queryCode.vehicleVersion" placeholder="车辆类型" clearable />
-              </div>
-              <div class="special-input-chose">
-                <el-select v-model="queryCode.lockStatus" placeholder="锁状态" clearable>
-                  <el-option v-for="item in lockOptions" :key="item.lockStatus" :label="item.name" :value="item.lockStatus" />
-                </el-select>
-                <el-select v-model="queryCode.isActive" placeholder="链接状态" clearable>
-                  <el-option v-for="item in linkOptions" :key="item.isActive" :label="item.name" :value="item.isActive" />
-                </el-select>
-                <el-select v-model="queryCode.cityName" filterable placeholder="城市" clearable>
-                  <el-option
-                    v-for="item in city"
-                    :key="item.CityID"
-                    :label="item.name"
-                    :value="item.name"
-                  />
-                </el-select>
-              </div>
+  <div style="width: 100%;">
+    <div class="set-background">
+      <div class="block">
+        <el-form :model="queryCode">
+          <div class="set-between">
+            <div class="special-input">
+              <el-input v-model="queryCode.vehicleId" size="medium" placeholder="车辆ID" clearable />
+              <el-input v-model="queryCode.ecuId" size="medium" placeholder="ECUID" clearable />
+              <el-input v-model="queryCode.vehicleVersion" size="medium" placeholder="车辆类型" clearable />
             </div>
-            <div class="set-between">
-              <el-button type="primary" plain @click="dataQuery(queryCode)">搜索</el-button>
-              <el-button type="primary" plain @click="createdCode()">新增</el-button>
+            <div class="special-input-chose">
+              <el-select v-model="queryCode.lockStatus" size="medium" placeholder="锁状态" clearable>
+                <el-option v-for="item in lockOptions" :key="item.lockStatusCode" :label="item.name" :value="item.lockStatusCode" />
+              </el-select>
+              <el-select v-model="queryCode.isActive" size="medium" placeholder="链接状态" clearable>
+                <el-option v-for="item in linkOptions" :key="item.isActiveCode" :label="item.name" :value="item.isActiveCode" />
+              </el-select>
+              <el-select v-model="queryCode.cityName" size="medium" filterable placeholder="城市" clearable>
+                <el-option
+                  v-for="item in city"
+                  :key="item.CityID"
+                  :label="item.name"
+                  :value="item.name"
+                />
+              </el-select>
             </div>
-          </el-form>
-          <div class="set-locate">
-            <el-table
-              v-loading="loading"
-              :data="tableData"
-              border
-              style="width: 100%"
-              size="mini"
+          </div>
+          <div class="set-between">
+            <el-button type="primary" size="medium" plain @click="dataQuery(queryCode)">搜索</el-button>
+            <el-button type="primary" size="medium" plain @click="createdCode()">新增</el-button>
+            <el-button type="primary" size="medium" plain @click="oneKeyCreate()">一键创建</el-button>
+          </div>
+        </el-form>
+        <div class="set-locate">
+          <el-table
+            v-loading="loading"
+            :data="tableData"
+            border
+            style="width: 100%"
+            size="mini"
+          >
+            <el-table-column
+              prop="vehicleId"
+              label="车辆ID"
+              align="center"
+              width="95"
+            />
+            <el-table-column
+              prop="ecuId"
+              label="ECUID"
+              align="center"
+            />
+            <el-table-column
+              prop="vehicleVersion"
+              label="车辆类型"
+              align="center"
+              width="70"
+            />
+            <el-table-column
+              label="链接状态"
+              align="center"
+              width="80"
+            >
+              <template slot-scope="scope">
+                <el-tag
+                  :type="scope.row.isActive === 1 ? 'success' : 'danger'"
+                  disable-transitions
+                >{{ scope.row.isActive | toActiveStatus }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="锁状态"
+              align="center"
+              width="80"
+            >
+              <template slot-scope="scope">
+                <el-tag
+                  :type="scope.row.lockStatus === 1 ? 'success' : 'danger'"
+                  disable-transitions
+                >{{ scope.row.lockStatus | toLockStatus }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="cityName"
+              label="城市"
+              align="center"
+              width="70"
+            />
+            <el-table-column
+              label="激活时间"
+              align="center"
             >
-              <el-table-column
-                prop="vehicleId"
-                label="车辆ID"
-                align="center"
-                width="95"
-              />
-              <el-table-column
-                prop="vehicleVersion"
-                label="车辆类型"
-                align="center"
-                width="70"
-              />
-              <el-table-column
-                prop="ecuId"
-                label="ECUID"
-                align="center"
-              />
-              <el-table-column
-                label="锁状态"
-                align="center"
-                width="80"
-              >
-                <template slot-scope="scope">
-                  <el-tag
-                    :type="scope.row.lockStatus === 1 ? 'success' : 'danger'"
-                    disable-transitions
-                  >{{ scope.row.lockStatus | toLockStatus }}</el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="链接状态"
-                align="center"
-                width="80"
-              >
-                <template slot-scope="scope">
-                  <el-tag
-                    :type="scope.row.isActive === 1 ? 'success' : 'danger'"
-                    disable-transitions
-                  >{{ scope.row.isActive | toActiveStatus }}</el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="激活时间"
-                align="center"
-              >
-                <template slot-scope="scope">{{ scope.row.gmtActive | toData }}</template>
-              </el-table-column>
-              <el-table-column
-                label="操作"
-                align="center"
-                width="300"
-              >
-                <template slot-scope="scope">
-                  <div class="specail-lock">
-                    <div :class="{ 'el-icon-lock': scope.row.lockStatus === 0 ,'el-icon-unlock': scope.row.lockStatus === 1}" @click="updateLock(scope.row.ecuId, scope.row.lockStatus)" />
-                    <div>
-                      <el-button size="mini" type="success" plain @click="activate(scope.row.ecuId, scope.row.vehicleId, 'BAT0118022210043', scope.row.imsi, scope.row.imei, scope.row.vehicleVersion, scope.row.cityName)">激活</el-button>
-                      <el-button size="mini" type="info" plain @click="offHmvirtual(scope.row.ecuId)">下线</el-button>
-                      <el-button size="mini" type="danger" @click="dialogBug(scope.row.ecuId)">删除</el-button>
-                      <el-dialog
-                        :visible.sync="dialogVisible"
-                        width="30%"
-                      >
-                        <span>确定要删除这条车辆信息吗</span>
-                        <span slot="footer" class="dialog-footer">
-                          <el-button type="primary" size="mini" @click="delHmVirtual()">确 定</el-button>
-                          <el-button type="danger" size="mini" @click="dialogVisible = false">取 消</el-button>
-                        </span>
-                      </el-dialog>
-                      <el-button size="mini" type="primary">...</el-button>
-                    </div>
+              <template slot-scope="scope">{{ scope.row.gmtActive | toData }}</template>
+            </el-table-column>
+            <el-table-column
+              label="操作"
+              align="center"
+              width="350"
+            >
+              <template slot-scope="scope">
+                <div class="specail-lock">
+                  <div :class="{ 'el-icon-lock': scope.row.lockStatus === 0 ,'el-icon-unlock': scope.row.lockStatus === 1}" @click="updateLock(scope.row.ecuId, scope.row.lockStatus, scope.row.isActive)" />
+                  <div>
+                    <el-button size="mini" type="success" plain @click="activate(scope.row.ecuId)">激活</el-button>
+                    <el-button size="mini" type="info" plain @click="offHmvirtual(scope.row.ecuId)">下线</el-button>
+                    <el-button size="mini" type="danger" @click="dialogBug(scope.row.ecuId)">删除</el-button>
+                    <el-button size="mini" type="primary">....</el-button>
+                    <el-dialog
+                      :visible.sync="dialogVisible"
+                      width="30%"
+                    >
+                      <span>确定要删除这条车辆信息吗</span>
+                      <span slot="footer" class="dialog-footer">
+                        <el-button type="primary" size="mini" @click="delHmVirtual()">确 定</el-button>
+                        <el-button type="danger" size="mini" @click="dialogVisible = false">取 消</el-button>
+                      </span>
+                    </el-dialog>
                   </div>
-                </template>
-              </el-table-column>
-            </el-table>
-            <el-pagination background style="margin-top:30px;" align="center" :current-page="curIndex" :page-size="pageSize" layout="prev, pager, next" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
-          </div>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination background style="margin-top:30px;" align="center" :current-page="curIndex" :page-size="pageSize" layout="prev, pager, next" :total="total" @current-change="handleCurrentChange" />
         </div>
       </div>
     </div>
@@ -126,7 +130,7 @@
 
 <script>
 import { cityJson } from '@/views/virtualDevices/city'
-import { createHmVirtualDevice, queryDeviceInfo, delHmVirtualDevice, offHmvirtualDevice, updateLockStatus } from '@/api/HMvehicle'
+import { createHmVirtualDevice, queryDeviceInfo, delHmVirtualDevice, offHmvirtualDevice, updateLockStatus, activeHmVirtualDevice } from '@/api/HMvehicle'
 
 export default {
   filters: {
@@ -158,21 +162,21 @@ export default {
       lockOptions: [
         {
           name: '未开启',
-          lockStatus: 0
+          lockStatusCode: 0
         },
         {
           name: '已开启',
-          lockStatus: 1
+          lockStatusCode: 1
         }
       ],
       linkOptions: [
         {
           name: '未激活',
-          isActive: 0
+          isActiveCode: 0
         },
         {
           name: '已激活',
-          isActive: 1
+          isActiveCode: 1
         }
       ]
     }
@@ -181,49 +185,70 @@ export default {
     this._queryDeviceInfo()
   },
   mounted() {
-    this.initWindow()
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
   },
   methods: {
     _queryDeviceInfo() {
       const params = { page: this.curIndex, pageSize: this.pageSize }
       queryDeviceInfo(params).then(res => {
-        res.code === 200 ? this.tableData = res.data : this.errorFun(res.msg)
+        res.code === 200 ? this.tableData = res.data.ebikeInfos : this.errorFun(res.msg)
+        this.total = res.data.total
         this.loading = false
       })
     },
-    initWindow() {
-      if (!document.getElementById('window-judge')) {
-        document.getElementById('init-window').parentNode.style.overflow = 'visible'
-      } else {
-        document.getElementById('init-window').parentNode.style.overflow = 'hidden'
+    dataQuery(queryCode) {
+      queryCode.page = 1
+      this.curIndex = 1
+      queryCode.pageSize = this.pageSize
+      for (const key in queryCode) { // 接口不接受空值的处理
+        if (queryCode[key] === '') {
+          delete queryCode[key]
+        }
       }
+      queryDeviceInfo(queryCode).then(res => {
+        res.code === 200 ? this.tableData = res.data.ebikeInfos : this.errorFun(res.msg)
+        this.total = res.data.total
+      })
     },
-    dataQuery(queryCode) {
+    dataIndexChoose(queryCode) {
       queryCode.page = this.curIndex
       queryCode.pageSize = this.pageSize
       for (const key in queryCode) { // 接口不接受空值的处理
-        if (!queryCode[key]) {
+        if (queryCode[key] === '') {
           delete queryCode[key]
         }
       }
       queryDeviceInfo(queryCode).then(res => {
-        res.code === 200 ? this.tableData = res.data : this.errorFun(res.msg)
+        res.code === 200 ? this.tableData = res.data.ebikeInfos : this.errorFun(res.msg)
+        this.total = res.data.total
+      })
+    },
+    oneKeyCreate() {
+      createHmVirtualDevice(this.form).then(res => {
+        if (res.code === 200) {
+          this.successFun('create')
+          this._queryDeviceInfo()
+        } else {
+          this.errorFun(res.msg)
+        }
       })
     },
     createdCode() {
       this.$router.push({ name: '新增电单车', params: { formData: this.form }, query: { id: this.form.id }})
     },
-    handleSizeChange(size) {
-      this.pageSize = size
-    },
     handleCurrentChange(curIndex) {
       this.curIndex = curIndex
+      this.dataIndexChoose(this.queryCode)
     },
-    updateLock(ecuId, lockStatus) {
+    updateLock(ecuId, lockStatus, judge) {
+      if (judge !== 1) {
+        this.errorFun('请先激活设备')
+        return
+      }
       const params = { ecuId: ecuId, lockStatus: (lockStatus + 1) % 2 }
       updateLockStatus(params).then(res => {
         this._queryDeviceInfo()
-        if (res.success === 1) {
+        if (res.code === 200) {
           this.successFun('update')
           // this._queryDeviceInfo()
         } else {
@@ -231,12 +256,14 @@ export default {
         }
       })
     },
-    activate(ecuId, vehicleId, batteryId, imsi, imei, vehicleVersion, cityName) {
-      const params = { ecuId: ecuId, vehicleId: vehicleId, batteryId: batteryId, imsi: imsi, imei: imei, vehicleVersion: vehicleVersion, cityName: cityName }
-      createHmVirtualDevice(params).then(res => {
+    activate(ecuId) {
+      const params = { ecuId: ecuId }
+      activeHmVirtualDevice(params).then(res => {
         if (res.code === 200) {
           this.successFun('activate')
-          this._queryDeviceInfo()
+          setTimeout(() => {
+            this._queryDeviceInfo()
+          }, 500)
         } else {
           this.errorFun(res.msg)
         }
@@ -285,7 +312,7 @@ export default {
     background-color #F2F3F6
     display flex
     justify-content center
-    min-width 1000px
+    min-width 1200px
     .block
       background-color rgba(255,255,255,1)
       box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
@@ -309,8 +336,6 @@ export default {
       background-color #F0F2F4 !important
     .set-between
       display flex
-    .set-between >>> .el-button
-      height 40px
     .set-locate
       margin-top 40px
       .specail-lock

+ 158 - 68
src/views/virtualDevices/HMvehicleCreate.vue

@@ -1,32 +1,31 @@
 <template>
-  <div id="window-judge" class="set-background">
-    <div class="block">
-      <el-form ref="form" :model="form" :rules="serviceDataRules">
+  <div class="set-background">
+    <el-form ref="form" :model="form" hide-required-asterisk :rules="serviceDataRules">
+      <div class="block">
         <el-form-item label="Eculd" prop="ecuId" :label-width="formLabelWidth">
-          <el-input v-model="form.ecuId" style="width: 35%;" autocomplete="off" />
-          <div class="tip"><p>以VIR开头拼接13位数字 , 示例 : VIR0419070800454</p></div>
+          <el-input v-model="form.ecuId" style="width: 35%;" autocomplete="off" placeholder="硬件中控ID" />
+          <div class="tip"><p>13位数字 , 示例 : ECA0419070800454</p></div>
         </el-form-item>
         <el-form-item label="BatteryId" prop="batteryId" :label-width="formLabelWidth">
-          <el-input v-model="form.batteryId" style="width: 35%;" autocomplete="off" />
-          <div class="tip"><p>以BAA开头拼接13位数字 , 示例 : BAA3218101509005</p></div>
+          <el-input v-model="form.batteryId" style="width: 35%;" autocomplete="off" placeholder="电池ID" />
+          <div class="tip"><p>13位数字 , 示例 : BAA3218101509005</p></div>
         </el-form-item>
         <el-form-item label="VehicleId" prop="vehicleId" :label-width="formLabelWidth">
-          <el-input v-model="form.vehicleId" style="width: 35%;" autocomplete="off" />
-          <div class="tip"><p>以9开头的8位数字 , 示例 : 92264605</p></div>
+          <el-input v-model="form.vehicleId" style="width: 35%;" autocomplete="off" placeholder="车辆ID" />
+          <div class="tip"><p>8位数字 , 示例 : 92264605</p></div>
         </el-form-item>
         <el-form-item label="Imei" prop="imei" :label-width="formLabelWidth">
-          <el-input v-model="form.imei" style="width: 35%;" autocomplete="off" />
-          <div class="tip"><p>以9开头的15位数字 , 示例 : 967047046635466</p></div>
+          <el-input v-model="form.imei" style="width: 35%;" autocomplete="off" placeholder="终端IMEI码" />
+          <div class="tip"><p>15位数字 , 示例 : 967047046635466</p></div>
         </el-form-item>
         <el-form-item label="Imsi" prop="imsi" :label-width="formLabelWidth">
-          <el-input v-model="form.imsi" style="width: 35%;" autocomplete="off" />
-          <div class="tip"><p>以9开头的15位数字 , 示例 : 960046550508466</p></div>
-        </el-form-item>
-        <el-form-item label="VehicleVersion" prop="vehicleVersion" :label-width="formLabelWidth">
-          <el-input v-model="form.vehicleVersion" style="width: 35%;" autocomplete="off" />
+          <el-input v-model="form.imsi" style="width: 35%;" autocomplete="off" placeholder="终端IMSI码" />
+          <div class="tip"><p>15位数字 , 示例 : 960046550508466</p></div>
         </el-form-item>
+      </div>
+      <div class="block">
         <el-form-item label="City" prop="cityName" :label-width="formLabelWidth">
-          <el-select v-model="form.cityName" filterable placeholder="请选择">
+          <el-select v-model="form.cityName" style="width: 35%;" filterable clearable placeholder="请选择城市">
             <el-option
               v-for="item in city"
               :key="item.CityID"
@@ -35,12 +34,36 @@
             />
           </el-select>
         </el-form-item>
+        <el-form-item label="Lat" prop="lat" :label-width="formLabelWidth">
+          <el-input v-model="form.lat" style="width: 35%;" autocomplete="off" placeholder="纬度" />
+          <div class="tip"><p>保留15位小数 , 示例 : 30.290707717493753</p></div>
+        </el-form-item>
+        <el-form-item label="Lng" prop="lng" :label-width="formLabelWidth">
+          <el-input v-model="form.lng" style="width: 35%;" autocomplete="off" placeholder="经度" />
+          <div class="tip"><p>保留15位小数 , 示例 : 120.07451533496764</p></div>
+        </el-form-item>
+      </div>
+      <div class="block">
+        <el-form-item label="VehicleVersion" :label-width="formLabelWidth">
+          <el-input v-model="form.vehicleVersion" style="width: 35%;" autocomplete="off" placeholder="整车版本" />
+          <div class="tip"><p>H1、H2等等,默认给H1</p></div>
+        </el-form-item>
+        <el-form-item label="VehicleStatus" :label-width="formLabelWidth">
+          <el-input v-model="form.vehicleStatus" style="width: 35%;" autocomplete="off" placeholder="车辆状态" />
+          <div class="tip"><p>默认给0,0-正常;1-故障;2-高危不可用;10-低危;11-高危可用</p></div>
+        </el-form-item>
+        <el-form-item label="OperationStatus" :label-width="formLabelWidth">
+          <el-input v-model="form.operationStatus" style="width: 35%;" autocomplete="off" placeholder="运营状态" />
+          <el-tooltip effect="dark" content="默认给100,100:运营中; 200:待运营-出厂; 201:待运营-库存; 202:待运营-移库; 301:停运-调度中; 304:停运-没收; 306:停运-已返厂; 307:停运-在库; 400:退出运营-报废" placement="top">
+            <div class="tip"><p>默认给100,100:运营中; 200:待运营-出厂; 201:待运营-库存 ...</p></div>
+          </el-tooltip>
+        </el-form-item>
         <el-form-item class="submit">
-          <el-button size="mini" type="primary" @click="createFormData(form)">保 存</el-button>
+          <el-button size="mini" type="primary" @click="createFormData(form)">确 认</el-button>
           <el-button size="mini" type="danger" @click="$router.go(-1)">取 消</el-button>
         </el-form-item>
-      </el-form>
-    </div>
+      </div>
+    </el-form>
   </div>
 </template>
 
@@ -100,32 +123,97 @@ export default {
         'lng': 117.26081489617174
       },
       serviceDataRules: {
-        imei: [{ required: true, message: '终端IMEI码必须为十五位', trigger: 'change' }],
-        ecuId: [{ required: true, message: '硬件中控ID不能为空', trigger: 'change' }],
-        vehicleId: [{ required: true, message: '车辆ID不能为空', trigger: 'change' }],
-        imsi: [{ required: true, message: '终端IMSI码不能为空', trigger: 'change' }],
-        batteryId: [{ required: true, message: '电池ID不能为空', trigger: 'change' }],
-        vehicleVersion: [{ required: true, message: '整车版本不能为空', trigger: 'change' }],
-        cityName: [{ required: true, message: '城市名称不能为空', trigger: 'change' }]
+        imei: [{ required: true, message: '终端IMEI码必须为十五位', trigger: 'blur' }],
+        ecuId: [{ required: true, message: '硬件中控ID不能为空', trigger: 'blur' }],
+        vehicleId: [{ required: true, message: '车辆ID不能为空', trigger: 'blur' }],
+        imsi: [{ required: true, message: '终端IMSI码不能为空', trigger: 'blur' }],
+        batteryId: [{ required: true, message: '电池ID不能为空', trigger: 'blur' }],
+        cityName: [{ required: true, message: '城市名称不能为空', trigger: 'blur' }],
+        lat: [{ required: true, message: '纬度不能为空', trigger: 'blur' }],
+        lng: [{ required: true, message: '经度不能为空', trigger: 'blur' }]
       }
     }
   },
+  mounted() {
+    document.getElementsByClassName('app-main')[0].style.cssText = 'overflow:auto'
+  },
   methods: {
     // 提交表单并且返回刷新
     createFormData(form) {
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          form.hmVehicleBaseInfo = this.hmVehicleBaseInfo
-          form.hmVehicleBaseStationInfo = this.hmVehicleBaseStationInfo
-          form.hmVehicleGpsInfo = this.hmVehicleGpsInfo
-          createHmVirtualDevice(form).then(res => {
-            if (res.code === 200) {
-              this.successFun('create')
-              this.$router.go(-1)
-            } else {
-              this.errorFun('create')
-            }
+      if (!this.form.cityName && !this.form.lat && !this.form.lng && (this.form.ecuId || this.form.batteryId || this.form.imei || this.form.imsi || this.form.vehicleId)) {
+        console.log(1)
+        const fieldsToValidate = ['ecuId', 'batteryId', 'imei', 'imsi', 'vehicleId']
+        const _self = this
+        Promise.all(fieldsToValidate.map(item => {
+          const p = new Promise(function(resolve, reject) {
+            _self.$refs.form.validateField(item, (error) => {
+              resolve(error)
+            })
           })
+          return p
+        })).then((data) => {
+          if (JSON.stringify(data) === '["","","","",""]') {
+            this.oneKeyCreate()
+          } else {
+            this.errorFun('还有未填写的数据')
+          }
+        // data 里是各个字段的验证错误信息, 如果为空串则认为验证通过, 如果数组里全为空串则所有验证通过
+        // 判断data 里是否全是空串
+        })
+        return
+      } else if (!this.form.ecuId && !this.form.batteryId && !this.form.imei && !this.form.imsi && !this.form.vehicleId && (this.form.cityName || this.form.lat || this.form.lng)) {
+        console.log(2)
+        const fieldsToValidate = ['cityName', 'lat', 'lng']
+        const _self = this
+        Promise.all(fieldsToValidate.map(item => {
+          const p = new Promise(function(resolve, reject) {
+            _self.$refs.form.validateField(item, (error) => {
+              resolve(error)
+            })
+          })
+          return p
+        })).then((data) => {
+          if (JSON.stringify(data) === '["","",""]') {
+            this.oneKeyCreate()
+          } else {
+            this.errorFun('还有未填写的数据')
+          }
+        // data 里是各个字段的验证错误信息, 如果为空串则认为验证通过, 如果数组里全为空串则所有验证通过
+        // 判断data 里是否全是空串
+        })
+        return
+      } else if ((this.form.ecuId || this.form.batteryId || this.form.imei || this.form.imsi || this.form.vehicleId) && (this.form.cityName || this.form.lat || this.form.lng)) {
+        console.log(3)
+        const fieldsToValidate = ['ecuId', 'batteryId', 'imei', 'imsi', 'vehicleId', 'cityName', 'lat', 'lng']
+        const _self = this
+        Promise.all(fieldsToValidate.map(item => {
+          const p = new Promise(function(resolve, reject) {
+            _self.$refs.form.validateField(item, (error) => {
+              resolve(error)
+            })
+          })
+          return p
+        })).then((data) => {
+          if (JSON.stringify(data) === '["","","","","","","",""]') {
+            this.oneKeyCreate()
+          } else {
+            this.errorFun('还有未填写的数据')
+          }
+        // data 里是各个字段的验证错误信息, 如果为空串则认为验证通过, 如果数组里全为空串则所有验证通过
+        // 判断data 里是否全是空串
+        })
+        return
+      } else {
+        this.oneKeyCreate()
+      }
+    },
+    oneKeyCreate() {
+      createHmVirtualDevice(this.form).then(res => {
+        if (res.code === 200) {
+          this.successFun('create')
+          this.$router.go(-1)
+        } else {
+          this.errorFun(res.msg)
         }
       })
     },
@@ -133,7 +221,7 @@ export default {
       this.$notify({ title: 'Success', message: `${successText} Successfully`, type: 'success', duration: 2000 })
     },
     errorFun(errorText) {
-      this.$notify({ title: 'Failed', message: `${errorText} Failed`, type: 'error', duration: 2000 })
+      this.$notify({ title: 'Failed', message: errorText, type: 'error', duration: 2000 })
     }
   }
 }
@@ -145,32 +233,34 @@ export default {
     display flex
     justify-content center
     min-width 700px
-    .block
-      background-color rgba(255,255,255,1)
-      box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
-      border-radius 7px
-      width 93%
-      margin 25px 0
-      padding 60px
-      min-height calc(100vh - 100px)
-    .block >>> .el-form-item__label
-      display flex
-    .block >>> .el-form-item__content
-      display flex
-    .tip
-      width 60%
-      position relative
-      text-align center
-    .tip p
-      position absolute
-      bottom 0px
-      padding 0px
-      margin 0px
-      color grey
-      height 30px
-      margin-left 15px
-    .submit
-      display flex
-      flex-direction row-reverse
-      // margin-top 60px
+  .set-background >>> .el-form
+    width 100%
+    overflow auto
+  .block
+    background-color rgba(255,255,255,1)
+    box-shadow 0px 0px 11px 0px rgba(238,240,245,1)
+    border-radius 7px
+    width 96%
+    margin 20px auto
+    padding 29px 50px
+  .block >>> .el-form-item__label
+    display flex
+  .block >>> .el-form-item__content
+    display flex
+  .tip
+    width 60%
+    position relative
+    text-align center
+  .tip p
+    position absolute
+    bottom 0px
+    padding 0px
+    margin 0px
+    color grey
+    height 30px
+    margin-left 15px
+  .submit
+    display flex
+    flex-direction row-reverse
+    // margin-top 60px
 </style>