\App\Services\AdminDataDictService

字典服务

职责:字典类型管理 + 字典数据管理(平铺 + 树形)。按 type_code 缓存 (CacheManager sys_dict_data/sys_dict_tree),修改后自动清除; 并提供按 type_code+value 定位的便捷读写入口供业务代码一行调用。

┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 查询(读) types / data / tree / options / getItem 分区 2 · 类型写操作 createType / updateType / deleteType 分区 3 · 数据写操作 createData / updateData / deleteData 分区 4 · 便捷写操作 upsertItem / updateItem / deleteItem 分区 5 · 内部辅助 deleteRecursive / validateParent / collectDescendantIds / clearCache └────────────────────────────────────────────────────────────┘

Summary

Methods
Properties
Constants
types()
data()
tree()
options()
getItem()
createType()
updateType()
deleteType()
createData()
updateData()
deleteData()
upsertItem()
updateItem()
deleteItem()
No public properties found
No constants found
No protected methods found
No protected properties found
N/A
deleteRecursive()
validateParent()
collectDescendantIds()
clearCache()
No private properties found
N/A

Methods

types()

types() : array

字典类型列表(附每类数据项总数统计,含停用,管理端视角)。

Returns

array —

data()

data(string  $typeCode, bool  $includeDisabled = false) : array

获取字典数据列表(平铺)。

Parameters

string $typeCode
bool $includeDisabled

管理端传 true 时包含停用项(消费端默认只看启用)

Returns

array —

tree()

tree(string  $typeCode, bool  $includeDisabled = false) : array

获取字典数据树。

includeDisabled=1 时包含停用项(管理端维护用——树形字典停用项 此前不可见导致无法重新启用)。含停用走直查不缓存(与 data() 同规, 避免含停用缓存污染消费端读取)。

Parameters

string $typeCode
bool $includeDisabled

Returns

array —

options()

options(string  $typeCode) : array

按 type_code 获取 label→value 映射,供前端下拉框使用。

Parameters

string $typeCode

Returns

array —

getItem()

getItem(string  $typeCode, string  $value) : ?array

按 value 定位查询单个字典项(含 status 等全字段;不存在返回 null)。

Parameters

string $typeCode
string $value

Returns

?array —

createType()

createType(array  $data) : \App\Models\SysDictType

创建字典类型

Parameters

array $data

Returns

\App\Models\SysDictType —

updateType()

updateType(int  $id, array  $data) : \App\Models\SysDictType

更新字典类型(编码变更时同步数据项冗余 type_code,防数据项不可见)

Parameters

int $id
array $data

Returns

\App\Models\SysDictType —

deleteType()

deleteType(int  $id) : void

删除字典类型及其全部数据项

Parameters

int $id

createData()

createData(array  $data) : \App\Models\SysDictData

创建字典数据项(父级校验后落库,随后清缓存)

Parameters

array $data

Returns

\App\Models\SysDictData —

updateData()

updateData(int  $id, array  $data) : \App\Models\SysDictData

更新字典数据项(含防环父级校验)

Parameters

int $id
array $data

Returns

\App\Models\SysDictData —

deleteData()

deleteData(int  $id) : void

删除字典数据项(事务内递归删除子树)

Parameters

int $id

upsertItem()

upsertItem(string  $typeCode, string  $value, string  $label, array  $extra = []) : \App\Models\SysDictData

新增/更新字典项:不存在则新增,存在则按 value 覆盖(upsert 语义)。

业务代码最常用入口——「往性别字典加个人妖」: app(DataDictService::class)->upsertItem('gender', 'unknown', '人妖'); 树形类型:$extra['parent_value'] 指定父级(默认顶级)。

Parameters

string $typeCode

字典类型编码(如 gender / org_kind)

string $value

存储值

string $label

显示文本

array $extra

可选覆盖:status/sort/css_class/remark/parent_value

Returns

\App\Models\SysDictData —

updateItem()

updateItem(string  $typeCode, string  $value, string  $label, array  $extra = []) : \App\Models\SysDictData

按 value 定位修改字典项的显示文本(或 extra 里的其他字段)。

app(DataDictService::class)->updateItem('gender', 'unknown', '男变女'); app(DataDictService::class)->updateItem('gender', 'unknown', '男变女', ['sort' => 9]);

Parameters

string $typeCode
string $value
string $label
array $extra

Returns

\App\Models\SysDictData —

deleteItem()

deleteItem(string  $typeCode, string  $value) : void

按 value 定位删除字典项(树形会级联删除子树)。

Parameters

string $typeCode
string $value

deleteRecursive()

deleteRecursive(\App\Models\SysDictData  $item) : void

递归删除:一次 BFS 收集全部后代 + 单条 whereIn 批量删除(常数级查询)

Parameters

\App\Models\SysDictData $item

validateParent()

validateParent(array  $data, ?\App\Models\SysDictData  $self = null, bool  $checkUnique = true) : void

字典数据项父级校验: - 平铺类型(is_tree=0)强制 parent_id=0 - 父级必须存在且属于同一类型(禁止跨类型挂接) - 禁止自引用 / 后代引用(防环) - 同父下 value 唯一(应用层预检,DB 唯一索引兜底并发;upsert 场景可关闭)

Parameters

array $data
?\App\Models\SysDictData $self
bool $checkUnique

collectDescendantIds()

collectDescendantIds(int  $id) : array

收集某数据项的全部后代 id(防环校验/递归删除共用)。

内存 BFS 单源(ArrHelper::descendantIds——seen 集保证环数据也能终止), 替代逐层 pluck + 递归(查询数 = 层级数 × 节点数)。

Parameters

int $id

Returns

array —

clearCache()

clearCache(string  $typeCode) : void

精确清该 typeCode 的数据/树两个缓存变体

Parameters

string $typeCode