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: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.langColumn(context, '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, 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. 'location': Provider.of<CreateSerModule>(context, listen: false).locationType() == 2 ? controllerLocation.text.trim() : Provider.of<CreateSerModule>(context, listen: false).defaultLocation(),
  136. 'sendLater': Provider.of<CreateSerModule>(context, listen: false).sendLater(),
  137. 'datetimeScheduled': controllerDateString.text.trim(),
  138. 'requestPriority': getPrioValue(currentSliderValue)
  139. };
  140. if(!kIsWeb && U.newServerVersion(1709864293) && !U.getInternetStatus()){
  141. closeLoading(context);
  142. sendRequestNoInternet(context, widget, controllerLocation, controllerNote, data: data, others: false);
  143. }
  144. else{
  145. List imageEncode = Provider.of<CreateSerModule>(context, listen: false).images();
  146. imageEncode.forEach((element) {
  147. element = base64Encode(element);
  148. });
  149. data['images'] = imageEncode;
  150. var res = await apiAuthProvider.postData('/api/requestHistories/search/request/' + widget.request['type'] + '/' + widget.request['id'].toString() + '/' + widget.request['noteFormat'] + '/submit', null, data, context);
  151. if (res != null) {
  152. Future.delayed(Duration(seconds: 3), (){
  153. closeLoading(context);
  154. 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){
  155. while (Navigator.canPop(context)){
  156. Navigator.pop(context);
  157. }
  158. });
  159. });
  160. }
  161. else{
  162. closeLoading(context);
  163. }
  164. }
  165. }
  166. getPrioValue(currentSliderValue){
  167. switch(currentSliderValue){
  168. case 0: return 'RENDAH';
  169. case 50: return 'NORMAL';
  170. case 100: return 'TINGGI';
  171. default: return 'NORMAL';
  172. }
  173. }
  174. sendRequestToOthers(BuildContext context, widget, controllerUserId, controllerNote, controllerLocation, controllerDateString, currentSliderValue) async{
  175. showLoading(context, lottie: kIsWeb && !isCanvasKit ? null : 'Paperplane.json', text: 'sendingRequest'.tr());
  176. var data;
  177. data = {
  178. 'user_id': controllerUserId.text.trim(),
  179. 'req': [{
  180. 'request_code': widget.request['code'],
  181. 'qty': 1,
  182. 'note': controllerNote.text.trim() == '' ? '' : controllerNote.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.newServerVersion(1709864293) && !U.getInternetStatus()){
  190. closeLoading(context);
  191. sendRequestNoInternet(context, widget, controllerLocation, controllerNote, data: data, others: true);
  192. }
  193. else{
  194. List imageEncode = Provider.of<CreateSerModule>(context, listen: false).images();
  195. imageEncode.forEach((element) {
  196. element = base64Encode(element);
  197. });
  198. data['req'][0]['images'] = imageEncode;
  199. try{
  200. var res = await apiAuthProvider.postData('/api/receptionists/send/request', null, data, context);
  201. print("res ##> $res");
  202. if (res != null) {
  203. Future.delayed(Duration(seconds: 3), (){
  204. closeLoading(context);
  205. 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){
  206. while (Navigator.canPop(context)){
  207. Navigator.pop(context);
  208. }
  209. });
  210. });
  211. }
  212. }catch(e){
  213. print("error: $e");
  214. closeLoading(context);
  215. }
  216. }
  217. }
  218. sendRequestNoInternet(BuildContext context, widget, controllerLocation, controllerNote, {data, others})async{
  219. List list = sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyPendingData)!?jsonDecode(sharedPreferencesManager.getString(SharedPreferencesManager.keyPendingData)!):[];
  220. List imageEncode = [];
  221. Provider.of<CreateSerModule>(context, listen: false).images().forEach((element) {
  222. imageEncode.add(base64Encode(element));
  223. });
  224. var params = {
  225. 'uniqueId': Uuid().v1(),
  226. 'others': others,
  227. 'title': widget.request['subject'],
  228. 'image': widget.request['_mobileImage'],
  229. 'sub': widget.request['_requestGroupDescription'],
  230. 'subEn': widget.request['_requestGroupDescriptionEn'],
  231. 'subJa': widget.request['_requestGroupDescriptionJa'],
  232. 'subKo': widget.request['_requestGroupDescriptionKo'],
  233. 'subZh': widget.request['_requestGroupDescriptionZh'],
  234. 'desc': widget.request['subjectDescription'],
  235. 'descEn': widget.request['subjectDescriptionEn'],
  236. 'descJa': widget.request['subjectDescriptionJa'],
  237. 'descKo': widget.request['subjectDescriptionKo'],
  238. 'descZh': widget.request['subjectDescriptionZh'],
  239. 'type': widget.request['type'],
  240. 'id': widget.request['id'],
  241. 'noteFormat': widget.request['noteFormat'],
  242. 'location': Provider.of<CreateSerModule>(context, listen: false).locationType() == 2 ? controllerLocation.text.trim() : Provider.of<CreateSerModule>(context, listen: false).defaultLocation(),
  243. 'note': controllerNote.text.trim() == '' ? '' : controllerNote.text.trim(),
  244. 'data': data,
  245. 'imageList': imageEncode,
  246. 'datetimeRequest': DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now())
  247. };
  248. list.add(params);
  249. await sharedPreferencesManager.putString(SharedPreferencesManager.keyPendingData, jsonEncode(list));
  250. navigateTo(context, U.webView(context)?WebReqSuccessPendingPage(data: params, fromSearch: widget.fromSearch):MobReqSuccessPendingPage(data: params, fromSearch: widget.fromSearch)).then((res){
  251. while (Navigator.canPop(context)){
  252. Navigator.pop(context);
  253. }
  254. });
  255. }
  256. }