feat: 添加数字格式化工具,支持去掉小数末尾多余的 0 和四舍五入功能
已添加1个文件
已修改7个文件
270 ■■■■■ 文件已修改
src/utils/formatNumber.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/summarizeTable.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/financialStatements/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/paymentLedger/index.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementLedger/index.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/receiptPaymentLedger/index.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesQuotation/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/formatNumber.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
/**
 * æ•°å­—展示格式化工具
 *
 * è¯´æ˜Žï¼šåŽç«¯é‡‘额/数量字段统一按 6 ä½å°æ•°è¿”回(如 52333.580000),
 * ç›´æŽ¥å±•示会出现大量无意义的结尾 0,这里统一做展示层处理。
 */
/**
 * åŽ»æŽ‰å°æ•°æœ«å°¾å¤šä½™çš„ 0(最多保留 maxDecimals ä½å°æ•°ï¼‰
 * ä¾‹ï¼š52333.580000 -> 52333.58 ï¼›100.000000 -> 100 ï¼›0.000000 -> 0
 *     474235.654230 -> 474235.65423
 * @param {string|number} value åŽŸå§‹å€¼
 * @param {number} maxDecimals æœ€å¤šä¿ç•™çš„小数位,默认 6
 * @returns {string} æ ¼å¼åŒ–后的字符串
 */
export const trimZeros = (value, maxDecimals = 6) => {
  if (value === undefined || value === null || value === "") {
    return "0";
  }
  const num = typeof value === "number" ? value : Number(value);
  // éžæ•°å­—(如 "-"、"--")原样返回,避免把占位符显示成 0
  if (!Number.isFinite(num)) {
    return String(value);
  }
  const decimals = Math.min(20, Math.max(0, Math.floor(maxDecimals)));
  let text = num.toFixed(decimals);
  if (decimals > 0 && text.includes(".")) {
    text = text.replace(/0+$/, "").replace(/\.$/, "");
  }
  // å¤„理 -0.000000 è¿™ç±»ç»“æžœ
  if (text === "" || text === "-" || text === "-0") {
    text = "0";
  }
  return text;
};
/**
 * å››èˆäº”入到指定小数位(按十进制语义)
 * JS åŽŸç”Ÿçš„ toFixed ä¼šå—二进制浮点影响,例如 (926163.765).toFixed(2) å¾—到 "926163.76",
 * è€ŒæŒ‰åè¿›åˆ¶å››èˆäº”入应为 926163.77,这里统一成与数据库 ROUND ä¸€è‡´çš„结果。
 * @param {string|number} value åŽŸå§‹å€¼
 * @param {number} decimals å°æ•°ä½æ•°ï¼Œé»˜è®¤ 2
 * @returns {number} å››èˆäº”入后的数字
 */
export const roundHalfUp = (value, decimals = 2) => {
  const num = Number(value);
  const digits = Math.min(20, Math.max(0, Math.floor(decimals)));
  if (!Number.isFinite(num)) {
    return 0;
  }
  // ç§‘学计数法(如 1e-7)走原生 toFixed,避免字符串拼接出 "1e-7e2"
  const text = String(num);
  if (text.includes("e") || text.includes("E")) {
    return Number(num.toFixed(digits));
  }
  return Number(`${Math.round(Number(`${text}e${digits}`))}e-${digits}`);
};
/**
 * å›ºå®šä¿ç•™æŒ‡å®šå°æ•°ä½ï¼ˆä¸è¶³è¡¥ 0)
 * ä¾‹ï¼š2296268.351 -> 2296268.35 ï¼ˆdecimals = 2)
 * @param {string|number} value åŽŸå§‹å€¼
 * @param {number} decimals å°æ•°ä½æ•°ï¼Œé»˜è®¤ 2
 * @returns {string} æ ¼å¼åŒ–后的字符串
 */
