Device.html 34 KB

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