You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

566 lines
19KB

  1. import 'package:dio/dio.dart';
  2. import 'package:dio_http_cache/dio_http_cache.dart';
  3. import 'package:farm_tpf/custom_model/ActionType.dart';
  4. import 'package:farm_tpf/custom_model/CropPlot.dart';
  5. import 'package:farm_tpf/custom_model/Device.dart';
  6. import 'package:farm_tpf/custom_model/EnvironmentParameter.dart';
  7. import 'package:farm_tpf/custom_model/Harvest.dart';
  8. import 'package:farm_tpf/custom_model/LocationUnit.dart';
  9. import 'package:farm_tpf/custom_model/NotificationObjectDTO.dart';
  10. import 'package:farm_tpf/custom_model/Supply.dart';
  11. import 'package:farm_tpf/custom_model/TbCropDTO.dart';
  12. import 'package:farm_tpf/custom_model/UpdateNoti.dart';
  13. import 'package:farm_tpf/custom_model/WaterType.dart';
  14. import 'package:farm_tpf/custom_model/action_form/ActionUIForm.dart';
  15. import 'package:farm_tpf/custom_model/action_form/CommonData.dart';
  16. import 'package:farm_tpf/custom_model/action_form/RequestActivity.dart';
  17. import 'package:farm_tpf/custom_model/user.dart';
  18. import 'package:farm_tpf/custom_model/user_request.dart';
  19. import 'package:farm_tpf/data/api/dio_provider.dart';
  20. import 'package:farm_tpf/data/api/rest_client.dart';
  21. import 'package:farm_tpf/models/PagedResult.dart';
  22. import 'package:farm_tpf/presentation/screens/codes/models/activity_request.dart';
  23. import 'package:farm_tpf/presentation/screens/codes/models/activity_type.dart';
  24. import 'package:farm_tpf/presentation/screens/codes/models/stamp.dart';
  25. import 'package:farm_tpf/presentation/screens/codes/models/stamp_filter_request.dart';
  26. import 'package:farm_tpf/presentation/screens/codes/models/stamp_request.dart';
  27. import 'package:farm_tpf/presentation/screens/codes/models/stamp_timeline.dart';
  28. import 'package:farm_tpf/presentation/screens/plot/models/crop_filter_request.dart';
  29. import 'package:farm_tpf/presentation/screens/task/models/employee.dart';
  30. import 'package:farm_tpf/presentation/screens/task/models/supply_filter.dart';
  31. import 'package:farm_tpf/presentation/screens/task/models/task_request.dart';
  32. import 'package:farm_tpf/utils/const_common.dart';
  33. import 'package:flutter/material.dart';
  34. import '../../presentation/screens/codes/models/stamp_type.dart';
  35. import '../../presentation/screens/login/models/request_user.dart';
  36. import '../../presentation/screens/login/models/response_user.dart';
  37. import '../../presentation/screens/task/models/task.dart';
  38. import '../../presentation/screens/task/models/task_filter_request.dart';
  39. import '../../presentation/screens/task/models/task_update_request.dart';
  40. import '../api/app_exception.dart';
  41. class Repository {
  42. final dio = DioProvider();
  43. Future<void> login(
  44. Function(ResponseUser) onSuccess,
  45. Function(String) onError, {
  46. required RequestUser requestUser,
  47. }) async {
  48. try {
  49. var url = ConstCommon.baseUrl + '/api/authenticate';
  50. await dio.post(
  51. url,
  52. data: {
  53. 'username': requestUser.username ?? '',
  54. 'password': requestUser.password ?? '',
  55. },
  56. ).then(
  57. (value) {
  58. var res = ResponseUser.fromJson(value.data);
  59. onSuccess(res);
  60. },
  61. ).catchError((error) {
  62. var dioError = error as DioError;
  63. var message = dioError.response?.data['Error'];
  64. onError(message);
  65. });
  66. } catch (e) {
  67. onError('Đã có lỗi xảy ra');
  68. }
  69. }
  70. Future<List<ActionType>> getActionTypes() {
  71. final client = RestClient(dio);
  72. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  73. return client.getActionTypes(options: op);
  74. }
  75. Future<List<Harvest>> getHarvests() {
  76. final client = RestClient(dio);
  77. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  78. return client.getHarvests(options: op);
  79. }
  80. Future<List<WaterType>> getWaterTypes() {
  81. final client = RestClient(dio);
  82. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  83. return client.getWaterTypes(options: op);
  84. }
  85. Future<CropPlot> getPlotDetail(int cropId, {int page = 0, int size = 20}) {
  86. final client = RestClient(dio);
  87. return client.getCropDetail(cropId, page: page, size: size);
  88. }
  89. Future<CropPlot> getPlotDetailByCode(String cropCode) {
  90. final client = RestClient(dio);
  91. return client.getCropDetailByCode(cropCode);
  92. }
  93. Future<List<TbCropDTO>> getPlots({int page = 0, int size = 20, String searchString = ''}) {
  94. final client = RestClient(dio);
  95. return client.getPlots(page: page, size: size, query: searchString);
  96. }
  97. Future<void> updatePlot(TbCropDTO tbCropDTO) {
  98. final client = RestClient(dio);
  99. return client.updateCrop(tbCropDTO);
  100. }
  101. Future<User> signInWithCredentials(String username, String password) {
  102. final client = RestClient(dio);
  103. return client.login(UserRequest(username: username, password: password));
  104. }
  105. Future<PagedResult<T>> getInfinityList<T>(String url, {int page = 0, int size = 20}) async {
  106. var initUrl = "/api/activities/latest-env-by-activity-type/1/2";
  107. var url = ConstCommon.baseUrl + initUrl + "?page=$page&paged=true&size=$size";
  108. var response = await dio.get(url);
  109. final value = PagedResult<T>.fromJson(response.data, getInstanceClass());
  110. return value;
  111. }
  112. Future<List<Supply>> getSupplies(String type, {String query = ""}) async {
  113. final client = RestClient(dio);
  114. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  115. return client.getSupplies(type, query: query, options: op);
  116. }
  117. Future<List<Device>> getDeviceForActivity() async {
  118. final client = RestClient(dio);
  119. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  120. return client.getDeviceForActivity(options: op);
  121. }
  122. Future<void> updateAllNotification(String status) {
  123. final client = RestClient(dio);
  124. return client.updateAllNotification(status);
  125. }
  126. Future<void> updateNoti(UpdateNoti updateNoti) {
  127. final client = RestClient(dio);
  128. return client.updateNoti(updateNoti);
  129. }
  130. Future<NotificationObjectDTO> getNotifications({int page = 0, int size = 20}) async {
  131. var url = ConstCommon.baseUrl + "/api/notifications-current-user?page=$page&size=$size&sort=sendDate,DESC";
  132. var response = await dio.get(url);
  133. final value = NotificationObjectDTO.fromJson(response.data);
  134. return value;
  135. }
  136. Future<List<LocationUnit>> getLocationUnits(
  137. {required LocationType locationType, int filterId = -1, int page = 0, int size = 500, String query = ''}) {
  138. final client = RestClient(dio);
  139. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  140. var response;
  141. switch (locationType) {
  142. case LocationType.province:
  143. response = client.getProvinces(filterId, options: op, page: page, size: size, query: query);
  144. break;
  145. case LocationType.district:
  146. response = client.getDistricts(filterId, options: op, page: page, size: size, query: query);
  147. break;
  148. case LocationType.ward:
  149. response = client.getWards(filterId, options: op, page: page, size: size, query: query);
  150. break;
  151. default:
  152. response = client.getCountries(query: query);
  153. }
  154. return response;
  155. }
  156. Object getInstanceClass() {
  157. var instanceClass;
  158. if (1 == 1) {
  159. instanceClass = new TbCropDTO();
  160. }
  161. return instanceClass;
  162. }
  163. //Action
  164. Future<void> createAction(Function(dynamic) onSuccess, Function(dynamic) onError,
  165. {String? apiAddAction, String? paramActivity, String? activityAction, List<String>? filePaths}) async {
  166. var formData = FormData();
  167. filePaths?.forEach((f) {
  168. formData.files.add(MapEntry("images", MultipartFile.fromFileSync(f)));
  169. });
  170. formData.fields.add(MapEntry(paramActivity ?? '', activityAction ?? ''));
  171. try {
  172. await dio.post("${ConstCommon.baseUrl}/$apiAddAction", data: formData).then((value) {
  173. onSuccess(value.data);
  174. });
  175. } on DioError catch (e) {
  176. onError(e);
  177. }
  178. }
  179. Future<void> updateAction(Function(dynamic) onSuccess, Function(dynamic) onError,
  180. {String? apiUpdateAction, String? paramActivity, String? activityAction, List<String>? filePaths}) async {
  181. var formData = FormData();
  182. if (filePaths != null) {
  183. filePaths.forEach((f) {
  184. formData.files.add(MapEntry("images", MultipartFile.fromFileSync(f)));
  185. });
  186. }
  187. formData.fields.add(MapEntry(paramActivity ?? '', activityAction ?? ''));
  188. try {
  189. await dio.post("${ConstCommon.baseUrl}/$apiUpdateAction", data: formData).then((value) {
  190. onSuccess(value.data);
  191. });
  192. } on DioError catch (e) {
  193. onError(e);
  194. }
  195. }
  196. //Device
  197. Future<List<Device>> getDevices(String query) {
  198. final client = RestClient(dio);
  199. return client.getDevices(query);
  200. }
  201. //Environment Parameter
  202. Future<List<EnvironmentParameter>> getEnvironmentParameters({required int cropId, int page = 0, int size = 20}) {
  203. final client = RestClient(dio);
  204. return client.getEnvironmentParameters(cropId, page: page, size: size);
  205. }
  206. //NEW IMPLEMENT
  207. Future<void> allActionTypes(int cropTypeId, Function(List<ActionType>) onSuccess, Function(dynamic) onError) async {
  208. try {
  209. var url = '${ConstCommon.baseUrl}/api/listActivityTypesCulture/$cropTypeId';
  210. final Response<List<dynamic>> _result = await dio.get(url);
  211. var value = _result.data?.map((dynamic i) => ActionType.fromJson(i as Map<String, dynamic>)).toList();
  212. onSuccess(value ?? []);
  213. } on DioError catch (e) {
  214. onError(e);
  215. }
  216. }
  217. Future<ActionUIForm> getActionUIForm({required int idAction}) {
  218. final client = RestClient(dio);
  219. var op = buildConfigurableCacheOptions(forceRefresh: true, maxAge: Duration(days: ConstCommon.kMaxAgeCache));
  220. return client.getActionUIForm(idAction, op);
  221. }
  222. Future<List<CommonData>> getCommonData({required String tableSupply, required String condition}) async {
  223. var url = '${ConstCommon.baseUrl}/api/get-data-from-table-common?tableName=$tableSupply&condition=$condition';
  224. final Response<List<dynamic>> _result = await dio.get(url);
  225. var value = _result.data?.map((dynamic i) => CommonData.fromJson(i as Map<String, dynamic>)).toList();
  226. return value ?? [];
  227. }
  228. Future<void> createActionCommon(Function(dynamic) onSuccess, Function(dynamic) onError,
  229. {required String activityType, required String activityData, List<String>? filePaths}) async {
  230. var formData = FormData();
  231. if (filePaths != null) {
  232. filePaths.forEach((f) {
  233. formData.files.add(MapEntry('images', MultipartFile.fromFileSync(f)));
  234. });
  235. }
  236. formData.fields.add(MapEntry('tbCommonActivityDTO', activityData));
  237. try {
  238. await dio.post("${ConstCommon.baseUrl}/api/create-common-activity/$activityType", data: formData).then((value) {
  239. onSuccess(value.data);
  240. });
  241. } on DioError catch (e) {
  242. onError(e);
  243. }
  244. }
  245. Future<void> updateActionCommon(Function(dynamic) onSuccess, Function(dynamic) onError,
  246. {required String activityType, required String activityData, List<String>? filePaths}) async {
  247. var formData = FormData();
  248. if (filePaths != null) {
  249. filePaths.forEach((f) {
  250. formData.files.add(MapEntry('images', MultipartFile.fromFileSync(f)));
  251. });
  252. }
  253. formData.fields.add(MapEntry('tbCommonActivityDTO', activityData));
  254. try {
  255. await dio.post("${ConstCommon.baseUrl}/api/update-common-activity/$activityType", data: formData).then((value) {
  256. onSuccess(value.data);
  257. });
  258. } on DioError catch (e) {
  259. onError(e);
  260. }
  261. }
  262. Future<RequestActivity> detailCommonAction({required int activityId, required String activityType}) async {
  263. final client = RestClient(dio);
  264. return client.getDetailActivityCommon(activityType, activityId);
  265. }
  266. // Stamp
  267. Future<List<Stamp>> stamps({
  268. int page = 0,
  269. int size = 20,
  270. required StampFilterRequest filter,
  271. }) async {
  272. try {
  273. var url = '${ConstCommon.baseUrl}/api/tb-codes/list?page=$page&size=$size&sort=createdDate,${filter.sort ?? 'asc'}';
  274. var res = await dio.post(url, data: {
  275. 'status': filter.status,
  276. 'description': filter.description,
  277. });
  278. return (res.data as List).map((e) => Stamp.fromJson(e)).toList();
  279. } catch (e) {
  280. rethrow;
  281. }
  282. }
  283. Future<List<StampType>> stampTypes() async {
  284. try {
  285. var url = '${ConstCommon.baseUrl}/api/tb-example-stamp/dropdown-list';
  286. var res = await dio.get(
  287. url,
  288. );
  289. return (res.data as List).map((e) => StampType.fromJson(e)).toList();
  290. } catch (e) {
  291. rethrow;
  292. }
  293. }
  294. Future<void> createStamp(
  295. Function(dynamic) onSuccess,
  296. Function(String) onError, {
  297. required RequestStamp item,
  298. }) async {
  299. try {
  300. var url = '${ConstCommon.baseUrl}/api/tb-codes';
  301. await dio.post(url, data: item).then(
  302. (value) {
  303. onSuccess(value);
  304. },
  305. ).catchError((e) {
  306. onError(AppException.handleError(e));
  307. });
  308. } catch (e) {
  309. onError(AppException.handleError(e));
  310. }
  311. }
  312. Future<List<ActivityType>> activityTypes() async {
  313. try {
  314. var url = '${ConstCommon.baseUrl}/api/tb-activity-types-dropdown-list-after-harvest';
  315. var res = await dio.get(
  316. url,
  317. );
  318. return (res.data as List).map((e) => ActivityType.fromJson(e)).toList();
  319. } catch (e) {
  320. rethrow;
  321. }
  322. }
  323. Future<void> updateActivity(
  324. Function(dynamic) onSuccess,
  325. Function(String) onError, {
  326. required ActivityRequest item,
  327. }) async {
  328. try {
  329. var url = '${ConstCommon.baseUrl}/api/tb-codes/create/activity';
  330. var formData = FormData();
  331. formData.fields.add(MapEntry('code', item.code ?? ''));
  332. formData.fields.add(MapEntry('activityTypeId', item.activityTypeId?.toString() ?? ''));
  333. formData.fields.add(MapEntry('executeDate', item.executeDate ?? ''));
  334. formData.fields.add(MapEntry('description', item.description ?? ''));
  335. formData.fields.add(MapEntry('location', item.location ?? ''));
  336. await dio.post(url, data: formData).then(
  337. (value) {
  338. onSuccess(value);
  339. },
  340. ).catchError((e) {
  341. onError(AppException.handleError(e));
  342. });
  343. } catch (e) {
  344. onError(AppException.handleError(e));
  345. }
  346. }
  347. Future<Stamp> getStampDetail({required int id}) async {
  348. try {
  349. var url = '${ConstCommon.baseUrl}/api/tb-codes/$id';
  350. var res = await dio.get(url);
  351. return Stamp.fromJson(res.data);
  352. } catch (e) {
  353. rethrow;
  354. }
  355. }
  356. Future<Stamp> getStampDetailByCode({required String code}) async {
  357. try {
  358. var url = '${ConstCommon.baseUrl}/api/tb-codes-scan-qrCode/$code';
  359. var res = await dio.get(url);
  360. return Stamp.fromJson(res.data);
  361. } catch (e) {
  362. rethrow;
  363. }
  364. }
  365. Future<StampTimeline> getStampTimeline({required int stampId}) async {
  366. try {
  367. var url = '${ConstCommon.baseUrl}/api/tb-codes-timeline/$stampId';
  368. var res = await dio.get(url);
  369. return StampTimeline.fromJson(res.data);
  370. } catch (e) {
  371. rethrow;
  372. }
  373. }
  374. Future<void> updateStampStatus(
  375. Function(dynamic) onSuccess,
  376. Function(String) onError, {
  377. required int stampId,
  378. required String status,
  379. }) async {
  380. try {
  381. var url = '${ConstCommon.baseUrl}/api/tb-codes/update/$stampId/status/$status';
  382. await dio.put(url).then(
  383. (value) {
  384. onSuccess(value);
  385. },
  386. ).catchError((e) {
  387. onError(AppException.handleError(e));
  388. });
  389. } catch (e) {
  390. onError(AppException.handleError(e));
  391. }
  392. }
  393. Future<List<TbCropDTO>> getPlotsWithoutPaging() async {
  394. try {
  395. var url = '${ConstCommon.baseUrl}/api/_search/tb-crops';
  396. var res = await dio.get(
  397. url,
  398. );
  399. return (res.data as List).map((e) => TbCropDTO.fromJson(e)).toList();
  400. } catch (e) {
  401. rethrow;
  402. }
  403. }
  404. // Task
  405. Future<List<Task>> tasks({
  406. int page = 0,
  407. int size = 20,
  408. required TaskFilterRequest filter,
  409. }) async {
  410. try {
  411. // var url = '${ConstCommon.baseUrl}/api/tb-todo-lists/list?page=$page&size=$size&sort=createdDate,${filter.sort ?? 'asc'}';
  412. var url = '${ConstCommon.baseUrl}/api/tb-todo-lists/list?page=$page&size=$size';
  413. var res = await dio.post(url, data: {
  414. // 'status': filter.status,
  415. "crop_id": filter.cropId,
  416. });
  417. return (res.data as List).map((e) => Task.fromJson(e)).toList();
  418. } catch (e) {
  419. rethrow;
  420. }
  421. }
  422. Future<void> createTask(
  423. Function(dynamic) onSuccess,
  424. Function(String) onError, {
  425. required RequestTask item,
  426. }) async {
  427. try {
  428. var url = '${ConstCommon.baseUrl}/api/tb-todo-lists';
  429. await dio.post(url, data: item).then(
  430. (value) {
  431. onSuccess(value);
  432. },
  433. ).catchError((e) {
  434. onError(AppException.handleError(e));
  435. });
  436. } catch (e) {
  437. onError(AppException.handleError(e));
  438. }
  439. }
  440. Future<void> updateTask(
  441. Function(dynamic) onSuccess,
  442. Function(String) onError, {
  443. required RequestTaskUpdate item,
  444. }) async {
  445. try {
  446. var url = '${ConstCommon.baseUrl}/api/tb-todo-lists/';
  447. await dio.put(url, data: item).then(
  448. (value) {
  449. onSuccess(value);
  450. },
  451. ).catchError((e) {
  452. onError(AppException.handleError(e));
  453. });
  454. } catch (e) {
  455. onError(AppException.handleError(e));
  456. }
  457. }
  458. Future<List<Employee>> getEmployees() async {
  459. try {
  460. var url = '${ConstCommon.baseUrl}/api/get-all-users-by-login-info';
  461. var res = await dio.get(
  462. url,
  463. );
  464. return (res.data as List).map((e) => Employee.fromJson(e)).toList();
  465. } catch (e) {
  466. rethrow;
  467. }
  468. }
  469. Future<List<SupplyFilter>> getSuppliesFilter() async {
  470. try {
  471. var url = '${ConstCommon.baseUrl}/api/tb-supplies/by-login-info/';
  472. var res = await dio.get(
  473. url,
  474. );
  475. return (res.data as List).map((e) => SupplyFilter.fromJson(e)).toList();
  476. } catch (e) {
  477. rethrow;
  478. }
  479. }
  480. // Crop
  481. Future<List<TbCropDTO>> crops({
  482. int page = 0,
  483. int size = 20,
  484. required CropFilterRequest filter,
  485. }) async {
  486. try {
  487. // var url = '${ConstCommon.baseUrl}/api/tb-todo-lists/list?page=$page&size=$size&sort=createdDate,${filter.sort ?? 'asc'}';
  488. var url = '${ConstCommon.baseUrl}/api/tb-crops/list?page=$page&size=$size';
  489. var res = await dio.post(url, data: {
  490. 'tbSuppliesIds': filter.supplyIds,
  491. });
  492. return (res.data as List).map((e) => TbCropDTO.fromJson(e)).toList();
  493. } catch (e) {
  494. rethrow;
  495. }
  496. }
  497. Future<Task> getTaskDetail({required int id}) async {
  498. try {
  499. var url = '${ConstCommon.baseUrl}/api/tb-todo-lists/$id';
  500. var res = await dio.get(url);
  501. return Task.fromJson(res.data);
  502. } catch (e) {
  503. rethrow;
  504. }
  505. }
  506. }