123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. import 'package:ff_stars/ff_stars.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_easyloading/flutter_easyloading.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:fluttertoast/fluttertoast.dart';
  6. import 'package:get/get.dart';
  7. import 'package:fluwx/fluwx.dart' as fluwx;
  8. import 'package:tobias/tobias.dart' as tobias;
  9. import 'package:farmer_client/services/pay.dart';
  10. import 'package:farmer_client/services/orderAPI.dart';
  11. import 'package:farmer_client/utils/processStatus.dart';
  12. import 'package:farmer_client/widgets/DefaultButton.dart';
  13. import 'package:farmer_client/widgets/Bold.dart';
  14. import 'package:farmer_client/widgets/OrderInfoCard.dart';
  15. import 'package:farmer_client/widgets/layout/BasicPage.dart';
  16. import 'package:farmer_client/widgets/Modal.dart' as modal;
  17. import 'package:farmer_client/models/entities/OrderInfoModel.dart';
  18. import './widgets/PayItem.dart';
  19. class OrderPageInfo extends BasicPage {
  20. final id = Rx<String>('');
  21. final orderStateText = Rx<String>('待支付');
  22. final orderStateColor = Rx<Color>(Colors.black);
  23. final orderInfoContent = Rx<OrderInfoModel>(OrderInfoModel.fromJson(
  24. {'status': 6, 'dispatchStatus': 6, 'workStatus': 6}));
  25. final evalText = Rx<String>('');
  26. final evalStars = Rx<num>(-1);
  27. // orderStates
  28. @override
  29. void beforeShow() {
  30. // TODO: implement beforeShow
  31. super.beforeShow();
  32. if (Get.arguments != null && Get.arguments['orderId'] != null) {
  33. id(Get.arguments['orderId']);
  34. orderInfo(Get.arguments['orderId']).then((value) {
  35. EasyLoading.show(status: '数据加载中...');
  36. OrderInfoModel orderInfo = OrderInfoModel.fromJson(value);
  37. ProcessSign processSign = getProcessSign(getProcessStatus(orderInfo));
  38. orderStateText(processSign.label);
  39. orderStateColor(processSign.color);
  40. orderInfoContent(orderInfo);
  41. EasyLoading.dismiss();
  42. });
  43. }
  44. }
  45. Widget _action(BuildContext context, String orderId) {
  46. bool mustAction = false;
  47. var btnLabel;
  48. var btnFunction;
  49. switch (getProcessStatus(orderInfoContent.value)) {
  50. case 1:
  51. case 2:
  52. mustAction = true;
  53. btnLabel = '取消';
  54. btnFunction = () {
  55. _cancelOrder(orderId);
  56. };
  57. break;
  58. case 4:
  59. mustAction = true;
  60. btnLabel = '支付';
  61. btnFunction = () {
  62. _bottomSheet(context);
  63. };
  64. break;
  65. case 5:
  66. mustAction = true;
  67. btnLabel = '评价';
  68. btnFunction = () {
  69. _fnEvaluate(orderId);
  70. };
  71. break;
  72. case 3:
  73. case 6:
  74. default:
  75. break;
  76. }
  77. if (mustAction) {
  78. return DefaultButton(
  79. color: const Color(0xffffffff),
  80. backColor: const Color(0xFFFF703B),
  81. width: 300.w,
  82. height: 49.h,
  83. text: btnLabel,
  84. margin: const EdgeInsets.all(0),
  85. fontSize: 20.sp,
  86. radius: 24.5.w,
  87. onPressed: btnFunction,
  88. );
  89. } else {
  90. return const Text('');
  91. }
  92. }
  93. @override
  94. Widget builder(BuildContext context) {
  95. naviTitle = '订单详情';
  96. return Column(
  97. children: [
  98. Obx(
  99. () => OrderInfoCard(
  100. item: orderInfoContent(),
  101. orderStateText: orderStateText(),
  102. orderStateColor: orderStateColor()),
  103. ),
  104. Obx(
  105. () => Container(
  106. padding: EdgeInsets.fromLTRB(15, 50.w, 15, 0),
  107. child: _action(context, id.value)),
  108. ),
  109. ],
  110. );
  111. }
  112. // 取消订单
  113. _cancelOrder(String orderId) {
  114. modal.showDialog(
  115. title: '提示',
  116. content: Container(
  117. alignment: Alignment.center,
  118. child: const Text('确定要取消此订单吗?'),
  119. ),
  120. onCancel: () => true,
  121. onConfirm: () => {
  122. orderDelete(orderId).then((value) {
  123. Fluttertoast.showToast(msg: '订单取消成功!');
  124. Get.offAllNamed('/order');
  125. })
  126. });
  127. }
  128. // 满意度表单
  129. Widget _evaluateWidget(Function onEvaluate) {
  130. double star = -1;
  131. String desc = '';
  132. return Container(
  133. alignment: Alignment.center,
  134. child: Container(
  135. margin: const EdgeInsets.fromLTRB(15, 20, 15, 20),
  136. child: Column(
  137. children: [
  138. Container(
  139. padding: const EdgeInsets.fromLTRB(0, 0, 0, 10),
  140. decoration: const BoxDecoration(
  141. border: Border(
  142. bottom: BorderSide(width: 0.8, color: Color(0x20000000)
  143. // 0x17000000
  144. ))),
  145. child: Row(
  146. children: [
  147. Text(
  148. '满意度:',
  149. style: TextStyle(
  150. fontSize: 17.sp, fontWeight: FontWeight.bold),
  151. ),
  152. FFStars(
  153. //https://pub.dev/packages/ff_stars
  154. normalStar: Image.asset('images/icons/starOff.png'),
  155. selectedStar: Image.asset('images/icons/starOn.png'),
  156. starsChanged: (realStars, selectedStars) {
  157. star = realStars;
  158. onEvaluate(star, desc);
  159. },
  160. step: 1,
  161. defaultStars: 0,
  162. ),
  163. ],
  164. ),
  165. ),
  166. Container(
  167. margin: const EdgeInsets.fromLTRB(0, 20, 0, 0),
  168. width: 300.w,
  169. height: 100.w,
  170. decoration: BoxDecoration(
  171. border: Border.all(
  172. color: const Color(0x20000000),
  173. width: 0.8,
  174. ),
  175. ),
  176. child: TextField(
  177. minLines: 6,
  178. maxLines: 6,
  179. style: TextStyle(fontSize: 17.sp, height: 1.5),
  180. decoration: const InputDecoration(
  181. isCollapsed: true,
  182. border: InputBorder.none,
  183. counterText: '',
  184. hintText: '请输入评价内容',
  185. floatingLabelBehavior: FloatingLabelBehavior.never,
  186. ),
  187. onChanged: (e) {
  188. desc = e;
  189. onEvaluate(star, desc);
  190. },
  191. ),
  192. )
  193. ],
  194. ),
  195. ));
  196. }
  197. // 评价
  198. _fnEvaluate(String orderId) {
  199. double evalStars = -1;
  200. String evalText = '';
  201. onEvaluate(double val1, String val2) {
  202. evalStars = val1;
  203. evalText = val2;
  204. }
  205. modal.showDialog(
  206. title: '评价此订单',
  207. content: _evaluateWidget(onEvaluate),
  208. onCancel: () => true,
  209. onConfirm: () {
  210. if (evalStars != -1 && evalText != '') {
  211. orderEvaluation(orderId, evalStars, evalText).then((value) {
  212. Fluttertoast.showToast(msg: '评价成功!');
  213. Get.offAllNamed('/order');
  214. });
  215. } else {
  216. Fluttertoast.showToast(msg: '请完整选择评分或输入评价内容');
  217. return false;
  218. }
  219. },
  220. );
  221. }
  222. // 调用支付接口
  223. Future<void> payMoney(String payType) async {
  224. if (payType == 'wxPay') {
  225. final isInstall = await fluwx.isWeChatInstalled;
  226. if (!isInstall) {
  227. EasyLoading.showError('请先安装微信');
  228. return;
  229. }
  230. createOrder(id.value, "wx").then((value) {
  231. fluwx
  232. .payWithWeChat(
  233. appId: value['appid'].toString(),
  234. partnerId: value['partnerId'].toString(),
  235. prepayId: value['prepayId'].toString(),
  236. packageValue: value['packageValue'].toString(),
  237. nonceStr: value['noncestr'].toString(),
  238. timeStamp: int.parse(value['timestamp'].toString()),
  239. sign: value['sign'].toString(),
  240. )
  241. .then((res) {
  242. print("payWithWeChat--------${res}");
  243. }).catchError((onError) {
  244. print("payWithWeChat错误--------${onError}");
  245. });
  246. });
  247. // 监听支付结果
  248. fluwx.weChatResponseEventHandler.listen((event) async {
  249. print(event.errCode);
  250. // 支付成功
  251. if (event.errCode == 0) {
  252. // EasyLoading.showSuccess('支付成功');
  253. Get.snackbar('提示', "支付成功");
  254. Get.offAllNamed('/order');
  255. } else {
  256. EasyLoading.showError('支付失败');
  257. }
  258. // 关闭弹窗
  259. });
  260. return;
  261. } else if (payType == 'aliPay') {
  262. final isInstall = await tobias.isAliPayInstalled();
  263. if (!isInstall) {
  264. EasyLoading.showError('请先安装支付宝');
  265. return;
  266. }
  267. // map["paySign"]
  268. createOrder(id.value, "aliPay").then((value) {
  269. tobias.aliPay(value).then((payResult) {
  270. print("支付宝:" + payResult.toString());
  271. if (payResult['resultStatus'] == '9000') {
  272. Get.snackbar('提示', "支付成功");
  273. Get.offAllNamed('/order');
  274. } else {
  275. EasyLoading.showError('支付失败');
  276. }
  277. });
  278. });
  279. }
  280. }
  281. // 支付 sheet
  282. _bottomSheet(BuildContext context) {
  283. //用于在底部打开弹框的效果
  284. showModalBottomSheet(
  285. context: context,
  286. isScrollControlled: false,
  287. backgroundColor: Colors.white,
  288. shape: const RoundedRectangleBorder(
  289. borderRadius: BorderRadius.all(Radius.circular(10))),
  290. builder: (BuildContext context) {
  291. return SizedBox(
  292. height: 200.w, //对话框高度就是此高度
  293. child: Center(
  294. child: Column(
  295. children: [
  296. Padding(
  297. padding: EdgeInsets.fromLTRB(0, 25.w, 0, 34.w),
  298. child: Bold(text: "支付方式", fontSize: 17.sp),
  299. ),
  300. PayItem(
  301. label: "支付宝",
  302. icon: const AssetImage('images/alipay.png'),
  303. onPress: () {
  304. payMoney('aliPay');
  305. },
  306. ),
  307. PayItem(
  308. label: "微信",
  309. icon: const AssetImage('images/weChatPay.png'),
  310. onPress: () {
  311. payMoney('wxPay');
  312. },
  313. ),
  314. ],
  315. )),
  316. );
  317. });
  318. }
  319. }