Мне нужно реализовать алгоритм, который может отслеживать прибыль для списка транзакций отдельных предметов и обновлять таблицу «прибыль». Идея состоит в том, чтобы выбрать купленные товары и сопоставить их с проданными товарами исключительно по заказу (т.е. не существует отдельного экземпляра отдельных предметов, существуют только идентификаторы для типов предметов). Итак, скажем, у нас есть таблица с этими данными:
items:
item id item type
1 red box
2 blue box
3 white box
transactions:
item id -- quantity -- transaction_type -- price_unit($) -- time
1 3 buy 20 2015-10-10
3 1 buy 10 2015-10-11
1 1 sell 25 2015-10-12
1 1 sell 20 2015-11-14
3 1 sell 15 2015-11-13
Для этого примера моя таблица прибыли должна выглядеть так:
item_id -- quantity -- profit -- timestamp_bought ---timestamp_sold
1 1 (25-20)=5 2015-10-10 2015-10-12
1 1 (20-20)=0 2015-10-10 2015-11-14
3 1 (15-10)=5 2015-10-11 2015-11-13
Это то, что я до сих пор. Это работает до тех пор, пока в игру не вступят несколько разных объемов покупки / продажи …
$buy_list = mysqli_query($con, "SELECT * FROM transaction WHERE
transaction_type = 'Buy' ORDER BY time DESC");
$sell_list = mysqli_query($con, "SELECT * FROM transaction WHERE
transaction_type = 'Sell' ORDER BY time DESC");
while($row = mysqli_fetch_array($buy_list))
{
array_push($buy_stack, array(
$row['idtrans'],
$row['iditem'],
$row['quantity'],
$row['time'],
$row['price_unit']));
}
while($row = mysqli_fetch_array($sell_list))
{
array_push($sell_stack, array(
$row['idtrans'],
$row['iditem'],
$row['quantity'],
$row['time'],
$row['price_unit']));
}
$size_buy = sizeof($buy_stack);
$size_sell = sizeof($sell_stack);
for($i=0; $i<=$size_buy-1; $i++) //iterate BUY orders
{
$idtrans_b = $buy_stack[$i][0];
$itemid_b = $buy_stack[$i][1];
$quantity_b = $buy_stack[$i][2];
$time_b = $buy_stack[$i][3];
$price_unit_b = $buy_stack[$i][4];
$quantity_b_calc = $buy_stack[$i][2];
for($k=0; $k<=$size_sell-1; $k++)
{
$idtrans_s = $sell_stack[$k][0];
$itemid_s = $sell_stack[$k][1];
$quantity_s = $sell_stack[$k][2];
$time_s = $sell_stack[$k][3];
$price_unit_s = $sell_stack[$k][4];
if($itemid_s == $itemid_b &&
$time_s > $time_b &&
$quantity_b > 0
&& $quantity_s >= $quantity_b) //match
{
$sell_stack[$k][1] = "done_sell";
$buy_stack[$i][1] = "done_buy";
$profit_unit = $price_unit_s - $price_unit_b;
$profit_ quantity = min($quantity_s, $quantity_b);
$quantity_b = $quantity_b - $profit_quantity;
$time_bought = $buy_stack[$i][3];
$time_sold = $sell_stack[$k][3];
$add_profit = mysqli_query
($con, "INSERT INTO profit (id, transaction_buy, transaction_sell, profit_unit, quantity, timestamp_buy, timestamp_sell)
VALUES ( 'null', '$idtrans_b', '$idtrans_s', '$profit_unit', '$profit_quantity', $time_bought, $time_sold));
}
}
}
Я застрял, чтобы заставить это работать должным образом. Должен ли я удалить это и сделать это со стеками вместо этого?
Задача ещё не решена.
Других решений пока нет …