张诺
19 小时以前 7e1c5eb99eda42ff9d54b7ecf1bbab9920dc17e6
feat(采购/销售台账): 将价格和数量精度从2位改为3位小数

- 修改calculateTaxExclusiveTotalPrice和calculateTaxIncludeTotalPrice函数,增加precision参数
- 更新采购台账和销售台账中的所有表单字段,将precision从2改为3
- 调整表格显示格式化和合计计算,确保3位小数精度一致
- 修复相关计算函数,传递正确的精度参数
已修改3个文件
132 ■■■■■ 文件已修改
src/utils/summarizeTable.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementLedger/index.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/summarizeTable.js
@@ -41,13 +41,13 @@
  return sums;
};
// 不含税总价计算
const calculateTaxExclusiveTotalPrice = (taxInclusiveTotalPrice, taxRate) => {
const calculateTaxExclusiveTotalPrice = (taxInclusiveTotalPrice, taxRate, precision = 2) => {
  const taxRateDecimal = taxRate / 100;
  return (taxInclusiveTotalPrice / (1 + taxRateDecimal)).toFixed(2);
  return (taxInclusiveTotalPrice / (1 + taxRateDecimal)).toFixed(precision);
};
// 含税总价计算
const calculateTaxIncludeTotalPrice = (taxInclusiveUnitPrice, quantity) => {
  return (taxInclusiveUnitPrice * quantity).toFixed(2);
const calculateTaxIncludeTotalPrice = (taxInclusiveUnitPrice, quantity, precision = 2) => {
  return (taxInclusiveUnitPrice * quantity).toFixed(precision);
};
// 导出函数供其他文件使用
export {
src/views/procurementManagement/procurementLedger/index.vue
@@ -599,7 +599,7 @@
            <el-form-item label="含税单价(元):"
                          prop="taxInclusiveUnitPrice">
              <el-input-number v-model="productForm.taxInclusiveUnitPrice"
                               :precision="2"
                               :precision="3"
                               :step="0.1"
                               :min="0"
                               clearable
@@ -612,7 +612,7 @@
                          prop="quantity">
              <el-input-number :step="0.1"
                               clearable
                               :precision="2"
                               :precision="3"
                               :min="0"
                               style="width: 100%"
                               v-model="productForm.quantity"
@@ -626,7 +626,7 @@
            <el-form-item label="含税总价(元):"
                          prop="taxInclusiveTotalPrice">
              <el-input-number v-model="productForm.taxInclusiveTotalPrice"
                               :precision="2"
                               :precision="3"
                               :step="0.1"
                               :min="0"
                               clearable
@@ -638,7 +638,7 @@
            <el-form-item label="不含税总价(元):"
                          prop="taxExclusiveTotalPrice">
              <el-input-number v-model="productForm.taxExclusiveTotalPrice"
                               :precision="2"
                               :precision="3"
                               :step="0.1"
                               :min="0"
                               clearable
@@ -665,7 +665,7 @@
            <el-form-item label="库存预警数量:"
                          prop="warnNum">
              <el-input-number v-model="productForm.warnNum"
                               :precision="2"
                               :precision="3"
                               :step="0.1"
                               :min="0"
                               clearable
@@ -1067,7 +1067,7 @@
  };
  const formattedNumber = (row, column, cellValue) => {
    return parseFloat(cellValue).toFixed(2);
    return parseFloat(cellValue).toFixed(3);
  };
  // 查询列表
  /** 搜索按钮操作 */
@@ -1191,6 +1191,9 @@
      {
        ticketsNum: { noDecimal: true }, // 不保留小数
        futureTickets: { noDecimal: true }, // 不保留小数
        taxInclusiveUnitPrice: { decimalPlaces: 3 },
        taxInclusiveTotalPrice: { decimalPlaces: 3 },
        taxExclusiveTotalPrice: { decimalPlaces: 3 },
      }
    );
  };
