| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | import dayTs from './Date'; | 
					
						
							| 
									
										
										
										
											2025-06-19 14:10:26 +08:00
										 |  |  |  | import fs from '@ohos.file.fs'; | 
					
						
							|  |  |  |  | import { BusinessError } from '@ohos.base'; | 
					
						
							|  |  |  |  | import { CommonFileTag } from '../config'; | 
					
						
							| 
									
										
										
										
											2025-06-25 10:03:45 +08:00
										 |  |  |  | import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'; | 
					
						
							|  |  |  |  | import Prompt from '@system.prompt'; | 
					
						
							| 
									
										
										
										
											2025-06-25 10:35:33 +08:00
										 |  |  |  | import { dConsole } from './LogWorker'; | 
					
						
							|  |  |  |  | import common from '@ohos.app.ability.common'; | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | enum timeType { | 
					
						
							|  |  |  |  |   fulltime = 1 | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 获取当前时间 | 
					
						
							|  |  |  |  |  * @param type | 
					
						
							|  |  |  |  |  * @returns | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function GetCurrentTime(type?: timeType): string { | 
					
						
							|  |  |  |  |   if (type === 1) { | 
					
						
							|  |  |  |  |     return dayTs().format("YYYYMMDDHHmmss") | 
					
						
							|  |  |  |  |   } else { | 
					
						
							|  |  |  |  |     return dayTs().format("YYYY-MM-DD HH:mm:ss") | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 是否是指定天数之前 | 
					
						
							|  |  |  |  |  * @param date | 
					
						
							|  |  |  |  |  * @param days | 
					
						
							|  |  |  |  |  * @returns | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function IsDaysAgo(date: string | number | Date, days: number = 2): boolean { | 
					
						
							|  |  |  |  |   const today = dayTs(); // 当前日期 | 
					
						
							|  |  |  |  |   const target = dayTs(date).format("YYYY-MM-DD HH:mm:ss.SSS"); // 需要判断的日期 | 
					
						
							|  |  |  |  |   // 计算两个日期之间的差异天数 | 
					
						
							|  |  |  |  |   const diffDays = today.diff(target, 'day'); | 
					
						
							|  |  |  |  |   // 如果差异天数大于等于指定天数,则返回 true | 
					
						
							|  |  |  |  |   return diffDays >= days; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 字符串转字节数组 | 
					
						
							|  |  |  |  |  * @param str | 
					
						
							|  |  |  |  |  * @returns | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function StringToBytes(str: string): Uint8Array { | 
					
						
							|  |  |  |  |   const bytes = new Uint8Array(str.length); | 
					
						
							|  |  |  |  |   for (let i = 0; i < str.length; i++) { | 
					
						
							|  |  |  |  |     bytes[i] = str.charCodeAt(i); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   return bytes; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 字符串转ASCII码 | 
					
						
							| 
									
										
										
										
											2025-06-24 10:58:43 +08:00
										 |  |  |  |  * @param str 需要转换的字符串 | 
					
						
							|  |  |  |  |  * @returns 返回ASCII码数组 | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  |  */ | 
					
						
							|  |  |  |  | export function StringToASCII(str: string): number[] { | 
					
						
							|  |  |  |  |   const arr: number[] = []; | 
					
						
							|  |  |  |  |   for (let i = 0; i < str.length; i++) { | 
					
						
							|  |  |  |  |     arr.push(str.charCodeAt(i)); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   return arr; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 数组转字节 | 
					
						
							| 
									
										
										
										
											2025-06-24 10:58:43 +08:00
										 |  |  |  |  * @param array 需要转换的数组 | 
					
						
							|  |  |  |  |  * @returns 返回字节数组 | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  |  */ | 
					
						
							|  |  |  |  | export function ArrayToByteArray(array: number[]): Uint8Array { | 
					
						
							|  |  |  |  |   const buf = new ArrayBuffer(array.length); | 
					
						
							|  |  |  |  |   const view = new Uint8Array(buf); | 
					
						
							|  |  |  |  |   for (let i = 0; i < array.length; i++) { | 
					
						
							|  |  |  |  |     view[i] = array[i] & 0xFF; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   return view; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							| 
									
										
										
										
											2025-06-18 14:42:01 +08:00
										 |  |  |  |  * 数字转字节数组 | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  |  * @param number 要转换的数字 | 
					
						
							|  |  |  |  |  * @param len 字节数 | 
					
						
							|  |  |  |  |  * @returns 返回字节数组 | 
					
						
							|  |  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-06-17 09:06:18 +08:00
										 |  |  |  | export function NumberToByteArray(number: number | string, len: number): number[] { | 
					
						
							|  |  |  |  |   let str = Math.floor(Number(number)).toString(2); | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  |   if (str.length > len) { | 
					
						
							|  |  |  |  |     console.log('数据长度不对~~'); | 
					
						
							|  |  |  |  |     return []; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   const byteString = FillZero(str, len); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   const arrBytes: number[] = []; | 
					
						
							|  |  |  |  |   for (let i = byteString.length; i > 0; ) { | 
					
						
							|  |  |  |  |     let j = i - 8; | 
					
						
							|  |  |  |  |     if (j < 0) { | 
					
						
							|  |  |  |  |       j = 0; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     const s = byteString.slice(j, i); | 
					
						
							|  |  |  |  |     const v = parseInt(s, 2); | 
					
						
							|  |  |  |  |     arrBytes.push(v); | 
					
						
							|  |  |  |  |     i -= 8; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   return arrBytes; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-18 15:24:10 +08:00
										 |  |  |  | /* | 
					
						
							|  |  |  |  |   * 将字符串填充为指定长度的字符串,前面补0 | 
					
						
							|  |  |  |  |   * @param str 要填充的字符串或数字 | 
					
						
							|  |  |  |  |   * @param len 目标长度 | 
					
						
							|  |  |  |  |   * @return 返回填充后的字符串 | 
					
						
							|  |  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | export function FillZero(str: string | number, len: number): string { | 
					
						
							|  |  |  |  |   str = str.toString(); | 
					
						
							|  |  |  |  |   if (str.length >= len || len <= 0) { | 
					
						
							|  |  |  |  |     return str; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   const zeroStr = '0'.repeat(len - str.length); | 
					
						
							|  |  |  |  |   return zeroStr + str; | 
					
						
							| 
									
										
										
										
											2025-06-18 15:24:10 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 将数组按指定大小分块 | 
					
						
							|  |  |  |  |  * @param arr 原始数组 | 
					
						
							|  |  |  |  |  * @param size 每块大小(必须 >= 1) | 
					
						
							|  |  |  |  |  * @returns 分块后的二维数组 | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function CutArray<T>(arr: readonly T[], size: number): T[][] { | 
					
						
							| 
									
										
										
										
											2025-06-24 10:58:43 +08:00
										 |  |  |  |   if (!Array.isArray(arr) || size < 1) { | 
					
						
							|  |  |  |  |     return []; | 
					
						
							|  |  |  |  |   } | 
					
						
							| 
									
										
										
										
											2025-06-18 15:24:10 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   const result: T[][] = []; | 
					
						
							|  |  |  |  |   for (let i = 0; i < arr.length; i += size) { | 
					
						
							|  |  |  |  |     result.push(arr.slice(i, i + size)); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   return result; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 将GPS坐标从度分格式(DDMM.MMMM)转换为十进制度格式 | 
					
						
							|  |  |  |  |  * @param ddmm - 度分格式坐标(例如 11630.1234 表示116度30.1234分) | 
					
						
							|  |  |  |  |  * @returns 十进制度格式坐标(例如 116.502056666...) | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function ConvertDdmmToDecimalDegrees(ddmm: number): number { | 
					
						
							|  |  |  |  |   // 提取度数部分:除以100后取整 | 
					
						
							|  |  |  |  |   const degrees = Math.floor(ddmm / 100); | 
					
						
							|  |  |  |  |   // 提取分数部分(包含小数):对100取模 | 
					
						
							|  |  |  |  |   const minutes = ddmm % 100; | 
					
						
							|  |  |  |  |   // 将分数转换为度并相加:1度=60分 | 
					
						
							|  |  |  |  |   return degrees + minutes / 60; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-25 10:03:45 +08:00
										 |  |  |  | /** | 
					
						
							|  |  |  |  |  * 深度克隆对象 | 
					
						
							|  |  |  |  |  * @param target | 
					
						
							|  |  |  |  |  * @returns | 
					
						
							|  |  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-06-18 15:24:10 +08:00
										 |  |  |  | export function DeepClone<T extends Object>(target: T): T { | 
					
						
							|  |  |  |  |   // 如果是对象,且不是原始值null | 
					
						
							|  |  |  |  |   if (typeof target === 'object' && target !== null) { | 
					
						
							|  |  |  |  |     // 创建容器 | 
					
						
							|  |  |  |  |     const result: ESObject = Array.isArray(target) ? [] : {}; | 
					
						
							|  |  |  |  |     const keys = Object.keys(target) as Array<keyof T>; //注解二 | 
					
						
							|  |  |  |  |     keys.forEach(key => { | 
					
						
							|  |  |  |  |       Reflect.set(result, key, DeepClone(Reflect.get(target, key))); | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  |     return result; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   // 如果是原始值,则直接返回 | 
					
						
							|  |  |  |  |   return target; | 
					
						
							| 
									
										
										
										
											2025-06-19 14:10:26 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /* | 
					
						
							|  |  |  |  |   * 检查文件或目录是否存在 | 
					
						
							|  |  |  |  |   * @param path 文件或目录的路径 | 
					
						
							|  |  |  |  |   * @return 返回一个 Promise,解析为 true 如果存在,否则为 false | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function IsExit(path: string): Promise<boolean> { | 
					
						
							|  |  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |  |     try { | 
					
						
							|  |  |  |  |       let res = fs.accessSync(path); | 
					
						
							|  |  |  |  |       if (res) { | 
					
						
							|  |  |  |  |         console.info(CommonFileTag, "file exists"); | 
					
						
							|  |  |  |  |         resolve(true); | 
					
						
							|  |  |  |  |       } else { | 
					
						
							|  |  |  |  |         console.info(CommonFileTag, "file not exists"); | 
					
						
							|  |  |  |  |         resolve(false); | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } catch (error) { | 
					
						
							|  |  |  |  |       let err: BusinessError = error as BusinessError; | 
					
						
							| 
									
										
										
										
											2025-06-24 10:58:43 +08:00
										 |  |  |  |       console.error(CommonFileTag, | 
					
						
							|  |  |  |  |         "accessSync failed with error message: " + err.message + ", error code: " + err.code); | 
					
						
							| 
									
										
										
										
											2025-06-19 14:10:26 +08:00
										 |  |  |  |       reject(false); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 创建文件夹 | 
					
						
							|  |  |  |  |  * @param path 文件夹路径 | 
					
						
							|  |  |  |  |  * @return 返回一个 Promise,解析为 true 如果创建成功,否则为 false | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function CreateDir(path: string): Promise<boolean> { | 
					
						
							|  |  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |  |     try { | 
					
						
							|  |  |  |  |       fs.mkdirSync(path); | 
					
						
							|  |  |  |  |       console.info(CommonFileTag, "Directory created successfully"); | 
					
						
							|  |  |  |  |       resolve(true); | 
					
						
							|  |  |  |  |     } catch (error) { | 
					
						
							|  |  |  |  |       let err: BusinessError = error as BusinessError; | 
					
						
							|  |  |  |  |       console.error(CommonFileTag, "mkdirSync failed with error message: " + err.message + ", error code: " + err.code); | 
					
						
							|  |  |  |  |       reject(false); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2025-06-19 16:53:49 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /* | 
					
						
							|  |  |  |  |   * 将秒数转换为灵活的时间格式(HH:MM:SS) | 
					
						
							|  |  |  |  |   * @param seconds 要转换的秒数 | 
					
						
							|  |  |  |  |   * @return 返回格式化后的时间字符串 | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function FormatTimeFlexible(seconds: number): string { | 
					
						
							| 
									
										
										
										
											2025-06-24 10:58:43 +08:00
										 |  |  |  |   if (seconds < 0) { | 
					
						
							|  |  |  |  |     throw new Error("秒数不能为负数"); | 
					
						
							|  |  |  |  |   } | 
					
						
							| 
									
										
										
										
											2025-06-19 16:53:49 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   const hours = Math.floor(seconds / 3600); | 
					
						
							|  |  |  |  |   const minutes = Math.floor((seconds % 3600) / 60); | 
					
						
							|  |  |  |  |   const secs = seconds % 60; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   // 强制使用两位数格式化,确保始终是 HH:MM:SS | 
					
						
							|  |  |  |  |   const formattedHours = hours.toString().padStart(2, '0'); | 
					
						
							|  |  |  |  |   const formattedMinutes = minutes.toString().padStart(2, '0'); | 
					
						
							|  |  |  |  |   const formattedSeconds = secs.toString().padStart(2, '0'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`; | 
					
						
							| 
									
										
										
										
											2025-06-25 10:03:45 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /** | 
					
						
							|  |  |  |  |  * 申请授权 | 
					
						
							|  |  |  |  |  * @param context 上下文 | 
					
						
							|  |  |  |  |  * @param permissionList 需要申请的权限列表 | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export function ApplyForAuthorization(context: Context, permissionList: Array<Permissions>) { | 
					
						
							|  |  |  |  |   const atManager = abilityAccessCtrl.createAtManager() | 
					
						
							|  |  |  |  |   atManager.requestPermissionsFromUser(context, permissionList, (code, result) => { | 
					
						
							|  |  |  |  |     if (result.authResults[0] === -1) { | 
					
						
							|  |  |  |  |       Prompt.showToast({ | 
					
						
							|  |  |  |  |         message: '请先授权', | 
					
						
							|  |  |  |  |         duration: 3000, | 
					
						
							|  |  |  |  |       }) | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2025-06-25 10:35:33 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /* | 
					
						
							|  |  |  |  |   * 使用权限 | 
					
						
							|  |  |  |  |   * @param context 上下文 | 
					
						
							|  |  |  |  |   * @return 返回一个 Promise,解析为 true 如果授权成功,否则为 false | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | export async function UseAuth(context: common.UIAbilityContext): Promise<boolean> { | 
					
						
							|  |  |  |  |   dConsole.log("权限授权开始1") | 
					
						
							|  |  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |  |     const permissions: Array<Permissions> = | 
					
						
							|  |  |  |  |       [ | 
					
						
							|  |  |  |  |         "ohos.permission.SET_TIME", | 
					
						
							|  |  |  |  |         "ohos.permission.READ_IMAGEVIDEO", | 
					
						
							|  |  |  |  |         "ohos.permission.DISTRIBUTED_DATASYNC", | 
					
						
							|  |  |  |  |         "ohos.permission.CONNECTIVITY_INTERNAL", | 
					
						
							|  |  |  |  |         "ohos.permission.CAMERA", | 
					
						
							|  |  |  |  |         "ohos.permission.READ_MEDIA", | 
					
						
							|  |  |  |  |         "ohos.permission.WRITE_MEDIA", | 
					
						
							|  |  |  |  |         "ohos.permission.FILE_ACCESS_MANAGER" | 
					
						
							|  |  |  |  |       ]; | 
					
						
							|  |  |  |  |     dConsole.log("权限授权开始2") | 
					
						
							|  |  |  |  |     abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context, permissions).then(res => { | 
					
						
							|  |  |  |  |       let grantStatus: Array<number> = res.authResults; | 
					
						
							|  |  |  |  |       let length: number = grantStatus.length; | 
					
						
							|  |  |  |  |       dConsole.log("权限", length) | 
					
						
							|  |  |  |  |       dConsole.log("权限状态", JSON.stringify(grantStatus)) | 
					
						
							|  |  |  |  |       resolve(true) | 
					
						
							|  |  |  |  |       for (let i = 0; i < length; i++) { | 
					
						
							|  |  |  |  |         if (grantStatus[i] !== 0) { | 
					
						
							|  |  |  |  |           reject(false) | 
					
						
							|  |  |  |  |           return; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     }).catch((err: BusinessError) => { | 
					
						
							|  |  |  |  |       dConsole.error("获取权限失败", JSON.stringify(err)) | 
					
						
							|  |  |  |  |       reject(false) | 
					
						
							|  |  |  |  |     }) | 
					
						
							|  |  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | } |