request.dart 12 KB

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