array_column($reshipItems, 'order_item_id'), 'filter_sql' => 'nums <> return_num' ]; $items = $this->getList('id,order_item_id,nums,return_num,return_amount', $filter); $orderItemIdItems = []; foreach($items as $v) { $orderItemIdItems[$v['order_item_id']][] = $v; } foreach($reshipItems as $v) { $num = intval($v['normal_num']+$v['defective_num']); if ($num <= 0) { continue; } $amount = $v['amount'] ? : $num * $v['price']; $price = $amount/$num; if($orderItemIdItems[$v['order_item_id']]) { foreach($orderItemIdItems[$v['order_item_id']] as $ik => $iv) { if($num < 1) { break; } $valid = $iv['nums']-$iv['return_num']; if($valid < 1) { break; } if($valid < $num) { $returnNum = $valid; } else { $returnNum = $num; } $num -= $returnNum; $orderItemIdItems[$v['order_item_id']]['return_num'] += $returnNum; $sql = 'update sdb_sales_delivery_order_item set return_num=return_num+'.$returnNum.', return_amount=return_amount+'.sprintf('%.2f', $price*$returnNum).' where id='.$iv['id']; $this->db->exec($sql); } } } } }