index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. :inline="true"
  7. v-show="showSearch"
  8. label-width="68px"
  9. >
  10. <el-form-item label="部门" prop="type">
  11. <treeselect
  12. style="width: 220px"
  13. :clearable="false"
  14. v-model="queryParams.deptId"
  15. :options="deptOptions"
  16. clearable
  17. :show-count="true"
  18. placeholder="请选择归属部门"
  19. />
  20. </el-form-item>
  21. <el-form-item label="所属客服" prop="companyUserId">
  22. <el-select
  23. v-model="queryParams.companyUserId"
  24. clearable
  25. filterable
  26. remote
  27. placeholder="请输入关键词"
  28. :remote-method="loadCompanyUserOptions"
  29. v-select-load-more="loadMoreCompanyUserOptions"
  30. :loading="companyUserOptionsLoading"
  31. >
  32. <el-option
  33. v-for="item in companyUserOptions"
  34. :key="item.value"
  35. :label="item.label"
  36. :value="item.value"
  37. >
  38. </el-option>
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="企微昵称" prop="nickName">
  42. <el-input
  43. v-model="queryParams.nickName"
  44. placeholder="请输入企微昵称"
  45. clearable
  46. size="small"
  47. @keyup.enter.native="handleQuery"
  48. />
  49. </el-form-item>
  50. <el-form-item label="添加时间" prop="createTime">
  51. <el-date-picker
  52. v-model="createTime"
  53. size="small"
  54. style="width: 220px"
  55. value-format="yyyy-MM-dd"
  56. type="daterange"
  57. range-separator="-"
  58. start-placeholder="开始日期"
  59. end-placeholder="结束日期"
  60. @change="change"
  61. ></el-date-picker>
  62. </el-form-item>
  63. <el-form-item>
  64. <el-button
  65. type="primary"
  66. icon="el-icon-search"
  67. size="mini"
  68. @click="handleQuery"
  69. >搜索</el-button
  70. >
  71. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  72. >重置</el-button
  73. >
  74. </el-form-item>
  75. </el-form>
  76. <el-row :gutter="10" class="mb8">
  77. <el-col :span="1.5">
  78. <el-button
  79. type="warning"
  80. plain
  81. icon="el-icon-download"
  82. size="mini"
  83. :loading="exportLoading"
  84. @click="handleExport"
  85. v-hasPermi="['course:courseRedPacketLog:export']"
  86. >导出</el-button
  87. >
  88. </el-col>
  89. <right-toolbar
  90. :showSearch.sync="showSearch"
  91. @queryTable="getList"
  92. ></right-toolbar>
  93. </el-row>
  94. <el-table
  95. border
  96. v-loading="loading"
  97. :data="courseWatchLogList"
  98. @selection-change="handleSelectionChange"
  99. show-summary
  100. :summary-method="getSummaries"
  101. ref="table1"
  102. >
  103. <el-table-column type="selection" width="55" align="center" />
  104. <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
  105. <!-- 发课时间 -->
  106. <el-table-column label="进线时间" align="center" prop="createTime" />
  107. <!-- 进线数 -->
  108. <el-table-column label="进线数" align="center" prop="line" />
  109. <!-- 先导课上线 -->
  110. <el-table-column label="先导课上线" align="center" prop="firstOnline">
  111. <template slot-scope="scope">
  112. <span>{{ scope.row.firstOnline }}</span>
  113. <span
  114. :style="{
  115. 'font-size': '12px',
  116. 'margin-left': '5px',
  117. color: getPercentageColor(
  118. (scope.row.firstOnline / scope.row.line) * 100
  119. ),
  120. }"
  121. >
  122. ({{ ((scope.row.firstOnline / scope.row.line) * 100).toFixed(2) }}%)
  123. </span>
  124. </template>
  125. </el-table-column>
  126. <!-- 先导课完课 -->
  127. <el-table-column label="先导课完课" align="center" prop="firstOver">
  128. <template slot-scope="scope">
  129. <span>{{ scope.row.firstOver }}</span>
  130. <span
  131. :style="{
  132. 'font-size': '12px',
  133. 'margin-left': '5px',
  134. color: getPercentageColor(
  135. (scope.row.firstOver / scope.row.line) * 100
  136. ),
  137. }"
  138. >
  139. ({{ ((scope.row.firstOver / scope.row.line) * 100).toFixed(2) }}%)
  140. </span>
  141. </template>
  142. </el-table-column>
  143. <!-- 首日上线 -->
  144. <el-table-column label="首日上线" align="center" prop="d1Online">
  145. <template slot-scope="scope">
  146. <span>{{ scope.row.d1Online }}</span>
  147. <span
  148. :style="{
  149. 'font-size': '12px',
  150. 'margin-left': '5px',
  151. color: getPercentageColor(
  152. (scope.row.d1Online / scope.row.line) * 100
  153. ),
  154. }"
  155. >
  156. ({{ ((scope.row.d1Online / scope.row.line) * 100).toFixed(2) }}%)
  157. </span>
  158. </template>
  159. </el-table-column>
  160. <!-- 首日完课 -->
  161. <el-table-column label="首日完课" align="center" prop="d1Over">
  162. <template slot-scope="scope">
  163. <span>{{ scope.row.d1Over }}</span>
  164. <span
  165. :style="{
  166. 'font-size': '12px',
  167. 'margin-left': '5px',
  168. color: getPercentageColor(
  169. (scope.row.d1Over / scope.row.line) * 100
  170. ),
  171. }"
  172. >
  173. ({{ ((scope.row.d1Over / scope.row.line) * 100).toFixed(2) }}%)
  174. </span>
  175. </template>
  176. </el-table-column>
  177. <!-- 综合报名数 -->
  178. <el-table-column label="综合报名数" align="center" prop="sign">
  179. <template slot-scope="scope">
  180. <span>{{ scope.row.sign }}</span>
  181. <span
  182. :style="{
  183. 'font-size': '12px',
  184. 'margin-left': '5px',
  185. color: getPercentageColor(
  186. (scope.row.sign / scope.row.line) * 100
  187. ),
  188. }"
  189. >
  190. ({{ ((scope.row.sign / scope.row.line) * 100).toFixed(2) }}%)
  191. </span>
  192. </template>
  193. </el-table-column>
  194. <!-- 互动数 -->
  195. <el-table-column label="互动数" align="center" prop="interact">
  196. <template slot-scope="scope">
  197. <span>{{ scope.row.interact }}</span>
  198. <span
  199. :style="{
  200. 'font-size': '12px',
  201. 'margin-left': '5px',
  202. color: getPercentageColor(
  203. (scope.row.interact / scope.row.line) * 100
  204. ),
  205. }"
  206. >
  207. ({{ ((scope.row.interact / scope.row.line) * 100).toFixed(2) }}%)
  208. </span>
  209. </template>
  210. </el-table-column>
  211. <!-- A级客户 -->
  212. <el-table-column label="A级客户" align="center" prop="a">
  213. <template slot-scope="scope">
  214. <span>{{ scope.row.a }}</span>
  215. <span
  216. :style="{
  217. 'font-size': '12px',
  218. 'margin-left': '5px',
  219. color: getPercentageColor((scope.row.a / scope.row.line) * 100),
  220. }"
  221. >
  222. ({{ ((scope.row.a / scope.row.line) * 100).toFixed(2) }}%)
  223. </span>
  224. </template>
  225. </el-table-column>
  226. <!-- B级客户 -->
  227. <el-table-column label="B级客户" align="center" prop="b">
  228. <template slot-scope="scope">
  229. <span>{{ scope.row.b }}</span>
  230. <span
  231. :style="{
  232. 'font-size': '12px',
  233. 'margin-left': '5px',
  234. color: getPercentageColor((scope.row.b / scope.row.line) * 100),
  235. }"
  236. >
  237. ({{ ((scope.row.b / scope.row.line) * 100).toFixed(2) }}%)
  238. </span>
  239. </template>
  240. </el-table-column>
  241. <!-- C级客户 -->
  242. <el-table-column label="C级客户" align="center" prop="c">
  243. <template slot-scope="scope">
  244. <span>{{ scope.row.c }}</span>
  245. <span
  246. :style="{
  247. 'font-size': '12px',
  248. 'margin-left': '5px',
  249. color: getPercentageColor((scope.row.c / scope.row.line) * 100),
  250. }"
  251. >
  252. ({{ ((scope.row.c / scope.row.line) * 100).toFixed(2) }}%)
  253. </span>
  254. </template>
  255. </el-table-column>
  256. <!-- D级客户 -->
  257. <el-table-column label="D级客户" align="center" prop="d">
  258. <template slot-scope="scope">
  259. <span>{{ scope.row.d }}</span>
  260. <span
  261. :style="{
  262. 'font-size': '12px',
  263. 'margin-left': '5px',
  264. color: getPercentageColor((scope.row.d / scope.row.line) * 100),
  265. }"
  266. >
  267. ({{ ((scope.row.d / scope.row.line) * 100).toFixed(2) }}%)
  268. </span>
  269. </template>
  270. </el-table-column>
  271. <!-- E级客户 -->
  272. <el-table-column label="E级客户" align="center" prop="e">
  273. <template slot-scope="scope">
  274. <span>{{ scope.row.e }}</span>
  275. <span
  276. :style="{
  277. 'font-size': '12px',
  278. 'margin-left': '5px',
  279. color: getPercentageColor((scope.row.e / scope.row.line) * 100),
  280. }"
  281. >
  282. ({{ ((scope.row.e / scope.row.line) * 100).toFixed(2) }}%)
  283. </span>
  284. </template>
  285. </el-table-column>
  286. <!-- 流失数 -->
  287. <el-table-column label="拉黑数" align="center" prop="black">
  288. <template slot-scope="scope">
  289. <span>{{ scope.row.black }}</span>
  290. <span
  291. :style="{
  292. 'font-size': '12px',
  293. 'margin-left': '5px',
  294. color: getPercentageColor((scope.row.black / scope.row.line) * 100),
  295. }"
  296. >
  297. ({{ ((scope.row.black / scope.row.line) * 100).toFixed(2) }}%)
  298. </span>
  299. </template>
  300. </el-table-column>
  301. <!-- 流失数 -->
  302. <!--<el-table-column label="流失数" align="center" prop="los">
  303. <template slot-scope="scope">
  304. <span>{{ scope.row.los }}</span>
  305. <span
  306. :style="{
  307. 'font-size': '12px',
  308. 'margin-left': '5px',
  309. color: getPercentageColor((scope.row.los / scope.row.line) * 100),
  310. }"
  311. >
  312. ({{ ((scope.row.los / scope.row.line) * 100).toFixed(2) }}%)
  313. </span>
  314. </template>
  315. </el-table-column>-->
  316. <!-- 删除数 -->
  317. <el-table-column label="删除数" align="center" prop="del">
  318. <template slot-scope="scope">
  319. <span>{{ scope.row.del }}</span>
  320. <span
  321. :style="{
  322. 'font-size': '12px',
  323. 'margin-left': '5px',
  324. color: getPercentageColor((scope.row.del / scope.row.line) * 100),
  325. }"
  326. >
  327. ({{ ((scope.row.del / scope.row.line) * 100).toFixed(2) }}%)
  328. </span>
  329. </template>
  330. </el-table-column>
  331. </el-table>
  332. <pagination-more
  333. v-show="total > 0"
  334. :total="total"
  335. :page.sync="queryParams.pageNum"
  336. :limit.sync="queryParams.pageSize"
  337. @pagination="getList"
  338. />
  339. </div>
  340. </template>
  341. <script>
  342. import {
  343. listCourseWatchLog,
  344. getCourseWatchLog,
  345. delCourseWatchLog,
  346. addCourseWatchLog,
  347. updateCourseWatchLog,
  348. exportCourseWatchLog,
  349. statisticsList,
  350. qwWatchLogStatisticsList,
  351. exportWatchLogStatistics
  352. } from "@/api/course/qw/courseWatchLog";
  353. import { courseList, videoList } from "@/api/course/courseRedPacketLog";
  354. import { treeselect } from "@/api/company/companyDept";
  355. import Treeselect from "@riophae/vue-treeselect";
  356. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  357. import { getCompanyUserListLikeName } from "@/api/company/companyUser";
  358. import { getTask } from "@/api/common";
  359. export default {
  360. name: "CourseWatchLog",
  361. components: { Treeselect },
  362. data() {
  363. return {
  364. activeName: "00",
  365. createTime: null,
  366. courseLists: [],
  367. companyUserOptionsParams: {
  368. name: undefined,
  369. hasNextPage: false,
  370. pageNum: 1,
  371. pageSize: 10,
  372. },
  373. companyUserOptionsLoading: false,
  374. companyUserOptions: [],
  375. deptOptions: [],
  376. videoList: [],
  377. logTypeOptions: [],
  378. // 遮罩层
  379. loading: true,
  380. // 导出遮罩层
  381. exportLoading: false,
  382. // 选中数组
  383. ids: [],
  384. // 非单个禁用
  385. single: true,
  386. // 非多个禁用
  387. multiple: true,
  388. // 显示搜索条件
  389. showSearch: true,
  390. // 总条数
  391. total: 0,
  392. // 短链课程看课记录表格数据
  393. courseWatchLogList: [],
  394. // 弹出层标题
  395. title: "",
  396. // 是否显示弹出层
  397. open: false,
  398. // 查询参数
  399. queryParams: {
  400. pageNum: 1,
  401. pageSize: 10,
  402. userId: null,
  403. nickName: null,
  404. videoId: null,
  405. logType: null,
  406. qwExternalContactId: null,
  407. duration: null,
  408. qwUserId: null,
  409. companyUserId: null,
  410. companyId: null,
  411. courseId: null,
  412. sTime: null,
  413. eTime: null,
  414. scheduleStartTime: null,
  415. scheduleEndTime: null,
  416. },
  417. // 表单参数
  418. form: {},
  419. // 表单校验
  420. rules: {},
  421. scheduleTime: null,
  422. };
  423. },
  424. created() {
  425. courseList().then((response) => {
  426. this.courseLists = response.list;
  427. });
  428. this.getDicts("sys_course_watch_log_type").then((response) => {
  429. this.logTypeOptions = response.data;
  430. });
  431. this.getTreeselect();
  432. this.getList();
  433. },
  434. methods: {
  435. getSummaries(param) {
  436. const { columns, data } = param;
  437. const sums = [];
  438. columns.forEach((column, index) => {
  439. if (index === 0) {
  440. sums[index] = "总计";
  441. return;
  442. }
  443. const values = data.map((item) => Number(item[column.property]));
  444. if (!values.every((value) => isNaN(value))) {
  445. sums[index] = values.reduce((prev, curr) => {
  446. const value = Number(curr);
  447. if (!isNaN(value)) {
  448. return prev + curr;
  449. } else {
  450. return prev;
  451. }
  452. }, 0);
  453. if (
  454. column.property === "firstOnline" ||
  455. column.property === "firstOver" ||
  456. column.property === "d1Online" ||
  457. column.property === "d1Over" ||
  458. column.property === "sign" ||
  459. column.property === "interact" ||
  460. column.property === "a" ||
  461. column.property === "b" ||
  462. column.property === "c" ||
  463. column.property === "d" ||
  464. column.property === "e" ||
  465. column.property === "black" ||
  466. column.property === "los" ||
  467. column.property === "del"
  468. ) {
  469. }
  470. } else {
  471. sums[index] = "";
  472. }
  473. });
  474. return sums;
  475. },
  476. getPercentageColor(percentage) {
  477. // HSL模式从黄色(60度)渐变到红色(0度)
  478. const percent = Math.min(100, Math.max(0, parseFloat(percentage)));
  479. // 调整色相范围:从深黄色(40°)渐变到红色(0°)
  480. const hue = 40 - 40 * (percent / 100); // 初始 hue=40(深黄),终点 hue=0(红)
  481. // 提高饱和度(100%),亮度保持 50%(鲜艳但不刺眼)
  482. return `hsl(${hue}, 100%, 50%)`;
  483. },
  484. courseChange(row) {
  485. this.queryParams.videoId = null;
  486. if (row === "") {
  487. this.videoList = [];
  488. return;
  489. }
  490. videoList(row).then((response) => {
  491. this.videoList = response.list;
  492. });
  493. },
  494. getTreeselect() {
  495. var that = this;
  496. var param = { companyId: this.companyId };
  497. treeselect(param).then((response) => {
  498. this.deptOptions = response.data;
  499. console.log(this.deptOptions);
  500. if (response.data != null && response.data.length > 0) {
  501. //this.queryParams.deptId=response.data[0].id;
  502. }
  503. });
  504. },
  505. loadCompanyUserOptions(query) {
  506. this.companyUserOptions = [];
  507. if (query === "") {
  508. return;
  509. }
  510. this.companyUserOptionsParams.pageNum = 1;
  511. this.companyUserOptionsParams.name = query;
  512. this.companyUserOptionsLoading = true;
  513. this.getCompanyUserListLikeName();
  514. },
  515. getCompanyUserListLikeName() {
  516. getCompanyUserListLikeName(this.companyUserOptionsParams).then(
  517. (response) => {
  518. this.companyUserOptions = [
  519. ...this.companyUserOptions,
  520. ...response.data.list,
  521. ];
  522. this.companyUserOptionsParams.hasNextPage = response.data.hasNextPage;
  523. this.companyUserOptionsLoading = false;
  524. }
  525. );
  526. },
  527. loadMoreCompanyUserOptions() {
  528. if (!this.companyUserOptionsParams.hasNextPage) {
  529. return;
  530. }
  531. this.companyUserOptionsParams.pageNum += 1;
  532. this.getCompanyUserListLikeName();
  533. },
  534. change() {
  535. if (this.createTime != null) {
  536. this.queryParams.sTime = this.createTime[0];
  537. this.queryParams.eTime = this.createTime[1];
  538. } else {
  539. this.queryParams.sTime = null;
  540. this.queryParams.eTime = null;
  541. }
  542. },
  543. handleClickX(tab, event) {
  544. this.activeName = tab.name;
  545. if (tab.name == "00") {
  546. this.queryParams.logType = null;
  547. } else {
  548. this.queryParams.logType = tab.name;
  549. }
  550. this.getList();
  551. },
  552. /** 查询短链课程看课记录列表 */
  553. getList() {
  554. this.loading = true;
  555. qwWatchLogStatisticsList(this.queryParams).then((response) => {
  556. this.courseWatchLogList = response.rows;
  557. this.total = response.total;
  558. this.loading = false;
  559. });
  560. this.$nextTick(() => {
  561. setTimeout(() => {
  562. this.$refs.table1?.doLayout();
  563. }, 2000);
  564. });
  565. },
  566. // 取消按钮
  567. cancel() {
  568. this.open = false;
  569. this.reset();
  570. },
  571. // 表单重置
  572. reset() {
  573. this.form = {
  574. logId: null,
  575. userId: null,
  576. videoId: null,
  577. logType: null,
  578. createTime: null,
  579. updateTime: null,
  580. qwExternalContactId: null,
  581. duration: null,
  582. qwUserId: null,
  583. companyUserId: null,
  584. companyId: null,
  585. courseId: null,
  586. };
  587. this.resetForm("form");
  588. },
  589. /** 搜索按钮操作 */
  590. handleQuery() {
  591. if (!this.queryParams.sTime || !this.queryParams.eTime) {
  592. this.$message.warning("请选择添加时间");
  593. return;
  594. }
  595. this.queryParams.pageNum = 1;
  596. this.getList();
  597. },
  598. /** 重置按钮操作 */
  599. resetQuery() {
  600. this.resetForm("queryForm");
  601. this.createTime = null;
  602. this.scheduleTime = null;
  603. this.queryParams.sTime = null;
  604. this.queryParams.eTime = null;
  605. this.queryParams.scheduleStartTime = null;
  606. this.queryParams.scheduleEndTime = null;
  607. this.handleQuery();
  608. },
  609. // 多选框选中数据
  610. handleSelectionChange(selection) {
  611. this.ids = selection.map((item) => item.logId);
  612. this.single = selection.length !== 1;
  613. this.multiple = !selection.length;
  614. },
  615. /** 新增按钮操作 */
  616. handleAdd() {
  617. this.reset();
  618. this.open = true;
  619. this.title = "添加短链课程看课记录";
  620. },
  621. /** 修改按钮操作 */
  622. handleUpdate(row) {
  623. this.reset();
  624. const logId = row.logId || this.ids;
  625. getCourseWatchLog(logId).then((response) => {
  626. this.form = response.data;
  627. this.open = true;
  628. this.title = "修改短链课程看课记录";
  629. });
  630. },
  631. /** 提交按钮 */
  632. submitForm() {
  633. this.$refs["form"].validate((valid) => {
  634. if (valid) {
  635. if (this.form.logId != null) {
  636. updateCourseWatchLog(this.form).then((response) => {
  637. this.msgSuccess("修改成功");
  638. this.open = false;
  639. this.getList();
  640. });
  641. } else {
  642. addCourseWatchLog(this.form).then((response) => {
  643. this.msgSuccess("新增成功");
  644. this.open = false;
  645. this.getList();
  646. });
  647. }
  648. }
  649. });
  650. },
  651. /** 删除按钮操作 */
  652. handleDelete(row) {
  653. const logIds = row.logId || this.ids;
  654. this.$confirm(
  655. '是否确认删除短链课程看课记录编号为"' + logIds + '"的数据项?',
  656. "警告",
  657. {
  658. confirmButtonText: "确定",
  659. cancelButtonText: "取消",
  660. type: "warning",
  661. }
  662. )
  663. .then(function () {
  664. return delCourseWatchLog(logIds);
  665. })
  666. .then(() => {
  667. this.getList();
  668. this.msgSuccess("删除成功");
  669. })
  670. .catch(() => {});
  671. },
  672. /** 导出按钮操作 */
  673. handleExport() {
  674. let that = this;
  675. const queryParams = this.queryParams;
  676. this.$confirm("是否确认导出所有进线客户统计记录数据项?", "警告", {
  677. confirmButtonText: "确定",
  678. cancelButtonText: "取消",
  679. type: "warning",
  680. })
  681. .then(() => {
  682. this.exportLoading = true;
  683. // return exportCourseWatchLog(queryParams);
  684. return exportWatchLogStatistics(queryParams);
  685. })
  686. .then((response) => {
  687. console.log(response);
  688. if (response.code == 200) {
  689. that.msgSuccess(response.msg);
  690. that.taskId = response.data;
  691. that.time = setInterval(function () {
  692. //查订单
  693. getTask(that.taskId).then((res) => {
  694. if (res.data.status == 1) {
  695. that.exportLoading = false;
  696. clearTimeout(that.time);
  697. that.time = null;
  698. that.download(res.data.fileUrl);
  699. }
  700. });
  701. }, 10000);
  702. }
  703. })
  704. .catch(() => {
  705. this.exportLoading = false;
  706. });
  707. },
  708. handleScheduleTimeChange(val) {
  709. if (val) {
  710. this.queryParams.scheduleStartTime = val[0];
  711. this.queryParams.scheduleEndTime = val[1];
  712. } else {
  713. this.queryParams.scheduleStartTime = null;
  714. this.queryParams.scheduleEndTime = null;
  715. }
  716. },
  717. },
  718. };
  719. </script>