order_detail_page.dart 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import 'package:flutter_picker/flutter_picker.dart';
  4. import '../../util/api.dart';
  5. import '../../util/models.dart';
  6. import '../../util/util.dart';
  7. import '../../showAlert.dart';
  8. import '../../showLineModal.dart';
  9. import '../../util/session.dart';
  10. import '../../util/bluetooth_utils.dart';
  11. class OrderDetailPage extends StatefulWidget {
  12. final String orderNo;
  13. final String status;
  14. OrderDetailPage({
  15. Key key,
  16. @required this.orderNo,
  17. @required this.status
  18. }): super(key: key);
  19. _OrderDetailPageState createState() => _OrderDetailPageState();
  20. }
  21. class _OrderDetailPageState extends State < OrderDetailPage > {
  22. OrderDetailData orderDetailObj;
  23. @override
  24. void initState() {
  25. super.initState();
  26. getOrderDetail(widget.orderNo).then((resp){
  27. if(isNotError(context, resp) && this.mounted){
  28. OrderDetailObj tempObj = OrderDetailObj.fromJson(resp.data);
  29. setState(() {
  30. orderDetailObj =tempObj.data;
  31. });
  32. }
  33. });
  34. }
  35. @override
  36. Widget build(BuildContext context) {
  37. return Scaffold(
  38. appBar: AppBar(
  39. title: Text("订单详情", style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(36)), ),
  40. centerTitle: true,
  41. backgroundColor: Color.fromRGBO(64, 98, 254, 1),
  42. ),
  43. body: Container(
  44. padding: EdgeInsets.fromLTRB(0, ScreenUtil.getInstance().setHeight(20), 0, ScreenUtil.getInstance().setHeight(20)),
  45. color: Color.fromRGBO(246, 246, 254, 1),
  46. child:orderDetailObj==null?Center(
  47. child:_getMoreWidget(),
  48. ): ListView(
  49. children: < Widget > [
  50. _sendInfo(),
  51. _getInfo(),
  52. ItemInfoWidget(obj:orderDetailObj,status:widget.status),
  53. ],
  54. )
  55. ),
  56. //resizeToAvoidBottomPadding: false //键盘弹出,页面不跟随向上滑动,防止出现溢出错误
  57. );
  58. }
  59. Widget _sendInfo() {
  60. return Container(
  61. color: Colors.white,
  62. margin: EdgeInsets.only(bottom: ScreenUtil.getInstance().setHeight(20)),
  63. child: Column(
  64. children: < Widget > [
  65. titleWidget('lib/images/icon_send.png', '发件信息'),
  66. underLine(),
  67. contentWiget('电话', orderDetailObj.senderPhone!=null?orderDetailObj.senderPhone:orderDetailObj.sendCompanyPhone),
  68. contentWiget('企业编码', orderDetailObj.sendCompanyCode),
  69. contentWiget('企业名称', orderDetailObj.sendCompanyName),
  70. contentWiget('城市/区域', '${orderDetailObj.sendCompanyProvinceName}'+' '+'${orderDetailObj.sendCompanyCityName}'+' '+ '${orderDetailObj.sendCompanyAreaName}'),
  71. lastContentWiget('详细地址', orderDetailObj.sendCompanyAddress)
  72. ],
  73. )
  74. );
  75. }
  76. Widget _getInfo() {
  77. return Container(
  78. color: Colors.white,
  79. margin: EdgeInsets.only(bottom: ScreenUtil.getInstance().setHeight(20)),
  80. child: Column(
  81. children: < Widget > [
  82. titleWidget('lib/images/icon_shoujian.png', '收件信息'),
  83. underLine(),
  84. contentWiget('企业名称', orderDetailObj.receiptCompanyName),
  85. contentWiget('电话', orderDetailObj.receiptCompanyPhone),
  86. contentWiget('城市/区域', '${orderDetailObj.receiptCompanyProvinceName}'+' '+ '${orderDetailObj.receiptCompanyCityName}'+' '+ '${orderDetailObj.receiptCompanyAreaName}'),
  87. lastContentWiget('详细地址', orderDetailObj.sendCompanyAddress)
  88. ],
  89. )
  90. );
  91. }
  92. }
  93. class ItemInfoWidget extends StatefulWidget {
  94. final OrderDetailData obj;
  95. final String status;
  96. ItemInfoWidget({
  97. Key key,
  98. @required this.obj,
  99. @required this.status
  100. }): super(key: key);
  101. _ItemInfoWidgetState createState() => _ItemInfoWidgetState();
  102. }
  103. class _ItemInfoWidgetState extends State < ItemInfoWidget > {
  104. double afterTransportFee=0.0;//运费
  105. int afterGoodsNumber=0;//数量
  106. double afterCollectingFee=0.0;//代收
  107. bool submitStatus = true;
  108. String lineId = '-1';
  109. List<CompanyOfLineList> lineList = [];
  110. String showTextPaymentMehod = '现付';
  111. int goodsPaymentMethod = 1;
  112. BluetoothUtils bluetooth = BluetoothUtils();
  113. @override
  114. void initState() {
  115. super.initState();
  116. setState(() {
  117. afterTransportFee = widget.obj.goodsFreight/100;
  118. afterGoodsNumber =widget.obj.goodsQuantity;
  119. afterCollectingFee =widget.obj.goodsAgencyFund/100;
  120. lineId = widget.obj.lineId.toString();
  121. });
  122. if(widget.obj.receiptCompanyId!=null){
  123. getLineOfCompanyId(widget.obj.receiptCompanyId.toString()).then((resp){
  124. if(isNotError(context, resp) && this.mounted){
  125. CompanyOfLine obj = CompanyOfLine.fromJson(resp.data);
  126. setState(() {
  127. lineList = obj.data;
  128. });
  129. }
  130. });
  131. }
  132. showTextPaymentMehod = widget.obj.goodsPaymentMethod==1?'现付':'到付';
  133. goodsPaymentMethod = widget.obj.goodsPaymentMethod;
  134. }
  135. @override
  136. Widget build(BuildContext context) {
  137. return Container(
  138. child: Container(
  139. color: Colors.white,
  140. child: Column(
  141. crossAxisAlignment: CrossAxisAlignment.start,
  142. children: < Widget > [
  143. titleWidget('lib/images/icon_huowu.png', "货物信息"),
  144. underLine(),
  145. contentWiget("货物名称",widget.obj.goods),
  146. _inputWidget("数量", widget.obj.goodsQuantity),
  147. _inputWidget("运费", widget.obj.goodsFreight/100),
  148. _inputWidget("代收", widget.obj.goodsAgencyFund/100),
  149. _packageType('付款方式'),
  150. contentWiget("保价", (widget.obj.goodsPriceProtection/100).toString()),
  151. contentWiget("重量", widget.obj.goodsWeight.toStringAsFixed(1)),
  152. contentWiget("包装类型", (widget.obj.goodsPackingName)),
  153. contentWiget("货物类型", (widget.obj.goodsCategoryName)),
  154. _descWidget(widget.obj.memo),
  155. submitBtn(widget.obj.orderNo)
  156. ],
  157. ),
  158. )
  159. );
  160. }
  161. Widget _inputWidget(String key, num value) {
  162. return Padding(
  163. padding: EdgeInsets.only(left: ScreenUtil.getInstance().setWidth(30)),
  164. child: Column(
  165. children: < Widget > [
  166. SizedBox(
  167. height: ScreenUtil.getInstance().setHeight(89),
  168. child: Center(
  169. child: Row(
  170. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  171. children: < Widget > [
  172. Text(key, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(74, 74, 74, 1)), ),
  173. Container(
  174. width: ScreenUtil.getInstance().setWidth(300),
  175. child: Row(
  176. mainAxisAlignment: MainAxisAlignment.end,
  177. children: < Widget > [
  178. Expanded(
  179. //padding: EdgeInsets.only(right: ScreenUtil.getInstance().setWidth(20)),
  180. //child: Text(value,style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(136, 136, 136, 1)), ),
  181. child: Center(
  182. child: TextField(
  183. keyboardType: TextInputType.number,
  184. textAlign: TextAlign.end,
  185. style: TextStyle(
  186. fontSize: ScreenUtil.getInstance().setSp(30),
  187. color: Colors.black
  188. ),
  189. decoration: InputDecoration(
  190. border: InputBorder.none,
  191. hintText: value.toString(),
  192. hintStyle: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Colors.black),
  193. contentPadding: EdgeInsets.fromLTRB(ScreenUtil.getInstance().setWidth(20), 0, 0, 0),
  194. ),
  195. onChanged: (value){
  196. if(key=='数量'){
  197. afterGoodsNumber =int.parse(value);
  198. }else if(key=='运费'){
  199. afterTransportFee =double.parse(value);
  200. String temp = afterTransportFee.toStringAsFixed(1);
  201. afterTransportFee = double.parse(temp);
  202. }else if(key=='代收'){
  203. afterCollectingFee =double.parse(value);
  204. String temp = afterCollectingFee.toStringAsFixed(1);
  205. afterCollectingFee = double.parse(temp);
  206. }
  207. },
  208. ),
  209. )
  210. ),
  211. Icon(Icons.keyboard_arrow_right, color: Color.fromRGBO(199, 199, 204, 1), )
  212. ],
  213. )
  214. )
  215. ],
  216. ),
  217. )
  218. ),
  219. Expanded(
  220. flex: 0,
  221. child: underLine()
  222. )
  223. ],
  224. )
  225. );
  226. }
  227. Widget _descWidget(String str) {
  228. return
  229. Container(
  230. padding: EdgeInsets.all(ScreenUtil.getInstance().setWidth(30)),
  231. child: Text(str, maxLines: 100, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(74, 74, 74, 1)), ),
  232. );
  233. }
  234. Widget submitBtn(String orderNo) {
  235. return GestureDetector(
  236. child: Container(
  237. margin: EdgeInsets.fromLTRB(ScreenUtil.getInstance().setWidth(30), ScreenUtil.getInstance().setWidth(50), ScreenUtil.getInstance().setWidth(30), ScreenUtil.getInstance().setWidth(40)),
  238. height: ScreenUtil.getInstance().setHeight(88),
  239. decoration: BoxDecoration(
  240. borderRadius: BorderRadius.all(Radius.circular(4)),
  241. color: Color.fromRGBO(37, 102, 242, 1),
  242. ),
  243. child: Center(
  244. child:Row(
  245. mainAxisAlignment: MainAxisAlignment.center,
  246. children: <Widget>[
  247. Offstage(
  248. offstage: submitStatus,
  249. child: SizedBox(
  250. width: ScreenUtil.getInstance().setWidth(45),
  251. height: ScreenUtil.getInstance().setHeight(45),
  252. child: Image.asset('lib/images/loading.gif'),
  253. ),
  254. ),
  255. Text('提交', style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(36), color: Colors.white)),
  256. ],
  257. )
  258. ),
  259. ),
  260. onTap: () {
  261. if(!submitStatus) return;
  262. if(afterCollectingFee>0){
  263. if(widget.obj.sendCompanyBankCard==null || widget.obj.sendCompanyBankCard==''){
  264. showDialog <Null> (
  265. context: context,
  266. barrierDismissible: false,
  267. builder: (BuildContext context) {
  268. return MyAlertDialog(text: '银行信息不全',childCallback:(val){});
  269. }
  270. );
  271. return;
  272. }
  273. }
  274. if(lineList.length>1 && widget.status=='寄件'){
  275. showLineModal(lineList,orderNo);
  276. return;
  277. }
  278. submitOrder(orderNo);
  279. },
  280. );
  281. }
  282. Widget _packageType(String key) {
  283. return Padding(
  284. padding: EdgeInsets.only(left: ScreenUtil.getInstance().setWidth(30)),
  285. child: Column(
  286. children: < Widget > [
  287. InkWell(
  288. child: SizedBox(
  289. height: ScreenUtil.getInstance().setHeight(89),
  290. child: Center(
  291. child: Row(
  292. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  293. children: < Widget > [
  294. Expanded(
  295. flex: 0,
  296. child: Text(key, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(74, 74, 74, 1)), ),
  297. ),
  298. Expanded(
  299. child: Row(
  300. mainAxisAlignment: MainAxisAlignment.end,
  301. children: < Widget > [
  302. //Text('${value}', style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(136, 136, 136, 1)), ),
  303. SizedBox(
  304. width: ScreenUtil.getInstance().setWidth(500),
  305. child: Text(showTextPaymentMehod, textAlign: TextAlign.end, )
  306. ),
  307. Icon(Icons.keyboard_arrow_right, color: Color.fromRGBO(199, 199, 204, 1), )
  308. ],
  309. )
  310. )
  311. ],
  312. ),
  313. )
  314. ),
  315. onTap: () {
  316. showPickerModal(context);
  317. },
  318. ),
  319. Expanded(
  320. flex: 0,
  321. child: underLine()
  322. )
  323. ],
  324. )
  325. );
  326. }
  327. showPickerModal(BuildContext context) {
  328. List < dynamic > data = ['现付', '到付'];
  329. new Picker(
  330. adapter: PickerDataAdapter < String > (pickerdata: data),
  331. height: ScreenUtil.getInstance().setHeight(450),
  332. confirmText: '确定',
  333. confirmTextStyle: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(64, 98, 254, 1)),
  334. cancelText: '取消',
  335. cancelTextStyle: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(153, 153, 153, 1)),
  336. headercolor: Color.fromRGBO(245, 245, 245, 1),
  337. itemExtent: ScreenUtil.getInstance().setHeight(80),
  338. textStyle: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(42, 42, 42, 1)),
  339. changeToFirst: true,
  340. hideHeader: false,
  341. onConfirm: (Picker picker, List value) {
  342. setState(() {
  343. showTextPaymentMehod = data[value[0]];
  344. });
  345. if (showTextPaymentMehod == '现付') {
  346. goodsPaymentMethod = 1;
  347. } else {
  348. goodsPaymentMethod = 2;
  349. }
  350. }
  351. ).showModal(this.context);
  352. }
  353. showLineModal(List<CompanyOfLineList> list,String orderNo){
  354. showDialog < Null > (
  355. context: context, //BuildContext对象
  356. barrierDismissible: false,
  357. builder: (BuildContext context) {
  358. return ShowLineModal(
  359. lineList: list, childCallback: (val) {
  360. lineId = val;
  361. submitOrder(orderNo);
  362. },
  363. );
  364. });
  365. }
  366. submitOrder(String orderNo){
  367. setState(() {
  368. submitStatus = false;
  369. });
  370. updataOrder(lineId,orderNo,afterTransportFee,afterCollectingFee,afterGoodsNumber,goodsPaymentMethod).then((resp){
  371. if(isNotError(context, resp) && this.mounted){
  372. showDialog < Null > (
  373. context: context, //BuildContext对象
  374. barrierDismissible: false,
  375. builder: (BuildContext context) {
  376. //打印
  377. OrderDetailData data = OrderDetailObj.fromJson(resp.data).data;
  378. getKey('printType').then((printType){
  379. getKey('stationName').then((stationName){
  380. getKey('nickName').then((nickName){
  381. getKey('companyName').then((companyName){
  382. getKey('companyCustomerPhone').then((companyCustomerPhone){
  383. double goodsYs = data.goodsPaymentMethod==2?(data.goodsFreight/100)+(data.goodsAgencyFund/100):data.goodsAgencyFund/100;
  384. String nowDate = fromatDate( DateTime.now().millisecondsSinceEpoch);//打印时间
  385. String createTime = fromatDate(data.createTime);
  386. double goodsAgencyFunds = data.goodsAgencyFund/100;
  387. double goodsDFreight = data.goodsPaymentMethod==2?data.goodsFreight/100:0;
  388. double goodsXFreight = data.goodsPaymentMethod==1?data.goodsFreight/100:0;
  389. String receiptAddress = data.receiptCompanyAddress.length>10?data.receiptCompanyAddress.substring(0,10):data.receiptCompanyAddress;
  390. Map<String, String> pum = {
  391. "[logisticsNo]": "${data.orderNo ?? ''}",
  392. "[createTime]": "$createTime",
  393. "[sendStationName]": "$stationName",
  394. "[dealerCode]": "${data.sendCompanyCode ?? ''}",
  395. "[dealerName]": "${data.sendCompanyName}",
  396. "[dealerTel]": "${data.sendCompanyPhone ?? ''}",
  397. "[repairName]": "${data.receiptCompanyName ?? ''}",
  398. "[repairTel]": "${data.receiptCompanyPhone ?? ''}",
  399. "[endStationName]": "${data.receiptStationName}",
  400. "[goodsLineCode]": "${data.lineCode ?? ''}",
  401. "[goodsLine]": "${data.lineName ?? ''}",
  402. "[repairAddress]": "${receiptAddress?? ''}",
  403. "[goodsQuantity]": "${data.goodsQuantity ?? ''}",
  404. "[goodsInsurance]": "${data.goodsInsurance ?? ''}",
  405. "[goodsFlatCost]": "${data.goodsFlatCost ?? ''}",
  406. // 到付 现付 金额
  407. "[goodsDFreight]": "$goodsDFreight",
  408. "[goodsXFreight]": "$goodsXFreight",
  409. "[goodsAgencyFund]": "$goodsAgencyFunds",
  410. "[goodsYs]": "$goodsYs",
  411. "[dealerBankAccount]": "${data.sendCompanyBankCard ?? ''}",
  412. "[goodsRemark]": "${data.memo ?? ''}",
  413. "[realName]": "${nickName?? ''}",
  414. "[currentTime]": "$nowDate",
  415. "[currentGoodNumber]": "1/1",
  416. "[companyCustomerPhone]":"$companyCustomerPhone",
  417. "[companyName]":"$companyName"
  418. };
  419. bluetooth.printOrder(pum, int.parse(printType)).then((value){
  420. if(value==null){
  421. showDialog <Null> (
  422. context: context,
  423. barrierDismissible: false,
  424. builder: (BuildContext context) {
  425. return MyAlertDialog(text: '未连接打印机',childCallback:(val){});
  426. }
  427. );
  428. }
  429. });
  430. });
  431. });
  432. });
  433. });
  434. });
  435. return MyAlertDialog( //调用对话框
  436. text: '订单修改成功!', childCallback: (val) {
  437. if(val){
  438. Navigator.pop(context,true);
  439. }
  440. },
  441. );
  442. });
  443. }else{
  444. setState(() {
  445. submitStatus = true;
  446. });
  447. }
  448. });
  449. }
  450. }
  451. Widget titleWidget(String iconUrl, String str) {
  452. return Container(
  453. height: ScreenUtil.getInstance().setHeight(90),
  454. padding: EdgeInsets.only(left: ScreenUtil.getInstance().setWidth(30)),
  455. child: Center(
  456. child: Row(
  457. mainAxisAlignment: MainAxisAlignment.start,
  458. children: < Widget > [
  459. Padding(
  460. padding: EdgeInsets.only(right: ScreenUtil.getInstance().setHeight(20)),
  461. child: Image.asset(
  462. iconUrl,
  463. width: ScreenUtil.getInstance().setWidth(40),
  464. height: ScreenUtil.getInstance().setHeight(40),
  465. )
  466. ),
  467. Text(str, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(32)), )
  468. ],
  469. ),
  470. ),
  471. );
  472. }
  473. Widget underLine() {
  474. return Container(
  475. color: Color.fromRGBO(223, 223, 223, 1),
  476. height: ScreenUtil.getInstance().setHeight(1),
  477. );
  478. }
  479. Widget contentWiget(String key, String value) {
  480. return Padding(
  481. padding: EdgeInsets.only(left: ScreenUtil.getInstance().setWidth(30)),
  482. child: Column(
  483. children: < Widget > [
  484. Padding(
  485. padding: EdgeInsets.only(right: ScreenUtil.getInstance().setWidth(30)),
  486. child: SizedBox(
  487. height: ScreenUtil.getInstance().setHeight(89),
  488. child: Center(
  489. child: Row(
  490. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  491. children: < Widget > [
  492. Text(key, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(74, 74, 74, 1)), ),
  493. Text(value, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(136, 136, 136, 1)), ),
  494. ],
  495. ),
  496. )
  497. )
  498. ),
  499. Expanded(
  500. flex: 0,
  501. child: underLine()
  502. )
  503. ],
  504. )
  505. );
  506. }
  507. Widget lastContentWiget(String key, String value) {
  508. return Padding(
  509. padding: EdgeInsets.only(left: ScreenUtil.getInstance().setWidth(30)),
  510. child:
  511. Padding(
  512. padding: EdgeInsets.only(right: ScreenUtil.getInstance().setWidth(30)),
  513. child: SizedBox(
  514. height: ScreenUtil.getInstance().setHeight(89),
  515. child: Center(
  516. child: Row(
  517. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  518. children: < Widget > [
  519. Text(key, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(74, 74, 74, 1)), ),
  520. Text(value, style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30), color: Color.fromRGBO(136, 136, 136, 1)), ),
  521. ],
  522. ),
  523. )
  524. )
  525. ),
  526. );
  527. }
  528. Widget _getMoreWidget() {
  529. return Center(
  530. child: Padding(
  531. padding: EdgeInsets.all(10.0),
  532. child: Row(
  533. mainAxisAlignment: MainAxisAlignment.center,
  534. crossAxisAlignment: CrossAxisAlignment.center,
  535. children: < Widget > [
  536. Text(
  537. '加载中...',
  538. style: TextStyle(fontSize: 16.0),
  539. ),
  540. Container(
  541. width: ScreenUtil.getInstance().setWidth(50),
  542. height: ScreenUtil.getInstance().setHeight(50),
  543. child: CircularProgressIndicator()
  544. )
  545. ],
  546. ),
  547. ),
  548. );
  549. }