import 'package:animated_tree_view/animated_tree_view.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:starwork_flutter/api/model/team/request/get_depart_list_request.dart'; import 'package:starwork_flutter/api/model/team/response/depart_list_reponse.dart'; import 'package:starwork_flutter/api/service/team_api_service.dart'; import 'package:starwork_flutter/base/base_controller.dart'; class SelectPersonController extends BaseController { final teamApi = Get.find(); final Rx treeData = Rx(null); TreeViewController? treeViewController; // 搜索输入框 TextEditingController searchInputController = TextEditingController(); var allPersonList = [].obs; var selectPersonNoList = [].obs; // 存储从参数传递过来的已选角色 List? initialSelectedPersons; @override void onReady() { super.onReady(); // 获取传递的参数 var arguments = Get.arguments; if (arguments != null && arguments is List) { initialSelectedPersons = arguments; } requestDepartList(); _setInitialSelectedIndexes(); } requestDepartList() async { var response = await teamApi.requestDepartList( request: GetDepartListRequest(departNo: ''), ); if (response.isSuccess) { // 转换数据为树形结构 final tree = _convertToTree(response.data!.departList ?? []); treeData.value = tree; // 提取所有人员信息并更新 personList final allPersons = extractAllPersons(); allPersonList.value = allPersons; treeViewController?.expandAllChildren(treeData.value ?? TreeNode.root()); } } TreeNode _convertToTree(List departList) { // 创建根节点 final root = TreeNode.root(); // 如果列表为空,直接返回根节点 if (departList.isEmpty) { return root; } // 创建一个映射来存储所有部门节点,方便查找 final Map departNodeMap = {}; // 先创建所有部门节点 for (final depart in departList) { final node = TreeNode( key: depart.id.toString(), data: depart, ); departNodeMap[depart.id!] = node; } // 建立部门间的父子关系 for (final depart in departList) { final currentNode = departNodeMap[depart.id]; if (currentNode == null) continue; // 建立部门间的父子关系 if (depart.parentId == -1) { // 顶级部门添加到根节点下 root.add(currentNode); } else { // 子部门添加到对应父部门下 final parentNode = departNodeMap[depart.parentId]; parentNode?.add(currentNode); } } // 将人员节点添加到对应的部门节点下(在所有部门结构建立完成后再添加) for (final depart in departList) { final currentNode = departNodeMap[depart.id]; if (currentNode == null) continue; // 将该部门下的所有人员作为子节点添加 if (depart.persons != null && depart.persons!.isNotEmpty) { // 对人员按某种规则排序(例如按姓名或ID) final sortedPersons = List.from(depart.persons!); // 这里可以根据需要添加排序逻辑,例如按姓名排序: // sortedPersons.sort((a, b) => (a.personName ?? '').compareTo(b.personName ?? '')); for (final person in sortedPersons) { final personNode = TreeNode( key: 'person_${person.id}', data: person, ); currentNode.add(personNode); } } } return root; } // 提取所有人员信息的方法 List extractAllPersons() { final List persons = []; // 递归遍历树节点 void traverseTree(TreeNode? node) { if (node == null) return; // 如果当前节点是人员节点,添加到列表中 if (node.data is PersonItem) { persons.add(node.data as PersonItem); } // 递归遍历所有子节点 for (final child in node.childrenAsList) { traverseTree(child as TreeNode?); } } // 从根节点开始遍历 traverseTree(treeData.value); return persons; } // 根据初始选中的角色设置对应的索引 void _setInitialSelectedIndexes() { if (initialSelectedPersons != null && initialSelectedPersons!.isNotEmpty) { for (var selectedPerson in initialSelectedPersons!) { if (!selectPersonNoList.contains(selectedPerson.personNo)) { selectPersonNoList.add(selectedPerson.personNo!); } } } selectPersonNoList.refresh(); } }