show.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  6. <title>AI派单中心</title>
  7. <link rel="stylesheet" href="/static/elementui2.15.5/index.css"/>
  8. <script src="/static/hplus/js/jquery.min.js?v=2.1.4"></script>
  9. <script src="/static/layer3.2.0/layer.js"></script>
  10. <script src="/static/elementui2.15.5/vue-2.6.14.js"></script>
  11. <script src="/static/elementui2.15.5/index.js"></script>
  12. <script src="/static/echarts.js"></script>
  13. <style>
  14. *{
  15. margin:0;
  16. padding:0;
  17. box-sizing:border-box;
  18. }
  19. html,body{
  20. width:100%;
  21. height:100%;
  22. background:#f3f3f4;
  23. font-family:"PingFang SC","Microsoft YaHei",sans-serif;
  24. color:#303133;
  25. }
  26. #app{
  27. padding:10px;
  28. width:98%;
  29. height:100%;
  30. margin-left: -10px;
  31. }
  32. .main-card{
  33. border-radius:14px !important;
  34. border:none !important;
  35. overflow:hidden;
  36. box-shadow:0 2px 12px rgba(0,0,0,.04);
  37. }
  38. .main-card .el-card__body{
  39. padding:12px;
  40. }
  41. .top-area{
  42. margin-bottom:10px;
  43. }
  44. .stat-wrap{
  45. display:flex;
  46. flex-direction:column;
  47. gap:8px;
  48. height:100%;
  49. }
  50. .big-card{
  51. height:70px;
  52. border-radius:6px !important;
  53. position:relative;
  54. overflow:hidden;
  55. background-repeat: no-repeat;
  56. background-size: cover;
  57. background-position: center;
  58. display:flex;
  59. align-items:center;
  60. justify-content:space-between;
  61. padding:0 18px;
  62. cursor: pointer;
  63. }
  64. .big-card.orange{
  65. background:linear-gradient(135deg,#fff,#fff0eb);
  66. }
  67. .big-card::after{
  68. content:"";
  69. position:absolute;
  70. right:-25px;
  71. top:-25px;
  72. width:90px;
  73. height:90px;
  74. border-radius:50%;
  75. background:rgba(137,67,221,.06);
  76. }
  77. .big-left{
  78. display:flex;
  79. align-items:center;
  80. gap:12px;
  81. z-index:2;
  82. }
  83. .big-card.orange .big-icon{
  84. background:linear-gradient(135deg,#ffb347,#ff7d4d);
  85. }
  86. .big-title{
  87. font-size:16px;
  88. font-weight: bold;
  89. color: #FFFFFF;
  90. }
  91. .big-value{
  92. font-size:24px;
  93. font-weight:600;
  94. color:#FFFFFF;
  95. z-index:2;
  96. }
  97. .small-grid{
  98. flex:1;
  99. }
  100. .stat-card {
  101. flex:1 1 100px;
  102. padding:12px;
  103. border-radius: 6px;
  104. color:#333333FF;
  105. background-repeat: no-repeat;
  106. background-size: cover;
  107. background-position: center;
  108. width: 100%;
  109. height:100px;
  110. margin-top: 7px;
  111. cursor: pointer;
  112. }
  113. .stat-card h3 { margin-top:5px;font-size:16px;color: #333333FF}
  114. .stat-card p { margin:5px 0 0;font-size:22px; font-weight: bold}
  115. .small{
  116. height:142px;
  117. }
  118. .icon{
  119. margin-top: 7px;
  120. }
  121. .arrow{
  122. margin-left: 7px;
  123. }
  124. .center-banner{
  125. width: 100%;
  126. /*height: 280px;*/
  127. background: #fff;
  128. border-radius: 8px;
  129. display: flex;
  130. justify-content: center;
  131. align-items: center;
  132. margin-top: 10px;
  133. }
  134. .center-banner video {
  135. width: 100%;
  136. height: 100%;
  137. display: block;
  138. }
  139. .chart-card{
  140. margin-top:10px;
  141. border:none !important;
  142. height:140px;
  143. }
  144. .chart-card .el-card__body{
  145. height:100%;
  146. padding:10px;
  147. display:flex;
  148. flex-direction:column;
  149. }
  150. #chart{
  151. flex:1;
  152. width:110%;
  153. min-height:160px;
  154. margin-left: -55px;
  155. }
  156. .chart-title{
  157. font-size:16px;
  158. font-weight:700;
  159. color:#444;
  160. margin-bottom:8px;
  161. }
  162. .table-card{
  163. border:none !important;
  164. border-radius:0 !important;
  165. overflow:hidden;
  166. background-color: #F7FAFFFF;
  167. }
  168. .table-card .el-card__body{
  169. padding:0;
  170. }
  171. .table-header{
  172. height:46px;
  173. display:flex;
  174. align-items:center;
  175. justify-content:center;
  176. font-size:16px;
  177. font-weight:600;
  178. color:#444;
  179. background-color: #F7FAFFFF;
  180. }
  181. .el-table{
  182. background-color: #F7FAFFFF;
  183. }
  184. .el-table th, .el-table td { text-align:center;color: #333333FF;background-color: #F7FAFFFF; }
  185. .status-dispatch { color:#7000FBFF; font-weight:600; } /* 紫色 */
  186. .status-pending { color:#fa8c16; font-weight:600; } /* 橙色 */
  187. .status-inprogress { color:#7000FBFF; font-weight:600; } /* 蓝色 */
  188. .status-fail { color: #da0727; font-weight:600; } /* 蓝色 */
  189. .page{
  190. margin: 15px 0;
  191. text-align: center;
  192. }
  193. @media(max-width:1200px){
  194. .big-value{
  195. font-size:28px;
  196. }
  197. .stat-card p{
  198. font-size:28px;
  199. }
  200. .center-banner{
  201. margin-top:10px;
  202. }
  203. }
  204. </style>
  205. </head>
  206. <body>
  207. <div id="app">
  208. <el-card class="main-card">
  209. <!-- 顶部 -->
  210. <el-row :gutter="10" class="top-area">
  211. <!-- 左侧整体 -->
  212. <el-col :lg="18" :md="24">
  213. <!-- 上部分 -->
  214. <el-row :gutter="10">
  215. <!-- 左侧统计 -->
  216. <el-col :span="8">
  217. <div class="stat-wrap">
  218. <div class="big-card" style='background-image: url("/static/ai/img/done.png")' @click="handleModeChange(0)">
  219. <div class="big-left">
  220. <div class="big-title">AI派单总数</div>
  221. </div>
  222. <div class="big-value">{{done.total}}</div>
  223. </div>
  224. <div class="small-grid">
  225. <el-row :gutter="8" style="height:100%;">
  226. <el-col :span="12" style="margin-bottom:8px;">
  227. <div class="stat-card" style='background-image: url("/static/ai/img/bj.png")' @click="handleModeChange(2)">
  228. <h3>保洁派单数</h3><p style="color: #0983E2FF">{{done.bj}}</p>
  229. </div>
  230. </el-col>
  231. <el-col :span="12" style="margin-bottom:8px;">
  232. <div class="stat-card" style='background-image: url("/static/ai/img/bx.png")' @click="handleModeChange(1)">
  233. <h3>维修派单数</h3><p style="color: #00905DFF">{{done.bx}}</p>
  234. </div>
  235. </el-col>
  236. <el-col :span="12">
  237. <div class="stat-card" style='background-image: url("/static/ai/img/ys.png")' @click="handleModeChange(3)">
  238. <h3>运送工单数</h3><p style="color: #E68417FF">{{done.ys}}</p>
  239. </div>
  240. </el-col>
  241. <el-col :span="12">
  242. <div class="stat-card" style='background-image: url("/static/ai/img/ab.png")' @click="handleModeChange(4)">
  243. <h3>安保待派单数</h3><p style="color: #8943DDFF">{{done.ab}}</p>
  244. </div>
  245. </el-col>
  246. </el-row>
  247. </div>
  248. </div>
  249. </el-col>
  250. <!-- 中间banner -->
  251. <el-col :span="16">
  252. <div class="center-banner">
  253. <video
  254. class="video"
  255. src="/static/ai/img/ai.mp4"
  256. autoplay
  257. loop
  258. muted
  259. playsinline
  260. webkit-playsinline
  261. x5-playsinline
  262. disablePictureInPicture>
  263. 您的浏览器不支持视频播放
  264. </video>
  265. </div>
  266. </el-col>
  267. </el-row>
  268. <!-- 趋势图 -->
  269. <el-card class="chart-card" v-loading="loading3" shadow="never">
  270. <!-- <div class="chart-title">-->
  271. <!-- 派单趋势分析-->
  272. <!-- </div>-->
  273. <div id="chart"></div>
  274. </el-card>
  275. </el-col>
  276. <!-- 右侧 -->
  277. <el-col :lg="6" :md="24">
  278. <div class="stat-wrap">
  279. <div class="big-card" style='background-image: url("/static/ai/img/undo.png")' @click="handleModeChange2(0)">
  280. <div class="big-left">
  281. <div class="big-title">待派单总数</div>
  282. </div>
  283. <div class="big-value">{{undo.total}}</div>
  284. </div>
  285. <div class="small-grid">
  286. <el-row :gutter="8" style="height:100%;">
  287. <el-col :span="12" style="margin-bottom:8px;">
  288. <div class="stat-card" style='background-image: url("/static/ai/img/bj.png")' @click="handleModeChange2(2)">
  289. <h3>保洁待派单数</h3><p style="color: #0983E2FF">{{undo.bj}}</p>
  290. </div>
  291. </el-col>
  292. <el-col :span="12" style="margin-bottom:8px;">
  293. <div class="stat-card" style='background-image: url("/static/ai/img/bx.png")' @click="handleModeChange2(1)">
  294. <h3>维修待派单数</h3><p style="color: #00905DFF">{{undo.bx}}</p>
  295. </div>
  296. </el-col>
  297. <el-col :span="12">
  298. <div class="stat-card" style='background-image: url("/static/ai/img/ys.png")' @click="handleModeChange2(3)">
  299. <h3>运送待派单数</h3><p style="color: #E68417FF">{{undo.ys}}</p>
  300. </div>
  301. </el-col>
  302. <el-col :span="12">
  303. <div class="stat-card" style='background-image: url("/static/ai/img/ab.png")' @click="handleModeChange2(4)">
  304. <h3>安保待派单数</h3><p style="color: #8943DDFF">{{undo.ab}}</p>
  305. </div>
  306. </el-col>
  307. <el-col :span="12">
  308. <div class="stat-card small" style='background-image: url("/static/ai/img/yc.png")' @click="abnormal(1)">
  309. <div class="icon">
  310. <img src="/static/ai/img/icon-yc.png">
  311. </div>
  312. <h3>异常单数</h3><p style="color: #F53F3FFF">{{undo.yc}}<img class="arrow" src="/static/ai/img/arrow-yc.png"></p>
  313. </div>
  314. </el-col>
  315. <el-col :span="12">
  316. <div class="stat-card small" style='background-image: url("/static/ai/img/bh.png")' @click="abnormal(2)">
  317. <div class="icon">
  318. <img src="/static/ai/img/icon-bh.png">
  319. </div>
  320. <h3>被驳回单数</h3><p style="color: #6D76A2FF">{{undo.bh}}<img class="arrow" src="/static/ai/img/arrow-bh.png"></p>
  321. </div>
  322. </el-col>
  323. </el-row>
  324. </div>
  325. </div>
  326. </el-col>
  327. </el-row>
  328. <!-- 底部表格 -->
  329. <el-row :gutter="12" style="margin-top:10px;">
  330. <el-col :span="12">
  331. <el-card class="table-card" shadow="never">
  332. <div class="table-header">
  333. <img src="/static/ai/img/triangle-right.png" style="width: 10px;height: 10px;margin-right: 10px">
  334. 今日已派单看板
  335. <img src="/static/ai/img/triangle-left.png" style="width: 10px;height: 10px;margin-left: 10px">
  336. </div>
  337. <el-table v-loading="loading"
  338. ref="dispatchedTable"
  339. :data="dispatchedList"
  340. style="width:100%;">
  341. <el-table-column prop="sn" label="订单编号">
  342. <template slot-scope="scope">
  343. <a href="javascript:;"
  344. data-title="详情"
  345. @click="layerOpen(scope.row.id)"
  346. data-title="详情"
  347. style="color:#0056DBFF;text-decoration: none">
  348. {{ scope.row.sn }}
  349. </a>
  350. </template>
  351. </el-table-column>
  352. <el-table-column prop="type" label="类型"></el-table-column>
  353. <el-table-column prop="status" label="状态">
  354. <template slot-scope="scope">
  355. <span class="status-dispatch">已派单</span>
  356. </template>
  357. </el-table-column>
  358. <el-table-column prop="user" label="发起人"></el-table-column>
  359. <el-table-column prop="create_time" label="派单时间"></el-table-column>
  360. <el-table-column prop="toUser" label="指派员工"></el-table-column>
  361. <el-table-column label="操作">
  362. <template slot-scope="scope">
  363. <a href="javascript:;"
  364. data-title="重新派单"
  365. @click="send(scope.row.todo_id,scope.row.mode,0)"
  366. style="color:#0056DBFF;text-decoration: none">
  367. 重新派单
  368. </a>
  369. </template>
  370. </el-table-column>
  371. </el-table>
  372. <!-- 分页 -->
  373. <div class="page">
  374. <el-pagination
  375. background
  376. layout="prev, pager, next, sizes, total"
  377. :total="total"
  378. :page-size="pageSize"
  379. :current-page.sync="currentPage"
  380. @size-change="handleSizeChange"
  381. @current-change="handlePageChange">
  382. </el-pagination>
  383. </div>
  384. </el-card>
  385. </el-col>
  386. <el-col :span="12">
  387. <el-card class="table-card">
  388. <div class="table-header">
  389. <img src="/static/ai/img/triangle-right.png" style="width: 10px;height: 10px;margin-right: 10px">
  390. 今日待派单看板
  391. <img src="/static/ai/img/triangle-left.png" style="width: 10px;height: 10px;margin-left: 10px">
  392. </div>
  393. <el-table v-loading="loading2" ref="pendingTable" :data="pendingList" style="width:100%;">
  394. <el-table-column prop="sn" label="订单编号">
  395. <template slot-scope="scope">
  396. <a href="javascript:;"
  397. @click="layerOpen(scope.row.id)"
  398. style="color:#0056DBFF;text-decoration: none">
  399. {{ scope.row.sn }}
  400. </a>
  401. </template>
  402. </el-table-column>
  403. <el-table-column prop="type" label="类型"></el-table-column>
  404. <el-table-column prop="user" label="发起人"></el-table-column>
  405. <el-table-column prop="status" label="状态">
  406. <template slot-scope="scope">
  407. <div v-if="fail == 0">
  408. <img v-if="scope.row.flag" src="/static/ai/img/wait.png" class="loading-ico">
  409. <span :class="scope.row.flag ? 'status-inprogress':'status-pending'">{{ scope.row.flag && ai == 1 ? 'Ai派单中...':'待派单' }}</span>
  410. </div>
  411. <div v-else>
  412. <span class="status-fail">派单未匹配</span>
  413. </div>
  414. </template>
  415. </el-table-column>
  416. <el-table-column v-if="fail" prop="fail" label="操作">
  417. <template slot-scope="scope">
  418. <a href="javascript:;"
  419. data-title="手动派单"
  420. @click="send(scope.row.id,scope.row.work_type_mode,1)"
  421. style="color:#0056DBFF;text-decoration: none">
  422. 手动派单
  423. </a>
  424. </template>
  425. </el-table-column>
  426. </el-table>
  427. <!-- 分页 -->
  428. <div class="page">
  429. <el-pagination
  430. background
  431. layout="prev, pager, next, sizes, total"
  432. :total="total2"
  433. :page-size="pageSize2"
  434. :current-page.sync="currentPage2"
  435. @size-change="handleSizeChange2"
  436. @current-change="handlePageChange2">
  437. </el-pagination>
  438. </div>
  439. </el-card>
  440. </el-col>
  441. </el-row>
  442. </el-card>
  443. </div>
  444. <script>
  445. new Vue({
  446. el:'#app',
  447. data: function() {
  448. return {
  449. ai:{$ai},
  450. aiList:[0,0,0,0,0,0,0],
  451. userList:[0,0,0,0,0,0,0],
  452. done: {'total':0,'bx':0, 'bj': 0, 'ys' : 0, 'ab' : 0,},
  453. undo: {'total':0,'bx':0, 'bj': 0, 'ys' : 0, 'ab' : 0,'yc':0,'bh':0},
  454. dateList:[],
  455. currentPage: 1,
  456. pageSize: 10,
  457. total: 0,
  458. mode: 0,
  459. dispatchedList:[],
  460. currentPage2: 1,
  461. pageSize2: 10,
  462. total2: 0,
  463. mode2: 0,
  464. pendingList:[],
  465. loading:true,
  466. loading2:true,
  467. loading3:true,
  468. fail:0,
  469. }
  470. },
  471. mounted(){
  472. this.getData();
  473. setInterval(() => {
  474. this.getData();
  475. }, 1000 * 60);
  476. },
  477. methods: {
  478. getData(){
  479. this.fetchEchart();
  480. this.fetchTodo();
  481. this.fetchOrder();
  482. },
  483. layerOpen(id){
  484. layer.open({
  485. type: 2,
  486. title: "详情",
  487. shadeClose: true,
  488. shade: 0.3,
  489. maxmin: true,
  490. area: ['80%', '80%'],
  491. content: "{:url('orders/detail2',[],'')}/id/"+id,
  492. end: function () {
  493. // window.location.reload();
  494. }
  495. });
  496. },
  497. send(id,mode,type){
  498. const self = this;
  499. layer.open({
  500. type: 2,
  501. title: "派单",
  502. shadeClose: true,
  503. shade: 0.3,
  504. maxmin: true,
  505. area: ['80%', '80%'],
  506. content: "{:url('send',[],'')}/id/"+id+"/mode/"+mode+"/type/"+type,
  507. end: function () {
  508. if (type === 0){
  509. self.fetchTodo();
  510. }else{
  511. self.fetchOrder();
  512. }
  513. }
  514. });
  515. },
  516. abnormal(type){
  517. const self = this;
  518. layer.open({
  519. type: 2,
  520. title: type === 1 ? "异常单列表" : '被驳回单列表',
  521. shadeClose: true,
  522. shade: 0.3,
  523. maxmin: true,
  524. area: ['80%', '80%'],
  525. content: "{:url('abnormal',[],'')}/type/"+type,
  526. end: function () {
  527. }
  528. });
  529. },
  530. fetchEchart() {
  531. const url = "{:url('show')}";
  532. $.ajax({
  533. url: url,
  534. type: 'POST',
  535. dataType: 'json',
  536. success: (res) => { // 使用箭头函数
  537. this.aiList = res.ai;
  538. console.log(this.aiList);
  539. this.userList = res.user;
  540. this.date = res.date;
  541. this.done = res.done;
  542. this.undo = res.undo;
  543. this.initEchart();
  544. },
  545. error: function(xhr, status, error) {
  546. console.error('请求失败:', error);
  547. }
  548. });
  549. },
  550. fetchTodo() {
  551. const url = "{:url('todoList')}";
  552. $.ajax({
  553. url: url,
  554. type: 'POST',
  555. dataType: 'json',
  556. data:{
  557. page:this.currentPage,
  558. size:this.pageSize,
  559. mode:this.mode
  560. },
  561. success: (res) => { // 使用箭头函数
  562. this.dispatchedList = res.data;
  563. this.total = res.total;
  564. this.loading = false;
  565. },
  566. error: function(xhr, status, error) {
  567. console.error('请求失败:', error);
  568. }
  569. });
  570. },
  571. handlePageChange(page) {
  572. this.currentPage = page;
  573. this.loading = true;
  574. this.fetchTodo();
  575. },
  576. handleSizeChange(val) {
  577. this.pageSize = val;
  578. this.loading = true;
  579. this.fetchTodo();
  580. },
  581. handleModeChange(val) {
  582. layer.open({
  583. type: 2,
  584. title: "历史派单",
  585. shadeClose: true,
  586. shade: 0.3,
  587. maxmin: true,
  588. area: ['90%', '90%'],
  589. content: "{:url('history',[],'')}/mode/"+val,
  590. end: function () {
  591. // window.location.reload();
  592. }
  593. });
  594. },
  595. fetchOrder() {
  596. const url = "{:url('orderList')}";
  597. $.ajax({
  598. url: url,
  599. type: 'POST',
  600. dataType: 'json',
  601. data:{
  602. page:this.currentPage2,
  603. size:this.pageSize2,
  604. mode:this.mode2,
  605. },
  606. success: (res) => { // 使用箭头函数
  607. this.pendingList = res.data;
  608. this.total2 = res.total;
  609. this.loading2 = false;
  610. this.fail = res.fail;
  611. },
  612. error: function(xhr, status, error) {
  613. console.error('请求失败:', error);
  614. }
  615. });
  616. },
  617. handlePageChange2(page) {
  618. this.currentPage2 = page;
  619. this.loading2 = true;
  620. this.fetchOrder();
  621. },
  622. handleSizeChange2(val) {
  623. this.pageSize2 = val;
  624. this.loading2 = true;
  625. this.fetchOrder();
  626. },
  627. handleModeChange2(val) {
  628. this.mode2 = val;
  629. this.loading2 = true;
  630. this.fetchOrder();
  631. },
  632. initEchart() {
  633. // 左侧折线图
  634. var chart = echarts.init(document.getElementById('chart'));
  635. window.addEventListener('resize', () => {
  636. chart.resize();
  637. });
  638. var option = {
  639. backgroundColor: '#F6FAFFFF',
  640. tooltip:{trigger:'axis'},
  641. legend:{data:['AI派单','人工派单']},
  642. xAxis:{type:'category', splitLine: {show: false}, data:this.date},
  643. yAxis: {
  644. type: 'value',
  645. splitLine: { show: false },
  646. name: '派单趋势分析',
  647. nameTextStyle: {
  648. fontSize: 15,
  649. color: '#333',
  650. }
  651. },
  652. series:[
  653. { name:'AI派单', type:'line',symbolSize: 10, data:this.aiList, smooth:false , itemStyle:{color:'#7000FBFF'}, areaStyle:{color: {
  654. type: 'linear',
  655. x: 0, y: 0,
  656. x2: 0, y2: 1, // 从左到右
  657. colorStops: [
  658. { offset: 0, color: '#eee0ffFF' },
  659. { offset: 1, color: '#7000fb03' }
  660. ]
  661. }}},
  662. { name:'人工派单', type:'line',symbolSize: 10, data:this.userList, smooth:false, itemStyle:{color:'#0062FBFF'},areaStyle: {
  663. color: {
  664. type: 'linear',
  665. x: 0, y: 0,
  666. x2: 0, y2: 1, // 从左到右
  667. colorStops: [
  668. { offset: 0, color: '#a9cbffFF' },
  669. { offset: 1, color: '#ffffff03' }
  670. ]
  671. }
  672. }}
  673. ]
  674. };
  675. chart.setOption(option);
  676. this.loading3 = false;
  677. }
  678. },
  679. });
  680. </script>
  681. </body>
  682. </html>