PHP 订单拆单后明细总金额与订单金额存在差异

一、场景

把订单的金额按照数量拆成number个订单详情,如果金额是10,数量是3,则拆出来的单个金额就是3.33,就会丢失0.01。为了解决这一问题,我们需要对比订单详情总金额与订单金额,如果不一致,则调整最后一个订单详情的金额(增加或减少),使金额保持一致。

二、代码

//订单拆单:把单个订单拆成number个订单详情,订单详情总额不等于订单金额时,调整最后一个订单详情金额
public function test() {
    //订单数据
    $orderData = [
        ['id' => 1, 'name' => '数据1', 'number' => 2, 'price' => 10.12], //单条订单数据
        ['id' => 2, 'name' => '数据2', 'number' => 3, 'price' => 10.13],
        ['id' => 3, 'name' => '数据3', 'number' => 6, 'price' => 10.10],
    ];
    $detailData = [];
    foreach ($orderData as $value) {
        $price = $value['price'];
        $number = $value['number'];

        $tempData = [];
        for ($i = 0; $i < $number; $i ++) { //把单个订单拆成number个订单详情
            $tempData[] = [
                'pid' => $value['id'],
                'name' => "{$value['name']}的详情数据",
                'price' => ($number > 0) ? sprintf('%.2f', $price / $number) : 0 //订单详情的价格,并保留2位小数
            ];
        }

        //金额对不上时调整
        self::comparePrice($tempData, $price);

        $detailData = array_merge($detailData, $tempData); //把单个订单的详情数据追加到总详情数据中
    }

    var_export($detailData); //打印结果数据
}

/**
 * 校验单个订单详情数据的总金额和订单金额是否一致。如果不一致则:调整最后一条的价格
 * @param array $tempData 单个订单拆出的详情数据
 * @param string $price 单个订单的金额
 * @param string $priceField 详情数据的金额字段名
 */
public function comparePrice(&$tempData, $price, $priceField = 'price') {
    $detailTotalPrice = array_sum(array_column($tempData, $priceField)); //订单详情的总金额
    if ($detailTotalPrice != $price) { //订单详情的总金额 不等于 订单金额
        $maxIndex = count($tempData) - 1; //最后一条数据的索引
        $maxIndexPrice = $tempData[$maxIndex][$priceField];  //最后一条数据的金额
        $maxIndexNewPrice = sprintf('%.2f', $price - ($detailTotalPrice - $maxIndexPrice)); //根据差额计算最后一条数据的金额
        $tempData[$maxIndex][$priceField] = $maxIndexNewPrice; //给最后一条数据的金额赋值
    }
}

三、打印


array (
  0 => 
  array (
    'pid' => 1,
    'name' => '数据1的详情数据',
    'price' => '5.06',
  ),
  1 => 
  array (
    'pid' => 1,
    'name' => '数据1的详情数据',
    'price' => '5.06',
  ),
  2 => 
  array (
    'pid' => 2,
    'name' => '数据2的详情数据',
    'price' => '3.38',
  ),
  3 => 
  array (
    'pid' => 2,
    'name' => '数据2的详情数据',
    'price' => '3.38',
  ),
  4 => 
  array (
    'pid' => 2,
    'name' => '数据2的详情数据',
    'price' => '3.37',
  ),
  5 => 
  array (
    'pid' => 3,
    'name' => '数据3的详情数据',
    'price' => '1.68',
  ),
  6 => 
  array (
    'pid' => 3,
    'name' => '数据3的详情数据',
    'price' => '1.68',
  ),
  7 => 
  array (
    'pid' => 3,
    'name' => '数据3的详情数据',
    'price' => '1.68',
  ),
  8 => 
  array (
    'pid' => 3,
    'name' => '数据3的详情数据',
    'price' => '1.68',
  ),
  9 => 
  array (
    'pid' => 3,
    'name' => '数据3的详情数据',
    'price' => '1.68',
  ),
  10 => 
  array (
    'pid' => 3,
    'name' => '数据3的详情数据',
    'price' => '1.70',
  ),
)
上一篇:浅谈HTML中的块级元素和内联元素


下一篇:剑指Offer 63 股票的最大利润