['canDec', 'notFull']], ]; } public function attributeLabels() { return [ 'data' => '数据', ]; } /** * 指定场景 * @return array */ public function scenarios() { $parentScenarios = parent::scenarios(); $customScenarios = [ 'userDec' => ['data'], 'canDec' => ['data'], 'notFull' => ['data'], ]; return array_merge($parentScenarios, $customScenarios); } /** * 格式化提交的数据 * @param $attribute */ public function formatData($attribute){ //$this->data = Json::decode($this->data); if(!is_array($this->data)){ $this->addError($attribute, '数据格式错误'); } } /** * 循环校验数据是否合格 * @param $attribute */ public function isData($attribute){ $model = new DeclarationForm(); $model->scenario = $this->scenario; $model->allData = $this->data; foreach ($this->data as $value){ if(is_array($value)){ foreach($value as $key=>$decFormData){ $model->$key = $decFormData; } if(!$model->validate()){ $this->addErrors($model->getErrors()); } $model->type = null; $model->decSn = null; $model->userId = null; $model->toUserId = null; $model->decPv = null; $model->insertUserName = null; $model->insertUserIdCard = null; $model->conUserName = null; $model->recUserName = null; $model->location = null; } else { $this->addError($attribute, '报单数据格式错误'); } } } /** * 报单 * @return bool * @throws \yii\db\Exception */ public function add(){ $startTime = microtime(true); if(!$this->validate()){ return null; } $db = \Yii::$app->db; $transaction = $db->beginTransaction(); try{ // 所有的首购单会员ID以备点位绑定使用 $allZcUserIds = []; $zcUserIdCard = null; $model = new DeclarationForm(); $model->scenario = $this->scenario; $model->allData = $this->data; foreach ($this->data as $value){ /** * 2022-04-29 * York * 获取商品套餐信息 */ if (isset($value['packageId']) && $value['packageId']){ $packagedata = DeclarationPackage::findOneAsArray('ID=:ID', [':ID' => $value['packageId']]); //var_dump($packagedata['ID']); if($packagedata['STORE_NUMS']>0){ $data = DeclarationPackage::find()->where(['ID'=> $packagedata['ID'] ])->one(); $goods_store_nums = $data->STORE_NUMS - 1; $data->STORE_NUMS = $goods_store_nums; $data->update(); // var_dump('输出一下数量'); // var_dump($goods_store_nums); //库存为0下架套餐 if ($goods_store_nums <= 0){ $data->STATUS = 0; $data->UPDATED_AT = Date::nowTime(); // var_dump('购买后套餐库存为0 下架拉'); } }else{ throw new Exception($packagedata['PACKAGE_NAME'].'库存不足'); } } if (count($value['goodsId']) > 0 && (count($value['goodsId']) == count($value['goodsNum']))){ for ($i=0;$i $value['goodsId'][$i]]); if ($goods['STATUS'] == 1 ){ if($goods['STORE_NUMS'] >= $value['goodsNum'][$i]){ $data = ShopGoods::find()->where(['ID' => $value['goodsId'][$i]])->one(); $goods_store_nums = $data->STORE_NUMS - $value['goodsNum'][$i]; $data->STORE_NUMS = $goods_store_nums; $data->update(); if($goods_store_nums <= 0){ $data->STATUS = 0; $data->UPDATED_AT = Date::nowTime(); $data->update(); } }else{ throw new Exception($goods['GOODS_NAME'].'商品库存不足'); } }else{ throw new Exception($goods['GOODS_NAME'].'商品已下架'); } } } if(is_array($value)){ foreach($value as $key=>$decFormData){ $model->$key = $decFormData; } // 把首购单的几个会员归集到一个数组里,将来绑定到一起 if( $model->type == 'ZC'){ $allZcUserIds[] = null; if($zcUserIdCard != null){ if($model->insertUserIdCard != $zcUserIdCard){ throw new Exception('批量报单会员必须是同一身份证'); } } else { $zcUserIdCard = $model->insertUserIdCard; } } if(!$model->add($this->data)){ throw new Exception(Form::formatErrorsForApi($model->getErrors())); } // $model->type = null; // $model->decSn = null; // $model->userId = null; // $model->toUserId = null; // $model->decPv = null; // $model->insertUserName = null; // $model->insertUserIdCard = null; // $model->conUserName = null; // $model->recUserName = null; // $model->location = null; } else { throw new Exception('报单数据格式错误'); } } // 把这几个首购单的注册用户点位绑定到一起 // UserBind::zcBind($allZcUserIds, $zcUserIdCard); // if((microtime(true) - $startTime) >= 20) { // throw new Exception('服务端报单超时'); // } $transaction->commit(); } catch (\Exception $e){ $transaction->rollBack(); $this->addError('add', $e->getMessage()); return null; } return true; } /** * RPC服务校验数据 * @param $data * @return array */ public static function rpcIsData($data){ $result = [ 'error' => false, 'message' => '数据可报单', ]; $formModel = new self(); $formModel->scenario = 'canDec'; $formModel->data = $data; if(!$formModel->validate()){ $result['error'] = true; $result['message'] = Form::formatErrorsForApi($formModel->getErrors()); } return $result; } }