card-manage.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. <!DOCTYPE html>
  2. <html class="remModel">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="Cache-Control" content="no-cache,no-store,no-siteapp,must-revalidate">
  6. <meta http-equiv="pragma" content="no-cache">
  7. <meta http-equiv="expires" content="0">
  8. <meta name="author" content="">
  9. <meta name="description" content=""/>
  10. <meta name="keywords" content="扫码支付,线上投币,运营数据,物联网"/>
  11. <meta name="format-detection" content="telephone=no,email=no">
  12. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
  13. <title>用户实体卡管理</title>
  14. <link rel="stylesheet" href="https://cdn.washpayer.com/components/lib/mui.min.css">
  15. <link rel="stylesheet" href="https://cdn.washpayer.com/components/lib/mui.picker.min.css"/>
  16. <link rel="stylesheet" href="../components/lib/weui.min.css">
  17. <link rel="stylesheet" href="../components/custom/css/common.css">
  18. <link rel="stylesheet" href="css/xyf.common.min.css">
  19. <style>
  20. .top-oper-bar {
  21. position: relative;
  22. height: 38px;
  23. line-height: 38px;
  24. margin: 0;
  25. padding: 0 10px;
  26. background: #f4f4f4;
  27. }
  28. .top-oper-bar .right-link {
  29. margin-top: -10px;
  30. margin-right: -10px;
  31. padding: 10px;
  32. }
  33. </style>
  34. </head>
  35. <body class="card-manage">
  36. <div class="mui-input-group mui-reset">
  37. <form class="mui-row" action="">
  38. <div class="mui-col-xs-9 mui-col-sm-9">
  39. <div class="mui-input-row mui-search">
  40. <input type="search" class="mui-input-clear" id="searchKey" placeholder=" 请输入卡号、手机、姓名">
  41. </div>
  42. </div>
  43. <div class="mui-col-xs-3 mui-col-sm-3 mui-text-right">
  44. <div class="filter-btn"><span>筛选</span><i class="iconfont icon-triangle-up"></i></div>
  45. </div>
  46. </form>
  47. </div>
  48. <div class="filter-panel" style="display: none" id="options">
  49. <div class="input-group-vertical mui-table-view clear-b-border">
  50. <div class="or-border-fir mui-input-row input-clear" id="showPickerAddress">
  51. <label class="or-label-text">地址</label>
  52. <span class="mui-icon mui-icon-arrowright"></span>
  53. <span class="l-h-38 font-b-6 selected-text">全部</span>
  54. </div>
  55. <div class=" mui-input-row input-clear " id="frozenStatus">
  56. <label class="or-label-text">状态</label>
  57. <span class="mui-icon mui-icon-arrowright"></span>
  58. <span class="l-h-38 font-b-6 selected-text">全部</span>
  59. </div>
  60. <div class="mui-input-row filter-panel-btn flexbox">
  61. <span class="cancel-btn flex">取消</span>
  62. <span class="ok-btn flex">确定</span>
  63. </div>
  64. </div>
  65. </div>
  66. <h5 class="flexbox top-oper-bar">
  67. <span class="text-right c-blue right-link" onclick="checkSendCoinsRecord()">派币记录</span>
  68. <span class="text-right c-blue right-link" onclick="goAddCard()">去录卡</span>
  69. </h5>
  70. <!--下拉刷新容器-->
  71. <div id="pullrefresh" class="mui-content mui-scroll-wrapper" style="margin-top: 82px;">
  72. <div class="mui-scroll">
  73. <!--数据列表-->
  74. <ul class="group-wrap ">
  75. </ul>
  76. </div>
  77. </div>
  78. <!--生成二维码-->
  79. <div class="common-mask" id="codePanel">
  80. <div class="common-model">
  81. <div class="common-model-tit">长按二维码保存</a>
  82. </div>
  83. <img id="previewImg" style="margin: auto;display: block">
  84. <div class="common-model-close" onclick="closeQRCode()">关闭</div>
  85. </div>
  86. </div>
  87. <script type="text/html" id="modal">
  88. <ul class="mui-table-view card-detail split interval custom-bottom">
  89. <li class="mui-table-view-cell">
  90. <i class="iconfont icon-card c-primary iconCard"></i>
  91. <p class="card-dashed-line"><i class="iconfont icon-card c-primary "></i> <span
  92. class="cardNo font-b"></span><span
  93. class="balance font-b mui-pull-right"></span></p>
  94. <div class="expand-info ">
  95. <p class="mui-hidden">别名<span class="mui-pull-right font-b-8 alias"></span></p>
  96. <p class="mui-hidden">电话<span class="mui-pull-right font-b-8 phone"></span></p>
  97. <p class="mui-hidden">状态<span class="mui-pull-right font-b-8 status"></span></p>
  98. <p class="mui-hidden">挂失状态<span class="mui-pull-right font-b-8 frozen"></span></p>
  99. <p class="mui-hidden">卡主<span class="mui-pull-right font-b-8 cardName"></span></p>
  100. <p class="mui-hidden">绑定状态<span class="mui-pull-right font-b-8 bindStatus"></span></p>
  101. <div class="split-line margin-t-b-5"></div>
  102. <p class="operBtn qrcodeBtn margin-t-10">二维码<span class="mui-navigate-right"></span></p>
  103. <p class="operBtn operRecordBtn">使用记录<span class="mui-navigate-right"></span></p>
  104. <p class="operBtn cardDetail">卡详情<span class="mui-navigate-right"></span></p>
  105. </div>
  106. </li>
  107. </ul>
  108. </script>
  109. <script src="https://cdn.washpayer.com/components/lib/jquery.min.js"></script>
  110. <script src="../components/lib/jquery.qrcode.min.js"></script>
  111. <script src="../components/lib/weui.min.js"></script>
  112. <script src="https://cdn.washpayer.com/components/lib/mui.min.js"></script>
  113. <script src="https://cdn.washpayer.com/components/lib/mui.picker.min.js"></script>
  114. <script src="https://cdn.washpayer.com/components/lib/moment.min.js"></script>
  115. <script src="/components/custom/js/common.js"></script>
  116. <script src="js/xyf.login.js"></script>
  117. <script src="js/xyf.common.js"></script>
  118. <script>
  119. var equipmentGroupId = "";
  120. var groupName = "";
  121. //地址 选择器
  122. var addressPicker = new mui.PopPicker({
  123. layer: 1
  124. });
  125. var YuChuan = false
  126. var deleteInitIcCard = false;//可以删除卡
  127. getFeatureList("dealer", {list: ['deleteInitIcCard', 'YuChuan']}, function (payload) {
  128. YuChuan = payload.YuChuan
  129. deleteInitIcCard = payload.deleteInitIcCard
  130. mui.init({
  131. pullRefresh: {
  132. container: '#pullrefresh',
  133. up: {
  134. contentrefresh: '正在加载...',
  135. contentnomore: '没有更多数据了...',
  136. callback: pullupRefresh
  137. }
  138. }
  139. });
  140. //初始化刷新一次数据
  141. if (mui.os.plus) {
  142. mui.plusReady(function () {
  143. setTimeout(function () {
  144. mui('#pullrefresh').pullRefresh().pullupLoading();
  145. }, 1000);
  146. });
  147. } else {
  148. mui.ready(function () {
  149. mui('#pullrefresh').pullRefresh().pullupLoading();
  150. });
  151. }
  152. });
  153. var addressPickerOper = {
  154. getEquipmentNumAndAdressList: function (callback) {
  155. var $scope = this;
  156. sendRequest('/device/getEquipmentNumAndAddressList', 'post', {}, function (res) {
  157. if (res.result == 1) {
  158. var pickerDatas = []
  159. pickerDatas.push({
  160. value: null,
  161. text: '全部投放地址',
  162. });
  163. var datas = res.para.groups
  164. for (var i = 0, length = datas.length; i < length; i++) {
  165. var item = {
  166. value: datas[i].groupId,
  167. text: datas[i].name,
  168. };
  169. pickerDatas.push(item);
  170. }
  171. addressPicker.setData(pickerDatas);
  172. if (callback) {
  173. callback()
  174. }
  175. } else {
  176. mui.toast(res.description);
  177. }
  178. })
  179. },
  180. setEquipmentNumAndAddressNum: function (AddressNum, equipmentNum) {
  181. $('.putOnAddress').text(AddressNum);
  182. $('.equipmentNum').text(equipmentNum);
  183. },
  184. };
  185. // 需要等待地址加载出来,然后才初始化所有的参数
  186. addressPickerOper.getEquipmentNumAndAdressList(function () {
  187. if (equipmentGroupId) {
  188. addressPicker.pickers[0].setSelectedValue(equipmentGroupId);
  189. $('#showPickerAddress .selected-text').html(groupName);
  190. }
  191. });
  192. //地址选择器展示
  193. $("#showPickerAddress").on("tap", function () {
  194. addressPicker.show(function (rs) {
  195. equipmentGroupId = rs[0].value;
  196. groupName = rs[0].text;
  197. $('#showPickerAddress .selected-text').html(rs[0].text);
  198. });
  199. return false;
  200. })
  201. function goAddCard() {
  202. goPage('/dealer/index.html#/card/edit')
  203. }
  204. function checkSendCoinsRecord() {
  205. goPage('/dealer/index.html#/card/sendCoinsRecord')
  206. }
  207. //如果调到子页面,返回后还是保留查询条件
  208. var orRecordBack = getQueryString('orRecord');
  209. // 由外部传入的条件,主要是某个用户下级的实体卡查询
  210. var userId = getQueryString('userId');
  211. var groupId = getQueryString('groupId');
  212. /**
  213. * 向localStorage写入条件数据
  214. */
  215. var searchKey = null;// 定义为null,如果是undefined,ios8 微信ajax时会崩溃,但是有的接口有 undefined却不会崩溃。。。
  216. var frozenStatus = '';//状态
  217. var pageIndex = 0;
  218. var pageSize = 10;
  219. var total = 0;
  220. var condition;
  221. var pageType = 'cardManage';
  222. //获取条件缓存数据
  223. if (orRecordBack) {
  224. history.replaceState(null, null, "card-manage.html");
  225. condition = localStorage.condition ? JSON.parse(localStorage.condition)[pageType] : null;
  226. if (condition.equipmentGroupId) {
  227. equipmentGroupId = condition.equipmentGroupId
  228. groupName = condition.groupName
  229. }
  230. } else {
  231. condition = null;
  232. }
  233. function setCondition() {
  234. var data = {
  235. searchKey: searchKey,
  236. equipmentGroupId: equipmentGroupId,
  237. groupName: groupName,
  238. frozen: frozenStatus,
  239. };
  240. var conArr = localStorage.condition ? JSON.parse(localStorage.condition) : {};
  241. conArr[pageType] = data;
  242. localStorage.condition = JSON.stringify(conArr);
  243. }
  244. var frozenStatusList = [
  245. {
  246. label: '全部',
  247. value: ''
  248. },
  249. {
  250. label: '正常',
  251. value: 0
  252. },
  253. {
  254. label: '已挂失',
  255. value: 1
  256. }
  257. ];
  258. var frozenStatusMap = {0: '正常', 1: '已挂失'};
  259. var bindStatusMap = {false: '未绑定', true: '已绑定'};
  260. var statusMap = {active: '正常'};
  261. /*根据缓存渲染已有条件数据*/
  262. if (condition) {
  263. if (condition.frozen != null) {
  264. frozenStatus = condition.frozen;
  265. $("#frozenStatus .selected-text").html(frozenStatusMap[condition.frozen]);
  266. }
  267. if (condition.searchKey !== '') {
  268. searchKey = condition.searchKey;
  269. $("#searchKey").val(searchKey);
  270. }
  271. } else {
  272. }
  273. //关键字搜索
  274. document.onkeydown = function (ev) {
  275. if (ev.keyCode == 13) {
  276. ev.preventDefault();
  277. search();
  278. }
  279. };
  280. var agentId;
  281. //刷新数据
  282. function pullupRefresh(callback) {
  283. pageIndex++;
  284. var url = "/dealer/getUserCardList";
  285. var data = {
  286. searchKey: searchKey,
  287. equipmentGroupId: equipmentGroupId,
  288. frozen: frozenStatus,
  289. pageIndex: pageIndex,
  290. pageSize: pageSize,
  291. };
  292. if (userId) {
  293. data.userId = userId
  294. }
  295. if (groupId) {
  296. data.groupId = groupId
  297. }
  298. setCondition(); //设置条件到缓存
  299. sendRequest(url, "GET", data, function (res) {
  300. if (res.result === 1) {
  301. if (pageIndex === 1) {
  302. total = res.payload.total;
  303. if (total === 0) {
  304. $('#pullrefresh').addClass('mui-hidden');
  305. $("body").append('<div class="nomore"></div>');
  306. } else {
  307. $('#pullrefresh').removeClass('mui-hidden');
  308. $('.nomore').remove();
  309. }
  310. }
  311. mui('#pullrefresh').pullRefresh().endPullupToRefresh((pageIndex * pageSize >= total));
  312. var groupWrap = $('.group-wrap');
  313. var length = res.para.dataList.length;
  314. for (var i = 0; i < length; i++) {
  315. var obj = res.para.dataList[i];
  316. var html = $($("#modal").html());
  317. html.find(".expand-info").attr("data-id", obj.cardId)
  318. html.find(".expand-info").attr("cardNo", obj.cardNo)
  319. html.find(".expand-info").attr("cardName", obj.cardName)
  320. html.find(".expand-info").attr("phone", obj.phone)
  321. html.find(".expand-info").attr("groupId", obj.groupId)
  322. html.find(".expand-info").attr("groupName", obj.groupName)
  323. html.find(".expand-info").attr("balance", obj.balance)
  324. html.find(".cardNo").text(obj.cardNo)
  325. html.find(".balance").text(obj.balance + "元")
  326. //附加信息
  327. setValue(obj, html, "frozen", frozenStatusMap[obj.frozen], (obj.frozen === 1 ? "c-red" : "c-success"))
  328. setValue(obj, html, "alias")
  329. setValue(obj, html, "phone")
  330. setValue(obj, html, "nickname")
  331. setValue(obj, html, "cardName")
  332. setValue(obj, html, "bindStatus", bindStatusMap[obj.bindStatus])
  333. setValue(obj, html, "status", statusMap[obj.status])
  334. if (obj.frozen === false) {
  335. html.find(".freezeCard").addClass("isFreeze").find('.btn-label').text("挂失")
  336. } else {
  337. html.find(".freezeCard .btn-label").text("解除挂失")
  338. }
  339. if (!deleteInitIcCard) {
  340. html.find(".deleteCard").remove()
  341. }
  342. groupWrap.append(html);
  343. agentId = res.payload.agentId;
  344. if (callback) {
  345. callback()
  346. }
  347. }
  348. if (YuChuan) {
  349. $('.qrcodeBtn').remove()
  350. $('.cardDetail').remove()
  351. $('.balance').remove()
  352. $('#sumBalance').remove()
  353. }
  354. } else {
  355. mui.toast(res.description);
  356. }
  357. });
  358. }
  359. function setValue(obj, html, key, value, styleClass) {
  360. if (value != null) {
  361. } else {
  362. value = obj[key]
  363. }
  364. value != null && html.find("." + key).html(value).closest('p').removeClass('mui-hidden')
  365. if (styleClass) {
  366. html.find("." + key).addClass(styleClass)
  367. }
  368. }
  369. //通用选择器
  370. var showTypePicker = function (list, options) {
  371. weui.picker(list, {
  372. className: options.className,
  373. defaultValue: [options.default],
  374. onChange: function (result) {
  375. options.onChange && options.onChange(result);
  376. },
  377. onConfirm: function (result) {
  378. options.onConfirm && options.onConfirm(result);
  379. },
  380. id: options.id
  381. })
  382. };
  383. FilterComponent({
  384. ok: function () {
  385. /*合法性验证*/
  386. pageIndex = 0;
  387. search();
  388. }
  389. })
  390. function search() {
  391. pageIndex = 0;
  392. $('.group-wrap').html("");
  393. mui('#pullrefresh').pullRefresh().refresh(true);//重置上拉加载
  394. searchKey = $("#searchKey").val();
  395. //写入数据
  396. pullupRefresh();
  397. }
  398. //状态
  399. $("#frozenStatus").click(function (e) {
  400. var $ele = $(e.currentTarget);
  401. showTypePicker(frozenStatusList, {
  402. id: $ele.attr('id'),
  403. default: frozenStatus,//如果没有 null则表示全部
  404. onConfirm: function (data) {
  405. $ele.find(".selected-text").html(data[0].label);
  406. frozenStatus = data[0].value;
  407. //写入数据
  408. setCondition();
  409. }
  410. });
  411. });
  412. //添加充值卡
  413. function addCard() {
  414. goPage('card-manage-edit.html');
  415. }
  416. $('body').on('tap', '.card-detail', function () {
  417. if ($(this).hasClass("active")) {
  418. $(this).removeClass("active")
  419. } else {
  420. $(this).addClass("active")
  421. }
  422. }).on('tap', '.operBtn', function (evt) {
  423. evt.stopPropagation();
  424. var cardId = $(this).closest('.expand-info').attr("data-id");
  425. var cardNo = $(this).closest('.expand-info').attr("cardNo");
  426. var phone = $(this).closest('.expand-info').attr("phone");
  427. var cardName = $(this).closest('.expand-info').attr("cardName");
  428. var groupName = $(this).closest('.expand-info').attr("groupName");
  429. var groupId = $(this).closest('.expand-info').attr("groupId");
  430. var balance = $(this).closest('.expand-info').attr("balance");
  431. if (cardId) {
  432. if ($(this).hasClass("freezeCard")) {
  433. var frozen;
  434. var tit = ""
  435. if ($(this).hasClass("isFreeze")) {
  436. frozen = true;
  437. tit = "您确定冻结使用该卡吗?"
  438. } else {
  439. frozen = false;
  440. tit = "卡片将恢复使用,您确定要解除挂失状态吗?"
  441. }
  442. var btnArray = ['取消', '确定'];
  443. mui.confirm(tit, '温馨提示', btnArray, function (e) {
  444. if (e.index == 1) {
  445. var data = {"id": cardId, frozen: frozen};
  446. sendRequest({
  447. url: "/dealer/freezeCard",
  448. data: data,
  449. type: 'POST',
  450. contentType: "json",
  451. success: function (res) {
  452. if (res.result == 1) {
  453. mui.toast("操作成功");
  454. search();//刷新列表
  455. }
  456. }
  457. }
  458. );
  459. }
  460. });
  461. } else if ($(this).hasClass("operRecordBtn")) {
  462. history.replaceState(null, null, "card-manage.html?orRecord=true&t=" + new Date().getTime());
  463. var url = '/user/index.html#balanceChange?cardId=' + cardId;
  464. goPage(url);
  465. } else if ($(this).hasClass("cardDetail")) {
  466. history.replaceState(null, null, "card-manage.html?orRecord=true&t=" + new Date().getTime());
  467. var url = '/dealer/index.html#/card/detail?cardId=' + cardId;
  468. goPage(url);
  469. } else if ($(this).hasClass("operSendCoins")) {
  470. history.replaceState(null, null, "card-manage.html?orRecord=true&t=" + new Date().getTime());
  471. var url = '/dealer/index.html#/card/sendCoins?cardId=' + cardId;
  472. goPage(url);
  473. } else if ($(this).hasClass("deleteCard")) {
  474. var btnArray = ['取消', '确定'];
  475. mui.confirm('确定删除?', '温馨提示', btnArray, function (e) {
  476. if (e.index === 1) {
  477. sendRequest({
  478. url: "/dealer/deleteCard",
  479. data: {cardId: cardId},
  480. type: 'POST',
  481. contentType: "json",
  482. success: function (res) {
  483. if (res.result === 1) {
  484. mui.toast("操作成功");
  485. search();//刷新列表
  486. } else {
  487. mui.toast(res.description);
  488. }
  489. }
  490. }
  491. );
  492. }
  493. });
  494. } else if ($(this).hasClass("swapCardNo")) {
  495. goPage('/dealer/index.html#/card/swapCardNo?cardId=' + cardId + '&cardNo=' + cardNo + '&balance=' + balance)
  496. } else if ($(this).hasClass("editCard")) {
  497. goPage('/dealer/index.html#/card/edit?editCard=1&groupId=' + groupId + '&cardName=' + cardName + '&phone=' + phone + '&cardId=' + cardId + '&cardNo=' + cardNo)
  498. } else if ($(this).hasClass("qrcodeBtn")) {
  499. $("#codePanel").show();
  500. var label = cardNo
  501. var protocol = location.protocol;
  502. var currentDomain = protocol + "//" + location.host;
  503. var userUrl;
  504. userUrl = currentDomain + "/userLogin?agentId=" + agentId + "&redirect=" +
  505. encodeURIComponent("/user/index.html" + "#/user/checkCard?" +
  506. "cardId=" + cardId +
  507. "&cardNo=" + cardNo +
  508. "&cardName=" + cardName +
  509. "&phone=" + phone +
  510. "&groupName=" + groupName +
  511. "&groupId=" + groupId +
  512. "&dealerEdit=true"
  513. );
  514. var dataURL = getQRCodeImageData(userUrl, label);
  515. $("#previewImg").attr({
  516. "width": 200,
  517. "height": 230,
  518. "src": dataURL
  519. });
  520. }
  521. }
  522. });
  523. function closeQRCode() {
  524. $("#codePanel").hide();
  525. }
  526. </script>
  527. </body>
  528. </html>