Device.html 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. <!DOCTYPE html>
  2. <html class="x-admin-sm">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="renderer" content="webkit">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  7. <meta name="viewport"
  8. content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/>
  9. <link rel="shortcut icon" href="/static/favicon.ico">
  10. <link rel="bookmark" href="/static/favicon.ico">
  11. <link rel="stylesheet" href="/static/css/font.css">
  12. <link rel="stylesheet" href="/static/css/xadmin.css">
  13. <link rel="stylesheet" href="/static/layui/css/modules/layer/default/layer.css">
  14. <link rel="stylesheet" href="/static/layui/css/modules/laydate/default/laydate.css">
  15. <script src="/static/js/jquery.min.js"></script>
  16. <script src="/static/lib/layui/layui.js" charset="utf-8"></script>
  17. <!-- <script src="/static/lib/layui/lay/modules/laydate.js"/>-->
  18. <script src="/static/lib/layui/lay/modules/layer.js" charset="utf-8"></script>
  19. <script type="text/javascript" src="/static/js/xadmin.js"></script>
  20. </head>
  21. <body>
  22. <div class="x-nav">
  23. <span class="layui-breadcrumb">
  24. <a href="">首页</a>
  25. <a><cite>设备管理</cite></a>
  26. </span>
  27. <a class="layui-btn layui-btn-normal" style="line-height:1.6em;margin-top:3px;float:right"
  28. onclick="location.reload()" title="刷新">
  29. <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i>
  30. </a>
  31. </div>
  32. <div class="layui-fluid">
  33. <div class="layui-row layui-col-space15">
  34. <div class="layui-col-md12">
  35. <div class="layui-card">
  36. <div class="layui-card-body ">
  37. <div class="layui-form layui-col-space5">
  38. <div class="layui-input-inline layui-show-xs-block">
  39. <input id="deviceName" type="text" name="Name"
  40. placeholder="设备名称/sn"
  41. autocomplete="off" class="layui-input"></div>
  42. <div class="layui-input-inline layui-show-xs-block">
  43. <select id="searchClass" value="0" class="layui-select">
  44. <option value="">所有分类</option>
  45. {{range $index, $elem := .Class_List}}
  46. <option value={{$elem.Id}}>{{$elem.T_name}}</option>
  47. {{end}}
  48. </select>
  49. </div>
  50. <div class="layui-input-inline layui-show-xs-block">
  51. <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="search"
  52. onclick="getDeviceDataList(1)">
  53. <i class="layui-icon">&#xe615;</i></button>
  54. </div>
  55. <!-- <button class="layui-btn layui-btn-normal" onclick="Zero()">一键归零</button>-->
  56. <div class="layui-card-body"
  57. style="display: flex;justify-content: space-between;align-items: center">
  58. <div>
  59. <button class="layui-btn layui-btn-sm layui-btn-normal" id="selectAllBtn"
  60. onclick="selectAll()">
  61. 全选本页
  62. </button>
  63. <button class="layui-btn layui-btn-sm layui-btn-normal" onclick="reverseSelect()">反选
  64. </button>
  65. <button class="layui-btn layui-btn-sm layui-btn-normal" id="noSelectAllBtn"
  66. onclick="noSelect()">全不选
  67. </button>
  68. <button class="layui-btn layui-btn-sm layui-btn-normal" onclick="dataRepeat()">数据重传
  69. </button>
  70. <button class="layui-btn layui-btn-sm layui-btn-normal" onclick="SensorAll()">偏差值
  71. </button>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. <!--数据列表部分-->
  77. <div class="layui-card-body " style="height: 663px">
  78. <table class="layui-table" lay-size="lg">
  79. <colgroup>
  80. <col width="20">
  81. <col>
  82. <col>
  83. <col>
  84. <col>
  85. <col>
  86. <col>
  87. <col>
  88. <col>
  89. </colgroup>
  90. <thead>
  91. <th>选择</th>
  92. <th>SN</th>
  93. <th>编号</th>
  94. <th>传感器名称</th>
  95. <th>最新温度</th>
  96. <th>最新湿度</th>
  97. <th>温度偏差值</th>
  98. <th>湿度偏差值</th>
  99. <th>操作</th>
  100. </thead>
  101. <tbody id="tableBody">
  102. </tbody>
  103. </table>
  104. </div>
  105. <div class="layui-card-body ">
  106. <div class="page">
  107. <div id="pageTool">
  108. <!--上一页-->
  109. </div>
  110. </div>
  111. </div>
  112. <!--设别列表部分end-->
  113. <div class="layui-card-body"
  114. style="justify-content: space-between;align-items: center;color: #ed3f35;height: 110px;">
  115. <h2 class="layui-col-md12">注意:</h2>
  116. <h3 class="layui-col-md12">1、修改参数 提示成功后,为了确保设备修改成功,请再次读取确定!!!</h3>
  117. <h3 class="layui-col-md12">2、此页面功能项目都属于敏感参数,没有修改记录!!!</h3>
  118. <h3 class="layui-col-md12">
  119. 3、没有多选操作功能,因为修改以上参数必须设备在线与真实成功,为了可靠性,所以取消了多选操作功能!!!</h3>
  120. </div>
  121. <!--分页、选择区域 start-->
  122. <!-- 分页、选择区域 end -->
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. <div id="deviation" style="display: none;margin-top: 20px;text-align: center">
  128. <form class="layui-form" lay-filter="dataRepeat" style="text-align: center">
  129. <div class="layui-form-item">
  130. <label class="layui-form-label">温度补偿:</label>
  131. <input type="text" id="wdbc" class="layui-input layui-input-inline"/>
  132. </div>
  133. <div class="layui-form-item">
  134. <label class="layui-form-label">湿度补偿: </label>
  135. <input type="text" id="sdbc" class="layui-input layui-input-inline"/>
  136. </div>
  137. </form>
  138. </div>
  139. <div id="deviationall" style="display: none;margin-top: 20px;text-align: center">
  140. <form class="layui-form" lay-filter="dataRepeat" style="text-align: center">
  141. <div class="layui-form-item">
  142. <label class="layui-form-label">温度补偿:</label>
  143. <input type="text" id="wdbcall" class="layui-input layui-input-inline"/>
  144. </div>
  145. <div class="layui-form-item">
  146. <label class="layui-form-label">湿度补偿: </label>
  147. <input type="text" id="sdbcall" class="layui-input layui-input-inline"/>
  148. </div>
  149. </form>
  150. </div>
  151. <div id="Sensor" style="display: none;margin-top: 20px;text-align: center">
  152. <form class="layui-form" lay-filter="dataRepeat" style="text-align: center">
  153. <div class="layui-form-item">
  154. <label class="layui-form-label" style="width: 120px;">传感器采样率:</label>
  155. <input type="text" id="speed" class="layui-input layui-input-inline"/>
  156. <label class="layui-form-label" style="width: 120px;">s(1~240) 默认:15</label>
  157. </div>
  158. <div class="layui-form-item">
  159. <label class="layui-form-label" style="width: 120px;">传感器灵敏度:</label>
  160. <input type="text" id="sense" class="layui-input layui-input-inline"/>
  161. <label class="layui-form-label" style="width: 120px;">s(0~600) 默认:60 </label>
  162. </div>
  163. </form>
  164. </div>
  165. <div id="dataRepeat" style="display: none;margin-top: 20px;text-align: center">
  166. <form class="layui-form" lay-filter="dataRepeat">
  167. <div class="layui-form-item">
  168. <label class="layui-form-label">开始时间:</label>
  169. <input id="startTime" class="layui-input layui-input-inline" lay-key="1"/>
  170. </div>
  171. <div class="layui-form-item">
  172. <label class="layui-form-label">结束时间: </label>
  173. <input id="endTime" name="humidity" class="layui-input layui-input-inline" lay-key="2"/>
  174. </div>
  175. </form>
  176. </div>
  177. <script>
  178. //数据表格
  179. let pageInfo = null
  180. let currentPage = 1
  181. function getDeviceDataList(currentPage) {
  182. // 显示加载页面
  183. layui.layer.load();
  184. let searchDeviceName = $('#deviceName').val()
  185. let searchDeviceClass = $('#searchClass').val()
  186. console.log(searchDeviceName, searchDeviceClass)
  187. let formData = new FormData();
  188. formData.set('deviceName', searchDeviceName)
  189. formData.set('deviceClass', searchDeviceClass)
  190. formData.set('currentPage', currentPage)
  191. $.ajax({
  192. type: "POST",
  193. data: formData,
  194. contentType: false,
  195. processData: false,
  196. url: "/Device/DeviceList",
  197. success: function (result) {
  198. pageInfo = result
  199. let b = $('#tableBody')
  200. b.html("")
  201. if (result.list != null) {
  202. layui.layer.closeAll("loading");
  203. for (let v of result.list) {
  204. b.append(`
  205. <tr>
  206. <td><input type="checkbox" class="layui-form-checkbox" data-sn="${v.T_sn}" data-id="${v.T_id}"/></td>
  207. <td>${v.T_sn}</td>
  208. <td>${v.T_id}</td>
  209. <td>${v.T_name}</td>
  210. <td>${v.T_t}</td>
  211. <td>${v.T_rh}</td>
  212. <td>
  213. ${v.T_tDeviation === 1201 ? '<span style="color: red;">未获取到设备参数</span>' : v.T_tDeviation}
  214. </td>
  215. <td>
  216. ${v.T_RhDeviation === 1201 ? '<span style="color: red;">未获取到设备参数</span>' : v.T_RhDeviation}
  217. </td>
  218. <td>
  219. <button onclick="deviation('${v.T_sn}','${v.T_id}')" class="layui-btn layui-btn-normal layui-btn-sm">偏差值</button>
  220. <button onclick="Sensor('${v.T_sn}','${v.T_id}')" class="layui-btn layui-btn-normal layui-btn-sm">传感器参数</button>
  221. <button onclick="dataRepeat('${v.T_sn}','${v.T_id}')" class="layui-btn layui-btn-normal layui-btn-sm">数据重传</button>
  222. </td>
  223. </tr>
  224. `)
  225. }
  226. } else {
  227. b.append(`<tr>
  228. <td colspan="5" rowspan="10" style="height: 590px;text-align: center">没有设备数据!</td>
  229. </tr>`)
  230. }
  231. //渲染分页
  232. $('#pageTool').html('')
  233. if (!pageInfo.previousPage) {
  234. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-sm " onclick="getDeviceDataList(${pageInfo.currentPage - 1})">上一页</button>`)
  235. } else {
  236. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-sm" onclick="getDeviceDataList(${pageInfo.currentPage - 1})">上一页</button>`)
  237. }
  238. //页码
  239. let start, end
  240. start = pageInfo.currentPage - 2 <= 0 ? 1 : pageInfo.currentPage - 2
  241. end = pageInfo.currentPage + 2 >= pageInfo.totalPage ? pageInfo.totalPage : pageInfo.currentPage + 2
  242. end = end + (Math.abs(end - start)) >= pageInfo.totalPage ? pageInfo.totalPage : end + (Math.abs(end - start))
  243. start = start - (Math.abs(end - start)) <= 0 ? 1 : start - (Math.abs(end - start))
  244. for (; start <= end; start++) {
  245. if (pageInfo.currentPage == start) {
  246. $('#pageTool').append(`<button class="layui-btn layui-btn-disabled layui-btn-primary layui-btn-sm" onclick="getDeviceDataList(${start})">${start}</button>`)
  247. } else {
  248. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-sm" onclick="getDeviceDataList(${start})">${start}</button>`)
  249. }
  250. }
  251. if (!pageInfo.nextPage) {
  252. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-sm " onclick="getDeviceDataList(${pageInfo.currentPage + 1}">下一页</button>`)
  253. } else {
  254. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-disabled layui-btn-sm " onclick="getDeviceDataList( ${pageInfo.currentPage + 1} )">下一页</button>`)
  255. }
  256. }
  257. })
  258. }
  259. //偏差值
  260. function deviation(sn = '', id = '') {
  261. $('#wdbc').val("同步中...")
  262. $('#sdbc').val("同步中...")
  263. let selectSns = {}
  264. if (sn !== '' && id !== '') {
  265. selectSns[sn] = [parseInt(id)]
  266. }
  267. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  268. if ($(e).prop('checked')) {
  269. let sn = $(e).attr('data-sn')
  270. let id = parseInt($(e).attr('data-id'))
  271. if (selectSns[sn] === undefined) {
  272. selectSns[sn] = [id]
  273. } else {
  274. selectSns[sn].push(id)
  275. }
  276. $('#wdbc').val("")
  277. $('#sdbc').val("")
  278. }
  279. layui.layer.msg('请 确您勾选的设备 一定在线! 一定在线! 一定在线!,否则本次设置的参数可能无效!')
  280. })
  281. if (sn == null && selectSns.length === 0) {
  282. layui.layer.msg('没有可以操作的设备')
  283. return
  284. }
  285. let deviationData = [{}]
  286. console.log("选择数据:", selectSns)
  287. $.ajax({
  288. type: 'POST',
  289. url: '/Device/ReadDeviation',
  290. processData: false,
  291. contentType: "application/json",
  292. data: JSON.stringify(selectSns),
  293. success: function (rlt) {
  294. deviationData = []
  295. if (rlt.Code === 200) {
  296. if (rlt.Data.length === 1) {
  297. let t = JSON.parse(rlt.Data[0].split("||")[1])
  298. for (let i = 0; i < t.data.length; i++) {
  299. console.log(t.data[i]);
  300. if (t.data[i].id == id) {
  301. $('#wdbc').val(t.data[i].t)
  302. $('#sdbc').val(t.data[i].h)
  303. deviationData.push({
  304. sn: sn,
  305. data: [{
  306. id: parseInt(t.data[i].id),
  307. h: t.data[i].h,
  308. t: t.data[i].t
  309. }]
  310. })
  311. }
  312. }
  313. } else {
  314. $('#wdbc').disabled()
  315. $('#sdbc').disabled()
  316. for (let v of rlt.Data) {
  317. console.log(rlt.Data)
  318. let parameter = v.split("||");
  319. let sn = parameter[0].substring(parameter.lastIndex("/"))
  320. let t = JSON.parse(parameter[1])
  321. deviationData.push({
  322. sn: sn,
  323. data: [{
  324. id: parseInt(t.data[0].id),
  325. h: t.data[0].h,
  326. t: t.data[0].t
  327. }]
  328. })
  329. }
  330. }
  331. }
  332. // } else {
  333. // layui.layer.msg(rlt.Msg)
  334. // }
  335. }
  336. })
  337. layer.open({
  338. type: 1,
  339. title: '偏差值',
  340. area: ['400px', '230px'],
  341. content: $('#deviation'),
  342. btn: ['提交'],
  343. btnAlign: 'c',
  344. yes(index, elem) {
  345. console.log("偏差值数据:", deviationData)
  346. layui.layer.load();
  347. if (deviationData.length === 1) {
  348. deviationData[0].data[0].t = Number.parseFloat($('#wdbc').val())
  349. deviationData[0].data[0].h = Number.parseFloat($('#sdbc').val())
  350. }
  351. $.ajax({
  352. type: "POST",
  353. url: "/Device/WriteDeviation",
  354. contentType: "application/json",
  355. data: JSON.stringify(deviationData),
  356. processData: false,
  357. success: function (rlt) {
  358. layui.layer.closeAll('loading');
  359. if (rlt.Code === 200) {
  360. layui.layer.msg(rlt.Msg);
  361. location.reload()
  362. } else if (rlt.Code === 1201) {
  363. if (Array.isArray(rlt.Data) && rlt.Data.length > 0) {
  364. // 构建失败SN的列表字符串
  365. const failedSns = rlt.Data.join('<br>'); // 使用<br>标签换行
  366. // 显示弹窗,用户可以选择关闭
  367. layui.layer.alert('部分设置失败:\n' + failedSns, {
  368. closeBtn: 0,
  369. btn: ['关闭']
  370. });
  371. } else {
  372. layui.layer.msg(rlt.Msg || '未知错误');
  373. }
  374. } else {
  375. layui.layer.msg(rlt.Msg || '未知错误');
  376. }
  377. },
  378. error: function () {
  379. // 关闭加载页面
  380. layui.layer.closeAll('loading');
  381. layui.layer.msg('请求失败,请重试');
  382. },
  383. })
  384. layui.layer.close(index)
  385. }
  386. })
  387. }
  388. //偏差值
  389. function Sensor(sn = '', id = '') {
  390. $('#speed').val("同步中...")
  391. $('#sense').val("同步中...")
  392. let selectSns = {}
  393. if (sn !== '' && id !== '') {
  394. selectSns[sn] = [parseInt(id)]
  395. }
  396. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  397. if ($(e).prop('checked')) {
  398. let sn = $(e).attr('data-sn')
  399. let id = parseInt($(e).attr('data-id'))
  400. if (selectSns[sn] === undefined) {
  401. selectSns[sn] = [id]
  402. } else {
  403. selectSns[sn].push(id)
  404. }
  405. $('#speed').val("")
  406. $('#sense').val("")
  407. }
  408. layui.layer.msg('请 确您勾选的设备 一定在线! 一定在线! 一定在线!,否则本次设置的参数可能无效!')
  409. })
  410. if (sn == null && selectSns.length === 0) {
  411. layui.layer.msg('没有可以操作的设备')
  412. return
  413. }
  414. let SensorData = [{}]
  415. console.log("选择数据:", selectSns)
  416. $.ajax({
  417. type: 'POST',
  418. url: '/Device/ReadSensor',
  419. processData: false,
  420. contentType: "application/json",
  421. data: JSON.stringify(selectSns),
  422. success: function (rlt) {
  423. SensorData = []
  424. if (rlt.Code === 200) {
  425. if (rlt.Data.length === 1) {
  426. let t = JSON.parse(rlt.Data[0].split("||")[1])
  427. for (let i = 0; i < t.data.length; i++) {
  428. console.log(t.data[i]);
  429. if (t.data[i].id == id) {
  430. $('#speed').val(t.data[i].speed)
  431. $('#sense').val(t.data[i].sense)
  432. SensorData.push({
  433. sn: sn,
  434. data: [{
  435. id: parseInt(t.data[i].id),
  436. speed: t.data[i].speed,
  437. sense: t.data[i].sense
  438. }]
  439. })
  440. }
  441. }
  442. } else {
  443. $('#speed').disabled()
  444. $('#sense').disabled()
  445. for (let v of rlt.Data) {
  446. let parameter = v.split("||");
  447. let sn = parameter[0].substring(parameter.lastIndex("/"))
  448. let t = JSON.parse(parameter[1])
  449. SensorData.push({
  450. sn: sn,
  451. data: [{
  452. id: parseInt(t.data[0].id),
  453. speed: t.data[0].speed,
  454. sense: t.data[0].sense
  455. }]
  456. })
  457. }
  458. }
  459. } else {
  460. layui.layer.msg(rlt.Msg)
  461. }
  462. }
  463. })
  464. layer.open({
  465. type: 1,
  466. title: '传感器参数',
  467. area: ['500px', '230px'],
  468. content: $('#Sensor'),
  469. btn: ['提交'],
  470. btnAlign: 'c',
  471. yes(index, elem) {
  472. console.log("传感器参数:", SensorData)
  473. if (SensorData.length == 1) {
  474. SensorData[0].data[0].speed = Number.parseFloat($('#speed').val())
  475. SensorData[0].data[0].sense = Number.parseFloat($('#sense').val())
  476. }
  477. $.ajax({
  478. type: "POST",
  479. url: "/Device/WriteSensor",
  480. contentType: "application/json",
  481. data: JSON.stringify(SensorData),
  482. processData: false,
  483. success: function (rlt) {
  484. layui.layer.msg(rlt.Msg)
  485. }
  486. })
  487. layui.layer.close(index)
  488. }
  489. })
  490. }
  491. function SensorAll(){
  492. let selectSns = {}
  493. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  494. if ($(e).prop('checked')) {
  495. let sn = $(e).attr('data-sn')
  496. let id = parseInt($(e).attr('data-id'))
  497. console.log(sn, id)
  498. if (selectSns[sn] === undefined) {
  499. selectSns[sn] = [id]
  500. } else {
  501. selectSns[sn].push(id)
  502. }
  503. $('#speed').val("")
  504. $('#sense').val("")
  505. }
  506. layui.layer.msg('请 确您勾选的设备 一定在线! 一定在线! 一定在线!,否则本次设置的参数可能无效!')
  507. })
  508. if (selectSns.length === 0) {
  509. layui.layer.msg('没有可以操作的设备')
  510. return
  511. }
  512. console.log("选择数据:", selectSns)
  513. layer.open({
  514. type: 1,
  515. title: '偏差值',
  516. area: ['400px', '230px'],
  517. content: $('#deviationall'),
  518. btn: ['提交'],
  519. btnAlign: 'c',
  520. yes(index, elem) {
  521. console.log("偏差值数据:", selectSns)
  522. layui.layer.load();
  523. console.log(Number.parseFloat($('#wdbcall').val()))
  524. console.log(Number.parseFloat($('#sdbcall').val()))
  525. let t = parseFloat($('#wdbcall').val());
  526. let h = parseFloat($('#sdbcall').val());
  527. let SensorData = {
  528. type: 0, // 根据实际情况设置类型
  529. sn: Object.keys(selectSns),
  530. mid: 0,
  531. data: []
  532. };
  533. for (let sn in selectSns) {
  534. selectSns[sn].forEach(id => {
  535. SensorData.data.push({ id, t, h });
  536. });
  537. }
  538. console.log(JSON.stringify(SensorData))
  539. $.ajax({
  540. type: "POST",
  541. url: "/Device/WriteDeviationAll",
  542. contentType: "application/json",
  543. data: JSON.stringify(SensorData),
  544. processData: false,
  545. success: function (rlt) {
  546. layui.layer.closeAll('loading');
  547. if (rlt.Code === 200) {
  548. layui.layer.msg(rlt.Msg);
  549. location.reload()
  550. } else if (rlt.Code === 1201) {
  551. if (Array.isArray(rlt.Data) && rlt.Data.length > 0) {
  552. // 构建失败SN的列表字符串
  553. const failedSns = rlt.Data.join('<br>'); // 使用<br>标签换行
  554. // 显示弹窗,用户可以选择关闭
  555. layui.layer.alert('部分设置失败:\n' + failedSns, {
  556. closeBtn: 0,
  557. btn: ['关闭']
  558. });
  559. } else {
  560. layui.layer.msg(rlt.Msg || '未知错误');
  561. }
  562. } else {
  563. layui.layer.msg(rlt.Msg || '未知错误');
  564. }
  565. },
  566. error: function () {
  567. // 关闭加载页面
  568. layui.layer.closeAll('loading');
  569. layui.layer.msg('请求失败,请重试');
  570. },
  571. })
  572. layui.layer.close(index)
  573. }
  574. })
  575. }
  576. //数据重传
  577. function dataRepeat(sn, type) {
  578. let selectSns = {}
  579. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  580. if ($(e).prop('checked')) {
  581. let sn = $(e).attr('data-sn')
  582. let id = $(e).attr('data-id')
  583. if (selectSns[sn] === undefined) {
  584. selectSns[sn] = [id]
  585. } else {
  586. selectSns[sn].push(id)
  587. }
  588. }
  589. layui.layer.msg('请 确您勾选的设备 一定在线! 一定在线! 一定在线!,否则本次设置的参数可能无效!')
  590. })
  591. if (sn == null && selectSns.length === 0) {
  592. layui.layer.msg('没有可以操作的设备')
  593. return
  594. }
  595. let startTime, endTime;
  596. layui.layer.open({
  597. type: 1,
  598. title: '数据重传',
  599. area: ['400px', '230px'],
  600. content: $('#dataRepeat'),
  601. btn: ['提交'],
  602. btnAlign: 'c',
  603. yes(index, elem) {
  604. layui.layer.load();
  605. startTime = $("#startTime").val();
  606. endTime = $("#endTime").val();
  607. console.log(`开始时间:${startTime},结束时间:${endTime}`)
  608. if (startTime === '' || endTime === '') {
  609. layui.layer.msg('开始、结束时间不能为空')
  610. return
  611. }
  612. //如果sn存在则表示针对单个设备
  613. if (sn != null) {
  614. selectSns = {}
  615. selectSns[sn] = [type]
  616. }
  617. $.ajax({
  618. type: 'POST',
  619. url: '/Device/DataRepeat',
  620. data: JSON.stringify({
  621. sns: selectSns,
  622. startTime: startTime,
  623. endTime: endTime
  624. }),
  625. contentType: "application/json;charset=utf-8",
  626. processData: false,
  627. success: function (rlt) {
  628. // 关闭加载页面
  629. layui.layer.closeAll('loading');
  630. if (rlt.Code === 200) {
  631. layui.layer.msg(rlt.Msg);
  632. } else if (rlt.Code === 1201) {
  633. if (Array.isArray(rlt.Data) && rlt.Data.length > 0) {
  634. // 构建失败SN的列表字符串
  635. var failedSns = rlt.Data.join('<br>'); // 使用<br>标签换行
  636. // 显示弹窗,用户可以选择关闭
  637. layui.layer.alert('部分重传失败:\n' + failedSns, {
  638. closeBtn: 0,
  639. btn: ['关闭']
  640. });
  641. } else {
  642. layui.layer.msg(rlt.Msg || '未知错误');
  643. }
  644. } else {
  645. layui.layer.msg(rlt.Msg || '未知错误');
  646. }
  647. },
  648. error: function () {
  649. // 关闭加载页面
  650. layui.layer.closeAll('loading');
  651. layui.layer.msg('请求失败,请重试');
  652. }
  653. })
  654. }
  655. });
  656. }
  657. //初始化日期的操作
  658. layui.use(['laydate', 'form', 'element'],
  659. function () {
  660. var laydate = layui.laydate;
  661. //执行一个laydate实例
  662. laydate.render({
  663. elem: '#startTime' //指定元素
  664. , type: 'datetime'
  665. });
  666. //执行一个laydate实例
  667. laydate.render({
  668. elem: '#endTime' //指定元素
  669. , type: 'datetime'
  670. });
  671. var element = layui.element;
  672. element.length = 30
  673. }
  674. );
  675. //全选
  676. let selectAllField = false
  677. function selectAll() {
  678. selectAllField = true
  679. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  680. $(e).prop('checked', true)
  681. })
  682. }
  683. //反选
  684. function reverseSelect() {
  685. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  686. $(e).prop('checked', !$(e).prop('checked'))
  687. })
  688. }
  689. //全不选
  690. function noSelect() {
  691. $('#tableBody > tr > td > input[type="checkbox"]').each((i, e) => {
  692. $(e).prop('checked', false)
  693. })
  694. }
  695. $(function () {
  696. getDeviceDataList(1) //获取数据列表
  697. })
  698. function Zero() {
  699. // 显示加载页面
  700. layui.layer.load();
  701. $.ajax({
  702. type: "POST",
  703. url: "/Device/SetDeviceDataZero",
  704. contentType: "application/json",
  705. success: function (rlt) {
  706. // 关闭加载页面
  707. layui.layer.closeAll('loading');
  708. if (rlt.Code === 200) {
  709. layui.layer.msg(rlt.Msg);
  710. } else if (rlt.Code === 1201) {
  711. if (Array.isArray(rlt.Data) && rlt.Data.length > 0) {
  712. // 构建失败SN的列表字符串
  713. var failedSns = rlt.Data.join('<br>'); // 使用<br>标签换行
  714. // 显示弹窗,用户可以选择关闭
  715. layui.layer.alert('部分设置失败:\n' + failedSns, {
  716. closeBtn: 0,
  717. btn: ['关闭']
  718. });
  719. } else {
  720. layui.layer.msg(rlt.Msg || '未知错误');
  721. }
  722. } else {
  723. layui.layer.msg(rlt.Msg || '未知错误');
  724. }
  725. },
  726. error: function () {
  727. // 关闭加载页面
  728. layui.layer.closeAll('loading');
  729. layui.layer.msg('请求失败,请重试');
  730. }
  731. });
  732. }
  733. </script>
  734. </body>
  735. </html>