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

203 lines
8.4 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:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/api/model/team/request/edit_person_info_request.dart';
import 'package:starwork_flutter/api/model/team/response/depart_list_reponse.dart';
import 'package:starwork_flutter/api/model/team/response/person_details_response.dart';
import 'package:starwork_flutter/api/model/team/response/person_list_response.dart';
import 'package:starwork_flutter/api/model/team/response/role_list_response.dart';
import 'package:starwork_flutter/api/service/team_api_service.dart';
import 'package:starwork_flutter/base/app_logger.dart';
import 'package:starwork_flutter/base/base_controller.dart';
import 'package:starwork_flutter/common/constant/app_view_parameter_keys.dart';
class EditPersonController extends BaseController {
final selectedPersonItem = Rx<PersonItem?>(null);
RxString selectedGender = 'male'.obs;
final teamApi = Get.find<TeamApiService>();
var selectedDepartItem = DepartItem().obs; // 当前选中的组织
var originalPersonData = Rx<PersonDetailsResponse?>(null); // 人员原始的详情数据
TextEditingController nameInputController = TextEditingController();
TextEditingController phoneInputController = TextEditingController();
TextEditingController jobNoInputController = TextEditingController(); // 工号
TextEditingController positionInputController = TextEditingController(); // 职务
TextEditingController idCardInputController = TextEditingController(); // 身份证号码
TextEditingController remarkInputController = TextEditingController(); // 备注
var isLongTerm = true.obs; // 有效期是否为长期
var startDate = 0.obs; // 使用时间戳表示开始时间
var endDate = 0.obs; // 使用时间戳表示结束时间
var userState = 0.obs; // 账号状态
var selectedRoles = <RoleListResponse>[].obs;
var isPhoneVisible = false.obs; // 控制手机号是否可见
@override
void onInit() async {
super.onInit();
final args = Get.arguments;
if (args != null && args is PersonItem) {
selectedPersonItem.value = args;
}
await requestPersonDetail();
}
requestPersonDetail() async {
if (selectedPersonItem.value != null && selectedPersonItem.value!.personNo != null) {
var response = await teamApi.requestPersonDetails(personNo: selectedPersonItem.value!.personNo!);
if (response.isSuccess) {
var data = response.data;
// 保存原始数据
originalPersonData.value = data;
nameInputController.text = data?.personName ?? '';
phoneInputController.text = data?.phone ?? '';
jobNoInputController.text = data?.jobNumber.toString() ?? '';
positionInputController.text = data?.position ?? '';
idCardInputController.text = data?.idCard ?? '';
remarkInputController.text = data?.remark ?? '';
selectedGender.value = data?.sex == 1 ? 'male' : 'female';
isLongTerm.value = data?.limitType == 1;
startDate.value = _parseDateStringToTimestamp(data?.limitStartTime);
endDate.value = _parseDateStringToTimestamp(data?.limitEndTime);
userState.value = data?.userState ?? 2;
selectedRoles.value = data?.roleList ?? [];
selectedDepartItem.value.departNo = data?.departNo;
selectedDepartItem.value.departName = data?.departName;
selectedDepartItem.refresh();
selectedRoles.refresh();
}
}
}
// 获取选中角色的显示文本
String getSelectedRoleDisplayText() {
if (selectedRoles.isEmpty) {
return '请选择'; // 如果没有选中角色,显示"请选择"
} else {
// 将所有选中角色的名称用逗号连接
return selectedRoles.map((role) => role.roleName ?? '').join(''); // 使用顿号或逗号分隔
}
}
// 手机号脱敏处理方法
String maskPhoneNumber(String? phone) {
if (phone == null || phone.isEmpty) return '';
if (phone.length < 11) return phone;
// 只显示前3位和后3位中间5位用*代替
return '${phone.substring(0, 3)}*****${phone.substring(8)}';
}
// 获取显示用的手机号(根据可见性决定是否脱敏)
String getDisplayPhone() {
final phone = selectedPersonItem.value?.phone ?? '';
return isPhoneVisible.value ? phone : maskPhoneNumber(phone);
}
// 辅助方法:将时间戳转换为日期字符串
String formatTimestamp(int timestamp) {
if (timestamp <= 0) return '请选择';
try {
final dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
return '${dateTime.year}-${dateTime.month.toString().padLeft(2, '0')}-${dateTime.day.toString().padLeft(2, '0')}';
} catch (e) {
return '请选择';
}
}
// 将字符串日期转为时间戳
int _parseDateStringToTimestamp(String? dateStr) {
if (dateStr == null || dateStr.isEmpty) return 0;
try {
// 假设日期格式为 "yyyy-MM-dd" 或其他标准格式
final DateTime dateTime = DateTime.parse(dateStr);
return dateTime.millisecondsSinceEpoch;
} catch (e) {
// 如果解析失败返回0
return 0;
}
}
void requestEditPersonInfo() async {
// 先检查是否有数据变更
if (!_hasDataChanged()) {
AppLogger.debug('数据无变更,无需修改');
return;
}
// 构建只包含变更字段的请求对象
var request = EditPersonInfoRequest();
request.personNo = selectedPersonItem.value?.personNo;
request.isConfirm = true;
if (phoneInputController.text.trim() != (originalPersonData.value?.phone ?? '')) {
request.phone = phoneInputController.text.trim();
}
request.departNo = selectedDepartItem.value.departNo;
request.personName = nameInputController.text.trim();
if (selectedGender.value != (originalPersonData.value?.sex == 1 ? 'male' : 'female')) {
request.sex = selectedGender.value == 'male' ? 1 : 2;
}
if (positionInputController.text.trim() != (originalPersonData.value?.position ?? '')) {
request.position = positionInputController.text.trim();
}
if (remarkInputController.text.trim() != (originalPersonData.value?.remark ?? '')) {
request.remark = remarkInputController.text.trim();
}
if (idCardInputController.text.trim() != (originalPersonData.value?.idCard ?? '')) {
request.idCard = idCardInputController.text.trim();
}
if (jobNoInputController.text.trim() != (originalPersonData.value?.jobNumber?.toString() ?? '')) {
request.jobNumber = jobNoInputController.text.trim();
}
if (isLongTerm.value != (originalPersonData.value?.limitType == 1)) {
request.limitType = isLongTerm.value ? 1 : 2;
}
// 处理有效期时间字段
if (!isLongTerm.value) {
var originalStartTime = _parseDateStringToTimestamp(originalPersonData.value?.limitStartTime);
var originalEndTime = _parseDateStringToTimestamp(originalPersonData.value?.limitEndTime);
if (startDate.value != originalStartTime) {
request.limitStartTime = formatTimestamp(startDate.value);
}
if (endDate.value != originalEndTime) {
request.limitEndTime = formatTimestamp(endDate.value);
}
}
var response = await teamApi.requestEditPersonInfo(request: request);
if (response.isSuccess) {
showSuccess();
} else {
showError(message: response.errorMsg!);
}
}
// 3. 创建比较方法判断是否有修改
bool _hasDataChanged() {
if (originalPersonData.value == null) return true;
return nameInputController.text.trim() != (originalPersonData.value?.personName ?? '') ||
phoneInputController.text.trim() != (originalPersonData.value?.phone ?? '') ||
jobNoInputController.text.trim() != (originalPersonData.value?.jobNumber?.toString() ?? '') ||
positionInputController.text.trim() != (originalPersonData.value?.position ?? '') ||
idCardInputController.text.trim() != (originalPersonData.value?.idCard ?? '') ||
remarkInputController.text.trim() != (originalPersonData.value?.remark ?? '') ||
selectedGender.value != (originalPersonData.value?.sex == 1 ? 'male' : 'female') ||
selectedDepartItem.value.departNo != originalPersonData.value?.departNo ||
isLongTerm.value != (originalPersonData.value?.limitType == 1) ||
(!isLongTerm.value &&
(startDate.value != _parseDateStringToTimestamp(originalPersonData.value?.limitStartTime) ||
endDate.value != _parseDateStringToTimestamp(originalPersonData.value?.limitEndTime)));
}
}