starwork_flutter/lib/views/team/selectPerson/select_person_controller.dart

150 lines
4.6 KiB
Dart
Raw Normal View History

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<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();
}
}