Browse Source

数据回放、分析页面

Rmengdi 1 năm trước cách đây
mục cha
commit
7249aadbd3

+ 14 - 0
PHM-web/src/router/index.js

@@ -134,6 +134,20 @@ export const dynamicRoutes = [
       }
     ]
   },
+  {
+    path: '/manage',
+    component: Layout,
+    hidden: true,
+    permissions: ['manage:enhancedFaultDiagnosis'],
+    children: [
+      {
+        path: 'faultAnalysis/:info',
+        component: () => import('@/views/manage/faultAnalysis'),
+        name: 'faultAnalysis',
+        meta: { title: '故障分析', activeMenu: '' }
+      }
+    ]
+  },
   {
     path: '/system/dict-data',
     component: Layout,

+ 38 - 0
PHM-web/src/views/manage/diagnosisResultDetail/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div class="resultDetail">
+    <el-descriptions title="诊断结果详情" class="info">
+      <el-descriptions-item label="模型名称">虚警抑制</el-descriptions-item>
+      <el-descriptions-item label="架次号">FM111</el-descriptions-item>
+      <el-descriptions-item label="步长数据">步长</el-descriptions-item>
+      <el-descriptions-item
+        label="诊断结果">这是诊断结果结果结果结果这是诊断结果结果结果结果这是诊断结果结果结果结果这是诊断结果结果结果结果这是诊断结果结果结果结果</el-descriptions-item>
+    </el-descriptions>
+    <el-input type="textarea" :rows="3" placeholder="请输入批注" v-model="textarea" ></el-input>
+    
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'diagnosisResultDetail',
+  data(){
+    return{
+      //批注内容
+      textarea:''
+    }
+  }
+}
+</script>
+
+<style scoped>
+.resultDetail {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding-top: 20px;
+}
+.info {
+  width: 1000px;
+}
+</style>

+ 139 - 0
PHM-web/src/views/manage/faultAnalysis/index.vue

@@ -0,0 +1,139 @@
+<template>
+  <div class="app-container" id="box">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="模型" prop="model">
+        <el-select v-model="queryParams.model" placeholder="请选择模型" style="width:100%" :disabled="disabled">
+          <el-option v-for="item in modelOptions" :key="item.value" :label="item.label" :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="架次" prop="sortie">
+        <el-select v-model="queryParams.sortie" placeholder="请选择架次" style="width:100%">
+          <el-option v-for="item in sortieOptions" :key="item.value" :label="item.label" :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="步长" prop="step">
+        <el-select v-model="queryParams.step" placeholder="请选择模型" style="width:100%">
+          <el-option v-for="item in stepOptions" :key="item.value" :label="item.label" :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery" :disabled='btnIsDisabled'>开始分析</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div  v-if="isShow" class="ProgressBar">
+      <el-progress type="circle" :percentage="percentage" :color="colors"></el-progress>
+      <p>{{tipText}}</p>
+    </div>
+    <div  v-if='resultShow' class="result">
+      <ResultDetail/>
+    </div>
+  </div>
+</template>
+
+<script>
+import ResultDetail from '@/views/manage/diagnosisResultDetail'
+export default {
+  name: 'faultAnalysis',
+  components:{ ResultDetail },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示分析条件
+      showSearch: true,
+      //分析参数
+      queryParams: {
+        model: null,
+        sortie: null,
+        step: null,
+      },
+      //
+      //模型选择器数据
+      modelOptions: [],
+      //架次选择器信息
+      sortieOptions: [],
+      //步长选择
+      stepOptions: [],
+      //选择框是否禁用
+      disabled: true,
+      //
+      percentage: 10,
+      colors: [
+        { color: '#f56c6c', percentage: 20 },
+        { color: '#e6a23c', percentage: 40 },
+        { color: '#5cb87a', percentage: 60 },
+        { color: '#1989fa', percentage: 80 },
+        { color: '#6f7ad3', percentage: 100 },
+      ],
+      //进度条显示
+      isShow:false,
+      //分析按钮的禁用
+      btnIsDisabled:false,
+      //进度条提示信息
+      tipText:"分析中...",
+      //结果显示
+      resultShow:false
+    }
+  },
+  created() {
+    this.isDisabled()
+  },
+  methods: {
+    //判断选择框是否禁用
+    isDisabled() {
+      if (this.$route.params.info === '000') {
+        this.disabled = false
+      }
+    },
+    /** 分析按钮操作 */
+    handleQuery() {
+      this.isShow=true;
+      this.btnIsDisabled=true;
+      var timer=setInterval(() => {
+        this.percentage += 1
+        if(this.percentage == 90){
+          clearInterval(timer);
+        }
+        if(200==200){
+          this.percentage=100
+          clearInterval(timer);
+          this.btnIsDisabled=false;
+          this.tipText='分析成功,正在生成分析结果'
+          setTimeout(()=>{
+            this.isShow=false;
+            this.resultShow=true
+          },1000)
+        }
+      }, 200)
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+  },
+}
+</script>
+
+<style scoped>
+#box{
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.ProgressBar{
+  width: 300px;
+  height: 250px;
+  margin-top: 50px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+</style>

+ 15 - 1
PHM-web/src/views/manage/faultAnalyzeResult/index.vue

@@ -75,6 +75,16 @@
           v-hasPermi="['manage:faultAnalyzeResult:export']"
         >导出</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="faultAnalyze"
+          v-hasPermi="['manage:faultAnalyzeResult:export']"
+        >自定义分析</el-button>
+      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -168,7 +178,6 @@ export default {
         moduleType: null,
         analyzeInfo: null,
         comment: null,
-         
       },
       // 表单参数
       form: {},
@@ -277,6 +286,11 @@ export default {
       this.download('manage/faultAnalyzeResult/export', {
         ...this.queryParams
       }, `faultAnalyzeResult_${new Date().getTime()}.xlsx`)
+    },
+    //跳转到故障分析页面
+    faultAnalyze(){
+      const info = '000';//是000的时候就是自定义分析
+      this.$router.push('/manage/faultAnalysis/' + info);
     }
   }
 };

+ 98 - 122
PHM-web/src/views/manage/sortie/dataPlayBack.vue

@@ -1,59 +1,25 @@
 <template>
   <div class="box">
     <h3>架次信息的监控数据和故障监测</h3>
-    <el-form
-      :model="queryParams"
-      ref="queryForm"
-      size="small"
-      :inline="true"
-      v-show="showSearch"
-      label-width="68px"
-    >
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="回放速度">
-        <el-select
-          v-model="speed"
-          placeholder="请选择回放速度"
-          @change="changeSpeed"
-        >
-          <el-option
-            v-for="item in speedOption"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          ></el-option>
+        <el-select v-model="speed" placeholder="请选择回放速度" @change="changeSpeed">
+          <el-option v-for="item in speedOption" :key="item.value" :label="item.label" :value="item.value"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="开始时间" prop="startTime">
-        <el-date-picker
-          clearable
-          v-model="queryParams.startTime"
-          type="datetime"
-          value-format="yyyy-MM-dd HH:mm:ss"
-          placeholder="请选择开始时间"
-        >
+        <el-date-picker clearable v-model="queryParams.startTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="请选择开始时间">
         </el-date-picker>
       </el-form-item>
       <el-form-item label="结束时间" prop="endTime">
-        <el-date-picker
-          clearable
-          v-model="queryParams.endTime"
-          type="datetime"
-          value-format="yyyy-MM-dd HH:mm:ss"
-          placeholder="请选择结束时间"
-        >
+        <el-date-picker clearable v-model="queryParams.endTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="请选择结束时间">
         </el-date-picker>
       </el-form-item>
       <el-form-item>
-        <el-button
-          type="primary"
-          icon="el-icon-search"
-          size="mini"
-          @click="handleQuery"
-          >搜索</el-button
-        >
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
     <div id="main"></div>
@@ -61,22 +27,23 @@
 </template>
 
 <script>
