job_applied_controller.dart 8.3 KB

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