jnpf.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. import CryptoJS from 'crypto-js'
  2. import request from '@/utils/request'
  3. import define from '@/utils/define'
  4. const jnpf = {
  5. goBack() {
  6. uni.navigateBack()
  7. },
  8. // 跳链接
  9. jumpLink(urlAddress, pageTitle = "") {
  10. if (!urlAddress) return
  11. let url = '/pages/apply/externalLink/index?url=' + encodeURIComponent(urlAddress) + '&fullName= ' +
  12. pageTitle
  13. uni.navigateTo({
  14. url: url,
  15. })
  16. },
  17. /* 传参字符串转义 */
  18. encodeContent(key) {
  19. const encodeArr = [{
  20. code: '%',
  21. encode: '%25'
  22. }, {
  23. code: '?',
  24. encode: '%3F'
  25. }, {
  26. code: '#',
  27. encode: '%23'
  28. }, {
  29. code: '&',
  30. encode: '%26'
  31. }, {
  32. code: '=',
  33. encode: '%3D'
  34. }];
  35. return key.replace(/[%?#&=]/g, ($, index, str) => {
  36. for (const k of encodeArr) {
  37. if (k.code === $) {
  38. return k.encode;
  39. }
  40. }
  41. });
  42. },
  43. solveAddressParam(item, config) {
  44. let jnpfKey = config.jnpfKey
  45. item.urlAddress = item.urlAddress ? item.urlAddress : config.option.appUrlAddress
  46. if (!item.urlAddress) return
  47. let urlAddress = item.urlAddress
  48. const regex = /\${[^{}]+}/g;
  49. urlAddress = urlAddress.replace(regex, match => {
  50. const key = match.slice(2, -1);
  51. let value = '';
  52. if (jnpfKey === 'text') {
  53. return key == 'Field' || key == 'field' ? item.value : match
  54. }
  55. if (jnpfKey === 'timeAxis') {
  56. if (key == 'name') value = item['content'];
  57. if (key == 'timestamp') value = item['timestamp'];
  58. }
  59. if (jnpfKey === 'tableList') {
  60. return item[key] || match
  61. }
  62. if (jnpfKey === 'dataBoard') {
  63. return key == 'Field' || key == 'field' ? item.num : match
  64. }
  65. if (jnpfKey === 'rankList') {
  66. if (key === 'name') value = item.label;
  67. if (key === 'value') value = item.value.replace("¥ ", "");
  68. }
  69. // 图标替换
  70. if (jnpfKey === 'barChart' || jnpfKey === 'lineChart' || jnpfKey === 'pieChart' ||
  71. jnpfKey == 'radarChart' || jnpfKey === 'mapChart') {
  72. if (key === 'name') value = item.name;
  73. if (key === 'long') value = item.long;
  74. if (key === 'lat') value = item.lat;
  75. if (key === 'value') value = item.value;
  76. if (key === 'type') value = item.type;
  77. }
  78. return value || match;
  79. });
  80. item.urlAddress = urlAddress
  81. },
  82. handelFormat(format) {
  83. let formatObj = {
  84. 'yyyy': 'yyyy',
  85. 'yyyy-MM': 'yyyy-MM',
  86. 'yyyy-MM-dd': 'yyyy-MM-dd',
  87. 'yyyy-MM-dd HH:mm': 'yyyy-MM-dd HH:mm',
  88. 'yyyy-MM-dd HH:mm:ss': 'yyyy-MM-dd HH:mm:ss',
  89. 'HH:mm:ss': 'HH:mm:ss',
  90. "HH:mm": "HH:mm",
  91. 'YYYY': 'yyyy',
  92. 'YYYY-MM': 'yyyy-MM',
  93. 'YYYY-MM-DD': 'yyyy-MM-dd',
  94. 'YYYY-MM-DD HH:mm': 'yyyy-MM-dd HH:mm',
  95. 'YYYY-MM-DD HH:mm:ss': 'yyyy-MM-dd HH:mm:ss',
  96. }
  97. return formatObj[format]
  98. },
  99. toDate(v, format) {
  100. format = format ? format : "yyyy-MM-dd HH:mm:ss"
  101. if (!v) return "";
  102. var d = v;
  103. if (typeof v === 'string') {
  104. if (v.indexOf("/Date(") > -1)
  105. d = new Date(parseInt(v.replace("/Date(", "").replace(")/", ""), 10));
  106. else
  107. d = new Date(Date.parse(v.replace(/-/g, "/").replace("T", " ").split(".")[0]));
  108. } else {
  109. d = new Date(v)
  110. }
  111. var o = {
  112. "M+": d.getMonth() + 1,
  113. "d+": d.getDate(),
  114. "h+": d.getHours(),
  115. "H+": d.getHours(),
  116. "m+": d.getMinutes(),
  117. "s+": d.getSeconds(),
  118. "q+": Math.floor((d.getMonth() + 3) / 3),
  119. "S": d.getMilliseconds()
  120. };
  121. if (/(y+)/.test(format)) {
  122. format = format.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));
  123. }
  124. for (var k in o) {
  125. if (new RegExp("(" + k + ")").test(format)) {
  126. format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" +
  127. o[k])
  128. .length));
  129. }
  130. }
  131. return format;
  132. },
  133. toFileSize(size) {
  134. if (size == null || size == "") {
  135. return "";
  136. }
  137. if (size < 1024.00)
  138. return jnpf.toDecimal(size) + " 字节";
  139. else if (size >= 1024.00 && size < 1048576)
  140. return jnpf.toDecimal(size / 1024.00) + " KB";
  141. else if (size >= 1048576 && size < 1073741824)
  142. return jnpf.toDecimal(size / 1024.00 / 1024.00) + " MB";
  143. else if (size >= 1073741824)
  144. return jnpf.toDecimal(size / 1024.00 / 1024.00 / 1024.00) + " GB";
  145. },
  146. toDecimal(num) {
  147. if (num == null) {
  148. num = "0";
  149. }
  150. num = num.toString().replace(/\$|\,/g, '');
  151. if (isNaN(num))
  152. num = "0";
  153. var sign = (num == (num = Math.abs(num)));
  154. num = Math.floor(num * 100 + 0.50000000001);
  155. var cents = num % 100;
  156. num = Math.floor(num / 100).toString();
  157. if (cents < 10)
  158. cents = "0" + cents;
  159. for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
  160. num = num.substring(0, num.length - (4 * i + 3)) + '' +
  161. num.substring(num.length - (4 * i + 3));
  162. return (((sign) ? '' : '-') + num + '.' + cents);
  163. },
  164. getScriptFunc(str) {
  165. // #ifndef MP
  166. let func = null
  167. try {
  168. func = eval(str)
  169. if (Object.prototype.toString.call(func) !== '[object Function]') return false;
  170. return func
  171. } catch (error) {
  172. console.log(error);
  173. return false
  174. }
  175. // #endif
  176. // #ifdef MP
  177. return false
  178. // #endif
  179. },
  180. interfaceDataHandler(data) {
  181. if (!data.dataProcessing) return data.data
  182. const dataHandler = this.getScriptFunc(data.dataProcessing)
  183. if (!dataHandler) return data.data
  184. return dataHandler(data.data)
  185. },
  186. toDateText(dateTimeStamp) {
  187. if (!dateTimeStamp) return ''
  188. let result = ''
  189. let minute = 1000 * 60; //把分,时,天,周,半个月,一个月用毫秒表示
  190. let hour = minute * 60;
  191. let day = hour * 24;
  192. let week = day * 7;
  193. let halfamonth = day * 15;
  194. let month = day * 30;
  195. let now = new Date().getTime(); //获取当前时间毫秒
  196. let diffValue = now - dateTimeStamp; //时间差
  197. if (diffValue < 0) return "刚刚"
  198. let minC = diffValue / minute; //计算时间差的分,时,天,周,月
  199. let hourC = diffValue / hour;
  200. let dayC = diffValue / day;
  201. let weekC = diffValue / week;
  202. let monthC = diffValue / month;
  203. if (monthC >= 1 && monthC <= 3) {
  204. result = " " + parseInt(monthC) + "月前"
  205. } else if (weekC >= 1 && weekC <= 3) {
  206. result = " " + parseInt(weekC) + "周前"
  207. } else if (dayC >= 1 && dayC <= 6) {
  208. result = " " + parseInt(dayC) + "天前"
  209. } else if (hourC >= 1 && hourC <= 23) {
  210. result = " " + parseInt(hourC) + "小时前"
  211. } else if (minC >= 1 && minC <= 59) {
  212. result = " " + parseInt(minC) + "分钟前"
  213. } else if (diffValue >= 0 && diffValue <= minute) {
  214. result = "刚刚"
  215. } else {
  216. let datetime = new Date();
  217. datetime.setTime(dateTimeStamp);
  218. let Nyear = datetime.getFullYear();
  219. let Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime
  220. .getMonth() + 1;
  221. let Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate();
  222. let Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours();
  223. let Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes();
  224. let Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds();
  225. result = Nyear + "-" + Nmonth + "-" + Ndate
  226. }
  227. return result;
  228. },
  229. //取整
  230. toRound(number) {
  231. var bite = 0;
  232. if (number < 10) {
  233. return 10;
  234. }
  235. if (number > 10 && number < 50) {
  236. return 50;
  237. }
  238. while (number >= 10) {
  239. number /= 10;
  240. bite += 1;
  241. }
  242. return Math.ceil(number) * Math.pow(10, bite);
  243. },
  244. getAmountChinese(val) {
  245. if (!val && val !== 0) return '';
  246. if (val == 0) return '零元整';
  247. const regExp = /[a-zA-Z]/;
  248. if (regExp.test(val)) return '数字较大溢出';
  249. let amount = +val;
  250. if (isNaN(amount)) return '';
  251. if (amount < 0) amount = Number(amount.toString().split('-')[1]);
  252. const NUMBER = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  253. const N_UNIT1 = ['', '拾', '佰', '仟'];
  254. const N_UNIT2 = ['', '万', '亿', '兆'];
  255. const D_UNIT = ['角', '分', '厘', '毫'];
  256. let [integer, decimal] = amount.toString().split('.');
  257. if (integer && (integer.length > 15 || integer.indexOf('e') > -1)) return '数字较大溢出';
  258. let res = '';
  259. // 整数部分
  260. if (integer) {
  261. let zeroCount = 0;
  262. for (let i = 0, len = integer.length; i < len; i++) {
  263. const num = integer.charAt(i);
  264. const pos = len - i - 1; // 排除个位后 所处的索引位置
  265. const q = pos / 4;
  266. const m = pos % 4;
  267. if (num === '0') {
  268. zeroCount++;
  269. } else {
  270. if (zeroCount > 0 && m !== 3) res += NUMBER[0];
  271. zeroCount = 0;
  272. res += NUMBER[parseInt(num)] + N_UNIT1[m];
  273. }
  274. if (m == 0 && zeroCount < 4) res += N_UNIT2[Math.floor(q)];
  275. }
  276. }
  277. if (Number(integer) != 0) res += '元';
  278. // 小数部分
  279. if (parseInt(decimal)) {
  280. for (let i = 0; i < 4; i++) {
  281. const num = decimal.charAt(i);
  282. if (parseInt(num)) res += NUMBER[num] + D_UNIT[i];
  283. }
  284. } else {
  285. res += '整';
  286. }
  287. if (val < 0) res = '负数' + res;
  288. return res;
  289. },
  290. thousandsFormat(num) {
  291. if (num === 0) return '0';
  292. if (!num) return '';
  293. const numArr = num.toString().split('.');
  294. numArr[0] = numArr[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  295. return numArr.join('.');
  296. },
  297. base64: {
  298. encode(str, isEncodeURIComponent = true) {
  299. if (!str) return ''
  300. const newStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str))
  301. return isEncodeURIComponent ? encodeURIComponent(newStr) : newStr
  302. },
  303. decode(str, isDecodeURIComponent = true) {
  304. if (!str) return ''
  305. const newStr = isDecodeURIComponent ? decodeURIComponent(str) : str
  306. const result = CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(newStr))
  307. return result
  308. }
  309. },
  310. idGenerator() {
  311. let quotient = (new Date() - new Date('2020-08-01'))
  312. quotient += Math.ceil(Math.random() * 1000)
  313. const chars = '0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz';
  314. const charArr = chars.split("")
  315. const radix = chars.length;
  316. const res = []
  317. do {
  318. let mod = quotient % radix;
  319. quotient = (quotient - mod) / radix;
  320. res.push(charArr[mod])
  321. } while (quotient);
  322. return res.join('')
  323. },
  324. dynamicText(value, options) {
  325. if (!value) return ''
  326. if (Array.isArray(value)) {
  327. if (!options || !Array.isArray(options)) return value.join()
  328. let textList = []
  329. for (let i = 0; i < value.length; i++) {
  330. let item = options.filter(o => o.id == value[i])[0]
  331. if (!item || !item.fullName) {
  332. textList.push(value[i])
  333. } else {
  334. textList.push(item.fullName)
  335. }
  336. }
  337. return textList.join()
  338. }
  339. if (!options || !Array.isArray(options)) return value
  340. let item = options.filter(o => o.id == value)[0]
  341. if (!item || !item.fullName) return value
  342. return item.fullName
  343. },
  344. treeToArray(treeData, type = '') {
  345. let list = []
  346. const loop = (treeData) => {
  347. for (let i = 0; i < treeData.length; i++) {
  348. const item = treeData[i]
  349. if (!type || item.type === type) list.push(item)
  350. if (item.children && Array.isArray(item.children)) loop(item.children)
  351. }
  352. }
  353. loop(treeData)
  354. return list
  355. },
  356. dynamicTreeText(value, options) {
  357. if (!value) return ''
  358. const transfer = (data, partition) => {
  359. let textList = []
  360. const loop = (data, id) => {
  361. for (let i = 0; i < data.length; i++) {
  362. if (data[i].id === id) {
  363. textList.push(data[i].fullName)
  364. break
  365. }
  366. if (data[i].children) loop(data[i].children, id)
  367. }
  368. }
  369. for (let i = 0; i < data.length; i++) {
  370. if (Array.isArray(data[i])) {
  371. textList.push(transfer(data[i], "/"))
  372. } else {
  373. loop(options, data[i])
  374. }
  375. }
  376. return textList.join(partition)
  377. }
  378. if (!options || !Array.isArray(options)) return Array.isArray(value) ? value.join() : value
  379. if (Array.isArray(value)) return transfer(value)
  380. return transfer(value.split())
  381. },
  382. onlineUtils: {
  383. // 获取用户信息
  384. getUserInfo() {
  385. const userInfo = uni.getStorageSync('userInfo') || {};
  386. userInfo.token = uni.getStorageSync('token') || '';
  387. return userInfo;
  388. },
  389. // 获取设备信息
  390. getDeviceInfo() {
  391. const deviceInfo = {
  392. vueVersion: '3',
  393. origin: 'app'
  394. };
  395. return deviceInfo;
  396. },
  397. // 请求
  398. request(url, method, data, header) {
  399. return request({
  400. url: url,
  401. method: method || 'GET',
  402. data: data || {},
  403. header: header || {},
  404. options: {
  405. load: false
  406. }
  407. })
  408. },
  409. // 路由跳转
  410. route(url, type = 'navigateTo') {
  411. if (!url) return;
  412. uni.$u.route({
  413. url,
  414. type
  415. })
  416. },
  417. // 消息提示
  418. toast(message, _type = 'info', duration = 3000) {
  419. uni.$u.toast(message, duration)
  420. },
  421. },
  422. aesEncryption: {
  423. decrypt(str, cipherKey = '') {
  424. if (!cipherKey) cipherKey = define.cipherKey
  425. const hexStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(str))
  426. const decryptedData = CryptoJS.AES.decrypt(hexStr, CryptoJS.enc.Utf8.parse(cipherKey), {
  427. mode: CryptoJS.mode.ECB,
  428. padding: CryptoJS.pad.Pkcs7
  429. }).toString(CryptoJS.enc.Utf8);
  430. return decryptedData
  431. },
  432. encrypt(str, cipherKey = '') {
  433. if (!cipherKey) cipherKey = define.cipherKey
  434. const encryptedData = CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(cipherKey), {
  435. mode: CryptoJS.mode.ECB,
  436. padding: CryptoJS.pad.Pkcs7
  437. }).toString();
  438. const result = CryptoJS.enc.Hex.stringify(CryptoJS.enc.Base64.parse(encryptedData))
  439. return result
  440. }
  441. },
  442. getDistance(lat1, lon1, lat2, lon2) {
  443. const toRadians = (degrees) => {
  444. return degrees * (Math.PI / 180);
  445. }
  446. const R = 6371;
  447. const dLat = toRadians(lat2 - lat1);
  448. const dLon = toRadians(lon2 - lon1);
  449. const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
  450. Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) *
  451. Math.sin(dLon / 2) * Math.sin(dLon / 2);
  452. const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  453. const distance = R * c;
  454. return distance * 1000;
  455. },
  456. getParamList(templateJson, data, rowKey = 'id') {
  457. if (!templateJson || !templateJson.length) return [];
  458. for (let i = 0; i < templateJson.length; i++) {
  459. const e = templateJson[i];
  460. if (e.sourceType == 1 && data) {
  461. e.defaultValue = data[e.relationField] || data[e.relationField] == 0 || data[e
  462. .relationField] ==
  463. false ? data[e.relationField] : '';
  464. }
  465. if (e.sourceType == 4 && e.relationField == '@formId') e.defaultValue = data[rowKey] || '';
  466. }
  467. return templateJson;
  468. },
  469. getBatchParamList(templateJson, data) {
  470. if (!templateJson?.length) return [];
  471. for (let i = 0; i < templateJson.length; i++) {
  472. const e = templateJson[i];
  473. if (e.sourceType == 1 && data.items?.length) {
  474. e.defaultValue = data.items.map(o => (data.webType == '4' ? o[e.relationField] : o[e
  475. .relationField + '_jnpfId']));
  476. }
  477. if (e.sourceType == 4 && e.relationField == '@formId') e.defaultValue = data.items.map(o => o.id);
  478. }
  479. return templateJson;
  480. // if (!templateJson || !templateJson.length) return [];
  481. // for (let i = 0; i < templateJson.length; i++) {
  482. // const e = templateJson[i];
  483. // let defaultValue = [];
  484. // if (e.sourceType === 1 && data.length) {
  485. // data.forEach(o => {
  486. // if (type != 1 && o.hasOwnProperty(e.relationField + '_jnpfId')) {
  487. // defaultValue.push(o[e.relationField + '_jnpfId']);
  488. // } else {
  489. // defaultValue.push(o[e.relationField]);
  490. // }
  491. // });
  492. // }
  493. // e.defaultValue = defaultValue;
  494. // if (e.sourceType === 4 && e.relationField === '@formId' && data.id !== undefined) {
  495. // e.defaultValue = [data.id];
  496. // } else if (e.sourceType !== 1) {
  497. // e.defaultValue = [];
  498. // }
  499. // }
  500. // return templateJson;
  501. },
  502. getLaunchFlowParamList(transferList, data, rowKey = 'id') {
  503. transferList = JSON.parse(JSON.stringify(transferList))
  504. if (!transferList?.length) return [];
  505. for (let i = 0; i < transferList.length; i++) {
  506. const e = transferList[i];
  507. if (e.sourceType == 1) {
  508. if (e.sourceValue == '@formId') {
  509. e.sourceValue = data[rowKey] || '';
  510. } else {
  511. e.sourceValue = data[e.sourceValue] || data[e.sourceValue] == 0 || data[e.sourceValue] ==
  512. false ? data[e.sourceValue] : '';
  513. }
  514. }
  515. }
  516. return transferList;
  517. }
  518. }
  519. export default jnpf