-import * as echarts from "echarts";
+import * as echarts from 'echarts'
+import { mapMutations } from 'vuex'
 export default {
-  name: "dataPlayBack",
+  name: 'dataPlayBack',
   data() {
     return {
       //eCharts
-      myChart: "",
+      myChart: '',
       //回放速度
       speed: 2000,
       //回放速度的选择器
       speedOption: [
-        { label: "X0.25", value: 8000 },
-        { label: "X0.5", value: 4000 },
-        { label: "X1.0", value: 2000 },
-        { label: "X1.5", value: 1500 },
-        { label: "X2.0", value: 1000 },
+        { label: 'X0.25', value: 8000 },
+        { label: 'X0.5', value: 4000 },
+        { label: 'X1.0', value: 2000 },
+        { label: 'X1.5', value: 1500 },
+        { label: 'X2.0', value: 1000 },
       ],
       // 查询参数
       queryParams: {
@@ -85,162 +52,171 @@ export default {
       },
       // 显示搜索条件
       showSearch: true,
-    };
+    }
+  },
+  created() {
+    this.Render()
   },
   mounted() {
-    this.creatECharts();
+    this.creatECharts()
   },
   methods: {
+    ...mapMutations('app', ['TOGGLE_SIDEBAR']),
     creatECharts() {
       if (this.myChart) {
-        this.myChart.dispose();
+        this.myChart.dispose()
       }
-      var dom = document.getElementById("main");
+      var dom = document.getElementById('main')
       this.myChart = echarts.init(dom, null, {
-        renderer: "canvas",
+        renderer: 'canvas',
         useDirtyRect: false,
-      });
-      let option;
+      })
+      let option
       const a = [
-        ["Income", "Life Expectancy", "Population", "Country", "Year"],
-        [615, 34.05, 251014, "Finland", "2023-01-02 00:00:00"],
-        [315, 34.05, 251014, "Finland", "2023-01-02 01:00:00"],
-        [725, 34.05, 251014, "Finland", "2023-01-02 02:00:00"],
-        [315, 34.05, 251014, "Finland", "2023-01-02 03:00:00"],
-        [515, 34.05, 251014, "Finland", "2023-01-02 04:00:00"],
-        [815, 34.05, 351014, "Finland", "2023-01-02 05:00:00"],
-        [1815, 34.05, 351014, "Finland", "2023-01-02 06:00:00"],
-        [814, 39, 645526, "France", "2023-01-02 00:00:00"],
-        [144, 39, 645526, "France", "2023-01-02 01:00:00"],
-        [454, 39, 645526, "France", "2023-01-02 02:00:00"],
-        [734, 39, 645526, "France", "2023-01-02 03:00:00"],
-        [144, 39, 645526, "France", "2023-01-02 04:00:00"],
-        [999, 39, 645526, "France", "2023-01-02 05:00:00"],
-        [814, 39, 645526, "France", "2023-01-02 06:00:00"],
-      ];
-      let that = this;
-      run(a);
+        ['Income', 'Life Expectancy', 'Population', 'Country', 'Year'],
+        [615, 34.05, 251014, 'Finland', '2023-01-02 00:00:00'],
+        [315, 34.05, 251014, 'Finland', '2023-01-02 01:00:00'],
+        [725, 34.05, 251014, 'Finland', '2023-01-02 02:00:00'],
+        [315, 34.05, 251014, 'Finland', '2023-01-02 03:00:00'],
+        [515, 34.05, 251014, 'Finland', '2023-01-02 04:00:00'],
+        [815, 34.05, 351014, 'Finland', '2023-01-02 05:00:00'],
+        [1815, 34.05, 351014, 'Finland', '2023-01-02 06:00:00'],
+        [814, 39, 645526, 'France', '2023-01-02 00:00:00'],
+        [144, 39, 645526, 'France', '2023-01-02 01:00:00'],
+        [454, 39, 645526, 'France', '2023-01-02 02:00:00'],
+        [734, 39, 645526, 'France', '2023-01-02 03:00:00'],
+        [144, 39, 645526, 'France', '2023-01-02 04:00:00'],
+        [999, 39, 645526, 'France', '2023-01-02 05:00:00'],
+        [814, 39, 645526, 'France', '2023-01-02 06:00:00'],
+      ]
+      let that = this
+      run(a)
 
       function run(_rawData) {
         // var countries = ['Australia', 'Canada', 'China', 'Cuba', 'Finland', 'France', 'Germany', 'Iceland', 'India', 'Japan', 'North Korea', 'South Korea', 'New Zealand', 'Norway', 'Poland', 'Russia', 'Turkey', 'United Kingdom', 'United States'];
-        const countries = ["Finland", "France"];
-        const datasetWithFilters = [];
-        const seriesList = [];
+        const countries = ['Finland', 'France']
+        const datasetWithFilters = []
+        const seriesList = []
         echarts.util.each(countries, function (country) {
-          var datasetId = "dataset_" + country;
+          var datasetId = 'dataset_' + country
           datasetWithFilters.push({
             id: datasetId,
-            fromDatasetId: "dataset_raw",
+            fromDatasetId: 'dataset_raw',
             transform: {
-              type: "filter",
+              type: 'filter',
               config: {
                 and: [
                   {
-                    dimension: "Year",
-                    gte:that.queryParams.startTime,
-                    parser: 'time'
-                    
+                    dimension: 'Year',
+                    gte: that.queryParams.startTime,
+                    parser: 'time',
                   },
                   {
-                    dimension: "Year",
-                    lt:that.queryParams.endTime,
-                    parser: 'time'
+                    dimension: 'Year',
+                    lt: that.queryParams.endTime,
+                    parser: 'time',
                   },
-                  { dimension: "Country", "=": country },
+                  { dimension: 'Country', '=': country },
                 ],
               },
             },
-          });
+          })
           seriesList.push({
-            type: "line",
+            type: 'line',
             datasetId: datasetId,
             showSymbol: false,
             name: country,
             endLabel: {
               show: true,
               formatter: function (params) {
-                return params.value[3] + ": " + params.value[0];
+                return params.value[3] + ': ' + params.value[0]
               },
             },
             labelLayout: {
-              moveOverlap: "shiftY",
+              moveOverlap: 'shiftY',
             },
             emphasis: {
-              focus: "series",
+              focus: 'series',
             },
             encode: {
-              x: "Year",
-              y: "Income",
-              label: ["Country", "Income"],
-              itemName: "Year",
-              tooltip: ["Income"],
+              x: 'Year',
+              y: 'Income',
+              label: ['Country', 'Income'],
+              itemName: 'Year',
+              tooltip: ['Income'],
             },
-          });
-        });
+          })
+        })
         option = {
           animationDuration: that.speed,
           dataset: [
             {
-              id: "dataset_raw",
+              id: 'dataset_raw',
               source: _rawData,
             },
             ...datasetWithFilters,
           ],
           title: {
-            text: "",
+            text: '',
           },
           tooltip: {
-            order: "valueDesc",
-            trigger: "axis",
+            order: 'valueDesc',
+            trigger: 'axis',
           },
           xAxis: {
-            type: "category",
-            nameLocation: "middle",
+            type: 'category',
+            nameLocation: 'middle',
           },
           yAxis: {
-            name: "Income",
+            name: 'Income',
           },
           grid: {
             right: 140,
           },
           series: seriesList,
-        };
-        that.myChart.setOption(option);
+        }
+        that.myChart.setOption(option)
       }
     },
+    //重新渲染侧边导航栏
+    Render() {
+      this.TOGGLE_SIDEBAR()
+      // this.$store.state.app.commit
+    },
     // 表单重置
     reset() {
       this.form = {
         startTime: null,
         endTime: null,
-      };
-      this.resetForm("form");
+      }
+      this.resetForm('form')
     },
     //选择事件
     changeSpeed(value) {
-      this.speed = value;
-      this.creatECharts();
+      this.speed = value
+      this.creatECharts()
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.creatECharts();
+      this.creatECharts()
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.resetForm('queryForm')
+      this.handleQuery()
     },
   },
-};
+}
 </script>
 
 <style scoped>
 .box {
-  width: 1200px;
+  width: 100%;
   height: 600px;
-  text-align: center;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
 }
-
 #main {
   width: 1200px;
   height: 600px;

+ 203 - 184
PHM-web/src/views/manage/sortie/index.vue

@@ -2,35 +2,20 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="机号" prop="aircraftNumber">
-        <el-input
-          v-model="queryParams.aircraftNumber"
-          placeholder="请输入机号"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
+        <el-input v-model="queryParams.aircraftNumber" placeholder="请输入机号" clearable
+          @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item label="架次号" prop="sortieNumber">
-        <el-input
-          v-model="queryParams.sortieNumber"
-          placeholder="请输入架次号"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
+        <el-input v-model="queryParams.sortieNumber" placeholder="请输入架次号" clearable @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item label="开始时间" prop="startTime">
-        <el-date-picker clearable
-          v-model="queryParams.startTime"
-          type="datetime"
-          value-format="yyyy-MM-dd HH:mm:ss"
+        <el-date-picker clearable v-model="queryParams.startTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
           placeholder="请选择开始时间">
         </el-date-picker>
       </el-form-item>
       <el-form-item label="结束时间" prop="endTime">
-        <el-date-picker clearable
-          v-model="queryParams.endTime"
-          type="datetime"
-          value-format="yyyy-MM-dd HH:mm:ss"
-          placeholder="请选择结束时间">
+        <el-date-picker clearable v-model="queryParams.endTime" type="datetime" :picker-options="pickerOption()"
+          value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择结束时间">
         </el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -41,55 +26,24 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['manage:sortie:add']"
-        >新增</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['manage:sortie:add']">新增</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['manage:sortie:edit']"
-        >修改</el-button>
+        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
+          v-hasPermi="['manage:sortie:edit']">修改</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['manage:sortie:remove']"
-        >删除</el-button>
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
+          v-hasPermi="['manage:sortie:remove']">删除</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['manage:sortie:export']"
-        >导出</el-button>
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          v-hasPermi="['manage:sortie:export']">导出</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button
-          type="primary"
-          icon="el-icon-upload2"
-          size="mini"
-          @click="handleImport"
-          v-hasPermi="['manage:sortie:export']"
-        >导入</el-button>
+        <el-button type="primary" icon="el-icon-upload2" size="mini" @click="handleImport"
+          v-hasPermi="['manage:sortie:export']">导入</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
@@ -100,46 +54,45 @@
       <el-table-column label="架次号" align="center" prop="sortieNumber" />
       <el-table-column label="开始时间" align="center" prop="startTime" width="180">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          <span>{{
+            parseTime(scope.row.startTime, "{y}-{m}-{d} {h}:{i}:{s}")
+          }}</span>
         </template>
       </el-table-column>
       <el-table-column label="结束时间" align="center" prop="endTime" width="180">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          <span>{{
+            parseTime(scope.row.endTime, "{y}-{m}-{d} {h}:{i}:{s}")
+          }}</span>
         </template>
       </el-table-column>
       <el-table-column label="飞行时长" align="center" prop="duration" />
       <el-table-column label="创建人" align="center" prop="createBy" />
       <el-table-column label="创建时间" align="center" prop="createTime" width="180">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          <span>{{
+            parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}:{s}")
+          }}</span>
         </template>
       </el-table-column>
       <el-table-column label="更新人" align="center" prop="updateBy" />
       <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          <span>{{
+            parseTime(scope.row.updateTime, "{y}-{m}-{d} {h}:{i}:{s}")
+          }}</span>
         </template>
       </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            @click="playBack(scope.row)"
-            v-hasPermi="['manage:sortie:edit']"
-          >数据回放</el-button>
+          <el-button size="mini" type="text" @click="playBack(scope.row)"
+            v-hasPermi="['manage:sortie:edit']">数据回放</el-button>
         </template>
       </el-table-column>
     </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
 
     <!-- 添加或修改架次信息对话框 -->
     <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="500px" append-to-body>
@@ -151,21 +104,13 @@
           <el-input v-model="form.sortieNumber" placeholder="请输入架次号" />
         </el-form-item>
         <el-form-item label="开始时间" prop="startTime">
-          <el-date-picker clearable
-            v-model="form.startTime"
-            type="datetime"
-            style="width: 100%"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            placeholder="请选择开始时间">
+          <el-date-picker clearable v-model="form.startTime" type="datetime" style="width: 100%"
+            value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择开始时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item label="结束时间" prop="endTime">
-          <el-date-picker clearable
-            v-model="form.endTime"
-            type="datetime"
-            style="width: 100%"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            placeholder="请选择结束时间">
+          <el-date-picker clearable v-model="form.endTime" type="datetime" style="width: 100%"
+            value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择结束时间" :picker-options="formPickerOption()">
           </el-date-picker>
         </el-form-item>
         <el-form-item label="飞行时长" prop="duration">
@@ -179,26 +124,19 @@
     </el-dialog>
     <!-- 用户导入对话框 -->
     <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload
-        ref="upload"
-        :limit="1"
-        accept=".xlsx, .xls"
-        :headers="upload.headers"
-        :action="upload.url + '?updateSupport=' + upload.updateSupport"
-        :disabled="upload.isUploading"
-        :on-progress="handleFileUploadProgress"
-        :on-success="handleFileSuccess"
-        :auto-upload="false"
-        drag
-      >
+      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
         <div class="el-upload__tip text-center" slot="tip">
           <div class="el-upload__tip" slot="tip">
-            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的架次数据
+            <el-checkbox v-model="upload.updateSupport" />
+            是否更新已经存在的架次数据
           </div>
           <span>仅允许导入xls、xlsx格式文件。</span>
