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.

446 lines
15KB

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