'订单号', ]; } /** * 指定校验场景 * @return array */ public function scenarios() { $parentScenarios = parent::scenarios(); $customScenarios = []; return array_merge($parentScenarios, $customScenarios); } /** * @throws Exception */ public function returnOrder() { if(!$this->validate()){ return null; } $sn = $this->orderSn; // 获取订单详情 $orderInfo = BaOrder::findUseDbCalc() ->select('ID,DEC_SN,SN,USER_ID,ORDER_TYPE,IS_DELETE,PAY_AMOUNT,PAY_TYPE,ORDER_AMOUNT,USER_NAME,PV,PAY_PV,PERIOD_NUM,PROVINCE,CITY,COUNTY,ADDRESS,STATUS,NOTE') ->where("SN=:SN", [':SN' => $sn]) ->asArray() ->one(); $approachOrderInfo = []; // 如果是PayStack支付,订单是未支付状态,则去中间表查询,如果两个表都没有数据,订单不存在 if (!$orderInfo) { $approachOrderInfo = BaApproachOrder::findUseDbCalc() ->select('ID,DEC_SN,SN,USER_ID,ORDER_TYPE,IS_DELETE,PAY_AMOUNT,PAY_TYPE,ORDER_AMOUNT,USER_NAME,PV,PAY_PV,PERIOD_NUM,PROVINCE,CITY,COUNTY,ADDRESS,STATUS,NOTE') ->where("SN=:SN", [':SN' => $sn]) ->asArray() ->one(); } if (!$orderInfo && !$approachOrderInfo) { throw new Exception('Order does not exist');// 订单不存在 } $orderInfo = $orderInfo ?: $approachOrderInfo; // 如果会员已经是锁定状态了,删除订单的时候,是否还要退还金额 $db = \Yii::$app->db; $transaction = $db->beginTransaction(); try { $decInfo = []; $isLock = 0 ; // 是否锁定会员单 // 如果是注册订单,则删除订单并退还金额,然后再冻结用户 if ($orderInfo['ORDER_TYPE'] == 'ZC') { // 查询报单数据,因为如果是报单,则要退还给报单中心 if (!$approachOrderInfo) { $decInfo = BaDecOrder::findUseDbCalc() ->select('USER_ID,TO_USER_ID,DETAIL_TYPE,UPGRADE_TYPE,ORI_LV,UPGRADE_LV') ->where("ORDER_SN=:ORDER_SN", [':ORDER_SN' => $sn]) ->asArray() ->one(); // 删除报单 $delDecOrder = BaDecOrder::updateAll( ['IS_DEL'=>1, 'DELETED_AT'=>Date::nowTime()], 'ORDER_SN=:ORDER_SN', ['ORDER_SN'=>$sn] ); } else { $decInfo = BaApproachDecOrder::findUseDbCalc() ->select('USER_ID,TO_USER_ID,DETAIL_TYPE,UPGRADE_TYPE,ORI_LV,UPGRADE_LV') ->where("ORDER_SN=:ORDER_SN", [':ORDER_SN' => $sn]) ->asArray() ->one(); // 删除报单 $delDecOrder = BaApproachDecOrder::updateAll( ['IS_DEL'=>1, 'DELETED_AT'=>Date::nowTime()], 'ORDER_SN=:ORDER_SN', ['ORDER_SN'=>$sn] ); } if (!$delDecOrder) { $transaction->rollBack(); throw new Exception('删除报单失败,删除订单失败'); } // 支付成功才需要处理 if ($orderInfo['STATUS'] == \Yii::$app->params['orderStatus']['paid']['value']) { // 如果删除的是升级单,则需要回退用户的级别 if ($decInfo['DETAIL_TYPE'] == 2) { $oriLv = $decInfo['ORI_LV']; $userModel = BaUser::findOne(['ID' => $orderInfo['USER_ID']]); $userModel->DEC_LV = $oriLv; $userModel->UPDATED_AT = Date::nowTime(); if(!$userModel->save(false)) { $transaction->rollBack(); throw new Exception('回退会员级别失败,删除订单失败'); } } else { // 锁定用户 $userModel = User::findOne(['ID' => $orderInfo['USER_ID']]); $userModel->STATUS = 0; $userModel->STATUS_AT = Date::nowTime(); if(!$userModel->save(false)) { $transaction->rollBack(); throw new Exception('锁定会员失败,删除订单失败'); } $isLock = 1; } } } if (!$approachOrderInfo) { // 公共的退钱,删除订单操作 $delOrder = Order::updateAll( ['IS_DELETE' => 1, 'DELETED_AT' => Date::nowTime()], 'SN=:SN', ['SN' => $sn] ); } else { // 公共的退钱,删除订单操作 $delOrder = ApproachOrder::updateAll( ['IS_DELETE' => 1, 'DELETED_AT' => Date::nowTime()], 'SN=:SN', ['SN' => $sn] ); } if (!$delOrder) { $transaction->rollBack(); throw new Exception('删除订单失败'); } // 如果是PayStack支付,只处理支付成功的 $upgradeType = 0; // 升级单类型 $returnLv = ''; $oriLvs = ''; if (!empty($decInfo)) { $upgradeType = $decInfo['UPGRADE_TYPE']; $returnLv = $decInfo['ORI_LV']; $oriLvs = $decInfo['UPGRADE_LV']; } // 退款成功,记录数据信息 $periodObj = Period::instance(); $nowPeriodNum = $periodObj->getNowPeriodNum(); $returnOrderModel = new ReturnOrder(); $returnOrderModel->ID = SnowFake::instance()->generateId(); $returnOrderModel->SN = $sn; $returnOrderModel->DEC_SN = $orderInfo['DEC_SN']; $returnOrderModel->CREATE_AT = Date::nowTime(); $returnOrderModel->ORDER_TYPE = $orderInfo['ORDER_TYPE']; $returnOrderModel->ORDER_AMOUNT = $orderInfo['ORDER_AMOUNT']; $returnOrderModel->PV = $orderInfo['PV']; $returnOrderModel->PAY_PV = $orderInfo['PAY_PV']; $returnOrderModel->PAY_AMOUNT = $orderInfo['PAY_AMOUNT']; $returnOrderModel->PAY_TYPE = $orderInfo['PAY_TYPE']; $returnOrderModel->USER_ID = $orderInfo['USER_ID']; $returnOrderModel->PERIOD_NUM = $nowPeriodNum; $returnOrderModel->PAY_STATUS = $orderInfo['STATUS']; $returnOrderModel->PAY_NOTE = $orderInfo['NOTE']; $returnOrderModel->ORDER_PERIOD_NUM = $orderInfo['PERIOD_NUM']; $returnOrderModel->UPGRADE_TYPE = $upgradeType; $returnOrderModel->USER_NAME = $orderInfo['USER_NAME']; $returnOrderModel->PROVINCE = $orderInfo['PROVINCE']; $returnOrderModel->CITY = $orderInfo['CITY'] ?? 0; $returnOrderModel->COUNTY = $orderInfo['COUNTY'] ?? 0; $returnOrderModel->ADDRESS = $orderInfo['ADDRESS'] ?? ''; $returnOrderModel->ADMIN_ID = \Yii::$app->user->id; $returnOrderModel->ORI_CASH = 0; $returnOrderModel->ORI_BONUS = 0; $returnOrderModel->ORI_EXCHANGE_POINTS = 0; $returnOrderModel->ORI_RECONSUME_POINTS = 0; $returnOrderModel->ORI_DEC_LV = $oriLvs; $returnOrderModel->RETURN_DEC_LV = $returnLv; $returnOrderModel->IS_LOCKING = $isLock; if (!$returnOrderModel->save()) { $transaction->rollBack(); $this->addErrors($returnOrderModel->getErrors()); return false; } $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); $this->addError('add', $e->getMessage()); return null; } return true; } // 判断订单类型 public function checkOrderType($attribute) { $sn = $this->orderSn; $orderDetail = BaOrder::findUseDbCalc() ->select('ID,DEC_SN,USER_ID,ORDER_TYPE,IS_DELETE,PERIOD_NUM') ->where("SN=:SN", [':SN' => $sn]) ->asArray() ->one(); $approachOrderDetail = []; if (!$orderDetail) { $orderDetail = $approachOrderDetail = BaApproachOrder::findUseDbCalc() ->select('ID,DEC_SN,USER_ID,ORDER_TYPE,IS_DELETE,PERIOD_NUM') ->where("SN=:SN", [':SN' => $sn]) ->asArray() ->one(); } if (empty($orderDetail)) { $this->addError($attribute, '未找到订单信息,订单编号为:'.$this->orderSn); return ; } if ($orderDetail['IS_DELETE'] == 1) { $this->addError($attribute, '订单已被删除,订单编号为'.$this->orderSn); return ; } // 已挂网或者挂网中的业绩期订单,不能进行删除操作 $periodNum = $orderDetail['PERIOD_NUM']; $periodObj = Period::findOneAsArray(['PERIOD_NUM'=>$periodNum]); if (empty($periodObj)) { $this->addError($attribute, '订单对应业绩期不存在,订单编号为'.$this->orderSn.' 业绩期为:'.$periodNum); return ; } if ($periodObj['IS_SENT'] == 1) { $this->addError($attribute, '订单对应业绩期已挂网,订单编号为'.$this->orderSn.' 业绩期为:'.$periodNum); return ; } if ($periodObj['IS_SENDING'] == 1) { $this->addError($attribute, '订单对应业绩期正在挂网,订单编号为'.$this->orderSn.' 业绩期为:'.$periodNum); return ; } if ($orderDetail['ORDER_TYPE'] == 'ZC') { if (!$approachOrderDetail) { $decDetail = DecOrder::findUseDbCalc() ->select('TO_USER_ID,DETAIL_TYPE,UPGRADE_TYPE,IS_DEL') ->where("ORDER_SN=:ORDER_SN", [':ORDER_SN' => $sn]) ->asArray() ->one(); } else { $decDetail = ApproachDecOrder::findUseDbCalc() ->select('TO_USER_ID,DETAIL_TYPE,UPGRADE_TYPE,IS_DEL') ->where("ORDER_SN=:ORDER_SN", [':ORDER_SN' => $sn]) ->asArray() ->one(); } if (empty($decDetail)) { $this->addError($attribute, '未获取到对应报单信息,订单编号为:'.$this->orderSn); return ; } if ($decDetail['IS_DEL'] == 1) { $this->addError($attribute, '对应报单信息已被删除,订单编号为:'.$this->orderSn); return ; } if ($decDetail['DETAIL_TYPE'] == 2) { if (!$approachOrderDetail) { // 如果删除升级单,则此升级单必须是用户的最后一个升级单 $lastUpgradeOrder = DecOrder::findUseDbCalc() ->select('ORDER_SN') ->where("TO_USER_ID=:TO_USER_ID AND IS_DEL=0 AND DETAIL_TYPE=2", [':TO_USER_ID' => $decDetail['TO_USER_ID']]) ->orderBy('CREATED_AT DESC') ->asArray() ->one(); } else { // 如果删除升级单,则此升级单必须是用户的最后一个升级单 $lastUpgradeOrder = ApproachDecOrder::findUseDbCalc() ->select('ORDER_SN') ->where("TO_USER_ID=:TO_USER_ID AND IS_DEL=0 AND DETAIL_TYPE=2", [':TO_USER_ID' => $decDetail['TO_USER_ID']]) ->orderBy('CREATED_AT DESC') ->asArray() ->one(); } $lastUpgradeSn = $lastUpgradeOrder['ORDER_SN']; if ($sn != $lastUpgradeSn) { $this->addError($attribute, '有更晚的订单,此订单不能删除,订单编号为:'.$this->orderSn); return ; } } else { // 如果是注册单,但是这个用户存在升级单,则也不能进行删除 if (!$approachOrderDetail) { $hasUpgradeOrder = DecOrder::findUseDbCalc() ->select('TO_USER_ID,DETAIL_TYPE,UPGRADE_TYPE,IS_DEL') ->where("TO_USER_ID=:TO_USER_ID AND IS_DEL=0 AND DETAIL_TYPE=2", [':TO_USER_ID' => $decDetail['TO_USER_ID']]) ->asArray() ->one(); } else { $hasUpgradeOrder = ApproachDecOrder::findUseDbCalc() ->select('TO_USER_ID,DETAIL_TYPE,UPGRADE_TYPE,IS_DEL') ->where("TO_USER_ID=:TO_USER_ID AND IS_DEL=0 AND DETAIL_TYPE=2", [':TO_USER_ID' => $decDetail['TO_USER_ID']]) ->asArray() ->one(); } if (!empty($hasUpgradeOrder)) { $this->addError($attribute, '此注册报单,存在升级单,无法删除,订单编号为:'.$this->orderSn); return ; } if (!$approachOrderDetail) { // 删除注册单,判断是否有复消单,如果存在复消单,需要先删除复消单 $hasFxOrder = Order::findUseDbCalc() ->select('SN') ->where("USER_ID=:USER_ID AND IS_DELETE=0 AND ORDER_TYPE='FX'", [':USER_ID' => $decDetail['TO_USER_ID']]) ->asArray() ->one(); } else { // 删除注册单,判断是否有复消单,如果存在复消单,需要先删除复消单 $hasFxOrder = ApproachOrder::findUseDbCalc() ->select('SN') ->where("USER_ID=:USER_ID AND IS_DELETE=0 AND ORDER_TYPE='FX'", [':USER_ID' => $decDetail['TO_USER_ID']]) ->asArray() ->one(); } if (!empty($hasFxOrder)) { $this->addError($attribute, '此注册报单,存在复消单,无法删除,订单编号为:'.$this->orderSn); return ; } } } return true; } }