-          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+          <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
+            @click="importTemplate">下载模板</el-link>
         </div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
@@ -210,17 +148,25 @@
 </template>
 
 <script>
-import { listSortie, getSortie, delSortie, addSortie, updateSortie } from "@/api/manage/sortie";
-import Cookies from 'js-cookie'
-import { getToken } from "@/utils/auth";
+import {
+  listSortie,
+  getSortie,
+  delSortie,
+  addSortie,
+  updateSortie,
+} from '@/api/manage/sortie'
+import { getToken } from '@/utils/auth'
+import { parseTime } from '@/utils/common'
 export default {
-  name: "Sortie",
+  name: 'Sortie',
   data() {
     return {
       // 遮罩层
       loading: true,
       // 选中数组
       ids: [],
+      //选中的架次号
+      sortieIds: [],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -232,56 +178,105 @@ export default {
       // 架次信息表格数据
       sortieList: [],
       // 弹出层标题
-      title: "",
+      title: '',
       // 是否显示弹出层
       open: false,
+      startTime:'',
+      endTime:'',
       // 查询参数
       queryParams: {
         pageNum: 1,
         pageSize: 10,
         aircraftNumber: null,
         sortieNumber: null,
-        startTime: null,
-        endTime: null,
+        startTime: '',
+        endTime: '',
         duration: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
       },
       upload: {
-        title: "",
+        title: '',
         // 是否显示弹出层
         open: false,
         // 是否禁用上传
         isUploading: false,
         // 设置上传的请求头部
-        headers: { Authorization: "Bearer " + getToken() },
+        headers: { Authorization: 'Bearer ' + getToken() },
         // 是否更新已存在数据
         updateSupport: 0,
         // 上传的地址
-        url: process.env.VUE_APP_BASE_API  + "/manage/sortie/import"
+        url: process.env.VUE_APP_BASE_API + '/manage/sortie/import',
       },
       // 表单参数
       form: {},
       // 表单校验
-      rules: {
-      }
-    };
+      rules: {},
+    }
   },
   created() {
-    this.getList();
+    this.getList()
   },
   methods: {
+    //选择结束时间的限制
+    pickerOption() {
+        if(this.queryParams.startTime != undefined){
+            let date = new Date(this.queryParams.startTime)
+            let minutes = date.getMinutes() + 1
+            // // h和m 是将日期只取时分
+            let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
+            let m = (minutes < 10 ? '0' + minutes : minutes);
+            // pickerDate 判断当前选择时间是否等于上条数据时间
+            // 若等于时,限制时间从00:00:00 - 上条数据开始时间,不等于时,24小时可选
+            let pickerDate = new Date(this.queryParams.endTime).toDateString() === new Date(this.queryParams.startTime).toDateString()
+            return {
+                // 日期限制
+                disabledDate: (time) => {
+                    let old = this.queryParams.startTime
+                    return time.getTime() < new Date(old).getTime() - 86400000 
+                },
+                // 时间限制
+                selectableRange: pickerDate? h + m  + ':00 - 23:59:59' : '00:00:00 - 23:59:59'
+            }
+        }
+    },
+    //添加和修改时间限制
+    formPickerOption() {
+        if(this.form.startTime != undefined){
+            let date = new Date(this.form.startTime)
+            let minutes = date.getMinutes() + 1
+            // // h和m 是将日期只取时分
+            let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
+            let m = (minutes < 10 ? '0' + minutes : minutes);
+            // pickerDate 判断当前选择时间是否等于上条数据时间
+            // 若等于时,限制时间从00:00:00 - 上条数据开始时间,不等于时,24小时可选
+            let pickerDate = new Date(this.form.endTime).toDateString() === new Date(this.form.startTime).toDateString()
+            return {
+                // 日期限制
+                disabledDate: (time) => {
+                    let old = this.form.startTime
+                    return time.getTime() < new Date(old).getTime() - 86400000 
+                },
+                // 时间限制
+                selectableRange: pickerDate? h + m  + ':00 - 23:59:59' : '00:00:00 - 23:59:59'
+            }
+        }
+    },
     /** 查询架次信息列表 */
     getList() {
-      this.loading = true;
+      this.loading = true
       listSortie(this.queryParams).then(response => {
-        this.sortieList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
+        this.sortieList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
     },
     // 取消按钮
     cancel() {
-      this.open = false;
-      this.reset();
+      this.open = false
+      this.reset()
     },
     // 表单重置
     reset() {
@@ -296,56 +291,62 @@ export default {
         createBy: null,
         createTime: null,
         updateBy: null,
-        updateTime: null
-      };
-      this.resetForm("form");
+        updateTime: null,
+      }
+      this.resetForm('form')
     },
     // 跳转到数据回放
     playBack(row) {
-      const sortieNumber = row.sortieNumber;
-      this.$router.push("/manage/integratedDataManage/sortie/dataPlayback/" + sortieNumber);
+      const sortieNumber = row.sortieNumber
+      this.$router.push(
+        '/manage/integratedDataManage/sortie/dataPlayback/' + sortieNumber
+      )
     },
     /** 下载模板操作 */
     importTemplate() {
-      this.download('/manage/sortie/importTemplate', {
-      }, `sortie_template_${new Date().getTime()}.xlsx`)
+      this.download(
+        '/manage/sortie/importTemplate',
+        {},
+        `sortie_template_${new Date().getTime()}.xlsx`
+      )
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
+      this.queryParams.pageNum = 1
+      this.getList()
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.resetForm('queryForm')
+      this.handleQuery()
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
+      this.sortieIds = selection.map(item => item.sortieNumber)
+      this.single = selection.length !== 1
       this.multiple = !selection.length
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "添加架次信息";
+      this.reset()
+      this.open = true
+      this.title = '添加架次信息'
     },
     /** 导入按钮操作 */
     handleImport() {
-      this.upload.title = '架次导入';
-      this.upload.open = true;
+      this.upload.title = '架次导入'
+      this.upload.open = true
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      this.reset();
+      this.reset()
       const id = row.id || this.ids
       getSortie(id).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title = "修改架次信息";
-      });
+        this.form = response.data
+        this.open = true
+        this.title = '修改架次信息'
+      })
     },
     submitFileForm() {
       // this.$refs["uploadForm"].validate(valid => {
@@ -354,70 +355,88 @@ export default {
       //   }
       //   this.$refs.upload.submit();
       // })
-      this.$refs.upload.submit();
+      this.$refs.upload.submit()
     },
     uploadClose() {
       // 关闭弹窗
-      this.upload.open = false;
+      this.upload.open = false
       // 重置上传状态和文件
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
+      this.upload.isUploading = false
+      this.$refs.upload.clearFiles()
       // 重置表单
-      this.upload.form = {};
+      this.upload.form = {}
       // this.resetForm("uploadForm");
     },
     // 文件上传中处理
     handleFileUploadProgress(event, file, fileList) {
-      this.upload.isUploading = true;
+      this.upload.isUploading = true
     },
     // 文件上传成功处理
     handleFileSuccess(response, file, fileList) {
       if (response.code !== 200) {
         this.$modal.msgError(response.msg)
-        return;
+        return
       }
-      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;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
-      this.getList();
+      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;'>" +
+          response.msg +
+          '</div>',
+        '导入结果',
+        { dangerouslyUseHTMLString: true }
+      )
+      this.getList()
     },
     /** 提交按钮 */
     submitForm() {
-      this.$refs["form"].validate(valid => {
+      this.$refs['form'].validate(valid => {
         if (valid) {
           if (this.form.id != null) {
+            this.form.updateBy = this.$store.state.user.name
+            this.form.updateTime = parseTime(new Date())
             updateSortie(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
+              this.$modal.msgSuccess('修改成功')
+              this.open = false
+              this.getList()
+            })
           } else {
+            this.form.createBy = this.$store.state.user.name
+            this.form.createTime = parseTime(new Date())
             addSortie(this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
+              this.$modal.msgSuccess('新增成功')
+              this.open = false
+              this.getList()
+            })
           }
         }
-      });
+      })
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除架次信息编号为"' + ids + '"的数据项?').then(function() {
-        return delSortie(ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {});
+      const ids = row.id || this.ids
+      this.$modal
+        .confirm('是否确认删除架次号为"' + this.sortieIds + '"的数据项?')
+        .then(function () {
+          return delSortie(ids)
+        })
+        .then(() => {
+          this.getList()
+          this.$modal.msgSuccess('删除成功')
+        })
+        .catch(() => {})
     },
     /** 导出按钮操作 */
     handleExport() {
-      this.download('manage/sortie/export', {
-        ...this.queryParams
-      }, `sortie_${new Date().getTime()}.xlsx`)
-    }
-  }
-};
+      this.download(
+        'manage/sortie/export',
+        {
+          ...this.queryParams,
+        },
+        `sortie_${new Date().getTime()}.xlsx`
+      )
+    },
+  },
+}
 </script>

