job_applied_controller.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. import 'package:cpt_job/modules/job_applied_edit/job_applied_edit_page.dart';
  2. import 'package:cpt_job/widget/applied_staff_reviews.dart';
  3. import 'package:domain/entity/response/job_list_applied_staff_list_entity.dart';
  4. import 'package:domain/repository/job_repository.dart';
  5. import 'package:get/get.dart';
  6. import 'package:plugin_basic/constants/app_constant.dart';
  7. import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
  8. import 'package:plugin_platform/engine/notify/notify_engine.dart';
  9. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  10. import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
  11. import 'package:shared/utils/date_time_utils.dart';
  12. import 'package:shared/utils/event_bus.dart';
  13. import 'package:shared/utils/util.dart';
  14. import 'package:widgets/dialog/app_default_dialog.dart';
  15. import 'package:widgets/load_state_layout.dart';
  16. import 'package:widgets/widget_export.dart';
  17. import '../../widget/applied_add_staff.dart';
  18. import '../../widget/applied_butch_modify.dart';
  19. import '../applied_workflow/applied_workflow_page.dart';
  20. import 'job_applied_state.dart';
  21. class JobAppliedController extends GetxController with DioCancelableMixin {
  22. final JobRepository _jobRepository = Get.find();
  23. final JobAppliedState state = JobAppliedState();
  24. var _curPage = 1;
  25. var _needShowPlaceholder = true;
  26. //页面PlaceHolder的展示
  27. LoadState loadingState = LoadState.State_Success;
  28. String? errorMessage;
  29. //刷新页面状态
  30. void changeLoadingState(LoadState state) {
  31. loadingState = state;
  32. update();
  33. }
  34. // Refresh 控制器
  35. final EasyRefreshController refreshController = EasyRefreshController(
  36. controlFinishRefresh: true,
  37. controlFinishLoad: true,
  38. );
  39. // Refresh 刷新事件
  40. Future onRefresh() async {
  41. _curPage = 1;
  42. fetchAppliedStaffList();
  43. }
  44. // Refresh 加载事件
  45. Future loadMore() async {
  46. _curPage++;
  47. fetchAppliedStaffList();
  48. }
  49. // 重试请求
  50. Future retryRequest() async {
  51. _curPage = 1;
  52. _needShowPlaceholder = true;
  53. fetchAppliedStaffList();
  54. }
  55. /// 获取服务器数据,通知消息列表
  56. Future fetchAppliedStaffList() async {
  57. if (_needShowPlaceholder) {
  58. changeLoadingState(LoadState.State_Loading);
  59. }
  60. if (state.jobInfo == null) {
  61. //不是并发的,顺序执行接口
  62. var jobInfoResult = await _jobRepository.fetchJobAppliedInfo(
  63. state.jobId,
  64. cancelToken: cancelToken,
  65. );
  66. if (jobInfoResult.isSuccess) {
  67. state.jobInfo = jobInfoResult.data;
  68. update();
  69. } else {
  70. errorMessage = jobInfoResult.errorMsg;
  71. changeLoadingState(LoadState.State_Error);
  72. return;
  73. }
  74. }
  75. // 获取 Applied 列表
  76. var listResult = await _jobRepository.fetchJobAppliedStaffs(
  77. state.jobId,
  78. state.keyword,
  79. curPage: _curPage,
  80. cancelToken: cancelToken,
  81. );
  82. // 处理数据
  83. if (listResult.isSuccess) {
  84. handleList(listResult.data?.rows);
  85. } else {
  86. errorMessage = listResult.errorMsg;
  87. changeLoadingState(LoadState.State_Error);
  88. }
  89. // 最后赋值
  90. _needShowPlaceholder = false;
  91. }
  92. // 处理数据与展示的逻辑
  93. void handleList(List<JobListAppliedStaffListRows>? list) {
  94. if (list != null && list.isNotEmpty) {
  95. //有数据,判断是刷新还是加载更多的数据
  96. if (_curPage == 1) {
  97. //刷新的方式
  98. state.datas.clear();
  99. state.datas.addAll(list);
  100. refreshController.finishRefresh();
  101. //更新展示的状态
  102. changeLoadingState(LoadState.State_Success);
  103. } else {
  104. //加载更多
  105. state.datas.addAll(list);
  106. refreshController.finishLoad();
  107. update();
  108. }
  109. } else {
  110. if (_curPage == 1) {
  111. //展示无数据的布局
  112. state.datas.clear();
  113. changeLoadingState(LoadState.State_Empty);
  114. refreshController.finishRefresh();
  115. } else {
  116. //展示加载完成,没有更多数据了
  117. refreshController.finishLoad(IndicatorResult.noMore);
  118. }
  119. }
  120. }
  121. @override
  122. void onReady() {
  123. super.onReady();
  124. fetchAppliedStaffList();
  125. registerEventBus();
  126. }
  127. @override
  128. void onClose() {
  129. unregisterEventBus();
  130. state.datas.clear();
  131. super.onClose();
  132. }
  133. // EventBus 的事件接收
  134. Subscription? subscribe;
  135. void registerEventBus() {
  136. subscribe = bus.on(AppConstant.eventAppliedListRefresh, (arg) {
  137. var appliedId = arg as String;
  138. if (Utils.isNotEmpty(appliedId)) {
  139. fetchItemByIdAndRefreshItem(appliedId);
  140. } else {
  141. refreshController.callRefresh();
  142. }
  143. });
  144. }
  145. void unregisterEventBus() {
  146. bus.off(AppConstant.eventAppliedListRefresh, subscribe);
  147. }
  148. /// 搜索员工
  149. void doSearch(String keyword) {
  150. state.keyword = keyword;
  151. //赋值之后刷新
  152. refreshController.callRefresh();
  153. }
  154. /// 清空筛选条件
  155. void resetFiltering() {
  156. state.keyword = "";
  157. state.searchController.text = "";
  158. //赋值之后刷新
  159. refreshController.callRefresh();
  160. }
  161. /// 展示添加员工的弹窗
  162. void showAddStaffDialog() {
  163. DialogEngine.show(
  164. widget: AppliedAddStaff(
  165. jobId: state.jobId!,
  166. confirmAction: (selectedIds) {
  167. //调用接口添加员工
  168. _requestAddStaff2Applied(selectedIds);
  169. },
  170. ),
  171. );
  172. }
  173. //调用接口添加员工
  174. void _requestAddStaff2Applied(String selectedIds) async {
  175. var result = await _jobRepository.addStaff2Job(state.jobId, selectedIds, cancelToken: cancelToken);
  176. if (result.isSuccess) {
  177. NotifyEngine.showSuccess("Successful".tr);
  178. //添加成功之后刷新页面
  179. refreshController.callRefresh();
  180. } else {
  181. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  182. return;
  183. }
  184. }
  185. /// 去编辑员工信息页面
  186. void gotoAppliedEditPage(JobListAppliedStaffListRows data) {
  187. JobAppliedEditPage.startInstance(data.appliedId.toString());
  188. }
  189. /// 展示评论的弹窗
  190. void showRemarkDialog(JobListAppliedStaffListRows data) async {
  191. //请求接口获取到已评论的数据
  192. var result = await _jobRepository.fetchAppliedStaffReviewView(data.appliedId.toString());
  193. if (result.isSuccess) {
  194. //接口数据获取成功,展示弹窗
  195. DialogEngine.show(
  196. widget: AppliedStaffReviews(
  197. appliedReviews: result.data!,
  198. confirmAction: (attitudeRate, performanceRate, experienceRate, groomingRate, content) async {
  199. //请求接口,提交评论
  200. var submitResult = await _jobRepository.remarkAppliedSingleStaffSubmit(
  201. data.appliedId.toString(),
  202. attitudeRate,
  203. groomingRate,
  204. performanceRate,
  205. experienceRate,
  206. content,
  207. );
  208. if (submitResult.isSuccess) {
  209. NotifyEngine.showSuccess("Successful".tr);
  210. } else {
  211. ToastEngine.show(submitResult.errorMsg ?? "Network Load Error".tr);
  212. }
  213. },
  214. ),
  215. );
  216. } else {
  217. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  218. return;
  219. }
  220. }
  221. /// 去展示员工状态的审核流程页面
  222. void gotoAppliedWorkflowPage(JobListAppliedStaffListRows data) {
  223. AppliedWorkflowPage.startInstance(data.appliedId.toString());
  224. }
  225. /// Item选中与未选中设置
  226. void doSelectedOrNot(JobListAppliedStaffListRows data) {
  227. //只有 Approve = 3 的状态才能选中
  228. if (data.status == 3) {
  229. data.isSelected = !data.isSelected;
  230. update();
  231. }
  232. }
  233. /// 批量修改的弹窗
  234. void showBatchModifyDialog() async {
  235. if (state.jobInfo == null) return;
  236. //找出已经选中的员工(只有状态为3 Approve的状态才能修改)
  237. var selectedList = state.datas.where((element) => element.isSelected && element.status == 3).toList(growable: false);
  238. if (selectedList.isNotEmpty) {
  239. var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
  240. var separatedIds = ids.join(',');
  241. DialogEngine.show(
  242. widget: AppliedButchModify(
  243. selectedStartDate: DateTimeUtils.getDateTime(state.jobInfo?.startTime ?? ""),
  244. selectedEndDate: DateTimeUtils.getDateTime(state.jobInfo?.endTime ?? ""),
  245. confirmAction: (start, end) {
  246. _requestBatchModify(start, end, separatedIds);
  247. }));
  248. } else {
  249. ToastEngine.show("Please select the applied record".tr);
  250. }
  251. }
  252. /// 执行批量修改的请求
  253. void _requestBatchModify(DateTime start, DateTime end, String separatedIds) async {
  254. //执行请求
  255. var result = await _jobRepository.batchEditStaffCheckTime(
  256. state.jobId,
  257. separatedIds,
  258. DateTimeUtils.formatDate(start),
  259. DateTimeUtils.formatDate(end),
  260. cancelToken: cancelToken,
  261. );
  262. if (result.isSuccess) {
  263. NotifyEngine.showSuccess("Successful".tr);
  264. //调用接口刷新指定的Staff的信息
  265. fetchItemByIdAndRefreshItem(separatedIds);
  266. } else {
  267. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  268. return;
  269. }
  270. }
  271. /// 批准的操作
  272. void operationApprove() async {
  273. //找出已经选中的员工(只有状态为3 Approve的状态才能修改)
  274. var selectedList = state.datas.where((element) => element.isSelected && element.status == 3).toList(growable: false);
  275. if (selectedList.isNotEmpty) {
  276. var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
  277. var separatedIds = ids.join(',');
  278. // Are you sure 的弹窗
  279. DialogEngine.show(
  280. widget: AppDefaultDialog(
  281. title: "Message".tr,
  282. message: "Are you sure you want to setting approved?".tr,
  283. confirmAction: () async {
  284. //执行请求
  285. var result = await _jobRepository.submitBatchStaffApprove(separatedIds, cancelToken: cancelToken);
  286. if (result.isSuccess) {
  287. NotifyEngine.showSuccess("Successful".tr);
  288. //调用接口刷新指定的Staff的信息
  289. fetchItemByIdAndRefreshItem(separatedIds);
  290. } else {
  291. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  292. return;
  293. }
  294. },
  295. ),
  296. );
  297. } else {
  298. ToastEngine.show("Please select the applied record".tr);
  299. }
  300. }
  301. /// 根据ID获取Item对象,用于刷新
  302. void fetchItemByIdAndRefreshItem(String appliedIds) async {
  303. var result = await _jobRepository.fetchItemByAppliedIds(
  304. state.jobId,
  305. appliedIds,
  306. cancelToken: cancelToken,
  307. );
  308. //处理数据
  309. if (result.isSuccess) {
  310. var data = result.data;
  311. if (data != null && data.rows != null && data.rows!.isNotEmpty) {
  312. List<JobListAppliedStaffListRows> newItem = data.rows!;
  313. // 创建一个 Map 来加速查找
  314. Map<int, JobListAppliedStaffListRows> newItemMap = {for (var item in newItem) item.appliedId: item};
  315. // 遍历 state.datas 进行替换
  316. for (int i = 0; i < state.datas.length; i++) {
  317. if (newItemMap.containsKey(state.datas[i].appliedId)) {
  318. state.datas[i] = newItemMap[state.datas[i].appliedId]!;
  319. }
  320. }
  321. //刷新
  322. update();
  323. }
  324. } else {
  325. ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
  326. }
  327. }
  328. }