<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                # 某大型項目應用本Redis類源碼示例(含事務 樂觀鎖) ### 服務層源碼 ~~~ /** * @description * @author Mikkle */ public function completeParkByBill($data){ $this->functionName = __FUNCTION__; $this->args = $data; //檢驗數據 if ( ! isset($data[OptionsCenter::$fieldChargeToken]) || ! $this->parseToken($data[OptionsCenter::$fieldChargeToken]) ){ $this->addError("登錄Token參數缺失或已經失效"); return ShowCode::jsonCodeWithoutData(1003,$this->error); } if(! $this->checkArrayValueEmpty($data,[OptionsCenter::$fieldBillNum,OptionsCenter::$fieldPayMoney])){ $this->addError("信息中缺失必要的信息"); return ShowCode::jsonCodeWithoutData(1003,$this->error); } $billCenter = BillInfoCenter::instance($data[OptionsCenter::$fieldBillNum]); $data[OptionsCenter::$fieldSerialNum] = $billCenter->getParkCarSerialNum(); $data[OptionsCenter::$fieldParkMoney] = $billCenter->getInfoFieldValue(OptionsCenter::$fieldParkMoney); $data[OptionsCenter::$fieldBillMoney] = $billCenter->getInfoFieldValue(OptionsCenter::$fieldBillMoney); if (!is_numeric($data[OptionsCenter::$fieldBillMoney])|| !is_numeric($data[OptionsCenter::$fieldPayMoney]) ){ $this->addError("賬單金額類型錯誤"); return ShowCode::jsonCodeWithoutData(1003,$this->error); }elseif ( $data[OptionsCenter::$fieldPayMoney]<=0){ $this->addError("付款金額不能小于等于0"); return ShowCode::jsonCodeWithoutData(1003,$this->error); }elseif ($data[OptionsCenter::$fieldBillMoney] != $data[OptionsCenter::$fieldPayMoney]){ if ($data[OptionsCenter::$fieldBillMoney]> $data[OptionsCenter::$fieldPayMoney]){ if (!$this->checkArrayValueEmpty($data,[ OptionsCenter::$fieldDebtType]) || $data[ OptionsCenter::$fieldDebtType] !=2 ){ $this->addError("付款金額小于訂單金額時,缺失拒付類型正確參數"); return ShowCode::jsonCodeWithoutData(1003,$this->error); } }elseif ($data[OptionsCenter::$fieldBillMoney] < $data[OptionsCenter::$fieldPayMoney]){ $this->addError("付款金額不可以大于訂單金額"); return ShowCode::jsonCodeWithoutData(1003,$this->error); } } //流水號信息驗證 if ( ! isset($data[OptionsCenter::$fieldSerialNum]) || empty($data[OptionsCenter::$fieldSerialNum]) ){ $this->addError("信息中缺失必要的停車序號信息"); return ShowCode::jsonCodeWithoutData(1003,$this->error); } if (!AuthCenter::existParkSerialBySerialId($data[OptionsCenter::$fieldSerialNum])){ $this->addError("信息中的序號信息不正確"); return ShowCode::jsonCodeWithoutData(1003,$this->error); }; $carSerialCenter = CarSerialCenter::instance($data[OptionsCenter::$fieldSerialNum]); $parkingInfo = $carSerialCenter->getParkingInfo($this->options); if ($parkingInfo[OptionsCenter::$fieldBillNum] != $data[OptionsCenter::$fieldBillNum]){ $this->addError("你的Bill單號已經過期,請使用最新的Bill號"); return ShowCode::jsonCodeWithoutData(1003,$this->error); } //檢測流水訂單狀態 if (!$this->checkParkSerialBillState($parkingInfo)){ return ShowCode::jsonCodeWithoutData(1003,$this->error); } //判斷賬單是否有5分鐘內的結清賬單 if ($this->checkBillPayState($parkingInfo)){ return ShowCode::jsonCode(1099,[OptionsCenter::$fieldSerialNum=>$data[OptionsCenter::$fieldSerialNum]]); } $endTime = $billCenter->getInfoFieldValue(OptionsCenter::$fieldEndTime); //附加上收費員信息和日報ID $data[OptionsCenter::$idCharge] = $this->chargeId; $data[OptionsCenter::$idDocument] = $this->terminalId; if ($data[OptionsCenter::$fieldBillMoney] == $data[OptionsCenter::$fieldPayMoney] ){ $status = 2; }elseif($data[OptionsCenter::$fieldBillMoney] > $data[OptionsCenter::$fieldPayMoney]){ $status = 1; }else{ $status = 0; } //獲取已經付款金額 $alreadyPayMoney = $this->getAlreadyPayMoney($parkingInfo); if ($alreadyPayMoney>0){ } $billData =[ OptionsCenter::$fieldBillNum=>$data[OptionsCenter::$fieldBillNum], OptionsCenter::$fieldPayMoney => $data[OptionsCenter::$fieldPayMoney], OptionsCenter::$fieldBillTime =>$this->getTime($endTime), OptionsCenter::$fieldBillStatus =>$status , ]; $serialData= [ OptionsCenter::$prefixEnd . OptionsCenter::$idCharge => $this->chargeId, OptionsCenter::$prefixEnd . OptionsCenter::$nameCharge => $this->chargeName, OptionsCenter::$prefixEnd . OptionsCenter::$idTerminal => $this->terminalId, OptionsCenter::$fieldParkMoney => $data[OptionsCenter::$fieldParkMoney] , //總付款金額 OptionsCenter::$fieldPayMoney => $alreadyPayMoney+$data[OptionsCenter::$fieldPayMoney], OptionsCenter::$fieldPayStatus => $status , //已結清費用2 部分為1 OptionsCenter::$fieldEndTime => $this->getTime($endTime), OptionsCenter::$fieldCompleteTime => time(), OptionsCenter::$stringStatus => 2, ]; switch (true){ //全款結賬賬單 case($status==2): if ( !$carSerialCenter->completeBillSerialByAllCash($data,$serialData,$billData)){ return ShowCode::jsonCode(1008,"存儲停車信息失敗"); } //處理報表信息 DocumentInfoCenter::instance($this->documentId)->updateDocumentByParkSerialNum($data[OptionsCenter::$fieldSerialNum]); //清除泊位信息 if ($this->checkArrayValueEmpty($parkingInfo,OptionsCenter::$idPlace)){ $this->clearPlaceParkInfo($parkingInfo[OptionsCenter::$idPlace],$data[OptionsCenter::$fieldSerialNum]); } return ShowCode::jsonCode(1001, $carSerialCenter->getParkingInfo(),"",[OptionsCenter::$stringVersion=>ParkInfoCenter::instance($this->parkId)->updateVersion()]); break; //拒付部分訂單 case($status==1): if ( !$carSerialCenter->completeBillSerialByPartCash($data,$serialData,$billData)){ return ShowCode::jsonCode(1008,"存儲停車信息失敗"); } //處理報表信息 DocumentInfoCenter::instance($this->documentId)->updateDocumentByParkSerialNum($data[OptionsCenter::$fieldSerialNum]); //清除泊位信息 if ($this->checkArrayValueEmpty($parkingInfo,OptionsCenter::$idPlace)){ $this->clearPlaceParkInfo($parkingInfo[OptionsCenter::$idPlace],$data[OptionsCenter::$fieldSerialNum]); } return ShowCode::jsonCode(1001, $carSerialCenter->getParkingInfo(),"",[OptionsCenter::$stringVersion=>ParkInfoCenter::instance($this->parkId)->updateVersion()]); break; } return ShowCode::jsonCode(1008,"你不應該看到這個"); } ~~~ ### 數據邏輯處理 ~~~ /** * @description * @author Mikkle */ public function completeBillSerialByPartCash($data, $serialData, $billData){ //獲取當前的收費員的帳號余額和版本號 $chargeAmount = Db::table(OptionsCenter::$tableCharge) ->where([OptionsCenter::$pk =>$data[OptionsCenter::$idCharge]]) ->field([OptionsCenter::$stringAmount,OptionsCenter::$prefixAmount.OptionsCenter::$stringVersion])->find(); if (!is_numeric($chargeAmount[OptionsCenter::$stringAmount]) || !is_numeric($chargeAmount[OptionsCenter::$prefixAmount.OptionsCenter::$stringVersion]) ){ throw new Exception("收費員的余款數據不正確"); } $amount = (int)$chargeAmount[OptionsCenter::$stringAmount]; $newAmount = $amount-(int)$data[OptionsCenter::$fieldPayMoney]; $version = (int)$chargeAmount[OptionsCenter::$prefixAmount.OptionsCenter::$stringVersion]; //收費員賬戶流水表信息 $chargePriceDate = [ OptionsCenter::$fieldBillNum=>$data[OptionsCenter::$fieldBillNum], OptionsCenter::$stringType=>2, //金額的類型 (1為 充值 2為扣除) OptionsCenter::$stringMode=>2 , //充值方式(1 人工充值或扣除) 2 現金繳款扣除 OptionsCenter::$stringDesc=>"停車單:{$data[OptionsCenter::$fieldBillNum]}扣款", OptionsCenter::$stringPrice => $data[OptionsCenter::$fieldPayMoney], OptionsCenter::$stringAmount => $newAmount, ]; $serialInfo = $this->getInfoList(); //設置拒付信息 $debtData=[ OptionsCenter::$fieldDebtNum=>RandNumCenter::createDebtSerialNumber(), //欠費流水號 OptionsCenter::$fieldSerialNum=> $serialInfo[OptionsCenter::$fieldSerialNum], //停車流水號 OptionsCenter::$fieldCarCode=>$serialInfo[OptionsCenter::$fieldCarCode], OptionsCenter::$idPark=>$serialInfo[OptionsCenter::$idPark], OptionsCenter::$namePark=>$serialInfo[OptionsCenter::$namePark], OptionsCenter::$fieldDebtType=>2, //拒繳部分 OptionsCenter::$fieldStartTime=>$serialInfo[OptionsCenter::$fieldStartTime], OptionsCenter::$prefixStart.OptionsCenter::$idCharge=>$serialInfo[OptionsCenter::$prefixStart.OptionsCenter::$idCharge], OptionsCenter::$prefixStart.OptionsCenter::$nameCharge=>$serialInfo[OptionsCenter::$prefixStart.OptionsCenter::$nameCharge], OptionsCenter::$fieldEndTime=>$serialData[OptionsCenter::$fieldEndTime], OptionsCenter::$prefixEnd.OptionsCenter::$idCharge => $serialData[OptionsCenter::$prefixEnd.OptionsCenter::$idCharge], OptionsCenter::$prefixEnd.OptionsCenter::$nameCharge => $serialData[OptionsCenter::$prefixEnd.OptionsCenter::$nameCharge], OptionsCenter::$stringStatus=>1, OptionsCenter::$fieldCreateTime=>time(), OptionsCenter::$fieldParkMoney=>$serialData[OptionsCenter::$fieldParkMoney], OptionsCenter::$fieldPayMoney=>$serialData[OptionsCenter::$fieldPayMoney], OptionsCenter::$fieldDebtMoney => (int)($serialData[OptionsCenter::$fieldParkMoney] - $serialData[OptionsCenter::$fieldPayMoney]) , ]; //設置付款信息 $payDate=[ OptionsCenter::$fieldPayNum=>RandNumCenter::createPaySerialNumber(), OptionsCenter::$fieldBillNum=>$data[OptionsCenter::$fieldBillNum], OptionsCenter::$fieldSerialNum=>$this->infoId, OptionsCenter::$idPark=>$serialData[OptionsCenter::$idPark], OptionsCenter::$fieldPayType=>1, OptionsCenter::$fieldPayMoney=>$data[OptionsCenter::$fieldPayMoney], OptionsCenter::$fieldPayTime=>RandNumCenter::getTimeString(), OptionsCenter::$fieldCreateTime=>time(), OptionsCenter::$stringStatus=>1, ]; try{ //多表處理 開啟事務 Db::startTrans(); //升級收費員余額 加入了樂觀鎖判斷 if (!Db::table(OptionsCenter::$tableCharge) ->where([OptionsCenter::$pk=>$data[OptionsCenter::$idCharge],OptionsCenter::$prefixAmount.OptionsCenter::$stringVersion =>$version ]) ->update([OptionsCenter::$stringAmount=>$newAmount,OptionsCenter::$prefixAmount.OptionsCenter::$stringVersion=>$version+1]) ){ throw new Exception("操作員的余額信息已經變動,請重試"); } //插入欠費信息 if (!Db::table(OptionsCenter::$tableParkInfoDebt)->insert($debtData)){ throw new Exception("插入欠費信息失敗"); } //插入付款流水信息 if (!Db::table(OptionsCenter::$tableParkInfoPay)->insert($payDate)){ throw new Exception("插入付款流水信息失敗"); } //插入金額流水信息 if (!Db::table(OptionsCenter::$tableChargePrice)->insert($chargePriceDate)){ throw new Exception("插入金額流水信息失敗"); } if (!Db::table(OptionsCenter::$tableParkInfoTemp)->where([OptionsCenter::$fieldSerialNum=>$this->infoId])->update($serialData)){ throw new Exception("保存訂單流水信息失敗"); } if (!Db::table(OptionsCenter::$tableParkInfoBill)->where([OptionsCenter::$fieldBillNum=>$data[OptionsCenter::$fieldBillNum]])->update($billData)){ throw new Exception("完成賬單信息失敗"); } $this->updateAllBillBySerialNumToComplete(); //更新流水信息 $this->setInfoArray($serialData); //更新賬單信息 BillInfoCenter::instance($data[OptionsCenter::$fieldBillNum])->setInfoArray($billData); //設置7天 自動釋放redis內存 BillInfoCenter::instance($data[OptionsCenter::$fieldBillNum])->setExpire(3600*24*7); //更新帳號余額 ChargeInfoCenter::instance($data[OptionsCenter::$idCharge])->refreshChargeAmount($newAmount); //處理泊位信息 $this->setExpire(3600*24*7); Db::commit(); return true; }catch (Exception $e){ Log::error($e->getMessage()); dump($e); Db::rollback(); return false; } } ~~~ 感謝大家關注 交流請加QQ群 321449759 ![](https://box.kancloud.cn/3499008a08e64306c68873288092a057_286x340.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看