report-wv.html 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel='stylesheet' href='../luckysheet/dist/plugins/plugins.css' />
  9. <link rel='stylesheet' href='../luckysheet/dist/plugins/css/pluginsCss.css' />
  10. <link rel='stylesheet' href='../luckysheet/dist/css/luckysheet.css' />
  11. <link rel='stylesheet' href='../luckysheet/dist/assets/iconfont/iconfont.css' />
  12. <link rel="stylesheet" href="../dist/css/layui.css">
  13. <style>
  14. .la-btn {
  15. position: absolute;
  16. left: 50%;
  17. bottom: 35px;
  18. transform: translate(-50%);
  19. padding: 0 2%;
  20. }
  21. .btn {
  22. width: 100%;
  23. }
  24. .layui-laypage-em {
  25. background-color: #1e9fff !important;
  26. }
  27. .model {
  28. width: 100%;
  29. height: 100%;
  30. background: rgba(0, 0, 0, 0.3);
  31. position: fixed;
  32. z-index: 9999;
  33. }
  34. .table-box {
  35. width: 300px;
  36. height: 300px;
  37. background: #ffffff;
  38. margin: auto;
  39. position: absolute;
  40. top: 0;
  41. left: 0;
  42. right: 0;
  43. bottom: 0;
  44. padding: 10px;
  45. overflow-y: auto;
  46. }
  47. .head {
  48. display: flex;
  49. justify-content: flex-end;
  50. font-size: 20px;
  51. font-weight: bold;
  52. color: #000000;
  53. }
  54. .cel {
  55. cursor: pointer;
  56. }
  57. #table {
  58. width: 100%;
  59. margin-top: 20px;
  60. font-size: 18px;
  61. }
  62. #table tr {
  63. width: 100%;
  64. height: 30px;
  65. }
  66. #table td {
  67. border-bottom: 1px solid #000000;
  68. border-top: 1px solid #000000;
  69. padding: 5px;
  70. }
  71. .layui-layer-title {
  72. text-align: center;
  73. font-size: 16px;
  74. padding: 0 81px;
  75. }
  76. .layui-layer{
  77. top:70 !important;
  78. }
  79. </style>
  80. </head>
  81. <body>
  82. <div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height:90%;left: 0px;top: 0px;">
  83. </div>
  84. <table id="demo" lay-filter="test"></table>
  85. <!-- <div class="model" style="display: none;">
  86. <div class="table-box">
  87. <div class="head"> -->
  88. <!-- <div>运行记录</div> -->
  89. <!-- <div class="cel">×</div>
  90. </div>
  91. <table id="table">
  92. <tr>
  93. <th>
  94. 运行内容
  95. </th>
  96. </tr>
  97. </table>
  98. </div>
  99. </div> -->
  100. <div class="la-btn">
  101. <button id="recordBtn" type="button" class="layui-btn layui-btn-normal layui-btn-sm btn">运行记录</button>
  102. </div>
  103. <script src="../jquery.min.js"></script>
  104. <script src="../dist/layui.js"></script>
  105. <script src="../luckysheet/dist/luckysheet.umd.js"></script>
  106. <script src="../luckysheet/dist/plugins/js/plugin.js"></script>
  107. <script src="./echarts.js"></script>
  108. <script src="./cqcyCode.js"></script>
  109. <script src="./canvertChart.js"></script>
  110. <!-- uni 的 SDK -->
  111. <script src="./wvIP.js"></script>
  112. <script src="./plugins/axios.min.js"></script>
  113. <script type="text/javascript" src="../luckysheet/dist/plugins/js/uni-webview-js0.0.3_index.js"></script>
  114. <script>
  115. $(function() {
  116. document.addEventListener('UniAppJSBridgeReady', function() {
  117. uni.getEnv(function(res) {
  118. console.log('当前环境:' + JSON.stringify(res));
  119. window.sessionName = 'device_report_index'
  120. sessionStorage.removeItem(window.sessionName)
  121. const id = window.location.search.split('?id=')[1]
  122. // const baseUrl = "http://192.168.0.40:8081"
  123. const baseUrl = window.location.origin
  124. axios.defaults.baseURL = baseUrl
  125. axios.get('/reportTable/getReportTableById?id=' + id).then(res => {
  126. console.log(res, 'res');
  127. const data = res.data
  128. if (data.code === 200) {
  129. // 报表数据
  130. let tableData = JSON.parse(data.data.reportTableData)
  131. let option = tableData.option
  132. // 基础数据项值
  133. let baseItem = tableData.baseItem
  134. // 数据项
  135. let reportTableItemList = data.data.reportTableItemList
  136. let reportChartList = data.data.reportChartList
  137. // 报表类型
  138. let reportTableType = data.data.reportTableType
  139. let luckysheetOption = {
  140. container: 'luckysheet', // 设定 DOM 容器的 id
  141. title: '报表模板', // 设定表格名称
  142. lang: 'zh', // 设定表格语言
  143. showinfobar: false, // 是否显示顶部信息栏
  144. showtoolbar: false, // 是否显示工具栏
  145. showtoolbarConfig: {
  146. paintFormat: true, //格式刷
  147. moreFormats: true, // 单元格格式
  148. font: true, // 字体
  149. fontSize: true, // 字号大小
  150. bold: true, // 粗体 (Ctrl+B)
  151. italic: true, // 斜体 (Ctrl+I)
  152. strikethrough: true, // 删除线 (Alt+Shift+5)
  153. underline: true, // 下划线 (Alt+Shift+6)
  154. textColor: true, // 文本颜色
  155. fillColor: true, // 单元格颜色
  156. border: true, // 边框
  157. mergeCell: true, // 合并单元格
  158. horizontalAlignMode: true, // 水平对齐方式
  159. verticalAlignMode: true, // 垂直对齐方式
  160. function: true, // 公式
  161. // image: true
  162. // chart: true
  163. },
  164. showsheetbar: false, // 是否显示底部 sheet 页按钮
  165. sheetFormulaBar: false, // 是否显示公式
  166. row: 120, // 是否显示底部 sheet 页按钮
  167. data: [{
  168. "name": "统计报表", //工作表名称
  169. }],
  170. cellRightClickConfig: { // 自定义配置单元格右击菜单
  171. copy: true, // 复制
  172. copyAs: false, // 复制为
  173. paste: true, // 粘贴
  174. insertRow: true, // 插入行
  175. insertColumn: true, // 插入列
  176. deleteRow: true, // 删除选中行
  177. deleteColumn: true, // 删除选中列
  178. deleteCell: false, // 删除单元格
  179. hideRow: false, // 隐藏选中行和显示选中行
  180. hideColumn: false, // 隐藏选中列和显示选中列
  181. rowHeight: true, // 行高
  182. columnWidth: true, // 列宽
  183. clear: false, // 清除内容
  184. matrix: false, // 矩阵操作选区
  185. sort: false, // 排序选区
  186. filter: false, // 筛选选区
  187. chart: true, // 图表生成
  188. image: false, // 插入图片
  189. link: false, // 插入链接
  190. data: false, // 数据验证
  191. cellFormat: false // 设置单元格格式
  192. },
  193. plugins: ['chart']
  194. }
  195. if (!option) {
  196. option = JSON.parse(JSON.stringify(luckysheetOption))
  197. }
  198. option.data = tableData.data
  199. // 设置工作表保护
  200. option.data[0].config.authority = {
  201. sheet: 1, // 如果为 1 或 true,则该工作表受到保护;如果为 0 或 false,则该工作表不受保护。
  202. hintText: '该工作表受到保护,无法操作', // 弹窗提示的文字
  203. }
  204. // 关闭右键菜单
  205. option.cellRightClickConfig.chart = false
  206. option.cellRightClickConfig.columnWidth = false
  207. option.cellRightClickConfig.rowHeight = false
  208. option.cellRightClickConfig.deleteColumn = false
  209. option.cellRightClickConfig.deleteRow = false
  210. option.cellRightClickConfig.insertColumn = false
  211. option.cellRightClickConfig.insertRow = false
  212. // 关闭工具栏
  213. option.showtoolbar = false
  214. option.enableAddRow = false
  215. option.showtoolbarConfig = {
  216. bold: false,
  217. border: false,
  218. fillColor: false,
  219. font: false,
  220. fontSize: false,
  221. function: false,
  222. horizontalAlignMode: false,
  223. italic: false,
  224. mergeCell: false,
  225. moreFormats: false,
  226. paintFormat: false,
  227. strikethrough: false,
  228. textColor: false,
  229. underline: false,
  230. verticalAlignMode: false
  231. }
  232. // 钩子函数
  233. option.hook = {
  234. workbookCreateAfter() {
  235. // 图表操作
  236. for (let i in reportChartList) {
  237. insertEChartInfo(reportChartList[i])
  238. }
  239. // option.data.forEach((data, i) => {
  240. // if (data.chart && data.chart.length > 0) {
  241. // data.chart.forEach((chart, j) => {
  242. // console.log(chart.chart_id)
  243. // let dom = document.getElementById(chart.chart_id + '_c')
  244. // if (dom) dom.style.display = 'none'
  245. // })
  246. // }
  247. // })
  248. // 绘制基础数据项
  249. drawBaseInfo(baseItem)
  250. // 绘制数据值
  251. drawTableData(reportTableItemList,
  252. reportTableType, data.data)
  253. luckysheet.setRangeShow('BH1')
  254. convertChart(tableData)
  255. printExcel()
  256. }
  257. }
  258. luckysheet.create(option)
  259. } else {
  260. }
  261. })
  262. // $.ajax({
  263. // url: "http://192.168.0.40:8081/reportTable/getReportTableById",
  264. // type: 'GET',
  265. // data: {
  266. // id: id
  267. // },
  268. // // beforeSend: function() {
  269. // // getUserIP(function(ip) {
  270. // // console.log("得到的本地IP :" + ip);
  271. // // this.url = "http://" + ip +
  272. // // ":8081/reportTable/getReportTableById"
  273. // // });
  274. // // },
  275. // success: function(res) {
  276. // if (res.code === 200) {
  277. // console.log(res.data, 'res.data');
  278. // // 报表数据
  279. // let tableData = JSON.parse(res.data.reportTableData)
  280. // let option = tableData.option
  281. // console.log(tableData, 'jsonData')
  282. // // 基础数据项值
  283. // let baseItem = tableData.baseItem
  284. // // 数据项
  285. // let reportTableItemList = res.data.reportTableItemList
  286. // let reportChartList = res.data.reportChartList
  287. // // 报表类型
  288. // let reportTableType = res.data.reportTableType
  289. // let luckysheetOption = {
  290. // container: 'luckysheet', // 设定 DOM 容器的 id
  291. // title: '报表模板', // 设定表格名称
  292. // lang: 'zh', // 设定表格语言
  293. // showinfobar: false, // 是否显示顶部信息栏
  294. // showtoolbar: false, // 是否显示工具栏
  295. // showtoolbarConfig: {
  296. // paintFormat: true, //格式刷
  297. // moreFormats: true, // 单元格格式
  298. // font: true, // 字体
  299. // fontSize: true, // 字号大小
  300. // bold: true, // 粗体 (Ctrl+B)
  301. // italic: true, // 斜体 (Ctrl+I)
  302. // strikethrough: true, // 删除线 (Alt+Shift+5)
  303. // underline: true, // 下划线 (Alt+Shift+6)
  304. // textColor: true, // 文本颜色
  305. // fillColor: true, // 单元格颜色
  306. // border: true, // 边框
  307. // mergeCell: true, // 合并单元格
  308. // horizontalAlignMode: true, // 水平对齐方式
  309. // verticalAlignMode: true, // 垂直对齐方式
  310. // function: true, // 公式
  311. // // image: true
  312. // // chart: true
  313. // },
  314. // showsheetbar: false, // 是否显示底部 sheet 页按钮
  315. // sheetFormulaBar: false, // 是否显示公式
  316. // row: 120, // 是否显示底部 sheet 页按钮
  317. // data: [{
  318. // "name": "统计报表", //工作表名称
  319. // }],
  320. // cellRightClickConfig: { // 自定义配置单元格右击菜单
  321. // copy: true, // 复制
  322. // copyAs: false, // 复制为
  323. // paste: true, // 粘贴
  324. // insertRow: true, // 插入行
  325. // insertColumn: true, // 插入列
  326. // deleteRow: true, // 删除选中行
  327. // deleteColumn: true, // 删除选中列
  328. // deleteCell: false, // 删除单元格
  329. // hideRow: false, // 隐藏选中行和显示选中行
  330. // hideColumn: false, // 隐藏选中列和显示选中列
  331. // rowHeight: true, // 行高
  332. // columnWidth: true, // 列宽
  333. // clear: false, // 清除内容
  334. // matrix: false, // 矩阵操作选区
  335. // sort: false, // 排序选区
  336. // filter: false, // 筛选选区
  337. // chart: true, // 图表生成
  338. // image: false, // 插入图片
  339. // link: false, // 插入链接
  340. // data: false, // 数据验证
  341. // cellFormat: false // 设置单元格格式
  342. // },
  343. // plugins: ['chart']
  344. // }
  345. // if (!option) {
  346. // option = JSON.parse(JSON.stringify(luckysheetOption))
  347. // }
  348. // option.data = tableData.data
  349. // // 设置工作表保护
  350. // option.data[0].config.authority = {
  351. // sheet: 1, // 如果为 1 或 true,则该工作表受到保护;如果为 0 或 false,则该工作表不受保护。
  352. // hintText: '该工作表受到保护,无法操作', // 弹窗提示的文字
  353. // }
  354. // // 关闭右键菜单
  355. // option.cellRightClickConfig.chart = false
  356. // option.cellRightClickConfig.columnWidth = false
  357. // option.cellRightClickConfig.rowHeight = false
  358. // option.cellRightClickConfig.deleteColumn = false
  359. // option.cellRightClickConfig.deleteRow = false
  360. // option.cellRightClickConfig.insertColumn = false
  361. // option.cellRightClickConfig.insertRow = false
  362. // // 关闭工具栏
  363. // option.showtoolbar = false
  364. // option.enableAddRow = false
  365. // option.showtoolbarConfig = {
  366. // bold: false,
  367. // border: false,
  368. // fillColor: false,
  369. // font: false,
  370. // fontSize: false,
  371. // function: false,
  372. // horizontalAlignMode: false,
  373. // italic: false,
  374. // mergeCell: false,
  375. // moreFormats: false,
  376. // paintFormat: false,
  377. // strikethrough: false,
  378. // textColor: false,
  379. // underline: false,
  380. // verticalAlignMode: false
  381. // }
  382. // // 钩子函数
  383. // option.hook = {
  384. // workbookCreateAfter() {
  385. // // 图表操作
  386. // for (let i in reportChartList) {
  387. // insertEChartInfo(reportChartList[i])
  388. // }
  389. // // option.data.forEach((data, i) => {
  390. // // if (data.chart && data.chart.length > 0) {
  391. // // data.chart.forEach((chart, j) => {
  392. // // console.log(chart.chart_id)
  393. // // let dom = document.getElementById(chart.chart_id + '_c')
  394. // // if (dom) dom.style.display = 'none'
  395. // // })
  396. // // }
  397. // // })
  398. // // 绘制基础数据项
  399. // drawBaseInfo(baseItem)
  400. // // 绘制数据值
  401. // drawTableData(reportTableItemList,
  402. // reportTableType)
  403. // luckysheet.setRangeShow('BH1')
  404. // convertChart(tableData)
  405. // printExcel()
  406. // }
  407. // }
  408. // luckysheet.create(option)
  409. // } else {
  410. // layer.msg(res.msg);
  411. // }
  412. // }
  413. // })
  414. function printExcel() {
  415. let currentSelected = luckysheet.getRange()
  416. luckysheet.hideGridLines()
  417. // 如果当前选中区只是一个单元格,则认为选取无效。
  418. if (currentSelected[0] != null &&
  419. (currentSelected[0].row[1] - currentSelected[0].row[0] >= 1 ||
  420. currentSelected[0].column[1] - currentSelected[0].column[0] >= 1)) {
  421. // 生成base64图片
  422. //let imgSrc = luckysheet.getScreenshot();
  423. setTimeout(() => {
  424. luckysheet.getScreenshotNew((imgSrc) => {
  425. console.info('printImg', imgSrc)
  426. // top.document.write(`<img src='${imgSrc}'/>`)
  427. luckysheet.showGridLines();
  428. })
  429. }, 200)
  430. } else {
  431. // 获取打印区域的行列
  432. let RowColumn = getPrintSheetArea();
  433. // 因需要打印左边的边框,需重新设置第一列
  434. //RowColumn.column[0] = 0;
  435. // 进行选区操作
  436. luckysheet.setRangeShow(RowColumn);
  437. const cellData = handelCell(luckysheet.getAllSheets()[0].celldata)
  438. let {
  439. minR,
  440. maxR,
  441. minC,
  442. maxC
  443. } = cellData
  444. luckysheet.setRangeShow({
  445. row: [0, maxR],
  446. column: [0, maxC]
  447. });
  448. // let imgSrc = luckysheet.getScreenshot(); // 生成base64图片
  449. // console.log(imgSrc);
  450. setTimeout(() => {
  451. luckysheet.getScreenshotNew((imgSrc) => {
  452. console.info('printImg', imgSrc)
  453. // top.document.write(`<img src='${imgSrc}'/>`)
  454. luckysheet.showGridLines();
  455. })
  456. }, 800)
  457. }
  458. }
  459. function handelCell(data) {
  460. let minR = data[0].r
  461. let maxR = data[data.length - 1].r
  462. let minC = data[0].c
  463. let cData = data.map(item => {
  464. return item.c
  465. })
  466. let maxC = cData.sort(function(a, b) {
  467. return b - a;
  468. })[0];
  469. return {
  470. minR,
  471. maxR,
  472. minC,
  473. maxC
  474. }
  475. }
  476. // top.window.document.write(imgSrc)
  477. // $.ajax({
  478. // url: "localhost:8084?file="+imgSrc,
  479. // type: 'GET',
  480. // success: function(res) {
  481. // }
  482. // })
  483. function getPrintSheetArea() {
  484. const sheetData = luckysheet.getSheetData();
  485. let objRowColumn = {
  486. row: [0, 0], //行
  487. column: [0, 0], //列
  488. };
  489. // * item是行、index是行索引、it是一行里的一格、itemIndex是这一格在这一行里的列索引
  490. sheetData.forEach((item, index) => {
  491. //行数
  492. item.forEach((it, itemIndex) => {
  493. if (it !== null && it.v) {
  494. // console.log(index, it)
  495. if (objRowColumn.row[1] < index) {
  496. objRowColumn.row[1] = index; //row第二位
  497. }
  498. if (objRowColumn.column[1] < itemIndex) {
  499. objRowColumn.column[1] =
  500. itemIndex; //column第二位
  501. }
  502. }
  503. });
  504. });
  505. return objRowColumn;
  506. }
  507. /** 绘制表格数据 */
  508. function drawTableData(tableItemList, type, tableInfo) {
  509. if (!tableItemList || tableItemList.length == 0) {
  510. updateLocalExcelContent()
  511. return
  512. }
  513. // 事件驱动报表
  514. if (type == 2 || type == 4) {
  515. tableItemList.forEach((tableItem, i) => {
  516. if (i == 0) {
  517. let valueTimeList = tableItem.valueTimeList ? tableItem.valueTimeList.split(',') : []
  518. valueTimeList = withDateFormatLength(valueTimeList)
  519. let xAxis = tableItem.xaxis
  520. let yAxis = tableItem.yaxis - 1
  521. if (valueTimeList.length == 0) {
  522. luckysheet.setCellValue(xAxis, yAxis, '')
  523. } else {
  524. valueTimeList.forEach((v, j) => {
  525. luckysheet.setCellValue(xAxis + j, yAxis, v)
  526. })
  527. }
  528. }
  529. let valueList = tableItem.valueList ? tableItem.valueList
  530. .split(',') : []
  531. let xAxis = tableItem.xaxis
  532. let yAxis = tableItem.yaxis
  533. if (valueList.length == 0) {
  534. luckysheet.setCellValue(xAxis, yAxis, '')
  535. } else {
  536. valueList.forEach((v, j) => {
  537. luckysheet.setCellValue(xAxis + j, yAxis,
  538. v)
  539. })
  540. }
  541. })
  542. updateLocalExcelContent()
  543. return
  544. }
  545. // 设备报表
  546. if (type == 5 || type == 6) {
  547. tableItemList.forEach((tableItem, i) => {
  548. let standby = tableItem.standby ? JSON.parse(tableItem.standby) : {}
  549. let dataIndex = standby.index != null ? standby.index : -1
  550. let valueList = tableItem.valueList ? tableItem.valueList.split(',') : []
  551. let xAxis = tableItem.xaxis
  552. let yAxis = tableItem.yaxis
  553. // 序号、时间处理
  554. if (tableItem.timeItemType == 0) { // 序号、开始时间
  555. let valueIndexList = tableItem.valueIndexList ? tableItem.valueIndexList.split(',') : []
  556. deviceReportUpdateData('${index}', valueIndexList, false)
  557. let valueTimeList = tableItem.valueTimeList ? tableItem.valueTimeList.split(',') : []
  558. valueTimeList = withDateFormatLength(valueTimeList)
  559. deviceReportUpdateData('${startTime}', valueTimeList, false)
  560. }
  561. if (tableItem.timeItemType == 1) { // 结束时间
  562. let valueTimeList = tableItem.valueTimeList ? tableItem.valueTimeList.split(',') : []
  563. valueTimeList = withDateFormatLength(valueTimeList)
  564. deviceReportUpdateData('${stopTime}', valueTimeList, tableInfo.isGenCountTime == 1)
  565. }
  566. if (valueList.length == 0) {
  567. luckysheet.setCellValue(xAxis, yAxis, '')
  568. } else {
  569. valueList.forEach((v, j) => {
  570. luckysheet.setCellValue(xAxis + j, yAxis, v)
  571. })
  572. }
  573. })
  574. updateLocalExcelContent()
  575. return
  576. }
  577. // 其余报表信息
  578. tableItemList.forEach((tableItem, i) => {
  579. // let standby = tableItem.standby ? JSON.parse(tableItem.standby) :
  580. // {}
  581. // let dataIndex = standby.index != null ? standby.index : -1
  582. let valueList = tableItem.valueList ? tableItem.valueList.split(
  583. ',') : []
  584. // let val = (dataIndex == -1 || (dataIndex + 1) > valueList
  585. // .length) ?
  586. // cqcyCode['invalidData'] : valueList[dataIndex]
  587. let xAxis = tableItem.xaxis
  588. let yAxis = tableItem.yaxis
  589. if (valueList.length == 0) {
  590. luckysheet.setCellValue(xAxis, yAxis, '')
  591. } else {
  592. valueList.forEach((v, j) => {
  593. luckysheet.setCellValue(xAxis + j, yAxis, v)
  594. })
  595. }
  596. })
  597. updateLocalExcelContent()
  598. }
  599. /** 设备报表时间特殊处理 */
  600. function deviceReportUpdateData(field, dataList, hasCalc) {
  601. let indexPos = sessionStorage.getItem(window.sessionName)
  602. if (indexPos) {
  603. let pos = indexPos.split(',')
  604. if (field == '${index}') {
  605. let yAxis = parseInt(pos[0])
  606. let xAxis = parseInt(pos[1])
  607. dataList.forEach((v, j) => {
  608. luckysheet.setCellValue(yAxis + j, xAxis, j + 1)
  609. })
  610. } else if (field == '${startTime}') {
  611. let yAxis = parseInt(pos[0])
  612. let xAxis = parseInt(pos[1]) + 1
  613. dataList.forEach((v, j) => {
  614. luckysheet.setCellValue(yAxis + j, xAxis, v)
  615. })
  616. } else if (field == '${stopTime}') {
  617. let yAxis = parseInt(pos[0])
  618. let xAxis = parseInt(pos[1]) + 2
  619. dataList.forEach((v, j) => {
  620. luckysheet.setCellValue(yAxis + j, xAxis, v)
  621. if (hasCalc) {
  622. let startDate = luckysheet.getCellValue(yAxis + j, xAxis - 1)
  623. let minutes = calculateMinutes(startDate, v)
  624. luckysheet.setCellValue(yAxis + j, xAxis + 1, minutes)
  625. }
  626. })
  627. }
  628. return
  629. }
  630. let option = luckysheet.getAllSheets()[0]
  631. option.celldata.map(item => {
  632. if (item.v.v) {
  633. item.v.v = String(item.v.v).trim()
  634. // 替换${xxx}内部数据
  635. if (item.v.v.match(/\${([^}]+)}/g)) {
  636. if (item.v.v.indexOf(field) > -1) {
  637. let yAxis = item.r
  638. let xAxis = item.c
  639. if (field == '${index}') {
  640. sessionStorage.setItem(window.sessionName, yAxis + ',' + xAxis)
  641. dataList.forEach((v, j) => {
  642. luckysheet.setCellValue(yAxis + j, xAxis, j + 1)
  643. })
  644. } else {
  645. dataList.forEach((v, j) => {
  646. luckysheet.setCellValue(yAxis + j, xAxis, v)
  647. if (hasCalc) {
  648. let startDate = luckysheet.getCellValue(yAxis + j, xAxis - 1)
  649. let minutes = calculateMinutes(startDate, v)
  650. luckysheet.setCellValue(yAxis + j, xAxis + 1, minutes)
  651. }
  652. })
  653. }
  654. }
  655. }
  656. }
  657. })
  658. }
  659. /** 删除不合理数据值 */
  660. function updateLocalExcelContent() {
  661. let option = luckysheet.getAllSheets()[0]
  662. option.celldata.map(item => {
  663. if (item.v.v) {
  664. item.v.v = String(item.v.v).trim()
  665. // 替换${xxx}内部数据
  666. if (item.v.v.match(/\${([^}]+)}/g)) {
  667. luckysheet.setCellValue(item.r, item.c, '')
  668. }
  669. }
  670. })
  671. }
  672. /** 计算分钟数 */
  673. function calculateMinutes(time1, time2) {
  674. // 将时间字符串转换为Date对象
  675. let date1 = new Date(time1);
  676. let date2 = new Date(time2);
  677. // 计算时间差(以毫秒为单位)
  678. let diffInMilliseconds = Math.abs(date2.getTime() - date1.getTime());
  679. // 将时间差转换为分钟
  680. let minutes = Math.floor(diffInMilliseconds / 1000 / 60);
  681. return minutes;
  682. }
  683. /** 绘制基础数据项布局信息 */
  684. function drawBaseInfo(baseData) {
  685. if (!baseData) return
  686. let option = luckysheet.getAllSheets()[0]
  687. option.celldata.map(item => {
  688. if (item.v.v) {
  689. item.v.v = String(item.v.v).trim()
  690. if (item.v.v.match(/\${([^}]+)}/g)) { // 替换${xxx}内部数据
  691. if (item.v.v.indexOf('${currDate}') > -1) {
  692. let val = item.v.v
  693. val = val.replace('${currDate}', baseData.currDate)
  694. luckysheet.setCellValue(item.r, item.c, val)
  695. }
  696. if (item.v.v.indexOf('${currDateTime}') > -1) {
  697. let val = item.v.v
  698. val = val.replace('${currDateTime}', baseData
  699. .currDateTime)
  700. luckysheet.setCellValue(item.r, item.c, val)
  701. }
  702. if (item.v.v.indexOf('${userName}') > -1) {
  703. let val = item.v.v
  704. val = val.replace('${userName}', baseData.userName)
  705. luckysheet.setCellValue(item.r, item.c, val)
  706. }
  707. if (item.v.v.indexOf('${winUserName}') > -1) {
  708. let val = item.v.v
  709. val = val.replace('${winUserName}', baseData
  710. .winUserName)
  711. luckysheet.setCellValue(item.r, item.c, val)
  712. }
  713. }
  714. }
  715. })
  716. }
  717. function withDateFormatLength(listDate) {
  718. if (!listDate || listDate.length == 0) {
  719. return []
  720. }
  721. let arr = []
  722. listDate.forEach((date) => {
  723. arr.push(date.substring(0, 19))
  724. })
  725. return arr
  726. }
  727. /** 向 Excel 插入图表 */
  728. function insertEChartInfo(chart) {
  729. let _self = this
  730. let info = JSON.parse(chart.standby)
  731. let reportChartItemList = chart.reportChartItemList
  732. let chartType = chart.chartType
  733. // 系列
  734. let series = info.option.series
  735. for (let i in series) {
  736. let temp = series[i]
  737. temp.data = []
  738. for (let j in reportChartItemList) {
  739. let _name = reportChartItemList[j].describe ?
  740. reportChartItemList[j].describe : reportChartItemList[j]
  741. .itemName
  742. if (chartType == 'pie') {
  743. info.option.legend = null
  744. info.option.tooltip = {
  745. trigger: 'item',
  746. formatter: '{b0}<br /> <b>{c0}</b>'
  747. }
  748. temp.name = _name
  749. let names = reportChartItemList[i].valueTimeList ? reportChartItemList[i].valueTimeList.split(',') : [];
  750. names = withDateFormatLength(names);
  751. let vals = reportChartItemList[i].valueList ? reportChartItemList[i].valueList.split(',') : [];
  752. names.forEach((name, j) => {
  753. temp.data.push({
  754. 'name': name,
  755. 'value': vals[j]
  756. })
  757. })
  758. } else {
  759. let _t = []
  760. let t = reportChartItemList[i].valueList ?
  761. reportChartItemList[i].valueList.split(',') : []
  762. t.forEach((temp) => {
  763. _t.push(parseFloat(temp))
  764. })
  765. temp.data = _t
  766. }
  767. }
  768. }
  769. if (chartType != 'pie') {
  770. // x 轴
  771. let xAxis = info.option.xAxis
  772. let legend = info.option.legend
  773. // xAxis.data = []
  774. legend.data = []
  775. let axisLabel = {};
  776. axisLabel.rotate = 20;
  777. xAxis.axisLabel = axisLabel
  778. let times = (reportChartItemList[0].valueTimeList) ? reportChartItemList[0].valueTimeList.split(",") : []
  779. xAxis.data = (reportChartItemList && reportChartItemList.length > 0) ?
  780. withDateFormatLength(times) : []
  781. // xAxis.data = xAxis.data.slice(0, 7)
  782. for (let i in reportChartItemList) {
  783. let name = reportChartItemList[i].describe ? reportChartItemList[i].describe : reportChartItemList[i].itemName
  784. // xAxis.data.push(name)
  785. legend.data.push(name)
  786. }
  787. }
  788. setTimeout(() => {
  789. const sheet = luckysheet.getLuckysheetfile()[0]
  790. let optionData = sheet.data
  791. try {
  792. let flag = false
  793. insertLuckysheetEChart({
  794. selector: '#luckysheet',
  795. info,
  796. sheet,
  797. optionData,
  798. echarts,
  799. luckysheet,
  800. $,
  801. _self,
  802. flag
  803. })
  804. } catch (e) {
  805. console.log(999, e == 'echarts is not defined')
  806. console.error(e)
  807. }
  808. }, 200)
  809. }
  810. $('#recordBtn').on('click', () => {
  811. $('.model').show()
  812. const token = window.localStorage.getItem('C_TOKEN')
  813. // $.ajax({
  814. // type: 'GET',
  815. // beforeSend: function(xhr) {
  816. // this.url =
  817. // `http://192.168.0.40:8081/reportTable/getAutoChReportTable?page=1&limit=10&autoTableId=${id}`
  818. // xhr.setRequestHeader("Authorization", "Bearer " +
  819. // token);
  820. // xhr.setRequestHeader("token", token);
  821. // },
  822. // success: function(res) {
  823. // if (res.code === 200) {
  824. // $.each(res.data.reportTableList, function(k,
  825. // v) {
  826. // // $("#table tbody").append(
  827. // // `<tr >
  828. // // <td data-id='${v.id}' data-title='${v.reportTableName}'>
  829. // // ${v.reportTableName}
  830. // // </td>`
  831. // // )
  832. // })
  833. // }
  834. // }
  835. // })
  836. // var tableReload = table.render({
  837. // elem: '#demo',
  838. // width: 300,
  839. // page: {
  840. // elem: '#demo',
  841. // layout: ['prev', 'page', 'next',
  842. // 'count'
  843. // ]
  844. // },
  845. // url: `http://192.168.0.40:8081/reportTable/getAutoChReportTable?page=1&limit=10&autoTableId=${id}`,
  846. // where: {
  847. // autoTableId: id
  848. // },
  849. // text: {
  850. // none: '暂无数据' //默认:无数据。
  851. // },
  852. // cols: [
  853. // [{
  854. // field: 'reportTableName',
  855. // title: null,
  856. // width: 300
  857. // }]
  858. // ],
  859. // parseData: function(res) {
  860. // return {
  861. // "code": 0,
  862. // "msg": res.msg,
  863. // "count": res.data.count,
  864. // "data": res.data
  865. // .reportTableList
  866. // };
  867. // }
  868. // })
  869. layui.use('table', function() {
  870. var table = layui.table;
  871. var layer = layui.layer;
  872. layer.open({
  873. type: 1,
  874. title: '运行记录',
  875. content: $('#demo'),
  876. offset: ['30px', '45px'],
  877. end: function() {
  878. $('#demo').hide();
  879. $('.layui-table-view').hide()
  880. },
  881. cancel: function(index, layero) {
  882. $('.layui-layer-content')
  883. .hide()
  884. }
  885. });
  886. var tableReload = table.render({
  887. elem: '#demo',
  888. width: 300,
  889. page: {
  890. elem: '#demo',
  891. layout: ['prev', 'page', 'next',
  892. 'count'
  893. ]
  894. },
  895. url: `${baseUrl}/reportTable/getAutoChReportTable`,
  896. headers: {
  897. token: token
  898. },
  899. where: {
  900. autoTableId: id
  901. },
  902. text: {
  903. none: '暂无数据' //默认:无数据。
  904. },
  905. cols: [
  906. [{
  907. field: 'reportTableName',
  908. title: null,
  909. width: 300
  910. }]
  911. ],
  912. parseData: function(res) {
  913. return {
  914. "code": 0,
  915. "msg": res.msg,
  916. "count": res.data.count,
  917. "data": res.data
  918. .reportTableList
  919. };
  920. }
  921. });
  922. //触发行单击事件
  923. table.on('row(test)', function(obj) {
  924. const id = obj.data.id
  925. const title = obj.data
  926. .reportTableName
  927. uni.navigateTo({
  928. url: `/pages/reportForm/report-detail/recordDetail?id=${id}&title=${title}`
  929. })
  930. });
  931. $('th').hide()
  932. });
  933. })
  934. // $("#table tbody").on('click', 'tr', (e) => {
  935. // if (e.target.nodeName.toLowerCase() === 'td') {
  936. // const id = e.target.getAttribute('data-id')
  937. // const title = e.target.getAttribute('data-title')
  938. // uni.navigateTo({
  939. // url: `/pages/reportForm/report-detail/recordDetail?id=${id}&title=${title}`
  940. // })
  941. // }
  942. // })
  943. // $('.cel').on('click', () => {
  944. // $('.model').hide()
  945. // })
  946. });
  947. });
  948. })
  949. </script>
  950. </body>
  951. </html>