log.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="68px"
  10. >
  11. <el-form-item label="任务名称" prop="jobName">
  12. <el-input
  13. v-model="queryParams.jobName"
  14. placeholder="请输入任务名称"
  15. clearable
  16. style="width: 240px"
  17. @keyup.enter.native="handleQuery"
  18. />
  19. </el-form-item>
  20. <el-form-item label="任务组名" prop="jobGroup">
  21. <el-select
  22. v-model="queryParams.jobGroup"
  23. placeholder="请选择任务组名"
  24. clearable
  25. style="width: 240px"
  26. >
  27. <el-option
  28. v-for="dict in dict.type.sys_job_group"
  29. :key="dict.value"
  30. :label="dict.label"
  31. :value="dict.value"
  32. />
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item label="执行状态" prop="status">
  36. <el-select
  37. v-model="queryParams.status"
  38. placeholder="请选择执行状态"
  39. clearable
  40. style="width: 240px"
  41. >
  42. <el-option
  43. v-for="dict in dict.type.sys_common_status"
  44. :key="dict.value"
  45. :label="dict.label"
  46. :value="dict.value"
  47. />
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item label="执行时间">
  51. <el-date-picker
  52. v-model="dateRange"
  53. style="width: 240px"
  54. value-format="yyyy-MM-dd"
  55. type="daterange"
  56. range-separator="-"
  57. start-placeholder="开始日期"
  58. end-placeholder="结束日期"
  59. ></el-date-picker>
  60. </el-form-item>
  61. <el-form-item label="是否完成" prop="whetherComplete">
  62. <el-select
  63. v-model="queryParams.whetherComplete"
  64. placeholder="请选择任务是否完成"
  65. clearable
  66. >
  67. <el-option
  68. v-for="dict in dict.type.sys_job_complete"
  69. :key="dict.value"
  70. :label="dict.label"
  71. :value="dict.value"
  72. />
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item label="任务员工" prop="empno">
  76. <el-input
  77. v-model="queryParams.empno"
  78. placeholder="请输入员工工号"
  79. clearable
  80. />
  81. </el-form-item>
  82. <el-form-item label="任务大类" prop="jobType">
  83. <el-select
  84. v-model="queryParams.jobType"
  85. placeholder="请选择任务大类"
  86. clearable
  87. >
  88. <el-option
  89. v-for="dict in dict.type.sys_oa"
  90. :key="dict.value"
  91. :label="dict.label"
  92. :value="dict.value"
  93. />
  94. </el-select>
  95. </el-form-item>
  96. <el-form-item label="任务小类" prop="jobTypeS">
  97. <el-select
  98. v-model="queryParams.jobTypeS"
  99. placeholder="请选择任务小类"
  100. clearable
  101. >
  102. <el-option
  103. v-for="dict in dict.type.sys_oa_s"
  104. :key="dict.value"
  105. :label="dict.label"
  106. :value="dict.value"
  107. />
  108. </el-select>
  109. </el-form-item>
  110. <el-form-item>
  111. <el-button
  112. type="primary"
  113. icon="el-icon-search"
  114. size="mini"
  115. @click="handleQuery"
  116. >搜索</el-button
  117. >
  118. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  119. >重置</el-button
  120. >
  121. </el-form-item>
  122. </el-form>
  123. <el-row :gutter="10" class="mb8">
  124. <el-col :span="1.5">
  125. <el-button
  126. type="danger"
  127. plain
  128. icon="el-icon-delete"
  129. size="mini"
  130. :disabled="multiple"
  131. @click="handleDelete"
  132. v-hasPermi="['monitor:job:remove']"
  133. >删除</el-button
  134. >
  135. </el-col>
  136. <el-col :span="1.5">
  137. <el-button
  138. type="danger"
  139. plain
  140. icon="el-icon-delete"
  141. size="mini"
  142. @click="handleClean"
  143. v-hasPermi="['monitor:job:remove']"
  144. >清空</el-button
  145. >
  146. </el-col>
  147. <el-col :span="1.5">
  148. <el-button
  149. type="warning"
  150. plain
  151. icon="el-icon-download"
  152. size="mini"
  153. @click="handleExport"
  154. v-hasPermi="['monitor:job:export']"
  155. >导出</el-button
  156. >
  157. </el-col>
  158. <el-col :span="1.5">
  159. <el-button
  160. type="warning"
  161. plain
  162. icon="el-icon-close"
  163. size="mini"
  164. @click="handleClose"
  165. >关闭</el-button
  166. >
  167. </el-col>
  168. <right-toolbar
  169. :showSearch.sync="showSearch"
  170. @queryTable="getList"
  171. ></right-toolbar>
  172. </el-row>
  173. <el-table
  174. v-loading="loading"
  175. :data="jobLogList"
  176. @selection-change="handleSelectionChange"
  177. @row-dblclick="dblclick"
  178. >
  179. <el-table-column type="selection" width="55" align="center" />
  180. <el-table-column label="编号" width="80" align="center" prop="jobLogId" />
  181. <el-table-column label="任务执行状态" align="center" prop="status">
  182. <template slot-scope="scope">
  183. <dict-tag
  184. :options="dict.type.sys_common_status"
  185. :value="scope.row.status"
  186. />
  187. </template>
  188. </el-table-column>
  189. <!-- <el-table-column label="执行时间" align="center" prop="createTime" width="180">
  190. <template slot-scope="scope">
  191. <span>{{ parseTime(scope.row.createTime) }}</span>
  192. </template>
  193. </el-table-column>-->
  194. <el-table-column
  195. label="完成时长"
  196. width="180"
  197. align="center"
  198. prop="tqaaaa"
  199. />
  200. <el-table-column
  201. label="超时时长"
  202. width="180"
  203. align="center"
  204. prop="tqbbbb"
  205. />
  206. <el-table-column
  207. label="任务名称"
  208. width="180"
  209. align="center"
  210. prop="jobName"
  211. :show-overflow-tooltip="false"
  212. />
  213. <el-table-column
  214. label="任务员工"
  215. width="80"
  216. align="center"
  217. prop="nickName"
  218. />
  219. <el-table-column
  220. label="任务大类"
  221. width="80"
  222. align="center"
  223. prop="jobType"
  224. />
  225. <el-table-column
  226. label="任务小类"
  227. width="80"
  228. align="center"
  229. prop="jobTypeS"
  230. />
  231. <el-table-column
  232. label="任务内容"
  233. width="400"
  234. align="center"
  235. prop="cont"
  236. />
  237. <el-table-column
  238. label="执行时间"
  239. align="center"
  240. prop="createTime"
  241. width="180"
  242. >
  243. <template slot-scope="scope">
  244. <span>{{ parseTime(scope.row.createTime) }}</span>
  245. </template>
  246. </el-table-column>
  247. <el-table-column
  248. label="完成时间"
  249. width="180"
  250. align="center"
  251. prop="executionTime"
  252. />
  253. <el-table-column
  254. label="预计时长"
  255. width="80"
  256. align="center"
  257. prop="durations"
  258. />
  259. <el-table-column
  260. label="oa执行状态"
  261. width="90"
  262. align="center"
  263. prop="completionStatus"
  264. >
  265. <template slot-scope="scope">
  266. <dict-tag
  267. :options="dict.type.sys_oa_back_state"
  268. :value="scope.row.completionStatus"
  269. />
  270. </template>
  271. </el-table-column>
  272. <el-table-column
  273. label="任务组名"
  274. align="center"
  275. prop="jobGroup"
  276. :show-overflow-tooltip="true"
  277. >
  278. <template slot-scope="scope">
  279. <dict-tag
  280. :options="dict.type.sys_job_group"
  281. :value="scope.row.jobGroup"
  282. />
  283. </template>
  284. </el-table-column>
  285. <!-- <el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />-->
  286. <el-table-column
  287. label="日志信息"
  288. align="center"
  289. prop="jobMessage"
  290. :show-overflow-tooltip="true"
  291. />
  292. <el-table-column
  293. label="操作"
  294. align="center"
  295. class-name="small-padding fixed-width"
  296. >
  297. <template slot-scope="scope">
  298. <el-button
  299. size="mini"
  300. type="text"
  301. icon="el-icon-view"
  302. @click="handleView(scope.row)"
  303. v-hasPermi="['monitor:job:query']"
  304. >详细</el-button
  305. >
  306. </template>
  307. </el-table-column>
  308. </el-table>
  309. <pagination
  310. v-show="total > 0"
  311. :total="total"
  312. :page.sync="queryParams.pageNum"
  313. :limit.sync="queryParams.pageSize"
  314. @pagination="getList"
  315. />
  316. <!-- 调度日志详细 -->
  317. <el-dialog
  318. title="调度日志详细"
  319. :visible.sync="open"
  320. width="700px"
  321. append-to-body
  322. >
  323. <el-form ref="form" :model="form" label-width="100px" size="mini">
  324. <el-row>
  325. <el-col :span="12">
  326. <el-form-item label="日志序号:">{{ form.jobLogId }}</el-form-item>
  327. <el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
  328. <el-form-item label="员工工号:">{{ form.empno }}</el-form-item>
  329. </el-col>
  330. <el-col :span="12">
  331. <el-form-item label="任务分组:">{{ form.jobGroup }}</el-form-item>
  332. <el-form-item label="执行时间:">{{
  333. form.createTime
  334. }}</el-form-item>
  335. </el-col>
  336. <el-col :span="24">
  337. <el-form-item label="调用方法:">{{
  338. form.invokeTarget
  339. }}</el-form-item>
  340. </el-col>
  341. <el-col :span="24">
  342. <el-form-item label="日志信息:">{{
  343. form.jobMessage
  344. }}</el-form-item>
  345. </el-col>
  346. <el-col :span="24">
  347. <el-form-item label="执行状态:">
  348. <div v-if="form.status == 0">正常</div>
  349. <div v-else-if="form.status == 1">失败</div>
  350. </el-form-item>
  351. </el-col>
  352. <el-col :span="24">
  353. <el-form-item label="异常信息:" v-if="form.status == 1">{{
  354. form.exceptionInfo
  355. }}</el-form-item>
  356. </el-col>
  357. </el-row>
  358. </el-form>
  359. <div slot="footer">
  360. <el-button @click="open = false">关 闭</el-button>
  361. </div>
  362. </el-dialog>
  363. </div>
  364. </template>
  365. <script>
  366. import { getJob } from "@/api/monitor/job";
  367. import { listJobLog, delJobLog, cleanJobLog } from "@/api/monitor/jobLog";
  368. export default {
  369. name: "JobLog",
  370. dicts: [
  371. "sys_job_complete",
  372. "sys_oa",
  373. "sys_oa_s",
  374. "sys_common_status",
  375. "sys_job_group",
  376. "sys_oa_back_state",
  377. ],
  378. data() {
  379. return {
  380. // 遮罩层
  381. loading: true,
  382. // 选中数组
  383. ids: [],
  384. // 非多个禁用
  385. multiple: true,
  386. // 显示搜索条件
  387. showSearch: true,
  388. // 总条数
  389. total: 0,
  390. // 调度日志表格数据
  391. jobLogList: [],
  392. // 是否显示弹出层
  393. open: false,
  394. // 日期范围
  395. dateRange: [],
  396. // 表单参数
  397. form: {},
  398. // 查询参数
  399. queryParams: {
  400. pageNum: 1,
  401. pageSize: 10,
  402. jobName: undefined,
  403. jobGroup: undefined,
  404. status: undefined,
  405. jobType: undefined,
  406. jobTypeS: undefined,
  407. empno: undefined,
  408. whetherComplete: undefined,
  409. },
  410. };
  411. },
  412. created() {
  413. const jobId = this.$route.params && this.$route.params.jobId;
  414. if (jobId !== undefined && jobId != 0) {
  415. getJob(jobId).then((response) => {
  416. this.queryParams.jobName = response.data.jobName;
  417. this.queryParams.jobGroup = response.data.jobGroup;
  418. this.getList();
  419. });
  420. } else {
  421. this.getList();
  422. }
  423. },
  424. methods: {
  425. dblclick({ executionTime, createTime }, column) {
  426. console.log(
  427. (new Date(executionTime).getTime() - new Date(createTime).getTime()) /
  428. 1000 +
  429. "s"
  430. );
  431. },
  432. /** 查询调度日志列表 */
  433. getList() {
  434. this.loading = true;
  435. listJobLog(this.addDateRange(this.queryParams, this.dateRange)).then(
  436. (response) => {
  437. // console.log(response, 'response')
  438. this.jobLogList = response.rows.map((item) => {
  439. const { executionTime, createTime, duration } = item;
  440. const durations = `${duration}h`;
  441. let tqaaaa = null;
  442. if (executionTime != null) {
  443. tqaaaa = (
  444. parseInt(
  445. new Date(executionTime).getTime() -
  446. new Date(createTime).getTime()
  447. ) /
  448. 1000 /
  449. 60 /
  450. 60
  451. ).toFixed(2);
  452. }
  453. /** 用于计算超时时长 */
  454. const calculateTime = (
  455. parseInt(
  456. new Date(
  457. executionTime == null ? Date() : executionTime
  458. ).getTime() - new Date(createTime).getTime()
  459. ) /
  460. 1000 /
  461. 60 /
  462. 60
  463. ).toFixed(2);
  464. /** 计算超时时长 */
  465. const timestemp = (calculateTime - duration).toFixed(2);
  466. const tqbbbb = timestemp > 0 ? `超时 ${timestemp}h` : `未超时`;
  467. return {
  468. ...item,
  469. tqaaaa,
  470. tqbbbb,
  471. durations,
  472. };
  473. });
  474. this.total = response.total;
  475. this.loading = false;
  476. }
  477. );
  478. },
  479. // new Date(scope.row.executionTime).getTime()-new Date(scope.row.createTime).getTime())/1000+'s'
  480. // 返回按钮
  481. handleClose() {
  482. const obj = { path: "/monitor/job" };
  483. this.$tab.closeOpenPage(obj);
  484. },
  485. /** 搜索按钮操作 */
  486. handleQuery() {
  487. this.queryParams.pageNum = 1;
  488. this.getList();
  489. },
  490. /** 重置按钮操作 */
  491. resetQuery() {
  492. this.dateRange = [];
  493. this.resetForm("queryForm");
  494. this.handleQuery();
  495. },
  496. // 多选框选中数据
  497. handleSelectionChange(selection) {
  498. this.ids = selection.map((item) => item.jobLogId);
  499. this.multiple = !selection.length;
  500. },
  501. /** 详细按钮操作 */
  502. handleView(row) {
  503. this.open = true;
  504. this.form = row;
  505. },
  506. /** 删除按钮操作 */
  507. handleDelete(row) {
  508. const jobLogIds = this.ids;
  509. this.$modal
  510. .confirm('是否确认删除调度日志编号为"' + jobLogIds + '"的数据项?')
  511. .then(function () {
  512. return delJobLog(jobLogIds);
  513. })
  514. .then(() => {
  515. this.getList();
  516. this.$modal.msgSuccess("删除成功");
  517. })
  518. .catch(() => {});
  519. },
  520. /** 清空按钮操作 */
  521. handleClean() {
  522. this.$modal
  523. .confirm("是否确认清空所有调度日志数据项?")
  524. .then(function () {
  525. return cleanJobLog();
  526. })
  527. .then(() => {
  528. this.getList();
  529. this.$modal.msgSuccess("清空成功");
  530. })
  531. .catch(() => {});
  532. },
  533. /** 导出按钮操作 */
  534. handleExport() {
  535. this.download(
  536. "/monitor/jobLog/export",
  537. {
  538. ...this.queryParams,
  539. },
  540. `log_${new Date().getTime()}.xlsx`
  541. );
  542. },
  543. },
  544. };
  545. </script>