Commit 1eace844 authored by luhongguang's avatar luhongguang

update:tcc 下单 cancel

parent 588a47cd
...@@ -159,12 +159,12 @@ class TccService ...@@ -159,12 +159,12 @@ class TccService
"status" => Tcc::STATUS_TRY, "status" => Tcc::STATUS_TRY,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS
]); ]);
if (!empty($cTccInfoList)) { if (empty($cTccInfoList)) {
foreach ($goodsSkuIds as $goodsSkuId) { 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_TRY, "status" => Tcc::STATUS_CONFIRM,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL, "operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]); ]);
} }
...@@ -237,46 +237,86 @@ class TccService ...@@ -237,46 +237,86 @@ class TccService
/** /**
* 下单 商品tcc cancel * 下单 商品tcc cancel
* @param $goodsSkuId * @param $keys
* @param $tid * @param $tid
* @return int * @return int
*/ */
public static function placeAnOrderCancel($goodsSkuId, $tid) public static function placeAnOrderCancel($keys, $tid)
{ {
$tccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_CANCEL]); $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_CANCEL
]);
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;
}
//在cancel时候必须已经有try,如果没有就直接返回fail //在cancel时候必须已经有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_CANCEL, "status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL, "operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]); ]);
}
return self::TCC_RESULT_FAIL;
}
//如果已经 confirm 成功, 则失败
$cTccInfoList = Tcc::getRecordMaster([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuIds,
"status" => Tcc::STATUS_CONFIRM,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS
]);
if (!empty($cTccInfoList)) {
return self::TCC_RESULT_FAIL; return self::TCC_RESULT_FAIL;
} }
//如果已经 confirm 成功 $skus = GoodsSku::getRecords(["goods_sku_id" => $goodsSkuIds
$confirmTccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_CONFIRM, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS]); , ["goods_sku_id", "inventory_rest", "inventory_lock", "online_status"]]);
if (!empty($confirmTccInfo)) { if (!empty($skus)) {
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; return self::TCC_RESULT_FAIL;
} }
$num = $numList[$goodsSkuId];
$sku = GoodsSku::getRecord(["goods_sku_id" => $goodsSkuId]);
if (!empty($sku["inventory_rest"]) && $sku["online_status"] == GoodsSku::ONLINE_STATUS_ONLINE) {
GoodsSku::beginTransaction();
GoodsSku::save([ GoodsSku::save([
"inventory_lock" => $sku["inventory_lock"] - 1, "inventory_lock" => $sku["inventory_lock"] - $num,
"inventory_rest" => $sku["inventory_rest"] + 1, "inventory_rest" => $sku["inventory_rest"] + $num,
], ["goods_sku_id" => $goodsSkuId]); ], ["goods_sku_id" => $goodsSkuId]);
Tcc::save([ Tcc::save([
...@@ -285,8 +325,7 @@ class TccService ...@@ -285,8 +325,7 @@ class TccService
"status" => Tcc::STATUS_CANCEL, "status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS,
]); ]);
} else {
if (!GoodsSku::commit()) {
GoodsSku::rollback(); GoodsSku::rollback();
Tcc::save([ Tcc::save([
...@@ -297,14 +336,20 @@ class TccService ...@@ -297,14 +336,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_CANCEL, "status" => Tcc::STATUS_CANCEL,
"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