export const toFixedNumber = (value, decimals = 2) => {
  const num = Number(value);
  const digits = Math.min(20, Math.max(0, Math.floor(decimals)));
  if (!Number.isFinite(num)) {
    return (0).toFixed(digits);
  }
  const text = num.toFixed(digits);
  // é¿å…å‡ºçް "-0.00" è¿™ç±»è´Ÿé›¶æ˜¾ç¤º
  return parseFloat(text) === 0 ? text.replace(/^-/, "") : text;
};
src/utils/summarizeTable.js
@@ -1,8 +1,16 @@
import { trimZeros, roundHalfUp } from "./formatNumber.js";
/**
 * é€šç”¨çš„表格合计方法
 * @param {Object} param - åŒ…含表格列配置和数据源的对象
 * @param {Array<string>} summaryProps - éœ€è¦æ±‡æ€»çš„字段名数组
 * @param {Object} specialFormat - ç‰¹æ®Šæ ¼å¼åŒ–规则:字段名 -> æ ¼å¼åŒ–选项(如是否去掉小数)
 *   æ”¯æŒ { noDecimal: true }  å–整显示
 *        { trimZeros: true, decimalPlaces: 6 }  æœ€å¤šä¿ç•™ 6 ä½å°æ•°å¹¶åŽ»æŽ‰æœ«å°¾å¤šä½™çš„ 0
 *        { roundEach: 2 }  æ¯è¡Œå…ˆæŒ‰ 2 ä½å°æ•°å››èˆäº”入再求和,
 *                          ç”¨äºŽé‡‘额列:保证合计与列内展示值相加完全一致
 *        { formatter: fn }  è‡ªå®šä¹‰æ ¼å¼åŒ–函数,优先级最高
 *        { decimalPlaces: 2 }  å›ºå®šä¿ç•™ 2 ä½å°æ•°ï¼ˆé»˜è®¤ï¼‰
 * @returns {Array} åˆè®¡è¡Œæ•°æ®
 */
