DataList.html 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413
  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. <script src="/static/js/jquery.min.js"></script>
  14. <script src="/static/js/jquery.cookie.min.js"></script>
  15. <script src="/static/lib/layui/layui.js" charset="utf-8"></script>
  16. <script type="text/javascript" src="/static/js/xadmin.js"></script>
  17. </head>
  18. <body>
  19. <div class="x-nav">
  20. <span class="layui-breadcrumb">
  21. <a href="">首页</a>
  22. <a><cite>数据展示</cite></a>
  23. </span>
  24. <a class="layui-btn layui-btn-normal" style="line-height:1.6em;margin-top:3px;float:right"
  25. onclick="location.reload()" title="刷新">
  26. <i class="layui-icon layui-icon-refresh" style="line-height:30px"></i>
  27. </a>
  28. </div>
  29. <div class="layui-fluid">
  30. <div class="layui-row" style="display: flex;">
  31. <!-- 传感器 选择 start-->
  32. <div style="width: 340px">
  33. <div class="layui-card">
  34. <div class="layui-card-body ">
  35. <form class="layui-form layui-col-space5" οnsubmit="return false;">
  36. <div class="layui-input-inline layui-show-xs-block">
  37. <input value="" type="text" id="D_T_sn" name="D_T_sn" placeholder="请输入 SN"
  38. autocomplete="off"
  39. class="layui-input"></div>
  40. <div class="layui-input-inline layui-show-xs-block">
  41. <input value="" type="text" id="D_Name" name="D_Name" placeholder="请输入 传感器名称"
  42. autocomplete="off"
  43. class="layui-input"></div>
  44. <div class="layui-input-inline layui-show-xs-block" style="width: 168px">
  45. <select id="Class_1" name="Class_1">
  46. <option value=0>所有分类</option>
  47. {{range $index, $elem := .Class_List}}
  48. <option value={{$elem.Id}}>{{$elem.T_name}}</option>
  49. {{end}}
  50. </select>
  51. </div>
  52. <div class="layui-input-inline layui-show-xs-block">
  53. <div class="layui-btn layui-btn-normal"
  54. onclick="get_DeviceSensor_list(0)">
  55. <i class="layui-icon">&#xe615;</i></div>
  56. </div>
  57. </form>
  58. <hr>
  59. </div>
  60. <div class="layui-card-body " style="margin-top: -20px">
  61. <div id="DeviceSensor_list" style="width: 98%; overflow: hidden;max-height: 616px;overflow-y: auto">
  62. <div style="color: #1E9FFF;text-align: center;font-size: 15px;margin-top: 150px">加载中...</div>
  63. </div>
  64. </div>
  65. <div class="layui-card-body ">
  66. <div style="height: 70px">
  67. <div class="layui-card-body " style="text-align: center">
  68. <div class="layui-input-inline layui-show-xs-block">
  69. <div class="layui-btn layui-btn-normal"
  70. onclick="Checkboxs_All()">
  71. <i class="layui-icon">全选择</i>
  72. </div>
  73. </div>
  74. <div class="layui-input-inline layui-show-xs-block">
  75. <div class="layui-btn layui-btn-normal"
  76. onclick="Checkboxs_Allno()">
  77. <i class="layui-icon">全取消</i>
  78. </div>
  79. </div>
  80. <div class="layui-input-inline layui-show-xs-block">
  81. <div class="layui-btn layui-btn-normal"
  82. onclick="Checkboxs_Allto()">
  83. <i class="layui-icon">反选</i>
  84. </div>
  85. </div>
  86. <div style="color: #1E9FFF;text-align: center" id="DeviceSensor_list_Pages_x"></div>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. <!-- 传感器 选择 end-->
  93. <div style="padding-left: 15px; height: 100%;flex:1;">
  94. <div class="layui-card">
  95. <!-- 传感器数据时间选择 选择 start-->
  96. <div class="layui-card-body ">
  97. <div class="layui-form layui-col-space5" οnsubmit="return false;">
  98. <div class="layui-input-inline layui-show-xs-block">
  99. <div class="layui-btn layui-btn-normal"
  100. onclick="quick_1()">
  101. <i class="layui-icon">今天</i>
  102. </div>
  103. </div>
  104. <div class="layui-input-inline layui-show-xs-block">
  105. <div class="layui-btn layui-btn-normal"
  106. onclick="quick_2()">
  107. <i class="layui-icon">近一周</i>
  108. </div>
  109. </div>
  110. <div class="layui-input-inline layui-show-xs-block">
  111. <div class="layui-btn layui-btn-normal"
  112. onclick="quick_3()">
  113. <i class="layui-icon">近一月</i>
  114. </div>
  115. </div>
  116. <div class="layui-input-inline layui-show-xs-block">
  117. <div class="layui-btn layui-btn-normal"
  118. onclick="quick_4()">
  119. <i class="layui-icon">近一季度</i>
  120. </div>
  121. </div>
  122. <div class="layui-input-inline layui-show-xs-block">
  123. 自定义时间:
  124. </div>
  125. <div class="layui-inline layui-show-xs-block">
  126. <input class="layui-input" autocomplete="off" placeholder="开始日" name="Time_start"
  127. id="Time_start" lay-key="1"></div>
  128. <div class="layui-inline layui-show-xs-block">
  129. <input class="layui-input" autocomplete="off" placeholder="截止日" name="Time_end"
  130. id="Time_end" lay-key="2"></div>
  131. <div class="layui-input-inline layui-show-xs-block">
  132. <div class="layui-btn layui-btn-normal"
  133. onclick="get_DeviceSensor_data(0)">
  134. <i class="layui-icon">&#xe615;</i></div>
  135. </div>
  136. <div class="layui-input-inline layui-show-xs-block" style="float: right">
  137. <button class="layui-btn layui-btn-normal" id="importData">导入数据</button>
  138. <button class="layui-btn layui-btn-normal" id="exportData" onclick="exportData()">导出数据
  139. </button>
  140. <button class="layui-btn layui-btn-normal" onclick="F_moban()">导入模板说明</button>
  141. </div>
  142. </div>
  143. <hr>
  144. <div>
  145. <button class="layui-btn layui-btn-normal" onclick="selectAll()">全选</button>
  146. <button class="layui-btn layui-btn-normal" onclick="reverseSelect()">反选</button>
  147. <button class="layui-btn layui-btn-normal" onclick="noSelect()">全不选</button>
  148. <button class="layui-btn layui-btn-danger" onclick="deleteSelect()">删除</button>
  149. <button class="layui-btn layui-btn-danger" onclick="deleteSelectTime()">删除选择时间范围同时删除报警信息
  150. </button>
  151. <button class="layui-btn layui-btn-danger" onclick="processingExceededSelectTime()">批量处理超标数据
  152. </button>
  153. </div>
  154. </div>
  155. <!-- 传感器数据时间选择 选择 end-->
  156. <div class="layui-card-body">
  157. <table class="layui-table ">
  158. <colgroup>
  159. <col width="100">
  160. <col>
  161. <col>
  162. <col>
  163. <col>
  164. <col>
  165. <col>
  166. <col>
  167. </colgroup>
  168. <thead>
  169. <tr>
  170. <th>选择</th>
  171. <th style="width: 120px;">采集时间
  172. <button type="button" class="layui-btn-primary layui-btn-xs layui-btn-radius sort" onclick="SortButton()">
  173. <i class="layui-icon layui-icon-up"></i>
  174. </button>
  175. <button type="button" class="layui-btn-primary layui-btn-xs layui-btn-radius sort" onclick="SortButton()">
  176. <i class="layui-icon layui-icon-down"></i>
  177. </button>
  178. </th>
  179. <th>温度℃</th>
  180. <th>湿度%</th>
  181. <th>温湿度上下限</th>
  182. <th>GPS</th>
  183. <th>录入时间</th>
  184. <th>操作</th>
  185. <th style="display: none">操作</th>
  186. </tr>
  187. </thead>
  188. <tbody id="DeviceSensor_data">
  189. </tbody>
  190. </table>
  191. </div>
  192. <div class="layui-card-body " style="display: flex;justify-content: space-between">
  193. <!--按钮部分 start-->
  194. <div>
  195. <span>每页显示:</span>
  196. <select id="perPageSelect">
  197. <option value="10">10条/页</option>
  198. <option value="100">100条/页</option>
  199. <option value="300">300条/页</option>
  200. <option value="500">500条/页</option>
  201. <option value="800">800条/页</option>
  202. <option value="1000">1000条/页</option>
  203. <option value="2000">2000条/页</option>
  204. <option value="3000">3000条/页</option>
  205. <option value="4000">4000条/页</option>
  206. <option value="5000">5000条/页</option>
  207. </select>
  208. </div>
  209. <!--按钮部分 end-->
  210. <!--分页部分 start-->
  211. <div id="pageTool">
  212. </div>
  213. <!-- <input type="number" id="perPageInput" min="1" value="10">-->
  214. <!--分页部分 end-->
  215. </div>
  216. </div>
  217. </div>
  218. </div>
  219. <!--数据记录展示-->
  220. <div id="recordShow" style="display: none">
  221. <table class="layui-table">
  222. <colgroup>
  223. <col width="20px">
  224. <col width="20px">
  225. <col>
  226. <col>
  227. <col>
  228. <col>
  229. </colgroup>
  230. <thead>
  231. <tr>
  232. <th>温度</th>
  233. <th>湿度</th>
  234. <th>GPS</th>
  235. <th>操作人</th>
  236. <th>录入时间</th>
  237. <th>操作</th>
  238. </tr>
  239. </thead>
  240. <tbody id="recordTableBody"></tbody>
  241. </table>
  242. </div>
  243. <!-- 批量处理超标数据参数设置弹窗 -->
  244. <div id="paramModal" style="display: none;">
  245. <div style="position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.5);z-index: 9999;">
  246. <div style="position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);background-color: white;padding: 20px;border-radius: 10px;min-width: 500px;">
  247. <h3 style="margin-top: 0;">批量处理超标数据参数设置</h3>
  248. <div style="margin-bottom: 15px;">
  249. <label style="display: inline-block;width: 100px;">温度上限:</label>
  250. <input type="number" id="modalTempUpper" value="8" style="width: 80px;" step="0.1">
  251. <label style="display: inline-block;width: 100px;margin-left: 20px;">变化区间:</label>
  252. <input type="number" id="modalTempUpperMin" value="7.5" style="width: 80px;" step="0.1"> ~
  253. <input type="number" id="modalTempUpperMax" value="7.9" style="width: 80px;" step="0.1">
  254. </div>
  255. <div style="margin-bottom: 15px;">
  256. <label style="display: inline-block;width: 100px;">温度下限:</label>
  257. <input type="number" id="modalTempLower" value="2" style="width: 80px;" step="0.1">
  258. <label style="display: inline-block;width: 100px;margin-left: 20px;">变化区间:</label>
  259. <input type="number" id="modalTempLowerMin" value="2.2" style="width: 80px;" step="0.1"> ~
  260. <input type="number" id="modalTempLowerMax" value="2.5" style="width: 80px;" step="0.1">
  261. </div>
  262. <div style="margin-bottom: 15px;">
  263. <label style="display: inline-block;width: 100px;">湿度上限:</label>
  264. <input type="number" id="modalHumidUpper" value="75" style="width: 80px;" step="0.1">
  265. <label style="display: inline-block;width: 100px;margin-left: 20px;">变化区间:</label>
  266. <input type="number" id="modalHumidUpperMin" value="70" style="width: 80px;" step="0.1"> ~
  267. <input type="number" id="modalHumidUpperMax" value="74" style="width: 80px;" step="0.1">
  268. </div>
  269. <div style="margin-bottom: 20px;">
  270. <label style="display: inline-block;width: 100px;">湿度下限:</label>
  271. <input type="number" id="modalHumidLower" value="35" style="width: 80px;" step="0.1">
  272. <label style="display: inline-block;width: 100px;margin-left: 20px;">变化区间:</label>
  273. <input type="number" id="modalHumidLowerMin" value="34" style="width: 80px;" step="0.1"> ~
  274. <input type="number" id="modalHumidLowerMax" value="39" style="width: 80px;" step="0.1">
  275. </div>
  276. <div style="text-align: center;">
  277. <button type="button" class="layui-btn layui-btn-normal" onclick="confirmProcessing()" style="margin-right: 10px;">确认处理</button>
  278. <button type="button" class="layui-btn layui-btn-primary" onclick="closeParamModal()">取消</button>
  279. </div>
  280. </div>
  281. </div>
  282. </div>
  283. </div>
  284. </body>
  285. <script>
  286. let uploadInst
  287. //获取GET
  288. function getPar(par) {
  289. //获取当前URL
  290. var local_url = document.location.href;
  291. //获取要取得的get参数位置
  292. var get = local_url.indexOf(par + "=")
  293. ;
  294. if (get === -1) {
  295. return false;
  296. }
  297. //截取字符串
  298. //截取字符串
  299. var get_par = local_url.slice(par.length + get + 1);
  300. //判断截取后的字符串是否还有其他get参数
  301. var nextPar = get_par.indexOf("&")
  302. ;
  303. if (nextPar !== -1) {
  304. get_par = get_par.slice(0, nextPar);
  305. }
  306. return get_par;
  307. }
  308. function ChangeDiv(e) {
  309. // var divs = document.getElementsByClassName("ChangeDiv");
  310. // var len = divs.length;
  311. // for(var i=0;i<len;i++){
  312. // divs[i].style.border = "1px solid #ffffff";
  313. // }
  314. // e.style.border = "1px solid #ed0000";
  315. }
  316. // 今天
  317. function quick_1() {
  318. var myDate = new Date();
  319. y = myDate.getFullYear(); //获取当前年份(2位)
  320. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  321. d = myDate.getDate(); //获取当前日(1-31)
  322. console.log(y + "-" + m + "-" + d)
  323. Time_start = y + "-" + m + "-" + d + " 00:00:00"
  324. Time_end = y + "-" + m + "-" + d + " 23:59:59"
  325. $("#Time_start").val(Time_start)
  326. $("#Time_end").val(Time_end)
  327. get_DeviceSensor_data(0)
  328. }
  329. // 近一周
  330. function quick_2() {
  331. var myDate = new Date();
  332. y = myDate.getFullYear(); //获取当前年份(2位)
  333. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  334. d = myDate.getDate(); //获取当前日(1-31)
  335. console.log(y + "-" + m + "-" + d)
  336. Time_end = y + "-" + m + "-" + d + " 23:59:59"
  337. $("#Time_end").val(Time_end)
  338. myDate = myDate.setDate(myDate.getDay() - 6);
  339. myDate = new Date(myDate);
  340. y = myDate.getFullYear(); //获取当前年份(2位)
  341. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  342. d = myDate.getDate(); //获取当前日(1-31)
  343. Time_start = y + "-" + m + "-" + d + " 00:00:00"
  344. $("#Time_start").val(Time_start)
  345. get_DeviceSensor_data(0)
  346. }
  347. // 近一月
  348. function quick_3() {
  349. var myDate = new Date();
  350. y = myDate.getFullYear(); //获取当前年份(2位)
  351. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  352. d = myDate.getDate(); //获取当前日(1-31)
  353. console.log(y + "-" + m + "-" + d)
  354. Time_end = y + "-" + m + "-" + d + " 23:59:59"
  355. $("#Time_end").val(Time_end)
  356. myDate = myDate.setDate(myDate.getDate() - 30);
  357. myDate = new Date(myDate);
  358. y = myDate.getFullYear(); //获取当前年份(2位)
  359. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  360. d = myDate.getDate(); //获取当前日(1-31)
  361. Time_start = y + "-" + m + "-" + d + " 00:00:00"
  362. $("#Time_start").val(Time_start)
  363. get_DeviceSensor_data(0)
  364. }
  365. // 近一季度
  366. function quick_4() {
  367. var myDate = new Date();
  368. y = myDate.getFullYear(); //获取当前年份(2位)
  369. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  370. d = myDate.getDate(); //获取当前日(1-31)
  371. console.log(y + "-" + m + "-" + d)
  372. Time_end = y + "-" + m + "-" + d + " 23:59:59"
  373. $("#Time_end").val(Time_end)
  374. myDate = myDate.setDate(myDate.getDate() - 30 * 3);
  375. myDate = new Date(myDate);
  376. y = myDate.getFullYear(); //获取当前年份(2位)
  377. m = myDate.getMonth() + 1; //获取当前月份(0-11,0代表1月)
  378. d = myDate.getDate(); //获取当前日(1-31)
  379. Time_start = y + "-" + m + "-" + d + " 00:00:00"
  380. $("#Time_start").val(Time_start)
  381. get_DeviceSensor_data(0)
  382. }
  383. layui.use(['laydate', 'form', 'element'],
  384. function () {
  385. var laydate = layui.laydate;
  386. //执行一个laydate实例
  387. laydate.render({
  388. elem: '#Time_start' //指定元素
  389. , type: 'datetime'
  390. });
  391. //执行一个laydate实例
  392. laydate.render({
  393. elem: '#Time_end' //指定元素
  394. , type: 'datetime'
  395. });
  396. var element = layui.element;
  397. element.length = 30
  398. });
  399. var T_name = ""
  400. var T_sn = ""
  401. var T_class_id = 0
  402. var T_id = 0
  403. var T_sn_T_id = ""
  404. var Time_start = ""
  405. var Time_end = ""
  406. var sort = "DESC"
  407. var DeviceSensor_lite = []
  408. var DeviceSensor_data = []
  409. var DeviceSensor_snid_list = ""
  410. /// --------------- 传感器列表
  411. // 页面 加载完成后执行
  412. window.onload = function () {
  413. console.log("页面 加载完成后执行")
  414. quick_1()
  415. get_DeviceSensor_list(0)
  416. }
  417. //获取div中所有的复选框 .value
  418. var checkboxs = document.getElementsByClassName("checkboxxx");
  419. function Checkboxs_All() {
  420. for (var i = 0; i < checkboxs.length; i++) {
  421. checkboxs[i].checked = true
  422. }
  423. }
  424. function Checkboxs_Allno() {
  425. for (var i = 0; i < checkboxs.length; i++) {
  426. checkboxs[i].checked = false
  427. }
  428. }
  429. function Checkboxs_Allto() {
  430. for (var i = 0; i < checkboxs.length; i++) {
  431. if (checkboxs[i].checked) {
  432. checkboxs[i].checked = false
  433. } else {
  434. checkboxs[i].checked = true
  435. }
  436. }
  437. }
  438. function Checkboxs_GetAll() {
  439. DeviceSensor_snid_list = ""
  440. for (var i = 0; i < checkboxs.length; i++) {
  441. if (checkboxs[i].checked) {
  442. DeviceSensor_snid_list = DeviceSensor_snid_list + checkboxs[i].value + "|"
  443. }
  444. }
  445. }
  446. function SortButton(){
  447. sort = sort === "DESC"? "ASC" : "DESC"
  448. get_DeviceSensor_data(0, $('#perPageSelect').val())
  449. }
  450. function get_DeviceSensor_list(page) {
  451. T_sn = $("#D_T_sn").val();
  452. T_name = $("#D_Name").val();
  453. T_class_id = $("#Class_1").val();
  454. $.ajax({
  455. type: 'POST',
  456. url: '/Data/Device_Sensor_List',//发送请求
  457. data: {
  458. User_tokey: $.cookie("User_tokey"),
  459. T_sn: T_sn,
  460. T_name: T_name,
  461. T_class_id: parseInt(T_class_id),
  462. page: page,
  463. page_z: 1000,
  464. },
  465. success: function (result) {
  466. console.log(result)
  467. if (result.Code == 200) {
  468. if (page == 0)
  469. $('#DeviceSensor_list').html("")
  470. // $('#DeviceSensor_list_Pages').html("")
  471. // $('#DeviceSensor_list_Pages_x').html("")
  472. DeviceSensor_lite = result.Data.DeviceSensor_lite
  473. if (DeviceSensor_lite.length == 0) {
  474. $('#DeviceSensor_list').html("<div style=\"color: #1E9FFF;text-align: center;font-size: 15px;margin-top: 150px\">没有设备</div>")
  475. return
  476. }
  477. Add_DeviceSensor_list(result.Data.DeviceSensor_lite) // 列表
  478. // Add_DeviceSensor_list_Pages(result.Data.Pages) // 分页
  479. $('#DeviceSensor_list_Pages_x').html(" 传感器 总数:" + result.Data.Num);
  480. if (result.Data.Page_size > result.Data.Page) {
  481. get_DeviceSensor_list(result.Data.Page + 1)
  482. }
  483. } else {
  484. }
  485. }
  486. });
  487. return false
  488. }
  489. //选择所有选择框
  490. let sensors = []
  491. function selectAll() {
  492. sensors = []
  493. $('#DeviceSensor_data > tr > td > input[type="checkbox"]').each((i, e) => {
  494. $(e).prop('checked', true)
  495. })
  496. }
  497. //反选
  498. function reverseSelect() {
  499. sensors = []
  500. $('#DeviceSensor_data > tr > td > input[type="checkbox"]').each((i, e) => {
  501. $(e).prop('checked', !$(e).prop('checked'))
  502. })
  503. }
  504. //全不选
  505. function noSelect() {
  506. sensors = []
  507. $('#DeviceSensor_data > tr > td > input[type="checkbox"]').each((i, e) => {
  508. $(e).prop('checked', false)
  509. })
  510. }
  511. //删除所选择的内容
  512. function deleteSelect() {
  513. //获取选择的行
  514. sensors = []
  515. $('#DeviceSensor_data > tr > td > input[type="checkbox"]').each((i, e) => {
  516. if ($(e).prop('checked')) {
  517. let t = {
  518. t_sn: $(e).attr('data-sn'),
  519. t_id: Number.parseInt($(e).attr('data-id')),
  520. create_time: ($(e).attr('data-createtime')),
  521. t_t: Number.parseFloat($(e).attr('data-tt')),
  522. t_rh: Number.parseFloat($(e).attr('data-trh')),
  523. t_site: $(e).attr('data-site'),
  524. t_sp : Number.parseFloat($(e).attr('data-sp')),
  525. t_time: $(e).attr('data-time'),
  526. }
  527. sensors.push(t)
  528. }
  529. })
  530. console.log(sensors)
  531. if (sensors.length == 0) {
  532. layui.layer.msg('没有选中要删除的记录哦!')
  533. return
  534. }
  535. layui.layer.confirm(`是否删除选中${sensors.length}条记录`, {title: '删除记录'}, function (index) {
  536. $.ajax({
  537. type: "POST",
  538. url: '/Data/Device_Sensor_List_Delete',
  539. data: JSON.stringify(sensors),
  540. cookie: $.cookie("User_tokey"),
  541. contentType: 'application/json;charset=utf-8',
  542. success: function (rlt) {
  543. if (rlt.Code == 200) {
  544. layui.layer.msg(`删除${sensors.length}条数据成功!`)
  545. get_DeviceSensor_data(0)
  546. } else {
  547. layui.layer.msg(rlt.Msg)
  548. }
  549. }
  550. })
  551. layui.layer.close(index);
  552. });
  553. }
  554. //删除选择时间范围
  555. function deleteSelectTime() {
  556. // 获取选择的行
  557. console.log("删除选中事件范围")
  558. const Time_start = $("#Time_start").val();
  559. const Time_end = $("#Time_end").val();
  560. console.log("删除选中事件范围", Time_start, Time_end)
  561. let checkboxes = $('.checkboxxx');
  562. let querys = {
  563. t_sn: [],
  564. t_id: [],
  565. time_start:Time_start,
  566. time_end:Time_end,
  567. };
  568. checkboxes.each(function () {
  569. if ($(this).is(':checked')) {
  570. const checkboxValue = $(this).val();
  571. const values = checkboxValue.split(',');
  572. const sn = values[0];
  573. const id = values[1];
  574. console.log(sn, id);
  575. querys.t_sn.push(sn);
  576. querys.t_id.push(id);
  577. }
  578. });
  579. if (querys.length === 0) {
  580. layui.layer.msg('没有选中要删除的记录哦!')
  581. }else {
  582. layui.layer.confirm(`是否删除选中时间: ${Time_start}-------${Time_end} 的数据,同时会删除对应时间报警数据!!!!!!`, function (index) {
  583. $.ajax({
  584. type: "POST",
  585. url: `/Data/Device_Sensor_List_Delete_Time`,
  586. data: JSON.stringify(querys),
  587. contentType: 'application/json;charset=utf-8',
  588. success: function (res) {
  589. console.log(res.Code)
  590. if (res.Code === 200) {
  591. layui.layer.msg(`成功删除 ${res.Data} 条数据`);
  592. get_DeviceSensor_data(0);
  593. } else {
  594. layui.layer.msg(res.Msg);
  595. }
  596. }
  597. });
  598. layui.layer.close(index);
  599. });
  600. }
  601. }
  602. //批量处理超标数据
  603. function processingExceededSelectTime() {
  604. // 获取选择的行
  605. console.log("删除选中事件范围")
  606. const Time_start = $("#Time_start").val();
  607. const Time_end = $("#Time_end").val();
  608. console.log("删除选中事件范围", Time_start, Time_end)
  609. let checkboxes = $('.checkboxxx');
  610. let querys = {
  611. t_sn: [],
  612. t_id: [],
  613. time_start:Time_start,
  614. time_end:Time_end,
  615. };
  616. checkboxes.each(function () {
  617. if ($(this).is(':checked')) {
  618. const checkboxValue = $(this).val();
  619. const values = checkboxValue.split(',');
  620. const sn = values[0];
  621. const id = values[1];
  622. console.log(sn, id);
  623. querys.t_sn.push(sn);
  624. querys.t_id.push(id);
  625. }
  626. });
  627. if (querys.length === 0) {
  628. layui.layer.msg('没有选中要处理的记录!')
  629. } else {
  630. // 显示参数设置弹窗
  631. $("#paramModal").show();
  632. }
  633. }
  634. // 确认处理
  635. function confirmProcessing() {
  636. // 获取自定义参数
  637. const tempUpper = $("#modalTempUpper").val();
  638. const tempUpperMin = $("#modalTempUpperMin").val();
  639. const tempUpperMax = $("#modalTempUpperMax").val();
  640. const tempLower = $("#modalTempLower").val();
  641. const tempLowerMin = $("#modalTempLowerMin").val();
  642. const tempLowerMax = $("#modalTempLowerMax").val();
  643. const humidUpper = $("#modalHumidUpper").val();
  644. const humidUpperMin = $("#modalHumidUpperMin").val();
  645. const humidUpperMax = $("#modalHumidUpperMax").val();
  646. const humidLower = $("#modalHumidLower").val();
  647. const humidLowerMin = $("#modalHumidLowerMin").val();
  648. const humidLowerMax = $("#modalHumidLowerMax").val();
  649. // 获取之前保存的查询条件
  650. const Time_start = $("#Time_start").val();
  651. const Time_end = $("#Time_end").val();
  652. let checkboxes = $('.checkboxxx');
  653. let querys = {
  654. t_sn: [],
  655. t_id: [],
  656. time_start:Time_start,
  657. time_end:Time_end,
  658. tempUpper: tempUpper,
  659. tempUpperMin: tempUpperMin,
  660. tempUpperMax: tempUpperMax,
  661. tempLower: tempLower,
  662. tempLowerMin: tempLowerMin,
  663. tempLowerMax: tempLowerMax,
  664. humidUpper: humidUpper,
  665. humidUpperMin: humidUpperMin,
  666. humidUpperMax: humidUpperMax,
  667. humidLower: humidLower,
  668. humidLowerMin: humidLowerMin,
  669. humidLowerMax: humidLowerMax,
  670. };
  671. checkboxes.each(function () {
  672. if ($(this).is(':checked')) {
  673. const checkboxValue = $(this).val();
  674. const values = checkboxValue.split(',');
  675. const sn = values[0];
  676. const id = values[1];
  677. console.log(sn, id);
  678. querys.t_sn.push(sn);
  679. querys.t_id.push(id);
  680. }
  681. });
  682. // 关闭弹窗
  683. closeParamModal();
  684. layui.layer.confirm(`批量处理超标数据 选中时间: ${Time_start}-------${Time_end} 的数据,同时会删除对应时间报警数据!!!!!!`, function (index) {
  685. $.ajax({
  686. type: "POST",
  687. url: `/Data/Device_Sensor_List_processingExceededSelect_Time`,
  688. data: JSON.stringify(querys),
  689. contentType: 'application/json;charset=utf-8',
  690. success: function (res) {
  691. console.log(res.Code)
  692. if (res.Code === 200) {
  693. layui.layer.msg(`批量处理超标数据 成功`);
  694. get_DeviceSensor_data(0);
  695. } else {
  696. layui.layer.msg(res.Msg);
  697. }
  698. }
  699. });
  700. layui.layer.close(index);
  701. });
  702. }
  703. // 关闭参数设置弹窗
  704. function closeParamModal() {
  705. $("#paramModal").hide();
  706. }
  707. //删除当前行,当当前行按钮被点击后
  708. function deleteOne(e) {
  709. e = $(e).parent().prevAll()
  710. e = e[e.length - 1]
  711. e = $(e).children()[0]
  712. // console.log(e, "==============")
  713. let t = {
  714. t_sn: $(e).attr('data-sn'),
  715. t_id: Number.parseInt($(e).attr('data-id')),
  716. create_time: ($(e).attr('data-createtime')),
  717. t_t: Number.parseFloat($(e).attr('data-tt')),
  718. t_rh: Number.parseFloat($(e).attr('data-trh')),
  719. t_site: $(e).attr('data-site'),
  720. t_sp : Number.parseFloat($(e).attr('data-sp')),
  721. t_time: $(e).attr('data-time'),
  722. }
  723. layui.layer.confirm(`是否删除选中 sn: ${t.t_sn} 1 条记录`, {title: '删除记录'}, function (index) {
  724. $.ajax({
  725. type: "POST",
  726. url: '/Data/Device_Sensor_List_Delete',
  727. data: JSON.stringify([t]),
  728. contentType: 'application/json;charset=utf-8',
  729. success: function (rlt) {
  730. if (rlt.Code == 200) {
  731. layui.layer.msg(`删除1条数据成功!`)
  732. get_DeviceSensor_data(0)
  733. } else {
  734. layui.layer.msg(rlt.Msg)
  735. }
  736. }
  737. })
  738. layui.layer.close(index);
  739. });
  740. }
  741. function Add_DeviceSensor_list(DS_lite) {
  742. for (let i = 0; i < DS_lite.length; i++) {
  743. if (T_id == 0) {
  744. T_id = DS_lite[i].T_id;
  745. T_sn_T_id = DS_lite[i].T_sn;
  746. get_DeviceSensor_data(0)
  747. }
  748. $('#DeviceSensor_list').append("" +
  749. "<div class=\"layui-col ChangeDiv\" onclick=\"ChangeDiv(this);T_id = " + DS_lite[i].T_id + ";T_sn_T_id = '" + DS_lite[i].T_sn + "';\" \n" +
  750. " style=\"border: 1px solid #ffffff;height: 52px;background-color: #fafafa;border-radius:5px;padding-top: 2px;margin-top: 6px;\">\n" +
  751. " <input type=\"checkbox\" id='sn_id_" + DS_lite[i].T_sn + "_" + DS_lite[i].T_id + "' name='checkboxxx' class='checkboxxx' value='" + DS_lite[i].T_sn + "," + DS_lite[i].T_id + "' style='float: left;width: 18px;height: 18px;margin-top: 16px;margin-left: 10px;'/>" +
  752. "<img style=\"float: left;width: 50px;margin: 0px 10px\" src=\"/static/images/温湿度传感器-1.png\"\n" +
  753. " height=\"50\"\n" +
  754. " width=\"40\"/>\n" +
  755. " <div style=\"float: left;\">\n" +
  756. " <div style=\"margin-top: 4px;font-size: 14px;height: 24px;\">" + DS_lite[i].T_name + "</div>\n" +
  757. " <div style=\"margin-top: -3px;font-size: 12px\">SN:" + DS_lite[i].T_sn + " [" + DS_lite[i].T_id + "]</div>\n" +
  758. " </div>\n" +
  759. " <div class=\"layui-card-header\"\n" +
  760. " style=\"float: right;padding-left: 0px;padding-top: 6px;color: #1E9FFF\">\n" +
  761. " \n" +
  762. " </div>\n" +
  763. " </div>")
  764. }
  765. }
  766. $('#perPageSelect').on('change', function () {
  767. let itemsPerPage = $(this).val();
  768. get_DeviceSensor_data(0, itemsPerPage); // 调用获取数据函数,传入新的每页条数
  769. });
  770. // 如果是输入框,则可能需要验证用户输入并做相应的处理
  771. $('#perPageInput').on('input', function () {
  772. let itemsPerPage = parseInt($(this).val());
  773. if (!isNaN(itemsPerPage)) {
  774. get_DeviceSensor_data(0, itemsPerPage);
  775. } else {
  776. alert('请输入有效的数字!');
  777. $(this).val('10'); // 重置为默认值
  778. }
  779. });
  780. function get_DeviceSensor_data(page, itemsPerPage) {
  781. if ($("#Time_start").val().length > 0) {
  782. Time_start = $("#Time_start").val();
  783. } else {
  784. Time_start = ""
  785. }
  786. if ($("#Time_end").val().length > 0) {
  787. Time_end = $("#Time_end").val();
  788. } else {
  789. Time_end = ""
  790. }
  791. Checkboxs_GetAll()
  792. var loading = layer.load(0, {
  793. shade: false,
  794. time: 99 * 1000
  795. });
  796. $.ajax({
  797. type: 'POST',
  798. url: 'Device_Sensor_Data_More',//发送请求
  799. data: {
  800. User_tokey: $.cookie("User_token"),
  801. Time_start: Time_start,
  802. Time_end: Time_end,
  803. T_snid: DeviceSensor_snid_list,
  804. sort: sort,
  805. page: page,
  806. page_z: itemsPerPage,
  807. },
  808. success: function (result) {
  809. layer.close(loading)
  810. if (result.Code == 200) {
  811. $('#DeviceSensor_data').html("")
  812. $('#DeviceSensor_data_Pages').html("")
  813. $('#DeviceSensor_data_Pages_x').html("")
  814. if (result.Data != null) {
  815. DeviceSensor_data = result.Data.list
  816. }
  817. if (DeviceSensor_data.length == 0) {
  818. $('#DeviceSensor_data').html("<div style=\"color: #1E9FFF;text-align: center;font-size: 15px;margin-top: 150px\">没有数据</div>")
  819. return
  820. }
  821. addDeviceSensorData(result.Data.list)
  822. addDeviceSensorDataPage(result.Data, itemsPerPage)
  823. } else {
  824. }
  825. }
  826. });
  827. return false
  828. }
  829. function f_Device_Sensor_Data_Pu_data(Sn, tap, num, id) {
  830. $.ajax({
  831. type: 'POST',
  832. url: 'Device_Sensor_Data_Pu_data',//发送请求
  833. data: {
  834. Sn: Sn,
  835. tap: tap,
  836. num: num,
  837. id: id,
  838. },
  839. success: function (result) {
  840. if (result.Code != 200) {
  841. layer.msg(result.Msg);
  842. }
  843. }
  844. });
  845. }
  846. function f_Device_Sensor_Data_Del_data(Sn, id) {
  847. $.ajax({
  848. type: 'POST',
  849. url: 'Device_Sensor_Data_Del_data',//发送请求
  850. data: {
  851. Sn: Sn,
  852. id: id,
  853. },
  854. success: function (result) {
  855. if (result.Code != 200) {
  856. layer.msg(result.Msg);
  857. }
  858. get_DeviceSensor_data(0)
  859. }
  860. });
  861. }
  862. function ShowElement(element) {
  863. var oldhtml = element.innerHTML;
  864. var newobj = document.createElement('input');
  865. //创建新的input元素
  866. newobj.type = 'text';
  867. //为新增元素添加类型
  868. console.log(oldhtml)
  869. console.log(element.dataset.th)
  870. console.log(element.dataset.sn)
  871. console.log(element.dataset.id)
  872. newobj.value = oldhtml
  873. newobj.onblur = function () {
  874. console.log(this.value)
  875. element.innerHTML = this.value ? this.value : oldhtml;
  876. if (element.dataset.th == 1) {
  877. f_Device_Sensor_Data_Pu_data(element.dataset.sn, "t_t", this.value, element.dataset.id)
  878. } else {
  879. f_Device_Sensor_Data_Pu_data(element.dataset.sn, "t_rh", this.value, element.dataset.id)
  880. }
  881. //当触发时判断新增元素值是否为空,为空则不修改,并返回原有值
  882. }
  883. element.innerHTML = '';
  884. element.appendChild(newobj);
  885. newobj.focus();
  886. }
  887. //分页添加
  888. function addDeviceSensorDataPage(pageInfo, itemsPerPage) {
  889. let start, end
  890. start = pageInfo.currentPage - 5 < 1 ? 1 : pageInfo.currentPage - 5
  891. end = pageInfo.currentPage + 5 > pageInfo.totalPage ? pageInfo.totalPage : pageInfo.currentPage + 5
  892. end = end + Math.abs(end - start - 10) > pageInfo.totalPage ? pageInfo.totalPage : end + Math.abs(end - start - 10)
  893. $('#pageTool').html('')
  894. $('#pageTool').append(`<span style="padding: 0 10px;color: #0bace6">共${pageInfo.totalPage}页 / 当前${pageInfo.currentPage}页 共${pageInfo.totalCount}条数据</span>`)
  895. //上一页
  896. if (pageInfo.previousPage) {
  897. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-sm" onclick="get_DeviceSensor_data(${pageInfo.currentPage - 1},${itemsPerPage})">上一页</button>`)
  898. } else {
  899. $('#pageTool').append(`<button class="layui-btn layui-btn-disabled layui-btn-primary layui-btn-sm">上一页</button>`)
  900. }
  901. //页码
  902. for (; start <= end; start++) {
  903. if (start == pageInfo.currentPage) {
  904. $('#pageTool').append(`<button class="layui-btn layui-btn-disabled layui-btn-primary layui-btn-sm">${start}</button>`)
  905. } else {
  906. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-sm" onclick="get_DeviceSensor_data(${start},${itemsPerPage})">${start}</button>`)
  907. }
  908. }
  909. //下一页
  910. if (pageInfo.nextPage) {
  911. $('#pageTool').append(`<button class="layui-btn layui-btn-primary layui-btn-sm" onclick="get_DeviceSensor_data(${pageInfo.currentPage + 1},${itemsPerPage})">下一页</button>`)
  912. } else {
  913. $('#pageTool').append(`<button class="layui-btn layui-btn-disabled layui-btn-primary layui-btn-sm">下一页</button>`)
  914. }
  915. }
  916. //添加设备数据
  917. // function addDeviceSensorData(list) {
  918. // console.log("================",list)
  919. // let style
  920. // for (let v of list) {
  921. // if (v.t_t < v.t_tl || v.t_rh < v.t_rhl) {
  922. // style = 'style="background-color: #df0f07'
  923. // }
  924. // if (v.t_t > v.t_tu || v.t_rh > v.t_rhu) {
  925. // style = 'style="background-color: #df0f07'
  926. // }
  927. // $('#DeviceSensor_data').append(`
  928. // <tr>
  929. // <td><input type="checkbox" class="layui-form-checkbox" data-sn="${v.t_sn}" data-sp="${v.t_sp}" data-time="${v.t_time}" data-id="${v.t_id}" data-tt="${v.t_t}" data-trh="${v.t_rh}" data-site="${v.t_site}" data-createTime="${v.create_time}" data-tsp="${v.t_sp}"/></td>
  930. // <td ondblclick="changeData(this)" data-type="t_time">${v.t_time}</td>
  931. // <td ondblclick="changeData(this)" data-type="t_t">${v.t_t}</td>
  932. // <td ondblclick="changeData(this)" data-type="t_rh">${v.t_rh}</td>
  933. // <td ondblclick="changeData(this)" data-type="t__tlower">${v.t_tl}~${v.t_tu}|${v.t_rhl}~${v.t_rhu}</td>
  934. // <td ondblclick="changeData(this)" data-type="t_site">${v.t_site}</td>
  935. // <td ondblclick="changeData(this)" data-type="create_time">${v.create_time}</td>
  936. // <td>
  937. // <button class="layui-btn layui-btn-danger layui-btn-sm" onclick="deleteOne(this)">删除</button>
  938. // <button class="layui-btn layui-bg-blue layui-btn-sm" onclick="copyAndAdds(this, '${v.t_sn}', ${v.t_id}, ${v.t_t}, ${v.t_rh}, '${v.t_site}', '${v.create_time}')">复制添加</button>
  939. // </td>
  940. // <td ondblclick="changeData(this)" data-type="t_sp" style="display: none">${v.t_sp}</td>
  941. //
  942. // </tr>
  943. // `)
  944. // /*
  945. //
  946. // <button class="layui-btn layui-btn-normal layui-btn-sm" onclick="showRecord(this)">记录</button>
  947. // */
  948. // }
  949. // }
  950. function addDeviceSensorData(list) {
  951. console.log("================", list);
  952. for (let v of list) {
  953. let style = '';
  954. if (v.t_t < v.t_tl || v.t_rh < v.t_rhl || v.t_t > v.t_tu || v.t_rh > v.t_rhu) {
  955. style = 'style="background-color: #FFD700;"';
  956. }
  957. $('#DeviceSensor_data').append(`
  958. <tr ${style}>
  959. <td><input type="checkbox" class="layui-form-checkbox" data-sn="${v.t_sn}" data-sp="${v.t_sp}" data-time="${v.t_time}" data-id="${v.t_id}" data-tt="${v.t_t}" data-trh="${v.t_rh}" data-site="${v.t_site}" data-createTime="${v.create_time}" data-tsp="${v.t_sp}"/></td>
  960. <td ondblclick="changeData(this)" data-type="t_time">${v.t_time}</td>
  961. <td ondblclick="changeData(this)" data-type="t_t">${v.t_t}</td>
  962. <td ondblclick="changeData(this)" data-type="t_rh">${v.t_rh}</td>
  963. <td ondblclick="changeData(this)" data-type="t__tlower">${v.t_tl}~${v.t_tu}|${v.t_rhl}~${v.t_rhu}</td>
  964. <td ondblclick="changeData(this)" data-type="t_site">${v.t_site}</td>
  965. <td ondblclick="changeData(this)" data-type="create_time">${v.create_time}</td>
  966. <td>
  967. <button class="layui-btn layui-btn-danger layui-btn-sm" onclick="deleteOne(this)">删除</button>
  968. <button class="layui-btn layui-bg-blue layui-btn-sm" onclick="copyAndAdds(this, '${v.t_sn}', ${v.t_id}, ${v.t_t}, ${v.t_rh}, '${v.t_site}', '${v.create_time}')">复制添加</button>
  969. </td>
  970. <td ondblclick="changeData(this)" data-type="t_sp" style="display: none">${v.t_sp}</td>
  971. </tr>
  972. `);
  973. }
  974. }
  975. // 新增copyAndAdd函数实现复制并添加新行
  976. function copyAndAdds(button, t_sn, t_id, t_t, t_rh, t_site, create_time) {
  977. // 准备发送给后端的数据对象
  978. let dataToSend = {
  979. t_sn: t_sn,
  980. t_id: t_id,
  981. t_t: t_t,
  982. t_rh: t_rh,
  983. t_site: t_site,
  984. createTime: create_time
  985. };
  986. // 提交数据到后端
  987. $.ajax({
  988. url: '/Device/Device_Copy', // 替换为你的后端接口地址
  989. type: 'POST',
  990. contentType: 'application/json',
  991. data: JSON.stringify(dataToSend),
  992. success: function (response) {
  993. console.log("数据提交成功,响应:", response.Data);
  994. // 假设后端返回了新行ID或者其他需要的数据,这里可以根据需要处理response
  995. let newRowId = response.id; // 假设后端返回了新行的唯一ID
  996. // 根据后端返回的数据(如果有的话)来构造新行的HTML
  997. let newRowHtml = `
  998. <tr class="new-row" data-id="${response.id}" style="background-color: #f0f8ff; border-left: 4px solid #007bff;">
  999. <td>
  1000. <input
  1001. type="checkbox"
  1002. class="layui-form-checkbox"
  1003. data-sn="${response.Data.t_sn}"
  1004. data-id="${response.Data.t_id}"
  1005. data-tt="${response.Data.t_t}"
  1006. data-trh="${response.Data.t_rh}"
  1007. data-site="${response.Data.t_site}"
  1008. data-createTime="${response.Data.createTime}"
  1009. />
  1010. </td>
  1011. <td ondblclick="changeData(this)" data-type="t_time" style="color: #007bff;">${response.Data.createTime}</td>
  1012. <td ondblclick="changeData(this)" data-type="t_t" style="color: #007bff;">${response.Data.t_t}</td>
  1013. <td ondblclick="changeData(this)" data-type="t_rh" style="color: #007bff;">${response.Data.t_rh}</td>
  1014. <td ondblclick="changeData(this)" data-type="t_site" style="color: #007bff;">${response.Data.t_site}</td>
  1015. <td ondblclick="changeData(this)" data-type="create_time" style="color: #007bff;">${response.Data.createTime}</td>
  1016. <td>
  1017. <button class="layui-btn layui-btn-danger layui-btn-sm" onclick="deleteOne(this)">删除</button>
  1018. <button class="layui-btn layui-bg-blue layui-btn-sm" onclick="copyAndAdds(this, '${t_sn}', ${t_id}, ${t_t}, ${t_rh}, '${t_site}', '${create_time}')">复制添加</button>
  1019. <!-- 注意:此处可能不需要再提供复制添加按钮,因为数据已持久化 -->
  1020. </td>
  1021. </tr>
  1022. `;
  1023. // 在当前行的下一行兄弟元素(下一行)之前插入新行
  1024. $(button).closest('tr').after(newRowHtml);
  1025. // window.location.reload()
  1026. // 这里可以添加成功后的其他操作,如提示用户、更新界面等
  1027. },
  1028. error: function (jqXHR, textStatus, errorThrown) {
  1029. console.error("数据提交失败:", textStatus, errorThrown);
  1030. // 处理错误情况,比如提示用户
  1031. alert("数据提交失败,请重试!");
  1032. }
  1033. });
  1034. }
  1035. function showRecord(e) {
  1036. e = $(e).parent().prevAll()
  1037. e = e[e.length - 1]
  1038. e = $(e).children()[0]
  1039. console.log(e)
  1040. $.ajax({
  1041. type: "post",
  1042. url: "/Data/Device_Sensor_Record",
  1043. data: {
  1044. sn: $(e).attr('data-sn'),
  1045. tId: $(e).attr('data-id'),
  1046. createTime: $(e).attr('data-createTime')
  1047. },
  1048. success: function (rlt) {
  1049. if (rlt.Code === 200) {
  1050. if (rlt.Data == null) {
  1051. layui.layer.msg("没有数据!")
  1052. return
  1053. }
  1054. for (let v of rlt.Data) {
  1055. $('#tableBody').append(`
  1056. <tr>
  1057. <td>${v.t_t}</td>
  1058. <td>${v.t_rh}</td>
  1059. <td>${v.t_site}</td>
  1060. <td>${v.t_uuid}</tdj>
  1061. <td>${v.create_time}</td>
  1062. <td>
  1063. <button class="layui-btn layui-btn-normal" onclick="">更新</button>
  1064. </td>
  1065. </tr>
  1066. `)
  1067. }
  1068. layui.layer.open({
  1069. type: 1,
  1070. area: ['1200px', '800px'],
  1071. content: $('#recordShow'),
  1072. isOutAnim: true
  1073. })
  1074. }
  1075. }
  1076. })
  1077. }
  1078. //双击表格改变值
  1079. function changeData(even) {
  1080. let e = $(even).prevAll()
  1081. console.log(e)
  1082. e = $(e[e.length - 1]).children()[0]
  1083. // console.log(e)
  1084. let t = {
  1085. t_sn: $(e).attr('data-sn'),
  1086. t_sp: $(e).attr('data-sp'),
  1087. t_id: Number.parseInt($(e).attr('data-id')),
  1088. create_time: ($(e).attr('data-createtime')),
  1089. t_t: Number.parseFloat($(e).attr('data-tt')),
  1090. t_rh: Number.parseFloat($(e).attr('data-trh')),
  1091. t_site: $(e).attr('data-site'),
  1092. }
  1093. // console.log(t)
  1094. let type = $(even).attr('data-type')
  1095. // console.log(t,"============修改值==================")
  1096. let input = $(`<input class="layui-input" type="text" value="${even.innerText}">`)
  1097. input[0].onblur = function () {
  1098. t["type"] = type
  1099. t["value"] = $(this).val()
  1100. t["User_tokey"] = $.cookie("User_tokey")
  1101. if (t[type] == t.value) {
  1102. } else {
  1103. $.ajax({
  1104. type: "POST",
  1105. url: "/Data/Device_Sensor_Update",
  1106. data: t,
  1107. cookie: $.cookie("User_token"),
  1108. success: function (rlt) {
  1109. console.log(rlt)
  1110. if (rlt.Code===200){
  1111. layui.layer.msg('修改成功')
  1112. get_DeviceSensor_data(0)
  1113. }else {
  1114. layui.layer.msg(rlt.Msg)
  1115. }
  1116. }
  1117. })
  1118. }
  1119. // console.log(t)
  1120. even.innerHTML = this.value
  1121. $(e).attr(`data-${type}`, $(this).val())
  1122. }
  1123. $(even).html('')
  1124. $(even).append(input)
  1125. input.focus()
  1126. }
  1127. //点击上传按钮
  1128. layui.use('upload', function () {
  1129. let upload = layui.upload;
  1130. //执行实例
  1131. let uploadInst = upload.render({
  1132. elem: '#importData',
  1133. url: '/Data/importData' //上传接口
  1134. , accept: 'file',
  1135. data: {
  1136. User_tokey: $.cookie("User_tokey"),
  1137. }
  1138. , field: 'file'
  1139. , done: function (res) {
  1140. layui.layer.msg(res.Msg)
  1141. // layui.layer.close(index)
  1142. }
  1143. , error: function () {
  1144. //请求异常回调
  1145. layui.layer.msg('上传错误!')
  1146. }
  1147. })
  1148. })
  1149. //导出数据
  1150. function exportData() {
  1151. if ($("#Time_start").val().length > 0) {
  1152. Time_start = $("#Time_start").val();
  1153. } else {
  1154. Time_start = ""
  1155. }
  1156. if ($("#Time_end").val().length > 0) {
  1157. Time_end = $("#Time_end").val();
  1158. } else {
  1159. Time_end = ""
  1160. }
  1161. let checkboxes = $('.checkboxxx');
  1162. checkboxes.each(function () {
  1163. if ($(this).is(':checked')) {
  1164. var checkboxValue = $(this).val();
  1165. var values = checkboxValue.split(',');
  1166. var sn = values[0];
  1167. var id = values[1];
  1168. console.log(checkboxValue);
  1169. if (checkboxValue) {
  1170. $.ajax({
  1171. type: "post",
  1172. url: "/Data/EXportData",
  1173. data: {
  1174. T_snid: checkboxValue,
  1175. Time_start: Time_start,
  1176. Time_end: Time_end,
  1177. },
  1178. success: function (rlt) {
  1179. console.log(rlt);
  1180. if (rlt.Code === 200) {
  1181. let link = document.createElement('a');
  1182. link.href = rlt.Data;
  1183. link.click(); // 触发点击事件以开始下载
  1184. link.remove();
  1185. }
  1186. }
  1187. });
  1188. }
  1189. }
  1190. });
  1191. if (!checkboxes.is(':checked')) {
  1192. layui.layer.msg("请选择导出项");
  1193. }
  1194. }
  1195. function Add_DeviceSensor_data(DS_lite) {
  1196. console.log(DS_lite)
  1197. for (let i = 0; i < DS_lite.length; i++) {
  1198. style_s = ""
  1199. if (DS_lite[i].T_t < DS_lite[i].T_Tlower || DS_lite[i].T_rh < DS_lite[i].T_RHlower) {
  1200. style_s = " style='background-color: #a8f7ff' "
  1201. }
  1202. if (DS_lite[i].T_t > DS_lite[i].T_Tupper || DS_lite[i].T_rh > DS_lite[i].T_RHupper) {
  1203. style_s = " style='background-color: #ff8585' "
  1204. }
  1205. $('#DeviceSensor_data').append("" +
  1206. "<tr " + style_s + ">\n" +
  1207. // " <td>"+DS_lite[i].T_sn+"</td>\n" +
  1208. " <td>" + DS_lite[i].T_name + " [" + DS_lite[i].T_id + "]</td>\n" +
  1209. " <td ondblclick=\"ShowElement(this)\" data-th=1 data-sn=\"" + DS_lite[i].T_sn + "\" data-id=" + DS_lite[i].T_id + " >" + DS_lite[i].T_t + "</td>\n" +
  1210. " <td ondblclick=\"ShowElement(this)\" data-th=2 data-sn=\"" + DS_lite[i].T_sn + "\" data-id=" + DS_lite[i].T_id + " >" + DS_lite[i].T_rh + "</td>\n" +
  1211. " <td>" + DS_lite[i].T_tl + "~" + DS_lite[i].T_tu + "</td>\n" +
  1212. " <td>" + DS_lite[i].T_rhl + "~" + DS_lite[i].T_rhu + "</td>\n" +
  1213. " <td>" + DS_lite[i].T_time + "</td>\n" +
  1214. " <td> <span class='layui-btn layui-btn-danger' onclick='f_Device_Sensor_Data_Del_data(\"" + DS_lite[i].T_sn + "\"," + DS_lite[i].ID + ")'>删除</span>" + `<span class='layui-btn layui-btn-normal'>记录</span>` + "</td>\n" +
  1215. "</tr>")
  1216. }
  1217. }
  1218. function Add_DeviceSensor_data_Pages(Pages) {
  1219. for (let i = 0; i < Pages.length; i++) {
  1220. elem = Pages[i]
  1221. switch (elem.A) {
  1222. case 1:
  1223. $('#DeviceSensor_data_Pages').append("<a class=\"prev\" onclick='get_DeviceSensor_data(" + elem.V + ")' >&lt;&lt;</a>\n");
  1224. break;
  1225. case 2:
  1226. $('#DeviceSensor_data_Pages').append("<a class=\"num\" onclick='get_DeviceSensor_data(" + elem.V + ")' >" + elem.V + "</a>\n");
  1227. break;
  1228. case 3:
  1229. $('#DeviceSensor_data_Pages').append("<span class=\"current\">" + elem.V + "</span>\n");
  1230. break;
  1231. case 4:
  1232. $('#DeviceSensor_data_Pages').append("<a class=\"num\" onclick='get_DeviceSensor_data(" + elem.V + ")' >" + elem.V + "</a>\n");
  1233. break;
  1234. case 5:
  1235. $('#DeviceSensor_data_Pages').append("<a class=\"next\" onclick='get_DeviceSensor_data(" + elem.V + ")' >&gt;&gt;</a>\n");
  1236. break;
  1237. }
  1238. }
  1239. }
  1240. function get_DeviceSensor_Excel() {
  1241. if ($("#Time_start").val().length > 0) {
  1242. Time_start = $("#Time_start").val();
  1243. } else {
  1244. Time_start = ""
  1245. }
  1246. if ($("#Time_end").val().length > 0) {
  1247. Time_end = $("#Time_end").val();
  1248. } else {
  1249. Time_end = ""
  1250. }
  1251. Checkboxs_GetAll()
  1252. var loading = layer.load(0, {
  1253. shade: false,
  1254. time: 99 * 1000
  1255. });
  1256. $.ajax({
  1257. type: 'POST',
  1258. url: 'Device_Sensor_Data_Excel',//发送请求
  1259. data: {
  1260. User_tokey: $.cookie("User_tokey"),
  1261. Time_start: Time_start,
  1262. Time_end: Time_end,
  1263. T_snid: DeviceSensor_snid_list,
  1264. },
  1265. success: function (result) {
  1266. console.log(result)
  1267. layer.close(loading)
  1268. if (result.Code != 200) {
  1269. layer.msg(result.Msg);
  1270. return
  1271. }
  1272. window.location.href = result.Data;
  1273. }
  1274. });
  1275. return false
  1276. }
  1277. function F_moban() {
  1278. layer.open({
  1279. title: '导入模版'
  1280. , content: '1、导入模板需先导出然后根据导出模板进行填写导入<hr>' +
  1281. '2、导入文件名为 SN编号,如 2024xxxxxxxxxx.xlsx <hr>'
  1282. });
  1283. }
  1284. </script>
  1285. </html>