utils.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. /**
  2. * 之前的时间
  3. * @param {number} date 时间戳或时间字符串
  4. *
  5. */
  6. import { t } from "@/locale";
  7. export const fromTime = (timer) => {
  8. if (timer > 90000000000) { timer /= 1000; }
  9. let now = new Date()
  10. const nowday = now.getDate()
  11. const nowhour = now.getHours()
  12. const nowminute = now.getMinutes()
  13. const nowsecond = now.getSeconds()
  14. let todaysec = nowhour * 60 * 60 + nowminute * 60 + nowsecond
  15. const hour = date("H", timer);
  16. const minute = date("i", timer);
  17. let nowTime = new Date().getTime();
  18. let miao = parseInt((nowTime / 1000) - timer)
  19. //一小时以内的
  20. if (miao < 60) {
  21. return t('刚刚')
  22. } else if (miao >= 60 && miao < 3600) {
  23. return Math.floor(miao / 60) + t('分钟前')
  24. } else if (miao >= 3600 && miao <= todaysec) {
  25. return Math.floor(miao / 3600) + t('小时前')
  26. } else if (miao > todaysec && miao < todaysec + 86400) {
  27. return t('昨天')
  28. } else if (miao >= 86400 && miao < 2592000) {
  29. return parseInt(miao / 86400) + t('天前');
  30. } else {
  31. return date("Y/m/d", timer);
  32. }
  33. }
  34. export const timeFormat = (timestamp) => {
  35. const now = new Date();
  36. const datetime = new Date(timestamp);
  37. const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
  38. const yesterday = new Date(today - 24 * 60 * 60 * 1000);
  39. const weekStart = new Date(today - (today.getDay() - 1) * 24 * 60 * 60 * 1000);
  40. const yearStart = new Date(now.getFullYear(), 0, 1);
  41. if (datetime >= today) {
  42. return date('H:i', timestamp / 1000)
  43. } else if (datetime >= yesterday && datetime < today) {
  44. return '昨天'
  45. } else if (datetime >= weekStart && datetime < yesterday) {
  46. const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  47. const weekday = weekdays[datetime.getDay()];
  48. return weekday;
  49. } else if (datetime >= yearStart && datetime < weekStart) {
  50. return date('m-d', timestamp / 1000)
  51. } else {
  52. return date('Y-m-d', timestamp / 1000)
  53. }
  54. }
  55. /**
  56. * 传入的时间戳和当前时间作比较
  57. * @param {number} date 时间戳或时间字符串
  58. *
  59. */
  60. export const overTime = (timer) => {
  61. var arrTimestamp = (timer + '').split('');
  62. for (var start = 0; start < 13; start++) {
  63. if (!arrTimestamp[start]) {
  64. arrTimestamp[start] = '0';
  65. }
  66. }
  67. timer = arrTimestamp.join('') * 1;
  68. var minute = 1000 * 60;
  69. var hour = minute * 60;
  70. var day = hour * 24;
  71. var halfamonth = day * 15;
  72. var month = day * 30;
  73. var now = new Date().getTime();
  74. var diffValue = now - timer;
  75. // 如果本地时间反而小于变量时间
  76. if (diffValue < 0) {
  77. return '不久前';
  78. }
  79. // 计算差异时间的量级
  80. var monthC = diffValue / month;
  81. var weekC = diffValue / (7 * day);
  82. var dayC = diffValue / day;
  83. var hourC = diffValue / hour;
  84. var minC = diffValue / minute;
  85. // 数值补0方法
  86. var zero = function (value) {
  87. if (value < 10) {
  88. return '0' + value;
  89. }
  90. return value;
  91. };
  92. // 使用
  93. if (monthC > 12) {
  94. // 超过1年,直接显示年月日
  95. return (function () {
  96. var date = new Date(timer);
  97. return date.getFullYear() + '年' + zero(date.getMonth() + 1) + '月' + zero(date.getDate()) + '日';
  98. })();
  99. } else if (monthC >= 1) {
  100. return '已过期' + parseInt(monthC) + "月";
  101. } else if (weekC >= 1) {
  102. return '已过期' + parseInt(weekC) + "周";
  103. } else if (dayC >= 1) {
  104. return '已过期' + parseInt(dayC) + "天";
  105. } else if (hourC >= 1) {
  106. return '已过期' + parseInt(hourC) + "小时";
  107. } else if (minC >= 1) {
  108. return '已过期'
  109. parseInt(minC) + "分钟";
  110. } else if (minC < 1) {
  111. return parseInt(minC) + "分钟后过期";
  112. } else if (hourC < 1) {
  113. return parseInt(hourC) + "小时后过期";
  114. } else if (dayC < 1) {
  115. return parseInt(dayC) + "天后过期";
  116. } else if (weekC < 1) {
  117. var date = new Date(timer);
  118. return date.getFullYear() + '年' + zero(date.getMonth() + 1) + '月' + zero(date.getDate()) + '日';
  119. }
  120. }
  121. export const getExpireDaysFromTimestamp = (timer) => {
  122. // 转为数字并转为毫秒
  123. const expireDate = new Date(Number(timer) * 1000);
  124. const today = new Date();
  125. // 清除时分秒
  126. expireDate.setHours(0, 0, 0, 0);
  127. today.setHours(0, 0, 0, 0);
  128. // 计算天数差
  129. const diffTime = expireDate - today;
  130. const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
  131. return diffDays;
  132. }
  133. /**
  134. * 根据客户分级设置背景颜色
  135. * @param {number} level 时间戳或时间字符串
  136. * 1主色,2橙色,3红色,4绿色,5灰色
  137. */
  138. export const bgAvatar = (level) => {
  139. if (level === 1 || !level) {
  140. return "bg-blue";
  141. }
  142. if (level === 2) {
  143. return "bg-orange";
  144. }
  145. if (level === 3) {
  146. return 'bg-red'
  147. }
  148. if (level === 4) {
  149. return 'bg-green'
  150. }
  151. if (level === 5) {
  152. return 'bg-grey'
  153. }
  154. }
  155. //序列化url,将url链接后面的get参数序列化成json对象
  156. export const parseUrl = (url) => {
  157. var param = url.substring(url.indexOf("?") + 1);
  158. var paramArr = param.split("&");
  159. var urlArr = {};
  160. for (let i = 0; i < paramArr.length; i++) {
  161. urlArr[paramArr[i].split("=")[0]] = decodeURI(paramArr[i].split("=")[1]);
  162. // 将数组元素中'='左边的内容作为对象的属性名,'='右边的内容作为对象对应属性的属性值
  163. }
  164. return urlArr;
  165. }
  166. /**
  167. * 设置表单共有属性
  168. *
  169. */
  170. export const setFrom = (fromList, info, action, project) => {
  171. fromList.forEach(fromIitem => {
  172. fromIitem.rules = {
  173. errMess: `${fromIitem.name}不能为空`
  174. }
  175. // 回款是多选 所以要便利value
  176. if (fromIitem.relevant) {
  177. fromIitem.form_type == fromIitem.relevant ? fromIitem.disabled = true : ""
  178. }
  179. if (fromIitem.form_type === 'money') {
  180. fromIitem.default_value ? fromIitem.capitalize = menoyToUppercase(fromIitem.default_value) :
  181. fromIitem.capitalize = null
  182. }
  183. // 如果是下拉或者 tag 设置show属性 弹出选择框才能显示
  184. if (fromIitem.form_type === 'tags' || fromIitem.form_type === 'select' || fromIitem.form_type ===
  185. 'invoice_info' ||
  186. fromIitem.form_type === 'pm_type' || fromIitem.form_type === 'finance_type' ||
  187. fromIitem.form_type === 'visit_user' || fromIitem.form_type === 'area') {
  188. fromIitem.show = false
  189. }
  190. // 判断有没有 setting 有的话是下拉 多选
  191. if (fromIitem.setting) {
  192. fromIitem.list = []
  193. if (fromIitem.setting instanceof Array) {
  194. // 是数组 根据index
  195. fromIitem.setting.forEach((i, idx) => {
  196. fromIitem.list.push({
  197. value: idx, //最终提交拿到的值
  198. label: i, //展示给用户的字段
  199. })
  200. })
  201. } else {
  202. for (let key in fromIitem.setting) {
  203. fromIitem.list.push({
  204. value: key, //最终提交拿到的值
  205. label: fromIitem.setting[key], //展示给用户的字段
  206. })
  207. }
  208. }
  209. }
  210. if (fromIitem.form_type === 'select' && fromIitem.default_value && fromIitem.setting) {
  211. fromIitem.list.forEach(it => {
  212. if (it.value == fromIitem.default_value) {
  213. fromIitem.value = it.label
  214. }
  215. })
  216. }
  217. // 判断禁用
  218. if (fromIitem.form_type == 'business' && action == 'add') {
  219. fromIitem.default_value = info.leads_id
  220. fromIitem.value = info.name
  221. fromIitem.disabled = true
  222. }
  223. if (fromIitem.form_type ==
  224. 'customer' &&
  225. info && action == 'add') {
  226. fromIitem.default_value = info.name
  227. fromIitem.value = info.leads_id
  228. fromIitem.disabled = true
  229. } else if (fromIitem.form_type == 'business' && action == 'edit' || fromIitem.form_type ==
  230. 'customer' && info && action == 'add' || fromIitem.form_type ==
  231. 'customer' && info && action == 'edit') {
  232. fromIitem.default_value = fromIitem.value
  233. fromIitem.value = fromIitem.default_value
  234. fromIitem.disabled = true
  235. }
  236. if (fromIitem.field == 'company' && action == 'edit') {
  237. fromIitem.disabled = true
  238. }
  239. // 判断项目名称有没
  240. if (fromIitem.form_type == 'project' && action == 'add' && !info) {
  241. fromIitem.disabled = true
  242. }
  243. if (fromIitem.form_type == 'project' && action == 'add' && project) {
  244. console.log(project)
  245. fromIitem.disabled = true
  246. fromIitem.default_value = project.project_id
  247. fromIitem.value = project.title
  248. }
  249. if (fromIitem.form_type == 'receivable') {
  250. if (action == 'add' && !project) {
  251. fromIitem.disabled = true
  252. }
  253. if (fromIitem.default_value != "") {
  254. let val = fromIitem.value.map(i => {
  255. return i.receivables_id
  256. })
  257. uni.setStorageSync('relationReceivableId', val)
  258. fromIitem.default_value = val.join('')
  259. fromIitem.value = fromIitem.value.map(i => {
  260. return i.number
  261. })
  262. }
  263. }
  264. // 判断成交人回显
  265. if (fromIitem.form_type == "user_receivables") {
  266. if (fromIitem.value) {
  267. fromIitem.value.forEach((i, idx) => {
  268. fromIitem.default_value[idx].realname = fromIitem.value[idx].user_id_info
  269. .realname
  270. })
  271. }
  272. if (!fromIitem.value) {
  273. fromIitem.default_value = []
  274. fromIitem.default_value.push({
  275. realname: '',
  276. user_id: '',
  277. proportion: ''
  278. })
  279. }
  280. }
  281. })
  282. return fromList
  283. }
  284. /**
  285. * 设置三级联动
  286. *
  287. */
  288. export const setPmType = (data) => {
  289. let list = []
  290. data.forEach((item, index) => {
  291. list.push({
  292. label: item.name,
  293. value: item.type_id
  294. })
  295. if (item.children) {
  296. list[index].children = []
  297. item.children.forEach((i, idx) => {
  298. list[index].children.push({
  299. label: i.name,
  300. value: i.type_id
  301. })
  302. if (item.children[idx].children) {
  303. list[index].children[idx].children = []
  304. item.children[idx].children.forEach((ii, iidx) => {
  305. list[index].children[idx].children.push({
  306. label: ii.name, //展示给用户的字段
  307. value: ii.type_id, //最终提交拿到的值
  308. })
  309. })
  310. }
  311. })
  312. }
  313. })
  314. return list;
  315. }
  316. export const judgeListComplete = (list) => {
  317. let flag = ''
  318. list.every((item) => {
  319. for (let key in item) {
  320. item[key] == '' ? flag = '' : flag = true
  321. }
  322. })
  323. return flag;
  324. }
  325. export const judgeobjduplicate = (list) => {
  326. let flag = ''
  327. let sum = 0
  328. list.forEach(item => {
  329. sum += parseInt(item.proportion)
  330. })
  331. if (sum >= 100) {
  332. flag = false
  333. } else {
  334. flag = true
  335. }
  336. return flag;
  337. }
  338. // 生成唯一ID
  339. export const getUuid = () => {
  340. var d = new Date().getTime();
  341. var uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
  342. var r = (d + Math.random() * 16) % 16 | 0;
  343. d = Math.floor(d / 16);
  344. return (c == "x" ? r : r & 0x3 | 0x8).toString(16);
  345. });
  346. return uuid;
  347. }
  348. // 寻找数组
  349. export const findArray = (arr, id) => {
  350. return arr.find(function (res) {
  351. var newId = res.id;
  352. return id == newId;
  353. });
  354. }
  355. // 二维数组排序
  356. export const sortContacts = (data) => {
  357. const arr = JSON.parse(JSON.stringify(data));
  358. arr.sort((a, b) => {
  359. // 将字符串时间戳转换为数字
  360. const timeA = parseInt(a.lastSendTime, 10);
  361. const timeB = parseInt(b.lastSendTime, 10);
  362. // 如果转换失败(例如,非数字字符串),则将它们视为无效并放在数组末尾
  363. // 这里可以根据实际情况调整逻辑,比如抛出错误或忽略这些项
  364. if (isNaN(timeA)) return 1; // 将a视为大于b
  365. if (isNaN(timeB)) return -1; // 将b视为小于a
  366. // 使用转换后的数字进行比较
  367. return timeB - timeA;
  368. });
  369. return arr;
  370. }
  371. // 将数字转换成大写中文
  372. export const menoyToUppercase = (money) => {
  373. var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'); //汉字的数字
  374. var cnIntRadice = new Array('', '拾', '佰', '仟'); //基本单位
  375. var cnIntUnits = new Array('', '万', '亿', '兆'); //对应整数部分扩展单位
  376. var cnDecUnits = new Array('角', '分', '毫', '厘'); //对应小数部分单位
  377. var cnInteger = '整'; //整数金额时后面跟的字符
  378. var cnIntLast = '元'; //整数完以后的单位
  379. //最大处理的数字
  380. var maxNum = 999999999999999.9999;
  381. var integerNum; //金额整数部分
  382. var decimalNum; //金额小数部分
  383. //输出的中文金额字符串
  384. var chineseStr = '';
  385. var parts; //分离金额后用的数组,预定义
  386. if (!money) {
  387. return '';
  388. }
  389. money = parseFloat(money);
  390. if (money >= maxNum) {
  391. //超出最大处理数字
  392. return '超出最大处理数字';
  393. }
  394. if (money == 0) {
  395. chineseStr = cnNums[0] + cnIntLast + cnInteger;
  396. return chineseStr;
  397. }
  398. //四舍五入保留两位小数,转换为字符串
  399. money = Math.round(money * 100).toString();
  400. integerNum = money.substr(0, money.length - 2);
  401. decimalNum = money.substr(money.length - 2);
  402. //获取整型部分转换
  403. if (parseInt(integerNum, 10) > 0) {
  404. var zeroCount = 0;
  405. var IntLen = integerNum.length;
  406. for (var i = 0; i < IntLen; i++) {
  407. var n = integerNum.substr(i, 1);
  408. var p = IntLen - i - 1;
  409. var q = p / 4;
  410. var m = p % 4;
  411. if (n == '0') {
  412. zeroCount++;
  413. } else {
  414. if (zeroCount > 0) {
  415. chineseStr += cnNums[0];
  416. }
  417. //归零
  418. zeroCount = 0;
  419. chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
  420. }
  421. if (m == 0 && zeroCount < 4) {
  422. chineseStr += cnIntUnits[q];
  423. }
  424. }
  425. chineseStr += cnIntLast;
  426. }
  427. //小数部分
  428. if (decimalNum != '') {
  429. var decLen = decimalNum.length;
  430. for (var i = 0; i < decLen; i++) {
  431. var n = decimalNum.substr(i, 1);
  432. if (n != '0') {
  433. chineseStr += cnNums[Number(n)] + cnDecUnits[i];
  434. }
  435. }
  436. }
  437. if (chineseStr == '') {
  438. chineseStr += cnNums[0] + cnIntLast + cnInteger;
  439. } else if (decimalNum == '' || /^0*$/.test(decimalNum)) {
  440. chineseStr += cnInteger;
  441. }
  442. return chineseStr;
  443. }
  444. //数组转成字符串
  445. export const filterValue = (arr, field, isTrans) => {
  446. isTrans = typeof isTrans !== 'undefined' ? isTrans : false;
  447. var idr = [];
  448. for (var i = 0; i < arr.length; i++) {
  449. idr.push(arr[i][field]);
  450. }
  451. if (isTrans === true) {
  452. return idr.join(",");
  453. } else {
  454. return idr;
  455. }
  456. }
  457. /**
  458. * 和PHP一样的时间戳格式化函数
  459. * @param {string} format 格式
  460. * @param {int} timestamp 要格式化的时间 默认为当前时间
  461. * @return {string} 格式化的时间字符串
  462. */
  463. export const date = (format, timestamp) => {
  464. if (timestamp < 90000000000) { timestamp *= 1000; }
  465. var a, jsdate = ((timestamp) ? new Date(timestamp) : new Date());
  466. var pad = function (n, c) {
  467. if ((n = n + "").length < c) {
  468. return new Array(++c - n.length).join("0") + n;
  469. } else {
  470. return n;
  471. }
  472. };
  473. var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  474. var txt_ordin = { 1: "st", 2: "nd", 3: "rd", 21: "st", 22: "nd", 23: "rd", 31: "st" };
  475. var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  476. var f = {
  477. // Day
  478. d: function () { return pad(f.j(), 2) },
  479. D: function () { return f.l().substr(0, 3) },
  480. j: function () { return jsdate.getDate() },
  481. l: function () { return txt_weekdays[f.w()] },
  482. N: function () { return f.w() + 1 },
  483. S: function () { return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th' },
  484. w: function () { return jsdate.getDay() },
  485. z: function () { return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0 },
  486. // Week
  487. W: function () {
  488. var a = f.z(),
  489. b = 364 + f.L() - a;
  490. var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
  491. if (b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) {
  492. return 1;
  493. } else {
  494. if (a <= 2 && nd >= 4 && a >= (6 - nd)) {
  495. nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
  496. return date("W", Math.round(nd2.getTime() / 1000));
  497. } else {
  498. return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
  499. }
  500. }
  501. },
  502. // Month
  503. F: function () { return txt_months[f.n()] },
  504. m: function () { return pad(f.n(), 2) },
  505. M: function () { return f.F().substr(0, 3) },
  506. n: function () { return jsdate.getMonth() + 1 },
  507. t: function () {
  508. var n;
  509. if ((n = jsdate.getMonth() + 1) === 2) {
  510. return 28 + f.L();
  511. } else {
  512. if (n & 1 && n < 8 || !(n & 1) && n > 7) {
  513. return 31;
  514. } else {
  515. return 30;
  516. }
  517. }
  518. },
  519. // Year
  520. L: function () { var y = f.Y(); return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0 },
  521. //o not supported yet
  522. Y: function () { return jsdate.getFullYear() },
  523. y: function () { return (jsdate.getFullYear() + "").slice(2) },
  524. // Time
  525. a: function () { return jsdate.getHours() > 11 ? "pm" : "am" },
  526. A: function () { return f.a().toUpperCase() },
  527. B: function () {
  528. // peter paul koch:
  529. var off = (jsdate.getTimezoneOffset() + 60) * 60;
  530. var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
  531. var beat = Math.floor(theSeconds / 86.4);
  532. if (beat > 1000) beat -= 1000;
  533. if (beat < 0) beat += 1000;
  534. if ((String(beat)).length === 1) beat = "00" + beat;
  535. if ((String(beat)).length === 2) beat = "0" + beat;
  536. return beat;
  537. },
  538. g: function () { return jsdate.getHours() % 12 || 12 },
  539. G: function () { return jsdate.getHours() },
  540. h: function () { return pad(f.g(), 2) },
  541. H: function () { return pad(jsdate.getHours(), 2) },
  542. i: function () { return pad(jsdate.getMinutes(), 2) },
  543. s: function () { return pad(jsdate.getSeconds(), 2) },
  544. //u not supported yet
  545. // Timezone
  546. //e not supported yet
  547. //I not supported yet
  548. O: function () {
  549. var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4);
  550. if (jsdate.getTimezoneOffset() > 0) t = "-" + t;
  551. else t = "+" + t;
  552. return t;
  553. },
  554. P: function () { var O = f.O(); return (O.substr(0, 3) + ":" + O.substr(3, 2)) },
  555. //T not supported yet
  556. //Z not supported yet
  557. // Full Date/Time
  558. c: function () { return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P() },
  559. //r not supported yet
  560. U: function () { return Math.round(jsdate.getTime() / 1000) }
  561. };
  562. let ret = '';
  563. return format.replace(/[\\]?([a-zA-Z])/g, function (t, s) {
  564. if (t !== s) {
  565. // escaped
  566. ret = s;
  567. } else if (f[s]) {
  568. // a date function exists
  569. ret = f[s]();
  570. } else {
  571. // nothing special
  572. ret = s;
  573. }
  574. return ret;
  575. });
  576. }
  577. // 判断是否为今天
  578. export const isToday = (time) => {
  579. return new Date().getTime() - time < 86400000;
  580. }
  581. /*
  582. * 返回文件大小
  583. * @params 数字
  584. * */
  585. export const getFileSize = (size) => {
  586. let units = new Array(' B', ' KB', ' MB', ' GB', ' TB');
  587. let filesize = size + "B";
  588. for (let i = 0; size >= 1024 && i < 4; i++) {
  589. size /= 1024;
  590. // filesize = `${size.toFixed(2)}<span>${units[i + 1]}</span>`;
  591. if (size % 1 === 0) {
  592. filesize = `${Math.floor(size)}<span>${units[i + 1]}</span>`;
  593. } else if (size.toFixed(2) % 1 === 0) {
  594. filesize = `${size.toFixed(1)}<span>${units[i + 1]}</span>`;
  595. } else {
  596. filesize = `${size.toFixed(2)}<span>${units[i + 1]}</span>`;
  597. }
  598. }
  599. return filesize;
  600. }
  601. export const getDom = (obj, el) => {
  602. let dom = {};
  603. const query = uni.createSelectorQuery().in(obj);
  604. setTimeout(() => {
  605. query.select(el).boundingClientRect();
  606. query.exec(data => {
  607. dom = data[0];
  608. });
  609. }, 10)
  610. return dom;
  611. }
  612. export const findObjectByField = (data, field, val, refield) => {
  613. const result = data.find(obj => obj.field == val); // 使用 Array.prototype.find() 方法查找满足条件的子数组
  614. if (result) {
  615. return refield ? result[refield] : result; // 如果提供了字段参数,返回该字段的值;否则返回整个子数组对象
  616. } else {
  617. return null; // 没有找到满足条件的子数组,返回 null
  618. }
  619. }
  620. /** 搜索数组*/
  621. export const searchObject = (array, field, keywords) => {
  622. if (typeof array !== 'object') {
  623. return false;
  624. } else {
  625. var found = [];
  626. for (var i = 0; array.length > i; i++) {
  627. if (typeof field == 'object') {
  628. for (var j = 0; field.length > j; j++) {
  629. var field_str = field[j];
  630. var str = array[i][field_str];
  631. // 只需要匹配到一个即可
  632. if (str.indexOf(keywords) != -1) {
  633. found.push(array[i]);
  634. break;
  635. }
  636. }
  637. } else {
  638. var str = array[i][field];
  639. if (str.indexOf(keywords) != -1) {
  640. found.push(array[i]);
  641. }
  642. }
  643. }
  644. return found;
  645. }
  646. }
  647. // 合并两个数组并去除重复
  648. export const mergeArrays = (arr1, arr2) => {
  649. // 将两个数组合并为一个新数组
  650. const merged = arr1.concat(arr2);
  651. // 创建一个 Set 来去除重复项
  652. const set = new Set(merged.map(JSON.stringify));
  653. // 将 Set 转换回数组
  654. const unique = Array.from(set).map(JSON.parse);
  655. // 返回去重后的数组
  656. return unique;
  657. }
  658. // 两个二维数组取交集
  659. export const intersection = (arr1, arr2) => {
  660. // 使用 Set 将 arr1 中的每个数组转换为字符串
  661. const set = new Set(arr1.map(JSON.stringify));
  662. // 使用 filter 方法过滤出和 arr1 中的每个元素相同的元素
  663. const result = arr2.filter(item => set.has(JSON.stringify(item)));
  664. return result;
  665. }
  666. export const difference = (arr1, arr2) => {
  667. // 使用 Set 将 arr2 中的每个数组转换为字符串
  668. const set = new Set(arr2.map(JSON.stringify));
  669. // 使用 filter 方法过滤出不在 arr2 中的元素
  670. const result = arr1.filter(item => !set.has(JSON.stringify(item)));
  671. // 将 result 中的每个数组转换回对象
  672. return result;
  673. }
  674. // 获取消息类型
  675. export const getMsgType = (type, callVideo) => {
  676. let msgName = '[暂不支持的消息类型]';
  677. switch (type) {
  678. case 'image':
  679. msgName = '[图片]';
  680. break;
  681. case 'voice':
  682. msgName = '[语音]';
  683. break;
  684. case 'video':
  685. msgName = '[视频]';
  686. break;
  687. case 'file':
  688. msgName = '[文件]';
  689. break;
  690. case 'webrtc':
  691. if (callVideo) {
  692. msgName = '[正在请求与您视频通话]';
  693. } else {
  694. msgName = '[正在请求与您语音通话]';
  695. }
  696. break;
  697. }
  698. return msgName;
  699. }
  700. export const useVibrate = () => {
  701. const vibrate = () => {
  702. // #ifdef APP-PLUS || MP-WEIXIN
  703. uni.vibrateShort()
  704. // #endif
  705. }
  706. return { vibrate }
  707. }
  708. export const getRemainingDays = (data) => {
  709. const targetTimestamp = data * 1000;
  710. // 1. 获取当前时间(毫秒级)
  711. const currentTime = Date.now();
  712. // 2. 计算时间差(目标时间 - 当前时间)
  713. const timeDiff = targetTimestamp - currentTime;
  714. // 3. 处理“目标时间已过期”的情况
  715. if (timeDiff <= 0) {
  716. return 0; // 已过期,剩余天数为 0
  717. }
  718. // 4. 时间差转为天数(1天 = 24小时 × 60分钟 × 60秒 × 1000毫秒)
  719. const oneDayMs = 24 * 60 * 60 * 1000;
  720. // 用 Math.ceil 向上取整(如剩余1.2天,按2天算;若需向下取整用 Math.floor)
  721. const remainingDays = Math.ceil(timeDiff / oneDayMs);
  722. return remainingDays;
  723. }