Sfoglia il codice sorgente

页面bug修改,新增任务页面与定时页面联动

zy 4 giorni fa
parent
commit
c75dad1be5

+ 8 - 1
xvji-ui/src/api/monitor/job.js

@@ -1,5 +1,12 @@
 import request from '@/utils/request'
 
+// 查询定时任务所有列表
+export function listAllJob() {
+  return request({
+    url: '/monitor/job/getAll',
+    method: 'get'
+  })
+}
 // 查询定时任务调度列表
 export function listJob(query) {
   return request({
@@ -68,4 +75,4 @@ export function runJob(jobId, jobGroup) {
     method: 'put',
     data: data
   })
-}
+}

+ 1 - 1
xvji-ui/src/router/index.js

@@ -70,7 +70,7 @@ export const constantRoutes = [
         path: 'index',
         component: () => import('@/views/tasks'),
         name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
+        meta: { title: '任务配置', icon: 'dashboard', affix: true }
       }
     ]
   },

+ 43 - 3
xvji-ui/src/views/monitor/job/index.vue

@@ -293,7 +293,7 @@
 </template>
 
 <script>
-import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job";
+import {listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus, listAllJob} from "@/api/monitor/job";
 import Crontab from '@/components/Crontab'
 
 export default {
@@ -347,13 +347,48 @@ export default {
         cronExpression: [
           { required: true, message: "cron执行表达式不能为空", trigger: "blur" }
         ]
-      }
+      },
+      routeParam:{},
+      routeFlag:false,
     };
   },
-  created() {
+  mounted() {
+    // console.log(this.$route.params.row)
+    this.routeParam = this.$route.params.row !==undefined?JSON.parse(this.$route.params.row):{}
     this.getList();
+    this.getAll()
   },
   methods: {
+    getAll() {
+      if(JSON.stringify(this.routeParam) !=='{}'){
+        // 路由中带着参数  params带参数是一次性的刷新后就会消失
+        listAllJob().then(res=>{
+          this.routeFlag = true
+          let job = res.data.find(w=>w.invokeTarget.includes(this.routeParam.taskId)&&w.invokeTarget.includes('TaskQuartzJob'))
+          // console.log(job)
+          if(job !==undefined){
+            this.queryParams.jobName  = job.jobName
+            this.getList()
+            this.handleUpdate(job)
+          }else{
+            this.handleAdd()
+            let invokeTarget = this.routeParam.jobGroup ==='TRAIN_TASK'?'executeTrainTask':'executePredictTask'
+            this.form = {
+              jobId: undefined,
+              jobName: this.routeParam.taskName,
+              jobGroup: this.routeParam.jobGroup,
+              invokeTarget: 'com.xvji.quartz.TaskQuartzJob.'+invokeTarget+'('+this.routeParam.taskId+')',
+              cronExpression: undefined,
+              misfirePolicy: 1,
+              concurrent: 1,
+              status: "0"
+            }
+          }
+        })
+      }else{
+        this.routeFlag = false
+      }
+    },
     /** 查询定时任务列表 */
     getList() {
       this.loading = true;
@@ -362,6 +397,7 @@ export default {
         this.total = response.total;
         this.loading = false;
       });
+
     },
     // 任务组名字典翻译
     jobGroupFormat(row, column) {
@@ -483,12 +519,16 @@ export default {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();
+              this.routeFlag = false
+              this.routeParam = {}
             });
           } else {
             addJob(this.form).then(response => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
               this.getList();
+              this.routeFlag = false
+              this.routeParam = {}
             });
           }
         }

+ 1 - 1
xvji-ui/src/views/tasks/index.vue

@@ -24,7 +24,7 @@ export default {
   },
   methods: {
     handleClick(tab, event) {
-      console.log(tab, event);
+      // console.log(tab, event);
     }
   }
 }

+ 12 - 0
xvji-ui/src/views/tasks/predict/index.vue

@@ -32,6 +32,9 @@
                          label="操作" width="200"
         >
           <template slot-scope="{row}">
+            <el-tooltip class="item" effect="light" content="配置定时" placement="top">
+              <el-button @click="handleCronClick(row)" plain size="mini" icon="el-icon-timer"/>
+            </el-tooltip>
             <el-button @click="handleClick(row)" type="primary" plain size="mini">编辑</el-button>
             <el-button @click="handleDeleteClick(row)" type="danger" plain size="mini">删除</el-button>
           </template>
