request.dart 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. import 'dart:convert';
  2. import 'package:camera/camera.dart';
  3. import 'package:easy_localization/easy_localization.dart';
  4. import 'package:flutter/cupertino.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:image_picker/image_picker.dart';
  7. import 'package:page_transition/page_transition.dart';
  8. import 'package:provider/provider.dart';
  9. import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
  10. import 'package:telnow_mobile_new/src/injector/injector.dart';
  11. import 'package:telnow_mobile_new/src/layouts/components/camera.dart';
  12. import 'package:telnow_mobile_new/src/layouts/mobile/request_success.dart';
  13. import 'package:telnow_mobile_new/src/layouts/components/template.dart';
  14. import 'package:telnow_mobile_new/src/layouts/web/request_success.dart';
  15. import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
  16. import 'package:telnow_mobile_new/src/utils/U.dart';
  17. import 'package:telnow_mobile_new/src/utils/cache_manager.dart';
  18. import 'package:telnow_mobile_new/src/utils/provider.dart';
  19. import 'package:image/image.dart' as img;
  20. import 'package:telnow_mobile_new/src/utils/ui_service.dart';
  21. import 'package:uuid/uuid.dart';
  22. class RequestFunction{
  23. final ApiAuthProvider apiAuthProvider = ApiAuthProvider();
  24. final SharedPreferencesManager sharedPreferencesManager = locator<SharedPreferencesManager>();
  25. getData(BuildContext context, String? _keyword, widget) async {
  26. bool _inGroup = widget.groupCode != null ? true : false;
  27. bool _isEmpty = true;
  28. if(!Provider.of<RequestModule>(context, listen: false).isLoad()){
  29. Provider.of<RequestModule>(context, listen: false).setIsLoad(true);
  30. Provider.of<RequestModule>(context, listen: false).setKeyword(_keyword != null ? _keyword : "");
  31. try{
  32. String tenant = '';
  33. String filter = '';
  34. String search = '';
  35. String group = '';
  36. String url = '';
  37. if(_keyword != null){
  38. String subject = U.realColumn(context.locale, 'subject');
  39. search = ',{"f":["$subject","LIKE","%$_keyword%"]}';
  40. }
  41. if(widget.groupCode != null){
  42. url = '/api/requests/search/custom';
  43. group = ',{"f":["${U.servantDisplay()?'servantGroupCode':'requestGroup.code'}","EQ","${widget.groupCode}"]}';
  44. filter = '{"and":[{"or":[{"f":["scope","EQ","ALL"]},{"f":["scope","EQ","${widget.scope}"]}]}$search$group]}';
  45. }
  46. else{
  47. url = '/api/requests/search/menu';
  48. filter = '{"and":[{"or":[{"f":["scope","EQ","ALL"]},{"f":["scope","EQ","${widget.scope}"]}]}$search]}';
  49. }
  50. String key = '$url-$filter';
  51. if (_inGroup && _keyword == null) {
  52. try {
  53. await CacheMan.readData(key).then((val){
  54. if (val != null) {
  55. Provider.of<RequestModule>(context, listen: false).setData(val['data']);
  56. _isEmpty = false;
  57. }
  58. });
  59. } catch(e){}
  60. }
  61. List tempData = [];
  62. var res = await apiAuthProvider.getData(url, {'filter': filter, 'nopage': 'true'});
  63. if (res != null && res.toString() != "[]") {
  64. if (res.containsKey('_embedded')) {
  65. for (int i = 0; i < res['_embedded']['requests'].length; i++) {
  66. tempData.add(res['_embedded']['requests'][i]);
  67. }
  68. if(tempData.length > 0) _isEmpty = false;
  69. }
  70. }
  71. Provider.of<RequestModule>(context, listen: false).setEmpty(_isEmpty);
  72. if (U.getInternetStatus()) {
  73. Provider.of<RequestModule>(context, listen: false).setData(tempData);
  74. if (_inGroup && _keyword == null) CacheMan.writeData(key, tempData);
  75. }
  76. Provider.of<RequestModule>(context, listen: false).setIsLoad(false);
  77. } catch(e){
  78. print(e);
  79. Provider.of<RequestModule>(context, listen: false).setIsLoad(false);
  80. }
  81. }
  82. }
  83. Future getSuggestionLocation(BuildContext context) async{
  84. var res = await apiAuthProvider.getData('/api/requestHistories/search/location/suggestion', null);
  85. if(res != null){
  86. Provider.of<CreateSerModule>(context, listen: false).setSuggestion(res);
  87. }
  88. }
  89. Future getImageNew(BuildContext context, media) async {
  90. try {
  91. Provider.of<CreateSerModule>(context, listen: false).setSetLoadingEffect(true);
  92. XFile? pickedFile;
  93. if(media == ImageSource.camera){
  94. await availableCameras().then((camera) => Navigator.push(context, PageTransition(type: PageTransitionType.rightToLeft, child: OpenCamera(cameras: camera))).then((value) async{
  95. if(value!=null){
  96. pickedFile = value;
  97. }
  98. }));
  99. }
  100. else{
  101. pickedFile = await ImagePicker().pickImage(source: media);
  102. }
  103. if (pickedFile != null) {
  104. var image = img.decodeImage(await pickedFile!.readAsBytes());
  105. var imgPercent = (1000 / (image!.width / 100)).toDouble();
  106. if (image.width > 1000) {
  107. image = img.copyResize(image, width: ((image.width / 100) * imgPercent).toInt(), height: ((image.height / 100) * imgPercent).toInt());
  108. }
  109. var compressed = img.encodeJpg(image, quality: 60);
  110. Provider.of<CreateSerModule>(context, listen: false).setSetLoadingEffect(false);
  111. return compressed;
  112. }
  113. else{
  114. Provider.of<CreateSerModule>(context, listen: false).setSetLoadingEffect(false);
  115. return null;
  116. }
  117. } catch (e) {
  118. Provider.of<CreateSerModule>(context, listen: false).setSetLoadingEffect(false);
  119. return null;
  120. }
  121. }
  122. sendRequest(BuildContext context, widget, controllerNote, controllerReferenceNumber, controllerLocation, controllerDateString, currentSliderValue, dynamic asset) async{
  123. // showLoading(context, lottie: kIsWeb && !isCanvasKit ? null : 'Paperplane.json', text: 'sendingRequest'.tr());
  124. UIService.showLoading(text: 'sendingRequest'.tr(), lottie: kIsWeb && !isCanvasKit ? null : 'Paperplane.json' );
  125. Map<String, dynamic> data;
  126. data = {
  127. 'note': controllerNote.text.trim() == '' ? '' : controllerNote.text.trim(),
  128. 'parentTicket': controllerReferenceNumber.text.trim() == '' ? null : controllerReferenceNumber.text.trim(),
  129. 'location': Provider.of<CreateSerModule>(context, listen: false).locationType() == 2 ? controllerLocation.text.trim() : Provider.of<CreateSerModule>(context, listen: false).defaultLocation(),
  130. 'sendLater': Provider.of<CreateSerModule>(context, listen: false).sendLater(),
  131. 'datetimeScheduled': controllerDateString.text.trim(),
  132. 'requestPriority': getPrioValue(currentSliderValue),
  133. 'assetCode': asset
  134. };
  135. if(!kIsWeb && !U.getInternetStatus()){
  136. closeLoading(context);
  137. sendRequestNoInternet(context, widget, controllerLocation, controllerNote, data: data, others: false);
  138. } else {
  139. List imageEncode = Provider.of<CreateSerModule>(context, listen: false).images();
  140. imageEncode.forEach((element) {
  141. element = base64Encode(element);
  142. });
  143. data['images'] = imageEncode;
  144. String url = '/api/requestHistories/search/request/${widget.request['type']}/${widget.request['id']}/${widget.request['noteFormat']}/submit';
  145. try{
  146. var res = await apiAuthProvider.postData(url, null, data);
  147. if (res != null) {
  148. Future.delayed(Duration(seconds: 3), (){
  149. closeLoading(context);
  150. navigateTo(context, U.webView(context) ? WebReqSuccessPage(user: widget.user, ticketNo: res['ticketNo'], fromSearch: widget.fromSearch) : MobReqSuccessPage(user: widget.user, ticketNo: res['ticketNo'], fromSearch: widget.fromSearch)).then((res){
  151. while (Navigator.canPop(context)){
  152. Navigator.pop(context);
  153. }
  154. });
  155. });
  156. }
  157. else{
  158. closeLoading(context);
  159. }
  160. }catch(e){
  161. UIService.showError(e.toString());
  162. }
  163. }
  164. }
  165. getPrioValue(currentSliderValue){
  166. switch(currentSliderValue){
  167. case 0: return 'RENDAH';
  168. case 50: return 'NORMAL';
  169. case 100: return 'TINGGI';
  170. default: return 'NORMAL';
  171. }
  172. }
  173. sendRequestToOthers(BuildContext context, widget, controllerUserId, controllerNote, controllerReferenceNumber, controllerLocation, controllerDateString, currentSliderValue) async{
  174. showLoading(context, lottie: kIsWeb && !isCanvasKit ? null : 'Paperplane.json', text: 'sendingRequest'.tr());
  175. var data;
  176. data = {
  177. 'user_id': controllerUserId.text.trim(),
  178. 'req': [{
  179. 'request_code': widget.request['code'],
  180. 'qty': 1,
  181. 'note': controllerNote.text.trim() == '' ? '' : controllerNote.text.trim(),
  182. 'parentTicket': controllerReferenceNumber.text.trim() == '' ? null : controllerReferenceNumber.text.trim(),
  183. 'tenantCode': widget.request['tenantCode'],
  184. 'location': Provider.of<CreateSerModule>(context, listen: false).locationType() == 2 ? controllerLocation.text.trim() : Provider.of<CreateSerModule>(context, listen: false).defaultLocation(),
  185. 'datetimeScheduled': controllerDateString.text.trim(),
  186. 'requestPriority': getPrioValue(currentSliderValue)
  187. }]
  188. };
  189. if(!kIsWeb && !U.getInternetStatus()){
  190. closeLoading(context);
  191. sendRequestNoInternet(context, widget, controllerLocation, controllerNote, data: data, others: true);
  192. } else {
  193. List imageEncode = Provider.of<CreateSerModule>(context, listen: false).images();
  194. imageEncode.forEach((element) {
  195. element = base64Encode(element);
  196. });
  197. data['req'][0]['images'] = imageEncode;
  198. try{
  199. var res = await apiAuthProvider.postData('/api/receptionists/send/request', null, data);
  200. // print("res ##> $res");
  201. if (res != null) {
  202. Future.delayed(Duration(seconds: 3), (){
  203. closeLoading(context);
  204. navigateTo(context, U.webView(context) ? WebReqSuccessPage(user: widget.user, ticketNo: res['ticketNo'], fromSearch: widget.fromSearch) : MobReqSuccessPage(user: widget.user, ticketNo: res['ticketNo'], fromSearch: widget.fromSearch)).then((res){
  205. while (Navigator.canPop(context)){
  206. Navigator.pop(context);
  207. }
  208. });
  209. });
  210. } else {
  211. closeLoading(context);
  212. }
  213. }catch(e){
  214. print("error: $e");
  215. closeLoading(context);
  216. }
  217. }
  218. }
  219. sendRequestNoInternet(BuildContext context, widget, controllerLocation, controllerNote, {data, others})async{
  220. List list = sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyPendingData)!?jsonDecode(sharedPreferencesManager.getString(SharedPreferencesManager.keyPendingData)!):[];
  221. List imageEncode = [];
  222. Provider.of<CreateSerModule>(context, listen: false).images().forEach((element) {
  223. imageEncode.add(base64Encode(element));
  224. });
  225. var params = {
  226. 'uniqueId': Uuid().v1(),
  227. 'others': others,
  228. 'title': widget.request['subject'],
  229. 'image': widget.request['_mobileImage'],
  230. 'sub': widget.request['_requestGroupDescription'],
  231. 'subEn': widget.request['_requestGroupDescriptionEn'],
  232. 'subJa': widget.request['_requestGroupDescriptionJa'],
  233. 'subKo': widget.request['_requestGroupDescriptionKo'],
  234. 'subZh': widget.request['_requestGroupDescriptionZh'],
  235. 'desc': widget.request['subjectDescription'],
  236. 'descEn': widget.request['subjectDescriptionEn'],
  237. 'descJa': widget.request['subjectDescriptionJa'],
  238. 'descKo': widget.request['subjectDescriptionKo'],
  239. 'descZh': widget.request['subjectDescriptionZh'],
  240. 'type': widget.request['type'],
  241. 'id': widget.request['id'],
  242. 'noteFormat': widget.request['noteFormat'],
  243. 'location': Provider.of<CreateSerModule>(context, listen: false).locationType() == 2 ? controllerLocation.text.trim() : Provider.of<CreateSerModule>(context, listen: false).defaultLocation(),
  244. 'note': controllerNote.text.trim() == '' ? '' : controllerNote.text.trim(),
  245. 'data': data,
  246. 'imageList': imageEncode,
  247. 'datetimeRequest': DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now())
  248. };
  249. list.add(params);
  250. await sharedPreferencesManager.putString(SharedPreferencesManager.keyPendingData, jsonEncode(list));
  251. navigateTo(context, U.webView(context)?WebReqSuccessPendingPage(data: params, fromSearch: widget.fromSearch):MobReqSuccessPendingPage(data: params, fromSearch: widget.fromSearch)).then((res){
  252. while (Navigator.canPop(context)){
  253. Navigator.pop(context);
  254. }
  255. });
  256. }
  257. }