index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. <template>
  2. <div>
  3. <el-form :inline="true" :model="queryParams" class="demo-form-inline">
  4. <el-form-item label="任务名称">
  5. <el-input size="small" v-model="queryParams.name" clearable></el-input>
  6. </el-form-item>
  7. <el-form-item>
  8. <el-button size="small" type="primary" plain @click="getList">查询</el-button>
  9. </el-form-item>
  10. <el-form-item>
  11. <el-button size="small" type="success" plain @click="addTask()">创建任务</el-button>
  12. </el-form-item>
  13. </el-form>
  14. <div>
  15. <el-table
  16. v-loading="loading"
  17. :data="tableData"
  18. border
  19. style="width: 100%">
  20. <el-table-column align="center" prop="tTaskId" label="任务id"></el-table-column>
  21. <el-table-column align="center" prop="tTaskName" label="名称"></el-table-column>
  22. <el-table-column align="center" prop="tTaskStatus" label="状态"></el-table-column>
  23. <el-table-column align="center" prop="tCreateTime" label="创建时间"></el-table-column>
  24. <el-table-column align="center" prop="tCronExpression" label="定时任务"></el-table-column>
  25. <el-table-column align="center" prop="tAnalysisReport" label="报告分析" width="100">
  26. <template slot-scope="{row}">
  27. <el-button @click="viewReport(row)" type="text" size="small">预览</el-button>
  28. </template>
  29. </el-table-column>
  30. <el-table-column align="center" prop="tRunInfo" label="运行信息" width="100">
  31. <template slot-scope="{row}">
  32. <el-button @click="viewInfo(row)" type="text" size="small">查看</el-button>
  33. </template>
  34. </el-table-column>
  35. <el-table-column align="center"
  36. fixed="right"
  37. label="操作" width="200"
  38. >
  39. <template slot-scope="{row}">
  40. <el-button @click="handleClick(row)" type="primary" plain size="mini">编辑</el-button>
  41. <el-button @click="handleClick(row)" type="danger" plain size="mini">删除</el-button>
  42. </template>
  43. </el-table-column>
  44. </el-table>
  45. <pagination
  46. v-show="total>0"
  47. :total="total"
  48. :page.sync="queryParams.pageNum"
  49. :limit.sync="queryParams.pageSize"
  50. @pagination="getList"
  51. />
  52. </div>
  53. <el-dialog
  54. :title="isEdit?'修改任务':'创建任务'"
  55. :visible.sync="dialogVisible"
  56. width="60%"
  57. :before-close="handleClose" :close-on-click-modal="false">
  58. <div>
  59. <el-form ref="ruleForm" :rules="rules" :model="formData" class="demo-form-inline" label-width="130px">
  60. <el-row :gutter="20">
  61. <el-col :span="12">
  62. <el-form-item label="任务名称" prop="tTaskName" label-width="100px">
  63. <el-input v-model="formData.tTaskName"></el-input>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="12">
  67. <el-form-item label="定时任务" prop="tCronExpression" label-width="100px">
  68. <el-input v-model="formData.tCronExpression"></el-input>
  69. </el-form-item>
  70. </el-col>
  71. </el-row>
  72. </el-form>
  73. <div class="mode-table">
  74. <div class="flex model-table-tr">
  75. <span class="pa-0 td td0"></span>
  76. <span class="pa-0 td td1 font-bold">是否开启</span>
  77. <span class="pa-0 td2 font-bold">参数</span>
  78. </div>
  79. <!-- 数据获取 -->
  80. <div class="flex model-table-tr">
  81. <span class="pa-0 td td0">数据获取</span>
  82. <span class="pa-0 td td1">
  83. <el-radio-group v-model="formData.dataAcquisition.enable" size="mini">
  84. <el-radio-button :label="true">开启</el-radio-button>
  85. <el-radio-button :label="false">关闭</el-radio-button>
  86. </el-radio-group>
  87. </span>
  88. <span class="pa-0 td2">
  89. <div class="form-table-item">
  90. <el-form ref="ruleForm" :rules="dataAcquisitionRules" :model="formData.dataAcquisition.value"
  91. class="demo-form-inline"
  92. label-width="130px">
  93. <el-form-item label="查询语句" prop="query_sql">
  94. <el-input v-model="formData.dataAcquisition.value['query_sql']" size="mini"
  95. :disabled="!formData.dataAcquisition.enable" type="textarea"
  96. :autosize="{ minRows: 1 }"></el-input>
  97. </el-form-item>
  98. <el-form-item label="mongo库" prop="mongodb_database">
  99. <el-input v-model="formData.dataAcquisition.value['mongodb_database']" size="mini"
  100. :disabled="!formData.dataAcquisition.enable" type="textarea"
  101. :autosize="{ minRows: 1 }"></el-input>
  102. </el-form-item>
  103. <el-form-item label="写入的mongo表" prop="mongodb_write_table">
  104. <el-input v-model="formData.dataAcquisition.value['mongodb_write_table']" size="mini"
  105. :disabled="!formData.dataAcquisition.enable" type="textarea"
  106. :autosize="{ minRows: 1 }"></el-input>
  107. </el-form-item>
  108. <el-form-item label="查询的mysql库" prop="mysql_database">
  109. <el-input v-model="formData.dataAcquisition.value['mysql_database']" size="mini"
  110. :disabled="!formData.dataAcquisition.enable" type="textarea"
  111. :autosize="{ minRows: 1 }"></el-input>
  112. </el-form-item>
  113. </el-form>
  114. </div>
  115. </span>
  116. </div>
  117. <!-- 数据处理 -->
  118. <div class="flex model-table-tr">
  119. <span class="pa-0 td td0">数据处理</span>
  120. <span class="pa-0 td td1">
  121. <el-radio-group v-model="formData.dataCleaning.enable" size="mini">
  122. <el-radio-button :label="true">开启</el-radio-button>
  123. <el-radio-button :label="false">关闭</el-radio-button>
  124. </el-radio-group>
  125. </span>
  126. <span class="pa-0 td2">
  127. <div class="form-table-item">
  128. <data-clean-form ref="dataCleaning" :form-data="formData.dataCleaning"
  129. @child-event="getDataCleaning"></data-clean-form>
  130. </div>
  131. </span>
  132. </div>
  133. <!-- 限电 -->
  134. <div class="flex model-table-tr">
  135. <span class="pa-0 td td0">
  136. <el-select v-model="formData.powerRationing.name" @change="powerRationingNameChange" placeholder="请选择"
  137. size="small" style="width: 100%">
  138. <el-option
  139. v-for="item in powerRationingName"
  140. :key="item.value"
  141. :label="item.label"
  142. :value="item.value">
  143. </el-option>
  144. </el-select>
  145. </span>
  146. <span class="pa-0 td td1">
  147. <el-radio-group v-model="formData.powerRationing.enable" size="mini">
  148. <el-radio-button :label="true">开启</el-radio-button>
  149. <el-radio-button :label="false">关闭</el-radio-button>
  150. </el-radio-group>
  151. </span>
  152. <span class="pa-0 td2">
  153. <div class="form-table-item">
  154. <power-rationing-form ref="powerRationing" :form-data="formData.powerRationing"
  155. @child-event="getPowerRationing"></power-rationing-form>
  156. </div>
  157. </span>
  158. </div>
  159. <!-- 模型 -->
  160. <div class="flex model-table-tr">
  161. <span class="pa-0 td td0">
  162. <el-select v-model="formData.model.name" @change="isDisableModeTest" placeholder="请选择" size="small"
  163. style="width: 100%">
  164. <el-option
  165. v-for="item in modelName"
  166. :key="item.value"
  167. :label="item.label"
  168. :value="item.value">
  169. </el-option>
  170. </el-select>
  171. </span>
  172. <span class="pa-0 td td1">
  173. <el-radio-group v-model="formData.model.enable" size="mini">
  174. <el-radio-button :label="true">开启</el-radio-button>
  175. <el-radio-button :label="false" disabled>关闭</el-radio-button>
  176. </el-radio-group>
  177. </span>
  178. <span class="pa-0 td2">
  179. <div class="form-table-item">
  180. <model-form ref="model" :form-data="formData.model" @child-event="getModel"></model-form>
  181. </div>
  182. </span>
  183. </div>
  184. <!-- 模型测试 -->
  185. <div class="flex model-table-tr" v-if="!modelTestDisable">
  186. <span class="pa-0 td td0">{{ formData.modelTest.name }}</span>
  187. <span class="pa-0 td td1">
  188. <el-radio-group v-model="formData.modelTest.enable" size="mini">
  189. <el-radio-button :label="true" :disabled="modelTestDisable">开启</el-radio-button>
  190. <el-radio-button :label="false" disabled>关闭</el-radio-button>
  191. </el-radio-group>
  192. </span>
  193. <span class="pa-0 td2">
  194. <div class="form-table-item">
  195. <model-test-form ref="modelTest" :form-data="formData.modelTest"
  196. @child-event="getModelTest"></model-test-form>
  197. </div>
  198. </span>
  199. </div>
  200. <!-- 后处理 -->
  201. <div class="flex model-table-tr">
  202. <span class="pa-0 td td0">后处理</span>
  203. <span class="pa-0 td td1">
  204. <el-radio-group v-model="formData.processing.enable" size="mini">
  205. <el-radio-button :label="true">开启</el-radio-button>
  206. <el-radio-button :label="false">关闭</el-radio-button>
  207. </el-radio-group>
  208. </span>
  209. <span class="pa-0 td2">
  210. <div class="form-table-item">
  211. <processing-form ref="processing" :form-data="formData.processing"
  212. @child-event="getProcessing"></processing-form>
  213. </div>
  214. </span>
  215. </div>
  216. <!-- 分析报告 -->
  217. <div class="flex model-table-tr">
  218. <span class="pa-0 td td0">分析报告</span>
  219. <span class="pa-0 td td1">
  220. <el-radio-group v-model="formData.report.enable" size="mini">
  221. <el-radio-button :label="true">开启</el-radio-button>
  222. <el-radio-button :label="false">关闭</el-radio-button>
  223. </el-radio-group>
  224. </span>
  225. <span class="pa-0 td2">
  226. <div class="form-table-item">
  227. <report-form ref="report" :form-data="formData.report"
  228. @child-event="getReport"></report-form>
  229. </div>
  230. </span>
  231. </div>
  232. </div>
  233. </div>
  234. <span slot="footer" class="dialog-footer">
  235. <el-button size="small" @click="handleClose">取 消</el-button>
  236. <el-button size="small" type="primary" @click="saveTask">确 定</el-button>
  237. </span>
  238. </el-dialog>
  239. <el-dialog
  240. title="运行信息"
  241. :visible.sync="dialogInfoVisible"
  242. width="30%"
  243. >
  244. <div>
  245. {{ info }}
  246. </div>
  247. <span slot="footer" class="dialog-footer">
  248. <el-button size="mini" @click="dialogInfoVisible = false">关 闭</el-button>
  249. </span>
  250. </el-dialog>
  251. </div>
  252. </template>
  253. <script>
  254. import dataCleanForm from './dataCleanForm.vue'
  255. import powerRationingForm from './powerRationingForm.vue'
  256. import modelForm from './modelForm.vue'
  257. import modelTestForm from './modelTestForm.vue'
  258. import processingForm from './processingForm.vue'
  259. import reportForm from './reportForm.vue'
  260. import {addTask} from "@/api/xvji/training";
  261. export default {
  262. components: {modelForm, modelTestForm, dataCleanForm, powerRationingForm, processingForm, reportForm},
  263. data() {
  264. return {
  265. loading: false,
  266. tableData: [],
  267. formData: {
  268. dataAcquisition: {name: '数据获取', enable: true, value: {}},
  269. dataCleaning: {name: '数据处理', enable: true, value: {}},
  270. powerRationing: {name: '限电清洗', enable: true, value: {
  271. mongodb_database:'',
  272. mongodb_read_table:'',
  273. mongodb_write_table:'',
  274. col_power:'',
  275. col_radiance:'',
  276. sigma:'1'
  277. }},
  278. model: {name: '模型', enable: true, value: {}},
  279. modelTest: {name: '模型测试', enable: true, value: {}},
  280. processing: {name: '后处理', enable: true, value: {}},
  281. report: {name: '分析报告', enable: true, value: {}},
  282. },
  283. modelTestDisable: true,
  284. // 总条数
  285. total: 0,
  286. // 查询参数
  287. queryParams: {
  288. pageNum: 1,
  289. pageSize: 10,
  290. name: '',
  291. },
  292. isEdit: false,
  293. dialogVisible: false,
  294. dialogInfoVisible: false,
  295. info: '',
  296. rules: {
  297. tTaskName: [
  298. {required: true, message: '请填写任务名称', trigger: 'blur'}
  299. ],
  300. name: [
  301. {required: true, message: '请填写任务名称', trigger: 'blur'}
  302. ],
  303. },
  304. dataAcquisitionRules: {
  305. query_sql: [
  306. {required: true, message: '请填写查询语句', trigger: 'blur'}
  307. ],
  308. mongodb_database: [
  309. {required: true, message: '请填写mongo库', trigger: 'blur'}
  310. ],
  311. mongodb_write_table: [
  312. {required: true, message: '请填写写入的mongo表', trigger: 'blur'}
  313. ],
  314. mysql_database: [
  315. {required: true, message: '请填写查询的mysql库', trigger: 'blur'}
  316. ],
  317. },
  318. powerRationingName: [
  319. {label: '限电清洗-光伏', value: '限电清洗-光伏'},
  320. {label: '限电清洗-风电', value: '限电清洗-风电'}
  321. ],
  322. modelName: [
  323. {label: '光伏物理模型', value: '光伏物理模型'},
  324. {label: '风电物理模型', value: '风电物理模型'},
  325. {label: 'Holtwinters模型', value: 'Holtwinters模型'},
  326. {label: 'LSTM', value: 'LSTM'},
  327. {label: '机器学习模型', value: '机器学习模型'}
  328. ]
  329. }
  330. },
  331. mounted() {
  332. this.getList()
  333. },
  334. methods: {
  335. getList() {
  336. this.loading = true
  337. this.tableData = [
  338. {
  339. tTaskId: '1',
  340. tTaskName: 'T00001',
  341. tTaskStatus: '0',
  342. tCreateTime: '',
  343. tCronExpression: '',
  344. tAnalysisReport: '',
  345. tRunInfo: '1111'
  346. },
  347. {
  348. tTaskId: '2',
  349. tTaskName: 'T00002',
  350. tTaskStatus: '1',
  351. tCreateTime: '',
  352. tCronExpression: '',
  353. tAnalysisReport: '',
  354. tRunInfo: '1111'
  355. }
  356. ]
  357. this.total = this.tableData.length
  358. this.loading = false
  359. },
  360. // 新增
  361. addTask() {
  362. this.isEdit = false
  363. this.dialogVisible = true
  364. this.formData = {
  365. tTaskName: '',
  366. tCronExpression: '',
  367. dataAcquisition: {name: '数据获取', enable: true, value: {}},
  368. dataCleaning: {name: '数据处理', enable: true, value: {}},
  369. powerRationing: {name: '限电清洗-光伏', enable: true, value: {}},
  370. model: {name: '光伏物理模型', enable: true, value: {}},
  371. modelTest: {name: '模型测试', enable: true, value: {}},
  372. processing: {name: '后处理', enable: true, value: {}},
  373. report: {name: '分析报告', enable: true, value: {}},
  374. }
  375. this.$nextTick(()=>{
  376. this.$refs.ruleForm.clearValidate()
  377. })
  378. },
  379. // 编辑
  380. handleClick() {
  381. this.isEdit = true
  382. this.dialogVisible = true
  383. },
  384. //保存
  385. saveTask() {
  386. this.$refs.ruleForm.validate(async (valid) => {
  387. if (valid) {
  388. alert('submit!');
  389. await this.$refs.dataCleaning.saveTask()
  390. if (JSON.stringify(this.formData.dataCleaning.value) === '{}') {
  391. return false
  392. }
  393. await this.$refs.powerRationing.saveTask()
  394. if (JSON.stringify(this.formData.powerRationing.value) === '{}') {
  395. return false
  396. }
  397. await this.$refs.model.saveTask()
  398. if (JSON.stringify(this.formData.model.value) === '{}') {
  399. return false
  400. }
  401. if (this.formData.model.name.includes('LSTM') || this.formData.model.name.includes('机器')) {
  402. await this.$refs.modelTest.saveTask()
  403. if (JSON.stringify(this.formData.modelTest.value) === '{}') {
  404. return false
  405. }
  406. }else{
  407. this.formData.modelTest = {}
  408. }
  409. await this.$refs.processing.saveTask()
  410. if (JSON.stringify(this.formData.processing.value) === '{}') {
  411. return false
  412. }
  413. await this.$refs.report.saveTask()
  414. if (JSON.stringify(this.formData.report.value) === '{}') {
  415. return false
  416. }
  417. } else {
  418. console.log('校验不通过');
  419. return false;
  420. }
  421. if(!this.isEdit){
  422. addTask(this.formData).then(res=>{
  423. })
  424. }
  425. });
  426. // this.dialogVisible = false
  427. },
  428. // 数据处理数据
  429. getDataCleaning(val) {
  430. this.formData.dataCleaning.value = val
  431. },
  432. getPowerRationing(val) {
  433. this.formData.powerRationing.value = val
  434. },
  435. getModel(val) {
  436. this.formData.model.value = val
  437. },
  438. getModelTest(val) {
  439. this.formData.modelTest.value = val
  440. },
  441. getProcessing(val) {
  442. this.formData.processing.value = val
  443. },
  444. getReport(val) {
  445. this.formData.report.value = val
  446. },
  447. powerRationingNameChange() {
  448. // if (!this.isEdit) {
  449. // if (this.formData.powerRationing.name.includes('光伏')) {
  450. // this.formData.powerRationing.value = {
  451. // mongodb_database:'',
  452. // mongodb_read_table:'',
  453. // mongodb_write_table:'',
  454. // col_power:'',
  455. // col_radiance:'',
  456. // sigma: 1
  457. // }
  458. // } else {
  459. // this.formData.powerRationing.value = {
  460. // mongodb_database:'',
  461. // mongodb_read_table:'',
  462. // mongodb_write_table:'',
  463. // col_power:'',
  464. // col_ws:'',
  465. // cap:'',
  466. // eps: 0.1,
  467. // min_samples: '20'
  468. // }
  469. // }
  470. // }
  471. },
  472. isDisableModeTest() {
  473. if (this.formData.model.name.includes('LSTM') || this.formData.model.name.includes('机器')) {
  474. this.modelTestDisable = false
  475. this.formData.modelTest.enable = true
  476. this.formData.modelTest.name = this.formData.model.name + '测试'
  477. return
  478. }
  479. this.modelTestDisable = true
  480. this.formData.modelTest.enable = false
  481. },
  482. handleClose() {
  483. this.$refs.ruleForm.resetFields()
  484. // this.formData = {
  485. // tTaskName: '',
  486. // tCronExpression: '',
  487. // dataAcquisition: {name: '数据获取', enable: true, value: {}},
  488. // dataCleaning: {name: '数据处理', enable: true, value: {}},
  489. // powerRationing: {name: '限电清洗-光伏', enable: true, value: {}},
  490. // model: {name: '光伏物理模型', enable: true, value: {}},
  491. // modelTest: {name: '模型测试', enable: true, value: {}},
  492. // processing: {name: '后处理', enable: true, value: {}},
  493. // report: {name: '分析报告', enable: true, value: {}},
  494. // }
  495. this.dialogVisible = false
  496. },
  497. // 预览报告文件
  498. viewReport() {
  499. },
  500. // 运行信息
  501. viewInfo(row) {
  502. this.info = row.tRunInfo
  503. this.dialogInfoVisible = true
  504. }
  505. }
  506. }
  507. </script>
  508. <style scoped lang="scss">
  509. .form-table-item {
  510. max-height: 30vh;
  511. overflow-y: auto;
  512. ::v-deep .el-form-item {
  513. margin-bottom: 15px;
  514. }
  515. }
  516. .td0 {
  517. width: 200px;
  518. }
  519. .td1 {
  520. width: 150px;
  521. }
  522. .td2 {
  523. width: calc(100% - 350px);
  524. }
  525. .mode-table .model-table-tr:last-child {
  526. border-bottom: 1px solid #ebeef5;
  527. }
  528. .model-table-tr {
  529. width: 100%;
  530. text-align: center;
  531. border: 1px solid #ebeef5;
  532. border-bottom: none;
  533. line-height: 30px;
  534. .td {
  535. border-right: 1px solid #ebeef5;
  536. display: grid;
  537. place-items: center;
  538. }
  539. .pa-0 {
  540. padding: 0 .5vw;
  541. }
  542. }
  543. </style>