202 lines
8.3 KiB
Dart
202 lines
8.3 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/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)));
|
|||
|
|
}
|
|||
|
|
}
|