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.

522 lines
17KB

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