45], [['pic', 'big_pic', 'advert_pic', 'advert_url'], 'string', 'max' => 255], [['advert_open_type'], 'string', 'max' => 65], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => 'Mall ID', 'store_id' => 'Store ID', 'cate_id' => '主商城分类id', 'parent_id' => '父级ID', 'name' => '分类名称', 'pic' => 'Pic', 'big_pic' => 'Big Pic', 'advert_pic' => '广告图片', 'advert_url' => '广告链接', 'advert_open_type' => '打开方式', 'advert_params' => '导航参数', 'is_show' => '是否显示', 'status' => '状态[0禁用 1启用 -1删除]', 'sort' => '排序', 'mall_goods_cate_id' => '关联主商城商品分类ID', 'created_at' => '创建时间', 'updated_at' => '修改时间', ]; } // 关联模型 public function getParent() { return $this->hasOne(self::class, ['id' => 'parent_id'])->andWhere(['<>', 'status', StatusEnum::DELETE]); } public function getChild() { return $this->hasMany(self::class, ['parent_id' => 'id'])->andWhere(['<>', 'status', StatusEnum::DELETE])->orderBy(['sort' => SORT_ASC, 'created_at' => SORT_DESC]); } // 分类关系 public function getStoreGoodsCateRelate() { return $this->hasMany(StoreGoodsCateRelate::class, ['cate_id' => 'id']); } // 分类 public function getGoods() { return $this->hasMany(StoreGoods::class, ['id' => 'goods_id']) ->via('storeGoodsCateRelate'); } // public function getGoodsRecommend() // { // return $this->hasMany(StoreGoodsRecommend::class, ['id' => 'goods_id']) // ->via('storeGoodsCateRelate'); // } public static function setData(array $params) { try { if (!empty($params['id'])) { $model = self::findOne(['and', ['id' => $params['id']], ['mall_id' => $params['mall_id']], ['<>', 'status', StatusEnum::DELETE]]); if (empty($model)) throw new \Exception('分类不存在或已删除'); } else { $model = new self(); $model->loadDefaultValues(); $model->mall_id = $params['mall_id']; $model->store_id = $params['store_id']; $model->parent_id = $params['parent_id'] ?? 0; } isset($params['advert_params']) && $params['advert_params'] = json_encode($params['advert_params']); if ($model->parent_id == 0) { //上级分类不存在则为层级1 $model->level = 1; } else { //查找上级分类数据 $goods_cate_data = self::findOne(['and', ['id' => $model->parent_id, 'mall_id' => $params['mall_id']], ['<>', 'status', StatusEnum::DELETE]]); if (!empty($goods_cate_data)) $model->level = $goods_cate_data['level'] + 1; } if (!$model->load($params, '') || !$model->save()) { throw new \Exception($model->getErrorMessage()); } return $model; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } public static function insertDataForName(array $data) { $model = self::findOne(['mall_id' => $data['mall_id'], 'store_id' => $data['store_id'], 'parent_id' => $data['parent_id'], 'name' => $data['name'], 'status' => StatusEnum::ENABLED]); if (!empty($model)) return $model; $model = new self(); $model->loadDefaultValues(); if (!$model->load($data, '') || !$model->save()) { throw new \Exception($model->getErrorMessage()); } return $model; } public static function insertDataForMallCateID(array $data) { $model = self::findOne(['mall_id' => $data['mall_id'], 'store_id' => $data['store_id'], 'parent_id' => $data['parent_id'], 'mall_goods_cate_id' => $data['mall_goods_cate_id'], 'status' => StatusEnum::ENABLED]); if (!empty($model)) return $model; $model = new self(); $model->loadDefaultValues(); if (!$model->load($data, '') || !$model->save()) { throw new \Exception($model->getErrorMessage()); } return $model; } /** * 获取分类列表 * @Author bing * @DateTime 2021-08-26 13:00:11 * @copyright: Copyright (c) 2020 广东七件事集团 * @param array $cond * @param array $with * @param integer $is_array * @return array|null */ public static function getCates(array $cond = [], array $with = [], bool $is_array = true, string $select = '*') { $default_cond = [['<>', 'status', StatusEnum::DELETE]]; $cond = array_merge($default_cond, $cond); $query = self::find()->select($select); self::paramPack(['where' => $cond, 'with' => $with], $query); $cates = $query->asArray($is_array)->all(); return $cates; } /** * 获取树状分类 * @Author bing * @DateTime 2021-08-26 13:00:40 * @copyright: Copyright (c) 2020 广东七件事集团 * @param array $cates * @param integer $parent_id * @return void */ public static function getTreeCate(array $cates, int $parent_id = 0) { $tree = []; foreach ($cates as $k => $v) { $v['value'] = $v['id']; $v['label'] = $v['name']; if ($v['parent_id'] == $parent_id) { $tmp = $v; // 当前路由的菜单被选中 $children = self::getTreeCate($cates, $v['id']); $children && $tmp['children'] = $children; $tree[] = $tmp; } } return $tree; } /** * 排序 * @Author bing * @DateTime 2021-11-12 10:16:01 * @copyright: Copyright (c) 2020 广东七件事集团 * @param array $post * @return bool */ public static function sort(array $post) { try { $first_list = json_decode($post['first_list'], true); $second_list = json_decode($post['second_list'], true); $third_list = json_decode($post['third_list'], true); $t = \Yii::$app->db->beginTransaction(); self::_saveSort($first_list); self::_saveSort($second_list); self::_saveSort($third_list); $t->commit(); return true; } catch (\Exception $e) { self::setStaticError($e->getMessage()); return false; } } /** * 保存分类 * @Author bing * @DateTime 2021-11-12 10:18:43 * @copyright: Copyright (c) 2020 广东七件事集团 * @param [type] $sort_cates * @return void */ private static function _saveSort($sort_cates) { foreach ($sort_cates as $index => $cate) { $model = self::findOne($cate['id']); if (!$model) throw new \Exception('分类不存在'); $model->sort = $index; $res = $model->save(); if (!$res) throw new \Exception($model->getErrorMessage()); } } public static function getRecommendGoodCateListInDiy(int $mall_id, array $params) { $wheres[] = [ 'sc.mall_id' => $mall_id, // 'sc.parent_id' => 0, 'sc.status' => StatusEnum::ENABLED, 'sc.is_show' => StatusEnum::ENABLED, 's.status' => StatusEnum::ENABLED, 's.check_status' => StoreEnum::CHECK_ADOPT ]; $wheres[] = ['>', 'sc.store_id', 0]; if (!empty($params['keyword'])) { $wheres[] = ['like', 'sc.name', $params['keyword']]; } if (!empty($params['store_id'])) { $wheres[] = ['=', 'sc.store_id', $params['store_id']]; } //商品分类层级 if (!empty($params['level'])) $wheres[] = ['sc.level' => $params['level']]; $params = [ 'alias' => 'sc', 'select' => 'sc.*,s.store_name ', 'join' => [ ['INNER JOIN', Store::tableName() . ' as s', 'sc.store_id = s.id'], ], 'where' => $wheres, 'order' => 'sc.sort asc,sc.created_at desc', 'page' => $params['page'] ?? 1, 'limit' => $params['limit'] ?? 15, ]; $list = StoreGoodsCate::listPage($params); if (false === $list) { return self::$static_error; } foreach ($list['list'] as &$lv) { $lv['title'] = $lv['name']; switch ($lv['level']) { case 1: $lv['level_name'] = '一级分类'; break; case 2: $lv['level_name'] = '二级分类'; break; case 3: $lv['level_name'] = '三级分类'; break; } } return $list; } public static function getAllCate($mallId, $store_id = null, $cateIds = [], &$cate_ids = []) { // 获取分类 $cate_ids[] = implode(',', $cateIds); $where = ['mall_id' => $mallId, 'parent_id' => $cateIds, 'is_show' => StatusEnum::ENABLED, 'status' => StatusEnum::ENABLED]; if ($store_id) { $where['store_id'] = $store_id; } $child_cates = self::find()->select('id,')->where($where)->column(); if ($child_cates) { self::getAllCate($mallId, $store_id, $child_cates, $cate_ids); } return explode(',', implode(',', $cate_ids)); } /** * 根据门店分类获取次分类门店下商品分类 * @param $mall_id * @param $cate_id * @return array */ public static function getStoreGoodsAllCate($mall_id, $cate_id): array { if (empty($mall_id) || empty($cate_id)) return []; $cate_id = explode(',', $cate_id); $store_id = Store::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'check_status' => StatusEnum::ENABLED]) ->andWhere(['c_id' => $cate_id]) ->select('id') ->column(); return self::find()->select('id') ->where(['mall_id' => $mall_id, 'is_show' => StatusEnum::ENABLED, 'status' => StatusEnum::ENABLED, 'store_id' => $store_id]) ->andWhere(['parent_id' => StatusEnum::DISABLED]) ->column(); } public static function getChildCateIDByTree($cate = [], $key = 'children') { $children_cate_id_arr = []; if (!empty($cate[$key])){ $children_cate_id_arr = array_column($cate[$key], 'id'); foreach ($cate[$key] as $child_row) { $children_cate_id_arr = array_merge($children_cate_id_arr, self::getChildCateIDByTree($child_row, $key)); } } return $children_cate_id_arr; } /** * 获取子分类,不递归 * @param array $cates * @param int $parent_id * @return array */ public static function getChildrenCate(array $cates, int $parent_id = 0) { $children = []; foreach ($cates as $v) { if ($v['parent_id'] == $parent_id) { $children[] = $v; } } return $children; } //数据迁移-新增分类层级,旧数据维护 public static function migrateCateLevel() { try { //获取一级分类数据 $first_cate_data = self::lists([ 'where' => [ ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]], ['parent_id' => 0] ], ]); $first_cate_ids = array_column($first_cate_data, 'id'); //修改分类层级为1 self::updateAll(['level' => 1], ['id' => $first_cate_ids]); //修改上级id为一级分类的数据层级为2 self::updateAll(['level' => 2], ['parent_id' => $first_cate_ids]); //修改剩余上级id不为0,且不存在层级的分类数据层级为3 self::updateAll(['level' => 3], ['and', ['>', 'parent_id', 0], ['level' => 0]]); } catch (\Exception $e) { throw new Exception($e->getMessage()); } } }