index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  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="状态" :formatter="formatPtaskStatus"></el-table-column>
  23. <el-table-column align="center" prop="tcreateTime" label="创建时间" :formatter="formatCreateTime"></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="handleDeleteClick(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="mode-table-thead">
  75. <div class="flex model-table-tr">
  76. <span class="pa-0 td td0"></span>
  77. <span class="pa-0 td td1 font-bold">是否开启</span>
  78. <span class="pa-0 td2 font-bold">参数</span>
  79. </div>
  80. </div>
  81. <div class="mode-table-body">
  82. <!-- 数据获取 -->
  83. <div class="flex model-table-tr">
  84. <span class="pa-0 td td0">数据获取</span>
  85. <span class="pa-0 td td1">
  86. <el-radio-group v-model="formData.dataAcquisition.isEnable" size="mini">
  87. <el-radio-button :label="true">开启</el-radio-button>
  88. <el-radio-button :label="false">关闭</el-radio-button>
  89. </el-radio-group>
  90. </span>
  91. <span class="pa-0 td2">
  92. <div class="form-table-item">
  93. <el-form ref="ruleForm" :rules="dataAcquisitionRules" :model="formData.dataAcquisition.params"
  94. class="demo-form-inline"
  95. label-width="130px">
  96. <el-form-item label="查询语句" prop="query_sql">
  97. <el-input v-model="formData.dataAcquisition.params['query_sql']" size="mini"
  98. :disabled="!formData.dataAcquisition.isEnable" type="textarea"
  99. :autosize="{ minRows: 1 }"></el-input>
  100. </el-form-item>
  101. <el-form-item label="mongo库" prop="mongodb_database">
  102. <el-input v-model="formData.dataAcquisition.params['mongodb_database']" size="mini"
  103. :disabled="!formData.dataAcquisition.isEnable" type="textarea"
  104. :autosize="{ minRows: 1 }"></el-input>
  105. </el-form-item>
  106. <el-form-item label="写入的mongo表" prop="mongodb_write_table">
  107. <el-input v-model="formData.dataAcquisition.params['mongodb_write_table']" size="mini"
  108. :disabled="!formData.dataAcquisition.isEnable" type="textarea"
  109. :autosize="{ minRows: 1 }"></el-input>
  110. </el-form-item>
  111. <el-form-item label="查询的mysql库" prop="mysql_database">
  112. <el-input v-model="formData.dataAcquisition.params['mysql_database']" size="mini"
  113. :disabled="!formData.dataAcquisition.isEnable" type="textarea"
  114. :autosize="{ minRows: 1 }"></el-input>
  115. </el-form-item>
  116. </el-form>
  117. </div>
  118. </span>
  119. </div>
  120. <!-- 数据处理 -->
  121. <div class="flex model-table-tr">
  122. <span class="pa-0 td td0">数据处理</span>
  123. <span class="pa-0 td td1">
  124. <el-radio-group v-model="formData.dataCleaning.isEnable" size="mini">
  125. <el-radio-button :label="true">开启</el-radio-button>
  126. <el-radio-button :label="false">关闭</el-radio-button>
  127. </el-radio-group>
  128. </span>
  129. <span class="pa-0 td2">
  130. <div class="form-table-item">
  131. <data-clean-form ref="dataCleaning" :form-data="formData.dataCleaning"
  132. @child-event="getDataCleaning"></data-clean-form>
  133. </div>
  134. </span>
  135. </div>
  136. <!-- 限电 -->
  137. <div class="flex model-table-tr">
  138. <span class="pa-0 td td0">
  139. <el-select v-model="formData.powerRationing.componentType" @change="powerRationingNameChange"
  140. placeholder="请选择"
  141. size="small" style="width: 100%">
  142. <el-option
  143. v-for="item in powerRationingName"
  144. :key="item.value"
  145. :label="item.label"
  146. :value="item.value">
  147. </el-option>
  148. </el-select>
  149. </span>
  150. <span class="pa-0 td td1">
  151. <el-radio-group v-model="formData.powerRationing.isEnable" size="mini">
  152. <el-radio-button :label="true">开启</el-radio-button>
  153. <el-radio-button :label="false">关闭</el-radio-button>
  154. </el-radio-group>
  155. </span>
  156. <span class="pa-0 td2">
  157. <div class="form-table-item">
  158. <power-rationing-form ref="powerRationing" :form-data="formData.powerRationing"
  159. @child-event="getPowerRationing"></power-rationing-form>
  160. </div>
  161. </span>
  162. </div>
  163. <!-- 模型 -->
  164. <div class="flex model-table-tr">
  165. <span class="pa-0 td td0">
  166. <el-select v-model="formData.model.componentType" @change="isDisableModeTest" placeholder="请选择"
  167. size="small"
  168. style="width: 100%">
  169. <el-option
  170. v-for="item in modelName"
  171. :key="item.value"
  172. :label="item.label"
  173. :value="item.value">
  174. </el-option>
  175. </el-select>
  176. </span>
  177. <span class="pa-0 td td1">
  178. <el-radio-group v-model="formData.model.isEnable" size="mini">
  179. <el-radio-button :label="true">开启</el-radio-button>
  180. <el-radio-button :label="false" disabled>关闭</el-radio-button>
  181. </el-radio-group>
  182. </span>
  183. <span class="pa-0 td2">
  184. <div class="form-table-item">
  185. <model-form ref="model" :form-data="formData.model" @child-event="getModel"></model-form>
  186. </div>
  187. </span>
  188. </div>
  189. <!-- 模型测试 -->
  190. <div class="flex model-table-tr" v-if="!modelTestDisable">
  191. <span class="pa-0 td td0">{{ formData.modelTest.componentType }}</span>
  192. <span class="pa-0 td td1">
  193. <el-radio-group v-model="formData.modelTest.isEnable" size="mini">
  194. <el-radio-button :label="true" :disabled="modelTestDisable">开启</el-radio-button>
  195. <el-radio-button :label="false" disabled>关闭</el-radio-button>
  196. </el-radio-group>
  197. </span>
  198. <span class="pa-0 td2">
  199. <div class="form-table-item">
  200. <model-test-form ref="modelTest" :form-data="formData.modelTest"
  201. @child-event="getModelTest"></model-test-form>
  202. </div>
  203. </span>
  204. </div>
  205. <!-- 后处理 -->
  206. <div class="flex model-table-tr">
  207. <span class="pa-0 td td0">后处理</span>
  208. <span class="pa-0 td td1">
  209. <el-radio-group v-model="formData.processing.isEnable" size="mini">
  210. <el-radio-button :label="true">开启</el-radio-button>
  211. <el-radio-button :label="false">关闭</el-radio-button>
  212. </el-radio-group>
  213. </span>
  214. <span class="pa-0 td2">
  215. <div class="form-table-item">
  216. <processing-form ref="processing" :form-data="formData.processing"
  217. @child-event="getProcessing"></processing-form>
  218. </div>
  219. </span>
  220. </div>
  221. <!-- 分析报告 -->
  222. <div class="flex model-table-tr">
  223. <span class="pa-0 td td0">分析报告</span>
  224. <span class="pa-0 td td1">
  225. <el-radio-group v-model="formData.report.isEnable" size="mini">
  226. <el-radio-button :label="true">开启</el-radio-button>
  227. <el-radio-button :label="false">关闭</el-radio-button>
  228. </el-radio-group>
  229. </span>
  230. <span class="pa-0 td2">
  231. <div class="form-table-item">
  232. <report-form ref="report" :form-data="formData.report"
  233. @child-event="getReport"></report-form>
  234. </div>
  235. </span>
  236. </div>
  237. </div>
  238. </div>
  239. </div>
  240. <span slot="footer" class="dialog-footer">
  241. <el-button size="small" @click="handleClose">取 消</el-button>
  242. <el-button size="small" type="primary" @click="saveTask">确 定</el-button>
  243. </span>
  244. </el-dialog>
  245. <el-dialog
  246. title="运行信息"
  247. :visible.sync="dialogInfoVisible"
  248. width="50%"
  249. >
  250. <div class="runInfoBox">
  251. {{ info }}
  252. </div>
  253. <span slot="footer" class="dialog-footer">
  254. <el-button size="mini" @click="dialogInfoVisible = false">关 闭</el-button>
  255. </span>
  256. </el-dialog>
  257. </div>
  258. </template>
  259. <script>
  260. import dataCleanForm from './dataCleanForm.vue'
  261. import powerRationingForm from './powerRationingForm.vue'
  262. import modelForm from './modelForm.vue'
  263. import modelTestForm from './modelTestForm.vue'
  264. import processingForm from './processingForm.vue'
  265. import reportForm from './reportForm.vue'
  266. import {addTask, deleteId, queryTasks, updateTask} from "@/api/xvji/training";
  267. import {formatDateTime} from "@/utils/dateUtil";
  268. export default {
  269. components: {modelForm, modelTestForm, dataCleanForm, powerRationingForm, processingForm, reportForm},
  270. data() {
  271. return {
  272. loading: false,
  273. tableData: [],
  274. formData: {
  275. dataAcquisition: {componentType: '数据获取', isEnable: true, params: {}},
  276. dataCleaning: {componentType: '数据处理', isEnable: true, params: {}},
  277. powerRationing: {componentType: '限电清洗', isEnable: true, params: {}},
  278. model: {componentType: '模型', isEnable: true, params: {}},
  279. modelTest: {componentType: '模型测试', isEnable: true, params: {}},
  280. processing: {componentType: '后处理', isEnable: true, params: {}},
  281. report: {componentType: '分析报告', isEnable: true, params: {}},
  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. modelOption: ['光伏物理模型', '风电物理模型', 'Holtwinters模型', 'LSTM', '机器学习模型',],
  330. modelTestOption: ['LSTM-测试', '机器学习模型-测试',],
  331. }
  332. },
  333. mounted() {
  334. this.getList()
  335. },
  336. methods: {
  337. getList() {
  338. this.loading = true
  339. queryTasks(this.queryParams).then(res => {
  340. this.tableData = res.data.list
  341. // console.log(this.tableData[0])
  342. this.total = res.data.total
  343. this.loading = false
  344. }).catch(err => {
  345. this.loading = false
  346. })
  347. },
  348. // 新增
  349. addTask() {
  350. this.isEdit = false
  351. this.dialogVisible = true
  352. this.formData = {
  353. tTaskName: '',
  354. tCronExpression: '',
  355. dataAcquisition: {componentType: '数据获取', isEnable: true, params: {}},
  356. dataCleaning: {componentType: '数据处理', isEnable: true, params: {}},
  357. powerRationing: {componentType: '限电清洗-光伏', isEnable: true, params: {}},
  358. model: {componentType: '光伏物理模型', isEnable: true, params: {}},
  359. modelTest: {componentType: '模型测试', isEnable: true, params: {}},
  360. processing: {componentType: '后处理', isEnable: true, params: {}},
  361. report: {componentType: '分析报告', isEnable: true, params: {}},
  362. }
  363. this.$nextTick(() => {
  364. this.powerRationingNameChange() // 无意义,限电清洗表单不渲染刷新操作
  365. this.$refs.ruleForm.clearValidate()
  366. })
  367. },
  368. // 编辑
  369. handleClick(row) {
  370. this.isEdit = true
  371. this.formData = {
  372. tTaskId: row.ttaskId,
  373. tTaskName: row.ttaskName,
  374. tTaskStatus: row.ttaskStatus,
  375. tAnalysisReport: row.tanalysisReport,
  376. tComponentIds: row.tcomponentIds,
  377. tCreateTime: row.tcreateTime,
  378. tCronExpression: row.tcronExpression,
  379. tQuartzTask: row.tquartzTask,
  380. tRunInfo: row.trunInfo,
  381. dataAcquisition: row.components.find(w => w.componentType.includes('数据获取')) || {
  382. componentType: '数据获取',
  383. isEnable: true,
  384. params: {}
  385. },
  386. dataCleaning: row.components.find(w => w.componentType === '数据处理') || {
  387. componentType: '数据处理',
  388. isEnable: true,
  389. params: {}
  390. },
  391. powerRationing: row.components.find(w => w.componentType.includes('限电清洗')) || {
  392. componentType: '限电清洗-光伏',
  393. isEnable: true,
  394. params: {}
  395. },
  396. model: row.components.find(w => this.modelOption.includes(w.componentType)) || {
  397. componentType: '光伏物理模型',
  398. isEnable: true,
  399. params: {}
  400. },
  401. modelTest: row.components.find(w => this.modelTestOption.includes(w.componentType)) || {
  402. componentType: '模型测试',
  403. isEnable: true,
  404. params: {}
  405. },
  406. processing: row.components.find(w => w.componentType === '后处理') || {
  407. componentType: '后处理',
  408. isEnable: true,
  409. params: {}
  410. },
  411. report: row.components.find(w => w.componentType === '分析报告') || {
  412. componentType: '分析报告',
  413. isEnable: true,
  414. params: {}
  415. },
  416. }
  417. // console.log(this.formData.powerRationing)
  418. this.dialogVisible = true
  419. },
  420. //删除
  421. handleDeleteClick(row) {
  422. this.$confirm('此操作将永久删除' + row.ttaskName + '任务, 是否继续?', '提示', {
  423. confirmButtonText: '确定',
  424. cancelButtonText: '取消',
  425. type: 'warning'
  426. }).then(() => {
  427. deleteId(row.ttaskId).then(res => {
  428. if (res.code === 200) {
  429. this.$message({
  430. type: 'success',
  431. message: res.msg
  432. });
  433. } else {
  434. this.$message({
  435. type: 'danger',
  436. message: res.msg
  437. });
  438. }
  439. this.getList()
  440. })
  441. }).catch(() => {
  442. this.$message({
  443. type: 'info',
  444. message: '已取消删除'
  445. });
  446. });
  447. },
  448. //保存
  449. saveTask() {
  450. this.$refs.ruleForm.validate(async (valid) => {
  451. if (valid) {
  452. await this.$refs.dataCleaning.saveTask()
  453. if (JSON.stringify(this.formData.dataCleaning.params) === '{}') {
  454. return false
  455. }
  456. await this.$refs.powerRationing.saveTask()
  457. if (JSON.stringify(this.formData.powerRationing.params) === '{}') {
  458. return false
  459. }
  460. await this.$refs.model.saveTask()
  461. if (JSON.stringify(this.formData.model.params) === '{}') {
  462. return false
  463. }
  464. if (this.formData.model.componentType.includes('LSTM') || this.formData.model.componentType.includes('机器')) {
  465. await this.$refs.modelTest.saveTask()
  466. if (JSON.stringify(this.formData.modelTest.params) === '{}') {
  467. return false
  468. }
  469. } else {
  470. this.formData.modelTest = {}
  471. }
  472. await this.$refs.processing.saveTask()
  473. if (JSON.stringify(this.formData.processing.params) === '{}') {
  474. return false
  475. }
  476. await this.$refs.report.saveTask()
  477. if (JSON.stringify(this.formData.report.params) === '{}') {
  478. return false
  479. }
  480. if (!this.isEdit) {
  481. addTask(this.formData).then(res => {
  482. if (res.code === 200) {
  483. this.$message({
  484. type: 'success',
  485. message: res.msg
  486. });
  487. } else {
  488. this.$message({
  489. type: 'danger',
  490. message: res.msg
  491. });
  492. }
  493. this.getList()
  494. this.dialogVisible = false
  495. })
  496. } else {
  497. updateTask(this.formData).then(res => {
  498. if (res.code === 200) {
  499. this.$message({
  500. type: 'success',
  501. message: res.msg
  502. });
  503. } else {
  504. this.$message({
  505. type: 'danger',
  506. message: res.msg
  507. });
  508. }
  509. this.getList()
  510. this.dialogVisible = false
  511. })
  512. }
  513. } else {
  514. this.$message({
  515. message: '校验不通过',
  516. type: 'warning'
  517. })
  518. return false;
  519. }
  520. });
  521. },
  522. // 数据处理数据
  523. getDataCleaning(val) {
  524. this.formData.dataCleaning.params = val
  525. },
  526. getPowerRationing(val) {
  527. this.formData.powerRationing.params = val
  528. },
  529. getModel(val) {
  530. this.formData.model.params = val
  531. },
  532. getModelTest(val) {
  533. this.formData.modelTest.params = val
  534. },
  535. getProcessing(val) {
  536. this.formData.processing.params = val
  537. },
  538. getReport(val) {
  539. this.formData.report.params = val
  540. },
  541. powerRationingNameChange() {
  542. if (!this.isEdit) {
  543. if (this.formData.powerRationing.componentType.includes('光伏')) {
  544. this.formData.powerRationing.params = {
  545. mongodb_database: '',
  546. mongodb_read_table: '',
  547. mongodb_write_table: '',
  548. col_power: '',
  549. col_radiance: '',
  550. sigma: 1
  551. }
  552. } else {
  553. this.formData.powerRationing.params = {
  554. mongodb_database: '',
  555. mongodb_read_table: '',
  556. mongodb_write_table: '',
  557. col_power: '',
  558. col_ws: '',
  559. cap: '',
  560. eps: 0.1,
  561. min_samples: '20'
  562. }
  563. }
  564. }
  565. },
  566. isDisableModeTest() {
  567. if (this.formData.model.componentType.includes('LSTM') || this.formData.model.componentType.includes('机器')) {
  568. this.modelTestDisable = false
  569. this.formData.modelTest.isEnable = true
  570. this.formData.modelTest.componentType = this.formData.model.componentType + '测试'
  571. return
  572. }
  573. this.modelTestDisable = true
  574. this.formData.modelTest.isEnable = false
  575. },
  576. handleClose() {
  577. this.$refs.ruleForm.resetFields()
  578. // this.formData = {
  579. // tTaskName: '',
  580. // tCronExpression: '',
  581. // dataAcquisition: {componentType: '数据获取', isEnable: true, params:{}},
  582. // dataCleaning: {componentType: '数据处理', isEnable: true, params:{}},
  583. // powerRationing: {componentType: '限电清洗-光伏', isEnable: true, params:{}},
  584. // model: {componentType: '光伏物理模型', isEnable: true, params:{}},
  585. // modelTest: {componentType: '模型测试', isEnable: true, params:{}},
  586. // processing: {componentType: '后处理', isEnable: true, params:{}},
  587. // report: {componentType: '分析报告', isEnable: true, params:{}},
  588. // }
  589. this.dialogVisible = false
  590. },
  591. // 预览报告文件
  592. viewReport(row) {
  593. if(row.tanalysisReport !==null){
  594. window.open(row.tanalysisReport)
  595. // window.open('http://192.168.1.29:11111/J00001_1758852448094_3865.html')
  596. }else{
  597. this.$message({
  598. type: 'warning',
  599. message: '暂无报告文件'
  600. });
  601. }
  602. },
  603. // 运行信息
  604. viewInfo(row) {
  605. if(row.trunInfo !==null){
  606. this.info = row.tRunInfo
  607. this.dialogInfoVisible = true
  608. }else{
  609. this.info = null
  610. this.$message({
  611. type: 'warning',
  612. message: '暂无运行信息'
  613. });
  614. }
  615. },
  616. formatCreateTime(row){
  617. return formatDateTime(new Date(row.tcreateTime))
  618. },
  619. formatPtaskStatus(row){
  620. return row.ptaskStatus === 0?'失败':row.ptaskStatus === 1?'成功':'运行'
  621. }
  622. }
  623. }
  624. </script>
  625. <style scoped lang="scss">
  626. .form-table-item {
  627. max-height: 30vh;
  628. overflow-y: auto;
  629. ::v-deep .el-form-item {
  630. margin-bottom: 15px;
  631. }
  632. }
  633. .td0 {
  634. width: 200px;
  635. }
  636. .td1 {
  637. width: 150px;
  638. }
  639. .td2 {
  640. width: calc(100% - 350px);
  641. }
  642. .mode-table {
  643. max-height: 63vh;
  644. overflow-y: auto;
  645. position: relative;
  646. border-collapse: separate;
  647. }
  648. .mode-table-thead {
  649. position: sticky;
  650. top: 0;
  651. z-index: 1000000;
  652. background-color: white;
  653. &:first-child{
  654. border-bottom: 1px solid #ebeef5;
  655. }
  656. }
  657. .mode-table.mode-table-body .model-table-tr {
  658. &:last-child{
  659. border-bottom: 1px solid #ebeef5;
  660. }
  661. }
  662. .mode-table .mode-table-body .model-table-tr{
  663. &:first-child{
  664. border-top: none;
  665. }
  666. }
  667. .model-table-tr {
  668. width: 100%;
  669. text-align: center;
  670. border: 1px solid #ebeef5;
  671. border-bottom: none;
  672. line-height: 30px;
  673. .td {
  674. border-right: 1px solid #ebeef5;
  675. display: grid;
  676. place-items: center;
  677. }
  678. .pa-0 {
  679. padding: 0 .5vw;
  680. }
  681. }
  682. .runInfoBox{
  683. line-height: 25px;
  684. }
  685. </style>