index.dart 11KB

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