index.ts 10.1 KB
import customMessage from './message';

//将enum转换为{label:"",value:""}形式
function enumToSelect(data: any) {
  const keys = Object.keys(data);
  return keys.map((value) => {
    return { label: data[value], value: value };
  });
}

//将枚举的value值转换为label
function enumValueToLabel(value: any, enumObj: any) {
  if (enumObj !== undefined) {
    return enumObj[value];
  }
  return '';
}

//从缓存中获取用户信息
function getUserInfo() {
  let userInfoString = localStorage.getItem('userInfo');
  if (userInfoString === null) {
    return {};
  }

  return JSON.parse(userInfoString);
}

//将状态枚举值转换为ProTable的enumValue格式
function enumToProTableEnumValue(enumConstants: any) {
  const result = {};

  for (const key in enumConstants) {
    if (enumConstants.hasOwnProperty(key)) {
      result[key] = {
        text: enumConstants[key],
        status: enumValueToLabel(key, enumConstants),
      };
    }
  }

  return result;
}
function formatDateTime(inputDateTime: string) {
  const parsedDateTime = new Date(inputDateTime);

  const year = parsedDateTime.getFullYear();
  const month = String(parsedDateTime.getMonth() + 1).padStart(2, '0');
  const day = String(parsedDateTime.getDate()).padStart(2, '0');
  const hour = String(parsedDateTime.getHours()).padStart(2, '0');
  const minute = String(parsedDateTime.getMinutes()).padStart(2, '0');
  const second = String(parsedDateTime.getSeconds()).padStart(2, '0');

  const formattedDateTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
  return formattedDateTime;
}

// const resize = () => {
//   // 计算元素底部到视口顶部的距离
//   let bottomDistance = document
//     .getElementById('mainTable')
//     ?.getElementsByClassName('ant-table-thead')[0]
//     .getBoundingClientRect().bottom;
//   // 获取屏幕高度
//   let screenHeight =
//     window.innerHeight || document.documentElement.clientHeight;

//   // 计算元素底部到屏幕底部的距离
//   let bottomToScreenBottomDistance = screenHeight - bottomDistance;

//   // //底部分页元素的高度
//   // var pH = screenHeight - document.getElementById("main-table").getElementsByClassName('ant-table-body')[0].getBoundingClientRect().bottom;

//   setTableHeight(bottomToScreenBottomDistance - 88);
// };

function formatdate(inputDateTime: string) {
  const parsedDateTime = new Date(inputDateTime);

  const year = parsedDateTime.getFullYear();
  const month = String(parsedDateTime.getMonth() + 1).padStart(2, '0');
  const day = String(parsedDateTime.getDate()).padStart(2, '0');

  const formattedDate = `${year}-${month}-${day}`;
  return formattedDate;
}

function formatSalesCode(salesCode: any) {
  let newSalesCode = salesCode;
  if (newSalesCode.indexOf('_')) {
    newSalesCode = newSalesCode.split('_');
    if (newSalesCode?.length === 2) {
      newSalesCode = newSalesCode[1] + '(' + newSalesCode[0] + ')';
    }
  }
  return newSalesCode;
}

// 将二进制流的字符串转换成 Blob 对象
function dataURItoBlob(dataURI: any) {
  const byteString = atob(dataURI.split(',')[1]);
  const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
  const ab = new ArrayBuffer(byteString.length);
  const ia = new Uint8Array(ab);
  for (let i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
  }
  return new Blob([ab], { type: mimeString });
}

// 将 Blob 对象转换成 File 对象
function blobToFile(blob: any, fileName: any) {
  return new File([blob], fileName, { type: blob.type });
}

function appendFormData(formData: any, data: any, parentKey = null) {
  for (const key in data) {
    if (data.hasOwnProperty(key)) {
      const value = data[key];
      const formKey = parentKey ? `${parentKey}[${key}]` : key;

      if (Array.isArray(value)) {
        // 处理数组
        value.forEach((item, index) => {
          const arrayKey = `${formKey}[${index}]`;
          if (typeof item === 'object' && !Array.isArray(item)) {
            // 递归处理对象
            appendFormData(formData, item, arrayKey);
          } else {
            // 直接添加到 FormData
            formData.append(arrayKey, item);
          }
        });
      } else if (typeof value === 'object' && !Array.isArray(value)) {
        // 递归处理对象
        appendFormData(formData, value, formKey);
      } else {
        // 直接添加到 FormData
        formData.append(formKey, value);
      }
    }
  }
}
function getName(str: string) {
  let parts = str.split('-');
  if (parts.length < 2) {
    return null; // 字符串不包含'-'
  }
  let namePart = parts.slice(2).join('-') || parts[1];
  let name = namePart.replace(/^\d+/, ''); // 移除名字前的数字
  return name;
}
function getAliYunOSSFileNameFromUrl(url: string) {
  try {
    // 使用URL对象解析链接
    let urlObject = new URL(url);

    // 从路径中获取最后一个斜杠后的部分,即文件名
    let pathParts = urlObject.pathname.split('/');
    let fileName = pathParts[pathParts.length - 1];

    // 检查文件名是否包含至少一个点(.)以确保是一个合法的文件名
    if (fileName.includes('.')) {
      let originName = getName(fileName);
      if (
        originName === '' ||
        originName === undefined ||
        originName === null
      ) {
        return url;
      }
      return decodeURIComponent(originName);
    } else {
      throw new Error('Invalid file name in the URL');
    }
  } catch (error: any) {
    // 如果解析失败或文件名不符合预期,返回原始链接
    console.error('Error extracting file name:', error.message);
    return url;
  }
}

