starwork_flutter/lib/views/team/editPerson/edit_person_controller.dart

202 lines
8.3 KiB
Dart
Raw Normal View History

2025-10-14 13:53:01 +08:00
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<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)));
}
}