@@ -1254,7 +1257,9 @@
  };
  // 主表合计方法
  const summarizeMainTable = param => {
    return proxy.summarizeTable(param, ["contractAmount"]);
    return proxy.summarizeTable(param, ["contractAmount"], {
      contractAmount: { decimalPlaces: 3 },
    });
  };
  // 子表合计方法
  const summarizeProTable = param => {
@@ -1262,7 +1267,11 @@
      "taxInclusiveUnitPrice",
      "taxInclusiveTotalPrice",
      "taxExclusiveTotalPrice",
    ]);
    ], {
      taxInclusiveUnitPrice: { decimalPlaces: 3 },
      taxInclusiveTotalPrice: { decimalPlaces: 3 },
      taxExclusiveTotalPrice: { decimalPlaces: 3 },
    });
  };
  // 打开弹框
  const openForm = async (type, row) => {
@@ -1726,14 +1735,16 @@
    productForm.value.taxInclusiveTotalPrice =
      proxy.calculateTaxIncludeTotalPrice(
        productForm.value.taxInclusiveUnitPrice,
        productForm.value.quantity
        productForm.value.quantity,
        3
      );
    if (productForm.value.taxRate) {
      // 不含税总价计算
      productForm.value.taxExclusiveTotalPrice =
        proxy.calculateTaxExclusiveTotalPrice(
          productForm.value.taxInclusiveTotalPrice,
          productForm.value.taxRate
          productForm.value.taxRate,
          3
        );
    }
  };
@@ -1764,7 +1775,7 @@
        productForm.value.taxInclusiveUnitPrice = (
          Number(productForm.value.taxInclusiveTotalPrice) /
          Number(productForm.value.quantity)
        ).toFixed(2);
        ).toFixed(3);
        // 确保结果不为负数
        if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
          productForm.value.taxInclusiveUnitPrice = "0";
@@ -1775,7 +1786,7 @@
        productForm.value.quantity = (
          Number(productForm.value.taxInclusiveTotalPrice) /
          Number(productForm.value.taxInclusiveUnitPrice)
        ).toFixed(2);
        ).toFixed(3);
        // 确保结果不为负数
        if (Number(productForm.value.quantity) < 0) {
          productForm.value.quantity = "0";
@@ -1785,7 +1796,7 @@
      productForm.value.taxExclusiveTotalPrice = (
        Number(productForm.value.taxInclusiveTotalPrice) /
        (1 + taxRate / 100)
      ).toFixed(2);
      ).toFixed(3);
      // 确保结果不为负数
      if (Number(productForm.value.taxExclusiveTotalPrice) < 0) {
        productForm.value.taxExclusiveTotalPrice = "0";
@@ -1795,7 +1806,7 @@
      productForm.value.taxInclusiveTotalPrice = (
        Number(productForm.value.taxExclusiveTotalPrice) *
        (1 + taxRate / 100)
      ).toFixed(2);
      ).toFixed(3);
      // 确保结果不为负数
      if (Number(productForm.value.taxInclusiveTotalPrice) < 0) {
        productForm.value.taxInclusiveTotalPrice = "0";
@@ -1805,7 +1816,7 @@
        productForm.value.taxInclusiveUnitPrice = (
          Number(productForm.value.taxInclusiveTotalPrice) /
          Number(productForm.value.quantity)
        ).toFixed(2);
        ).toFixed(3);
        // 确保结果不为负数
        if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
          productForm.value.taxInclusiveUnitPrice = "0";