function transImageFile(base64Image: any) {
  // 将Base64字符串解码为二进制数据
  const binaryData = atob(base64Image.split(',')[1]);

  // 创建一个Uint8Array来存储二进制数据
  const arrayBuffer = new ArrayBuffer(binaryData.length);
  const uint8Array = new Uint8Array(arrayBuffer);
  for (let i = 0; i < binaryData.length; i++) {
    uint8Array[i] = binaryData.charCodeAt(i);
  }

  // 创建Blob对象
  return new Blob([uint8Array], { type: 'image/png' });
}

/**
 * 复制文本到剪贴板
 * @param text
 */
function copyToClipboard(text: string) {
  // 创建一个临时的textarea元素
  const textarea = document.createElement('textarea');
  textarea.value = text;

  // 将textarea元素添加到DOM中
  document.body.appendChild(textarea);

  // 选中textarea中的文本
  textarea.select();

  try {
    // 尝试执行复制命令
    document.execCommand('copy');
    return true;
  } catch (err) {
    return false;
  } finally {
    // 移除临时的textarea元素
    document.body.removeChild(textarea);
  }
}

/**
 * 按照前两个-,分割为数组
 * @param str 字符串处理
 * @returns
 */
function splitByFirstTwoDashes(str: string) {
  let index1 = str.indexOf('-');
  if (index1 === -1) {
    return [str];
  }
  let index2 = str.indexOf('-', index1 + 1);
  if (index2 === -1) {
    return [str.slice(0, index1), str.slice(index1 + 1)];
  }
  return [
    str.slice(0, index1),
    str.slice(index1 + 1, index2),
    str.slice(index2 + 1),
  ];
}

//浮点数加法运算
function FloatAdd(arg1: any, arg2: any) {
  let r1, r2, m;
  try {
    r1 = arg1.toString().split('.')[1].length;
  } catch (e) {
    r1 = 0;
  }
  try {
    r2 = arg2.toString().split('.')[1].length;
  } catch (e) {
    r2 = 0;
  }
  m = Math.pow(10, Math.max(r1, r2));
  return (arg1 * m + arg2 * m) / m;
}

//浮点数减法运算
function FloatSub(arg1: any, arg2: any) {
  let r1, r2, m, n;
  try {
    r1 = arg1.toString().split('.')[1].length;
  } catch (e) {
    r1 = 0;
  }
  try {
    r2 = arg2.toString().split('.')[1].length;
  } catch (e) {
    r2 = 0;
  }
  m = Math.pow(10, Math.max(r1, r2));
  //动态控制精度长度
  n = (r1 = r2) ? r1 : r2;
  return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

//浮点数乘法运算
function FloatMul(arg1: any, arg2: any) {
  let m = 0,
    s1 = arg1.toString(),
    s2 = arg2.toString();
  try {
    m += s1.split('.')[1].length;
  } catch (e) {}
  try {
    m += s2.split('.')[1].length;
  } catch (e) {}
  return (
    (Number(s1.replace('.', '')) * Number(s2.replace('.', ''))) /
    Math.pow(10, m)
  );
}

//浮点数除法运算
function FloatDiv(arg1: any, arg2: any) {
  let t1 = 0,
    t2 = 0,
    r1,
    r2;
  try {
    t1 = arg1.toString().split('.')[1].length;
  } catch (e) {}
  try {
    t2 = arg2.toString().split('.')[1].length;
  } catch (e) {}
  if (Math) {
    r1 = Number(arg1.toString().replace('.', ''));
    r2 = Number(arg2.toString().replace('.', ''));
    return (r1 / r2) * Math.pow(10, t2 - t1);
  }
}

async function blobToJson(blob: any) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();

    // 设置读取完成的事件处理程序
    reader.onload = function (event) {
      try {
        const jsonString = event?.target?.result;
        const jsonObject = JSON.parse(jsonString);
        resolve(jsonObject);
      } catch (error) {
        reject(error);
      }
    };

    // 设置读取出错的事件处理程序
    reader.onerror = function (error) {
      reject(error);
    };

    // 开始读取Blob对象
    reader.readAsText(blob, 'UTF-8');
  });
}

/**
 * 判断文件名是否为图片
 * @param name
 */
function isImageName(name: any) {
  if (name === undefined || name === null) {
    return false;
  }
  // 获取文件后缀
  let suffix = '';
  try {
    const fileArr = name.split('.');
    suffix = fileArr[fileArr.length - 1];
  } catch (err) {
    suffix = '';
  }

  // 如果文件名无后缀,返回 false
  if (!suffix) {
    return false;
  }

  // 图片格式
  const imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'webp'];

  // 进行图片匹配
  const isImage = imglist.some((item) => item === suffix);
  if (isImage) {
    return true;
  }
}

export {
  FloatAdd,
  FloatDiv,
  FloatMul,
  FloatSub,
  appendFormData,
  blobToFile,
  blobToJson,
  copyToClipboard,
  customMessage,
  dataURItoBlob,
  enumToProTableEnumValue,
  enumToSelect,
  enumValueToLabel,
  formatDateTime,
  formatSalesCode,
  formatdate,
  getAliYunOSSFileNameFromUrl,
  getUserInfo,
  isImageName,
  splitByFirstTwoDashes,
  transImageFile,
};