job_applied_controller.dart 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import 'package:domain/entity/response/job_list_applied_staff_list_entity.dart';
  2. import 'package:domain/repository/job_repository.dart';
  3. import 'package:get/get.dart';
  4. import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
  5. import 'package:plugin_platform/engine/notify/notify_engine.dart';
  6. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  7. import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
  8. import 'package:shared/utils/date_time_utils.dart';
  9. import 'package:shared/utils/log_utils.dart';
  10. import 'package:widgets/load_state_layout.dart';
  11. import 'package:widgets/widget_export.dart';
  12. import '../../widget/applied_butch_modify.dart';
  13. import 'job_applied_state.dart';
  14. class JobAppliedController extends GetxController with DioCancelableMixin {
  15. final JobRepository _jobRepository = Get.find();
  16. final JobAppliedState state = JobAppliedState();
  17. var _curPage = 1;
  18. var _needShowPlaceholder = true;
  19. //页面PlaceHolder的展示
  20. LoadState loadingState = LoadState.State_Success;
  21. String? errorMessage;
  22. //刷新页面状态
  23. void changeLoadingState(LoadState state) {
  24. loadingState = state;
  25. update();
  26. }
  27. // Refresh 控制器
  28. final EasyRefreshController refreshController = EasyRefreshController(
  29. controlFinishRefresh: true,
  30. controlFinishLoad: true,
  31. );
  32. // Refresh 刷新事件
  33. Future onRefresh() async {
  34. _curPage = 1;
  35. fetchAppliedStaffList();
  36. }
  37. // Refresh 加载事件
  38. Future loadMore() async {
  39. _curPage++;
  40. fetchAppliedStaffList();
  41. }
  42. // 重试请求
  43. Future retryRequest() async {
  44. _curPage = 1;
  45. _needShowPlaceholder = true;
  46. fetchAppliedStaffList();
  47. }
  48. /// 获取服务器数据,通知消息列表
  49. Future fetchAppliedStaffList() async {
  50. if (_needShowPlaceholder) {
  51. changeLoadingState(LoadState.State_Loading);
  52. }
  53. if (state.jobInfo == null) {
  54. //不是并发的,顺序执行接口
  55. var jobInfoResult = await _jobRepository.fetchJobAppliedInfo(
  56. state.jobId,
  57. cancelToken: cancelToken,
  58. );
  59. if (jobInfoResult.isSuccess) {
  60. state.jobInfo = jobInfoResult.data;
  61. update();
  62. } else {
  63. errorMessage = jobInfoResult.errorMsg;
  64. changeLoadingState(LoadState.State_Error);
  65. return;
  66. }
  67. }
  68. // 获取 Applied 列表
  69. var listResult = await _jobRepository.fetchJobAppliedStaffs(
  70. state.jobId,
  71. state.keyword,
  72. curPage: _curPage,
  73. cancelToken: cancelToken,
  74. );
  75. // 处理数据
  76. if (listResult.isSuccess) {
  77. handleList(listResult.data?.rows);
  78. } else {
  79. errorMessage = listResult.errorMsg;
  80. changeLoadingState(LoadState.State_Error);
  81. }
  82. // 最后赋值
  83. _needShowPlaceholder = false;
  84. }
  85. // 处理数据与展示的逻辑
  86. void handleList(List<JobListAppliedStaffListRows>? list) {
  87. if (list != null && list.isNotEmpty) {
  88. //有数据,判断是刷新还是加载更多的数据
  89. if (_curPage == 1) {
  90. //刷新的方式
  91. state.datas.clear();
  92. state.datas.addAll(list);
  93. refreshController.finishRefresh();
  94. //更新展示的状态
  95. changeLoadingState(LoadState.State_Success);
  96. } else {
  97. //加载更多
  98. state.datas.addAll(list);
  99. refreshController.finishLoad();
  100. update();
  101. }
  102. } else {
  103. if (_curPage == 1) {
  104. //展示无数据的布局
  105. state.datas.clear();
  106. changeLoadingState(LoadState.State_Empty);
  107. refreshController.finishRefresh();
  108. } else {
  109. //展示加载完成,没有更多数据了
  110. refreshController.finishLoad(IndicatorResult.noMore);
  111. }
  112. }
  113. }
  114. @override
  115. void onReady() {
  116. super.onReady();
  117. fetchAppliedStaffList();
  118. }
  119. @override
  120. void onClose() {
  121. super.onClose();
  122. }
  123. /// 搜索员工
  124. void doSearch(String keyword) {
  125. state.keyword = keyword;
  126. //赋值之后刷新
  127. refreshController.callRefresh();
  128. }
  129. /// 清空筛选条件
  130. void resetFiltering() {
  131. state.keyword = "";
  132. state.searchController.text = "";
  133. //赋值之后刷新
  134. refreshController.callRefresh();
  135. }
  136. /// 展示添加员工的弹窗
  137. void showAddStaffDialog() {
  138. ToastEngine.show("展示添加员工的弹窗");
  139. }
  140. /// 去编辑员工信息页面
  141. void gotoAppliedEditPage(JobListAppliedStaffListRows data) {
  142. ToastEngine.show("去编辑员工信息页面");
  143. }
  144. /// 展示评论的弹窗
  145. void showRemarkDialog(JobListAppliedStaffListRows data) {
  146. ToastEngine.show("展示评论的弹窗");
  147. }
  148. /// 去展示员工状态的工作流
  149. void gotoAppliedWorkflowPage(JobListAppliedStaffListRows data) {
  150. ToastEngine.show("去展示员工状态的工作流");
  151. }
  152. /// Item选中与未选中设置
  153. void doSelectedOrNot(JobListAppliedStaffListRows data) {
  154. data.isSelected = !data.isSelected;
  155. update();
  156. }
  157. /// 批量修改的弹窗
  158. void showBatchModifyDialog() async {
  159. DialogEngine.show(widget: AppliedButchModify(confirmAction: (start, end) {
  160. requestBatchModify(start, end);
  161. }));
  162. }
  163. /// 执行批量修改的请求
  164. void requestBatchModify(DateTime start, DateTime end) async {
  165. var selectedList = state.datas.where((element) => element.isSelected).toList(growable: false);
  166. if (selectedList.isNotEmpty) {
  167. var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
  168. var separatedIds = ids.join(',');
  169. //执行请求
  170. var result = await _jobRepository.batchEditStaffCheckTime(
  171. state.jobId,
  172. separatedIds,
  173. DateTimeUtils.formatDate(start),
  174. DateTimeUtils.formatDate(end),
  175. cancelToken: cancelToken,
  176. );
  177. if (result.isSuccess) {
  178. NotifyEngine.showSuccess("Successful".tr);
  179. //调用接口刷新指定的Staff的信息
  180. fetchItemByIdAndRefreshItem(separatedIds);
  181. } else {
  182. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  183. return;
  184. }
  185. } else {
  186. ToastEngine.show("Please select the applied record".tr);
  187. }
  188. }
  189. /// 批准的操作
  190. void operationApprove() async {
  191. //找出已经选中的员工
  192. var selectedList = state.datas.where((element) => element.isSelected).toList(growable: false);
  193. if (selectedList.isNotEmpty) {
  194. var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
  195. var separatedIds = ids.join(',');
  196. //执行请求
  197. var result = await _jobRepository.submitBatchStaffApprove(separatedIds, cancelToken: cancelToken);
  198. if (result.isSuccess) {
  199. NotifyEngine.showSuccess("Successful".tr);
  200. //调用接口刷新指定的Staff的信息
  201. fetchItemByIdAndRefreshItem(separatedIds);
  202. } else {
  203. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  204. return;
  205. }
  206. } else {
  207. ToastEngine.show("Please select the applied record".tr);
  208. }
  209. }
  210. /// 根据ID获取Item对象,用于刷新
  211. void fetchItemByIdAndRefreshItem(String appliedIds) async {
  212. var result = await _jobRepository.fetchItemByAppliedIds(
  213. state.jobId,
  214. appliedIds,
  215. cancelToken: cancelToken,
  216. );
  217. //处理数据
  218. if (result.isSuccess) {
  219. var data = result.data;
  220. if (data != null && data.rows != null && data.rows!.isNotEmpty) {
  221. List<JobListAppliedStaffListRows> newItem = data.rows!;
  222. // 创建一个 Map 来加速查找
  223. Map<int, JobListAppliedStaffListRows> newItemMap = {for (var item in newItem) item.appliedId: item};
  224. // 遍历 state.datas 进行替换
  225. for (int i = 0; i < state.datas.length; i++) {
  226. if (newItemMap.containsKey(state.datas[i].appliedId)) {
  227. state.datas[i] = newItemMap[state.datas[i].appliedId]!;
  228. }
  229. }
  230. //刷新
  231. update();
  232. }
  233. } else {
  234. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  235. }
  236. }
  237. }