qjt.html 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta name=”SiteName” content=”重庆市南岸区人民政府”>
  7. <meta name="SiteDomain" content="http://www.cqna.gov.cn" />
  8. <meta name="SiteIDCode" content="5001080014">
  9. <meta name="ColumnName" content="政务全景通">
  10. <meta name="ColumnDescription" content="政务全景通" />
  11. <meta name="ColumnKeywords" content="政务全景通" />
  12. <meta name="ColumnType" content="政务全景通" />
  13. <title>政务全景通-重庆市南岸区人民政府网</title>
  14. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/three.js"></script>
  15. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/Detector.js"></script>
  16. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/libs/stats.min.js"></script>
  17. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/controls/OrbitControls.js"></script>
  18. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/loaders/GLTFLoader.js"></script>
  19. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/loaders/DRACOLoader.js"></script>
  20. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/renderers/CSS3DRenderer.js"></script>
  21. <script src="https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/renderers/CSS2DRenderer.js"></script>
  22. <!-- 引入 Vue -->
  23. <script src="https://www.cqna.gov.cn/syygapi/naxsb/js/vue.min.js"></script>
  24. <!-- 引入样式 -->
  25. <link rel="stylesheet" href="https://www.cqna.gov.cn/syygapi/naxsb/css/index.css">
  26. <link rel="stylesheet" href="css/qjt.css">
  27. <!-- 引入组件库 -->
  28. <script src="https://www.cqna.gov.cn/syygapi/naxsb/js/index.js"></script>
  29. <script src="js/echarts.min.js"></script>
  30. <script src="https://www.cqna.gov.cn/syygapi/naxsb/js/jquery-3.5.1.min.js"></script>
  31. <script src="https://www.cqna.gov.cn/syygapi/naxsb/js/urljson.js"></script>
  32. <style>
  33. @media screen and (max-width:1600px) {
  34. html,
  35. body {
  36. font-size: 14px;
  37. }
  38. .qjttitle {
  39. height: 95px;
  40. }
  41. .nowtime {
  42. top: 50px;
  43. }
  44. }
  45. @media screen and (max-width:1300px) {
  46. html,
  47. body {
  48. font-size: 10px;
  49. }
  50. .qjttitle {
  51. height: 85px;
  52. }
  53. .nowtime {
  54. top: 45px;
  55. }
  56. }
  57. .building-box {
  58. cursor: pointer;
  59. }
  60. @keyframes blink {
  61. from {
  62. opacity: 1;
  63. }
  64. to {
  65. opacity: 0;
  66. }
  67. }
  68. .finger {
  69. position: absolute;
  70. top: -60px;
  71. right: 20px;
  72. color: #FF8000;
  73. font-size: 20px;
  74. }
  75. .top_t {
  76. padding: 10px 0;
  77. border-bottom: 1px solid #5482F9;
  78. height: 26px;
  79. justify-content: space-between;
  80. }
  81. .top_t,
  82. .bottom-t {
  83. width: 100%;
  84. display: flex;
  85. font-size: 18px;
  86. color: #5482F9;
  87. }
  88. .bottom-t {
  89. flex-direction: column;
  90. overflow-y: scroll;
  91. }
  92. .bottom-t::-webkit-scrollbar {
  93. display: none;
  94. /* Chrome, Safari 和 Opera */
  95. -ms-overflow-style: none;
  96. /* IE 和 Edge */
  97. scrollbar-width: none;
  98. /* Firefox */
  99. }
  100. .bottom-t .item {
  101. width: 100%;
  102. display: flex;
  103. font-size: 16px;
  104. padding: 10px 0;
  105. justify-content: space-between;
  106. border-bottom: 1px solid #5482F9;
  107. }
  108. .t1 {
  109. width: 70px;
  110. text-align: center;
  111. }
  112. .t1 span {
  113. background: #1D96E9;
  114. border: 1px solid #1D96E9;
  115. padding: 0 5px;
  116. border-radius: 2px;
  117. color: #fff;
  118. }
  119. .t2 {
  120. width: 100px;
  121. text-align: center;
  122. overflow: hidden;
  123. word-break: break-all;
  124. white-space: nowrap;
  125. text-overflow: ellipsis;
  126. }
  127. .t3 {
  128. width: calc(100% - 230px);
  129. text-align: center;
  130. overflow: hidden;
  131. word-break: break-all;
  132. white-space: nowrap;
  133. text-overflow: ellipsis;
  134. }
  135. </style>
  136. </head>
  137. <body>
  138. <div style="width:100%;" class="header"></div>
  139. <div class="container" style="position: relative;">
  140. <div class="row">
  141. <div class="col-sm-12">
  142. <div class="model-container"
  143. style="background: linear-gradient(180deg, rgb(246, 250, 255) 10%, rgb(214, 224, 235) 70%);">
  144. <div class="model-view">
  145. <canvas id="canvas-model-view" style="width: 100%;height: 100%;">您的浏览器不支持canvas!</canvas>
  146. </div>
  147. <div id="qjt">
  148. <div class="qjttitle"></div>
  149. <div class="nowtime">{{currentTime }}</div>
  150. <div class="onefloor conList">
  151. <div class="floortitle">叫号数据</div>
  152. <div class="floorcontent">
  153. <div class="list blue">
  154. <div class="top radio">当前排队人数:</div>
  155. <div class="bottom">
  156. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/floor1.png" alt="">
  157. <div><span class="number" id="currWaitPeople2">-</span>
  158. <span>人</span>
  159. </div>
  160. </div>
  161. </div>
  162. <div class="list yellow">
  163. <div class="top radio">可办事项数量:</div>
  164. <div class="bottom">
  165. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/floor2.png" alt="">
  166. <div><span class="number" id="taskNum2">-</span>
  167. <span>项</span>
  168. </div>
  169. </div>
  170. </div>
  171. <div class="list green">
  172. <div class="top radio">平均等待时长:</div>
  173. <div class="bottom">
  174. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/floor3.png" alt="">
  175. <div><span class="number" id="waitTime2">-</span>
  176. <span>分钟</span>
  177. </div>
  178. </div>
  179. </div>
  180. <div class="list purple">
  181. <div class="top radio">窗口数:</div>
  182. <div class="bottom">
  183. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/floor4.png" alt="">
  184. <div><span class="number" id="winNum2">-</span>
  185. <span>个</span>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. </div>
  191. <div class="twofloor conList">
  192. <div class="floortitle">实时办件详情</div>
  193. <div class="floorcontent" style="flex-wrap: nowrap;flex-direction: column;padding: 5px;">
  194. <div class="top_t">
  195. <div class="t1">状态</div>
  196. <div class="t2">受理部门</div>
  197. <div class="t3">办理名称</div>
  198. </div>
  199. <div style="width: 100%;height:100%;overflow:hidden;">
  200. <div class="bottom-t">
  201. <div class="item" v-for="(item, index) in bjxqList">
  202. <div class="title t1"><span
  203. v-if="item.state&&item.state=='在办'">{{item.state}}</span>
  204. <span style="background: #18A65A;border: 1px solid #18A65A;"
  205. v-else>{{item.state}}</span>
  206. </div>
  207. <div class="date t2" :title="item.acceptedDepartment">
  208. {{item.acceptedDepartment}}</div>
  209. <div class="date t3" :title="item.handlingName">
  210. {{item.handlingName?item.handlingName.split("—")[0]:''}}</div>
  211. </div>
  212. </div>
  213. </div>
  214. </div>
  215. </div>
  216. <div class="blsl conList">
  217. <div class="floortitle">累计办理数量</div>
  218. <div class="floorcontent">
  219. <div class="list">
  220. <div class="img">
  221. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/blsl4.png" alt="">
  222. </div>
  223. <div class="right">
  224. <span>本日办理数量</span>
  225. <div class="number">
  226. <span id="currDayTaskNum">324</span>
  227. <span>件</span>
  228. </div>
  229. </div>
  230. </div>
  231. <div class="list">
  232. <div class="img">
  233. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/blsl1.png" alt="">
  234. </div>
  235. <div class="right">
  236. <span>本周办理数量</span>
  237. <div class="number">
  238. <span id="currWeekTaskNum">7152</span>
  239. <span>件</span>
  240. </div>
  241. </div>
  242. </div>
  243. <div class="list">
  244. <div class="img">
  245. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/blsl2.png" alt="">
  246. </div>
  247. <div class="right">
  248. <span>本月办理数量</span>
  249. <div class="number">
  250. <span id="currMonthTaskNum">78</span>
  251. <span>件</span>
  252. </div>
  253. </div>
  254. </div>
  255. <div class="list">
  256. <div class="img">
  257. <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/blsl3.png" alt="">
  258. </div>
  259. <div class="right">
  260. <span>本年办理数量</span>
  261. <div class="number">
  262. <span id="currYearTaskNum">78</span>
  263. <span>件</span>
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. </div>
  269. <div class="pdgdf conList">
  270. <div class="floortitle">区行政服务中心网点分布</div>
  271. <div class="floorcontent">
  272. <!-- <div id="pdgdfechart" style="width: 100%;height: 100%;"></div> -->
  273. <div class="list" @click="showDistrictLevel(1)">
  274. <div class="img">
  275. <img src="./images/districtLevelCenter.png" alt="">
  276. </div>
  277. <div class="right">
  278. <span>区级中心</span>
  279. <div class="number">
  280. <span>2</span>
  281. <span>个</span>
  282. </div>
  283. </div>
  284. </div>
  285. <div class="list" @click="showDistrictLevel(4)">
  286. <div class="img">
  287. <img src="./images/subCenter.png" alt="">
  288. </div>
  289. <div class="right">
  290. <span>分中心</span>
  291. <div class="number">
  292. <span>3</span>
  293. <span>个</span>
  294. </div>
  295. </div>
  296. </div>
  297. <div class="list" @click="showDistrictLevel(2)">
  298. <div class="img">
  299. <img src="./images/townStreet.png" alt="">
  300. </div>
  301. <div class="right">
  302. <span>镇街便民服务中心</span>
  303. <div class="number">
  304. <span>15</span>
  305. <span>个</span>
  306. </div>
  307. </div>
  308. </div>
  309. <div class="list" @click="showDistrictLevel(3)">
  310. <div class="img">
  311. <img src="./images/convenienceServiceStation.png" alt="">
  312. </div>
  313. <div class="right">
  314. <span>便民服务站</span>
  315. <div class="number">
  316. <span>150</span>
  317. <span>个</span>
  318. </div>
  319. </div>
  320. </div>
  321. </div>
  322. </div>
  323. <!-- 区行政服务中心网点分布弹窗 -->
  324. <div class="districtLevelBox" v-show="districtLevelShow">
  325. <div class="districtLevelContent">
  326. <img class="districtLevelbg" src="./images/districtLevelbg.png" alt="" srcset="">
  327. <div class="districtLevelContent-box" ref="districtLevelContent">
  328. <div class="districtLevelContent-tit" ref="districtLevelTit">
  329. <span></span>
  330. <span>区行政服务中心网点分布——{{districtLevelTitle}}</span>
  331. <img @click="clearDistrictLevel" src="./images/districtLevelClear.png" alt=""
  332. srcset="">
  333. </div>
  334. <img class="districtLevelLine" ref="districtLevelLine"
  335. src="./images/districtLevelLine.png" alt="">
  336. <div class="districtLevelList" ref="districtLevelList"
  337. :style="`height:${districtLevelListHeight}`">
  338. <el-row>
  339. <el-col :span="12" v-for="(item,index) in districtLevelLists">
  340. <div class="districtLevelList-col">
  341. <img :src="`./images/districtLevelList${districtLevelNum}.png`"
  342. alt="" srcset="">
  343. <div class="left">
  344. <span
  345. class="span-col name">{{index+(current-1)*10+1}}.{{item.dep}}</span>
  346. <span class="span-col">
  347. <span class="label">电话:</span>
  348. <span class="center" :title="item.tel"
  349. v-if="item.tel&&item.tel.length>28">{{item.tel.slice(0,
  350. 28)}}...</span>
  351. <span class="center" v-else>{{item.tel||'--'}}</span>
  352. </span>
  353. <span class="span-col">
  354. <span class="label">地址:</span>
  355. <span class="center" :title="item.address"
  356. v-if="item.address&&item.address.length>28">{{item.address.slice(0,
  357. 28)}}...</span>
  358. <span class="center" v-else>{{item.address}}</span>
  359. </span>
  360. </div>
  361. </div>
  362. </el-col>
  363. </el-row>
  364. </div>
  365. <div class="districtLevelFooter" ref="districtLevelFooter">
  366. <el-pagination :page-size="10" @current-change="currentChangeFun" background
  367. layout="prev, pager, next" :current-page="current"
  368. :total="districtLevelTotal">
  369. </el-pagination>
  370. </div>
  371. </div>
  372. </div>
  373. </div>
  374. <!-- 公交详情弹窗 -->
  375. <div id="transitTitPop" v-show="false"></div>
  376. <div class="districtLevelBox transitBox" id="transitBox" v-show="transitPopShow">
  377. <div class="districtLevelContent" id="transitContent">
  378. <img class="districtLevelbg" src="./images/districtLevelbg.png" alt="" srcset="">
  379. <div class="districtLevelContent-box">
  380. <div class="districtLevelContent-tit">
  381. <span></span>
  382. <span>天福路口站</span>
  383. <img @click="transitClearFun" src="./images/districtLevelClear.png" alt=""
  384. srcset="">
  385. </div>
  386. <img class="districtLevelLine" src="./images/districtLevelLine.png" alt="">
  387. <div class="transitContent">
  388. <div class="transitContentList" v-for="(item,index) in transitList"
  389. :key="item.id"
  390. :style="`border-bottom:${index == transitList.length-1?0:'1px solid #33333341'}`"
  391. @click="transitContentListClickFun(item)">
  392. <div class="left">
  393. <span
  394. class="left-col"><span>{{item.name}}</span><span>下一站:{{item.nextTransit}}</span></span>
  395. <span class="left-col"><span>--</span><span>等待发出</span></span>
  396. </div>
  397. <div class="right"
  398. @click="transitJson.routeOrder = !transitJson.routeOrder">
  399. <img src="./images/transitChange.png" alt="">
  400. </div>
  401. </div>
  402. </div>
  403. <div class="transitFooter" v-show="transitShow">
  404. <div class="transitRoute">
  405. {{transitJson.routeOrder?transitJson.start:transitJson.end}}
  406. <img src="./images/blueArrow.png" alt="" srcset="">
  407. {{transitJson.routeOrder?transitJson.end:transitJson.start}}
  408. </div>
  409. <div class="transitRouteContent">
  410. <span>首 {{transitJson.startTime}}</span>
  411. <span>末 {{transitJson.endTime}}</span>
  412. <span>票价{{transitJson.ticketPrice}}元</span>
  413. </div>
  414. <div class="carRoute">
  415. <div class="greenRoute"></div>
  416. <div class="nameRoute">
  417. <div class="nameRouteItem" v-for="(item,index) in transitRouteList"
  418. :key="index"
  419. :style="`width:${ index==transitRouteList.length-1?'2%':98/(transitRouteList.length-1)}%`">
  420. <div class="number">{{index+1}}</div>
  421. <div v-for="colItem in item.name" :key="colItem">
  422. {{colItem}}
  423. </div>
  424. </div>
  425. </div>
  426. </div>
  427. </div>
  428. </div>
  429. </div>
  430. </div>
  431. </div>
  432. </div>
  433. </div>
  434. </div>
  435. <div id="loading">
  436. <i class="fa fa-spinner fa-spin fa-fw"></i>加载中...
  437. </div>
  438. </div>
  439. <div style="width:100%;" class="footer"></div>
  440. </body>
  441. <script>
  442. function isMobileUserAgent() {
  443. return /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(
  444. window.parent.navigator.userAgent.toLowerCase("")
  445. );
  446. }
  447. if (isMobileUserAgent()) {
  448. window.location = 'https://www.cqna.gov.cn/syygapi/naxsb/mobile/qjtMobile.html'
  449. }
  450. </script>
  451. <script>
  452. $(function () {
  453. $(".header").load('https://www.cqna.gov.cn/syygapi/naxsb/top/top_style.html');
  454. $(".footer").load('https://www.cqna.gov.cn/syygapi/naxsb/footer/footer.html');
  455. });
  456. </script>
  457. <script>
  458. // 判断浏览器是否支持 webgl
  459. if (!Detector.webgl) Detector.addGetWebGLMessage();
  460. let mwidth = window.innerWidth;
  461. let mheight = window.innerHeight;
  462. // 初始化场景
  463. let scene = new THREE.Scene();
  464. // 初始化摄像机
  465. let camera = new THREE.PerspectiveCamera(10, mwidth / mheight, 1, 1000000);
  466. // camera.position.set(90000, 41120, 81120);
  467. camera.position.set(50000, 71120, 51120);
  468. camera.lookAt(new THREE.Vector3(0, 0, 0));
  469. let renderer = new THREE.WebGLRenderer({
  470. canvas: document.getElementById("canvas-model-view"),
  471. antialias: true, // 设置抗锯齿
  472. alpha: true, // 背景透明
  473. autoClear: true,
  474. logarithmicDepthBuffer: true
  475. });
  476. renderer.setSize(mwidth, mheight);
  477. renderer.shadowMap.enabled = true;
  478. // 2D 文字渲染
  479. let css2Renderer = new THREE.CSS2DRenderer();
  480. css2Renderer.setSize(mwidth, mheight);
  481. css2Renderer.domElement.style.position = 'absolute';
  482. css2Renderer.domElement.style.top = '0px';
  483. css2Renderer.domElement.style.pointerEvents = 'none';
  484. document.body.appendChild(css2Renderer.domElement);
  485. // 四个方向的平行光
  486. // 环境光
  487. let ambient = new THREE.AmbientLight(0x404040, 0.1);
  488. scene.add(ambient);
  489. // var pointLight = new THREE.PointLight(0xf0e68c, 0.9, 12500);
  490. // pointLight.position.set(0, 8500, 0);
  491. // pointLight.castShadow = true;
  492. // pointLight.shadow.camera.near = 1;
  493. // pointLight.shadow.camera.far = 15000;
  494. // pointLight.shadow.mapSize.width = 10240;
  495. // pointLight.shadow.mapSize.height = 10240;
  496. // scene.add(pointLight);
  497. // 加载模型文件
  498. let gLTFLoader = new THREE.GLTFLoader()
  499. let dracoLoader = new THREE.DRACOLoader();
  500. dracoLoader.setDecoderPath('https://www.cqna.gov.cn/syygapi/naxsb/3ddemo/examples/js/libs/draco/gltf/');
  501. dracoLoader.setDecoderConfig({
  502. type: 'js'
  503. });
  504. gLTFLoader.setDRACOLoader(dracoLoader);
  505. gLTFLoader.load('./3ddemo/model/33.gltf', function (obj) {
  506. obj.scene.traverse(function (child) {
  507. /* if (child.material && child.material.name) {
  508. child.frustumCulled = false;
  509. child.castShadow = true;
  510. child.receiveShadow = true;
  511. child.material.emissive = child.material.color;
  512. child.material.emissiveMap = child.material.map;
  513. child.material.transparent = true;
  514. child.material.emissiveIntensity = 0.8;
  515. if (child.material.name == 'ckck') {
  516. const div = document.createElement('div');
  517. div.id = child.uuid;
  518. let html = '';
  519. html += '<div style="font-size: 12px; width: 80px; text-align: center;position: relative;">';
  520. html += '<div class="building-text" style="background: #18A65A; margin-bottom: -2px;position: absolute;top:170px">';
  521. html += '<span style="text-align: left;">停车场</span>';
  522. html += '<span style="font-size: 10px; text-align: left;">空余车位:-</span>';
  523. html += '<span style="font-size: 10px; text-align: left;">空余充电桩:-</span>';
  524. html += '</div>';
  525. html += '</div>';
  526. div.innerHTML = html;
  527. let tag = new THREE.CSS2DObject(div);
  528. child.add(tag);
  529. }
  530. if (child.material.name == 'gongjiaochezhan') {
  531. const div = document.createElement('div');
  532. div.id = child.uuid;
  533. let html = `
  534. <div class="building-box-chekuchukou">
  535. <div class="chekuchukou-tit"><span>公交车站</span><span id="busDetails">详情</span></div>
  536. <div>144路:即将到达</div>
  537. <div>180路:车已到站</div>
  538. <div>188路:9分钟</div>
  539. <div>345路:2分钟</div>
  540. </div>
  541. `;
  542. div.innerHTML = html;
  543. let tag = new THREE.CSS2DObject(div);
  544. child.add(tag);
  545. div.style.pointerEvents = 'auto';
  546. // div.addEventListener('click', function (event) {
  547. // document.getElementById('transitTitPop').innerText = "true"
  548. // });
  549. }
  550. } */
  551. if (child.isMesh) {
  552. child.frustumCulled = false;
  553. child.castShadow = true;
  554. child.receiveShadow = true;
  555. child.material.emissive = child.material.color;
  556. child.material.emissiveMap = child.material.map;
  557. child.material.transparent = true;
  558. child.material.emissiveIntensity = 0.8;
  559. if (child.name) {
  560. // console.log(child, 'child', child.name);
  561. const div = document.createElement('div');
  562. div.id = child.uuid;
  563. div.style = 'color:red;';
  564. div.setAttribute("data", child.name);
  565. div.innerHTML = '<p data-name="' + child.name + '"></p>';
  566. let tag = new THREE.CSS2DObject(div);
  567. }
  568. // 一号楼
  569. if (child.name == 'yihaolou') {
  570. const div = document.createElement('div');
  571. div.id = child.uuid;
  572. let html = '';
  573. html += '<div class="building-box" style="width: 100px; top: 70px; left: -48px;">';
  574. html += '<div class="building-text" style="background: #1D96E9;" onclick="handleClick()">';
  575. html += '<span>1号楼</span><span style="font-size: 10px;">社保大厅、医保大厅</span>';
  576. html += '</div>';
  577. html += '<svg width="10" height="10"><polygon id="triangle" points="0,0 10,0 5,10" fill="#1D96E9"/></svg>';
  578. html += '</div>';
  579. html += '<div class="building-line" style="border-left: 1px dashed #1D96E9; height: 100px; top: 110px;"></div>';
  580. // html += `<div style="font-size: 12px;width: 100px;top: 326px;left: 58px;position: absolute;display: flex;flex-direction: column;align-items: flex-start;color: #fff;">
  581. // <div class="building-text" style="background: #18A65A; margin-bottom: -2px;">
  582. // <span style="text-align: left;">停车场</span>
  583. // <span style="font-size: 10px; text-align: left;">空余车位:-</span>
  584. // <span style="font-size: 10px; text-align: left;">空余充电桩:-</span>
  585. // </div>
  586. // </div>`
  587. // html += '<div class="building-line" style="border-left: 1px dashed #1D96E9; height: 100px; top: 326px;left: 58px;"></div>';
  588. div.innerHTML = html;
  589. let tag = new THREE.CSS2DObject(div);
  590. child.add(tag);
  591. }
  592. // 二号楼
  593. if (child.name == 'erhaolou') {
  594. const div = document.createElement('div');
  595. div.id = child.uuid;
  596. let html = '';
  597. html += '<div class="building-box" style="width: 100px; top: 28px; left: -48px;">';
  598. // html += '<div class="finger" style="animation:blink 1s infinite;"><img src="images/finger.png">点我</div>';
  599. html += '<div class="building-text" style="background: #1D96E9;">';
  600. html += '<span>2号楼</span></span></span><span style="font-size: 10px;">南岸区政务服务中心</span>';
  601. html += '</div>';
  602. html += '<svg width="10" height="10"><polygon id="triangle" points="0,0 10,0 5,10" fill="#1D96E9"/></svg>';
  603. html += '</div>';
  604. html += '<div class="building-line" style="border-left: 1px dashed #1D96E9; height: 100px; top: 72px;"></div>';
  605. div.innerHTML = html;
  606. let tag = new THREE.CSS2DObject(div);
  607. child.add(tag);
  608. div.style.pointerEvents = 'auto';
  609. div.addEventListener('click', function (event) {
  610. window.location.href = 'https://www.cqna.gov.cn/syygapi/naxsb/floorone.html?floorid=' + 2;
  611. });
  612. }
  613. // 三号楼
  614. if (child.name == 'sanhaolou') {
  615. const div = document.createElement('div');
  616. div.id = child.uuid;
  617. let html = '';
  618. html += '<div class="building-box" style="width: 50px; top: 73px; left: -23px;">';
  619. html += '<div class="building-text" style="background: #1D96E9;">';
  620. html += '<span>3号楼</span><span style="font-size: 10px;"></span>';
  621. html += '</div>';
  622. html += '<svg width="10" height="10"><polygon id="triangle" points="0,0 10,0 5,10" fill="#1D96E9"/></svg>';
  623. html += '</div>';
  624. html += '<div class="building-line" style="border-left: 1px dashed #1D96E9; height: 100px; top: 90px;"></div>';
  625. div.innerHTML = html;
  626. let tag = new THREE.CSS2DObject(div);
  627. child.add(tag);
  628. }
  629. // 四号楼
  630. if (child.name == 'sihaolou-Chrome') {
  631. const div = document.createElement('div');
  632. div.id = child.uuid;
  633. let html = '';
  634. html += '<div class="building-box">';
  635. // html += `<div class="text" style="top: -30px;left: 146px;position: absolute;display: flex;flex-direction: column;align-items: flex-start;color: #1A95EB;">
  636. // <span style="font-size: 18px;font-weight: bold;margin-bottom: 5px;">地铁6号线</span>
  637. // <span>邱家湾站2B出口</span>
  638. // <span>距离:800米</span>
  639. // <img src="https://www.cqna.gov.cn/syygapi/naxsb/images/qjtArrow.png" alt="" style="height: 1.75rem;">
  640. // </div>`
  641. html += '<div class="building-text">';
  642. html += '<span>4号楼</span><span style="font-size: 10px;">商务打印、小卖部、食堂</span>';
  643. html += '</div>';
  644. html += '<svg width="10" height="10"><polygon id="triangle" points="0,0 10,0 5,10" fill="#18A65A"/></svg>';
  645. html += '</div>';
  646. html += '<div class="building-line"></div>';
  647. div.innerHTML = html;
  648. let tag = new THREE.CSS2DObject(div);
  649. child.add(tag);
  650. }
  651. // if (child.name == 'chekuchukou') {
  652. // // console.log(child, 'child', child.name);
  653. // const div = document.createElement('div');
  654. // div.id = child.uuid;
  655. // let html = '';
  656. // html += '<div style="font-size: 12px; width: 80px; text-align: center;">';
  657. // html += '<div class="building-text" style="background: #18A65A; margin-bottom: -2px;">';
  658. // html += '<span style="text-align: left;">停车场</span>';
  659. // html += '<span style="font-size: 10px; text-align: left;">空余车位:-</span>';
  660. // html += '<span style="font-size: 10px; text-align: left;">空余充电桩:-</span>';
  661. // html += '</div>';
  662. // html += '</div>';
  663. // div.innerHTML = html;
  664. // let tag = new THREE.CSS2DObject(div);
  665. // child.add(tag);
  666. // }
  667. }
  668. });
  669. scene.add(obj.scene);
  670. const box = new THREE.Box3().setFromObject(obj.scene);
  671. const center = new THREE.Vector3();
  672. box.getCenter(center);
  673. obj.scene.position.sub(center);
  674. document.getElementById('loading').style.display = 'none';
  675. // 公交详情加点事件
  676. /* setTimeout(() => {
  677. document.getElementById('busDetails').addEventListener('click', function (event) {
  678. document.getElementById('transitTitPop').innerText = "true"
  679. });
  680. }, 300) */
  681. render();
  682. }, function (xhr) {
  683. }, function (error) {
  684. })
  685. function render() {
  686. css2Renderer.render(scene, camera)
  687. renderer.render(scene, camera);
  688. }
  689. render();
  690. let controls = new THREE.OrbitControls(camera, renderer.domElement);
  691. controls.enableZoom = false
  692. controls.maxPolarAngle = Math.PI / 2
  693. controls.minPolarAngle = 0
  694. controls.addEventListener('change', render);
  695. let axisHelper = new THREE.AxisHelper(50050);
  696. </script>
  697. <script>
  698. new Vue({
  699. el: '#qjt',
  700. data: function () {
  701. return {
  702. currentTime: "",
  703. bjxqList: [],
  704. /* 区行政服务中心网点分布 start*/
  705. districtLevelShow: false,
  706. districtLevelTitle: '',
  707. districtLevelNum: -1,
  708. districtLevelList: [
  709. // {
  710. // name: '重庆市南岸区政务服务中心(江南新城中心)',
  711. // tel: '023-62980263',
  712. // address: '重庆市南岸区铜元局街道南坪西路36号(上海城嘉发跨贸中心 二楼)南岸区'
  713. // },
  714. // {
  715. // name: '重庆市南岸区政务服务中心(江南新城中心)',
  716. // tel: '023-62980263',
  717. // address: '重庆市南岸区铜元局街道南坪西路36号(上海城嘉发跨贸中心 二楼)南岸区'
  718. // },
  719. // {
  720. // name: '重庆市南岸区政务服务中心(江南新城中心)',
  721. // tel: '023-62980263',
  722. // address: '重庆市南岸区铜元局街道南坪西路36号(上海城嘉发跨贸中心 二楼)南岸区'
  723. // }
  724. ],
  725. districtLevelLists: [],
  726. districtLevelTotal: 0,
  727. districtLevelListHeight: "60%",
  728. current: 0,
  729. /* 区行政服务中心网点分布 end*/
  730. /* 公交详情start */
  731. transitPopShow: false,
  732. transitShow: false,
  733. transitTime: null,
  734. transitList: [
  735. {
  736. name: '144路',
  737. nextTransit: '广福道',
  738. id: '1'
  739. },
  740. {
  741. name: '144路',
  742. nextTransit: '广福道',
  743. id: '2'
  744. }
  745. ],
  746. transitJson: {
  747. start: "响水路",
  748. end: "江南交通换乘枢纽",
  749. startTime: "06:00",
  750. endTime: "19:00",
  751. ticketPrice: "2",
  752. routeOrder: true//true表示顺序 false逆序
  753. },
  754. transitRouteList: [
  755. {
  756. name: '响水路',
  757. },
  758. {
  759. name: '南坪南路',
  760. },
  761. {
  762. name: '四公里立交',
  763. },
  764. {
  765. name: '茶园内环站',
  766. },
  767. {
  768. name: '玉马路',
  769. },
  770. {
  771. name: '江南小区',
  772. },
  773. {
  774. name: '广福大道',
  775. },
  776. {
  777. name: '天福路口',
  778. },
  779. {
  780. name: '广福大道中段',
  781. },
  782. {
  783. name: '广福大道中段',
  784. }
  785. ,
  786. {
  787. name: '江南交通换乘枢纽',
  788. }
  789. ]
  790. /* 公交详情end */
  791. };
  792. },
  793. created() {
  794. this.updateTime();
  795. setInterval(this.updateTime, 1000);
  796. this.getSSbj();
  797. this.showTransitBoxFun()
  798. },
  799. beforeDestroy() {
  800. this.stopClock();
  801. if (this.districtLevelShow)
  802. window.removeEventListener("resize", this.getDistrictLevelListHeight);
  803. clearInterval(this.transitTime)
  804. },
  805. methods: {
  806. updateTime() {
  807. const now = new Date();
  808. const year = String(now.getFullYear()).padStart(4, '0');
  809. const month = String(now.getMonth() + 1).padStart(2, '0');
  810. const day = String(now.getDate()).padStart(2, '0');
  811. const hours = String(now.getHours()).padStart(2, '0');
  812. const minutes = String(now.getMinutes()).padStart(2, '0');
  813. const seconds = String(now.getSeconds()).padStart(2, '0');
  814. const formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  815. this.currentTime = formattedDateTime;
  816. },
  817. addKeyFrames(y) {
  818. let i = 0
  819. setInterval(function () {
  820. if (i >= y) return i = 0
  821. i++
  822. document.querySelector('.bottom-t').style.marginTop = `-${i}px`
  823. }, 50);
  824. },
  825. getSSbj() {
  826. let that = this;
  827. $.ajax({
  828. url: 'https://data.cqna.gov.cn:8088/kshapi/api/page2/top2',
  829. type: "get",
  830. dataType: "json",
  831. async: false,
  832. success: function (data) {
  833. var data = data.data;
  834. that.bjxqList = data.data;
  835. }
  836. });
  837. var height = document.querySelector('.item') ? document.querySelector('.item').clientHeight - 20 : 0;
  838. if (this.bjxqList.length) {
  839. this.addKeyFrames(height * this.bjxqList.length);
  840. }
  841. },
  842. // 区行政服务中心网点分布点击事件
  843. showDistrictLevel(num) {
  844. let _this = this
  845. if (num != '1' && num != '4') {
  846. this.districtLevelShow = true
  847. this.districtLevelNum = num
  848. this.districtLevelTitle = { 1: '区级中心', 2: '镇街便民服务中心', 3: '便民服务站', 4: '分中心' }[num]
  849. // this.districtLevelTotal = { 1: 3, 2: 15, 3: 153, 4: 2 }[num]
  850. this.getDistrictLevelListHeight()
  851. window.addEventListener("resize", this.getDistrictLevelListHeight);
  852. $.ajax({
  853. url: `https://www.cqna.gov.cn/data/mapdata/getMapdataToType?id=${num == 2 ? 26 : 27}&matchingValue=`,
  854. type: "get",
  855. dataType: "json",
  856. async: false,
  857. success: function (data) {
  858. _this.current = 1
  859. _this.districtLevelTotal = data.data.length
  860. _this.districtLevelList = data.data
  861. _this.districtLevelLists = _this.districtLevelList.slice(0, 10)
  862. }
  863. });
  864. }
  865. },
  866. // 分页事件
  867. currentChangeFun(num) {
  868. this.current = num
  869. let numstar = num - 1, endNum = num
  870. this.districtLevelLists = this.districtLevelList.slice(10 * numstar, 10 * num)
  871. },
  872. // 关闭弹窗
  873. clearDistrictLevel() {
  874. this.districtLevelShow = false
  875. window.removeEventListener("resize", this.getDistrictLevelListHeight);
  876. },
  877. // 控制车辆信息详情展示区域的显示
  878. transitContentListClickFun(item) {
  879. this.transitShow = true
  880. },
  881. // 获取网点分布弹窗内容高度
  882. getDistrictLevelListHeight() {
  883. this.$nextTick(() => {
  884. const districtLevelContentHeight = this.$refs.districtLevelContent.offsetHeight;
  885. const districtLevelFooterHeight = this.$refs.districtLevelFooter.offsetHeight;
  886. this.districtLevelListHeight =
  887. (districtLevelContentHeight - this.$refs.districtLevelList.offsetTop - districtLevelFooterHeight - districtLevelContentHeight * 0.1) + 'px'
  888. });
  889. },
  890. // 监听控制公交详情显示
  891. showTransitBoxFun() {
  892. let _this = this
  893. this.transitTime = setInterval(() => {
  894. if (document.getElementById('transitTitPop').innerText == "true") {
  895. _this.transitPopShow = true
  896. document.getElementById('transitContent').style.display = "block"
  897. }
  898. }, 100)
  899. },
  900. // 关闭公交弹窗
  901. transitClearFun() {
  902. document.getElementById('transitTitPop').innerText = ""
  903. this.transitPopShow = false
  904. }
  905. }
  906. });
  907. </script>
  908. <!-- <script>
  909. var chartDom = document.getElementById('pdgdfechart');
  910. var myChart = echarts.init(chartDom);
  911. var option;
  912. option = {
  913. color: ['#80FFA5'],
  914. tooltip: {
  915. trigger: 'axis',
  916. axisPointer: {
  917. type: 'cross',
  918. label: {
  919. backgroundColor: '#6a7985'
  920. }
  921. }
  922. },
  923. grid: {
  924. left: '3%',
  925. right: '4%',
  926. bottom: '3%',
  927. containLabel: true
  928. },
  929. xAxis: [
  930. {
  931. type: 'category',
  932. boundaryGap: false,
  933. data: ['8:00', '9:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:30'],
  934. axisLabel: {
  935. color: 'rgba(26,149,235,0.5);' // 这里设置刻度字的颜色为蓝色
  936. }
  937. }
  938. ],
  939. yAxis: [
  940. {
  941. type: 'value',
  942. name: '人次',
  943. nameTextStyle: {
  944. color: "#2A6594",
  945. fontSize: '14'
  946. },
  947. axisTick: {
  948. show: true // 显示Y轴刻度线
  949. },
  950. axisLine: {
  951. show: true
  952. },
  953. axisLabel: {
  954. color: 'rgba(26,149,235,0.5);' // 这里设置刻度字的颜色为蓝色
  955. }
  956. }
  957. ],
  958. series: [
  959. {
  960. name: '大厅取号高低峰指数',
  961. type: 'line',
  962. stack: 'Total',
  963. smooth: true,
  964. lineStyle: {
  965. width: 0
  966. },
  967. areaStyle: {
  968. opacity: 0.8,
  969. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  970. {
  971. offset: 0,
  972. color: 'rgb(17 126 202)'
  973. },
  974. {
  975. offset: 1,
  976. color: 'rgb(192 215 231)'
  977. }
  978. ])
  979. },
  980. emphasis: {
  981. focus: 'series'
  982. },
  983. data: [14, 72, 138, 150, 26, 2, 60, 154, 100, 44]
  984. }
  985. ]
  986. };
  987. option && myChart.setOption(option);
  988. </script> -->
  989. <script>
  990. var path = "https://www.cqna.gov.cn/data";
  991. function handlingNumber(area, timeType) {
  992. var data1 = ''
  993. $.ajax({
  994. url: path + "/department/getOfficeNumberByAreaInfo",
  995. dataType: "json",
  996. type: "get",
  997. cache: false,
  998. async: false,
  999. data: {
  1000. "area": area,
  1001. "timeType": timeType
  1002. },
  1003. success: function (data) {
  1004. data1 = data.data
  1005. },
  1006. error: function () {
  1007. alert('网络错误,请稍后再试!');
  1008. }
  1009. });
  1010. return data1;
  1011. }
  1012. function animateValue(obj, start, end, duration) {
  1013. let startTimestamp = null;
  1014. const step = (timestamp) => {
  1015. if (!startTimestamp) startTimestamp = timestamp;
  1016. const progress = Math.min((timestamp - startTimestamp) / duration, 1);
  1017. obj.innerHTML = Math.floor(progress * (end - start) + start);
  1018. if (progress < 1) {
  1019. window.requestAnimationFrame(step);
  1020. } else {
  1021. obj.classList.remove('animate');
  1022. }
  1023. };
  1024. obj.classList.add('animate');
  1025. window.requestAnimationFrame(step);
  1026. }
  1027. const time = 2 * 1000;
  1028. let that = this;
  1029. function getCurrentPerson() {
  1030. $.ajax({
  1031. url: conpath + "/qjt/",
  1032. type: "get",
  1033. dataType: "json",
  1034. async: false,
  1035. success: function (data) {
  1036. const waitTime2 = document.getElementById('waitTime2');
  1037. animateValue(waitTime2, 0, data.data[0], time);
  1038. const currWaitPeople2 = document.getElementById('currWaitPeople2');
  1039. animateValue(currWaitPeople2, 0, data.data[1], time);
  1040. }
  1041. })
  1042. }
  1043. getCurrentPerson();
  1044. var intervalId = setInterval(getCurrentPerson, 1800000);
  1045. function getCurrentItem() {
  1046. $.ajax({
  1047. url: conpath + "/solveAffairs/",
  1048. type: "get",
  1049. dataType: "json",
  1050. async: false,
  1051. success: function (data) {
  1052. var data = data.data;
  1053. const currDayTaskNumElement = document.getElementById('currDayTaskNum');
  1054. animateValue(currDayTaskNumElement, 0, data[0], time);
  1055. const currWeekTaskNumElement = document.getElementById('currWeekTaskNum');
  1056. animateValue(currWeekTaskNumElement, 0, data[1], time);
  1057. const currMonthTaskNumElement = document.getElementById('currMonthTaskNum');
  1058. animateValue(currMonthTaskNumElement, 0, data[2], time);
  1059. const currYearTaskNumElement = document.getElementById('currYearTaskNum');
  1060. animateValue(currYearTaskNumElement, 0, data[3], time);
  1061. }
  1062. })
  1063. }
  1064. getCurrentItem();
  1065. var intervalId1 = setInterval(getCurrentItem, 300000);
  1066. window.addEventListener('beforeunload', function () {
  1067. clearInterval(intervalId);
  1068. clearInterval(intervalId1);
  1069. });
  1070. const taskNumElement2 = document.getElementById('taskNum2');
  1071. animateValue(taskNumElement2, 0, 798, time);
  1072. const winNumElement2 = document.getElementById('winNum2');
  1073. animateValue(winNumElement2, 0, 78, time);
  1074. </script>
  1075. </html>