const summarizeTable = (param, summaryProps, specialFormat = {}) => {
@@ -15,7 +23,15 @@
    }
    const prop = column.property;
    if (summaryProps.includes(prop)) {
      const values = data.map((item) => Number(item[prop]));
      const rule = specialFormat[prop];
      const values = data.map((item) => {
        const val = Number(item[prop]);
        // NaN ä¿æŒ NaN,便于下面判断「整列都不是数字」
        if (Number.isNaN(val)) return NaN;
        return rule && rule.roundEach != null
          ? roundHalfUp(val, rule.roundEach)
          : val;
      });
      // åªå¯¹æœ‰æ•ˆæ•°å­—进行求和
      if (!values.every(isNaN)) {
        const sum = values.reduce(
@@ -25,6 +41,15 @@
        if (specialFormat[prop] && specialFormat[prop].noDecimal) {
          // å¦‚果指定了不需要保留小数,则直接转换为整数
          sums[index] = Math.round(sum).toString();
        } else if (
          specialFormat[prop] &&
          typeof specialFormat[prop].formatter === "function"
        ) {
          // è‡ªå®šä¹‰æ ¼å¼åŒ–函数优先
          sums[index] = specialFormat[prop].formatter(sum);
        } else if (specialFormat[prop] && specialFormat[prop].trimZeros) {
          // æŒ‡å®šäº†åŽ»æŽ‰æœ«å°¾å¤šä½™çš„ 0(最多保留 decimalPlaces ä½ï¼Œé»˜è®¤ 6 ä½ï¼‰
          sums[index] = trimZeros(sum, specialFormat[prop].decimalPlaces ?? 6);
        } else {
          // é»˜è®¤ä¿ç•™ä¸¤ä½å°æ•°
          sums[index] = parseFloat(sum).toFixed(
src/views/financialManagement/financialStatements/index.vue
@@ -199,6 +199,7 @@
  import { QuestionFilled, TrendCharts, Sell } from "@element-plus/icons-vue";
  import Echarts from "@/components/Echarts/echarts.vue";
  import { accountStatementDetailsByMonth } from "@/api/financialManagement/financialStatements";
  import { toFixedNumber } from "@/utils/formatNumber.js";
  import dayjs from "dayjs";
  const { proxy } = getCurrentInstance();
@@ -263,7 +264,11 @@
    },
  ]);
  const barYAxis = [{ type: "value", name: "金额 (元)" }];
  const barTooltip = { trigger: "axis", axisPointer: { type: "shadow" } };
  const barTooltip = {
    trigger: "axis",
    axisPointer: { type: "shadow" },
    valueFormatter: value => formatMoney(value),
  };
  const barSeries = computed(() => [
    {
      name: "应收账款",
@@ -292,7 +297,10 @@
    },
  ]);
  const trendYAxis = [{ type: "value", name: "金额 (元)" }];
  const trendTooltip = { trigger: "axis" };
  const trendTooltip = {
    trigger: "axis",
    valueFormatter: value => formatMoney(value),
  };
  const trendSeries = computed(() => [
    {
      name: "总营收",
@@ -320,8 +328,9 @@
  ]);
  // --- å…¬ç”¨é€»è¾‘ ---
  // é‡‘额统一按 2 ä½å°æ•°å±•示(不受接口返回精度影响)
  const formatMoney = val => {
    return val;
    return toFixedNumber(val, 2);
  };
  const handleDateChange = val => {
src/views/procurementManagement/paymentLedger/index.vue
@@ -49,9 +49,9 @@
            <el-table-column label="应付金额(元)"
                             prop="payableAmount"
                             show-overflow-tooltip>
              <template #default="{ row, column }">
              <template #default="{ row }">
                <el-text type="danger">
                  {{ formattedNumber(row, column, row.payableAmount) }}
                  {{ formatPayable(row.payableAmount) }}
                </el-text>
              </template>
            </el-table-column>
@@ -79,7 +79,7 @@
                    @pagination="sonPaginationSearch">
            <template #payableAmountSlot="{ row }">
              <el-text type="danger">
                {{ parseFloat(row.payableAmount).toFixed(6) }}
                {{ formatPayable(row.payableAmount) }}
              </el-text>
            </template>
            <template #paymentActionSlot="{ row }">
@@ -100,7 +100,7 @@
        </el-form-item>
        <el-form-item label="付款金额:" prop="paymentAmount">
          <el-input-number style="width:100%" v-model="paymentForm.paymentAmount" :min="0" :precision="6" :max="Math.max(0,Number(currentPaymentRow.payableAmount)||0)" placeholder="请输入付款金额" controls-position="right" />
          <div style="color:#e6a23c;font-size:12px;margin-top:4px">当前可付款余额:{{ Math.max(0,Number(currentPaymentRow.payableAmount)||0).toFixed(6) }} å…ƒ</div>
          <div style="color:#e6a23c;font-size:12px;margin-top:4px">当前可付款余额:{{ formatPayable(Math.max(0,Number(currentPaymentRow.payableAmount)||0)) }} å…ƒ</div>
        </el-form-item>
        <el-form-item label="付款方式:" prop="paymentMethod">
          <el-select v-model="paymentForm.paymentMethod" placeholder="请选择付款方式" style="width:100%" clearable>
@@ -125,6 +125,7 @@
    savePayment,
  } from "@/api/procurementManagement/paymentLedger.js";
  import Pagination from "../../../components/PIMTable/Pagination.vue";
  import { trimZeros, roundHalfUp } from "@/utils/formatNumber.js";
  const tableData = ref([]);
  const tableLoading = ref(false);
@@ -169,7 +170,7 @@
      prop: "contractAmount",
      width: 200,
      formatData: params => {
        return params ? parseFloat(params).toFixed(6) : 0;
        return trimZeros(params, 6);
      },
    },
    {
@@ -177,7 +178,7 @@
      prop: "paymentAmount",
      width: 200,
      formatData: params => {
        return params ? parseFloat(params).toFixed(6) : 0;
        return trimZeros(params, 6);
      },
    },
    {
@@ -206,7 +207,7 @@
  const currentPaymentRow = ref({});
  const paymentFormRef = ref(null);
  const paymentForm = reactive({ paymentDate:"", paymentAmount:undefined, paymentMethod:"", remark:"" });
  const validatePaymentAmount = (_,v,cb) => { if(!v) return cb(new Error("请输入付款金额")); const m=Math.max(0,Number(currentPaymentRow.value.payableAmount)||0); if(v>m) return cb(new Error(`付款金额不能超过可付款余额 ${m.toFixed(6)} å…ƒ`)); cb(); };
  const validatePaymentAmount = (_,v,cb) => { if(!v) return cb(new Error("请输入付款金额")); const m=Math.max(0,Number(currentPaymentRow.value.payableAmount)||0); if(v>m) return cb(new Error(`付款金额不能超过可付款余额 ${trimZeros(m, 6)} å…ƒ`)); cb(); };
  const paymentRules = { paymentDate:[{required:true,message:"请选择付款日期",trigger:"change"}], paymentAmount:[{required:true,validator:validatePaymentAmount,trigger:"blur"}], paymentMethod:[{required:true,message:"请选择付款方式",trigger:"change"}] };
  const openPaymentDialog = r => { currentPaymentRow.value=r; paymentForm.paymentDate=""; paymentForm.paymentAmount=undefined; paymentForm.paymentMethod=""; paymentForm.remark=""; paymentDialogVisible.value=true; };
  const closePaymentDialog = () => { paymentFormRef.value?.resetFields(); paymentDialogVisible.value=false; };
@@ -218,9 +219,10 @@
      param,
      ["contractAmounts", "paymentAmount", "payableAmount"],
      {
        contractAmounts: { decimalPlaces: 6 },
        paymentAmount: { decimalPlaces: 6 },
        payableAmount: { decimalPlaces: 6 },
        contractAmounts: { decimalPlaces: 6, trimZeros: true },
        paymentAmount: { decimalPlaces: 6, trimZeros: true },
        // åº”付金额逐行按分取整后再求和,保证合计 = åˆ—内展示值之和
        payableAmount: { roundEach: 2, formatter: formatPayable },
        ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
        futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      }
@@ -228,26 +230,19 @@
  };
  // å­è¡¨åˆè®¡æ–¹æ³•
  const summarizeMainTable1 = param => {
    let summarizeTable = proxy.summarizeTable(
    return proxy.summarizeTable(
      param,
      ["contractAmount", "invoiceAmount", "paymentAmount"],
      ["contractAmount", "invoiceAmount", "paymentAmount", "payableAmount"],
      {
        contractAmount: { decimalPlaces: 6 },
        invoiceAmount: { decimalPlaces: 6 },
        paymentAmount: { decimalPlaces: 6 },
        contractAmount: { decimalPlaces: 6, trimZeros: true },
        invoiceAmount: { decimalPlaces: 6, trimZeros: true },
        paymentAmount: { decimalPlaces: 6, trimZeros: true },
        // åº”付金额逐行按分取整后再求和,保证合计 = åˆ—内展示值之和
        payableAmount: { roundEach: 2, formatter: formatPayable },
        ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
        futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      }
    );
    if (originalTableDataSon.value.length > 0) {
      summarizeTable[summarizeTable.length - 1] =
        originalTableDataSon.value[
          originalTableDataSon.value.length - 1
        ].payableAmount.toFixed(6);
    } else {
      summarizeTable[summarizeTable.length - 1] = 0.0;
    }
    return summarizeTable;
  };
  /** æœç´¢æŒ‰é’®æ“ä½œ */
  const handleQuery = () => {
@@ -319,11 +314,17 @@
  };
  const formattedNumber = (row, column, cellValue) => {
    if (column.property !== "supplierName") {
      return parseFloat(cellValue).toFixed(6);
      return trimZeros(cellValue, 6);
    } else {
      return cellValue;
    }
  };
  // åº”付金额是金额字段,最多保留 2 ä½å°æ•°ï¼ˆå››èˆäº”入到分)。
  // åº”付金额 = å–(入库金额, åˆåŒé‡‘额)较小者 âˆ’ å·²ä»˜æ¬¾ âˆ’ é€€è´§é‡‘额,其中入库金额由 6 ä½å°æ•°çš„含税单价累加而来,
  // ä¼šå¸¦å‡ºã€ŒåŽ˜ã€åŠä»¥ä¸‹çš„å°æ•°ï¼Œé¡µé¢ä¸Šç»Ÿä¸€æŒ‰åˆ†å±•ç¤ºã€‚
  const formatPayable = value => {
    return trimZeros(roundHalfUp(value, 2), 2);
  };
  getList();
</script>
src/views/procurementManagement/procurementLedger/index.vue
@@ -761,6 +761,7 @@
  import { modelList, productTreeList } from "@/api/basicData/product.js";
  import dayjs from "dayjs";
  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
  import { trimZeros } from "@/utils/formatNumber.js";
  const userStore = useUserStore();
@@ -1085,7 +1086,7 @@
  };
  const formattedNumber = (row, column, cellValue) => {
    return parseFloat(cellValue).toFixed(6);
    return trimZeros(cellValue, 6);
  };
  // æŸ¥è¯¢åˆ—表
  /** æœç´¢æŒ‰é’®æ“ä½œ */
@@ -1205,11 +1206,11 @@
        "futureTicketsAmount",
      ],
      {
        taxInclusiveUnitPrice: { decimalPlaces: 6 },
        taxInclusiveTotalPrice: { decimalPlaces: 6 },
        taxExclusiveTotalPrice: { decimalPlaces: 6 },
        ticketsAmount: { decimalPlaces: 6 },
        futureTicketsAmount: { decimalPlaces: 6 },
        taxInclusiveUnitPrice: { decimalPlaces: 6, trimZeros: true },
        taxInclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
        taxExclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
        ticketsAmount: { decimalPlaces: 6, trimZeros: true },
        futureTicketsAmount: { decimalPlaces: 6, trimZeros: true },
        ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
        futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      }
@@ -1279,8 +1280,8 @@
      param,
      ["contractAmount", "netContractAmount"],
      {
        contractAmount: { decimalPlaces: 6 },
        netContractAmount: { decimalPlaces: 6 },
        contractAmount: { decimalPlaces: 6, trimZeros: true },
        netContractAmount: { decimalPlaces: 6, trimZeros: true },
      }
    );
  };
