homepage.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  1. if(document.getElementById('kqtj') != null){
  2. var myChart1 = echarts.init(document.getElementById('kqtj'),'walden');
  3. }
  4. if(document.getElementById('gztj') != null){
  5. var myChart2 = echarts.init(document.getElementById('gztj'),'walden');
  6. }
  7. if(document.getElementById('rytj') != null){
  8. var myChart3 = echarts.init(document.getElementById('rytj'),'walden');
  9. }
  10. if(document.getElementById('jbtj')!= null){
  11. var myChart4 = echarts.init(document.getElementById('jbtj'),'walden');
  12. }
  13. if(document.getElementById('gwrl') != null){
  14. var myChart5 = echarts.init(document.getElementById('gwrl'),'walden');
  15. }
  16. //考勤调整时长
  17. if(document.getElementById('kqtzsc') != null){
  18. var myChart6 = echarts.init(document.getElementById('kqtzsc'),'walden');
  19. }
  20. //考勤调整次数
  21. if(document.getElementById('kqtzcs') != null){
  22. var myChart7 = echarts.init(document.getElementById('kqtzcs'),'walden');
  23. }
  24. window.onresize = function(){
  25. location.reload();
  26. }
  27. $(function() {
  28. $(document).ready(function() {
  29. attendanceStatssearch();
  30. var count = $(".board-def .chk .chked").length;
  31. var licount = $(".board-def").length;
  32. if(count == licount){
  33. $(".all-opr .chk").html('<span class="chked"></span>');
  34. }
  35. });
  36. });
  37. function attendanceStatssearch(){
  38. if(document.getElementById('kqtj') != null){
  39. handleAjaxSimple("attendanceStatsController.do?attendanceStatsData", $("#statsForm").serialize(), attendhandleSuccess);
  40. }
  41. if(document.getElementById('gztj') != null){
  42. handleAjaxSimple("wageStatsController.do?wageStatsData", $("#statsForm").serialize(), wagehandleSuccess);
  43. }
  44. if(document.getElementById('rytj') != null){
  45. handleAjaxSimple("userStatsController.do?userStatsData", $("#statsForm").serialize(), userhandleSuccess);
  46. }
  47. if(document.getElementById('jbtj')!= null){
  48. handleAjaxSimple("overtimeStatsController.do?overtimeStatsData", $("#statsForm").serialize(), overtimehandleSuccess);
  49. }
  50. if(document.getElementById('gwrl') != null){
  51. handleAjaxSimple("distributionStatsController.do?distributionStatsData", $("#statsForm").serialize(), distributionhandleSuccess);
  52. }
  53. //考勤调整排行统计看板
  54. if(document.getElementById('kqtzsc') != null){
  55. handleAjaxSimple("desktopRptController.do?getKaoQinTiaoZhengTime", $("#statsForm").serialize(), kaoqinTiaoZhengTimehandleSuccess);
  56. }
  57. //考勤调整次数排行看板
  58. if(document.getElementById('kqtzcs') != null){
  59. handleAjaxSimple("desktopRptController.do?getKaoQinTiaoZhengCount", $("#statsForm").serialize(), kaoqinTiaoZhengCounthandleSuccess);
  60. }
  61. }
  62. /**
  63. * 考勤统计
  64. * @param data
  65. */
  66. function attendhandleSuccess(data){
  67. if(data.cdata.noData){
  68. $("#kqtj").hide();
  69. $("#kqtjerr").show();
  70. }else{
  71. $("#kqtj").show();
  72. $("#kqtjerr").hide();
  73. option = {
  74. color: ['#3398DB'],
  75. tooltip: {
  76. trigger: 'axis'
  77. },
  78. grid:{
  79. left: '3%',
  80. right: '4%',
  81. bottom: '3%',
  82. containLabel: true
  83. },
  84. legend: {
  85. data:[],
  86. width:'90%',
  87. left:'center'
  88. },
  89. xAxis:
  90. {
  91. type: 'category',
  92. data: [],
  93. axisLabel: {
  94. interval: 0,
  95. formatter:function(value)
  96. {
  97. var ret = "";//拼接加\n返回的类目项
  98. var maxLength = 1;//每项显示文字个数
  99. var valLength = value.length;//X轴类目项的文字个数
  100. var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  101. if (rowN > 1)//如果类目项的文字大于3,
  102. {
  103. for (var i = 0; i < rowN; i++) {
  104. var temp = "";//每次截取的字符串
  105. var start = i * maxLength;//开始截取的位置
  106. var end = start + maxLength;//结束截取的位置
  107. //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
  108. temp = value.substring(start, end) + "\n";
  109. ret += temp; //凭借最终的字符串
  110. }
  111. return ret;
  112. }
  113. else {
  114. return value;
  115. }
  116. }
  117. }
  118. },
  119. yAxis: [
  120. {
  121. type: 'value',
  122. name:'出勤率(%)',
  123. axisLabel: {
  124. show: true,
  125. interval: 'auto',
  126. formatter: function (value, index) {
  127. return value+"%";
  128. }
  129. //formatter: '{value} '
  130. }
  131. }
  132. ],
  133. dataZoom: [
  134. {
  135. type: 'inside',
  136. start: 0,
  137. end: 100
  138. }
  139. ],
  140. series: [
  141. {
  142. name:'',
  143. type:'bar',
  144. data:[]
  145. }
  146. ]
  147. };
  148. myChart1.clear();
  149. option.xAxis.data = data.cdata.xAxisData;
  150. option.series = data.cdata.series;
  151. myChart1.setOption(option);
  152. myChart1.resize();
  153. }
  154. }
  155. /**
  156. * 工资统计
  157. * @param data
  158. */
  159. function wagehandleSuccess(data){
  160. if(data.cdata.noData){
  161. $("#gztj").hide();
  162. $("#gztjerr").show();
  163. }else{
  164. $("#gztj").show();
  165. $("#gztjerr").hide();
  166. option = {
  167. color: ['#3398DB'],
  168. tooltip: {
  169. trigger: 'axis'
  170. },
  171. grid:{
  172. left: '3%',
  173. right: '4%',
  174. bottom: '3%',
  175. containLabel: true
  176. },
  177. legend: {
  178. data:[],
  179. width:'90%',
  180. left:'center'
  181. },
  182. xAxis:
  183. {
  184. type: 'category',
  185. data: [],
  186. axisLabel: {
  187. interval: 0,
  188. formatter:function(value)
  189. {
  190. var ret = "";//拼接加\n返回的类目项
  191. var maxLength = 1;//每项显示文字个数
  192. var valLength = value.length;//X轴类目项的文字个数
  193. var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  194. if (rowN > 1)//如果类目项的文字大于3,
  195. {
  196. for (var i = 0; i < rowN; i++) {
  197. var temp = "";//每次截取的字符串
  198. var start = i * maxLength;//开始截取的位置
  199. var end = start + maxLength;//结束截取的位置
  200. //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
  201. temp = value.substring(start, end) + "\n";
  202. ret += temp; //凭借最终的字符串
  203. }
  204. return ret;
  205. }
  206. else {
  207. return value;
  208. }
  209. }
  210. }
  211. },
  212. yAxis: [
  213. {
  214. type: 'value',
  215. name:'工资支出总金额(元)'
  216. }
  217. ],
  218. dataZoom: [
  219. {
  220. type: 'inside',
  221. start: 0,
  222. end: 100
  223. }
  224. ],
  225. series: [
  226. {
  227. name:'',
  228. type:'bar',
  229. data:[]
  230. }
  231. ]
  232. };
  233. myChart2.clear();
  234. option.xAxis.data = data.cdata.xAxisData;
  235. option.series = data.cdata.series;
  236. myChart2.setOption(option);
  237. myChart2.resize();
  238. }
  239. }
  240. /**
  241. * 考勤调整时长排行榜
  242. * @param data
  243. */
  244. function kaoqinTiaoZhengTimehandleSuccess(data){
  245. if(data.cdata.noData){
  246. $("#kqtzsc").hide();
  247. $("#kqtzscerr").show();
  248. }else{
  249. $("#kqtzsc").show();
  250. $("#kqtzscerr").hide();
  251. option = {
  252. color: ['#3398DB'],
  253. tooltip: {
  254. trigger: 'axis'
  255. },
  256. grid:{
  257. left: '3%',
  258. right: '4%',
  259. bottom: '1%',
  260. containLabel: true
  261. },
  262. legend: {
  263. data:[],
  264. width:'90%',
  265. left:'center'
  266. },
  267. xAxis:
  268. {
  269. type: 'category',
  270. data: [],
  271. axisLabel: {
  272. interval: 0,
  273. formatter:function(value)
  274. {
  275. var ret = "";//拼接加\n返回的类目项
  276. var maxLength = 1;//每项显示文字个数
  277. var valLength = value.length;//X轴类目项的文字个数
  278. var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  279. if (rowN > 1)//如果类目项的文字大于3,
  280. {
  281. for (var i = 0; i < rowN; i++) {
  282. var temp = "";//每次截取的字符串
  283. var start = i * maxLength;//开始截取的位置
  284. var end = start + maxLength;//结束截取的位置
  285. //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
  286. temp = value.substring(start, end) + "\n";
  287. ret += temp; //凭借最终的字符串
  288. }
  289. return ret;
  290. }
  291. else {
  292. return value;
  293. }
  294. }
  295. }
  296. },
  297. yAxis: [
  298. {
  299. type: 'value',
  300. name:'考勤调整时长(分钟)'
  301. }
  302. ],
  303. dataZoom: [
  304. {
  305. type: 'inside',
  306. start: 0,
  307. end: 100
  308. }
  309. ],
  310. series: [
  311. {
  312. name:'',
  313. type:'bar',
  314. data:[]
  315. }
  316. ]
  317. };
  318. myChart6.clear();
  319. option.xAxis.data = data.cdata.xAxisData;
  320. option.series = data.cdata.series;
  321. myChart6.setOption(option);
  322. myChart6.resize();
  323. }
  324. }
  325. /**
  326. * 考勤调整时长排行榜
  327. * @param data
  328. */
  329. function kaoqinTiaoZhengCounthandleSuccess(data){
  330. if(data.cdata.noData){
  331. $("#kqtzcs").hide();
  332. $("#kqtzcserr").show();
  333. }else{
  334. $("#kqtzcs").show();
  335. $("#kqtzcserr").hide();
  336. option = {
  337. color: ['#3398DB'],
  338. tooltip: {
  339. trigger: 'axis'
  340. },
  341. grid:{
  342. left: '3%',
  343. right: '4%',
  344. bottom: '1%',
  345. containLabel: true
  346. },
  347. legend: {
  348. data:[],
  349. width:'90%',
  350. left:'center'
  351. },
  352. xAxis:
  353. {
  354. type: 'category',
  355. data: [],
  356. axisLabel: {
  357. interval: 0,
  358. formatter:function(value)
  359. {
  360. var ret = "";//拼接加\n返回的类目项
  361. var maxLength = 1;//每项显示文字个数
  362. var valLength = value.length;//X轴类目项的文字个数
  363. var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  364. if (rowN > 1)//如果类目项的文字大于3,
  365. {
  366. for (var i = 0; i < rowN; i++) {
  367. var temp = "";//每次截取的字符串
  368. var start = i * maxLength;//开始截取的位置
  369. var end = start + maxLength;//结束截取的位置
  370. //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
  371. temp = value.substring(start, end) + "\n";
  372. ret += temp; //凭借最终的字符串
  373. }
  374. return ret;
  375. }
  376. else {
  377. return value;
  378. }
  379. }
  380. }
  381. },
  382. yAxis: [
  383. {
  384. type: 'value',
  385. name:'考勤调整次数(次)'
  386. }
  387. ],
  388. dataZoom: [
  389. {
  390. type: 'inside',
  391. start: 0,
  392. end: 100
  393. }
  394. ],
  395. series: [
  396. {
  397. name:'',
  398. type:'bar',
  399. data:[]
  400. }
  401. ]
  402. };
  403. myChart7.clear();
  404. option.xAxis.data = data.cdata.xAxisData;
  405. option.series = data.cdata.series;
  406. myChart7.setOption(option);
  407. myChart7.resize();
  408. }
  409. }
  410. /**
  411. * 人员统计
  412. * @param data
  413. */
  414. function userhandleSuccess(data){
  415. if(data.cdata.noData){
  416. $("#rytj").hide();
  417. $("#rytjerr").show();
  418. }else{
  419. $("#rytj").show();
  420. $("#rytjerr").hide();
  421. option = {
  422. color: ['#3398DB'],
  423. tooltip: {
  424. trigger: 'axis'
  425. },
  426. grid:{
  427. left: '3%',
  428. right: '4%',
  429. bottom: '3%',
  430. containLabel: true
  431. },
  432. legend: {
  433. data:[],
  434. width:'90%',
  435. left:'center'
  436. },
  437. xAxis:
  438. {
  439. type: 'category',
  440. data: [],
  441. axisLabel: {
  442. interval: 0,
  443. formatter:function(value)
  444. {
  445. var ret = "";//拼接加\n返回的类目项
  446. var maxLength = 1;//每项显示文字个数
  447. var valLength = value.length;//X轴类目项的文字个数
  448. var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  449. if (rowN > 1)//如果类目项的文字大于3,
  450. {
  451. for (var i = 0; i < rowN; i++) {
  452. var temp = "";//每次截取的字符串
  453. var start = i * maxLength;//开始截取的位置
  454. var end = start + maxLength;//结束截取的位置
  455. //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
  456. temp = value.substring(start, end) + "\n";
  457. ret += temp; //凭借最终的字符串
  458. }
  459. return ret;
  460. }
  461. else {
  462. return value;
  463. }
  464. }
  465. }
  466. },
  467. yAxis: [
  468. {
  469. type: 'value',
  470. name:'员工流动比例(%)',
  471. axisLabel: {
  472. show: true,
  473. interval: 'auto',
  474. formatter: function (value, index) {
  475. return value+"%";
  476. }
  477. //formatter: '{value} '
  478. }
  479. }
  480. ],
  481. dataZoom: [
  482. {
  483. type: 'inside',
  484. start: 0,
  485. end: 100
  486. }
  487. ],
  488. series: [
  489. {
  490. name:'',
  491. type:'bar',
  492. data:[]
  493. }
  494. ]
  495. };
  496. myChart3.clear();
  497. option.xAxis.data = data.cdata.xAxisData;
  498. option.series = data.cdata.series;
  499. myChart3.setOption(option);
  500. myChart3.resize();
  501. }
  502. }
  503. /**
  504. * 加班统计
  505. * @param data
  506. */
  507. function overtimehandleSuccess(data){
  508. if(data.cdata.noData){
  509. $("#jbtj").hide();
  510. $("#jbtjerr").show();
  511. }else{
  512. $("#jbtj").show();
  513. $("#jbtjerr").hide();
  514. option = {
  515. tooltip: {
  516. trigger: 'axis'
  517. },
  518. grid:{
  519. left: '3%',
  520. right: '4%',
  521. bottom: '3%',
  522. containLabel: true
  523. },
  524. legend: {
  525. data:['加班工时(H)','加班费用(元)'],
  526. width:'90%',
  527. left:'left'
  528. },
  529. xAxis:
  530. {
  531. type: 'category',
  532. data: [],
  533. axisLabel: {
  534. interval: 0,
  535. formatter:function(value)
  536. {
  537. var ret = "";//拼接加\n返回的类目项
  538. var maxLength = 1;//每项显示文字个数
  539. var valLength = value.length;//X轴类目项的文字个数
  540. var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
  541. if (rowN > 1)//如果类目项的文字大于3,
  542. {
  543. for (var i = 0; i < rowN; i++) {
  544. var temp = "";//每次截取的字符串
  545. var start = i * maxLength;//开始截取的位置
  546. var end = start + maxLength;//结束截取的位置
  547. //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
  548. temp = value.substring(start, end) + "\n";
  549. ret += temp; //凭借最终的字符串
  550. }
  551. return ret;
  552. }
  553. else {
  554. return value;
  555. }
  556. }
  557. }
  558. },
  559. yAxis: [
  560. {
  561. type: 'value',
  562. name:'加班工时(H)',
  563. axisLabel: {
  564. formatter: '{value} H'
  565. }
  566. },
  567. {
  568. type: 'value',
  569. name:'加班费用(元)',
  570. axisLabel: {
  571. formatter: '{value}元'
  572. }
  573. }
  574. ],
  575. dataZoom: [
  576. {
  577. type: 'inside',
  578. start: 0,
  579. end: 100
  580. }
  581. ],
  582. series: [
  583. {
  584. name:'',
  585. type:'bar',
  586. data:[]
  587. }
  588. ]
  589. };
  590. myChart4.clear();
  591. option.xAxis.data = data.cdata.xAxisData;
  592. option.series = data.cdata.series;
  593. myChart4.setOption(option);
  594. myChart4.resize();
  595. }
  596. }
  597. /**
  598. * 岗位人力统计
  599. * @param data
  600. */
  601. function distributionhandleSuccess(data){
  602. if(data.cdata.noData){
  603. $("#gwrl").hide();
  604. $("#gwrl2").hide();
  605. $("#gwrlerr").show();
  606. }else{
  607. $("#gwrl").show();
  608. $("#gwrl2").show();
  609. $("#gwrlerr").hide();
  610. var centerArray = ['50%', '50%'];
  611. if(data.cdata.legend.length > 10){
  612. centerArray = ['70%', '50%'];
  613. }
  614. myChart5.clear();
  615. option = {
  616. tooltip: {
  617. trigger: 'item',
  618. formatter: "{a} <br/>{b}: {c} ({d}%)"
  619. },
  620. legend: {
  621. orient: 'vertical',
  622. x: 'left',
  623. right: '1px',
  624. bottom: '1%',
  625. top:'1%',
  626. data:data.cdata.legend
  627. },
  628. series: [
  629. {
  630. name:'',
  631. type:'pie',
  632. radius: ['50%', '70%'],
  633. center:centerArray,
  634. avoidLabelOverlap: false,
  635. label: {
  636. normal: {
  637. show: true,
  638. position:'center',
  639. formatter:function(){
  640. return ' TOTAL\r\n'+data.totalPeople
  641. },
  642. textStyle:{
  643. fontSize: '20',
  644. fontWeight: 'bold'
  645. }
  646. },
  647. emphasis: {
  648. show: false,
  649. textStyle: {
  650. fontSize: '20',
  651. fontWeight: 'bold'
  652. }
  653. }
  654. },
  655. labelLine: {
  656. normal: {
  657. show: false
  658. }
  659. },
  660. data:data.datamap
  661. }
  662. ]
  663. };
  664. if($("#peopleNum").val()==""){
  665. $("#peopleNum").val(data.totalPeople);
  666. }
  667. myChart5.setOption(option);
  668. myChart5.resize();
  669. handleAjaxSimple("distributionStatsController.do?distributionStatsProsData", $("#statsForm").serialize(), distributionProshandleSuccess);
  670. }
  671. }
  672. function distributionProshandleSuccess(data){
  673. var totalpeople = $("#peopleNum").val();
  674. var htmlStr="";
  675. $.each(data.projects, function(index, value, array) {
  676. var widthVal = value.peopleNum / totalpeople * 100 ;
  677. htmlStr +='<ul class="list-wrapper" onclick="queryProDistribution(\''+value.pid+'\')">';
  678. htmlStr +='<li class="pro-title">'+value.pName+'</li>';
  679. htmlStr +='<li class="pro-bar" style="width: '+widthVal+'%;"></li>';
  680. htmlStr +='</ul>';
  681. });
  682. $("#pros").html(htmlStr);
  683. }
  684. function queryProDistribution(pid){
  685. $("#pid").val(pid);
  686. handleAjaxSimple("distributionStatsController.do?distributionStatsData", $("#statsForm").serialize(), distributionhandleSuccess);
  687. }
  688. //var loadingimgstr = $('<div id="loadingimagediv"><img id="loadingimg" src="../img/zxLoading.gif" /><p style="margin-left: -34px;">数据加载中,请稍等...</p></div>');
  689. var loadingimgstr = "";
  690. var masklayerstr = $('<div id="masklayer"></div>');
  691. /**
  692. * ajax 共通模块
  693. * @param url 请求连接
  694. * @param data 请求实体
  695. * @param handleSuccess 成功后回调函数
  696. * @param handleError 失败后回调函数 可不传入
  697. * @param toggle 是否启用蒙版 默认值为true
  698. */
  699. function handleAjaxSimple(url, data, handleSuccess, handleError,toggle) {
  700. var divtoggleflag = true;
  701. if (undefined == toggle || true == toggle || $.isFunction(toggle)) {
  702. divtoggleflag = true;
  703. } else {
  704. divtoggleflag = false;
  705. }
  706. $.ajax({
  707. type : "post",
  708. url : url,
  709. data : data,
  710. dataType : "json",
  711. async : true,
  712. cache : false,
  713. beforeSend:function(){
  714. if(divtoggleflag)
  715. {
  716. //divtoggle(true);
  717. }
  718. },
  719. error: function(XMLHttpRequest, textStatus, errorThrown) {
  720. if($.isFunction(handleError))
  721. {
  722. handleError();
  723. }
  724. if(XMLHttpRequest.readyState==0){
  725. layer.alert("<br/><center>服务器连接异常,请稍后重试!</center>");
  726. }else{
  727. if(XMLHttpRequest.status==205){
  728. $.messager.confirm('提示', '<br/><center>登录超时,请重新登录</center>', function(ok) {
  729. if (ok) {
  730. window.location.reload();
  731. }
  732. });
  733. } else {
  734. layer.alert("<center>操作失败</center>");
  735. }
  736. }
  737. if(divtoggleflag)
  738. {
  739. //divtoggle(false);
  740. }
  741. },
  742. success : function(json) {
  743. handleSuccess(json);
  744. if(divtoggleflag)
  745. {
  746. //divtoggle(false);
  747. }
  748. }
  749. });
  750. }
  751. function divtoggle(isshow){
  752. if (isshow){
  753. loadingimgstr.appendTo("body").show();
  754. masklayerstr.appendTo("body").show();
  755. }else{
  756. loadingimgstr.remove();
  757. masklayerstr.remove();
  758. }
  759. }