/** * Загружает ряды в класс по идентификатору котировки * * @param int $stockId идентификатор котировки * @param int $type тип сравнения (1 - красный, 2 - синий) * @param array $dateRange периуд для расчета * ```php * [ * 'min' => 'yyyy-mm-dd' * 'max' => 'yyyy-mm-dd' * ] * ``` * * @return static * @throws \cs\web\Exception */ public static function initStock($stockId, $type, $dateRange = null) { $where = null; if ($dateRange) { $where = ['between', 'date', $dateRange['min'], $dateRange['max']]; } $kurs = StockKurs::query(['stock_id' => $stockId])->select(['`date`, `kurs` as `value`'])->orderBy(['date' => SORT_ASC]); if ($where) { $kurs->where($where); } $kurs = $kurs->all(); $class = null; switch ($type) { case 1: $rows = StockPrognosisRed::query(['stock_id' => $stockId])->select(['`date`, `delta` as `value`'])->orderBy(['date' => SORT_ASC]); if ($where) { $rows->where($where); } $class = \app\service\CalculatingProbability::initRows($kurs, $rows->all()); break; case 2: $rows = StockPrognosisBlue::query(['stock_id' => $stockId])->select(['`date`, `delta` as `value`'])->orderBy(['date' => SORT_ASC]); if ($where) { $rows->where($where); } $class = \app\service\CalculatingProbability::initRows($kurs, $rows->all()); break; default: throw new \cs\web\Exception('Не верный тип $dateRange'); } return $class; }
/** * Импортирует данные * * @return boolean */ public function import($stock_id) { if ($this->validate()) { // выбираю уже имеющиеся данные $dataArray = StockPrognosisRed::query(['stock_id' => $stock_id])->select('date')->column(); $rows = $this->get('fileRed', $stock_id, $dataArray); if (count($rows['insert']) > 0) { StockPrognosisRed::batchInsert(['stock_id', 'date', 'delta'], $rows['insert']); } if ($this->isReplaceExisting) { foreach ($rows['update'] as $date => $kurs) { (new Query())->createCommand()->update(StockPrognosisRed::TABLE, ['delta' => $kurs], ['date' => $date, 'stock_id' => $stock_id])->execute(); } } // выбираю уже имеющиеся данные $dataArray = StockPrognosisBlue::query(['stock_id' => $stock_id])->select('date')->column(); $rows = $this->get('fileBlue', $stock_id, $dataArray); if (count($rows['insert']) > 0) { StockPrognosisBlue::batchInsert(['stock_id', 'date', 'delta'], $rows['insert']); } if ($this->isReplaceExisting) { foreach ($rows['update'] as $date => $kurs) { (new Query())->createCommand()->update(StockPrognosisBlue::TABLE, ['delta' => $kurs], ['date' => $date, 'stock_id' => $stock_id])->execute(); } } return true; } else { return false; } }
public function actionIndex() { $items = Stock::query()->all(); $red = StockPrognosisRed::query()->select(['stock_id', 'MIN(`date`) as min', 'MAX(`date`) as max'])->groupBy('stock_id')->all(); $blue = StockPrognosisBlue::query()->select(['stock_id', 'MIN(`date`) as min', 'MAX(`date`) as max'])->groupBy('stock_id')->all(); $kurs = StockKurs::query()->select(['stock_id', 'MIN(`date`) as min', 'MAX(`date`) as max'])->groupBy('stock_id')->all(); return $this->render(['items' => $items, 'red' => $red, 'blue' => $blue, 'kurs' => $kurs]); }
/** * Рисует графики с прошлым и будущим * * @param int $id идентификатор курса * * @return string */ public function actionStock_item3($id) { $item = \app\models\Stock::find($id); $start = (new \DateTime())->sub(new \DateInterval('P31D')); $end = (new \DateTime())->sub(new \DateInterval('P1D')); $isPaid = Yii::$app->user->identity->isPaid($id); $defaultParams = ['start' => $start, 'end' => $end, 'formatX' => 'd.m']; $params = ArrayHelper::merge($defaultParams, ['rows' => [\app\models\StockKurs::query(['stock_id' => $id])->andWhere(['between', 'date', $start->format('Y-m-d'), $end->format('Y-m-d')])->all()]]); $lineArrayKurs = \app\service\GraphExporter::convert($params); $params = ArrayHelper::merge($defaultParams, ['rows' => [\app\models\StockPrognosisRed::query(['stock_id' => $id])->andWhere(['between', 'date', $start->format('Y-m-d'), $end->format('Y-m-d')])->select(['date', 'delta as kurs'])->all()]]); $lineArrayRed = \app\service\GraphExporter::convert($params); $params = ArrayHelper::merge($defaultParams, ['rows' => [\app\models\StockPrognosisBlue::query(['stock_id' => $id])->andWhere(['between', 'date', $start->format('Y-m-d'), $end->format('Y-m-d')])->select(['date', 'delta as kurs'])->all()]]); $lineArrayBlue = \app\service\GraphExporter::convert($params); $lineArrayPast = \app\service\GraphUnion::convert(['x' => $lineArrayRed['x'], 'y' => [$lineArrayKurs['y'][0], $lineArrayRed['y'][0], $lineArrayBlue['y'][0]]]); if ($isPaid) { $start = new \DateTime(); $end = (new \DateTime())->add(new \DateInterval('P30D')); $defaultParams = ['start' => $start, 'end' => $end]; $params = ArrayHelper::merge($defaultParams, ['rows' => [\app\models\StockPrognosisRed::query(['stock_id' => $id])->andWhere(['between', 'date', $start->format('Y-m-d'), $end->format('Y-m-d')])->select(['date', 'delta as kurs'])->all()]]); $lineArrayRed = \app\service\GraphExporter::convert($params); $params = ArrayHelper::merge($defaultParams, ['rows' => [\app\models\StockPrognosisBlue::query(['stock_id' => $id])->andWhere(['between', 'date', $start->format('Y-m-d'), $end->format('Y-m-d')])->select(['date', 'delta as kurs'])->all()]]); $lineArrayBlue = \app\service\GraphExporter::convert($params); $lineArrayFuture = \app\service\GraphUnion::convert(['x' => $lineArrayRed['x'], 'y' => [$lineArrayRed['y'][0], $lineArrayBlue['y'][0]]]); } else { $lineArrayFuture = null; } return $this->render(['item' => $item, 'lineArrayPast' => $lineArrayPast, 'lineArrayFuture' => $lineArrayFuture, 'isPaid' => $isPaid]); }