store_id; $name = trim($this->name); $is_show = $this->is_show; $start_time = $this->start_time; $end_time = $this->end_time; $query = MdCategory::find()->where(['is_delete' => 0, 'store_id' => $store_id]); if ($name) { $query->andWhere(['LIKE', 'name', $name]); } if (isset($is_show) && in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) { $query->andWhere(['is_show' => $is_show]); } if ($start_time) { $query->andWhere(['>=', 'created_at', strtotime($start_time)]); } if ($end_time) { $query->andWhere(['<=', 'created_at', strtotime($end_time)]); } $query->orderBy('sort DESC')->select('id, name, sort, is_show, created_at'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $item['is_show'] = intval($item['is_show']); $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); } return [ 'code' => 0, 'msg' => '', 'data' => $list ]; } /** * 保存 */ public function save() { try { $id = $this->id; $store_id = $this->store_id; $sort = $this->sort; $is_show = $this->is_show; $name = trim($this->name); if (empty($name)) { throw new \Exception('分类名称不能为空'); } if (!in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) { throw new \Exception('状态枚举值错误'); } $mdCategory = MdCategory::findOne(['id' => $id, 'is_delete' => 0]); if (!$mdCategory) { $mdCategory = new MdCategory(); $mdCategory->store_id = $store_id; } $mdCategory->sort = $sort ?: 0; $mdCategory->is_show = $is_show; $mdCategory->name = $name; if (!$mdCategory->save()) { throw new \Exception(implode(';', array_values($mdCategory->firstErrors))); } return [ 'code' => 0, 'msg' => '保存成功' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } /** * 删除 */ public function del() { try { $id_arr = $this->ids; // $id_arr = explode(',', $ids); foreach ($id_arr as $item) { $mdCategory = MdCategory::findOne(['id' => $item, 'is_delete' => 0]); if ($mdCategory) { $mdCategory->is_delete = 1; if (!$mdCategory->save()) { throw new \Exception(implode(';', array_values($mdCategory->firstErrors))); } } } return [ 'code' => 0, 'msg' => '处理成功' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } /** * 修改状态 */ public function setStatus() { try { $id_arr = $this->ids; $is_show = $this->is_show; if (!in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) { throw new \Exception('状态枚举值错误'); } // $id_arr = explode(',', $ids); foreach ($id_arr as $item) { $mdCategory = MdCategory::findOne(['id' => $item, 'is_delete' => 0]); if ($mdCategory) { $mdCategory->is_show = $is_show; if (!$mdCategory->save()) { throw new \Exception(implode(';', array_values($mdCategory->firstErrors))); } } } return [ 'code' => 0, 'msg' => '处理成功' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } /** * 获取门店分类数据 */ public function getMdCategoryData() { $store_id = $this->store_id; $name = $this->name; $is_show = $this->is_show; $id = $this->id; $start_time = $this->start_time; $end_time = $this->end_time; $trade_status = [ \app\models\Order::ORDER_FLOW_NO_SEND, \app\models\Order::ORDER_FLOW_SEND, \app\models\Order::ORDER_FLOW_CONFIRM ]; //排名 $md_table = \app\models\Md::tableName(); $md_category_table = \app\models\MdCategory::tableName(); $order_table = \app\models\Order::tableName(); $scan_order_table = \app\plugins\scanCodePay\models\Order::tableName(); $trade_status_str = implode(',', $trade_status); $sql = "select mc.id, SUM(m.total_price) as total_price from {$md_category_table} mc left join (select m.id, SUM(o.total_price) as total_price, m.cat_id from {$md_table} m left join ( select total_price, md_id from {$order_table} where trade_status in ({$trade_status_str}) UNION ALL select total_price, md_id from {$scan_order_table} where is_pay = 1) o on o.md_id = m.id GROUP BY o.md_id) as m on mc.id = m.cat_id where mc.is_delete = 0 and mc.store_id = {$store_id} group by mc.id "; $ranking_data = \Yii::$app->db->createCommand($sql)->queryAll(); $last_names = array_column($ranking_data,'total_price'); array_multisort($last_names, SORT_DESC, $ranking_data); foreach ($ranking_data as $ranking_index => &$ranking_item) { $ranking_item['num'] = $ranking_index + 1; } $md_category_id = array_column($ranking_data, 'id'); $query = MdCategory::find()->where([ 'is_delete' => 0, 'store_id' => $store_id ]); if ($name) { $query->andWhere(['LIKE', 'name', $name]); } if ($id) { $query->andWhere(['id' => $id]); } if (isset($is_show) && in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) { $query->andWhere(['is_show' => $is_show]); } if ($start_time) { $query->andWhere(['>=', 'created_at', strtotime($start_time)]); } if ($end_time) { $query->andWhere(['<=', 'created_at', strtotime($end_time)]); } $query->select('id, name, is_show, created_at'); if ($md_category_id) { $md_category_id = implode(',', $md_category_id); $query->orderBy([new \yii\db\Expression("FIELD(id, {$md_category_id})")]); } $list = pagination_make($query); foreach ($list['list'] as &$item) { $item['is_show'] = intval($item['is_show']); $md_id = Md::find()->where(['is_delete' => 0, 'cat_id' => $item['id']]) ->select('id')->column(); $item['md_count'] = count($md_id); $scan_order = \app\plugins\scanCodePay\models\Order::find() ->where(['is_pay' => 1, 'md_id' => $md_id])->select('id, total_price')->asArray()->all(); $scan_order_total_price = array_sum(array_column($scan_order, 'total_price')) ?: '0.00'; $order = \app\models\Order::find() ->where(['trade_status' => $trade_status, 'md_id' => $md_id])->select('id, total_price') ->asArray()->all(); $order_total_price = array_sum(array_column($order, 'total_price')) ?: '0.00'; $item['order_count'] = bcadd(count($scan_order), count($order)); $item['total_price'] = bcadd($scan_order_total_price, $order_total_price, 2); $ranking_ = array_values(array_filter($ranking_data, fn($ranking_value) => $ranking_value['id'] == $item['id'])); $item['num'] = count($ranking_) ? $ranking_[0]['num'] : 0; $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); } return [ 'code' => 0, 'msg' => '', 'data' => $list ]; } public function getMdCategoryDataDetail() { $store_id = $this->store_id; $id = $this->id; $name = trim($this->name); $trade_status = [ \app\models\Order::ORDER_FLOW_NO_SEND, \app\models\Order::ORDER_FLOW_SEND, \app\models\Order::ORDER_FLOW_CONFIRM ]; $query = Md::find()->where(['is_delete' => 0, 'store_id' => $store_id, 'cat_id' => $id]); if ($name) { $query->andWhere(['LIKE', 'name', $name]); } $query->select('id, name, cat_id, created_at')->orderBy('id DESC'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $scan_order = \app\plugins\scanCodePay\models\Order::find() ->where(['is_pay' => 1, 'md_id' => $item['id']])->select('id, total_price')->asArray()->all(); $scan_order_total_price = array_sum(array_column($scan_order, 'total_price')) ?: '0.00'; $order = \app\models\Order::find() ->where(['trade_status' => $trade_status, 'md_id' => $item['id']])->select('id, total_price') ->asArray()->all(); $order_total_price = array_sum(array_column($order, 'total_price')) ?: '0.00'; $item['order_count'] = bcadd(count($scan_order), count($order)); $item['total_price'] = bcadd($scan_order_total_price, $order_total_price, 2); $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); } return [ 'code' => 0, 'msg' => '', 'data' => $list ]; } }