job_applied_controller.dart 10 KB

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