@@ -1816,7 +1827,7 @@
        productForm.value.quantity = (
          Number(productForm.value.taxInclusiveTotalPrice) /
          Number(productForm.value.taxInclusiveUnitPrice)
        ).toFixed(2);
        ).toFixed(3);
        // 确保结果不为负数
        if (Number(productForm.value.quantity) < 0) {
          productForm.value.quantity = "0";
src/views/salesManagement/salesLedger/index.vue
@@ -87,7 +87,7 @@
                  </div>
                </template>
              </el-table-column>
              <el-table-column label="数量" prop="quantity" />
              <el-table-column label="数量" prop="quantity" :formatter="formattedNumber" />
              <el-table-column label="税率(%)" prop="taxRate" />
              <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
              <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
@@ -317,7 +317,7 @@
                <el-table-column prop="status" label="审批状态" width="120" align="center" />
                <el-table-column prop="totalAmount" label="报价金额(元)" width="160" align="right">
                    <template #default="scope">
                        {{ Number(scope.row.totalAmount ?? 0).toFixed(2) }}
                        {{ Number(scope.row.totalAmount ?? 0).toFixed(3) }}
                    </template>
                </el-table-column>
                <el-table-column fixed="right" label="操作" width="120" align="center">
@@ -386,14 +386,14 @@
                    <el-col :span="12">
                        <el-form-item label="含税单价(元):" prop="taxInclusiveUnitPrice">
                            <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%"
                                                             :precision="2"
                                                             :precision="3"
                                                             placeholder="请输入" clearable @change="calculateFromUnitPrice" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="数量:" prop="quantity">
                            <el-input-number  :step="0.1" :min="0" v-model="productForm.quantity" placeholder="请输入" clearable
                                                                :precision="2"
                                                                :precision="3"
                                                                @change="calculateFromQuantity" style="width: 100%" />
                        </el-form-item>
                    </el-col>
@@ -936,7 +936,7 @@
    });
};
const formattedNumber = (row, column, cellValue) => {
    return parseFloat(cellValue).toFixed(2);
    return parseFloat(cellValue).toFixed(3);
};
// 获取tree子数据
const getModels = (value) => {
@@ -1048,7 +1048,11 @@
        "contractAmount",
        "taxInclusiveTotalPrice",
        "taxExclusiveTotalPrice",
    ]);
    ], {
        contractAmount: { decimalPlaces: 3 },
        taxInclusiveTotalPrice: { decimalPlaces: 3 },
        taxExclusiveTotalPrice: { decimalPlaces: 3 },
    });
};
// 子表合计方法
const summarizeChildrenTable = (param) => {
@@ -1056,8 +1060,29 @@
        "taxInclusiveUnitPrice",
        "taxInclusiveTotalPrice",
        "taxExclusiveTotalPrice",
    ]);
    ], {
        taxInclusiveUnitPrice: { decimalPlaces: 3 },
        taxInclusiveTotalPrice: { decimalPlaces: 3 },
        taxExclusiveTotalPrice: { decimalPlaces: 3 },
    });
};
// 判断是否能编辑
const canEditLedger = (row) => {
    // 如果是维护人,则可以编辑
    return Number(row.entryPerson) === Number(userStore.id);
};
// 判断是否能删除
const canDeleteLedger = (row) => {
    // 如果是维护人,则可以删除
    return Number(row.entryPerson) === Number(userStore.id);
};
// 判断是否是维护人(用于权限校验)
const isMaintainer = (row) => {
    return row.entryPerson === userStore.id;
};
// 打开弹框
const openForm = async (type, row) => {
    if (type === "edit" && row && !canEditLedger(row)) {
@@ -1176,8 +1201,8 @@
        const quantity = Number(p.quantity ?? 0) || 0;
        const unitPrice = Number(p.unitPrice ?? 0) || 0;
        const taxRate = "13"; // 默认 13%,便于直接提交(如需可在产品中自行修改)
        const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
        const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate);
        const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
        const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate, 3);
        return {
            // 台账字段
            productCategory: p.product || p.productName || "",
@@ -1185,7 +1210,7 @@
            unit: p.unit || "",
            quantity: quantity,
            taxRate: taxRate,
            taxInclusiveUnitPrice: unitPrice.toFixed(2),
            taxInclusiveUnitPrice: unitPrice.toFixed(3),
            taxInclusiveTotalPrice: taxInclusiveTotalPrice,
            taxExclusiveTotalPrice: taxExclusiveTotalPrice,
            invoiceType: "增普票",
@@ -1825,7 +1850,7 @@
    const total = products.reduce((sum, product) => {
        return sum + (parseFloat(product.quantity) || 0);
    }, 0);
    return total.toFixed(2);
    return total.toFixed(3);
};
// 计算产品总金额
@@ -1834,7 +1859,7 @@
    const total = products.reduce((sum, product) => {
        return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
    }, 0);
    return total.toFixed(2);
    return total.toFixed(3);
};
// 用于打印的计算函数
@@ -1843,7 +1868,7 @@
    const total = products.reduce((sum, product) => {
        return sum + (parseFloat(product.quantity) || 0);
    }, 0);
    return total.toFixed(2);
    return total.toFixed(3);
};
const getTotalAmountForPrint = (products) => {
@@ -1851,7 +1876,7 @@
    const total = products.reduce((sum, product) => {
        return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
    }, 0);
    return total.toFixed(2);
    return total.toFixed(3);
};
const mathNum = () => {
@@ -1866,14 +1891,16 @@
    productForm.value.taxInclusiveTotalPrice =
        proxy.calculateTaxIncludeTotalPrice(
            productForm.value.taxInclusiveUnitPrice,
            productForm.value.quantity
            productForm.value.quantity,
            3
        );
    if (productForm.value.taxRate) {
        // 不含税总价计算
        productForm.value.taxExclusiveTotalPrice =
            proxy.calculateTaxExclusiveTotalPrice(
                productForm.value.taxInclusiveTotalPrice,
                productForm.value.taxRate
                productForm.value.taxRate,
                3
            );
    }
};
@@ -1892,14 +1919,15 @@
    isCalculating.value = true;
    
    // 计算含税单价 = 含税总价 / 数量
    productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
    productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(3);
    
    // 如果有税率,计算不含税总价
    if (productForm.value.taxRate) {
        productForm.value.taxExclusiveTotalPrice =
            proxy.calculateTaxExclusiveTotalPrice(
                totalPrice,
                productForm.value.taxRate
                productForm.value.taxRate,
                3
            );
    }
    
