重复抢单问题?如何避免重复抢单呢 ,在线等求指导。。。

文档问题 · alijon · 于 3年前 发布 · 1116 次阅读

我写的代码如下 可还出现了重复抢单现项。 求指导:

public function actionReceipt()
    {
        //检查令牌
        if ($this->beforeActionRet["retCode"] == 1000) {
            $orderNo = Yii::$app->request->post('orderNo');
            $deliverID = Yii::$app->request->post('userID');
            $order = $this->checkOrder($orderNo);
            $delver = $this->findModel($deliverID);
            if ($delver == null) {
                return Json::encode(["retCode" => '1004', 'retMsg' => '用户不存在']);
            }
            //如果抢完了 返回参数
            if ($order->orderStatus == 2) {
                return Json::encode(["retCode" => "1007", "retMsg" => "此订单已被抢走了"]);
            }
            //满足未抢单执行
            if ($order->orderStatus === 1 && $order->deliverID === null) {
                $order->isNewRecord = false;
                $order->printStatus = 2;
                $transaction = Yii::$app->db->beginTransaction();
                try {
                    $orderDeliver = OrderDeliver::find()->where(['orderNo' => $orderNo])->one();
                    if (!$orderDeliver) {
                        $orderDeliver = new OrderDeliver();
                    }
                    $orderDeliver->orderNo = $orderNo;
                    $orderDeliver->deliverID = $deliverID;
                    $orderDeliver->managerCode = Deliver::findOne($deliverID)->managerCode;
                    $orderInfo = Order::find()->where(['orderNo' => $orderNo])->one();
                    $addressInfo = CustAddress::find()->select('address,phone')->where(['id' => $orderInfo['addressID']])->one();
                    $SN = Device::find()->select('SN')->where(['resId' => $orderInfo['resID']])->one()['SN'];
                    $orders = OrderDetail::find()->where(['orderNo' => $orderNo])->asArray()->all();
                    $mobilePhone = $orderInfo['userName'];
                    $totalPrice = $orderInfo['amount'] + $orderInfo['deliverFee'];
                    $deliveryPhone = Deliver::findOne($deliverID)->username;
                    if (isset($SN) && !empty($SN)) {
                        $feiE = new FeiE($SN);
                        if ($orderDeliver->save() && Order::updateOrder($orderNo, $deliverID)) {
                            $transaction->commit();
                            $order = $this->checkOrder($orderNo);
                            if ($order->printStatus == 1) {
                                $feiE->create_ticket($orders, $orderNo, $orderInfo, $addressInfo['phone']);
                                $this->setMessage($mobilePhone, $totalPrice, $deliveryPhone);
                                $this->pushSocket($orderNo, $orderInfo['resID']);
                            }
                            $retData = [
                                'retCode' => 1000,
                                'retMsg' => '派单成功',
                                'body' => [
                                    'resultCode' => 2000,
                                    'resultMsg' => 'SUCCESS'
                                ]
                            ];
                            return json_encode($retData);
                        }
                    }
                    if ($orderDeliver->save() && Order::updateOrder($orderNo, $deliverID)) {
                        $this->setMessage($mobilePhone, $totalPrice, $deliveryPhone);
                        $this->pushSocket($orderNo, $orderInfo['resID']);
                        $retData = [
                            'retCode' => 1000,
                            'retMsg' => '派单成功',
                            'body' => [
                                'resultCode' => 2000,
                                'resultMsg' => 'SUCCESS'
                            ]
                        ];
                        $transaction->commit();
                        return json_encode($retData);
                    }
                } catch (Exception $e) {
                    $retData = [
                        'retCode' => 1001,
                        'retMsg' => '派单失败',
                        'body' => [
                            'resultCode' => $e->getCode(),
                            'resultMsg' => $e->getMessage()
                        ]
                    ];
                    $transaction->rollBack();
                    return json_encode($retData);
                }
            }
        }
        return Json::encode($this->beforeActionRet);
    }

本文由 alijon 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。

共收到 1 条回复 技术分享 问题提问
Fecmall#13年前 0 个赞

mysql update语句,加入一个条件字段 sl,这样就不会重复执行了

update order set sl=1 where sl=0

通过update的行数,来判断,是否进行了update。

如果update行数为0,代表这个已经执行过了。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics