starwork_flutter/lib/views/team/selectPerson/select_person_controller.dart
2025-10-14 15:46:21 +08:00

151 lines
4.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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