浏览代码

页面提交

zy 2 周之前
父节点
当前提交
2f1f29f0a0

+ 2 - 2
sql/ry_20220625.sql

@@ -539,7 +539,7 @@ create table sys_config (
 insert into sys_config values(1, '主框架页-默认皮肤样式名称',     'sys.index.skinName',            'skin-blue',     'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
 insert into sys_config values(2, '用户管理-账号初始密码',         'sys.user.initPassword',         '123456',        'Y', 'admin', sysdate(), '', null, '初始化密码 123456' );
 insert into sys_config values(3, '主框架页-侧边栏主题',           'sys.index.sideTheme',           'theme-dark',    'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' );
-insert into sys_config values(4, '账号自助-验证码开关',           'sys.account.captchaOnOff',      'true',          'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)');
+insert into sys_config values(4, '账号自助-验证码开关',           'sys.account.captchaOnOff',      'false',          'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)');
 insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser',      'false',         'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)');
 
 
@@ -686,4 +686,4 @@ create table gen_table_column (
   update_by         varchar(64)     default ''                 comment '更新者',
   update_time       datetime                                   comment '更新时间',
   primary key (column_id)
-) engine=innodb auto_increment=1 comment = '代码生成业务表字段';
+) engine=innodb auto_increment=1 comment = '代码生成业务表字段';

+ 1 - 1
xvji-ui/package.json

@@ -41,7 +41,7 @@
     "clipboard": "2.0.8",
     "core-js": "3.19.1",
     "echarts": "4.9.0",
-    "element-ui": "2.15.8",
+    "element-ui": "^2.15.8",
     "file-saver": "2.0.5",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",

+ 10 - 0
xvji-ui/src/api/xvji/training.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 新增训练任务
+export function addTask(data) {
+  return request({
+    url: '/task/predict/addTask',
+    method: 'post',
+    data: data
+  })
+}

+ 1 - 0
xvji-ui/src/assets/styles/index.scss

@@ -4,6 +4,7 @@
 @import './element-ui.scss';
 @import './sidebar.scss';
 @import './btn.scss';