@@ -375,6 +378,15 @@ export default {
       });
       // this.dialogVisible = false
     },
+    //定时任务跳转
+    handleCronClick(row){
+      let param = {
+        taskId:row.ptaskId,
+        taskName:row.ptaskName,
+        jobGroup: "PREDICT_TASK"
+      }
+      this.$router.push({ name: 'Job', params: { row: JSON.stringify(param)} })
+    },
     // 数据处理数据
     getDataCleaning(val) {
       this.formData.dataCleaning.params = val

+ 49 - 68
xvji-ui/src/views/tasks/predict/modelForm.vue

@@ -17,8 +17,8 @@
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="mongodb_modelTest_table" prop="mongodb_modelTest_table" v-if="modelType ===4">
-        <el-input v-model="form['mongodb_modelTest_table']" size="mini"
+      <el-form-item label="模型表" prop="mongodb_model_table" v-if="modelType ===4">
+        <el-input v-model="form['mongodb_model_table']" size="mini"
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
@@ -49,7 +49,7 @@
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="装机容量" prop="cap" v-if="modelType !== 2">
+      <el-form-item label="装机容量" prop="cap" v-if="modelType !== 2 && modelType !== 4">
         <el-input v-model="form['cap']" size="mini"
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
@@ -72,7 +72,7 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="测试or生产" prop="algorithm_test" v-if="modelType ===3">
+      <el-form-item label="是否配置生产" prop="algorithm_test" v-if="modelType ===3">
         <el-select v-model="form['algorithm_test']" clearable placeholder="请选择" size="small" style="width: 100%"
                    @change="columnChange">
           <el-option
@@ -83,15 +83,15 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="数据开始时间">
-        <el-input v-model="form['timeBegin']" size="mini"
-                  :disabled="!model.isEnable" type="textarea"
-                  :autosize="{ minRows: 1 }"></el-input>
-      </el-form-item>
-      <el-form-item label="数据结束时间">
-        <el-input v-model="form['timeEnd']" size="mini"
-                  :disabled="!model.isEnable" type="textarea"
-                  :autosize="{ minRows: 1 }"></el-input>
+      <el-form-item label="类型" prop="station_type" v-if="modelType ===3">
+        <el-select v-model="form['station_type']" clearable placeholder="请选择" size="small" style="width: 100%" :disabled="stationTypeDisabled">
+          <el-option
+            v-for="item in stationType"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="平滑参数" v-if="modelType ===1">
         <el-select v-model="form['sigmoid_param']" clearable placeholder="请选择" size="small" style="width: 100%">
@@ -103,30 +103,12 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <div v-if="modelType !== 3">
-        <el-form-item label="测试第N天">
-          <el-input v-model="form['howLongAgo']" size="mini"
-                    :disabled="!model.isEnable || form['forecast_file'] !=='0' " type="textarea"
-                    :autosize="{ minRows: 1 }"></el-input>
-        </el-form-item>
-        <el-form-item label="目标列" prop="target">
-          <el-input v-model="form['target']" size="mini"
-                    :disabled="!model.isEnable ||form['forecast_file'] !=='0' " type="textarea"
-                    :autosize="{ minRows: 1 }"></el-input>
-        </el-form-item>
-      </div>
-      <div v-else>
-        <el-form-item label="测试第N天">
-          <el-input v-model="form['howLongAgo']" size="mini"
-                    :disabled="!model.isEnable || columnDisabled" type="textarea"
-                    :autosize="{ minRows: 1 }"></el-input>
-        </el-form-item>
-        <el-form-item label="目标列" prop="target">
-          <el-input v-model="form['target']" size="mini"
-                    :disabled="!model.isEnable || columnDisabled" type="textarea"
-                    :autosize="{ minRows: 1 }"></el-input>
-        </el-form-item>
-      </div>
+
+      <el-form-item label="目标列" prop="target">
+        <el-input v-model="form['target']" size="mini"
+                  :disabled="!model.isEnable || (form['forecast_file'] !=='0' &&form['algorithm_test'] !=='1') " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
 
       <el-form-item label="预测长度" prop="pre_len" v-if="modelType === 2">
         <el-input v-model="form['pre_len']" size="mini"
@@ -143,12 +125,12 @@
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="模型名称" prop="model_name">
+      <el-form-item label="模型名称" prop="model_name" v-if="modelType ===3 || modelType ===4">
         <el-input v-model="form['model_name']" size="mini"
                   :disabled="!model.isEnable || (form['forecast_file'] !=='0'&& modelType===2) " type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="模型保存表名" prop="model_table" v-if="modelType ===3">
+      <el-form-item label="读取模型表名" prop="model_table" v-if="modelType ===3">
         <el-input v-model="form['model_table']" size="mini"
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
@@ -176,6 +158,8 @@
   </div>
 </template>
 <script>
+import fa from "element-ui/src/locale/lang/fa";
+
 export default {
   props: {
     formData: {
@@ -227,6 +211,10 @@ export default {
         {label: '生产', value: '0'},
         {label: '其他', value: 'ok'}
       ],
+      stationType: [
+        {label: '光', value: '1'},
+        {label: '风', value: '2'}
+      ],
       sigmoidParamType: [
         {label: 'L', value: '1'},
         {label: 'x0', value: '7'},
@@ -306,7 +294,7 @@ export default {
           {required: true, message: '请填写归一化表', trigger: 'blur'}
         ],
         model_table: [
-          {required: true, message: '请填写模型保存表名', trigger: 'blur'}
+          {required: true, message: '请填写读取模型表名', trigger: 'blur'}
         ],
         cap: [
           {required: true, message: '请填写装机容量', trigger: 'blur'}
@@ -314,27 +302,27 @@ export default {
         algorithm_test: [
           {required: true, message: '请选择测试or生产', trigger: 'change'}
         ],
+        station_type: [
+          {required: true, message: '请选择类型', trigger: 'change'}
+        ],
       },
       machineRules: {
 
         cap: [
           {required: true, message: '请填写装机容量', trigger: 'blur'}
         ],
-        mongodb_modelTest_table: [
-          {required: true, message: '请填写mongodb_modelTest_table', trigger: 'blur'}
+        mongodb_model_table: [
+          {required: true, message: '请填写模型表', trigger: 'blur'}
         ],
       },
-      columnDisabled: false
+      columnDisabled: false,
+      stationTypeDisabled: false,
     }
   },
   mounted() {
   },
   methods: {
     saveTask() {
-      if (this.form['forecast_file'] === '0') {
-        this.$refs.modelForm.clearValidate('target')
-        this.$refs.modelForm.clearValidate('model_name')
-      }
       this.$refs.modelForm.validate((valid) => {
         if (valid) {
           // console.log('child submit!');
@@ -353,36 +341,29 @@ export default {
     forecastFileChange() {
       if (this.form['forecast_file'] === '0') {
         this.form['howLongAgo'] = '1'
-        delete this.rules.target;
-        delete this.rules.model_name;
-        this.rules = Object.assign({
-          target: [
-            {required: true, message: '请填写目标列', trigger: 'blur'}
-          ],
-          model_name: [
-            {required: true, message: '请填写模型名称', trigger: 'blur'}
-          ],
-        }, this.rules)
-        this.$nextTick(() => {
-          this.$refs.modelForm.clearValidate()
-        });
+        this.rules.target[0].required = true
+        this.rules.model_name[0].required = true
       } else {
-        delete this.rules.target;
-        delete this.rules.model_name;
+        this.rules.target[0].required = false
+        this.rules.model_name[0].required = false
         this.form['howLongAgo'] = ''
       }
     },
     columnChange() {
+      if(this.form['algorithm_test'] === 'ok'){
+        this.stationTypeDisabled = true
+        this.rules.station_type[0].required = false
+        this.form['station_type'] = null
+      }else{
+        this.stationTypeDisabled = false
+        this.rules.station_type[0].required = true
+      }
       if (this.form['algorithm_test'] === '1') {
         this.columnDisabled = false
+        this.rules.target[0].required = true
       } else {
-        if (this.modelType === 1) {
-          this.$refs.modelForm.clearValidate('target')
-          this.$refs.modelForm.clearValidate('model_name')
-        } else {
-          this.$refs.modelForm.clearValidate('target')
-        }
         this.columnDisabled = true
+        this.rules.target[0].required = false
       }
     }
   },

+ 59 - 9
xvji-ui/src/views/tasks/training/index.vue

@@ -19,7 +19,7 @@
         style="width: 100%">
         <el-table-column align="center" prop="ttaskId" label="任务id"></el-table-column>
         <el-table-column align="center" prop="ttaskName" label="名称"></el-table-column>
-        <el-table-column align="center" prop="ttaskStatus" label="状态" :formatter="formatPtaskStatus"></el-table-column>
+<!--        <el-table-column align="center" prop="ttaskStatus" label="状态" :formatter="formatPtaskStatus"></el-table-column>-->
         <el-table-column align="center" prop="tcreateTime" label="创建时间" :formatter="formatCreateTime"></el-table-column>
         <el-table-column align="center" prop="tcronExpression" label="定时任务"></el-table-column>
         <el-table-column align="center" prop="tanalysisReport" label="报告分析" width="100">
@@ -34,9 +34,12 @@
         </el-table-column>
         <el-table-column align="center"
                          fixed="right"
-                         label="操作" width="200"
+                         label="操作" width="300"
         >
           <template slot-scope="{row}">
+            <el-tooltip class="item" effect="light" content="配置定时" placement="top">
+              <el-button @click="handleCronClick(row)" plain size="mini" icon="el-icon-timer"/>
+            </el-tooltip>
             <el-button @click="handleClick(row)" type="primary" plain size="mini">编辑</el-button>
             <el-button @click="handleDeleteClick(row)" type="danger" plain size="mini">删除</el-button>
           </template>
@@ -63,11 +66,11 @@
                 <el-input v-model="formData.tTaskName"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
-              <el-form-item label="定时任务" prop="tCronExpression" label-width="100px">
-                <el-input v-model="formData.tCronExpression"></el-input>
-              </el-form-item>
-            </el-col>
+<!--            <el-col :span="12">-->
+<!--              <el-form-item label="定时任务" prop="tCronExpression" label-width="100px">-->
+<!--                <el-input v-model="formData.tCronExpression"></el-input>-->
+<!--              </el-form-item>-->
+<!--            </el-col>-->
           </el-row>
 
 
@@ -270,6 +273,7 @@ import processingForm from './processingForm.vue'
 import reportForm from './reportForm.vue'
 import {addTask, deleteId, queryTasks, updateTask} from "@/api/xvji/training";
 import {formatDateTime} from "@/utils/dateUtil";
+import store from "@/store";
 
 export default {
   components: {modelForm, modelTestForm, dataCleanForm, powerRationingForm, processingForm, reportForm},
@@ -425,6 +429,18 @@ export default {
       // console.log(this.formData.powerRationing)
       this.dialogVisible = true
     },
+    //定时任务跳转
+    handleCronClick(row){
+      let param = {
+        taskId:row.ttaskId,
+        taskName:row.ttaskName,
+        jobGroup: "TRAIN_TASK"
+      }
+      // console.log(this.$router)
+      // store.dispatch('tagsView/delView', {path:'/job'})
+      // this.$store.dispatch('tagsView/updateVisitedView', this.$route)
+      this.$router.push({ name: 'Job', params: { row: JSON.stringify(param)} })
+    },
     //删除
     handleDeleteClick(row) {
       this.$confirm('此操作将永久删除' + row.ttaskName + '任务, 是否继续?', '提示', {
@@ -579,8 +595,42 @@ export default {
     isDisableModeTest() {
       if (this.formData.model.componentType.includes('LSTM') || this.formData.model.componentType.includes('机器')) {
         this.modelTestDisable = false
-        this.formData.modelTest.isEnable = true
-        this.formData.modelTest.componentType = this.formData.model.componentType + '测试'
+        this.formData.modelTest = {componentType: this.formData.model.componentType + '测试', isEnable: true, params: {}}
+        if(this.formData.model.componentType.includes('LSTM')){
+          this.formData.modelTest.params = {
+            mongodb_database:'',
+            scaler_table:'',
+            mongodb_read_table:'',
+            col_time:'',
+            mongodb_write_table:'',
+            farm_id:'',
+            model_name:'',
+            model_table:'',
+            algorithm_test:'',
+            cap:'',
+            timeBegin:'',
+            timeEnd:'',
+            howLongAgo:'',
+            target:'',
+            station_type:''
+          }
+        }else if(this.formData.model.componentType.includes('机器')){
+          this.formData.modelTest.params = {
+            farm_id:'',
+            mongodb_database:'',
+            mongodb_read_table:'',
+            model_name:'',
+            col_time:'',
+            mongodb_write_table:'',
+            mongodb_model_table:'',
+            forecast_file:'',
+            timeBegin:'',
+            timeEnd:'',
+            target:'',
+            howLongAgo:'',
+          }
+        }
+
         return
       }
       this.modelTestDisable = true

+ 39 - 31
xvji-ui/src/views/tasks/training/modelForm.vue

@@ -7,12 +7,12 @@
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="读取的mongo表" prop="mongodb_read_table" v-if="modelType !== 3">
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table" >
         <el-input v-model="form['mongodb_read_table']" size="mini"
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table" v-if="modelType !== 3">
         <el-input v-model="form['mongodb_write_table']" size="mini"
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
@@ -88,12 +88,12 @@
       </el-form-item>
       <el-form-item label="测试第N天" v-if="modelType !== 3 && modelType !==4">
         <el-input v-model="form['howLongAgo']" size="mini"
-                  :disabled="!model.isEnable || form['forecast_file'] !=='0'" type="textarea"
+                  :disabled="!model.isEnable || forecast_file_disable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
       <el-form-item label="目标列" prop="target" v-if="modelType !== 4">
         <el-input v-model="form['target']" size="mini"
-                  :disabled="!model.isEnable || form['forecast_file'] !=='0'" type="textarea"
+                  :disabled="!model.isEnable || forecast_file_disable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
       <el-form-item label="预测长度" prop="pre_len" v-if="modelType === 2">
@@ -113,7 +113,7 @@
       </el-form-item>
       <el-form-item label="模型名称" prop="model_name">
         <el-input v-model="form['model_name']" size="mini"
-                  :disabled="!model.isEnable || form['forecast_file'] !=='0'" type="textarea"
+                  :disabled="!model.isEnable || forecast_file_disable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
       <el-form-item label="模型保存表名" prop="model_table" v-if="modelType ===3">
@@ -136,16 +136,16 @@
                   :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="预测类型" prop="station_type" v-if="modelType ===3">
-        <el-select v-model="form['station_type']" clearable placeholder="请选择" size="small" style="width: 100%">
-          <el-option
-            v-for="item in stationType" :disabled="!model.isEnable"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
-        </el-select>
-      </el-form-item>
+<!--      <el-form-item label="预测类型" prop="station_type" v-if="modelType ===3">-->
+<!--        <el-select v-model="form['station_type']" clearable placeholder="请选择" size="small" style="width: 100%">-->
+<!--          <el-option-->
+<!--            v-for="item in stationType" :disabled="!model.isEnable"-->
+<!--            :key="item.value"-->
+<!--            :label="item.label"-->
+<!--            :value="item.value">-->
+<!--          </el-option>-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
       <el-form-item label="周期" prop="seasonal_periods" v-if="modelType === 2">
         <el-input v-model="form['seasonal_periods']" size="mini"
                   :disabled="!model.isEnable" type="textarea"
@@ -167,8 +167,8 @@
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
 
-<el-form-item label="类别型列" prop="numerical_features" v-if="modelType === 4">
-        <el-input v-model="form['numerical_features']" size="mini"
+<el-form-item label="类别型列" prop="categorical_features" v-if="modelType === 4">
+        <el-input v-model="form['categorical_features']" size="mini"
                   :disabled="(!model.isEnable) || categoricalFeaturesDisable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
@@ -184,7 +184,7 @@
       </el-form-item>
 <el-form-item label="目标列" prop="label" v-if="modelType === 4">
         <el-input v-model="form['label']" size="mini"
-                  :disabled="!model.isEnable " type="textarea"
+                  :disabled="!model.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
 
@@ -208,7 +208,7 @@ export default {
   watch: {
     formData: {
       handler(newVal, oldVal) {
-        console.log(newVal)
+        // console.log(newVal)
 
         this.model = newVal
         this.modelType = this.modelName.find(w => w.label === newVal.componentType).value
@@ -257,11 +257,11 @@ export default {
         {label: 'LSTM', value: 3},
         {label: '机器学习模型', value: 4}
       ],
-      stationType: [
-        {label: '光', value: '1'},
-        {label: '风', value: '2'},
-        {label: '其他', value: '3'}
-      ],
+      // stationType: [
+      //   {label: '光', value: '1'},
+      //   {label: '风', value: '2'},
+      //   {label: '其他', value: '3'}
+      // ],
       model_type: [
         {label: 'svr', value: 'svr'},
         {label: 'lightgbm', value: 'lightgbm'}
@@ -338,9 +338,9 @@ export default {
         features: [
           {required: true, message: '请填写特征', trigger: 'blur'}
         ],
-        station_type: [
-          {required: true, message: '请选择预测类型', trigger: 'change'}
-        ],
+        // station_type: [
+        //   {required: true, message: '请选择预测类型', trigger: 'change'}
+        // ],
         cap: [
           {required: true, message: '请填写预测上限', trigger: 'blur'}
         ],
@@ -368,7 +368,8 @@ export default {
           {required: true, message: '请填写目标列', trigger: 'blur'}
         ],
       },
-      categoricalFeaturesDisable:false
+      categoricalFeaturesDisable:false,
+      forecast_file_disable:false,
     }
   },
   mounted() {
@@ -400,6 +401,7 @@ export default {
     },
     forecastFileChange(){
       if(this.form['forecast_file'] === '0'){
+        this.forecast_file_disable = false
         this.form['howLongAgo'] = '1'
         delete this.rules.target;
         delete this.rules.model_name;
@@ -408,9 +410,15 @@ export default {
           this.$refs.modelForm.clearValidate()
         });
       }else{
-        delete this.rules.target;
-        delete this.rules.model_name;
-        this.form['howLongAgo'] = ''
+        if(this.modelType === 3 || this.modelType === 4){
+          this.forecast_file_disable = false
+        }else{
+          this.forecast_file_disable = true
+          delete this.rules.target;
+          delete this.rules.model_name;
+          this.form['howLongAgo'] = ''
+        }
+
       }
     }
   },

+ 95 - 59
xvji-ui/src/views/tasks/training/modelTestForm.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-form ref="modelTestForm" :rules="rules" :modelTest="form" class="demo-form-inline"
+    <el-form ref="modelTestForm" :rules="rulesModelTest" :model="form" class="demo-form-inline"
              label-width="130px">
       <el-form-item label="mongo库" prop="mongodb_database">
         <el-input v-model="form['mongodb_database']" size="mini"
@@ -38,42 +38,56 @@
                   :disabled="!modelTest.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="存储的模型表" prop="modelTest_table" v-if="modelTestType ===0">
-        <el-input v-model="form['modelTest_table']" size="mini"
+      <el-form-item label="存储的模型表" prop="model_table" v-if="modelTestType ===0">
+        <el-input v-model="form['model_table']" size="mini"
                   :disabled="!modelTest.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
 
       <el-form-item label="测试or生产" prop="algorithm_test" v-if="modelTestType ===0">
-        <el-select v-model="form['algorithm_test']" clearable placeholder="请选择" size="small" style="width: 100%" @change="columnChange">
+        <el-select v-model="form['algorithm_test']" clearable placeholder="请选择" size="small" style="width: 100%"
+                   @change="columnChange">
           <el-option
-            v-for="item in algorithmTestType" :disabled="!modelTest.isEnable"
+            v-for="item in algorithmTestType"
             :key="item.value"
             :label="item.label"
             :value="item.value">
           </el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="装机容量" prop="cap" v-if="modelTestType === 0">
-        <el-input v-model="form['cap']" size="mini"
-                  :disabled="!modelTest.isEnable" type="textarea"
-                  :autosize="{ minRows: 1 }"></el-input>
-      </el-form-item>
-      <el-form-item label="mongodb_modelTest_table" prop="mongodb_modelTest_table" v-if="modelTestType ===1">
-        <el-input v-model="form['mongodb_modelTest_table']" size="mini"
-                  :disabled="!modelTest.isEnable" type="textarea"
-                  :autosize="{ minRows: 1 }"></el-input>
+      <el-form-item label="是否配置生产" prop="forecast_file" v-if="modelTestType === 1">
+        <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%"
+                   @change="columnChange">
+          <el-option
+            v-for="item in forecastFileType"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="是否配置生产" prop="forecast_file" v-if="modelTestType === 1" >
-        <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%" @change="columnChange">
+      <el-form-item label="类型" prop="station_type" v-if="modelTestType ===0">
+        <el-select v-model="form['station_type']" clearable placeholder="请选择" size="small" style="width: 100%" :disabled="stationTypeDisabled">
           <el-option
-            v-for="item in forecastFileType" :disabled="!modelTest.isEnable"
+            v-for="item in stationType"
             :key="item.value"
             :label="item.label"
             :value="item.value">
           </el-option>
         </el-select>
       </el-form-item>
+      <el-form-item label="装机容量" prop="cap" v-if="modelTestType === 0">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!modelTest.isEnable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="模型表" prop="mongodb_model_table" v-if="modelTestType === 1">
+        <el-input v-model="form['mongodb_model_table']" size="mini"
+                  :disabled="!modelTest.isEnable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
       <el-form-item label="数据开始时间">
         <el-input v-model="form['timeBegin']" size="mini"
                   :disabled="!modelTest.isEnable" type="textarea"
@@ -84,14 +98,14 @@
                   :disabled="!modelTest.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="测试第N天" >
+      <el-form-item label="测试第N天">
         <el-input v-model="form['howLongAgo']" size="mini"
                   :disabled="!modelTest.isEnable || columnDisabled" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
-      <el-form-item label="目标列" prop="target" >
+      <el-form-item label="目标列" prop="target">
         <el-input v-model="form['target']" size="mini"
-                  :disabled="!modelTest.isEnable || columnDisabled  " type="textarea"
+                  :disabled="!modelTest.isEnable || columnDisabled" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
 
@@ -100,6 +114,8 @@
   </div>
 </template>
 <script>
+import fa from "element-ui/src/locale/lang/fa";
+
 export default {
   props: {
     formData: {
@@ -108,27 +124,30 @@ export default {
     }
   },
   destroyed() {
-    this.$nextTick(() => {
-      this.$refs.modelTestForm.clearValidate();
-    });
   },
   watch: {
     formData: {
       handler(newVal, oldVal) {
-        // console.log(newVal)
-        this.$nextTick(() => {
-          this.$refs.modelTestForm.clearValidate();
-        });
+        console.log(newVal.params,new Date())
         this.modelTest = newVal
-        this.modelTestType = newVal.componentType.includes('LSTM')?0:1
-        this.rules = {}
-       if (this.modelTestType === 0) {
-          this.rules = {...this.commonRules, ...this.LSTMRules}
+        this.modelTestType = newVal.componentType.includes('LSTM') ? 0 : 1
+        this.rulesModelTest = {}
+        if (this.modelTestType === 0) {
+          this.rulesModelTest = {...this.commonRules, ...this.LSTMRules}
         } else if (this.modelTestType === 1) {
-          this.rules = {...this.commonRules, ...this.machineRules}
+          this.rulesModelTest = {...this.commonRules, ...this.machineRules}
         }
-        this.form = JSON.parse(JSON.stringify(newVal.params))
-
+        if(JSON.stringify(newVal.params) !== '{}'){
+          this.form = JSON.parse(JSON.stringify(newVal.params))
+        }else{
+          this.form = {}
+        }
+        this.columnChange()
+        this.$nextTick(() => {
+          // alert()
+          this.$refs.modelTestForm.clearValidate();
+          this.$refs.modelTestForm.resetFields();
+        });
       },
       immediate: true,
       deep: true
@@ -136,6 +155,10 @@ export default {
   },
   data() {
     return {
+      stationType: [
+        {label: '光', value: '1'},
+        {label: '风', value: '2'}
+      ],
       forecastFileType: [
         {label: '测试', value: '0'},
         {label: '生产', value: '1'}
@@ -148,56 +171,60 @@ export default {
       modelTestType: 0,
       modelTest: {},
       form: {},
-      rules: {},
+      rulesModelTest: {},
       commonRules: {
         mongodb_database: [
-          {required: true, message: '请填写mongo库', trigger: 'blur'}
+          {required: true, message: '请填写mongo库', trigger: ['blur', 'change']}
         ],
         mongodb_write_table: [
-          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+          {required: true, message: '请填写写入的mongo表', trigger: ['blur', 'change']}
         ],
         mongodb_read_table: [
-          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+          {required: true, message: '请填写读取的mongo表', trigger: ['blur', 'change']}
         ],
         col_time: [
-          {required: true, message: '请填写时间列名', trigger: 'blur'}
+          {required: true, message: '请填写时间列名', trigger: ['blur', 'change']}
         ],
         farm_id: [
-          {required: true, message: '请填写站点编码', trigger: 'blur'}
+          {required: true, message: '请填写站点编码', trigger: ['blur', 'change']}
         ],
         target: [
-          {required: true, message: '请填写目标列', trigger: 'blur'}
+          {required: true, message: '请填写目标列', trigger: ['blur', 'change']}
         ],
         model_name: [
-          {required: true, message: '请填写模型名称', trigger: 'blur'}
+          {required: true, message: '请填写模型名称', trigger: ['blur', 'change']}
         ],
       },
       LSTMRules: {
         scaler_table: [
-          {required: true, message: '请填写归一化表', trigger: 'blur'}
+          {required: true, message: '请填写归一化表', trigger: ['blur', 'change']}
         ],
-        modelTest_table: [
-          {required: true, message: '请填写模型保存', trigger: 'blur'}
+        model_table: [
+          {required: true, message: '请填写存储的模型表', trigger: ['blur', 'change']}
         ],
         algorithm_test: [
           {required: true, message: '请选择测试or生产', trigger: 'change'}
         ],
         cap: [
-          {required: true, message: '请填写预测上限', trigger: 'blur'}
+          {required: true, message: '请填写预测上限', trigger: ['blur', 'change']}
+        ],
+        station_type: [
+          {required: true, message: '请选择类型', trigger: 'change'}
         ],
       },
       machineRules: {
         forecast_file: [
           {required: true, message: '请选择测试or生产', trigger: 'change'}
         ],
-        mongodb_modelTest_table: [
-          {required: true, message: '请填写mongodb_modelTest_table', trigger: 'blur'}
+        mongodb_model_table: [
+          {required: true, message: '请填写模型表', trigger: ['blur', 'change']}
         ],
         howLongAgo: [
-          {required: true, message: '请填写预测第N天', trigger: 'blur'}
+          {required: true, message: '请填写预测第N天', trigger: ['blur', 'change']}
         ],
       },
-      columnDisabled: false
+      columnDisabled: false,
+      stationTypeDisabled: false,
     }
   },
   mounted() {
@@ -211,7 +238,7 @@ export default {
           return true
         } else {
           this.$emit('child-event', {})
-          this.$message.warning(this.modelTest.componentType+'模块校验未通过')
+          this.$message.warning(this.modelTest.componentType + '模块校验未通过')
           return false;
         }
       });
@@ -219,18 +246,27 @@ export default {
       // this.dialogVisible = false
     },
     columnChange() {
-      if (this.form['forecast_file'] === '0' ||this.form['algorithm_test'] === '1') {
-        this.columnDisabled = false
-      } else {
-        if(this.modelTestType === 1){
-          this.$refs.modelTestForm.clearValidate('target')
-          this.$refs.modelTestForm.clearValidate('model_name')
+      if(this.modelTestType === 0){
+        if(this.form['algorithm_test'] === 'ok'){
+          this.stationTypeDisabled = true
+          this.rulesModelTest.station_type[0].required = false
+          this.form['station_type'] = null
         }else{
-          this.$refs.modelTestForm.clearValidate('target')
+          this.stationTypeDisabled = false
+          this.rulesModelTest.station_type[0].required = true
         }
+      }
+      if (this.form['forecast_file'] === '0' || this.form['algorithm_test'] === '1') {
+        this.columnDisabled = false
+        this.rulesModelTest.target[0].required = true
+      } else {
         this.columnDisabled = true
+        this.rulesModelTest.target[0].required = false
+        if(this.rulesModelTest.howLongAgo !==undefined){
+          this.rulesModelTest.howLongAgo[0].required = false
+        }
       }
-    }
+    },
   },
 
 }

+ 1 - 1
xvji-ui/src/views/tasks/training/reportForm.vue

@@ -38,7 +38,7 @@
                   :autosize="{ minRows: 1 }"></el-input>
       </el-form-item>
 
-      <el-form-item label="分组计算准确率的key值">
+      <el-form-item label="分组">
         <el-input v-model="form['group_key']" size="mini"
                   :disabled="!report.isEnable" type="textarea"
                   :autosize="{ minRows: 1 }"></el-input>