+ 37 - 51
PHM-web/src/views/system/role/selectUser.vue

@@ -3,20 +3,10 @@
   <el-dialog title="选择用户" :visible.sync="visible" width="800px" top="5vh" append-to-body>
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
       <el-form-item label="用户名称" prop="userName">
-        <el-input
-          v-model="queryParams.userName"
-          placeholder="请输入用户名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
+        <el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item label="手机号码" prop="phonenumber">
-        <el-input
-          v-model="queryParams.phonenumber"
-          placeholder="请输入手机号码"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
+        <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -24,7 +14,8 @@
       </el-form-item>
     </el-form>
     <el-row>
-      <el-table @row-click="clickRow" ref="table" :data="userList" @selection-change="handleSelectionChange" height="260px">
+      <el-table @row-click="clickRow" ref="table" :data="userList" @selection-change="handleSelectionChange"
+        height="260px">
         <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column label="用户名称" prop="userName" :show-overflow-tooltip="true" />
         <el-table-column label="用户昵称" prop="nickName" :show-overflow-tooltip="true" />
@@ -32,7 +23,7 @@
         <el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
         <el-table-column label="状态" align="center" prop="status">
           <template slot-scope="scope">
-            <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
+            <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status" />
           </template>
         </el-table-column>
         <el-table-column label="创建时间" align="center" prop="createTime" width="180">
@@ -41,13 +32,8 @@
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        v-show="total>0"
-        :total="total"
-        :page.sync="queryParams.pageNum"
-        :limit.sync="queryParams.pageSize"
-        @pagination="getList"
-      />
+      <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
     </el-row>
     <div slot="footer" class="dialog-footer">
       <el-button type="primary" @click="handleSelectUser">确 定</el-button>
@@ -57,14 +43,14 @@
 </template>
 
 <script>
-import { unallocatedUserList, authUserSelectAll } from "@/api/system/role";
+import { unallocatedUserList, authUserSelectAll } from '@/api/system/role'
 export default {
   dicts: ['sys_normal_disable'],
   props: {
     // 角色编号
     roleId: {
-      type: [Number, String]
-    }
+      type: [Number, String],
+    },
   },
   data() {
     return {
@@ -82,57 +68,57 @@ export default {
         pageSize: 10,
         roleId: undefined,
         userName: undefined,
-        phonenumber: undefined
-      }
-    };
+        phonenumber: undefined,
+      },
+    }
   },
   methods: {
     // 显示弹框
     show() {
-      this.queryParams.roleId = this.roleId;
-      this.getList();
-      this.visible = true;
+      this.queryParams.roleId = this.roleId
+      this.getList()
+      this.visible = true
     },
     clickRow(row) {
-      this.$refs.table.toggleRowSelection(row);
+      this.$refs.table.toggleRowSelection(row)
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.userIds = selection.map(item => item.userId);
+      this.userIds = selection.map(item => item.userId)
     },
     // 查询表数据
     getList() {
       unallocatedUserList(this.queryParams).then(res => {
-        this.userList = res.rows;
-        this.total = res.total;
-      });
+        this.userList = res.rows
+        this.total = res.total
+      })
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
+      this.queryParams.pageNum = 1
+      this.getList()
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.resetForm('queryForm')
+      this.handleQuery()
     },
     /** 选择授权用户操作 */
     handleSelectUser() {
-      const roleId = this.queryParams.roleId;
-      const userIds = this.userIds.join(",");
-      if (userIds == "") {
-        this.$modal.msgError("请选择要分配的用户");
-        return;
+      const roleId = this.queryParams.roleId
+      const userIds = this.userIds.join(',')
+      if (userIds == '') {
+        this.$modal.msgError('请选择要分配的用户')
+        return
       }
       authUserSelectAll({ roleId: roleId, userIds: userIds }).then(res => {
-        this.$modal.msgSuccess(res.msg);
+        this.$modal.msgSuccess(res.msg)
         if (res.code === 200) {
-          this.visible = false;
-          this.$emit("ok");
+          this.visible = false
+          this.$emit('ok')
         }
-      });
-    }
-  }
-};
+      })
+    },
+  },
+}
 </script>