home.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. <template>
  2. <view class="container">
  3. <view v-if="!menushow" class="main">
  4. <view class="u-page">
  5. <u-list :class="{ empty: showList.length === 0 }">
  6. <template v-if="showList.length > 0">
  7. <u-list-item
  8. class="itemback"
  9. v-for="(item, index) in showList"
  10. :key="index"
  11. >
  12. <div>
  13. <u-row gutter="5" customStyle="margin-bottom: 10px">
  14. <u-col span="24">
  15. <span class="title">{{ item.strinstallpos }}</span>
  16. </u-col>
  17. </u-row>
  18. <u-row gutter="5" customStyle="margin-bottom: 10px">
  19. <u-col span="2" style="margin-right: 20rpx">
  20. <div v-if="item.netStatus == 0" class="error-tag1">
  21. <image
  22. src="/static/model/connectFalse.svg"
  23. alt=""
  24. class="icon-style"
  25. />
  26. <span style="float: right">断开</span>
  27. </div>
  28. <div v-else class="success-tag">
  29. <image
  30. src="/static/model/connectTrue.svg"
  31. alt=""
  32. class="icon-style"
  33. />
  34. <span style="float: right">连接</span>
  35. </div>
  36. </u-col>
  37. <u-col span="2">
  38. <div v-if="item.warnFlag == 0" class="success-tag">
  39. <image
  40. src="/static/model/alarmTrue.svg"
  41. alt=""
  42. class="icon-style"
  43. />
  44. <span style="float: right">正常</span>
  45. </div>
  46. <div v-else class="error-tag" @click="toggleWarn()">
  47. <image
  48. v-show="!isWarnVisible"
  49. src="/static/model/alarmFalse.svg"
  50. alt=""
  51. class="icon-style"
  52. />
  53. <span
  54. v-show="isWarnVisible"
  55. style="text-overflow: ellipsis; text-algin: center"
  56. >{{ item.warnDes }}</span
  57. >
  58. </div>
  59. </u-col>
  60. <u-col span="2"></u-col>
  61. <u-col span="5">
  62. <div class="time-bg">
  63. <span class="timetext">{{ item.readTime }}</span>
  64. </div>
  65. </u-col>
  66. </u-row>
  67. <view v-if="TabCur != 'fanmain' && TabCur != 'fanlocal'">
  68. <div @tap="openNewPage(item)">
  69. <view
  70. class="datacard"
  71. v-for="(showitem, index) in deviceShowList"
  72. :key="index"
  73. v-show="
  74. showitem.appShow == 1 &&
  75. showitem.monitorcode != 'strinstallpos' &&
  76. showitem.monitorcode != 'netStatus' &&
  77. showitem.monitorcode != 'warnFlag' &&
  78. showitem.monitorcode != 'readTime' &&
  79. showitem.monitorcode != ''
  80. "
  81. >
  82. <view
  83. :class="TabCur"
  84. style="
  85. padding-top: 10rpx;
  86. padding-bottom: 10rpx;
  87. display: flex;
  88. flex-direction: column;
  89. height: 100%;
  90. "
  91. >
  92. <view
  93. v-if="showitem.monitorcode == 'doorUse'"
  94. class="demo-layout bg-purple-light"
  95. style="
  96. margin-top: 10rpx;
  97. color: #3787fe;
  98. font-weight: bold;
  99. margin-top: 20rpx;
  100. margin-left: 20rpx;
  101. text-align: left;
  102. "
  103. >
  104. {{
  105. item[showitem.monitorcode] == "2"
  106. ? "行人"
  107. : item[showitem.monitorcode] == "1"
  108. ? "行车"
  109. : item[showitem.monitorcode] == "3"
  110. ? "短路"
  111. : item[showitem.monitorcode] == "3"
  112. ? "行车/短路"
  113. : "-"
  114. }}
  115. </view>
  116. <view
  117. v-else
  118. class="demo-layout bg-purple-light"
  119. style="
  120. color: #3787fe;
  121. font-size: 30rpx;
  122. font-weight: bold;
  123. margin-top: 20rpx;
  124. margin-left: 20rpx;
  125. text-align: left;
  126. "
  127. >
  128. {{
  129. item[showitem.monitorcode] == null ||
  130. item[showitem.monitorcode] == ""
  131. ? "-"
  132. : item[showitem.monitorcode]
  133. }}
  134. </view>
  135. <view
  136. class="demo-layout bg-purple-light"
  137. style="
  138. margin-top: 20rpx;
  139. color: #677799;
  140. margin-top: 20rpx;
  141. margin-left: 20rpx;
  142. text-align: left;
  143. "
  144. >
  145. {{ showitem.des }}
  146. </view>
  147. </view>
  148. </view>
  149. </div>
  150. </view>
  151. <div class="fanContent" @tap="openNewPage(item)" v-else>
  152. <div class="top">
  153. <view>主机</view>
  154. <view
  155. class="datacard"
  156. v-for="(showitem, index) in deviceShowList"
  157. :key="index"
  158. v-show="
  159. showitem.appShow == 1 &&
  160. showitem.monitorcode != 'strinstallpos' &&
  161. showitem.monitorcode != 'netStatus' &&
  162. showitem.monitorcode != 'warnFlag' &&
  163. showitem.monitorcode != 'readTime' &&
  164. showitem.monitorcode != ''
  165. "
  166. >
  167. <view
  168. :class="TabCur"
  169. style="
  170. padding-top: 10rpx;
  171. padding-bottom: 10rpx;
  172. display: flex;
  173. flex-direction: column;
  174. height: 100%;
  175. "
  176. >
  177. <view
  178. class="demo-layout bg-purple-light"
  179. style="
  180. color: #3787fe;
  181. font-size: 30rpx;
  182. font-weight: bold;
  183. margin-top: 20rpx;
  184. margin-left: 20rpx;
  185. text-align: left;
  186. "
  187. >
  188. {{
  189. item[
  190. showitem.monitorcode.startsWith("fan")
  191. ? showitem.monitorcode.replace(/^fan/, "fan1")
  192. : showitem.monitorcode.startsWith("Fan")
  193. ? showitem.monitorcode.replace(/^Fan/, "Fan1")
  194. : showitem.monitorcode
  195. ] !== undefined &&
  196. item[
  197. showitem.monitorcode.startsWith("fan")
  198. ? showitem.monitorcode.replace(/^fan/, "fan1")
  199. : showitem.monitorcode.startsWith("Fan")
  200. ? showitem.monitorcode.replace(/^Fan/, "Fan1")
  201. : showitem.monitorcode
  202. ] !== null
  203. ? item[
  204. showitem.monitorcode.startsWith("fan")
  205. ? showitem.monitorcode.replace(
  206. /^fan/,
  207. "fan1"
  208. )
  209. : showitem.monitorcode.startsWith("Fan")
  210. ? showitem.monitorcode.replace(
  211. /^Fan/,
  212. "Fan1"
  213. )
  214. : showitem.monitorcode
  215. ]
  216. : "-"
  217. }}
  218. </view>
  219. <!-- <view
  220. v-else-if="showitem.datatype == 2"
  221. class="demo-layout bg-purple-light"
  222. style="
  223. color: #3787fe;
  224. font-size: 30rpx;
  225. margin-top: 20rpx;
  226. "
  227. >
  228. {{
  229. item.readData[
  230. showitem.monitorcode.startsWith("Fan")
  231. ? showitem.monitorcode.replace(/^Fan/, "Fan1")
  232. : showitem.monitorcode
  233. ] !== undefined &&
  234. item.readData[
  235. showitem.monitorcode.startsWith("Fan")
  236. ? showitem.monitorcode.replace(/^Fan/, "Fan1")
  237. : showitem.monitorcode
  238. ] !== null
  239. ? item.readData[
  240. showitem.monitorcode.startsWith("Fan")
  241. ? showitem.monitorcode.replace(
  242. /^Fan/,
  243. "Fan1"
  244. )
  245. : showitem.monitorcode
  246. ]
  247. : "-"
  248. }}
  249. </view> -->
  250. <view
  251. class="demo-layout bg-purple-light"
  252. style="
  253. margin-top: 20rpx;
  254. color: #677799;
  255. margin-top: 20rpx;
  256. margin-left: 20rpx;
  257. text-align: left;
  258. "
  259. >
  260. {{ showitem.des }}
  261. </view>
  262. </view>
  263. </view>
  264. </div>
  265. <div class="bottom">
  266. <view>备机</view>
  267. <view
  268. class="datacard"
  269. v-for="(showitem, index) in deviceShowList"
  270. :key="index"
  271. v-show="
  272. showitem.appShow == 1 &&
  273. showitem.monitorcode != 'strinstallpos' &&
  274. showitem.monitorcode != 'netStatus' &&
  275. showitem.monitorcode != 'warnFlag' &&
  276. showitem.monitorcode != 'readTime' &&
  277. showitem.monitorcode != ''
  278. "
  279. >
  280. <view
  281. :class="TabCur"
  282. style="
  283. padding-top: 10rpx;
  284. padding-bottom: 10rpx;
  285. display: flex;
  286. flex-direction: column;
  287. height: 100%;
  288. "
  289. >
  290. <view
  291. class="demo-layout bg-purple-light"
  292. style="
  293. color: #3787fe;
  294. font-size: 30rpx;
  295. font-weight: bold;
  296. margin-top: 20rpx;
  297. margin-left: 20rpx;
  298. text-align: left;
  299. "
  300. >
  301. {{
  302. item[
  303. showitem.monitorcode.startsWith("fan")
  304. ? showitem.monitorcode.replace(/^fan/, "fan2")
  305. : showitem.monitorcode.startsWith("Fan")
  306. ? showitem.monitorcode.replace(/^Fan/, "Fan2")
  307. : showitem.monitorcode
  308. ] !== undefined &&
  309. item[
  310. showitem.monitorcode.startsWith("fan")
  311. ? showitem.monitorcode.replace(/^fan/, "fan2")
  312. : showitem.monitorcode.startsWith("Fan")
  313. ? showitem.monitorcode.replace(/^Fan/, "Fan2")
  314. : showitem.monitorcode
  315. ] !== null
  316. ? item[
  317. showitem.monitorcode.startsWith("fan")
  318. ? showitem.monitorcode.replace(
  319. /^fan/,
  320. "fan2"
  321. )
  322. : showitem.monitorcode.startsWith("Fan")
  323. ? showitem.monitorcode.replace(
  324. /^Fan/,
  325. "Fan2"
  326. )
  327. : showitem.monitorcode
  328. ]
  329. : "-"
  330. }}
  331. </view>
  332. <!-- <view
  333. v-else-if="showitem.datatype == 2"
  334. class="demo-layout bg-purple-light"
  335. style="
  336. color: #3787fe;
  337. font-size: 30rpx;
  338. margin-top: 20rpx;
  339. "
  340. >
  341. {{
  342. item.readData[
  343. showitem.monitorcode.startsWith("Fan")
  344. ? showitem.monitorcode.replace(/^Fan/, "Fan2")
  345. : showitem.monitorcode
  346. ] !== undefined &&
  347. item.readData[
  348. showitem.monitorcode.startsWith("Fan")
  349. ? showitem.monitorcode.replace(/^Fan/, "Fan2")
  350. : showitem.monitorcode
  351. ] !== null
  352. ? item.readData[
  353. showitem.monitorcode.startsWith("Fan")
  354. ? showitem.monitorcode.replace(
  355. /^Fan/,
  356. "Fan2"
  357. )
  358. : showitem.monitorcode
  359. ]
  360. : "-"
  361. }}
  362. </view> -->
  363. <view
  364. class="demo-layout bg-purple-light"
  365. style="
  366. margin-top: 20rpx;
  367. color: #677799;
  368. margin-top: 20rpx;
  369. margin-left: 20rpx;
  370. text-align: left;
  371. "
  372. >
  373. {{ showitem.des }}
  374. </view>
  375. </view>
  376. </view>
  377. </div>
  378. </div>
  379. </div>
  380. </u-list-item>
  381. </template>
  382. <template v-else>
  383. <div class="empty-message">数据为空</div>
  384. </template>
  385. </u-list>
  386. </view>
  387. </view>
  388. </view>
  389. </template>
  390. <script>
  391. import api from "@/api/api";
  392. import { computed } from "vue";
  393. export default {
  394. data() {
  395. return {
  396. deviceShow1: false,
  397. menushow: false,
  398. TabCur: "",
  399. curlist: [],
  400. deviceList: {},
  401. List: [],
  402. colums: {},
  403. typeList: [], //详情页展示数据
  404. deviceShowList: [], //设备展示字段
  405. isWarnVisible: false,
  406. deviceType1: "",
  407. devices1: [],
  408. showList: [],
  409. };
  410. },
  411. props: ["showColum", "deviceType"],
  412. watch: {
  413. showColum(data) {
  414. this.colums = data;
  415. },
  416. deviceType: {
  417. async handler(data) {
  418. if (data) {
  419. this.TabCur = data;
  420. this.curlist = this.deviceList[this.TabCur];
  421. if (this.curlist == null) {
  422. this.curlist = [];
  423. }
  424. // 选择设备分类,重新获取数据
  425. await this.loadData(this.TabCur);
  426. this.$emit("setMenushow", {
  427. menushow: false,
  428. });
  429. }
  430. },
  431. immediate: true,
  432. },
  433. },
  434. created() {
  435. this.colums = this.showColum;
  436. // this.deviceShowList = this.colums[key];
  437. },
  438. mounted() {
  439. this.startTimer();
  440. },
  441. methods: {
  442. toggleWarn() {
  443. console.log("测试");
  444. this.isWarnVisible = !this.isWarnVisible;
  445. },
  446. startTimer() {
  447. // 每隔一段时间执行某个操作
  448. this.timer = setInterval(async () => {
  449. // 执行定时任务
  450. await this.loadData(this.deviceType);
  451. console.log("定时任务执行中...");
  452. }, 5000);
  453. },
  454. stopTimer() {
  455. // 停止定时器
  456. clearInterval(this.timer);
  457. },
  458. getIcon(itemValue) {
  459. // 根据itemValue获取对应的图标路径,如果找不到对应关系则返回默认图标
  460. return "/static/sidebar/" + itemValue + ".svg";
  461. },
  462. getValueIcon(itemValue) {
  463. // 根据itemValue获取对应的图标路径,如果找不到对应关系则返回默认图标
  464. return "/static/sidebar/" + itemValue + ".svg";
  465. },
  466. loadData(type) {
  467. return new Promise((resolve, reject) => {
  468. api
  469. .getDeviceMonitor({
  470. devicetype: type,
  471. pagetype: "normal",
  472. })
  473. .then((response) => {
  474. if (response.data.code == 200) {
  475. this.deviceList[type] = response.data.result.msgTxt[0].datalist;
  476. this.curlist = this.deviceList[type];
  477. const processedList = this.curlist.map((item) => {
  478. const { readData, ...baseFields } = item;
  479. return { ...baseFields, ...readData };
  480. });
  481. this.showList = processedList;
  482. this.showList.forEach((item) => {
  483. if (item.frontGateOpen == 1) {
  484. item.frontGateOpen = "打开";
  485. } else {
  486. item.frontGateOpen = "关闭";
  487. }
  488. if (item.midGateOpen == 1) {
  489. item.midGateOpen = "打开";
  490. } else {
  491. item.midGateOpen = "关闭";
  492. }
  493. if (item.rearGateOpen == 1) {
  494. item.rearGateOpen = "打开";
  495. } else {
  496. item.rearGateOpen = "关闭";
  497. }
  498. if (item.midGateOpen == 1) {
  499. item.midGateOpen = "打开";
  500. } else {
  501. item.midGateOpen = "关闭";
  502. }
  503. this.deviceType1 = item.deviceType;
  504. let original = this.TabCur;
  505. let newName = original.startsWith("sys_")
  506. ? original.substring(4)
  507. : original;
  508. const key = newName + "_monitor";
  509. const key1 = this.deviceType1 + "_monitor";
  510. if (this.showColum?.[key1]?.length > 0) {
  511. this.deviceShowList = this.showColum[key1];
  512. } else {
  513. this.deviceShowList = this.showColum[key] ?? [];
  514. }
  515. });
  516. if (this.TabCur == "sys_pulping") {
  517. this.loadNewData(this.curlist[0].deviceID);
  518. }
  519. } else {
  520. resolve(response);
  521. }
  522. })
  523. .catch((error) => {
  524. // console.log("catch===>response", response);
  525. reject(error);
  526. });
  527. });
  528. },
  529. loadNewData(ID) {
  530. return new Promise((resolve, reject) => {
  531. api
  532. .getDeviceMonitor({
  533. devicetype: "sys",
  534. systemID: ID,
  535. })
  536. .then((response) => {
  537. if (response.data.code == 200) {
  538. this.curlist = [];
  539. this.List = response.data.result.msgTxt;
  540. this.List.forEach((item) => {
  541. if (item.type === "pulping_auto") {
  542. this.curlist.push(item.datalist[0]);
  543. }
  544. });
  545. } else {
  546. resolve(response);
  547. }
  548. })
  549. .catch((error) => {
  550. // console.log("catch===>response", response);
  551. reject(error);
  552. });
  553. });
  554. },
  555. devicemenuShow(e) {
  556. this.menushow = !this.menushow;
  557. },
  558. //获取app展示字段数据
  559. getShowList(type) {
  560. const params = {
  561. devicekind: type,
  562. pagetype: "monitor",
  563. pageNo: 1,
  564. pageSize: 100,
  565. };
  566. return new Promise((resolve, reject) => {
  567. api
  568. .getShowColumList(params)
  569. .then((response) => {
  570. if (response.data.code == 200) {
  571. this.typeList = response.data.result.records;
  572. resolve(response);
  573. } else {
  574. resolve(response);
  575. }
  576. })
  577. .catch((error) => {
  578. reject(error);
  579. });
  580. });
  581. },
  582. openNewPage(params) {
  583. const reqData = {
  584. id: params.deviceID,
  585. name: params.strinstallpos,
  586. type: this.TabCur,
  587. };
  588. const reqparams = uni.$u.queryParams(reqData);
  589. // const key = this.deviceType1 + "_monitor";
  590. if (this.deviceShowList.length > 0) {
  591. this.$destroy();
  592. uni.navigateTo({
  593. url: `/pages/home/detail/autodoor/autodoor${reqparams}`,
  594. });
  595. }
  596. // this.$destroy();
  597. // uni.navigateTo({
  598. // url: `/pages/home/detail/autodoor/autodoor?id=${params.deviceID}&name=${params.strinstallpos}&type=${this.TabCur}`,
  599. // });
  600. // },
  601. },
  602. },
  603. destroyed() {
  604. // 停止定时器
  605. this.stopTimer();
  606. },
  607. };
  608. </script>
  609. <style>
  610. .time-bg {
  611. background-color: #cce6fb;
  612. border-radius: 5px;
  613. height: 26px;
  614. line-height: 25px;
  615. text-align: center;
  616. float: right;
  617. }
  618. .empty {
  619. background: url("/static/empty.png") no-repeat;
  620. background-size: 100% 50%;
  621. }
  622. .empty-message {
  623. display: flex;
  624. justify-content: center;
  625. align-items: center;
  626. font-size: 16px;
  627. line-height: 80vh;
  628. color: #333;
  629. }
  630. >>> .u-navbar--fixed {
  631. /* margin-top: 20px; */
  632. }
  633. .main {
  634. /* margin-top: 100rpx; */
  635. display: flex;
  636. flex-direction: column;
  637. }
  638. .card {
  639. background-color: #ffffff;
  640. margin: auto;
  641. margin-top: 20rpx;
  642. width: 10%;
  643. height: 280rpx;
  644. border: 1rpx solid #000000;
  645. border-radius: 20rpx;
  646. }
  647. .menupage {
  648. position: absolute;
  649. z-index: 2;
  650. width: 100%;
  651. }
  652. .timetext {
  653. text-align: center;
  654. color: #2591eb;
  655. font-weight: bold;
  656. }
  657. .itemback {
  658. padding: 20rpx;
  659. background-color: #ffffff;
  660. margin-bottom: 5rpx;
  661. }
  662. .fanContent {
  663. display: flex;
  664. flex-direction: column;
  665. margin-top: 10rpx;
  666. margin-bottom: 10rpx;
  667. }
  668. .top,
  669. .bottom {
  670. flex: 1; /* 各占 50% */
  671. }
  672. .datacard .content {
  673. width: 30rpx;
  674. height: 30rpx;
  675. left: 0rpx;
  676. top: 0rpx;
  677. position: absolute;
  678. }
  679. .datacard {
  680. border-radius: 10rpx;
  681. border: rgba(55, 135, 254, 0.28);
  682. width: 47%;
  683. margin: 1%;
  684. float: left;
  685. height: 75px;
  686. text-align: center;
  687. background: linear-gradient(
  688. to right,
  689. rgba(55, 135, 254, 0.08),
  690. rgba(4, 184, 255, 0.08),
  691. rgba(60, 161, 237, 0.08)
  692. );
  693. background-image: url("/static/maxbg.png");
  694. background-size: 100% 100%;
  695. background-position: center;
  696. }
  697. .datacard .gate {
  698. background: linear-gradient(
  699. to right,
  700. rgba(75, 135, 254, 0.08),
  701. rgba(24, 184, 255, 0.08),
  702. rgba(80, 161, 237, 0.08)
  703. );
  704. }
  705. .datacard .window {
  706. background: linear-gradient(
  707. to right,
  708. rgba(55, 125, 254, 0.08),
  709. rgba(4, 164, 255, 0.08),
  710. rgba(60, 131, 237, 0.08)
  711. );
  712. }
  713. .datacard .windrect {
  714. background: linear-gradient(
  715. to right,
  716. rgba(85, 125, 254, 0.08),
  717. rgba(34, 164, 255, 0.08),
  718. rgba(90, 131, 237, 0.08)
  719. );
  720. }
  721. .error-tag {
  722. border-radius: 10%;
  723. display: inline-block;
  724. color: #e90000;
  725. line-height: 50rpx;
  726. font-size: 14px;
  727. text-align: center;
  728. width: 120rpx;
  729. height: 50rpx;
  730. padding-right: 30rpx;
  731. background-color: rgba(233, 0, 0, 0.2);
  732. }
  733. .error-tag1 {
  734. border-radius: 10%;
  735. display: inline-block;
  736. color: #696969;
  737. line-height: 50rpx;
  738. font-size: 14px;
  739. text-align: center;
  740. margin-top: 10rpx;
  741. width: 120rpx;
  742. height: 50rpx;
  743. background-color: rgba(105, 105, 105, 0.2);
  744. }
  745. .success-tag {
  746. border-radius: 10%;
  747. color: #42c000;
  748. line-height: 25px;
  749. font-size: 14px;
  750. width: 60px;
  751. height: 26px;
  752. padding-right: 15px;
  753. background-color: rgba(226, 250, 214);
  754. }
  755. .icon-style {
  756. margin: 7px;
  757. width: 14px;
  758. height: 14px;
  759. }
  760. .title {
  761. margin-left: 40rpx;
  762. float: left;
  763. font-size: 28rpx;
  764. font-weight: bold;
  765. }
  766. </style>