Commit 588a47cd authored by luhongguang's avatar luhongguang

update:tcc 下单 confirm

parent 2edd23df
...@@ -61,7 +61,8 @@ class TccService ...@@ -61,7 +61,8 @@ class TccService
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} }
$skus = GoodsSku::getRecords(["goods_sku_id" => $goodsSkuIds]); $skus = GoodsSku::getRecords(["goods_sku_id" => $goodsSkuIds
, ["goods_sku_id", "inventory_rest", "inventory_lock", "online_status"]]);
if (!empty($skus)) { if (!empty($skus)) {
GoodsSku::beginTransaction(); GoodsSku::beginTransaction();
foreach ($skus as $sku) { foreach ($skus as $sku) {
...@@ -71,9 +72,8 @@ class TccService ...@@ -71,9 +72,8 @@ class TccService
if (empty($numList[$goodsSkuId])) { if (empty($numList[$goodsSkuId])) {
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} }
$num = $numList[$sku["goods_sku_id"]]; $num = $numList[$goodsSkuId];
GoodsSku::beginTransaction();
GoodsSku::save([ GoodsSku::save([
"inventory_lock" => $sku["inventory_lock"] + $num, "inventory_lock" => $sku["inventory_lock"] + $num,
"inventory_rest" => $sku["inventory_rest"] - $num, "inventory_rest" => $sku["inventory_rest"] - $num,
...@@ -117,46 +117,86 @@ class TccService ...@@ -117,46 +117,86 @@ class TccService
/** /**
* 下单 商品tcc confirm * 下单 商品tcc confirm
* @param $goodsSkuId * @param $keys
* @param $tid * @param $tid
* @return int * @return int
*/ */
public static function placeAnOrderConfirm($goodsSkuId, $tid) public static function placeAnOrderConfirm($keys, $tid)
{ {
$tccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_CONFIRM]); $goodsInfoList = json_decode($keys, true);
if (empty($goodsInfoList)) {
return self::TCC_RESULT_FAIL;
}
$goodsSkuIds = $numList = [];
foreach ($goodsInfoList as $item) {
if (empty($item["goods_sku_id"]) || empty($item["num"])) {
return self::TCC_RESULT_FAIL;
}
$goodsSkuIds[] = $item["goods_sku_id"];
$numList[$item["goods_sku_id"]] = $item["num"];
}
//有结果返回原来的结果,幂等 //有结果返回原来的结果,幂等
if (!empty($tccInfo)) { $tccInfoList = Tcc::getRecordMaster([
if ($tccInfo[0]["operator_result"] == Tcc::OPERATOR_RESULT_FAIL) { "t_id" => $tid,
"goods_sku_id" => $goodsSkuIds,
"status" => Tcc::STATUS_CONFIRM
]);
if (!empty($tccInfoList)) {
foreach ($tccInfoList as $tccInfo) {
if ($tccInfo["operator_result"] == Tcc::OPERATOR_RESULT_FAIL) {
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} else {
return self::TCC_RESULT_SUCCESS;
} }
} }
return self::TCC_RESULT_SUCCESS;
}
//在confirm时候必须已经有try,如果没有就直接返回fail //在confirm时候必须已经有try,如果没有就直接返回fail
$tryTccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_TRY, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS]); $cTccInfoList = Tcc::getRecordMaster([
if (empty($tryTccInfo)) { "t_id" => $tid,
"goods_sku_id" => $goodsSkuIds,
"status" => Tcc::STATUS_TRY,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS
]);
if (!empty($cTccInfoList)) {
foreach ($goodsSkuIds as $goodsSkuId) {
Tcc::save([ Tcc::save([
"t_id" => $tid, "t_id" => $tid,
"goods_sku_id" => $goodsSkuId, "goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CONFIRM, "status" => Tcc::STATUS_TRY,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL, "operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]); ]);
}
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} }
//如果已经 cancel 成功, 则失败
//如果已经 cancel 成功 $cTccInfoList = Tcc::getRecordMaster([
$cancelTccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_CANCEL, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS]); "t_id" => $tid,
if (!empty($cancelTccInfo)) { "goods_sku_id" => $goodsSkuIds,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS
]);
if (!empty($cTccInfoList)) {
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} }
$sku = GoodsSku::getRecord(["goods_sku_id" => $goodsSkuId]); $skus = GoodsSku::getRecords(["goods_sku_id" => $goodsSkuIds
if (!empty($sku["inventory_rest"]) && $sku["online_status"] == GoodsSku::ONLINE_STATUS_ONLINE) { , ["goods_sku_id", "total_amount_order", "inventory_lock", "online_status"]]);
if (!empty($skus)) {
GoodsSku::beginTransaction(); GoodsSku::beginTransaction();
foreach ($skus as $sku) {
$goodsSkuId = $sku["goods_sku_id"];
if (!empty($sku["inventory_lock"]) && $sku["online_status"] == GoodsSku::ONLINE_STATUS_ONLINE) {
if (empty($numList[$goodsSkuId])) {
return self::TCC_RESULT_FAIL;
}
$num = $numList[$goodsSkuId];
GoodsSku::save([ GoodsSku::save([
"inventory_lock" => $sku["inventory_lock"] - 1, "inventory_lock" => $sku["inventory_lock"] - $num,
"total_amount_order" => $sku["total_amount_order"] + 1, "total_amount_order" => $sku["total_amount_order"] + $num,
], ["goods_sku_id" => $goodsSkuId]); ], ["goods_sku_id" => $goodsSkuId]);
Tcc::save([ Tcc::save([
...@@ -165,8 +205,7 @@ class TccService ...@@ -165,8 +205,7 @@ class TccService
"status" => Tcc::STATUS_CONFIRM, "status" => Tcc::STATUS_CONFIRM,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS,
]); ]);
} else {
if (!GoodsSku::commit()) {
GoodsSku::rollback(); GoodsSku::rollback();
Tcc::save([ Tcc::save([
...@@ -177,14 +216,20 @@ class TccService ...@@ -177,14 +216,20 @@ class TccService
]); ]);
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} }
} else { }
if (!GoodsSku::commit()) {
GoodsSku::rollback();
foreach ($skus as $sku) {
Tcc::save([ Tcc::save([
"t_id" => $tid, "t_id" => $tid,
"goods_sku_id" => $goodsSkuId, "goods_sku_id" => $sku["goods_sku_id"],
"status" => Tcc::STATUS_CONFIRM, "status" => Tcc::STATUS_CONFIRM,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL, "operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]); ]);
return self::TCC_RESULT_FAIL; }
}
} }
return self::TCC_RESULT_SUCCESS; return self::TCC_RESULT_SUCCESS;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment