yyb
13 小时以前 769fb543015f1a90d42882a0a9f0592efa45a10e
src/utils/summarizeTable.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
/**
 * é€šç”¨çš„表格合计方法
 * @param {Object} param - åŒ…含表格列配置和数据源的对象
 * @param {Array<string>} summaryProps - éœ€è¦æ±‡æ€»çš„字段名数组
 * @param {Object} specialFormat - ç‰¹æ®Šæ ¼å¼åŒ–规则:字段名 -> æ ¼å¼åŒ–选项(如是否去掉小数)
 * @returns {Array} åˆè®¡è¡Œæ•°æ®
 */
const summarizeTable = (param, summaryProps, specialFormat = {}) => {
  const { columns, data } = param;
  const sums = [];
  columns.forEach((column, index) => {
    if (index === 0) {
      sums[index] = "合计";
      return;
    }
    const prop = column.property;
    if (summaryProps.includes(prop)) {
      const values = data.map((item) => Number(item[prop]));
      // åªå¯¹æœ‰æ•ˆæ•°å­—进行求和
      if (!values.every(isNaN)) {
        const sum = values.reduce(
          (acc, val) => (!isNaN(val) ? acc + val : acc),
          0
        );
        if (specialFormat[prop] && specialFormat[prop].noDecimal) {
          // å¦‚果指定了不需要保留小数,则直接转换为整数
          sums[index] = Math.round(sum).toString();
        } else {
          // é»˜è®¤ä¿ç•™ä¸¤ä½å°æ•°
          sums[index] = parseFloat(sum).toFixed(
            specialFormat[prop]?.decimalPlaces ?? 2
          );
        }
      } else {
        sums[index] = "";
      }
    } else {
      sums[index] = "";
    }
  });
  return sums;
};
// ä¸å«ç¨Žæ€»ä»·è®¡ç®—
const calculateTaxExclusiveTotalPrice = (taxInclusiveTotalPrice, taxRate) => {
  const taxRateDecimal = taxRate / 100;
  return (taxInclusiveTotalPrice / (1 + taxRateDecimal)).toFixed(2);
};
// å«ç¨Žæ€»ä»·è®¡ç®—
const calculateTaxIncludeTotalPrice = (taxInclusiveUnitPrice, quantity) => {
  return (taxInclusiveUnitPrice * quantity).toFixed(2);
};
// å¯¼å‡ºå‡½æ•°ä¾›å…¶ä»–文件使用
export {
  summarizeTable,
  calculateTaxExclusiveTotalPrice,
  calculateTaxIncludeTotalPrice,
};