211 lines
5.2 KiB
JavaScript
211 lines
5.2 KiB
JavaScript
/**
|
||
* 商品克隆工具辅助函数
|
||
*/
|
||
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;
|
||
}
|
||
} |