@@ -1294,9 +1295,9 @@
        "taxExclusiveTotalPrice",
      ],
      {
        taxInclusiveUnitPrice: { decimalPlaces: 6 },
        taxInclusiveTotalPrice: { decimalPlaces: 6 },
        taxExclusiveTotalPrice: { decimalPlaces: 6 },
        taxInclusiveUnitPrice: { decimalPlaces: 6, trimZeros: true },
        taxInclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
        taxExclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
      }
    );
  };
src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -50,9 +50,9 @@
                             prop="receiptableAmount"
                             show-overflow-tooltip
                             width="200">
              <template #default="{ row, column }">
              <template #default="{ row }">
                <el-text type="danger">
                  {{ formattedNumber(row, column, row.receiptableAmount) }}
                  {{ formatReceivable(row.receiptableAmount) }}
                </el-text>
              </template>
            </el-table-column>
@@ -100,9 +100,9 @@
                             prop="receiptableAmount"
                             show-overflow-tooltip
                             width="200">
              <template #default="{ row, column }">
              <template #default="{ row }">
                <el-text type="danger">
                  {{ formattedNumber(row, column, row.receiptableAmount) }}
                  {{ formatReceivable(row.receiptableAmount) }}
                </el-text>
              </template>
            </el-table-column>
