utils.js 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202
  1. import wepy from '@wepy/core';
  2. import {
  3. checkLogin
  4. } from '@/service/user';
  5. import moment from 'moment';
  6. export default {
  7. formateTime,
  8. debounce,
  9. getUrlParams,
  10. // 轮训获取
  11. getQrcode,
  12. formateEnvIndicatorValue,
  13. random,
  14. getAppId,
  15. getVersion,
  16. getTimeStamp,
  17. getMiniProgram,
  18. commonParams,
  19. getMapSpaceIcon,
  20. getSearchRegEx
  21. };
  22. let seed = 0;
  23. function genId() {
  24. return 'hx-' + Date.now() + ++seed;
  25. }
  26. function getGenderDesc(type) {
  27. let map = {
  28. man: '先生',
  29. woman: '女士',
  30. '': '贵宾',
  31. };
  32. return map[type] || map[''];
  33. }
  34. function getTwoNum(num) {
  35. let str = '' + num;
  36. if (num < 10) {
  37. str = '0' + str;
  38. }
  39. return str;
  40. }
  41. function getFutureDayList(num) {
  42. let result = [];
  43. let dateObj = new Date();
  44. let date = dateObj.getDate();
  45. result.push({
  46. date: date,
  47. dayDesc: '今天',
  48. });
  49. for (let i = 1; i < num; i++) {
  50. dateObj.setDate(date + i);
  51. result.push({
  52. date: dateObj.getDate(),
  53. dayDesc: getWeekDesc(dateObj.getDay()),
  54. });
  55. }
  56. return result;
  57. }
  58. function getWeekDesc(day) {
  59. let map = {
  60. 1: '周一',
  61. 2: '周二',
  62. 3: '周三',
  63. 4: '周四',
  64. 5: '周五',
  65. 6: '周六',
  66. 0: '周日',
  67. };
  68. return map[day] || '';
  69. }
  70. function getHourList(startHour, endHour) {
  71. let result = [];
  72. for (let i = startHour; i < endHour; i++) {
  73. result.push([getHourObj(i, 0), getHourObj(i, 30)]);
  74. }
  75. return result;
  76. }
  77. function getHourObj(hour, minutes) {
  78. let totalMinutes = hour * 60 + minutes;
  79. let newHour = parseInt(totalMinutes / 60);
  80. let newMinutes = totalMinutes % 60;
  81. return {
  82. value: totalMinutes / 60,
  83. desc: getTwoNum(newHour) + ':' + getTwoNum(newMinutes),
  84. };
  85. }
  86. // 将创建邀请函时为访客代支付的内容,由web端存储转换为后端存储
  87. // 前端payItems: ['park', 'business', 'diningHall'],
  88. // 后端:由三位组成,第一位表示停车费,第二位表示商业消费,第三位表示食堂,比如010
  89. function payItemsC2S(payItems) {
  90. payItems = payItems || [];
  91. let strPark = payItems.indexOf('park') > -1 ? '1' : '0';
  92. let strBusiness = payItems.indexOf('business') > -1 ? '1' : '0';
  93. let strDiningHall = payItems.indexOf('diningHall') > -1 ? '1' : '0';
  94. return strPark + strBusiness + strDiningHall;
  95. }
  96. function payItemsS2C(payItemStr) {
  97. payItemStr = payItemStr || '';
  98. let payItems = [];
  99. if (payItemStr.match(/1../)) {
  100. payItems.push('park');
  101. }
  102. if (payItemStr.match(/.1./)) {
  103. payItems.push('business');
  104. }
  105. if (payItemStr.match(/..1/)) {
  106. payItems.push('diningHall');
  107. }
  108. return payItems;
  109. }
  110. // 邀请函数据转换:服务端->客户端
  111. function invitationS2C(serverData) {
  112. let clientData = Object.assign(serverData, {
  113. applyStatus: 1, //1-是通过, 2-是失效
  114. });
  115. try {
  116. clientData.visitSite = JSON.parse(serverData.addr);
  117. } catch (e) {
  118. clientData.visitSite = {};
  119. }
  120. if (serverData.startTime) {
  121. clientData.startTime = formateResultDate(serverData.startTime);
  122. } else {
  123. clientData.startTime = null;
  124. }
  125. if (serverData.endTime) {
  126. let endTime = formateDateToDateObj(serverData.endTime);
  127. // 例: 8月20日 00:00 改为 8月19日24:00
  128. if (endTime.getHours() == 0 && endTime.getMinutes() == 0) {
  129. let time = new Date(endTime.getTime() - 60 * 1000);
  130. clientData.endTime = {
  131. abbrDate: `${time.getMonth() + 1}月${time.getDate()}日`,
  132. hour: '24:00',
  133. time // 时间对象
  134. }
  135. } else {
  136. clientData.endTime = formateResultDate(serverData.endTime);
  137. }
  138. } else {
  139. clientData.endTime = null;
  140. }
  141. clientData.visitStatus = (serverData.status + 3) % 4;
  142. clientData.visitorType = serverData.type;
  143. clientData.visitorName = serverData.title;
  144. clientData.payItems = payItemsS2C(serverData.payType);
  145. if (serverData.sex === 1) {
  146. clientData.gender = 'man';
  147. } else if (serverData.sex === 0) {
  148. clientData.gender = 'woman';
  149. } else {
  150. clientData.gender = '';
  151. }
  152. return clientData;
  153. }
  154. /* eslint-disable one-var */
  155. function formateTime(time) {
  156. let year = time.getFullYear(),
  157. month = time.getMonth() + 1,
  158. date = time.getDate();
  159. let timeStr = time.toTimeString().split(' ')[0];
  160. month = month < 10 ? '0' + month : month;
  161. date = date < 10 ? '0' + date : date;
  162. return [year, month, date].join('/') + ' ' + timeStr;
  163. }
  164. // 将日期转换为12小时制
  165. function getHour12Desc(time) {
  166. let result;
  167. time = (time || '').replace(/-/g, '/');
  168. var date = new Date(time);
  169. let hour = date.getHours();
  170. let minutes = date.getMinutes();
  171. // let seconds = date.getSeconds();
  172. if (hour <= 12) {
  173. result = '上午 ' + getTwoNum(hour) + ':' + getTwoNum(minutes);
  174. } else {
  175. hour -= 12;
  176. result = '下午 ' + getTwoNum(hour) + ':' + getTwoNum(minutes);
  177. }
  178. return result;
  179. }
  180. // 给嵌入的H5页面地址加上参数,以避免缓存
  181. function addUrlVersion(url) {
  182. const regExp = /([?&])t=.+(&)?/;
  183. let parameter = 't=' + Date.now();
  184. if (regExp.test(url)) {
  185. url = url.replace(regExp, '$1' + parameter + '$2');
  186. } else {
  187. if (url.indexOf('?') > -1) {
  188. url += '&' + parameter;
  189. } else {
  190. url += '?' + parameter;
  191. }
  192. }
  193. return url;
  194. }
  195. function addUrlParams(url, key, value, isRefresh) {
  196. const regExp = new RegExp('([?&]' + key + '=).+(&)?');
  197. if (regExp.test(url)) {
  198. if (isRefresh) {
  199. // 已存在该参数,做替换处理
  200. url = url.replace(regExp, '$1' + value + '$2');
  201. }
  202. } else {
  203. if (url.indexOf('?') > -1) {
  204. url += `&${key}=${value}`;
  205. } else {
  206. url += `?${key}=${value}`;
  207. }
  208. }
  209. return url;
  210. }
  211. function formateDateToDateObj(date) {
  212. if (!(date instanceof Date)) {
  213. if (/^\d+$/.test(date)) {
  214. date = Number(date);
  215. } else {
  216. // 部分手机不支持 yyyy-MM-dd 这种格式
  217. date = (date || '').replace(/-/g, '/');
  218. }
  219. date = new Date(date);
  220. }
  221. return date;
  222. }
  223. function getPeriodTimeDesc(startDate, endDate) {
  224. startDate = formateDateToDateObj(startDate);
  225. endDate = formateDateToDateObj(endDate);
  226. let startDateDesc = getDateDesc(startDate);
  227. let endDateDesc = '';
  228. // 将结束时间的00:00改为头天晚上的24:00
  229. if (endDate.getHours() == 0 && endDate.getMinutes() == 0) {
  230. endDate = new Date(endDate.getTime() - 60 * 1000);
  231. endDateDesc = getDateDesc(endDate);
  232. endDateDesc = endDateDesc.replace(/ \d+[^\d]*\d+/, ' 24:00');
  233. } else {
  234. endDateDesc = getDateDesc(endDate);
  235. }
  236. // 去掉相同的月日部分
  237. if (startDateDesc.split(' ')[0] == endDateDesc.split(' ')[0]) {
  238. endDateDesc = endDateDesc.replace(/.+ /, '');
  239. return `${startDateDesc} - ${endDateDesc}`;
  240. } else {
  241. let result = `${startDateDesc} - ${endDateDesc}`;
  242. // 如果跨天了,则改为由.来分割,以缩短界面占用
  243. result = result.replace(/[年月]/g, '.');
  244. result = result.replace(/[日]/g, '');
  245. return result;
  246. }
  247. }
  248. function getDateDesc(date) {
  249. let result = '';
  250. let today = new Date();
  251. today.setHours(0, 0, 0, 0);
  252. const differMilliseconds = date.getTime() - today.getTime();
  253. const differDays = parseInt(differMilliseconds / 86400000);
  254. const todayDay = today.getDay();
  255. if (differMilliseconds < 0 || differDays > 6) {
  256. result = date.getMonth() + 1 + '月' + date.getDate() + '日';
  257. } else {
  258. if (differDays <= 2) {
  259. const map = {
  260. 0: '今天',
  261. 1: '明天',
  262. 2: '后天',
  263. };
  264. result = map[differDays];
  265. } else {
  266. const newDays = (todayDay + differDays) % 7;
  267. if (todayDay + differDays > 7) {
  268. result = '下' + getWeekDesc(newDays);
  269. } else {
  270. result = getWeekDesc(newDays);
  271. }
  272. }
  273. }
  274. return (
  275. result +
  276. ' ' +
  277. getTwoNum(date.getHours()) +
  278. ':' +
  279. getTwoNum(date.getMinutes())
  280. );
  281. }
  282. function debounce(callback, interval) {
  283. let timer = ''
  284. return function (args) {
  285. if (timer) return
  286. timer = setTimeout(() => {
  287. callback(args)
  288. timer = ''
  289. }, interval)
  290. }
  291. }
  292. function getDateSimpleDesc(date) {
  293. let today = new Date();
  294. today.setHours(0, 0, 0, 0);
  295. const differMilliseconds = date.getTime() - today.getTime();
  296. const differDays = parseInt(differMilliseconds / 86400000);
  297. let result;
  298. if (differDays <= 0) {
  299. return '今天';
  300. } else if (differDays <= 2) {
  301. const map = {
  302. 0: "今天",
  303. 1: "明天",
  304. 2: "后天",
  305. };
  306. result = map[differDays];
  307. } else {
  308. result = (date.getMonth() + 1) + "月" + date.getDate() + "日" + ' ';
  309. }
  310. return result;
  311. }
  312. function formatepmValueToStatusText(value) {
  313. if (value === undefined) {
  314. return;
  315. }
  316. if (!value.toString()) return '良'; //防止为0跳出判断
  317. value = parseFloat(value); //防止字符串,将他转为小数点的数字
  318. let str = '';
  319. switch (true) {
  320. case value <= 35:
  321. str = '优';
  322. break;
  323. case value <= 75:
  324. str = '良';
  325. break;
  326. case value <= 150:
  327. str = '中';
  328. break;
  329. default:
  330. str = '差';
  331. break;
  332. }
  333. return str;
  334. }
  335. function getPmfromHttpResult(str) {
  336. // str如 "build:A座,floor:7,PM:11.41"
  337. let reg = /build:([^,]+),floor:(\d+),PM:(\d+(?:\.\d+)?)/gm;
  338. let matchResult = reg.exec(str);
  339. if (matchResult && matchResult.length && matchResult[3]) {
  340. return matchResult[3];
  341. } else {
  342. return '';
  343. }
  344. }
  345. function getUrlParams(str) {
  346. let params = {};
  347. if (!str) {
  348. return params;
  349. }
  350. let paramsStartIndex = str.indexOf('?');
  351. if (paramsStartIndex == -1) {
  352. return params;
  353. };
  354. let paramStr = str.slice(paramsStartIndex + 1);
  355. let paramsArray = paramStr.split('&');
  356. paramsArray.forEach(item => {
  357. let value = item.split('=');
  358. let key = value[0];
  359. let parmasValue = value[1];
  360. params[key] = parmasValue;
  361. })
  362. return params;
  363. }
  364. function formatePassLinkToText(links) {
  365. if (!links.length) {
  366. return '';
  367. }
  368. let areas = [];
  369. links.forEach(link => {
  370. areas.push(formatePassLinkItemToText(link));
  371. })
  372. return areas.join('、');
  373. }
  374. function formatePassLinkItemToText(link) {
  375. // let str = `${link.areaAuth || ''}${link.entrance || ''}`;
  376. // if (link.floor) {
  377. // str = `${str}-${link.floor}层`;
  378. // }
  379. let str = link.name || '';
  380. return str;
  381. }
  382. /**
  383. *
  384. * @param {本地缓存的key } storageKey
  385. * @param {发送请求的接口} httpFun
  386. * @param {规定超时的时长 单位为s} timeout
  387. */
  388. function refreshCode(storageKey, httpFun, timeout) {
  389. if (!httpFun) {
  390. return Promise.reject();
  391. }
  392. timeout = timeout || 10; // 默认超过10s 视为过期
  393. let catchData = null; // 如果有缓存数据,则拿缓存数据先进行判断
  394. if (storageKey) {
  395. catchData = wx.getStorageSync(storageKey);
  396. }
  397. if (!catchData) {
  398. return getQrcode(storageKey, httpFun, timeout);
  399. } else {
  400. // 有缓存数据 判断是否过期,
  401. let expireTime = new Date(catchData.expireTime).getTime() - 24 * 60 * 60 * 1000; //提前1天过期拿新接口
  402. let now = new Date().getTime();
  403. // 当前时间早于过期时间,即为未过期
  404. if (now <= expireTime) {
  405. return Promise.resolve(catchData);
  406. } else { //过期需要重新拉取数据
  407. return getQrcode(storageKey, httpFun, timeout);
  408. }
  409. }
  410. }
  411. /**
  412. *
  413. * @param {发送请求的接口} httpFun
  414. * @param {规定超时的时长 单位为} timeout
  415. */
  416. function getQrcode(storageKey, httpFun, timeout) {
  417. // 记录请求时间,以判断是否超时
  418. let startTime = new Date().getTime();
  419. return checkLogin().then(res => {
  420. return getQrcodeHttp(storageKey, httpFun, startTime, timeout);
  421. })
  422. }
  423. function getQrcodeHttp(storageKey, httpFun, startTime, timeout) {
  424. let now = new Date().getTime();
  425. // 如果轮训在10s内,继续查询,超出就显示网络异常
  426. if ((now - startTime) / 1000 >= timeout) {
  427. return Promise.reject({ reason: '循环超出时间了' })
  428. }
  429. return httpFun().then(res => {
  430. // 有缓存key,则需进行缓存
  431. if (storageKey) {
  432. wx.setStorageSync(storageKey, res.data);
  433. }
  434. return Promise.resolve(res.data);
  435. }, (res) => {
  436. // 网络异常 直接展示异常信息
  437. if (res && res.reason && res.reason == 'wxRequestFail') {
  438. return Promise.reject({ ...res })
  439. } else { //其他服务端异常信息,再次请求
  440. return new Promise((resolve, reject) => {
  441. setTimeout(() => {
  442. resolve(getQrcodeHttp(storageKey, httpFun, startTime, timeout));
  443. }, 1000);
  444. });
  445. }
  446. })
  447. }
  448. function formateEnvIndicatorValue(key, value) {
  449. if (!key) {
  450. return '';
  451. }
  452. if (value == undefined || value == null || !(value.toString().length)) {
  453. return '';
  454. }
  455. let formatedValue;
  456. switch (key) {
  457. case 'co2':
  458. formatedValue = parseInt(value);
  459. break;
  460. case 'pm25':
  461. formatedValue = value == 0 ? 0 : parseFloat(value).toFixed(1);
  462. break;
  463. case 'hcho':
  464. formatedValue = value == 0 ? 0 : parseFloat(value).toFixed(2);
  465. break;
  466. case 'tvoc':
  467. formatedValue = value == 0 ? 0 : parseFloat(value).toFixed(1);
  468. break;
  469. case 'humidity':
  470. formatedValue = value == 0 ? 0 : parseFloat(value).toFixed(1);
  471. break;
  472. case 'temperature':
  473. formatedValue = value == 0 ? 0 : Math.round(parseFloat(value) * 10) / 10;
  474. break;
  475. case 'nh3':
  476. formatedValue = value == 0 ? 0 : Math.round(parseFloat(value) * 100) / 100;
  477. break;
  478. case 'h2S':
  479. formatedValue = value == 0 ? 0 : Math.round(parseFloat(value) * 10000) / 10000;
  480. break;
  481. default:
  482. formatedValue = parseInt(value);
  483. }
  484. return formatedValue.toString();
  485. }
  486. // 生成随机数
  487. function random(min, max) {
  488. return Math.floor(Math.random() * (max - min)) + min;
  489. }
  490. function getTextHcho(value) {
  491. if (!value) {
  492. return;
  493. }
  494. value = Number(value);
  495. let msg;
  496. switch (true) {
  497. case value <= 0.08:
  498. msg = '符合国标';
  499. break;
  500. case value <= 2:
  501. msg = '轻度超标';
  502. break;
  503. case value > 2:
  504. msg = '严重超标';
  505. break;
  506. }
  507. return msg;
  508. }
  509. function getTextHumidity(value) {
  510. if (!value) {
  511. return;
  512. }
  513. value = Number(value);
  514. let msg;
  515. switch (true) {
  516. case value <= 30:
  517. msg = '有点干燥';
  518. break;
  519. case value <= 80:
  520. msg = '体感舒适';
  521. break;
  522. case value > 80:
  523. msg = '有点潮湿';
  524. break;
  525. }
  526. return msg;
  527. }
  528. function getTextCO2(value) {
  529. if (!value) {
  530. return;
  531. }
  532. let msg;
  533. value = Number(value);
  534. switch (true) {
  535. case value <= 450:
  536. msg = '氧气充沛';
  537. break;
  538. case value <= 1000:
  539. msg = '通风良好';
  540. break;
  541. case value <= 2000:
  542. msg = '轻度污染';
  543. break;
  544. case value <= 5000:
  545. msg = '重度污染';
  546. break;
  547. case value > 5000:
  548. msg = '严重污染';
  549. break;
  550. }
  551. return msg;
  552. }
  553. function getTextPM(value) {
  554. if (!value) {
  555. return;
  556. }
  557. value = Number(value);
  558. let msg;
  559. switch (true) {
  560. case value <= 35:
  561. msg = '优秀';
  562. break;
  563. case value <= 75:
  564. msg = '良';
  565. break;
  566. case value <= 115:
  567. msg = '轻度污染';
  568. break;
  569. case value <= 150:
  570. msg = '中度污染';
  571. break;
  572. case value <= 250:
  573. msg = '重度污染';
  574. break;
  575. case value > 250:
  576. msg = '严重污染';
  577. break;
  578. }
  579. return msg;
  580. }
  581. function getTextNH(value) {
  582. if (!value) {
  583. return;
  584. }
  585. value = Number(value);
  586. let msg;
  587. switch (true) {
  588. case value <= 0.1:
  589. msg = '环境清新';
  590. break;
  591. case value <= 0.6:
  592. msg = '较为清新';
  593. break;
  594. case value <= 10:
  595. msg = '轻度异味';
  596. break;
  597. case value > 10:
  598. msg = '异味严重';
  599. break;
  600. }
  601. return msg;
  602. }
  603. function getTextH2S(value) {
  604. if (!value) {
  605. return;
  606. }
  607. value = Number(value);
  608. let msg;
  609. switch (true) {
  610. case value <= 0.0005:
  611. msg = '环境清新';
  612. break;
  613. case value <= 0.06:
  614. msg = '较为清新';
  615. break;
  616. case value <= 0.7:
  617. msg = '轻度异味';
  618. break;
  619. case value > 0.7:
  620. msg = '异味严重';
  621. break;
  622. }
  623. return msg;
  624. }
  625. function getTextTemperature(value) {
  626. if (!value) {
  627. return;
  628. }
  629. value = Number(value);
  630. let msg;
  631. switch (true) {
  632. case value <= 18:
  633. msg = '偏冷';
  634. break;
  635. case value <= 28:
  636. msg = '舒适';
  637. break;
  638. case value > 28:
  639. msg = '偏热';
  640. break;
  641. }
  642. return msg;
  643. }
  644. function getEnvIndectorDesc(id, value) {
  645. let des = ''
  646. switch (id) {
  647. case 'hcho':
  648. des = getTextHcho(value);
  649. break;
  650. case 'humidity':
  651. des = getTextHumidity(value);
  652. break;
  653. case 'co2':
  654. des = getTextCO2(value);
  655. break;
  656. case 'pm25':
  657. des = getTextPM(value);
  658. break;
  659. case 'nh3':
  660. des = getTextNH(value);
  661. break;
  662. case 'h2S':
  663. des = getTextH2S(value);
  664. break;
  665. case 'temperature':
  666. des = getTextTemperature(value);
  667. break;
  668. }
  669. return des;
  670. }
  671. /* 生成图片随机字符串 */
  672. function generateImgRandomStr() {
  673. return `?-v=${Math.random().toString(36).slice(-8)}`;
  674. }
  675. /**
  676. * 拼接邀请函地址信息
  677. * @param {空间信息} spaceInfo
  678. */
  679. function formateInvitationPassLink(spaceInfo) {
  680. if (!spaceInfo) {
  681. return '';
  682. }
  683. const {
  684. building = '',
  685. officeBuilding = {},
  686. floor,
  687. roomNo,
  688. project = {}
  689. } = spaceInfo;
  690. const { name = '' } = project;
  691. let { isVirtual } = officeBuilding;
  692. return `${name}${!isVirtual ? (building || '') : ''}${floor || ''}${roomNo || ''}`;
  693. }
  694. /**
  695. *
  696. * @param {根据keyword 转移成正则表达式}} text
  697. * @param {正则表达式匹配模式}} regFlags
  698. */
  699. function getSearchRegEx(text, regFlags = 'i') {
  700. let result = '.*';
  701. const length = text.length;
  702. // 需转义的字符
  703. for (let i = 0; i < length; i++) {
  704. let character = text.substring(i, i + 1);
  705. character = transEharacter(character);
  706. // result += "(" + character + ")" + ".*";
  707. result += character + '.*';
  708. }
  709. return new RegExp(result, regFlags)
  710. }
  711. // 对特殊字符做转义处理
  712. function transEharacter(character) {
  713. const escapeEharacters = '$().*+[{?|^';
  714. if (escapeEharacters.indexOf(character) > -1) {
  715. return `\${character}`;
  716. }
  717. if (character == '\\') {
  718. return `\\\\`;
  719. }
  720. return character;
  721. }
  722. /**
  723. * 返回 6月22日 14:00-16:00 | 12月1日 12:00 - 12月3日 10:00
  724. * @param {开始日期字符串} startTimeStr
  725. * @param {结束日期字符串} endTimeStr
  726. */
  727. function formateDateDurationTime(startTimeStr, endTimeStr) {
  728. if (!startTimeStr || !endTimeStr) {
  729. return '';
  730. }
  731. let startTime = moment(startTimeStr);
  732. let endTime = moment(endTimeStr);
  733. let isSameDate = startTime.format('YYYY-MM-DD') === endTime.format('YYYY-MM-DD');
  734. if (isSameDate) {
  735. let date = startTime.format('M月D日');
  736. let time = `${startTime.format('HH:mm')} - ${endTime.format('HH:mm')}`
  737. return `${date} ${time}`
  738. } else {
  739. return `${startTime.format('M月D日 HH:mm')} - ${endTime.format('M月D日 HH:mm')}`
  740. }
  741. }
  742. /**
  743. * 返回 {abbrDate: '6月22日', hour: '12:54', time: 时间对象}
  744. * @param {时间字符串或者时间对象} date
  745. */
  746. export function formateResultDate(date) {
  747. if (!date) {
  748. return null;
  749. }
  750. let time, timeStr;
  751. if (!(date instanceof Date)) {
  752. if (/^\d+$/.test(date)) {
  753. date = Number(date);
  754. } else {
  755. // 部分手机不支持 yyyy-MM-dd 这种格式
  756. date = (date || '').replace(/-/g, '/');
  757. }
  758. time = new Date(date);
  759. timeStr = date;
  760. } else {
  761. time = date;
  762. }
  763. const abbrDate = `${time.getMonth() + 1}月${time.getDate()}日`;
  764. const hour = `${getTwoNum(time.getHours())}:${getTwoNum(time.getMinutes())}`;
  765. return {
  766. abbrDate,
  767. hour,
  768. time // 时间对象
  769. }
  770. }
  771. /**
  772. * 颜色数值从16进制转换为rgba 3个数值
  773. * @param color
  774. */
  775. function transformColorHex2Rgba(color) {
  776. if (!color) {
  777. return '';
  778. }
  779. var sColor = color.toLowerCase();
  780. //十六进制颜色值的正则表达式
  781. var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
  782. if (sColor && reg.test(sColor)) {
  783. if (sColor.length === 4) {
  784. var sColorNew = "#";
  785. for (var i = 1; i < 4; i += 1) {
  786. sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
  787. }
  788. sColor = sColorNew;
  789. }
  790. //处理六位的颜色值
  791. var sColorChange = [];
  792. for (var i = 1; i < 7; i += 2) {
  793. sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
  794. }
  795. return "rgba(" + sColorChange.join(",") + ")";
  796. } else {
  797. return sColor;
  798. }
  799. }
  800. // 是否为rgb颜色值
  801. function isRgb(color) {
  802. return /^rgb/.test(color);
  803. }
  804. // 是否为十六进制颜色值
  805. function isHex(color) {
  806. return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);
  807. }
  808. // 是否为hsl颜色值
  809. function isHsl(color) {
  810. return /^hsl/.test(color);
  811. }
  812. function getColorGrayLevel(color) {
  813. color = isRgb(color)
  814. ? color
  815. : transformColorHex2Rgba(color);
  816. var left = color.indexOf('(') + 1;
  817. var right = color.indexOf(')');
  818. let arr = color.slice(left, right).split(',');
  819. var r = arr[0],
  820. g = arr[1],
  821. b = arr[2];
  822. let grayLevel = r * 0.299 + g * 0.587 + b * 0.114; // 值越大越浅
  823. return grayLevel;
  824. }
  825. /**
  826. * @param {目标颜色} color
  827. * @param {判断颜色} juggeColor
  828. */
  829. function isDeepColor(color, juggeColor) {
  830. if (!(color && juggeColor)) {
  831. return false;
  832. }
  833. let colorGrayLevel = getColorGrayLevel(color);
  834. let juggeColorLevel = getColorGrayLevel(juggeColor);
  835. return colorGrayLevel < juggeColorLevel;// 值越大越浅
  836. }
  837. function getCachedAgreement(url, serviceAgreementTitle, cacheKey) {
  838. return new Promise((resolve, reject) => {
  839. wx.getStorage({
  840. key: `${cacheKey}-${url}`,
  841. success: res => {
  842. if (res.data) {
  843. let catchedFilePath = res.data
  844. const fs = wx.getFileSystemManager();
  845. fs.access({
  846. path: catchedFilePath,
  847. success: () => {
  848. // 文件存在
  849. console.log('文件存在', catchedFilePath);
  850. resolve(catchedFilePath);
  851. },
  852. fail: () => {
  853. console.log('文件不存在', catchedFilePath);
  854. // 文件不存在或其他错误, 需要重新下载
  855. getAgreementUrl(url, serviceAgreementTitle, cacheKey, resolve, reject);
  856. }
  857. });
  858. } else {
  859. console.log('---没有缓存')
  860. getAgreementUrl(url, serviceAgreementTitle, cacheKey, resolve, reject);
  861. }
  862. },
  863. fail: () => {
  864. console.log('---读取缓存失败')
  865. getAgreementUrl(url, serviceAgreementTitle, cacheKey, resolve, reject);
  866. }
  867. });
  868. });
  869. }
  870. function getAgreementUrl(url, serviceAgreementTitle, cacheKey, resolve, reject) {
  871. wx.showLoading({
  872. title: '', //提示的内容,
  873. mask: true, //显示透明蒙层,防止触摸穿透,
  874. success: res => { }
  875. });
  876. wx.downloadFile({
  877. url,
  878. success: res => {
  879. const filePath = res.tempFilePath;
  880. wx.setStorage({
  881. key: `${cacheKey}-${url}`,
  882. data: filePath
  883. });
  884. resolve && resolve(filePath);
  885. wx.hideLoading({ noConflict: true });
  886. },
  887. fail: (res) => {
  888. console.log('下载文件失败', res);
  889. reject();
  890. wx.hideLoading({ noConflict: true });
  891. }
  892. });
  893. }
  894. function previewAgreement(url, serviceAgreementTitle, cacheKey) {
  895. return new Promise((resolve, reject) => {
  896. getCachedAgreement(url, serviceAgreementTitle, cacheKey).then(filePath => {
  897. wx.openDocument({
  898. filePath: filePath,
  899. success: function () {
  900. resolve();
  901. console.log('打开文档成功');
  902. },
  903. fail: (res) => {
  904. reject('打开文档失败');
  905. console.log('打开文档失败', 'res');
  906. }
  907. });
  908. }).catch((res) => {
  909. reject('打开文档失败');
  910. console.log('---', res);
  911. });
  912. })
  913. }
  914. function getMiniProgram() {
  915. const miniProgram = wx.getAccountInfoSync();
  916. return miniProgram;
  917. // this.version = miniProgram.miniProgram.version;
  918. }
  919. function getAppId() {
  920. const miniProgram = wx.getAccountInfoSync();
  921. return miniProgram && miniProgram.miniProgram && miniProgram.miniProgram.appId || 'wxda2ef261ac3cca32';
  922. }
  923. // 正式版本上能获取,体验和开发版本无法获取到版本号
  924. function getVersion() {
  925. const miniProgram = wx.getAccountInfoSync();
  926. return miniProgram && miniProgram.miniProgram && miniProgram.miniProgram.version;
  927. }
  928. // 获取时间戳
  929. function getTimeStamp() {
  930. let timeStamp = Date.parse(new Date());
  931. return timeStamp;
  932. }
  933. // http请求通用参数
  934. function commonParams() {
  935. // openid=${storeUser().openId}&
  936. let url = `pubname=${config.brsgServer.pubname}`
  937. if (storeUser().projectId) {
  938. url = url + `&projectId=${storeUser().projectId}`
  939. }
  940. if (storeUser().userName) {
  941. url = url + `&userName=${storeUser().userName}`
  942. }
  943. if (storeUser().userId) {
  944. url = url + `&userId=${storeUser().userId}`
  945. }
  946. if (storeToken()) {
  947. url = url + `&saga-token=${storeToken()}`
  948. }
  949. return url;
  950. }
  951. // 获取空间类型
  952. function getMapSpaceIcon(type) {
  953. let typeName = '公共区域'
  954. if (type === '300'
  955. || type === '313'
  956. || type === '314'
  957. || type === '315') {
  958. typeName = '开放办公区'
  959. }
  960. else if (type === '312'
  961. || type === '311'
  962. || type === '310') {
  963. typeName = '个人办公区'
  964. }
  965. else if (type === '120'
  966. || type === '140'
  967. || type === '130') {
  968. typeName = '走廊'
  969. }
  970. else if (type === '310' ||
  971. type === '320'
  972. || type === '321'
  973. || type === '322'
  974. || type === '323'
  975. || type === '490'
  976. || type === '931'
  977. ) {
  978. typeName = '会议室'
  979. }
  980. else if (type === '600'
  981. || type === '223'
  982. || type === '930') {
  983. typeName = '茶水间'
  984. }
  985. else if (type === '331') {
  986. typeName = '接待室'
  987. }
  988. else if (type === '330') {
  989. typeName = '打印室'
  990. }
  991. else if (type === '112') {
  992. typeName = '更衣室'
  993. }
  994. else if (type === '111') {
  995. typeName = '卫生间'
  996. }
  997. else if (type === '160') {
  998. typeName = '前台(大堂)'
  999. }
  1000. else if (type === '936'
  1001. || type === '935'
  1002. || type === '937' ||
  1003. type === '938' ||
  1004. type === '170'
  1005. || type === '915') {
  1006. typeName = '休闲活动区(吸烟室)'
  1007. }
  1008. else if (type === '690'
  1009. || type === '932'
  1010. || type === '934'
  1011. || type === '933'
  1012. || type === '6A0') {
  1013. typeName = '健身房'
  1014. }
  1015. else if (type === '113') {
  1016. typeName = '母婴室'
  1017. }
  1018. else if (type === '333'
  1019. || type === '250'
  1020. || type === '253') {
  1021. typeName = '普通库房'
  1022. }
  1023. else if (type === '252'
  1024. || type === '246'
  1025. || type === '1B5'
  1026. || type === '234'
  1027. || type === '231'
  1028. || type === '230'
  1029. || type === '233'
  1030. || type === '232'
  1031. || type === '234'
  1032. || type === '235'
  1033. || type === '236'
  1034. || type === '237'
  1035. || type === '241'
  1036. || type === '242'
  1037. || type === '244'
  1038. || type === '245'
  1039. || type === '251'
  1040. || type === '254'
  1041. || type === '211'
  1042. || type === '212'
  1043. || type === '222') {
  1044. typeName = '通迅机房'
  1045. } else if (type == '239') {
  1046. typeName = '空调机房'
  1047. }
  1048. else if (type === '430'
  1049. || type === '410'
  1050. || type === '220'
  1051. || type === '221'
  1052. ||
  1053. type === '400'
  1054. || type === '4B0'
  1055. || type === '441'
  1056. || type === '442'
  1057. || type === '451'
  1058. || type === '452'
  1059. || type === '461'
  1060. || type === '462'
  1061. || type === '471'
  1062. || type === '472'
  1063. || type === '733'
  1064. || type === '440'
  1065. || type === '450') {
  1066. typeName = '餐饮区'
  1067. } else if (type == '500') {
  1068. typeName = '零售区'
  1069. } else {
  1070. typeName = '公共区域'
  1071. }
  1072. let obj = {
  1073. "开放办公区": "map-icon1.svg",
  1074. "个人办公区": "map-icon2.svg",
  1075. "会议室": "map-icon3.svg",
  1076. "走廊": "map-icon4.svg",
  1077. "前台(大堂)": "map-icon5.svg",
  1078. "茶水间": "map-icon6.svg",
  1079. "接待室": "map-icon7.svg",
  1080. "休闲活动区(吸烟室)": "map-icon8.svg",
  1081. "餐饮区": "map-icon9.svg",
  1082. "零售区": "map-icon10.svg",
  1083. "公共区域": "map-icon10.svg",
  1084. "卫生间": "map-icon11.svg",
  1085. "健身房": "map-icon12.svg",
  1086. "母婴室": "map-icon13.svg",
  1087. "更衣室": "map-icon14.svg",
  1088. "打印室": "map-icon15.svg",
  1089. "普通库房": "map-icon16.svg",
  1090. "通讯机房": "map-icon17.svg",
  1091. "空调机房": "map-icon18.svg",
  1092. }
  1093. return obj[typeName]
  1094. }