+@import './xvji.scss';
 
 body {
   height: 100%;

+ 62 - 0
xvji-ui/src/assets/styles/xvji.scss

@@ -0,0 +1,62 @@
+.flex {
+  display: flex;
+}
+
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-justify-around {
+  justify-content: space-around;
+}
+
+.flex-justify-center {
+  justify-content: center;
+}
+
+.items-center {
+  align-items: center;
+}
+
+.position-relative {
+  position: relative;
+}
+
+.position-absolute {
+  position: absolute;
+}
+
+.ml-0 {
+  margin-left: .5vw;
+}
+
+.mt-0 {
+  margin-top: .5vw;
+}
+
+.mb-0 {
+  margin-bottom: .5vw;
+}
+
+.mr-0 {
+  margin-right: 1vw;
+}
+.ml-1 {
+  margin-left: 1vw;
+}
+
+.mt-1 {
+  margin-top: 1vw;
+}
+
+.mb-1 {
+  margin-bottom: 1vw;
+}
+
+.mr-1 {
+  margin-right: 1vw;
+}
+.font-bold{
+  font-weight: bold;
+}

+ 3 - 1
xvji-ui/src/main.js

@@ -37,7 +37,8 @@ import DictTag from '@/components/DictTag'
 import VueMeta from 'vue-meta'
 // 字典数据组件
 import DictData from '@/components/DictData'
-
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
 // 全局方法挂载
 Vue.prototype.getDicts = getDicts
 Vue.prototype.getConfigKey = getConfigKey
@@ -61,6 +62,7 @@ Vue.component('ImagePreview', ImagePreview)
 Vue.use(directive)
 Vue.use(plugins)
 Vue.use(VueMeta)
+Vue.use(ElementUI);
 DictData.install()
 
 /**

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

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

+ 1 - 1
xvji-ui/src/views/login.vue

@@ -89,7 +89,7 @@ export default {
       },
       loading: false,
       // 验证码开关
-      captchaOnOff: true,
+      captchaOnOff: false,
       // 注册开关
       register: false,
       redirect: undefined

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

@@ -0,0 +1,36 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="训练任务" name="first">
+        <training/>
+      </el-tab-pane>
+      <el-tab-pane label="预测任务" name="second">
+        <predict/>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+<script>
+import predict from './predict/index.vue'
+import training from './training/index.vue'
+export default {
+  components:{predict,training},
+  data() {
+    return {
+      activeName: 'first'
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    handleClick(tab, event) {
+      console.log(tab, event);
+    }
+  }
+}
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 191 - 0
xvji-ui/src/views/tasks/predict/dataCleanForm.vue

@@ -0,0 +1,191 @@
+<template>
+  <div>
+    <el-form ref="dataCleaningForm" :rules="rules" :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"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名称" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="是否配置生产" prop="forecast_file">
+        <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in forecastFileType" :disabled="!dataCleaning.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="场站类型" prop="plant_type">
+        <el-select v-model="form['plant_type']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in stationType" :disabled="!dataCleaning.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据清洗流程">
+        <el-input v-model="form['clean_param']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="特征衍生">
+        <el-input v-model="form['features_gen']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="装机容量" prop="cap">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!dataCleaning.enable" 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="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="nwp辐照列">
+        <el-input v-model="form['col_radiation']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="nwp风速列">
+        <el-input v-model="form['col_speed']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="容忍时间窗口">
+        <el-input v-model="form['tol']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="清洗上限">
+        <el-input v-model="form['upper_ratio']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="清洗下限">
+        <el-input v-model="form['lower_ratio']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="风速列1">
+        <el-input v-model="form['speed_1']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="风速列2">
+        <el-input v-model="form['speed_2']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.dataCleaningForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.dataCleaning = newVal
+        this.form = newVal.value
+      },
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      dataCleaning: {},
+      form: {},
+      rules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名称', trigger: 'blur'}
+        ],
+        forecast_file: [
+          {required: true, message: '请选择是否配置生产', trigger: 'change'}
+        ],
+        plant_type: [
+          {required: true, message: '请选择场站类型(solar/wind)', trigger: 'change'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+        target: [
+          {required: true, message: '请填写目标值', trigger: 'blur'}
+        ],
+      },
+      stationType: [
+        {label: 'solar', value: 'solar'},
+        {label: 'wind', value: 'wind'}
+      ],
+      forecastFileType: [
+        {label: '测试', value: '0'},
+        {label: '生产', value: '1'}
+      ],
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.dataCleaningForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+      // this.dialogVisible = false
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

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

@@ -0,0 +1,420 @@
+<template>
+  <div>
+    <el-form :inline="true" :model="queryParams" class="demo-form-inline">
+      <el-form-item label="任务名称">
+        <el-input size="small" v-model="queryParams.name" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="small" type="primary" plain @click="getList">查询</el-button>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="small" type="success" plain @click="addTask()">创建任务</el-button>
+      </el-form-item>
+    </el-form>
+    <div>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        border
+        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="状态"></el-table-column>
+        <el-table-column align="center" prop="tCreateTime" label="创建时间"></el-table-column>
+        <el-table-column align="center" prop="tCronExpression" label="定时任务"></el-table-column>
+        <el-table-column align="center" prop="tRunInfo" label="运行信息" width="100">
+          <template slot-scope="{row}">
+            <el-button @click="viewInfo(row)" type="text" size="small">查看</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column align="center"
+                         fixed="right"
+                         label="操作" width="200"
+        >
+          <template slot-scope="{row}">
+            <el-button @click="handleClick(row)" type="primary" plain size="mini">编辑</el-button>
+            <el-button @click="handleClick(row)" type="danger" plain size="mini">删除</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"
+      />
+    </div>
+    <el-dialog
+      :title="isEdit?'修改任务':'创建任务'"
+      :visible.sync="dialogVisible"
+      width="60%"
+      :before-close="handleClose" :close-on-click-modal="false">
+      <div>
+        <el-form ref="ruleForm" :rules="rules" :model="formData" class="demo-form-inline" label-width="130px">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="任务名称" prop="tTaskName" label-width="100px">
+                <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-row>
+
+
+        </el-form>
+        <div class="mode-table">
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0"></span>
+            <span class="pa-0 td td1 font-bold">是否开启</span>
+            <span class="pa-0 td2 font-bold">参数</span>
+          </div>
+          <!--    数据获取        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">数据获取</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.dataAcquisition.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                   <el-form ref="ruleForm" :rules="dataAcquisitionRules" :model="formData.dataAcquisition.value"
+                            class="demo-form-inline"
+                            label-width="130px">
+                      <el-form-item label="查询语句" prop="query_sql">
+                        <el-input v-model="formData.dataAcquisition.value['query_sql']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                      <el-form-item label="mongo库" prop="mongodb_database">
+                        <el-input v-model="formData.dataAcquisition.value['mongodb_database']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                     <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+                        <el-input v-model="formData.dataAcquisition.value['mongodb_write_table']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                     <el-form-item label="查询的mysql库" prop="mysql_database">
+                        <el-input v-model="formData.dataAcquisition.value['mysql_database']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                   </el-form>
+                </div>
+              </span>
+          </div>
+          <!--    数据处理        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">数据处理</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.dataCleaning.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <data-clean-form ref="dataCleaning" :form-data="formData.dataCleaning"
+                                   @child-event="getDataCleaning"></data-clean-form>
+                </div>
+              </span>
+          </div>
+
+          <!--    模型        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">
+              <el-select v-model="formData.model.name" placeholder="请选择" size="small"
+                         style="width: 100%">
+                <el-option
+                  v-for="item in modelName"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.model.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false" disabled>关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <model-form ref="model" :form-data="formData.model" @child-event="getModel"></model-form>
+                </div>
+              </span>
+          </div>
+
+          <!--    后处理        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">后处理</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.processing.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <processing-form ref="processing" :form-data="formData.processing"
+                                   @child-event="getProcessing"></processing-form>
+                </div>
+              </span>
+          </div>
+
+
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="handleClose">取 消</el-button>
+        <el-button size="small" type="primary" @click="saveTask">确 定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="运行信息"
+      :visible.sync="dialogInfoVisible"
+      width="30%"
+    >
+      <div>
+        {{ info }}
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="dialogInfoVisible = false">关 闭</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import dataCleanForm from './dataCleanForm.vue'
+import modelForm from './modelForm.vue'
+import processingForm from './processingForm.vue'
+
+export default {
+  components: {modelForm, dataCleanForm, processingForm},
+  data() {
+    return {
+      loading: false,
+      tableData: [],
+      formData: {
+        dataAcquisition: {name: '数据获取', enable: true, value: {}},
+        dataCleaning: {name: '数据处理', enable: true, value: {}},
+        powerRationing: {name: '限电清洗', enable: true, value: {}},
+        model: {name: '模型', enable: true, value: {}},
+        modelTest: {name: '模型测试', enable: true, value: {}},
+        processing: {name: '后处理', enable: true, value: {}},
+        report: {name: '分析报告', enable: true, value: {}},
+      },
+      // 总条数
+      total: 0,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: '',
+      },
+      isEdit: false,
+      dialogVisible: false,
+      dialogInfoVisible: false,
+      info: '',
+      rules: {
+        tTaskName: [
+          {required: true, message: '请填写任务名称', trigger: 'blur'}
+        ],
+        name: [
+          {required: true, message: '请填写任务名称', trigger: 'blur'}
+        ],
+
+      },
+      dataAcquisitionRules: {
+        query_sql: [
+          {required: true, message: '请填写查询语句', trigger: 'blur'}
+        ],
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mysql_database: [
+          {required: true, message: '请填写查询的mysql库', trigger: 'blur'}
+        ],
+      },
+      powerRationingName: [
+        {label: '限电清洗-光伏', value: '限电清洗-光伏'},
+        {label: '限电清洗-风电', value: '限电清洗-风电'}
+      ],
+      modelName: [
+        {label: '光伏物理模型', value: '光伏物理模型'},
+        {label: '风电物理模型', value: '风电物理模型'},
+        {label: 'Holtwinters模型', value: 'Holtwinters模型'},
+        {label: 'LSTM', value: 'LSTM'},
+        {label: '机器学习模型', value: '机器学习模型'}
+      ]
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      this.tableData = [
+        {
+          tTaskId: '1',
+          tTaskName: 'T00001',
+          tTaskStatus: '0',
+          tCreateTime: '',
+          tCronExpression: '',
+          tAnalysisReport: '',
+          tRunInfo: '1111'
+        },
+        {
+          tTaskId: '2',
+          tTaskName: 'T00002',
+          tTaskStatus: '1',
+          tCreateTime: '',
+          tCronExpression: '',
+          tAnalysisReport: '',
+          tRunInfo: '1111'
+        }
+      ]
+      this.total = this.tableData.length
+      this.loading = false
+    },
+    // 新增
+    addTask() {
+
+      this.isEdit = false
+      this.dialogVisible = true
+      this.formData = {
+        tTaskId: '',
+        tTaskName: '',
+        tCronExpression: '',
+        dataAcquisition: {name: '数据获取', enable: true, value: {}},
+        dataCleaning: {name: '数据处理', enable: true, value: {}},
+        model: {name: '光伏物理模型', enable: true, value: {}},
+        processing: {name: '后处理', enable: true, value: {}},
+      }
+      this.$nextTick(() => {
+        this.$refs.ruleForm.clearValidate()
+      })
+    },
+    // 编辑
+    handleClick() {
+      this.isEdit = true
+      this.dialogVisible = true
+    },
+    //保存
+    saveTask() {
+      this.$refs.ruleForm.validate(async (valid) => {
+        if (valid) {
+          alert('submit!');
+          await this.$refs.dataCleaning.saveTask()
+          if (JSON.stringify(this.formData.dataCleaning.value) === '{}') {
+            return false
+          }
+          await this.$refs.model.saveTask()
+          if (JSON.stringify(this.formData.model.value) === '{}') {
+            return false
+          }
+          await this.$refs.processing.saveTask()
+          if (JSON.stringify(this.formData.processing.value) === '{}') {
+            return false
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+      // this.dialogVisible = false
+    },
+    // 数据处理数据
+    getDataCleaning(val) {
+      this.formData.dataCleaning.value = val
+    },
+    getModel(val) {
+      this.formData.model.value = val
+    },
+
+    getProcessing(val) {
+      this.formData.processing.value = val
+    },
+
+    handleClose() {
+      this.$refs.ruleForm.resetFields()
+      this.formData = {
+        tTaskId: '',
+        tTaskName: '',
+        tCronExpression: '',
+        dataAcquisition: {name: '数据获取', enable: true, value: {}},
+        dataCleaning: {name: '数据处理', enable: true, value: {}},
+        model: {name: '光伏物理模型', enable: true, value: {}},
+        processing: {name: '后处理', enable: true, value: {}},
+      }
+      this.dialogVisible = false
+    },
+
+    // 运行信息
+    viewInfo(row) {
+      this.info = row.tRunInfo
+      this.dialogInfoVisible = true
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.form-table-item {
+  max-height: 30vh;
+  overflow-y: auto;
+
+  ::v-deep .el-form-item {
+    margin-bottom: 15px;
+  }
+}
+
+.td0 {
+  width: 200px;
+}
+
+.td1 {
+  width: 150px;
+}
+
+.td2 {
+  width: calc(100% - 350px);
+}
+
+.mode-table .model-table-tr:last-child {
+  border-bottom: 1px solid #ebeef5;
+}
+
+.model-table-tr {
+  width: 100%;
+  text-align: center;
+  border: 1px solid #ebeef5;
+  border-bottom: none;
+  line-height: 30px;
+
+  .td {
+    border-right: 1px solid #ebeef5;
+    display: grid;
+    place-items: center;
+  }
+
+  .pa-0 {
+    padding: 0 .5vw;
+
+  }
+}
+
+</style>

+ 380 - 0
xvji-ui/src/views/tasks/predict/modelForm.vue

@@ -0,0 +1,380 @@
+<template>
+  <div>
+    <el-form ref="modelForm" :rules="rules" :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"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!model.enable" 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"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="站点编码" prop="farm_id">
+        <el-input v-model="form['farm_id']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+      <el-form-item label="辐照度列" prop="col_radiance" v-if="modelType === 0">
+        <el-input v-model="form['col_radiance']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="风速列" prop="col_speed" v-if="modelType === 1">
+        <el-input v-model="form['col_speed']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="辐照度最大值" prop="radiance_max" v-if="modelType === 0">
+        <el-input v-model="form['radiance_max']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="装机容量" prop="cap" v-if="modelType !== 2">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="归一化表" prop="scaler_table" v-if="modelType === 3">
+        <el-input v-model="form['scaler_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="是否配置生产" prop="forecast_file" v-if="modelType !== 3" @change="forecastFileChange">
+        <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in forecastFileType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="测试or生产" 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
+            v-for="item in algorithmTestType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据开始时间">
+        <el-input v-model="form['timeBegin']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="数据结束时间">
+        <el-input v-model="form['timeEnd']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </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%">
+          <el-option
+            v-for="item in sigmoidParamType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </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.enable || 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.enable ||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.enable || 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.enable || columnDisabled" type="textarea"
+                    :autosize="{ minRows: 1 }"></el-input>
+        </el-form-item>
+      </div>
+
+      <el-form-item label="预测长度" prop="pre_len" v-if="modelType === 2">
+        <el-input v-model="form['pre_len']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="预测粒度" prop="freq" v-if="modelType ===2">
+        <el-select v-model="form['freq']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in sigmoidParamType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="模型名称" prop="model_name">
+        <el-input v-model="form['model_name']" size="mini"
+                  :disabled="!model.enable || (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-input v-model="form['model_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </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.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="日出时间" v-if="modelType === 2">
+        <el-input v-model="form['sunrise']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="日落时间" v-if="modelType === 2">
+        <el-input v-model="form['sunset']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.modelForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.$nextTick(() => {
+          this.$refs.modelForm.clearValidate()
+        });
+        this.model = newVal
+        this.modelType = this.modelName.find(w => w.label === newVal.name).value
+        this.rules = {}
+        if(this.modelType === 0){
+          this.rules = { ...this.commonRules, ...this.solarRules }
+        }else if(this.modelType === 1){
+          this.rules = { ...this.commonRules, ...this.windRules }
+        }else if(this.modelType === 2){
+          this.rules = { ...this.commonRules, ...this.HoltwintersRules }
+        }else if(this.modelType === 3){
+          this.rules = { ...this.commonRules, ...this.LSTMRules }
+        }else if(this.modelType === 4){
+          this.rules = { ...this.commonRules, ...this.machineRules }
+        }
+        this.form = newVal.value
+
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  data() {
+    return {
+      forecastFileType: [
+        {label: '测试', value: '0'},
+        {label: '生产', value: '1'}
+      ],
+      algorithmTestType: [
+        {label: '测试', value: '1'},
+        {label: '生产', value: '0'},
+        {label: '其他', value: 'ok'}
+      ],
+      sigmoidParamType: [
+        {label: 'L', value: '1'},
+        {label: 'x0', value: '7'},
+        {label: 'k', value: '0.9'}
+      ],
+      modelName: [
+        {label: '光伏物理模型', value: 0},
+        {label: '风电物理模型', value: 1},
+        {label: 'Holtwinters模型', value: 2},
+        {label: 'LSTM', value: 3},
+        {label: '机器学习模型', value: 4}
+      ],
+      modelType: 0,
+      model: {},
+      form: {},
+      rules: {},
+      commonRules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名', trigger: 'blur'}
+        ],
+        farm_id: [
+          {required: true, message: '请填写站点编码', trigger: 'blur'}
+        ],
+        target: [
+          {required: true, message: '请填写目标列', trigger: 'blur'}
+        ],
+        model_name: [
+          {required: true, message: '请填写模型名称', trigger: 'blur'}
+        ],
+
+
+      },
+      solarRules: {
+        radiance_max: [
+          {required: true, message: '请填写辐照度最大值', trigger: 'blur'}
+        ],
+        col_radiance: [
+          {required: true, message: '请填写辐照度列名', trigger: 'blur'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+      },
+      windRules: {
+        sigmoid_param: [
+          {required: true, message: '请选择平滑参数', trigger: 'change'}
+        ],
+        col_speed: [
+          {required: true, message: '请填写实测风速列', trigger: 'blur'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+      },
+      HoltwintersRules: {
+        freq: [
+          {required: true, message: '请选择预测粒度', trigger: 'change'}
+        ],
+        pre_len: [
+          {required: true, message: '请填写预测长度', trigger: 'blur'}
+        ],
+        seasonal_periods: [
+          {required: true, message: '请填写周期', trigger: 'blur'}
+        ],
+      },
+      LSTMRules: {
+        scaler_table: [
+          {required: true, message: '请填写归一化表', trigger: 'blur'}
+        ],
+        model_table: [
+          {required: true, message: '请填写模型保存表名', trigger: 'blur'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+        algorithm_test: [
+          {required: true, message: '请选择测试or生产', trigger: 'change'}
+        ],
+      },
+      machineRules: {
+
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+        mongodb_modelTest_table: [
+          {required: true, message: '请填写mongodb_modelTest_table', trigger: 'blur'}
+        ],
+      },
+      columnDisabled: 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!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+
+      // this.dialogVisible = false
+    },
+    forecastFileChange(){
+      if(this.form['forecast_file'] === '0'){
+        this.form['howLongAgo'] = '1'
+        this.$refs.modelForm.clearValidate('target')
+        this.$refs.modelForm.clearValidate('model_name')
+      }else{
+        this.form['howLongAgo'] = ''
+      }
+    },
+    columnChange() {
+      if (this.form['algorithm_test'] === '1') {
+        this.columnDisabled = false
+      } 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
+      }
+    }
+  },
+
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 125 - 0
xvji-ui/src/views/tasks/predict/processingForm.vue

@@ -0,0 +1,125 @@
+<template>
+  <div>
+    <el-form ref="processingForm" :rules="rules" :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"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名称" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="类型" prop="plant_type">
+        <el-select v-model="form['plant_type']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in plantType" :disabled="!processing.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据清洗流程">
+        <el-input v-model="form['mongodb_nwp_table']" size="mini"
+                  :disabled="!processing.enable || form['plant_type'] ==='wind'" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="平滑参数" prop="process_param">
+        <el-input v-model="form['process_param']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.processingForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.processing = newVal
+        this.form = newVal.value
+      },
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      processing: {},
+      form: {},
+      rules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名称', trigger: 'blur'}
+        ],
+        plant_type: [
+          {required: true, message: '请选择场站类型', trigger: 'change'}
+        ],
+        process_param: [
+          {required: true, message: '请填写平滑参数', trigger: 'blur'}
+        ],
+      },
+      plantType: [
+        {label: 'solar', value: 'solar'},
+        {label: 'wind', value: 'wind'}
+      ],
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.processingForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+      // this.dialogVisible = false
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 191 - 0
xvji-ui/src/views/tasks/training/dataCleanForm.vue

@@ -0,0 +1,191 @@
+<template>
+  <div>
+    <el-form ref="dataCleaningForm" :rules="rules" :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"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名称" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="是否配置生产" prop="forecast_file">
+        <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in forecastFileType" :disabled="!dataCleaning.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="场站类型" prop="plant_type">
+        <el-select v-model="form['plant_type']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in stationType" :disabled="!dataCleaning.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据清洗流程">
+        <el-input v-model="form['clean_param']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="特征衍生">
+        <el-input v-model="form['features_gen']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="装机容量" prop="cap">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!dataCleaning.enable" 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="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="nwp辐照列">
+        <el-input v-model="form['col_radiation']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="nwp风速列">
+        <el-input v-model="form['col_speed']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="容忍时间窗口">
+        <el-input v-model="form['tol']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="清洗上限">
+        <el-input v-model="form['upper_ratio']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="清洗下限">
+        <el-input v-model="form['lower_ratio']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="风速列1">
+        <el-input v-model="form['speed_1']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="风速列2">
+        <el-input v-model="form['speed_2']" size="mini"
+                  :disabled="!dataCleaning.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.dataCleaningForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.dataCleaning = newVal
+        this.form = newVal.value
+      },
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      dataCleaning: {},
+      form: {},
+      rules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名称', trigger: 'blur'}
+        ],
+        forecast_file: [
+          {required: true, message: '请选择是否配置生产', trigger: 'change'}
+        ],
+        plant_type: [
+          {required: true, message: '请选择场站类型(solar/wind)', trigger: 'change'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+        target: [
+          {required: true, message: '请填写目标值', trigger: 'blur'}
+        ],
+      },
+      stationType: [
+        {label: 'solar', value: 'solar'},
+        {label: 'wind', value: 'wind'}
+      ],
+      forecastFileType: [
+        {label: '测试', value: '0'},
+        {label: '生产', value: '1'}
+      ],
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.dataCleaningForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+      // this.dialogVisible = false
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 564 - 0
xvji-ui/src/views/tasks/training/index.vue

@@ -0,0 +1,564 @@
+<template>
+  <div>
+    <el-form :inline="true" :model="queryParams" class="demo-form-inline">
+      <el-form-item label="任务名称">
+        <el-input size="small" v-model="queryParams.name" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="small" type="primary" plain @click="getList">查询</el-button>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="small" type="success" plain @click="addTask()">创建任务</el-button>
+      </el-form-item>
+    </el-form>
+    <div>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        border
+        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="状态"></el-table-column>
+        <el-table-column align="center" prop="tCreateTime" label="创建时间"></el-table-column>
+        <el-table-column align="center" prop="tCronExpression" label="定时任务"></el-table-column>
+        <el-table-column align="center" prop="tAnalysisReport" label="报告分析" width="100">
+          <template slot-scope="{row}">
+            <el-button @click="viewReport(row)" type="text" size="small">预览</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="tRunInfo" label="运行信息" width="100">
+          <template slot-scope="{row}">
+            <el-button @click="viewInfo(row)" type="text" size="small">查看</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column align="center"
+                         fixed="right"
+                         label="操作" width="200"
+        >
+          <template slot-scope="{row}">
+            <el-button @click="handleClick(row)" type="primary" plain size="mini">编辑</el-button>
+            <el-button @click="handleClick(row)" type="danger" plain size="mini">删除</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"
+      />
+    </div>
+    <el-dialog
+      :title="isEdit?'修改任务':'创建任务'"
+      :visible.sync="dialogVisible"
+      width="60%"
+      :before-close="handleClose" :close-on-click-modal="false">
+      <div>
+        <el-form ref="ruleForm" :rules="rules" :model="formData" class="demo-form-inline" label-width="130px">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="任务名称" prop="tTaskName" label-width="100px">
+                <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-row>
+
+
+        </el-form>
+        <div class="mode-table">
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0"></span>
+            <span class="pa-0 td td1 font-bold">是否开启</span>
+            <span class="pa-0 td2 font-bold">参数</span>
+          </div>
+          <!--    数据获取        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">数据获取</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.dataAcquisition.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                   <el-form ref="ruleForm" :rules="dataAcquisitionRules" :model="formData.dataAcquisition.value"
+                            class="demo-form-inline"
+                            label-width="130px">
+                      <el-form-item label="查询语句" prop="query_sql">
+                        <el-input v-model="formData.dataAcquisition.value['query_sql']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                      <el-form-item label="mongo库" prop="mongodb_database">
+                        <el-input v-model="formData.dataAcquisition.value['mongodb_database']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                     <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+                        <el-input v-model="formData.dataAcquisition.value['mongodb_write_table']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                     <el-form-item label="查询的mysql库" prop="mysql_database">
+                        <el-input v-model="formData.dataAcquisition.value['mysql_database']" size="mini"
+                                  :disabled="!formData.dataAcquisition.enable" type="textarea"
+                                  :autosize="{ minRows: 1 }"></el-input>
+                      </el-form-item>
+                   </el-form>
+                </div>
+              </span>
+          </div>
+          <!--    数据处理        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">数据处理</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.dataCleaning.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <data-clean-form ref="dataCleaning" :form-data="formData.dataCleaning"
+                                   @child-event="getDataCleaning"></data-clean-form>
+                </div>
+              </span>
+          </div>
+          <!--    限电        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">
+              <el-select v-model="formData.powerRationing.name" @change="powerRationingNameChange" placeholder="请选择"
+                         size="small" style="width: 100%">
+                <el-option
+                  v-for="item in powerRationingName"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.powerRationing.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <power-rationing-form ref="powerRationing" :form-data="formData.powerRationing"
+                                        @child-event="getPowerRationing"></power-rationing-form>
+                </div>
+              </span>
+          </div>
+          <!--    模型        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">
+              <el-select v-model="formData.model.name" @change="isDisableModeTest" placeholder="请选择" size="small"
+                         style="width: 100%">
+                <el-option
+                  v-for="item in modelName"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.model.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false" disabled>关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <model-form ref="model" :form-data="formData.model" @child-event="getModel"></model-form>
+                </div>
+              </span>
+          </div>
+          <!--    模型测试        -->
+          <div class="flex model-table-tr" v-if="!modelTestDisable">
+            <span class="pa-0 td td0">{{ formData.modelTest.name }}</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.modelTest.enable" size="mini">
+                  <el-radio-button :label="true" :disabled="modelTestDisable">开启</el-radio-button>
+                  <el-radio-button :label="false" disabled>关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <model-test-form ref="modelTest" :form-data="formData.modelTest"
+                                   @child-event="getModelTest"></model-test-form>
+                </div>
+              </span>
+          </div>
+          <!--    后处理        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">后处理</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.processing.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <processing-form ref="processing" :form-data="formData.processing"
+                                   @child-event="getProcessing"></processing-form>
+                </div>
+              </span>
+          </div>
+          <!--    分析报告        -->
+          <div class="flex model-table-tr">
+            <span class="pa-0 td td0">分析报告</span>
+            <span class="pa-0 td td1">
+                 <el-radio-group v-model="formData.report.enable" size="mini">
+                  <el-radio-button :label="true">开启</el-radio-button>
+                  <el-radio-button :label="false">关闭</el-radio-button>
+                </el-radio-group>
+              </span>
+            <span class="pa-0 td2">
+                <div class="form-table-item">
+                  <report-form ref="report" :form-data="formData.report"
+                               @child-event="getReport"></report-form>
+                </div>
+              </span>
+          </div>
+
+
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="handleClose">取 消</el-button>
+        <el-button size="small" type="primary" @click="saveTask">确 定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="运行信息"
+      :visible.sync="dialogInfoVisible"
+      width="30%"
+     >
+      <div>
+        {{ info }}
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="dialogInfoVisible = false">关 闭</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import dataCleanForm from './dataCleanForm.vue'
+import powerRationingForm from './powerRationingForm.vue'
+import modelForm from './modelForm.vue'
+import modelTestForm from './modelTestForm.vue'
+import processingForm from './processingForm.vue'
+import reportForm from './reportForm.vue'
+import {addTask} from "@/api/xvji/training";
+
+export default {
+  components: {modelForm, modelTestForm, dataCleanForm, powerRationingForm, processingForm, reportForm},
+  data() {
+    return {
+      loading: false,
+      tableData: [],
+      formData: {
+        dataAcquisition: {name: '数据获取', enable: true, value: {}},
+        dataCleaning: {name: '数据处理', enable: true, value: {}},
+        powerRationing: {name: '限电清洗', enable: true, value: {
+            mongodb_database:'',
+            mongodb_read_table:'',
+            mongodb_write_table:'',
+            col_power:'',
+            col_radiance:'',
+            sigma:'1'
+          }},
+        model: {name: '模型', enable: true, value: {}},
+        modelTest: {name: '模型测试', enable: true, value: {}},
+        processing: {name: '后处理', enable: true, value: {}},
+        report: {name: '分析报告', enable: true, value: {}},
+      },
+      modelTestDisable: true,
+      // 总条数
+      total: 0,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: '',
+      },
+      isEdit: false,
+      dialogVisible: false,
+      dialogInfoVisible: false,
+      info: '',
+      rules: {
+        tTaskName: [
+          {required: true, message: '请填写任务名称', trigger: 'blur'}
+        ],
+        name: [
+          {required: true, message: '请填写任务名称', trigger: 'blur'}
+        ],
+
+      },
+      dataAcquisitionRules: {
+        query_sql: [
+          {required: true, message: '请填写查询语句', trigger: 'blur'}
+        ],
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mysql_database: [
+          {required: true, message: '请填写查询的mysql库', trigger: 'blur'}
+        ],
+      },
+      powerRationingName: [
+        {label: '限电清洗-光伏', value: '限电清洗-光伏'},
+        {label: '限电清洗-风电', value: '限电清洗-风电'}
+      ],
+      modelName: [
+        {label: '光伏物理模型', value: '光伏物理模型'},
+        {label: '风电物理模型', value: '风电物理模型'},
+        {label: 'Holtwinters模型', value: 'Holtwinters模型'},
+        {label: 'LSTM', value: 'LSTM'},
+        {label: '机器学习模型', value: '机器学习模型'}
+      ]
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.loading = true
+      this.tableData = [
+        {
+          tTaskId: '1',
+          tTaskName: 'T00001',
+          tTaskStatus: '0',
+          tCreateTime: '',
+          tCronExpression: '',
+          tAnalysisReport: '',
+          tRunInfo: '1111'
+        },
+        {
+          tTaskId: '2',
+          tTaskName: 'T00002',
+          tTaskStatus: '1',
+          tCreateTime: '',
+          tCronExpression: '',
+          tAnalysisReport: '',
+          tRunInfo: '1111'
+        }
+      ]
+      this.total = this.tableData.length
+      this.loading = false
+    },
+    // 新增
+    addTask() {
+
+      this.isEdit = false
+      this.dialogVisible = true
+      this.formData = {
+        tTaskName: '',
+        tCronExpression: '',
+        dataAcquisition: {name: '数据获取', enable: true, value: {}},
+        dataCleaning: {name: '数据处理', enable: true, value: {}},
+        powerRationing: {name: '限电清洗-光伏', enable: true, value: {}},
+        model: {name: '光伏物理模型', enable: true, value: {}},
+        modelTest: {name: '模型测试', enable: true, value: {}},
+        processing: {name: '后处理', enable: true, value: {}},
+        report: {name: '分析报告', enable: true, value: {}},
+      }
+      this.$nextTick(()=>{
+        this.$refs.ruleForm.clearValidate()
+      })
+    },
+    // 编辑
+    handleClick() {
+      this.isEdit = true
+      this.dialogVisible = true
+    },
+    //保存
+    saveTask() {
+      this.$refs.ruleForm.validate(async (valid) => {
+        if (valid) {
+          alert('submit!');
+          await this.$refs.dataCleaning.saveTask()
+          if (JSON.stringify(this.formData.dataCleaning.value) === '{}') {
+            return false
+          }
+          await this.$refs.powerRationing.saveTask()
+          if (JSON.stringify(this.formData.powerRationing.value) === '{}') {
+            return false
+          }
+          await this.$refs.model.saveTask()
+          if (JSON.stringify(this.formData.model.value) === '{}') {
+            return false
+          }
+          if (this.formData.model.name.includes('LSTM') || this.formData.model.name.includes('机器')) {
+            await this.$refs.modelTest.saveTask()
+            if (JSON.stringify(this.formData.modelTest.value) === '{}') {
+              return false
+            }
+          }else{
+            this.formData.modelTest = {}
+          }
+          await this.$refs.processing.saveTask()
+          if (JSON.stringify(this.formData.processing.value) === '{}') {
+            return false
+          }
+          await this.$refs.report.saveTask()
+          if (JSON.stringify(this.formData.report.value) === '{}') {
+            return false
+          }
+        } else {
+          console.log('校验不通过');
+          return false;
+        }
+        if(!this.isEdit){
+          addTask(this.formData).then(res=>{
+
+          })
+        }
+      });
+      // this.dialogVisible = false
+    },
+
+    // 数据处理数据
+    getDataCleaning(val) {
+      this.formData.dataCleaning.value = val
+    },
+    getPowerRationing(val) {
+      this.formData.powerRationing.value = val
+    },
+    getModel(val) {
+      this.formData.model.value = val
+    },
+    getModelTest(val) {
+      this.formData.modelTest.value = val
+    },
+    getProcessing(val) {
+      this.formData.processing.value = val
+    },
+    getReport(val) {
+      this.formData.report.value = val
+    },
+    powerRationingNameChange() {
+      // if (!this.isEdit) {
+      //   if (this.formData.powerRationing.name.includes('光伏')) {
+      //     this.formData.powerRationing.value = {
+      //       mongodb_database:'',
+      //       mongodb_read_table:'',
+      //       mongodb_write_table:'',
+      //       col_power:'',
+      //       col_radiance:'',
+      //       sigma: 1
+      //     }
+      //   } else {
+      //     this.formData.powerRationing.value = {
+      //       mongodb_database:'',
+      //       mongodb_read_table:'',
+      //       mongodb_write_table:'',
+      //       col_power:'',
+      //       col_ws:'',
+      //       cap:'',
+      //       eps: 0.1,
+      //       min_samples: '20'
+      //     }
+      //   }
+      // }
+    },
+    isDisableModeTest() {
+      if (this.formData.model.name.includes('LSTM') || this.formData.model.name.includes('机器')) {
+        this.modelTestDisable = false
+        this.formData.modelTest.enable = true
+        this.formData.modelTest.name = this.formData.model.name + '测试'
+        return
+      }
+      this.modelTestDisable = true
+      this.formData.modelTest.enable = false
+    },
+    handleClose() {
+      this.$refs.ruleForm.resetFields()
+      // this.formData = {
+      //   tTaskName: '',
+      //   tCronExpression: '',
+      //   dataAcquisition: {name: '数据获取', enable: true, value: {}},
+      //   dataCleaning: {name: '数据处理', enable: true, value: {}},
+      //   powerRationing: {name: '限电清洗-光伏', enable: true, value: {}},
+      //   model: {name: '光伏物理模型', enable: true, value: {}},
+      //   modelTest: {name: '模型测试', enable: true, value: {}},
+      //   processing: {name: '后处理', enable: true, value: {}},
+      //   report: {name: '分析报告', enable: true, value: {}},
+      // }
+      this.dialogVisible = false
+    },
+    // 预览报告文件
+    viewReport() {
+
+    },
+    // 运行信息
+    viewInfo(row) {
+      this.info = row.tRunInfo
+      this.dialogInfoVisible = true
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.form-table-item {
+  max-height: 30vh;
+  overflow-y: auto;
+
+  ::v-deep .el-form-item {
+    margin-bottom: 15px;
+  }
+}
+
+.td0 {
+  width: 200px;
+}
+
+.td1 {
+  width: 150px;
+}
+
+.td2 {
+  width: calc(100% - 350px);
+}
+
+.mode-table .model-table-tr:last-child {
+  border-bottom: 1px solid #ebeef5;
+}
+
+.model-table-tr {
+  width: 100%;
+  text-align: center;
+  border: 1px solid #ebeef5;
+  border-bottom: none;
+  line-height: 30px;
+
+  .td {
+    border-right: 1px solid #ebeef5;
+    display: grid;
+    place-items: center;
+  }
+
+  .pa-0 {
+    padding: 0 .5vw;
+
+  }
+}
+
+</style>

+ 419 - 0
xvji-ui/src/views/tasks/training/modelForm.vue

@@ -0,0 +1,419 @@
+<template>
+  <div>
+    <el-form ref="modelForm" :rules="rules" :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"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table" v-if="modelType !== 3">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="站点编码" prop="farm_id">
+        <el-input v-model="form['farm_id']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+      <el-form-item label="辐照度列" prop="col_radiance" v-if="modelType === 0">
+        <el-input v-model="form['col_radiance']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="风速列" prop="col_speed" v-if="modelType === 1">
+        <el-input v-model="form['col_speed']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="辐照度最大值" prop="radiance_max" v-if="modelType === 0">
+        <el-input v-model="form['radiance_max']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item :label="modelType ===3?'预测上限':'装机容量'" prop="cap" v-if="modelType !== 2">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="归一化表" prop="scaler_table" v-if="modelType === 3">
+        <el-input v-model="form['scaler_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="是否配置生产" prop="forecast_file" v-if="modelType !== 3 && modelType !==4" @change="forecastFileChange">
+        <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in forecastFileType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据开始时间">
+        <el-input v-model="form['timeBegin']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="数据结束时间">
+        <el-input v-model="form['timeEnd']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </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%">
+          <el-option
+            v-for="item in sigmoidParamType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="测试第N天" v-if="modelType !== 3 && modelType !==4">
+        <el-input v-model="form['howLongAgo']" size="mini"
+                  :disabled="!model.enable || form['forecast_file'] !=='0'" 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.enable || form['forecast_file'] !=='0'" 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"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="预测粒度" prop="freq" v-if="modelType ===2">
+        <el-select v-model="form['freq']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in sigmoidParamType" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="模型名称" prop="model_name">
+        <el-input v-model="form['model_name']" size="mini"
+                  :disabled="!model.enable || form['forecast_file'] !=='0'" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="模型保存表名" prop="model_table" v-if="modelType ===3">
+        <el-input v-model="form['model_table']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="模型类型" prop="model_type" v-if="modelType ===4">
+        <el-select v-model="form['model_type']" clearable placeholder="请选择" size="small" style="width: 100%" @change="modelTypeChange">
+          <el-option
+            v-for="item in model_type" :disabled="!model.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="特征" prop="features" v-if="modelType ===3">
+        <el-input v-model="form['features']" size="mini"
+                  :disabled="!model.enable" 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.enable"
+            :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.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="日出时间" v-if="modelType === 2">
+        <el-input v-model="form['sunrise']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="日落时间" v-if="modelType === 2">
+        <el-input v-model="form['sunset']" size="mini"
+                  :disabled="!model.enable" type="textarea"
+                  :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"
+                  :disabled="!model.enable" type="textarea"
+                  :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"
+                  :disabled="(!model.enable) || categoricalFeaturesDisable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+<el-form-item label="模型参数" prop="model_params" v-if="modelType === 4">
+        <el-input v-model="form['model_params']" size="mini"
+                  :disabled="!model.enable " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+<el-form-item label="迭代次数" prop="num_boost_round" v-if="modelType === 4">
+        <el-input v-model="form['num_boost_round']" size="mini"
+                  :disabled="!model.enable " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+<el-form-item label="目标列" prop="label" v-if="modelType === 4">
+        <el-input v-model="form['label']" size="mini"
+                  :disabled="!model.enable " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.modelForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.$nextTick(() => {
+          this.$refs.modelForm.clearValidate()
+        });
+        this.model = newVal
+        this.modelType = this.modelName.find(w => w.label === newVal.name).value
+        this.rules = {}
+        if(this.modelType === 0){
+          this.rules = { ...this.commonRules, ...this.solarRules }
+        }else if(this.modelType === 1){
+          this.rules = { ...this.commonRules, ...this.windRules }
+        }else if(this.modelType === 2){
+          this.rules = { ...this.commonRules, ...this.HoltwintersRules }
+        }else if(this.modelType === 3){
+          this.rules = { ...this.commonRules, ...this.LSTMRules }
+        }else if(this.modelType === 4){
+          this.rules = { ...this.commonRules, ...this.machineRules }
+        }
+        this.form = JSON.parse(JSON.stringify(newVal.value))
+
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  data() {
+    return {
+      forecastFileType: [
+        {label: '测试', value: '0'},
+        {label: '生产', value: '1'}
+      ],
+      sigmoidParamType: [
+        {label: 'L', value: '1'},
+        {label: 'x0', value: '7'},
+        {label: 'k', value: '0.9'}
+      ],
+      freqType: [
+        {label: '1Min', value: '1Min'},
+        {label: '15Min', value: '15Min'},
+        {label: '1Hour', value: '1Hour'}
+      ],
+      modelName: [
+        {label: '光伏物理模型', value: 0},
+        {label: '风电物理模型', value: 1},
+        {label: 'Holtwinters模型', value: 2},
+        {label: 'LSTM', value: 3},
+        {label: '机器学习模型', value: 4}
+      ],
+      stationType: [
+        {label: '光', value: '1'},
+        {label: '风', value: '2'},
+        {label: '其他', value: '3'}
+      ],
+      model_type: [
+        {label: 'svr', value: 'svr'},
+        {label: 'lightgbm', value: 'lightgbm'}
+      ],
+      modelType: 0,
+      model: {},
+      form: {},
+      rules: {},
+      commonRules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名', trigger: 'blur'}
+        ],
+        farm_id: [
+          {required: true, message: '请填写站点编码', trigger: 'blur'}
+        ],
+        target: [
+          {required: true, message: '请填写目标列', trigger: 'blur'}
+        ],
+        model_name: [
+          {required: true, message: '请填写模型名称', trigger: 'blur'}
+        ],
+
+
+      },
+      solarRules: {
+        radiance_max: [
+          {required: true, message: '请填写辐照度最大值', trigger: 'blur'}
+        ],
+        col_radiance: [
+          {required: true, message: '请填写辐照度列名', trigger: 'blur'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+      },
+      windRules: {
+        sigmoid_param: [
+          {required: true, message: '请选择平滑参数', trigger: 'change'}
+        ],
+        col_speed: [
+          {required: true, message: '请填写实测风速列', trigger: 'blur'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+      },
+      HoltwintersRules: {
+        freq: [
+          {required: true, message: '请选择预测粒度', trigger: 'change'}
+        ],
+        pre_len: [
+          {required: true, message: '请填写预测长度', trigger: 'blur'}
+        ],
+        seasonal_periods: [
+          {required: true, message: '请填写周期', trigger: 'blur'}
+        ],
+      },
+      LSTMRules: {
+        scaler_table: [
+          {required: true, message: '请填写归一化表', trigger: 'blur'}
+        ],
+        model_table: [
+          {required: true, message: '请填写模型保存表名', trigger: 'blur'}
+        ],
+        features: [
+          {required: true, message: '请填写特征', trigger: 'blur'}
+        ],
+        station_type: [
+          {required: true, message: '请选择预测类型', trigger: 'change'}
+        ],
+        cap: [
+          {required: true, message: '请填写预测上限', trigger: 'blur'}
+        ],
+      },
+      machineRules: {
+        model_type: [
+          {required: true, message: '请选择模型类型', trigger: 'change'}
+        ],
+        numerical_features: [
+          {required: true, message: '请填写数值型列', trigger: 'blur'}
+        ],
+        categorical_features: [
+          {required: true, message: '请填写类别型列', trigger: 'blur'}
+        ],
+        model_params: [
+          {required: true, message: '请选择模型参数', trigger: 'change'}
+        ],
+        cap: [
+          {required: true, message: '请填写预测上限', trigger: 'blur'}
+        ],
+        num_boost_round: [
+          {required: true, message: '请填写迭代次数', trigger: 'blur'}
+        ],
+        label: [
+          {required: true, message: '请填写目标列', trigger: 'blur'}
+        ],
+      },
+      categoricalFeaturesDisable: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!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+
+      // this.dialogVisible = false
+    },
+    modelTypeChange(){
+      if(this.form['model_type'] === 'svr'){
+        this.categoricalFeaturesDisable = true
+        this.form['categorical_features'] = ''
+      }else{
+        this.categoricalFeaturesDisable = false
+      }
+    },
+    forecastFileChange(){
+      if(this.form['forecast_file'] === '0'){
+        this.form['howLongAgo'] = '1'
+        this.$refs.modelForm.clearValidate('target')
+        this.$refs.modelForm.clearValidate('model_name')
+      }else{
+        this.form['howLongAgo'] = ''
+      }
+    }
+  },
+
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 241 - 0
xvji-ui/src/views/tasks/training/modelTestForm.vue

@@ -0,0 +1,241 @@
+<template>
+  <div>
+    <el-form ref="modelTestForm" :rules="rules" :modelTest="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"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table" v-if="modelTestType !== 3">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="站点编码" prop="farm_id">
+        <el-input v-model="form['farm_id']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="归一化表" prop="scaler_table" v-if="modelTestType === 0">
+        <el-input v-model="form['scaler_table']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="模型名称" prop="model_name">
+        <el-input v-model="form['model_name']" size="mini"
+                  :disabled="!modelTest.enable" 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"
+                  :disabled="!modelTest.enable" 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-option
+            v-for="item in algorithmTestType" :disabled="!modelTest.enable"
+            :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.enable" 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.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </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-option
+            v-for="item in forecastFileType" :disabled="!modelTest.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据开始时间">
+        <el-input v-model="form['timeBegin']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="数据结束时间">
+        <el-input v-model="form['timeEnd']" size="mini"
+                  :disabled="!modelTest.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="测试第N天" >
+        <el-input v-model="form['howLongAgo']" size="mini"
+                  :disabled="!modelTest.enable || 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="!modelTest.enable || columnDisabled  " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.modelTestForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.$nextTick(() => {
+          this.$refs.modelTestForm.clearValidate();
+        });
+        this.modelTest = newVal
+        this.modelTestType = newVal.name.includes('LSTM')?0:1
+        this.rules = {}
+       if (this.modelTestType === 0) {
+          this.rules = {...this.commonRules, ...this.LSTMRules}
+        } else if (this.modelTestType === 1) {
+          this.rules = {...this.commonRules, ...this.machineRules}
+        }
+        this.form = JSON.parse(JSON.stringify(newVal.value))
+
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  data() {
+    return {
+      forecastFileType: [
+        {label: '测试', value: '0'},
+        {label: '生产', value: '1'}
+      ],
+      algorithmTestType: [
+        {label: '测试', value: '1'},
+        {label: '生产', value: '0'},
+        {label: '其他', value: 'ok'}
+      ],
+      modelTestType: 0,
+      modelTest: {},
+      form: {},
+      rules: {},
+      commonRules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名', trigger: 'blur'}
+        ],
+        farm_id: [
+          {required: true, message: '请填写站点编码', trigger: 'blur'}
+        ],
+        target: [
+          {required: true, message: '请填写目标列', trigger: 'blur'}
+        ],
+        model_name: [
+          {required: true, message: '请填写模型名称', trigger: 'blur'}
+        ],
+      },
+      LSTMRules: {
+        scaler_table: [
+          {required: true, message: '请填写归一化表', trigger: 'blur'}
+        ],
+        modelTest_table: [
+          {required: true, message: '请填写模型保存表名', trigger: 'blur'}
+        ],
+        algorithm_test: [
+          {required: true, message: '请选择测试or生产', trigger: 'change'}
+        ],
+        cap: [
+          {required: true, message: '请填写预测上限', trigger: 'blur'}
+        ],
+      },
+      machineRules: {
+        forecast_file: [
+          {required: true, message: '请选择测试or生产', trigger: 'change'}
+        ],
+        mongodb_modelTest_table: [
+          {required: true, message: '请填写mongodb_modelTest_table', trigger: 'blur'}
+        ],
+        howLongAgo: [
+          {required: true, message: '请填写预测第N天', trigger: 'blur'}
+        ],
+      },
+      columnDisabled: false
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.modelTestForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+
+      // 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')
+        }else{
+          this.$refs.modelTestForm.clearValidate('target')
+        }
+        this.columnDisabled = true
+      }
+    }
+  },
+
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 154 - 0
xvji-ui/src/views/tasks/training/powerRationingForm.vue

@@ -0,0 +1,154 @@
+<template>
+  <div>
+    <el-form ref="powerRationingForm" :rules="rules" :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"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item :label="stationType===0?'实测辐照度列':'功率列'" prop="col_power">
+        <el-input v-model="form['col_power']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="功率列" prop="col_radiance" v-if="stationType === 0">
+        <el-input v-model="form['col_radiance']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="平滑参数" v-if="stationType ===0">
+        <el-input v-model="form['sigma']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="实测风速列"  v-if="stationType === 1">
+        <el-input v-model="form['col_ws']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="划分半径" v-if="stationType === 1">
+        <el-input v-model="form['eps']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="半径内最小样本点" v-if="stationType === 1">
+        <el-input v-model="form['min_samples']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="装机容量" prop="cap" v-if="stationType === 1">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!powerRationing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        // this.$refs.powerRationingForm.resetFields()
+        this.powerRationing = newVal
+        this.stationType = newVal.name.includes('光伏')?0:1
+        this.rules = {}
+        if(this.stationType === 0){
+          this.rules = { ...this.commonRules, ...this.solarRules }
+        }else{
+          this.rules = { ...this.commonRules, ...this.windRules }
+        }
+        this.form = JSON.parse(JSON.stringify(newVal.value))
+        console.log(this.rules)
+        this.$nextTick(() => {
+          this.$refs.powerRationingForm.resetFields();
+        });
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  data() {
+    return {
+      stationType:0,
+      powerRationing: {},
+      form: {},
+      rules: {},
+      commonRules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+
+      },
+      solarRules:{
+        col_power: [
+          {required: true, message: '请填写实测辐照度', trigger: 'blur'}
+        ],
+        col_radiance: [
+          {required: true, message: '请填写功率列', trigger: 'blur'}
+        ],
+      },
+      windRules:{
+        col_power: [
+          {required: true, message: '请填写功率列', trigger: 'blur'}
+        ],
+        col_ws: [
+          {required: true, message: '请填写实测风速列', trigger: 'blur'}
+        ],
+        cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ],
+      },
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.powerRationingForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+
+      // this.dialogVisible = false
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 125 - 0
xvji-ui/src/views/tasks/training/processingForm.vue

@@ -0,0 +1,125 @@
+<template>
+  <div>
+    <el-form ref="processingForm" :rules="rules" :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"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="写入的mongo表" prop="mongodb_write_table">
+        <el-input v-model="form['mongodb_write_table']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名称" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="类型" prop="plant_type">
+        <el-select v-model="form['plant_type']" clearable placeholder="请选择" size="small" style="width: 100%">
+          <el-option
+            v-for="item in plantType" :disabled="!processing.enable"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="数据清洗流程">
+        <el-input v-model="form['mongodb_nwp_table']" size="mini"
+                  :disabled="!processing.enable || form['plant_type'] ==='wind'" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="平滑参数" prop="process_param">
+        <el-input v-model="form['process_param']" size="mini"
+                  :disabled="!processing.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.processingForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.processing = newVal
+        this.form = newVal.value
+      },
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      processing: {},
+      form: {},
+      rules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名称', trigger: 'blur'}
+        ],
+        plant_type: [
+          {required: true, message: '请选择场站类型', trigger: 'change'}
+        ],
+        process_param: [
+          {required: true, message: '请填写平滑参数', trigger: 'blur'}
+        ],
+      },
+      plantType: [
+        {label: 'solar', value: 'solar'},
+        {label: 'wind', value: 'wind'}
+      ],
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.processingForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+      // this.dialogVisible = false
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

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

@@ -0,0 +1,129 @@
+<template>
+  <div>
+    <el-form ref="reportForm" :rules="rules" :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"
+                  :disabled="!report.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="读取的mongo表" prop="mongodb_read_table">
+        <el-input v-model="form['mongodb_read_table']" size="mini"
+                  :disabled="!report.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="时间列名称" prop="col_time">
+        <el-input v-model="form['col_time']" size="mini"
+                  :disabled="!report.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="目标列" prop="label">
+        <el-input v-model="form['label']" size="mini"
+                  :disabled="!report.enable " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="预测列" prop="label_pre">
+        <el-input v-model="form['label_pre']" size="mini"
+                  :disabled="!report.enable " type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="站点编码" prop="farm_id">
+        <el-input v-model="form['farm_id']" size="mini"
+                  :disabled="!report.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+      <el-form-item label="装机容量" prop="cap">
+        <el-input v-model="form['cap']" size="mini"
+                  :disabled="!report.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+      <el-form-item label="分组计算准确率的key值">
+        <el-input v-model="form['group_key']" size="mini"
+                  :disabled="!report.enable" type="textarea"
+                  :autosize="{ minRows: 1 }"></el-input>
+      </el-form-item>
+
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  destroyed() {
+    this.$nextTick(() => {
+      this.$refs.reportForm.clearValidate();
+    });
+  },
+  watch: {
+    formData: {
+      handler(newVal, oldVal) {
+        console.log(newVal)
+        this.report = newVal
+        this.form = newVal.value
+      },
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      report: {},
+      form: {},
+      rules: {
+        mongodb_database: [
+          {required: true, message: '请填写mongo库', trigger: 'blur'}
+        ],
+        mongodb_write_table: [
+          {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
+        ],
+        mongodb_read_table: [
+          {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
+        ],
+        col_time: [
+          {required: true, message: '请填写时间列名称', trigger: 'blur'}
+        ],
+        label: [
+          {required: true, message: '请填写目标列', trigger: 'blur'}
+        ], label_pre: [
+          {required: true, message: '请填写预测列', trigger: 'blur'}
+        ], cap: [
+          {required: true, message: '请填写装机容量', trigger: 'blur'}
+        ], farm_id: [
+          {required: true, message: '请填写站点编码', trigger: 'blur'}
+        ]
+      },
+      plantType: [
+        {label: 'solar', value: 'solar'},
+        {label: 'wind', value: 'wind'}
+      ],
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    saveTask() {
+      this.$refs.reportForm.validate((valid) => {
+        if (valid) {
+          // console.log('child submit!');
+          this.$emit('child-event', this.form)
+          return true
+        } else {
+          this.$emit('child-event', {})
+          console.log('error submit!!');
+          return false;
+        }
+      });
+      // this.dialogVisible = false
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>