@@ -156,6 +156,7 @@
    saveReceiptPayment,
  } from "@/api/salesManagement/indicatorStats.js";
  import Pagination from "../../../components/PIMTable/Pagination.vue";
  import { trimZeros } from "@/utils/formatNumber.js";
  const { proxy } = getCurrentInstance();
  const tableData = ref([]);
  const receiptRecord = ref([]);
@@ -184,7 +185,7 @@
  const currentRow = ref({});
  const receiptFormRef = ref(null);
  const receiptForm = reactive({ paymentDate:"", paymentAmount:undefined, paymentMethod:"", remark:"" });
  const validatePaymentAmount = (_,v,cb) => { if(!v) return cb(new Error("请输入回款金额")); const m=Math.max(0,(Number(currentRow.value.receiptableAmount)||0)-(Number(currentRow.value.receiptPaymentAmount)||0)); if(v>m) return cb(new Error(`回款金额不能超过可回款余额 ${m.toFixed(6)} å…ƒ`)); cb(); };
  const validatePaymentAmount = (_,v,cb) => { if(!v) return cb(new Error("请输入回款金额")); const m=Math.max(0,(Number(currentRow.value.receiptableAmount)||0)-(Number(currentRow.value.receiptPaymentAmount)||0)); if(v>m) return cb(new Error(`回款金额不能超过可回款余额 ${trimZeros(m, 6)} å…ƒ`)); cb(); };
  const receiptRules = { paymentDate:[{required:true,message:"请选择回款日期",trigger:"change"}], paymentAmount:[{required:true,validator:validatePaymentAmount,trigger:"blur"}], paymentMethod:[{required:true,message:"请选择回款方式",trigger:"change"}] };
  const openReceiptDialog = r => { currentRow.value=r; receiptForm.paymentDate=""; receiptForm.paymentAmount=undefined; receiptForm.paymentMethod=""; receiptForm.remark=""; receiptDialogVisible.value=true; };
  const closeReceiptDialog = () => { receiptFormRef.value?.resetFields(); receiptDialogVisible.value=false; };
