device-mgr.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. <!DOCTYPE html>
  2. <!--suppress ALL -->
  3. <html>
  4. <head>
  5. <meta charset="utf-8"/>
  6. <meta name="author" content=""/>
  7. <meta name="description" content=""/>
  8. <meta name="keywords" content="扫码支付,线上投币,运营数据,物联网"/>
  9. <meta name="format-detection" content="telphone=no,email=no"/>
  10. <meta name="viewport"
  11. content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
  12. <meta http-equiv="pragma" content="no-cache">
  13. <meta http-equiv="cache-control" content="no-cache">
  14. <meta http-equiv="expires" content="0">
  15. <title>代理商:设备管理</title>
  16. <link rel="stylesheet" href="/components/lib/mui.min.css"/>
  17. <link rel="stylesheet" href="/components/custom/css/common.css"/>
  18. <link rel="stylesheet" href="/app/css/xyf.common.min.css"/>
  19. <link rel="stylesheet" href="/components/lib/mui.picker.min.css"/>
  20. </head>
  21. <style>
  22. /*定制样式*/
  23. .mgr-bd{
  24. bottom: 0;
  25. margin-top: 80px;
  26. }
  27. #pullrefresh .mui-scroll {
  28. top: 1px;
  29. }
  30. .or-order-status .mui-radio input {
  31. position: relative;
  32. right: auto;
  33. top: 2px;
  34. }
  35. </style>
  36. <body class="device-mgr">
  37. <div class="mui-input-group mui-reset">
  38. <form class="mui-row" action="">
  39. <div class="mui-col-xs-9 mui-col-sm-9">
  40. <div class="mui-input-row mui-search">
  41. <input type="search" class="mui-input-clear" id="searchKey" placeholder="设备编号/投放地址">
  42. </div>
  43. </div>
  44. <div class="mui-col-xs-3 mui-col-sm-3 mui-text-right">
  45. <div class="filter-btn"><span>筛选</span><i class="iconfont icon-triangle-up"></i></div>
  46. </div>
  47. </form>
  48. </div>
  49. <div class="filter-panel" style="display: none" id="options">
  50. <div class="input-group-vertical mui-table-view clear-b-border">
  51. <div class="or-border-fir mui-input-row input-clear or-order-status" id="showPicker">
  52. <label class="or-label-text">设备场地<span></span></label>
  53. <span class="mui-icon mui-icon-arrowright"></span>
  54. <span class="or-order-status-font or-longWrap selected-text or-ellipsis " id="groupText">
  55. <span class="putOnAddress">0</span>场地<span class="equipmentNum">0</span>设备
  56. </span>
  57. </div>
  58. <div class="or-border-fir mui-input-row input-clear or-order-status">
  59. <label class="or-label-text">在线状态<span></span></label>
  60. <div class="mui-row or-order-status-font">
  61. <div class="mui-radio mui-col-xs-4 mui-col-sm-4">
  62. <input class="" value="all" type="radio" name="online" checked>
  63. <span class="font-14">不限</span>
  64. </div>
  65. <div class="mui-radio mui-col-xs-4 mui-col-sm-4">
  66. <input class="" value="0" type="radio" name="online">
  67. <span class="font-14">离线</span>
  68. </div>
  69. <div class="mui-radio mui-col-xs-4 mui-col-sm-4">
  70. <input class="" value="1" type="radio" name="online">
  71. <span class="font-14">在线</span>
  72. </div>
  73. </div>
  74. </div>
  75. <div class="or-border-fir mui-input-row input-clear or-order-status">
  76. <label class="or-label-text">过期状态<span></span></label>
  77. <div class="mui-row or-order-status-font">
  78. <div class="mui-radio mui-col-xs-3 mui-col-sm-3">
  79. <input class="" value="normal" type="radio" name="expireStatus">
  80. <span class="font-14">正常</span>
  81. </div>
  82. <div class="mui-radio mui-col-xs-4 mui-col-sm-4">
  83. <input class="" value="expire" type="radio" name="expireStatus">
  84. <span class="font-14">已过期</span>
  85. </div>
  86. <div class="mui-radio mui-col-xs-65 mui-col-sm-5">
  87. <input class="" value="toExpire" type="radio" name="expireStatus">
  88. <span class="font-14">即将过期</span>
  89. </div>
  90. </div>
  91. </div>
  92. <div class="mui-input-row filter-panel-btn flexbox">
  93. <span class="cancel-btn flex">取消</span>
  94. <span class="ok-btn flex">确定</span>
  95. </div>
  96. </div>
  97. </div>
  98. <h5 class="dev-top-info flexbox">
  99. <div class="flex"><span class="putOnAddress">0</span>个地址,<span class="equipmentNum">0</span>台设备</div>
  100. </h5>
  101. <div id="pullrefresh" class="mui-content mui-clearfix mui-scroll-wrapper mgr-bd">
  102. <!-- 设备列表 -->
  103. <div class="mui-scroll">
  104. <div class="list"></div>
  105. </div>
  106. </div>
  107. <div class="mgr-tip mui-hidden"></div>
  108. <script src="/components/lib/jquery.min.js"></script>
  109. <script src="/components/lib/mui.min.js"></script>
  110. <script src="/components/lib/mui.picker.min.js"></script>
  111. <script src="/components/lib/moment.min.js"></script>
  112. <script src="/components/lib/moment.zh.js"></script>
  113. <script src="/components/custom/js/common.js"></script>
  114. <script src="/app/js/xyf.common.js"></script>
  115. <script>
  116. var dealerId = getQueryString("dealerId");
  117. $(function () {
  118. //全选
  119. $("#checkbox-all").on("change", function () {
  120. if ($(this).is(":checked")) {
  121. $(".checkbox-btn").prop("checked", true);
  122. } else {
  123. $(".checkbox-btn").prop("checked", false);
  124. }
  125. });
  126. //复选框事件重写
  127. $("#pullrefresh").on("tap", ".mui-checkbox-wear", function (evt) {
  128. var box = $(this).find(".mui-checkbox input");
  129. if (box.is(":checked")) {
  130. box.prop("checked", false);
  131. } else {
  132. box.prop("checked", true);
  133. }
  134. evt.stopPropagation();
  135. evt.preventDefault();
  136. }).on("tap", ".groupSelect", function () {
  137. //组全选:该事件必须在上个事件之后
  138. var input = $(this).find("input");
  139. var checked = input.is(":checked");
  140. var groupDom = $(this).closest("li").find(".group-content");
  141. if (checked) {
  142. groupDom.find(".checkbox-btn").prop("checked", true);
  143. } else {
  144. groupDom.find(".checkbox-btn").prop("checked", false);
  145. }
  146. });
  147. });
  148. //激活批量操作
  149. function batchOper() {
  150. if ($("body").hasClass("batch-model")) {
  151. $("body").removeClass("batch-model");
  152. } else {
  153. $("body").addClass("batch-model");
  154. }
  155. }
  156. //检测过期时间,经销商修改的过期时间不得早于流量卡的过期时间
  157. function validateExpireDate() {
  158. var validate = true;
  159. var targetExpireDate = $('#expireDate').val();
  160. $(".devCheck").each(function () {
  161. var checked = $(this).find("input").is(":checked");
  162. if (checked) {
  163. var expireDate = $(this).closest(".deviceRow").attr("expireDate");
  164. if (targetExpireDate < expireDate) {
  165. validate = false;
  166. return;
  167. }
  168. }
  169. });
  170. return validate;
  171. }
  172. //获取被选中设备的ID,并检测选中的设备是否同类型
  173. function getSelectIdInfo() {
  174. var idList = [];
  175. var typeId = null;
  176. var typeSame = true;//检测是否同设备类型
  177. $(".devCheck").each(function () {
  178. var checked = $(this).find("input").is(":checked");
  179. if (checked) {
  180. var id = $(this).closest(".deviceRow").attr("data-id");
  181. var getTypeId = $(this).closest(".deviceRow").attr("type-id");
  182. if (typeId != null && getTypeId != typeId) {
  183. typeSame = false;
  184. return false;
  185. } else {
  186. typeId = getTypeId;
  187. }
  188. if (id) {
  189. idList.push(id);
  190. }
  191. }
  192. });
  193. if (!typeSame) {
  194. return null;
  195. } else {
  196. return {idList: idList, typeId: typeId};
  197. }
  198. }
  199. var picker = new mui.PopPicker({
  200. layer: 1
  201. });
  202. /**
  203. * 地址筛选
  204. * @private
  205. */
  206. var _filterPicker = {
  207. pickerDatas: [],
  208. /**
  209. * 获取设备数量和投放地址列表
  210. */
  211. getEquipmentNumAndAdressList: function () {
  212. var $scope = this;//todo 改为get
  213. sendRequest('/device/getEquipmentNumAndAddressList', 'post', {dealerId: dealerId}, function (res) {
  214. if (res.result == 1) {
  215. $scope.setPickerData(res.para.groups);
  216. picker.setData($scope.pickerDatas);
  217. } else {
  218. mui.toast(res.description);
  219. }
  220. })
  221. },
  222. /**
  223. * 设置设备投放地址数和设备数量
  224. * @param equipmentNum 设备数
  225. * @param AddressNum 地址数
  226. */
  227. setEquipmentNumAndAddressNum: function (AddressNum, equipmentNum) {
  228. $('.putOnAddress').text(AddressNum);
  229. $('.equipmentNum').text(equipmentNum);
  230. },
  231. /**
  232. * 设置picker的数据
  233. * @param datas
  234. */
  235. setPickerData: function (datas) {
  236. this.pickerDatas.push({
  237. value: 'all',
  238. text: '全部投放地址',
  239. });
  240. var addressHtml = "";
  241. for (var i = 0, length = datas.length; i < length; i++) {
  242. var item = {
  243. value: datas[i].groupId,
  244. text: datas[i].name,
  245. };
  246. this.pickerDatas.push(item);
  247. addressHtml += '<li class="mui-table-view-cell">' + datas[i].name + '</li>';
  248. }
  249. }
  250. };
  251. FilterComponent({
  252. ok: function () {
  253. searchByKey()
  254. }
  255. });
  256. //关键字搜索
  257. document.onkeydown = function (ev) {
  258. if (ev.keyCode == 13) {
  259. ev.preventDefault();
  260. searchByKey();
  261. }
  262. };
  263. function searchByKey() {
  264. pageIndex = 0;
  265. $(".list").empty();//清空设备列表
  266. mui('#pullrefresh').pullRefresh().refresh(true);//重置上拉加载
  267. pullupRefresh();//加载设备数据
  268. }
  269. //searchBar
  270. $(function () {
  271. _filterPicker.getEquipmentNumAndAdressList();
  272. $("#showPicker").on("tap", function () {
  273. picker.show(function (rs) {
  274. equipmentGroupId = rs[0].value;
  275. $('#groupText').html(rs[0].text);
  276. });
  277. return false;
  278. })
  279. });
  280. mui.init({
  281. pullRefresh: {
  282. container: '#pullrefresh',
  283. up: {
  284. contentrefresh: '正在加载...',
  285. contentnomore: '',
  286. callback: pullupRefresh
  287. }
  288. }
  289. });
  290. /* 上拉加载具体业务实现*/
  291. var pageIndex = 0;
  292. var total = 0;
  293. var groupCount = 0;
  294. var equipmentGroupId = "";
  295. function pullupRefresh() {
  296. var groupName = null;
  297. pageIndex++;
  298. var data = {
  299. "dealerId": dealerId,
  300. "pageIndex": pageIndex,
  301. "pageSize": 10,
  302. "searchKey": $("#searchKey").val(),
  303. "online": $("input[name='online']:checked").val(),
  304. "expireStatus": $("input[name='expireStatus']:checked").val(),
  305. "equipmentGroupId": equipmentGroupId
  306. };
  307. var groupList = "";
  308. sendRequest("/agent/equipmentList?random=" + Math.random() * 1000, "GET", data, function (res) {
  309. if (res.result == 1) {
  310. if (pageIndex == 1) {
  311. total = res.para.total;
  312. groupCount = res.para.groupCount;
  313. resultList = "";
  314. groupName = null;
  315. }
  316. var length = res.para.dataList.length;
  317. _filterPicker.setEquipmentNumAndAddressNum(groupCount, total);
  318. if (pageIndex == 1 && length == 0) {
  319. $(".mgr-bd").hide();
  320. $(".mgr-tip").removeClass("mui-hidden");
  321. } else {
  322. $(".mgr-bd").show();
  323. $(".mgr-tip").addClass("mui-hidden");
  324. }
  325. mui('#pullrefresh').pullRefresh().endPullupToRefresh((pageIndex * 10 >= total));
  326. var dataTree = [];
  327. for (var i = 0; i < length; i++) {
  328. var obj = res.para.dataList[i];
  329. //展示分组
  330. if (obj.name != groupName) {
  331. var p = {};
  332. p[obj.groupId] = [];
  333. dataTree.push(p);
  334. groupName = obj.name;
  335. if ($("#" + obj.groupId).length == 0) {
  336. if (obj.isManager) {
  337. var role = "manage";
  338. } else {
  339. var role = "limit-user";
  340. }
  341. groupList += '<ul role="' + role + '" class="mui-table-view"><li class="mui-table-view-cell mui-collapse"><a class="mui-navigate-right" href="javascript:void 0;">' +
  342. '<div class="mui-checkbox-wear groupSelect"><div class="mui-checkbox"><input class="checkbox-btn" value="" type="checkbox"></div></div>' +
  343. '<span class="font-18 v-middle" id="' + obj.groupId + '">' +
  344. groupName + '</span><em permission="limit-user-show" class="total-mark">合伙</em><span class="mui-pull-right group-ele-total">' +
  345. '台</span></a><div class="mui-collapse-content"><ul class="mui-table-view group-content">';
  346. groupList += '</ul></div></li></ul>';
  347. }
  348. }
  349. var simStatusEnum = {
  350. 'chargedUnupdated': '充值待更新',
  351. 'illegal': '非法卡',
  352. 'updated': '已更新',
  353. 'undefined': '',
  354. }
  355. var expireDateHtml = simStatusEnum[obj.simStatus] || ('到期时间:' + obj.expireDate)
  356. //追加分组下面的设备
  357. var resultList = "";
  358. resultList += '<li class="mui-table-view-cell deviceRow" data-id="' + obj.id + '" type-id="' + obj.typeId + '" expireDate="' + obj.expireDate + '">' +
  359. '<div class="mui-row" href="javascript:void(0)">' +
  360. '<div class="devCheck mui-checkbox-wear"><div class="mui-checkbox"><input class="checkbox-btn" value="" type="checkbox"></div></div>' +
  361. '<span class="mui-text-left">' + "<i class='c-primary iconfont " + getDevIconName(obj.type) + "'></i> " + obj.type + ' ' + obj.logicalCode + '</span>' +
  362. '<p class="mui-text-left mui-ellipsis font-b-14-4" style="min-height: 1.5em">' + expireDateHtml + '</p>' +
  363. '</div>' +
  364. '</li>';
  365. var lastElement = dataTree[dataTree.length - 1];
  366. lastElement[obj.groupId].push(resultList);
  367. }
  368. $(".list").append(groupList);
  369. $.each(dataTree, function (i, e) {
  370. for (var key in e) {
  371. $("#" + key).parent().next().find(".group-content").append(e[key].join(""));
  372. }
  373. });
  374. // 设备刷新完后刷新设备在线 总数目
  375. setDevCount();
  376. } else {
  377. mui.toast(res.description);
  378. }
  379. });
  380. }
  381. // 翻页或是刷新信号,可能会引起设备数量的变化,所以每次都要根据dom树去找在线或离线的设备
  382. function setDevCount() {
  383. var g = $(".group-content");
  384. $.each(g, function () {
  385. var e = $(this);
  386. var len = e.children().length;
  387. //找到在线的数量
  388. var onlineLength = 0;//暂时不要
  389. e.parent().prev("a").find(".group-ele-total").html(len + "台");
  390. });
  391. }
  392. if (mui.os.plus) {
  393. mui.plusReady(function () {
  394. setTimeout(function () {
  395. mui('#pullrefresh').pullRefresh().pullupLoading();
  396. }, 1000);
  397. });
  398. } else {
  399. mui.ready(function () {
  400. mui('#pullrefresh').pullRefresh().pullupLoading();
  401. });
  402. }
  403. /**
  404. * 初始化全局变量
  405. */
  406. function initGlobalVar() {
  407. pageIndex = 0;
  408. }
  409. </script>
  410. </body>
  411. </html>