| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- <?php
- namespace app\modules\admin\models;
- use app\models\Md;
- use app\models\MdCategory;
- use yii\base\Model;
- class MdCategoryForm extends Model
- {
- public $store_id;
- public $name;
- public $sort;
- public $is_show;
- public $id;
- public $ids;
- public $start_time;
- public $end_time;
- public function rules()
- {
- return [
- [['id', 'store_id', 'is_show', 'sort'], 'integer'],
- [['name', 'start_time', 'end_time'], 'string'],
- [['name'], 'trim'],
- [['ids'], 'safe']
- ];
- }
- /**
- * 门店分类列表
- */
- public function list() {
- $store_id = $this->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
- ];
- }
- }
|