@@ -1927,10 +1955,10 @@
    // 先计算含税总价 = 不含税总价 / (1 - 税率/100)
    const taxRateDecimal = taxRate / 100;
    const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
    productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
    productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(3);
    
    // 计算含税单价 = 含税总价 / 数量
    productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(2);
    productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(3);
    
    isCalculating.value = false;
};
@@ -1953,14 +1981,15 @@
    isCalculating.value = true;
    
    // 计算含税总价
    productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
    productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
    
    // 如果有税率,计算不含税总价
    if (productForm.value.taxRate) {
        productForm.value.taxExclusiveTotalPrice =
            proxy.calculateTaxExclusiveTotalPrice(
                productForm.value.taxInclusiveTotalPrice,
                productForm.value.taxRate
                productForm.value.taxRate,
                3
            );
    }
    
@@ -1985,14 +2014,15 @@
    isCalculating.value = true;
    
    // 计算含税总价
    productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
    productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
    
    // 如果有税率,计算不含税总价
    if (productForm.value.taxRate) {
        productForm.value.taxExclusiveTotalPrice =
            proxy.calculateTaxExclusiveTotalPrice(
                productForm.value.taxInclusiveTotalPrice,
                productForm.value.taxRate
                productForm.value.taxRate,
                3
            );
    }
    
@@ -2020,7 +2050,8 @@
    productForm.value.taxExclusiveTotalPrice =
        proxy.calculateTaxExclusiveTotalPrice(
            inclusiveTotalPrice,
            taxRate
            taxRate,
            3
        );
    
    isCalculating.value = false;