modelForm.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. <template>
  2. <div>
  3. <el-form ref="modelForm" :rules="rules" :model="form" class="demo-form-inline"
  4. label-width="130px">
  5. <el-form-item label="mongo库" prop="mongodb_database">
  6. <el-input v-model="form['mongodb_database']" size="mini"
  7. :disabled="!model.isEnable" type="textarea"
  8. :autosize="{ minRows: 1 }"></el-input>
  9. </el-form-item>
  10. <el-form-item label="读取的mongo表" prop="mongodb_read_table" v-if="modelType !== 3">
  11. <el-input v-model="form['mongodb_read_table']" size="mini"
  12. :disabled="!model.isEnable" type="textarea"
  13. :autosize="{ minRows: 1 }"></el-input>
  14. </el-form-item>
  15. <el-form-item label="写入的mongo表" prop="mongodb_write_table">
  16. <el-input v-model="form['mongodb_write_table']" size="mini"
  17. :disabled="!model.isEnable" type="textarea"
  18. :autosize="{ minRows: 1 }"></el-input>
  19. </el-form-item>
  20. <el-form-item label="时间列名" prop="col_time">
  21. <el-input v-model="form['col_time']" size="mini"
  22. :disabled="!model.isEnable" type="textarea"
  23. :autosize="{ minRows: 1 }"></el-input>
  24. </el-form-item>
  25. <el-form-item label="站点编码" prop="farm_id">
  26. <el-input v-model="form['farm_id']" size="mini"
  27. :disabled="!model.isEnable" type="textarea"
  28. :autosize="{ minRows: 1 }"></el-input>
  29. </el-form-item>
  30. <el-form-item label="辐照度列" prop="col_radiance" v-if="modelType === 0">
  31. <el-input v-model="form['col_radiance']" size="mini"
  32. :disabled="!model.isEnable" type="textarea"
  33. :autosize="{ minRows: 1 }"></el-input>
  34. </el-form-item>
  35. <el-form-item label="风速列" prop="col_speed" v-if="modelType === 1">
  36. <el-input v-model="form['col_speed']" size="mini"
  37. :disabled="!model.isEnable" type="textarea"
  38. :autosize="{ minRows: 1 }"></el-input>
  39. </el-form-item>
  40. <el-form-item label="辐照度最大值" prop="radiance_max" v-if="modelType === 0">
  41. <el-input v-model="form['radiance_max']" size="mini"
  42. :disabled="!model.isEnable" type="textarea"
  43. :autosize="{ minRows: 1 }"></el-input>
  44. </el-form-item>
  45. <el-form-item :label="modelType ===3?'预测上限':'装机容量'" prop="cap" v-if="modelType !== 2">
  46. <el-input v-model="form['cap']" size="mini"
  47. :disabled="!model.isEnable" type="textarea"
  48. :autosize="{ minRows: 1 }"></el-input>
  49. </el-form-item>
  50. <el-form-item label="归一化表" prop="scaler_table" v-if="modelType === 3">
  51. <el-input v-model="form['scaler_table']" size="mini"
  52. :disabled="!model.isEnable" type="textarea"
  53. :autosize="{ minRows: 1 }"></el-input>
  54. </el-form-item>
  55. <el-form-item label="是否配置生产" prop="forecast_file" v-if="modelType !== 3 && modelType !==4" @change="forecastFileChange">
  56. <el-select v-model="form['forecast_file']" clearable placeholder="请选择" size="small" style="width: 100%">
  57. <el-option
  58. v-for="item in forecastFileType" :disabled="!model.isEnable"
  59. :key="item.value"
  60. :label="item.label"
  61. :value="item.value">
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item label="数据开始时间">
  66. <el-input v-model="form['timeBegin']" size="mini"
  67. :disabled="!model.isEnable" type="textarea"
  68. :autosize="{ minRows: 1 }"></el-input>
  69. </el-form-item>
  70. <el-form-item label="数据结束时间">
  71. <el-input v-model="form['timeEnd']" size="mini"
  72. :disabled="!model.isEnable" type="textarea"
  73. :autosize="{ minRows: 1 }"></el-input>
  74. </el-form-item>
  75. <el-form-item label="平滑参数" v-if="modelType ===1">
  76. <el-select v-model="form['sigmoid_param']" clearable placeholder="请选择" size="small" style="width: 100%">
  77. <el-option
  78. v-for="item in sigmoidParamType" :disabled="!model.isEnable"
  79. :key="item.value"
  80. :label="item.label"
  81. :value="item.value">
  82. </el-option>
  83. </el-select>
  84. </el-form-item>
  85. <el-form-item label="测试第N天" v-if="modelType !== 3 && modelType !==4">
  86. <el-input v-model="form['howLongAgo']" size="mini"
  87. :disabled="!model.isEnable || form['forecast_file'] !=='0'" type="textarea"
  88. :autosize="{ minRows: 1 }"></el-input>
  89. </el-form-item>
  90. <el-form-item label="目标列" prop="target" v-if="modelType !== 4">
  91. <el-input v-model="form['target']" size="mini"
  92. :disabled="!model.isEnable || form['forecast_file'] !=='0'" type="textarea"
  93. :autosize="{ minRows: 1 }"></el-input>
  94. </el-form-item>
  95. <el-form-item label="预测长度" prop="pre_len" v-if="modelType === 2">
  96. <el-input v-model="form['pre_len']" size="mini"
  97. :disabled="!model.isEnable" type="textarea"
  98. :autosize="{ minRows: 1 }"></el-input>
  99. </el-form-item>
  100. <el-form-item label="预测粒度" prop="freq" v-if="modelType ===2">
  101. <el-select v-model="form['freq']" clearable placeholder="请选择" size="small" style="width: 100%">
  102. <el-option
  103. v-for="item in sigmoidParamType" :disabled="!model.isEnable"
  104. :key="item.value"
  105. :label="item.label"
  106. :value="item.value">
  107. </el-option>
  108. </el-select>
  109. </el-form-item>
  110. <el-form-item label="模型名称" prop="model_name">
  111. <el-input v-model="form['model_name']" size="mini"
  112. :disabled="!model.isEnable || form['forecast_file'] !=='0'" type="textarea"
  113. :autosize="{ minRows: 1 }"></el-input>
  114. </el-form-item>
  115. <el-form-item label="模型保存表名" prop="model_table" v-if="modelType ===3">
  116. <el-input v-model="form['model_table']" size="mini"
  117. :disabled="!model.isEnable" type="textarea"
  118. :autosize="{ minRows: 1 }"></el-input>
  119. </el-form-item>
  120. <el-form-item label="模型类型" prop="model_type" v-if="modelType ===4">
  121. <el-select v-model="form['model_type']" clearable placeholder="请选择" size="small" style="width: 100%" @change="modelTypeChange">
  122. <el-option
  123. v-for="item in model_type" :disabled="!model.isEnable"
  124. :key="item.value"
  125. :label="item.label"
  126. :value="item.value">
  127. </el-option>
  128. </el-select>
  129. </el-form-item>
  130. <el-form-item label="特征" prop="features" v-if="modelType ===3">
  131. <el-input v-model="form['features']" size="mini"
  132. :disabled="!model.isEnable" type="textarea"
  133. :autosize="{ minRows: 1 }"></el-input>
  134. </el-form-item>
  135. <el-form-item label="预测类型" prop="station_type" v-if="modelType ===3">
  136. <el-select v-model="form['station_type']" clearable placeholder="请选择" size="small" style="width: 100%">
  137. <el-option
  138. v-for="item in stationType" :disabled="!model.isEnable"
  139. :key="item.value"
  140. :label="item.label"
  141. :value="item.value">
  142. </el-option>
  143. </el-select>
  144. </el-form-item>
  145. <el-form-item label="周期" prop="seasonal_periods" v-if="modelType === 2">
  146. <el-input v-model="form['seasonal_periods']" size="mini"
  147. :disabled="!model.isEnable" type="textarea"
  148. :autosize="{ minRows: 1 }"></el-input>
  149. </el-form-item>
  150. <el-form-item label="日出时间" v-if="modelType === 2">
  151. <el-input v-model="form['sunrise']" size="mini"
  152. :disabled="!model.isEnable" type="textarea"
  153. :autosize="{ minRows: 1 }"></el-input>
  154. </el-form-item>
  155. <el-form-item label="日落时间" v-if="modelType === 2">
  156. <el-input v-model="form['sunset']" size="mini"
  157. :disabled="!model.isEnable" type="textarea"
  158. :autosize="{ minRows: 1 }"></el-input>
  159. </el-form-item>
  160. <el-form-item label="数值型列" prop="numerical_features" v-if="modelType === 4">
  161. <el-input v-model="form['numerical_features']" size="mini"
  162. :disabled="!model.isEnable" type="textarea"
  163. :autosize="{ minRows: 1 }"></el-input>
  164. </el-form-item>
  165. <el-form-item label="类别型列" prop="numerical_features" v-if="modelType === 4">
  166. <el-input v-model="form['numerical_features']" size="mini"
  167. :disabled="(!model.isEnable) || categoricalFeaturesDisable" type="textarea"
  168. :autosize="{ minRows: 1 }"></el-input>
  169. </el-form-item>
  170. <el-form-item label="模型参数" prop="model_params" v-if="modelType === 4">
  171. <el-input v-model="form['model_params']" size="mini"
  172. :disabled="!model.isEnable " type="textarea"
  173. :autosize="{ minRows: 1 }"></el-input>
  174. </el-form-item>
  175. <el-form-item label="迭代次数" prop="num_boost_round" v-if="modelType === 4">
  176. <el-input v-model="form['num_boost_round']" size="mini"
  177. :disabled="!model.isEnable " type="textarea"
  178. :autosize="{ minRows: 1 }"></el-input>
  179. </el-form-item>
  180. <el-form-item label="目标列" prop="label" v-if="modelType === 4">
  181. <el-input v-model="form['label']" size="mini"
  182. :disabled="!model.isEnable " type="textarea"
  183. :autosize="{ minRows: 1 }"></el-input>
  184. </el-form-item>
  185. </el-form>
  186. </div>
  187. </template>
  188. <script>
  189. export default {
  190. props: {
  191. formData: {
  192. type: Object,
  193. default: {}
  194. }
  195. },
  196. destroyed() {
  197. this.$nextTick(() => {
  198. this.$refs.modelForm.clearValidate();
  199. });
  200. },
  201. watch: {
  202. formData: {
  203. handler(newVal, oldVal) {
  204. // console.log(newVal)
  205. this.$nextTick(() => {
  206. this.$refs.modelForm.clearValidate()
  207. });
  208. this.model = newVal
  209. this.modelType = this.modelName.find(w => w.label === newVal.componentType).value
  210. this.rules = {}
  211. if(this.modelType === 0){
  212. this.rules = { ...this.commonRules, ...this.solarRules }
  213. }else if(this.modelType === 1){
  214. this.rules = { ...this.commonRules, ...this.windRules }
  215. }else if(this.modelType === 2){
  216. this.rules = { ...this.commonRules, ...this.HoltwintersRules }
  217. }else if(this.modelType === 3){
  218. this.rules = { ...this.commonRules, ...this.LSTMRules }
  219. }else if(this.modelType === 4){
  220. this.rules = { ...this.commonRules, ...this.machineRules }
  221. }
  222. this.form = JSON.parse(JSON.stringify(newVal.params))
  223. },
  224. immediate: true,
  225. deep: true
  226. }
  227. },
  228. data() {
  229. return {
  230. forecastFileType: [
  231. {label: '测试', value: '0'},
  232. {label: '生产', value: '1'}
  233. ],
  234. sigmoidParamType: [
  235. {label: 'L', value: '1'},
  236. {label: 'x0', value: '7'},
  237. {label: 'k', value: '0.9'}
  238. ],
  239. freqType: [
  240. {label: '1Min', value: '1Min'},
  241. {label: '15Min', value: '15Min'},
  242. {label: '1Hour', value: '1Hour'}
  243. ],
  244. modelName: [
  245. {label: '光伏物理模型', value: 0},
  246. {label: '风电物理模型', value: 1},
  247. {label: 'Holtwinters模型', value: 2},
  248. {label: 'LSTM', value: 3},
  249. {label: '机器学习模型', value: 4}
  250. ],
  251. stationType: [
  252. {label: '光', value: '1'},
  253. {label: '风', value: '2'},
  254. {label: '其他', value: '3'}
  255. ],
  256. model_type: [
  257. {label: 'svr', value: 'svr'},
  258. {label: 'lightgbm', value: 'lightgbm'}
  259. ],
  260. modelType: 0,
  261. model: {},
  262. form: {},
  263. rules: {},
  264. commonRules: {
  265. mongodb_database: [
  266. {required: true, message: '请填写mongo库', trigger: 'blur'}
  267. ],
  268. mongodb_write_table: [
  269. {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
  270. ],
  271. mongodb_read_table: [
  272. {required: true, message: '请填写读取的mongo表', trigger: 'blur'}
  273. ],
  274. col_time: [
  275. {required: true, message: '请填写时间列名', trigger: 'blur'}
  276. ],
  277. farm_id: [
  278. {required: true, message: '请填写站点编码', trigger: 'blur'}
  279. ],
  280. target: [
  281. {required: true, message: '请填写目标列', trigger: 'blur'}
  282. ],
  283. model_name: [
  284. {required: true, message: '请填写模型名称', trigger: 'blur'}
  285. ],
  286. },
  287. solarRules: {
  288. radiance_max: [
  289. {required: true, message: '请填写辐照度最大值', trigger: 'blur'}
  290. ],
  291. col_radiance: [
  292. {required: true, message: '请填写辐照度列名', trigger: 'blur'}
  293. ],
  294. cap: [
  295. {required: true, message: '请填写装机容量', trigger: 'blur'}
  296. ],
  297. },
  298. windRules: {
  299. sigmoid_param: [
  300. {required: true, message: '请选择平滑参数', trigger: 'change'}
  301. ],
  302. col_speed: [
  303. {required: true, message: '请填写实测风速列', trigger: 'blur'}
  304. ],
  305. cap: [
  306. {required: true, message: '请填写装机容量', trigger: 'blur'}
  307. ],
  308. },
  309. HoltwintersRules: {
  310. freq: [
  311. {required: true, message: '请选择预测粒度', trigger: 'change'}
  312. ],
  313. pre_len: [
  314. {required: true, message: '请填写预测长度', trigger: 'blur'}
  315. ],
  316. seasonal_periods: [
  317. {required: true, message: '请填写周期', trigger: 'blur'}
  318. ],
  319. },
  320. LSTMRules: {
  321. scaler_table: [
  322. {required: true, message: '请填写归一化表', trigger: 'blur'}
  323. ],
  324. model_table: [
  325. {required: true, message: '请填写模型保存表名', trigger: 'blur'}
  326. ],
  327. features: [
  328. {required: true, message: '请填写特征', trigger: 'blur'}
  329. ],
  330. station_type: [
  331. {required: true, message: '请选择预测类型', trigger: 'change'}
  332. ],
  333. cap: [
  334. {required: true, message: '请填写预测上限', trigger: 'blur'}
  335. ],
  336. },
  337. machineRules: {
  338. model_type: [
  339. {required: true, message: '请选择模型类型', trigger: 'change'}
  340. ],
  341. numerical_features: [
  342. {required: true, message: '请填写数值型列', trigger: 'blur'}
  343. ],
  344. categorical_features: [
  345. {required: true, message: '请填写类别型列', trigger: 'blur'}
  346. ],
  347. model_params: [
  348. {required: true, message: '请选择模型参数', trigger: 'change'}
  349. ],
  350. cap: [
  351. {required: true, message: '请填写预测上限', trigger: 'blur'}
  352. ],
  353. num_boost_round: [
  354. {required: true, message: '请填写迭代次数', trigger: 'blur'}
  355. ],
  356. label: [
  357. {required: true, message: '请填写目标列', trigger: 'blur'}
  358. ],
  359. },
  360. categoricalFeaturesDisable:false
  361. }
  362. },
  363. mounted() {
  364. },
  365. methods: {
  366. saveTask() {
  367. if(this.form['forecast_file'] === '0'){
  368. this.$refs.modelForm.clearValidate('target')
  369. this.$refs.modelForm.clearValidate('model_name')
  370. }
  371. this.$refs.modelForm.validate((valid) => {
  372. if (valid) {
  373. // console.log('child submit!');
  374. this.$emit('child-event', this.form)
  375. return true
  376. } else {
  377. this.$emit('child-event', {})
  378. console.log('error submit!!');
  379. return false;
  380. }
  381. });
  382. // this.dialogVisible = false
  383. },
  384. modelTypeChange(){
  385. if(this.form['model_type'] === 'svr'){
  386. this.categoricalFeaturesDisable = true
  387. this.form['categorical_features'] = ''
  388. }else{
  389. this.categoricalFeaturesDisable = false
  390. }
  391. },
  392. forecastFileChange(){
  393. if(this.form['forecast_file'] === '0'){
  394. this.form['howLongAgo'] = '1'
  395. this.$refs.modelForm.clearValidate('target')
  396. this.$refs.modelForm.clearValidate('model_name')
  397. }else{
  398. this.form['howLongAgo'] = ''
  399. }
  400. }
  401. },
  402. }
  403. </script>
  404. <style scoped lang="scss">
  405. </style>