@@ -214,7 +215,18 @@
    });
  };
  const formattedNumber = (row, column, cellValue) => {
    return cellValue ? parseFloat(cellValue).toFixed(6) : "0.000000";
    return trimZeros(cellValue, 6);
  };
  // åº”收金额 = å·²å‡ºåº“金额 âˆ’ å·²é€€è´§æ¬¾ âˆ’ å·²å›žæ¬¾é‡‘额。
  // å‡ºåº“金额由 6 ä½å°æ•°çš„含税单价累加而来,会残留「分」以下的零头(如 0.0045、0.004),
  // è€Œå›žæ¬¾æ˜¯æŒ‰åˆ†å½•入的整数金额,相减后就会出现这些无意义的尾差。
  // åº”收金额本身只精确到分,分以下的尾差不计入,统一按 0 å±•示(后端 SQL ä¹Ÿåšäº†åŒæ ·å¤„理)。
  const formatReceivable = value => {
    const num = Number(value);
    if (!Number.isFinite(num) || Math.abs(num) < 0.01) {
      return "0";
    }
    return trimZeros(num, 6);
  };
  // ä¸»è¡¨åˆè®¡æ–¹æ³•
  const summarizeMainTable = param => {
@@ -222,9 +234,9 @@
      param,
      ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
      {
        invoiceTotal: { decimalPlaces: 6 },
        receiptPaymentAmount: { decimalPlaces: 6 },
        unReceiptPaymentAmount: { decimalPlaces: 6 },
        invoiceTotal: { decimalPlaces: 6, trimZeros: true },
        receiptPaymentAmount: { decimalPlaces: 6, trimZeros: true },
        unReceiptPaymentAmount: { decimalPlaces: 6, trimZeros: true },
        ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
        futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      }
@@ -236,9 +248,9 @@
      param,
      ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
      {
        contractAmount: { decimalPlaces: 6 },
        receiptPaymentAmount: { decimalPlaces: 6 },
        receiptableAmount: { decimalPlaces: 6 },
        contractAmount: { decimalPlaces: 6, trimZeros: true },
        receiptPaymentAmount: { decimalPlaces: 6, trimZeros: true },
        receiptableAmount: { formatter: formatReceivable },
        ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
        futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      }
src/views/salesManagement/salesLedger/index.vue
@@ -654,7 +654,7 @@
          align="right"
        >
          <template #default="scope">
            {{ Number(scope.row.totalAmount ?? 0).toFixed(6) }}
            {{ trimZeros(scope.row.totalAmount, 6) }}
          </template>
        </el-table-column>
        <el-table-column fixed="right" label="操作" width="120" align="center">
@@ -959,9 +959,11 @@
                      <td>{{ product.productCategory || "" }}</td>
                      <td>{{ product.specificationModel || "" }}</td>
                      <td>{{ product.unit || "" }}</td>
                      <td>{{ product.taxInclusiveUnitPrice || "0" }}</td>
                      <td>{{ product.quantity || "0" }}</td>
                      <td>{{ product.taxInclusiveTotalPrice || "0" }}</td>
                      <td>{{ trimZeros(product.taxInclusiveUnitPrice, 6) }}</td>
                      <td>{{ trimZeros(product.quantity, 6) }}</td>
                      <td>
                        {{ trimZeros(product.taxInclusiveTotalPrice, 6) }}
                      </td>
                    </tr>
                    <tr v-if="!item.products || item.products.length === 0">
                      <td colspan="6" style="text-align: center; color: #999">
@@ -1188,6 +1190,7 @@
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
import ImageUpload from "@/components/AttachmentUpload/image/index.vue";
import { getCurrentDate } from "@/utils/index.js";
import { trimZeros } from "@/utils/formatNumber.js";
import { listCustomer } from "@/api/basicData/customer.js";
const FileList = defineAsyncComponent(() =>
@@ -1531,10 +1534,7 @@
  });
};
const formattedNumber = (row, column, cellValue) => {
  if (cellValue === undefined || cellValue === null || cellValue === "") {
    return "0.000000";
  }
  return parseFloat(cellValue).toFixed(6);
  return trimZeros(cellValue, 6);
};
const findLedgerRecordByRow = (row) => {
  if (!row) return null;
@@ -1694,9 +1694,9 @@
    param,
    ["contractAmount", "taxInclusiveTotalPrice", "taxExclusiveTotalPrice"],
    {
      contractAmount: { decimalPlaces: 6 },
      taxInclusiveTotalPrice: { decimalPlaces: 6 },
      taxExclusiveTotalPrice: { decimalPlaces: 6 },
      contractAmount: { decimalPlaces: 6, trimZeros: true },
      taxInclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
      taxExclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
    }
  );
};
@@ -1710,9 +1710,9 @@
      "taxExclusiveTotalPrice",
    ],
    {
      taxInclusiveUnitPrice: { decimalPlaces: 6 },
      taxInclusiveTotalPrice: { decimalPlaces: 6 },
      taxExclusiveTotalPrice: { decimalPlaces: 6 },
      taxInclusiveUnitPrice: { decimalPlaces: 6, trimZeros: true },
      taxInclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
      taxExclusiveTotalPrice: { decimalPlaces: 6, trimZeros: true },
    }
  );
};
@@ -2535,7 +2535,7 @@
  const total = products.reduce((sum, product) => {
    return sum + (parseFloat(product.quantity) || 0);
  }, 0);
  return total.toFixed(6);
  return trimZeros(total, 6);
};
// è®¡ç®—产品总金额
@@ -2544,7 +2544,7 @@
  const total = products.reduce((sum, product) => {
    return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
  }, 0);
  return total.toFixed(6);
  return trimZeros(total, 6);
};
// ç”¨äºŽæ‰“印的计算函数
@@ -2553,7 +2553,7 @@
  const total = products.reduce((sum, product) => {
    return sum + (parseFloat(product.quantity) || 0);
  }, 0);
  return total.toFixed(6);
  return trimZeros(total, 6);
};
const getTotalAmountForPrint = (products) => {
@@ -2561,7 +2561,7 @@
  const total = products.reduce((sum, product) => {
    return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
  }, 0);
  return total.toFixed(6);
  return trimZeros(total, 6);
};
const mathNum = () => {
src/views/salesManagement/salesQuotation/index.vue
@@ -65,7 +65,7 @@
        </el-table-column>
        <el-table-column prop="totalAmount" label="报价金额" width="120">
          <template #default="scope">
            Â¥{{ scope.row.totalAmount.toFixed(6) }}
            Â¥{{ trimZeros(scope.row.totalAmount, 6) }}
          </template>
        </el-table-column>
        <el-table-column label="操作" width="200" fixed="right" align="center">
@@ -267,7 +267,7 @@
<!--          <el-tag :type="getStatusType(currentQuotation.status)">{{ currentQuotation.status }}</el-tag>-->
<!--        </el-descriptions-item>-->
        <el-descriptions-item label="报价总额" :span="2">
          <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">Â¥{{ currentQuotation.totalAmount?.toFixed(6) }}</span>
          <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">Â¥{{ trimZeros(currentQuotation.totalAmount, 6) }}</span>
        </el-descriptions-item>
      </el-descriptions>
@@ -279,7 +279,7 @@
          <el-table-column prop="unit" label="单位" />
          <el-table-column prop="unitPrice" label="单价">
            <template #default="scope">
              Â¥{{ scope.row.unitPrice.toFixed(6) }}
              Â¥{{ trimZeros(scope.row.unitPrice, 6) }}
            </template>
          </el-table-column>
        </el-table>
@@ -303,6 +303,7 @@
import {modelList, productTreeList} from "@/api/basicData/product.js";
import {listCustomer} from "@/api/basicData/customer.js";
import { userListNoPage } from "@/api/system/user.js";
import { trimZeros } from "@/utils/formatNumber.js";
// å“åº”式数据
const loading = ref(false)