/** * 商品克隆工具辅助函数 */ import CryptoJS from 'crypto-js'; /** * 生成设备ID * 基于设备信息生成唯一标识符 */ export function generateDeviceId() { try { // 获取系统信息 const systemInfo = uni.getSystemInfoSync(); // 组合设备信息 const deviceInfo = [ systemInfo.deviceId || '', systemInfo.deviceBrand || '', systemInfo.deviceModel || '', systemInfo.system || '', systemInfo.platform || '', systemInfo.SDKVersion || '' ].filter(item => item).join('|'); // 使用MD5生成设备ID if (deviceInfo) { return CryptoJS.MD5(deviceInfo).toString().toUpperCase(); } else { return 'UNKNOWN_DEVICE_' + Math.random().toString(36).substring(2, 10); } } catch (e) { console.error('生成设备ID失败:', e); return 'ERROR_DEVICE_' + Math.random().toString(36).substring(2, 10); } } /** * 验证日期格式 (YYYYMMDD) * @param {string} dateStr - 日期字符串 * @returns {boolean} - 是否有效 */ export function validateDate(dateStr) { if (!dateStr || dateStr.length !== 8) { return false; } try { const year = parseInt(dateStr.substring(0, 4)); const month = parseInt(dateStr.substring(4, 6)); const day = parseInt(dateStr.substring(6, 8)); if (year < 1900 || year > 2100 || month < 1 || month > 12 || day < 1 || day > 31) { return false; } // 检查特定月份的天数 if (month === 2) { // 闰年检查 const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); if (day > (isLeapYear ? 29 : 28)) { return false; } } else if ([4, 6, 9, 11].includes(month) && day > 30) { return false; } return true; } catch (e) { return false; } } /** * 日期字符串转时间戳 * @param {string} dateStr - 日期字符串 (YYYYMMDD) * @param {boolean} endOfDay - 是否为当天结束时间 * @returns {number} - 时间戳(秒) */ export function dateToTimestamp(dateStr, endOfDay = false) { if (!dateStr || dateStr.length !== 8) { throw new Error('日期格式错误,必须是8位数字(YYYYMMDD)'); } const year = parseInt(dateStr.substring(0, 4)); const month = parseInt(dateStr.substring(4, 6)) - 1; // 月份从0开始 const day = parseInt(dateStr.substring(6, 8)); let date; if (endOfDay) { date = new Date(year, month, day, 23, 59, 59); } else { date = new Date(year, month, day, 0, 0, 0); } return Math.floor(date.getTime() / 1000); } /** * 调整价格 * @param {number|string} originalPrice - 原始价格 * @param {number} configType - 调整类型 (1:折扣, 2:加减值, 3:指定金额) * @param {number} value - 调整值 * @returns {string} - 调整后的价格字符串(保留2位小数) */ export function adjustPrice(originalPrice, configType, value) { try { let price = parseFloat(originalPrice); if (isNaN(price)) { return originalPrice.toString(); } switch (configType) { case 1: // 折扣 price *= (value / 100); break; case 2: // 加减值 price += value; break; case 3: // 指定金额 price = value; break; } // 确保价格为正数 price = Math.max(0.01, price); return price.toFixed(2); } catch (e) { console.error('价格调整失败:', e); return originalPrice.toString(); } } /** * 格式化日志消息 * @param {string} message - 日志消息 * @returns {string} - 格式化后的日志消息 */ export function formatLogMessage(message) { const timestamp = new Date().toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); return `[${timestamp}] ${message}`; } /** * 保存数据到本地存储 * @param {string} key - 存储键名 * @param {any} data - 要存储的数据 * @returns {boolean} - 是否成功 */ export function saveToStorage(key, data) { try { uni.setStorageSync(key, JSON.stringify(data)); return true; } catch (e) { console.error(`保存数据失败 (${key}):`, e); return false; } } /** * 从本地存储加载数据 * @param {string} key - 存储键名 * @param {any} defaultValue - 默认值 * @returns {any} - 加载的数据或默认值 */ export function loadFromStorage(key, defaultValue = null) { try { const value = uni.getStorageSync(key); if (value) { return JSON.parse(value); } return defaultValue; } catch (e) { console.error(`加载数据失败 (${key}):`, e); return defaultValue; } } /** * 获取新商品ID列表 * @returns {Array} - 新商品ID列表 */ export function getNewItemIds() { try { const newIds = uni.getStorageSync('kongfz_new_ids') || []; return Array.isArray(newIds) ? newIds : []; } catch (e) { console.error('获取新商品ID列表失败:', e); return []; } } /** * 清空新商品ID列表 * @returns {boolean} - 是否成功 */ export function clearNewItemIds() { try { uni.removeStorageSync('kongfz_new_ids'); return true; } catch (e) { console.error('清空新商品ID列表失败:', e); return false; } }