'删除', '0' => '禁用', '1' => '启用']; use Tree; /** * {@inheritdoc} */ public static function tableName() { return '{{%rbac_auth_role}}'; } /** * {@inheritdoc} */ public function rules() { return [ [['title'], 'trim'], [['title', 'pid'], 'required'], [['title'], 'isUniquTitle'], [['merchant_id', 'pid', 'mall_id', 'is_default', 'level', 'sort', 'status', 'created_at', 'updated_at'], 'integer'], [['title'], 'string', 'max' => 50], [['app_id'], 'string', 'max' => 20], [['tree'], 'string', 'max' => 300], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => '主键', 'merchant_id' => '商户id', 'title' => '标题', 'app_id' => '应用', 'pid' => '上级角色', 'level' => '级别', 'sort' => '排序', 'tree' => '树', 'is_default' => '默认', 'status' => '状态', 'created_at' => '添加时间', 'updated_at' => '修改时间', 'mall_id' => '商城id', ]; } /** * @param $attribute */ public function isUniquTitle($attribute) { $merchant_id = $this->merchant_id; $mall_id = $this->mall_id; $model = self::find()->where([ 'merchant_id' => $merchant_id, 'mall_id' => $mall_id, 'title' => $this->title, 'status'=>[StatusEnum::ENABLED,StatusEnum::DISABLED] ])->one(); if ($model && $model->id != $this->id) { $this->addError($attribute, '角色名称已存在'); } } /** * 关联模型 * @return \yii\db\ActiveQuery */ public function getChild() { return $this->hasMany(self::class, ['pid' => 'id'])->where(['<>', 'status', StatusEnum::DELETE])->orderBy('sort asc,id asc'); } /** * @param array $cond * @param array $with * @param int $is_array * @return array|AuthRole[]|ActiveRecord[]\ */ public static function getRole(array $cond = [], array $with = [], bool $is_array = true) { $query = self::find(); self::paramPack(['where' => $cond, 'with' => $with], $query); return $query->asArray($is_array)->orderBy('sort asc,id desc')->all(); } public static function getDropDownForEdit($app_id,$mall_id='', $id = '') { $list = AuthRole::find()->where(['app_id' => $app_id,'mall_id'=>$mall_id,'status'=>StatusEnum::ENABLED])->asArray()->all(); $list = ArrayHelper::removeByValue($list, $id); $models = ArrayHelper::itemsMerge($list); $data = ArrayHelper::map(ArrayHelper::itemsMergeDropDown($models), 'id', 'title'); // if (\Yii::$app->services->rbacAuthRole->isSuperAdmin()) { return ArrayHelper::merge([0 => '顶级角色'], $data); // } return $data; } public static function getEditData($params) { $where = ['and', ['id' => $params['id']], ['mall_id' => $params['mall_id']], ['status'=> [StatusEnum::ENABLED,StatusEnum::DISABLED]], ]; $query = AuthRole::find()->where($where); $role = $query->asArray()->one(); $data['role'] = !empty($role) ? $role : []; $data['checked_key'] = AuthItemChild::getCheckedKey(['role_id' => $params['id']]); $list = AuthRole::getDropDownForEdit($params['app_id'],$params['mall_id']); $data['list'] = $list; $parent_title = '顶级角色'; if (!empty($items['pid'])) { $parent_item = AuthRole::getOne([['id' => $items['pid']],['<>', 'status', StatusEnum::DELETE]],true); $parent_title = $parent_item['title']; } $data['parent_title'] = $parent_title; return $data; } /** * 更新 * @param $params * @return bool */ public static function updateRole($params) { try { $query = AuthRole::find()->where(['and', ['id' => $params['id']], ['mall_id' => empty($params['mall_id']) ? 0 : $params['mall_id']], ['in', 'status', [StatusEnum::ENABLED, StatusEnum::DISABLED]], ]); $model = $query->one(); isset($params['sort']) && $model->sort = $params['sort']; isset($params['status']) && $model->status = $params['status']; return $model->save(); } catch (\Exception $e) { return false; } } /** * 保存数据 * @param array $params * @return bool|AuthRole * @throws \yii\db\Exception */ public static function setData(array $params) { $t = \Yii::$app->db->beginTransaction(); try { if (!empty($id = $params['id']) && !empty($pid = $params['pid'])) { if (static::isChildIdOrSelf($id, $pid)) throw new Exception('上级角色无法选择自己或者其下级角色'); } if (!empty($params['id'])) { $where = ['id' => $params['id'], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]]; if (isset($params['mall_id'])) $where[] = ['mall_id' => $params['mall_id']]; $model = self::findOne($where); if (empty($model)) { $t->rollBack(); throw new Exception('服务不存在或已删除'); } } else { $model = new self(); $model->loadDefaultValues(); } isset($params['merchant_id']) && $model->merchant_id = $params['merchant_id']; isset($params['title']) && $model->title = $params['title']; isset($params['app_id']) && $model->app_id = $params['app_id']; isset($params['pid']) && $model->pid = $params['pid']; isset($params['sort']) && $model->sort = $params['sort']; isset($params['is_default']) && $model->is_default = $params['is_default']; isset($params['status']) && $model->status = $params['status']; isset($params['mall_id']) && $model->mall_id = $params['mall_id']; $model->level = 1; $model->tree = 'tr_0'; if (!empty($model->pid)) { $rbac_item = AuthItem::findOne($model->pid); $model->level = ($rbac_item->level ?? 0) + 1; $model->tree = ($rbac_item->tree ?? '') . ' tr_' . ($rbac_item['id'] ?? ''); } $res = $model->save(); if ($res === false) { $t->rollBack(); throw new Exception($model->getErrorMessage()); } if (!empty($res) && !empty($params['item_ids'])) { AuthItemChild::deleteAll(['role_id' => $params['id']]); $auth_item_list = AuthItem::find()->where(['and', ['in', 'id', $params['item_ids']], ['<>', 'status', StatusEnum::DELETE]])->indexBy('id')->all(); foreach ($params['item_ids'] as $v) { $batch_insert_data[] = [ 'role_id' => $model->id, 'item_id' => $v, 'app_id' => $params['app_id'], 'name' => empty($auth_item_list[$v]['name']) ? '' : $auth_item_list[$v]['name'], 'is_addon' => empty($auth_item_list[$v]['is_addon']) ? 0 : $auth_item_list[$v]['is_addon'], 'addons_name' => empty($auth_item_list[$v]['addons_name']) ? '' : $auth_item_list[$v]['addons_name'], ]; } $res = AuthItemChild::batchInsertAuth($batch_insert_data); if ($res === false) { $t->rollBack(); throw new Exception($model->getErrorMessage()); } } if (empty($params['item_ids'])) { AuthItemChild::deleteAll(['role_id' => $params['id']]); } $t->commit(); return $model; } catch (Exception $e) { $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } /** * pid是否是id的子节点,或者自己 * * @param integer $id * @param integer $pid * @return boolean */ public static function isChildIdOrSelf(int $id, int $pid) { $ids = [$id]; $tmp_id = $id; while ($child_ids = static::find()->select('id')->where(['pid' => $tmp_id])->column()) { $ids = array_merge($child_ids, $ids); $tmp_id = $child_ids; } return in_array($pid, $ids); } }