index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <div class="page-container">
  3. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px" class="search-form_container">
  4. <el-form-item label="预测时间" prop="daterange">
  5. <el-date-picker
  6. :editable="false"
  7. value-format="YYYY/MM/DD HH:mm:ss"
  8. v-model="queryParams.daterange"
  9. type="datetimerange"
  10. range-separator="To"
  11. start-placeholder="开始日期"
  12. end-placeholder="结束日期"
  13. />
  14. </el-form-item>
  15. <el-form-item label="预测类型" prop="category">
  16. <el-select v-model="queryParams.category">
  17. <el-option value="" label="全部"></el-option>
  18. <el-option
  19. :key="item"
  20. :value="item.value"
  21. :label="item.label"
  22. v-for="item in category"
  23. ></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item>
  27. <el-button type="primary" icon="search" size="small" @click="handleQuery">搜索</el-button>
  28. <el-button icon="refresh" size="small" @click="resetQuery">重置</el-button>
  29. </el-form-item>
  30. </el-form>
  31. <el-card shadow="never" class="card-chart_container">
  32. <LineEchart :category="category"></LineEchart>
  33. </el-card>
  34. <el-card shadow="never" body-class="card-table_container">
  35. <el-row :gutter="10" class="mb8">
  36. <el-col :span="1.5">
  37. <el-button
  38. type="warning"
  39. plain
  40. icon="download"
  41. size="small"
  42. @click="handleExport"
  43. >导出</el-button>
  44. </el-col>
  45. <right-toolbar @update:showSearch="(v) => showSearch = v" @queryTable="getList" :showSearch="showSearch"></right-toolbar>
  46. </el-row>
  47. <el-table v-loading="loading" :data="comparisonList" @selection-change="handleSelectionChange">
  48. <el-table-column label="时间" align="center" prop="remark" width="120"/>
  49. <el-table-column label="预测类型" align="center" prop="category" width="120"/>
  50. <el-table-column label="预测1时间" align="center" prop="forecastTimeOne" width="120"/>
  51. <el-table-column label="实际1小时值" align="center" prop="realOne" width="120"/>
  52. <el-table-column label="TFT预测1小时值" align="center" prop="hsForecastOne" width="120"/>
  53. <el-table-column label="TFT预测1小时误差值" align="center" prop="hsOneSubtract" width="150"/>
  54. <el-table-column label="TFT预测1小时百分比误差" align="center" prop="hsErrorRateOneStr" width="180"/>
  55. <el-table-column label="LSTM预测1小时值" align="center" prop="yyForecastOne" width="140"/>
  56. <el-table-column label="LSTM预测1误差值" align="center" prop="yyOneSubtract" width="150"/>
  57. <el-table-column label="LSTM预测1小时百分比误差" align="center" prop="yyErrorRateOneStr" width="200"/>
  58. <el-table-column label="预测2时间" align="center" prop="forecastTimeTwo" width="120"/>
  59. <el-table-column label="实际2小时值" align="center" prop="realTwo" width="120"/>
  60. <el-table-column label="TFT预测2小时值" align="center" prop="hsForecastTwo" width="120"/>
  61. <el-table-column label="TFT预测2误差值" align="center" prop="hsTwoSubtract" width="150"/>
  62. <el-table-column label="TFT预测2小时百分比误差" align="center" prop="hsErrorRateTwoStr" width="180"/>
  63. <el-table-column label="LSTM预测2小时值" align="center" prop="yyForecastTwo" width="140"/>
  64. <el-table-column label="LSTM预测2误差值" align="center" prop="yyTwoSubtract" width="140"/>
  65. <el-table-column label="LSTM预测2小时百分比误差" align="center" prop="yyErrorRateTwoStr" width="200"/>
  66. <el-table-column label="预测3时间" align="center" prop="forecastTimeThree" width="120"/>
  67. <el-table-column label="实际3小时值" align="center" prop="realThree" width="120"/>
  68. <el-table-column label="TFT预测3小时值" align="center" prop="hsForecastThree" width="120"/>
  69. <el-table-column label="TFT预测3误差值" align="center" prop="hsThreeSubtract" width="120"/>
  70. <el-table-column label="TFT预测3小时百分比误差" align="center" prop="hsErrorRateThreeStr" width="180"/>
  71. <el-table-column label="LSTM预测3小时值" align="center" prop="yyForecastThree" width="140"/>
  72. <el-table-column label="LSTM预测3误差值" align="center" prop="yyThreeSubtract" width="140"/>
  73. <el-table-column label="LSTM预测3小时百分比误差" align="center" prop="yyErrorRateThreeStr" width="190"/>
  74. </el-table>
  75. <pagination
  76. v-show="total > 0"
  77. :total="total"
  78. v-model:page="queryParams.pageNum"
  79. v-model:limit="queryParams.pageSize"
  80. @pagination="getList"
  81. />
  82. </el-card>
  83. <!-- 添加或修改信义预测对比对话框 -->
  84. <el-dialog :title="title" v-model="open" width="900px" append-to-body>
  85. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  86. <el-form-item label="预测类型" prop="category">
  87. <el-input v-model="form.category" placeholder="请输入预测类型" />
  88. </el-form-item>
  89. <el-form-item label="预测时间1" prop="forecastTimeOne">
  90. <el-input v-model="form.forecastTimeOne" placeholder="请输入预测时间1" />
  91. </el-form-item>
  92. <el-form-item label="实际值1" prop="realOne">
  93. <el-input v-model="form.realOne" placeholder="请输入实际值1" />
  94. </el-form-item>
  95. <el-form-item label="红杉预测值1" prop="hsForecastOne">
  96. <el-input v-model="form.hsForecastOne" placeholder="请输入红杉预测值1" />
  97. </el-form-item>
  98. <el-form-item label="红杉值1误差率" prop="hsErrorRateOne">
  99. <el-input v-model="form.hsErrorRateOne" placeholder="请输入红杉值1误差率" />
  100. </el-form-item>
  101. <el-form-item label="跃渊预测值1" prop="yyForecastOne">
  102. <el-input v-model="form.yyForecastOne" placeholder="请输入跃渊预测值1" />
  103. </el-form-item>
  104. <el-form-item label="跃渊值1误差率" prop="yyErrorRateOne">
  105. <el-input v-model="form.yyErrorRateOne" placeholder="请输入跃渊值1误差率" />
  106. </el-form-item>
  107. <el-form-item label="预测时间2" prop="forecastTimeTwo">
  108. <el-input v-model="form.forecastTimeTwo" placeholder="请输入预测时间2" />
  109. </el-form-item>
  110. <el-form-item label="实际值2" prop="realTwo">
  111. <el-input v-model="form.realTwo" placeholder="请输入实际值2" />
  112. </el-form-item>
  113. <el-form-item label="红杉预测值2" prop="hsForecastTwo">
  114. <el-input v-model="form.hsForecastTwo" placeholder="请输入红杉预测值2" />
  115. </el-form-item>
  116. <el-form-item label="红杉值2误差率" prop="hsErrorRateTwo">
  117. <el-input v-model="form.hsErrorRateTwo" placeholder="请输入红杉值2误差率" />
  118. </el-form-item>
  119. <el-form-item label="跃渊预测值2" prop="yyForecastTwo">
  120. <el-input v-model="form.yyForecastTwo" placeholder="请输入跃渊预测值2" />
  121. </el-form-item>
  122. <el-form-item label="跃渊值2误差率" prop="yyErrorRateTwo">
  123. <el-input v-model="form.yyErrorRateTwo" placeholder="请输入跃渊值2误差率" />
  124. </el-form-item>
  125. <el-form-item label="预测时间3" prop="forecastTimeThree">
  126. <el-input v-model="form.forecastTimeThree" placeholder="请输入预测时间3" />
  127. </el-form-item>
  128. <el-form-item label="实际值3" prop="realThree">
  129. <el-input v-model="form.realThree" placeholder="请输入实际值3" />
  130. </el-form-item>
  131. <el-form-item label="红杉预测值3" prop="hsForecastThree">
  132. <el-input v-model="form.hsForecastThree" placeholder="请输入红杉预测值3" />
  133. </el-form-item>
  134. <el-form-item label="红杉值3误差率" prop="hsErrorRateThree">
  135. <el-input v-model="form.hsErrorRateThree" placeholder="请输入红杉值3误差率" />
  136. </el-form-item>
  137. <el-form-item label="跃渊预测值3" prop="yyForecastThree">
  138. <el-input v-model="form.yyForecastThree" placeholder="请输入跃渊预测值3" />
  139. </el-form-item>
  140. <el-form-item label="跃渊值3误差率" prop="yyErrorRateThree">
  141. <el-input v-model="form.yyErrorRateThree" placeholder="请输入跃渊值3误差率" />
  142. </el-form-item>
  143. <el-form-item label="删除标志" prop="delFlag">
  144. <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
  145. </el-form-item>
  146. <el-form-item label="乐观锁" prop="revision">
  147. <el-input v-model="form.revision" placeholder="请输入乐观锁" />
  148. </el-form-item>
  149. <el-form-item label="备注" prop="remark">
  150. <el-input v-model="form.remark" placeholder="请输入备注" />
  151. </el-form-item>
  152. </el-form>
  153. <div slot="footer" class="dialog-footer">
  154. <el-button type="primary" @click="submitForm">确 定</el-button>
  155. <el-button @click="cancel">取 消</el-button>
  156. </div>
  157. </el-dialog>
  158. </div>
  159. </template>
  160. <script>
  161. import { listComparison, getComparison, delComparison, addComparison, updateComparison } from "@/api/business/comparison";
  162. import dayjs from "dayjs";
  163. import LineEchart from "./components/LineEchart";
  164. export default {
  165. components: { LineEchart },
  166. name: "Comparison",
  167. data() {
  168. return {
  169. // 遮罩层
  170. loading: true,
  171. // 选中数组
  172. ids: [],
  173. // 非单个禁用
  174. single: true,
  175. // 非多个禁用
  176. multiple: true,
  177. // 显示搜索条件
  178. showSearch: true,
  179. // 总条数
  180. total: 0,
  181. // 信义预测对比表格数据
  182. comparisonList: [],
  183. // 弹出层标题
  184. title: "",
  185. // 是否显示弹出层
  186. open: false,
  187. // 预测类型
  188. category: [
  189. { label: "#1NO₃⁻", value: 'xsy1' },
  190. { label: "#2NO₃⁻", value: 'xsy2' },
  191. { label: "PO₄³⁻ ", value: 'zlsy' },
  192. { label: "NH₃-N ", value: 'nh3' },
  193. { label: "COD ", value: 'cod' },
  194. { label: "SS ", value: 'ss' }
  195. ],
  196. // 查询参数
  197. queryParams: {
  198. pageNum: 1,
  199. pageSize: 10,
  200. daterange: [],
  201. category: null,
  202. },
  203. // 表单参数
  204. form: {},
  205. // 表单校验
  206. rules: {
  207. }
  208. };
  209. },
  210. created() {
  211. this.getList();
  212. },
  213. methods: {
  214. /** 查询信义预测对比列表 */
  215. getList() {
  216. this.loading = true;
  217. const [ begin, end ] = this.queryParams.daterange || [];
  218. let timeBegin = '';
  219. let timeEnd = '';
  220. if ( begin ) {
  221. timeBegin = dayjs(begin).format('YYYY/MM/DD H');
  222. timeEnd = dayjs(end).format('YYYY/MM/DD H');
  223. }
  224. const params = { ...this.queryParams, timeBegin, timeEnd };
  225. delete params.daterange;
  226. listComparison(params).then(response => {
  227. const whiteList = {
  228. xsy1: '#1NO₃⁻',
  229. xsy2: '#2NO₃⁻',
  230. zlsy: 'PO₄³⁻',
  231. nh3: 'NH₃',
  232. cod: 'COD',
  233. ss: 'SS',
  234. }
  235. this.comparisonList = response.rows.map(item => ({...item, category: whiteList[item.category]}));
  236. this.total = response.total;
  237. this.loading = false;
  238. });
  239. },
  240. // 取消按钮
  241. cancel() {
  242. this.open = false;
  243. this.reset();
  244. },
  245. // 表单重置
  246. reset() {
  247. this.form = {
  248. id: null,
  249. category: null,
  250. forecastTimeOne: null,
  251. realOne: null,
  252. hsForecastOne: null,
  253. hsErrorRateOne: null,
  254. yyForecastOne: null,
  255. yyErrorRateOne: null,
  256. forecastTimeTwo: null,
  257. realTwo: null,
  258. hsForecastTwo: null,
  259. hsErrorRateTwo: null,
  260. yyForecastTwo: null,
  261. yyErrorRateTwo: null,
  262. forecastTimeThree: null,
  263. realThree: null,
  264. hsForecastThree: null,
  265. hsErrorRateThree: null,
  266. yyForecastThree: null,
  267. yyErrorRateThree: null,
  268. delFlag: null,
  269. revision: null,
  270. createBy: null,
  271. createTime: null,
  272. updateBy: null,
  273. updateTime: null,
  274. remark: null
  275. };
  276. this.resetForm("form");
  277. },
  278. /** 搜索按钮操作 */
  279. handleQuery() {
  280. this.queryParams.pageNum = 1;
  281. this.getList();
  282. },
  283. /** 重置按钮操作 */
  284. resetQuery() {
  285. this.resetForm("queryForm");
  286. this.handleQuery();
  287. },
  288. // 多选框选中数据
  289. handleSelectionChange(selection) {
  290. this.ids = selection.map(item => item.id)
  291. this.single = selection.length!==1
  292. this.multiple = !selection.length
  293. },
  294. /** 新增按钮操作 */
  295. handleAdd() {
  296. this.reset();
  297. this.open = true;
  298. this.title = "添加信义预测对比";
  299. },
  300. /** 修改按钮操作 */
  301. handleUpdate(row) {
  302. this.reset();
  303. const id = row.id || this.ids
  304. getComparison(id).then(response => {
  305. this.form = response.data;
  306. this.open = true;
  307. this.title = "修改信义预测对比";
  308. });
  309. },
  310. /** 提交按钮 */
  311. submitForm() {
  312. this.$refs["form"].validate(valid => {
  313. if (valid) {
  314. if (this.form.id != null) {
  315. updateComparison(this.form).then(response => {
  316. this.$modal.msgSuccess("修改成功");
  317. this.open = false;
  318. this.getList();
  319. });
  320. } else {
  321. addComparison(this.form).then(response => {
  322. this.$modal.msgSuccess("新增成功");
  323. this.open = false;
  324. this.getList();
  325. });
  326. }
  327. }
  328. });
  329. },
  330. /** 删除按钮操作 */
  331. handleDelete(row) {
  332. const ids = row.id || this.ids;
  333. this.$modal.confirm('是否确认删除信义预测对比编号为"' + ids + '"的数据项?').then(function() {
  334. return delComparison(ids);
  335. }).then(() => {
  336. this.getList();
  337. this.$modal.msgSuccess("删除成功");
  338. }).catch(() => {});
  339. },
  340. /** 导出按钮操作 */
  341. handleExport() {
  342. this.download('business/comparison/export', {
  343. ...this.queryParams
  344. }, `comparison_${new Date().getTime()}.xlsx`)
  345. }
  346. }
  347. };
  348. </script>
  349. <style scoped lang="scss">
  350. .echart-wrap {
  351. // height: 420px;
  352. }
  353. </style>