order_detail_page.dart 22 KB

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