user-feedback.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  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="../components/lib/weui.min.css">
  16. <link rel="stylesheet" href="../components/custom/css/common.css">
  17. <link rel="stylesheet" href="css/xyf.common.min.css">
  18. <style>
  19. .watermark {
  20. font-size: 60px;
  21. width: 60px;
  22. height: 60px;
  23. position: absolute;
  24. left: 20%;
  25. top: 0;
  26. }
  27. .checkbox-btn {
  28. height: 80px !important;
  29. }
  30. .mui-checkbox-wear {
  31. display: none;
  32. }
  33. .batch-model .fade-node {
  34. display: none;
  35. }
  36. .batch-model .mui-checkbox-wear {
  37. display: block;
  38. width: 42px;
  39. float: left;
  40. }
  41. .batch-model .text-part {
  42. width: calc(100% - 42px);
  43. float: right;
  44. position: relative;
  45. }
  46. </style>
  47. </head>
  48. <body>
  49. <div class="mui-input-group mui-reset">
  50. <form class="mui-row" action="">
  51. <div class="mui-col-xs-7 mui-col-sm-7">
  52. <div class="mui-input-row mui-search">
  53. <input type="search" class="mui-input-clear" id="searchKey" placeholder=" 用户昵称、反馈内容">
  54. </div>
  55. </div>
  56. <div class="mui-col-xs-5 mui-col-sm-5 mui-text-right">
  57. <div class="filter-btn"><span>筛选</span><i class="iconfont icon-triangle-up"></i></div>
  58. <div class="in-row-btn" onclick="batchOper()">多选<i class="iconfont icon-triangle-up"></i></div>
  59. </div>
  60. </form>
  61. </div>
  62. <div class="filter-panel" style="display: none" id="options">
  63. <div class="input-group-vertical mui-table-view clear-b-border">
  64. <div class="or-border-fir mui-input-row input-clear or-order-status" id="feedbackType">
  65. <label class="or-label-text">问题类型</label>
  66. <span class="mui-icon mui-icon-arrowright"></span>
  67. <span class="or-order-status-font selected-text">全部</span>
  68. </div>
  69. <div class="or-border-fir mui-input-row input-clear or-order-status" id="status">
  70. <label class="or-label-text">处理状态</label>
  71. <span class="mui-icon mui-icon-arrowright"></span>
  72. <span class="or-order-status-font selected-text">全部</span>
  73. </div>
  74. <div class="or-border-fir mui-input-row input-clear or-order-status select-date" id="start-date">
  75. <label class="or-label-text">开始日期</label>
  76. <span class="mui-icon mui-icon-arrowright"></span>
  77. <span class="or-order-status-font selected-text"></span>
  78. </div>
  79. <div class="mui-input-row input-clear or-order-status select-date" id="end-date">
  80. <label class="or-label-text">结束日期</label>
  81. <span class="mui-icon mui-icon-arrowright"></span>
  82. <span class="or-order-status-font selected-text"></span>
  83. </div>
  84. <div class="mui-input-row filter-panel-btn flexbox">
  85. <span class="cancel-btn flex">取消</span>
  86. <span class="ok-btn flex">确定</span>
  87. </div>
  88. </div>
  89. </div>
  90. <!--下拉刷新容器-->
  91. <div id="pullrefresh" class="mui-content mui-scroll-wrapper" style="margin-top: 45px;padding-top: 10px">
  92. <div class="mui-scroll">
  93. <!--数据列表-->
  94. <ul class="group-wrap ">
  95. </ul>
  96. </div>
  97. </div>
  98. <div class="c-handle-panel mui-hidden">
  99. <div class="handle-btn">
  100. <div class="mui-checkbox ">
  101. <input id="checkbox-all" class="checkbox-all" type="checkbox">
  102. <label for="checkbox-all">全选</label>
  103. </div>
  104. </div>
  105. <div class="handle-btn-list mui-text-right">
  106. <button type="button" class="mui-btn mui-btn-outlined mui-btn-danger "
  107. onclick="goBatch()">批量关闭
  108. </button>
  109. </div>
  110. </div>
  111. <script src="https://cdn.washpayer.com/components/lib/jquery.min.js"></script>
  112. <script src="../components/lib/weui.min.js"></script>
  113. <script src="https://cdn.washpayer.com/components/lib/mui.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. $(function () {
  120. //ios返回刷新
  121. var isPageHide = false;
  122. window.addEventListener('pageshow', function () {
  123. if (isPageHide) {
  124. window.location.reload();
  125. }
  126. });
  127. window.addEventListener('pagehide', function () {
  128. isPageHide = true;
  129. });
  130. });
  131. //如果调到子页面,返回后还是保留查询条件
  132. var orRecordBack = getQueryString('orRecord');
  133. if (orRecordBack) {
  134. history.replaceState(null, null, "user-feedback.html");
  135. }
  136. /**
  137. * 向localStorage写入条件数据
  138. */
  139. var startDate;//开始日期
  140. var endDate;//结束日期
  141. var searchKey = null;// 定义为null,如果是undefined,ios8 微信ajax时会崩溃,但是有的接口有 undefined却不会崩溃。。。
  142. var feedbackType = null;//问题类型
  143. var status = '';//处理状态
  144. var condition;
  145. var pageType = 'userFeedback';
  146. //获取条件缓存数据
  147. if (orRecordBack) {
  148. condition = localStorage.condition ? JSON.parse(localStorage.condition)[pageType] : null;
  149. } else {
  150. condition = null;
  151. }
  152. function setCondition() {
  153. var data = {
  154. startDate: startDate,//开始日期
  155. endDate: endDate,//结束日期
  156. searchKey: searchKey,
  157. feedType: feedbackType,
  158. status: status,
  159. };
  160. var conArr = localStorage.condition ? JSON.parse(localStorage.condition) : {};
  161. conArr[pageType] = data;
  162. localStorage.condition = JSON.stringify(conArr);
  163. }
  164. /**
  165. * 计算日期范围
  166. */
  167. function computeDateRange(range) {
  168. endDate = moment().format("YYYY-MM-DD");
  169. if (range == "today") {
  170. startDate = endDate;
  171. } else if (range == "week") {
  172. startDate = moment().add("day", -7).format("YYYY-MM-DD");
  173. } else if (range == "month") {
  174. startDate = moment().add("month", -1).format("YYYY-MM-DD");
  175. } else if (range == "year") {
  176. startDate = moment().add("year", -1).format("YYYY-MM-DD");
  177. }
  178. $('#start-date .selected-text').html(startDate);
  179. $('#end-date .selected-text').html(endDate);
  180. //写入数据
  181. setCondition();
  182. }
  183. var typeList = [
  184. {
  185. label: '全部',
  186. value: null
  187. },
  188. {
  189. label: '故障',
  190. value: 'fault'
  191. },
  192. {
  193. label: '订单投诉(扫码)',
  194. value: 'netpay'
  195. },
  196. {
  197. label: '订单投诉(IC卡)',
  198. value: 'ic'
  199. },
  200. {
  201. label: '订单投诉(投币)',
  202. value: 'putCoin'
  203. },
  204. {
  205. label: '其他',
  206. value: 'other'
  207. },
  208. ];
  209. var types = {'putCoin': '订单投诉(投币)', 'ic': '订单投诉(IC卡)', 'netpay': '订单投诉(扫码)', 'fault': '故障', 'other': '其他'};
  210. var statusList = [
  211. {
  212. label: '全部',
  213. value: null
  214. },
  215. {
  216. label: '待处理',
  217. value: 0
  218. },
  219. {
  220. label: '已处理',
  221. value: 1
  222. },
  223. {
  224. label: '驳回',
  225. value: 2
  226. }
  227. ];
  228. var statusMap = {0: '待处理', 1: '已处理', 2: '驳回'};
  229. /*根据缓存渲染已有条件数据*/
  230. if (condition) {
  231. if (condition.startDate) {
  232. startDate = condition.startDate;
  233. endDate = condition.endDate;
  234. $('#start-date .selected-text').html(condition.startDate);
  235. $('#end-date .selected-text').html(condition.endDate);
  236. if (condition.feedType) {
  237. feedbackType = condition.feedType;
  238. $("#feedbackType .selected-text").html(types[condition.feedType]);
  239. }
  240. if (condition.status != null) {
  241. status = condition.status;
  242. $("#status .selected-text").html(statusMap[condition.status]);
  243. }
  244. }
  245. if (condition.searchKey != '') {
  246. searchKey = condition.searchKey;
  247. $("#searchKey").val(searchKey);
  248. }
  249. } else {
  250. //设置默认选中为:待处理、日期为一年
  251. status = 0;
  252. $("#status .selected-text").html(statusMap[0]);
  253. computeDateRange('year');//设置日期范围
  254. }
  255. mui.init({
  256. pullRefresh: {
  257. container: '#pullrefresh',
  258. up: {
  259. contentrefresh: '正在加载...',
  260. contentnomore: '没有更多数据了...',
  261. callback: pullupRefresh
  262. }
  263. }
  264. });
  265. //关键字搜索
  266. document.onkeydown = function (ev) {
  267. if (ev.keyCode == 13) {
  268. ev.preventDefault();
  269. search();
  270. }
  271. };
  272. //刷新数据
  273. function pullupRefresh() {
  274. pageIndex++;
  275. var url = "/dealer/userFeedbackRecords";
  276. var data = {
  277. searchKey: searchKey,
  278. feedType: feedbackType,
  279. status: status || '',
  280. dateEnd: endDate,
  281. dateStart: startDate,
  282. pageIndex: pageIndex,
  283. pageSize: pageSize,
  284. };
  285. setCondition();//设置条件到缓存
  286. sendRequest(url, "GET", data, function (res) {
  287. if (res.result == 1) {
  288. if (pageIndex == 1) {
  289. total = res.payload.total;
  290. if (total == 0) {
  291. $('#pullrefresh').addClass('mui-hidden');
  292. $("body").append('<div class="nomore"></div>');
  293. } else {
  294. $('#pullrefresh').removeClass('mui-hidden');
  295. $('.nomore').remove();
  296. }
  297. }
  298. mui('#pullrefresh').pullRefresh().endPullupToRefresh((pageIndex * pageSize >= total));
  299. var groupWrap = $('.group-wrap');
  300. var length = res.para.items.length;
  301. for (var i = 0; i < length; i++) {
  302. var obj = res.para.items[i];
  303. var ul = document.createElement('ul');
  304. ul.className = 'mui-table-view split interval ';
  305. var typeText = types[obj.feedType];
  306. var html = '<li class="mui-table-view-cell or-jump-html" id="' + obj.id + '">' +
  307. '<div class="mui-checkbox-wear">' +
  308. '<div class="mui-checkbox">' +
  309. ' <input class="checkbox-btn" value="" type="checkbox" id="input-' + obj.id + '">' +
  310. '</div>' +
  311. '</div>' +
  312. '<div class="text-part">' +
  313. '<p>用户昵称<span class="mui-pull-right font-b">' + obj.nickname + '</span></p>' +
  314. '<p>问题类型<span class="mui-pull-right font-b"><i class="iconfont c-red icon-' + obj.feedType + '"></i> ' + typeText + '</span></p>' +
  315. '<p>问题描述<span class="mui-pull-right font-b mui-col-xs-8 mui-col-sm-8 mui-text-right mui-ellipsis">' + obj.description + '</span></p>' +
  316. '<p>提交时间<span class="mui-pull-right font-b">' + obj.createTime + '</span></p>' +
  317. '<p class="mui-hidden">设备场地<span class="mui-pull-right font-b">' + obj.detailInfo.groupName + '</span></p>' +
  318. '<p class="mui-hidden">设备名称<span class="mui-pull-right font-b">' + obj.detailInfo.devTypeName + "-" + obj.detailInfo.groupNumber + " (" + obj.detailInfo.logicalCode + ')</span></p>' +
  319. '</div>' +
  320. '</li>';
  321. ul.innerHTML = html;
  322. var tp = $(ul).find('.text-part')
  323. //待处理
  324. if (obj.status == 0) {
  325. tp.append("<i class='watermark iconfont c-blue icon-pending'></i>");
  326. } else if (obj.status == 1) {
  327. tp.append("<i class='watermark iconfont c-success icon-handled'></i>");
  328. $(ul).addClass("fade-node");
  329. } else if (obj.status == 2) {
  330. tp.append("<i class='watermark iconfont c-orange icon-reject'></i>");
  331. $(ul).addClass("fade-node");
  332. }
  333. groupWrap.append(ul);
  334. }
  335. } else {
  336. mui.toast(res.description);
  337. }
  338. });
  339. }
  340. /*当前时间*/
  341. var curDate = new Date();
  342. /*对比时间*/
  343. var compareTime = function (smaller, larger) {
  344. var genDate = function (value) {
  345. var type = typeof value;
  346. var date = null;
  347. if (type == 'string' || type == 'number') {
  348. date = new Date(value);
  349. } else if (type == 'object') {
  350. date = value;
  351. }
  352. return date;
  353. };
  354. return genDate(smaller).getTime() <= genDate(larger).getTime();
  355. };
  356. /**
  357. * 选择日期弹窗函数
  358. * @param options
  359. */
  360. var showDatePicker = function (options) {
  361. var defaultDate = options.default ? new Date(options.default) : curDate;
  362. options = $.extend({
  363. start: moment().add(-1, "year").toDate(),
  364. end: moment().add(1, "second").toDate(),//注意!!可能是多次打开后渲染延迟,必须把end往后推至少一秒,才能渲染出当天为结束日期,否则无法选择今天
  365. defaultValue: [defaultDate.getFullYear(), defaultDate.getMonth() + 1, defaultDate.getDate()]
  366. }, options);
  367. if (!options.id) {
  368. return;
  369. }
  370. weui.datePicker({
  371. start: options.start,
  372. end: options.end,
  373. defaultValue: options.defaultValue,
  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. //开始、结束时间选择器
  384. $('.select-date').click(function (e) {
  385. var $ele = $(e.currentTarget);
  386. var $eleId = $ele.attr('id');
  387. showDatePicker({
  388. id: $eleId,
  389. default: $eleId == 'start-date' ? startDate : endDate,//默认选择的时间
  390. onChange: function (data) {
  391. },
  392. onConfirm: function (data) {
  393. var year = data[0];
  394. var month = data[1];
  395. var date = data[2];
  396. var flag = true;
  397. var dateStr = year + '-' + (month > 9 ? month : '0' + month) + '-' + (date > 9 ? date : '0' + date);
  398. //校验输入合法性
  399. if ($eleId == 'start-date') {
  400. if (endDate && !compareTime(dateStr, endDate)) {
  401. /* dialog('温馨提示','开始日期不能大于结束日期','确定');*/
  402. flag = false;
  403. }
  404. startDate = dateStr;
  405. } else {
  406. if (startDate && !compareTime(startDate, dateStr)) {
  407. /* dialog('温馨提示','开始日期不能大于结束日期','确定');*/
  408. flag = false;
  409. }
  410. endDate = dateStr;
  411. }
  412. //修改页面
  413. $ele.find('.selected-text').html(dateStr);
  414. //写入数据
  415. if (flag) {
  416. setCondition();
  417. }
  418. }
  419. });
  420. });
  421. //通用选择器
  422. var showTypePicker = function (list, options) {
  423. weui.picker(list, {
  424. className: options.className,
  425. defaultValue: [options.default],
  426. onChange: function (result) {
  427. options.onChange && options.onChange(result);
  428. },
  429. onConfirm: function (result) {
  430. options.onConfirm && options.onConfirm(result);
  431. },
  432. id: options.id
  433. })
  434. };
  435. FilterComponent({
  436. ok: function () {
  437. /*合法性验证*/
  438. //日期校验
  439. if (true) {
  440. if (!startDate) {
  441. mui.alert('请选择开始日期', '温馨提示', '确定');
  442. }
  443. if (!endDate) {
  444. mui.alert('请选择结束日期', '温馨提示', '确定');
  445. }
  446. if (!compareTime(startDate, endDate)) {
  447. mui.alert('开始日期不能大于结束日期', '温馨提示', '确定');
  448. return false;
  449. }
  450. }
  451. pageIndex = 0;
  452. search();
  453. }
  454. });
  455. /**
  456. * 查询的基本条件
  457. */
  458. var pageIndex = 0;
  459. var pageSize = 10;
  460. var total = 0;// 记录一次数据总数,用来做刷新判断
  461. function search() {
  462. pageIndex = 0;
  463. $('.group-wrap').html("");
  464. mui('#pullrefresh').pullRefresh().refresh(true);//重置上拉加载
  465. searchKey = $("#searchKey").val();
  466. //写入数据
  467. pullupRefresh();
  468. }
  469. //问题类型
  470. $("#feedbackType").click(function (e) {
  471. var $ele = $(e.currentTarget);
  472. showTypePicker(typeList, {
  473. id: $ele.attr('id'),
  474. default: feedbackType || typeList[0].value,
  475. onChange: function (data) {
  476. },
  477. onConfirm: function (data) {
  478. $ele.find(".selected-text").html(data[0].label);
  479. feedbackType = data[0].value;
  480. //写入数据
  481. setCondition();
  482. }
  483. });
  484. });
  485. //处理状态,待处理0,成功1,不处理2
  486. $("#status").click(function (e) {
  487. var $ele = $(e.currentTarget);
  488. showTypePicker(statusList, {
  489. id: $ele.attr('id'),
  490. default: status,//如果没有 null则表示全部
  491. onConfirm: function (data) {
  492. $ele.find(".selected-text").html(data[0].label);
  493. status = data[0].value;
  494. //写入数据
  495. setCondition();
  496. }
  497. });
  498. });
  499. //查看反馈详情跳转
  500. $('body').on('tap', '.or-jump-html', function (evt) {
  501. if ($("body").hasClass("batch-model")) {
  502. return
  503. }
  504. history.replaceState(null, null, "user-feedback.html?orRecord=true&t=" + new Date().getTime());
  505. var url = '/dealer/index.html#/feedback/detail?id=' + $(this).attr('id');
  506. goPage(url);
  507. });
  508. //初始化刷新一次数据
  509. if (mui.os.plus) {
  510. mui.plusReady(function () {
  511. setTimeout(function () {
  512. mui('#pullrefresh').pullRefresh().pullupLoading();
  513. }, 1000);
  514. });
  515. } else {
  516. mui.ready(function () {
  517. mui('#pullrefresh').pullRefresh().pullupLoading();
  518. });
  519. }
  520. //全选
  521. $("#checkbox-all").on("change", function () {
  522. if ($(this).is(":checked")) {
  523. $(".checkbox-btn").prop("checked", true);
  524. } else {
  525. $(".checkbox-btn").prop("checked", false);
  526. }
  527. });
  528. //激活批量操作
  529. function batchOper() {
  530. if ($("body").hasClass("batch-model")) {
  531. $(".in-row-btn").removeClass('active');
  532. $("body").removeClass("batch-model");
  533. $(".c-handle-panel").addClass('mui-hidden')
  534. } else {
  535. $(".in-row-btn").addClass('active');
  536. $("body").addClass("batch-model");
  537. $(".c-handle-panel").removeClass('mui-hidden')
  538. }
  539. }
  540. function getSelectIdInfo() {
  541. var ids = []
  542. $(".or-jump-html").each(function () {
  543. var checked = $(this).find("input").is(":checked");
  544. if (checked) {
  545. var fade = $(this).closest("ul").hasClass('fade-node')
  546. var id = $(this).closest(".or-jump-html").attr('id')
  547. if (!fade) {
  548. ids.push(id)
  549. }
  550. }
  551. });
  552. return ids
  553. }
  554. function goBatch() {
  555. var ids = getSelectIdInfo()
  556. if (ids.length == 0) {
  557. mui.toast('请选择数据');
  558. return
  559. }
  560. var url = 'user-feedback-multiple.html?ids=' + JSON.stringify(ids)
  561. goPage(url);
  562. }
  563. </script>
  564. </body>
  565. </html>