151 lines
4.7 KiB
Dart
151 lines
4.7 KiB
Dart
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/model/team/response/person_list_response.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<TeamApiService>();
|
||
final Rx<TreeNode?> treeData = Rx<TreeNode?>(null);
|
||
TreeViewController? treeViewController;
|
||
|
||
// 搜索输入框
|
||
TextEditingController searchInputController = TextEditingController();
|
||
|
||
var allPersonList = <PersonItem>[].obs;
|
||
var selectPersonNoList = <String>[].obs;
|
||
|
||
// 存储从参数传递过来的已选角色
|
||
List<PersonItem>? initialSelectedPersons;
|
||
|
||
@override
|
||
void onReady() {
|
||
super.onReady();
|
||
// 获取传递的参数
|
||
var arguments = Get.arguments;
|
||
if (arguments != null && arguments is List<PersonItem>) {
|
||
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<DepartItem> departList) {
|
||
// 创建根节点
|
||
final root = TreeNode.root();
|
||
|
||
// 如果列表为空,直接返回根节点
|
||
if (departList.isEmpty) {
|
||
return root;
|
||
}
|
||
|
||
// 创建一个映射来存储所有部门节点,方便查找
|
||
final Map<int, TreeNode> 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<PersonItem>.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<PersonItem> extractAllPersons() {
|
||
final List<PersonItem> 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();
|
||
}
|
||
}
|