# 6.6 岗位管理 :::tip 概述 岗位管理维护用户的岗位属性数据。`PositionService` 继承 `BaseTenantService` 实现租户隔离,全部能力由属性配置自动装配,仅保留删除前的业务校验钩子——是"极简 CRUD"的典型模块。 ::: ## 模块特点 | 特性 | 说明 | |------|------| | 基类 | `BaseTenantService`(租户隔离) | | 唯一校验 | `name` 按租户分组唯一(`['name','tenant_id']`) | | 枚举映射 | `status` → position_status 字典(1=在用 2=停用) | | 删除保护 | `beforeDelete` 业务校验(如岗位被用户引用时阻止) | | 自定义方法 | 无(分页/详情/增删改全部由 Trait 自动装配) | ## 数据库表结构 ```sql CREATE TABLE `laravel_position` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(255) NOT NULL COMMENT '岗位名称', `status` int DEFAULT 0 COMMENT '岗位状态:1-在用 2-停用', `sort` int DEFAULT 0 COMMENT '岗位排序', `create_user` varchar(50) DEFAULT NULL COMMENT '创建人', `create_time` datetime DEFAULT (now()) COMMENT '创建时间', `update_user` varchar(50) DEFAULT NULL COMMENT '更新人', `update_time` datetime DEFAULT (now()) COMMENT '更新时间', `is_delete` int DEFAULT 0 COMMENT '删除标识:0-正常 1-已删除', PRIMARY KEY (`id`) ) COMMENT = '岗位表'; ``` ## API 接口 | 方法 | 路径 | 权限码 | 说明 | |------|------|--------|------| | GET | `/api/position/page` | sys:position:page | 分页列表 | | GET | `/api/position/list` | sys:position:list | 全量列表 | | GET | `/api/position/detail/{id}` | sys:position:detail | 详情 | | POST | `/api/position/add` | sys:position:add | 新增 | | PUT | `/api/position/update` | sys:position:update | 修改 | | DELETE | `/api/position/delete/{id}` | sys:position:delete | 删除 | | DELETE | `/api/position/batchDelete` | sys:position:batchDelete | 批量删除 | ## Service 配置(来自项目实际代码) ```php class PositionService extends BaseTenantService { use HasCrudOperations, HasQueryScopes, HasSerializeMaps, HasUniqueCheck; protected string $modelClass = Position::class; protected array $pageLikeFields = ['name']; protected array $pageEqFields = ['status']; protected array $pageOrderBy = ['field' => 'sort', 'type' => 'asc']; // name 在同一租户内唯一 protected array $uniqueFields = [['name', 'tenant_id']]; // 字典翻译 protected array $serializeMaps = [ 'status' => 'position_status', ]; // 删除前业务校验(如岗位被用户引用时抛 BizException 阻止删除) protected function beforeDelete(int $id): void { // ... 业务约束检查 ... } } ``` ## Controller 代码(标准形态) ```php // app/Http/Controllers/Api/PositionController.php(形态示例) #[OperationLog('岗位管理-查询分页', OperationLog::TYPE_QUERY)] #[Permission('sys:position:page', '岗位分页')] public function page(): JsonResponse { return $this->_page($this->positionService); } #[OperationLog('岗位管理-新增', OperationLog::TYPE_ADD, '新增岗位:{name}')] #[Permission('sys:position:add', '添加岗位')] public function add(PositionRequest $request): JsonResponse { return $this->_add($this->positionService, $request->validated()); } #[OperationLog('岗位管理-删除', OperationLog::TYPE_DELETE, '删除岗位ID:{id}')] #[Permission('sys:position:delete', '删除岗位')] public function delete(int $id): JsonResponse { return $this->_delete($this->positionService, $id); } ``` :::tip 极简 CRUD 岗位模块几乎"零手写业务代码"——Service 只声明属性配置与删除校验钩子,Controller 调用基类通用方法,即可获得完整的增删改查、分页、唯一性校验、字典翻译能力。新模块建议从复制本模块结构开始。 ::: ## 与其他模块的关系 | 关系 | 说明 | |------|------| | 用户 → 岗位 | `laravel_user.position_id` 外键,用户表单级联选择 | | 详情回显 | 用户 `afterDetail` 中补全 `positionName` | | 导出映射 | 用户导出列「岗位」由岗位名称映射生成 |