screwdriver.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. <template>
  2. <div class="containerBox">
  3. <el-collapse>
  4. <el-collapse-item
  5. v-for="(item, index) in materialsData"
  6. :key="index + item"
  7. :name="index"
  8. :disabled="item.deviceType == 'FJDJC'"
  9. style="position: relative"
  10. >
  11. <template #title>
  12. <span class="diviceName">
  13. {{ dictS.getLableByValue("device_type", item.deviceType) }}</span
  14. >
  15. &nbsp;&nbsp;&nbsp;<span
  16. :class="item.state ? 'round green' : 'round'"
  17. ></span
  18. >&nbsp; &nbsp;
  19. <span
  20. @click.stop="
  21. addItem(item.deviceNo, item.deviceName, item.deviceType, index)
  22. "
  23. v-if="item.deviceType != 'FJDJC'"
  24. class="opear"
  25. style="font-size: 18px; color: rgb(10, 89, 247); font-weight: 600"
  26. >新增数据</span
  27. >
  28. <!-- DDLSD -->
  29. <el-select
  30. v-model="taskValue"
  31. v-if="item.deviceType == 'DDLSD'"
  32. placeholder="请选择任务"
  33. size="large"
  34. @change="changeTask"
  35. style="position: absolute; right: 460px; z-index: 2; width: 140px"
  36. >
  37. <el-option
  38. v-for="item in options"
  39. :key="item.value"
  40. :label="item.label"
  41. :value="item.value"
  42. />
  43. </el-select>
  44. <el-button
  45. class="ces"
  46. type="primary"
  47. style="position: absolute; right: 340px; z-index: 2"
  48. v-if="item.deviceType == 'DDLSD'"
  49. @click.stop="
  50. startTest1(item.deviceName, item.deviceNo, item.deviceType)
  51. "
  52. :disabled="
  53. (item.deviceType == 'DDLSD' && !taskValue) ||
  54. btnDisabled ||
  55. setDiabledStatus
  56. "
  57. >设置参数</el-button
  58. >
  59. <el-select
  60. v-model="taskId"
  61. v-if="item.deviceType == 'DDLSD'"
  62. placeholder="选择任务号"
  63. size="large"
  64. style="position: absolute; right: 180px; z-index: 2; width: 140px"
  65. >
  66. <el-option
  67. v-for="item in options2"
  68. :key="item.value"
  69. :label="item.label"
  70. :value="item.value"
  71. />
  72. </el-select>
  73. <!-- DDLSD -->
  74. <!-- WKDLT -->
  75. <el-input-number
  76. @click.stop
  77. style="
  78. position: absolute;
  79. right: 300px;
  80. z-index: 2;
  81. margin-bottom: 1px;
  82. "
  83. v-model="tipTemperature"
  84. :min="50"
  85. :max="450"
  86. v-if="item.deviceType == 'WKDLT'"
  87. />
  88. <span
  89. v-if="item.deviceType == 'WKDLT'"
  90. style="
  91. position: absolute;
  92. right: 345px;
  93. z-index: 2;
  94. margin-bottom: 1px;
  95. font-size: 16px;
  96. color: black !important;
  97. "
  98. >℃</span
  99. >
  100. <el-button
  101. class="ces"
  102. type="primary"
  103. style="position: absolute; right: 180px; z-index: 2"
  104. v-if="item.deviceType == 'WKDLT'"
  105. @click.stop="setTipTemperature"
  106. :disabled="tipTemperatureDisabled"
  107. >设置温度</el-button
  108. >
  109. <!-- WKDLT -->
  110. <el-button
  111. class="ces"
  112. type="primary"
  113. style="position: absolute; right: 60px; z-index: 2"
  114. v-if="item.deviceType != 'FJDJC'"
  115. @click.stop="
  116. startTest(item.deviceName, item.deviceNo, item.deviceType)
  117. "
  118. :disabled="
  119. (item.deviceType == 'DDLSD' && !taskValue) || btnDisabled
  120. "
  121. >开始检测</el-button
  122. >
  123. </template>
  124. <el-table
  125. :data="tableData[index]"
  126. v-if="item.deviceType != 'FJDJC'"
  127. border
  128. >
  129. <el-table-column
  130. v-for="str in configeObj(materialsData[index].deviceType)"
  131. :key="str"
  132. :prop="str"
  133. :label="showLable(str)"
  134. >
  135. <template #default="{ row }">
  136. <div v-if="!row.updateStatus">
  137. {{ row.data[str] }}
  138. </div>
  139. <div v-else>
  140. <el-input v-model="tableData[index][row.index].data[str]" />
  141. </div>
  142. </template>
  143. </el-table-column>
  144. <el-table-column prop="created" label="采集时间" width="230px">
  145. <template #default="{ row }">
  146. <div v-if="!row.updateStatus">
  147. {{ row.created }}
  148. </div>
  149. <div v-else>
  150. <el-input v-model="tableData[index][row.index].created" />
  151. </div>
  152. </template>
  153. </el-table-column>
  154. <el-table-column label="操作" min-width="150px" fixed="right">
  155. <template #default="scope">
  156. <span
  157. class="opear"
  158. v-if="scope.row.updateStatus || scope.row.addStatus"
  159. @click="toSuccess(index, scope.$index)"
  160. >完成</span
  161. >
  162. <span class="opear" v-else @click="toDelete(index, scope.$index)"
  163. >删除</span
  164. >
  165. <span
  166. class="opear"
  167. v-if="scope.row.updateStatus || scope.row.addStatus"
  168. @click="toCancel(index, scope.$index)"
  169. >取消</span
  170. ><span class="opear" v-else @click="toEdit(index, scope.$index)"
  171. >编辑</span
  172. >
  173. </template>
  174. </el-table-column>
  175. </el-table>
  176. <Pagination
  177. v-if="item.deviceType != 'FJDJC'"
  178. v-model:limit="pageS[index].pageSize"
  179. v-model:page="pageS[index].pageNo"
  180. :total="pageS[index].total"
  181. @pagination="paginationChange(index)"
  182. position="right"
  183. />
  184. </el-collapse-item>
  185. </el-collapse>
  186. </div>
  187. </template>
  188. <script setup>
  189. import {
  190. getScrewdriverData,
  191. getAcquisitionData,
  192. addAcquisitionData,
  193. updateAcquisitionData,
  194. delAcquisitionData,
  195. getTaskList,
  196. startData,
  197. setUpData,
  198. setUpData1,
  199. } from "@/api/prosteps/screwdriver";
  200. import { useProcessStore } from "@/store";
  201. import { useDictionaryStore } from "@/store";
  202. import { emitter, EventsNames } from "@/utils/common";
  203. defineOptions({
  204. name: "Screwdriver",
  205. });
  206. const dictS = useDictionaryStore();
  207. const store = useProcessStore();
  208. const tipTemperature = ref(50);
  209. const tipTemperatureDisabled = ref(false);
  210. const setTipTemperature = async () => {
  211. try {
  212. tipTemperatureDisabled.value = true;
  213. const { code } = await setUpData1({ tipTemperature: tipTemperature.value });
  214. if (code == "200") {
  215. ElMessage.success("设置成功!");
  216. }
  217. } catch (e) {
  218. } finally {
  219. setTimeout(() => {
  220. tipTemperatureDisabled.value = false;
  221. }, 5000);
  222. }
  223. };
  224. const changeTask = () => {
  225. setDiabledStatus.value = false;
  226. };
  227. const setDiabledStatus = ref(false);
  228. const tableData = ref([]);
  229. const materialsData = ref([]);
  230. const router = useRouter();
  231. const taskValue = ref("");
  232. const taskId = ref("1");
  233. const btnDisabled = ref(false);
  234. const toStartData = async (data) => {
  235. try {
  236. btnDisabled.value = true;
  237. const { code } = await startData(data);
  238. if (code == "200") {
  239. ElMessage.success("开始检测....");
  240. }
  241. } catch (e) {
  242. } finally {
  243. setTimeout(() => {
  244. btnDisabled.value = false;
  245. }, 3000);
  246. }
  247. };
  248. const toStartData1 = async (data) => {
  249. try {
  250. btnDisabled.value = true;
  251. const { code } = await setUpData(data);
  252. if (code == "200") {
  253. ElMessage.success("设置成功!");
  254. setDiabledStatus.value = true;
  255. }
  256. } catch (e) {
  257. } finally {
  258. setTimeout(() => {
  259. btnDisabled.value = false;
  260. }, 3000);
  261. }
  262. };
  263. const getTask = async () => {
  264. let params = {
  265. operationCode: store.processInfo.operationCode,
  266. materialNo: store.scanInfo.materialCode,
  267. };
  268. const { data } = await getTaskList(params);
  269. options.value = [];
  270. data.forEach((item) => {
  271. options.value.push({
  272. value: item.id,
  273. label: item.taskName,
  274. });
  275. });
  276. };
  277. const options = ref([]);
  278. const options2 = ref([
  279. { value: "1", label: "任务0" },
  280. { value: "2", label: "任务1" },
  281. { value: "3", label: "任务2" },
  282. { value: "4", label: "任务3" },
  283. { value: "5", label: "任务4" },
  284. { value: "6", label: "任务5" },
  285. { value: "7", label: "任务6" },
  286. { value: "8", label: "任务7" },
  287. ]);
  288. const startTest = (a, b, c) => {
  289. let obj = {
  290. deviceName: a,
  291. deviceNo: b,
  292. deviceType: c,
  293. operationId: store.scanInfo.operationId,
  294. operationName: store.processInfo.operationName,
  295. processId: store.scanInfo.id,
  296. seqNo: store.useSeqNo,
  297. workOrderCode: store.odersData.workOrderCode,
  298. taskId: taskValue.value,
  299. smallTaskId: taskId.value,
  300. };
  301. toStartData(obj);
  302. };
  303. const startTest1 = (a, b, c) => {
  304. let obj = {
  305. deviceName: a,
  306. deviceNo: b,
  307. deviceType: c,
  308. operationId: store.scanInfo.operationId,
  309. operationName: store.processInfo.operationName,
  310. processId: store.scanInfo.id,
  311. seqNo: store.useSeqNo,
  312. workOrderCode: store.odersData.workOrderCode,
  313. taskId: taskValue.value,
  314. smallTaskId: taskId.value,
  315. };
  316. toStartData1(obj);
  317. };
  318. const showLable = (key) => {
  319. switch (key) {
  320. case "tipTemperature":
  321. return "温度";
  322. case "CH5Val":
  323. return "温度";
  324. case "CH6Val":
  325. return "湿度";
  326. case "DataTimes":
  327. return "采集时间";
  328. case "torquetarget":
  329. return "当前任务目标扭力";
  330. case "tightenTorqueMax":
  331. return "拧紧过程中最大扭力值";
  332. case "taskNo":
  333. return "当前任务号";
  334. case "taskName":
  335. return "任务名";
  336. case "warning":
  337. return "警报";
  338. case "tightenResult":
  339. return "最终拧紧结果";
  340. case "totalCycles":
  341. return "总圈数";
  342. case "length":
  343. return "长度";
  344. case "height":
  345. return "高度";
  346. case "DDLSD1":
  347. return "拧紧的模式";
  348. case "DDLSD2":
  349. return "拧紧旋转方向";
  350. case "DDLSD3":
  351. return "目标扭力";
  352. case "DDLSD4":
  353. return "扭力保持时间";
  354. case "DDLSD5":
  355. return "浮高界定圈数";
  356. case "DDLSD6":
  357. return "滑牙界定圈数";
  358. case "DDLSD7":
  359. return "触发速度切换的扭力比值";
  360. case "DDLSD8":
  361. return "扭力补偿值";
  362. case "DDLSD9":
  363. return "开启浮高滑牙检测";
  364. case "DDLSD10":
  365. return "触发速度切换的扭力";
  366. case "DDLSD11":
  367. return "触发速度切换的速度比值";
  368. case "DDLSD12":
  369. return "扭力偏差上限";
  370. case "DDLSD13":
  371. return "扭力偏差下限";
  372. case "DDLSD14":
  373. return "扭力免检圈数";
  374. case "DDLSD15":
  375. return "拧松有效触发的扭力阀值";
  376. case "DDLSD16":
  377. return "拧松有效触发的保持时间";
  378. case "DDLSD17":
  379. return "自由旋转方向";
  380. case "DDLSD18":
  381. return "STEP-00拧紧圈数";
  382. case "DDLSD19":
  383. return "STEP-00拧紧速度";
  384. case "DDLSD20":
  385. return "STEP-01拧紧圈数";
  386. case "DDLSD21":
  387. return "STEP-01拧紧速度";
  388. case "DDLSD22":
  389. return "STEP-02拧紧圈数";
  390. case "DDLSD23":
  391. return "STEP-02拧紧速度";
  392. case "DDLSD24":
  393. return "STEP-03拧紧圈数";
  394. case "DDLSD25":
  395. return "STEP-03拧紧速度";
  396. case "DDLSD26":
  397. return "STEP-04拧紧圈数";
  398. case "DDLSD27":
  399. return "STEP-04拧紧速度";
  400. case "DDLSD28":
  401. return "STEP-00拧松圈数";
  402. case "DDLSD29":
  403. return "STEP-00拧松速度";
  404. case "DDLSD30":
  405. return "STEP-01拧松圈数";
  406. case "DDLSD31":
  407. return "STEP-01拧松速度";
  408. case "DDLSD32":
  409. return "STEP-02拧松圈数";
  410. case "DDLSD33":
  411. return "STEP-02拧松速度";
  412. case "DDLSD34":
  413. return "STEP-00自由圈数";
  414. case "DDLSD35":
  415. return "STEP-00自由速度";
  416. default:
  417. return key;
  418. }
  419. };
  420. const toEdit = (index, rowIndex) => {
  421. tableData.value[index][rowIndex].updateStatus = true;
  422. };
  423. const toDelete = async (index, rowIndex) => {
  424. const no = tableData.value[index][rowIndex].deviceNo;
  425. const { code } = await delAcquisitionData({
  426. id: tableData.value[index][rowIndex].id,
  427. });
  428. if (code == "200") {
  429. ElMessage.success("操作成功!");
  430. setAcquisitionDatas(no, index);
  431. }
  432. };
  433. const toSuccess = (index, rowIndex) => {
  434. if (tableData.value[index][rowIndex].addStatus == true) {
  435. addInfo(index, rowIndex);
  436. } else {
  437. editInfo(index, rowIndex);
  438. }
  439. };
  440. const addInfo = async (index, rowIndex) => {
  441. const { code } = await addAcquisitionData({
  442. ...tableData.value[index][rowIndex],
  443. data: JSON.stringify(tableData.value[index][rowIndex].data),
  444. });
  445. if (code == "200") {
  446. ElMessage.success("操作成功!");
  447. tableData.value[index][rowIndex].addStatus = false;
  448. tableData.value[index][rowIndex].updateStatus = false;
  449. }
  450. };
  451. const editInfo = async (index, rowIndex) => {
  452. const { code } = await updateAcquisitionData({
  453. ...tableData.value[index][rowIndex],
  454. data: JSON.stringify(tableData.value[index][rowIndex].data),
  455. });
  456. if (code == "200") {
  457. ElMessage.success("操作成功!");
  458. tableData.value[index][rowIndex].updateStatus = false;
  459. }
  460. };
  461. const toCancel = (index, rowIndex) => {
  462. if (tableData.value[index][rowIndex].addStatus == true) {
  463. tableData.value[index].splice(rowIndex, 1);
  464. } else {
  465. tableData.value[index][rowIndex].updateStatus = false;
  466. tableData.value[index][rowIndex].data = JSON.parse(
  467. tableData.value[index][rowIndex].resdata
  468. );
  469. }
  470. };
  471. //根据类型返横列字段
  472. const configeObj = (type) => {
  473. switch (type) {
  474. //温湿度
  475. case "WXDJC":
  476. return ["CH5Val", "CH6Val"];
  477. case "YBKC":
  478. return ["length"];
  479. case "GDC":
  480. return ["height"];
  481. case "WKDLT":
  482. return ["tipTemperature"];
  483. //电动螺丝刀
  484. case "DDLSD":
  485. return [
  486. "taskName",
  487. "taskNo",
  488. "tightenResult",
  489. "totalCycles",
  490. "torquetarget",
  491. "tightenTorqueMax",
  492. "warning",
  493. ];
  494. default:
  495. return ["数据1", "数据2", "数据3"];
  496. }
  497. };
  498. const addItem = (no, name, type, index) => {
  499. let data = {};
  500. switch (type) {
  501. case "WXDJC":
  502. data = { CH5Val: "", CH6Val: "", DataTimes: "" };
  503. break;
  504. case "YBCK":
  505. data = { CH5Val: "", CH6Val: "", DataTimes: "" };
  506. break;
  507. case "WKDLT":
  508. data = { temperature: "" };
  509. break;
  510. case "GDC":
  511. data = { CH5Val: "", CH6Val: "", DataTimes: "" };
  512. break;
  513. case "DDLSD":
  514. data = {
  515. DDLSD1: "",
  516. DDLSD2: "",
  517. DDLSD3: "",
  518. DDLSD4: "",
  519. DDLSD5: "",
  520. DDLSD6: "",
  521. DDLSD7: "",
  522. DDLSD8: "",
  523. DDLSD9: "",
  524. DDLSD10: "",
  525. DDLSD11: "",
  526. DDLSD12: "",
  527. DDLSD13: "",
  528. DDLSD14: "",
  529. DDLSD15: "",
  530. DDLSD16: "",
  531. DDLSD17: "",
  532. DDLSD18: "",
  533. DDLSD19: "",
  534. DDLSD20: "",
  535. DDLSD21: "",
  536. DDLSD22: "",
  537. DDLSD23: "",
  538. DDLSD24: "",
  539. DDLSD25: "",
  540. DDLSD26: "",
  541. DDLSD27: "",
  542. DDLSD28: "",
  543. DDLSD29: "",
  544. DDLSD30: "",
  545. DDLSD31: "",
  546. DDLSD32: "",
  547. DDLSD33: "",
  548. DDLSD34: "",
  549. DDLSD35: "",
  550. };
  551. break;
  552. }
  553. tableData.value[index].push({
  554. deviceNo: no,
  555. deviceName: name,
  556. deviceType: type,
  557. data: data,
  558. operationId: store.odersData.operationId,
  559. operationName: store.processInfo.operationName,
  560. processId: store.scanInfo.id,
  561. seqNo: store.scanInfo.seqNo,
  562. workOrderCode: store.odersData.workOrderCode,
  563. index: tableData.value[index].length,
  564. addStatus: true,
  565. updateStatus: true,
  566. });
  567. };
  568. const tableKey = ref(false);
  569. const getData = async () => {
  570. const res = await getScrewdriverData();
  571. materialsData.value = res.data;
  572. materialsData.value.forEach((item, index) => {
  573. pageS.value.push({ ...page });
  574. getAcquisitionDatas(item.deviceNo, index);
  575. });
  576. };
  577. const paginationChange = (index1) => {
  578. materialsData.value.forEach((item, index) => {
  579. if (index == index1) {
  580. setAcquisitionDatas(item.deviceNo, index);
  581. }
  582. });
  583. };
  584. const getAcquisitionDatas = async (No, index) => {
  585. const res = await getAcquisitionData({
  586. deviceNo: No,
  587. operationId: store.odersData.operationId,
  588. pageNo: pageS.value[index].pageNo,
  589. pageSize: pageS.value[index].pageSize,
  590. processId: store.scanInfo.id,
  591. });
  592. pageS.value[index].total = res.data.totalCount;
  593. res.data.records.forEach((item, index) => {
  594. item.resdata = item.data;
  595. item.data = JSON.parse(item.data);
  596. item.updateStatus = false;
  597. item.index = index;
  598. });
  599. tableData.value[index] = res.data.records;
  600. };
  601. const setAcquisitionDatas = async (No, index) => {
  602. const res = await getAcquisitionData({
  603. deviceNo: No,
  604. operationId: store.odersData.operationId,
  605. pageNo: pageS.value[index].pageNo,
  606. pageSize: pageS.value[index].pageSize,
  607. processId: store.scanInfo.id,
  608. });
  609. pageS.value[index].total = res.data.totalCount;
  610. res.data.records.forEach((item, index) => {
  611. item.resdata = item.data;
  612. item.data = JSON.parse(item.data);
  613. item.updateStatus = false;
  614. item.index = index;
  615. });
  616. tableData.value[index] = res.data.records;
  617. };
  618. const DDLSDTableData = ref([]);
  619. const pageS = ref([]);
  620. const page = {
  621. pageSize: 10,
  622. pageNo: 1,
  623. total: 0,
  624. };
  625. onMounted(async () => {
  626. await getData();
  627. getTask();
  628. });
  629. emitter.on(EventsNames.GETDATA_DDLSD, (name) => {
  630. materialsData.value.forEach((item, index) => {
  631. if (item.deviceType == "DDLSD" && item.deviceNo == name) {
  632. setAcquisitionDatas(item.deviceNo, index);
  633. }
  634. });
  635. });
  636. emitter.on(EventsNames.GETDATA_YBKC, (name) => {
  637. materialsData.value.forEach((item, index) => {
  638. if (item.deviceType == "YBKC" && item.deviceNo == name) {
  639. setAcquisitionDatas(item.deviceNo, index);
  640. }
  641. });
  642. });
  643. emitter.on(EventsNames.GETDATA_GDC, (name) => {
  644. materialsData.value.forEach((item, index) => {
  645. if (item.deviceType == "GDC" && item.deviceNo == name) {
  646. setAcquisitionDatas(item.deviceNo, index);
  647. }
  648. });
  649. });
  650. emitter.on(EventsNames.GETDATA_WKDLT, (name) => {
  651. materialsData.value.forEach((item, index) => {
  652. if (item.deviceType == "WKDLT" && item.deviceNo == name) {
  653. setAcquisitionDatas(item.deviceNo, index);
  654. }
  655. });
  656. });
  657. </script>
  658. <style lang="scss" scoped>
  659. :deep(.el-collapse-item) {
  660. }
  661. :deep(.el-collapse-item__wrap) {
  662. background-color: black;
  663. }
  664. .diviceName {
  665. color: var(--ohos-text);
  666. }
  667. .ces {
  668. font-size: 18px;
  669. height: 40px;
  670. }
  671. .containerBox {
  672. padding: 20px;
  673. border-radius: 16px !important;
  674. overflow: hidden;
  675. }
  676. :deep(.el-collapse-item__header) {
  677. background-color: var(--ohos-box-bg) !important;
  678. padding: 0 20px;
  679. height: 80px;
  680. }
  681. :deep(.el-badge) {
  682. font-size: $f24;
  683. }
  684. :deep(.el-collapse-item__header) {
  685. font-size: $f24;
  686. }
  687. :deep(.el-pagination) {
  688. span {
  689. font-weight: 600 !important;
  690. }
  691. }
  692. :deep(.el-collapse-item__wrap) {
  693. padding: 20px;
  694. border: 1px solid var(--ohos-box-bg);
  695. }
  696. .opear {
  697. font-size: 16px;
  698. margin-right: 5px;
  699. cursor: pointer;
  700. }
  701. .round {
  702. width: 20px;
  703. height: 20px;
  704. border-radius: 10px;
  705. background-color: red;
  706. }
  707. .green {
  708. background-color: green;
  709. }
  710. </style>