203 lines
8.4 KiB
Dart
203 lines
8.4 KiB
Dart
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)));
|
||
}
|
||
}
|