Commit 1eace844 authored by luhongguang's avatar luhongguang

update:tcc 下单 cancel

parent 588a47cd
......@@ -159,12 +159,12 @@ class TccService
"status" => Tcc::STATUS_TRY,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS
]);
if (!empty($cTccInfoList)) {
if (empty($cTccInfoList)) {
foreach ($goodsSkuIds as $goodsSkuId) {
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_TRY,
"status" => Tcc::STATUS_CONFIRM,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
}
......@@ -237,74 +237,119 @@ class TccService
/**
* 下单 商品tcc cancel
* @param $goodsSkuId
* @param $keys
* @param $tid
* @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]);
//有结果返回原来的结果,幂等
if (!empty($tccInfo)) {
if ($tccInfo[0]["operator_result"] == Tcc::OPERATOR_RESULT_FAIL) {
$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;
} else {
return self::TCC_RESULT_SUCCESS;
}
$goodsSkuIds[] = $item["goods_sku_id"];
$numList[$item["goods_sku_id"]] = $item["num"];
}
//有结果返回原来的结果,幂等
$tccInfoList = Tcc::getRecordMaster([
"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_SUCCESS;
}
//在cancel时候必须已经有try,如果没有就直接返回fail
$tryTccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_TRY, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS]);
if (empty($tryTccInfo)) {
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
$cTccInfoList = Tcc::getRecordMaster([
"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([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
}
return self::TCC_RESULT_FAIL;
}
//如果已经 confirm 成功
$confirmTccInfo = Tcc::getRecordMaster(["t_id" => $tid, "goods_sku_id" => $goodsSkuId, "status" => Tcc::STATUS_CONFIRM, "operator_result" => Tcc::OPERATOR_RESULT_SUCCESS]);
if (!empty($confirmTccInfo)) {
//如果已经 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;
}
$sku = GoodsSku::getRecord(["goods_sku_id" => $goodsSkuId]);
if (!empty($sku["inventory_rest"]) && $sku["online_status"] == GoodsSku::ONLINE_STATUS_ONLINE) {
$skus = GoodsSku::getRecords(["goods_sku_id" => $goodsSkuIds
, ["goods_sku_id", "inventory_rest", "inventory_lock", "online_status"]]);
if (!empty($skus)) {
GoodsSku::beginTransaction();
GoodsSku::save([
"inventory_lock" => $sku["inventory_lock"] - 1,
"inventory_rest" => $sku["inventory_rest"] + 1,
], ["goods_sku_id" => $goodsSkuId]);
foreach ($skus as $sku) {
$goodsSkuId = $sku["goods_sku_id"];
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS,
]);
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([
"inventory_lock" => $sku["inventory_lock"] - $num,
"inventory_rest" => $sku["inventory_rest"] + $num,
], ["goods_sku_id" => $goodsSkuId]);
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_SUCCESS,
]);
} else {
GoodsSku::rollback();
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
return self::TCC_RESULT_FAIL;
}
}
if (!GoodsSku::commit()) {
GoodsSku::rollback();
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
return self::TCC_RESULT_FAIL;
foreach ($skus as $sku) {
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $sku["goods_sku_id"],
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
}
}
} else {
Tcc::save([
"t_id" => $tid,
"goods_sku_id" => $goodsSkuId,
"status" => Tcc::STATUS_CANCEL,
"operator_result" => Tcc::OPERATOR_RESULT_FAIL,
]);
return self::TCC_RESULT_FAIL;
}
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