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/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(null); RxString selectedGender = 'male'.obs; final teamApi = Get.find(); var selectedDepartItem = DepartItem().obs; // 当前选中的组织 var originalPersonData = Rx(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 = [].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))); } }